ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1ODM4NQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTA2IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIGlwZXJmLCBhIHV0aWxpdHkgZm9yIG1lYXN1cmluZworIyAgICAgIG1heGltdW0gVENQIGFuZCBVRFAgYmFuZHdpZHRoIHBlcmZvcm1hbmNlLgorIworCitCdWlsZENvbmZpZ1NwZWNpYWxpemVkCTo9IE5vCitCdWlsZFByb2R1Y3RTcGVjaWFsaXplZAk6PSBObworCitpbmNsdWRlIHByZS5tYWsKKworUGFja2FnZU5hbWUJCTo9IGlwZXJmCisKK1BhY2thZ2VFeHRlbnNpb24JOj0gdGFyLmd6CitQYWNrYWdlU2VwYXJhdG9yCTo9IC0KKworUGFja2FnZVBhdGNoQXJncwk6PSAtcDEKKworUGFja2FnZUFyY2hpdmUJCTo9ICQoUGFja2FnZU5hbWUpLiQoUGFja2FnZUV4dGVuc2lvbikKK1BhY2thZ2VTb3VyY2VEaXIJOj0gJChQYWNrYWdlTmFtZSkkKFBhY2thZ2VTZXBhcmF0b3IpJChQYWNrYWdlVmVyc2lvbikKKworUGFja2FnZUJ1aWxkTWFrZWZpbGUJPSAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLE1ha2VmaWxlKQorCitDbGVhblBhdGhzCQkrPSAkKFBhY2thZ2VMaWNlbnNlRmlsZSkKKworYWxsOiAkKFBhY2thZ2VEZWZhdWx0R29hbCkKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBsaWNlbnNlIGNvbnRlbnRzLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpL0NPUFlJTkc6IHNvdXJjZQorCiskKFBhY2thZ2VMaWNlbnNlRmlsZSk6ICQoUGFja2FnZVNvdXJjZURpcikvQ09QWUlORworCSQoY29weS1yZXN1bHQpCisKKyMgRXh0cmFjdCB0aGUgc291cmNlIGZyb20gdGhlIGFyY2hpdmUgYW5kIGFwcGx5IHBhdGNoZXMsIGlmIGFueS4KKworJChQYWNrYWdlU291cmNlRGlyKTogJChQYWNrYWdlQXJjaGl2ZSkgJChQYWNrYWdlUGF0Y2hQYXRocykKKwkkKGV4cGFuZC1hbmQtcGF0Y2gtcGFja2FnZSkKKworIyBQcmVwYXJlIHRoZSBzb3VyY2VzLgorCisuUEhPTlk6IHNvdXJjZQorc291cmNlOiB8ICQoUGFja2FnZVNvdXJjZURpcikKKworIyBQYXRjaCB0aGUgc291cmNlcywgaWYgbmVjZXNzYXJ5LgorCisuUEhPTlk6IHBhdGNoCitwYXRjaDogc291cmNlCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUuCisjCisjIFRoZSBjb25maWd1cmUgc2NyaXB0IGNhbm5vdCBwcm9wZXJseSBkZXRlY3QgYSBHTlUgZ2xpYmMtY29tcGF0aWJsZQorIyBtYWxsb2Mgd2hlbiBjcm9zcy1jb21waWxpbmcsIHNvIHdlIGdpdmUgaXQgZGlyZWN0IGluZGljYXRpb24gdGhhdAorIyBpdCdsbCBmaW5kIG9uZS4KKworJChQYWNrYWdlQnVpbGRNYWtlZmlsZSk6IHwgJChQYWNrYWdlU291cmNlRGlyKSAkKEJ1aWxkRGlyZWN0b3J5KSAkKFJlc3VsdERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpY2QgJChCdWlsZERpcmVjdG9yeSkgJiYgXAorCSQoQ1VSRElSKS8kKFBhY2thZ2VTb3VyY2VEaXIpL2NvbmZpZ3VyZSBcCisJQ0M9IiQoQ0MpIiBDWFg9IiQoQ1hYKSIgQVI9JChBUikgUkFOTElCPSQoUkFOTElCKSBTVFJJUD0kKFNUUklQKSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwktLWJ1aWxkPSQoSG9zdFR1cGxlKSBcCisJLS1ob3N0PSQoVGFyZ2V0VHVwbGUpIFwKKwlhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGw9eWVzIFwKKwktLXByZWZpeD0vdXNyIFwKKwktLXN5c2NvbmZkaXI9L2V0YyBcCisJLS1sb2NhbHN0YXRlZGlyPS92YXIKKworIyBDb25maWd1cmUgdGhlIHNvdXJjZSBmb3IgYnVpbGRpbmcuCisKKy5QSE9OWTogY29uZmlndXJlCitjb25maWd1cmU6IHNvdXJjZSAkKFBhY2thZ2VCdWlsZE1ha2VmaWxlKQorCisjIEJ1aWxkIHRoZSBzb3VyY2UuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisKKy5QSE9OWTogYnVpbGQKK2J1aWxkOiBjb25maWd1cmUKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoQnVpbGREaXJlY3RvcnkpIGFsbAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBERVNURElSPSQoUmVzdWx0RGlyZWN0b3J5KSBpbnN0YWxsCisKK2NsZWFuOgorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUGFja2FnZVNvdXJjZURpcikKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9BVVRIT1JTIGIvaXBlcmYtMi4wLjUvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjRlNWRkCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvQVVUSE9SUwpAQCAtMCwwICsxLDM2IEBACitNYXJrIEdhdGVzCitBbGV4IFdhcnNoYXZza3kgCisKKyAgKiBvcmlnaW5hbCBhdXRob3JzCisKK0FqYXkgVGlydW1hbGEKKworICAqIGdlbmVyYWwgaW1wcm92ZW1lbnRzIAorCitKaW0gRmVyZ3Vzb24gPGZlcmd1c29uQG5jc2EudWl1Yy5lZHU+CisKKyAgKiBQcm9qZWN0IG1hbmFnZW1lbnQKKworSm9uIER1Z2FuIDxqZHVnYW5AeDEwMjQubmV0PgorCisgICogUHJvamVjdCBtYWludGFpbmVyIGFuZCByZWxlYXNlIGNvb3JkaW5hdG9yCisgICogdmFyaW91cyBwYXRjaGVzIGFuZCBhdXRvY29uZiBmaXhlcywgZ2VuZXJhbCBtYWludGVuYW5jZQorCitGZW5nIFFpbgorS2V2aW4gR2liYnMKKworICAqIHdpbmRvd3MgcG9ydGluZyB3b3JrCisKK0pvaG4gRXN0YWJyb29rIDxqZXN0YWJyb0BuY3NhLnVpdWMuZWR1PgorCitBbmRyZXcgR2FsbGF0aW4gPGdhbGxhdGluQGdtYWlsLmNvbT4KKyAgKiB0aHJlYWRpbmcgZml4IGFuZCBub24gTGludXggcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisKK1N0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQGxpbnV4LWZvdW5kYXRpb24ub3JnPgorICAqIExpbnV4IGNvbmdlc3Rpb24gY29udHJvbCBzZWxlY3Rpb24gYW5kIHRoZWFkaW5nIGltcHJvdmVtZW50cworCitOYXRoYW4gSm9uZXMgPG5tam9uZXNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAqIHBhdGNoIGZvciB1bmRlcmZsb3cgd2hlbiB2YWx1ZSBzcGVjaWZpZWQgaW4gLW4gaXMgbm90IGEgbXVsdGlwbGUgb2YgLWwKKworR2Vycml0IFJlbmtlciA8Z3JlbmtlckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgICogcmVwbGFjZSBjb3N0bHkgZ2V0dGltZW9mZGF5KCkgd2l0aCBuYW5vbnNsZWVwKCkKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L0NPUFlJTkcgYi9pcGVyZi0yLjAuNS9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhODY4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9DT1BZSU5HCkBAIC0wLDAgKzEsNDAgQEAKK0NvcHlyaWdodCAoYykgMTk5OS0yMDA3LCBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0lwZXJmIHBlcmZvcm1hbmNlIHRlc3QKK01hcmsgR2F0ZXMKK0FqYXkgVGlydW1hbGEKK0ppbSBGZXJndXNvbgorSm9uIER1Z2FuCitGZW5nIFFpbgorS2V2aW4gR2liYnMKK0pvaG4gRXN0YWJyb29rCitOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCitOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKK2h0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAordG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKK3JpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKworUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCitsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuCisKK1JlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vcgorb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIG5vciB0aGUgbmFtZXMgb2YgaXRzCitjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCitTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRAorIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVAorTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCitBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKK0xJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YKK0NPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9DaGFuZ2VMb2cgYi9pcGVyZi0yLjAuNS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmZTMzZAotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L0NoYW5nZUxvZwpAQCAtMCwwICsxLDEwMiBAQAorMjAxMC0wNy0wOCBKb24gRHVnYW4gPGpkdWdhbkB4MTAyNC5uZXQ+CisKKyogYnVtcGVkIGRlZmF1bHQgVENQIHNlbmQvcmVjdiBidWZmZXIgdG8gMTI4SyAodGhpcyBpcyBub3QgdGhlIGtlcm5lbCBidWZmZXIKK3RoYXQgY29udHJvbHMgdGhlIHdpbmRvdywgYnV0IHJhdGhlciB0aGUgSXBlcmYgaW50ZXJuYWwgYnVmZmVyKQorCisyMDEwLTA0LTEwIEpvbiBEdWdhbiA8amR1Z2FuQHgxMDI0Lm5ldD4KKworKiB1cGRhdGUgYXV0b2NvbmYgZ29vIHVzaW5nIEF1dG9jb25mIDIuNjUsIHRoaXMgc2hvdWxkIGhlbHAgcG9ydGFiaWxpdHkgYSBiaXQKKworMjAxMC0wNC0wMiBSYWxmIEz8YmJlbgorCisqIGhvbm9yIC1pIGZsYWcgd2hlbiBmb3IgYSBzZXJ2ZXIgKC1zKSB3aGVuIHVzaW5nIFRDUAorKiB0cmFja2VyIGlzc3VlIDI4MzY5NzMKKworMjAxMC0wNC0wMSBEZW55IElQIEFueSBBbnkgPGRlbnlpcGFueWFueUBnbWFpbC5jb20+CisKKyogRXhpdCByYXRoZXIgdGhhbiB3YXJuIG9uIGNvbm5lY3Rpb24gZmFpbHVyZQorKiBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9NTE4MDMzCisKKzIwMTAtMDMtMzEgR2Vycml0IFJlbmtlciA8Z3JlbmtlckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKyogR2Vycml0IFJlbmtlcidzIHZlcnNpb24gb2YgSW5nbydzIE1vbG5hcidzIHBhdGNoIHRvIGZ1cnRoZXIgcmVkdWNlIENQVSB1c2FnZQorKiB0cmFja2VyIGlzc3VlIDIwMDY3MDgKKworMjAxMC0wMy0zMSBHZXJyaXQgUmVua2VyIDxncmVua2VyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworKiAibmVhdGVyIiBvdXRwdXQgZm9yIHNvbWUgdW5pdHMsIGVnIEticHMsIE1icHMsIEdicHMKKyogYWRkcmVzc2VzIHNvbWUgdHlwb3MKKworMjAwOC0wNS0wOSBHZXJyaXQgUmVua2VyIDxncmVua2VyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworKiByZXBsYWNlIGNvc3RseSBnZXR0aW1lb2ZkYXkoKSB3aXRoIG5hbm9uc2xlZXAoKSBTZWU6CitodHRwczovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyL2luZGV4LnBocD9mdW5jPWRldGFpbCZhaWQ9MTk0MDAwOSZncm91cF9pZD0xMjgzMzYmYXRpZD03MTEzNzMKKworMjAwOC0wNS0wOSBKb24gRHVnYW4gPGpkdWdhbkB4MTAyNC5uZXQ+CisKKyogY2hhbmdlIGN1cnJMZW4gdG8gdW5zaWduZWQgdG8gc3F1ZWxjaCB3YXJuaW5nIGdlbmVyYXRlZCBieSBOYXRoYW4ncyBwYXRjaAorCisyMDA4LTA1LTA5IE5hdGhhbiBKb25lcyA8bm1qb25lc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKyogcHJldmVudCB1bmRlcmZsb3cgd2hlbiB0aGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQgKC1uKSBpcyBub3QgYQorbXVsdGlwbGUgb2YgdGhlIGJ1ZmZlciBzaXplICgtbCkgIFBhdGNoOgoraHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci9pbmRleC5waHA/ZnVuYz1kZXRhaWwmYWlkPTE5NDM0MzImZ3JvdXBfaWQ9MTI4MzM2JmF0aWQ9NzExMzczCisKKzIwMDgtMDQtMDggSm9uIER1Z2FuIDxqZHVnYW5AeDEwMjQubmV0PgorCisqIHByaW50IHJlcG9ydCBoZWFkZXJzIG9ubHkgb25jZQorKiB1c2UgYXBwcm9wcmlhdGUgcmVwb3J0IGhlYWRlciBmb3IgVURQIHRlc3RzCisKKzIwMDgtMDQtMDcgSm9uIER1Z2FuIDxqZHVnYW5AeDEwMjQubmV0PgorCisqIEFkZCBtYW4gcGFnZSB0byBhdXRvY29uZiBnb28KKyogQnVtcCB0aGUgdmVyc2lvbiBpbiBhdXRvY29uZgorKiBBZGQgbWlzc2luZyBMSUNFTlNFIGZpbGUKKworMjAwOC0wNC0wNCBKb24gRHVnYW4gPGpkdWdhbkB4MTAyNC5uZXQ+CisKKyogSW5jb3Jwb3JhdGUgaGVscCBzdHJpbmcgZml4ZXMgZnJvbSBDbGF1cyBLbGVpbgorKiBJbmNvcnBvcmF0ZSBwYXRjaCB0byByZXN0b3JlIGhlYWRlciBsaW5lIGluIHN0YXRzIG91dHB1dCBmcm9tIENsYXVzIEtsZWluCisqIFJld29ya2VkIGhlbHAgc3RyaW5nIGNvZGUgdG8gcmVtb3ZlIHJlZHVuZGFuY3kKKyogQWRkIGluaXRpYWwgbWFuIHBhZ2UKKworMjAwOC0wMy0xOSBTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBsaW51eC1mb3VuZGF0aW9uLm9yZz4KKworKiBBZGQgbmV3IG9wdGlvbiB0byBhbGxvdyBzZWxlY3RpbmcgdGhlIHNlbmRlciBjb25nZXN0aW9uIGNvbnRyb2wKK2FsZ29yaXRobS4gVGhpcyBpcyBhIExpbnV4IHNwZWNpZmljIGV4dGVuc2lvbiB1c2VmdWwgZm9yIHRlc3RpbmcKK290aGVyIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG1zLgorCisyMDA4LTAzLTE5IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQGxpbnV4LWZvdW5kYXRpb24ub3JnPgorCisqIFVzZSBzY2hlZF95aWVsZCByYXRoZXIgdGhhbiB1c2xlZXAoMCkgYXMgaXQgYmVoYXZlcyBiZXR0ZXIgb24gTGludXgKKworMjAwOC0wMy0xMiBKb24gRHVnYW4gPGpkdWdhbkB4MTAyNC5uZXQ+CisKKyogUmV3b3JrIENsaWVudDo6UnVuVENQIHNvIHRvIHVwZGF0ZSB0aGUgc3RhdHMgZm9yIGV2ZXJ5IHBhY2tldCBpZiAtaSBpcyBzZXQuCitJZiAtaSBpcyBub3Qgc2V0IHRoZW4gdGhlIHN0YXRzIGFyZSBvbmx5IHVwZGF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgcnVuLiBUaGlzCit3YXMgZmFsbG91dCBvZiBBbmRyZXcncyBwYXRjaC4KKworKiBBZGRlZCAtV2FsbCB0byBDWFhGTEFHUyBhbmQgQ0ZMQUdTLiAgVGhpcyBnZW5lcmF0ZWQgYSBsb3Qgb2Ygbm9pc2UgaW4gdGhlCithdXRvdG9vbHMgZ2VuZXJhdGVkIGZpbGVzLgorCisqIEFkZGVkIGluaXRpYWwgQVVUSE9SUyBmaWxlLiAgVGhpcyBpcyBpbmNvbXBsZXRlLCBidXQgaXQncyBhIHN0YXJ0LgorCisyMDA4LTAzLTEyIEFuZHJldyBHYWxsYXRpbiA8Z2FsbGF0aW5AZ21haWwuY29tPgorCisqIFJld29yayB0aHJlYWRpbmcuICBUaGlzIGlzIGRvbmUgYnkgaGF2aW5nIGEgY29uZGl0aW9uIHZhcmlhYmxlIGZvciB0aGUgcmVwb3J0aW5nCit0aHJlYWQgcmF0aGVyIHRoYW4gdXNpbmcgc2NoZWRfeWllbGQgYW5kL29yIHVzbGVlcC4gIAorCisqIEFkZHJlc3MgcGVyZm9ybWFuY2UgaXNzdWVzIG9uIG5vbiBMaW51eCBzeXN0ZW1zIGJ5IGF2b2lkaW5nIHN5c3RlbSBjYWxscword2hpY2ggYXJlIGV4cGVuc2l2ZSBvbiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBMaW51eC4KKworKiBGaXhlcyBmcm9tIEZyZWVCU0QgcG9ydHM6IG1heF9zaXplX3QgaXMgbm93IDY0IGJpdHMgYW5kIG5vdCBJcGVyZiBkb2VzIG5vdAorZXhpdCBvbiBFTk9CVUZTLgorCisyMDA3LTEwLTAxIEpTRSA8amVzdGFicm9AbmNzYS51aXVjLmVkdT4KKworKiBDaGFuZ2VMb2cgZmlsZSBhZGRlZAorCisyMDA3LTEwLTA1IEpTRSA8amVzdGFicm9AbmNzYS51aXVjLmVkdT4KKworKiBUaHJlYWQuYyAodGhyZWFkX3N0b3ApOiAicHRocmVhZF9jYW5jZWwgKG9sZFRJRCApIiBzaG91bGQgYmUKKyJwdGhyZWFkX2NhbmNlbCAodGhyZWFkLT5tVElEKSIKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L0lOU1RBTEwgYi9pcGVyZi0yLjAuNS9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTUwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9JTlNUQUxMCkBAIC0wLDAgKzEsMTMgQEAKKyRJZDogSU5TVEFMTCx2IDEuMS4xLjEgMjAwNC8wNS8xOCAwMTo1MDo0NCBrZ2liYnMgRXhwICQKKworUGxhdGZvcm0gU3BlY2lmaWMgTm90ZXMKKworRnJlZUJTRAorCisgIElmIHlvdSB1c2UgYSBjYyBvciBjKysgb3RoZXIgdGhhbiB0aGUgc3lzdGVtIG9uZSwgdGhyZWFkcyBtYXkgbm90IGJlCisgIGRldGVjdGVkIHByb3Blcmx5LiAgVG8gd29yayBhcm91bmQgdGhpcyBzZXQgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCAKKyAgdmFyaWFibGVzOgorCisgICAgc2V0ZW52IENDIC91c3IvYmluL2NjCisgICAgc2V0ZW52IENYWCAvdXNyL2Jpbi9jKysKKwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvTWFrZWZpbGUuYW0gYi9pcGVyZi0yLjAuNS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjEwMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMCBAQAorQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24KK1NVQkRJUlMgPSBjb21wYXQgZG9jIGluY2x1ZGUgc3JjIG1hbgorCitBTV9DUFBGTEFHUyA9IEBTVFJJUF9CRUdJTkAgXAorCSAgICAgIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlIFwKKwkgICAgICAtSSQodG9wX2J1aWxkZGlyKS9pbmNsdWRlIFwKKwkgICAgICBAU1RSSVBfRU5EQAorCitBTV9DWFhGTEFHUyA9IC1XYWxsCitBTV9GTEFHUyA9IC1XYWxsCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9NYWtlZmlsZS5pbiBiL2lwZXJmLTIuMC41L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjZkODQKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDYxNiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS45LjYgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuCithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitJTlNUQUxMID0gQElOU1RBTExACitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZy5oLmluIFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSBBVVRIT1JTIENPUFlJTkcgQ2hhbmdlTG9nIElOU1RBTEwgXAorCWNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGRlcGNvbXAgaW5zdGFsbC1zaCBtaXNzaW5nCitzdWJkaXIgPSAuCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9heF9jcmVhdGVfc3RkaW50X2gubTQgXAorCSQodG9wX3NyY2RpcikvbTQvZGFzdC5tNCAkKHRvcF9zcmNkaXIpL200L2FjeF9wdGhyZWFkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCithbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAorIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlndXJlLnN0YXR1cy5saW5lbm8KK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitSRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAorCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAorCXBkZi1yZWN1cnNpdmUgcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsLXJlY3Vyc2l2ZQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK2Rpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKK3RvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQorYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAorICB7IHRlc3QgISAtZCAkKGRpc3RkaXIpIFwKKyAgICB8fCB7IGZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkICEgLXBlcm0gLTIwMCAtZXhlYyBjaG1vZCB1K3cge30gJzsnIFwKKyAgICAgICAgICYmIHJtIC1mciAkKGRpc3RkaXIpOyB9OyB9CitESVNUX0FSQ0hJVkVTID0gJChkaXN0ZGlyKS50YXIuZ3oKK0daSVBfRU5WID0gLS1iZXN0CitkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CitkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNREVQX0ZBTFNFID0gQEFNREVQX0ZBTFNFQAorQU1ERVBfVFJVRSA9IEBBTURFUF9UUlVFQAorQU1UQVIgPSBAQU1UQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIUkVBRF9DQyA9IEBQVEhSRUFEX0NDQAorUFRIUkVBRF9DRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NACitQVEhSRUFEX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorUkFOTElCID0gQFJBTkxJQkAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NUUklQX0JFR0lOID0gQFNUUklQX0JFR0lOQAorU1RSSVBfRFVNTVkgPSBAU1RSSVBfRFVNTVlACitTVFJJUF9FTkQgPSBAU1RSSVBfRU5EQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0VCMTAwX0NGTEFHUyA9IEBXRUIxMDBfQ0ZMQUdTQAorV0VCMTAwX0NPTkZJRyA9IEBXRUIxMDBfQ09ORklHQAorV0VCMTAwX0xJQlMgPSBAV0VCMTAwX0xJQlNACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY3hfcHRocmVhZF9jb25maWcgPSBAYWN4X3B0aHJlYWRfY29uZmlnQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAorYW1fX2Zhc3RkZXBDWFhfVFJVRSA9IEBhbV9fZmFzdGRlcENYWF9UUlVFQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduCitTVUJESVJTID0gY29tcGF0IGRvYyBpbmNsdWRlIHNyYyBtYW4KK0FNX0NQUEZMQUdTID0gQFNUUklQX0JFR0lOQCBcCisJICAgICAgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgXAorCSAgICAgIC1JJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUgXAorCSAgICAgIEBTVFJJUF9FTkRACisKK0FNX0NYWEZMQUdTID0gLVdhbGwKK0FNX0ZMQUdTID0gLVdhbGwKK2FsbDogY29uZmlnLmgKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKK2FtLS1yZWZyZXNoOgorCUA6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGVjaG8gJyBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICc7IFwKKwkgICAgICBjZCAkKHNyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBNYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBlY2hvICcgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzJzsgXAorCSAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXM7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQorJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKKworY29uZmlnLmg6IHN0YW1wLWgxCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJICBybSAtZiBzdGFtcC1oMTsgXAorCSAgJChNQUtFKSBzdGFtcC1oMTsgXAorCWVsc2UgOjsgZmkKKworc3RhbXAtaDE6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBybSAtZiBzdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKKyQoc3JjZGlyKS9jb25maWcuaC5pbjogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKKwlybSAtZiBzdGFtcC1oMQorCXRvdWNoICRACisKK2Rpc3RjbGVhbi1oZHI6CisJLXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgxCit1bmluc3RhbGwtaW5mby1hbToKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKKwlAZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCWNhc2UgIiRAIiBpbiBcCisJICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCisJICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCisJZXNhYzsgXAorCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCXJldj0iJCRyZXYgLiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCitjdGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKKwlkb25lCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD0uOyBcCisJZWxzZSBcCisJICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD07IFwKKwlmaTsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAorCSAgICAgIHRhZ3M9IiQkdGFncyAkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaC5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSBjb25maWcuaC5pbiAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJbWtkaXIgJChkaXN0ZGlyKQorCSQobWtkaXJfcCkgJChkaXN0ZGlyKS9tNAorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGNhc2UgJCRmaWxlIGluIFwKKwkgICAgJChzcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKwkgICAgJCh0b3Bfc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfCJgOzsgXAorCSAgZXNhYzsgXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZGlyPWBlY2hvICIkJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgaWYgdGVzdCAiJCRkaXIiICE9ICIkJGZpbGUiICYmIHRlc3QgIiQkZGlyIiAhPSAiLiI7IHRoZW4gXAorCSAgICBkaXI9Ii8kJGRpciI7IFwKKwkgICAgJChta2Rpcl9wKSAiJChkaXN0ZGlyKSQkZGlyIjsgXAorCSAgZWxzZSBcCisJICAgIGRpcj0nJzsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKG1rZGlyX3ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgICBkaXN0ZGlyPWAkKGFtX19jZCkgJChkaXN0ZGlyKSAmJiBwd2RgOyBcCisJICAgIHRvcF9kaXN0ZGlyPWAkKGFtX19jZCkgJCh0b3BfZGlzdGRpcikgJiYgcHdkYDsgXAorCSAgICAoY2QgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJHRvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJGRpc3RkaXIvJCRzdWJkaXIiIFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCS1maW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC03NzcgLWV4ZWMgY2htb2QgYStyd3gge30gXDsgLW8gXAorCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtbGlua3MgMSAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAorCSAgISAtdHlwZSBkICEgLXBlcm0gLTQwMCAtZXhlYyBjaG1vZCBhK3Ige30gXDsgLW8gXAorCSAgISAtdHlwZSBkICEgLXBlcm0gLTQ0NCAtZXhlYyAkKFNIRUxMKSAkKGluc3RhbGxfc2gpIC1jIC1tIGErciB7fSB7fSBcOyBcCisJfHwgY2htb2QgLVIgYStyICQoZGlzdGRpcikKK2Rpc3QtZ3ppcDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtYnppcDI6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXRhclo6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC1zaGFyOiBkaXN0ZGlyCisJc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC16aXA6IGRpc3RkaXIKKwktcm0gLWYgJChkaXN0ZGlyKS56aXAKKwl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdCBkaXN0LWFsbDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKKyMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KKyMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKKyMgdGFyZmlsZS4KK2Rpc3RjaGVjazogZGlzdAorCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKKwkqLnRhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikudGFyLmd6IHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLmJ6MiopIFwKKwkgIGJ1bnppcDIgLWMgJChkaXN0ZGlyKS50YXIuYnoyIHwgJChhbV9fdW50YXIpIDs7XAorCSoudGFyLloqKSBcCisJICB1bmNvbXByZXNzIC1jICQoZGlzdGRpcikudGFyLlogfCAkKGFtX191bnRhcikgOztcCisJKi5zaGFyLmd6KikgXAorCSAgR1pJUD0kKEdaSVBfRU5WKSBndW56aXAgLWMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAorCSouemlwKikgXAorCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCisJZXNhYworCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQorCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS9faW5zdAorCWNobW9kIGEtdyAkKGRpc3RkaXIpCisJZGNfaW5zdGFsbF9iYXNlPWAkKGFtX19jZCkgJChkaXN0ZGlyKS9faW5zdCAmJiBwd2QgfCBzZWQgLWUgJ3MsXlteOlxcL106W1xcL10sLywnYCBcCisJICAmJiBkY19kZXN0ZGlyPSIkJHtUTVBESVItL3RtcH0vYW0tZGMtJCQkJC8iIFwKKwkgICYmIGNkICQoZGlzdGRpcikvX2J1aWxkIFwKKwkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICAgJChESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2sgXAorCSAgJiYgY2htb2QgLVIgYS13ICIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgJiYgKHsgXAorCSAgICAgICAoY2QgLi4vLi4gJiYgdW1hc2sgMDc3ICYmIG1rZGlyICIkJGRjX2Rlc3RkaXIiKSBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgaW5zdGFsbCBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgdW5pbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBcCisJICAgICAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19kZXN0ZGlyIiBkaXN0dW5pbnN0YWxsY2hlY2s7IFwKKwkgICAgICB9IHx8IHsgcm0gLXJmICIkJGRjX2Rlc3RkaXIiOyBleGl0IDE7IH0pIFwKKwkgICYmIHJtIC1yZiAiJCRkY19kZXN0ZGlyIiBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0IFwKKwkgICYmIHJtIC1yZiAkKERJU1RfQVJDSElWRVMpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3RjbGVhbmNoZWNrCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKKwkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKKwkgIHNlZCAtZSAnMXtoO3MvLi89L2c7cDt4O30nIC1lICckJHtwO3g7fScKK2Rpc3R1bmluc3RhbGxjaGVjazoKKwlAY2QgJChkaXN0dW5pbnN0YWxsY2hlY2tfZGlyKSBcCisJJiYgdGVzdCBgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtbGUgMSBcCisJICAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBhZnRlciB1bmluc3RhbGw6IiA7IFwKKwkgICAgICAgIGlmIHRlc3QgLW4gIiQoREVTVERJUikiOyB0aGVuIFwKKwkgICAgICAgICAgZWNobyAiICAoY2hlY2sgREVTVERJUiBzdXBwb3J0KSI7IFwKKwkgICAgICAgIGZpIDsgXAorCSAgICAgICAgJChkaXN0dW5pbnN0YWxsY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgIGV4aXQgMTsgfSA+JjIKK2Rpc3RjbGVhbmNoZWNrOiBkaXN0Y2xlYW4KKwlAaWYgdGVzdCAnJChzcmNkaXIpJyA9IC4gOyB0aGVuIFwKKwkgIGVjaG8gIkVSUk9SOiBkaXN0Y2xlYW5jaGVjayBjYW4gb25seSBydW4gZnJvbSBhIFZQQVRIIGJ1aWxkIiA7IFwKKwkgIGV4aXQgMSA7IFwKKwlmaQorCUB0ZXN0IGAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWVxIDAgXAorCSAgfHwgeyBlY2hvICJFUlJPUjogZmlsZXMgbGVmdCBpbiBidWlsZCBkaXJlY3RvcnkgYWZ0ZXIgZGlzdGNsZWFuOiIgOyBcCisJICAgICAgICQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSA7IFwKKwkgICAgICAgZXhpdCAxOyB9ID4mMgorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZSBjb25maWcuaAoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiAkKGFtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtcmVjdXJzaXZlCisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYworCitwZGY6IHBkZi1yZWN1cnNpdmUKKworcGRmLWFtOgorCitwczogcHMtcmVjdXJzaXZlCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1pbmZvLWFtCisKK3VuaW5zdGFsbC1pbmZvOiB1bmluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworLlBIT05ZOiAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGFtLS1yZWZyZXNoIGNoZWNrIFwKKwljaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLXJlY3Vyc2l2ZSBjdGFncyBcCisJY3RhZ3MtcmVjdXJzaXZlIGRpc3QgZGlzdC1hbGwgZGlzdC1iemlwMiBkaXN0LWd6aXAgZGlzdC1zaGFyIFwKKwlkaXN0LXRhclogZGlzdC16aXAgZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbi10YWdzIFwKKwlkaXN0Y2xlYW5jaGVjayBkaXN0ZGlyIGRpc3R1bmluc3RhbGxjaGVjayBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlIFwKKwltb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBwZGYgXAorCXBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAorCXVuaW5zdGFsbC1pbmZvLWFtCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L1JFQURNRSBiL2lwZXJmLTIuMC41L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjkzOTAyCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvUkVBRE1FCkBAIC0wLDAgKzEsMTkgQEAKK1RoaXMgaXMgSXBlcmYgdjIuMC4wLCBhIHRvb2wgZm9yIG1lYXN1cmluZyBJbnRlcm5ldCBiYW5kd2lkdGggcGVyZm9ybWFuY2UuCitTZWUgdGhlIGRvYyBkaXJlY3RvcnkgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi4KK0JyaWVmbHk6CisKKyAgLi9jb25maWd1cmUgICAgICAtLSBjb25maWd1cmUgZm9yIHlvdXIgbWFjaGluZQorICBtYWtlICAgICAgICAgICAgIC0tIGNvbXBpbGUgSXBlcmYKKyAgbWFrZSBpbnN0YWxsICAgICAtLSBpbnN0YWxsIElwZXJmLCBpZiBkZXNpcmVkCisKKyAgaXBlcmYgLXMgICAgICAgICAgICAgICAob24gbWFjaGluZSAiZm9vLmJhci5lZHUiKQorICBpcGVyZiAtYyBmb28uYmFyLmVkdSAgIChvbiBzb21lIG90aGVyIG1hY2hpbmUpCisgIGlwZXJmIC1oICAgICAgICAgICAgICAgKGZvciBoZWxwIHNjcmVlbikKKyAgaXBlcmYgLXYgICAgICAgICAgICAgICAoZm9yIHZlcnNpb24gaW5mb3JtYXRpb24pCisKK0NvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0CitUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMKK0FsbCByaWdodHMgcmVzZXJ2ZWQKK1NlZSBVSSBMaWNlbnNlIChkb2MvdWlfbGljZW5zZS5odG1sKSBmb3IgY29tcGxldGUgZGV0YWlscy4KKworJElkOiBSRUFETUUsdiAxLjEuMS4xIDIwMDQvMDUvMTggMDE6NTA6NDQga2dpYmJzIEV4cCAkCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9hY2xvY2FsLm00IGIvaXBlcmYtMi4wLjUvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYxODFhCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvYWNsb2NhbC5tNApAQCAtMCwwICsxLDg1MCBAQAorIyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuOS42IC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCisjIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCisjIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgorQUNfREVGVU4oW0FNX0FVVE9NQUtFX1ZFUlNJT05dLCBbYW1fX2FwaV92ZXJzaW9uPSIxLjkiXSkKKworIyBBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsbCBBTV9BVVRPTUFLRV9WRVJTSU9OIHNvIGl0IGNhbiBiZSB0cmFjZWQuCisjIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQUNfSU5JVF9BVVRPTUFLRS4KK0FDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKKwkgW0FNX0FVVE9NQUtFX1ZFUlNJT04oWzEuOS42XSldKQorCisjIEFNX0FVWF9ESVJfRVhQQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEZvciBwcm9qZWN0cyB1c2luZyBBQ19DT05GSUdfQVVYX0RJUihbZm9vXSksIEF1dG9jb25mIHNldHMKKyMgJGFjX2F1eF9kaXIgdG8gYCRzcmNkaXIvZm9vJy4gIEluIG90aGVyIHByb2plY3RzLCBpdCBpcyBzZXQgdG8KKyMgYCRzcmNkaXInLCBgJHNyY2Rpci8uLicsIG9yIGAkc3JjZGlyLy4uLy4uJy4KKyMKKyMgT2YgY291cnNlLCBBdXRvbWFrZSBtdXN0IGhvbm9yIHRoaXMgdmFyaWFibGUgd2hlbmV2ZXIgaXQgY2FsbHMgYQorIyB0b29sIGZyb20gdGhlIGF1eGlsaWFyeSBkaXJlY3RvcnkuICBUaGUgcHJvYmxlbSBpcyB0aGF0ICRzcmNkaXIgKGFuZAorIyB0aGVyZWZvcmUgJGFjX2F1eF9kaXIgYXMgd2VsbCkgY2FuIGJlIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKKyMgZGVwZW5kaW5nIG9uIGhvdyBjb25maWd1cmUgaXMgcnVuLiAgVGhpcyBpcyBwcmV0dHkgYW5ub3lpbmcsIHNpbmNlCisjIGl0IG1ha2VzICRhY19hdXhfZGlyIHF1aXRlIHVudXNhYmxlIGluIHN1YmRpcmVjdG9yaWVzOiBpbiB0aGUgdG9wCisjIHNvdXJjZSBkaXJlY3RvcnksIGFueSBmb3JtIHdpbGwgd29yayBmaW5lLCBidXQgaW4gc3ViZGlyZWN0b3JpZXMgYQorIyByZWxhdGl2ZSBwYXRoIG5lZWRzIHRvIGJlIGFkanVzdGVkIGZpcnN0LgorIworIyAkYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIHdoZW4gY2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkgaWYgJGFjX2F1eF9kaXIgaXMgcmVsYXRpdmUKKyMgJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZworIyAgICBmYWlscyBpZiAkYWNfYXV4X2RpciBpcyBhYnNvbHV0ZSwKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpbiBhIFZQQVRIIGJ1aWxkIHdpdGgKKyMgICAgICAgICAgYSByZWxhdGl2ZSAkYWNfYXV4X2RpcgorIworIyBUaGUgcmVhc29uIG9mIHRoZSBsYXR0ZXIgZmFpbHVyZSBpcyB0aGF0ICR0b3Bfc3JjZGlyIGFuZCAkYWNfYXV4X2RpcgorIyBhcmUgYm90aCBwcmVmaXhlZCBieSAkc3JjZGlyLiAgSW4gYW4gaW4tc291cmNlIGJ1aWxkIHRoaXMgaXMgdXN1YWxseQorIyBoYXJtbGVzcyBiZWNhdXNlICRzcmNkaXIgaXMgYC4nLCBidXQgdGhpbmdzIHdpbGwgYnJva2Ugd2hlbiB5b3UKKyMgc3RhcnQgYSBWUEFUSCBidWlsZCBvciB1c2UgYW4gYWJzb2x1dGUgJHNyY2Rpci4KKyMKKyMgU28gd2UgY291bGQgdXNlIHNvbWV0aGluZyBzaW1pbGFyIHRvICR0b3Bfc3JjZGlyLyRhY19hdXhfZGlyL21pc3NpbmcsCisjIGlmZiB3ZSBzdHJpcCB0aGUgbGVhZGluZyAkc3JjZGlyIGZyb20gJGFjX2F1eF9kaXIuICBUaGF0IHdvdWxkIGJlOgorIyAgIGFtX2F1eF9kaXI9J1wkKHRvcF9zcmNkaXIpLydgZXhwciAiJGFjX2F1eF9kaXIiIDogIiRzcmNkaXIvLypcKC4qXCkiYAorIyBhbmQgdGhlbiB3ZSB3b3VsZCBkZWZpbmUgJE1JU1NJTkcgYXMKKyMgICBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBNSVNTSU5HIGlzIG5vdCBjYWxsZWQgZnJvbSBjb25maWd1cmUsIGJlY2F1c2UKKyMgdW5mb3J0dW5hdGVseSAkKHRvcF9zcmNkaXIpIGhhcyBubyBtZWFuaW5nIGluIGNvbmZpZ3VyZS4KKyMgSG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgdmFyaWFibGVzLCBsaWtlIENDLCB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBpbgorIyBjb25maWd1cmUsIGFuZCBjb3VsZCB0aGVyZWZvcmUgbm90IHVzZSB0aGlzICJmaXhlZCIgJGFjX2F1eF9kaXIuCisjCisjIEFub3RoZXIgc29sdXRpb24sIHVzZWQgaGVyZSwgaXMgdG8gYWx3YXlzIGV4cGFuZCAkYWNfYXV4X2RpciB0byBhbgorIyBhYnNvbHV0ZSBQQVRILiAgVGhlIGRyYXdiYWNrIGlzIHRoYXQgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcHJldmVudCBhCisjIGNvbmZpZ3VyZWQgdHJlZSB0byBiZSBtb3ZlZCB3aXRob3V0IHJlY29uZmlndXJhdGlvbi4KKworQUNfREVGVU4oW0FNX0FVWF9ESVJfRVhQQU5EXSwKK1tkbmwgUmVseSBvbiBhdXRvY29uZiB0byBzZXQgdXAgQ0RQQVRIIHByb3Blcmx5LgorQUNfUFJFUkVRKFsyLjUwXSlkbmwKKyMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKK2FtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKK10pCisKKyMgQU1fQ09ORElUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNworCisjIEFNX0NPTkRJVElPTkFMKE5BTUUsIFNIRUxMLUNPTkRJVElPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KK0FDX0RFRlVOKFtBTV9DT05ESVRJT05BTF0sCitbQUNfUFJFUkVRKDIuNTIpZG5sCisgaWZlbHNlKFskMV0sIFtUUlVFXSwgIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSwKKwlbJDFdLCBbRkFMU0VdLCBbQUNfRkFUQUwoWyQwOiBpbnZhbGlkIGNvbmRpdGlvbjogJDFdKV0pZG5sCitBQ19TVUJTVChbJDFfVFJVRV0pCitBQ19TVUJTVChbJDFfRkFMU0VdKQoraWYgJDI7IHRoZW4KKyAgJDFfVFJVRT0KKyAgJDFfRkFMU0U9JyMnCitlbHNlCisgICQxX1RSVUU9JyMnCisgICQxX0ZBTFNFPQorZmkKK0FDX0NPTkZJR19DT01NQU5EU19QUkUoCitbaWYgdGVzdCAteiAiJHskMV9UUlVFfSIgJiYgdGVzdCAteiAiJHskMV9GQUxTRX0iOyB0aGVuCisgIEFDX01TR19FUlJPUihbW2NvbmRpdGlvbmFsICIkMSIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS5dXSkKK2ZpXSldKQorCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDgKKworIyBUaGVyZSBhcmUgYSBmZXcgZGlydHkgaGFja3MgYmVsb3cgdG8gYXZvaWQgbGV0dGluZyBgQUNfUFJPR19DQycgYmUKKyMgd3JpdHRlbiBpbiBjbGVhciwgaW4gd2hpY2ggY2FzZSBhdXRvbWFrZSwgd2hlbiByZWFkaW5nIGFjbG9jYWwubTQsCisjIHdpbGwgdGhpbmsgaXQgc2VlcyBhICp1c2UqLCBhbmQgdGhlcmVmb3JlIHdpbGwgdHJpZ2dlciBhbGwgaXQncworIyBDIHN1cHBvcnQgbWFjaGluZXJ5LiAgQWxzbyBub3RlIHRoYXQgaXQgbWVhbnMgdGhhdCBhdXRvc2Nhbiwgc2VlaW5nCisjIENDIGV0Yy4gaW4gdGhlIE1ha2VmaWxlLCB3aWxsIGFzayBmb3IgYW4gQUNfUFJPR19DQyB1c2UuLi4KKworCisjIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCisjIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCisjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCisjCisjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcworIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgorIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCisjIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgorQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAorQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAorQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCisKK2lmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKKyAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCisgICAgICAgICAgICAgICBbYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdLAorW2lmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCcuCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgorICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCitdKQorQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCitBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQorXSkKKworCisjIEFNX1NFVF9ERVBESVIKKyMgLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KKyMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCitBQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCitbQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK0FDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKK10pCisKKworIyBBTV9ERVBfVFJBQ0sKKyMgLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKK1tBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCitbICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKK2ZpCitBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKK0FDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pCitdKQorCisjIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyNzZXJpYWwgMworCisjIF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW2ZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbworICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAorICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0CisgICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgorICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAjIFNvIGxldCdzIGdyZXAgd2hvbGUgZmlsZS4KKyAgaWYgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgJG1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBkaXJwYXJ0PWBBU19ESVJOQU1FKCIkbWYiKWAKKyAgZWxzZQorICAgIGNvbnRpbnVlCisgIGZpCisgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQorICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCisgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCisgICMgZXhwYW5zaW9uLgorICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKKyAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICBmZGlyPWBBU19ESVJOQU1FKFsiJGZpbGUiXSlgCisgICAgQVNfTUtESVJfUChbJGRpcnBhcnQvJGZkaXJdKQorICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgIGRvbmUKK2RvbmUKK10pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKworCisjIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KKyMKKyMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZworIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCisjIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCitBQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAorICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKKyAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQorXSkKKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxMgorCisjIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgorIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorCisjIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCisjIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKKyMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQorIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KKyMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KKyMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCisjIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCisjIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKKyMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KK0FDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKK1tBQ19QUkVSRVEoWzIuNThdKWRubAorZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKK2RubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgorbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCisjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKKyAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCitBQ19TVUJTVChbQ1lHUEFUSF9XXSkKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorZG5sIERpc3Rpbmd1aXNoIGJldHdlZW4gb2xkLXN0eWxlIGFuZCBuZXctc3R5bGUgY2FsbHMuCittNF9pZnZhbChbJDJdLAorW200X2lmdmFsKFskM10sIFtfQU1fU0VUX09QVElPTihbbm8tZGVmaW5lXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWyQxXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFskMl0pXSwKK1tfQU1fU0VUX09QVElPTlMoWyQxXSlkbmwKKyBBQ19TVUJTVChbUEFDS0FHRV0sIFsnQUNfUEFDS0FHRV9UQVJOQU1FJ10pZG5sCisgQUNfU1VCU1QoW1ZFUlNJT05dLCBbJ0FDX1BBQ0tBR0VfVkVSU0lPTiddKV0pZG5sCisKK19BTV9JRl9PUFRJT04oW25vLWRlZmluZV0sLAorW0FDX0RFRklORV9VTlFVT1RFRChQQUNLQUdFLCAiJFBBQ0tBR0UiLCBbTmFtZSBvZiBwYWNrYWdlXSkKKyBBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKV0pZG5sCisKKyMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KK0FDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pZG5sCitBQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pZG5sCitBTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0pCitBTV9NSVNTSU5HX1BST0coQVVUT0NPTkYsIGF1dG9jb25mKQorQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZS0ke2FtX19hcGlfdmVyc2lvbn0pCitBTV9NSVNTSU5HX1BST0coQVVUT0hFQURFUiwgYXV0b2hlYWRlcikKK0FNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8pCitBTV9QUk9HX0lOU1RBTExfU0gKK0FNX1BST0dfSU5TVEFMTF9TVFJJUAorQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCisgICAgICAgICAgICAgIFtfQU1fSUZfT1BUSU9OKFt0YXItcGF4XSwgW19BTV9QUk9HX1RBUihbcGF4XSldLAorCSAgICAgIAkJICAgICBbX0FNX1BST0dfVEFSKFt2N10pXSldKQorX0FNX0lGX09QVElPTihbbm8tZGVwZW5kZW5jaWVzXSwsCitbQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ0NdLAorICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKKyAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfQ0NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZuKFtBQ19QUk9HX0NDXSlbX0FNX0RFUEVOREVOQ0lFUyhDQyldKV0pZG5sCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAorICAgICAgICAgICAgICAgICAgW19BTV9ERVBFTkRFTkNJRVMoQ1hYKV0sCisgICAgICAgICAgICAgICAgICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAorXSkKK10pCisKKworIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKKyMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgorCisjIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCisjIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKKyMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgorQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAorWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICQxIHwgJDE6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICQxIiA+YEFTX0RJUk5BTUUoWyQxXSlgL3N0YW1wLWhbXSRfYW1fc3RhbXBfY291bnRdKQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9QUk9HX0lOU1RBTExfU0gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSAkaW5zdGFsbF9zaC4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU0hdLAorW0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK2luc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSIkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIn0KK0FDX1NVQlNUKGluc3RhbGxfc2gpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDIKKworIyBDaGVjayB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGZpbGUtc3lzdGVtIHN1cHBvcnRzIGZpbGVuYW1lcworIyB3aXRoIGEgbGVhZGluZyBkb3QuICBGb3IgaW5zdGFuY2UgTVMtRE9TIGRvZXNuJ3QuCitBQ19ERUZVTihbQU1fU0VUX0xFQURJTkdfRE9UXSwKK1tybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorQUNfU1VCU1QoW2FtX19sZWFkaW5nX2RvdF0pXSkKKworIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDMKKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIGRvbmUKKy5QSE9OWTogYW1fX2RvaXQKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgorQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKK2FtX19pbmNsdWRlPSIjIgorYW1fX3F1b3RlPQorX2FtX3Jlc3VsdD1ub25lCisjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgorZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgorIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JworIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgorIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAorIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKKyMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgoraWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCisgICBhbV9faW5jbHVkZT1pbmNsdWRlCisgICBhbV9fcXVvdGU9CisgICBfYW1fcmVzdWx0PUdOVQorZmkKKyMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgoraWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgorICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgorICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgorICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKKyAgICAgIGFtX19xdW90ZT0iXCIiCisgICAgICBfYW1fcmVzdWx0PUJTRAorICAgZmkKK2ZpCitBQ19TVUJTVChbYW1fX2luY2x1ZGVdKQorQUNfU1VCU1QoW2FtX19xdW90ZV0pCitBQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCitybSAtZiBjb25maW5jIGNvbmZtZgorXSkKKworIyBGYWtlIHRoZSBleGlzdGVuY2Ugb2YgcHJvZ3JhbXMgdGhhdCBHTlUgbWFpbnRhaW5lcnMgdXNlLiAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0CisKKyMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCitbQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKKyQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQorQUNfU1VCU1QoJDEpXSkKKworCisjIEFNX01JU1NJTkdfSEFTX1JVTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgorIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCitBQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCit0ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCitmaQorXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19NS0RJUl9QCisjIC0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIGBta2RpciAtcCcgaXMgc3VwcG9ydGVkLCBmYWxsYmFjayB0byBta2luc3RhbGxkaXJzIG90aGVyd2lzZS4KKyMKKyMgQXV0b21ha2UgMS44IHVzZWQgYG1rZGlyIC1tIDA3NTUgLXAgLS0nIHRvIGVuc3VyZSB0aGF0IGRpcmVjdG9yaWVzCisjIGNyZWF0ZWQgYnkgYG1ha2UgaW5zdGFsbCcgYXJlIGFsd2F5cyB3b3JsZCByZWFkYWJsZSwgZXZlbiBpZiB0aGUKKyMgaW5zdGFsbGVyIGhhcHBlbnMgdG8gaGF2ZSBhbiBvdmVybHkgcmVzdHJpY3RpdmUgdW1hc2sgKGUuZy4gMDc3KS4KKyMgVGhpcyB3YXMgYSBtaXN0YWtlLiAgVGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWFzb25zIHdoeSB3ZSBtdXN0IG5vdAorIyB1c2UgYC1tIDA3NTUnOgorIyAgIC0gaXQgY2F1c2VzIHNwZWNpYWwgYml0cyBsaWtlIFNHSUQgdG8gYmUgaWdub3JlZCwKKyMgICAtIGl0IG1heSBiZSB0b28gcmVzdHJpY3RpdmUgKHNvbWUgc2V0dXBzIGV4cGVjdCA3NzUgZGlyZWN0b3JpZXMpLgorIworIyBEbyBub3QgdXNlIC1tIDA3NTUgYW5kIGxldCBwZW9wbGUgY2hvb3NlIHdoYXRldmVyIHRoZXkgZXhwZWN0IGJ5CisjIHNldHRpbmcgdW1hc2suCisjCisjIFdlIGNhbm5vdCBhY2NlcHQgYW55IGltcGxlbWVudGF0aW9uIG9mIGBta2RpcicgdGhhdCByZWNvZ25pemVzIGAtcCcuCisjIFNvbWUgaW1wbGVtZW50YXRpb25zIChzdWNoIGFzIFNvbGFyaXMgOCdzKSBhcmUgbm90IHRocmVhZC1zYWZlOiBpZiBhCisjIHBhcmFsbGVsIG1ha2UgdHJpZXMgdG8gcnVuIGBta2RpciAtcCBhL2InIGFuZCBgbWtkaXIgLXAgYS9jJworIyBjb25jdXJyZW50bHksIGJvdGggdmVyc2lvbiBjYW4gZGV0ZWN0IHRoYXQgYS8gaXMgbWlzc2luZywgYnV0IG9ubHkKKyMgb25lIGNhbiBjcmVhdGUgaXQgYW5kIHRoZSBvdGhlciB3aWxsIGVycm9yIG91dC4gIENvbnNlcXVlbnRseSB3ZQorIyByZXN0cmljdCBvdXJzZWx2ZXMgdG8gR05VIG1ha2UgKHVzaW5nIHRoZSAtLXZlcnNpb24gb3B0aW9uIGVuc3VyZXMKKyMgdGhpcy4pCitBQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKK1tpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICMgV2UgdXNlZCB0byBrZWVwaW5nIHRoZSBgLicgYXMgZmlyc3QgYXJndW1lbnQsIGluIG9yZGVyIHRvCisgICMgYWxsb3cgJChta2Rpcl9wKSB0byBiZSB1c2VkIHdpdGhvdXQgYXJndW1lbnQuICBBcyBpbgorICAjICAgJChta2Rpcl9wKSAkKHNvbWVkaXIpCisgICMgd2hlcmUgJChzb21lZGlyKSBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQuICBIb3dldmVyIHRoaXMgaXMgd3JvbmcKKyAgIyBmb3IgdHdvIHJlYXNvbnM6CisgICMgIDEuIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSBhIHVzZXIgd2hvIGNhbm5vdCB3cml0ZSBgLicKKyAgIyAgICAgbWFrZSBpbnN0YWxsIHdpbGwgZmFpbCwKKyAgIyAgMi4gdGhlIGFib3ZlIGNvbW1lbnQgc2hvdWxkIG1vc3QgY2VydGFpbmx5IHJlYWQKKyAgIyAgICAgJChta2Rpcl9wKSAkKERFU1RESVIpJChzb21lZGlyKQorICAjICAgICBzbyBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gJChzb21lZGlyKSBpcyB1bmRlZmluZWQgYW5kCisgICMgICAgICQoREVTVERJUikgaXMgbm90LgorICAjICBUbyBzdXBwb3J0IHRoZSBsYXR0ZXIgY2FzZSwgd2UgaGF2ZSB0byB3cml0ZQorICAjICAgICB0ZXN0IC16ICIkKHNvbWVkaXIpIiB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpLAorICAjICBzbyB0aGUgYC4nIHRyaWNrIGlzIHBvaW50bGVzcy4KKyAgbWtkaXJfcD0nbWtkaXIgLXAgLS0nCitlbHNlCisgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisgICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcworICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQorICAjIGV4aXN0cy4KKyAgZm9yIGQgaW4gLi8tcCAuLy0tdmVyc2lvbjsKKyAgZG8KKyAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCisgIGRvbmUKKyAgIyAkKG1raW5zdGFsbGRpcnMpIGlzIGRlZmluZWQgYnkgQXV0b21ha2UgaWYgbWtpbnN0YWxsZGlycyBleGlzdHMuCisgIGlmIHRlc3QgLWYgIiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiOyB0aGVuCisgICAgbWtkaXJfcD0nJChta2luc3RhbGxkaXJzKScKKyAgZWxzZQorICAgIG1rZGlyX3A9JyQoaW5zdGFsbF9zaCkgLWQnCisgIGZpCitmaQorQUNfU1VCU1QoW21rZGlyX3BdKV0pCisKKyMgSGVscGVyIGZ1bmN0aW9ucyBmb3Igb3B0aW9uIGhhbmRsaW5nLiAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDMKKworIyBfQU1fTUFOR0xFX09QVElPTihOQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19BTV9NQU5HTEVfT1BUSU9OXSwKK1tbX0FNX09QVElPTl9dbTRfYnBhdHN1YnN0KCQxLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisjIF9BTV9TRVRfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE5BTUUuICBQcmVzZW50bHkgdGhhdCBvbmx5IG1lYW5zIGRlZmluaW5nIGEgZmxhZyBmb3IgdGhpcyBvcHRpb24uCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05dLAorW200X2RlZmluZShfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgMSldKQorCisjIF9BTV9TRVRfT1BUSU9OUyhPUFRJT05TKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTlMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBBdXRvbWFrZSBvcHRpb25zLgorQUNfREVGVU4oW19BTV9TRVRfT1BUSU9OU10sCitbQUNfRk9SRUFDSChbX0FNX09wdGlvbl0sIFskMV0sIFtfQU1fU0VUX09QVElPTihfQU1fT3B0aW9uKV0pXSkKKworIyBfQU1fSUZfT1BUSU9OKE9QVElPTiwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhlY3V0ZSBJRi1TRVQgaWYgT1BUSU9OIGlzIHNldCwgSUYtTk9ULVNFVCBvdGhlcndpc2UuCitBQ19ERUZVTihbX0FNX0lGX09QVElPTl0sCitbbTRfaWZzZXQoX0FNX01BTkdMRV9PUFRJT04oWyQxXSksIFskMl0sIFskM10pXSkKKworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4gICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0CisKKyMgQU1fU0FOSVRZX0NIRUNLCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX1NBTklUWV9DSEVDS10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiRbKl0iID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGVgCisgICBmaQorICAgcm0gLWYgY29uZnRlc3QuZmlsZQorICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCitmaQorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19JTlNUQUxMX1NUUklQCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKKyMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisjIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCisjIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgorIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCisjIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKKyMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAorW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitkbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQorZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCR7U0hFTEx9IFwkKGluc3RhbGxfc2gpIC1jIC1zIgorQUNfU1VCU1QoW0lOU1RBTExfU1RSSVBfUFJPR1JBTV0pXSkKKworIyBDaGVjayBob3cgdG8gY3JlYXRlIGEgdGFyYmFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIF9BTV9QUk9HX1RBUihGT1JNQVQpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsIGluIGZvcm1hdCBGT1JNQVQuCisjIEZPUk1BVCBzaG91bGQgYmUgb25lIG9mIGB2NycsIGB1c3RhcicsIG9yIGBwYXgnLgorIworIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdGFyKSB0aGF0IGlzIGEgY29tbWFuZAorIyB3cml0aW5nIHRvIHN0ZG91dCBhIEZPUk1BVC10YXJiYWxsIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeQorIyAkdGFyZGlyLgorIyAgICAgdGFyZGlyPWRpcmVjdG9yeSAmJiAkKGFtX190YXIpID4gcmVzdWx0LnRhcgorIworIyBTdWJzdGl0dXRlIGEgdmFyaWFibGUgJChhbV9fdW50YXIpIHRoYXQgZXh0cmFjdCBzdWNoCisjIGEgdGFyYmFsbCByZWFkIGZyb20gc3RkaW4uCisjICAgICAkKGFtX191bnRhcikgPCByZXN1bHQudGFyCitBQ19ERUZVTihbX0FNX1BST0dfVEFSXSwKK1sjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitBTV9NSVNTSU5HX1BST0coW0FNVEFSXSwgW3Rhcl0pCittNF9pZihbJDFdLCBbdjddLAorICAgICBbYW1fX3Rhcj0nJHtBTVRBUn0gY2hvZiAtICIkJHRhcmRpciInOyBhbV9fdW50YXI9JyR7QU1UQVJ9IHhmIC0nXSwKKyAgICAgW200X2Nhc2UoWyQxXSwgW3VzdGFyXSwsIFtwYXhdLCwKKyAgICAgICAgICAgICAgW200X2ZhdGFsKFtVbmtub3duIHRhciBmb3JtYXRdKV0pCitBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBjcmVhdGUgYSAkMSB0YXIgYXJjaGl2ZV0pCisjIExvb3Agb3ZlciBhbGwga25vd24gbWV0aG9kcyB0byBjcmVhdGUgYSB0YXIgYXJjaGl2ZSB1bnRpbCBvbmUgd29ya3MuCitfYW1fdG9vbHM9J2dudXRhciBtNF9pZihbJDFdLCBbdXN0YXJdLCBbcGxhaW50YXJdKSBwYXggY3BpbyBub25lJworX2FtX3Rvb2xzPSR7YW1fY3ZfcHJvZ190YXJfJDEtJF9hbV90b29sc30KKyMgRG8gbm90IGZvbGQgdGhlIGFib3ZlIHR3byBsaW5lIGludG8gb25lLCBiZWNhdXNlIFRydTY0IHNoIGFuZAorIyBTb2xhcmlzIHNoIHdpbGwgbm90IGdyb2sgc3BhY2VzIGluIHRoZSByaHMgb2YgYC0nLgorZm9yIF9hbV90b29sIGluICRfYW1fdG9vbHMKK2RvCisgIGNhc2UgJF9hbV90b29sIGluCisgIGdudXRhcikKKyAgICBmb3IgX2FtX3RhciBpbiB0YXIgZ251dGFyIGd0YXI7CisgICAgZG8KKyAgICAgIEFNX1JVTl9MT0coWyRfYW1fdGFyIC0tdmVyc2lvbl0pICYmIGJyZWFrCisgICAgZG9uZQorICAgIGFtX190YXI9IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJCR0YXJkaXIiJworICAgIGFtX190YXJfPSIkX2FtX3RhciAtLWZvcm1hdD1tNF9pZihbJDFdLCBbcGF4XSwgW3Bvc2l4XSwgWyQxXSkgLWNoZiAtICInIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0iJF9hbV90YXIgLXhmIC0iCisgICAgOzsKKyAgcGxhaW50YXIpCisgICAgIyBNdXN0IHNraXAgR05VIHRhcjogaWYgaXQgZG9lcyBub3Qgc3VwcG9ydCAtLWZvcm1hdD0gaXQgZG9lc24ndCBjcmVhdGUKKyAgICAjIHVzdGFyIHRhcmJhbGwgZWl0aGVyLgorICAgICh0YXIgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjEgJiYgY29udGludWUKKyAgICBhbV9fdGFyPSd0YXIgY2hmIC0gIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0ndGFyIGNoZiAtICIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9J3RhciB4ZiAtJworICAgIDs7CisgIHBheCkKKyAgICBhbV9fdGFyPSdwYXggLUwgLXggJDEgLXcgIiQkdGFyZGlyIicKKyAgICBhbV9fdGFyXz0ncGF4IC1MIC14ICQxIC13ICIkdGFyZGlyIicKKyAgICBhbV9fdW50YXI9J3BheCAtcicKKyAgICA7OworICBjcGlvKQorICAgIGFtX190YXI9J2ZpbmQgIiQkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJworICAgIGFtX190YXJfPSdmaW5kICIkdGFyZGlyIiAtcHJpbnQgfCBjcGlvIC1vIC1IICQxIC1MJworICAgIGFtX191bnRhcj0nY3BpbyAtaSAtSCAkMSAtZCcKKyAgICA7OworICBub25lKQorICAgIGFtX190YXI9ZmFsc2UKKyAgICBhbV9fdGFyXz1mYWxzZQorICAgIGFtX191bnRhcj1mYWxzZQorICAgIDs7CisgIGVzYWMKKworICAjIElmIHRoZSB2YWx1ZSB3YXMgY2FjaGVkLCBzdG9wIG5vdy4gIFdlIGp1c3Qgd2FudGVkIHRvIGhhdmUgYW1fX3RhcgorICAjIGFuZCBhbV9fdW50YXIgc2V0LgorICB0ZXN0IC1uICIke2FtX2N2X3Byb2dfdGFyXyQxfSIgJiYgYnJlYWsKKworICAjIHRhci91bnRhciBhIGR1bW15IGRpcmVjdG9yeSwgYW5kIHN0b3AgaWYgdGhlIGNvbW1hbmQgd29ya3MKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgZWNobyBHcmVwTWUgPiBjb25mdGVzdC5kaXIvZmlsZQorICBBTV9SVU5fTE9HKFt0YXJkaXI9Y29uZnRlc3QuZGlyICYmIGV2YWwgJGFtX190YXJfID5jb25mdGVzdC50YXJdKQorICBybSAtcmYgY29uZnRlc3QuZGlyCisgIGlmIHRlc3QgLXMgY29uZnRlc3QudGFyOyB0aGVuCisgICAgQU1fUlVOX0xPRyhbJGFtX191bnRhciA8Y29uZnRlc3QudGFyXSkKKyAgICBncmVwIEdyZXBNZSBjb25mdGVzdC5kaXIvZmlsZSA+L2Rldi9udWxsIDI+JjEgJiYgYnJlYWsKKyAgZmkKK2RvbmUKK3JtIC1yZiBjb25mdGVzdC5kaXIKKworQUNfQ0FDSEVfVkFMKFthbV9jdl9wcm9nX3Rhcl8kMV0sIFthbV9jdl9wcm9nX3Rhcl8kMT0kX2FtX3Rvb2xdKQorQUNfTVNHX1JFU1VMVChbJGFtX2N2X3Byb2dfdGFyXyQxXSldKQorQUNfU1VCU1QoW2FtX190YXJdKQorQUNfU1VCU1QoW2FtX191bnRhcl0pCitdKSAjIF9BTV9QUk9HX1RBUgorCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9hdXRvZ2VuLnNoIGIvaXBlcmYtMi4wLjUvYXV0b2dlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOTRkNmFjCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvYXV0b2dlbi5zaApAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworIyBhdXRvZ2VuLnNoOiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFsbCBidWlsZCBmaWxlcyBmcm9tIGNvbmZpZ3VyZS5hYworCisjIGFjbG9jYWwgZG9lc24ndCBsaWtlIGl0IGlmIHlvdSAtSSB0aGUgc3lzdGVtIGFjbG9jYWwgZGlyZWN0b3J5CitTWVNfQUNMT0NBTF9ESVI9YGFjbG9jYWwgLS1wcmludC1hYy1kaXJgCitmb3IgaSBpbiBtNCAvdXNyL2xvY2FsL3NoYXJlL2FjbG9jYWw7IGRvCisgICAgaWYgWyAhICRpID0gJFNZU19BQ0xPQ0FMX0RJUiAtYSAtZCAkaSBdOyB0aGVuCisgICAgICAgIEFDTE9DQUxfT1BUUz0iJEFDTE9DQUxfT1BUUyAtSSAkaSIKKyAgICBmaQorZG9uZQorYWNsb2NhbCAkQUNMT0NBTF9PUFRTIHx8IGV4aXQgMQorCithdXRvaGVhZGVyIHx8IGV4aXQgMQorYXV0b2NvbmYgfHwgZXhpdCAxCisKK2F1dG9tYWtlIC0tYWRkLW1pc3NpbmcgLS1pbmNsdWRlLWRlcHMgLS1mb3JlaWduIHx8IGV4aXQgMQpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvYXV0b200dGUuY2FjaGUvb3V0cHV0LjAgYi9pcGVyZi0yLjAuNS9hdXRvbTR0ZS5jYWNoZS9vdXRwdXQuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYzMGUzCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvYXV0b200dGUuY2FjaGUvb3V0cHV0LjAKQEAgLTAsMCArMSw5NTEyIEBACitAJTpAISAvYmluL3NoCitAJTpAIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCitAJTpAIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgSXBlcmYgMi4wLjUuCitAJTpAIAorQCU6QCAKK0AlOkAgQ29weXJpZ2h0IChDKSAxOTkyLTE5OTYsIDE5OTgtMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0AlOkAgCitAJTpAIAorQCU6QCBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorQCU6QCBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4gQCU6QCgKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyBAJTpAKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorCisKK2FzX25sPScKKycKK2V4cG9ydCBhc19ubAorIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisjIFByZWZlciBhIGtzaCBzaGVsbCBidWlsdGluIG92ZXIgYW4gZXh0ZXJuYWwgcHJpbnRmIHByb2dyYW0gb24gU29sYXJpcywKKyMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCitpZiB0ZXN0IC16ICIkQkFTSF9WRVJTSU9OJFpTSF9WRVJTSU9OIiBcCisgICAgJiYgKHRlc3QgIlhgcHJpbnQgLXIgLS0gJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludCAtciAtLScKKyAgYXNfZWNob19uPSdwcmludCAtcm4gLS0nCitlbGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50ZiAlc1xuJworICBhc19lY2hvX249J3ByaW50ZiAlcycKK2Vsc2UKKyAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCisgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisgIGVsc2UKKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisgICAgICBhcmc9JDE7CisgICAgICBjYXNlICRhcmcgaW4gQCU6QCgKKyAgICAgICoiJGFzX25sIiopCisJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7CisJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKyAgICAgIGVzYWM7CisgICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCisgICAgJworICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCisgIGZpCisgIGV4cG9ydCBhc19lY2hvX2JvZHkKKyAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJworZmkKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBQQVRIX1NFUEFSQVRPUj06CisgIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIH0KK2ZpCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorYXNfbXlzZWxmPQorY2FzZSAkMCBpbiBAJTpAKCgKKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAkYXNfZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICBleGl0IDEKK2ZpCisKKyMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KKyMgcHJlLTMuMCBVV0lOIGtzaCkuICBCdXQgZG8gbm90IGNhdXNlIGJ1Z3MgaW4gYmFzaCAyLjAxOyB0aGUgInx8IGV4aXQgMSIKKyMgc3VwcHJlc3NlcyBhbnkgIlNlZ21lbnRhdGlvbiBmYXVsdCIgbWVzc2FnZSB0aGVyZS4gICcoKCcgY291bGQKKyMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCitmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOViBNQUlMIE1BSUxQQVRICitkbyBldmFsIHRlc3QgeFwkeyRhc192YXIrc2V0fSA9IHhzZXQgXAorICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorTENfQUxMPUMKK2V4cG9ydCBMQ19BTEwKK0xBTkdVQUdFPUMKK2V4cG9ydCBMQU5HVUFHRQorCisjIENEUEFUSC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworIyBVc2UgYSBwcm9wZXIgaW50ZXJuYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gZW5zdXJlIHdlIGRvbid0IGZhbGwKKyAgIyBpbnRvIGFuIGluZmluaXRlIGxvb3AsIGNvbnRpbnVvdXNseSByZS1leGVjdXRpbmcgb3Vyc2VsdmVzLgorICBpZiB0ZXN0IHgiJHtfYXNfY2FuX3JlZXhlY30iICE9IHhubyAmJiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgorICAgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWM7CisgICAgIyBXZSBjYW5ub3QgeWV0IGFzc3VtZSBhIGRlY2VudCBzaGVsbCwgc28gd2UgaGF2ZSB0byBwcm92aWRlIGEKKyMgbmV1dHJhbGl6YXRpb24gdmFsdWUgZm9yIHNoZWxscyB3aXRob3V0IHVuc2V0OyBhbmQgdGhpcyBhbHNvCisjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorIyBQcmVzZXJ2ZSAtdiBhbmQgLXggdG8gdGhlIHJlcGxhY2VtZW50IHNoZWxsLgorQkFTSF9FTlY9L2Rldi9udWxsCitFTlY9L2Rldi9udWxsCisodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKK2Nhc2UgJC0gaW4gQCU6QCAoKCgoCisgICp2KngqIHwgKngqdiogKSBhc19vcHRzPS12eCA7OworICAqdiogKSBhc19vcHRzPS12IDs7CisgICp4KiApIGFzX29wdHM9LXggOzsKKyAgKiApIGFzX29wdHM9IDs7Citlc2FjCitleGVjICRDT05GSUdfU0hFTEwgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJEAifQorIyBBZG1pdHRlZGx5LCB0aGlzIGlzIHF1aXRlIHBhcmFub2lkLCBzaW5jZSBhbGwgdGhlIGtub3duIHNoZWxscyBiYWlsCisjIG91dCBhZnRlciBhIGZhaWxlZCBgZXhlYycuCiskYXNfZWNobyAiJDA6IGNvdWxkIG5vdCByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCIgPiYyCithc19mbl9leGl0IDI1NQorICBmaQorICAjIFdlIGRvbid0IHdhbnQgdGhpcyB0byBwcm9wYWdhdGUgdG8gb3RoZXIgc3VicHJvY2Vzc2VzLgorICAgICAgICAgIHsgX2FzX2Nhbl9yZWV4ZWM9OyB1bnNldCBfYXNfY2FuX3JlZXhlYzt9CitpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCisgIGFzX2JvdXJuZV9jb21wYXRpYmxlPSJpZiB0ZXN0IC1uIFwiXCR7WlNIX1ZFUlNJT04rc2V0fVwiICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gQCU6QCgKKyAgKnBvc2l4KikgOgorICAgIHNldCAtbyBwb3NpeCA7OyBAJTpAKAorICAqKSA6CisgICAgIDs7Citlc2FjCitmaQorIgorICBhc19yZXF1aXJlZD0iYXNfZm5fcmV0dXJuICgpIHsgKGV4aXQgXCQxKTsgfQorYXNfZm5fc3VjY2VzcyAoKSB7IGFzX2ZuX3JldHVybiAwOyB9Cithc19mbl9mYWlsdXJlICgpIHsgYXNfZm5fcmV0dXJuIDE7IH0KK2FzX2ZuX3JldF9zdWNjZXNzICgpIHsgcmV0dXJuIDA7IH0KK2FzX2ZuX3JldF9mYWlsdXJlICgpIHsgcmV0dXJuIDE7IH0KKworZXhpdGNvZGU9MAorYXNfZm5fc3VjY2VzcyB8fCB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KK2FzX2ZuX3JldF9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfc3VjY2VzcyBmYWlsZWQuOyB9Cithc19mbl9yZXRfZmFpbHVyZSAmJiB7IGV4aXRjb2RlPTE7IGVjaG8gYXNfZm5fcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQoraWYgKCBzZXQgeDsgYXNfZm5fcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4gOgorICAKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMQordGVzdCAteCAvIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorICAKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorYXNfZm91bmQ9ZmFsc2UKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgYXNfZm91bmQ9OgorICBjYXNlICRhc19kaXIgaW4gQCU6QCgKKwkgLyopCisJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSAgICAgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSAgICAgYXNfc2hlbGw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgaWYgeyB0ZXN0IC1mICIkYXNfc2hlbGwiIHx8IHRlc3QgLWYgIiRhc19zaGVsbC5leGUiOyB9ICYmCisJCSAgICB7ICRhc19lY2hvICIkYXNfYm91cm5lX2NvbXBhdGlibGUiIiRhc19yZXF1aXJlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkJICAgaWYgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfc3VnZ2VzdGVkIiB8IGFzX3J1bj1hICIkYXNfc2hlbGwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYnJlYWsgMgorZmkKK2ZpCisJICAgZG9uZTs7CisgICAgICAgZXNhYworICBhc19mb3VuZD1mYWxzZQorZG9uZQorJGFzX2ZvdW5kIHx8IHsgaWYgeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCisJICAgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRTSEVMTCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JFNIRUxMIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCitmaTsgfQorSUZTPSRhc19zYXZlX0lGUworCisKKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuIDoKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgICAgICAgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbworIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KKyMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KK0JBU0hfRU5WPS9kZXYvbnVsbAorRU5WPS9kZXYvbnVsbAorKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCitjYXNlICQtIGluIEAlOkAgKCgoKAorICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKKyAgKnYqICkgYXNfb3B0cz0tdiA7OworICAqeCogKSBhc19vcHRzPS14IDs7CisgICogKSBhc19vcHRzPSA7OworZXNhYworZXhlYyAkQ09ORklHX1NIRUxMICRhc19vcHRzICIkYXNfbXlzZWxmIiAkezErIiRAIn0KKyMgQWRtaXR0ZWRseSwgdGhpcyBpcyBxdWl0ZSBwYXJhbm9pZCwgc2luY2UgYWxsIHRoZSBrbm93biBzaGVsbHMgYmFpbAorIyBvdXQgYWZ0ZXIgYSBmYWlsZWQgYGV4ZWMnLgorJGFzX2VjaG8gIiQwOiBjb3VsZCBub3QgcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwiID4mMgorZXhpdCAyNTUKK2ZpCisKKyAgICBpZiB0ZXN0IHgkYXNfaGF2ZV9yZXF1aXJlZCA9IHhubzsgdGhlbiA6CisgICRhc19lY2hvICIkMDogVGhpcyBzY3JpcHQgcmVxdWlyZXMgYSBzaGVsbCBtb3JlIG1vZGVybiB0aGFuIGFsbCIKKyAgJGFzX2VjaG8gIiQwOiB0aGUgc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4iCisgIGlmIHRlc3QgeCR7WlNIX1ZFUlNJT04rc2V0fSA9IHhzZXQgOyB0aGVuCisgICAgJGFzX2VjaG8gIiQwOiBJbiBwYXJ0aWN1bGFyLCB6c2ggJFpTSF9WRVJTSU9OIGhhcyBidWdzIGFuZCBzaG91bGQiCisgICAgJGFzX2VjaG8gIiQwOiBiZSB1cGdyYWRlZCB0byB6c2ggNC4zLjQgb3IgbGF0ZXIuIgorICBlbHNlCisgICAgJGFzX2VjaG8gIiQwOiBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKKyQwOiBpbmNsdWRpbmcgYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcworJDA6IG1lc3NhZ2UuIFRoZW4gaW5zdGFsbCBhIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuCiskMDogdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEgc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLiIKKyAgZmkKKyAgZXhpdCAxCitmaQorZmkKK2ZpCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorZXhwb3J0IFNIRUxMCisjIFVuc2V0IG1vcmUgdmFyaWFibGVzIGtub3duIHRvIGludGVyZmVyZSB3aXRoIGJlaGF2aW9yIG9mIGNvbW1vbiB0b29scy4KK0NMSUNPTE9SX0ZPUkNFPSBHUkVQX09QVElPTlM9Cit1bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIFNoZWxsIEZ1bmN0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworQCU6QCBhc19mbl91bnNldCBWQVIKK0AlOkAgLS0tLS0tLS0tLS0tLS0tCitAJTpAIFBvcnRhYmx5IHVuc2V0IFZBUi4KK2FzX2ZuX3Vuc2V0ICgpCit7CisgIHsgZXZhbCAkMT07IHVuc2V0ICQxO30KK30KK2FzX3Vuc2V0PWFzX2ZuX3Vuc2V0CisKK0AlOkAgYXNfZm5fc2V0X3N0YXR1cyBTVEFUVVMKK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgU2V0IEBTfEA/IHRvIFNUQVRVUywgd2l0aG91dCBmb3JraW5nLgorYXNfZm5fc2V0X3N0YXR1cyAoKQoreworICByZXR1cm4gJDEKK30gQCU6QCBhc19mbl9zZXRfc3RhdHVzCisKK0AlOkAgYXNfZm5fZXhpdCBTVEFUVVMKK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgRXhpdCB0aGUgc2hlbGwgd2l0aCBTVEFUVVMsIGV2ZW4gaW4gYSAidHJhcCAwIiBvciAic2V0IC1lIiBjb250ZXh0LgorYXNfZm5fZXhpdCAoKQoreworICBzZXQgK2UKKyAgYXNfZm5fc2V0X3N0YXR1cyAkMQorICBleGl0ICQxCit9IEAlOkAgYXNfZm5fZXhpdAorCitAJTpAIGFzX2ZuX21rZGlyX3AKK0AlOkAgLS0tLS0tLS0tLS0tLQorQCU6QCBDcmVhdGUgIkBTfEBhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSBAJTpAIGFzX2ZuX21rZGlyX3AKKworQCU6QCBhc19mbl9leGVjdXRhYmxlX3AgRklMRQorQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQCU6QCBUZXN0IGlmIEZJTEUgaXMgYW4gZXhlY3V0YWJsZSByZWd1bGFyIGZpbGUuCithc19mbl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgdGVzdCAtZiAiJDEiICYmIHRlc3QgLXggIiQxIgorfSBAJTpAIGFzX2ZuX2V4ZWN1dGFibGVfcAorQCU6QCBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorQCU6QCBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCitAJTpAIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCitAJTpAIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworQCU6QCBhc19mbl9hcml0aCBBUkcuLi4KK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tCitAJTpAIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKK0AlOkAgZ2xvYmFsIEBTfEBhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworQCU6QCBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyBAU3xAKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK0AlOkAgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAJTpAIE91dHB1dCAiYGJhc2VuYW1lIEBTfEAwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorQCU6QCBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCitAJTpAIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gQCU6QCBhc19mbl9lcnJvcgorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTworICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgeworICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KKyAgICAgIE4KKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKyAgICAgIHQgbG9vcAorICAgICAgcy8tXG4uKi8vCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KKworICAjIElmIHdlIGhhZCB0byByZS1leGVjdXRlIHdpdGggJENPTkZJR19TSEVMTCwgd2UncmUgZW5zdXJlZCB0byBoYXZlCisgICMgYWxyZWFkeSBkb25lIHRoYXQsIHNvIGVuc3VyZSB3ZSBkb24ndCB0cnkgdG8gZG8gc28gYWdhaW4gYW5kIGZhbGwKKyAgIyBpbiBhbiBpbmZpbml0ZSBsb29wLiAgVGhpcyBoYXMgYWxyZWFkeSBoYXBwZW5lZCBpbiBwcmFjdGljZS4KKyAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiBAJTpAKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcFInLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wUicKKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPWxuCisgIGVsc2UKKyAgICBhc19sbl9zPSdjcCAtcFInCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wUicKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCit0ZXN0IC1uICIkREpESVIiIHx8IGV4ZWMgNzwmMCA8L2Rldi9udWxsCitleGVjIDY+JjEKKworIyBOYW1lIG9mIHRoZSBob3N0LgorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgb2xkIEdOVS9MaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAorIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCithY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKworIworIyBJbml0aWFsaXphdGlvbnMuCisjCithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCithY19jbGVhbl9maWxlcz0KK2FjX2NvbmZpZ19saWJvYmpfZGlyPS4KK0xJQkAmdEBPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0nSXBlcmYnCitQQUNLQUdFX1RBUk5BTUU9J2lwZXJmJworUEFDS0FHRV9WRVJTSU9OPScyLjAuNScKK1BBQ0tBR0VfU1RSSU5HPSdJcGVyZiAyLjAuNScKK1BBQ0tBR0VfQlVHUkVQT1JUPScnCitQQUNLQUdFX1VSTD0nJworCisjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCithY19pbmNsdWRlc19kZWZhdWx0PSJcCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYiCisKK2FjX3N1YnN0X3ZhcnM9J0xUTElCT0JKUworU1RSSVBfRU5ECitTVFJJUF9CRUdJTgorU1RSSVBfRFVNTVkKK1dFQjEwMF9MSUJTCitXRUIxMDBfQ0ZMQUdTCitXRUIxMDBfQ09ORklHCitMSUJAJnRAT0JKUworRUdSRVAKK0dSRVAKK0NQUAorUFRIUkVBRF9DRkxBR1MKK1BUSFJFQURfTElCUworUFRIUkVBRF9DQworYWN4X3B0aHJlYWRfY29uZmlnCitob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK1JBTkxJQgorYW1fX2Zhc3RkZXBDQ19GQUxTRQorYW1fX2Zhc3RkZXBDQ19UUlVFCitDQ0RFUE1PREUKK2FjX2N0X0NDCitDRkxBR1MKK0NDCithbV9fZmFzdGRlcENYWF9GQUxTRQorYW1fX2Zhc3RkZXBDWFhfVFJVRQorQ1hYREVQTU9ERQorQU1ERVBCQUNLU0xBU0gKK0FNREVQX0ZBTFNFCitBTURFUF9UUlVFCithbV9fcXVvdGUKK2FtX19pbmNsdWRlCitERVBESVIKK09CSkVYVAorRVhFRVhUCithY19jdF9DWFgKK0NQUEZMQUdTCitMREZMQUdTCitDWFhGTEFHUworQ1hYCithbV9fdW50YXIKK2FtX190YXIKK0FNVEFSCithbV9fbGVhZGluZ19kb3QKK1NFVF9NQUtFCitBV0sKK21rZGlyX3AKK0lOU1RBTExfU1RSSVBfUFJPR1JBTQorU1RSSVAKK2luc3RhbGxfc2gKK01BS0VJTkZPCitBVVRPSEVBREVSCitBVVRPTUFLRQorQVVUT0NPTkYKK0FDTE9DQUwKK1ZFUlNJT04KK1BBQ0tBR0UKK0NZR1BBVEhfVworSU5TVEFMTF9EQVRBCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9QUk9HUkFNCit0YXJnZXRfYWxpYXMKK2hvc3RfYWxpYXMKK2J1aWxkX2FsaWFzCitMSUJTCitFQ0hPX1QKK0VDSE9fTgorRUNIT19DCitERUZTCittYW5kaXIKK2xvY2FsZWRpcgorbGliZGlyCitwc2RpcgorcGRmZGlyCitkdmlkaXIKK2h0bWxkaXIKK2luZm9kaXIKK2RvY2Rpcgorb2xkaW5jbHVkZWRpcgoraW5jbHVkZWRpcgorbG9jYWxzdGF0ZWRpcgorc2hhcmVkc3RhdGVkaXIKK3N5c2NvbmZkaXIKK2RhdGFkaXIKK2RhdGFyb290ZGlyCitsaWJleGVjZGlyCitzYmluZGlyCitiaW5kaXIKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKK3ByZWZpeAorZXhlY19wcmVmaXgKK1BBQ0tBR0VfVVJMCitQQUNLQUdFX0JVR1JFUE9SVAorUEFDS0FHRV9TVFJJTkcKK1BBQ0tBR0VfVkVSU0lPTgorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX05BTUUKK1BBVEhfU0VQQVJBVE9SCitTSEVMTCcKK2FjX3N1YnN0X2ZpbGVzPScnCithY191c2VyX29wdHM9JworZW5hYmxlX29wdGlvbl9jaGVja2luZworZW5hYmxlX2lwdjYKK2VuYWJsZV9tdWx0aWNhc3QKK2VuYWJsZV90aHJlYWRzCitlbmFibGVfZGVidWdpbmZvCitlbmFibGVfd2ViMTAwCitlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZworJworICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworQ1hYCitDWFhGTEFHUworTERGTEFHUworTElCUworQ1BQRkxBR1MKK0NDQworQ0MKK0NGTEFHUworQ1BQJworCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KK2FjX2luaXRfaGVscD0KK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorYWNfdW5yZWNvZ25pemVkX29wdHM9CithY191bnJlY29nbml6ZWRfc2VwPQorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2NhY2hlX2ZpbGU9L2Rldi9udWxsCitleGVjX3ByZWZpeD1OT05FCitub19jcmVhdGU9Citub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCisKKyMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorIyBUaGVzZSBhcmUgbGVmdCB1bmV4cGFuZGVkIHNvIHVzZXJzIGNhbiAibWFrZSBpbnN0YWxsIGV4ZWNfcHJlZml4PS9mb28iCisjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorIyBVc2UgYnJhY2VzIGluc3RlYWQgb2YgcGFyZW5zIGJlY2F1c2Ugc2gsIHBlcmwsIGV0Yy4gYWxzbyBhY2NlcHQgdGhlbS4KKyMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJworZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCitpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworaHRtbGRpcj0nJHtkb2NkaXJ9JworZHZpZGlyPScke2RvY2Rpcn0nCitwZGZkaXI9JyR7ZG9jZGlyfScKK3BzZGlyPScke2RvY2Rpcn0nCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2xvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCisKK2FjX3ByZXY9CithY19kYXNoZGFzaD0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAqPT8qKSBhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqPSkgICBhY19vcHRhcmc9IDs7CisgICopICAgIGFjX29wdGFyZz15ZXMgOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCisgIC0tKQorICAgIGFjX2Rhc2hkYXNoPXllcyA7OworCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CisKKyAgLS1jb25maWctY2FjaGUgfCAtQykKKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAorICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKyAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CisgIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisgICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1kaXNhYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKyAgICBhY19wcmV2PWRvY2RpciA7OworICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworCisgIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCisgICAgYWNfcHJldj1kdmlkaXIgOzsKKyAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKKyAgICBkdmlkaXI9JGFjX29wdGFyZyA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKyAgICBhY19pbml0X2hlbHA9bG9uZyA7OworICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCisgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCisgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCisgICAgYWNfcHJldj1odG1sZGlyIDs7CisgIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAorICB8IC0taHQ9KikKKyAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CisgIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCisgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKKyAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKKworICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorICAgIGFjX3ByZXY9cGRmZGlyIDs7CisgIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCisgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQorICAgIGFjX3ByZXY9cHNkaXIgOzsKKyAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCisgICAgcHNkaXI9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGhvdXQtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJGFjX29wdGlvbicKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKKyAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7CisgICAgZXNhYworICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZworICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7CisKKyAgKikKKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAiJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCisgIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb24iCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCisgIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KKyAgICBubykgOzsKKyAgICBmYXRhbCkgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiIDs7CisgICAgKikgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMiA7OworICBlc2FjCitmaQorCisjIENoZWNrIGFsbCBkaXJlY3RvcnkgYXJndW1lbnRzIGZvciBjb25zaXN0ZW5jeS4KK2ZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAorCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKwkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAorCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgICovICkKKyAgICAgIGFjX3ZhbD1gZXhwciAiWCRhY192YWwiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRhY192YWwiIDogJ1hcKC4qXCknYAorICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKKyAgZXNhYworICAjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7CisgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworICBlc2FjCisgIGFzX2ZuX2Vycm9yICQ/ICJleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIgorZG9uZQorCisjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCisjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2J1aWxkPSRidWlsZF9hbGlhcworaG9zdD0kaG9zdF9hbGlhcwordGFyZ2V0PSR0YXJnZXRfYWxpYXMKKworIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgoraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiID0geDsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPXllcworICBmaQorZmkKKworYWNfdG9vbF9wcmVmaXg9Cit0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisKK3Rlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKKworCithY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKK2FjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorICBhc19mbl9lcnJvciAkPyAid29ya2luZyBkaXJlY3RvcnkgY2Fubm90IGJlIGRldGVybWluZWQiCit0ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKKyAgYXNfZm5fZXJyb3IgJD8gInB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIKKworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfbXlzZWxmIiB8fAorJGFzX2V4cHIgWCIkYXNfbXlzZWxmIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX215c2VsZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiCitmaQorYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgorYWNfYWJzX2NvbmZkaXI9YCgKKwljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IGFzX2ZuX2Vycm9yICQ/ICIkYWNfbXNnIgorCXB3ZClgCisjIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgoraWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgorICBzcmNkaXI9LgorZmkKKyMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCisjIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KKyMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgorY2FzZSAkc3JjZGlyIGluCisqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKK2VzYWMKK2ZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9Citkb25lCisKKyMKKyMgUmVwb3J0IHRoZSAtLWhlbHAgbWVzc2FnZS4KKyMKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCisgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgIGNhdCA8PF9BQ0VPRgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgSXBlcmYgMi4wLjUgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZyAuLi4nIG1lc3NhZ2VzCisgICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KKyAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKKyAgLW4sIC0tbm8tY3JlYXRlICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCisKK0luc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBAU3xAYWNfZGVmYXVsdF9wcmVmaXhAOj5ACisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBQUkVGSVhAOj5ACisKK0J5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgorXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCitmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgorCitGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKworRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKyAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW0RBVEFST09URElSXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCisgIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvbWFuXQorICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgQDw6QERBVEFST09URElSL2RvYy9pcGVyZkA6PkAKKyAgLS1odG1sZGlyPURJUiAgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcGRmZGlyPURJUiAgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcHNkaXI9RElSICAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKKworUHJvZ3JhbSBuYW1lczoKKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggICAgICAgICAgICBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCAgICAgICAgICAgIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0gICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKworU3lzdGVtIHR5cGVzOgorICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQorICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KK19BQ0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKyAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCisgICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBJcGVyZiAyLjAuNToiOzsKKyAgIGVzYWMKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1kaXNhYmxlLWlwdjYgICAgICAgICAgZGlzYWJsZSBpcHY2IHN1cHBvcnQgKGRlZmF1bHQgaXMgYXV0b2RldGVjdCkKKyAgLS1kaXNhYmxlLW11bHRpY2FzdCAgICAgZGlzYWJsZSBtdWx0aWNhc3Qgc3VwcG9ydCAoZGVmYXVsdCBpcyBhdXRvZGV0ZWN0KQorICAtLWRpc2FibGUtdGhyZWFkcyAgICAgICBkaXNhYmxlIHRocmVhZCBzdXBwb3J0IChkZWZhdWx0IGlzIGF1dG9kZXRlY3QpCisgIC0tZW5hYmxlLWRlYnVnaW5mbyAgICAgIGVuYWJsZSBkZWJ1Z2dpbmcgaW5mbyBmb3Igc29ja2V0cyAoZGVmYXVsdCBpcyBubykKKyAgLS1kaXNhYmxlLXdlYjEwMCAgICAgICAgZGlzYWJsZSB3ZWIxMDAgc3VwcG9ydCAoZGVmYXVsdCBpcyBhdXRvZGV0ZWN0KQorICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDWFggICAgICAgICBDKysgY29tcGlsZXIgY29tbWFuZAorICBDWFhGTEFHUyAgICBDKysgY29tcGlsZXIgZmxhZ3MKKyAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCisgICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KKyAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgorICBDUFBGTEFHUyAgICAoT2JqZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCisgICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitSZXBvcnQgYnVncyB0byB0aGUgcGFja2FnZSBwcm92aWRlci4KK19BQ0VPRgorYWNfc3RhdHVzPSQ/CitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwKKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorICAgICAgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbHNlCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpIHx8IGFjX3N0YXR1cz0kPworICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKK0lwZXJmIGNvbmZpZ3VyZSAyLjAuNQorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5CisKK0NvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdAorZmkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCitAJTpAIGFjX2ZuX2N4eF90cnlfY29tcGlsZSBMSU5FTk8KK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQCU6QCBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC5AU3xAYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jeHhfdHJ5X2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9IEAlOkAgYWNfZm5fY3h4X3RyeV9jb21waWxlCisKK0AlOkAgYWNfZm5fY190cnlfY29tcGlsZSBMSU5FTk8KK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgVHJ5IHRvIGNvbXBpbGUgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9IEAlOkAgYWNfZm5fY190cnlfY29tcGlsZQorCitAJTpAIGFjX2ZuX2NfdHJ5X2xpbmsgTElORU5PCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAJTpAIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2xpbmsgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisJIHRlc3QgLXggY29uZnRlc3QkYWNfZXhlZXh0CisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgICMgRGVsZXRlIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikgaW5mb3JtYXRpb24KKyAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAorICAjIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZDsgYWxzbyBkZWxldGUgYSBkaXJlY3RvcnkgdGhhdCBpcworICAjIGxlZnQgYmVoaW5kIGJ5IEFwcGxlJ3MgY29tcGlsZXIuICBXZSBkbyB0aGlzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGFjdGlvbnMuCisgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9IEAlOkAgYWNfZm5fY190cnlfbGluaworCitAJTpAIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQCU6QCBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkMiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQyLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICQyIGlubm9jdW91c18kMgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkMiAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkMgorCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICQyICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJDIgfHwgZGVmaW5lZCBfX3N0dWJfX18kMgorY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkMiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9IEAlOkAgYWNfZm5fY19jaGVja19mdW5jCisKK0AlOkAgYWNfZm5fY190cnlfY3BwIExJTkVOTworQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAJTpAIFRyeSB0byBwcmVwcm9jZXNzIGNvbmZ0ZXN0LkBTfEBhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NwcCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gPiBjb25mdGVzdC5pICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgIGFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gQCU6QCBhY19mbl9jX3RyeV9jcHAKKworQCU6QCBhY19mbl9jX3RyeV9ydW4gTElORU5PCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgVHJ5IHRvIGxpbmsgY29uZnRlc3QuQFN8QGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLiBBc3N1bWVzCitAJTpAIHRoYXQgZXhlY3V0YWJsZXMgKmNhbiogYmUgcnVuLgorYWNfZm5fY190cnlfcnVuICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IHsgY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyAgICAgICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAgICAgIGFjX3JldHZhbD0kYWNfc3RhdHVzCitmaQorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSBAJTpAIGFjX2ZuX2NfdHJ5X3J1bgorCitAJTpAIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQCU6QCBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMsIGdpdmluZyBhIHdhcm5pbmcgaWYgaXQgY2Fubm90IGJlIGNvbXBpbGVkIHVzaW5nCitAJTpAIHRoZSBpbmNsdWRlIGZpbGVzIGluIElOQ0xVREVTIGFuZCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIKK0AlOkAgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorQCU6QGluY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiskYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiBwcmVzZW5jZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkMiBwcmVzZW5jZS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworQCU6QGluY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CiskYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAorICB5ZXM6bm86ICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7Citlc2FjCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCBcJHskMys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGV2YWwgIiQzPVwkYWNfaGVhZGVyX2NvbXBpbGVyIgorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gQCU6QCBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsCisKK0AlOkAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAJTpAIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cyBhbmQgY2FuIGJlIGNvbXBpbGVkIHVzaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluCitAJTpAIElOQ0xVREVTLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK0AlOkBpbmNsdWRlIDwkMj4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBldmFsICIkMz15ZXMiCitlbHNlCisgIGV2YWwgIiQzPW5vIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSBAJTpAIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUKKworQCU6QCBhY19mbl9jX2NoZWNrX3R5cGUgTElORU5PIFRZUEUgVkFSIElOQ0xVREVTCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUKK0AlOkAgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja190eXBlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK2lmIChzaXplb2YgKCQyKSkKKwkgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworaWYgKHNpemVvZiAoKCQyKSkpCisJICAgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIAorZWxzZQorICBldmFsICIkMz15ZXMiCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9IEAlOkAgYWNfZm5fY19jaGVja190eXBlCisKK0AlOkAgYWNfZm5fY19jb21wdXRlX2ludCBMSU5FTk8gRVhQUiBWQVIgSU5DTFVERVMKK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgVHJpZXMgdG8gZmluZCB0aGUgY29tcGlsZS10aW1lIHZhbHVlIG9mIEVYUFIgaW4gYSBwcm9ncmFtIHRoYXQgaW5jbHVkZXMKK0AlOkAgSU5DTFVERVMsIHNldHRpbmcgVkFSIGFjY29yZGluZ2x5LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIGNvdWxkIGJlCitAJTpAIGNvbXB1dGVkCithY19mbl9jX2NvbXB1dGVfaW50ICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IEA8OkAxIC0gMiAqICEoKCQyKSA+PSAwKUA6PkA7Cit0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBAPDpAMEA6PkA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IEA8OkAxIC0gMiAqICEoKCQyKSA8PSAkYWNfbWlkKUA6PkA7Cit0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBAPDpAMEA6PkA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAkYWNfbWlkICsgMSAmJiBhY19sbz0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCArIDEgJiYgYWNfbWlkPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgoJDIpIDwgMClAOj5AOwordGVzdF9hcnJheSBAPDpAMEA6PkAgPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgQDw6QDBAOj5AOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IEA8OkAxIC0gMiAqICEoKCQyKSA+PSAkYWNfbWlkKUA6PkA7Cit0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBAPDpAMEA6PkA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19sbz0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgLSAxICYmIGFjX2hpPSRhc192YWwKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhc19mbl9hcml0aCAyICcqJyAkYWNfbWlkICYmIGFjX21pZD0kYXNfdmFsCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgYWNfbG89IGFjX2hpPQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYXNfZm5fYXJpdGggJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvICYmIGFjX21pZD0kYXNfdmFsCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBAPDpAMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZClAOj5AOwordGVzdF9hcnJheSBAPDpAMEA6PkAgPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgQDw6QDBAOj5AOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgKyAxICYmIGFjX2xvPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluIEAlOkAoKAorPyopIGV2YWwgIiQzPVwkYWNfbG8iOyBhY19yZXR2YWw9MCA7OworJycpIGFjX3JldHZhbD0xIDs7Citlc2FjCisgIGVsc2UKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQorQCU6QGluY2x1ZGUgPHN0ZGlvLmg+CitAJTpAaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKCQyKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoJDIpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgkMikpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CisgICAgfQorICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KKyAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGVjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDMgPGNvbmZ0ZXN0LnZhbDsgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgYWNfcmV0dmFsPTEKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb25mdGVzdC52YWwKKworICBmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gQCU6QCBhY19mbl9jX2NvbXB1dGVfaW50CisKK0AlOkAgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQCU6QCBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKK0AlOkAgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAorICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitAJTpAaWZuZGVmICRhc19kZWNsX25hbWUKK0AlOkBpZmRlZiBfX2NwbHVzcGx1cworICAodm9pZCkgJGFzX2RlY2xfdXNlOworQCU6QGVsc2UKKyAgKHZvaWQpICRhc19kZWNsX25hbWU7CitAJTpAZW5kaWYKK0AlOkBlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gQCU6QCBhY19mbl9jX2NoZWNrX2RlY2wKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IElwZXJmICRhc19tZSAyLjAuNSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCit7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Cit7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgorIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisgICAgICBlc2FjCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICMjCisjIyAtLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGNhdCBjb25mZGVmcy5oCisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCithY19zaXRlX2ZpbGUxPU5PTkUKK2FjX3NpdGVfZmlsZTI9Tk9ORQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICAjIFdlIGRvIG5vdCB3YW50IGEgUEFUSCBzZWFyY2ggZm9yIGNvbmZpZy5zaXRlLgorICBjYXNlICRDT05GSUdfU0lURSBpbiBAJTpAKCgKKyAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OworICAgICovKikgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEU7OworICAgICopICAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgIGVzYWMKK2VsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgIGFjX3NpdGVfZmlsZTE9JHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitlbHNlCisgIGFjX3NpdGVfZmlsZTE9JGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gIiRhY19zaXRlX2ZpbGUxIiAiJGFjX3NpdGVfZmlsZTIiCitkbworICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIgXAorICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsIGZpbGVzCisgICMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LiAgREpHUFAgZW11bGF0ZXMgaXQgYXMgYSByZWd1bGFyIGZpbGUuCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisgIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCisJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCisJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKwllbHNlCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAorCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CitmaQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKKworYW1fX2FwaV92ZXJzaW9uPSIxLjkiCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KKyAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCisjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4gQCU6QCgoCisgIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bworCSAgICBta2RpciBjb25mdGVzdC5kaXIKKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworCSAgICB0aGVuCisJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICAgIGJyZWFrIDMKKwkgICAgZmkKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKKworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK3JtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAiID4mNjsgfQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgYXNfZm5fZXJyb3IgJD8gImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1CisgICBmaQorCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgYXNfZm5fZXJyb3IgJD8gIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgRG91YmxlIGFueSBcIG9yICQuCisjIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgorYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJworcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisKKyMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKK2FtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKKwordGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9CitmaQorCitpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICMgV2UgdXNlZCB0byBrZWVwaW5nIHRoZSBgLicgYXMgZmlyc3QgYXJndW1lbnQsIGluIG9yZGVyIHRvCisgICMgYWxsb3cgJChta2Rpcl9wKSB0byBiZSB1c2VkIHdpdGhvdXQgYXJndW1lbnQuICBBcyBpbgorICAjICAgJChta2Rpcl9wKSAkKHNvbWVkaXIpCisgICMgd2hlcmUgJChzb21lZGlyKSBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQuICBIb3dldmVyIHRoaXMgaXMgd3JvbmcKKyAgIyBmb3IgdHdvIHJlYXNvbnM6CisgICMgIDEuIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSBhIHVzZXIgd2hvIGNhbm5vdCB3cml0ZSBgLicKKyAgIyAgICAgbWFrZSBpbnN0YWxsIHdpbGwgZmFpbCwKKyAgIyAgMi4gdGhlIGFib3ZlIGNvbW1lbnQgc2hvdWxkIG1vc3QgY2VydGFpbmx5IHJlYWQKKyAgIyAgICAgJChta2Rpcl9wKSAkKERFU1RESVIpJChzb21lZGlyKQorICAjICAgICBzbyBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gJChzb21lZGlyKSBpcyB1bmRlZmluZWQgYW5kCisgICMgICAgICQoREVTVERJUikgaXMgbm90LgorICAjICBUbyBzdXBwb3J0IHRoZSBsYXR0ZXIgY2FzZSwgd2UgaGF2ZSB0byB3cml0ZQorICAjICAgICB0ZXN0IC16ICIkKHNvbWVkaXIpIiB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpLAorICAjICBzbyB0aGUgYC4nIHRyaWNrIGlzIHBvaW50bGVzcy4KKyAgbWtkaXJfcD0nbWtkaXIgLXAgLS0nCitlbHNlCisgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisgICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcworICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQorICAjIGV4aXN0cy4KKyAgZm9yIGQgaW4gLi8tcCAuLy0tdmVyc2lvbjsKKyAgZG8KKyAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCisgIGRvbmUKKyAgIyAkKG1raW5zdGFsbGRpcnMpIGlzIGRlZmluZWQgYnkgQXV0b21ha2UgaWYgbWtpbnN0YWxsZGlycyBleGlzdHMuCisgIGlmIHRlc3QgLWYgIiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiOyB0aGVuCisgICAgbWtkaXJfcD0nJChta2luc3RhbGxkaXJzKScKKyAgZWxzZQorICAgIG1rZGlyX3A9JyQoaW5zdGFsbF9zaCkgLWQnCisgIGZpCitmaQorCitmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19BV0srOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVdLPSRhY19jdl9wcm9nX0FXSworaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQorJGFzX2VjaG8gIiRBV0siID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhaworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorCisjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKKyAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCisKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorIFBBQ0tBR0U9J2lwZXJmJworIFZFUlNJT049JzIuMC41JworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitfQUNFT0YKKworIAorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKK19BQ0VPRgorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCisKK0FDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KKworCitBVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KKworCitBVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9CisKKworTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9CisKK2luc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSIkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIn0KKworIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCisjIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCisjIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19TVFJJUD0iJHthY190b29sX3ByZWZpeH1zdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitTVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNUUklQIiA+JjUKKyRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgorICBhY19jdF9TVFJJUD0kU1RSSVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2FjX2N0X1NUUklQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9TVFJJUCIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1NUUklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfU1RSSVAiID0geDsgdGhlbgorICAgIFNUUklQPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFNUUklQPSRhY19jdF9TVFJJUAorICBmaQorZWxzZQorICBTVFJJUD0iJGFjX2N2X3Byb2dfU1RSSVAiCitmaQorCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJHtTSEVMTH0gXCQoaW5zdGFsbF9zaCkgLWMgLXMiCisKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorIyBBbHdheXMgZGVmaW5lIEFNVEFSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitBTVRBUj0ke0FNVEFSLSIke2FtX21pc3NpbmdfcnVufXRhciJ9CisKK2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJzsgYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK0AlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1pcHY2IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2lwdjYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9pcHY2OyBhY19jdl9oYXZlX2lwdjY9JGVuYWJsZV9pcHY2CitmaQorCisKK0AlOkAgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tdWx0aWNhc3Qgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbXVsdGljYXN0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfbXVsdGljYXN0OyBhY19jdl9tdWx0aWNhc3Q9JGVuYWJsZV9tdWx0aWNhc3QKK2ZpCisKKworQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRocmVhZHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdGhyZWFkcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3RocmVhZHM7IAorZmkKKworCitAJTpAIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWdpbmZvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnaW5mbytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlYnVnaW5mbzsgZW5hYmxlX2RlYnVnaW5mbz0kZW5hYmxldmFsCitlbHNlCisgIGVuYWJsZV9kZWJ1Z2luZm89bm8KK2ZpCisKKworQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXdlYjEwMCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV93ZWIxMDArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV93ZWIxMDA7IAorZmkKKworCisKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRDQ0MiOyB0aGVuCisgICAgQ1hYPSRDQ0MKKyAgZWxzZQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NYWD0kYWNfY3ZfcHJvZ19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYIiA+JjUKKyRhc19lY2hvICIkQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKyAgYWNfY3RfQ1hYPSRDWFgKKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX2N0X0NYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAoraWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DWFgiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DWFgiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ1hYIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ1hYIiA9IHg7IHRoZW4KKyAgICBDWFg9ImcrKyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDWFg9JGFjX2N0X0NYWAorICBmaQorZmkKKworICBmaQorZmkKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQysrIGNvbXBpbGVyIHdvcmtzLi4uICIgPiY2OyB9CithY19saW5rX2RlZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAorCisjIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CithY19maWxlcz0iYS5vdXQgY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgorCithY19ybWZpbGVzPQorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCitkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OworICBlc2FjCitkb25lCitybSAtZiAkYWNfcm1maWxlcworCitpZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGlua19kZWZhdWx0IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KKyMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCisjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAorIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KKyMgQXV0b2NvbmYuCitmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKK2RvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQorCTs7CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICouKiApCisJaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87CisJdGhlbiA6OyBlbHNlCisJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJZmkKKwkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKwkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKwkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KKwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKKwkjIGFjdHVhbGx5IHdvcmtpbmcuCisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQordGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9CisKK2Vsc2UKKyAgYWNfZmlsZT0nJworZmkKK2lmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgIkMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQorYWNfZXhlZXh0PSRhY19jdl9leGVleHQKKworcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQoraWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitmaQorcm0gLWYgY29uZnRlc3QgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworQCU6QGluY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKK0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7CisgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgY29uZnRlc3Qub3V0IgorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgIGlmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMrKyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgICBmaQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHWFg9eWVzCitlbHNlCisgIEdYWD0KK2ZpCithY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorYWNfc2F2ZV9DWFhGTEFHUz0kQ1hYRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jeHhfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnPSRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKyAgIENYWEZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIENYWEZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAKK2Vsc2UKKyAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworCSBDWFhGTEFHUz0iLWciCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2N4eF9nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jeHhfZyIgPiY2OyB9CitpZiB0ZXN0ICIkYWNfdGVzdF9DWFhGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ1hYRkxBR1M9JGFjX3NhdmVfQ1hYRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPQorICBmaQorZmkKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK0RFUERJUj0iJHthbV9fbGVhZGluZ19kb3R9ZGVwcyIKKworYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlcGZpbGVzIgorCisKK2FtX21ha2U9JHtNQUtFLW1ha2V9CitjYXQgPiBjb25maW5jIDw8ICdFTkQnCithbV9fZG9pdDoKKwlAZWNobyBkb25lCisuUEhPTlk6IGFtX19kb2l0CitFTkQKKyMgSWYgd2UgZG9uJ3QgZmluZCBhbiBpbmNsdWRlIGRpcmVjdGl2ZSwganVzdCBjb21tZW50IG91dCB0aGUgY29kZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlLi4uICIgPiY2OyB9CithbV9faW5jbHVkZT0iIyIKK2FtX19xdW90ZT0KK19hbV9yZXN1bHQ9bm9uZQorIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2VjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKKyMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKKyMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KKyMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKKyMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCisjIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KK2lmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgorICAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICAgYW1fX3F1b3RlPQorICAgX2FtX3Jlc3VsdD1HTlUKK2ZpCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KKyAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgICBhbV9fcXVvdGU9IlwiIgorICAgICAgX2FtX3Jlc3VsdD1CU0QKKyAgIGZpCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkX2FtX3Jlc3VsdCIgPiY1CiskYXNfZWNobyAiJF9hbV9yZXN1bHQiID4mNjsgfQorcm0gLWYgY29uZmluYyBjb25mbWYKKworQCU6QCBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmc7IAorZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworZmkKKyAKKworaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIEFNREVQX1RSVUU9CisgIEFNREVQX0ZBTFNFPScjJworZWxzZQorICBBTURFUF9UUlVFPScjJworICBBTURFUF9GQUxTRT0KK2ZpCisKKworCisKK2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgorICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjUKKyRhc19lY2hvICIkYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NYWERFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlCisKKyAKKworaWYgCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgorICBhbV9fZmFzdGRlcENYWF9UUlVFPQorICBhbV9fZmFzdGRlcENYWF9GQUxTRT0nIycKK2Vsc2UKKyAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0nIycKKyAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9CitmaQorCisKK0NYWEZMQUdTPWBlY2hvICIgJENYWEZMQUdTICIgfCBzZWQgLWUgInMvIC1nIC8gLyJgICMgZG8gbm90IHdhbnQgaXQgaW1wbGljaXRseQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJEAlOkAgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZmkKKworZmkKKworCit0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQoraWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZworICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY2NfZz1ubworICAgQ0ZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIENGTEFHUz0iIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIAorZWxzZQorICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX2NjX2M4OSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitzdHJ1Y3Qgc3RhdDsKKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6CisgIAorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitkZXBjYz0iJENDIiAgIGFtX2NvbXBpbGVyX2xpc3Q9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MuLi4gIiA+JjY7IH0KK2lmICR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkQU1ERVBfVFJVRSIgJiYgdGVzdCAtZiAiJGFtX2RlcGNvbXAiOyB0aGVuCisgICMgV2UgbWFrZSBhIHN1YmRpciBhbmQgZG8gdGhlIHRlc3RzIHRoZXJlLiAgT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKKyAgIyBtYWtpbmcgYm9ndXMgZmlsZXMgdGhhdCB3ZSBkb24ndCBrbm93IGFib3V0IGFuZCBuZXZlciByZW1vdmUuICBGb3IKKyAgIyBpbnN0YW5jZSBpdCB3YXMgcmVwb3J0ZWQgdGhhdCBvbiBIUC1VWCB0aGUgZ2NjIHRlc3Qgd2lsbCBlbmQgdXAKKyAgIyBtYWtpbmcgYSBkdW1teSBmaWxlIG5hbWVkIGBEJyAtLSBiZWNhdXNlIGAtTUQnIG1lYW5zIGBwdXQgdGhlIG91dHB1dAorICAjIGluIEQnLgorICBta2RpciBjb25mdGVzdC5kaXIKKyAgIyBDb3B5IGRlcGNvbXAgdG8gc3ViZGlyIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGZpbmQgaXQgaWYgd2UncmUKKyAgIyB1c2luZyBhIHJlbGF0aXZlIGRpcmVjdG9yeS4KKyAgY3AgIiRhbV9kZXBjb21wIiBjb25mdGVzdC5kaXIKKyAgY2QgY29uZnRlc3QuZGlyCisgICMgV2Ugd2lsbCBidWlsZCBvYmplY3RzIGFuZCBkZXBlbmRlbmNpZXMgaW4gYSBzdWJkaXJlY3RvcnkgYmVjYXVzZQorICAjIGl0IGhlbHBzIHRvIGRldGVjdCBpbmFwcGxpY2FibGUgZGVwZW5kZW5jeSBtb2Rlcy4gIEZvciBpbnN0YW5jZQorICAjIGJvdGggVHJ1NjQncyBjYyBhbmQgSUNDIHN1cHBvcnQgLU1EIHRvIG91dHB1dCBkZXBlbmRlbmNpZXMgYXMgYQorICAjIHNpZGUgZWZmZWN0IG9mIGNvbXBpbGF0aW9uLCBidXQgSUNDIHdpbGwgcHV0IHRoZSBkZXBlbmRlbmNpZXMgaW4KKyAgIyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hpbGUgVHJ1NjQgd2lsbCBwdXQgdGhlbSBpbiB0aGUgb2JqZWN0CisgICMgZGlyZWN0b3J5LgorICBta2RpciBzdWIKKworICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCisgIGZpCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9JGRlcG1vZGUKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorCisgIGNkIC4uCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKK2Vsc2UKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY2OyB9CitDQ0RFUE1PREU9ZGVwbW9kZT0kYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKKworIAorCitpZiAKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKK0NGTEFHUz1gZWNobyAiICRDRkxBR1MgIiB8IHNlZCAtZSAicy8gLWcgLyAvImAgIyBkbyBub3Qgd2FudCBpdCBpbXBsaWNpdGx5CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzdHJlcnJvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHN0cmVycm9yLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9zdHJlcnJvcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHN0cmVycm9yICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc3RyZXJyb3IgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgY3Bvc2l4OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3N0cmVycm9yPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfc3RyZXJyb3IrOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX3N0cmVycm9yKzp9IGZhbHNlOyB0aGVuIDoKKyAgCitlbHNlCisgIGFjX2N2X3NlYXJjaF9zdHJlcnJvcj1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3N0cmVycm9yIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2VhcmNoX3N0cmVycm9yIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3N0cmVycm9yCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisgIAorZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSQU5MSUIiID4mNQorJGFzX2VjaG8gIiRSQU5MSUIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKyAgYWNfY3RfUkFOTElCPSRSQU5MSUIKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IiRhY19jdF9SQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCitpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X1JBTkxJQiIgPSB4OyB0aGVuCisgICAgUkFOTElCPSI6IgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisgIGZpCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2J1aWxkKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQorYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9CitjYXNlICRhY19jdl9idWlsZCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1OzsKK2VzYWMKK2J1aWxkPSRhY19jdl9idWlsZAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2J1aWxkCitzaGlmdAorYnVpbGRfY3B1PSQxCitidWlsZF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CitidWlsZF9vcz0kKgorSUZTPSRhY19zYXZlX0lGUworY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9ob3N0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKK2Vsc2UKKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorY2FzZSAkYWNfY3ZfaG9zdCBpbgorKi0qLSopIDs7CisqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgIiRMSU5FTk8iIDU7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKKworCisgCitpZiB0ZXN0ICIkZW5hYmxlX3RocmVhZHMiICE9IG5vOyB0aGVuCisgIAorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworYWN4X3B0aHJlYWRfb2s9bm8KKworIyBXZSB1c2VkIHRvIGNoZWNrIGZvciBwdGhyZWFkLmggZmlyc3QsIGJ1dCB0aGlzIGZhaWxzIGlmIHB0aHJlYWQuaAorIyByZXF1aXJlcyBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzIChlLmcuIG9uIFRydWU2NCBvciBTZXF1ZW50KS4KKyMgSXQgZ2V0cyBjaGVja2VkIGZvciBpbiB0aGUgbGluayB0ZXN0IGFueXdheS4KKworIyBGaXJzdCBvZiBhbGwsIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzZXQgYW55IG9mIHRoZSBQVEhSRUFEX0xJQlMsCisjIGV0Y2V0ZXJhIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5kIGlmIHRocmVhZHMgbGlua2luZyB3b3JrcyB1c2luZworIyB0aGVtOgoraWYgdGVzdCB4IiRQVEhSRUFEX0xJQlMkUFRIUkVBRF9DRkxBR1MiICE9IHg7IHRoZW4KKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2pvaW4gaW4gTElCUz0kUFRIUkVBRF9MSUJTIHdpdGggQ0ZMQUdTPSRQVEhSRUFEX0NGTEFHUy4uLiAiID4mNjsgfQorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcHRocmVhZF9qb2luICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcHRocmVhZF9qb2luICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjeF9wdGhyZWFkX29rPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWN4X3B0aHJlYWRfb2siID4mNQorJGFzX2VjaG8gIiRhY3hfcHRocmVhZF9vayIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSIiCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKKyAgICAgICAgZmkKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCitmaQorCisjIFdlIG11c3QgY2hlY2sgZm9yIHRoZSB0aHJlYWRzIGxpYnJhcnkgdW5kZXIgYSBudW1iZXIgb2YgZGlmZmVyZW50CisjIG5hbWVzOyB0aGUgb3JkZXJpbmcgaXMgdmVyeSBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHN5c3RlbXMKKyMgKGUuZy4gREVDKSBoYXZlIGJvdGggLWxwdGhyZWFkIGFuZCAtbHB0aHJlYWRzLCB3aGVyZSBvbmUgb2YgdGhlCisjIGxpYnJhcmllcyBpcyBicm9rZW4gKG5vbi1QT1NJWCkuCisKKyMgQ3JlYXRlIGEgbGlzdCBvZiB0aHJlYWQgZmxhZ3MgdG8gdHJ5LiAgSXRlbXMgc3RhcnRpbmcgd2l0aCBhICItIiBhcmUKKyMgQyBjb21waWxlciBmbGFncywgYW5kIG90aGVyIGl0ZW1zIGFyZSBsaWJyYXJ5IG5hbWVzLCBleGNlcHQgZm9yICJub25lIgorIyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSB0cnkgd2l0aG91dCBhbnkgZmxhZ3MgYXQgYWxsLCBhbmQgInB0aHJlYWQtY29uZmlnIgorIyB3aGljaCBpcyBhIHByb2dyYW0gcmV0dXJuaW5nIHRoZSBmbGFncyBmb3IgdGhlIFB0aCBlbXVsYXRpb24gbGlicmFyeS4KKworYWN4X3B0aHJlYWRfZmxhZ3M9InB0aHJlYWRzIG5vbmUgLUt0aHJlYWQgLWt0aHJlYWQgbHRocmVhZCAtcHRocmVhZCAtcHRocmVhZHMgLW10aHJlYWRzIHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQgcHRocmVhZC1jb25maWciCisKKyMgVGhlIG9yZGVyaW5nICppcyogKHNvbWV0aW1lcykgaW1wb3J0YW50LiAgU29tZSBub3RlcyBvbiB0aGUKKyMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisKKyMgcHRocmVhZHM6IEFJWCAobXVzdCBjaGVjayB0aGlzIGJlZm9yZSAtbHB0aHJlYWQpCisjIG5vbmU6IGluIGNhc2UgdGhyZWFkcyBhcmUgaW4gbGliYzsgc2hvdWxkIGJlIHRyaWVkIGJlZm9yZSAtS3RocmVhZCBhbmQKKyMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyMgLUt0aHJlYWQ6IFNlcXVlbnQgKHRocmVhZHMgaW4gbGliYywgYnV0IC1LdGhyZWFkIG5lZWRlZCBmb3IgcHRocmVhZC5oKQorIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorIyBsdGhyZWFkOiBMaW51eFRocmVhZHMgcG9ydCBvbiBGcmVlQlNEIChhbHNvIHByZWZlcnJlZCB0byAtcHRocmVhZCkKKyMgLXB0aHJlYWQ6IExpbnV4L2djYyAoa2VybmVsIHRocmVhZHMpLCBCU0QvZ2NjICh1c2VybGFuZCB0aHJlYWRzKQorIyAtcHRocmVhZHM6IFNvbGFyaXMvZ2NjCisjIC1tdGhyZWFkczogTWluZ3czMi9nY2MsIEx5bngvZ2NjCisjIC1tdDogU3VuIFdvcmtzaG9wIEMgKG1heSBvbmx5IGxpbmsgU3VuT1MgdGhyZWFkcyBbLWx0aHJlYWRdLCBidXQgaXQKKyMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyMgcHRocmVhZDogTGludXgsIGV0Y2V0ZXJhCisjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyMgcHRocmVhZC1jb25maWc6IHVzZSBwdGhyZWFkLWNvbmZpZyBwcm9ncmFtIChmb3IgR05VIFB0aCBsaWJyYXJ5KQorCitjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAqc29sYXJpcyopCisKKyAgICAgICAgIyBPbiBTb2xhcmlzIChhdCBsZWFzdCwgZm9yIHNvbWUgdmVyc2lvbnMpLCBsaWJjIGNvbnRhaW5zIHN0dWJiZWQKKyAgICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZCBvcgorICAgICAgICAjIC1scHRocmVhZC4pICAoVGhlIHN0dWJzIGFyZSBtaXNzaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLCBvciByYXRoZXIKKyAgICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAgICMgd2UnbGwganVzdCBsb29rIGZvciAtcHRocmVhZHMgYW5kIC1scHRocmVhZCBmaXJzdDoKKworICAgICAgICBhY3hfcHRocmVhZF9mbGFncz0iLXB0aHJlYWQgLXB0aHJlYWRzIHB0aHJlYWQgLW10ICRhY3hfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKK2VzYWMKKworaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KK2ZvciBmbGFnIGluICRhY3hfcHRocmVhZF9mbGFnczsgZG8KKworICAgICAgICBjYXNlICRmbGFnIGluCisgICAgICAgICAgICAgICAgbm9uZSkKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFncyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3MuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgLSopCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworCisJCXB0aHJlYWQtY29uZmlnKQorCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInB0aHJlYWQtY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBwdGhyZWFkLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjeF9wdGhyZWFkX2NvbmZpZyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWc9IiRhY3hfcHRocmVhZF9jb25maWciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWc9InllcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWciICYmIGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnPSJubyIKK2ZpCitmaQorYWN4X3B0aHJlYWRfY29uZmlnPSRhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZworaWYgdGVzdCAtbiAiJGFjeF9wdGhyZWFkX2NvbmZpZyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY3hfcHRocmVhZF9jb25maWciID4mNQorJGFzX2VjaG8gIiRhY3hfcHRocmVhZF9jb25maWciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworCQlpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX2NvbmZpZyIgPSB4bm87IHRoZW4gY29udGludWU7IGZpCisJCVBUSFJFQURfQ0ZMQUdTPSJgcHRocmVhZC1jb25maWcgLS1jZmxhZ3NgIgorCQlQVEhSRUFEX0xJQlM9ImBwdGhyZWFkLWNvbmZpZyAtLWxkZmxhZ3NgIGBwdGhyZWFkLWNvbmZpZyAtLWxpYnNgIgorCQk7OworCisgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB0aGUgcHRocmVhZHMgbGlicmFyeSAtbCRmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB0aGUgcHRocmVhZHMgbGlicmFyeSAtbCRmbGFnLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSItbCRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIENoZWNrIGZvciB2YXJpb3VzIGZ1bmN0aW9ucy4gIFdlIG11c3QgaW5jbHVkZSBwdGhyZWFkLmgsCisgICAgICAgICMgc2luY2Ugc29tZSBmdW5jdGlvbnMgbWF5IGJlIG1hY3Jvcy4gIChPbiB0aGUgU2VxdWVudCwgd2UKKyAgICAgICAgIyBuZWVkIGEgc3BlY2lhbCBmbGFnIC1LdGhyZWFkIHRvIG1ha2UgdGhpcyBoZWFkZXIgY29tcGlsZS4pCisgICAgICAgICMgV2UgY2hlY2sgZm9yIHB0aHJlYWRfam9pbiBiZWNhdXNlIGl0IGlzIGluIC1scHRocmVhZCBvbiBJUklYCisgICAgICAgICMgd2hpbGUgcHRocmVhZF9jcmVhdGUgaXMgaW4gbGliYy4gIFdlIGNoZWNrIGZvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgICAgICAjIGR1ZSB0byBERUMgY3JhemluZXNzIHdpdGggLWxwdGhyZWFkcy4gIFdlIGNoZWNrIGZvcgorICAgICAgICAjIHB0aHJlYWRfY2xlYW51cF9wdXNoIGJlY2F1c2UgaXQgaXMgb25lIG9mIHRoZSBmZXcgcHRocmVhZAorICAgICAgICAjIGZ1bmN0aW9ucyBvbiBTb2xhcmlzIHRoYXQgZG9lc24ndCBoYXZlIGEgbm9uLWZ1bmN0aW9uYWwgbGliYyBzdHViLgorICAgICAgICAjIFdlIHRyeSBwdGhyZWFkX2NyZWF0ZSBvbiBnZW5lcmFsIHByaW5jaXBsZXMuCisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KDApOyBwdGhyZWFkX2NsZWFudXBfcHVzaCgwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApOyAKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY3hfcHRocmVhZF9vaz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWN4X3B0aHJlYWRfb2siID4mNQorJGFzX2VjaG8gIiRhY3hfcHRocmVhZF9vayIgPiY2OyB9CisgICAgICAgIGlmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorCisgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorZG9uZQorZmkKKworIyBWYXJpb3VzIG90aGVyIGNoZWNrczoKK2lmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogdGhyZWFkcyBhcmUgY3JlYXRlZCBkZXRhY2hlZCBieSBkZWZhdWx0CisgICAgICAgICMgYW5kIHRoZSBKT0lOQUJMRSBhdHRyaWJ1dGUgaGFzIGEgbm9uc3RhbmRhcmQgbmFtZSAoVU5ERVRBQ0hFRCkuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGpvaW5hYmxlIHB0aHJlYWQgYXR0cmlidXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZS4uLiAiID4mNjsgfQorICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitpbnQgYXR0cj1QVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBvaz1QVEhSRUFEX0NSRUFURV9KT0lOQUJMRQorZWxzZQorICBvaz11bmtub3duCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgaWYgdGVzdCB4IiRvayIgPSB4dW5rbm93bjsgdGhlbgorICAgICAgICAgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCBhdHRyPVBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQ7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgb2s9UFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRAorZWxzZQorICBvaz11bmtub3duCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCB4IiRvayIgIT0geFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFOyB0aGVuCisgICAgICAgICAgICAgICAgCiskYXNfZWNobyAiQCU6QGRlZmluZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSBcJG9rIiA+PmNvbmZkZWZzLmgKKworICAgICAgICBmaQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHtva30iID4mNQorJGFzX2VjaG8gIiR7b2t9IiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCB4IiRvayIgPSB4dW5rbm93bjsgdGhlbgorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogd2UgZG8gbm90IGtub3cgaG93IHRvIGNyZWF0ZSBqb2luYWJsZSBwdGhyZWFkcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3ZSBkbyBub3Qga25vdyBob3cgdG8gY3JlYXRlIGpvaW5hYmxlIHB0aHJlYWRzIiA+JjI7fQorICAgICAgICBmaQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMuLi4gIiA+JjY7IH0KKyAgICAgICAgZmxhZz1ubworICAgICAgICBjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAgICAgICAgICotYWl4KiB8ICotZnJlZWJzZCogfCAqLWRhcndpbiopIGZsYWc9Ii1EX1RIUkVBRF9TQUZFIjs7CisgICAgICAgICAgICAgICAgKnNvbGFyaXMqIHwgKi1vc2YqIHwgKi1ocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7CisgICAgICAgIGVzYWMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7ZmxhZ30iID4mNQorJGFzX2VjaG8gIiR7ZmxhZ30iID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGZsYWciICE9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIGZpCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBtdXN0IGNvbXBpbGUgd2l0aCBjY19yCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2NfciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2NfcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfUFRIUkVBRF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRQVEhSRUFEX0NDIjsgdGhlbgorICBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiRQVEhSRUFEX0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfUFRIUkVBRF9DQz0iY2NfciIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19QVEhSRUFEX0NDIiAmJiBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiR7Q0N9IgorZmkKK2ZpCitQVEhSRUFEX0NDPSRhY19jdl9wcm9nX1BUSFJFQURfQ0MKK2lmIHRlc3QgLW4gIiRQVEhSRUFEX0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBUSFJFQURfQ0MiID4mNQorJGFzX2VjaG8gIiRQVEhSRUFEX0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2Vsc2UKKyAgICAgICAgUFRIUkVBRF9DQz0iJENDIgorZmkKKworCisKKworCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgCiskYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1BUSFJFQUQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICAgOgorZWxzZQorICAgICAgICBhY3hfcHRocmVhZF9vaz1ubworICAgICAgICAKK2ZpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworICAgIGlmIHRlc3QgIiRhY3hfcHRocmVhZF9vayIgPSB5ZXM7IHRoZW4KKyAgICAgICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfUE9TSVhfVEhSRUFEIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAkYXNfZWNobyAiQCU6QGRlZmluZSBfUkVFTlRSQU5UIDEiID4+Y29uZmRlZnMuaAorCisgICAgZmkKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldGhvc3RieW5hbWUiICJhY19jdl9mdW5jX2dldGhvc3RieW5hbWUiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKKyAgCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxuc2wgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGhvc3RieW5hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBIQVZFX0xJQk5TTCAxCitfQUNFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZmkKKworZmkKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic29ja2V0IiAiYWNfY3ZfZnVuY19zb2NrZXQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc29ja2V0IiA9IHh5ZXM7IHRoZW4gOgorICAKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX3NvY2tldF9zb2NrZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHNvY2tldCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc29ja2V0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc29ja2V0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PXllcworZWxzZQorICBhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgSEFWRV9MSUJTT0NLRVQgMQorX0FDRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2ZpCisKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorICBpZiAke2FjX2N2X3Byb2dfQ1BQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworQCU6QGlmZGVmIF9fU1REQ19fCitAJTpAIGluY2x1ZGUgPGxpbWl0cy5oPgorQCU6QGVsc2UKK0AlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+CitAJTpAZW5kaWYKKwkJICAgICBTeW50YXggZXJyb3IKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgIAorZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitAJTpAaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKyAgCitmaQorICBDUFA9JGFjX2N2X3Byb2dfQ1BQCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQUCIgPiY1CiskYXNfZWNobyAiJENQUCIgPiY2OyB9CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK0AlOkBpZmRlZiBfX1NURENfXworQCU6QCBpbmNsdWRlIDxsaW1pdHMuaD4KK0AlOkBlbHNlCitAJTpAIGluY2x1ZGUgPGFzc2VydC5oPgorQCU6QGVuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAKK2Vsc2UKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworQCU6QGluY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuaSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4gOgorICAKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0dSRVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9HUkVQX2ZvdW5kPWZhbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX3Byb2cgaW4gZ3JlcCBnZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFjX3BhdGhfR1JFUCIgfHwgY29udGludWUKKyMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0dSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKK2Nhc2UgYCIkYWNfcGF0aF9HUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIgorICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKK2VzYWMKKworICAgICAgJGFjX3BhdGhfR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgIiRMSU5FTk8iIDUKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQorIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCisgCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wYXRoX0VHUkVQKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFjX3BhdGhfRUdSRVAiIHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFzX2ZuX2FyaXRoICRhY19jb3VudCArIDEgJiYgYWNfY291bnQ9JGFzX3ZhbAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAibm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCitmaQorCisgICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9FR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKyAKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIAorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgOgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICAKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAKKyRhc19lY2hvICJAJTpAZGVmaW5lIFNURENfSEVBREVSUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKyAKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIGFycGEvaW5ldC5oIGxpYmludGwuaCBuZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3lzL3NvY2tldC5oIHN5cy90aW1lLmggc3lzbG9nLmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisgCitmaQorCitkb25lCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYW4gQU5TSSBDLWNvbmZvcm1pbmcgY29uc3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19jb25zdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzIHNvcnQgb2YgdGhpbmcuICAqLworICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOworICBjb25zdCBjaGFyc2V0IGNzID0geyAwLCAwIH07CisgIC8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgY29uc3QgKmNvbnN0ICpwY3BjYzsKKyAgY2hhciAqKnBwYzsKKyAgLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9OworICBzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKyAgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbgorICAgICBhbiBhcm0gb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50CisgICAgIGV4cHJlc3Npb24gKi8KKyAgY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworICBwY3BjYyA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKyAgLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKyAgKytwY3BjYzsKKyAgcHBjID0gKGNoYXIqKikgcGNwY2M7CisgIHBjcGNjID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHBwYzsKKyAgeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzIHNvcnQgb2YgdGhpbmcuICAqLworICAgIGNoYXIgdHg7CisgICAgY2hhciAqdCA9ICZ0eDsKKyAgICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICAgKnQrKyA9IDA7CisgICAgaWYgKHMpIHJldHVybiAwOworICB9CisgIHsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgICAgaW50IHhbXSA9IHsyNSwgMTd9OworICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICAgKytmb287CisgIH0KKyAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgICAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgICAgaXB0ciBwID0gMDsKKyAgICArK3A7CisgIH0KKyAgeyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZywgc2F5aW5nCisgICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICAgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH0gYng7CisgICAgc3RydWN0IHMgKmIgPSAmYng7IGItPmogPSA1OworICB9CisgIHsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgICAgY29uc3QgaW50IGZvbyA9IDEwOworICAgIGlmICghZm9vKSByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gIWNzWzBdICYmICF6ZXJvLng7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29uc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbnN0IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICAKKyRhc19lY2hvICJAJTpAZGVmaW5lIGNvbnN0IC8qKi8iID4+Y29uZmRlZnMuaAorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKyAgCitlbHNlCisgIAorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBzaXplX3QgdW5zaWduZWQgaW50CitfQUNFT0YKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3NpemVfdCIgImFjX2N2X3R5cGVfc3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NzaXplX3QiID0geHllczsgdGhlbiA6CisgIAorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBIQVZFX1NTSVpFX1QgMQorX0FDRU9GCisKKworZWxzZQorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIHNzaXplX3QgaW50CitfQUNFT0YKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfdGltZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluICgpCit7CitpZiAoKHN0cnVjdCB0bSAqKSAwKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl90aW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfdGltZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl90aW1lIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCisgIAorJGFzX2VjaG8gIkAlOkBkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3N0cnVjdF90bSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK2ludAorbWFpbiAoKQoreworc3RydWN0IHRtIHRtOworCQkJCSAgICAgaW50ICpwID0gJnRtLnRtX3NlYzsKKwkJCQkgICAgIHJldHVybiAhcDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zdHJ1Y3RfdG09dGltZS5oCitlbHNlCisgIGFjX2N2X3N0cnVjdF90bT1zeXMvdGltZS5oCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zdHJ1Y3RfdG0iID4mNQorJGFzX2VjaG8gIiRhY19jdl9zdHJ1Y3RfdG0iID4mNjsgfQoraWYgdGVzdCAkYWNfY3Zfc3RydWN0X3RtID0gc3lzL3RpbWUuaDsgdGhlbgorICAKKyRhc19lY2hvICJAJTpAZGVmaW5lIFRNX0lOX1NZU19USU1FIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKKyMgLS0tLS0tIEFYIENSRUFURSBTVERJTlQgSCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdGRpbnQgdHlwZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludCB0eXBlcy4uLiAiID4mNjsgfQorYWNfc3RkaW50X2g9YGVjaG8gaW5jbHVkZS9pcGVyZi1pbnQuaGAKKyMgdHJ5IHRvIHNob3J0Y2lyY3VpdCAtIGlmIHRoZSBkZWZhdWx0IGluY2x1ZGUgcGF0aCBvZiB0aGUgY29tcGlsZXIKKyMgY2FuIGZpbmQgYSAic3RkaW50LmgiIGhlYWRlciB0aGVuIHdlIGFzc3VtZSB0aGF0IGFsbCBjb21waWxlcnMgY2FuLgoraWYgJHthY19jdl9oZWFkZXJfc3RkaW50X3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAKK29sZF9DWFhGTEFHUz0iJENYWEZMQUdTIiA7IENYWEZMQUdTPSIiCitvbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIgOyBDUFBGTEFHUz0iIgorb2xkX0NGTEFHUz0iJENGTEFHUyIgICAgIDsgQ0ZMQUdTPSIiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CitpbnQKK21haW4gKCkKK3sKK2ludF9sZWFzdDMyX3QgdiA9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3RkaW50X3Jlc3VsdD0iKGFzc3VtaW5nIEM5OSBjb21wYXRpYmxlIHN5c3RlbSkiCisgYWNfY3ZfaGVhZGVyX3N0ZGludF90PSJzdGRpbnQuaCI7IAorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkaW50X3Q9IiIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0NYWEZMQUdTPSIkb2xkX0NYWEZMQUdTIgorQ1BQRkxBR1M9IiRvbGRfQ1BQRkxBR1MiCitDRkxBR1M9IiRvbGRfQ0ZMQUdTIiAKK2ZpCisKKwordj0iLi4uICRhY19jdl9oZWFkZXJfc3RkaW50X2giCitpZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gInN0ZGludC5oIiA7IHRoZW4KKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogKGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGVtIGluIC4vc3RkaW50Lmg/KSIgPiY1CiskYXNfZWNobyAiKGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGVtIGluIC4vc3RkaW50Lmg/KSIgPiY2OyB9CitlbGlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAiaW50dHlwZXMuaCIgOyB0aGVuCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IChhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KSIgPiY1CiskYXNfZWNobyAiKGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGVtIGluIC4vaW50dHlwZXMuaD8pIiA+JjY7IH0KK2VsaWYgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3QiID0gIl8iIDsgdGhlbgorIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAocHV0dGluZyB0aGVtIGludG8gJGFjX3N0ZGludF9oKSR2IiA+JjUKKyRhc19lY2hvICIocHV0dGluZyB0aGVtIGludG8gJGFjX3N0ZGludF9oKSR2IiA+JjY7IH0KK2Vsc2UKKyBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF90IgorIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGludCAoc2hvcnRjaXJjdWl0KSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRpbnQgKHNob3J0Y2lyY3VpdCkiID4mNjsgfQorZmkKKworaWYgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3QiID0gIl8iIDsgdGhlbiAjIGNhbiBub3Qgc2hvcnRjaXJjdWl0Li4KKworCitpbnR0eXBlX2hlYWRlcnM9YGVjaG8gIHwgc2VkIC1lICdzLywvIC9nJ2AKKworYWNfY3Zfc3RkaW50X3Jlc3VsdD0iKG5vIGhlbHBmdWwgc3lzdGVtIHR5cGVkZWZzIHNlZW4pIgorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdGRpbnQgdWludHB0cl90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdGRpbnQgdWludHB0cl90Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRpbnRfeCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIAorIGFjX2N2X2hlYWRlcl9zdGRpbnRfeD0iIiAjIHRoZSAxOTk3IHR5cGVkZWZzIChpbnR0eXBlcy5oKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogKC4uKSIgPiY1CiskYXNfZWNobyAiKC4uKSIgPiY2OyB9CisgIGZvciBpIGluICAgIHN0ZGludC5oIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggJGludHR5cGVfaGVhZGVycyA7IGRvCisgICB1bnNldCBhY19jdl90eXBlX3VpbnRwdHJfdAorICAgdW5zZXQgYWNfY3ZfdHlwZV91aW50NjRfdAorICAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidWludHB0cl90IiAiYWNfY3ZfdHlwZV91aW50cHRyX3QiICIjaW5jbHVkZSA8JGk+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludHB0cl90IiA9IHh5ZXM7IHRoZW4gOgorICBhY19jdl9oZWFkZXJfc3RkaW50X3g9JGkKK2Vsc2UKKyAgY29udGludWUKK2ZpCisKKyAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQ2NF90IiAiYWNfY3ZfdHlwZV91aW50NjRfdCIgIiNpbmNsdWRlPCRpPgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgorICBhbmQ2ND0iL3VpbnQ2NF90IgorZWxzZQorICBhbmQ2ND0iIgorZmkKKworICAgICAgc3RkaW50LmggaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCAkaW50dHlwZV9oZWFkZXJzCisgYnJlYWsKKyAgZG9uZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdGRpbnQgdWludHB0cl90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdGRpbnQgdWludHB0cl90Li4uICIgPiY2OyB9CisgCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkaW50X3giID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkaW50X3giID4mNjsgfQorCisKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJfIiA7IHRoZW4KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RkaW50IHVpbnQzMl90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdGRpbnQgdWludDMyX3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGludF9vKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgCisgYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSIiICMgdGhlIDE5OTUgdHlwZWRlZnMgKHN5cy9pbnR0eXBlcy5oKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogKC4uKSIgPiY1CiskYXNfZWNobyAiKC4uKSIgPiY2OyB9CisgIGZvciBpIGluICAgIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggc3RkaW50LmggJGludHR5cGVfaGVhZGVycyA7IGRvCisgICB1bnNldCBhY19jdl90eXBlX3VpbnQzMl90CisgICB1bnNldCBhY19jdl90eXBlX3VpbnQ2NF90CisgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1aW50MzJfdCIgImFjX2N2X3R5cGVfdWludDMyX3QiICIjaW5jbHVkZSA8JGk+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDMyX3QiID0geHllczsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRpbnRfbz0kaQorZWxzZQorICBjb250aW51ZQorZmkKKworICAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidWludDY0X3QiICJhY19jdl90eXBlX3VpbnQ2NF90IiAiI2luY2x1ZGU8JGk+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDY0X3QiID0geHllczsgdGhlbiA6CisgIGFuZDY0PSIvdWludDY0X3QiCitlbHNlCisgIGFuZDY0PSIiCitmaQorCisgICAgICBpbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oIHN0ZGludC5oICRpbnR0eXBlX2hlYWRlcnMKKyBicmVhaworICAgYnJlYWs7CisgIGRvbmUKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RkaW50IHVpbnQzMl90IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdGRpbnQgdWludDMyX3QuLi4gIiA+JjY7IH0KKyAKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPiY2OyB9CisKK2ZpCisKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJfIiA7IHRoZW4KK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF9vIiA9ICJfIiA7IHRoZW4KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RkaW50IHVfaW50MzJfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkaW50IHVfaW50MzJfdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkaW50X3UrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAKKyBhY19jdl9oZWFkZXJfc3RkaW50X3U9IiIgIyB0aGUgQlNEIHR5cGVkZWZzIChzeXMvdHlwZXMuaCkKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICguLikiID4mNQorJGFzX2VjaG8gIiguLikiID4mNjsgfQorICBmb3IgaSBpbiAgICBzeXMvdHlwZXMuaCBpbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oICRpbnR0eXBlX2hlYWRlcnMgOyBkbworICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDMyX3QKKyAgIHVuc2V0IGFjX2N2X3R5cGVfdV9pbnQ2NF90CisgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1X2ludDMyX3QiICJhY19jdl90eXBlX3VfaW50MzJfdCIgIiNpbmNsdWRlIDwkaT4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91X2ludDMyX3QiID0geHllczsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdT0kaQorZWxzZQorICBjb250aW51ZQorZmkKKworICAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidV9pbnQ2NF90IiAiYWNfY3ZfdHlwZV91X2ludDY0X3QiICIjaW5jbHVkZTwkaT4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91X2ludDY0X3QiID0geHllczsgdGhlbiA6CisgIGFuZDY0PSIvdV9pbnQ2NF90IgorZWxzZQorICBhbmQ2ND0iIgorZmkKKworICAgICAgc3lzL3R5cGVzLmggaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCAkaW50dHlwZV9oZWFkZXJzCisgYnJlYWsKKyAgIGJyZWFrOworICBkb25lCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludCB1X2ludDMyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludCB1X2ludDMyX3QuLi4gIiA+JjY7IH0KKyAKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgPiY2OyB9CisKK2ZpIGZpCisKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJfIiA7IHRoZW4KKyAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludCBkYXRhdHlwZSBtb2RlbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkaW50IGRhdGF0eXBlIG1vZGVsLi4uICIgPiY2OyB9CisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogKC4uKSIgPiY1CiskYXNfZWNobyAiKC4uKSIgPiY2OyB9CisgICAKKyAgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgY2hhciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGNoYXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX2NoYXIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChjaGFyKSkiICJhY19jdl9zaXplb2ZfY2hhciIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorICAKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfY2hhciIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChjaGFyKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2NoYXI9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2NoYXIiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBTSVpFT0ZfQ0hBUiAkYWNfY3Zfc2l6ZW9mX2NoYXIKK19BQ0VPRgorCisKKyAgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBzaG9ydC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2Zfc2hvcnQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChzaG9ydCkpIiAiYWNfY3Zfc2l6ZW9mX3Nob3J0IiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisgIAorZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zaG9ydCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9zaG9ydD0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgU0laRU9GX1NIT1JUICRhY19jdl9zaXplb2Zfc2hvcnQKK19BQ0VPRgorCisKKyAgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChpbnQpKSIgImFjX2N2X3NpemVvZl9pbnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKyAgCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2ludCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfaW50PTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfaW50IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2ludCIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKK19BQ0VPRgorCisKKyAgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3Zfc2l6ZW9mX2xvbmcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChsb25nKSkiICJhY19jdl9zaXplb2ZfbG9uZyIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgorICAKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2xvbmc9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBTSVpFT0ZfTE9ORyAkYWNfY3Zfc2l6ZW9mX2xvbmcKK19BQ0VPRgorCisKKyAgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2Ygdm9pZCoiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiB2b2lkKi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2Zfdm9pZHArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mICh2b2lkKikpIiAiYWNfY3Zfc2l6ZW9mX3ZvaWRwIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisgIAorZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV92b2lkcCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh2b2lkKikKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl92b2lkcD0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3ZvaWRwIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3ZvaWRwIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgU0laRU9GX1ZPSURQICRhY19jdl9zaXplb2Zfdm9pZHAKK19BQ0VPRgorCisKKyAgIGFjX2N2X2NoYXJfZGF0YV9tb2RlbD0iIgorICAgYWNfY3ZfY2hhcl9kYXRhX21vZGVsPSIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsJGFjX2N2X3NpemVvZl9jaGFyIgorICAgYWNfY3ZfY2hhcl9kYXRhX21vZGVsPSIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsJGFjX2N2X3NpemVvZl9zaG9ydCIKKyAgIGFjX2N2X2NoYXJfZGF0YV9tb2RlbD0iJGFjX2N2X2NoYXJfZGF0YV9tb2RlbCRhY19jdl9zaXplb2ZfaW50IgorICAgYWNfY3ZfbG9uZ19kYXRhX21vZGVsPSIiCisgICBhY19jdl9sb25nX2RhdGFfbW9kZWw9IiRhY19jdl9sb25nX2RhdGFfbW9kZWwkYWNfY3Zfc2l6ZW9mX2ludCIKKyAgIGFjX2N2X2xvbmdfZGF0YV9tb2RlbD0iJGFjX2N2X2xvbmdfZGF0YV9tb2RlbCRhY19jdl9zaXplb2ZfbG9uZyIKKyAgIGFjX2N2X2xvbmdfZGF0YV9tb2RlbD0iJGFjX2N2X2xvbmdfZGF0YV9tb2RlbCRhY19jdl9zaXplb2Zfdm9pZHAiCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRhdGEgbW9kZWwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGF0YSBtb2RlbC4uLiAiID4mNjsgfQorICAgY2FzZSAiJGFjX2N2X2NoYXJfZGF0YV9tb2RlbC8kYWNfY3ZfbG9uZ19kYXRhX21vZGVsIiBpbgorICAgIDEyMi8yNDIpICAgICBhY19jdl9kYXRhX21vZGVsPSJJUDE2IiAgOyBuPSJzdGFuZGFyZCAxNmJpdCBtYWNoaW5lIiA7OworICAgIDEyMi8yNDQpICAgICBhY19jdl9kYXRhX21vZGVsPSJMUDMyIiAgOyBuPSJzdGFuZGFyZCAzMmJpdCBtYWNoaW5lIiA7OworICAgIDEyMi8qKSAgICAgICBhY19jdl9kYXRhX21vZGVsPSJpMTYiICAgOyBuPSJ1bnVzdWFsIGludDE2IG1vZGVsIiA7OworICAgIDEyNC80NDQpICAgICBhY19jdl9kYXRhX21vZGVsPSJJTFAzMiIgOyBuPSJzdGFuZGFyZCAzMmJpdCB1bml4aXNoIiA7OworICAgIDEyNC80ODgpICAgICBhY19jdl9kYXRhX21vZGVsPSJMUDY0IiAgOyBuPSJzdGFuZGFyZCA2NGJpdCB1bml4aXNoIiA7OworICAgIDEyNC80NDgpICAgICBhY19jdl9kYXRhX21vZGVsPSJMTFA2NCIgOyBuPSJ1bnVzdWFsIDY0Yml0IHVuaXhpc2giIDs7CisgICAgMTI0LyopICAgICAgIGFjX2N2X2RhdGFfbW9kZWw9ImkzMiIgICA7IG49InVudXN1YWwgaW50MzIgbW9kZWwiIDs7CisgICAgMTI4Lzg4OCkgICAgIGFjX2N2X2RhdGFfbW9kZWw9IklMUDY0IiA7IG49InVudXN1YWwgNjRiaXQgbnVtZXJpYyIgOzsKKyAgICAxMjgvKikgICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iaTY0IiAgIDsgbj0idW51c3VhbCBpbnQ2NCBtb2RlbCIgOzsKKyAgICAyMjIvKjIpICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iRFNQMTYiIDsgbj0ic3RyaWN0IDE2Yml0IGRzcHR5cGUiIDs7CisgICAgMzMzLyozKSAgICAgIGFjX2N2X2RhdGFfbW9kZWw9IkRTUDI0IiA7IG49InN0cmljdCAyNGJpdCBkc3B0eXBlIiA7OworICAgIDQ0NC8qNCkgICAgICBhY19jdl9kYXRhX21vZGVsPSJEU1AzMiIgOyBuPSJzdHJpY3QgMzJiaXQgZHNwdHlwZSIgOzsKKyAgICA2NjYvKjYpICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iRFNQNDgiIDsgbj0ic3RyaWN0IDQ4Yml0IGRzcHR5cGUiIDs7CisgICAgODg4Lyo4KSAgICAgIGFjX2N2X2RhdGFfbW9kZWw9IkRTUDY0IiA7IG49InN0cmljdCA2NGJpdCBkc3B0eXBlIiA7OworICAgIDIyMi8qfDMzMy8qfDQ0NC8qfDY2Ni8qfDg4OC8qKSA6CisgICAgICAgICAgICAgICAgIGFjX2N2X2RhdGFfbW9kZWw9ImlEU1AiICA7IG49InVudXN1YWwgZHNwdHlwZSIgOzsKKyAgICAgKikgICAgICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0ibm9uZSIgIDsgbj0idmVyeSB1bnVzdWFsIG1vZGVsIiA7OworICAgZXNhYworICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9kYXRhX21vZGVsICgkYWNfY3ZfbG9uZ19kYXRhX21vZGVsLCAkbikiID4mNQorJGFzX2VjaG8gIiRhY19jdl9kYXRhX21vZGVsICgkYWNfY3ZfbG9uZ19kYXRhX21vZGVsLCAkbikiID4mNjsgfQorCitmaQorCitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgIT0gIl8iIDsgdGhlbgorICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIKK2VsaWYgIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF9vIiAhPSAiXyIgOyB0aGVuCisgICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF9vIgorZWxpZiAgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJfIiA7IHRoZW4KKyAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCitlbHNlCisgICBhY19jdl9oZWFkZXJfc3RkaW50PSJzdGRkZWYuaCIKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGV4dHJhIGludHR5cGVzIGluIGNob3NlbiBoZWFkZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGV4dHJhIGludHR5cGVzIGluIGNob3NlbiBoZWFkZXIuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAoJGFjX2N2X2hlYWRlcl9zdGRpbnQpIiA+JjUKKyRhc19lY2hvICIoJGFjX2N2X2hlYWRlcl9zdGRpbnQpIiA+JjY7IH0KK3Vuc2V0IGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdAordW5zZXQgYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludF9sZWFzdDMyX3QiICJhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKKyAgCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnRfZmFzdDMyX3QiICJhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgIiNpbmNsdWRlPCRhY19jdl9oZWFkZXJfc3RkaW50PgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX2ludF9mYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKKyAgCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnRtYXhfdCIgImFjX2N2X3R5cGVfaW50bWF4X3QiICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50bWF4X3QiID0geHllczsgdGhlbiA6CisgIAorZmkKKworCitmaSAjIHNob3J0Y2lyY3V0IHRvIHN5c3RlbSAic3RkaW50LmgiCisjIC0tLS0tLS0tLS0tLS0tLS0tLSBQUkVQQVJFIFZBUklBQkxFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmIHRlc3QgIiRHQ0MiID0gInllcyIgOyB0aGVuCithY19jdl9zdGRpbnRfbWVzc2FnZT0idXNpbmcgZ251IGNvbXBpbGVyICJgJENDIC0tdmVyc2lvbiB8IGhlYWQgLTFgCitlbHNlCithY19jdl9zdGRpbnRfbWVzc2FnZT0idXNpbmcgJENDIgorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG1ha2UgdXNlIG9mICRhY19jdl9oZWFkZXJfc3RkaW50IGluICRhY19zdGRpbnRfaCAkYWNfY3Zfc3RkaW50X3Jlc3VsdCIgPiY1CiskYXNfZWNobyAibWFrZSB1c2Ugb2YgJGFjX2N2X2hlYWRlcl9zdGRpbnQgaW4gJGFjX3N0ZGludF9oICRhY19jdl9zdGRpbnRfcmVzdWx0IiA+JjY7IH0KKworIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGludHR5cGVzLmggY2hlY2tzIFNUQVJUIGhlYWRlciAtLS0tLS0tLS0tLS0tCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgJGFjX3N0ZGludF9oIgorCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIDNyZCBhcmd1bWVudCBvZiBhY2NlcHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgM3JkIGFyZ3VtZW50IG9mIGFjY2VwdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9hY2NlcHRfYXJnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgCisgICAgCisgIGlmIHRlc3QgLXogIiRhY19jdl9hY2NlcHRfYXJnIiA7IHRoZW4KKyAgICAKKyAgICBhY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgICAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitpbnQKK21haW4gKCkKK3sKK3NvY2tsZW5fdCBsZW5ndGg7CisgICAgICAgYWNjZXB0KCAwLCAwLCAmbGVuZ3RoICk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9hY2NlcHRfYXJnPXNvY2tsZW5fdAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisgIGZpCisKKworICAgIAorICBpZiB0ZXN0IC16ICIkYWNfY3ZfYWNjZXB0X2FyZyIgOyB0aGVuCisgICAgCisgICAgYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgICAgICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgoraW50CittYWluICgpCit7CitpbnQgbGVuZ3RoOworICAgICAgIGFjY2VwdCggMCwgMCwgJmxlbmd0aCApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfYWNjZXB0X2FyZz1pbnQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICBmaQorCisKKyAgICAKKyAgaWYgdGVzdCAteiAiJGFjX2N2X2FjY2VwdF9hcmciIDsgdGhlbgorICAgIAorICAgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICAgICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQoreworc2l6ZV90IGxlbmd0aDsKKyAgICAgICBhY2NlcHQoIDAsIDAsICZsZW5ndGggKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2FjY2VwdF9hcmc9c2l6ZV90CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKyAgICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyAgZmkKKworCisgICAgCisgIGlmIHRlc3QgLXogIiRhY19jdl9hY2NlcHRfYXJnIiA7IHRoZW4KKyAgICAKKyAgICBhY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgICAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitpbnQKK21haW4gKCkKK3sKK3Nob3J0IGxlbmd0aDsKKyAgICAgICBhY2NlcHQoIDAsIDAsICZsZW5ndGggKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2FjY2VwdF9hcmc9c2hvcnQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICBmaQorCisKKyAgICAKKyAgaWYgdGVzdCAteiAiJGFjX2N2X2FjY2VwdF9hcmciIDsgdGhlbgorICAgIAorICAgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICAgICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQoreworbG9uZyBsZW5ndGg7CisgICAgICAgYWNjZXB0KCAwLCAwLCAmbGVuZ3RoICk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9hY2NlcHRfYXJnPWxvbmcKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICBmaQorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2FjY2VwdF9hcmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9hY2NlcHRfYXJnIiA+JjY7IH0KKworaWYgdGVzdCAteiAiJGFjX2N2X2FjY2VwdF9hcmciIDsgdGhlbgorICBhY19jdl9hY2NlcHRfYXJnPWludAorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIFNvY2tsZW5fdCAkYWNfY3ZfYWNjZXB0X2FyZworX0FDRU9GCisKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAicGlkX3QiICJhY19jdl90eXBlX3BpZF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfcGlkX3QiID0geHllczsgdGhlbiA6CisgIAorZWxzZQorICAKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgcGlkX3QgaW50CitfQUNFT0YKKworZmkKKworZm9yIGFjX2hlYWRlciBpbiB2Zm9yay5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJ2Zm9yay5oIiAiYWNfY3ZfaGVhZGVyX3Zmb3JrX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3Zmb3JrX2giID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgSEFWRV9WRk9SS19IIDEKK19BQ0VPRgorIAorZmkKKworZG9uZQorCitmb3IgYWNfZnVuYyBpbiBmb3JrIHZmb3JrCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKyAKK2ZpCitkb25lCisKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrIiA9IHh5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBmb3JrIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19mb3JrX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9Y3Jvc3MKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworCisJICAvKiBCeSBSdWVkaWdlciBLdWhsbWFubi4gKi8KKwkgIHJldHVybiBmb3JrICgpIDwgMDsKKwkKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA+JjY7IH0KKworZWxzZQorICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9JGFjX2N2X2Z1bmNfZm9yaworZmkKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgorICBjYXNlICRob3N0IGluCisgICAgKi0qLWFtaWdhb3MqIHwgKi0qLW1zZG9zZGpncHAqKQorICAgICAgIyBPdmVycmlkZSwgYXMgdGhlc2Ugc3lzdGVtcyBoYXZlIG9ubHkgYSBkdW1teSBmb3JrKCkgc3R1YgorICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vCisgICAgICA7OworICAgICopCisgICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9eWVzCisgICAgICA7OworICBlc2FjCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiYyO30KK2ZpCithY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdmZvcmsiID0geHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfdmZvcmtfd29ya3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9Y3Jvc3MKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogVGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3QuICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2lmZGVmIEhBVkVfVkZPUktfSAorIyBpbmNsdWRlIDx2Zm9yay5oPgorI2VuZGlmCisvKiBPbiBzb21lIHNwYXJjIHN5c3RlbXMsIGNoYW5nZXMgYnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZworICAgYXJndW1lbnQgcmVnaXN0ZXJzIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudC4gIFRoZSBjb21waWxlcgorICAgaXMgdG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3JrLmg+LCBidXQgc29tZSBjb21waWxlcnMKKyAgIChlLmcuIGdjYyAtTykgZG9uJ3QgZ3JvayA8dmZvcmsuaD4uICBUZXN0IGZvciB0aGlzIGJ5IHVzaW5nIGEKKyAgIHN0YXRpYyB2YXJpYWJsZSB3aG9zZSBhZGRyZXNzIGlzIHB1dCBpbnRvIGEgcmVnaXN0ZXIgdGhhdCBpcworICAgY2xvYmJlcmVkIGJ5IHRoZSB2Zm9yay4gICovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fY3BsdXNwbHVzCitzcGFyY19hZGRyZXNzX3Rlc3QgKGludCBhcmcpCisjIGVsc2UKK3NwYXJjX2FkZHJlc3NfdGVzdCAoYXJnKSBpbnQgYXJnOworI2VuZGlmCit7CisgIHN0YXRpYyBwaWRfdCBjaGlsZDsKKyAgaWYgKCFjaGlsZCkgeworICAgIGNoaWxkID0gdmZvcmsgKCk7CisgICAgaWYgKGNoaWxkIDwgMCkgeworICAgICAgcGVycm9yICgidmZvcmsiKTsKKyAgICAgIF9leGl0KDIpOworICAgIH0KKyAgICBpZiAoIWNoaWxkKSB7CisgICAgICBhcmcgPSBnZXRwaWQoKTsKKyAgICAgIHdyaXRlKC0xLCAiIiwgMCk7CisgICAgICBfZXhpdCAoYXJnKTsKKyAgICB9CisgIH0KK30KKworaW50CittYWluICgpCit7CisgIHBpZF90IHBhcmVudCA9IGdldHBpZCAoKTsKKyAgcGlkX3QgY2hpbGQ7CisKKyAgc3BhcmNfYWRkcmVzc190ZXN0ICgwKTsKKworICBjaGlsZCA9IHZmb3JrICgpOworCisgIGlmIChjaGlsZCA9PSAwKSB7CisgICAgLyogSGVyZSBpcyBhbm90aGVyIHRlc3QgZm9yIHNwYXJjIHZmb3JrIHJlZ2lzdGVyIHByb2JsZW1zLiAgVGhpcworICAgICAgIHRlc3QgdXNlcyBsb3RzIG9mIGxvY2FsIHZhcmlhYmxlcywgYXQgbGVhc3QgYXMgbWFueSBsb2NhbAorICAgICAgIHZhcmlhYmxlcyBhcyBtYWluIGhhcyBhbGxvY2F0ZWQgc28gZmFyIGluY2x1ZGluZyBjb21waWxlcgorICAgICAgIHRlbXBvcmFyaWVzLiAgNCBsb2NhbHMgYXJlIGVub3VnaCBmb3IgZ2NjIDEuNDAuMyBvbiBhIFNvbGFyaXMKKyAgICAgICA0LjEuMyBzcGFyYywgYnV0IHdlIHVzZSA4IHRvIGJlIHNhZmUuICBBIGJ1Z2d5IGNvbXBpbGVyIHNob3VsZAorICAgICAgIHJldXNlIHRoZSByZWdpc3RlciBvZiBwYXJlbnQgZm9yIG9uZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLAorICAgICAgIHNpbmNlIGl0IHdpbGwgdGhpbmsgdGhhdCBwYXJlbnQgY2FuJ3QgcG9zc2libHkgYmUgdXNlZCBhbnkgbW9yZQorICAgICAgIGluIHRoaXMgcm91dGluZS4gIEFzc2lnbmluZyB0byB0aGUgbG9jYWwgdmFyaWFibGUgd2lsbCB0aHVzCisgICAgICAgbXVuZ2UgcGFyZW50IGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gICovCisgICAgcGlkX3QKKyAgICAgIHAgPSBnZXRwaWQoKSwgcDEgPSBnZXRwaWQoKSwgcDIgPSBnZXRwaWQoKSwgcDMgPSBnZXRwaWQoKSwKKyAgICAgIHA0ID0gZ2V0cGlkKCksIHA1ID0gZ2V0cGlkKCksIHA2ID0gZ2V0cGlkKCksIHA3ID0gZ2V0cGlkKCk7CisgICAgLyogQ29udmluY2UgdGhlIGNvbXBpbGVyIHRoYXQgcC4ucDcgYXJlIGxpdmU7IG90aGVyd2lzZSwgaXQgbWlnaHQKKyAgICAgICB1c2UgdGhlIHNhbWUgaGFyZHdhcmUgcmVnaXN0ZXIgZm9yIGFsbCA4IGxvY2FsIHZhcmlhYmxlcy4gICovCisgICAgaWYgKHAgIT0gcDEgfHwgcCAhPSBwMiB8fCBwICE9IHAzIHx8IHAgIT0gcDQKKwl8fCBwICE9IHA1IHx8IHAgIT0gcDYgfHwgcCAhPSBwNykKKyAgICAgIF9leGl0KDEpOworCisgICAgLyogT24gc29tZSBzeXN0ZW1zIChlLmcuIElSSVggMy4zKSwgdmZvcmsgZG9lc24ndCBzZXBhcmF0ZSBwYXJlbnQKKyAgICAgICBmcm9tIGNoaWxkIGZpbGUgZGVzY3JpcHRvcnMuICBJZiB0aGUgY2hpbGQgY2xvc2VzIGEgZGVzY3JpcHRvcgorICAgICAgIGJlZm9yZSBpdCBleGVjcyBvciBleGl0cywgdGhpcyBtdW5nZXMgdGhlIHBhcmVudCdzIGRlc2NyaXB0b3IKKyAgICAgICBhcyB3ZWxsLiAgVGVzdCBmb3IgdGhpcyBieSBjbG9zaW5nIHN0ZG91dCBpbiB0aGUgY2hpbGQuICAqLworICAgIF9leGl0KGNsb3NlKGZpbGVubyhzdGRvdXQpKSAhPSAwKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgd2hpbGUgKHdhaXQoJnN0YXR1cykgIT0gY2hpbGQpCisgICAgICA7CisgICAgcmV0dXJuICgKKwkgLyogV2FzIHRoZXJlIHNvbWUgcHJvYmxlbSB3aXRoIHZmb3JraW5nPyAgKi8KKwkgY2hpbGQgPCAwCisKKwkgLyogRGlkIHRoZSBjaGlsZCBmYWlsPyAgKFRoaXMgc2hvdWxkbid0IGhhcHBlbi4pICAqLworCSB8fCBzdGF0dXMKKworCSAvKiBEaWQgdGhlIHZmb3JrL2NvbXBpbGVyIGJ1ZyBvY2N1cj8gICovCisJIHx8IHBhcmVudCAhPSBnZXRwaWQoKQorCisJIC8qIERpZCB0aGUgZmlsZSBkZXNjcmlwdG9yIGJ1ZyBvY2N1cj8gICovCisJIHx8IGZzdGF0KGZpbGVubyhzdGRvdXQpLCAmc3QpICE9IDAKKwkgKTsKKyAgfQorfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA+JjY7IH0KKworZmk7CitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4Y3Jvc3M7IHRoZW4KKyAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz0kYWNfY3ZfZnVuY192Zm9yaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHJlc3VsdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiYyO30KK2ZpCisKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCisgIAorJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgIAorJGFzX2VjaG8gIkAlOkBkZWZpbmUgdmZvcmsgZm9yayIgPj5jb25mZGVmcy5oCisKK2ZpCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCisgIAorJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9XT1JLSU5HX0ZPUksgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2ZvciBhY19oZWFkZXIgaW4gc3RkbGliLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN0ZGxpYi5oIiAiYWNfY3ZfaGVhZGVyX3N0ZGxpYl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9zdGRsaWJfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBIQVZFX1NURExJQl9IIDEKK19BQ0VPRgorIAorZmkKKworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBHTlUgbGliYyBjb21wYXRpYmxlIG1hbGxvYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJsZSBtYWxsb2MuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGw9bm8KK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVERMSUJfSAorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCitjaGFyICptYWxsb2MgKCk7CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gISBtYWxsb2MgKDApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPXllcworZWxzZQorICBhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGw9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGwiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGwiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsID0geWVzOyB0aGVuIDoKKyAgCiskYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX01BTExPQyAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX01BTExPQyAwIiA+PmNvbmZkZWZzLmgKKworICAgY2FzZSAiICRMSUJAJnRAT0JKUyAiIGluCisgICoiIG1hbGxvYy4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCQCZ0QE9CSlM9IiRMSUJAJnRAT0JKUyBtYWxsb2MuJGFjX29iamV4dCIKKyA7OworZXNhYworCisgICAKKyRhc19lY2hvICJAJTpAZGVmaW5lIG1hbGxvYyBycGxfbWFsbG9jIiA+PmNvbmZkZWZzLmgKKworZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igd29ya2luZyBtZW1jbXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CisKKyAgLyogU29tZSB2ZXJzaW9ucyBvZiBtZW1jbXAgYXJlIG5vdCA4LWJpdCBjbGVhbi4gICovCisgIGNoYXIgYzAgPSAnXDEwMCcsIGMxID0gJ1wyMDAnLCBjMiA9ICdcMjAxJzsKKyAgaWYgKG1lbWNtcCgmYzAsICZjMiwgMSkgPj0gMCB8fCBtZW1jbXAoJmMxLCAmYzIsIDEpID49IDApCisgICAgcmV0dXJuIDE7CisKKyAgLyogVGhlIE5leHQgeDg2IE9wZW5TdGVwIGJ1ZyBzaG93cyB1cCBvbmx5IHdoZW4gY29tcGFyaW5nIDE2IGJ5dGVzCisgICAgIG9yIG1vcmUgYW5kIHdpdGggYXQgbGVhc3Qgb25lIGJ1ZmZlciBub3Qgc3RhcnRpbmcgb24gYSA0LWJ5dGUgYm91bmRhcnkuCisgICAgIFdpbGxpYW0gTGV3aXMgcHJvdmlkZWQgdGhpcyB0ZXN0IHByb2dyYW0uICAgKi8KKyAgeworICAgIGNoYXIgZm9vWzIxXTsKKyAgICBjaGFyIGJhclsyMV07CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgIHsKKwljaGFyICphID0gZm9vICsgaTsKKwljaGFyICpiID0gYmFyICsgaTsKKwlzdHJjcHkgKGEsICItLS0tLS0tLTAxMTExMTExIik7CisJc3RyY3B5IChiLCAiLS0tLS0tLS0xMDAwMDAwMCIpOworCWlmIChtZW1jbXAgKGEsIGIsIDE2KSA+PSAwKQorCSAgcmV0dXJuIDE7CisgICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX21lbWNtcF93b3JraW5nIiA+JjY7IH0KK3Rlc3QgJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcgPSBubyAmJiBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KKyAgKiIgbWVtY21wLiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJAJnRAT0JKUz0iJExJQkAmdEBPQkpTIG1lbWNtcC4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKKworZm9yIGFjX2hlYWRlciBpbiBzeXMvc2VsZWN0Lmggc3lzL3NvY2tldC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorIAorZmkKKworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHR5cGVzIG9mIGFyZ3VtZW50cyBmb3Igc2VsZWN0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHR5cGVzIG9mIGFyZ3VtZW50cyBmb3Igc2VsZWN0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfc2VsZWN0X2FyZ3MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBmb3IgYWNfYXJnMjM0IGluICdmZF9zZXQgKicgJ2ludCAqJyAndm9pZCAqJzsgZG8KKyBmb3IgYWNfYXJnMSBpbiAnaW50JyAnc2l6ZV90JyAndW5zaWduZWQgbG9uZyBpbnQnICd1bnNpZ25lZCBpbnQnOyBkbworICBmb3IgYWNfYXJnNSBpbiAnc3RydWN0IHRpbWV2YWwgKicgJ2NvbnN0IHN0cnVjdCB0aW1ldmFsIConOyBkbworICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworaW50CittYWluICgpCit7CitleHRlcm4gaW50IHNlbGVjdCAoJGFjX2FyZzEsCisJCQkJCSAgICAkYWNfYXJnMjM0LCAkYWNfYXJnMjM0LCAkYWNfYXJnMjM0LAorCQkJCQkgICAgJGFjX2FyZzUpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfc2VsZWN0X2FyZ3M9IiRhY19hcmcxLCRhY19hcmcyMzQsJGFjX2FyZzUiOyBicmVhayAzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKKyBkb25lCitkb25lCisjIFByb3ZpZGUgYSBzYWZlIGRlZmF1bHQgdmFsdWUuCis6ICIke2FjX2N2X2Z1bmNfc2VsZWN0X2FyZ3M9aW50LGludCAqLHN0cnVjdCB0aW1ldmFsICp9IgorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX3NlbGVjdF9hcmdzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19zZWxlY3RfYXJncyIgPiY2OyB9CithY19zYXZlX0lGUz0kSUZTOyBJRlM9JywnCitzZXQgZHVtbXkgYGVjaG8gIiRhY19jdl9mdW5jX3NlbGVjdF9hcmdzIiB8IHNlZCAncy9cKi9cKi9nJ2AKK0lGUz0kYWNfc2F2ZV9JRlMKK3NoaWZ0CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgU0VMRUNUX1RZUEVfQVJHMSAkMQorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBTRUxFQ1RfVFlQRV9BUkcyMzQgKCQyKQorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBTRUxFQ1RfVFlQRV9BUkc1ICgkMykKK19BQ0VPRgorCitybSAtZiBjb25mdGVzdCoKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3R5cGVfc2lnbmFsKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAqKHNpZ25hbCAoMCwgMCkpICgwKSA9PSAxOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3R5cGVfc2lnbmFsPWludAorZWxzZQorICBhY19jdl90eXBlX3NpZ25hbD12b2lkCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl90eXBlX3NpZ25hbCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3R5cGVfc2lnbmFsIiA+JjY7IH0KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAorX0FDRU9GCisKKworZm9yIGFjX2Z1bmMgaW4gc3RyZnRpbWUKK2RvIDoKKyAgYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic3RyZnRpbWUiICJhY19jdl9mdW5jX3N0cmZ0aW1lIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3N0cmZ0aW1lIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQorX0FDRU9GCisgCitlbHNlCisgICMgc3RyZnRpbWUgaXMgaW4gLWxpbnRsIG9uIFNDTyBVTklYLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RyZnRpbWUgaW4gLWxpbnRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJmdGltZSBpbiAtbGludGwuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2ludGxfc3RyZnRpbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHN0cmZ0aW1lICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc3RyZnRpbWUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2ludGxfc3RyZnRpbWU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9TVFJGVElNRSAxIiA+PmNvbmZkZWZzLmgKKworTElCUz0iLWxpbnRsICRMSUJTIgorZmkKKworZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gdnByaW50ZgorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJ2cHJpbnRmIiAiYWNfY3ZfZnVuY192cHJpbnRmIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3ZwcmludGYiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgSEFWRV9WUFJJTlRGIDEKK19BQ0VPRgorIAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiX2RvcHJudCIgImFjX2N2X2Z1bmNfX2RvcHJudCIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19fZG9wcm50IiA9IHh5ZXM7IHRoZW4gOgorICAKKyRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfRE9QUk5UIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitmaQorZG9uZQorCisKK2ZvciBhY19mdW5jIGluIGF0ZXhpdCBnZXR0aW1lb2ZkYXkgbWVtc2V0IHB0aHJlYWRfY2FuY2VsIHNlbGVjdCBzdHJjaHIgc3RyZXJyb3Igc3RydG9sIHVzbGVlcAorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisgCitmaQorZG9uZQorCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJzbnByaW50ZiIgImFjX2N2X2Z1bmNfc25wcmludGYiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc25wcmludGYiID0geHllczsgdGhlbiA6CisgICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfU05QUklOVEYgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgY2FzZSAiICRMSUJAJnRAT0JKUyAiIGluCisgICoiIHNucHJpbnRmLiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJAJnRAT0JKUz0iJExJQkAmdEBPQkpTIHNucHJpbnRmLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworZmkKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiaW5ldF9wdG9uIiAiYWNfY3ZfZnVuY19pbmV0X3B0b24iCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfaW5ldF9wdG9uIiA9IHh5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0lORVRfUFRPTiAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICBjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KKyAgKiIgaW5ldF9wdG9uLiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJAJnRAT0JKUz0iJExJQkAmdEBPQkpTIGluZXRfcHRvbi4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImluZXRfbnRvcCIgImFjX2N2X2Z1bmNfaW5ldF9udG9wIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2luZXRfbnRvcCIgPSB4eWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9JTkVUX05UT1AgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgY2FzZSAiICRMSUJAJnRAT0JKUyAiIGluCisgICoiIGluZXRfbnRvcC4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCQCZ0QE9CSlM9IiRMSUJAJnRAT0JKUyBpbmV0X250b3AuJGFjX29iamV4dCIKKyA7OworZXNhYworCitmaQorCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJnZXR0aW1lb2ZkYXkiICJhY19jdl9mdW5jX2dldHRpbWVvZmRheSIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXR0aW1lb2ZkYXkiID0geHllczsgdGhlbiA6CisgICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgIGNhc2UgIiAkTElCQCZ0QE9CSlMgIiBpbgorICAqIiBnZXR0aW1lb2ZkYXkuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQkAmdEBPQkpTPSIkTElCQCZ0QE9CSlMgZ2V0dGltZW9mZGF5LiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworZmkKKworCisKKworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAqcHJpbnRmKCkgc3VwcG9ydCBmb3IgJWxsZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAqcHJpbnRmKCkgc3VwcG9ydCBmb3IgJWxsZC4uLiAiID4mNjsgfQorY2FuX3ByaW50Zl9sb25nbG9uZz1ubworaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICAgOiAKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisgICAgICAgICNpbmNsdWRlIDxzdGRpby5oPgorICAgICAgICBpbnQgbWFpbigpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAiJWxsZCIsIDIxNzI2NTg3NTkwTEwpOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RyY21wKGJ1ZiwgIjIxNzI2NTg3NTkwIikpOworICAgICAgICB9CisgICAgICAgIAorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgICAgIGNhbl9wcmludGZfbG9uZ2xvbmc9eWVzCisgICAgICAgIAorZWxzZQorICAKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgIAorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworaWYgdGVzdCAkY2FuX3ByaW50Zl9sb25nbG9uZyAhPSB5ZXM7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAqcHJpbnRmKCkgc3VwcG9ydCBmb3IgJXFkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICpwcmludGYoKSBzdXBwb3J0IGZvciAlcWQuLi4gIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICAgOiAKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisgICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CisgICAgICAgICAgICAgICAgaW50IG1haW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOworICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICIlcWQiLCAyMTcyNjU4NzU5MExMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RyY21wKGJ1ZiwgIjIxNzI2NTg3NTkwIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIAorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgICAgICAgICAgICAgY2FuX3ByaW50Zl9sb25nbG9uZz15ZXMKKyAgICAgICAgICAgICAgICAkYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX1BSSU5URl9RRCAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICAgICAgICAgIAorZWxzZQorICAKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICAgICAgICAgICAgICAKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQorCitpZiB0ZXN0ICRjYW5fcHJpbnRmX2xvbmdsb25nID0geWVzOyB0aGVuCisgICAgICAgICRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfUVVBRF9TVVBQT1JUIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKKworCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGJvb2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBib29sLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9ib29sKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoYm9vbCkpIiAiYWNfY3Zfc2l6ZW9mX2Jvb2wiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKyAgCitlbHNlCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX2Jvb2wiID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoYm9vbCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9ib29sPTAKKyAgIGZpCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfYm9vbCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9ib29sIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKK0AlOkBkZWZpbmUgU0laRU9GX0JPT0wgJGFjX2N2X3NpemVvZl9ib29sCitfQUNFT0YKKworCitpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2Jvb2wiID0gMCA7IHRoZW4KKyAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgYm9vbCBpbnQiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRydWUgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB0cnVlIGlzIGRlZmluZWQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGF2ZV90cnVlKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgCisgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3Vuc2lnbmVkIGludCBpID0gdHJ1ZQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGF2ZV90cnVlPXllcworZWxzZQorICBhY19jdl9oYXZlX3RydWU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisgCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX3RydWUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX3RydWUiID4mNjsgfQorCitpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV90cnVlIiAhPSB5ZXMgOyB0aGVuCisgICRhc19lY2hvICJAJTpAZGVmaW5lIHRydWUgMSIgPj5jb25mZGVmcy5oCisKKyAgJGFzX2VjaG8gIkAlOkBkZWZpbmUgZmFsc2UgMCIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19iaWdlbmRpYW4rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZm5kZWYgX19BUFBMRV9DQ19fCisJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisJICAgICAjZW5kaWYKKwkgICAgIHR5cGVkZWYgaW50IGR1bW15OworCSAgICAKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAKKwkjIENoZWNrIGZvciBwb3RlbnRpYWwgLWFyY2ggZmxhZ3MuICBJdCBpcyBub3QgdW5pdmVyc2FsIHVubGVzcworCSMgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byAtYXJjaCBmbGFncyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuCisJYWNfYXJjaD0KKwlhY19wcmV2PQorCWZvciBhY193b3JkIGluICRDQyAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUzsgZG8KKwkgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisJICAgY2FzZSAkYWNfd29yZCBpbgorCSAgICAgaT84NiB8IHg4Nl82NCB8IHBwYyB8IHBwYzY0KQorCSAgICAgICBpZiB0ZXN0IC16ICIkYWNfYXJjaCIgfHwgdGVzdCAiJGFjX2FyY2giID0gIiRhY193b3JkIjsgdGhlbgorCQkgYWNfYXJjaD0kYWNfd29yZAorCSAgICAgICBlbHNlCisJCSBhY19jdl9jX2JpZ2VuZGlhbj11bml2ZXJzYWwKKwkJIGJyZWFrCisJICAgICAgIGZpCisJICAgICAgIDs7CisJICAgZXNhYworCSAgIGFjX3ByZXY9CisJIGVsaWYgdGVzdCAieCRhY193b3JkIiA9ICJ4LWFyY2giOyB0aGVuCisJICAgYWNfcHJldj1hcmNoCisJIGZpCisgICAgICAgZG9uZQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorICAgICAgIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KKyAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKwkgICAKK2ludAorbWFpbiAoKQoreworI2lmICEgKGRlZmluZWQgQllURV9PUkRFUiAmJiBkZWZpbmVkIEJJR19FTkRJQU4gXAorCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAorCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCisJICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcworCSAgICAgI2VuZGlmCisJICAgCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJICAgICAgCitpbnQKK21haW4gKCkKK3sKKyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KKwkJIG5vdCBiaWcgZW5kaWFuCisJCSNlbmRpZgorCSAgICAgIAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorCSAgIAoraW50CittYWluICgpCit7CisjaWYgISAoZGVmaW5lZCBfTElUVExFX0VORElBTiB8fCBkZWZpbmVkIF9CSUdfRU5ESUFOKQorCSAgICAgIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKwkgICAgICNlbmRpZgorCSAgIAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gX0JJR19FTkRJQU4gb3Igbm90LgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisJICAgICAgCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX0JJR19FTkRJQU4KKwkJIG5vdCBiaWcgZW5kaWFuCisJCSNlbmRpZgorCSAgICAgIAorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCisgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICMgVHJ5IHRvIGd1ZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBmcm9tIGFuIG9iamVjdCBmaWxlLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCitzaG9ydCBpbnQgYXNjaWlfbW1bXSA9CisJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisJCXNob3J0IGludCBhc2NpaV9paVtdID0KKwkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKwkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKKwkJfQorCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OworCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKKwkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworCQl9CisJCWV4dGVybiBpbnQgZm9vOworCSAgICAgIAoraW50CittYWluICgpCit7CityZXR1cm4gdXNlX2FzY2lpIChmb28pID09IHVzZV9lYmNkaWMgKGZvbyk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgaWYgZ3JlcCBCSUdlbkRpYW5TeVMgY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsOyB0aGVuCisJICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCisJICAgIGZpCisJICAgIGlmIGdyZXAgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbCA7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19iaWdlbmRpYW4iID0gdW5rbm93bjsgdGhlbgorCQlhY19jdl9jX2JpZ2VuZGlhbj1ubworCSAgICAgIGVsc2UKKwkJIyBmaW5kaW5nIGJvdGggc3RyaW5ncyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCB3aG8ga25vd3M/CisJCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKwkgICAgICBmaQorCSAgICBmaQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAoraW50CittYWluICgpCit7CisKKwkgICAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKwkgICAgIHVuaW9uCisJICAgICB7CisJICAgICAgIGxvbmcgaW50IGw7CisJICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07CisJICAgICB9IHU7CisJICAgICB1LmwgPSAxOworCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7CisJICAgCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19iaWdlbmRpYW4iID4mNjsgfQorIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCisgICB5ZXMpCisgICAgICRhc19lY2hvICJAJTpAZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxIiA+PmNvbmZkZWZzLmgKKzs7ICMoCisgICBubykKKyAgICAgIDs7ICMoCisgICB1bml2ZXJzYWwpCisgICAgIAkKKyRhc19lY2hvICJAJTpAZGVmaW5lIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAxIiA+PmNvbmZkZWZzLmgKKworICAgICA7OyAjKAorICAgKikKKyAgICAgYXNfZm5fZXJyb3IgJD8gInVua25vd24gZW5kaWFubmVzcworIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiAiJExJTkVOTyIgNSA7OworIGVzYWMKKworCisKK2lmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiICE9IG5vOyB0aGVuCisgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBpcF9tcmVxIiAiYWNfY3ZfdHlwZV9zdHJ1Y3RfaXBfbXJlcSIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X2lwX21yZXEiID0geHllczsgdGhlbiA6CisgIAorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBIQVZFX1NUUlVDVF9JUF9NUkVRIDEKK19BQ0VPRgorCisKK2ZpCisKKyAgYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiSVBfQUREX01FTUJFUlNISVAiICJhY19jdl9oYXZlX2RlY2xfSVBfQUREX01FTUJFUlNISVAiICIjaW5jbHVkZSBcIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmhcIgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfSVBfQUREX01FTUJFUlNISVAiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIEhBVkVfREVDTF9JUF9BRERfTUVNQkVSU0hJUCAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBtdWx0aWNhc3Qgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbXVsdGljYXN0IHN1cHBvcnQuLi4gIiA+JjY7IH0KKyAgYWNfY3ZfbXVsdGljYXN0PW5vCisgIGlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfSVBfQUREX01FTUJFUlNISVAiID0geWVzOyB0aGVuCisgICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X2lwX21yZXEiID0geWVzOyB0aGVuCisgICAgICBhY19jdl9tdWx0aWNhc3Q9eWVzCisgICAgZmkKKyAgZmkKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9tdWx0aWNhc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9tdWx0aWNhc3QiID4mNjsgfQorICBpZiB0ZXN0ICIkYWNfY3ZfbXVsdGljYXN0IiA9IHllczsgdGhlbgorICAgIAorJGFzX2VjaG8gIkAlOkBkZWZpbmUgSEFWRV9NVUxUSUNBU1QgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oYXZlX2lwdjYiICE9IG5vOyB0aGVuCisgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIiAiYWNfY3ZfdHlwZV9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID0geHllczsgdGhlbiA6CisgIAorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFIDEKK19BQ0VPRgorCisKK2ZpCisKKyAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3RydWN0IHNvY2thZGRyX2luNiIgImFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX2luNiIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX2luNiIgPSB4eWVzOyB0aGVuIDoKKyAgCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONiAxCitfQUNFT0YKKworCitmaQorCisgIGFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIkFGX0lORVQ2IiAiYWNfY3ZfaGF2ZV9kZWNsX0FGX0lORVQ2IiAiI2luY2x1ZGUgXCIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0FGX0lORVQ2IiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorQCU6QGRlZmluZSBIQVZFX0RFQ0xfQUZfSU5FVDYgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgSVB2NiBoZWFkZXJzIGFuZCBzdHJ1Y3R1cmVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBJUHY2IGhlYWRlcnMgYW5kIHN0cnVjdHVyZXMuLi4gIiA+JjY7IH0KKyAgYWNfY3ZfaGF2ZV9pcHY2PW5vCisgIGlmIHRlc3QgIiRhY19jdl90eXBlX3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlIiA9IHllczsgdGhlbgorICAgIGlmIHRlc3QgIiRhY19jdl90eXBlX3N0cnVjdF9zb2NrYWRkcl9pbjYiID0geWVzOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX0FGX0lORVQ2IiA9IHllczsgdGhlbgorICAgICAgICAKKyRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfSVBWNiAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICBhY19jdl9oYXZlX2lwdjY9eWVzCisgICAgICBmaQorICAgIGZpCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9pcHY2IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9pcHY2IiA+JjY7IH0KK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oYXZlX2lwdjYiID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiID0geWVzOyB0aGVuCisgICAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3RydWN0IGlwdjZfbXJlcSIgImFjX2N2X3R5cGVfc3RydWN0X2lwdjZfbXJlcSIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X2lwdjZfbXJlcSIgPSB4eWVzOyB0aGVuIDoKKyAgCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIEhBVkVfU1RSVUNUX0lQVjZfTVJFUSAxCitfQUNFT0YKKworCitmaQorCisgICAgYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiSVBWNl9BRERfTUVNQkVSU0hJUCIgImFjX2N2X2hhdmVfZGVjbF9JUFY2X0FERF9NRU1CRVJTSElQIiAiI2luY2x1ZGUgXCIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0lQVjZfQUREX01FTUJFUlNISVAiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIEhBVkVfREVDTF9JUFY2X0FERF9NRU1CRVJTSElQICRhY19oYXZlX2RlY2wKK19BQ0VPRgorCisgICAgYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiSVBWNl9NVUxUSUNBU1RfSE9QUyIgImFjX2N2X2hhdmVfZGVjbF9JUFY2X01VTFRJQ0FTVF9IT1BTIiAiI2luY2x1ZGUgXCIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0lQVjZfTVVMVElDQVNUX0hPUFMiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCitAJTpAZGVmaW5lIEhBVkVfREVDTF9JUFY2X01VTFRJQ0FTVF9IT1BTICRhY19oYXZlX2RlY2wKK19BQ0VPRgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgSVB2NiBtdWx0aWNhc3Qgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgSVB2NiBtdWx0aWNhc3Qgc3VwcG9ydC4uLiAiID4mNjsgfQorICAgIGFjX2N2X2hhdmVfaXB2Nl9tdWx0aWNhc3Q9bm8KKyAgICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zdHJ1Y3RfaXB2Nl9tcmVxIiA9IHllczsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGVjbF9JUFY2X0FERF9NRU1CRVJTSElQIiA9IHllczsgdGhlbgorICAgICAgICBpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX0lQVjZfTVVMVElDQVNUX0hPUFMiID0geWVzOyB0aGVuCisgICAgICAgICAgCiskYXNfZWNobyAiQCU6QGRlZmluZSBIQVZFX0lQVjZfTVVMVElDQVNUIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgICAgYWNfY3ZfaGF2ZV9pcHY2X211bHRpY2FzdD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfaXB2Nl9tdWx0aWNhc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX2lwdjZfbXVsdGljYXN0IiA+JjY7IH0KKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRlbmFibGVfZGVidWdpbmZvIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiQCU6QGRlZmluZSBEQkdfTUpaIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX3dlYjEwMCIgIT0gbm87IHRoZW4KK2lmIHRlc3QgLWUgIi9wcm9jL3dlYjEwMCI7IHRoZW4KK2lmIHRlc3QgLWQgIi9wcm9jL3dlYjEwMCI7IHRoZW4KK2lmIHRlc3QgLWUgIi9wcm9jL3dlYjEwMC9oZWFkZXIiOyB0aGVuCitpZiB0ZXN0IC1mICIvcHJvYy93ZWIxMDAvaGVhZGVyIjsgdGhlbgoraWYgdGVzdCAtciAiL3Byb2Mvd2ViMTAwL2hlYWRlciI7IHRoZW4KKword2ViMTAwX3N1Y2Nlc3M9IiIKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ3ZWIxMDAtY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB3ZWIxMDAtY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9XRUIxMDBfQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkV0VCMTAwX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9XRUIxMDBfQ09ORklHPSIkV0VCMTAwX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfV0VCMTAwX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9XRUIxMDBfQ09ORklHIiAmJiBhY19jdl9wYXRoX1dFQjEwMF9DT05GSUc9Im5vIgorICA7OworZXNhYworZmkKK1dFQjEwMF9DT05GSUc9JGFjX2N2X3BhdGhfV0VCMTAwX0NPTkZJRworaWYgdGVzdCAtbiAiJFdFQjEwMF9DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkV0VCMTAwX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJFdFQjEwMF9DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBXZWIxMDAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFdlYjEwMC4uLiAiID4mNjsgfQorCitpZiB0ZXN0ICIkV0VCMTAwX0NPTkZJRyIgIT0gIm5vIjsgdGhlbgorICBXRUIxMDBfQ0ZMQUdTPWAkV0VCMTAwX0NPTkZJRyAtLWNmbGFnc2AKKyAgV0VCMTAwX0xJQlM9YCRXRUIxMDBfQ09ORklHIC0tbGlic2AKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgIGVjaG8gIioqKiBUaGUgd2ViMTAwLWNvbmZpZyBzY3JpcHQgaW5zdGFsbGVkIGJ5IFdlYjEwMCBjb3VsZCBub3QgYmUgZm91bmQiCisgIGVjaG8gIioqKiBJZiBXZWIxMDAgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICBlY2hvICIqKiogeW91ciBwYXRoLCBvciBzZXQgdGhlIFdFQjEwMF9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIgorICBlY2hvICIqKiogZnVsbCBwYXRoIHRvIHdlYjEwMC1jb25maWciCisgIHdlYjEwMF9zdWNjZXNzPSJubyIKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCIgIT0gIngiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgV2ViMTAwIC0gdmVyc2lvbiAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFdlYjEwMCAtIHZlcnNpb24gLi4uICIgPiY2OyB9CisKKyAgICBXRUIxMDBfVkVSU0lPTj1gJFdFQjEwMF9DT05GSUcgLS12ZXJzaW9uYAorICAgIGlmIHRlc3QgIiRXRUIxMDBfVkVSU0lPTiIgPSAiIjsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICAgIGVjaG8gIioqKiBUaGUgcmVxdWVzdGVkICgpIGFuZCBpbnN0YWxsZWQgKCRXRUIxMDBfVkVSU0lPTikgdmVyc2lvbnMiCisgICAgICBlY2hvICIqKiogb2YgV2ViMTAwIGRvIG5vdCBtYXRjaC4iCisgICAgICB3ZWIxMDBfc3VjY2Vzcz0ibm8iCisgICAgZmkKKyAgZmkKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHg7IHRoZW4KKyAgd2ViMTAwX3N1Y2Nlc3M9InllcyIKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHh5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBXRUIxMDBfQ0ZMQUdTPSIiCisgIFdFQjEwMF9MSUJTPSIiCisgIDoKK2ZpCisKKworCisKK2lmIHRlc3QgIiR3ZWIxMDBfc3VjY2VzcyIgPSB5ZXM7IHRoZW4gCisKKyRhc19lY2hvICJAJTpAZGVmaW5lIEhBVkVfV0VCMTAwIDEiID4+Y29uZmRlZnMuaAorCitmaSBmaSBmaSBmaSBmaSBmaQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIG1ha2UgaXMgR05VIG1ha2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBtYWtlIGlzIEdOVSBtYWtlLi4uICIgPiY2OyB9CitTVFJJUF9CRUdJTj0KK1NUUklQX0VORD0KK2lmICRhY19tYWtlIC0tdmVyc2lvbiAyPiAvZGV2L251bGwgfCBncmVwICdeR05VIE1ha2UgJyA+IC9kZXYvbnVsbCA7IHRoZW4KKyAgICBTVFJJUF9CRUdJTj0nJChzdHJpcCAkKFNUUklQX0RVTU1ZKScKKyAgICBTVFJJUF9FTkQ9JyknCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKK1NUUklQX0RVTU1ZPQorCisKKworCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUgY29tcGF0L01ha2VmaWxlIGRvYy9NYWtlZmlsZSBpbmNsdWRlL01ha2VmaWxlIHNyYy9NYWtlZmlsZSBtYW4vTWFrZWZpbGUiCisKK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCisjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzLgorCitfQUNFT0YKKworIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKAorICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCisgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgY2FzZSAkYWNfdmFsIGluICMoCisgICAgKiR7YXNfbmx9KikKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgKl9jdl8qKSB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICBCQVNIX0FSR1YgfCBCQVNIX1NPVVJDRSkgZXZhbCAkYWNfdmFyPSA7OyAjKAorICAgICAgKikgeyBldmFsICRhY192YXI9OyB1bnNldCAkYWNfdmFyO30gOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCisgICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQorICAgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXM6IGRvdWJsZS1xdW90ZQorICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKSB8CisgIHNlZCAnCisgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorICAgICB0IGNsZWFyCisgICAgIDpjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6ZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIjsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICAgIGlmIHRlc3QgISAtZiAiJGNhY2hlX2ZpbGUiIHx8IHRlc3QgLWggIiRjYWNoZV9maWxlIjsgdGhlbgorCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbiAjKAorICAgICAgICAqLyogfCA/OiopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCisJICBtdiAtZiAiJGNhY2hlX2ZpbGUiJCQgIiRjYWNoZV9maWxlIiA7OyAjKAorICAgICAgICAqKQorCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKKwllc2FjCisgICAgICBmaQorICAgIGZpCisgIGVsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworYWNfbGlib2Jqcz0KK2FjX2x0bGlib2Jqcz0KK1U9Citmb3IgYWNfaSBpbiA6ICRMSUJAJnRAT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCisgIGFjX2k9YCRhc19lY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAorICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCisgICMgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMSUJPQkpTIG9iamVjdHMgYXJlIGJ1aWx0LgorICBhc19mbl9hcHBlbmQgYWNfbGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorICBhc19mbl9hcHBlbmQgYWNfbHRsaWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKK2RvbmUKK0xJQkAmdEBPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENYWF9UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENYWF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ1hYXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQorCisKKzogIiR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9IgorYWNfd3JpdGVfZmFpbD0wCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cithc193cml0ZV9mYWlsPTAKK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCisKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluIEAlOkAoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgQCU6QCgKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluIEAlOkAoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gQCU6QCgoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKworQCU6QCBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgT3V0cHV0ICJgYmFzZW5hbWUgQFN8QDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCitAJTpAIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKK0AlOkAgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSBAJTpAIGFzX2ZuX2Vycm9yCisKKworQCU6QCBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworQCU6QCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQCU6QCBTZXQgQFN8QD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSBAJTpAIGFzX2ZuX3NldF9zdGF0dXMKKworQCU6QCBhc19mbl9leGl0IFNUQVRVUworQCU6QCAtLS0tLS0tLS0tLS0tLS0tLQorQCU6QCBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gQCU6QCBhc19mbl9leGl0CisKK0AlOkAgYXNfZm5fdW5zZXQgVkFSCitAJTpAIC0tLS0tLS0tLS0tLS0tLQorQCU6QCBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorQCU6QCBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0AlOkAgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorQCU6QCBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCitAJTpAIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCitAJTpAIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworQCU6QCBhc19mbl9hcml0aCBBUkcuLi4KK0AlOkAgLS0tLS0tLS0tLS0tLS0tLS0tCitAJTpAIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKK0AlOkAgZ2xvYmFsIEBTfEBhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworQCU6QCBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyBAU3xAKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiBAJTpAKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcFInLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wUicKKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPWxuCisgIGVsc2UKKyAgICBhc19sbl9zPSdjcCAtcFInCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wUicKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKKworQCU6QCBhc19mbl9ta2Rpcl9wCitAJTpAIC0tLS0tLS0tLS0tLS0KK0AlOkAgQ3JlYXRlICJAU3xAYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gQCU6QCBhc19mbl9ta2Rpcl9wCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworCitAJTpAIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCitAJTpAIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitAJTpAIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KK2FzX2ZuX2V4ZWN1dGFibGVfcCAoKQoreworICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCit9IEAlOkAgYXNfZm5fZXhlY3V0YWJsZV9wCithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCitleGVjIDY+JjEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWluIGJvZHkgb2YgJENPTkZJR19TVEFUVVMgc2NyaXB0LiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0VPRgordGVzdCAkYXNfd3JpdGVfZmFpbCA9IDAgJiYgY2htb2QgK3ggJENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJDAgYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgorYWNfbG9nPSIKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgSXBlcmYgJGFzX21lIDIuMC41LCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICAkICQwICRACisKK29uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorIgorCitfQUNFT0YKKworY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Citlc2FjCisKK2Nhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworZXNhYworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKK2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKK2Zyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcworYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKKyAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0gCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFCisgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0gCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK0NvbmZpZ3VyYXRpb24gY29tbWFuZHM6CiskY29uZmlnX2NvbW1hbmRzCisKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLiIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCithY19jc192ZXJzaW9uPSJcXAorSXBlcmYgY29uZmlnLnN0YXR1cyAyLjAuNQorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LAorICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKKworQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK0FXSz0nJEFXSycKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPT8qKQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtLSo9KQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPQorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAqKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKKyAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKKyAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKKworICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBzZXQgWCAkU0hFTEwgJyQwJyAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorICBzaGlmdAorICBcJGFzX2VjaG8gInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCBcJCoiID4mNgorICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICBleGVjICJcJEAiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2V4ZWMgNT4+Y29uZmlnLmxvZworeworICBlY2hvCisgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi9AJTpAQCU6QCAvO3MvLi4uJC8gQCU6QEAlOkAvO3A7eDtwO3gnIDw8X0FTQk9YCitAJTpAQCU6QCBSdW5uaW5nICRhc19tZS4gQCU6QEAlOkAKK19BU0JPWAorICAkYXNfZWNobyAiJGFjX2xvZyIKK30gPiY1CisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjCisjIElOSVQtQ09NTUFORFMKKyMKK0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciIKKyMgdmFyaWFibGVzIGZvciBjcmVhdGUgc3RkaW50LmggcmVwbGFjZW1lbnQKK1BBQ0tBR0U9IiRQQUNLQUdFIgorVkVSU0lPTj0iJFZFUlNJT04iCithY19zdGRpbnRfaD0iJGFjX3N0ZGludF9oIgorX2FjX3N0ZGludF9oPWAkYXNfZWNobyAiXyRQQUNLQUdFLSRhY19zdGRpbnRfaCIgfCAkYXNfdHJfY3BwYAorYWNfY3Zfc3RkaW50X21lc3NhZ2U9IiRhY19jdl9zdGRpbnRfbWVzc2FnZSIKK2FjX2N2X2hlYWRlcl9zdGRpbnRfdD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfdCIKK2FjX2N2X2hlYWRlcl9zdGRpbnRfeD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIKK2FjX2N2X2hlYWRlcl9zdGRpbnRfbz0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIKK2FjX2N2X2hlYWRlcl9zdGRpbnRfdT0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIKK2FjX2N2X3R5cGVfdWludDY0X3Q9IiRhY19jdl90eXBlX3VpbnQ2NF90IgorYWNfY3ZfdHlwZV91X2ludDY0X3Q9IiRhY19jdl90eXBlX3VfaW50NjRfdCIKK2FjX2N2X2NoYXJfZGF0YV9tb2RlbD0iJGFjX2N2X2NoYXJfZGF0YV9tb2RlbCIKK2FjX2N2X2xvbmdfZGF0YV9tb2RlbD0iJGFjX2N2X2xvbmdfZGF0YV9tb2RlbCIKK2FjX2N2X3R5cGVfaW50X2xlYXN0MzJfdD0iJGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIKK2FjX2N2X3R5cGVfaW50X2Zhc3QzMl90PSIkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiCithY19jdl90eXBlX2ludG1heF90PSIkYWNfY3ZfdHlwZV9pbnRtYXhfdCIKKworCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorCisjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cworZG8KKyAgY2FzZSAkYWNfY29uZmlnX3RhcmdldCBpbgorICAgICJjb25maWcuaCIpIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgY29uZmlnLmgiIDs7CisgICAgImRlcGZpbGVzIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OworICAgICIkYWNfc3RkaW50X2giKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgJGFjX3N0ZGludF9oIiA7OworICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgICAiY29tcGF0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNvbXBhdC9NYWtlZmlsZSIgOzsKKyAgICAiZG9jL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRvYy9NYWtlZmlsZSIgOzsKKyAgICAiaW5jbHVkZS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpbmNsdWRlL01ha2VmaWxlIiA7OworICAgICJzcmMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc3JjL01ha2VmaWxlIiA7OworICAgICJtYW4vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbWFuL01ha2VmaWxlIiA7OworCisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDU7OworICBlc2FjCitkb25lCisKKworIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKKyAgdGVzdCAiJHtDT05GSUdfQ09NTUFORFMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0NPTU1BTkRTPSRjb25maWdfY29tbWFuZHMKK2ZpCisKKyMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAorIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgorIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCiskZGVidWcgfHwKK3sKKyAgdG1wPSBhY190bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIDogIiR7YWNfdG1wOj0kdG1wfSIKKyAgeyB0ZXN0ICEgLWQgIiRhY190bXAiIHx8IHJtIC1mciAiJGFjX3RtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorICB0cmFwICdhc19mbl9leGl0IDEnIDEgMiAxMyAxNQorfQorIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKK30gfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iICIkTElORU5PIiA1CithY190bXA9JHRtcAorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCisKK2FjX2NyPWBlY2hvIFggfCB0ciBYICdcMDE1J2AKKyMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KKyMgQnV0IHdlIGtub3cgb2Ygbm8gb3RoZXIgc2hlbGwgd2hlcmUgYWNfY3Igd291bGQgYmUgZW1wdHkgYXQgdGhpcworIyBwb2ludCwgc28gd2UgY2FuIHVzZSBhIGJhc2hpc20gYXMgYSBmYWxsYmFjay4KK2lmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgorICBldmFsIGFjX2NyPVwkXCdcXHJcJworZmkKK2FjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisgIGFjX2NzX2F3a19jcj0nXFxyJworZWxzZQorICBhY19jc19hd2tfY3I9JGFjX2NyCitmaQorCitlY2hvICdCRUdJTiB7JyA+IiRhY190bXAvc3ViczEuYXdrIiAmJgorX0FDRU9GCisKKworeworICBlY2hvICJjYXQgPmNvbmYkJHN1YnMuYXdrIDw8X0FDRU9GIiAmJgorICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCisgIGVjaG8gIl9BQ0VPRiIKK30gPmNvbmYkJHN1YnMuc2ggfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICdeJ2AKK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KKyAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisKKyAgYWNfZGVsaW1fbj1gc2VkIC1uICJzLy4qJGFjX2RlbGltXCQvWC9wIiBjb25mJCRzdWJzLmF3ayB8IGdyZXAgLWMgWGAKKyAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCitybSAtZiBjb25mJCRzdWJzLnNoCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgorX0FDRU9GCitzZWQgLW4gJworaAorcy9eL1NbIi87IHMvIS4qLyJdPS8KK3AKK2cKK3MvXlteIV0qIS8vCis6cmVwbAordCByZXBsCitzLyciJGFjX2RlbGltIickLy8KK3QgZGVsaW0KKzpubAoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCitwCituCitiIHJlcGwKKzptb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IG5sCis6ZGVsaW0KK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KK3AKK2IKKzptb3JlMgorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworcAorZworcy8uXHsxNDhcfS8vCit0IGRlbGltCisnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCisvXlteIiJdL3sKKyAgTgorICBzL1xuLy8KK30KKycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKK3JtIC1mIGNvbmYkJHN1YnMuYXdrCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0FXSworY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKyAgRlMgPSAiByIKKworfQoreworICBsaW5lID0gJCAwCisgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorICBzdWJzdGVkID0gMAorICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCisgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKyAgICBrZXkgPSBmaWVsZFtpXQorICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCisgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKyAgICAgIHZhbHVlID0gU1trZXldCisgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCisgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorICAgICAgc3Vic3RlZCA9IDEKKyAgICB9IGVsc2UKKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisgIH0KKworICBwcmludCBsaW5lCit9CisKK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2VkICJzLyRhY19jclwkLy87IHMvJGFjX2NyLyRhY19jc19hd2tfY3IvZyIKK2Vsc2UKKyAgY2F0CitmaSA8ICIkYWNfdG1wL3N1YnMxLmF3ayIgPiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiICIkTElORU5PIiA1CitfQUNFT0YKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSBzb2xlICQoc3JjZGlyKSwKKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBlbnRyaWVzIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5CisjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9WwkgXSoveworaAorcy8vLworcy9eLzovCitzL1sJIF0qJC86Lworcy86XCQoc3JjZGlyKTovOi9nCitzLzpcJHtzcmNkaXJ9Oi86L2cKK3MvOkBzcmNkaXJAOi86L2cKK3MvXjoqLy8KK3MvOiokLy8KK3gKK3MvXCg9WwkgXSpcKS4qL1wxLworRworcy9cbi8vCitzL15bXj1dKj1bCSBdKiQvLworfScKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19IRUFERVJTIHNlY3Rpb24uCisjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIE1ha2VmaWxlJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfSEVBREVSUyI7IHRoZW4KK2NhdCA+IiRhY190bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAorQkVHSU4geworX0FDRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCisjIGhlcmUtZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCisKKyMgQ3JlYXRlIGEgZGVsaW1pdGVyIHN0cmluZyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIGNvbmZkZWZzLmgsIHRvIGVhc2UKKyMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgOjsgZG8KKyAgYWNfdHQ9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorICBpZiB0ZXN0IC16ICIkYWNfdHQiOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19IRUFERVJTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKKworIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisjIGxpa2V3aXNlIFAgY29udGFpbnMgbWFjcm8gcGFyYW1ldGVycyBpZiBhbnkuICBQcmVzZXJ2ZSBiYWNrc2xhc2gKKyMgbmV3bGluZSBzZXF1ZW5jZXMuCisKK2FjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCitzZWQgLW4gJworcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IHJzZXQKKzpyc2V0CitzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLwordCBkZWYKK2QKKzpkZWYKK3MvXFwkLy8KK3QgYnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDMiL3AKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCitkCis6YnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDNcXFxcXFxuIlxcL3AKK3QgY29udAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDJcXFxcXFxuIlxcL3AKK3QgY29udAorZAorOmNvbnQKK24KK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCBjbGVhcgorOmNsZWFyCitzL1xcJC8vCit0IGJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iL3AKK2QKKzpic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxcXFxcbiJcXC9wCitiIGNvbnQKKycgPGNvbmZkZWZzLmggfCBzZWQgJworcy8nIiRhY19kZWxpbSInLyJcXFwKKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCit9CisvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKyAgbGluZSA9IFwkIDAKKyAgc3BsaXQobGluZSwgYXJnLCAiICIpCisgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisgICAgZGVmdW5kZWYgPSBhcmdbMl0KKyAgICBtYWMxID0gYXJnWzNdCisgIH0gZWxzZSB7CisgICAgZGVmdW5kZWYgPSBzdWJzdHIoYXJnWzFdLCAyKQorICAgIG1hYzEgPSBhcmdbMl0KKyAgfQorICBzcGxpdChtYWMxLCBtYWMyLCAiKCIpICMpCisgIG1hY3JvID0gbWFjMlsxXQorICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKyAgaWYgKERfaXNfc2V0W21hY3JvXSkgeworICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCisgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorICAgIG5leHQKKyAgfSBlbHNlIHsKKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisgICAgIyBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisgICAgICBwcmludCAiLyoiLCBwcmVmaXggZGVmdW5kZWYsIG1hY3JvLCAiKi8iCisgICAgICBuZXh0CisgICAgfQorICB9Cit9Cit7IHByaW50IH0KK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGhlYWRlcnMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisKKworZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUyIKK3NoaWZ0Citmb3IgYWNfdGFnCitkbworICBjYXNlICRhY190YWcgaW4KKyAgOltGSExDXSkgYWNfbW9kZT0kYWNfdGFnOyBjb250aW51ZTs7CisgIGVzYWMKKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KKyAgOltGSExdKjoqKTs7CisgIDpMKiB8IDpDKjoqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB0YWcgXGAkYWNfdGFnJyIgIiRMSU5FTk8iIDU7OworICA6W0ZIXS0pIGFjX3RhZz0tOi07OworICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OworICBlc2FjCisgIGFjX3NhdmVfSUZTPSRJRlMKKyAgSUZTPToKKyAgc2V0IHggJGFjX3RhZworICBJRlM9JGFjX3NhdmVfSUZTCisgIHNoaWZ0CisgIGFjX2ZpbGU9JDEKKyAgc2hpZnQKKworICBjYXNlICRhY19tb2RlIGluCisgIDpMKSBhY19zb3VyY2U9JDE7OworICA6W0ZIXSkKKyAgICBhY19maWxlX2lucHV0cz0KKyAgICBmb3IgYWNfZgorICAgIGRvCisgICAgICBjYXNlICRhY19mIGluCisgICAgICAtKSBhY19mPSIkYWNfdG1wL3N0ZGluIjs7CisgICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQorCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKwkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KKwkgdGVzdCAtZiAiJGFjX2YiIHx8CisJICAgY2FzZSAkYWNfZiBpbgorCSAgIFtcXC8kXSopIGZhbHNlOzsKKwkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7CisJICAgZXNhYyB8fAorCSAgIGFzX2ZuX2Vycm9yIDEgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNTs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCisgICAgICBhc19mbl9hcHBlbmQgYWNfZmlsZV9pbnB1dHMgIiAnJGFjX2YnIgorICAgIGRvbmUKKworICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorCSAgJGFzX2VjaG8gIiQqIiB8IHNlZCAnc3xeW146XSovfHw7c3w6W146XSovfCwgfGcnCisJYCcgYnkgY29uZmlndXJlLicKKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgJGNvbmZpZ3VyZV9pbnB1dCIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgZmkKKyAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgorICAgIGNhc2UgJGNvbmZpZ3VyZV9pbnB1dCBpbiAjKAorICAgICpcJiogfCAqXHwqIHwgKlxcKiApCisgICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8CisgICAgICAgc2VkICdzL1tcXFxcJnxdL1xcXFwmL2cnYDs7ICMoCisgICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7CisgICAgZXNhYworCisgICAgY2FzZSAkYWNfdGFnIGluCisgICAgKjotOiogfCAqOi0pIGNhdCA+IiRhY190bXAvc3RkaW4iIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNSA7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisKKyAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCisgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKworICBjYXNlICRhY19tb2RlIGluCisgIDpGKQorICAjCisgICMgQ09ORklHX0ZJTEUKKyAgIworCisgIGNhc2UgJElOU1RBTEwgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRfcHJlZml4JElOU1RBTEwgOzsKKyAgZXNhYworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KKyMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgorYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49CithY19zZWRfZGF0YXJvb3Q9JworL2RhdGFyb290ZGlyLyB7CisgIHAKKyAgcQorfQorL0BkYXRhZGlyQC9wCisvQGRvY2RpckAvcAorL0BpbmZvZGlyQC9wCisvQGxvY2FsZWRpckAvcAorL0BtYW5kaXJAL3AnCitjYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCisqZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7CisqQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjI7fQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCisgIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKKyAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKKyAgcyZAaW5mb2RpckAmJGluZm9kaXImZworICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZworICBzJkBtYW5kaXJAJiRtYW5kaXImZworICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworZXNhYworX0FDRU9GCisKKyMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KKyMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgorIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19zZWRfZXh0cmE9IiRhY192cHN1YgorJGV4dHJhc3ViCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0CitzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKK3MmQHRvcF9idWlsZF9wcmVmaXhAJiRhY190b3BfYnVpbGRfcHJlZml4Jjt0IHQKK3MmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0CitzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0CitzJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0CitzJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKK3MmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKK3MmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKK3MmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKKyRhY19kYXRhcm9vdGRpcl9oYWNrCisiCitldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIiBcCisgID4kYWNfdG1wL291dCB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKwordGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJGFjX3RtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgXAorICAgICAgIiRhY190bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCit3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCit3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQiID4mMjt9CisKKyAgcm0gLWYgIiRhY190bXAvc3RkaW4iCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSkgY2F0ICIkYWNfdG1wL291dCIgJiYgcm0gLWYgIiRhY190bXAvb3V0Ijs7CisgICopIHJtIC1mICIkYWNfZmlsZSIgJiYgbXYgIiRhY190bXAvb3V0IiAiJGFjX2ZpbGUiOzsKKyAgZXNhYyBcCisgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorIDs7CisgIDpIKQorICAjCisgICMgQ09ORklHX0hFQURFUgorICAjCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7CisgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiRhY190bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgorICAgIH0gPiIkYWNfdG1wL2NvbmZpZy5oIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiRhY190bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgICAgIG12ICIkYWNfdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKwl8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgLSIgIiRMSU5FTk8iIDUKKyAgZmkKKyMgQ29tcHV0ZSAiJGFjX2ZpbGUiJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgorX2FtX3N0YW1wX2NvdW50PTEKK2ZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbworICBjYXNlICRfYW1faGVhZGVyIGluCisgICAgIiRhY19maWxlIiB8ICIkYWNfZmlsZSI6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICIkYWNfZmlsZSIiID5gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKKyA7OworICAKKyAgOkMpICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHMiID4mNjt9CisgOzsKKyAgZXNhYworCisKKyAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCisgICAgImRlcGZpbGVzIjpDKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgIyBTbyBsZXQncyBncmVwIHdob2xlIGZpbGUuCisgIGlmIGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnICRtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgZGlycGFydD1gJGFzX2Rpcm5hbWUgLS0gIiRtZiIgfHwKKyRhc19leHByIFgiJG1mIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRtZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJG1mIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgZWxzZQorICAgIGNvbnRpbnVlCisgIGZpCisgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICMgZnJvbSB0aGUgTWFrZWZpbGUgd2l0aG91dCBydW5uaW5nIGBtYWtlJy4KKyAgREVQRElSPWBzZWQgLW4gJ3MvXkRFUERJUiA9IC8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgYW1fX2luY2x1ZGU9YHNlZCAtbiAncy9eYW1fX2luY2x1ZGUgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogImFtX19pbmNsdWRlIiAmJiBjb250aW51ZQorICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAjIFdoZW4gdXNpbmcgYW5zaTJrbnIsIFUgbWF5IGJlIGVtcHR5IG9yIGFuIHVuZGVyc2NvcmU7IGV4cGFuZCBpdAorICBVPWBzZWQgLW4gJ3MvXlUgPSAvL3AnIDwgIiRtZiJgCisgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgIyAkKERFUERJUikgaW4gdGhlaXIgbmFtZXMuICBXZSBpbnZva2Ugc2VkIHR3aWNlIGJlY2F1c2UgaXQgaXMgdGhlCisgICMgc2ltcGxlc3QgYXBwcm9hY2ggdG8gY2hhbmdpbmcgJChERVBESVIpIHRvIGl0cyBhY3R1YWwgdmFsdWUgaW4gdGhlCisgICMgZXhwYW5zaW9uLgorICBmb3IgZmlsZSBpbiBgc2VkIC1uICIKKyAgICBzL14kYW1fX2luY2x1ZGUgJGFtX19xdW90ZVwoLiooREVQRElSKS4qXCkkYW1fX3F1b3RlIickL1wxL3AnIDwiJG1mIiB8IFwKKyAgICAgICBzZWQgLWUgJ3MvXCQoREVQRElSKS8nIiRERVBESVIiJy9nJyAtZSAncy9cJFUvJyIkVSInL2cnYDsgZG8KKyAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICBmZGlyPWAkYXNfZGlybmFtZSAtLSAiJGZpbGUiIHx8CiskYXNfZXhwciBYIiRmaWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRmaWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgIGFzX2Rpcj0kZGlycGFydC8kZmRpcjsgYXNfZm5fbWtkaXJfcAorICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgIGRvbmUKK2RvbmUKKyA7OworICAgICIkYWNfc3RkaW50X2giOkMpIAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19zdGRpbnRfaCA6ICRfYWNfc3RkaW50X2giID4mNjt9CithY19zdGRpbnQ9JHRtcC9fc3RkaW50LmgKKworZWNobyAiI2lmbmRlZiIgJF9hY19zdGRpbnRfaCA+JGFjX3N0ZGludAorZWNobyAiI2RlZmluZSIgJF9hY19zdGRpbnRfaCAiMSIgPj4kYWNfc3RkaW50CitlY2hvICIjaWZuZGVmIiBfR0VORVJBVEVEX1NURElOVF9IID4+JGFjX3N0ZGludAorZWNobyAiI2RlZmluZSIgX0dFTkVSQVRFRF9TVERJTlRfSCAnIickUEFDS0FHRSAkVkVSU0lPTiciJyA+PiRhY19zdGRpbnQKK2VjaG8gIi8qIGdlbmVyYXRlZCAkYWNfY3Zfc3RkaW50X21lc3NhZ2UgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3QiICE9ICJfIiA7IHRoZW4KK2VjaG8gIiNkZWZpbmUgX1NURElOVF9IQVZFX1NURElOVF9IIiAiMSIgPj4kYWNfc3RkaW50CitlY2hvICIjaW5jbHVkZSA8c3RkaW50Lmg+IiA+PiRhY19zdGRpbnQKK2VjaG8gIiNlbmRpZiIgPj4kYWNfc3RkaW50CitlY2hvICIjZW5kaWYiID4+JGFjX3N0ZGludAorZWxzZQorCitjYXQgPj4kYWNfc3RkaW50IDw8U1RESU5UX0VPRgorCisvKiAuLi4uLi4uLi4uLi4uLi4uLi4uIHNob3J0Y2lyY3VpdCBwYXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCisjaWYgZGVmaW5lZCBIQVZFX1NURElOVF9IIHx8IGRlZmluZWQgX1NURElOVF9IQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLiBjb25maWd1cmVkIHBhcnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCitTVERJTlRfRU9GCisKK2VjaG8gIi8qIHdoZXRoZXIgd2UgaGF2ZSBhIEM5OSBjb21wYXRpYmxlIHN0ZGludCBoZWFkZXIgZmlsZSAqLyIgPj4kYWNfc3RkaW50CitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgIT0gIl8iIDsgdGhlbgorICBhY19oZWFkZXI9IiRhY19jdl9oZWFkZXJfc3RkaW50X3giCisgIGVjaG8gIiNkZWZpbmUgX1NURElOVF9IRUFERVJfSU5UUFRSIiAnIiciJGFjX2hlYWRlciInIicgPj4kYWNfc3RkaW50CitlbHNlCisgIGVjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hFQURFUl9JTlRQVFIgKi8iID4+JGFjX3N0ZGludAorZmkKKworZWNobyAiLyogd2hldGhlciB3ZSBoYXZlIGEgQzk2IGNvbXBhdGlibGUgaW50dHlwZXMgaGVhZGVyIGZpbGUgKi8iID4+JGFjX3N0ZGludAoraWYgIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF9vIiAhPSAiXyIgOyB0aGVuCisgIGFjX2hlYWRlcj0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIKKyAgZWNobyAiI2RlZmluZSBfU1RESU5UX0hFQURFUl9VSU5UMzIiICciJyIkYWNfaGVhZGVyIiciJyA+PiRhY19zdGRpbnQKK2Vsc2UKKyAgZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEVBREVSX1VJTlQzMiAqLyIgPj4kYWNfc3RkaW50CitmaQorCitlY2hvICIvKiB3aGV0aGVyIHdlIGhhdmUgYSBCU0QgY29tcGF0aWJsZSBpbmV0IHR5cGVzIGhlYWRlciAqLyIgPj4kYWNfc3RkaW50CitpZiAgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJfIiA7IHRoZW4KKyAgYWNfaGVhZGVyPSIkYWNfY3ZfaGVhZGVyX3N0ZGludF91IgorICBlY2hvICIjZGVmaW5lIF9TVERJTlRfSEVBREVSX1VfSU5UMzIiICciJyIkYWNfaGVhZGVyIiciJyA+PiRhY19zdGRpbnQKK2Vsc2UKKyAgZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEVBREVSX1VfSU5UMzIgKi8iID4+JGFjX3N0ZGludAorZmkKKworZWNobyAiIiA+PiRhY19zdGRpbnQKKworaWYgdGVzdCAiXyRhY19oZWFkZXIiICE9ICJfIiA7IHRoZW4gaWYgdGVzdCAiJGFjX2hlYWRlciIgIT0gInN0ZGRlZi5oIiA7IHRoZW4KKyAgZWNobyAiI2luY2x1ZGUgPCRhY19oZWFkZXI+IiA+PiRhY19zdGRpbnQKKyAgZWNobyAiIiA+PiRhY19zdGRpbnQKK2ZpIGZpCisKK2VjaG8gIi8qIHdoaWNoIDY0Yml0IHR5cGVkZWYgaGFzIGJlZW4gZm91bmQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiJGFjX2N2X3R5cGVfdWludDY0X3QiID0gInllcyIgOyB0aGVuCitlY2hvICIjZGVmaW5lICAgX1NURElOVF9IQVZFX1VJTlQ2NF9UIiAiMSIgID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9VSU5UNjRfVCAqLyIgPj4kYWNfc3RkaW50CitmaQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfdV9pbnQ2NF90IiA9ICJ5ZXMiIDsgdGhlbgorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfSEFWRV9VX0lOVDY0X1QiICIxIiAgPj4kYWNfc3RkaW50CitlbHNlCitlY2hvICIvKiAjdW5kZWYgX1NURElOVF9IQVZFX1VfSU5UNjRfVCAqLyIgPj4kYWNfc3RkaW50CitmaQorZWNobyAiIiA+PiRhY19zdGRpbnQKKworZWNobyAiLyogd2hpY2ggdHlwZSBtb2RlbCBoYXMgYmVlbiBkZXRlY3RlZCAqLyIgPj4kYWNfc3RkaW50CitpZiB0ZXN0ICJfJGFjX2N2X2NoYXJfZGF0YV9tb2RlbCIgIT0gIl8iIDsgdGhlbgorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfQ0hBUl9NT0RFTCIgIiRhY19jdl9jaGFyX2RhdGFfbW9kZWwiID4+JGFjX3N0ZGludAorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfTE9OR19NT0RFTCIgIiRhY19jdl9sb25nX2RhdGFfbW9kZWwiID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfQ0hBUl9NT0RFTCAvLyBza2lwcGVkICovIiA+PiRhY19zdGRpbnQKK2VjaG8gIi8qICN1bmRlZiBfU1RESU5UX0xPTkdfTU9ERUwgLy8gc2tpcHBlZCAqLyIgPj4kYWNfc3RkaW50CitmaQorZWNobyAiIiA+PiRhY19zdGRpbnQKKworZWNobyAiLyogd2hldGhlciBpbnRfbGVhc3QgdHlwZXMgd2VyZSBkZXRlY3RlZCAqLyIgPj4kYWNfc3RkaW50CitpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90IiA9ICJ5ZXMiOyB0aGVuCitlY2hvICIjZGVmaW5lICAgX1NURElOVF9IQVZFX0lOVF9MRUFTVDMyX1QiICIxIiAgPj4kYWNfc3RkaW50CitlbHNlCitlY2hvICIvKiAjdW5kZWYgX1NURElOVF9IQVZFX0lOVF9MRUFTVDMyX1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIi8qIHdoZXRoZXIgaW50X2Zhc3QgdHlwZXMgd2VyZSBkZXRlY3RlZCAqLyIgPj4kYWNfc3RkaW50CitpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiID0gInllcyI7IHRoZW4KK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0hBVkVfSU5UX0ZBU1QzMl9UIiAiMSIgPj4kYWNfc3RkaW50CitlbHNlCitlY2hvICIvKiAjdW5kZWYgX1NURElOVF9IQVZFX0lOVF9GQVNUMzJfVCAqLyIgPj4kYWNfc3RkaW50CitmaQorZWNobyAiLyogd2hldGhlciBpbnRtYXhfdCB0eXBlIHdhcyBkZXRlY3RlZCAqLyIgPj4kYWNfc3RkaW50CitpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnRtYXhfdCIgPSAieWVzIjsgdGhlbgorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfSEFWRV9JTlRNQVhfVCIgIjEiID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9JTlRNQVhfVCAqLyIgPj4kYWNfc3RkaW50CitmaQorZWNobyAiIiA+PiRhY19zdGRpbnQKKworICBjYXQgPj4kYWNfc3RkaW50IDw8U1RESU5UX0VPRgorLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4gZGV0ZWN0aW9ucyBwYXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworLyogd2hldGhlciB3ZSBuZWVkIHRvIGRlZmluZSBiaXRzcGVjaWZpYyB0eXBlcyBmcm9tIGNvbXBpbGVyIGJhc2UgdHlwZXMgKi8KKyNpZm5kZWYgX1NURElOVF9IRUFERVJfSU5UUFRSCisjaWZuZGVmIF9TVERJTlRfSEVBREVSX1VJTlQzMgorI2lmbmRlZiBfU1RESU5UX0hFQURFUl9VX0lOVDMyCisjZGVmaW5lIF9TVERJTlRfTkVFRF9JTlRfTU9ERUxfVAorI2Vsc2UKKyNkZWZpbmUgX1NURElOVF9IQVZFX1VfSU5UX1RZUEVTCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfU1RESU5UX0hBVkVfVV9JTlRfVFlQRVMKKyN1bmRlZiBfU1RESU5UX05FRURfSU5UX01PREVMX1QKKyNlbmRpZgorCisjaWZkZWYgIF9TVERJTlRfQ0hBUl9NT0RFTAorI2lmICAgICBfU1RESU5UX0NIQVJfTU9ERUwrMCA9PSAxMjIgfHwgX1NURElOVF9DSEFSX01PREVMKzAgPT0gMTI0CisjaWZuZGVmIF9TVERJTlRfQllURV9NT0RFTAorI2RlZmluZSBfU1RESU5UX0JZVEVfTU9ERUwgMTIKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfU1RESU5UX0hBVkVfSU5UX0xFQVNUMzJfVAorI2RlZmluZSBfU1RESU5UX05FRURfSU5UX0xFQVNUX1QKKyNlbmRpZgorCisjaWZuZGVmIF9TVERJTlRfSEFWRV9JTlRfRkFTVDMyX1QKKyNkZWZpbmUgX1NURElOVF9ORUVEX0lOVF9GQVNUX1QKKyNlbmRpZgorCisjaWZuZGVmIF9TVERJTlRfSEVBREVSX0lOVFBUUgorI2RlZmluZSBfU1RESU5UX05FRURfSU5UUFRSX1QKKyNpZm5kZWYgX1NURElOVF9IQVZFX0lOVE1BWF9UCisjZGVmaW5lIF9TVERJTlRfTkVFRF9JTlRNQVhfVAorI2VuZGlmCisjZW5kaWYKKworCisvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLiBkZWZpbml0aW9uIHBhcnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCisvKiBzb21lIHN5c3RlbSBoZWFkZXJzIGhhdmUgZ29vZCB1aW50NjRfdCAqLworI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAorI2lmICAgICBkZWZpbmVkIF9TVERJTlRfSEFWRV9VSU5UNjRfVCAgfHwgZGVmaW5lZCBIQVZFX1VJTlQ2NF9UCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCisjZWxpZiAgIGRlZmluZWQgX1NURElOVF9IQVZFX1VfSU5UNjRfVCB8fCBkZWZpbmVkIEhBVkVfVV9JTlQ2NF9UCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCit0eXBlZGVmIHVfaW50NjRfdCB1aW50NjRfdDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKKy8qIC4uIGhlcmUgYXJlIHNvbWUgY29tbW9uIGhldXJpc3RpY3MgdXNpbmcgY29tcGlsZXIgcnVudGltZSBzcGVjaWZpY3MgKi8KKyNpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKKyNkZWZpbmUgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKK3R5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKworI2VsaWYgIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fV0FUQ09NQ19fIHx8IGRlZmluZWQgX19CT1JMQU5EQ19fCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCit0eXBlZGVmIF9faW50NjQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjRfdDsKKworI2VsaWYgZGVmaW5lZCBfX0dOVUNfXyB8fCBkZWZpbmVkIF9fTVdFUktTX18gfHwgZGVmaW5lZCBfX0VMRl9fCisvKiBub3RlOiBhbGwgRUxGLXN5c3RlbXMgc2VlbSB0byBoYXZlIGxvZmYtc3VwcG9ydCB3aGljaCBuZWVkcyA2NC1iaXQgKi8KKyNpZiAhZGVmaW5lZCBfTk9fTE9OR0xPTkcKKyNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKKyNkZWZpbmUgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKK3R5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkIF9fYWxwaGEgfHwgKGRlZmluZWQgX19taXBzICYmIGRlZmluZWQgX0FCSU4zMikKKyNpZiAhZGVmaW5lZCBfTk9fTE9OR0xPTkcKK3R5cGVkZWYgbG9uZyBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OworI2VuZGlmCisgIC8qIGNvbXBpbGVyL2NwdSB0eXBlIHRvIGRlZmluZSBpbnQ2NF90ICovCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9TVERJTlRfSEFWRV9VX0lOVF9UWVBFUworLyogaW50OF90IGludDE2X3QgaW50MzJfdCBkZWZpbmVkIGJ5IGluZXQgY29kZSwgcmVkZWNsYXJlIHRoZSB1X2ludFhYIHR5cGVzICovCit0eXBlZGVmIHVfaW50OF90IHVpbnQ4X3Q7Cit0eXBlZGVmIHVfaW50MTZfdCB1aW50MTZfdDsKK3R5cGVkZWYgdV9pbnQzMl90IHVpbnQzMl90OworCisvKiBnbGliYyBjb21wYXRpYmlsaXR5ICovCisjaWZuZGVmIF9faW50OF90X2RlZmluZWQKKyNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9TVERJTlRfTkVFRF9JTlRfTU9ERUxfVAorLyogd2UgbXVzdCBndWVzcyBhbGwgdGhlIGJhc2ljIHR5cGVzLiBBcGFydCBmcm9tIGJ5dGUtYWRyZXNzYWJsZSBzeXN0ZW0sICovCisvKiB0aGVyZSBhIGZldyAzMi1iaXQtb25seSBkc3Atc3lzdGVtcyB0aGF0IHdlIGd1YXJkIHdpdGggQllURV9NT0RFTCA4LX0gKi8KKy8qIChidHcsIHRob3NlIG5pYmJsZS1hZGRyZXNzYWJsZSBzeXN0ZW1zIGFyZSB3YXkgb2ZmLCBvciBzbyB3ZSBhc3N1bWUpICovCisKKworI2lmIGRlZmluZWQgX1NURElOVF9CWVRFX01PREVMCisjaWYgX1NURElOVF9MT05HX01PREVMKzAgPT0gMjQyCisvKiAyOjQ6MiA9ICBJUDE2ID0gYSBub3JtYWwgMTYtYml0IHN5c3RlbSAgICAgICAgICAgICAgICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWludDMyX3Q7CisjaWZuZGVmIF9faW50OF90X2RlZmluZWQKKyNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAordHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKK3R5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwordHlwZWRlZiAgICAgICAgICBsb25nICAgIGludDMyX3Q7CisjZW5kaWYKKyNlbGlmIF9TVERJTlRfTE9OR19NT0RFTCswID09IDI0NCB8fCBfU1RESU5UX0xPTkdfTU9ERUwgPT0gNDQ0CisvKiAyOjQ6NCA9ICBMUDMyID0gYSAzMi1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDE2LWJpdCAqLworLyogNDo0OjQgPSBJTFAzMiA9IGEgbm9ybWFsIDMyLWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Cit0eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKK3R5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OworI2VuZGlmCisjZWxpZiBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSA0ODQgfHwgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDg4CisvKiA0Ojg6NCA9ICBJUDMyID0gYSAzMi1iaXQgc3lzdGVtIHByZXBhcmVkIGZvciA2NC1iaXQgICAgKi8KKy8qIDQ6ODo4ID0gIExQNjQgPSBhIG5vcm1hbCA2NC1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHVpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdWludDMyX3Q7CisjaWZuZGVmIF9faW50OF90X2RlZmluZWQKKyNkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAordHlwZWRlZiAgICAgICAgICBjaGFyICAgIGludDhfdDsKK3R5cGVkZWYgICAgICAgICAgc2hvcnQgICBpbnQxNl90OwordHlwZWRlZiAgICAgICAgICBpbnQgICAgIGludDMyX3Q7CisjZW5kaWYKKy8qIHRoaXMgc3lzdGVtIGhhcyBhICJsb25nIiBvZiA2NGJpdCAqLworI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAorI2RlZmluZSBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgdWludDY0X3Q7Cit0eXBlZGVmICAgICAgICAgIGxvbmcgICAgaW50NjRfdDsKKyNlbmRpZgorI2VsaWYgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDQ4CisvKiAgICAgIExMUDY0ICAgYSA2NC1iaXQgc3lzdGVtIGRlcml2ZWQgZnJvbSBhIDMyLWJpdCBzeXN0ZW0gKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Cit0eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKK3R5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OworI2VuZGlmCisvKiBhc3N1bWluZyB0aGUgc3lzdGVtIGhhcyBhICJsb25nIGxvbmciICovCisjaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCisjZGVmaW5lIF9IQVZFX0xPTkdMT05HX1VJTlQ2NF9UCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKK3R5cGVkZWYgICAgICAgICAgbG9uZyBsb25nICBpbnQ2NF90OworI2VuZGlmCisjZWxzZQorI2RlZmluZSBfU1RESU5UX05PX0lOVDMyX1QKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX1NURElOVF9OT19JTlQ4X1QKKyNkZWZpbmUgX1NURElOVF9OT19JTlQzMl9UCisjZW5kaWYKKyNlbmRpZgorCisvKgorICogcXVvdGUgZnJvbSBTdW5PUy01Ljggc3lzL2ludHR5cGVzLmg6CisgKiBVc2UgYXQgeW91ciBvd24gcmlzay4gIEFzIG9mIEZlYnJ1YXJ5IDE5OTYsIHRoZSBjb21taXR0ZWUgaXMgc3F1YXJlbHkKKyAqIGJlaGluZCB0aGUgZml4ZWQgc2l6ZWQgdHlwZXM7IHRoZSAibGVhc3QiIGFuZCAiZmFzdCIgdHlwZXMgYXJlIHN0aWxsIGJlaW5nCisgKiBkaXNjdXNzZWQuICBUaGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgImZhc3QiIHR5cGVzIG1heSBiZSByZW1vdmVkIGJlZm9yZQorICogdGhlIHN0YW5kYXJkIGlzIGZpbmFsaXplZCBpcyBoaWdoIGVub3VnaCB0aGF0IHRoZXkgYXJlIG5vdCBjdXJyZW50bHkKKyAqIGltcGxlbWVudGVkLgorICovCisKKyNpZiBkZWZpbmVkIF9TVERJTlRfTkVFRF9JTlRfTEVBU1RfVAordHlwZWRlZiAgaW50OF90ICAgIGludF9sZWFzdDhfdDsKK3R5cGVkZWYgIGludDE2X3QgICBpbnRfbGVhc3QxNl90OwordHlwZWRlZiAgaW50MzJfdCAgIGludF9sZWFzdDMyX3Q7CisjaWZkZWYgX0hBVkVfVUlOVDY0X1QKK3R5cGVkZWYgIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OworI2VuZGlmCisKK3R5cGVkZWYgdWludDhfdCAgIHVpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIHVpbnQxNl90ICB1aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgIHVpbnRfbGVhc3QzMl90OworI2lmZGVmIF9IQVZFX1VJTlQ2NF9UCit0eXBlZGVmIHVpbnQ2NF90ICB1aW50X2xlYXN0NjRfdDsKKyNlbmRpZgorICAvKiBsZWFzdCB0eXBlcyAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9TVERJTlRfTkVFRF9JTlRfRkFTVF9UCit0eXBlZGVmICBpbnQ4X3QgICAgaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmICBpbnQgICAgICAgaW50X2Zhc3QxNl90OwordHlwZWRlZiAgaW50MzJfdCAgIGludF9mYXN0MzJfdDsKKyNpZmRlZiBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiAgaW50NjRfdCAgIGludF9mYXN0NjRfdDsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQ4X3QgICB1aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkICB1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1aW50MzJfdCAgdWludF9mYXN0MzJfdDsKKyNpZmRlZiBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiB1aW50NjRfdCAgdWludF9mYXN0NjRfdDsKKyNlbmRpZgorICAvKiBmYXN0IHR5cGVzICovCisjZW5kaWYKKworI2lmZGVmIF9TVERJTlRfTkVFRF9JTlRNQVhfVAorI2lmZGVmIF9IQVZFX1VJTlQ2NF9UCit0eXBlZGVmICBpbnQ2NF90ICAgICAgIGludG1heF90OwordHlwZWRlZiB1aW50NjRfdCAgICAgIHVpbnRtYXhfdDsKKyNlbHNlCit0eXBlZGVmICAgICAgICAgIGxvbmcgIGludG1heF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnRtYXhfdDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfU1RESU5UX05FRURfSU5UUFRSX1QKKyNpZm5kZWYgX19pbnRwdHJfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50cHRyX3RfZGVmaW5lZAorLyogd2UgZW5jb3VyYWdlIHVzaW5nICJsb25nIiB0byBzdG9yZSBwb2ludGVyIHZhbHVlcywgbmV2ZXIgdXNlICJpbnQiICEgKi8KKyNpZiAgIF9TVERJTlRfTE9OR19NT0RFTCswID09IDI0MiB8fCBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSA0ODQKK3R5cGVkZWYgIHVuc2luZ2VkIGludCAgIHVpbnRwdHJfdDsKK3R5cGVkZWYgICAgICAgICAgIGludCAgICBpbnRwdHJfdDsKKyNlbGlmIF9TVERJTlRfTE9OR19NT0RFTCswID09IDI0NCB8fCBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSA0NDQKK3R5cGVkZWYgIHVuc2lnbmVkIGxvbmcgIHVpbnRwdHJfdDsKK3R5cGVkZWYgICAgICAgICAgIGxvbmcgICBpbnRwdHJfdDsKKyNlbGlmIF9TVERJTlRfTE9OR19NT0RFTCswID09IDQ0OCAmJiBkZWZpbmVkIF9IQVZFX1VJTlQ2NF9UCit0eXBlZGVmICAgICAgICB1aW50NjRfdCB1aW50cHRyX3Q7Cit0eXBlZGVmICAgICAgICAgaW50NjRfdCAgaW50cHRyX3Q7CisjZWxzZSAvKiBtYXRjaGVzIHR5cGljYWwgc3lzdGVtIHR5cGVzIElMUDMyIGFuZCBMUDY0IC0gYnV0IG5vdCBJUDE2IG9yIExMUDY0ICovCit0eXBlZGVmICB1bnNpZ25lZCBsb25nICB1aW50cHRyX3Q7Cit0eXBlZGVmICAgICAgICAgICBsb25nICAgaW50cHRyX3Q7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBJU08gQzk5IHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IGluIEMrKyBpbXBsZW1lbnRhdGlvbnMgdGhlc2UKKyAgIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19TVERDX0NPTlNUQU5UX01BQ1JPUworI2lmbmRlZiBVSU5UMzJfQworCisvKiBTaWduZWQuICAqLworIyBkZWZpbmUgSU5UOF9DKGMpICAgICAgYworIyBkZWZpbmUgSU5UMTZfQyhjKSAgICAgYworIyBkZWZpbmUgSU5UMzJfQyhjKSAgICAgYworIyBpZmRlZiBfSEFWRV9MT05HTE9OR19VSU5UNjRfVAorIyAgZGVmaW5lIElOVDY0X0MoYykgICAgYyAjIyBMCisjIGVsc2UKKyMgIGRlZmluZSBJTlQ2NF9DKGMpICAgIGMgIyMgTEwKKyMgZW5kaWYKKworLyogVW5zaWduZWQuICAqLworIyBkZWZpbmUgVUlOVDhfQyhjKSAgICAgYyAjIyBVCisjIGRlZmluZSBVSU5UMTZfQyhjKSAgICBjICMjIFUKKyMgZGVmaW5lIFVJTlQzMl9DKGMpICAgIGMgIyMgVQorIyBpZmRlZiBfSEFWRV9MT05HTE9OR19VSU5UNjRfVAorIyAgZGVmaW5lIFVJTlQ2NF9DKGMpICAgYyAjIyBVTAorIyBlbHNlCisjICBkZWZpbmUgVUlOVDY0X0MoYykgICBjICMjIFVMTAorIyBlbmRpZgorCisvKiBNYXhpbWFsIHR5cGUuICAqLworIyBpZmRlZiBfSEFWRV9MT05HTE9OR19VSU5UNjRfVAorIyAgZGVmaW5lIElOVE1BWF9DKGMpICAgYyAjIyBMCisjICBkZWZpbmUgVUlOVE1BWF9DKGMpICBjICMjIFVMCisjIGVsc2UKKyMgIGRlZmluZSBJTlRNQVhfQyhjKSAgIGMgIyMgTEwKKyMgIGRlZmluZSBVSU5UTUFYX0MoYykgIGMgIyMgVUxMCisjIGVuZGlmCisKKyAgLyogbGl0ZXJhbG51bWJlcnMgKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qIFRoZXNlIGxpbWl0cyBhcmUgbWVyaWx5IHRob3NlIG9mIGEgdHdvIGNvbXBsZW1lbnQgYnl0ZS1vcmllbnRlZCBzeXN0ZW0gKi8KKworLyogTWluaW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyMgZGVmaW5lIElOVDE2X01JTiAgICAgICAgICAgICAgKC0zMjc2Ny0xKQorIyBkZWZpbmUgSU5UMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyMgZGVmaW5lIElOVDY0X01JTiAgICAgICAgICAgICAgKC1fX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNyktMSkKKy8qIE1heGltdW0gb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzLiAgKi8KKyMgZGVmaW5lIElOVDhfTUFYICAgICAgICAgICAgICAgKDEyNykKKyMgZGVmaW5lIElOVDE2X01BWCAgICAgICAgICAgICAgKDMyNzY3KQorIyBkZWZpbmUgSU5UMzJfTUFYICAgICAgICAgICAgICAoMjE0NzQ4MzY0NykKKyMgZGVmaW5lIElOVDY0X01BWCAgICAgICAgICAgICAgKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKworLyogTWF4aW11bSBvZiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4gICovCisjIGRlZmluZSBVSU5UOF9NQVggICAgICAgICAgICAgICgyNTUpCisjIGRlZmluZSBVSU5UMTZfTUFYICAgICAgICAgICAgICg2NTUzNSkKKyMgZGVmaW5lIFVJTlQzMl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVKQorIyBkZWZpbmUgVUlOVDY0X01BWCAgICAgICAgICAgICAoX19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCisKKy8qIE1pbmltdW0gb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBJTlRfTEVBU1Q4X01JTiAgICAgICAgIElOVDhfTUlOCisjIGRlZmluZSBJTlRfTEVBU1QxNl9NSU4gICAgICAgIElOVDE2X01JTgorIyBkZWZpbmUgSU5UX0xFQVNUMzJfTUlOICAgICAgICBJTlQzMl9NSU4KKyMgZGVmaW5lIElOVF9MRUFTVDY0X01JTiAgICAgICAgSU5UNjRfTUlOCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgSU5UX0xFQVNUOF9NQVggICAgICAgICBJTlQ4X01BWAorIyBkZWZpbmUgSU5UX0xFQVNUMTZfTUFYICAgICAgICBJTlQxNl9NQVgKKyMgZGVmaW5lIElOVF9MRUFTVDMyX01BWCAgICAgICAgSU5UMzJfTUFYCisjIGRlZmluZSBJTlRfTEVBU1Q2NF9NQVggICAgICAgIElOVDY0X01BWAorCisvKiBNYXhpbXVtIG9mIHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBVSU5UX0xFQVNUOF9NQVggICAgICAgIFVJTlQ4X01BWAorIyBkZWZpbmUgVUlOVF9MRUFTVDE2X01BWCAgICAgICBVSU5UMTZfTUFYCisjIGRlZmluZSBVSU5UX0xFQVNUMzJfTUFYICAgICAgIFVJTlQzMl9NQVgKKyMgZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVggICAgICAgVUlOVDY0X01BWAorCisgIC8qIHNob3J0Y2lyY3VpdCovCisjZW5kaWYKKyAgLyogb25jZSAqLworI2VuZGlmCisjZW5kaWYKK1NURElOVF9FT0YKK2ZpCisgICAgaWYgY21wIC1zICRhY19zdGRpbnRfaCAkYWNfc3RkaW50IDI+L2Rldi9udWxsOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19zdGRpbnRfaCBpcyB1bmNoYW5nZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogJGFjX3N0ZGludF9oIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfc3RkaW50X2giIHx8CiskYXNfZXhwciBYIiRhY19zdGRpbnRfaCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfc3RkaW50X2giIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX3N0ZGludF9oIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19zdGRpbnRfaCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19zdGRpbnRfaCIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICBhc19kaXI9IiRhY19kaXIiOyBhc19mbl9ta2Rpcl9wCisgICAgICBybSAtZiAkYWNfc3RkaW50X2gKKyAgICAgIG12ICRhY19zdGRpbnQgJGFjX3N0ZGludF9oCisgICAgZmkKKyA7OworCisgIGVzYWMKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0IDEKK2ZpCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KK2ZpCisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2F1dG9tNHRlLmNhY2hlL3JlcXVlc3RzIGIvaXBlcmYtMi4wLjUvYXV0b200dGUuY2FjaGUvcmVxdWVzdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiZGY4YwotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2F1dG9tNHRlLmNhY2hlL3JlcXVlc3RzCkBAIC0wLDAgKzEsNzggQEAKKyMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgQXV0b200dGUgVGh1IEFwciAxMCAxMDowNjo0MyBVVEMgMjAxNC4KKyMgSXQgY29udGFpbnMgdGhlIGxpc3RzIG9mIG1hY3JvcyB3aGljaCBoYXZlIGJlZW4gdHJhY2VkLgorIyBJdCBjYW4gYmUgc2FmZWx5IHJlbW92ZWQuCisKK0ByZXF1ZXN0ID0gKAorICAgICAgICAgICAgIGJsZXNzKCBbCisgICAgICAgICAgICAgICAgICAgICAgJzAnLAorICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgJy91c3Ivc2hhcmUvYXV0b2NvbmYnCisgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9zaGFyZS9hdXRvY29uZi9hdXRvY29uZi9hdXRvY29uZi5tNGYnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2FjbG9jYWwubTQnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZ3VyZS5hYycKKyAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdBTV9FTkFCTEVfTVVMVElMSUInID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnTFRfQ09ORklHX0xURExfRElSJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX1JFUVVJUkVfQVVYX0ZJTEUnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fTUFLRUZJTEVfSU5DTFVERScgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBSF9PVVRQVVQnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fTUFJTlRBSU5FUl9NT0RFJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NPTkZJR19TVUJESVJTJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NBTk9OSUNBTF9TWVNURU0nID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fQVVUT01BS0VfVkVSU0lPTicgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fU1VCU1RfTk9UTUFLRScgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBQ19TVUJTVF9UUkFDRScgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBQ19DT05GSUdfTElOS1MnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ09ORklHX0hFQURFUlMnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfU1VCU1QnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19DWFhfQ19PJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NBTk9OSUNBTF9UQVJHRVQnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ09ORklHX0xJQk9CSl9ESVInID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnbTRfcGF0dGVybl9mb3JiaWQnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZScgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBQ19QUk9HX0xJQlRPT0wnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfSU5JVCcgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdfTFRfQUNfVEFHQ09ORklHJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ19tNF93YXJuJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ200X2luY2x1ZGUnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19BUicgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QUk9HX0ZDX0NfTycgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBQ19GQ19TUkNFWFQnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19GNzdfQ19PJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9NQUtFRklMRV9JTkNMVURFJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NPTkZJR19BVVhfRElSJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ19BTV9DT05EX0lGJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ200X3NpbmNsdWRlJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1BBVEhfR1VJTEUnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fU0lMRU5UX1JVTEVTJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0NPTkZJR19GSUxFUycgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fQ09ORF9FTFNFJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0RFRklORV9UUkFDRV9MSVRFUkFMJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0NPTkRJVElPTkFMJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0xUX0lOSVQnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ0FOT05JQ0FMX0hPU1QnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfRkNfRlJFRUZPUk0nID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fUFJPR19NT0MnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fTkxTJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FDX0ZDX1BQX1NSQ0VYVCcgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBTV9QT1RfVE9PTFMnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQU1fR05VX0dFVFRFWFRfSU5UTF9TVUJESVInID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfTElCU09VUkNFJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0dOVV9HRVRURVhUJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX1BST0dfQ0NfQ19PJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0xUX1NVUFBPUlRFRF9UQUcnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnbTRfcGF0dGVybl9hbGxvdycgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzaW5jbHVkZScgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdfQU1fQ09ORF9FTkRJRicgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBTV9YR0VUVEVYVF9PUFRJT04nID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfRkNfUFBfREVGSU5FJyA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0FNX0lOSVRfQVVUT01BS0UnID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnQUNfQ0FOT05JQ0FMX0JVSUxEJyA9PiAxCisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBdLCAnQXV0b200dGU6OlJlcXVlc3QnICkKKyAgICAgICAgICAgKTsKKwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvYXV0b200dGUuY2FjaGUvdHJhY2VzLjAgYi9pcGVyZi0yLjAuNS9hdXRvbTR0ZS5jYWNoZS90cmFjZXMuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNlOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvYXV0b200dGUuY2FjaGUvdHJhY2VzLjAKQEAgLTAsMCArMSw5NzEgQEAKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19JTklUKFtJcGVyZl0sIFsyLjAuNV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15fP0FbQ0hVTV1fXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2ZvcmJpZChbX0FDX10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15MSUJPQkpTJF0sIFtkbyBub3QgdXNlIExJQk9CSlMgZGlyZWN0bHksIHVzZSBBQ19MSUJPQkogKHNlZSBzZWN0aW9uIGBBQ19MSUJPQkogdnMgTElCT0JKUyddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BU19GTEFHUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteXz9tNF9dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fZm9yYmlkKFteZG5sJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9mb3JiaWQoW15fP0FTX10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW1NIRUxMXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbU0hFTExdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TSEVMTCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtQQVRIX1NFUEFSQVRPUl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBVEhfU0VQQVJBVE9SXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFUSF9TRVBBUkFUT1IkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9OQU1FXSwgW200X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAgICAgIFsnQUNfUEFDS0FHRV9OQU1FJ10pXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbUEFDS0FHRV9OQU1FXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9OQU1FJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW1BBQ0tBR0VfVEFSTkFNRV0sIFttNF9pZmRlZihbQUNfUEFDS0FHRV9UQVJOQU1FXSwgICBbJ0FDX1BBQ0tBR0VfVEFSTkFNRSddKV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfVEFSTkFNRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfVEFSTkFNRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtQQUNLQUdFX1ZFUlNJT05dLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sICAgWydBQ19QQUNLQUdFX1ZFUlNJT04nXSldKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtQQUNLQUdFX1ZFUlNJT05dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1ZFUlNJT04kXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9TVFJJTkddLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfU1RSSU5HXSwgICAgWydBQ19QQUNLQUdFX1NUUklORyddKV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfU1RSSU5HXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9TVFJJTkckXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9CVUdSRVBPUlRdLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwgWydBQ19QQUNLQUdFX0JVR1JFUE9SVCddKV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfQlVHUkVQT1JUXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9CVUdSRVBPUlQkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbUEFDS0FHRV9VUkxdLCBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfVVJMXSwgICAgICAgWydBQ19QQUNLQUdFX1VSTCddKV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VfVVJMXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9VUkwkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbZXhlY19wcmVmaXhdLCBbTk9ORV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2V4ZWNfcHJlZml4XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZXhlY19wcmVmaXgkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbcHJlZml4XSwgW05PTkVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtwcmVmaXhdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wcmVmaXgkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZV0sIFtzLHgseCxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtecHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtiaW5kaXJdLCBbJyR7ZXhlY19wcmVmaXh9L2JpbiddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtiaW5kaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15iaW5kaXIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbc2JpbmRpcl0sIFsnJHtleGVjX3ByZWZpeH0vc2JpbiddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtzYmluZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtec2JpbmRpciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtsaWJleGVjZGlyXSwgWycke2V4ZWNfcHJlZml4fS9saWJleGVjJ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2xpYmV4ZWNkaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15saWJleGVjZGlyJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW2RhdGFyb290ZGlyXSwgWycke3ByZWZpeH0vc2hhcmUnXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbZGF0YXJvb3RkaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15kYXRhcm9vdGRpciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtkYXRhZGlyXSwgWycke2RhdGFyb290ZGlyfSddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtkYXRhZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZGF0YWRpciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtzeXNjb25mZGlyXSwgWycke3ByZWZpeH0vZXRjJ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW3N5c2NvbmZkaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15zeXNjb25mZGlyJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW3NoYXJlZHN0YXRlZGlyXSwgWycke3ByZWZpeH0vY29tJ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW3NoYXJlZHN0YXRlZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtec2hhcmVkc3RhdGVkaXIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbbG9jYWxzdGF0ZWRpcl0sIFsnJHtwcmVmaXh9L3ZhciddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtsb2NhbHN0YXRlZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtebG9jYWxzdGF0ZWRpciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtpbmNsdWRlZGlyXSwgWycke3ByZWZpeH0vaW5jbHVkZSddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtpbmNsdWRlZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaW5jbHVkZWRpciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtvbGRpbmNsdWRlZGlyXSwgWycvdXNyL2luY2x1ZGUnXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbb2xkaW5jbHVkZWRpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXm9sZGluY2x1ZGVkaXIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbZG9jZGlyXSwgW200X2lmc2V0KFtBQ19QQUNLQUdFX1RBUk5BTUVdLAorCQkJCSAgICAgWycke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9J10sCisJCQkJICAgICBbJyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0V9J10pXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbZG9jZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZG9jZGlyJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW2luZm9kaXJdLCBbJyR7ZGF0YXJvb3RkaXJ9L2luZm8nXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbaW5mb2Rpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmluZm9kaXIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbaHRtbGRpcl0sIFsnJHtkb2NkaXJ9J10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2h0bWxkaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15odG1sZGlyJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW2R2aWRpcl0sIFsnJHtkb2NkaXJ9J10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2R2aWRpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmR2aWRpciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtwZGZkaXJdLCBbJyR7ZG9jZGlyfSddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtwZGZkaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15wZGZkaXIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbcHNkaXJdLCBbJyR7ZG9jZGlyfSddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtwc2Rpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnBzZGlyJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW2xpYmRpcl0sIFsnJHtleGVjX3ByZWZpeH0vbGliJ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2xpYmRpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmxpYmRpciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtsb2NhbGVkaXJdLCBbJyR7ZGF0YXJvb3RkaXJ9L2xvY2FsZSddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtsb2NhbGVkaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15sb2NhbGVkaXIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbbWFuZGlyXSwgWycke2RhdGFyb290ZGlyfS9tYW4nXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbbWFuZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtebWFuZGlyJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1BBQ0tBR0VfTkFNRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfTkFNRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFIX09VVFBVVChbUEFDS0FHRV9OQU1FXSwgWy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KK0AlOkB1bmRlZiBQQUNLQUdFX05BTUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtQQUNLQUdFX1RBUk5BTUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QQUNLQUdFX1RBUk5BTUUkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBSF9PVVRQVVQoW1BBQ0tBR0VfVEFSTkFNRV0sIFsvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCitAJTpAdW5kZWYgUEFDS0FHRV9UQVJOQU1FXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbUEFDS0FHRV9WRVJTSU9OXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9WRVJTSU9OJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUhfT1VUUFVUKFtQQUNLQUdFX1ZFUlNJT05dLCBbLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KK0AlOkB1bmRlZiBQQUNLQUdFX1ZFUlNJT05dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtQQUNLQUdFX1NUUklOR10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfU1RSSU5HJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUhfT1VUUFVUKFtQQUNLQUdFX1NUUklOR10sIFsvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCitAJTpAdW5kZWYgUEFDS0FHRV9TVFJJTkddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtQQUNLQUdFX0JVR1JFUE9SVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBBQ0tBR0VfQlVHUkVQT1JUJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUhfT1VUUFVUKFtQQUNLQUdFX0JVR1JFUE9SVF0sIFsvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KK0AlOkB1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1BBQ0tBR0VfVVJMXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRV9VUkwkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBSF9PVVRQVVQoW1BBQ0tBR0VfVVJMXSwgWy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCitAJTpAdW5kZWYgUEFDS0FHRV9VUkxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtERUZTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbREVGU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkRFRlMkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbRUNIT19DXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbRUNIT19DXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteRUNIT19DJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW0VDSE9fTl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0VDSE9fTl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVDSE9fTiRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtFQ0hPX1RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtFQ0hPX1RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15FQ0hPX1QkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbTElCU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQlNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gQUNfU1VCU1QoW2J1aWxkX2FsaWFzXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbYnVpbGRfYWxpYXNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15idWlsZF9hbGlhcyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODogLTEtIEFDX1NVQlNUKFtob3N0X2FsaWFzXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbaG9zdF9hbGlhc10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3RfYWxpYXMkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVChbdGFyZ2V0X2FsaWFzXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBBQ19TVUJTVF9UUkFDRShbdGFyZ2V0X2FsaWFzXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtedGFyZ2V0X2FsaWFzJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo5OiAtMS0gQUNfQ09ORklHX0hFQURFUlMoW2NvbmZpZy5oXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQU1fSU5JVF9BVVRPTUFLRShbXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFNX0FVVE9NQUtFX1ZFUlNJT04oWzEuOS42XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfUkVRVUlSRV9BVVhfRklMRShbaW5zdGFsbC1zaF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFtJTlNUQUxMX1BST0dSQU1dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbSU5TVEFMTF9QUk9HUkFNXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfUFJPR1JBTSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVChbSU5TVEFMTF9TQ1JJUFRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbSU5TVEFMTF9TQ1JJUFRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSU5TVEFMTF9TQ1JJUFQkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1QoW0lOU1RBTExfREFUQV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtJTlNUQUxMX0RBVEFdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSU5TVEFMTF9EQVRBJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFtDWUdQQVRIX1ddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ1lHUEFUSF9XXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNZR1BBVEhfVyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19GT1JFQUNIJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE5NDogQUNfRk9SRUFDSCBpcyBleHBhbmRlZCBmcm9tLi4uCithY2xvY2FsLm00OjY2NjogX0FNX1NFVF9PUFRJT05TIGlzIGV4cGFuZGVkIGZyb20uLi4KK2FjbG9jYWwubTQ6MzY4OiBBTV9JTklUX0FVVE9NQUtFIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzoxMDogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1BBQ0tBR0VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtWRVJTSU9OXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlZFUlNJT04kXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1BBQ0tBR0VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUEFDS0FHRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBSF9PVVRQVVQoW1BBQ0tBR0VdLCBbLyogTmFtZSBvZiBwYWNrYWdlICovCitAJTpAdW5kZWYgUEFDS0FHRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtWRVJTSU9OXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlZFUlNJT04kXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUhfT1VUUFVUKFtWRVJTSU9OXSwgWy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KK0AlOkB1bmRlZiBWRVJTSU9OXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1QoW0FDTE9DQUxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbQUNMT0NBTF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BQ0xPQ0FMJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFtBVVRPQ09ORl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtBVVRPQ09ORl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BVVRPQ09ORiRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVChbQVVUT01BS0VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbQVVUT01BS0VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVVUT01BS0UkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1QoW0FVVE9IRUFERVJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbQVVUT0hFQURFUl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BVVRPSEVBREVSJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFtNQUtFSU5GT10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtNQUtFSU5GT10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15NQUtFSU5GTyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVChbaW5zdGFsbF9zaF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtpbnN0YWxsX3NoXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmluc3RhbGxfc2gkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1QoW1NUUklQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1NUUklQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNUUklQJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFtJTlNUQUxMX1NUUklQX1BST0dSQU1dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXklOU1RBTExfU1RSSVBfUFJPR1JBTSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVChbbWtkaXJfcF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtta2Rpcl9wXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXm1rZGlyX3AkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1QoW0FXS10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtBV0tdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQVdLJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFtTRVRfTUFLRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUX1RSQUNFKFtTRVRfTUFLRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TRVRfTUFLRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX19sZWFkaW5nX2RvdF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fbGVhZGluZ19kb3QkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1QoW0FNVEFSXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FNVEFSXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNVEFSJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIEFDX1NVQlNUKFthbV9fdGFyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX190YXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX3RhciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA6IC0xLSBBQ19TVUJTVChbYW1fX3VudGFyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FtX191bnRhcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fdW50YXIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEyOiAtMS0gbTRfaW5jbHVkZShbbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEzOiAtMS0gbTRfaW5jbHVkZShbbTQvZGFzdC5tNF0pCittNHRyYWNlOm00L2Rhc3QubTQ6NTogLTEtIEFIX09VVFBVVChbSEFWRV9QT1NJWF9USFJFQURdLCBbLyogKi8KK0AlOkB1bmRlZiBIQVZFX1BPU0lYX1RIUkVBRF0pCittNHRyYWNlOm00L2Rhc3QubTQ6NjogLTEtIEFIX09VVFBVVChbX1JFRU5UUkFOVF0sIFsvKiAqLworQCU6QHVuZGVmIF9SRUVOVFJBTlRdKQorbTR0cmFjZTptNC9kYXN0Lm00Ojc6IC0xLSBBSF9PVVRQVVQoW3NzaXplX3RdLCBbLyogRGVmaW5lIHRvICJpbnQiIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworQCU6QHVuZGVmIHNzaXplX3RdKQorbTR0cmFjZTptNC9kYXN0Lm00Ojg6IC0xLSBBSF9PVVRQVVQoW2Jvb2xdLCBbLyogKi8KK0AlOkB1bmRlZiBib29sXSkKK200dHJhY2U6bTQvZGFzdC5tNDo5OiAtMS0gQUhfT1VUUFVUKFt0cnVlXSwgWy8qICovCitAJTpAdW5kZWYgdHJ1ZV0pCittNHRyYWNlOm00L2Rhc3QubTQ6MTA6IC0xLSBBSF9PVVRQVVQoW2ZhbHNlXSwgWy8qICovCitAJTpAdW5kZWYgZmFsc2VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTQ6IC0xLSBtNF9pbmNsdWRlKFttNC9hY3hfcHRocmVhZC5tNF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzogLTItIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFTFBfU1RSSU5HJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNzogQUNfSEVMUF9TVFJJTkcgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjE3OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjIxOiAtMi0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6MjE6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjU6IC0yLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUxQX1NUUklORycgaXMgb2Jzb2xldGUuCitZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDc6IEFDX0hFTFBfU1RSSU5HIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzoyNTogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyODogLTItIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hFTFBfU1RSSU5HJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNzogQUNfSEVMUF9TVFJJTkcgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjI4OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjMzOiAtMi0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA3OiBBQ19IRUxQX1NUUklORyBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6MzM6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVChbQ1hYXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NYWF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWFgkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW0NYWEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NYWEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWEZMQUdTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUKFtMREZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xERkxBR1NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTERGTEFHUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVChbTElCU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSUJTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQlMkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW0NQUEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NQUEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUEZMQUdTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUKFtDWFhdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ1hYXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNYWCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVChbYWNfY3RfQ1hYXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2FjX2N0X0NYWF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hY19jdF9DWFgkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW0VYRUVYVF0sIFskYWNfY3ZfZXhlZXh0XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0VYRUVYVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15FWEVFWFQkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW09CSkVYVF0sIFskYWNfY3Zfb2JqZXh0XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW09CSkVYVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15PQkpFWFQkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW0RFUERJUl0sIFsiJHthbV9fbGVhZGluZ19kb3R9ZGVwcyJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVF9UUkFDRShbREVQRElSXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkRFUERJUiRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVChbYW1fX2luY2x1ZGVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVF9UUkFDRShbYW1fX2luY2x1ZGVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX2luY2x1ZGUkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW2FtX19xdW90ZV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fcXVvdGVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYW1fX3F1b3RlJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFNX0NPTkRJVElPTkFMKFtBTURFUF0sIFt0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm9dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVChbQU1ERVBfVFJVRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUX1RSQUNFKFtBTURFUF9UUlVFXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNREVQX1RSVUUkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW0FNREVQX0ZBTFNFXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0FNREVQX0ZBTFNFXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFNREVQX0ZBTFNFJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUX1RSQUNFKFtBTURFUEJBQ0tTTEFTSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15BTURFUEJBQ0tTTEFTSCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVChbQ1hYREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ1hYREVQTU9ERV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DWFhERVBNT0RFJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcENYWF0sIFsKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPSBnY2MzXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQxOiAtMS0gQUNfU1VCU1QoW2FtX19mYXN0ZGVwQ1hYX1RSVUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDE6IC0xLSBBQ19TVUJTVF9UUkFDRShbYW1fX2Zhc3RkZXBDWFhfVFJVRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fZmFzdGRlcENYWF9UUlVFJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUKFthbV9fZmFzdGRlcENYWF9GQUxTRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fZmFzdGRlcENYWF9GQUxTRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15hbV9fZmFzdGRlcENYWF9GQUxTRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVChbQ0NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ0NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0MkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfU1VCU1QoW0NGTEFHU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtDRkxBR1NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0ZMQUdTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUKFtMREZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xERkxBR1NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTERGTEFHUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVChbTElCU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSUJTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQlMkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfU1VCU1QoW0NQUEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NQUEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUEZMQUdTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUKFtDQ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtDQ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DQyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVChbQ0NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ0NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0MkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfU1VCU1QoW0NDXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NDXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNDJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUKFtDQ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtDQ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DQyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVChbYWNfY3RfQ0NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVF9UUkFDRShbYWNfY3RfQ0NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYWNfY3RfQ0MkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gQUNfU1VCU1QoW0NDREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUX1RSQUNFKFtDQ0RFUE1PREVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteQ0NERVBNT0RFJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFNX0NPTkRJVElPTkFMKFthbV9fZmFzdGRlcENDXSwgWworICB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm8gXAorICAmJiB0ZXN0ICIkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjM10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUKFthbV9fZmFzdGRlcENDX1RSVUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVF9UUkFDRShbYW1fX2Zhc3RkZXBDQ19UUlVFXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19mYXN0ZGVwQ0NfVFJVRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDM6IC0xLSBBQ19TVUJTVChbYW1fX2Zhc3RkZXBDQ19GQUxTRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0MzogLTEtIEFDX1NVQlNUX1RSQUNFKFthbV9fZmFzdGRlcENDX0ZBTFNFXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQzOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmFtX19mYXN0ZGVwQ0NfRkFMU0UkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQ1OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSVNDX1BPU0lYJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDo0NDY6IEFDX0lTQ19QT1NJWCBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6NDU6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDc6IC0xLSBBQ19TVUJTVChbU0VUX01BS0VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDc6IC0xLSBBQ19TVUJTVF9UUkFDRShbU0VUX01BS0VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0VUX01BS0UkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjQ4OiAtMS0gQUNfU1VCU1QoW1JBTkxJQl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo0ODogLTEtIEFDX1NVQlNUX1RSQUNFKFtSQU5MSUJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NDg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUkFOTElCJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIEFDX0NBTk9OSUNBTF9IT1NUCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIEFDX0NBTk9OSUNBTF9CVUlMRAorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19SRVFVSVJFX0FVWF9GSUxFKFtjb25maWcuc3ViXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gQUNfUkVRVUlSRV9BVVhfRklMRShbY29uZmlnLmd1ZXNzXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gQUNfU1VCU1QoW2J1aWxkXSwgWyRhY19jdl9idWlsZF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIEFDX1NVQlNUX1RSQUNFKFtidWlsZF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15idWlsZCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19TVUJTVChbYnVpbGRfY3B1XSwgWyRbMV1dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbYnVpbGRfY3B1XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmJ1aWxkX2NwdSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19TVUJTVChbYnVpbGRfdmVuZG9yXSwgWyRbMl1dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbYnVpbGRfdmVuZG9yXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmJ1aWxkX3ZlbmRvciRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19TVUJTVChbYnVpbGRfb3NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbYnVpbGRfb3NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYnVpbGRfb3MkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gQUNfU1VCU1QoW2hvc3RdLCBbJGFjX2N2X2hvc3RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBBQ19TVUJTVF9UUkFDRShbaG9zdF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15ob3N0JF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIEFDX1NVQlNUKFtob3N0X2NwdV0sIFskWzFdXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2hvc3RfY3B1XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3RfY3B1JF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIEFDX1NVQlNUKFtob3N0X3ZlbmRvcl0sIFskWzJdXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2hvc3RfdmVuZG9yXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXmhvc3RfdmVuZG9yJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1MDogLTEtIEFDX1NVQlNUKFtob3N0X29zXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjUwOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2hvc3Rfb3NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteaG9zdF9vcyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTk6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1NBVkUnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTI1OiBBQ19MQU5HX1NBVkUgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvYWN4X3B0aHJlYWQubTQ6NDogQUNYX1BUSFJFQUQgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjU5OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19DJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjcyOiBBQ19MQU5HX0MgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvYWN4X3B0aHJlYWQubTQ6NDogQUNYX1BUSFJFQUQgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjU5OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMS0gQUNfU1VCU1QoW2FjeF9wdGhyZWFkX2NvbmZpZ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIEFDX1NVQlNUX1RSQUNFKFthY3hfcHRocmVhZF9jb25maWddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYWN4X3B0aHJlYWRfY29uZmlnJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9MSU5LJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2ODc6IEFDX1RSWV9MSU5LIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2FjeF9wdGhyZWFkLm00OjQ6IEFDWF9QVEhSRUFEIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo1OTogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9MSU5LJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2ODc6IEFDX1RSWV9MSU5LIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2FjeF9wdGhyZWFkLm00OjQ6IEFDWF9QVEhSRUFEIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo1OTogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9MSU5LJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2ODc6IEFDX1RSWV9MSU5LIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2FjeF9wdGhyZWFkLm00OjQ6IEFDWF9QVEhSRUFEIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo1OTogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtQVEhSRUFEX0NSRUFURV9KT0lOQUJMRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QVEhSRUFEX0NSRUFURV9KT0lOQUJMRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTk6IC0xLSBBSF9PVVRQVVQoW1BUSFJFQURfQ1JFQVRFX0pPSU5BQkxFXSwgWy8qIERlZmluZSB0byB0aGUgbmVjZXNzYXJ5IHN5bWJvbCBpZiB0aGlzIGNvbnN0YW50IHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbgorICAgeW91ciBzeXN0ZW0uICovCitAJTpAdW5kZWYgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTk6IC0xLSBBQ19TVUJTVChbUFRIUkVBRF9DQ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtQVEhSRUFEX0NDXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBUSFJFQURfQ0MkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMS0gQUNfU1VCU1QoW1BUSFJFQURfTElCU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtQVEhSRUFEX0xJQlNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUFRIUkVBRF9MSUJTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIEFDX1NVQlNUKFtQVEhSRUFEX0NGTEFHU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtQVEhSRUFEX0NGTEFHU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15QVEhSRUFEX0NGTEFHUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NTk6IC0xLSBBQ19TVUJTVChbUFRIUkVBRF9DQ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTEtIEFDX1NVQlNUX1RSQUNFKFtQVEhSRUFEX0NDXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlBUSFJFQURfQ0MkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMi0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfUFRIUkVBRF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo1OTogLTItIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1BUSFJFQUQkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMi0gQUhfT1VUUFVUKFtIQVZFX1BUSFJFQURdLCBbLyogRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuICovCitAJTpAdW5kZWYgSEFWRV9QVEhSRUFEXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjU5OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19SRVNUT1JFJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEzNDogQUNfTEFOR19SRVNUT1JFIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2FjeF9wdGhyZWFkLm00OjQ6IEFDWF9QVEhSRUFEIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo1OTogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo2MTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1BPU0lYX1RIUkVBRF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo2MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1BPU0lYX1RIUkVBRCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NjI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbX1JFRU5UUkFOVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo2MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15fUkVFTlRSQU5UJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo2NzogLTItIEFIX09VVFBVVChbSEFWRV9MSUJOU0xdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuc2xcJyBsaWJyYXJ5ICgtbG5zbCkuICovCitAJTpAdW5kZWYgSEFWRV9MSUJOU0xdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6Njc6IC0yLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9MSUJOU0xdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6Njc6IC0yLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9MSUJOU0wkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjY4OiAtMi0gQUhfT1VUUFVUKFtIQVZFX0xJQlNPQ0tFVF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNvY2tldFwnIGxpYnJhcnkgKC1sc29ja2V0KS4gKi8KK0AlOkB1bmRlZiBIQVZFX0xJQlNPQ0tFVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo2ODogLTItIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0xJQlNPQ0tFVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo2ODogLTItIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0xJQlNPQ0tFVCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzE6IC0xLSBBQ19TVUJTVChbQ1BQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NQUF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15DUFAkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gQUNfU1VCU1QoW0NQUEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0NQUEZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUEZMQUdTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MTogLTEtIEFDX1NVQlNUKFtDUFBdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzE6IC0xLSBBQ19TVUJTVF9UUkFDRShbQ1BQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkNQUCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzE6IC0xLSBBQ19TVUJTVChbR1JFUF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MTogLTEtIEFDX1NVQlNUX1RSQUNFKFtHUkVQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkdSRVAkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gQUNfU1VCU1QoW0VHUkVQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0VHUkVQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkVHUkVQJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtTVERDX0hFQURFUlNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU1REQ19IRUFERVJTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MTogLTEtIEFIX09VVFBVVChbU1REQ19IRUFERVJTXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworQCU6QHVuZGVmIFNURENfSEVBREVSU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MjogLTEtIEFIX09VVFBVVChbSEFWRV9BUlBBX0lORVRfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KK0AlOkB1bmRlZiBIQVZFX0FSUEFfSU5FVF9IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0xJQklOVExfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYmludGwuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9MSUJJTlRMX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTkVUREJfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRiLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfTkVUREJfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MjogLTEtIEFIX09VVFBVVChbSEFWRV9ORVRJTkVUX0lOX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfTkVUSU5FVF9JTl9IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NURExJQl9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfU1RETElCX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSSU5HX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TVFJJTkdfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MjogLTEtIEFIX09VVFBVVChbSEFWRV9TVFJJTkdTX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfU1RSSU5HU19IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NZU19TT0NLRVRfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TWVNfU09DS0VUX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1lTX1RJTUVfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfU1lTX1RJTUVfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MjogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNMT0dfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5c2xvZy5oPiBoZWFkZXIgZmlsZS4gKi8KK0AlOkB1bmRlZiBIQVZFX1NZU0xPR19IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1VOSVNURF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfVU5JU1REX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1lTX1RZUEVTX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TWVNfVFlQRVNfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MjogLTEtIEFIX09VVFBVVChbSEFWRV9TWVNfU1RBVF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TWVNfU1RBVF9IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NURExJQl9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfU1RETElCX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSSU5HX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TVFJJTkdfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MjogLTEtIEFIX09VVFBVVChbSEFWRV9NRU1PUllfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KK0AlOkB1bmRlZiBIQVZFX01FTU9SWV9IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NUUklOR1NfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TVFJJTkdTX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6NzI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfSU5UVFlQRVNfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfSU5UVFlQRVNfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo3MjogLTEtIEFIX09VVFBVVChbSEFWRV9TVERJTlRfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KK0AlOkB1bmRlZiBIQVZFX1NURElOVF9IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjcyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1VOSVNURF9IXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfVU5JU1REX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbY29uc3RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6Nzg6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteY29uc3QkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjc4OiAtMS0gQUhfT1VUUFVUKFtjb25zdF0sIFsvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0XCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCitAJTpAdW5kZWYgY29uc3RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbc2l6ZV90XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjc5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnNpemVfdCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6Nzk6IC0xLSBBSF9PVVRQVVQoW3NpemVfdF0sIFsvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludFwnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworQCU6QHVuZGVmIHNpemVfdF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MDogLTItIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtzc2l6ZV90XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjgwOiAtMi0gbTRfcGF0dGVybl9hbGxvdyhbXnNzaXplX3QkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjgwOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU1NJWkVfVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4MDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NTSVpFX1QkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjgwOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NTSVpFX1RdLCBbLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHNzaXplX3RcJy4gKi8KK0AlOkB1bmRlZiBIQVZFX1NTSVpFX1RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODE6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbVElNRV9XSVRIX1NZU19USU1FXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjgxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlRJTUVfV0lUSF9TWVNfVElNRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODE6IC0xLSBBSF9PVVRQVVQoW1RJTUVfV0lUSF9TWVNfVElNRV0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gKi8KK0AlOkB1bmRlZiBUSU1FX1dJVEhfU1lTX1RJTUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbVE1fSU5fU1lTX1RJTUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteVE1fSU5fU1lTX1RJTUUkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjgyOiAtMS0gQUhfT1VUUFVUKFtUTV9JTl9TWVNfVElNRV0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBgc3RydWN0IHRtXCcuICovCitAJTpAdW5kZWYgVE1fSU5fU1lTX1RJTUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ09NUElMRScgaXMgb2Jzb2xldGUuCitZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE0OiBBQ19UUllfQ09NUElMRSBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2F4X2NyZWF0ZV9zdGRpbnRfaC5tNDoxMjk6IEFYX0NSRUFURV9TVERJTlRfSCBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6ODU6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX0NIQVJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0laRU9GX0NIQVIkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg1OiAtMS0gQUhfT1VUUFVUKFtTSVpFT0ZfQ0hBUl0sIFsvKiBUaGUgc2l6ZSBvZiBgY2hhclwnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCitAJTpAdW5kZWYgU0laRU9GX0NIQVJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX1NIT1JUXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9TSE9SVCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBBSF9PVVRQVVQoW1NJWkVPRl9TSE9SVF0sIFsvKiBUaGUgc2l6ZSBvZiBgc2hvcnRcJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworQCU6QHVuZGVmIFNJWkVPRl9TSE9SVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtTSVpFT0ZfSU5UXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9JTlQkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg1OiAtMS0gQUhfT1VUUFVUKFtTSVpFT0ZfSU5UXSwgWy8qIFRoZSBzaXplIG9mIGBpbnRcJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworQCU6QHVuZGVmIFNJWkVPRl9JTlRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX0xPTkddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0laRU9GX0xPTkckXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg1OiAtMS0gQUhfT1VUUFVUKFtTSVpFT0ZfTE9OR10sIFsvKiBUaGUgc2l6ZSBvZiBgbG9uZ1wnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCitAJTpAdW5kZWYgU0laRU9GX0xPTkddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX1ZPSURQXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9WT0lEUCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODU6IC0xLSBBSF9PVVRQVVQoW1NJWkVPRl9WT0lEUF0sIFsvKiBUaGUgc2l6ZSBvZiBgdm9pZCpcJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworQCU6QHVuZGVmIFNJWkVPRl9WT0lEUF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfU0FWRScgaXMgb2Jzb2xldGUuCitZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMjU6IEFDX0xBTkdfU0FWRSBpcyBleHBhbmRlZCBmcm9tLi4uCittNC9kYXN0Lm00OjEwNzogREFTVF9BQ0NFUFRfQVJHIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjg3OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg3OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19DUExVU1BMVVMnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MjUyOiBBQ19MQU5HX0NQTFVTUExVUyBpcyBleHBhbmRlZCBmcm9tLi4uCittNC9kYXN0Lm00OjEwNzogREFTVF9BQ0NFUFRfQVJHIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjg3OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg3OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19SRVNUT1JFJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEzNDogQUNfTEFOR19SRVNUT1JFIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2Rhc3QubTQ6MTA3OiBEQVNUX0FDQ0VQVF9BUkcgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6ODc6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODc6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1NBVkUnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTI1OiBBQ19MQU5HX1NBVkUgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMDc6IERBU1RfQUNDRVBUX0FSRyBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo4NzogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfQ1BMVVNQTFVTJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjI1MjogQUNfTEFOR19DUExVU1BMVVMgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMDc6IERBU1RfQUNDRVBUX0FSRyBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo4NzogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfUkVTVE9SRScgaXMgb2Jzb2xldGUuCitZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMzQ6IEFDX0xBTkdfUkVTVE9SRSBpcyBleHBhbmRlZCBmcm9tLi4uCittNC9kYXN0Lm00OjEwNzogREFTVF9BQ0NFUFRfQVJHIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjg3OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg3OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19TQVZFJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEyNTogQUNfTEFOR19TQVZFIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2Rhc3QubTQ6MTA3OiBEQVNUX0FDQ0VQVF9BUkcgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6ODc6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODc6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX0NQTFVTUExVUycgaXMgb2Jzb2xldGUuCitZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvYy5tNDoyNTI6IEFDX0xBTkdfQ1BMVVNQTFVTIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2Rhc3QubTQ6MTA3OiBEQVNUX0FDQ0VQVF9BUkcgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6ODc6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODc6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1JFU1RPUkUnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTM0OiBBQ19MQU5HX1JFU1RPUkUgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMDc6IERBU1RfQUNDRVBUX0FSRyBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo4NzogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfU0FWRScgaXMgb2Jzb2xldGUuCitZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMjU6IEFDX0xBTkdfU0FWRSBpcyBleHBhbmRlZCBmcm9tLi4uCittNC9kYXN0Lm00OjEwNzogREFTVF9BQ0NFUFRfQVJHIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjg3OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg3OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19DUExVU1BMVVMnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MjUyOiBBQ19MQU5HX0NQTFVTUExVUyBpcyBleHBhbmRlZCBmcm9tLi4uCittNC9kYXN0Lm00OjEwNzogREFTVF9BQ0NFUFRfQVJHIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjg3OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjg3OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19SRVNUT1JFJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEzNDogQUNfTEFOR19SRVNUT1JFIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2Rhc3QubTQ6MTA3OiBEQVNUX0FDQ0VQVF9BUkcgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL200c3VnYXIvbTRzaC5tNDo2Mzk6IEFTX0lGIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwMzE6IEFDX0NBQ0hFX1ZBTCBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDUyOiBBQ19DQUNIRV9DSEVDSyBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6ODc6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6ODc6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1NBVkUnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2xhbmcubTQ6MTI1OiBBQ19MQU5HX1NBVkUgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMDc6IERBU1RfQUNDRVBUX0FSRyBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo4NzogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfQ1BMVVNQTFVTJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9jLm00OjI1MjogQUNfTEFOR19DUExVU1BMVVMgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMDc6IERBU1RfQUNDRVBUX0FSRyBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzo4NzogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzo4NzogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfUkVTVE9SRScgaXMgb2Jzb2xldGUuCitZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0sIFsuLi8uLi9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMzQ6IEFDX0xBTkdfUkVTVE9SRSBpcyBleHBhbmRlZCBmcm9tLi4uCittNC9kYXN0Lm00OjEwNzogREFTVF9BQ0NFUFRfQVJHIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjg3OiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEwODogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtTb2NrbGVuX3RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA4OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNvY2tsZW5fdCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTA4OiAtMS0gQUhfT1VUUFVUKFtTb2NrbGVuX3RdLCBbLyogRGVmaW5lIDNyZCBhcmcgb2YgYWNjZXB0ICovCitAJTpAdW5kZWYgU29ja2xlbl90XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtwaWRfdF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFtecGlkX3QkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMTogLTEtIEFIX09VVFBVVChbcGlkX3RdLCBbLyogRGVmaW5lIHRvIGBpbnRcJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KK0AlOkB1bmRlZiBwaWRfdF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfVkZPUktfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHZmb3JrLmg+IGhlYWRlciBmaWxlLiAqLworQCU6QHVuZGVmIEhBVkVfVkZPUktfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTE6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9WRk9SS19IXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1ZGT1JLX0gkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMTogLTEtIEFIX09VVFBVVChbSEFWRV9GT1JLXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm9ya1wnIGZ1bmN0aW9uLiAqLworQCU6QHVuZGVmIEhBVkVfRk9SS10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfVkZPUktdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2Zm9ya1wnIGZ1bmN0aW9uLiAqLworQCU6QHVuZGVmIEhBVkVfVkZPUktdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTExOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfV09SS0lOR19WRk9SS10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9XT1JLSU5HX1ZGT1JLJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTE6IC0xLSBBSF9PVVRQVVQoW0hBVkVfV09SS0lOR19WRk9SS10sIFsvKiBEZWZpbmUgdG8gMSBpZiBgdmZvcmtcJyB3b3Jrcy4gKi8KK0AlOkB1bmRlZiBIQVZFX1dPUktJTkdfVkZPUktdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTExOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW3Zmb3JrXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMTogLTEtIG00X3BhdHRlcm5fYWxsb3coW152Zm9yayRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTExOiAtMS0gQUhfT1VUUFVUKFt2Zm9ya10sIFsvKiBEZWZpbmUgYXMgYGZvcmtcJyBpZiBgdmZvcmtcJyBkb2VzIG5vdCB3b3JrLiAqLworQCU6QHVuZGVmIHZmb3JrXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1dPUktJTkdfRk9SS10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTE6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9XT1JLSU5HX0ZPUkskXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMTogLTEtIEFIX09VVFBVVChbSEFWRV9XT1JLSU5HX0ZPUktdLCBbLyogRGVmaW5lIHRvIDEgaWYgYGZvcmtcJyB3b3Jrcy4gKi8KK0AlOkB1bmRlZiBIQVZFX1dPUktJTkdfRk9SS10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTI6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RETElCX0hdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TVERMSUJfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9TVERMSUJfSF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TVERMSUJfSCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTEyOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfTUFMTE9DXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX01BTExPQyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTEyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX01BTExPQ10sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIHN5c3RlbSBoYXMgYSBHTlUgbGliYyBjb21wYXRpYmxlIGBtYWxsb2NcJyBmdW5jdGlvbiwgYW5kCisgICB0byAwIG90aGVyd2lzZS4gKi8KK0AlOkB1bmRlZiBIQVZFX01BTExPQ10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9NQUxMT0NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTEyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTUFMTE9DJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTI6IC0xLSBBQ19TVUJTVChbTElCQCZ0QE9CSlNdLCBbIiRMSUJAJnRAT0JKUyBtYWxsb2MuJGFjX29iamV4dCJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTEyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQkAmdEBPQkpTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTEyOiAtMS0gQUNfTElCU09VUkNFKFttYWxsb2MuY10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbbWFsbG9jXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15tYWxsb2MkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMjogLTEtIEFIX09VVFBVVChbbWFsbG9jXSwgWy8qIERlZmluZSB0byBycGxfbWFsbG9jIGlmIHRoZSByZXBsYWNlbWVudCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZC4gKi8KK0AlOkB1bmRlZiBtYWxsb2NdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTEzOiAtMS0gQUNfU1VCU1QoW0xJQkAmdEBPQkpTXSwgWyIkTElCQCZ0QE9CSlMgbWVtY21wLiRhY19vYmpleHQiXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMzogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSUJAJnRAT0JKU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTM6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCQCZ0QE9CSlMkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExMzogLTEtIEFDX0xJQlNPVVJDRShbbWVtY21wLmNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NZU19TRUxFQ1RfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZWxlY3QuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TWVNfU0VMRUNUX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NZU19TT0NLRVRfSF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCitAJTpAdW5kZWYgSEFWRV9TWVNfU09DS0VUX0hdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE0OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW1NFTEVDVF9UWVBFX0FSRzFdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNFTEVDVF9UWVBFX0FSRzEkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExNDogLTEtIEFIX09VVFBVVChbU0VMRUNUX1RZUEVfQVJHMV0sIFsvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYXJnIDEgZm9yIGBzZWxlY3RcJy4gKi8KK0AlOkB1bmRlZiBTRUxFQ1RfVFlQRV9BUkcxXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExNDogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtTRUxFQ1RfVFlQRV9BUkcyMzRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNFTEVDVF9UWVBFX0FSRzIzNCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE0OiAtMS0gQUhfT1VUUFVUKFtTRUxFQ1RfVFlQRV9BUkcyMzRdLCBbLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFyZ3MgMiwgMyBhbmQgNCBmb3IgYHNlbGVjdFwnLiAqLworQCU6QHVuZGVmIFNFTEVDVF9UWVBFX0FSRzIzNF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTQ6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0VMRUNUX1RZUEVfQVJHNV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteU0VMRUNUX1RZUEVfQVJHNSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE0OiAtMS0gQUhfT1VUUFVUKFtTRUxFQ1RfVFlQRV9BUkc1XSwgWy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhcmcgNSBmb3IgYHNlbGVjdFwnLiAqLworQCU6QHVuZGVmIFNFTEVDVF9UWVBFX0FSRzVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE1OiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFlQRV9TSUdOQUwnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL3R5cGVzLm00Ojc0NjogQUNfVFlQRV9TSUdOQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjExNTogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTU6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbUkVUU0lHVFlQRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTU6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteUkVUU0lHVFlQRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE1OiAtMS0gQUhfT1VUUFVUKFtSRVRTSUdUWVBFXSwgWy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChgaW50XCcgb3IgYHZvaWRcJykuICovCitAJTpAdW5kZWYgUkVUU0lHVFlQRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTY6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSRlRJTUVdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJmdGltZVwnIGZ1bmN0aW9uLiAqLworQCU6QHVuZGVmIEhBVkVfU1RSRlRJTUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE2OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU1RSRlRJTUVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfU1RSRlRJTUUkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExNjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1NUUkZUSU1FXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExNjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NUUkZUSU1FJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTc6IC0xLSBBSF9PVVRQVVQoW0hBVkVfVlBSSU5URl0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZwcmludGZcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX1ZQUklOVEZdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE3OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfVlBSSU5URl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9WUFJJTlRGJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTc6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9ET1BSTlRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfRE9QUk5UJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTc6IC0xLSBBSF9PVVRQVVQoW0hBVkVfRE9QUk5UXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBkb25cJ3QgaGF2ZSBgdnByaW50ZlwnIGJ1dCBkbyBoYXZlIGBfZG9wcm50LlwnICovCitAJTpAdW5kZWYgSEFWRV9ET1BSTlRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE4OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0FURVhJVF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0ZXhpdFwnIGZ1bmN0aW9uLiAqLworQCU6QHVuZGVmIEhBVkVfQVRFWElUXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExODogLTEtIEFIX09VVFBVVChbSEFWRV9HRVRUSU1FT0ZEQVldLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXlcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTg6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTUVNU0VUXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0XCcgZnVuY3Rpb24uICovCitAJTpAdW5kZWYgSEFWRV9NRU1TRVRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE4OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1BUSFJFQURfQ0FOQ0VMXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHRocmVhZF9jYW5jZWxcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX1BUSFJFQURfQ0FOQ0VMXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExODogLTEtIEFIX09VVFBVVChbSEFWRV9TRUxFQ1RdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZWxlY3RcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX1NFTEVDVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTg6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSQ0hSXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2hyXCcgZnVuY3Rpb24uICovCitAJTpAdW5kZWYgSEFWRV9TVFJDSFJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE4OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NUUkVSUk9SXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX1NUUkVSUk9SXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExODogLTEtIEFIX09VVFBVVChbSEFWRV9TVFJUT0xdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2xcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX1NUUlRPTF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTg6IC0xLSBBSF9PVVRQVVQoW0hBVkVfVVNMRUVQXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXNsZWVwXCcgZnVuY3Rpb24uICovCitAJTpAdW5kZWYgSEFWRV9VU0xFRVBdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NOUFJJTlRGXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGZcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX1NOUFJJTlRGXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX1NOUFJJTlRGXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1NOUFJJTlRGJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBQ19TVUJTVChbTElCQCZ0QE9CSlNdLCBbIiRMSUJAJnRAT0JKUyBzbnByaW50Zi4kYWNfb2JqZXh0Il0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbTElCQCZ0QE9CSlNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkAmdEBPQkpTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBQ19MSUJTT1VSQ0UoW3NucHJpbnRmLmNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0lORVRfUFRPTl0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZXRfcHRvblwnIGZ1bmN0aW9uLiAqLworQCU6QHVuZGVmIEhBVkVfSU5FVF9QVE9OXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0lORVRfUFRPTl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9JTkVUX1BUT04kXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIEFDX1NVQlNUKFtMSUJAJnRAT0JKU10sIFsiJExJQkAmdEBPQkpTIGluZXRfcHRvbi4kYWNfb2JqZXh0Il0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBQ19TVUJTVF9UUkFDRShbTElCQCZ0QE9CSlNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxJQkAmdEBPQkpTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBQ19MSUJTT1VSQ0UoW2luZXRfcHRvbi5jXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIEFIX09VVFBVVChbSEFWRV9JTkVUX05UT1BdLCBbLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmV0X250b3BcJyBmdW5jdGlvbi4gKi8KK0AlOkB1bmRlZiBIQVZFX0lORVRfTlRPUF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9JTkVUX05UT1BdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfSU5FVF9OVE9QJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBQ19TVUJTVChbTElCQCZ0QE9CSlNdLCBbIiRMSUJAJnRAT0JKUyBpbmV0X250b3AuJGFjX29iamV4dCJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQkAmdEBPQkpTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gQUNfTElCU09VUkNFKFtpbmV0X250b3AuY10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBBSF9PVVRQVVQoW0hBVkVfR0VUVElNRU9GREFZXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5XCcgZnVuY3Rpb24uICovCitAJTpAdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVldKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfR0VUVElNRU9GREFZXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0dFVFRJTUVPRkRBWSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTE5OiAtMS0gQUNfU1VCU1QoW0xJQkAmdEBPQkpTXSwgWyIkTElCQCZ0QE9CSlMgZ2V0dGltZW9mZGF5LiRhY19vYmpleHQiXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIEFDX1NVQlNUX1RSQUNFKFtMSUJAJnRAT0JKU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMTk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteTElCQCZ0QE9CSlMkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjExOTogLTEtIEFDX0xJQlNPVVJDRShbZ2V0dGltZW9mZGF5LmNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTI2OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1FVQURfU1VQUE9SVF0sIFsvKiAqLworQCU6QHVuZGVmIEhBVkVfUVVBRF9TVVBQT1JUXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjEyNzogLTEtIEFIX09VVFBVVChbSEFWRV9QUklOVEZfUURdLCBbLyogKi8KK0AlOkB1bmRlZiBIQVZFX1BSSU5URl9RRF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxMzE6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfUlVOJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI3NjQ6IEFDX1RSWV9SVU4gaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjEzMTogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNDc6IC0xLSBfbTRfd2Fybihbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfUlVOJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI3NjQ6IEFDX1RSWV9SVU4gaXMgZXhwYW5kZWQgZnJvbS4uLgorY29uZmlndXJlLmFjOjE0NzogdGhlIHRvcCBsZXZlbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNDc6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9QUklOVEZfUURdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTQ3OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfUFJJTlRGX1FEJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNjQ6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9RVUFEX1NVUFBPUlRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTY0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfUVVBRF9TVVBQT1JUJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzA6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbU0laRU9GX0JPT0xdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNJWkVPRl9CT09MJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzA6IC0xLSBBSF9PVVRQVVQoW1NJWkVPRl9CT09MXSwgWy8qIFRoZSBzaXplIG9mIGBib29sXCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KK0AlOkB1bmRlZiBTSVpFT0ZfQk9PTF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzA6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbYm9vbF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteYm9vbCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcwOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19TQVZFJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEyNTogQUNfTEFOR19TQVZFIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMjogREFTVF9DSEVDS19CT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzoxNzA6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcwOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19DUExVU1BMVVMnIGlzIG9ic29sZXRlLgorWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dLCBbLi4vLi4vbGliL2F1dG9jb25mL2MubTQ6MjUyOiBBQ19MQU5HX0NQTFVTUExVUyBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvbTRzdWdhci9tNHNoLm00OjYzOTogQVNfSUYgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjAzMTogQUNfQ0FDSEVfVkFMIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTI6IEFDX0NBQ0hFX0NIRUNLIGlzIGV4cGFuZGVkIGZyb20uLi4KK200L2Rhc3QubTQ6MTI6IERBU1RfQ0hFQ0tfQk9PTCBpcyBleHBhbmRlZCBmcm9tLi4uCitjb25maWd1cmUuYWM6MTcwOiB0aGUgdG9wIGxldmVsXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjE3MDogLTEtIF9tNF93YXJuKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2MTQ6IEFDX1RSWV9DT01QSUxFIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMjogREFTVF9DSEVDS19CT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzoxNzA6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcwOiAtMS0gX200X3dhcm4oW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19SRVNUT1JFJyBpcyBvYnNvbGV0ZS4KK1lvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSwgWy4uLy4uL2xpYi9hdXRvY29uZi9sYW5nLm00OjEzNDogQUNfTEFOR19SRVNUT1JFIGlzIGV4cGFuZGVkIGZyb20uLi4KKy4uLy4uL2xpYi9tNHN1Z2FyL200c2gubTQ6NjM5OiBBU19JRiBpcyBleHBhbmRlZCBmcm9tLi4uCisuLi8uLi9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMxOiBBQ19DQUNIRV9WQUwgaXMgZXhwYW5kZWQgZnJvbS4uLgorLi4vLi4vbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA1MjogQUNfQ0FDSEVfQ0hFQ0sgaXMgZXhwYW5kZWQgZnJvbS4uLgorbTQvZGFzdC5tNDoxMjogREFTVF9DSEVDS19CT09MIGlzIGV4cGFuZGVkIGZyb20uLi4KK2NvbmZpZ3VyZS5hYzoxNzA6IHRoZSB0b3AgbGV2ZWxdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcwOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW3RydWVdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXnRydWUkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjE3MDogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtmYWxzZV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteZmFsc2UkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjE3MjogLTEtIEFIX09VVFBVVChbV09SRFNfQklHRU5ESUFOXSwgWy8qIERlZmluZSBXT1JEU19CSUdFTkRJQU4gdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCkuICovCisjaWYgZGVmaW5lZCBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQKKyMgaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fXworIyAgZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgV09SRFNfQklHRU5ESUFOCisjICB1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgZW5kaWYKKyNlbmRpZl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbV09SRFNfQklHRU5ESUFOXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjE3MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XT1JEU19CSUdFTkRJQU4kXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjE3MjogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtBQ19BUFBMRV9VTklWRVJTQUxfQlVJTERdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTcyOiAtMS0gQUhfT1VUUFVUKFtBQ19BUFBMRV9VTklWRVJTQUxfQlVJTERdLCBbLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworQCU6QHVuZGVmIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzk6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9TVFJVQ1RfSVBfTVJFUV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxNzk6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TVFJVQ1RfSVBfTVJFUSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTc5OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NUUlVDVF9JUF9NUkVRXSwgWy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgaXBfbXJlcVwnLiAqLworQCU6QHVuZGVmIEhBVkVfU1RSVUNUX0lQX01SRVFdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTgwOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfREVDTF9JUF9BRERfTUVNQkVSU0hJUF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxODA6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9ERUNMX0lQX0FERF9NRU1CRVJTSElQJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxODA6IC0xLSBBSF9PVVRQVVQoW0hBVkVfREVDTF9JUF9BRERfTUVNQkVSU0hJUF0sIFsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYElQX0FERF9NRU1CRVJTSElQXCcsIGFuZCB0byAwIGlmCisgICB5b3UgZG9uXCd0LiAqLworQCU6QHVuZGVmIEhBVkVfREVDTF9JUF9BRERfTUVNQkVSU0hJUF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTA6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9NVUxUSUNBU1RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTkwOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfTVVMVElDQVNUJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTA6IC0xLSBBSF9PVVRQVVQoW0hBVkVfTVVMVElDQVNUXSwgWy8qIERlZmluZSB0byBlbmFibGUgbXVsdGljYXN0IHN1cHBvcnQgKi8KK0AlOkB1bmRlZiBIQVZFX01VTFRJQ0FTVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTY6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9TVFJVQ1RfU09DS0FERFJfU1RPUkFHRV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTY6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TVFJVQ1RfU09DS0FERFJfU1RPUkFHRSRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTk2OiAtMS0gQUhfT1VUUFVUKFtIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFXSwgWy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZVwnLiAqLworQCU6QHVuZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NUT1JBR0VdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MTk3OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU1RSVUNUX1NPQ0tBRERSX0lONl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTc6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42JF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTc6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSVUNUX1NPQ0tBRERSX0lONl0sIFsvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IHNvY2thZGRyX2luNlwnLiAqLworQCU6QHVuZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX0lONl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoxOTg6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9ERUNMX0FGX0lORVQ2XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjE5ODogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX0RFQ0xfQUZfSU5FVDYkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjE5ODogLTEtIEFIX09VVFBVVChbSEFWRV9ERUNMX0FGX0lORVQ2XSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgQUZfSU5FVDZcJywgYW5kIHRvIDAgaWYgeW91CisgICBkb25cJ3QuICovCitAJTpAdW5kZWYgSEFWRV9ERUNMX0FGX0lORVQ2XSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjIwNDogLTEtIEFDX0RFRklORV9UUkFDRV9MSVRFUkFMKFtIQVZFX0lQVjZdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjA0OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfSVBWNiRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjA0OiAtMS0gQUhfT1VUUFVUKFtIQVZFX0lQVjZdLCBbLyogRGVmaW5lIHRvIGVuYWJsZSBJUHY2IHN1cHBvcnQgKi8KK0AlOkB1bmRlZiBIQVZFX0lQVjZdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjE0OiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfU1RSVUNUX0lQVjZfTVJFUV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTQ6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9TVFJVQ1RfSVBWNl9NUkVRJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTQ6IC0xLSBBSF9PVVRQVVQoW0hBVkVfU1RSVUNUX0lQVjZfTVJFUV0sIFsvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IGlwdjZfbXJlcVwnLiAqLworQCU6QHVuZGVmIEhBVkVfU1RSVUNUX0lQVjZfTVJFUV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTU6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9ERUNMX0lQVjZfQUREX01FTUJFUlNISVBdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjE1OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfREVDTF9JUFY2X0FERF9NRU1CRVJTSElQJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTU6IC0xLSBBSF9PVVRQVVQoW0hBVkVfREVDTF9JUFY2X0FERF9NRU1CRVJTSElQXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgSVBWNl9BRERfTUVNQkVSU0hJUFwnLCBhbmQgdG8gMAorICAgaWYgeW91IGRvblwndC4gKi8KK0AlOkB1bmRlZiBIQVZFX0RFQ0xfSVBWNl9BRERfTUVNQkVSU0hJUF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTY6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9ERUNMX0lQVjZfTVVMVElDQVNUX0hPUFNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjE2OiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkhBVkVfREVDTF9JUFY2X01VTFRJQ0FTVF9IT1BTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMTY6IC0xLSBBSF9PVVRQVVQoW0hBVkVfREVDTF9JUFY2X01VTFRJQ0FTVF9IT1BTXSwgWy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgSVBWNl9NVUxUSUNBU1RfSE9QU1wnLCBhbmQgdG8gMAorICAgaWYgeW91IGRvblwndC4gKi8KK0AlOkB1bmRlZiBIQVZFX0RFQ0xfSVBWNl9NVUxUSUNBU1RfSE9QU10pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMjI6IC0xLSBBQ19ERUZJTkVfVFJBQ0VfTElURVJBTChbSEFWRV9JUFY2X01VTFRJQ0FTVF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyMjI6IC0xLSBtNF9wYXR0ZXJuX2FsbG93KFteSEFWRV9JUFY2X01VTFRJQ0FTVCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjIyOiAtMS0gQUhfT1VUUFVUKFtIQVZFX0lQVjZfTVVMVElDQVNUXSwgWy8qIERlZmluZSB0byBlbmFibGUgSVB2NiBtdWx0aWNhc3Qgc3VwcG9ydCAqLworQCU6QHVuZGVmIEhBVkVfSVBWNl9NVUxUSUNBU1RdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjMyOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0RCR19NSlpdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjMyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkRCR19NSlokXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjIzMjogLTEtIEFIX09VVFBVVChbREJHX01KWl0sIFsvKiBEZWZpbmUgaWYgZGVidWdnaW5nIGluZm8gaXMgZGVzaXJlZCAqLworQCU6QHVuZGVmIERCR19NSlpdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjQxOiAtMS0gQUNfU1VCU1QoW1dFQjEwMF9DT05GSUddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1dFQjEwMF9DT05GSUddKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjQxOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXldFQjEwMF9DT05GSUckXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI0MTogLTEtIEFDX1NVQlNUKFtXRUIxMDBfQ0ZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI0MTogLTEtIEFDX1NVQlNUX1RSQUNFKFtXRUIxMDBfQ0ZMQUdTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XRUIxMDBfQ0ZMQUdTJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNDE6IC0xLSBBQ19TVUJTVChbV0VCMTAwX0xJQlNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjQxOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1dFQjEwMF9MSUJTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI0MTogLTEtIG00X3BhdHRlcm5fYWxsb3coW15XRUIxMDBfTElCUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjQzOiAtMS0gQUNfREVGSU5FX1RSQUNFX0xJVEVSQUwoW0hBVkVfV0VCMTAwXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI0MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15IQVZFX1dFQjEwMCRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjQzOiAtMS0gQUhfT1VUUFVUKFtIQVZFX1dFQjEwMF0sIFsvKiBEZWZpbmUgaWYgV2ViMTAwIGlzIGRlc2lyZWQgYW5kIGF2YWlsYWJsZSAqLworQCU6QHVuZGVmIEhBVkVfV0VCMTAwXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI2MjogLTEtIEFDX1NVQlNUKFtTVFJJUF9EVU1NWV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNjI6IC0xLSBBQ19TVUJTVF9UUkFDRShbU1RSSVBfRFVNTVldKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjYyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXlNUUklQX0RVTU1ZJF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNjM6IC0xLSBBQ19TVUJTVChbU1RSSVBfQkVHSU5dKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjYzOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW1NUUklQX0JFR0lOXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI2MzogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TVFJJUF9CRUdJTiRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjY0OiAtMS0gQUNfU1VCU1QoW1NUUklQX0VORF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNjQ6IC0xLSBBQ19TVUJTVF9UUkFDRShbU1RSSVBfRU5EXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI2NDogLTEtIG00X3BhdHRlcm5fYWxsb3coW15TVFJJUF9FTkQkXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI2NjogLTEtIEFDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUKKwkJY29tcGF0L01ha2VmaWxlCisJCWRvYy9NYWtlZmlsZQorCQlpbmNsdWRlL01ha2VmaWxlCisJCXNyYy9NYWtlZmlsZQorICAgICAgICAgICAgICAgIG1hbi9NYWtlZmlsZV0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzI6IC0xLSBBQ19TVUJTVChbTElCQCZ0QE9CSlNdLCBbJGFjX2xpYm9ianNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjcyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW0xJQkAmdEBPQkpTXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI3MjogLTEtIG00X3BhdHRlcm5fYWxsb3coW15MSUJAJnRAT0JKUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjcyOiAtMS0gQUNfU1VCU1QoW0xUTElCT0JKU10sIFskYWNfbHRsaWJvYmpzXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI3MjogLTEtIEFDX1NVQlNUX1RSQUNFKFtMVExJQk9CSlNdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjcyOiAtMS0gbTRfcGF0dGVybl9hbGxvdyhbXkxUTElCT0JKUyRdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjcyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW3RvcF9idWlsZGRpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzI6IC0xLSBBQ19TVUJTVF9UUkFDRShbdG9wX2J1aWxkX3ByZWZpeF0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzI6IC0xLSBBQ19TVUJTVF9UUkFDRShbc3JjZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI3MjogLTEtIEFDX1NVQlNUX1RSQUNFKFthYnNfc3JjZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI3MjogLTEtIEFDX1NVQlNUX1RSQUNFKFt0b3Bfc3JjZGlyXSkKK200dHJhY2U6Y29uZmlndXJlLmFjOjI3MjogLTEtIEFDX1NVQlNUX1RSQUNFKFthYnNfdG9wX3NyY2Rpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzI6IC0xLSBBQ19TVUJTVF9UUkFDRShbYnVpbGRkaXJdKQorbTR0cmFjZTpjb25maWd1cmUuYWM6MjcyOiAtMS0gQUNfU1VCU1RfVFJBQ0UoW2Fic19idWlsZGRpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzI6IC0xLSBBQ19TVUJTVF9UUkFDRShbYWJzX3RvcF9idWlsZGRpcl0pCittNHRyYWNlOmNvbmZpZ3VyZS5hYzoyNzI6IC0xLSBBQ19TVUJTVF9UUkFDRShbSU5TVEFMTF0pCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9jb21wYXQvTWFrZWZpbGUuYW0gYi9pcGVyZi0yLjAuNS9jb21wYXQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlMjFlMgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbXBhdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIxIEBACitub2luc3RfTElCUkFSSUVTID0gbGliY29tcGF0LmEKKworQU1fQ1BQRkxBR1MgPSBAU1RSSVBfQkVHSU5AIFwKKwkgICAgICAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSBcCisJICAgICAgLUkkKHRvcF9idWlsZGRpcikvaW5jbHVkZSBcCisJICAgICAgQFNUUklQX0VOREAKKworQU1fQ1hYRkxBR1MgPSAtV2FsbAorQU1fQ0ZMQUdTID0gLVdhbGwKKworbGliY29tcGF0X2FfU09VUkNFUyA9IFwKKwkJICAgICAgVGhyZWFkLmMgXAorCQkgICAgICBlcnJvci5jIFwKKwkJICAgICAgZGVsYXkuY3BwIFwKKwkJICAgICAgZ2V0dGltZW9mZGF5LmMgXAorCQkgICAgICBoZWFkZXJzX3NsaW0uaCBcCisJCSAgICAgIGluZXRfbnRvcC5jIFwKKwkJICAgICAgaW5ldF9wdG9uLmMgXAorCQkgICAgICBzaWduYWwuYyBcCisJCSAgICAgIHNucHJpbnRmLmMgXAorCQkgICAgICBzdHJpbmcuYwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvY29tcGF0L01ha2VmaWxlLmluIGIvaXBlcmYtMi4wLjUvY29tcGF0L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzM5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9jb21wYXQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0NTIgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuOS42IGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuLgorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAorSU5TVEFMTCA9IEBJTlNUQUxMQAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gY29tcGF0CitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2F4X2NyZWF0ZV9zdGRpbnRfaC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9kYXN0Lm00ICQodG9wX3NyY2RpcikvbTQvYWN4X3B0aHJlYWQubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorTElCUkFSSUVTID0gJChub2luc3RfTElCUkFSSUVTKQorQVIgPSBhcgorQVJGTEFHUyA9IGNydQorbGliY29tcGF0X2FfQVIgPSAkKEFSKSAkKEFSRkxBR1MpCitsaWJjb21wYXRfYV9MSUJBREQgPQorYW1fbGliY29tcGF0X2FfT0JKRUNUUyA9IFRocmVhZC4kKE9CSkVYVCkgZXJyb3IuJChPQkpFWFQpIFwKKwlkZWxheS4kKE9CSkVYVCkgZ2V0dGltZW9mZGF5LiQoT0JKRVhUKSBpbmV0X250b3AuJChPQkpFWFQpIFwKKwlpbmV0X3B0b24uJChPQkpFWFQpIHNpZ25hbC4kKE9CSkVYVCkgc25wcmludGYuJChPQkpFWFQpIFwKKwlzdHJpbmcuJChPQkpFWFQpCitsaWJjb21wYXRfYV9PQkpFQ1RTID0gJChhbV9saWJjb21wYXRfYV9PQkpFQ1RTKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKSAtSSQodG9wX2J1aWxkZGlyKQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0NYWENPTVBJTEUgPSAkKENYWCkgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKQorQ1hYTEQgPSAkKENYWCkKK0NYWExJTksgPSAkKENYWExEKSAkKEFNX0NYWEZMQUdTKSAkKENYWEZMQUdTKSAkKEFNX0xERkxBR1MpICQoTERGTEFHUykgXAorCS1vICRACitTT1VSQ0VTID0gJChsaWJjb21wYXRfYV9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChsaWJjb21wYXRfYV9TT1VSQ0VTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNREVQX0ZBTFNFID0gQEFNREVQX0ZBTFNFQAorQU1ERVBfVFJVRSA9IEBBTURFUF9UUlVFQAorQU1UQVIgPSBAQU1UQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIUkVBRF9DQyA9IEBQVEhSRUFEX0NDQAorUFRIUkVBRF9DRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NACitQVEhSRUFEX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorUkFOTElCID0gQFJBTkxJQkAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NUUklQX0JFR0lOID0gQFNUUklQX0JFR0lOQAorU1RSSVBfRFVNTVkgPSBAU1RSSVBfRFVNTVlACitTVFJJUF9FTkQgPSBAU1RSSVBfRU5EQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0VCMTAwX0NGTEFHUyA9IEBXRUIxMDBfQ0ZMQUdTQAorV0VCMTAwX0NPTkZJRyA9IEBXRUIxMDBfQ09ORklHQAorV0VCMTAwX0xJQlMgPSBAV0VCMTAwX0xJQlNACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY3hfcHRocmVhZF9jb25maWcgPSBAYWN4X3B0aHJlYWRfY29uZmlnQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAorYW1fX2Zhc3RkZXBDWFhfVFJVRSA9IEBhbV9fZmFzdGRlcENYWF9UUlVFQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJjb21wYXQuYQorQU1fQ1BQRkxBR1MgPSBAU1RSSVBfQkVHSU5AIFwKKwkgICAgICAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSBcCisJICAgICAgLUkkKHRvcF9idWlsZGRpcikvaW5jbHVkZSBcCisJICAgICAgQFNUUklQX0VOREAKKworQU1fQ1hYRkxBR1MgPSAtV2FsbAorQU1fQ0ZMQUdTID0gLVdhbGwKK2xpYmNvbXBhdF9hX1NPVVJDRVMgPSBcCisJCSAgICAgIFRocmVhZC5jIFwKKwkJICAgICAgZXJyb3IuYyBcCisJCSAgICAgIGRlbGF5LmNwcCBcCisJCSAgICAgIGdldHRpbWVvZmRheS5jIFwKKwkJICAgICAgaGVhZGVyc19zbGltLmggXAorCQkgICAgICBpbmV0X250b3AuYyBcCisJCSAgICAgIGluZXRfcHRvbi5jIFwKKwkJICAgICAgc2lnbmFsLmMgXAorCQkgICAgICBzbnByaW50Zi5jIFwKKwkJICAgICAgc3RyaW5nLmMKKworYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAuY3BwIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGNvbXBhdC9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgY29tcGF0L01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCitjbGVhbi1ub2luc3RMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKK2xpYmNvbXBhdC5hOiAkKGxpYmNvbXBhdF9hX09CSkVDVFMpICQobGliY29tcGF0X2FfREVQRU5ERU5DSUVTKSAKKwktcm0gLWYgbGliY29tcGF0LmEKKwkkKGxpYmNvbXBhdF9hX0FSKSBsaWJjb21wYXQuYSAkKGxpYmNvbXBhdF9hX09CSkVDVFMpICQobGliY29tcGF0X2FfTElCQUREKQorCSQoUkFOTElCKSBsaWJjb21wYXQuYQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvVGhyZWFkLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kZWxheS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZXJyb3IuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dldHRpbWVvZmRheS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvaW5ldF9udG9wLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9pbmV0X3B0b24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3NpZ25hbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc25wcmludGYuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N0cmluZy5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgJDw7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS8kKi5UcG8iICIkKERFUERJUikvJCouUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2A7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS8kKi5UcG8iICIkKERFUERJUikvJCouUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuY3BwLm86CitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJaWYgJChDWFhDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpLyQqLlRwbyIgIiQoREVQRElSKS8kKi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ1hYREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACSQoQ1hYQ09NUElMRSkgLWMgLW8gJEAgJDwKKworLmNwcC5vYmo6CitAYW1fX2Zhc3RkZXBDWFhfVFJVRUAJaWYgJChDWFhDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2A7IFwKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFhDT01QSUxFKSAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCit1bmluc3RhbGwtaW5mby1hbToKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICQkdGFncyAkJHVuaXF1ZTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGNhc2UgJCRmaWxlIGluIFwKKwkgICAgJChzcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKwkgICAgJCh0b3Bfc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfCJgOzsgXAorCSAgZXNhYzsgXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZGlyPWBlY2hvICIkJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgaWYgdGVzdCAiJCRkaXIiICE9ICIkJGZpbGUiICYmIHRlc3QgIiQkZGlyIiAhPSAiLiI7IHRoZW4gXAorCSAgICBkaXI9Ii8kJGRpciI7IFwKKwkgICAgJChta2Rpcl9wKSAiJChkaXN0ZGlyKSQkZGlyIjsgXAorCSAgZWxzZSBcCisJICAgIGRpcj0nJzsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1ub2luc3RMSUJSQVJJRVMgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0KKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLW5vaW5zdExJQlJBUklFUyBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaW5mby1hbQorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9jb21wYXQvVGhyZWFkLmMgYi9pcGVyZi0yLjAuNS9jb21wYXQvVGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmZTRmOAotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbXBhdC9UaHJlYWQuYwpAQCAtMCwwICsxLDQxNyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIFRocmVhZC5jCisgKiBieSBLZXZpbiBHaWJicyA8a2dpYmJzQG5sYW5yLm5ldD4KKyAqCisgKiBCYXNlZCBvbjoKKyAqIFRocmVhZC5jcHAKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgdGhyZWFkIHN1YnN5c3RlbSBpcyByZXNwb25zaWJsZSBmb3IgYWxsIHRocmVhZCBmdW5jdGlvbnMuIEl0CisgKiBwcm92aWRlcyBhIHRocmVhZCBpbXBsZW1lbnRhdGlvbiBhZ25vc3RpYyBpbnRlcmZhY2UgdG8gSXBlcmYuIElmIAorICogdGhyZWFkcyBhcmUgbm90IGF2YWlsYWJsZSAoSEFWRV9USFJFQUQgaXMgdW5kZWZpbmVkKSwgdGhyZWFkX3N0YXJ0CisgKiBkb2VzIG5vdCBzdGFydCBhIG5ldyB0aHJlYWQgYnV0IGp1c3QgbGF1bmNoZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgCisgKiBpbiB0aGUgY3VycmVudCB0aHJlYWQuIEV2ZXJ5dGhpbmcgdGhhdCBkZWZpbmVzIGEgdGhyZWFkIG9mIAorICogZXhlY3V0aW9uIGluIElwZXJmIGlzIGNvbnRhaW5lZCBpbiBhbiB0aHJlYWRfU2V0dGluZ3Mgc3RydWN0dXJlLiBUbworICogc3RhcnQgYSB0aHJlYWQgc2ltcGx5IHBhc3Mgb25lIHN1Y2ggc3RydWN0dXJlIGludG8gdGhyZWFkX3N0YXJ0LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaGVhZGVycworICogdXNlcworICogICA8c3RkbGliLmg+CisgKiAgIDxzdGRpby5oPgorICogICA8YXNzZXJ0Lmg+CisgKiAgIDxlcnJuby5oPgorICogVGhyZWFkLmggbWF5IGluY2x1ZGUgPHB0aHJlYWQuaD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKworI2luY2x1ZGUgIlRocmVhZC5oIgorI2luY2x1ZGUgIkxvY2FsZS5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZWZpbmUgc3RhdGljIHZhcmlhYmxlcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gbnVtYmVyIG9mIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZHMKK2ludCB0aHJlYWRfc051bSA9IDA7CisvLyBudW1iZXIgb2Ygbm9uLXRlcm1pbmF0aW5nIHJ1bm5pbmcgdGhyZWFkcyAoaWUgbGlzdGVuZXIgdGhyZWFkKQoraW50IG5vbnRlcm1pbmF0aW5nX251bSA9IDA7CisvLyBjb25kaXRpb24gdG8gcHJvdGVjdCB1cGRhdGluZyB0aGUgYWJvdmUgYW5kIGFsZXJ0aW5nIG9uIAorLy8gY2hhbmdlcyB0byBhYm92ZQorQ29uZGl0aW9uIHRocmVhZF9zTnVtX2NvbmQ7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIHN1YnN5c3RlbXMgdmFyaWFibGVzIGFuZCBzZXQgdGhlIGNvbmN1cnJlbmN5CisgKiBsZXZlbCBpbiBzb2xhcmlzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCB0aHJlYWRfaW5pdCggKSB7CisgICAgQ29uZGl0aW9uX0luaXRpYWxpemUoICZ0aHJlYWRfc051bV9jb25kICk7CisjaWYgZGVmaW5lZCggc3VuICkKKyAgICAvKiBTb2xhcmlzIGFwcGFyZW50bHkgZG9lc24ndCBkZWZhdWx0IHRvIHRpbWVzbGljaW5nIHRocmVhZHMsCisgICAgICogYXMgc3VjaCB3ZSBmb3JjZSBpdCB0byBwbGF5IG5pY2UuIFRoaXMgbWF5IG5vdCB3b3JrIHBlcmZlY3RseQorICAgICAqIHdoZW4gX3NlbmRpbmdfIG11bHRpcGxlIF9VRFBfIHN0cmVhbXMuCisgICAgICovCisgICAgcHRocmVhZF9zZXRjb25jdXJyZW5jeSAoMyk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzdHJveSB0aGUgdGhyZWFkIHN1YnN5c3RlbXMgdmFyaWFibGVzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCB0aHJlYWRfZGVzdHJveSggKSB7CisgICAgQ29uZGl0aW9uX0Rlc3Ryb3koICZ0aHJlYWRfc051bV9jb25kICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0J3MgdGhyZWFkIGV4ZWN1dGlvbi4gSW5jcmVtZW50cyB0aHJlYWQKKyAqIGNvdW50LCBzcGF3bnMgbmV3IHRocmVhZCwgYW5kIHN0b3JlcyB0aHJlYWQgSUQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIHRocmVhZF9zdGFydCggc3RydWN0IHRocmVhZF9TZXR0aW5ncyogdGhyZWFkICkgeworCisgICAgLy8gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGhhcyBub3QgYmVlbiBzdGFydGVkIGFscmVhZHkKKyAgICBpZiAoIHRocmVhZF9lcXVhbGlkKCB0aHJlYWQtPm1USUQsIHRocmVhZF96ZXJvaWQoKSApICkgeworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gc3RhcnQgYW5vdGhlciB0aHJlYWQgYmVmb3JlIHRoaXMgb25lCisgICAgICAgIGlmICggdGhyZWFkLT5ydW5Ob3cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHRocmVhZF9zdGFydCggdGhyZWFkLT5ydW5Ob3cgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluY3JlbWVudCB0aHJlYWQgY291bnQKKyAgICAgICAgQ29uZGl0aW9uX0xvY2soIHRocmVhZF9zTnVtX2NvbmQgKTsKKyAgICAgICAgdGhyZWFkX3NOdW0rKzsKKyAgICAgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworCisjaWYgICBkZWZpbmVkKCBIQVZFX1BPU0lYX1RIUkVBRCApCisKKyAgICAgICAgLy8gcHRocmVhZHMgLS0gc3Bhd24gbmV3IHRocmVhZAorICAgICAgICBpZiAoIHB0aHJlYWRfY3JlYXRlKCAmdGhyZWFkLT5tVElELCBOVUxMLCB0aHJlYWRfcnVuX3dyYXBwZXIsIHRocmVhZCApICE9IDAgKSB7CisgICAgICAgICAgICBXQVJOKCAxLCAicHRocmVhZF9jcmVhdGUiICk7CisKKyAgICAgICAgICAgIC8vIGRlY3JlbWVudCB0aHJlYWQgY291bnQKKyAgICAgICAgICAgIENvbmRpdGlvbl9Mb2NrKCB0aHJlYWRfc051bV9jb25kICk7CisgICAgICAgICAgICB0aHJlYWRfc051bS0tOworICAgICAgICAgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworICAgICAgICB9CisKKyNlbGlmIGRlZmluZWQoIEhBVkVfV0lOMzJfVEhSRUFEICkKKworICAgICAgICAvLyBXaW4zMiB0aHJlYWRzIC0tIHNwYXduIG5ldyB0aHJlYWQKKyAgICAgICAgLy8gV2luMzIgaGFzIGEgdGhyZWFkIGhhbmRsZSBpbiBhZGRpdGlvbiB0byB0aGUgdGhyZWFkIElECisgICAgICAgIHRocmVhZC0+bUhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgMCwgdGhyZWFkX3J1bl93cmFwcGVyLCB0aHJlYWQsIDAsICZ0aHJlYWQtPm1USUQgKTsKKyAgICAgICAgaWYgKCB0aHJlYWQtPm1IYW5kbGUgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIFdBUk4oIDEsICJDcmVhdGVUaHJlYWQiICk7CisKKyAgICAgICAgICAgIC8vIGRlY3JlbWVudCB0aHJlYWQgY291bnQKKyAgICAgICAgICAgIENvbmRpdGlvbl9Mb2NrKCB0aHJlYWRfc051bV9jb25kICk7CisgICAgICAgICAgICB0aHJlYWRfc051bS0tOworICAgICAgICAgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworICAgICAgICB9CisKKyNlbHNlCisKKyAgICAgICAgLy8gc2luZ2xlLXRocmVhZGVkIC0tIGNhbGwgUnVuX1dyYXBwZXIgaW4gdGhpcyB0aHJlYWQKKyAgICAgICAgdGhyZWFkX3J1bl93cmFwcGVyKCB0aHJlYWQgKTsKKyNlbmRpZgorICAgIH0KK30gLy8gZW5kIHRocmVhZF9zdGFydAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdG9wIHRoZSBzcGVjaWZpZWQgb2JqZWN0J3MgdGhyZWFkIGV4ZWN1dGlvbiAoaWYgYW55KSBpbW1lZGlhdGVseS4KKyAqIERlY3JlbWVudHMgdGhyZWFkIGNvdW50IGFuZCByZXNldHMgdGhlIHRocmVhZCBJRC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgdGhyZWFkX3N0b3AoIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MqIHRocmVhZCApIHsKKworI2lmZGVmIEhBVkVfVEhSRUFECisgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYmVlbiBzdGFydGVkCisgICAgaWYgKCAhIHRocmVhZF9lcXVhbGlkKCB0aHJlYWQtPm1USUQsIHRocmVhZF96ZXJvaWQoKSApICkgeworCisgICAgICAgIC8vIGRlY3JlbWVudCB0aHJlYWQgY291bnQKKyAgICAgICAgQ29uZGl0aW9uX0xvY2soIHRocmVhZF9zTnVtX2NvbmQgKTsKKyAgICAgICAgdGhyZWFkX3NOdW0tLTsKKyAgICAgICAgQ29uZGl0aW9uX1NpZ25hbCggJnRocmVhZF9zTnVtX2NvbmQgKTsKKyAgICAgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworCisgICAgICAgIC8vIHVzZSBleGl0KCkgICBpZiBjYWxsZWQgZnJvbSB3aXRoaW4gdGhpcyB0aHJlYWQKKyAgICAgICAgLy8gdXNlIGNhbmNlbCgpIGlmIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZAorICAgICAgICBpZiAoIHRocmVhZF9lcXVhbGlkKCB0aHJlYWRfZ2V0aWQoKSwgdGhyZWFkLT5tVElEICkgKSB7CisKKyAgICAgICAgICAgIC8vIERlc3Ryb3kgdGhlIG9iamVjdAorICAgICAgICAgICAgU2V0dGluZ3NfRGVzdHJveSggdGhyZWFkICk7CisKKyAgICAgICAgICAgIC8vIEV4aXQKKyNpZiAgIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkKKyAgICAgICAgICAgIHB0aHJlYWRfZXhpdCggTlVMTCApOworI2Vsc2UgLy8gV2luMzIKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKCB0aHJlYWQtPm1IYW5kbGUgKTsKKyAgICAgICAgICAgIEV4aXRUaHJlYWQoIDAgKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvLyBDYW5jZWwKKyNpZiAgIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkKKyAgICAgICAgICAgIC8vIENyYXkgSjkwIGRvZXNuJ3QgaGF2ZSBwdGhyZWFkX2NhbmNlbDsgSXBlcmYgd29ya3Mgb2theSB3aXRob3V0CisjaWZkZWYgSEFWRV9QVEhSRUFEX0NBTkNFTAorICAgICAgICAgICAgcHRocmVhZF9jYW5jZWwoIHRocmVhZC0+bVRJRCApOworI2VuZGlmCisjZWxzZSAvLyBXaW4zMgorICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGRhbmdlcm91cyBmdW5jdGlvbjsgaXQncyBub3QKKyAgICAgICAgICAgIC8vIHN1Z2dlc3RlZCB0byBTdG9wKCkgdGhyZWFkcyBhIGxvdC4KKyAgICAgICAgICAgIFRlcm1pbmF0ZVRocmVhZCggdGhyZWFkLT5tSGFuZGxlLCAwICk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gRGVzdHJveSB0aGUgb2JqZWN0IG9ubHkgYWZ0ZXIga2lsbGluZyB0aGUgdGhyZWFkCisgICAgICAgICAgICBTZXR0aW5nc19EZXN0cm95KCB0aHJlYWQgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfSAvLyBlbmQgU3RvcAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgbmV3IHRocmVhZHMgY3JlYXRlZCBpbiAKKyAqIHRocmVhZF9zdGFydC4gCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgICBkZWZpbmVkKCBIQVZFX1dJTjMyX1RIUkVBRCApCitEV09SRCBXSU5BUEkKKyNlbHNlCit2b2lkKgorI2VuZGlmCit0aHJlYWRfcnVuX3dyYXBwZXIoIHZvaWQqIHBhcmFtUHRyICkgeworICAgIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MqIHRocmVhZCA9IChzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzKikgcGFyYW1QdHI7CisKKyAgICAvLyB3aGljaCB0eXBlIG9mIG9iamVjdCBhcmUgd2UKKyAgICBzd2l0Y2ggKCB0aHJlYWQtPm1UaHJlYWRNb2RlICkgeworICAgICAgICBjYXNlIGtNb2RlX1NlcnZlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTcGF3biBhIFNlcnZlciB0aHJlYWQgd2l0aCB0aGVzZSBzZXR0aW5ncyAqLworICAgICAgICAgICAgICAgIHNlcnZlcl9zcGF3biggdGhyZWFkICk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGtNb2RlX0NsaWVudDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTcGF3biBhIENsaWVudCB0aHJlYWQgd2l0aCB0aGVzZSBzZXR0aW5ncyAqLworICAgICAgICAgICAgICAgIGNsaWVudF9zcGF3biggdGhyZWFkICk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGtNb2RlX1JlcG9ydGVyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNwYXduIGEgUmVwb3J0ZXIgdGhyZWFkIHdpdGggdGhlc2Ugc2V0dGluZ3MgKi8KKyAgICAgICAgICAgICAgICByZXBvcnRlcl9zcGF3biggdGhyZWFkICk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGtNb2RlX0xpc3RlbmVyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCB0aGUgbm9uLXRlcm1pbmF0aW5nIHRocmVhZCBjb3VudAorICAgICAgICAgICAgICAgIHRocmVhZF9yZWdpc3Rlcl9ub250ZXJtKCk7CisgICAgICAgICAgICAgICAgLyogU3Bhd24gYSBMaXN0ZW5lciB0aHJlYWQgd2l0aCB0aGVzZSBzZXR0aW5ncyAqLworICAgICAgICAgICAgICAgIGxpc3RlbmVyX3NwYXduKCB0aHJlYWQgKTsKKyAgICAgICAgICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIG5vbi10ZXJtaW5hdGluZyB0aHJlYWQgY291bnQKKyAgICAgICAgICAgICAgICB0aHJlYWRfdW5yZWdpc3Rlcl9ub250ZXJtKCk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUwoMSwgIlVua25vd24gVGhyZWFkIFR5cGUhXG4iLCB0aHJlYWQpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICB9CisKKyNpZmRlZiBIQVZFX1BPU0lYX1RIUkVBRAorICAgIC8vIGRldGFjaCBUaHJlYWQuIElmIHNvbWVvbmUgYWxyZWFkeSBqb2luZWQgaXQgd2lsbCBub3QgZG8gYW55dGhpbmcKKyAgICAvLyBJZiBub29uZSBoYXMgdGhlbiBpdCB3aWxsIGZyZWUgcmVzb3VyY2VzIHVwb24gcmV0dXJuIGZyb20gdGhpcworICAgIC8vIGZ1bmN0aW9uIChSdW5fV3JhcHBlcikKKyAgICBwdGhyZWFkX2RldGFjaCh0aHJlYWQtPm1USUQpOworI2VuZGlmCisKKyAgICAvLyBkZWNyZW1lbnQgdGhyZWFkIGNvdW50IGFuZCBzZW5kIGNvbmRpdGlvbiBzaWduYWwKKyAgICBDb25kaXRpb25fTG9jayggdGhyZWFkX3NOdW1fY29uZCApOworICAgIHRocmVhZF9zTnVtLS07CisgICAgQ29uZGl0aW9uX1NpZ25hbCggJnRocmVhZF9zTnVtX2NvbmQgKTsKKyAgICBDb25kaXRpb25fVW5sb2NrKCB0aHJlYWRfc051bV9jb25kICk7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHN0YXJ0IHVwIGEgdGhyZWFkIGFmdGVyIGV4ZWN1dGluZyB0aGlzIG9uZQorICAgIGlmICggdGhyZWFkLT5ydW5OZXh0ICE9IE5VTEwgKSB7CisgICAgICAgIHRocmVhZF9zdGFydCggdGhyZWFkLT5ydW5OZXh0ICk7CisgICAgfQorCisgICAgLy8gRGVzdHJveSB0aGlzIHRocmVhZCBvYmplY3QKKyAgICBTZXR0aW5nc19EZXN0cm95KCB0aHJlYWQgKTsKKworICAgIHJldHVybiAwOworfSAvLyBlbmQgcnVuX3dyYXBwZXIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV2FpdCBmb3IgYWxsIHRocmVhZCBvYmplY3QncyBleGVjdXRpb24gdG8gY29tcGxldGUuIERlcGVuZHMgb24gdGhlCisgKiB0aHJlYWQgY291bnQgYmVpbmcgYWNjdXJhdGUgYW5kIHRoZSB0aHJlYWRzIHNlbmRpbmcgYSBjb25kaXRpb24KKyAqIHNpZ25hbCB3aGVuIHRoZXkgdGVybWluYXRlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCB0aHJlYWRfam9pbmFsbCggdm9pZCApIHsKKyAgICBDb25kaXRpb25fTG9jayggdGhyZWFkX3NOdW1fY29uZCApOworICAgIHdoaWxlICggdGhyZWFkX3NOdW0gPiAwICkgeworICAgICAgICBDb25kaXRpb25fV2FpdCggJnRocmVhZF9zTnVtX2NvbmQgKTsKKyAgICB9CisgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworfSAvLyBlbmQgSm9pbmFsbAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbXBhcmUgdGhlIHRocmVhZCBJRCdzIChpbkxlZnQgPT0gaW5SaWdodCk7IHJldHVybiB0cnVlIGlmIHRoZXkKKyAqIGFyZSBlcXVhbC4gT24gc29tZSBPUydzIG50aHJlYWRfdCBpcyBhIHN0cnVjdCBzbyA9PSB3aWxsIG5vdCB3b3JrLgorICogVE9ETyB1c2UgcHRocmVhZF9lcXVhbC4gQW55IFdpbjMyIGVxdWl2YWxlbnQ/PworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IHRocmVhZF9lcXVhbGlkKCBudGhyZWFkX3QgaW5MZWZ0LCBudGhyZWFkX3QgaW5SaWdodCApIHsKKyAgICByZXR1cm4obWVtY21wKCAmaW5MZWZ0LCAmaW5SaWdodCwgc2l6ZW9mKGluTGVmdCkpID09IDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXR1cm4gYSB6ZXJvJ2Qgb3V0IHRocmVhZCBJRC4gT24gc29tZSBPUydzIG50aHJlYWRfdCBpcyBhIHN0cnVjdAorICogc28gPT0gMCB3aWxsIG5vdCB3b3JrLgorICogW3N0YXRpY10KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK250aHJlYWRfdCB0aHJlYWRfemVyb2lkKCB2b2lkICkgeworICAgIG50aHJlYWRfdCBhOworICAgIG1lbXNldCggJmEsIDAsIHNpemVvZihhKSk7CisgICAgcmV0dXJuIGE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldCBhIHRocmVhZCB0byBiZSBpZ25vcmFibGUsIHNvIGpvaW5hbGwgd29uJ3Qgd2FpdCBvbiBpdAorICogdGhpcyBzaW1wbHkgZGVjcmVtZW50cyB0aGUgdGhyZWFkIGNvdW50IHRoYXQgam9pbmFsbCB1c2VzLgorICogVGhpcyBpcyB1dGlsaXplZCBieSB0aGUgcmVwb3J0ZXIgdGhyZWFkIHdoaWNoIGtub3dzIHdoZW4gaXQKKyAqIGlzIG9rIHRvIHF1aXQgKGFrYSBubyBwZW5kaW5nIHJlcG9ydHMpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCB0aHJlYWRfc2V0aWdub3JlKCApIHsKKyAgICBDb25kaXRpb25fTG9jayggdGhyZWFkX3NOdW1fY29uZCApOworICAgIHRocmVhZF9zTnVtLS07CisgICAgQ29uZGl0aW9uX1NpZ25hbCggJnRocmVhZF9zTnVtX2NvbmQgKTsKKyAgICBDb25kaXRpb25fVW5sb2NrKCB0aHJlYWRfc051bV9jb25kICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHVuc2V0IGEgdGhyZWFkIGZyb20gYmVpbmcgaWdub3JhYmxlLCBzbyBqb2luYWxsIHdpbGwgd2FpdCBvbiBpdAorICogdGhpcyBzaW1wbHkgaW5jcmVtZW50cyB0aGUgdGhyZWFkIGNvdW50IHRoYXQgam9pbmFsbCB1c2VzLgorICogVGhpcyBpcyB1dGlsaXplZCBieSB0aGUgcmVwb3J0ZXIgdGhyZWFkIHdoaWNoIGtub3dzIHdoZW4gaXQKKyAqIGlzIG9rIHRvIHF1aXQgKGFrYSBubyBwZW5kaW5nIHJlcG9ydHMpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCB0aHJlYWRfdW5zZXRpZ25vcmUoIHZvaWQgKSB7CisgICAgQ29uZGl0aW9uX0xvY2soIHRocmVhZF9zTnVtX2NvbmQgKTsKKyAgICB0aHJlYWRfc051bSsrOworICAgIENvbmRpdGlvbl9TaWduYWwoICZ0aHJlYWRfc051bV9jb25kICk7CisgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgYSB0aHJlYWQgdG8gYmUgbm9uLXRlcm1pbmF0aW5nLCBzbyBpZiB5b3UgY2FuY2VsIHRocm91Z2gKKyAqIEN0cmwtQyB0aGV5IGNhbiBiZSBpZ25vcmVkIGJ5IHRoZSBqb2luYWxsLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCB0aHJlYWRfcmVnaXN0ZXJfbm9udGVybSggdm9pZCApIHsKKyAgICBDb25kaXRpb25fTG9jayggdGhyZWFkX3NOdW1fY29uZCApOworICAgIG5vbnRlcm1pbmF0aW5nX251bSsrOyAKKyAgICBDb25kaXRpb25fVW5sb2NrKCB0aHJlYWRfc051bV9jb25kICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHVuc2V0IGEgdGhyZWFkIGZyb20gYmVpbmcgbm9uLXRlcm1pbmF0aW5nLCBzbyBpZiB5b3UgY2FuY2VsIHRocm91Z2gKKyAqIEN0cmwtQyB0aGV5IGNhbiBiZSBpZ25vcmVkIGJ5IHRoZSBqb2luYWxsLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCB0aHJlYWRfdW5yZWdpc3Rlcl9ub250ZXJtKCB2b2lkICkgeworICAgIENvbmRpdGlvbl9Mb2NrKCB0aHJlYWRfc051bV9jb25kICk7CisgICAgaWYgKCBub250ZXJtaW5hdGluZ19udW0gPT0gMCApIHsKKyAgICAgICAgLy8gbm9udGVybWluYXRpbmcgaGFzIGJlZW4gcmVsZWFzZWQgd2l0aCByZWxlYXNlX25vbnRlcm0KKyAgICAgICAgLy8gQWRkIGJhY2sgdG8gdGhlIHRocmVhZHMgdG8gd2FpdCBvbgorICAgICAgICB0aHJlYWRfc051bSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG5vbnRlcm1pbmF0aW5nX251bS0tOyAKKyAgICB9CisgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0aGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFsbCBub24tdGVybWluYXRpbmcgdGhyZWFkcyBmcm9tIHRoZSBsaXN0CisgKiBvZiBhY3RpdmUgdGhyZWFkcywgc28gdGhhdCB3aGVuIGFsbCB0ZXJtaW5hdGluZyB0aHJlYWRzIHF1aXQKKyAqIHRoZSBqb2luYWxsIHdpbGwgY29tcGxldGUuIFRoaXMgaXMgY2FsbGVkIG9uIGEgQ3RybC1DIGlucHV0LiBJdCBpcworICogYWxzbyB1c2VkIGJ5IHRoZSAtUCB1c2FnZSBvbiB0aGUgc2VydmVyIHNpZGUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCB0aHJlYWRfcmVsZWFzZV9ub250ZXJtKCBpbnQgaW50ZXJydXB0ICkgeworICAgIENvbmRpdGlvbl9Mb2NrKCB0aHJlYWRfc051bV9jb25kICk7CisgICAgdGhyZWFkX3NOdW0gLT0gbm9udGVybWluYXRpbmdfbnVtOworICAgIGlmICggdGhyZWFkX3NOdW0gPiAxICYmIG5vbnRlcm1pbmF0aW5nX251bSA+IDAgJiYgaW50ZXJydXB0ICE9IDAgKSB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgd2FpdF9zZXJ2ZXJfdGhyZWFkcyApOworICAgIH0KKyAgICBub250ZXJtaW5hdGluZ19udW0gPSAwOworICAgIENvbmRpdGlvbl9TaWduYWwoICZ0aHJlYWRfc051bV9jb25kICk7CisgICAgQ29uZGl0aW9uX1VubG9jayggdGhyZWFkX3NOdW1fY29uZCApOworICAgIHJldHVybiB0aHJlYWRfc051bTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBjdXJyZW50bHkgcnVubmluZyAoZG9lc24ndCBpbmNsdWRlCisgKiBhY3RpdmUgdGhyZWFkcyB0aGF0IGhhdmUgY2FsbGVkIHNldGRhZW1vbiAoYWthIHJlcG9ydGVyIHRocmVhZCkpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitpbnQgdGhyZWFkX251bXVzZXJ0aHJlYWRzKCB2b2lkICkgeworICAgIHJldHVybiB0aHJlYWRfc051bTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFsbG93IGFub3RoZXIgdGhyZWFkIHRvIGV4ZWN1dGUuIElmIG5vIG90aGVyIHRocmVhZHMgYXJlIHJ1bmFibGUgdGhpcworICogaXMgbm90IGd1YXJlbnRlZWQgdG8gYWN0dWFsbHkgcmVzdC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgdGhyZWFkX3Jlc3QgKCB2b2lkICkgeworI2lmIGRlZmluZWQoIEhBVkVfVEhSRUFEICkKKyNpZiBkZWZpbmVkKCBIQVZFX1BPU0lYX1RIUkVBRCApCisjZWxzZSAvLyBXaW4zMgorICAgIFN3aXRjaFRvVGhyZWFkKCApOworI2VuZGlmCisjZW5kaWYKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvY29tcGF0L2RlbGF5LmNwcCBiL2lwZXJmLTIuMC41L2NvbXBhdC9kZWxheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmNDFiNQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbXBhdC9kZWxheS5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIGRlbGF5LmMKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBhY2N1cmF0ZSBtaWNyb3NlY29uZCBkZWxheQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiVGltZXN0YW1wLmhwcCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAiZGVsYXkuaHBwIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBIG1pY3JvLXNlY29uZCBkZWxheSBmdW5jdGlvbiB1c2luZyBQT1NJWCBuYW5vc2xlZXAoKS4gVGhpcyBhbGxvd3MgYQorICogaGlnaGVyIHRpbWluZyByZXNvbHV0aW9uICh1bmRlciBMaW51eCBlLmcuIGl0IHVzZXMgaHJ0aW1lcnMpLCBkb2VzIG5vdAorICogYWZmZWN0IGFueSBzaWduYWxzLCBhbmQgd2lsbCB1c2UgdXAgcmVtYWluaW5nIHRpbWUgd2hlbiBpbnRlcnJ1cHRlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgZGVsYXlfbG9vcCh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHJlcXVlc3RlZCwgcmVtYWluaW5nOworCisgICAgcmVxdWVzdGVkLnR2X3NlYyAgPSAwOworICAgIHJlcXVlc3RlZC50dl9uc2VjID0gdXNlYyAqIDEwMDBMOworCisgICAgd2hpbGUgKG5hbm9zbGVlcCgmcmVxdWVzdGVkLCAmcmVtYWluaW5nKSA9PSAtMSkKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgcmVxdWVzdGVkID0gcmVtYWluaW5nOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdBUk5fZXJybm8oMSwgIm5hbm9zbGVlcCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2NvbXBhdC9lcnJvci5jIGIvaXBlcmYtMi4wLjUvY29tcGF0L2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5ZWNjOQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbXBhdC9lcnJvci5jCkBAIC0wLDAgKzEsMjEwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogZXJyb3IuYworICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVycm9yIGhhbmRsZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnQgYSBzaW1wbGUgV2luMzIgc3RyZXJyb3IgZnVuY3Rpb24gZm9yIG91ciBwdXJwb3Nlcy4KKyAqIFRoZXNlIGVycm9yIHZhbHVlcyB3ZXJlbid0IGhhbmRsZWQgYnkgRm9ybWF0TWVzc2FnZTsKKyAqIGFueSBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkgbm90Pz8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IG1lc2cgeworICAgIERXT1JEICAgICAgIGVycjsKKyAgICBjb25zdCBjaGFyKiBzdHI7Cit9OworCitjb25zdCBzdHJ1Y3QgbWVzZyBlcnJvcl9tZXNnc1tdID0KK3sKKyAgICB7IFdTQUVBQ0NFUywgICAgICAgICAgICAgIlBlcm1pc3Npb24gZGVuaWVkIn0sCisgICAgeyBXU0FFQUREUklOVVNFLCAgICAgICAgICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIn0sCisgICAgeyBXU0FFQUREUk5PVEFWQUlMLCAgICAgICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIn0sCisgICAgeyBXU0FFQUZOT1NVUFBPUlQsICAgICAgICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIGZhbWlseSJ9LAorICAgIHsgV1NBRUFMUkVBRFksICAgICAgICAgICAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MifSwKKyAgICB7IFdTQUVDT05OQUJPUlRFRCwgICAgICAgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0In0sCisgICAgeyBXU0FFQ09OTlJFRlVTRUQsICAgICAgICJDb25uZWN0aW9uIHJlZnVzZWQifSwKKyAgICB7IFdTQUVDT05OUkVTRVQsICAgICAgICAgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciJ9LAorICAgIHsgV1NBRURFU1RBRERSUkVRLCAgICAgICAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCJ9LAorICAgIHsgV1NBRUZBVUxULCAgICAgICAgICAgICAiQmFkIGFkZHJlc3MifSwKKyAgICB7IFdTQUVIT1NURE9XTiwgICAgICAgICAgIkhvc3QgaXMgZG93biJ9LAorICAgIHsgV1NBRUhPU1RVTlJFQUNILCAgICAgICAiTm8gcm91dGUgdG8gaG9zdCJ9LAorICAgIHsgV1NBRUlOUFJPR1JFU1MsICAgICAgICAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyJ9LAorICAgIHsgV1NBRUlOVFIsICAgICAgICAgICAgICAiSW50ZXJydXB0ZWQgZnVuY3Rpb24gY2FsbC4ifSwKKyAgICB7IFdTQUVJTlZBTCwgICAgICAgICAgICAgIkludmFsaWQgYXJndW1lbnQuIn0sCisgICAgeyBXU0FFSVNDT05OLCAgICAgICAgICAgICJTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQuIn0sCisgICAgeyBXU0FFTUZJTEUsICAgICAgICAgICAgICJUb28gbWFueSBvcGVuIGZpbGVzLiJ9LAorICAgIHsgV1NBRU1TR1NJWkUsICAgICAgICAgICAiTWVzc2FnZSB0b28gbG9uZyJ9LAorICAgIHsgV1NBRU5FVERPV04sICAgICAgICAgICAiTmV0d29yayBpcyBkb3duIn0sCisgICAgeyBXU0FFTkVUUkVTRVQsICAgICAgICAgICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBvbiByZXNldCJ9LAorICAgIHsgV1NBRU5FVFVOUkVBQ0gsICAgICAgICAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSJ9LAorICAgIHsgV1NBRU5PQlVGUywgICAgICAgICAgICAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZS4ifSwKKyAgICB7IFdTQUVOT1BST1RPT1BULCAgICAgICAgIkJhZCBwcm90b2NvbCBvcHRpb24uIn0sCisgICAgeyBXU0FFTk9UQ09OTiwgICAgICAgICAgICJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCJ9LAorICAgIHsgV1NBRU5PVFNPQ0ssICAgICAgICAgICAiU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0LiJ9LAorICAgIHsgV1NBRU9QTk9UU1VQUCwgICAgICAgICAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQifSwKKyAgICB7IFdTQUVQRk5PU1VQUE9SVCwgICAgICAgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIn0sCisgICAgeyBXU0FFUFJPQ0xJTSwgICAgICAgICAgICJUb28gbWFueSBwcm9jZXNzZXMuIn0sCisgICAgeyBXU0FFUFJPVE9OT1NVUFBPUlQsICAgICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIn0sCisgICAgeyBXU0FFUFJPVE9UWVBFLCAgICAgICAgICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQifSwKKyAgICB7IFdTQUVTSFVURE9XTiwgICAgICAgICAgIkNhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93biJ9LAorICAgIHsgV1NBRVNPQ0tUTk9TVVBQT1JULCAgICAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZC4ifSwKKyAgICB7IFdTQUVUSU1FRE9VVCwgICAgICAgICAgIkNvbm5lY3Rpb24gdGltZWQgb3V0LiJ9LAorICAgIHsgV1NBVFlQRV9OT1RfRk9VTkQsICAgICAiQ2xhc3MgdHlwZSBub3QgZm91bmQuIn0sCisgICAgeyBXU0FFV09VTERCTE9DSywgICAgICAgICJSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSJ9LAorICAgIHsgV1NBSE9TVF9OT1RfRk9VTkQsICAgICAiSG9zdCBub3QgZm91bmQuIn0sCisgICAgeyBXU0FfSU5WQUxJRF9IQU5ETEUsICAgICJTcGVjaWZpZWQgZXZlbnQgb2JqZWN0IGhhbmRsZSBpcyBpbnZhbGlkLiJ9LAorICAgIHsgV1NBX0lOVkFMSURfUEFSQU1FVEVSLCAiT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4ifSwKKyAgICB7IFdTQV9JT19JTkNPTVBMRVRFLCAgICAgIk92ZXJsYXBwZWQgSS9PIGV2ZW50IG9iamVjdCBub3QgaW4gc2lnbmFsZWQgc3RhdGUuIn0sCisgICAgeyBXU0FfSU9fUEVORElORywgICAgICAgICJPdmVybGFwcGVkIG9wZXJhdGlvbnMgd2lsbCBjb21wbGV0ZSBsYXRlci4ifSwKKyAgICB7IFdTQV9OT1RfRU5PVUdIX01FTU9SWSwgIkluc3VmZmljaWVudCBtZW1vcnkgYXZhaWxhYmxlLiJ9LAorICAgIHsgV1NBTk9USU5JVElBTElTRUQsICAgICAiU3VjY2Vzc2Z1bCBXU0FTdGFydHVwIG5vdCB5ZXQgcGVyZm9ybWVkLiJ9LAorICAgIHsgV1NBTk9fREFUQSwgICAgICAgICAgICAiVmFsaWQgbmFtZSwgbm8gZGF0YSByZWNvcmQgb2YgcmVxdWVzdGVkIHR5cGUuIn0sCisgICAgeyBXU0FOT19SRUNPVkVSWSwgICAgICAgICJUaGlzIGlzIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yLiJ9LAorICAgIHsgV1NBU1lTQ0FMTEZBSUxVUkUsICAgICAiU3lzdGVtIGNhbGwgZmFpbHVyZS4ifSwKKyAgICB7IFdTQVNZU05PVFJFQURZLCAgICAgICAgIk5ldHdvcmsgc3Vic3lzdGVtIGlzIHVuYXZhaWxhYmxlLiJ9LAorICAgIHsgV1NBVFJZX0FHQUlOLCAgICAgICAgICAiTm9uLWF1dGhvcml0YXRpdmUgaG9zdCBub3QgZm91bmQuIn0sCisgICAgeyBXU0FWRVJOT1RTVVBQT1JURUQsICAgICJXSU5TT0NLLkRMTCB2ZXJzaW9uIG91dCBvZiByYW5nZS4ifSwKKyAgICB7IFdTQUVESVNDT04sICAgICAgICAgICAgIkdyYWNlZnVsIHNodXRkb3duIGluIHByb2dyZXNzLiJ9LAorICAgIHsgV1NBX09QRVJBVElPTl9BQk9SVEVELCAiT3ZlcmxhcHBlZCBvcGVyYXRpb24gYWJvcnRlZC4ifSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgIk5vIGVycm9yLiJ9CisKKyAgICAvKiBUaGVzZSBhcHBlYXJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgYnV0IGRpZG4ndCBjb21waWxlLgorICAgICAqIHsgV1NBSU5WQUxJRFBST0NUQUJMRSwgICAiSW52YWxpZCBwcm9jZWR1cmUgdGFibGUgZnJvbSBzZXJ2aWNlIHByb3ZpZGVyLiIgfSwKKyAgICAgKiB7IFdTQUlOVkFMSURQUk9WSURFUiwgICAgIkludmFsaWQgc2VydmljZSBwcm92aWRlciB2ZXJzaW9uIG51bWJlci4iIH0sCisgICAgICogeyBXU0FQUk9WSURFUkZBSUxFRElOSVQsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhIHNlcnZpY2UgcHJvdmlkZXIuIiB9LAorICAgICAqLworCit9OyAvKiBlbmQgZXJyb3JfbWVzZ3NbXSAqLworCitjb25zdCBjaGFyKiB3aW5zb2NrX3N0cmVycm9yKCBEV09SRCBpbkVycm5vICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHdpbnNvY2tfc3RyZXJyb3IKKyAqCisgKiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IgY29kZS4gVGhlIGVycm9yIG1lc3NhZ2VzCisgKiB3ZXJlIHRha2VuIGZyb20gTWljcm9zb2Z0J3Mgb25saW5lIGRldmVsb3BlciBsaWJyYXJ5LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyKiB3aW5zb2NrX3N0cmVycm9yKCBEV09SRCBpbkVycm5vICkgeworICAgIGNvbnN0IGNoYXIqIHN0ciA9ICJVbmtub3duIGVycm9yIjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IHNpemVvZihlcnJvcl9tZXNncyk7IGkrKyApIHsKKyAgICAgICAgaWYgKCBlcnJvcl9tZXNnc1tpXS5lcnIgPT0gaW5FcnJubyApIHsKKyAgICAgICAgICAgIHN0ciA9IGVycm9yX21lc2dzW2ldLnN0cjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKK30gLyogZW5kIHdpbnNvY2tfc3RyZXJyb3IgKi8KKworI2VuZGlmIC8qIFdJTjMyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHdhcm4KKyAqCisgKiBQcmludHMgbWVzc2FnZSBhbmQgcmV0dXJuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgd2FybiggY29uc3QgY2hhciAqaW5NZXNzYWdlLCBjb25zdCBjaGFyICppbkZpbGUsIGludCBpbkxpbmUgKSB7CisgICAgZmZsdXNoKCAwICk7CisKKyNpZmRlZiBOREVCVUcKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIlcyBmYWlsZWRcbiIsIGluTWVzc2FnZSApOworI2Vsc2UKKworICAgIC8qIHdoaWxlIGRlYnVnZ2luZyBvdXRwdXQgZmlsZS9saW5lIG51bWJlciBhbHNvICovCisgICAgZnByaW50Ziggc3RkZXJyLCAiJXMgZmFpbGVkICglczolZClcbiIsIGluTWVzc2FnZSwgaW5GaWxlLCBpbkxpbmUgKTsKKyNlbmRpZgorfSAvKiBlbmQgd2FybiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3YXJuX2Vycm5vCisgKgorICogUHJpbnRzIG1lc3NhZ2UgYW5kIGVycm5vIG1lc3NhZ2UsIGFuZCByZXR1cm4uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgd2Fybl9lcnJubyggY29uc3QgY2hhciAqaW5NZXNzYWdlLCBjb25zdCBjaGFyICppbkZpbGUsIGludCBpbkxpbmUgKSB7CisgICAgaW50IG15X2VycjsKKyAgICBjb25zdCBjaGFyKiBteV9zdHI7CisKKyAgICAvKiBnZXQgcGxhdGZvcm0ncyBlcnJubyBhbmQgZXJyb3IgbWVzc2FnZSAqLworI2lmZGVmIFdJTjMyCisgICAgbXlfZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgbXlfc3RyID0gd2luc29ja19zdHJlcnJvciggbXlfZXJyICk7CisjZWxzZQorICAgIG15X2VyciA9IGVycm5vOworICAgIG15X3N0ciA9IHN0cmVycm9yKCBteV9lcnIgKTsKKyNlbmRpZgorCisgICAgZmZsdXNoKCAwICk7CisKKyNpZmRlZiBOREVCVUcKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIlcyBmYWlsZWQ6ICVzXG4iLCBpbk1lc3NhZ2UsIG15X3N0ciApOworI2Vsc2UKKworICAgIC8qIHdoaWxlIGRlYnVnZ2luZyBvdXRwdXQgZmlsZS9saW5lIG51bWJlciBhbmQgZXJybm8gdmFsdWUgYWxzbyAqLworICAgIGZwcmludGYoIHN0ZGVyciwgIiVzIGZhaWxlZCAoJXM6JWQpOiAlcyAoJWQpXG4iLAorICAgICAgICAgICAgIGluTWVzc2FnZSwgaW5GaWxlLCBpbkxpbmUsIG15X3N0ciwgbXlfZXJyICk7CisjZW5kaWYKK30gLyogZW5kIHdhcm5fZXJybm8gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2NvbXBhdC9nZXR0aW1lb2ZkYXkuYyBiL2lwZXJmLTIuMC41L2NvbXBhdC9nZXR0aW1lb2ZkYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjI1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvY29tcGF0L2dldHRpbWVvZmRheS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBnZXR0aW1lb2ZkYXkuYworICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEEgKGhhY2spIGltcGxlbWVudGF0aW9uIG9mIGdldHRpbWVvZmRheSBmb3IgV2luZG93cy4KKyAqIFNpbmNlIEkgc2VuZCBzZWMvdXNlYyBpbiBVRFAgcGFja2V0cywgdGhpcyBtYWRlIHRoZSBtb3N0IHNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorICAgICNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCisKKyAgICAjaW5jbHVkZSAiaGVhZGVycy5oIgorICAgICNpbmNsdWRlICJnZXR0aW1lb2ZkYXkuaCIKKworICAgICNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50IGdldHRpbWVvZmRheSggc3RydWN0IHRpbWV2YWwqIHR2LCB2b2lkKiB0aW1lem9uZSApIHsKKyAgICBGSUxFVElNRSB0aW1lOworICAgIGRvdWJsZSAgIHRpbWVkOworCisgICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoICZ0aW1lICk7CisKKyAgICAvLyBBcHBhcmVudGx5IFdpbjMyIGhhcyB1bml0cyBvZiAxZS03IHNlYyAodGVudGhzIG9mIG1pY3Jvc2VjcykKKyAgICAvLyA0Mjk0OTY3Mjk2IGlzIDJeMzIsIHRvIHNoaWZ0IGhpZ2ggd29yZCBvdmVyCisgICAgLy8gMTE2NDQ0NzM2MDAgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4KKyAgICAvLyB0aGUgV2luMzIgZXBvY2ggMTYwMS1KYW4tMDEgYW5kIHRoZSBVbml4IGVwb2NoIDE5NzAtSmFuLTAxCisgICAgLy8gVGVzdHMgZm91bmQgZmxvYXRpbmcgcG9pbnQgdG8gYmUgMTB4IGZhc3RlciB0aGFuIDY0Yml0IGludCBtYXRoLgorCisgICAgdGltZWQgPSAoKHRpbWUuZHdIaWdoRGF0ZVRpbWUgKiA0Mjk0OTY3Mjk2ZS03KSAtIDExNjQ0NDczNjAwLjApICsKKyAgICAgICAgICAgICh0aW1lLmR3TG93RGF0ZVRpbWUgICogMWUtNyk7CisKKyAgICB0di0+dHZfc2VjICA9IChsb25nKSB0aW1lZDsKKyAgICB0di0+dHZfdXNlYyA9IChsb25nKSAoKHRpbWVkIC0gdHYtPnR2X3NlYykgKiAxZTYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworICAgICNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9HRVRUSU1FT0ZEQVkgKi8KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2NvbXBhdC9oZWFkZXJzX3NsaW0uaCBiL2lwZXJmLTIuMC41L2NvbXBhdC9oZWFkZXJzX3NsaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTU4Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvY29tcGF0L2hlYWRlcnNfc2xpbS5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgSEVBREVSU19TTElNX0gKKyNkZWZpbmUgSEVBREVSU19TTElNX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaGVhZGVyc19zbGltLmgKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiBDb3B5cmlnaHQgMTk5OSwgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMuCisgKiAkSWQ6IGhlYWRlcnNfc2xpbS5oLHYgMS4xLjEuMSAyMDAxLzEyLzEyIDIzOjM3OjQ4IGpkdWdhbiBFeHAgJAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaGVhZGVycworICoKKyAqIE1vc3Qgc3lzdGVtIGhlYWRlcnMgcmVxdWlyZWQgYnkgaXBlcmYuCisgKiBUaGlzIGlzIGEgc3Vic2V0IG9mIGxpYi9oZWFkZXJzLmgsIHRvIGJlIHVzZWQgb25seSB3aGlsZSBydW5uaW5nCisgKiBjb25maWd1cmUuIEl0IGV4Y2x1ZGVzIHRoaW5ncyBjb25kaXRpb25hbCBvbiBoYXZpbmcgX2FscmVhZHlfCisgKiBydW4gY29uZmlndXJlLCBhbmQgV2luMzIgc3R1ZmYuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHN0YW5kYXJkIEMgaGVhZGVycyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIHVuaXggaGVhZGVycyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+ICAgLyogbmV0aW5ldC9pbi5oIG11c3QgYmUgYmVmb3JlIHRoaXMgb24gU3VuT1MgKi8KKworI2VuZGlmIC8qIEhFQURFUlNfU0xJTV9IICovCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9jb21wYXQvaW5ldF9udG9wLmMgYi9pcGVyZi0yLjAuNS9jb21wYXQvaW5ldF9udG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3MzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbXBhdC9pbmV0X250b3AuYwpAQCAtMCwwICsxLDE4MyBAQAorI2luY2x1ZGUgImluZXRfYXRvbi5oIgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEgIEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNCisgKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAorICogSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCisgKiBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCisgKiBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKi8KKworI2lmbmRlZiBIQVZFX0lORVRfTlRPUAorI2RlZmluZSBOU19JTlQxNlNaICAgICAgIDIKKyNkZWZpbmUgTlNfSU5BRERSU1ogICAgIDQKKyNkZWZpbmUgTlNfSU42QUREUlNaICAgIDE2CisKKy8qCisgKiBXQVJOSU5HOiBEb24ndCBldmVuIGNvbnNpZGVyIHRyeWluZyB0byBjb21waWxlIHRoaXMgb24gYSBzeXN0ZW0gd2hlcmUKKyAqIHNpemVvZihpbnQpIDwgNC4gIHNpemVvZihpbnQpID4gNCBpcyBmaW5lOyBhbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorICovCisKKworLyogY2hhciAqCisgKiBpc2NfbmV0X250b3AoYWYsIHNyYywgZHN0LCBzaXplKQorICogICAgICBjb252ZXJ0IGEgbmV0d29yayBmb3JtYXQgYWRkcmVzcyB0byBwcmVzZW50YXRpb24gZm9ybWF0LgorICogcmV0dXJuOgorICogICAgICBwb2ludGVyIHRvIHByZXNlbnRhdGlvbiBmb3JtYXQgYWRkcmVzcyAoYGRzdCcpLCBvciBOVUxMIChzZWUgZXJybm8pLgorICogYXV0aG9yOgorICogICAgICBQYXVsIFZpeGllLCAxOTk2LgorICovCitpbnQKK2luZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN3aXRjaCAoIGFmICkgeworICAgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgICAgICByZXR1cm4oaW5ldF9udG9wNChzcmMsIGRzdCwgc2l6ZSkpOworI2lmZGVmIEhBVkVfSVBWNgorICAgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICAgICAgcmV0dXJuKGluZXRfbnRvcDYoc3JjLCBkc3QsIHNpemUpKTsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIE5PVFJFQUNIRUQgKi8KK30KKworLyogY29uc3QgY2hhciAqCisgKiBpbmV0X250b3A0KHNyYywgZHN0LCBzaXplKQorICogICAgICBmb3JtYXQgYW4gSVB2NCBhZGRyZXNzCisgKiByZXR1cm46CisgKiAgICAgIGBkc3QnIChhcyBhIGNvbnN0KQorICogbm90ZXM6CisgKiAgICAgICgxKSB1c2VzIG5vIHN0YXRpY3MKKyAqICAgICAgKDIpIHRha2VzIGEgdW5zaWduZWQgY2hhciogbm90IGFuIGluX2FkZHIgYXMgaW5wdXQKKyAqIGF1dGhvcjoKKyAqICAgICAgUGF1bCBWaXhpZSwgMTk5Ni4KKyAqLworaW50CitpbmV0X250b3A0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyICpmbXQgPSAiJXUuJXUuJXUuJXUiOworICAgIGNoYXIgdG1wW3NpemVvZiAiMjU1LjI1NS4yNTUuMjU1Il07CisKKyAgICBpZiAoIChzaXplX3Qpc3ByaW50Zih0bXAsIGZtdCwgc3JjWzBdLCBzcmNbMV0sIHNyY1syXSwgc3JjWzNdKSA+PSBzaXplICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3RyY3B5KGRzdCwgdG1wKTsKKworICAgIHJldHVybiAxOworfQorCisvKiBjb25zdCBjaGFyICoKKyAqIGlzY19pbmV0X250b3A2KHNyYywgZHN0LCBzaXplKQorICogICAgICBjb252ZXJ0IElQdjYgYmluYXJ5IGFkZHJlc3MgaW50byBwcmVzZW50YXRpb24gKHByaW50YWJsZSkgZm9ybWF0CisgKiBhdXRob3I6CisgKiAgICAgIFBhdWwgVml4aWUsIDE5OTYuCisgKi8KKyNpZmRlZiBIQVZFX0lQVjYKK2ludAoraW5ldF9udG9wNihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpIHsKKyAgICAvKgorICAgICAqIE5vdGUgdGhhdCBpbnQzMl90IGFuZCBpbnQxNl90IG5lZWQgb25seSBiZSAiYXQgbGVhc3QiIGxhcmdlIGVub3VnaAorICAgICAqIHRvIGNvbnRhaW4gYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuICBPbiBzb21lIHN5c3RlbXMsIGxpa2UKKyAgICAgKiBDcmF5cywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggMTYgYml0cy4KKyAgICAgKiBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkCisgICAgICogdG8gdXNlIHBvaW50ZXIgb3ZlcmxheXMuICBBbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorICAgICAqLworICAgIGNoYXIgdG1wW3NpemVvZiAiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6MjU1LjI1NS4yNTUuMjU1Il0sICp0cDsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgYmFzZSwgbGVuOworICAgIH0gYmVzdCwgY3VyOworICAgIHVuc2lnbmVkIGludCB3b3Jkc1tOU19JTjZBRERSU1ogLyBOU19JTlQxNlNaXTsKKyAgICBpbnQgaTsKKworICAgIC8qCisgICAgICogUHJlcHJvY2VzczoKKyAgICAgKiAgICAgIENvcHkgdGhlIGlucHV0IChieXRld2lzZSkgYXJyYXkgaW50byBhIHdvcmR3aXNlIGFycmF5LgorICAgICAqICAgICAgRmluZCB0aGUgbG9uZ2VzdCBydW4gb2YgMHgwMCdzIGluIHNyY1tdIGZvciA6OiBzaG9ydGhhbmRpbmcuCisgICAgICovCisgICAgbWVtc2V0KHdvcmRzLCAnXDAnLCBzaXplb2Ygd29yZHMpOworICAgIGZvciAoIGkgPSAwOyBpIDwgTlNfSU42QUREUlNaOyBpKysgKQorICAgICAgICB3b3Jkc1tpIC8gMl0gfD0gKHNyY1tpXSA8PCAoKDEgLSAoaSAlIDIpKSA8PCAzKSk7CisgICAgYmVzdC5iYXNlID0gLTE7CisgICAgY3VyLmJhc2UgPSAtMTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IChOU19JTjZBRERSU1ogLyBOU19JTlQxNlNaKTsgaSsrICkgeworICAgICAgICBpZiAoIHdvcmRzW2ldID09IDAgKSB7CisgICAgICAgICAgICBpZiAoIGN1ci5iYXNlID09IC0xICkKKyAgICAgICAgICAgICAgICBjdXIuYmFzZSA9IGksIGN1ci5sZW4gPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN1ci5sZW4rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggY3VyLmJhc2UgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuICkKKyAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGN1cjsKKyAgICAgICAgICAgICAgICBjdXIuYmFzZSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICggY3VyLmJhc2UgIT0gLTEgKSB7CisgICAgICAgIGlmICggYmVzdC5iYXNlID09IC0xIHx8IGN1ci5sZW4gPiBiZXN0LmxlbiApCisgICAgICAgICAgICBiZXN0ID0gY3VyOworICAgIH0KKyAgICBpZiAoIGJlc3QuYmFzZSAhPSAtMSAmJiBiZXN0LmxlbiA8IDIgKQorICAgICAgICBiZXN0LmJhc2UgPSAtMTsKKworICAgIC8qCisgICAgICogRm9ybWF0IHRoZSByZXN1bHQuCisgICAgICovCisgICAgdHAgPSB0bXA7CisgICAgZm9yICggaSA9IDA7IGkgPCAoTlNfSU42QUREUlNaIC8gTlNfSU5UMTZTWik7IGkrKyApIHsKKyAgICAgICAgLyogQXJlIHdlIGluc2lkZSB0aGUgYmVzdCBydW4gb2YgMHgwMCdzPyAqLworICAgICAgICBpZiAoIGJlc3QuYmFzZSAhPSAtMSAmJiBpID49IGJlc3QuYmFzZSAmJgorICAgICAgICAgICAgIGkgPCAoYmVzdC5iYXNlICsgYmVzdC5sZW4pICkgeworICAgICAgICAgICAgaWYgKCBpID09IGJlc3QuYmFzZSApCisgICAgICAgICAgICAgICAgKnRwKysgPSAnOic7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvKiBBcmUgd2UgZm9sbG93aW5nIGFuIGluaXRpYWwgcnVuIG9mIDB4MDBzIG9yIGFueSByZWFsIGhleD8gKi8KKyAgICAgICAgaWYgKCBpICE9IDAgKQorICAgICAgICAgICAgKnRwKysgPSAnOic7CisgICAgICAgIC8qIElzIHRoaXMgYWRkcmVzcyBhbiBlbmNhcHN1bGF0ZWQgSVB2ND8gKi8KKyAgICAgICAgaWYgKCBpID09IDYgJiYgYmVzdC5iYXNlID09IDAgJiYKKyAgICAgICAgICAgICAoYmVzdC5sZW4gPT0gNiB8fCAoYmVzdC5sZW4gPT0gNSAmJiB3b3Jkc1s1XSA9PSAweGZmZmYpKSApIHsKKyAgICAgICAgICAgIGlmICggIWluZXRfbnRvcDQoc3JjKzEyLCB0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIHRtcCAtICh0cCAtIHRtcCkpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHRwICs9IHN0cmxlbih0cCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0cCArPSBzcHJpbnRmKHRwLCAiJXgiLCB3b3Jkc1tpXSk7CisgICAgfQorICAgIC8qIFdhcyBpdCBhIHRyYWlsaW5nIHJ1biBvZiAweDAwJ3M/ICovCisgICAgaWYgKCBiZXN0LmJhc2UgIT0gLTEgJiYgKGJlc3QuYmFzZSArIGJlc3QubGVuKSA9PQorICAgICAgICAgKE5TX0lONkFERFJTWiAvIE5TX0lOVDE2U1opICkKKyAgICAgICAgKnRwKysgPSAnOic7CisgICAgKnRwKysgPSAnXDAnOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3Igb3ZlcmZsb3csIGNvcHksIGFuZCB3ZSdyZSBkb25lLgorICAgICAqLworICAgIGlmICggKHNpemVfdCkodHAgLSB0bXApID4gc2l6ZSApIHsKKyAgICAgICAgZXJybm8gPSBFTk9TUEM7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdHJjcHkoZHN0LCB0bXApOworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworI2VuZGlmIC8qIEhBVkVfSU5FVF9OVE9QICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2NvbXBhdC9pbmV0X3B0b24uYyBiL2lwZXJmLTIuMC41L2NvbXBhdC9pbmV0X3B0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU3ODllCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvY29tcGF0L2luZXRfcHRvbi5jCkBAIC0wLDAgKzEsMjA5IEBACisjaW5jbHVkZSAiaW5ldF9hdG9uLmgiCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSAgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0KKyAqIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwKKyAqIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcKKyAqIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqLworCisjaWZuZGVmIEhBVkVfSU5FVF9QVE9OCisjZGVmaW5lIE5TX0lOVDE2U1ogICAgICAgMgorI2RlZmluZSBOU19JTkFERFJTWiAgICAgNAorI2RlZmluZSBOU19JTjZBRERSU1ogICAgMTYKKworLyogaW50CisgKiBpc2NfbmV0X3B0b24oYWYsIHNyYywgZHN0KQorICogICAgICBjb252ZXJ0IGZyb20gcHJlc2VudGF0aW9uIGZvcm1hdCAod2hpY2ggdXN1YWxseSBtZWFucyBBU0NJSSBwcmludGFibGUpCisgKiAgICAgIHRvIG5ldHdvcmsgZm9ybWF0ICh3aGljaCBpcyB1c3VhbGx5IHNvbWUga2luZCBvZiBiaW5hcnkgZm9ybWF0KS4KKyAqIHJldHVybjoKKyAqICAgICAgMSBpZiB0aGUgYWRkcmVzcyB3YXMgdmFsaWQgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBmYW1pbHkKKyAqICAgICAgMCBpZiB0aGUgYWRkcmVzcyB3YXNuJ3QgdmFsaWQgKGBkc3QnIGlzIHVudG91Y2hlZCBpbiB0aGlzIGNhc2UpCisgKiBhdXRob3I6CisgKiAgICAgIFBhdWwgVml4aWUsIDE5OTYuCisgKi8KK2ludAoraW5ldF9wdG9uKGludCBhZiwKKyAgICAgICAgICBjb25zdCBjaGFyICpzcmMsCisgICAgICAgICAgdm9pZCAqZHN0KSB7CisgICAgc3dpdGNoICggYWYgKSB7CisgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgIHJldHVybihpbmV0X3B0b240KHNyYywgZHN0KSk7CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICAgICAgICByZXR1cm4oaW5ldF9wdG9uNihzcmMsIGRzdCkpOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogTk9UUkVBQ0hFRCAqLworfQorCisvKiBpbnQKKyAqIGluZXRfcHRvbjQoc3JjLCBkc3QpCisgKiAgICAgIGxpa2UgaW5ldF9hdG9uKCkgYnV0IHdpdGhvdXQgYWxsIHRoZSBoZXhhZGVjaW1hbCBhbmQgc2hvcnRoYW5kLgorICogcmV0dXJuOgorICogICAgICAxIGlmIGBzcmMnIGlzIGEgdmFsaWQgZG90dGVkIHF1YWQsIGVsc2UgMC4KKyAqIG5vdGljZToKKyAqICAgICAgZG9lcyBub3QgdG91Y2ggYGRzdCcgdW5sZXNzIGl0J3MgcmV0dXJuaW5nIDEuCisgKiBhdXRob3I6CisgKiAgICAgIFBhdWwgVml4aWUsIDE5OTYuCisgKi8KK2ludAoraW5ldF9wdG9uNChzcmMsIGRzdCkKK2NvbnN0IGNoYXIgKnNyYzsKK3Vuc2lnbmVkIGNoYXIgKmRzdDsKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbXSA9ICIwMTIzNDU2Nzg5IjsKKyAgICBpbnQgc2F3X2RpZ2l0LCBvY3RldHMsIGNoOworICAgIHVuc2lnbmVkIGNoYXIgdG1wW05TX0lOQUREUlNaXSwgKnRwOworCisgICAgc2F3X2RpZ2l0ID0gMDsKKyAgICBvY3RldHMgPSAwOworICAgICoodHAgPSB0bXApID0gMDsKKyAgICB3aGlsZSAoIChjaCA9ICpzcmMrKykgIT0gJ1wwJyApIHsKKyAgICAgICAgY29uc3QgY2hhciAqcGNoOworCisgICAgICAgIGlmICggKHBjaCA9IHN0cmNocihkaWdpdHMsIGNoKSkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBuZXcgPSAqdHAgKiAxMCArIChwY2ggLSBkaWdpdHMpOworCisgICAgICAgICAgICBpZiAoIG5ldyA+IDI1NSApCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgKnRwID0gbmV3OworICAgICAgICAgICAgaWYgKCAhIHNhd19kaWdpdCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICsrb2N0ZXRzID4gNCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICAgICBzYXdfZGlnaXQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCBjaCA9PSAnLicgJiYgc2F3X2RpZ2l0ICkgeworICAgICAgICAgICAgaWYgKCBvY3RldHMgPT0gNCApCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgKisrdHAgPSAwOworICAgICAgICAgICAgc2F3X2RpZ2l0ID0gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIGlmICggb2N0ZXRzIDwgNCApCisgICAgICAgIHJldHVybigwKTsKKyAgICBtZW1jcHkoZHN0LCB0bXAsIE5TX0lOQUREUlNaKTsKKyAgICByZXR1cm4oMSk7Cit9CisKKy8qIGludAorICogaW5ldF9wdG9uNihzcmMsIGRzdCkKKyAqICAgICAgY29udmVydCBwcmVzZW50YXRpb24gbGV2ZWwgYWRkcmVzcyB0byBuZXR3b3JrIG9yZGVyIGJpbmFyeSBmb3JtLgorICogcmV0dXJuOgorICogICAgICAxIGlmIGBzcmMnIGlzIGEgdmFsaWQgW1JGQzE4ODQgMi4yXSBhZGRyZXNzLCBlbHNlIDAuCisgKiBub3RpY2U6CisgKiAgICAgICgxKSBkb2VzIG5vdCB0b3VjaCBgZHN0JyB1bmxlc3MgaXQncyByZXR1cm5pbmcgMS4KKyAqICAgICAgKDIpIDo6IGluIGEgZnVsbCBhZGRyZXNzIGlzIHNpbGVudGx5IGlnbm9yZWQuCisgKiBjcmVkaXQ6CisgKiAgICAgIGluc3BpcmVkIGJ5IE1hcmsgQW5kcmV3cy4KKyAqIGF1dGhvcjoKKyAqICAgICAgUGF1bCBWaXhpZSwgMTk5Ni4KKyAqLworI2lmZGVmIEhBVkVfSVBWNgoraW50CitpbmV0X3B0b242KHNyYywgZHN0KQorY29uc3QgY2hhciAqc3JjOwordW5zaWduZWQgY2hhciAqZHN0OworeworICAgIHN0YXRpYyBjb25zdCBjaGFyIHhkaWdpdHNfbFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiLAorICAgIHhkaWdpdHNfdVtdID0gIjAxMjM0NTY3ODlBQkNERUYiOworICAgIHVuc2lnbmVkIGNoYXIgdG1wW05TX0lONkFERFJTWl0sICp0cCwgKmVuZHAsICpjb2xvbnA7CisgICAgY29uc3QgY2hhciAqeGRpZ2l0cywgKmN1cnRvazsKKyAgICBpbnQgY2gsIHNhd194ZGlnaXQ7CisgICAgdW5zaWduZWQgaW50IHZhbDsKKworICAgIG1lbXNldCgodHAgPSB0bXApLCAnXDAnLCBOU19JTjZBRERSU1opOworICAgIGVuZHAgPSB0cCArIE5TX0lONkFERFJTWjsKKyAgICBjb2xvbnAgPSBOVUxMOworICAgIC8qIExlYWRpbmcgOjogcmVxdWlyZXMgc29tZSBzcGVjaWFsIGhhbmRsaW5nLiAqLworICAgIGlmICggKnNyYyA9PSAnOicgKQorICAgICAgICBpZiAoICorK3NyYyAhPSAnOicgKQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgIGN1cnRvayA9IHNyYzsKKyAgICBzYXdfeGRpZ2l0ID0gMDsKKyAgICB2YWwgPSAwOworICAgIHdoaWxlICggKGNoID0gKnNyYysrKSAhPSAnXDAnICkgeworICAgICAgICBjb25zdCBjaGFyICpwY2g7CisKKyAgICAgICAgaWYgKCAocGNoID0gc3RyY2hyKCh4ZGlnaXRzID0geGRpZ2l0c19sKSwgY2gpKSA9PSBOVUxMICkKKyAgICAgICAgICAgIHBjaCA9IHN0cmNocigoeGRpZ2l0cyA9IHhkaWdpdHNfdSksIGNoKTsKKyAgICAgICAgaWYgKCBwY2ggIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHZhbCA8PD0gNDsKKyAgICAgICAgICAgIHZhbCB8PSAocGNoIC0geGRpZ2l0cyk7CisgICAgICAgICAgICBpZiAoIHZhbCA+IDB4ZmZmZiApCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgc2F3X3hkaWdpdCA9IDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGNoID09ICc6JyApIHsKKyAgICAgICAgICAgIGN1cnRvayA9IHNyYzsKKyAgICAgICAgICAgIGlmICggIXNhd194ZGlnaXQgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBjb2xvbnAgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgY29sb25wID0gdHA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHRwICsgTlNfSU5UMTZTWiA+IGVuZHAgKQorICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgICp0cCsrID0gKHVuc2lnbmVkIGNoYXIpICh2YWwgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgKnRwKysgPSAodW5zaWduZWQgY2hhcikgdmFsICYgMHhmZjsKKyAgICAgICAgICAgIHNhd194ZGlnaXQgPSAwOworICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggY2ggPT0gJy4nICYmICgodHAgKyBOU19JTkFERFJTWikgPD0gZW5kcCkgJiYKKyAgICAgICAgICAgICBpbmV0X3B0b240KGN1cnRvaywgdHApID4gMCApIHsKKyAgICAgICAgICAgIHRwICs9IE5TX0lOQUREUlNaOworICAgICAgICAgICAgc2F3X3hkaWdpdCA9IDA7CisgICAgICAgICAgICBicmVhazsgIC8qICdcMCcgd2FzIHNlZW4gYnkgaW5ldF9wdG9uNCgpLiAqLworICAgICAgICB9CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisgICAgaWYgKCBzYXdfeGRpZ2l0ICkgeworICAgICAgICBpZiAoIHRwICsgTlNfSU5UMTZTWiA+IGVuZHAgKQorICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAqdHArKyA9ICh1bnNpZ25lZCBjaGFyKSAodmFsID4+IDgpICYgMHhmZjsKKyAgICAgICAgKnRwKysgPSAodW5zaWduZWQgY2hhcikgdmFsICYgMHhmZjsKKyAgICB9CisgICAgaWYgKCBjb2xvbnAgIT0gTlVMTCApIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2luY2Ugc29tZSBtZW1tb3ZlKCkncyBlcnJvbmVvdXNseSBmYWlsIHRvIGhhbmRsZQorICAgICAgICAgKiBvdmVybGFwcGluZyByZWdpb25zLCB3ZSdsbCBkbyB0aGUgc2hpZnQgYnkgaGFuZC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IGludCBuID0gdHAgLSBjb2xvbnA7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoIGkgPSAxOyBpIDw9IG47IGkrKyApIHsKKyAgICAgICAgICAgIGVuZHBbLSBpXSA9IGNvbG9ucFtuIC0gaV07CisgICAgICAgICAgICBjb2xvbnBbbiAtIGldID0gMDsKKyAgICAgICAgfQorICAgICAgICB0cCA9IGVuZHA7CisgICAgfQorICAgIGlmICggdHAgIT0gZW5kcCApCisgICAgICAgIHJldHVybigwKTsKKyAgICBtZW1jcHkoZHN0LCB0bXAsIE5TX0lONkFERFJTWik7CisgICAgcmV0dXJuKDEpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX0lORVRfUFRPTiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvY29tcGF0L3NpZ25hbC5jIGIvaXBlcmYtMi4wLjUvY29tcGF0L3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTRiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9jb21wYXQvc2lnbmFsLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBzaWduYWwuYworICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN0YW5kYXJkIHNpZ25hbCBpbnN0YWxsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisKKy8qIGxpc3Qgb2Ygc2lnbmFsIGhhbmRsZXJzLiBfTlNJRyBpcyBudW1iZXIgb2Ygc2lnbmFscyBkZWZpbmVkLiAqLworCitzdGF0aWMgU2lnZnVuY1B0ciBoYW5kbGVyc1sgX05TSUcgXSA9IHsgMH07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNpZ19kaXNwYXRjaGVyCisgKgorICogZGlzcGF0Y2hlcyB0aGUgc2lnbmFsIHRvIGFwcHJvcHJpYXRlIHNpZ25hbCBoYW5kbGVyLiBUaGlzIGVtdWxhdGVzCisgKiB0aGUgc2lnbmFsIGhhbmRsaW5nIG9mIFVuaXguCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitCT09MIFdJTkFQSSBzaWdfZGlzcGF0Y2hlciggRFdPUkQgdHlwZSApIHsKKyAgICBTaWdmdW5jUHRyIGggPSBOVUxMOworICAgIGludCBzaWdubzsKKworICAgIHN3aXRjaCAoIHR5cGUgKSB7CisgICAgICAgIGNhc2UgQ1RSTF9DX0VWRU5UOgorICAgICAgICAgICAgc2lnbm8gPSBTSUdJTlQ7CisgICAgICAgICAgICBoID0gaGFuZGxlcnNbIFNJR0lOVCBdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDVFJMX0NMT1NFX0VWRU5UOgorICAgICAgICBjYXNlIENUUkxfTE9HT0ZGX0VWRU5UOgorICAgICAgICBjYXNlIENUUkxfU0hVVERPV05fRVZFTlQ6CisgICAgICAgICAgICBzaWdubyA9IFNJR1RFUk07CisgICAgICAgICAgICBoID0gaGFuZGxlcnNbIFNJR1RFUk0gXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIGggIT0gTlVMTCApIHsKKyAgICAgICAgLy8gY2FsbCB0aGUgc2lnbmFsIGhhbmRsZXIKKyAgICAgICAgaCggc2lnbm8gKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbXlfc2lnbmFsCisgKgorICogaW5zdGFsbHMgYSAgc2lnbmFsIGhhbmRsZXIuIEkgZW11bGF0ZSBVbml4IHNpZ25hbHMgYnkgc3RvcmluZyB0aGUKKyAqIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBkaXNwYXRjaGluZyBldmVudHMgbXlzZWxmLCB1c2luZyB0aGUKKyAqIHNpZ19kaXNwYXRjaGVyIGFib3ZlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitTaWdmdW5jUHRyIG15X3NpZ25hbCggaW50IGluU2lnbm8sIFNpZ2Z1bmNQdHIgaW5GdW5jICkgeworICAgIFNpZ2Z1bmNQdHIgb2xkID0gTlVMTDsKKworICAgIGlmICggaW5TaWdubyA+PSAwICAmJiAgaW5TaWdubyA8IF9OU0lHICkgeworICAgICAgICBvbGQgPSBoYW5kbGVyc1sgaW5TaWdubyBdOworICAgICAgICBoYW5kbGVyc1sgaW5TaWdubyBdID0gaW5GdW5jOworICAgIH0KKworICAgIHJldHVybiBvbGQ7Cit9IC8qIGVuZCBteV9zaWduYWwgKi8KKworI2Vsc2UgLyogbm90IFdJTjMyICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG15X3NpZ25hbAorICoKKyAqIGluc3RhbGxzIGEgc2lnbmFsIGhhbmRsZXIsIGFuZCByZXR1cm5zIHRoZSBvbGQgaGFuZGxlci4KKyAqIFRoaXMgZW11bGF0ZXMgdGhlIHNlbWktc3RhbmRhcmQgc2lnbmFsKCkgZnVuY3Rpb24gaW4gYQorICogc3RhbmRhcmQgd2F5IHVzaW5nIHRoZSBQb3NpeCBzaWdhY3Rpb24gZnVuY3Rpb24uCisgKgorICogZnJvbSBTdGV2ZW5zLCAxOTk4LCBzZWN0aW9uIDUuOAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitTaWdmdW5jUHRyIG15X3NpZ25hbCggaW50IGluU2lnbm8sIFNpZ2Z1bmNQdHIgaW5GdW5jICkgeworICAgIHN0cnVjdCBzaWdhY3Rpb24gdGhlTmV3QWN0aW9uLCB0aGVPbGRBY3Rpb247CisKKyAgICBhc3NlcnQoIGluRnVuYyAhPSBOVUxMICk7CisKKyAgICB0aGVOZXdBY3Rpb24uc2FfaGFuZGxlciA9IGluRnVuYzsKKyAgICBzaWdlbXB0eXNldCggJnRoZU5ld0FjdGlvbi5zYV9tYXNrICk7CisgICAgdGhlTmV3QWN0aW9uLnNhX2ZsYWdzID0gMDsKKworICAgIGlmICggaW5TaWdubyA9PSBTSUdBTFJNICkgeworI2lmZGVmIFNBX0lOVEVSUlVQVAorICAgICAgICB0aGVOZXdBY3Rpb24uc2FfZmxhZ3MgfD0gU0FfSU5URVJSVVBUOyAgLyogU3VuT1MgNC54ICovCisjZW5kaWYKKyAgICB9IGVsc2UgeworI2lmZGVmIFNBX1JFU1RBUlQKKyAgICAgICAgdGhlTmV3QWN0aW9uLnNhX2ZsYWdzIHw9IFNBX1JFU1RBUlQ7ICAgIC8qIFNWUjQsIDQuNEJTRCAqLworI2VuZGlmCisgICAgfQorCisgICAgaWYgKCBzaWdhY3Rpb24oIGluU2lnbm8sICZ0aGVOZXdBY3Rpb24sICZ0aGVPbGRBY3Rpb24gKSA8IDAgKSB7CisgICAgICAgIHJldHVybiBTSUdfRVJSOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0aGVPbGRBY3Rpb24uc2FfaGFuZGxlcjsKKyAgICB9Cit9IC8qIGVuZCBteV9zaWduYWwgKi8KKworI2VuZGlmIC8qIG5vdCBXSU4zMiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzaWdfZXhpdAorICoKKyAqIFF1aWV0bHkgZXhpdHMuIFRoaXMgcHJvdGVjdHMgc29tZSBhZ2FpbnN0IGJlaW5nIGNhbGxlZCBtdWx0aXBsZQorICogdGltZXMuIChUT0RPOiBzaG91bGQgdXNlIGEgbXV0ZXggdG8gZW5zdXJlIChudW0rKyA9PSAwKSBpcyBhdG9taWMuKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIHNpZ19leGl0KCBpbnQgaW5TaWdubyApIHsKKyAgICBzdGF0aWMgaW50IG51bSA9IDA7CisgICAgaWYgKCBudW0rKyA9PSAwICkgeworICAgICAgICBmZmx1c2goIDAgKTsKKyAgICAgICAgZXhpdCggMCApOworICAgIH0KK30gLyogZW5kIHNpZ19leGl0ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9jb21wYXQvc25wcmludGYuYyBiL2lwZXJmLTIuMC41L2NvbXBhdC9zbnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjZmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9jb21wYXQvc25wcmludGYuYwpAQCAtMCwwICsxLDEwMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICogQXV0aG9yOiBNYXJrIEdhdGVzCisgKgorICogc25wcmludGYuYworICoKKyAqIFRoaXMgaXMgZnJvbQorICogVy4gUmljaGFyZCBTdGV2ZW5zLCAnVU5JWCBOZXR3b3JrIFByb2dyYW1taW5nJywgVm9sIDEsIDJuZCBFZGl0aW9uLAorICogICBQcmVudGljZSBIYWxsLCAxOTk4LgorICoKKyAqCisgKiBUaHJvdWdob3V0IHRoZSBib29rIEkgdXNlIHNucHJpbnRmKCkgYmVjYXVzZSBpdCdzIHNhZmVyIHRoYW4gc3ByaW50ZigpLgorICogQnV0IGFzIG9mIHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgbm90IGFsbCBzeXN0ZW1zIHByb3ZpZGUgdGhpcworICogZnVuY3Rpb24uICBUaGUgZnVuY3Rpb24gYmVsb3cgc2hvdWxkIG9ubHkgYmUgYnVpbHQgb24gdGhvc2Ugc3lzdGVtcworICogdGhhdCBkbyBub3QgcHJvdmlkZSBhIHJlYWwgc25wcmludGYoKS4KKyAqIFRoZSBmdW5jdGlvbiBiZWxvdyBqdXN0IGFjdHMgbGlrZSBzcHJpbnRmKCk7IGl0IGlzIG5vdCBzYWZlLCBidXQgaXQKKyAqIHRyaWVzIHRvIGRldGVjdCBvdmVyZmxvdy4KKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyAgICAjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NOUFJJTlRGCisKKyAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgI2luY2x1ZGUgPHN0cmluZy5oPgorICAgICNpbmNsdWRlIDxzdGRpby5oPgorICAgICNpbmNsdWRlIDxzdGRhcmcuaD4KKworICAgICNpbmNsdWRlICJzbnByaW50Zi5oIgorCisgICAgI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitpbnQgc25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgICBpbnQgbjsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnNwcmludGYoYnVmLCBmbXQsIGFwKTsgLyogU2lnaCwgc29tZSB2c3ByaW50ZidzIHJldHVybiBwdHIsIG5vdCBsZW5ndGggKi8KKyAgICBuID0gc3RybGVuKGJ1Zik7CisgICAgdmFfZW5kKGFwKTsKKworICAgIGlmICggbiA+PSBzaXplICkgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJzbnByaW50Zjogb3ZlcmZsb3dlZCBhcnJheVxuIiApOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHJldHVybihuKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisgICAgI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX1NOUFJJTlRGICovCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9jb21wYXQvc3RyaW5nLmMgYi9pcGVyZi0yLjAuNS9jb21wYXQvc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMTZkNQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbXBhdC9zdHJpbmcuYwpAQCAtMCwwICsxLDc2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogc3RyaW5nLmMKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB2YXJpb3VzIHN0cmluZyB1dGlsaXRpZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcGF0dGVybgorICoKKyAqIEluaXRpYWxpemUgdGhlIGJ1ZmZlciB3aXRoIGEgcGF0dGVybiBvZiAoaW5kZXggbW9kIDEwKS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBwYXR0ZXJuKCBjaGFyICpvdXRCdWYsIGludCBpbkJ5dGVzICkgeworICAgIGFzc2VydCggb3V0QnVmICE9IE5VTEwgKTsKKworICAgIHdoaWxlICggaW5CeXRlcy0tID4gMCApIHsKKyAgICAgICAgb3V0QnVmWyBpbkJ5dGVzIF0gPSAoaW5CeXRlcyAlIDEwKSArICcwJzsKKyAgICB9Cit9IC8qIGVuZCBwYXR0ZXJuICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9jb25maWcuZ3Vlc3MgYi9pcGVyZi0yLjAuNS9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODkyODMzZgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE0NTkgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA1LTAyLTEwJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPHBlckBib3RobmVyLmNvbT4uCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCisjCisjIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KKyMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCisjIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgorIworIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKKyMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCAwIDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgMCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAtcSAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCAwIDs7CisgICAgYW1kNjQ6T3BlbkJTRDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgY2F0czpPcGVuQlNEOio6KikKKwllY2hvIGFybS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaHAzMDA6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBsdW5hODhrOk9wZW5CU0Q6KjoqKQorICAgIAllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hYzY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1hY3BwYzpPcGVuQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lODhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZXBwYzpPcGVuQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNnaTpPcGVuQlNEOio6KikKKwllY2hvIG1pcHM2NC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuMzpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6T3BlbkJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOmVra29CU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWVra29ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWNhc2UgJFVOQU1FX1JFTEVBU0UgaW4KKwkqNC4wKQorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCQk7OworCSo1LiopCisJICAgICAgICBVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkNH0nYAorCQk7OworCWVzYWMKKwkjIEFjY29yZGluZyB0byBDb21wYXEsIC91c3Ivc2Jpbi9wc3JpbmZvIGhhcyBiZWVuIGF2YWlsYWJsZSBvbgorCSMgT1NGLzEgYW5kIFRydTY0IHN5c3RlbXMgcHJvZHVjZWQgc2luY2UgMTk5NS4gIEkgaG9wZSB0aGF0CisJIyBjb3ZlcnMgbW9zdCBzeXN0ZW1zIHJ1bm5pbmcgdG9kYXkuICBUaGlzIGNvZGUgcGlwZXMgdGhlIENQVQorCSMgdHlwZXMgdGhyb3VnaCBoZWFkIC1uIDEsIHNvIHdlIG9ubHkgZGV0ZWN0IHRoZSB0eXBlIG9mIENQVSAwLgorCUFMUEhBX0NQVV9UWVBFPWAvdXNyL3NiaW4vcHNyaW5mbyAtdiB8IHNlZCAtbiAtZSAncy9eICBUaGUgYWxwaGEgXCguKlwpIHByb2Nlc3Nvci4qJC9cMS9wJyB8IGhlYWQgLW4gMWAKKwljYXNlICIkQUxQSEFfQ1BVX1RZUEUiIGluCisJICAgICJFVjQgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY0LjUgKDIxMDY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiTENBNCAoMjEwNjYvMjEwNjgpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjUgKDIxMTY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IiA7OworCSAgICAiRVY1LjYgKDIxMTY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiIDs7CisJICAgICJFVjUuNiAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IiA7OworCSAgICAiRVY1LjcgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NyIgOzsKKwkgICAgIkVWNiAoMjEyNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiIDs7CisJICAgICJFVjYuNyAoMjEyNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2NyIgOzsKKwkgICAgIkVWNi44Q0IgKDIxMjY0QykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOEFMICgyMTI2NEIpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhDWCAoMjEyNjREKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi45QSAoMjEyNjQvRVY2OUEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY5IiA7OworCSAgICAiRVY3ICgyMTM2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NyIgOzsKKwkgICAgIkVWNy45ICgyMTM2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjc5IiA7OworCWVzYWMKKwkjIEEgUG4ubiB2ZXJzaW9uIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uLgorCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bUFZUWF0vLycgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisJZXhpdCAwIDs7CisgICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCisJIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/CisJZWNobyBhbHBoYS1wYy1pbnRlcml4CisJZXhpdCAwIDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCAwIDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLXVua25vd24tc3lzdjQKKwlleGl0IDA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgMCA7OworICAgICo6W01tXW9ycGhbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbW9ycGhvcworCWV4aXQgMCA7OworICAgICo6T1MvMzkwOio6KikKKwllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCisJZXhpdCAwIDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCAwIDs7CisgICAgKjpPUzQwMDoqOiopCisgICAgICAgIGVjaG8gcG93ZXJwYy1pYm0tb3M0MDAKKwlleGl0IDAgOzsKKyAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCisJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCAwOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCAwIDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDAgOzsKKyAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKKwllY2hvIHNwYXJjLWljbC1ueDYKKwlleGl0IDAgOzsKKyAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCisJY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCisJICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDcgJiYgZXhpdCAwIDs7CisJZXNhYyA7OworICAgIHN1bjRIOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgMCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAorCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKKwljYXNlICJgL2Jpbi9hcmNoYCIgaW4KKwkgICAgc3VuMykKKwkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwkgICAgc3VuNCkKKwkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJZXNhYworCWV4aXQgMCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCAwIDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyBcCisJICAmJiAkZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAorCSAgJiYgZXhpdCAwCisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCAwIDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCAwIDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgMCA7OworICAgIG04OGs6Q1gvVVg6Nyo6KikKKwllY2hvIG04OGstaGFycmlzLWN4dXg3CisJZXhpdCAwIDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgMCA7OworICAgIEFWaWlPTjpkZ3V4Oio6KikKKyAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgCWV4aXQgMCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDAgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgMCA7OworICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQorCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCAwIDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgMCA7OworICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDAgOzsgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgMCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDAgOzsKKyAgICAqOkFJWDoyOjMpCisJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgJGR1bW15ICYmIGV4aXQgMAorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgMCA7OworICAgICo6QUlYOio6WzQ1XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCAwIDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDAgOzsKKyAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKKwllY2hvIHJvbXAtaWJtLWJzZDQuNAorCWV4aXQgMCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDAgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCAwIDs7CisgICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKKworICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQorICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICAgICAgICAgICAgICBpbnQgbWFpbiAoKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKKyAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQorICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJCX0gYnJlYWs7CisgICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisgICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgICAgICAgfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgICMgYXZvaWQgZG91YmxlIGV2YWx1YXRpb24gb2YgJHNldF9jY19mb3JfYnVpbGQKKwkgICAgdGVzdCAtbiAiJENDX0ZPUl9CVUlMRCIgfHwgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtKSB8IGdyZXAgX19MUDY0X18gPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDAgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCAwIDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgJGR1bW15ICYmIGV4aXQgMAorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDAgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgMCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgMCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDAgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgMCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgMCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDAgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKKwkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqU1YxOio6KjoqKQorCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gY3JheW52LWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgMCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCAwIDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3BhcmMqOkJTRC9PUzoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpGcmVlQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgMCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCAwIDs7CisgICAgaSo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDAgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgMCA7OworICAgIHg4NjpJbnRlcml4KjpbMzRdKikKKwllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1wuLiovLycKKwlleGl0IDAgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDAgOzsKKyAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKKwkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/CisJZWNobyBpNTg2LXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCAwIDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDAgOzsKKyAgICBwKjpDWUdXSU4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KKwlleGl0IDAgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDAgOzsKKyAgICAqOkdOVS8qOio6KikKKwkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQorCWV4aXQgMCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgMCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGZydjpMaW51eDoqOiopCisgICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIG1pcHM6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwcworCSN1bmRlZiBtaXBzZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHMKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5DUFU9YAorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IiAmJiBleGl0IDAKKwk7OworICAgIG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzNjQKKwkjdW5kZWYgbWlwczY0ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzNjRlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwczY0CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCisJOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgMCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgMCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCAwIDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHg4Nl82NDpMaW51eDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKKwkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCisJIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KKwlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAorCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAorCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKKwkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KKwkJCQkgICAgcy8gLiovLworCQkJCSAgICBwJ2AKKyAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgorCSAgZWxmMzItaTM4NikKKwkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKKwkJOzsKKwkgIGEub3V0LWkzODYtbGludXgpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKKwkJZXhpdCAwIDs7CisJICBjb2ZmLWkzODYpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKKwkJZXhpdCAwIDs7CisJICAiIikKKwkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpIG9yCisJCSMgb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIgorCQlleGl0IDAgOzsKKwllc2FjCisJIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwkjaWZkZWYgX19FTEZfXworCSMgaWZkZWYgX19HTElCQ19fCisJIyAgaWYgX19HTElCQ19fID49IDIKKwlMSUJDPWdudQorCSMgIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyAgZW5kaWYKKwkjIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyBlbmRpZgorCSNlbHNlCisJI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKwlMSUJDPWdudQorCSNlbHNlCisJTElCQz1nbnVhb3V0CisJI2VuZGlmCisJI2VuZGlmCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKKwl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iICYmIGV4aXQgMAorCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgZWNobyAiJHtURU5UQVRJVkV9IiAmJiBleGl0IDAKKwk7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgMCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgMCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgMCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgMCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDAgOzsKKwlpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDAgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgMCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgMCA7OworICAgIGkqODY6Kjo1Ols3OF0qKQorCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCisJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OworCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKKwkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059CisJZXhpdCAwIDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDAgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCAwIDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgMCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDAgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCAwIDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDAgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisgICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgMCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgMCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCAwIDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgMCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCAwIDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCAwIDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgMCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNYLTU6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkRhcndpbjoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KKwljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkgICAgKjg2KSBVTkFNRV9QUk9DRVNTT1I9aTY4NiA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDAgOzsKKyAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCAwIDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCAwIDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCAwIDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCAwIDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCAwIDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDAgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgMCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgMCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCAwIDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkRyYWdvbkZseToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgMCA7OworICAgICo6KlZNUzoqOiopCisgICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyAmJiBleGl0IDAgOzsKKwkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zICYmIGV4aXQgMCA7OworCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyAmJiBleGl0IDAgOzsKKwllc2FjIDs7CisgICAgKjpYRU5JWDoqOlN5c1YpCisJZWNobyBpMzg2LXBjLXhlbml4CisJZXhpdCAwIDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgJGR1bW15ICYmIGV4aXQgMAorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvY29uZmlnLworCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2NvbmZpZy5oLmluIGIvaXBlcmYtMi4wLjUvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzN2U3NwotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMjk1IEBACisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworI3VuZGVmIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorCisvKiBEZWZpbmUgaWYgZGVidWdnaW5nIGluZm8gaXMgZGVzaXJlZCAqLworI3VuZGVmIERCR19NSloKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhcnBhL2luZXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9BUlBBX0lORVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0ZXhpdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BVEVYSVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBBRl9JTkVUNicsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX0FGX0lORVQ2CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgSVBWNl9BRERfTUVNQkVSU0hJUCcsIGFuZCB0byAwCisgICBpZiB5b3UgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX0lQVjZfQUREX01FTUJFUlNISVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBJUFY2X01VTFRJQ0FTVF9IT1BTJywgYW5kIHRvIDAKKyAgIGlmIHlvdSBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfSVBWNl9NVUxUSUNBU1RfSE9QUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYElQX0FERF9NRU1CRVJTSElQJywgYW5kIHRvIDAgaWYKKyAgIHlvdSBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfSVBfQUREX01FTUJFUlNISVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGRvbid0IGhhdmUgYHZwcmludGYnIGJ1dCBkbyBoYXZlIGBfZG9wcm50LicgKi8KKyN1bmRlZiBIQVZFX0RPUFJOVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZvcmsnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRk9SSworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHRpbWVvZmRheScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbmV0X250b3AnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfSU5FVF9OVE9QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5ldF9wdG9uJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0lORVRfUFRPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gZW5hYmxlIElQdjYgc3VwcG9ydCAqLworI3VuZGVmIEhBVkVfSVBWNgorCisvKiBEZWZpbmUgdG8gZW5hYmxlIElQdjYgbXVsdGljYXN0IHN1cHBvcnQgKi8KKyN1bmRlZiBIQVZFX0lQVjZfTVVMVElDQVNUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGliaW50bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJQklOVExfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5zbCcgbGlicmFyeSAoLWxuc2wpLiAqLworI3VuZGVmIEhBVkVfTElCTlNMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc29ja2V0JyBsaWJyYXJ5ICgtbHNvY2tldCkuICovCisjdW5kZWYgSEFWRV9MSUJTT0NLRVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciBzeXN0ZW0gaGFzIGEgR05VIGxpYmMgY29tcGF0aWJsZSBgbWFsbG9jJyBmdW5jdGlvbiwgYW5kCisgICB0byAwIG90aGVyd2lzZS4gKi8KKyN1bmRlZiBIQVZFX01BTExPQworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX01FTVNFVAorCisvKiBEZWZpbmUgdG8gZW5hYmxlIG11bHRpY2FzdCBzdXBwb3J0ICovCisjdW5kZWYgSEFWRV9NVUxUSUNBU1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVERCX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisKKy8qICovCisjdW5kZWYgSEFWRV9QT1NJWF9USFJFQUQKKworLyogKi8KKyN1bmRlZiBIQVZFX1BSSU5URl9RRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBIQVZFX1BUSFJFQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdGhyZWFkX2NhbmNlbCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9QVEhSRUFEX0NBTkNFTAorCisvKiAqLworI3VuZGVmIEhBVkVfUVVBRF9TVVBQT1JUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2VsZWN0JyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NFTEVDVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NOUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzc2l6ZV90Jy4gKi8KKyN1bmRlZiBIQVZFX1NTSVpFX1QKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2hyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkVSUk9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZnRpbWUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSRlRJTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2wnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSVE9MCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgaXB2Nl9tcmVxJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9JUFY2X01SRVEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCBpcF9tcmVxJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9JUF9NUkVRCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3Qgc29ja2FkZHJfaW42Jy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzbG9nLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTTE9HX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TT0NLRVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1c2xlZXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVVNMRUVQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmZvcmsnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVkZPUksKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx2Zm9yay5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1ZGT1JLX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2cHJpbnRmJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1ZQUklOVEYKKworLyogRGVmaW5lIGlmIFdlYjEwMCBpcyBkZXNpcmVkIGFuZCBhdmFpbGFibGUgKi8KKyN1bmRlZiBIQVZFX1dFQjEwMAorCisvKiBEZWZpbmUgdG8gMSBpZiBgZm9yaycgd29ya3MuICovCisjdW5kZWYgSEFWRV9XT1JLSU5HX0ZPUksKKworLyogRGVmaW5lIHRvIDEgaWYgYHZmb3JrJyB3b3Jrcy4gKi8KKyN1bmRlZiBIQVZFX1dPUktJTkdfVkZPUksKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9OQU1FCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1NUUklORworCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9VUkwKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KKworLyogRGVmaW5lIHRvIHRoZSBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lIG9uCisgICB5b3VyIHN5c3RlbS4gKi8KKyN1bmRlZiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhcmcgMSBmb3IgYHNlbGVjdCcuICovCisjdW5kZWYgU0VMRUNUX1RZUEVfQVJHMQorCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYXJncyAyLCAzIGFuZCA0IGZvciBgc2VsZWN0Jy4gKi8KKyN1bmRlZiBTRUxFQ1RfVFlQRV9BUkcyMzQKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFyZyA1IGZvciBgc2VsZWN0Jy4gKi8KKyN1bmRlZiBTRUxFQ1RfVFlQRV9BUkc1CisKKy8qIFRoZSBzaXplIG9mIGBib29sJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9CT09MCisKKy8qIFRoZSBzaXplIG9mIGBjaGFyJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9DSEFSCisKKy8qIFRoZSBzaXplIG9mIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX0lOVAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTE9ORworCisvKiBUaGUgc2l6ZSBvZiBgc2hvcnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX1NIT1JUCisKKy8qIFRoZSBzaXplIG9mIGB2b2lkKicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfVk9JRFAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSAzcmQgYXJnIG9mIGFjY2VwdCAqLworI3VuZGVmIFNvY2tsZW5fdAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gKi8KKyN1bmRlZiBUSU1FX1dJVEhfU1lTX1RJTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciA8c3lzL3RpbWUuaD4gZGVjbGFyZXMgYHN0cnVjdCB0bScuICovCisjdW5kZWYgVE1fSU5fU1lTX1RJTUUKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI3VuZGVmIFZFUlNJT04KKworLyogRGVmaW5lIFdPUkRTX0JJR0VORElBTiB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0CisgICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KKyNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorIyBpZiBkZWZpbmVkIF9fQklHX0VORElBTl9fCisjICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgIHVuZGVmIFdPUkRTX0JJR0VORElBTgorIyBlbmRpZgorI2VuZGlmCisKKy8qICovCisjdW5kZWYgX1JFRU5UUkFOVAorCisvKiAqLworI3VuZGVmIGJvb2wKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCisjdW5kZWYgY29uc3QKKworLyogKi8KKyN1bmRlZiBmYWxzZQorCisvKiBEZWZpbmUgdG8gcnBsX21hbGxvYyBpZiB0aGUgcmVwbGFjZW1lbnQgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQuICovCisjdW5kZWYgbWFsbG9jCisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBwaWRfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgc2l6ZV90CisKKy8qIERlZmluZSB0byAiaW50IiBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzc2l6ZV90CisKKy8qICovCisjdW5kZWYgdHJ1ZQorCisvKiBEZWZpbmUgYXMgYGZvcmsnIGlmIGB2Zm9yaycgZG9lcyBub3Qgd29yay4gKi8KKyN1bmRlZiB2Zm9yawpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvY29uZmlnLnN1YiBiL2lwZXJmLTIuMC41L2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDhmZDJmOAotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNTY2IEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA1LTAyLTEwJworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCAwOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC11Y2xpYmMqIHwgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwgXAorICBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5KQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zY291dCkKKwkJOzsKKwktd3JzKQorCQlvcz0tdnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c29zKikKKwkJb3M9LWNob3J1c29zCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKyAJLWNob3J1c3JkYikKKyAJCW9zPS1jaG9ydXNyZGIKKwkJYmFzaWNfbWFjaGluZT0kMQorIAkJOzsKKwktaGl1eCopCisJCW9zPS1oaXV4d2UyCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbyopCisJCW9zPS1zY28zLjJ2MgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXVkayopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktaXNjKQorCQlvcz0taXNjMi4yCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktY2xpeCopCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCisJCTs7CisJLWlzYyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktbHlueCopCisJCW9zPS1seW54b3MKKwkJOzsKKwktcHR4KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCisJCTs7CisJLXdpbmRvd3NudCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKKwkJOzsKKwktcHNvcyopCisJCW9zPS1wc29zCisJCTs7CisJLW1pbnQgfCAtbWludFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7Citlc2FjCisKKyMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCisJIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KKwkxNzUwYSB8IDU4MCBcCisJfCBhMjlrIFwKKwl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCisJfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKKwl8IGFtMzNfMi4wIFwKKwl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIHwgbWF4cSB8IG1jb3JlIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCisJfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCisJfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAorCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwl8IG1zcDQzMCBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9wZW5yaXNjIHwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjNdZSB8IHNoWzM0XWViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgXAorCXwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogXAorCXwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAorCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCisJfCBoODMwMC0qIHwgaDg1MDAtKiBcCisJfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAorCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCisJfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAorCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCisJfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwl8IG1taXgtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJvbXAtKiB8IHJzNjAwMC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiB8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdHJvbi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYS0qIFwKKwl8IHltcC0qIFwKKwl8IHo4ay0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTM4NmJzZCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LWJzZAorCQk7OworCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYTI5a2hpZikKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisgICAgCWFiYWN1cykKKwkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWFwb2xsbzY4YnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTZjKQorCQliYXNpY19tYWNoaW5lPWNyMTZjLXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTg4ay1vbXJvbiopCisJCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgorCQk7OworCW1hZ251bSB8IG0zMjMwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlvcz0tc3lzdgorCQk7OworCW1lcmxpbikKKwkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCisJCW9zPS1zeXN2CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcjMyIHwgb3IzMi0qKQorCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCW9zNDAwKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1vczQwMAorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKwlwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQk7OworCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW00KQorCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJCTs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJvbTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzMzkwIHwgczM5MC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCisJCTs7CisJczM5MHggfCBzMzkweC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNiMSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgorCQk7OworCXNiMWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvYWQxKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAorCQlvcz0tdG9wczIwCisJCTs7CisJdG93ZXIgfCB0b3dlci0zMikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgorCQk7OworCXRwZikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJb3M9LXRwZgorCQk7OworCXVkaTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJdWx0cmEzKQorCQliYXNpY19tYWNoaW5lPWEyOWstbnl1CisJCW9zPS1zeW0xCisJCTs7CisJdjgxMCB8IG5lY3Y4MTApCisJCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKKwkJb3M9LW5vbmUKKwkJOzsKKwl2YXh2KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwl2bXMpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tdm1zCisJCTs7CisJdnBwKnx2eHx2eC0qKQorCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQorCQk7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikKKwkJYmFzaWNfbWFjaGluZT13NjUtd2RjCisJCW9zPS1ub25lCisJCTs7CisJdzg5ay0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQlvcz0tcHJvZWxmCisJCTs7CisJeGJveCkKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJeHBzIHwgeHBzMTAwKQorCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKKwkJOzsKKwl5bXApCisJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXo4ay0qLWNvZmYpCisJCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KKwkJb3M9LXNpbQorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwl3ODlrKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQk7OworCW9wNTBuKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJb3A2MGMpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlyb21wKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJbW1peCkKKwkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCisJCTs7CisJcnM2MDAwKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwl2YXgpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQk7OworCXBkcDEwKQorCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0CisJCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgorCQk7OworCXBkcDExKQorCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYworCQk7OworCXdlMzJrKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCXNoMyB8IHNoNCB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKKwkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJY3lkcmEpCisJCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQorCQk7OworCW9yaW9uKQorCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAorCQk7OworCW9yaW9uMTA1KQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCisJCTs7CisJbWFjIHwgbXB3IHwgbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCTs7CisJcG1hYyB8IHBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKKwkJOzsKKwkqLXVua25vd24pCisJCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCisJCTs7CisJKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworCisjIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWRpZ2l0YWwqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKKwkJOzsKKwkqLWNvbW1vZG9yZSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCisJCTs7CisJKikKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCisKK2lmIFsgeCIkb3MiICE9IHgiIiBdCit0aGVuCitjYXNlICRvcyBpbgorICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCisJCTs7CisJLXNvbGFyaXMpCisJCW9zPS1zb2xhcmlzMgorCQk7OworCS1zdnI0KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXVuaXh3YXJlKikKKwkJb3M9LXN5c3Y0LjJ1dworCQk7OworCS1nbnUvbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCisJIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KKwkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KKwktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCisJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LXVjbGliYyogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50by1xbngqKQorCQk7OworCS1udG8qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKKwkJOzsKKwktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisgICAgICAgIC1vczQwMCopCisJCW9zPS1vczQwMAorCQk7OworCS13aW5jZSopCisJCW9zPS13aW5jZQorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktYXRoZW9zKikKKwkJb3M9LWF0aGVvcworCQk7OworCS1zeWxsYWJsZSopCisJCW9zPS1zeWxsYWJsZQorCQk7OworCS0zODZic2QpCisJCW9zPS1ic2QKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbm92YSopCisJCW9zPS1ydG1rLW5vdmEKKwkJOzsKKwktbnMyICkKKwkJb3M9LW5leHRzdGVwMgorCQk7OworCS1uc2sqKQorCQlvcz0tbnNrCisJCTs7CisJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgorCS1zaW5peDUuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKKwkJOzsKKwktc2luaXgqKQorCQlvcz0tc3lzdjQKKwkJOzsKKyAgICAgICAgLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwkta2FvcyopCisJCW9zPS1rYW9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgYzR4LSogfCB0aWM0eC0qKQorICAgICAgICBvcz0tY29mZgorICAgICAgICA7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisgICAgCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvY29uZmlndXJlIGIvaXBlcmYtMi4wLjUvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIwOGJhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9jb25maWd1cmUKQEAgLTAsMCArMSw5NTEyIEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgSXBlcmYgMi4wLjUuCisjCisjCisjIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCAxOTk4LTIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisKKworYXNfbmw9JworJworZXhwb3J0IGFzX25sCisjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKK2FzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKyMgUHJlZmVyIGEga3NoIHNoZWxsIGJ1aWx0aW4gb3ZlciBhbiBleHRlcm5hbCBwcmludGYgcHJvZ3JhbSBvbiBTb2xhcmlzLAorIyBidXQgd2l0aG91dCB3YXN0aW5nIGZvcmtzIGZvciBiYXNoIG9yIHpzaC4KK2lmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKKyAgICAmJiAodGVzdCAiWGBwcmludCAtciAtLSAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2VjaG89J3ByaW50IC1yIC0tJworICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKK2VsaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworZWxzZQorICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKyAgZWxzZQorICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKyAgICAgIGFyZz0kMTsKKyAgICAgIGNhc2UgJGFyZyBpbiAjKAorICAgICAgKiIkYXNfbmwiKikKKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworICAgICAgZXNhYzsKKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKyAgICAnCisgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5CisgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKyAgZmkKKyAgZXhwb3J0IGFzX2VjaG9fYm9keQorICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCitmaQorCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIFBBVEhfU0VQQVJBVE9SPToKKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgfQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCithc19teXNlbGY9CitjYXNlICQwIGluICMoKAorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIGV4aXQgMQorZmkKKworIyBVbnNldCB2YXJpYWJsZXMgdGhhdCB3ZSBkbyBub3QgbmVlZCBhbmQgd2hpY2ggY2F1c2UgYnVncyAoZS5nLiBpbgorIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgorIyBzdXBwcmVzc2VzIGFueSAiU2VnbWVudGF0aW9uIGZhdWx0IiBtZXNzYWdlIHRoZXJlLiAgJygoJyBjb3VsZAorIyB0cmlnZ2VyIGEgYnVnIGluIHBka3NoIDUuMi4xNC4KK2ZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKK2RvIGV2YWwgdGVzdCB4XCR7JGFzX3ZhcitzZXR9ID0geHNldCBcCisgICYmICggKHVuc2V0ICRhc192YXIpIHx8IGV4aXQgMSkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0ICRhc192YXIgfHwgOgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitMQ19BTEw9QworZXhwb3J0IExDX0FMTAorTEFOR1VBR0U9QworZXhwb3J0IExBTkdVQUdFCisKKyMgQ0RQQVRILgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCisjIFVzZSBhIHByb3BlciBpbnRlcm5hbCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBlbnN1cmUgd2UgZG9uJ3QgZmFsbAorICAjIGludG8gYW4gaW5maW5pdGUgbG9vcCwgY29udGludW91c2x5IHJlLWV4ZWN1dGluZyBvdXJzZWx2ZXMuCisgIGlmIHRlc3QgeCIke19hc19jYW5fcmVleGVjfSIgIT0geG5vICYmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCisgICAgX2FzX2Nhbl9yZWV4ZWM9bm87IGV4cG9ydCBfYXNfY2FuX3JlZXhlYzsKKyAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQorIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKyMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisjIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCitCQVNIX0VOVj0vZGV2L251bGwKK0VOVj0vZGV2L251bGwKKyh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorY2FzZSAkLSBpbiAjICgoKCgKKyAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CisgICp2KiApIGFzX29wdHM9LXYgOzsKKyAgKngqICkgYXNfb3B0cz0teCA7OworICAqICkgYXNfb3B0cz0gOzsKK2VzYWMKK2V4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CisjIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKKyMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KKyRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKK2FzX2ZuX2V4aXQgMjU1CisgIGZpCisgICMgV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIHByb3BhZ2F0ZSB0byBvdGhlciBzdWJwcm9jZXNzZXMuCisgICAgICAgICAgeyBfYXNfY2FuX3JlZXhlYz07IHVuc2V0IF9hc19jYW5fcmVleGVjO30KK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisiCisgIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Cithc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KK2FzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQorCitleGl0Y29kZT0wCithc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9CitpZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6CisKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMQordGVzdCAteCAvIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorCitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2ZvdW5kPWZhbHNlCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGFzX2ZvdW5kPToKKyAgY2FzZSAkYXNfZGlyIGluICMoCisJIC8qKQorCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KKwkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCisJCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGJyZWFrIDIKK2ZpCitmaQorCSAgIGRvbmU7OworICAgICAgIGVzYWMKKyAgYXNfZm91bmQ9ZmFsc2UKK2RvbmUKKyRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcworZmk7IH0KK0lGUz0kYXNfc2F2ZV9JRlMKKworCisgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6CisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgICAgICAgICAgICAjIFdlIGNhbm5vdCB5ZXQgYXNzdW1lIGEgZGVjZW50IHNoZWxsLCBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgYQorIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKyMgd29ya3MgYXJvdW5kIHNoZWxscyB0aGF0IGNhbm5vdCB1bnNldCBub25leGlzdGVudCB2YXJpYWJsZXMuCisjIFByZXNlcnZlIC12IGFuZCAteCB0byB0aGUgcmVwbGFjZW1lbnQgc2hlbGwuCitCQVNIX0VOVj0vZGV2L251bGwKK0VOVj0vZGV2L251bGwKKyh1bnNldCBCQVNIX0VOVikgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IEJBU0hfRU5WIEVOVgorY2FzZSAkLSBpbiAjICgoKCgKKyAgKnYqeCogfCAqeCp2KiApIGFzX29wdHM9LXZ4IDs7CisgICp2KiApIGFzX29wdHM9LXYgOzsKKyAgKngqICkgYXNfb3B0cz0teCA7OworICAqICkgYXNfb3B0cz0gOzsKK2VzYWMKK2V4ZWMgJENPTkZJR19TSEVMTCAkYXNfb3B0cyAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CisjIEFkbWl0dGVkbHksIHRoaXMgaXMgcXVpdGUgcGFyYW5vaWQsIHNpbmNlIGFsbCB0aGUga25vd24gc2hlbGxzIGJhaWwKKyMgb3V0IGFmdGVyIGEgZmFpbGVkIGBleGVjJy4KKyRhc19lY2hvICIkMDogY291bGQgbm90IHJlLWV4ZWN1dGUgd2l0aCAkQ09ORklHX1NIRUxMIiA+JjIKK2V4aXQgMjU1CitmaQorCisgICAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm87IHRoZW4gOgorICAkYXNfZWNobyAiJDA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiCisgICRhc19lY2hvICIkMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIgorICBpZiB0ZXN0IHgke1pTSF9WRVJTSU9OK3NldH0gPSB4c2V0IDsgdGhlbgorICAgICRhc19lY2hvICIkMDogSW4gcGFydGljdWxhciwgenNoICRaU0hfVkVSU0lPTiBoYXMgYnVncyBhbmQgc2hvdWxkIgorICAgICRhc19lY2hvICIkMDogYmUgdXBncmFkZWQgdG8genNoIDQuMy40IG9yIGxhdGVyLiIKKyAgZWxzZQorICAgICRhc19lY2hvICIkMDogUGxlYXNlIHRlbGwgYnVnLWF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCiskMDogaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKKyQwOiBtZXNzYWdlLiBUaGVuIGluc3RhbGwgYSBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1bgorJDA6IHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4iCisgIGZpCisgIGV4aXQgMQorZmkKK2ZpCitmaQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KK2V4cG9ydCBTSEVMTAorIyBVbnNldCBtb3JlIHZhcmlhYmxlcyBrbm93biB0byBpbnRlcmZlcmUgd2l0aCBiZWhhdmlvciBvZiBjb21tb24gdG9vbHMuCitDTElDT0xPUl9GT1JDRT0gR1JFUF9PUFRJT05TPQordW5zZXQgQ0xJQ09MT1JfRk9SQ0UgR1JFUF9PUFRJT05TCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBTaGVsbCBGdW5jdGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorCisjIGFzX2ZuX3NldF9zdGF0dXMgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy4KK2FzX2ZuX3NldF9zdGF0dXMgKCkKK3sKKyAgcmV0dXJuICQxCit9ICMgYXNfZm5fc2V0X3N0YXR1cworCisjIGFzX2ZuX2V4aXQgU1RBVFVTCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIEV4aXQgdGhlIHNoZWxsIHdpdGggU1RBVFVTLCBldmVuIGluIGEgInRyYXAgMCIgb3IgInNldCAtZSIgY29udGV4dC4KK2FzX2ZuX2V4aXQgKCkKK3sKKyAgc2V0ICtlCisgIGFzX2ZuX3NldF9zdGF0dXMgJDEKKyAgZXhpdCAkMQorfSAjIGFzX2ZuX2V4aXQKKworIyBhc19mbl9ta2Rpcl9wCisjIC0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCisKKyMgYXNfZm5fZXhlY3V0YWJsZV9wIEZJTEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdCBpZiBGSUxFIGlzIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLgorYXNfZm5fZXhlY3V0YWJsZV9wICgpCit7CisgIHRlc3QgLWYgIiQxIiAmJiB0ZXN0IC14ICIkMSIKK30gIyBhc19mbl9leGVjdXRhYmxlX3AKKyMgYXNfZm5fYXBwZW5kIFZBUiBWQUxVRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGVuZCB0aGUgdGV4dCBpbiBWQUxVRSB0byB0aGUgZW5kIG9mIHRoZSBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiBWQVIuIFRha2UKKyMgYWR2YW50YWdlIG9mIGFueSBzaGVsbCBvcHRpbWl6YXRpb25zIHRoYXQgYWxsb3cgYW1vcnRpemVkIGxpbmVhciBncm93dGggb3ZlcgorIyByZXBlYXRlZCBhcHBlbmRzLCBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHF1YWRyYXRpYyBncm93dGggcHJlc2VudCBpbiBuYWl2ZQorIyBpbXBsZW1lbnRhdGlvbnMuCitpZiAoZXZhbCAiYXNfdmFyPTE7IGFzX3Zhcis9MjsgdGVzdCB4XCRhc192YXIgPSB4MTIiKSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGV2YWwgJ2FzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMSs9XCQyCisgIH0nCitlbHNlCisgIGFzX2ZuX2FwcGVuZCAoKQorICB7CisgICAgZXZhbCAkMT1cJCQxXCQyCisgIH0KK2ZpICMgYXNfZm5fYXBwZW5kCisKKyMgYXNfZm5fYXJpdGggQVJHLi4uCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBQZXJmb3JtIGFyaXRobWV0aWMgZXZhbHVhdGlvbiBvbiB0aGUgQVJHcywgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlCisjIGdsb2JhbCAkYXNfdmFsLiBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuIFRoZSBhcmd1bWVudHMKKyMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuCitpZiAoZXZhbCAidGVzdCBcJCgoIDEgKyAxICkpID0gMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD0kKCggJCogKSkKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXJpdGggKCkKKyAgeworICAgIGFzX3ZhbD1gZXhwciAiJEAiIHx8IHRlc3QgJD8gLWVxIDFgCisgIH0KK2ZpICMgYXNfZm5fYXJpdGgKKworCisjIGFzX2ZuX2Vycm9yIFNUQVRVUyBFUlJPUiBbTElORU5PIExPR19GRF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgImBiYXNlbmFtZSAkMGA6IGVycm9yOiBFUlJPUiIgdG8gc3RkZXJyLiBJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUKKyMgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsIHJlZmVyZW5jaW5nIExJTkVOTy4gVGhlbiBleGl0IHRoZQorIyBzY3JpcHQgd2l0aCBTVEFUVVMsIHVzaW5nIDEgaWYgdGhhdCB3YXMgMC4KK2FzX2ZuX2Vycm9yICgpCit7CisgIGFzX3N0YXR1cz0kMTsgdGVzdCAkYXNfc3RhdHVzIC1lcSAwICYmIGFzX3N0YXR1cz0xCisgIGlmIHRlc3QgIiQ0IjsgdGhlbgorICAgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDMifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogJDIiID4mJDQKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6ICQyIiA+JjIKKyAgYXNfZm5fZXhpdCAkYXNfc3RhdHVzCit9ICMgYXNfZm5fZXJyb3IKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCitpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKworICBhc19saW5lbm9fMT0kTElORU5PIGFzX2xpbmVub18xYT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8gYXNfbGluZW5vXzJhPSRMSU5FTk8KKyAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEnJGFzX3J1bicgKyAxYCIgPSAieCRhc19saW5lbm9fMickYXNfcnVuJyInIHx8IHsKKyAgIyBCbGFtZSBMZWUgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjsgYXNfZm5fZXhpdCAxOyB9CisKKyAgIyBJZiB3ZSBoYWQgdG8gcmUtZXhlY3V0ZSB3aXRoICRDT05GSUdfU0hFTEwsIHdlJ3JlIGVuc3VyZWQgdG8gaGF2ZQorICAjIGFscmVhZHkgZG9uZSB0aGF0LCBzbyBlbnN1cmUgd2UgZG9uJ3QgdHJ5IHRvIGRvIHNvIGFnYWluIGFuZCBmYWxsCisgICMgaW4gYW4gaW5maW5pdGUgbG9vcC4gIFRoaXMgaGFzIGFscmVhZHkgaGFwcGVuZWQgaW4gcHJhY3RpY2UuCisgIF9hc19jYW5fcmVleGVjPW5vOyBleHBvcnQgX2FzX2Nhbl9yZWV4ZWMKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisgIC4gIi4vJGFzX21lLmxpbmVubyIKKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4gIygoKCgoCistbiopCisgIGNhc2UgYGVjaG8gJ3h5XGMnYCBpbgorICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKyAgeHkpICBFQ0hPX0M9J1xjJzs7CisgICopICAgZWNobyBgZWNobyBrc2g4OCBidWcgb24gQUlYIDYuMWAgPiAvZGV2L251bGwKKyAgICAgICBFQ0hPX1Q9JwknOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7Citlc2FjCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKK2ZpCitpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFzX2xuX3M9J2xuIC1zJworICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXBSJy4KKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisgICAgICBhc19sbl9zPSdjcCAtcFInCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXBSJworICBmaQorZWxzZQorICBhc19sbl9zPSdjcCAtcFInCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfdGVzdF94PSd0ZXN0IC14JworYXNfZXhlY3V0YWJsZV9wPWFzX2ZuX2V4ZWN1dGFibGVfcAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKwordGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAorZXhlYyA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0nSXBlcmYnCitQQUNLQUdFX1RBUk5BTUU9J2lwZXJmJworUEFDS0FHRV9WRVJTSU9OPScyLjAuNScKK1BBQ0tBR0VfU1RSSU5HPSdJcGVyZiAyLjAuNScKK1BBQ0tBR0VfQlVHUkVQT1JUPScnCitQQUNLQUdFX1VSTD0nJworCisjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCithY19pbmNsdWRlc19kZWZhdWx0PSJcCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKyNpZmRlZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TVERMSUJfSAorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGlmICFkZWZpbmVkIFNURENfSEVBREVSUyAmJiBkZWZpbmVkIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYiCisKK2FjX3N1YnN0X3ZhcnM9J0xUTElCT0JKUworU1RSSVBfRU5ECitTVFJJUF9CRUdJTgorU1RSSVBfRFVNTVkKK1dFQjEwMF9MSUJTCitXRUIxMDBfQ0ZMQUdTCitXRUIxMDBfQ09ORklHCitMSUJPQkpTCitFR1JFUAorR1JFUAorQ1BQCitQVEhSRUFEX0NGTEFHUworUFRIUkVBRF9MSUJTCitQVEhSRUFEX0NDCithY3hfcHRocmVhZF9jb25maWcKK2hvc3Rfb3MKK2hvc3RfdmVuZG9yCitob3N0X2NwdQoraG9zdAorYnVpbGRfb3MKK2J1aWxkX3ZlbmRvcgorYnVpbGRfY3B1CitidWlsZAorUkFOTElCCithbV9fZmFzdGRlcENDX0ZBTFNFCithbV9fZmFzdGRlcENDX1RSVUUKK0NDREVQTU9ERQorYWNfY3RfQ0MKK0NGTEFHUworQ0MKK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFCithbV9fZmFzdGRlcENYWF9UUlVFCitDWFhERVBNT0RFCitBTURFUEJBQ0tTTEFTSAorQU1ERVBfRkFMU0UKK0FNREVQX1RSVUUKK2FtX19xdW90ZQorYW1fX2luY2x1ZGUKK0RFUERJUgorT0JKRVhUCitFWEVFWFQKK2FjX2N0X0NYWAorQ1BQRkxBR1MKK0xERkxBR1MKK0NYWEZMQUdTCitDWFgKK2FtX191bnRhcgorYW1fX3RhcgorQU1UQVIKK2FtX19sZWFkaW5nX2RvdAorU0VUX01BS0UKK0FXSworbWtkaXJfcAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNCitTVFJJUAoraW5zdGFsbF9zaAorTUFLRUlORk8KK0FVVE9IRUFERVIKK0FVVE9NQUtFCitBVVRPQ09ORgorQUNMT0NBTAorVkVSU0lPTgorUEFDS0FHRQorQ1lHUEFUSF9XCitJTlNUQUxMX0RBVEEKK0lOU1RBTExfU0NSSVBUCitJTlNUQUxMX1BST0dSQU0KK3RhcmdldF9hbGlhcworaG9zdF9hbGlhcworYnVpbGRfYWxpYXMKK0xJQlMKK0VDSE9fVAorRUNIT19OCitFQ0hPX0MKK0RFRlMKK21hbmRpcgorbG9jYWxlZGlyCitsaWJkaXIKK3BzZGlyCitwZGZkaXIKK2R2aWRpcgoraHRtbGRpcgoraW5mb2RpcgorZG9jZGlyCitvbGRpbmNsdWRlZGlyCitpbmNsdWRlZGlyCitsb2NhbHN0YXRlZGlyCitzaGFyZWRzdGF0ZWRpcgorc3lzY29uZmRpcgorZGF0YWRpcgorZGF0YXJvb3RkaXIKK2xpYmV4ZWNkaXIKK3NiaW5kaXIKK2JpbmRpcgorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorcHJlZml4CitleGVjX3ByZWZpeAorUEFDS0FHRV9VUkwKK1BBQ0tBR0VfQlVHUkVQT1JUCitQQUNLQUdFX1NUUklORworUEFDS0FHRV9WRVJTSU9OCitQQUNLQUdFX1RBUk5BTUUKK1BBQ0tBR0VfTkFNRQorUEFUSF9TRVBBUkFUT1IKK1NIRUxMJworYWNfc3Vic3RfZmlsZXM9JycKK2FjX3VzZXJfb3B0cz0nCitlbmFibGVfb3B0aW9uX2NoZWNraW5nCitlbmFibGVfaXB2NgorZW5hYmxlX211bHRpY2FzdAorZW5hYmxlX3RocmVhZHMKK2VuYWJsZV9kZWJ1Z2luZm8KK2VuYWJsZV93ZWIxMDAKK2VuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nCisnCisgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcworaG9zdF9hbGlhcwordGFyZ2V0X2FsaWFzCitDWFgKK0NYWEZMQUdTCitMREZMQUdTCitMSUJTCitDUFBGTEFHUworQ0NDCitDQworQ0ZMQUdTCitDUFAnCisKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCithY191bnJlY29nbml6ZWRfb3B0cz0KK2FjX3VucmVjb2duaXplZF9zZXA9CisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2RvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRV9UQVJOQU1FfScKK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCitodG1sZGlyPScke2RvY2Rpcn0nCitkdmlkaXI9JyR7ZG9jZGlyfScKK3BkZmRpcj0nJHtkb2NkaXJ9JworcHNkaXI9JyR7ZG9jZGlyfScKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCittYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKworYWNfcHJldj0KK2FjX2Rhc2hkYXNoPQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICo9PyopIGFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisgICo9KSAgIGFjX29wdGFyZz0gOzsKKyAgKikgICAgYWNfb3B0YXJnPXllcyA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisgIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQorICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQorICAgIGFjX3ByZXY9ZG9jZGlyIDs7CisgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKyAgICBhY19wcmV2PWR2aWRpciA7OworICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZW5hYmxlLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisiZW5hYmxlXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWVuYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKyAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCisgIHwgLS1odD0qKQorICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCisgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKyAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCisgICAgYWNfcHJldj1wZGZkaXIgOzsKKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKyAgICBwZGZkaXI9JGFjX29wdGFyZyA7OworCisgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisgICAgYWNfcHJldj1wc2RpciA7OworICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IgorICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKyAgICAgICoiCisid2l0aF8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS13aXRoLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgd2l0aF8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbjogXGAkYWNfb3B0aW9uJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICA7OworCisgICo9KikKKyAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGNhc2UgJGFjX2VudnZhciBpbiAjKAorICAgICAgJycgfCBbMC05XSogfCAqWyFfJGFzX2NyX2FsbnVtXSogKQorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFyaWFibGUgbmFtZTogXGAkYWNfZW52dmFyJyIgOzsKKyAgICBlc2FjCisgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB5b3Ugc2hvdWxkIHVzZSAtLWJ1aWxkLCAtLWhvc3QsIC0tdGFyZ2V0IiA+JjIKKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uIiA+JjIKKyAgICA6ICIke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufSIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKyAgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyI7IHRoZW4KKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorICAgIG5vKSA7OworICAgIGZhdGFsKSBhc19mbl9lcnJvciAkPyAidW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgOzsKKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisgIGVzYWMKK2ZpCisKKyMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgorZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAorCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCisJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCitkbworICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgKi8gKQorICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworICBlc2FjCisgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KKyAgY2FzZSAkYWNfdmFsIGluCisgICAgW1xcLyRdKiB8ID86W1xcL10qICkgIGNvbnRpbnVlOzsKKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisgIGVzYWMKKyAgYXNfZm5fZXJyb3IgJD8gImV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorYWNfbHNfZGk9YGxzIC1kaSAuYCAmJgorYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIKK3Rlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorICBhc19mbl9lcnJvciAkPyAicHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IgorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAgYWNfY29uZmRpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19teXNlbGYiIHx8CiskYXNfZXhwciBYIiRhc19teXNlbGYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJHNyY2RpciIKK2ZpCithY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCithY19hYnNfY29uZmRpcj1gKAorCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgYXNfZm5fZXJyb3IgJD8gIiRhY19tc2ciCisJcHdkKWAKKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCitpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisgIHNyY2Rpcj0uCitmaQorIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKyMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCitjYXNlICRzcmNkaXIgaW4KKyovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworZXNhYworZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KK2RvbmUKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBJcGVyZiAyLjAuNSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nIC4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL2lwZXJmXQorICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1kdmlkaXI9RElSICAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wZGZkaXI9RElSICAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorCitQcm9ncmFtIG5hbWVzOgorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYICAgICAgICAgICAgYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTSAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorICBjYXNlICRhY19pbml0X2hlbHAgaW4KKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIElwZXJmIDIuMC41OiI7OworICAgZXNhYworICBjYXQgPDxcX0FDRU9GCisKK09wdGlvbmFsIEZlYXR1cmVzOgorICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWRpc2FibGUtaXB2NiAgICAgICAgICBkaXNhYmxlIGlwdjYgc3VwcG9ydCAoZGVmYXVsdCBpcyBhdXRvZGV0ZWN0KQorICAtLWRpc2FibGUtbXVsdGljYXN0ICAgICBkaXNhYmxlIG11bHRpY2FzdCBzdXBwb3J0IChkZWZhdWx0IGlzIGF1dG9kZXRlY3QpCisgIC0tZGlzYWJsZS10aHJlYWRzICAgICAgIGRpc2FibGUgdGhyZWFkIHN1cHBvcnQgKGRlZmF1bHQgaXMgYXV0b2RldGVjdCkKKyAgLS1lbmFibGUtZGVidWdpbmZvICAgICAgZW5hYmxlIGRlYnVnZ2luZyBpbmZvIGZvciBzb2NrZXRzIChkZWZhdWx0IGlzIG5vKQorICAtLWRpc2FibGUtd2ViMTAwICAgICAgICBkaXNhYmxlIHdlYjEwMCBzdXBwb3J0IChkZWZhdWx0IGlzIGF1dG9kZXRlY3QpCisgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKKyAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnMKKworU29tZSBpbmZsdWVudGlhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIENYWCAgICAgICAgIEMrKyBjb21waWxlciBjb21tYW5kCisgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIChPYmplY3RpdmUpIEMvQysrIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLgorX0FDRU9GCithY19zdGF0dXM9JD8KK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorICAgICAgeyBjZCAiJHNyY2RpciIgJiYgYWNfcHdkPWBwd2RgICYmIHNyY2Rpcj0uICYmIHRlc3QgLWQgIiRhY19kaXIiOyB9IHx8CisgICAgICBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWAkYXNfZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzfC9bXlxcL10qfC8uLnxnO3N8L3x8J2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7Citlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CisKKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorICAgICAgZWNobyAmJgorICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsc2UKKyAgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorSXBlcmYgY29uZmlndXJlIDIuMC41CitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkKKworQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KK19BQ0VPRgorICBleGl0CitmaQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIEF1dG9jb25mIGluaXRpYWxpemF0aW9uLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgYWNfZm5fY3h4X3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2N4eF90cnlfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jeHhfdHJ5X2NvbXBpbGUKKworIyBhY19mbl9jX3RyeV9jb21waWxlIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jb21waWxlICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorICBpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jb21waWxlCisKKyMgYWNfZm5fY190cnlfbGluayBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfbGluayAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKwkgdGVzdCAteCBjb25mdGVzdCRhY19leGVleHQKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19yZXR2YWw9MQorZmkKKyAgIyBEZWxldGUgdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKSBpbmZvcm1hdGlvbgorICAjIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksIGFzIGl0IHdvdWxkCisgICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCisgICMgbGVmdCBiZWhpbmQgYnkgQXBwbGUncyBjb21waWxlci4gIFdlIGRvIHRoaXMgYmVmb3JlIGV4ZWN1dGluZyB0aGUgYWN0aW9ucy4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9saW5rCisKKyMgYWNfZm5fY19jaGVja19mdW5jIExJTkVOTyBGVU5DIFZBUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgRlVOQyBleGlzdHMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseQorYWNfZm5fY19jaGVja19mdW5jICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICQyIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJDIuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJDIgaW5ub2N1b3VzXyQyCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICQyICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICQyCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJDIgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl8kMiB8fCBkZWZpbmVkIF9fc3R1Yl9fXyQyCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICQyICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2Z1bmMKKworIyBhY19mbl9jX3RyeV9jcHAgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJ5IHRvIHByZXByb2Nlc3MgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLgorYWNfZm5fY190cnlfY3BwICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgICAgbXYgLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSA+IGNvbmZ0ZXN0LmkgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICAgYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X2NwcAorCisjIGFjX2ZuX2NfdHJ5X3J1biBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuIEFzc3VtZXMKKyMgdGhhdCBleGVjdXRhYmxlcyAqY2FuKiBiZSBydW4uCithY19mbl9jX3RyeV9ydW4gKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgeyBjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgfTsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorICAgICAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICAgICAgYWNfcmV0dmFsPSRhY19zdGF0dXMKK2ZpCisgIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfcnVuCisKKyMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cywgZ2l2aW5nIGEgd2FybmluZyBpZiBpdCBjYW5ub3QgYmUgY29tcGlsZWQgdXNpbmcKKyMgdGhlIGluY2x1ZGUgZmlsZXMgaW4gSU5DTFVERVMgYW5kIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUgorIyBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHVzYWJpbGl0eSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkMiB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHByZXNlbmNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICQyIHByZXNlbmNlLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JDI+CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gIygoCisgIHllczpubzogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgOzsKK2VzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJDM9XCRhY19oZWFkZXJfY29tcGlsZXIiCitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKworfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMgaW4KKyMgSU5DTFVERVMsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorI2luY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZQorCisjIGFjX2ZuX2NfY2hlY2tfdHlwZSBMSU5FTk8gVFlQRSBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFRZUEUgZXhpc3RzIGFmdGVyIGhhdmluZyBpbmNsdWRlZCBJTkNMVURFUywgc2V0dGluZyBjYWNoZQorIyB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX3R5cGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkMiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJDIuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1ubyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworaWYgKHNpemVvZiAoJDIpKQorCSByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgoJDIpKSkKKwkgICAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBldmFsICIkMz15ZXMiCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubworCit9ICMgYWNfZm5fY19jaGVja190eXBlCisKKyMgYWNfZm5fY19jb21wdXRlX2ludCBMSU5FTk8gRVhQUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJpZXMgdG8gZmluZCB0aGUgY29tcGlsZS10aW1lIHZhbHVlIG9mIEVYUFIgaW4gYSBwcm9ncmFtIHRoYXQgaW5jbHVkZXMKKyMgSU5DTFVERVMsIHNldHRpbmcgVkFSIGFjY29yZGluZ2x5LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIGNvdWxkIGJlCisjIGNvbXB1dGVkCithY19mbl9jX2NvbXB1dGVfaW50ICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAkYWNfbWlkICsgMSAmJiBhY19sbz0kYXNfdmFsCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYXNfZm5fYXJpdGggMiAnKicgJGFjX21pZCArIDEgJiYgYWNfbWlkPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJDIpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgWzBdOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKCQyKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDA7CityZXR1cm4gdGVzdF9hcnJheSBbMF07CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19sbz0kYWNfbWlkOyBicmVhaworZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgLSAxICYmIGFjX2hpPSRhc192YWwKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhc19mbl9hcml0aCAyICcqJyAkYWNfbWlkICYmIGFjX21pZD0kYXNfdmFsCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgYWNfbG89IGFjX2hpPQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KK3doaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KKyAgYXNfZm5fYXJpdGggJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvICYmIGFjX21pZD0kYXNfdmFsCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyQ0CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgkMikgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwOworcmV0dXJuIHRlc3RfYXJyYXkgWzBdOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGk9JGFjX21pZAorZWxzZQorICBhc19mbl9hcml0aCAnKCcgJGFjX21pZCAnKScgKyAxICYmIGFjX2xvPSRhc192YWwKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluICMoKAorPyopIGV2YWwgIiQzPVwkYWNfbG8iOyBhY19yZXR2YWw9MCA7OworJycpIGFjX3JldHZhbD0xIDs7Citlc2FjCisgIGVsc2UKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKCQyKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoJDIpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgkMikpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CisgICAgfQorICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KKyAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGVjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDMgPGNvbmZ0ZXN0LnZhbDsgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgYWNfcmV0dmFsPTEKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb25mdGVzdC52YWwKKworICBmaQorICBldmFsICRhc19saW5lbm9fc3RhY2s7ICR7YXNfbGluZW5vX3N0YWNrOis6fSB1bnNldCBhc19saW5lbm8KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX2NvbXB1dGVfaW50CisKKyMgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKKyMgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAorICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CisjaWZuZGVmICRhc19kZWNsX25hbWUKKyNpZmRlZiBfX2NwbHVzcGx1cworICAodm9pZCkgJGFzX2RlY2xfdXNlOworI2Vsc2UKKyAgKHZvaWQpICRhc19kZWNsX25hbWU7CisjZW5kaWYKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyAke2FzX2xpbmVub19zdGFjazorOn0gdW5zZXQgYXNfbGluZW5vCisKK30gIyBhY19mbl9jX2NoZWNrX2RlY2wKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IElwZXJmICRhc19tZSAyLjAuNSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCit7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Cit7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgorIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisgICAgICBlc2FjCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICMjCisjIyAtLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGNhdCBjb25mZGVmcy5oCisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCithY19zaXRlX2ZpbGUxPU5PTkUKK2FjX3NpdGVfZmlsZTI9Tk9ORQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICAjIFdlIGRvIG5vdCB3YW50IGEgUEFUSCBzZWFyY2ggZm9yIGNvbmZpZy5zaXRlLgorICBjYXNlICRDT05GSUdfU0lURSBpbiAjKCgKKyAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OworICAgICovKikgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEU7OworICAgICopICAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgIGVzYWMKK2VsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgIGFjX3NpdGVfZmlsZTE9JHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitlbHNlCisgIGFjX3NpdGVfZmlsZTE9JGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gIiRhY19zaXRlX2ZpbGUxIiAiJGFjX3NpdGVfZmlsZTIiCitkbworICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIgXAorICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsIGZpbGVzCisgICMgYWN0dWFsbHkpLCBzbyB3ZSBhdm9pZCBkb2luZyB0aGF0LiAgREpHUFAgZW11bGF0ZXMgaXQgYXMgYSByZWd1bGFyIGZpbGUuCisgIGlmIHRlc3QgL2Rldi9udWxsICE9ICIkY2FjaGVfZmlsZSIgJiYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworICAgICAgKikgICAgICAgICAgICAgICAgICAgICAgLiAiLi8kY2FjaGVfZmlsZSI7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisgIGV2YWwgYWNfbmV3X3ZhbD1cJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorICAgIHNldCwpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICxzZXQpCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLCk7OworICAgICopCisgICAgICBpZiB0ZXN0ICJ4JGFjX29sZF92YWwiICE9ICJ4JGFjX25ld192YWwiOyB0aGVuCisJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCisJYWNfbmV3X3ZhbF93PWBlY2hvIHggJGFjX25ld192YWxgCisJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKwllbHNlCisJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCSAgZXZhbCAkYWNfdmFyPVwkYWNfb2xkX3ZhbAorCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9CisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ3VyZV9hcmdzICIgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgYXNfZm5fZXJyb3IgJD8gInJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiICIkTElORU5PIiA1CitmaQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKKworYW1fX2FwaV92ZXJzaW9uPSIxLjkiCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KKyAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgVGhlc2UgdGhyZWUgdmFyaWFibGVzIGFyZSB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisjIHdob3NlIGZ1bGwgbmFtZSBjb250YWlucyB1bnVzdWFsIGNoYXJhY3RlcnMuCithY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ3VyZT0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZ3VyZSIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKworCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCisjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiAke2FjX2N2X3BhdGhfaW5zdGFsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4gIygoCisgIC4vIHwgLi8vIHwgL1tjQ10vKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86W1xcL11vczJbXFwvXWluc3RhbGxbXFwvXSogfCA/OltcXC9dT1MyW1xcL11JTlNUQUxMW1xcL10qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorCSAgICBncmVwIHB3cGx1cyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgorCSAgICA6CisJICBlbHNlCisJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorCSAgICBlY2hvIHR3byA+IGNvbmZ0ZXN0LnR3bworCSAgICBta2RpciBjb25mdGVzdC5kaXIKKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKwkgICAgICB0ZXN0IC1zIGNvbmZ0ZXN0Lm9uZSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LnR3byAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworCSAgICB0aGVuCisJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICAgIGJyZWFrIDMKKwkgICAgZmkKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKKworICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK3JtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgRG9uJ3QgY2FjaGUgYQorICAgICMgdmFsdWUgZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiAiID4mNjsgfQorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgYXNfZm5fZXJyb3IgJD8gImxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KK2FsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiICIkTElORU5PIiA1CisgICBmaQorCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgYXNfZm5fZXJyb3IgJD8gIm5ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2siICIkTElORU5PIiA1CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzJl4mJHByb2dyYW1fcHJlZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXCQmJHByb2dyYW1fc3VmZml4JjskcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgRG91YmxlIGFueSBcIG9yICQuCisjIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgorYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJworcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gJGFzX2VjaG8gIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisKKyMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKK2FtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKKwordGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFxgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9CitmaQorCitpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICMgV2UgdXNlZCB0byBrZWVwaW5nIHRoZSBgLicgYXMgZmlyc3QgYXJndW1lbnQsIGluIG9yZGVyIHRvCisgICMgYWxsb3cgJChta2Rpcl9wKSB0byBiZSB1c2VkIHdpdGhvdXQgYXJndW1lbnQuICBBcyBpbgorICAjICAgJChta2Rpcl9wKSAkKHNvbWVkaXIpCisgICMgd2hlcmUgJChzb21lZGlyKSBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQuICBIb3dldmVyIHRoaXMgaXMgd3JvbmcKKyAgIyBmb3IgdHdvIHJlYXNvbnM6CisgICMgIDEuIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSBhIHVzZXIgd2hvIGNhbm5vdCB3cml0ZSBgLicKKyAgIyAgICAgbWFrZSBpbnN0YWxsIHdpbGwgZmFpbCwKKyAgIyAgMi4gdGhlIGFib3ZlIGNvbW1lbnQgc2hvdWxkIG1vc3QgY2VydGFpbmx5IHJlYWQKKyAgIyAgICAgJChta2Rpcl9wKSAkKERFU1RESVIpJChzb21lZGlyKQorICAjICAgICBzbyBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gJChzb21lZGlyKSBpcyB1bmRlZmluZWQgYW5kCisgICMgICAgICQoREVTVERJUikgaXMgbm90LgorICAjICBUbyBzdXBwb3J0IHRoZSBsYXR0ZXIgY2FzZSwgd2UgaGF2ZSB0byB3cml0ZQorICAjICAgICB0ZXN0IC16ICIkKHNvbWVkaXIpIiB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpLAorICAjICBzbyB0aGUgYC4nIHRyaWNrIGlzIHBvaW50bGVzcy4KKyAgbWtkaXJfcD0nbWtkaXIgLXAgLS0nCitlbHNlCisgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisgICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcworICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQorICAjIGV4aXN0cy4KKyAgZm9yIGQgaW4gLi8tcCAuLy0tdmVyc2lvbjsKKyAgZG8KKyAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCisgIGRvbmUKKyAgIyAkKG1raW5zdGFsbGRpcnMpIGlzIGRlZmluZWQgYnkgQXV0b21ha2UgaWYgbWtpbnN0YWxsZGlycyBleGlzdHMuCisgIGlmIHRlc3QgLWYgIiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiOyB0aGVuCisgICAgbWtkaXJfcD0nJChta2luc3RhbGxkaXJzKScKKyAgZWxzZQorICAgIG1rZGlyX3A9JyQoaW5zdGFsbF9zaCkgLWQnCisgIGZpCitmaQorCitmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19BV0srOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FXSz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQVdLPSRhY19jdl9wcm9nX0FXSworaWYgdGVzdCAtbiAiJEFXSyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBV0siID4mNQorJGFzX2VjaG8gIiRBV0siID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkQVdLIiAmJiBicmVhaworZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKS4uLiAiID4mNjsgfQorc2V0IHggJHtNQUtFLW1ha2V9CithY19tYWtlPWAkYXNfZWNobyAiJDIiIHwgc2VkICdzLysvcC9nOyBzL1teYS16QS1aMC05X10vXy9nJ2AKK2lmIGV2YWwgXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorU0hFTEwgPSAvYmluL3NoCithbGw6CisJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKK19BQ0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZyAuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCisgICpAQEAlJSU9Pyo9QEBAJSUlKikKKyAgICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXM7OworICAqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vOzsKK2VzYWMKK3JtIC1mIGNvbmZ0ZXN0Lm1ha2UKK2ZpCitpZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgU0VUX01BS0U9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitybSAtcmYgLnRzdCAyPi9kZXYvbnVsbAorbWtkaXIgLnRzdCAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAudHN0OyB0aGVuCisgIGFtX19sZWFkaW5nX2RvdD0uCitlbHNlCisgIGFtX19sZWFkaW5nX2RvdD1fCitmaQorcm1kaXIgLnRzdCAyPi9kZXYvbnVsbAorCisjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKK2lmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYKKyAgIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuIFwibWFrZSBkaXN0Y2xlYW5cIiB0aGVyZSBmaXJzdCIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCisKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorIFBBQ0tBR0U9J2lwZXJmJworIFZFUlNJT049JzIuMC41JworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgorX0FDRU9GCisKKyMgU29tZSB0b29scyBBdXRvbWFrZSBuZWVkcy4KKworQUNMT0NBTD0ke0FDTE9DQUwtIiR7YW1fbWlzc2luZ19ydW59YWNsb2NhbC0ke2FtX19hcGlfdmVyc2lvbn0ifQorCisKK0FVVE9DT05GPSR7QVVUT0NPTkYtIiR7YW1fbWlzc2luZ19ydW59YXV0b2NvbmYifQorCisKK0FVVE9NQUtFPSR7QVVUT01BS0UtIiR7YW1fbWlzc2luZ19ydW59YXV0b21ha2UtJHthbV9fYXBpX3ZlcnNpb259In0KKworCitBVVRPSEVBREVSPSR7QVVUT0hFQURFUi0iJHthbV9taXNzaW5nX3J1bn1hdXRvaGVhZGVyIn0KKworCitNQUtFSU5GTz0ke01BS0VJTkZPLSIke2FtX21pc3NpbmdfcnVufW1ha2VpbmZvIn0KKworaW5zdGFsbF9zaD0ke2luc3RhbGxfc2gtIiRhbV9hdXhfZGlyL2luc3RhbGwtc2gifQorCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCitpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkU1RSSVAiID4mNQorJGFzX2VjaG8gIiRTVFJJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1RSSVAiOyB0aGVuCisgIGFjX2N0X1NUUklQPSRTVFJJUAorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBzdHJpcDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfU1RSSVA9IiRhY19jdF9TVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAoraWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfU1RSSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9TVFJJUCIgPSB4OyB0aGVuCisgICAgU1RSSVA9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgU1RSSVA9JGFjX2N0X1NUUklQCisgIGZpCitlbHNlCisgIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKK2ZpCisKK2ZpCitJTlNUQUxMX1NUUklQX1BST0dSQU09Ilwke1NIRUxMfSBcJChpbnN0YWxsX3NoKSAtYyAtcyIKKworIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCisjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK0FNVEFSPSR7QU1UQVItIiR7YW1fbWlzc2luZ19ydW59dGFyIn0KKworYW1fX3Rhcj0nJHtBTVRBUn0gY2hvZiAtICIkJHRhcmRpciInOyBhbV9fdW50YXI9JyR7QU1UQVJ9IHhmIC0nCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWlwdjYgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfaXB2NitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2lwdjY7IGFjX2N2X2hhdmVfaXB2Nj0kZW5hYmxlX2lwdjYKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW11bHRpY2FzdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tdWx0aWNhc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9tdWx0aWNhc3Q7IGFjX2N2X211bHRpY2FzdD0kZW5hYmxlX211bHRpY2FzdAorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGhyZWFkcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90aHJlYWRzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfdGhyZWFkczsKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlYnVnaW5mbyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZWJ1Z2luZm8rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kZWJ1Z2luZm87IGVuYWJsZV9kZWJ1Z2luZm89JGVuYWJsZXZhbAorZWxzZQorICBlbmFibGVfZGVidWdpbmZvPW5vCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS13ZWIxMDAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfd2ViMTAwK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfd2ViMTAwOworZmkKKworCisKKworYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRDQ0MiOyB0aGVuCisgICAgQ1hYPSRDQ0MKKyAgZWxzZQorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ1hYKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NYWD0kYWNfY3ZfcHJvZ19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1hYIiA+JjUKKyRhc19lY2hvICIkQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKyAgYWNfY3RfQ1hYPSRDWFgKKyAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX2N0X0NYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAoraWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DWFgiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DWFgiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkYWNfY3RfQ1hYIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ1hYIiA9IHg7IHRoZW4KKyAgICBDWFg9ImcrKyIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDWFg9JGFjX2N0X0NYWAorICBmaQorZmkKKworICBmaQorZmkKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitzZXQgWCAkYWNfY29tcGlsZQorYWNfY29tcGlsZXI9JDIKK2ZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KKyAgeyB7IGFjX3RyeT0iJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiKSAyPmNvbmZ0ZXN0LmVycgorICBhY19zdGF0dXM9JD8KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBzZWQgJzEwYVwKKy4uLiByZXN0IG9mIHN0ZGVyciBvdXRwdXQgZGVsZXRlZCAuLi4KKyAgICAgICAgIDEwcScgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICBmaQorICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9Citkb25lCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQysrIGNvbXBpbGVyIHdvcmtzLi4uICIgPiY2OyB9CithY19saW5rX2RlZmF1bHQ9YCRhc19lY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAorCisjIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CithY19maWxlcz0iYS5vdXQgY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGEuZXhlIGFfb3V0LmV4ZSBiLm91dCBjb25mdGVzdC4qIgorCithY19ybWZpbGVzPQorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzCitkbworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OworICBlc2FjCitkb25lCitybSAtZiAkYWNfcm1maWxlcworCitpZiB7IHsgYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGlua19kZWZhdWx0IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KKyMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCisjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAorIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KKyMgQXV0b2NvbmYuCitmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKK2RvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQorCTs7CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICouKiApCisJaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87CisJdGhlbiA6OyBlbHNlCisJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJZmkKKwkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKwkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKwkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KKwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKKwkjIGFjdHVhbGx5IHdvcmtpbmcuCisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQordGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9CisKK2Vsc2UKKyAgYWNfZmlsZT0nJworZmkKK2lmIHRlc3QgLXogIiRhY19maWxlIjsgdGhlbiA6CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgIkMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQorYWNfZXhlZXh0PSRhY19jdl9leGVleHQKKworcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAiID4mNjsgfQoraWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH07IHRoZW4gOgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitmaQorcm0gLWYgY29uZnRlc3QgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKK0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7CisgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgY29uZnRlc3Qub3V0IgorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgIGlmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMrKyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgICBmaQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvICIkY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdCRhY19jdl9leGVleHQgY29uZnRlc3Qub3V0CithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9vYmpleHQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGFjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2N4eF9jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICBHWFg9eWVzCitlbHNlCisgIEdYWD0KK2ZpCithY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorYWNfc2F2ZV9DWFhGTEFHUz0kQ1hYRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jeHhfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnPSRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgIGFjX2N4eF93ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKyAgIENYWEZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCitlbHNlCisgIENYWEZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKKwkgQ1hYRkxBR1M9Ii1nIgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY3h4X2ciID4mNjsgfQoraWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCisgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIENYWEZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDWFhGTEFHUz0KKyAgZmkKK2ZpCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitERVBESVI9IiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiCisKK2FjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZXBmaWxlcyIKKworCithbV9tYWtlPSR7TUFLRS1tYWtlfQorY2F0ID4gY29uZmluYyA8PCAnRU5EJworYW1fX2RvaXQ6CisJQGVjaG8gZG9uZQorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZS4uLiAiID4mNjsgfQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIFdlIGdyZXAgb3V0IGBFbnRlcmluZyBkaXJlY3RvcnknIGFuZCBgTGVhdmluZyBkaXJlY3RvcnknCisjIG1lc3NhZ2VzIHdoaWNoIGNhbiBvY2N1ciBpZiBgdycgZW5kcyB1cCBpbiBNQUtFRkxBR1MuCisjIEluIHBhcnRpY3VsYXIgd2UgZG9uJ3QgbG9vayBhdCBgXm1ha2U6JyBiZWNhdXNlIEdOVSBtYWtlIG1pZ2h0CisjIGJlIGludm9rZWQgdW5kZXIgc29tZSBvdGhlciBuYW1lICh1c3VhbGx5ICJnbWFrZSIpLCBpbiB3aGljaAorIyBjYXNlIGl0IHByaW50cyBpdHMgbmV3IG5hbWUgaW5zdGVhZCBvZiBgbWFrZScuCitpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgJ2luZyBkaXJlY3RvcnknYCIgPSAiZG9uZSI7IHRoZW4KKyAgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgIGFtX19xdW90ZT0KKyAgIF9hbV9yZXN1bHQ9R05VCitmaQorIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBpZiB0ZXN0ICJgJGFtX21ha2UgLXMgLWYgY29uZm1mIDI+IC9kZXYvbnVsbGAiID0gImRvbmUiOyB0aGVuCisgICAgICBhbV9faW5jbHVkZT0uaW5jbHVkZQorICAgICAgYW1fX3F1b3RlPSJcIiIKKyAgICAgIF9hbV9yZXN1bHQ9QlNECisgICBmaQorZmkKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJF9hbV9yZXN1bHQiID4mNQorJGFzX2VjaG8gIiRfYW1fcmVzdWx0IiA+JjY7IH0KK3JtIC1mIGNvbmZpbmMgY29uZm1mCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nOworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworZmkKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgQU1ERVBfVFJVRT0KKyAgQU1ERVBfRkFMU0U9JyMnCitlbHNlCisgIEFNREVQX1RSVUU9JyMnCisgIEFNREVQX0ZBTFNFPQorZmkKKworCisKKworZGVwY2M9IiRDWFgiICBhbV9jb21waWxlcl9saXN0PQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjLi4uICIgPiY2OyB9CitpZiAke2FtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCcuCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCisgIGlmIHRlc3QgIiRhbV9jb21waWxlcl9saXN0IiA9ICIiOyB0aGVuCisgICAgIGFtX2NvbXBpbGVyX2xpc3Q9YHNlZCAtbiAncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCcgPCAuL2RlcGNvbXBgCisgIGZpCisgIGZvciBkZXBtb2RlIGluICRhbV9jb21waWxlcl9saXN0OyBkbworICAgICMgU2V0dXAgYSBzb3VyY2Ugd2l0aCBtYW55IGRlcGVuZGVuY2llcywgYmVjYXVzZSBzb21lIGNvbXBpbGVycworICAgICMgbGlrZSB0byB3cmFwIGxhcmdlIGRlcGVuZGVuY3kgbGlzdHMgb24gY29sdW1uIDgwICh3aXRoIFwpLCBhbmQKKyAgICAjIHdlIHNob3VsZCBub3QgY2hvb3NlIGEgZGVwY29tcCBtb2RlIHdoaWNoIGlzIGNvbmZ1c2VkIGJ5IHRoaXMuCisgICAgIworICAgICMgV2UgbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBmaWxlcyBmb3IgZWFjaCB0ZXN0LCBhcyB0aGUgY29tcGlsZXIgbWF5CisgICAgIyBvdmVyd3JpdGUgc29tZSBvZiB0aGVtIHdoZW4gdGVzdGluZyB3aXRoIG9ic2N1cmUgY29tbWFuZCBsaW5lcy4KKyAgICAjIFRoaXMgaGFwcGVucyBhdCBsZWFzdCB3aXRoIHRoZSBBSVggQyBjb21waWxlci4KKyAgICA6ID4gc3ViL2NvbmZ0ZXN0LmMKKyAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNjsgZG8KKyAgICAgIGVjaG8gJyNpbmNsdWRlICJjb25mdHN0JyRpJy5oIicgPj4gc3ViL2NvbmZ0ZXN0LmMKKyAgICAgICMgVXNpbmcgYDogPiBzdWIvY29uZnRzdCRpLmgnIGNyZWF0ZXMgb25seSBzdWIvY29uZnRzdDEuaCB3aXRoCisgICAgICAjIFNvbGFyaXMgOCdzIHsvdXNyLH0vYmluL3NoLgorICAgICAgdG91Y2ggc3ViL2NvbmZ0c3QkaS5oCisgICAgZG9uZQorICAgIGVjaG8gIiR7YW1fX2luY2x1ZGV9ICR7YW1fX3F1b3RlfXN1Yi9jb25mdGVzdC5QbyR7YW1fX3F1b3RlfSIgPiBjb25mbWYKKworICAgIGNhc2UgJGRlcG1vZGUgaW4KKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG5vbmUpIGJyZWFrIDs7CisgICAgZXNhYworICAgICMgV2UgY2hlY2sgd2l0aCBgLWMnIGFuZCBgLW8nIGZvciB0aGUgc2FrZSBvZiB0aGUgImRhc2htc3Rkb3V0IgorICAgICMgbW9kZS4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZSBTdW5Qcm8gQysrIGNvbXBpbGVyIGRvZXMgbm90IHByb3Blcmx5CisgICAgIyBoYW5kbGUgYC1NIC1vJywgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMuCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD1zdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gXAorICAgICAgIGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlBvIHRtcGRlcGZpbGU9c3ViL2NvbmZ0ZXN0LlRQbyBcCisgICAgICAgJFNIRUxMIC4vZGVwY29tcCAkZGVwY2MgLWMgLW8gc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5jIFwKKyAgICAgICAgID4vZGV2L251bGwgMj5jb25mdGVzdC5lcnIgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdHN0Ni5oIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICAke01BS0UtbWFrZX0gLXMgLWYgY29uZm1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgICMgaWNjIGRvZXNuJ3QgY2hva2Ugb24gdW5rbm93biBvcHRpb25zLCBpdCB3aWxsIGp1c3QgaXNzdWUgd2FybmluZ3MKKyAgICAgICMgb3IgcmVtYXJrcyAoZXZlbiB3aXRoIC1XZXJyb3IpLiAgU28gd2UgZ3JlcCBzdGRlcnIgZm9yIGFueSBtZXNzYWdlCisgICAgICAjIHRoYXQgc2F5cyBhbiBvcHRpb24gd2FzIGlnbm9yZWQgb3Igbm90IHN1cHBvcnRlZC4KKyAgICAgICMgV2hlbiBnaXZlbiAtTVAsIGljYyA3LjAgYW5kIDcuMSBjb21wbGFpbiB0aHVzbHk6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgd2FybmluZzogaWdub3Jpbmcgb3B0aW9uICctTSc7IG5vIGFyZ3VtZW50IHJlcXVpcmVkCisgICAgICAjIFRoZSBkaWFnbm9zaXMgY2hhbmdlZCBpbiBpY2MgOC4wOgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHJlbWFyazogb3B0aW9uICctTVAnIG5vdCBzdXBwb3J0ZWQKKyAgICAgIGlmIChncmVwICdpZ25vcmluZyBvcHRpb24nIGNvbmZ0ZXN0LmVyciB8fAorICAgICAgICAgIGdyZXAgJ25vdCBzdXBwb3J0ZWQnIGNvbmZ0ZXN0LmVycikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgICAgICAgYW1fY3ZfQ1hYX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2X0NYWF9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorJGFzX2VjaG8gIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNjsgfQorQ1hYREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUKKworCisKK2lmCisgIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubyBcCisgICYmIHRlc3QgIiRhbV9jdl9DWFhfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID0gZ2NjMzsgdGhlbgorICBhbV9fZmFzdGRlcENYWF9UUlVFPQorICBhbV9fZmFzdGRlcENYWF9GQUxTRT0nIycKK2Vsc2UKKyAgYW1fX2Zhc3RkZXBDWFhfVFJVRT0nIycKKyAgYW1fX2Zhc3RkZXBDWFhfRkFMU0U9CitmaQorCisKK0NYWEZMQUdTPWBlY2hvICIgJENYWEZMQUdTICIgfCBzZWQgLWUgInMvIC1nIC8gLyJgICMgZG8gbm90IHdhbnQgaXQgaW1wbGljaXRseQorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfYWNfY3RfQ0MrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX0NDKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiBhc19mbl9leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZmkKKworZmkKKworCit0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisKKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorc2V0IFggJGFjX2NvbXBpbGUKK2FjX2NvbXBpbGVyPSQyCitmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCisgIHsgeyBhY190cnk9IiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiY1IikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgc2VkICcxMGFcCisuLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCisgICAgICAgICAxMHEnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QuZXIxIGNvbmZ0ZXN0LmVycgorICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfQorZG9uZQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfY19jb21waWxlcl9nbnUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQoraWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfY2NfZys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX3NhdmVfY193ZXJyb3JfZmxhZz0kYWNfY193ZXJyb3JfZmxhZworICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKyAgIGFjX2N2X3Byb2dfY2NfZz1ubworICAgQ0ZMQUdTPSItZyIKKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIENGTEFHUz0iIgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCisJIENGTEFHUz0iLWciCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfZyIgPiY2OyB9CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19jY19jODkrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9wcm9nX2NjX2M4OT1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorc3RydWN0IHN0YXQ7CisvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCitzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CitGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworc3RhdGljIGNoYXIgKmUgKHAsIGkpCisgICAgIGNoYXIgKipwOworICAgICBpbnQgaTsKK3sKKyAgcmV0dXJuIHBbaV07Cit9CitzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCit7CisgIGNoYXIgKnM7CisgIHZhX2xpc3QgdjsKKyAgdmFfc3RhcnQgKHYscCk7CisgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisgIHZhX2VuZCAodik7CisgIHJldHVybiBzOworfQorCisvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCisgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CisgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCisgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLworI2RlZmluZSBGT08oeCkgJ3gnCitpbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKKworaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CitzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKK3N0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OworaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7CitpbnQgYXJnYzsKK2NoYXIgKiphcmd2OworaW50CittYWluICgpCit7CityZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKKwktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorZG8KKyAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCisgIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisjIEFDX0NBQ0hFX1ZBTAorY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KKyAgeCkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorJGFzX2VjaG8gIm5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKKyAgeG5vKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1CiskYXNfZWNobyAidW5zdXBwb3J0ZWQiID4mNjsgfSA7OworICAqKQorICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19jODkiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Citlc2FjCitpZiB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSB4bm87IHRoZW4gOgorCitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAiID4mNjsgfQoraWYgJHthbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCcuCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uICdzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJyA8IC4vZGVwY29tcGAKKyAgZmkKKyAgZm9yIGRlcG1vZGUgaW4gJGFtX2NvbXBpbGVyX2xpc3Q7IGRvCisgICAgIyBTZXR1cCBhIHNvdXJjZSB3aXRoIG1hbnkgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHNvbWUgY29tcGlsZXJzCisgICAgIyBsaWtlIHRvIHdyYXAgbGFyZ2UgZGVwZW5kZW5jeSBsaXN0cyBvbiBjb2x1bW4gODAgKHdpdGggXCksIGFuZAorICAgICMgd2Ugc2hvdWxkIG5vdCBjaG9vc2UgYSBkZXBjb21wIG1vZGUgd2hpY2ggaXMgY29uZnVzZWQgYnkgdGhpcy4KKyAgICAjCisgICAgIyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIGZpbGVzIGZvciBlYWNoIHRlc3QsIGFzIHRoZSBjb21waWxlciBtYXkKKyAgICAjIG92ZXJ3cml0ZSBzb21lIG9mIHRoZW0gd2hlbiB0ZXN0aW5nIHdpdGggb2JzY3VyZSBjb21tYW5kIGxpbmVzLgorICAgICMgVGhpcyBoYXBwZW5zIGF0IGxlYXN0IHdpdGggdGhlIEFJWCBDIGNvbXBpbGVyLgorICAgIDogPiBzdWIvY29uZnRlc3QuYworICAgIGZvciBpIGluIDEgMiAzIDQgNSA2OyBkbworICAgICAgZWNobyAnI2luY2x1ZGUgImNvbmZ0c3QnJGknLmgiJyA+PiBzdWIvY29uZnRlc3QuYworICAgICAgIyBVc2luZyBgOiA+IHN1Yi9jb25mdHN0JGkuaCcgY3JlYXRlcyBvbmx5IHN1Yi9jb25mdHN0MS5oIHdpdGgKKyAgICAgICMgU29sYXJpcyA4J3Mgey91c3IsfS9iaW4vc2guCisgICAgICB0b3VjaCBzdWIvY29uZnRzdCRpLmgKKyAgICBkb25lCisgICAgZWNobyAiJHthbV9faW5jbHVkZX0gJHthbV9fcXVvdGV9c3ViL2NvbmZ0ZXN0LlBvJHthbV9fcXVvdGV9IiA+IGNvbmZtZgorCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIG5vc2lkZWVmZmVjdCkKKyAgICAgICMgYWZ0ZXIgdGhpcyB0YWcsIG1lY2hhbmlzbXMgYXJlIG5vdCBieSBzaWRlLWVmZmVjdCwgc28gdGhleSdsbAorICAgICAgIyBvbmx5IGJlIHVzZWQgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgICAgaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgPSB4eWVzOyB0aGVuCisJY29udGludWUKKyAgICAgIGVsc2UKKwlicmVhaworICAgICAgZmkKKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgIyBXZSBjaGVjayB3aXRoIGAtYycgYW5kIGAtbycgZm9yIHRoZSBzYWtlIG9mIHRoZSAiZGFzaG1zdGRvdXQiCisgICAgIyBtb2RlLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlIFN1blBybyBDKysgY29tcGlsZXIgZG9lcyBub3QgcHJvcGVybHkKKyAgICAjIGhhbmRsZSBgLU0gLW8nLCBhbmQgd2UgbmVlZCB0byBkZXRlY3QgdGhpcy4KKyAgICBpZiBkZXBtb2RlPSRkZXBtb2RlIFwKKyAgICAgICBzb3VyY2U9c3ViL2NvbmZ0ZXN0LmMgb2JqZWN0PXN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAtbyBzdWIvY29uZnRlc3QuJHtPQkpFWFQtb30gc3ViL2NvbmZ0ZXN0LmMgXAorICAgICAgICAgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0LmVyciAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgICR7TUFLRS1tYWtlfSAtcyAtZiBjb25mbWYgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgIyBpY2MgZG9lc24ndCBjaG9rZSBvbiB1bmtub3duIG9wdGlvbnMsIGl0IHdpbGwganVzdCBpc3N1ZSB3YXJuaW5ncworICAgICAgIyBvciByZW1hcmtzIChldmVuIHdpdGggLVdlcnJvcikuICBTbyB3ZSBncmVwIHN0ZGVyciBmb3IgYW55IG1lc3NhZ2UKKyAgICAgICMgdGhhdCBzYXlzIGFuIG9wdGlvbiB3YXMgaWdub3JlZCBvciBub3Qgc3VwcG9ydGVkLgorICAgICAgIyBXaGVuIGdpdmVuIC1NUCwgaWNjIDcuMCBhbmQgNy4xIGNvbXBsYWluIHRodXNseToKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSB3YXJuaW5nOiBpZ25vcmluZyBvcHRpb24gJy1NJzsgbm8gYXJndW1lbnQgcmVxdWlyZWQKKyAgICAgICMgVGhlIGRpYWdub3NpcyBjaGFuZ2VkIGluIGljYyA4LjA6CisgICAgICAjICAgaWNjOiBDb21tYW5kIGxpbmUgcmVtYXJrOiBvcHRpb24gJy1NUCcgbm90IHN1cHBvcnRlZAorICAgICAgaWYgKGdyZXAgJ2lnbm9yaW5nIG9wdGlvbicgY29uZnRlc3QuZXJyIHx8CisgICAgICAgICAgZ3JlcCAnbm90IHN1cHBvcnRlZCcgY29uZnRlc3QuZXJyKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICAgICAgICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT0kZGVwbW9kZQorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisKKyAgY2QgLi4KKyAgcm0gLXJmIGNvbmZ0ZXN0LmRpcgorZWxzZQorICBhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZT1ub25lCitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZSIgPiY1CiskYXNfZWNobyAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjY7IH0KK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisKKworaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKK0NGTEFHUz1gZWNobyAiICRDRkxBR1MgIiB8IHNlZCAtZSAicy8gLWcgLyAvImAgIyBkbyBub3Qgd2FudCBpdCBpbXBsaWNpdGx5CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzdHJlcnJvciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHN0cmVycm9yLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NlYXJjaF9zdHJlcnJvcis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHN0cmVycm9yICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc3RyZXJyb3IgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgY3Bvc2l4OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIGlmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc2VhcmNoX3N0cmVycm9yPSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgJHthY19jdl9zZWFyY2hfc3RyZXJyb3IrOn0gZmFsc2U7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmICR7YWNfY3Zfc2VhcmNoX3N0cmVycm9yKzp9IGZhbHNlOyB0aGVuIDoKKworZWxzZQorICBhY19jdl9zZWFyY2hfc3RyZXJyb3I9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9zdHJlcnJvciIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9zdHJlcnJvciIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zdHJlcnJvcgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJChNQUtFKSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICIgPiY2OyB9CitzZXQgeCAke01BS0UtbWFrZX0KK2FjX21ha2U9YCRhc19lY2hvICIkMiIgfCBzZWQgJ3MvKy9wL2c7IHMvW15hLXpBLVowLTlfXS9fL2cnYAoraWYgZXZhbCBcJHthY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0Lm1ha2UgPDxcX0FDRU9GCitTSEVMTCA9IC9iaW4vc2gKK2FsbDoKKwlAZWNobyAnQEBAJSUlPSQoTUFLRSk9QEBAJSUlJworX0FDRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitjYXNlIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3QubWFrZSAyPi9kZXYvbnVsbGAgaW4KKyAgKkBAQCUlJT0/Kj1AQEAlJSUqKQorICAgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllczs7CisgICopCisgICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87OworZXNhYworcm0gLWYgY29uZnRlc3QubWFrZQorZmkKK2lmIGV2YWwgdGVzdCBcJGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCA9IHllczsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICBTRVRfTUFLRT0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9wcm9nX1JBTkxJQis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJBTkxJQiIgPiY1CiskYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KKyAgICBSQU5MSUI9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUkFOTElCPSRhY19jdF9SQU5MSUIKKyAgZmkKK2Vsc2UKKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICIkTElORU5PIiA1CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfYnVpbGQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiICIkTElORU5PIiA1CithY19jdl9idWlsZD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkYWNfYnVpbGRfYWxpYXNgIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiAiJExJTkVOTyIgNQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X2J1aWxkIGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgIiRMSU5FTk8iIDU7OworZXNhYworYnVpbGQ9JGFjX2N2X2J1aWxkCithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfYnVpbGQKK3NoaWZ0CitidWlsZF9jcHU9JDEKK2J1aWxkX3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2J1aWxkX29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hvc3QrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAorZWxzZQorICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNTs7Citlc2FjCitob3N0PSRhY19jdl9ob3N0CithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfaG9zdAorc2hpZnQKK2hvc3RfY3B1PSQxCitob3N0X3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2hvc3Rfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworCisKKworaWYgdGVzdCAiJGVuYWJsZV90aHJlYWRzIiAhPSBubzsgdGhlbgorCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCithY3hfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTLi4uICIgPiY2OyB9CisgICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwdGhyZWFkX2pvaW4gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBwdGhyZWFkX2pvaW4gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWN4X3B0aHJlYWRfb2s9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY3hfcHRocmVhZF9vayIgPiY1CiskYXNfZWNobyAiJGFjeF9wdGhyZWFkX29rIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCithY3hfcHRocmVhZF9mbGFncz0icHRocmVhZHMgbm9uZSAtS3RocmVhZCAta3RocmVhZCBsdGhyZWFkIC1wdGhyZWFkIC1wdGhyZWFkcyAtbXRocmVhZHMgcHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCBwdGhyZWFkLWNvbmZpZyIKKworIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorIyBpbmRpdmlkdWFsIGl0ZW1zIGZvbGxvdzoKKworIyBwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyMgbm9uZTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorIyAgICAgICBvdGhlciBjb21waWxlciBmbGFncyB0byBwcmV2ZW50IGNvbnRpbnVhbCBjb21waWxlciB3YXJuaW5ncworIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisjIC1rdGhyZWFkOiBGcmVlQlNEIGtlcm5lbCB0aHJlYWRzIChwcmVmZXJyZWQgdG8gLXB0aHJlYWQgc2luY2UgU01QLWFibGUpCisjIGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorIyAtcHRocmVhZDogTGludXgvZ2NjIChrZXJuZWwgdGhyZWFkcyksIEJTRC9nY2MgKHVzZXJsYW5kIHRocmVhZHMpCisjIC1wdGhyZWFkczogU29sYXJpcy9nY2MKKyMgLW10aHJlYWRzOiBNaW5ndzMyL2djYywgTHlueC9nY2MKKyMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorIyAgICAgIGRvZXNuJ3QgaHVydCB0byBjaGVjayBzaW5jZSB0aGlzIHNvbWV0aW1lcyBkZWZpbmVzIHB0aHJlYWRzIHRvbzsKKyMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorIyBwdGhyZWFkOiBMaW51eCwgZXRjZXRlcmEKKyMgLS10aHJlYWQtc2FmZTogS0FJIEMrKworIyBwdGhyZWFkLWNvbmZpZzogdXNlIHB0aHJlYWQtY29uZmlnIHByb2dyYW0gKGZvciBHTlUgUHRoIGxpYnJhcnkpCisKK2Nhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICpzb2xhcmlzKikKKworICAgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAgICMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkIG9yCisgICAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICAgIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKyAgICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCisgICAgICAgIGFjeF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZCAtcHRocmVhZHMgcHRocmVhZCAtbXQgJGFjeF9wdGhyZWFkX2ZsYWdzIgorICAgICAgICA7OworZXNhYworCitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorZm9yIGZsYWcgaW4gJGFjeF9wdGhyZWFkX2ZsYWdzOyBkbworCisgICAgICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgICAgICAgICAgICBub25lKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFncy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICAtKikKKyAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRoICRmbGFnIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgd29yayB3aXRoICRmbGFnLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisKKwkJcHRocmVhZC1jb25maWcpCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicHRocmVhZC1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHB0aHJlYWQtY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWcrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWN4X3B0aHJlYWRfY29uZmlnIjsgdGhlbgorICBhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZz0iJGFjeF9wdGhyZWFkX2NvbmZpZyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIGFzX2ZuX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZz0ieWVzIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjeF9wdGhyZWFkX2NvbmZpZyIgJiYgYWNfY3ZfcHJvZ19hY3hfcHRocmVhZF9jb25maWc9Im5vIgorZmkKK2ZpCithY3hfcHRocmVhZF9jb25maWc9JGFjX2N2X3Byb2dfYWN4X3B0aHJlYWRfY29uZmlnCitpZiB0ZXN0IC1uICIkYWN4X3B0aHJlYWRfY29uZmlnIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjeF9wdGhyZWFkX2NvbmZpZyIgPiY1CiskYXNfZWNobyAiJGFjeF9wdGhyZWFkX2NvbmZpZyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisJCWlmIHRlc3QgeCIkYWN4X3B0aHJlYWRfY29uZmlnIiA9IHhubzsgdGhlbiBjb250aW51ZTsgZmkKKwkJUFRIUkVBRF9DRkxBR1M9ImBwdGhyZWFkLWNvbmZpZyAtLWNmbGFnc2AiCisJCVBUSFJFQURfTElCUz0iYHB0aHJlYWQtY29uZmlnIC0tbGRmbGFnc2AgYHB0aHJlYWQtY29uZmlnIC0tbGlic2AiCisJCTs7CisKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWcuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9Ii1sJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCisgICAgICAgICMgQ2hlY2sgZm9yIHZhcmlvdXMgZnVuY3Rpb25zLiAgV2UgbXVzdCBpbmNsdWRlIHB0aHJlYWQuaCwKKyAgICAgICAgIyBzaW5jZSBzb21lIGZ1bmN0aW9ucyBtYXkgYmUgbWFjcm9zLiAgKE9uIHRoZSBTZXF1ZW50LCB3ZQorICAgICAgICAjIG5lZWQgYSBzcGVjaWFsIGZsYWcgLUt0aHJlYWQgdG8gbWFrZSB0aGlzIGhlYWRlciBjb21waWxlLikKKyAgICAgICAgIyBXZSBjaGVjayBmb3IgcHRocmVhZF9qb2luIGJlY2F1c2UgaXQgaXMgaW4gLWxwdGhyZWFkIG9uIElSSVgKKyAgICAgICAgIyB3aGlsZSBwdGhyZWFkX2NyZWF0ZSBpcyBpbiBsaWJjLiAgV2UgY2hlY2sgZm9yIHB0aHJlYWRfYXR0cl9pbml0CisgICAgICAgICMgZHVlIHRvIERFQyBjcmF6aW5lc3Mgd2l0aCAtbHB0aHJlYWRzLiAgV2UgY2hlY2sgZm9yCisgICAgICAgICMgcHRocmVhZF9jbGVhbnVwX3B1c2ggYmVjYXVzZSBpdCBpcyBvbmUgb2YgdGhlIGZldyBwdGhyZWFkCisgICAgICAgICMgZnVuY3Rpb25zIG9uIFNvbGFyaXMgdGhhdCBkb2Vzbid0IGhhdmUgYSBub24tZnVuY3Rpb25hbCBsaWJjIHN0dWIuCisgICAgICAgICMgV2UgdHJ5IHB0aHJlYWRfY3JlYXRlIG9uIGdlbmVyYWwgcHJpbmNpcGxlcy4KKyAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworcHRocmVhZF90IHRoOyBwdGhyZWFkX2pvaW4odGgsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWN4X3B0aHJlYWRfb2s9eWVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjeF9wdGhyZWFkX29rIiA+JjUKKyRhc19lY2hvICIkYWN4X3B0aHJlYWRfb2siID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmkKKworICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKK2RvbmUKK2ZpCisKKyMgVmFyaW91cyBvdGhlciBjaGVja3M6CitpZiB0ZXN0ICJ4JGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBEZXRlY3QgQUlYIGxvc3NhZ2U6IHRocmVhZHMgYXJlIGNyZWF0ZWQgZGV0YWNoZWQgYnkgZGVmYXVsdAorICAgICAgICAjIGFuZCB0aGUgSk9JTkFCTEUgYXR0cmlidXRlIGhhcyBhIG5vbnN0YW5kYXJkIG5hbWUgKFVOREVUQUNIRUQpLgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBqb2luYWJsZSBwdGhyZWFkIGF0dHJpYnV0ZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igam9pbmFibGUgcHRocmVhZCBhdHRyaWJ1dGUuLi4gIiA+JjY7IH0KKyAgICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK2ludAorbWFpbiAoKQoreworaW50IGF0dHI9UFRIUkVBRF9DUkVBVEVfSk9JTkFCTEU7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgb2s9UFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUKK2Vsc2UKKyAgb2s9dW5rbm93bgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgIGlmIHRlc3QgeCIkb2siID0geHVua25vd247IHRoZW4KKyAgICAgICAgICAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8cHRocmVhZC5oPgoraW50CittYWluICgpCit7CitpbnQgYXR0cj1QVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIG9rPVBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQKK2Vsc2UKKyAgb2s9dW5rbm93bgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgeCIkb2siICE9IHhQVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSBcJG9rIiA+PmNvbmZkZWZzLmgKKworICAgICAgICBmaQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHtva30iID4mNQorJGFzX2VjaG8gIiR7b2t9IiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCB4IiRvayIgPSB4dW5rbm93bjsgdGhlbgorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogd2UgZG8gbm90IGtub3cgaG93IHRvIGNyZWF0ZSBqb2luYWJsZSBwdGhyZWFkcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3ZSBkbyBub3Qga25vdyBob3cgdG8gY3JlYXRlIGpvaW5hYmxlIHB0aHJlYWRzIiA+JjI7fQorICAgICAgICBmaQorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHMuLi4gIiA+JjY7IH0KKyAgICAgICAgZmxhZz1ubworICAgICAgICBjYXNlICIke2hvc3RfY3B1fS0ke2hvc3Rfb3N9IiBpbgorICAgICAgICAgICAgICAgICotYWl4KiB8ICotZnJlZWJzZCogfCAqLWRhcndpbiopIGZsYWc9Ii1EX1RIUkVBRF9TQUZFIjs7CisgICAgICAgICAgICAgICAgKnNvbGFyaXMqIHwgKi1vc2YqIHwgKi1ocHV4KikgZmxhZz0iLURfUkVFTlRSQU5UIjs7CisgICAgICAgIGVzYWMKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICR7ZmxhZ30iID4mNQorJGFzX2VjaG8gIiR7ZmxhZ30iID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICJ4JGZsYWciICE9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIGZpCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBtdXN0IGNvbXBpbGUgd2l0aCBjY19yCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2NfciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2NfcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3Byb2dfUFRIUkVBRF9DQys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRQVEhSRUFEX0NDIjsgdGhlbgorICBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiRQVEhSRUFEX0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfUFRIUkVBRF9DQz0iY2NfciIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19QVEhSRUFEX0NDIiAmJiBhY19jdl9wcm9nX1BUSFJFQURfQ0M9IiR7Q0N9IgorZmkKK2ZpCitQVEhSRUFEX0NDPSRhY19jdl9wcm9nX1BUSFJFQURfQ0MKK2lmIHRlc3QgLW4gIiRQVEhSRUFEX0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBUSFJFQURfQ0MiID4mNQorJGFzX2VjaG8gIiRQVEhSRUFEX0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2Vsc2UKKyAgICAgICAgUFRIUkVBRF9DQz0iJENDIgorZmkKKworCisKKworCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QVEhSRUFEIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgIDoKK2Vsc2UKKyAgICAgICAgYWN4X3B0aHJlYWRfb2s9bm8KKworZmkKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisgICAgaWYgdGVzdCAiJGFjeF9wdGhyZWFkX29rIiA9IHllczsgdGhlbgorICAgICAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QT1NJWF9USFJFQUQgMSIgPj5jb25mZGVmcy5oCisKKyAgICAgICRhc19lY2hvICIjZGVmaW5lIF9SRUVOVFJBTlQgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorZmkKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0aG9zdGJ5bmFtZSIgImFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lIiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxuc2wgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGhvc3RieW5hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX25zbF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9uc2xfZ2V0aG9zdGJ5bmFtZSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJQk5TTCAxCitfQUNFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZmkKKworZmkKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAic29ja2V0IiAiYWNfY3ZfZnVuY19zb2NrZXQiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfc29ja2V0IiA9IHh5ZXM7IHRoZW4gOgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2xpYl9zb2NrZXRfc29ja2V0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNvY2tldCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNvY2tldCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfc29ja2V0X3NvY2tldD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCU09DS0VUIDEKK19BQ0VPRgorCisgIExJQlM9Ii1sc29ja2V0ICRMSUJTIgorCitmaQorCitmaQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgaWYgJHthY19jdl9wcm9nX0NQUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorICAgIGRvCisgICAgICBhY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKKyAgYnJlYWsKK2ZpCisKKyAgICBkb25lCisgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorCitmaQorICBDUFA9JGFjX2N2X3Byb2dfQ1BQCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENQUCIgPiY1CiskYXNfZWNobyAiJENQUCIgPiY2OyB9CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKK2RvCisgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKyAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCisgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgorCitlbHNlCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmkgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuIDoKKworZWxzZQorICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3BhdGhfR1JFUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgorICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9HUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgYXNfZm5fZXhlY3V0YWJsZV9wICIkYWNfcGF0aF9HUkVQIiB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAorY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisgICAgYXNfZm5fYXJpdGggJGFjX2NvdW50ICsgMSAmJiBhY19jb3VudD0kYXNfdmFsCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisgICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgICBkb25lCisgIGRvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgorICAgIGFzX2ZuX2Vycm9yICQ/ICJubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZWdyZXAuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9FR1JFUCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCisgICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgorICAgZWxzZQorICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCisgIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKKyAgIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGFjX3BhdGhfRUdSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBhc19mbl9leGVjdXRhYmxlX3AgIiRhY19wYXRoX0VHUkVQIiB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCitjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKKyAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorZmkKKworICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkYys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICA6CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTTE9XRVIoYykgXAorCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKwkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCisjZW5kaWYKKworI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludAorbWFpbiAoKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIHJldHVybiAyOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCitmb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKKwkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIGFycGEvaW5ldC5oIGxpYmludGwuaCBuZXRkYi5oIG5ldGluZXQvaW4uaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3lzL3NvY2tldC5oIHN5cy90aW1lLmggc3lzbG9nLmggdW5pc3RkLmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2NvbnN0Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworI2lmbmRlZiBfX2NwbHVzcGx1cworICAvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCisgIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07CisgIGNvbnN0IGNoYXJzZXQgY3MgPSB7IDAsIDAgfTsKKyAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciBjb25zdCAqY29uc3QgKnBjcGNjOworICBjaGFyICoqcHBjOworICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworICBzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CisgIHN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluCisgICAgIGFuIGFybSBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQKKyAgICAgZXhwcmVzc2lvbiAqLworICBjb25zdCBjaGFyICpnID0gInN0cmluZyI7CisgIHBjcGNjID0gJmcgKyAoZyA/IGctZyA6IDApOworICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworICArK3BjcGNjOworICBwcGMgPSAoY2hhcioqKSBwY3BjYzsKKyAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOworICB7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMgc29ydCBvZiB0aGluZy4gICovCisgICAgY2hhciB0eDsKKyAgICBjaGFyICp0ID0gJnR4OworICAgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgICAqdCsrID0gMDsKKyAgICBpZiAocykgcmV0dXJuIDA7CisgIH0KKyAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgICBpbnQgeFtdID0gezI1LCAxN307CisgICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgICArK2ZvbzsKKyAgfQorICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgICBpcHRyIHAgPSAwOworICAgICsrcDsKKyAgfQorICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzb3J0IG9mIHRoaW5nLCBzYXlpbmcKKyAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfSBieDsKKyAgICBzdHJ1Y3QgcyAqYiA9ICZieDsgYi0+aiA9IDU7CisgIH0KKyAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgICBjb25zdCBpbnQgZm9vID0gMTA7CisgICAgaWYgKCFmb28pIHJldHVybiAwOworICB9CisgIHJldHVybiAhY3NbMF0gJiYgIXplcm8ueDsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2NfY29uc3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIGNvbnN0IC8qKi8iID4+Y29uZmRlZnMuaAorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzaXplX3QiICJhY19jdl90eXBlX3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKworZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzc2l6ZV90IiAiYWNfY3ZfdHlwZV9zc2l6ZV90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3NpemVfdCIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NTSVpFX1QgMQorX0FDRU9GCisKKworZWxzZQorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIHNzaXplX3QgaW50CitfQUNFT0YKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfdGltZSs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluICgpCit7CitpZiAoKHN0cnVjdCB0bSAqKSAwKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCitlbHNlCisgIGFjX2N2X2hlYWRlcl90aW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfdGltZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl90aW1lIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zdHJ1Y3RfdG0rOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitpbnQKK21haW4gKCkKK3sKK3N0cnVjdCB0bSB0bTsKKwkJCQkgICAgIGludCAqcCA9ICZ0bS50bV9zZWM7CisJCQkJICAgICByZXR1cm4gIXA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3RydWN0X3RtPXRpbWUuaAorZWxzZQorICBhY19jdl9zdHJ1Y3RfdG09c3lzL3RpbWUuaAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X3RtIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc3RydWN0X3RtIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3N0cnVjdF90bSA9IHN5cy90aW1lLmg7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgVE1fSU5fU1lTX1RJTUUgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworIyAtLS0tLS0gQVggQ1JFQVRFIFNURElOVCBIIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludCB0eXBlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkaW50IHR5cGVzLi4uICIgPiY2OyB9CithY19zdGRpbnRfaD1gZWNobyBpbmNsdWRlL2lwZXJmLWludC5oYAorIyB0cnkgdG8gc2hvcnRjaXJjdWl0IC0gaWYgdGhlIGRlZmF1bHQgaW5jbHVkZSBwYXRoIG9mIHRoZSBjb21waWxlcgorIyBjYW4gZmluZCBhICJzdGRpbnQuaCIgaGVhZGVyIHRoZW4gd2UgYXNzdW1lIHRoYXQgYWxsIGNvbXBpbGVycyBjYW4uCitpZiAke2FjX2N2X2hlYWRlcl9zdGRpbnRfdCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKK29sZF9DWFhGTEFHUz0iJENYWEZMQUdTIiA7IENYWEZMQUdTPSIiCitvbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIgOyBDUFBGTEFHUz0iIgorb2xkX0NGTEFHUz0iJENGTEFHUyIgICAgIDsgQ0ZMQUdTPSIiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CitpbnQKK21haW4gKCkKK3sKK2ludF9sZWFzdDMyX3QgdiA9IDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3RkaW50X3Jlc3VsdD0iKGFzc3VtaW5nIEM5OSBjb21wYXRpYmxlIHN5c3RlbSkiCisgYWNfY3ZfaGVhZGVyX3N0ZGludF90PSJzdGRpbnQuaCI7CitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRpbnRfdD0iIgorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorQ1hYRkxBR1M9IiRvbGRfQ1hYRkxBR1MiCitDUFBGTEFHUz0iJG9sZF9DUFBGTEFHUyIKK0NGTEFHUz0iJG9sZF9DRkxBR1MiCitmaQorCisKK3Y9Ii4uLiAkYWNfY3ZfaGVhZGVyX3N0ZGludF9oIgoraWYgdGVzdCAiJGFjX3N0ZGludF9oIiA9ICJzdGRpbnQuaCIgOyB0aGVuCisgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IChhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL3N0ZGludC5oPykiID4mNQorJGFzX2VjaG8gIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL3N0ZGludC5oPykiID4mNjsgfQorZWxpZiB0ZXN0ICIkYWNfc3RkaW50X2giID0gImludHR5cGVzLmgiIDsgdGhlbgorIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAoYXJlIHlvdSBzdXJlIHlvdSB3YW50IHRoZW0gaW4gLi9pbnR0eXBlcy5oPykiID4mNQorJGFzX2VjaG8gIihhcmUgeW91IHN1cmUgeW91IHdhbnQgdGhlbSBpbiAuL2ludHR5cGVzLmg/KSIgPiY2OyB9CitlbGlmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF90IiA9ICJfIiA7IHRoZW4KKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogKHB1dHRpbmcgdGhlbSBpbnRvICRhY19zdGRpbnRfaCkkdiIgPiY1CiskYXNfZWNobyAiKHB1dHRpbmcgdGhlbSBpbnRvICRhY19zdGRpbnRfaCkkdiIgPiY2OyB9CitlbHNlCisgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfdCIKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRpbnQgKHNob3J0Y2lyY3VpdCkiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkaW50IChzaG9ydGNpcmN1aXQpIiA+JjY7IH0KK2ZpCisKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF90IiA9ICJfIiA7IHRoZW4gIyBjYW4gbm90IHNob3J0Y2lyY3VpdC4uCisKKworaW50dHlwZV9oZWFkZXJzPWBlY2hvICB8IHNlZCAtZSAncy8sLyAvZydgCisKK2FjX2N2X3N0ZGludF9yZXN1bHQ9IihubyBoZWxwZnVsIHN5c3RlbSB0eXBlZGVmcyBzZWVuKSIKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RkaW50IHVpbnRwdHJfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkaW50IHVpbnRwdHJfdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oZWFkZXJfc3RkaW50X3grOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgYWNfY3ZfaGVhZGVyX3N0ZGludF94PSIiICMgdGhlIDE5OTcgdHlwZWRlZnMgKGludHR5cGVzLmgpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAoLi4pIiA+JjUKKyRhc19lY2hvICIoLi4pIiA+JjY7IH0KKyAgZm9yIGkgaW4gICAgc3RkaW50LmggaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KKyAgIHVuc2V0IGFjX2N2X3R5cGVfdWludHB0cl90CisgICB1bnNldCBhY19jdl90eXBlX3VpbnQ2NF90CisgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1aW50cHRyX3QiICJhY19jdl90eXBlX3VpbnRwdHJfdCIgIiNpbmNsdWRlIDwkaT4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50cHRyX3QiID0geHllczsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRpbnRfeD0kaQorZWxzZQorICBjb250aW51ZQorZmkKKworICAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidWludDY0X3QiICJhY19jdl90eXBlX3VpbnQ2NF90IiAiI2luY2x1ZGU8JGk+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDY0X3QiID0geHllczsgdGhlbiA6CisgIGFuZDY0PSIvdWludDY0X3QiCitlbHNlCisgIGFuZDY0PSIiCitmaQorCisgICAgICBzdGRpbnQuaCBpbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oICRpbnR0eXBlX2hlYWRlcnMKKyBicmVhaworICBkb25lCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludCB1aW50cHRyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludCB1aW50cHRyX3QuLi4gIiA+JjY7IH0KKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA+JjY7IH0KKworCitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAiXyIgOyB0aGVuCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludCB1aW50MzJfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkaW50IHVpbnQzMl90Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X2hlYWRlcl9zdGRpbnRfbys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKKyBhY19jdl9oZWFkZXJfc3RkaW50X289IiIgIyB0aGUgMTk5NSB0eXBlZGVmcyAoc3lzL2ludHR5cGVzLmgpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAoLi4pIiA+JjUKKyRhc19lY2hvICIoLi4pIiA+JjY7IH0KKyAgZm9yIGkgaW4gICAgaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzIDsgZG8KKyAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDMyX3QKKyAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKKyAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQzMl90IiAiYWNfY3ZfdHlwZV91aW50MzJfdCIgIiNpbmNsdWRlIDwkaT4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSRpCitlbHNlCisgIGNvbnRpbnVlCitmaQorCisgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1aW50NjRfdCIgImFjX2N2X3R5cGVfdWludDY0X3QiICIjaW5jbHVkZTwkaT4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50NjRfdCIgPSB4eWVzOyB0aGVuIDoKKyAgYW5kNjQ9Ii91aW50NjRfdCIKK2Vsc2UKKyAgYW5kNjQ9IiIKK2ZpCisKKyAgICAgIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggc3RkaW50LmggJGludHR5cGVfaGVhZGVycworIGJyZWFrCisgICBicmVhazsKKyAgZG9uZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdGRpbnQgdWludDMyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludCB1aW50MzJfdC4uLiAiID4mNjsgfQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkaW50X28iID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkaW50X28iID4mNjsgfQorCitmaQorCitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAiXyIgOyB0aGVuCitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgPSAiXyIgOyB0aGVuCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN0ZGludCB1X2ludDMyX3QiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludCB1X2ludDMyX3QuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfaGVhZGVyX3N0ZGludF91Kzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworIGFjX2N2X2hlYWRlcl9zdGRpbnRfdT0iIiAjIHRoZSBCU0QgdHlwZWRlZnMgKHN5cy90eXBlcy5oKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogKC4uKSIgPiY1CiskYXNfZWNobyAiKC4uKSIgPiY2OyB9CisgIGZvciBpIGluICAgIHN5cy90eXBlcy5oIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggJGludHR5cGVfaGVhZGVycyA7IGRvCisgICB1bnNldCBhY19jdl90eXBlX3VfaW50MzJfdAorICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDY0X3QKKyAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50MzJfdCIgImFjX2N2X3R5cGVfdV9pbnQzMl90IiAiI2luY2x1ZGUgPCRpPgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX3VfaW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGludF91PSRpCitlbHNlCisgIGNvbnRpbnVlCitmaQorCisgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJ1X2ludDY0X3QiICJhY19jdl90eXBlX3VfaW50NjRfdCIgIiNpbmNsdWRlPCRpPgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX3VfaW50NjRfdCIgPSB4eWVzOyB0aGVuIDoKKyAgYW5kNjQ9Ii91X2ludDY0X3QiCitlbHNlCisgIGFuZDY0PSIiCitmaQorCisgICAgICBzeXMvdHlwZXMuaCBpbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oICRpbnR0eXBlX2hlYWRlcnMKKyBicmVhaworICAgYnJlYWs7CisgIGRvbmUKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RkaW50IHVfaW50MzJfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3RkaW50IHVfaW50MzJfdC4uLiAiID4mNjsgfQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkaW50X3UiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkaW50X3UiID4mNjsgfQorCitmaSBmaQorCitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAiXyIgOyB0aGVuCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdGRpbnQgZGF0YXR5cGUgbW9kZWwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHN0ZGludCBkYXRhdHlwZSBtb2RlbC4uLiAiID4mNjsgfQorICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICguLikiID4mNQorJGFzX2VjaG8gIiguLikiID4mNjsgfQorCisgICAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGNoYXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBjaGFyLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9jaGFyKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAoY2hhcikpIiAiYWNfY3Zfc2l6ZW9mX2NoYXIiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9jaGFyIiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGNoYXIpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfY2hhcj0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2NoYXIiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfY2hhciIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9DSEFSICRhY19jdl9zaXplb2ZfY2hhcgorX0FDRU9GCisKKworICAgIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBzaG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHNob3J0Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9zaG9ydCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHNob3J0KSkiICJhY19jdl9zaXplb2Zfc2hvcnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zaG9ydCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9zaG9ydD0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX1NIT1JUICRhY19jdl9zaXplb2Zfc2hvcnQKK19BQ0VPRgorCisKKyAgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCisjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KKyMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgaW50Li4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9pbnQrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mIChpbnQpKSIgImFjX2N2X3NpemVvZl9pbnQiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnQiID0geWVzOyB0aGVuCisgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2ludD0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NpemVvZl9pbnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfSU5UICRhY19jdl9zaXplb2ZfaW50CitfQUNFT0YKKworCisgICAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl9sb25nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZykpIiAiYWNfY3Zfc2l6ZW9mX2xvbmciICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZz0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfbG9uZyIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9MT05HICRhY19jdl9zaXplb2ZfbG9uZworX0FDRU9GCisKKworICAgIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiB2b2lkKiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHZvaWQqLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X3NpemVvZl92b2lkcCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHZvaWQqKSkiICJhY19jdl9zaXplb2Zfdm9pZHAiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKKworZWxzZQorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV92b2lkcCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh2b2lkKikKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl92b2lkcD0wCisgICBmaQorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3ZvaWRwIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3ZvaWRwIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX1ZPSURQICRhY19jdl9zaXplb2Zfdm9pZHAKK19BQ0VPRgorCisKKyAgIGFjX2N2X2NoYXJfZGF0YV9tb2RlbD0iIgorICAgYWNfY3ZfY2hhcl9kYXRhX21vZGVsPSIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsJGFjX2N2X3NpemVvZl9jaGFyIgorICAgYWNfY3ZfY2hhcl9kYXRhX21vZGVsPSIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsJGFjX2N2X3NpemVvZl9zaG9ydCIKKyAgIGFjX2N2X2NoYXJfZGF0YV9tb2RlbD0iJGFjX2N2X2NoYXJfZGF0YV9tb2RlbCRhY19jdl9zaXplb2ZfaW50IgorICAgYWNfY3ZfbG9uZ19kYXRhX21vZGVsPSIiCisgICBhY19jdl9sb25nX2RhdGFfbW9kZWw9IiRhY19jdl9sb25nX2RhdGFfbW9kZWwkYWNfY3Zfc2l6ZW9mX2ludCIKKyAgIGFjX2N2X2xvbmdfZGF0YV9tb2RlbD0iJGFjX2N2X2xvbmdfZGF0YV9tb2RlbCRhY19jdl9zaXplb2ZfbG9uZyIKKyAgIGFjX2N2X2xvbmdfZGF0YV9tb2RlbD0iJGFjX2N2X2xvbmdfZGF0YV9tb2RlbCRhY19jdl9zaXplb2Zfdm9pZHAiCisgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRhdGEgbW9kZWwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZGF0YSBtb2RlbC4uLiAiID4mNjsgfQorICAgY2FzZSAiJGFjX2N2X2NoYXJfZGF0YV9tb2RlbC8kYWNfY3ZfbG9uZ19kYXRhX21vZGVsIiBpbgorICAgIDEyMi8yNDIpICAgICBhY19jdl9kYXRhX21vZGVsPSJJUDE2IiAgOyBuPSJzdGFuZGFyZCAxNmJpdCBtYWNoaW5lIiA7OworICAgIDEyMi8yNDQpICAgICBhY19jdl9kYXRhX21vZGVsPSJMUDMyIiAgOyBuPSJzdGFuZGFyZCAzMmJpdCBtYWNoaW5lIiA7OworICAgIDEyMi8qKSAgICAgICBhY19jdl9kYXRhX21vZGVsPSJpMTYiICAgOyBuPSJ1bnVzdWFsIGludDE2IG1vZGVsIiA7OworICAgIDEyNC80NDQpICAgICBhY19jdl9kYXRhX21vZGVsPSJJTFAzMiIgOyBuPSJzdGFuZGFyZCAzMmJpdCB1bml4aXNoIiA7OworICAgIDEyNC80ODgpICAgICBhY19jdl9kYXRhX21vZGVsPSJMUDY0IiAgOyBuPSJzdGFuZGFyZCA2NGJpdCB1bml4aXNoIiA7OworICAgIDEyNC80NDgpICAgICBhY19jdl9kYXRhX21vZGVsPSJMTFA2NCIgOyBuPSJ1bnVzdWFsIDY0Yml0IHVuaXhpc2giIDs7CisgICAgMTI0LyopICAgICAgIGFjX2N2X2RhdGFfbW9kZWw9ImkzMiIgICA7IG49InVudXN1YWwgaW50MzIgbW9kZWwiIDs7CisgICAgMTI4Lzg4OCkgICAgIGFjX2N2X2RhdGFfbW9kZWw9IklMUDY0IiA7IG49InVudXN1YWwgNjRiaXQgbnVtZXJpYyIgOzsKKyAgICAxMjgvKikgICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iaTY0IiAgIDsgbj0idW51c3VhbCBpbnQ2NCBtb2RlbCIgOzsKKyAgICAyMjIvKjIpICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iRFNQMTYiIDsgbj0ic3RyaWN0IDE2Yml0IGRzcHR5cGUiIDs7CisgICAgMzMzLyozKSAgICAgIGFjX2N2X2RhdGFfbW9kZWw9IkRTUDI0IiA7IG49InN0cmljdCAyNGJpdCBkc3B0eXBlIiA7OworICAgIDQ0NC8qNCkgICAgICBhY19jdl9kYXRhX21vZGVsPSJEU1AzMiIgOyBuPSJzdHJpY3QgMzJiaXQgZHNwdHlwZSIgOzsKKyAgICA2NjYvKjYpICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iRFNQNDgiIDsgbj0ic3RyaWN0IDQ4Yml0IGRzcHR5cGUiIDs7CisgICAgODg4Lyo4KSAgICAgIGFjX2N2X2RhdGFfbW9kZWw9IkRTUDY0IiA7IG49InN0cmljdCA2NGJpdCBkc3B0eXBlIiA7OworICAgIDIyMi8qfDMzMy8qfDQ0NC8qfDY2Ni8qfDg4OC8qKSA6CisgICAgICAgICAgICAgICAgIGFjX2N2X2RhdGFfbW9kZWw9ImlEU1AiICA7IG49InVudXN1YWwgZHNwdHlwZSIgOzsKKyAgICAgKikgICAgICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0ibm9uZSIgIDsgbj0idmVyeSB1bnVzdWFsIG1vZGVsIiA7OworICAgZXNhYworICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9kYXRhX21vZGVsICgkYWNfY3ZfbG9uZ19kYXRhX21vZGVsLCAkbikiID4mNQorJGFzX2VjaG8gIiRhY19jdl9kYXRhX21vZGVsICgkYWNfY3ZfbG9uZ19kYXRhX21vZGVsLCAkbikiID4mNjsgfQorCitmaQorCitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgIT0gIl8iIDsgdGhlbgorICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIKK2VsaWYgIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF9vIiAhPSAiXyIgOyB0aGVuCisgICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF9vIgorZWxpZiAgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3UiICE9ICJfIiA7IHRoZW4KKyAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCitlbHNlCisgICBhY19jdl9oZWFkZXJfc3RkaW50PSJzdGRkZWYuaCIKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGV4dHJhIGludHR5cGVzIGluIGNob3NlbiBoZWFkZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGV4dHJhIGludHR5cGVzIGluIGNob3NlbiBoZWFkZXIuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAoJGFjX2N2X2hlYWRlcl9zdGRpbnQpIiA+JjUKKyRhc19lY2hvICIoJGFjX2N2X2hlYWRlcl9zdGRpbnQpIiA+JjY7IH0KK3Vuc2V0IGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdAordW5zZXQgYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludF9sZWFzdDMyX3QiICJhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiICIjaW5jbHVkZSA8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSB4eWVzOyB0aGVuIDoKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50X2Zhc3QzMl90IiAiYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiICIjaW5jbHVkZTwkYWNfY3ZfaGVhZGVyX3N0ZGludD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3QiID0geHllczsgdGhlbiA6CisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludG1heF90IiAiYWNfY3ZfdHlwZV9pbnRtYXhfdCIgIiNpbmNsdWRlIDwkYWNfY3ZfaGVhZGVyX3N0ZGludD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnRtYXhfdCIgPSB4eWVzOyB0aGVuIDoKKworZmkKKworCitmaSAjIHNob3J0Y2lyY3V0IHRvIHN5c3RlbSAic3RkaW50LmgiCisjIC0tLS0tLS0tLS0tLS0tLS0tLSBQUkVQQVJFIFZBUklBQkxFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmIHRlc3QgIiRHQ0MiID0gInllcyIgOyB0aGVuCithY19jdl9zdGRpbnRfbWVzc2FnZT0idXNpbmcgZ251IGNvbXBpbGVyICJgJENDIC0tdmVyc2lvbiB8IGhlYWQgLTFgCitlbHNlCithY19jdl9zdGRpbnRfbWVzc2FnZT0idXNpbmcgJENDIgorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG1ha2UgdXNlIG9mICRhY19jdl9oZWFkZXJfc3RkaW50IGluICRhY19zdGRpbnRfaCAkYWNfY3Zfc3RkaW50X3Jlc3VsdCIgPiY1CiskYXNfZWNobyAibWFrZSB1c2Ugb2YgJGFjX2N2X2hlYWRlcl9zdGRpbnQgaW4gJGFjX3N0ZGludF9oICRhY19jdl9zdGRpbnRfcmVzdWx0IiA+JjY7IH0KKworIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGludHR5cGVzLmggY2hlY2tzIFNUQVJUIGhlYWRlciAtLS0tLS0tLS0tLS0tCithY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgJGFjX3N0ZGludF9oIgorCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIDNyZCBhcmd1bWVudCBvZiBhY2NlcHQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgM3JkIGFyZ3VtZW50IG9mIGFjY2VwdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9hY2NlcHRfYXJnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworCisgIGlmIHRlc3QgLXogIiRhY19jdl9hY2NlcHRfYXJnIiA7IHRoZW4KKworICAgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICAgICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQoreworc29ja2xlbl90IGxlbmd0aDsKKyAgICAgICBhY2NlcHQoIDAsIDAsICZsZW5ndGggKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY3h4X3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2FjY2VwdF9hcmc9c29ja2xlbl90CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKKyAgICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyAgZmkKKworCisKKyAgaWYgdGVzdCAteiAiJGFjX2N2X2FjY2VwdF9hcmciIDsgdGhlbgorCisgICAgYWNfZXh0PWNwcAorYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKworCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgICAgICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgoraW50CittYWluICgpCit7CitpbnQgbGVuZ3RoOworICAgICAgIGFjY2VwdCggMCwgMCwgJmxlbmd0aCApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfYWNjZXB0X2FyZz1pbnQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICBmaQorCisKKworICBpZiB0ZXN0IC16ICIkYWNfY3ZfYWNjZXB0X2FyZyIgOyB0aGVuCisKKyAgICBhY19leHQ9Y3BwCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorCisKKyAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgICAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitpbnQKK21haW4gKCkKK3sKK3NpemVfdCBsZW5ndGg7CisgICAgICAgYWNjZXB0KCAwLCAwLCAmbGVuZ3RoICk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9hY2NlcHRfYXJnPXNpemVfdAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisgIGZpCisKKworCisgIGlmIHRlc3QgLXogIiRhY19jdl9hY2NlcHRfYXJnIiA7IHRoZW4KKworICAgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICAgICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQoreworc2hvcnQgbGVuZ3RoOworICAgICAgIGFjY2VwdCggMCwgMCwgJmxlbmd0aCApOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfYWNjZXB0X2FyZz1zaG9ydAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCisgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisgIGZpCisKKworCisgIGlmIHRlc3QgLXogIiRhY19jdl9hY2NlcHRfYXJnIiA7IHRoZW4KKworICAgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICAgICAgI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQoreworbG9uZyBsZW5ndGg7CisgICAgICAgYWNjZXB0KCAwLCAwLCAmbGVuZ3RoICk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9hY2NlcHRfYXJnPWxvbmcKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworICBmaQorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2FjY2VwdF9hcmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9hY2NlcHRfYXJnIiA+JjY7IH0KKworaWYgdGVzdCAteiAiJGFjX2N2X2FjY2VwdF9hcmciIDsgdGhlbgorICBhY19jdl9hY2NlcHRfYXJnPWludAorZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNvY2tsZW5fdCAkYWNfY3ZfYWNjZXB0X2FyZworX0FDRU9GCisKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAicGlkX3QiICJhY19jdl90eXBlX3BpZF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfcGlkX3QiID0geHllczsgdGhlbiA6CisKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBwaWRfdCBpbnQKK19BQ0VPRgorCitmaQorCitmb3IgYWNfaGVhZGVyIGluIHZmb3JrLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInZmb3JrLmgiICJhY19jdl9oZWFkZXJfdmZvcmtfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfdmZvcmtfaCIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1ZGT1JLX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZm9yayB2Zm9yaworZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrIiA9IHh5ZXM7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igd29ya2luZyBmb3JrIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIGZvcmsuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY19mb3JrX3dvcmtzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9Y3Jvc3MKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworCisJICAvKiBCeSBSdWVkaWdlciBLdWhsbWFubi4gKi8KKwkgIHJldHVybiBmb3JrICgpIDwgMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9ydW4gIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPXllcworZWxzZQorICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNQorJGFzX2VjaG8gIiRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID4mNjsgfQorCitlbHNlCisgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz0kYWNfY3ZfZnVuY19mb3JrCitmaQoraWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geGNyb3NzOyB0aGVuCisgIGNhc2UgJGhvc3QgaW4KKyAgICAqLSotYW1pZ2FvcyogfCAqLSotbXNkb3NkamdwcCopCisgICAgICAjIE92ZXJyaWRlLCBhcyB0aGVzZSBzeXN0ZW1zIGhhdmUgb25seSBhIGR1bW15IGZvcmsoKSBzdHViCisgICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9bm8KKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX2Zvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQorZmkKK2FjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY192Zm9yayIgPSB4eWVzOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdmZvcmsuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfZnVuY192Zm9ya193b3Jrcys6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY192Zm9ya193b3Jrcz1jcm9zcworZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBUaGFua3MgdG8gUGF1bCBFZ2dlcnQgZm9yIHRoaXMgdGVzdC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaWZkZWYgSEFWRV9WRk9SS19ICisjIGluY2x1ZGUgPHZmb3JrLmg+CisjZW5kaWYKKy8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCisgICBhcmd1bWVudCByZWdpc3RlcnMgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgcGFyZW50LiAgVGhlIGNvbXBpbGVyCisgICBpcyB0b2xkIGFib3V0IHRoaXMgd2l0aCAjaW5jbHVkZSA8dmZvcmsuaD4sIGJ1dCBzb21lIGNvbXBpbGVycworICAgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4gIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYQorICAgc3RhdGljIHZhcmlhYmxlIHdob3NlIGFkZHJlc3MgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzCisgICBjbG9iYmVyZWQgYnkgdGhlIHZmb3JrLiAgKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19jcGx1c3BsdXMKK3NwYXJjX2FkZHJlc3NfdGVzdCAoaW50IGFyZykKKyMgZWxzZQorc3BhcmNfYWRkcmVzc190ZXN0IChhcmcpIGludCBhcmc7CisjZW5kaWYKK3sKKyAgc3RhdGljIHBpZF90IGNoaWxkOworICBpZiAoIWNoaWxkKSB7CisgICAgY2hpbGQgPSB2Zm9yayAoKTsKKyAgICBpZiAoY2hpbGQgPCAwKSB7CisgICAgICBwZXJyb3IgKCJ2Zm9yayIpOworICAgICAgX2V4aXQoMik7CisgICAgfQorICAgIGlmICghY2hpbGQpIHsKKyAgICAgIGFyZyA9IGdldHBpZCgpOworICAgICAgd3JpdGUoLTEsICIiLCAwKTsKKyAgICAgIF9leGl0IChhcmcpOworICAgIH0KKyAgfQorfQorCitpbnQKK21haW4gKCkKK3sKKyAgcGlkX3QgcGFyZW50ID0gZ2V0cGlkICgpOworICBwaWRfdCBjaGlsZDsKKworICBzcGFyY19hZGRyZXNzX3Rlc3QgKDApOworCisgIGNoaWxkID0gdmZvcmsgKCk7CisKKyAgaWYgKGNoaWxkID09IDApIHsKKyAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuICBUaGlzCisgICAgICAgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdCBhcyBtYW55IGxvY2FsCisgICAgICAgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIgaW5jbHVkaW5nIGNvbXBpbGVyCisgICAgICAgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvciBnY2MgMS40MC4zIG9uIGEgU29sYXJpcworICAgICAgIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4gIEEgYnVnZ3kgY29tcGlsZXIgc2hvdWxkCisgICAgICAgcmV1c2UgdGhlIHJlZ2lzdGVyIG9mIHBhcmVudCBmb3Igb25lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMsCisgICAgICAgc2luY2UgaXQgd2lsbCB0aGluayB0aGF0IHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlCisgICAgICAgaW4gdGhpcyByb3V0aW5lLiAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMKKyAgICAgICBtdW5nZSBwYXJlbnQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgKi8KKyAgICBwaWRfdAorICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAorICAgICAgcDQgPSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsKKyAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAorICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KKyAgICBpZiAocCAhPSBwMSB8fCBwICE9IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAorCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQorICAgICAgX2V4aXQoMSk7CisKKyAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLCB2Zm9yayBkb2Vzbid0IHNlcGFyYXRlIHBhcmVudAorICAgICAgIGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4gIElmIHRoZSBjaGlsZCBjbG9zZXMgYSBkZXNjcmlwdG9yCisgICAgICAgYmVmb3JlIGl0IGV4ZWNzIG9yIGV4aXRzLCB0aGlzIG11bmdlcyB0aGUgcGFyZW50J3MgZGVzY3JpcHRvcgorICAgICAgIGFzIHdlbGwuICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCisgICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOworICB9IGVsc2UgeworICAgIGludCBzdGF0dXM7CisgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKKyAgICAgIDsKKyAgICByZXR1cm4gKAorCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLworCSBjaGlsZCA8IDAKKworCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCisJIHx8IHN0YXR1cworCisJIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KKwkgfHwgcGFyZW50ICE9IGdldHBpZCgpCisKKwkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KKwkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAorCSApOworICB9Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcworZWxzZQorICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID4mNjsgfQorCitmaTsKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgorICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiByZXN1bHQgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgZ3Vlc3NlZCBiZWNhdXNlIG9mIGNyb3NzIGNvbXBpbGF0aW9uIiA+JjI7fQorZmkKKworaWYgdGVzdCAieCRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiA9IHh5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9XT1JLSU5HX1ZGT1JLIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIHZmb3JrIGZvcmsiID4+Y29uZmRlZnMuaAorCitmaQoraWYgdGVzdCAieCRhY19jdl9mdW5jX2Zvcmtfd29ya3MiID0geHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1dPUktJTkdfRk9SSyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworZm9yIGFjX2hlYWRlciBpbiBzdGRsaWIuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAic3RkbGliLmgiICJhY19jdl9oZWFkZXJfc3RkbGliX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3N0ZGxpYl9oIiA9IHh5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgR05VIGxpYmMgY29tcGF0aWJsZSBtYWxsb2MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEdOVSBsaWJjIGNvbXBhdGlibGUgbWFsbG9jLi4uICIgPiY2OyB9CitpZiAke2FjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPW5vCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZWxzZQorY2hhciAqbWFsbG9jICgpOworI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICEgbWFsbG9jICgwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbD15ZXMKK2Vsc2UKKyAgYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbCA9IHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUFMTE9DIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfTUFMTE9DIDAiID4+Y29uZmRlZnMuaAorCisgICBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBtYWxsb2MuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIG1hbGxvYy4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKKworJGFzX2VjaG8gIiNkZWZpbmUgbWFsbG9jIHJwbF9tYWxsb2MiID4+Y29uZmRlZnMuaAorCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWVtY21wIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1lbWNtcC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX21lbWNtcF93b3JraW5nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPW5vCitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CitpbnQKK21haW4gKCkKK3sKKworICAvKiBTb21lIHZlcnNpb25zIG9mIG1lbWNtcCBhcmUgbm90IDgtYml0IGNsZWFuLiAgKi8KKyAgY2hhciBjMCA9ICdcMTAwJywgYzEgPSAnXDIwMCcsIGMyID0gJ1wyMDEnOworICBpZiAobWVtY21wKCZjMCwgJmMyLCAxKSA+PSAwIHx8IG1lbWNtcCgmYzEsICZjMiwgMSkgPj0gMCkKKyAgICByZXR1cm4gMTsKKworICAvKiBUaGUgTmV4dCB4ODYgT3BlblN0ZXAgYnVnIHNob3dzIHVwIG9ubHkgd2hlbiBjb21wYXJpbmcgMTYgYnl0ZXMKKyAgICAgb3IgbW9yZSBhbmQgd2l0aCBhdCBsZWFzdCBvbmUgYnVmZmVyIG5vdCBzdGFydGluZyBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKyAgICAgV2lsbGlhbSBMZXdpcyBwcm92aWRlZCB0aGlzIHRlc3QgcHJvZ3JhbS4gICAqLworICB7CisgICAgY2hhciBmb29bMjFdOworICAgIGNoYXIgYmFyWzIxXTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgeworCWNoYXIgKmEgPSBmb28gKyBpOworCWNoYXIgKmIgPSBiYXIgKyBpOworCXN0cmNweSAoYSwgIi0tLS0tLS0tMDExMTExMTEiKTsKKwlzdHJjcHkgKGIsICItLS0tLS0tLTEwMDAwMDAwIik7CisJaWYgKG1lbWNtcCAoYSwgYiwgMTYpID49IDApCisJICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPXllcworZWxzZQorICBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmciID4mNjsgfQordGVzdCAkYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZyA9IG5vICYmIGNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIG1lbWNtcC4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgbWVtY21wLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworCitmb3IgYWNfaGVhZGVyIGluIHN5cy9zZWxlY3QuaCBzeXMvc29ja2V0LmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0eXBlcyBvZiBhcmd1bWVudHMgZm9yIHNlbGVjdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0eXBlcyBvZiBhcmd1bWVudHMgZm9yIHNlbGVjdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9mdW5jX3NlbGVjdF9hcmdzKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgZm9yIGFjX2FyZzIzNCBpbiAnZmRfc2V0IConICdpbnQgKicgJ3ZvaWQgKic7IGRvCisgZm9yIGFjX2FyZzEgaW4gJ2ludCcgJ3NpemVfdCcgJ3Vuc2lnbmVkIGxvbmcgaW50JyAndW5zaWduZWQgaW50JzsgZG8KKyAgZm9yIGFjX2FyZzUgaW4gJ3N0cnVjdCB0aW1ldmFsIConICdjb25zdCBzdHJ1Y3QgdGltZXZhbCAqJzsgZG8KKyAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworZXh0ZXJuIGludCBzZWxlY3QgKCRhY19hcmcxLAorCQkJCQkgICAgJGFjX2FyZzIzNCwgJGFjX2FyZzIzNCwgJGFjX2FyZzIzNCwKKwkJCQkJICAgICRhY19hcmc1KTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9mdW5jX3NlbGVjdF9hcmdzPSIkYWNfYXJnMSwkYWNfYXJnMjM0LCRhY19hcmc1IjsgYnJlYWsgMworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCisgZG9uZQorZG9uZQorIyBQcm92aWRlIGEgc2FmZSBkZWZhdWx0IHZhbHVlLgorOiAiJHthY19jdl9mdW5jX3NlbGVjdF9hcmdzPWludCxpbnQgKixzdHJ1Y3QgdGltZXZhbCAqfSIKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfZnVuY19zZWxlY3RfYXJncyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2Z1bmNfc2VsZWN0X2FyZ3MiID4mNjsgfQorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPScsJworc2V0IGR1bW15IGBlY2hvICIkYWNfY3ZfZnVuY19zZWxlY3RfYXJncyIgfCBzZWQgJ3MvXCovXCovZydgCitJRlM9JGFjX3NhdmVfSUZTCitzaGlmdAorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNFTEVDVF9UWVBFX0FSRzEgJDEKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0VMRUNUX1RZUEVfQVJHMjM0ICgkMikKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0VMRUNUX1RZUEVfQVJHNSAoJDMpCitfQUNFT0YKKworcm0gLWYgY29uZnRlc3QqCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4uLiAiID4mNjsgfQoraWYgJHthY19jdl90eXBlX3NpZ25hbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworaW50CittYWluICgpCit7CityZXR1cm4gKihzaWduYWwgKDAsIDApKSAoMCkgPT0gMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2Vsc2UKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaWduYWwiID4mNQorJGFzX2VjaG8gIiRhY19jdl90eXBlX3NpZ25hbCIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKK19BQ0VPRgorCisKK2ZvciBhY19mdW5jIGluIHN0cmZ0aW1lCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInN0cmZ0aW1lIiAiYWNfY3ZfZnVuY19zdHJmdGltZSIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUkZUSU1FIDEKK19BQ0VPRgorCitlbHNlCisgICMgc3RyZnRpbWUgaXMgaW4gLWxpbnRsIG9uIFNDTyBVTklYLgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3RyZnRpbWUgaW4gLWxpbnRsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdHJmdGltZSBpbiAtbGludGwuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfbGliX2ludGxfc3RyZnRpbWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHN0cmZ0aW1lICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc3RyZnRpbWUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2ludGxfc3RyZnRpbWU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9pbnRsX3N0cmZ0aW1lIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2ludGxfc3RyZnRpbWUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfaW50bF9zdHJmdGltZSIgPSB4eWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TVFJGVElNRSAxIiA+PmNvbmZkZWZzLmgKKworTElCUz0iLWxpbnRsICRMSUJTIgorZmkKKworZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gdnByaW50ZgorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJ2cHJpbnRmIiAiYWNfY3ZfZnVuY192cHJpbnRmIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX3ZwcmludGYiID0geHllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9WUFJJTlRGIDEKK19BQ0VPRgorCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJfZG9wcm50IiAiYWNfY3ZfZnVuY19fZG9wcm50IgoraWYgdGVzdCAieCRhY19jdl9mdW5jX19kb3BybnQiID0geHllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfRE9QUk5UIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitmaQorZG9uZQorCisKK2ZvciBhY19mdW5jIGluIGF0ZXhpdCBnZXR0aW1lb2ZkYXkgbWVtc2V0IHB0aHJlYWRfY2FuY2VsIHNlbGVjdCBzdHJjaHIgc3RyZXJyb3Igc3RydG9sIHVzbGVlcAorZG8gOgorICBhc19hY192YXI9YCRhc19lY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgIiRhY19mdW5jIiAiJGFzX2FjX3ZhciIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfdmFyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgInNucHJpbnRmIiAiYWNfY3ZfZnVuY19zbnByaW50ZiIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19zbnByaW50ZiIgPSB4eWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TTlBSSU5URiAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBzbnByaW50Zi4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgc25wcmludGYuJGFjX29iamV4dCIKKyA7OworZXNhYworCitmaQorCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJpbmV0X3B0b24iICJhY19jdl9mdW5jX2luZXRfcHRvbiIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19pbmV0X3B0b24iID0geHllczsgdGhlbiA6CisgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfSU5FVF9QVE9OIDEiID4+Y29uZmRlZnMuaAorCitlbHNlCisgIGNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIGluZXRfcHRvbi4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgaW5ldF9wdG9uLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworZmkKKworYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiaW5ldF9udG9wIiAiYWNfY3ZfZnVuY19pbmV0X250b3AiCitpZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfaW5ldF9udG9wIiA9IHh5ZXM7IHRoZW4gOgorICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX0lORVRfTlRPUCAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBpbmV0X250b3AuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIGluZXRfbnRvcC4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfZnVuYyAiJExJTkVOTyIgImdldHRpbWVvZmRheSIgImFjX2N2X2Z1bmNfZ2V0dGltZW9mZGF5IgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldHRpbWVvZmRheSIgPSB4eWVzOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMSIgPj5jb25mZGVmcy5oCisKK2Vsc2UKKyAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgZ2V0dGltZW9mZGF5LiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJPQkpTPSIkTElCT0JKUyBnZXR0aW1lb2ZkYXkuJGFjX29iamV4dCIKKyA7OworZXNhYworCitmaQorCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICpwcmludGYoKSBzdXBwb3J0IGZvciAlbGxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICpwcmludGYoKSBzdXBwb3J0IGZvciAlbGxkLi4uICIgPiY2OyB9CitjYW5fcHJpbnRmX2xvbmdsb25nPW5vCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgICA6CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICAgICAgaW50IG1haW4oKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbMTAwXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVsbGQiLCAyMTcyNjU4NzU5MExMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmNtcChidWYsICIyMTcyNjU4NzU5MCIpKTsKKyAgICAgICAgfQorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICAgICAgIGNhbl9wcmludGZfbG9uZ2xvbmc9eWVzCisKK2Vsc2UKKworICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IFwKKyAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtIGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworaWYgdGVzdCAkY2FuX3ByaW50Zl9sb25nbG9uZyAhPSB5ZXM7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAqcHJpbnRmKCkgc3VwcG9ydCBmb3IgJXFkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nICpwcmludGYoKSBzdXBwb3J0IGZvciAlcWQuLi4gIiA+JjY7IH0KKyAgICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICAgOgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyAgICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICAgICAgICAgICAgICBpbnQgbWFpbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVxZCIsIDIxNzI2NTg3NTkwTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzdHJjbXAoYnVmLCAiMjE3MjY1ODc1OTAiKSk7CisgICAgICAgICAgICAgICAgfQorCitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICAgICAgICAgICAgICBjYW5fcHJpbnRmX2xvbmdsb25nPXllcworICAgICAgICAgICAgICAgICRhc19lY2hvICIjZGVmaW5lIEhBVkVfUFJJTlRGX1FEIDEiID4+Y29uZmRlZnMuaAorCisKK2Vsc2UKKworICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgXAorICBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LmJlYW0gY29uZnRlc3QuJGFjX2V4dAorZmkKKworZmkKKworaWYgdGVzdCAkY2FuX3ByaW50Zl9sb25nbG9uZyA9IHllczsgdGhlbgorICAgICAgICAkYXNfZWNobyAiI2RlZmluZSBIQVZFX1FVQURfU1VQUE9SVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisKKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiBib29sIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgYm9vbC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2ZfYm9vbCs6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKGJvb2wpKSIgImFjX2N2X3NpemVvZl9ib29sIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfYm9vbCIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciA3NyAiY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChib29sKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX2Jvb2w9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9ib29sIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2Jvb2wiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfQk9PTCAkYWNfY3Zfc2l6ZW9mX2Jvb2wKK19BQ0VPRgorCisKK2lmIHRlc3QgIiRhY19jdl9zaXplb2ZfYm9vbCIgPSAwIDsgdGhlbgorICAkYXNfZWNobyAiI2RlZmluZSBib29sIGludCIgPj5jb25mZGVmcy5oCisKK2ZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdHJ1ZSBpcyBkZWZpbmVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRydWUgaXMgZGVmaW5lZC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9oYXZlX3RydWUrOn0gZmFsc2U7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisgIGFjX2V4dD1jcHAKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK3Vuc2lnbmVkIGludCBpID0gdHJ1ZQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfaGF2ZV90cnVlPXllcworZWxzZQorICBhY19jdl9oYXZlX3RydWU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfdHJ1ZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2hhdmVfdHJ1ZSIgPiY2OyB9CisKK2lmIHRlc3QgIiRhY19jdl9oYXZlX3RydWUiICE9IHllcyA7IHRoZW4KKyAgJGFzX2VjaG8gIiNkZWZpbmUgdHJ1ZSAxIiA+PmNvbmZkZWZzLmgKKworICAkYXNfZWNobyAiI2RlZmluZSBmYWxzZSAwIiA+PmNvbmZkZWZzLmgKKworZmkKKworCisKKyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbi4uLiAiID4mNjsgfQoraWYgJHthY19jdl9jX2JpZ2VuZGlhbis6fSBmYWxzZTsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKyAgICAjIFNlZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB1bml2ZXJzYWwgY29tcGlsZXIuCisgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2lmbmRlZiBfX0FQUExFX0NDX18KKwkgICAgICAgbm90IGEgdW5pdmVyc2FsIGNhcGFibGUgY29tcGlsZXIKKwkgICAgICNlbmRpZgorCSAgICAgdHlwZWRlZiBpbnQgZHVtbXk7CisKK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorCisJIyBDaGVjayBmb3IgcG90ZW50aWFsIC1hcmNoIGZsYWdzLiAgSXQgaXMgbm90IHVuaXZlcnNhbCB1bmxlc3MKKwkjIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gLWFyY2ggZmxhZ3Mgd2l0aCBkaWZmZXJlbnQgdmFsdWVzLgorCWFjX2FyY2g9CisJYWNfcHJldj0KKwlmb3IgYWNfd29yZCBpbiAkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1M7IGRvCisJIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorCSAgIGNhc2UgJGFjX3dvcmQgaW4KKwkgICAgIGk/ODYgfCB4ODZfNjQgfCBwcGMgfCBwcGM2NCkKKwkgICAgICAgaWYgdGVzdCAteiAiJGFjX2FyY2giIHx8IHRlc3QgIiRhY19hcmNoIiA9ICIkYWNfd29yZCI7IHRoZW4KKwkJIGFjX2FyY2g9JGFjX3dvcmQKKwkgICAgICAgZWxzZQorCQkgYWNfY3ZfY19iaWdlbmRpYW49dW5pdmVyc2FsCisJCSBicmVhaworCSAgICAgICBmaQorCSAgICAgICA7OworCSAgIGVzYWMKKwkgICBhY19wcmV2PQorCSBlbGlmIHRlc3QgIngkYWNfd29yZCIgPSAieC1hcmNoIjsgdGhlbgorCSAgIGFjX3ByZXY9YXJjaAorCSBmaQorICAgICAgIGRvbmUKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKyAgICAgICMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJICAgICAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKK2ludAorbWFpbiAoKQoreworI2lmICEgKGRlZmluZWQgQllURV9PUkRFUiAmJiBkZWZpbmVkIEJJR19FTkRJQU4gXAorCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAorCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCisJICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcworCSAgICAgI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJCSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworaW50CittYWluICgpCit7CisjaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCisJCSBub3QgYmlnIGVuZGlhbgorCQkjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIGZpCisgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgorICAgICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZiAhIChkZWZpbmVkIF9MSVRUTEVfRU5ESUFOIHx8IGRlZmluZWQgX0JJR19FTkRJQU4pCisJICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcworCSAgICAgI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIF9CSUdfRU5ESUFOIG9yIG5vdC4KKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX0JJR19FTkRJQU4KKwkJIG5vdCBiaWcgZW5kaWFuCisJCSNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgZmkKKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKyAgICAgICMgQ29tcGlsZSBhIHRlc3QgcHJvZ3JhbS4KKyAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgIyBUcnkgdG8gZ3Vlc3MgYnkgZ3JlcHBpbmcgdmFsdWVzIGZyb20gYW4gb2JqZWN0IGZpbGUuCisJIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK3Nob3J0IGludCBhc2NpaV9tbVtdID0KKwkJICB7IDB4NDI0OSwgMHg0NzY1LCAweDZFNDQsIDB4Njk2MSwgMHg2RTUzLCAweDc5NTMsIDAgfTsKKwkJc2hvcnQgaW50IGFzY2lpX2lpW10gPQorCQkgIHsgMHg2OTRDLCAweDU0NTQsIDB4NjU2QywgMHg2RTQ1LCAweDY5NDQsIDB4NkU2MSwgMCB9OworCQlpbnQgdXNlX2FzY2lpIChpbnQgaSkgeworCQkgIHJldHVybiBhc2NpaV9tbVtpXSArIGFzY2lpX2lpW2ldOworCQl9CisJCXNob3J0IGludCBlYmNkaWNfaWlbXSA9CisJCSAgeyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07CisJCXNob3J0IGludCBlYmNkaWNfbW1bXSA9CisJCSAgeyAweEMyQzksIDB4Qzc4NSwgMHg5NUM0LCAweDg5ODEsIDB4OTVFMiwgMHhBOEUyLCAwIH07CisJCWludCB1c2VfZWJjZGljIChpbnQgaSkgeworCQkgIHJldHVybiBlYmNkaWNfbW1baV0gKyBlYmNkaWNfaWlbaV07CisJCX0KKwkJZXh0ZXJuIGludCBmb287CisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHVzZV9hc2NpaSAoZm9vKSA9PSB1c2VfZWJjZGljIChmb28pOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGlmIGdyZXAgQklHZW5EaWFuU3lTIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbDsgdGhlbgorCSAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworCSAgICBmaQorCSAgICBpZiBncmVwIExpVFRsZUVuRGlhbiBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGwgOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfYmlnZW5kaWFuIiA9IHVua25vd247IHRoZW4KKwkJYWNfY3ZfY19iaWdlbmRpYW49bm8KKwkgICAgICBlbHNlCisJCSMgZmluZGluZyBib3RoIHN0cmluZ3MgaXMgdW5saWtlbHkgdG8gaGFwcGVuLCBidXQgd2hvIGtub3dzPworCQlhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisJICAgICAgZmkKKwkgICAgZmkKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworCisJICAgICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisJICAgICB1bmlvbgorCSAgICAgeworCSAgICAgICBsb25nIGludCBsOworCSAgICAgICBjaGFyIGNbc2l6ZW9mIChsb25nIGludCldOworCSAgICAgfSB1OworCSAgICAgdS5sID0gMTsKKwkgICAgIHJldHVybiB1LmNbc2l6ZW9mIChsb25nIGludCkgLSAxXSA9PSAxOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X3J1biAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCisgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY19iaWdlbmRpYW4iID4mNjsgfQorIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCisgICB5ZXMpCisgICAgICRhc19lY2hvICIjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxIiA+PmNvbmZkZWZzLmgKKzs7ICMoCisgICBubykKKyAgICAgIDs7ICMoCisgICB1bml2ZXJzYWwpCisKKyRhc19lY2hvICIjZGVmaW5lIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAxIiA+PmNvbmZkZWZzLmgKKworICAgICA7OyAjKAorICAgKikKKyAgICAgYXNfZm5fZXJyb3IgJD8gInVua25vd24gZW5kaWFubmVzcworIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiAiJExJTkVOTyIgNSA7OworIGVzYWMKKworCisKK2lmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiICE9IG5vOyB0aGVuCisgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBpcF9tcmVxIiAiYWNfY3ZfdHlwZV9zdHJ1Y3RfaXBfbXJlcSIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X2lwX21yZXEiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfSVBfTVJFUSAxCitfQUNFT0YKKworCitmaQorCisgIGFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIklQX0FERF9NRU1CRVJTSElQIiAiYWNfY3ZfaGF2ZV9kZWNsX0lQX0FERF9NRU1CRVJTSElQIiAiI2luY2x1ZGUgXCIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0lQX0FERF9NRU1CRVJTSElQIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfSVBfQUREX01FTUJFUlNISVAgJGFjX2hhdmVfZGVjbAorX0FDRU9GCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbXVsdGljYXN0IHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG11bHRpY2FzdCBzdXBwb3J0Li4uICIgPiY2OyB9CisgIGFjX2N2X211bHRpY2FzdD1ubworICBpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX0lQX0FERF9NRU1CRVJTSElQIiA9IHllczsgdGhlbgorICAgIGlmIHRlc3QgIiRhY19jdl90eXBlX3N0cnVjdF9pcF9tcmVxIiA9IHllczsgdGhlbgorICAgICAgYWNfY3ZfbXVsdGljYXN0PXllcworICAgIGZpCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbXVsdGljYXN0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbXVsdGljYXN0IiA+JjY7IH0KKyAgaWYgdGVzdCAiJGFjX2N2X211bHRpY2FzdCIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9NVUxUSUNBU1QgMSIgPj5jb25mZGVmcy5oCisKKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oYXZlX2lwdjYiICE9IG5vOyB0aGVuCisgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIiAiYWNfY3ZfdHlwZV9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfU09DS0FERFJfU1RPUkFHRSAxCitfQUNFT0YKKworCitmaQorCisgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBzb2NrYWRkcl9pbjYiICJhY19jdl90eXBlX3N0cnVjdF9zb2NrYWRkcl9pbjYiICIjaW5jbHVkZSBcIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmhcIgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX3N0cnVjdF9zb2NrYWRkcl9pbjYiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfU09DS0FERFJfSU42IDEKK19BQ0VPRgorCisKK2ZpCisKKyAgYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiQUZfSU5FVDYiICJhY19jdl9oYXZlX2RlY2xfQUZfSU5FVDYiICIjaW5jbHVkZSBcIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmhcIgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfQUZfSU5FVDYiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9BRl9JTkVUNiAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBJUHY2IGhlYWRlcnMgYW5kIHN0cnVjdHVyZXMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIElQdjYgaGVhZGVycyBhbmQgc3RydWN0dXJlcy4uLiAiID4mNjsgfQorICBhY19jdl9oYXZlX2lwdjY9bm8KKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID0geWVzOyB0aGVuCisgICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX2luNiIgPSB5ZXM7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfQUZfSU5FVDYiID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSVBWNiAxIiA+PmNvbmZkZWZzLmgKKworICAgICAgICBhY19jdl9oYXZlX2lwdjY9eWVzCisgICAgICBmaQorICAgIGZpCisgIGZpCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9pcHY2IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaGF2ZV9pcHY2IiA+JjY7IH0KK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oYXZlX2lwdjYiID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiID0geWVzOyB0aGVuCisgICAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3RydWN0IGlwdjZfbXJlcSIgImFjX2N2X3R5cGVfc3RydWN0X2lwdjZfbXJlcSIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X2lwdjZfbXJlcSIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUlVDVF9JUFY2X01SRVEgMQorX0FDRU9GCisKKworZmkKKworICAgIGFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIklQVjZfQUREX01FTUJFUlNISVAiICJhY19jdl9oYXZlX2RlY2xfSVBWNl9BRERfTUVNQkVSU0hJUCIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9JUFY2X0FERF9NRU1CRVJTSElQIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfSVBWNl9BRERfTUVNQkVSU0hJUCAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworICAgIGFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIklQVjZfTVVMVElDQVNUX0hPUFMiICJhY19jdl9oYXZlX2RlY2xfSVBWNl9NVUxUSUNBU1RfSE9QUyIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9JUFY2X01VTFRJQ0FTVF9IT1BTIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfSVBWNl9NVUxUSUNBU1RfSE9QUyAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIElQdjYgbXVsdGljYXN0IHN1cHBvcnQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIElQdjYgbXVsdGljYXN0IHN1cHBvcnQuLi4gIiA+JjY7IH0KKyAgICBhY19jdl9oYXZlX2lwdjZfbXVsdGljYXN0PW5vCisgICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X2lwdjZfbXJlcSIgPSB5ZXM7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfSVBWNl9BRERfTUVNQkVSU0hJUCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGVjbF9JUFY2X01VTFRJQ0FTVF9IT1BTIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0lQVjZfTVVMVElDQVNUIDEiID4+Y29uZmRlZnMuaAorCisgICAgICAgICAgYWNfY3ZfaGF2ZV9pcHY2X211bHRpY2FzdD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hhdmVfaXB2Nl9tdWx0aWNhc3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oYXZlX2lwdjZfbXVsdGljYXN0IiA+JjY7IH0KKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRlbmFibGVfZGVidWdpbmZvIiA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBEQkdfTUpaIDEiID4+Y29uZmRlZnMuaAorCitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX3dlYjEwMCIgIT0gbm87IHRoZW4KK2lmIHRlc3QgLWUgIi9wcm9jL3dlYjEwMCI7IHRoZW4KK2lmIHRlc3QgLWQgIi9wcm9jL3dlYjEwMCI7IHRoZW4KK2lmIHRlc3QgLWUgIi9wcm9jL3dlYjEwMC9oZWFkZXIiOyB0aGVuCitpZiB0ZXN0IC1mICIvcHJvYy93ZWIxMDAvaGVhZGVyIjsgdGhlbgoraWYgdGVzdCAtciAiL3Byb2Mvd2ViMTAwL2hlYWRlciI7IHRoZW4KKword2ViMTAwX3N1Y2Nlc3M9IiIKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ3ZWIxMDAtY29uZmlnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB3ZWIxMDAtY29uZmlnOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmICR7YWNfY3ZfcGF0aF9XRUIxMDBfQ09ORklHKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkV0VCMTAwX0NPTkZJRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9XRUIxMDBfQ09ORklHPSIkV0VCMTAwX0NPTkZJRyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgYXNfZm5fZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfV0VCMTAwX0NPTkZJRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9XRUIxMDBfQ09ORklHIiAmJiBhY19jdl9wYXRoX1dFQjEwMF9DT05GSUc9Im5vIgorICA7OworZXNhYworZmkKK1dFQjEwMF9DT05GSUc9JGFjX2N2X3BhdGhfV0VCMTAwX0NPTkZJRworaWYgdGVzdCAtbiAiJFdFQjEwMF9DT05GSUciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkV0VCMTAwX0NPTkZJRyIgPiY1CiskYXNfZWNobyAiJFdFQjEwMF9DT05GSUciID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBXZWIxMDAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFdlYjEwMC4uLiAiID4mNjsgfQorCitpZiB0ZXN0ICIkV0VCMTAwX0NPTkZJRyIgIT0gIm5vIjsgdGhlbgorICBXRUIxMDBfQ0ZMQUdTPWAkV0VCMTAwX0NPTkZJRyAtLWNmbGFnc2AKKyAgV0VCMTAwX0xJQlM9YCRXRUIxMDBfQ09ORklHIC0tbGlic2AKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgIGVjaG8gIioqKiBUaGUgd2ViMTAwLWNvbmZpZyBzY3JpcHQgaW5zdGFsbGVkIGJ5IFdlYjEwMCBjb3VsZCBub3QgYmUgZm91bmQiCisgIGVjaG8gIioqKiBJZiBXZWIxMDAgd2FzIGluc3RhbGxlZCBpbiBQUkVGSVgsIG1ha2Ugc3VyZSBQUkVGSVgvYmluIGlzIGluIgorICBlY2hvICIqKiogeW91ciBwYXRoLCBvciBzZXQgdGhlIFdFQjEwMF9DT05GSUcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIgorICBlY2hvICIqKiogZnVsbCBwYXRoIHRvIHdlYjEwMC1jb25maWciCisgIHdlYjEwMF9zdWNjZXNzPSJubyIKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCIgIT0gIngiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgV2ViMTAwIC0gdmVyc2lvbiAiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIFdlYjEwMCAtIHZlcnNpb24gLi4uICIgPiY2OyB9CisKKyAgICBXRUIxMDBfVkVSU0lPTj1gJFdFQjEwMF9DT05GSUcgLS12ZXJzaW9uYAorICAgIGlmIHRlc3QgIiRXRUIxMDBfVkVSU0lPTiIgPSAiIjsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICAgIGVjaG8gIioqKiBUaGUgcmVxdWVzdGVkICgpIGFuZCBpbnN0YWxsZWQgKCRXRUIxMDBfVkVSU0lPTikgdmVyc2lvbnMiCisgICAgICBlY2hvICIqKiogb2YgV2ViMTAwIGRvIG5vdCBtYXRjaC4iCisgICAgICB3ZWIxMDBfc3VjY2Vzcz0ibm8iCisgICAgZmkKKyAgZmkKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHg7IHRoZW4KKyAgd2ViMTAwX3N1Y2Nlc3M9InllcyIKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHh5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBXRUIxMDBfQ0ZMQUdTPSIiCisgIFdFQjEwMF9MSUJTPSIiCisgIDoKK2ZpCisKKworCisKK2lmIHRlc3QgIiR3ZWIxMDBfc3VjY2VzcyIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9XRUIxMDAgMSIgPj5jb25mZGVmcy5oCisKK2ZpIGZpIGZpIGZpIGZpIGZpCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbWFrZSBpcyBHTlUgbWFrZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIG1ha2UgaXMgR05VIG1ha2UuLi4gIiA+JjY7IH0KK1NUUklQX0JFR0lOPQorU1RSSVBfRU5EPQoraWYgJGFjX21ha2UgLS12ZXJzaW9uIDI+IC9kZXYvbnVsbCB8IGdyZXAgJ15HTlUgTWFrZSAnID4gL2Rldi9udWxsIDsgdGhlbgorICAgIFNUUklQX0JFR0lOPSckKHN0cmlwICQoU1RSSVBfRFVNTVkpJworICAgIFNUUklQX0VORD0nKScKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworU1RSSVBfRFVNTVk9CisKKworCisKK2FjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBjb21wYXQvTWFrZWZpbGUgZG9jL01ha2VmaWxlIGluY2x1ZGUvTWFrZWZpbGUgc3JjL01ha2VmaWxlIG1hbi9NYWtlZmlsZSIKKworY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisgICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgorICAgICAgc2VkIC1uIFwKKwkicy8nLydcXFxcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7ICMoCisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispIHwKKyAgc2VkICcKKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCisgICAgIHQgY2xlYXIKKyAgICAgOmNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDplbmQnID4+Y29uZmNhY2hlCitpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIGlmIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgICAgaWYgdGVzdCAhIC1mICIkY2FjaGVfZmlsZSIgfHwgdGVzdCAtaCAiJGNhY2hlX2ZpbGUiOyB0aGVuCisJY2F0IGNvbmZjYWNoZSA+IiRjYWNoZV9maWxlIgorICAgICAgZWxzZQorICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCisgICAgICAgICovKiB8ID86KikKKwkgIG12IC1mIGNvbmZjYWNoZSAiJGNhY2hlX2ZpbGUiJCQgJiYKKwkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCisgICAgICAgICopCisJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCitERUZTPS1ESEFWRV9DT05GSUdfSAorCithY19saWJvYmpzPQorYWNfbHRsaWJvYmpzPQorVT0KK2ZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQorICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCisgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworICBhY19pPWAkYXNfZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKKyAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgorICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKyAgYXNfZm5fYXBwZW5kIGFjX2xpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKKyAgYXNfZm5fYXBwZW5kIGFjX2x0bGlib2JqcyAiIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCitkb25lCitMSUJPQkpTPSRhY19saWJvYmpzCisKK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisKKworaWYgdGVzdCAteiAiJHtBTURFUF9UUlVFfSIgJiYgdGVzdCAteiAiJHtBTURFUF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcIkFNREVQXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENYWF9UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENYWF9GQUxTRX0iOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjb25kaXRpb25hbCBcImFtX19mYXN0ZGVwQ1hYXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQoraWYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX1RSVUV9IiAmJiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfRkFMU0V9IjsgdGhlbgorICBhc19mbl9lcnJvciAkPyAiY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iICIkTElORU5PIiA1CitmaQorCisKKzogIiR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9IgorYWNfd3JpdGVfZmFpbD0wCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cithc193cml0ZV9mYWlsPTAKK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCisKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2FzX215c2VsZj0KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKworIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcFInLgorICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICAgIGFzX2xuX3M9J2NwIC1wUicKKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhc19sbl9zPWxuCisgIGVsc2UKKyAgICBhc19sbl9zPSdjcCAtcFInCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wUicKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisKKworIyBhc19mbl9ta2Rpcl9wCisjIC0tLS0tLS0tLS0tLS0KKyMgQ3JlYXRlICIkYXNfZGlyIiBhcyBhIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHBhcmVudHMgaWYgbmVjZXNzYXJ5LgorYXNfZm5fbWtkaXJfcCAoKQoreworCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgZXZhbCAkYXNfbWtkaXJfcCB8fCB7CisgICAgYXNfZGlycz0KKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIgorCisKK30gIyBhc19mbl9ta2Rpcl9wCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9J21rZGlyIC1wICIkYXNfZGlyIicKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworCisjIGFzX2ZuX2V4ZWN1dGFibGVfcCBGSUxFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3QgaWYgRklMRSBpcyBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS4KK2FzX2ZuX2V4ZWN1dGFibGVfcCAoKQoreworICB0ZXN0IC1mICIkMSIgJiYgdGVzdCAteCAiJDEiCit9ICMgYXNfZm5fZXhlY3V0YWJsZV9wCithc190ZXN0X3g9J3Rlc3QgLXgnCithc19leGVjdXRhYmxlX3A9YXNfZm5fZXhlY3V0YWJsZV9wCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCitleGVjIDY+JjEKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWluIGJvZHkgb2YgJENPTkZJR19TVEFUVVMgc2NyaXB0LiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0VPRgordGVzdCAkYXNfd3JpdGVfZmFpbCA9IDAgJiYgY2htb2QgK3ggJENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgU2F2ZSB0aGUgbG9nIG1lc3NhZ2UsIHRvIGtlZXAgJDAgYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgorYWNfbG9nPSIKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgSXBlcmYgJGFzX21lIDIuMC41LCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICAkICQwICRACisKK29uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAorIgorCitfQUNFT0YKKworY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19maWxlczsgc2hpZnQ7IGFjX2NvbmZpZ19maWxlcz0kKjs7Citlc2FjCisKK2Nhc2UgJGFjX2NvbmZpZ19oZWFkZXJzIGluICoiCisiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworZXNhYworCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKK2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGFjdGlvbnMKK2Zyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcworYW5kIGFjdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBUQUdzLCBhbGwgYXJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1RBR10uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorICAgICAgLS1jb25maWcgICAgIHByaW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQKKyAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgICAgIC0taGVhZGVyPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCisKK0NvbmZpZ3VyYXRpb24gZmlsZXM6CiskY29uZmlnX2ZpbGVzCisKK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKKyRjb25maWdfaGVhZGVycworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byB0aGUgcGFja2FnZSBwcm92aWRlci4iCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCithY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgorYWNfY3NfdmVyc2lvbj0iXFwKK0lwZXJmIGNvbmZpZy5zdGF0dXMgMi4wLjUKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSwKKyAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCisKK0NvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKworYWNfcHdkPSckYWNfcHdkJworc3JjZGlyPSckc3JjZGlyJworSU5TVEFMTD0nJElOU1RBTEwnCitBV0s9JyRBV0snCit0ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3aworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKyMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KK2FjX25lZWRfZGVmYXVsdHM9Ogord2hpbGUgdGVzdCAkIyAhPSAwCitkbworICBjYXNlICQxIGluCisgIC0tKj0/KikKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAiWCQxIiA6ICdYW149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgLS0qPSkKKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz0KKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgKikKKyAgICBhY19vcHRpb249JDEKKyAgICBhY19vcHRhcmc9JDIKKyAgICBhY19zaGlmdD1zaGlmdAorICAgIDs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdiB8IC1WICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tY29uZmlnIHwgLS1jb25maSB8IC0tY29uZiB8IC0tY29uIHwgLS1jbyB8IC0tYyApCisgICAgJGFzX2VjaG8gIiRhY19jc19jb25maWciOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgJycpIGFzX2ZuX2Vycm9yICQ/ICJtaXNzaW5nIGZpbGUgYXJndW1lbnQiIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfRklMRVMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKyAgICAqXCcqKSBhY19vcHRhcmc9YCRhc19lY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBhc19mbl9hcHBlbmQgQ09ORklHX0hFQURFUlMgIiAnJGFjX29wdGFyZyciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGUgfCAtLWgpCisgICAgIyBDb25mbGljdCBiZXR3ZWVuIC0taGVscCBhbmQgLS1oZWFkZXIKKyAgICBhc19mbl9lcnJvciAkPyAiYW1iaWd1b3VzIG9wdGlvbjogXGAkMScKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDs7CisKKyAgKikgYXNfZm5fYXBwZW5kIGFjX2NvbmZpZ190YXJnZXRzICIgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgc2V0IFggJFNIRUxMICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKyAgc2hpZnQKKyAgXCRhc19lY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgXCQqIiA+JjYKKyAgQ09ORklHX1NIRUxMPSckU0hFTEwnCisgIGV4cG9ydCBDT05GSUdfU0hFTEwKKyAgZXhlYyAiXCRAIgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKKyAgJGFzX2VjaG8gIiRhY19sb2ciCit9ID4mNQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIworIyBJTklULUNPTU1BTkRTCisjCitBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCisjIHZhcmlhYmxlcyBmb3IgY3JlYXRlIHN0ZGludC5oIHJlcGxhY2VtZW50CitQQUNLQUdFPSIkUEFDS0FHRSIKK1ZFUlNJT049IiRWRVJTSU9OIgorYWNfc3RkaW50X2g9IiRhY19zdGRpbnRfaCIKK19hY19zdGRpbnRfaD1gJGFzX2VjaG8gIl8kUEFDS0FHRS0kYWNfc3RkaW50X2giIHwgJGFzX3RyX2NwcGAKK2FjX2N2X3N0ZGludF9tZXNzYWdlPSIkYWNfY3Zfc3RkaW50X21lc3NhZ2UiCithY19jdl9oZWFkZXJfc3RkaW50X3Q9IiRhY19jdl9oZWFkZXJfc3RkaW50X3QiCithY19jdl9oZWFkZXJfc3RkaW50X3g9IiRhY19jdl9oZWFkZXJfc3RkaW50X3giCithY19jdl9oZWFkZXJfc3RkaW50X289IiRhY19jdl9oZWFkZXJfc3RkaW50X28iCithY19jdl9oZWFkZXJfc3RkaW50X3U9IiRhY19jdl9oZWFkZXJfc3RkaW50X3UiCithY19jdl90eXBlX3VpbnQ2NF90PSIkYWNfY3ZfdHlwZV91aW50NjRfdCIKK2FjX2N2X3R5cGVfdV9pbnQ2NF90PSIkYWNfY3ZfdHlwZV91X2ludDY0X3QiCithY19jdl9jaGFyX2RhdGFfbW9kZWw9IiRhY19jdl9jaGFyX2RhdGFfbW9kZWwiCithY19jdl9sb25nX2RhdGFfbW9kZWw9IiRhY19jdl9sb25nX2RhdGFfbW9kZWwiCithY19jdl90eXBlX2ludF9sZWFzdDMyX3Q9IiRhY19jdl90eXBlX2ludF9sZWFzdDMyX3QiCithY19jdl90eXBlX2ludF9mYXN0MzJfdD0iJGFjX2N2X3R5cGVfaW50X2Zhc3QzMl90IgorYWNfY3ZfdHlwZV9pbnRtYXhfdD0iJGFjX2N2X3R5cGVfaW50bWF4X3QiCisKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OworICAgICJkZXBmaWxlcyIpIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBkZXBmaWxlcyIgOzsKKyAgICAiJGFjX3N0ZGludF9oIikgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTICRhY19zdGRpbnRfaCIgOzsKKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICAgImNvbXBhdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb21wYXQvTWFrZWZpbGUiIDs7CisgICAgImRvYy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkb2MvTWFrZWZpbGUiIDs7CisgICAgImluY2x1ZGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW5jbHVkZS9NYWtlZmlsZSIgOzsKKyAgICAic3JjL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNyYy9NYWtlZmlsZSIgOzsKKyAgICAibWFuL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG1hbi9NYWtlZmlsZSIgOzsKKworICAqKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCBhcmd1bWVudDogXGAkYWNfY29uZmlnX3RhcmdldCciICIkTElORU5PIiA1OzsKKyAgZXNhYworZG9uZQorCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKKyMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorJGRlYnVnIHx8Cit7CisgIHRtcD0gYWNfdG1wPQorICB0cmFwICdleGl0X3N0YXR1cz0kPworICA6ICIke2FjX3RtcDo9JHRtcH0iCisgIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAnYXNfZm5fZXhpdCAxJyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8IGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiAiJExJTkVOTyIgNQorYWNfdG1wPSR0bXAKKworIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgnLgoraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKworCithY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCisjIE9uIGN5Z3dpbiwgYmFzaCBjYW4gZWF0IFxyIGluc2lkZSBgYCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaWduY3IuCisjIEJ1dCB3ZSBrbm93IG9mIG5vIG90aGVyIHNoZWxsIHdoZXJlIGFjX2NyIHdvdWxkIGJlIGVtcHR5IGF0IHRoaXMKKyMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCitpZiB0ZXN0ICJ4JGFjX2NyIiA9IHg7IHRoZW4KKyAgZXZhbCBhY19jcj1cJFwnXFxyXCcKK2ZpCithY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCitpZiB0ZXN0ICIkYWNfY3NfYXdrX2NyIiA9ICJhJHthY19jcn1iIjsgdGhlbgorICBhY19jc19hd2tfY3I9J1xccicKK2Vsc2UKKyAgYWNfY3NfYXdrX2NyPSRhY19jcgorZmkKKworZWNobyAnQkVHSU4geycgPiIkYWNfdG1wL3N1YnMxLmF3ayIgJiYKK19BQ0VPRgorCisKK3sKKyAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKyAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgorICBlY2hvICJfQUNFT0YiCit9ID5jb25mJCRzdWJzLnNoIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKK2FjX2RlbGltX251bT1gZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgZ3JlcCAtYyAnXidgCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCisgIC4gLi9jb25mJCRzdWJzLnNoIHx8CisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCisgIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorcm0gLWYgY29uZiQkc3Vicy5zaAorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKK19BQ0VPRgorc2VkIC1uICcKK2gKK3MvXi9TWyIvOyBzLyEuKi8iXT0vCitwCitnCitzL15bXiFdKiEvLworOnJlcGwKK3QgcmVwbAorcy8nIiRhY19kZWxpbSInJC8vCit0IGRlbGltCis6bmwKK2gKK3MvXCguXHsxNDhcfVwpLi4qL1wxLwordCBtb3JlMQorcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworcAorbgorYiByZXBsCis6bW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBubAorOmRlbGltCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvCitwCitiCis6bW9yZTIKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KK3AKK2cKK3MvLlx7MTQ4XH0vLwordCBkZWxpbQorJyA8Y29uZiQkc3Vicy5hd2sgfCBzZWQgJworL15bXiIiXS97CisgIE4KKyAgcy9cbi8vCit9CisnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCitybSAtZiBjb25mJCRzdWJzLmF3aworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitfQUNBV0sKK2NhdCA+PiJcJGFjX3RtcC9zdWJzMS5hd2siIDw8X0FDQVdLICYmCisgIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCisKK30KK3sKKyAgbGluZSA9ICQgMAorICBuZmllbGRzID0gc3BsaXQobGluZSwgZmllbGQsICJAIikKKyAgc3Vic3RlZCA9IDAKKyAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQorICBmb3IgKGkgPSAyOyBpIDwgbmZpZWxkczsgaSsrKSB7CisgICAga2V5ID0gZmllbGRbaV0KKyAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQorICAgIGlmIChTX2lzX3NldFtrZXldKSB7CisgICAgICB2YWx1ZSA9IFNba2V5XQorICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQorICAgICAgbGVuICs9IGxlbmd0aCh2YWx1ZSkgKyBsZW5ndGgoZmllbGRbKytpXSkKKyAgICAgIHN1YnN0ZWQgPSAxCisgICAgfSBlbHNlCisgICAgICBsZW4gKz0gMSArIGtleWxlbgorICB9CisKKyAgcHJpbnQgbGluZQorfQorCitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQoraWYgc2VkICJzLyRhY19jci8vIiA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCitlbHNlCisgIGNhdAorZmkgPCAiJGFjX3RtcC9zdWJzMS5hd2siID4gIiRhY190bXAvc3Vicy5hd2siIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorX0FDRU9GCisKKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgc29sZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZW50cmllcyBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorIyAoYWN0dWFsbHkgd2UgbGVhdmUgYW4gZW1wdHkgbGluZSB0byBwcmVzZXJ2ZSBsaW5lIG51bWJlcnMpLgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPVsJIF0qL3sKK2gKK3MvLy8KK3MvXi86Lworcy9bCSBdKiQvOi8KK3MvOlwkKHNyY2Rpcik6LzovZworcy86XCR7c3JjZGlyfTovOi9nCitzLzpAc3JjZGlyQDovOi9nCitzL146Ki8vCitzLzoqJC8vCit4CitzL1woPVsJIF0qXCkuKi9cMS8KK0cKK3MvXG4vLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgorIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCitpZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCitjYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKK0JFR0lOIHsKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworIyBoZXJlLWRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bworIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorCisjIENyZWF0ZSBhIGRlbGltaXRlciBzdHJpbmcgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBjb25mZGVmcy5oLCB0byBlYXNlCisjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCithY19kZWxpbT0nJSFfISMgJworZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIDo7IGRvCisgIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKKyAgaWYgdGVzdCAteiAiJGFjX3R0IjsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCisgIGZpCitkb25lCisKKyMgRm9yIHRoZSBhd2sgc2NyaXB0LCBEIGlzIGFuIGFycmF5IG9mIG1hY3JvIHZhbHVlcyBrZXllZCBieSBuYW1lLAorIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCisjIG5ld2xpbmUgc2VxdWVuY2VzLgorCithY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorc2VkIC1uICcKK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCByc2V0Cis6cnNldAorcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KK3QgZGVmCitkCis6ZGVmCitzL1xcJC8vCit0IGJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzIi9wCitzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcAorZAorOmJzbmwKK3MvWyJcXF0vXFwmL2cKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCit0IGNvbnQKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCit0IGNvbnQKK2QKKzpjb250CituCitzLy5cezE0OFx9LyYnIiRhY19kZWxpbSInL2cKK3QgY2xlYXIKKzpjbGVhcgorcy9cXCQvLwordCBic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCitkCis6YnNubGMKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAorYiBjb250CisnIDxjb25mZGVmcy5oIHwgc2VkICcKK3MvJyIkYWNfZGVsaW0iJy8iXFxcCisiL2cnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBmb3IgKGtleSBpbiBEKSBEX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorfQorL15bXHQgXSojW1x0IF0qKGRlZmluZXx1bmRlZilbXHQgXSskYWNfd29yZF9yZShbXHQgKF18XCQpLyB7CisgIGxpbmUgPSBcJCAwCisgIHNwbGl0KGxpbmUsIGFyZywgIiAiKQorICBpZiAoYXJnWzFdID09ICIjIikgeworICAgIGRlZnVuZGVmID0gYXJnWzJdCisgICAgbWFjMSA9IGFyZ1szXQorICB9IGVsc2UgeworICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKKyAgICBtYWMxID0gYXJnWzJdCisgIH0KKyAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQorICBtYWNybyA9IG1hYzJbMV0KKyAgcHJlZml4ID0gc3Vic3RyKGxpbmUsIDEsIGluZGV4KGxpbmUsIGRlZnVuZGVmKSAtIDEpCisgIGlmIChEX2lzX3NldFttYWNyb10pIHsKKyAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgorICAgIHByaW50IHByZWZpeCAiZGVmaW5lIiwgbWFjcm8gUFttYWNyb10gRFttYWNyb10KKyAgICBuZXh0CisgIH0gZWxzZSB7CisgICAgIyBSZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvciBleGFtcGxlLAorICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKyAgICBpZiAoZGVmdW5kZWYgPT0gInVuZGVmIikgeworICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgorICAgICAgbmV4dAorICAgIH0KKyAgfQorfQoreyBwcmludCB9CitfQUNBV0sKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgorCisKK2V2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgIDpDICRDT05GSUdfQ09NTUFORFMiCitzaGlmdAorZm9yIGFjX3RhZworZG8KKyAgY2FzZSAkYWNfdGFnIGluCisgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworICBlc2FjCisgIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCisgIDpbRkhMXSo6Kik7OworICA6TCogfCA6Qyo6KikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdGFnIFxgJGFjX3RhZyciICIkTElORU5PIiA1OzsKKyAgOltGSF0tKSBhY190YWc9LTotOzsKKyAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKyAgZXNhYworICBhY19zYXZlX0lGUz0kSUZTCisgIElGUz06CisgIHNldCB4ICRhY190YWcKKyAgSUZTPSRhY19zYXZlX0lGUworICBzaGlmdAorICBhY19maWxlPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6TCkgYWNfc291cmNlPSQxOzsKKyAgOltGSF0pCisgICAgYWNfZmlsZV9pbnB1dHM9CisgICAgZm9yIGFjX2YKKyAgICBkbworICAgICAgY2FzZSAkYWNfZiBpbgorICAgICAgLSkgYWNfZj0iJGFjX3RtcC9zdGRpbiI7OworICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKwkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCisJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisJIHRlc3QgLWYgIiRhY19mIiB8fAorCSAgIGNhc2UgJGFjX2YgaW4KKwkgICBbXFwvJF0qKSBmYWxzZTs7CisJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworCSAgIGVzYWMgfHwKKwkgICBhc19mbl9lcnJvciAxICJjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBcYCRhY19mJyIgIiRMSU5FTk8iIDU7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYworICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworCWAnIGJ5IGNvbmZpZ3VyZS4nCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKyAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKKyAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAorICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworICAgIGVzYWMKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkYWNfdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworCisgIGFjX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhY19maWxlIiB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisgIGVzYWMKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCisjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KK2FjX2RhdGFyb290ZGlyX2hhY2s9OyBhY19kYXRhcm9vdGRpcl9zZWVuPQorYWNfc2VkX2RhdGFyb290PScKKy9kYXRhcm9vdGRpci8geworICBwCisgIHEKK30KKy9AZGF0YWRpckAvcAorL0Bkb2NkaXJAL3AKKy9AaW5mb2RpckAvcAorL0Bsb2NhbGVkaXJAL3AKKy9AbWFuZGlyQC9wJworY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OworKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJGFjX2ZpbGVfaW5wdXRzIHNlZW1zIHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCisgIHMmQGRvY2RpckAmJGRvY2RpciZnCisgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKKyAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKKyAgcyZcXFwke2RhdGFyb290ZGlyfSYkZGF0YXJvb3RkaXImZycgOzsKK2VzYWMKK19BQ0VPRgorCisjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKyMgRklYTUU6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1haW50YWluIHRoaXMgZmVhdHVyZT8KK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorcyZAdG9wX2J1aWxkZGlyQCYkYWNfdG9wX2J1aWxkZGlyX3N1YiY7dCB0CitzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CitzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorcyZAYWJzX3NyY2RpckAmJGFjX2Fic19zcmNkaXImO3QgdAorcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0CitzJkBidWlsZGRpckAmJGFjX2J1aWxkZGlyJjt0IHQKK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CitzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0CitzJkBJTlNUQUxMQCYkYWNfSU5TVEFMTCY7dCB0CiskYWNfZGF0YXJvb3RkaXJfaGFjaworIgorZXZhbCBzZWQgXCJcJGFjX3NlZF9leHRyYVwiICIkYWNfZmlsZV9pbnB1dHMiIHwgJEFXSyAtZiAiJGFjX3RtcC9zdWJzLmF3ayIgXAorICA+JGFjX3RtcC9vdXQgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisKK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnIFwKKyAgICAgICIkYWNfdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkIiA+JjI7fQorCisgIHJtIC1mICIkYWNfdG1wL3N0ZGluIgorICBjYXNlICRhY19maWxlIGluCisgIC0pIGNhdCAiJGFjX3RtcC9vdXQiICYmIHJtIC1mICIkYWNfdG1wL291dCI7OworICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CisgIGVzYWMgXAorICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUKKyA7OworICA6SCkKKyAgIworICAjIENPTkZJR19IRUFERVIKKyAgIworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgeworICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCisgICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKyAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAorICAgICAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBybSAtZiAiJGFjX2ZpbGUiCisgICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCisJfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlIC0iICIkTElORU5PIiA1CisgIGZpCisjIENvbXB1dGUgIiRhY19maWxlIidzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICIkYWNfZmlsZSIgfCAiJGFjX2ZpbGUiOiogKQorICAgICAgYnJlYWsgOzsKKyAgICAqICkKKyAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKKyAgZXNhYworZG9uZQorZWNobyAidGltZXN0YW1wIGZvciAiJGFjX2ZpbGUiIiA+YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgL3N0YW1wLWgkX2FtX3N0YW1wX2NvdW50CisgOzsKKworICA6QykgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXhlY3V0aW5nICRhY19maWxlIGNvbW1hbmRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KKyA7OworICBlc2FjCisKKworICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KKyAgICAiZGVwZmlsZXMiOkMpIHRlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IGZvciBtZiBpbiAkQ09ORklHX0ZJTEVTOyBkbworICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICBtZj1gZWNobyAiJG1mIiB8IHNlZCAtZSAncy86LiokLy8nYAorICAjIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhbiBBdXRvbWFrZSBnZW5lcmF0ZWQgTWFrZWZpbGUgb3Igbm90LgorICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0CisgICMgc29tZSBwZW9wbGUgcmVuYW1lIHRoZW07IHNvIGluc3RlYWQgd2UgbG9vayBhdCB0aGUgZmlsZSBjb250ZW50LgorICAjIEdyZXAnaW5nIHRoZSBmaXJzdCBsaW5lIGlzIG5vdCBlbm91Z2g6IHNvbWUgcGVvcGxlIHBvc3QtcHJvY2VzcworICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAjIFNvIGxldCdzIGdyZXAgd2hvbGUgZmlsZS4KKyAgaWYgZ3JlcCAnXiMuKmdlbmVyYXRlZCBieSBhdXRvbWFrZScgJG1mID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBkaXJwYXJ0PWAkYXNfZGlybmFtZSAtLSAiJG1mIiB8fAorJGFzX2V4cHIgWCIkbWYiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRtZiIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkbWYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBlbHNlCisgICAgY29udGludWUKKyAgZmkKKyAgIyBFeHRyYWN0IHRoZSBkZWZpbml0aW9uIG9mIERFUERJUiwgYW1fX2luY2x1ZGUsIGFuZCBhbV9fcXVvdGUKKyAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgorICBERVBESVI9YHNlZCAtbiAncy9eREVQRElSID0gLy9wJyA8ICIkbWYiYAorICB0ZXN0IC16ICIkREVQRElSIiAmJiBjb250aW51ZQorICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgdGVzdCAteiAiYW1fX2luY2x1ZGUiICYmIGNvbnRpbnVlCisgIGFtX19xdW90ZT1gc2VkIC1uICdzL15hbV9fcXVvdGUgPSAvL3AnIDwgIiRtZiJgCisgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0CisgIFU9YHNlZCAtbiAncy9eVSA9IC8vcCcgPCAiJG1mImAKKyAgIyBGaW5kIGFsbCBkZXBlbmRlbmN5IG91dHB1dCBmaWxlcywgdGhleSBhcmUgaW5jbHVkZWQgZmlsZXMgd2l0aAorICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKKyAgIyBzaW1wbGVzdCBhcHByb2FjaCB0byBjaGFuZ2luZyAkKERFUERJUikgdG8gaXRzIGFjdHVhbCB2YWx1ZSBpbiB0aGUKKyAgIyBleHBhbnNpb24uCisgIGZvciBmaWxlIGluIGBzZWQgLW4gIgorICAgIHMvXiRhbV9faW5jbHVkZSAkYW1fX3F1b3RlXCguKihERVBESVIpLipcKSRhbV9fcXVvdGUiJyQvXDEvcCcgPCIkbWYiIHwgXAorICAgICAgIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbworICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLgorICAgIHRlc3QgLWYgIiRkaXJwYXJ0LyRmaWxlIiAmJiBjb250aW51ZQorICAgIGZkaXI9YCRhc19kaXJuYW1lIC0tICIkZmlsZSIgfHwKKyRhc19leHByIFgiJGZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgYXNfZGlyPSRkaXJwYXJ0LyRmZGlyOyBhc19mbl9ta2Rpcl9wCisgICAgIyBlY2hvICJjcmVhdGluZyAkZGlycGFydC8kZmlsZSIKKyAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKKyAgZG9uZQorZG9uZQorIDs7CisgICAgIiRhY19zdGRpbnRfaCI6QykKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJGFjX3N0ZGludF9oIDogJF9hY19zdGRpbnRfaCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oIiA+JjY7fQorYWNfc3RkaW50PSR0bXAvX3N0ZGludC5oCisKK2VjaG8gIiNpZm5kZWYiICRfYWNfc3RkaW50X2ggPiRhY19zdGRpbnQKK2VjaG8gIiNkZWZpbmUiICRfYWNfc3RkaW50X2ggIjEiID4+JGFjX3N0ZGludAorZWNobyAiI2lmbmRlZiIgX0dFTkVSQVRFRF9TVERJTlRfSCA+PiRhY19zdGRpbnQKK2VjaG8gIiNkZWZpbmUiIF9HRU5FUkFURURfU1RESU5UX0ggJyInJFBBQ0tBR0UgJFZFUlNJT04nIicgPj4kYWNfc3RkaW50CitlY2hvICIvKiBnZW5lcmF0ZWQgJGFjX2N2X3N0ZGludF9tZXNzYWdlICovIiA+PiRhY19zdGRpbnQKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF90IiAhPSAiXyIgOyB0aGVuCitlY2hvICIjZGVmaW5lIF9TVERJTlRfSEFWRV9TVERJTlRfSCIgIjEiID4+JGFjX3N0ZGludAorZWNobyAiI2luY2x1ZGUgPHN0ZGludC5oPiIgPj4kYWNfc3RkaW50CitlY2hvICIjZW5kaWYiID4+JGFjX3N0ZGludAorZWNobyAiI2VuZGlmIiA+PiRhY19zdGRpbnQKK2Vsc2UKKworY2F0ID4+JGFjX3N0ZGludCA8PFNURElOVF9FT0YKKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLiBzaG9ydGNpcmN1aXQgcGFydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSCB8fCBkZWZpbmVkIF9TVERJTlRfSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4gY29uZmlndXJlZCBwYXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworU1RESU5UX0VPRgorCitlY2hvICIvKiB3aGV0aGVyIHdlIGhhdmUgYSBDOTkgY29tcGF0aWJsZSBzdGRpbnQgaGVhZGVyIGZpbGUgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3giICE9ICJfIiA7IHRoZW4KKyAgYWNfaGVhZGVyPSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgorICBlY2hvICIjZGVmaW5lIF9TVERJTlRfSEVBREVSX0lOVFBUUiIgJyInIiRhY19oZWFkZXIiJyInID4+JGFjX3N0ZGludAorZWxzZQorICBlY2hvICIvKiAjdW5kZWYgX1NURElOVF9IRUFERVJfSU5UUFRSICovIiA+PiRhY19zdGRpbnQKK2ZpCisKK2VjaG8gIi8qIHdoZXRoZXIgd2UgaGF2ZSBhIEM5NiBjb21wYXRpYmxlIGludHR5cGVzIGhlYWRlciBmaWxlICovIiA+PiRhY19zdGRpbnQKK2lmICB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgIT0gIl8iIDsgdGhlbgorICBhY19oZWFkZXI9IiRhY19jdl9oZWFkZXJfc3RkaW50X28iCisgIGVjaG8gIiNkZWZpbmUgX1NURElOVF9IRUFERVJfVUlOVDMyIiAnIiciJGFjX2hlYWRlciInIicgPj4kYWNfc3RkaW50CitlbHNlCisgIGVjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hFQURFUl9VSU5UMzIgKi8iID4+JGFjX3N0ZGludAorZmkKKworZWNobyAiLyogd2hldGhlciB3ZSBoYXZlIGEgQlNEIGNvbXBhdGlibGUgaW5ldCB0eXBlcyBoZWFkZXIgKi8iID4+JGFjX3N0ZGludAoraWYgIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF91IiAhPSAiXyIgOyB0aGVuCisgIGFjX2hlYWRlcj0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIKKyAgZWNobyAiI2RlZmluZSBfU1RESU5UX0hFQURFUl9VX0lOVDMyIiAnIiciJGFjX2hlYWRlciInIicgPj4kYWNfc3RkaW50CitlbHNlCisgIGVjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hFQURFUl9VX0lOVDMyICovIiA+PiRhY19zdGRpbnQKK2ZpCisKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKK2lmIHRlc3QgIl8kYWNfaGVhZGVyIiAhPSAiXyIgOyB0aGVuIGlmIHRlc3QgIiRhY19oZWFkZXIiICE9ICJzdGRkZWYuaCIgOyB0aGVuCisgIGVjaG8gIiNpbmNsdWRlIDwkYWNfaGVhZGVyPiIgPj4kYWNfc3RkaW50CisgIGVjaG8gIiIgPj4kYWNfc3RkaW50CitmaSBmaQorCitlY2hvICIvKiB3aGljaCA2NGJpdCB0eXBlZGVmIGhhcyBiZWVuIGZvdW5kICovIiA+PiRhY19zdGRpbnQKK2lmIHRlc3QgIiRhY19jdl90eXBlX3VpbnQ2NF90IiA9ICJ5ZXMiIDsgdGhlbgorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfSEFWRV9VSU5UNjRfVCIgIjEiICA+PiRhY19zdGRpbnQKK2Vsc2UKK2VjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hBVkVfVUlOVDY0X1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2lmIHRlc3QgIiRhY19jdl90eXBlX3VfaW50NjRfdCIgPSAieWVzIiA7IHRoZW4KK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0hBVkVfVV9JTlQ2NF9UIiAiMSIgID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9VX0lOVDY0X1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKK2VjaG8gIi8qIHdoaWNoIHR5cGUgbW9kZWwgaGFzIGJlZW4gZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiXyRhY19jdl9jaGFyX2RhdGFfbW9kZWwiICE9ICJfIiA7IHRoZW4KK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0NIQVJfTU9ERUwiICIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsIiA+PiRhY19zdGRpbnQKK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0xPTkdfTU9ERUwiICIkYWNfY3ZfbG9uZ19kYXRhX21vZGVsIiA+PiRhY19zdGRpbnQKK2Vsc2UKK2VjaG8gIi8qICN1bmRlZiBfU1RESU5UX0NIQVJfTU9ERUwgLy8gc2tpcHBlZCAqLyIgPj4kYWNfc3RkaW50CitlY2hvICIvKiAjdW5kZWYgX1NURElOVF9MT05HX01PREVMIC8vIHNraXBwZWQgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKK2VjaG8gIi8qIHdoZXRoZXIgaW50X2xlYXN0IHR5cGVzIHdlcmUgZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSAieWVzIjsgdGhlbgorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfSEFWRV9JTlRfTEVBU1QzMl9UIiAiMSIgID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9JTlRfTEVBU1QzMl9UICovIiA+PiRhY19zdGRpbnQKK2ZpCitlY2hvICIvKiB3aGV0aGVyIGludF9mYXN0IHR5cGVzIHdlcmUgZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2Zhc3QzMl90IiA9ICJ5ZXMiOyB0aGVuCitlY2hvICIjZGVmaW5lICAgX1NURElOVF9IQVZFX0lOVF9GQVNUMzJfVCIgIjEiID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9JTlRfRkFTVDMyX1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIi8qIHdoZXRoZXIgaW50bWF4X3QgdHlwZSB3YXMgZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50bWF4X3QiID0gInllcyI7IHRoZW4KK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0hBVkVfSU5UTUFYX1QiICIxIiA+PiRhY19zdGRpbnQKK2Vsc2UKK2VjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hBVkVfSU5UTUFYX1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKKyAgY2F0ID4+JGFjX3N0ZGludCA8PFNURElOVF9FT0YKKy8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uIGRldGVjdGlvbnMgcGFydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKy8qIHdoZXRoZXIgd2UgbmVlZCB0byBkZWZpbmUgYml0c3BlY2lmaWMgdHlwZXMgZnJvbSBjb21waWxlciBiYXNlIHR5cGVzICovCisjaWZuZGVmIF9TVERJTlRfSEVBREVSX0lOVFBUUgorI2lmbmRlZiBfU1RESU5UX0hFQURFUl9VSU5UMzIKKyNpZm5kZWYgX1NURElOVF9IRUFERVJfVV9JTlQzMgorI2RlZmluZSBfU1RESU5UX05FRURfSU5UX01PREVMX1QKKyNlbHNlCisjZGVmaW5lIF9TVERJTlRfSEFWRV9VX0lOVF9UWVBFUworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX1NURElOVF9IQVZFX1VfSU5UX1RZUEVTCisjdW5kZWYgX1NURElOVF9ORUVEX0lOVF9NT0RFTF9UCisjZW5kaWYKKworI2lmZGVmICBfU1RESU5UX0NIQVJfTU9ERUwKKyNpZiAgICAgX1NURElOVF9DSEFSX01PREVMKzAgPT0gMTIyIHx8IF9TVERJTlRfQ0hBUl9NT0RFTCswID09IDEyNAorI2lmbmRlZiBfU1RESU5UX0JZVEVfTU9ERUwKKyNkZWZpbmUgX1NURElOVF9CWVRFX01PREVMIDEyCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1NURElOVF9IQVZFX0lOVF9MRUFTVDMyX1QKKyNkZWZpbmUgX1NURElOVF9ORUVEX0lOVF9MRUFTVF9UCisjZW5kaWYKKworI2lmbmRlZiBfU1RESU5UX0hBVkVfSU5UX0ZBU1QzMl9UCisjZGVmaW5lIF9TVERJTlRfTkVFRF9JTlRfRkFTVF9UCisjZW5kaWYKKworI2lmbmRlZiBfU1RESU5UX0hFQURFUl9JTlRQVFIKKyNkZWZpbmUgX1NURElOVF9ORUVEX0lOVFBUUl9UCisjaWZuZGVmIF9TVERJTlRfSEFWRV9JTlRNQVhfVAorI2RlZmluZSBfU1RESU5UX05FRURfSU5UTUFYX1QKKyNlbmRpZgorI2VuZGlmCisKKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4gZGVmaW5pdGlvbiBwYXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworLyogc29tZSBzeXN0ZW0gaGVhZGVycyBoYXZlIGdvb2QgdWludDY0X3QgKi8KKyNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKKyNpZiAgICAgZGVmaW5lZCBfU1RESU5UX0hBVkVfVUlOVDY0X1QgIHx8IGRlZmluZWQgSEFWRV9VSU5UNjRfVAorI2RlZmluZSBfSEFWRV9VSU5UNjRfVAorI2VsaWYgICBkZWZpbmVkIF9TVERJTlRfSEFWRV9VX0lOVDY0X1QgfHwgZGVmaW5lZCBIQVZFX1VfSU5UNjRfVAorI2RlZmluZSBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCisvKiAuLiBoZXJlIGFyZSBzb21lIGNvbW1vbiBoZXVyaXN0aWNzIHVzaW5nIGNvbXBpbGVyIHJ1bnRpbWUgc3BlY2lmaWNzICovCisjaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCisjZGVmaW5lIF9IQVZFX0xPTkdMT05HX1VJTlQ2NF9UCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisKKyNlbGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXworI2lmIGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX1dBVENPTUNfXyB8fCBkZWZpbmVkIF9fQk9STEFORENfXworI2RlZmluZSBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiBfX2ludDY0IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7CisKKyNlbGlmIGRlZmluZWQgX19HTlVDX18gfHwgZGVmaW5lZCBfX01XRVJLU19fIHx8IGRlZmluZWQgX19FTEZfXworLyogbm90ZTogYWxsIEVMRi1zeXN0ZW1zIHNlZW0gdG8gaGF2ZSBsb2ZmLXN1cHBvcnQgd2hpY2ggbmVlZHMgNjQtYml0ICovCisjaWYgIWRlZmluZWQgX05PX0xPTkdMT05HCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCisjZGVmaW5lIF9IQVZFX0xPTkdMT05HX1VJTlQ2NF9UCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisjZW5kaWYKKworI2VsaWYgZGVmaW5lZCBfX2FscGhhIHx8IChkZWZpbmVkIF9fbWlwcyAmJiBkZWZpbmVkIF9BQklOMzIpCisjaWYgIWRlZmluZWQgX05PX0xPTkdMT05HCit0eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKKyNlbmRpZgorICAvKiBjb21waWxlci9jcHUgdHlwZSB0byBkZWZpbmUgaW50NjRfdCAqLworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfU1RESU5UX0hBVkVfVV9JTlRfVFlQRVMKKy8qIGludDhfdCBpbnQxNl90IGludDMyX3QgZGVmaW5lZCBieSBpbmV0IGNvZGUsIHJlZGVjbGFyZSB0aGUgdV9pbnRYWCB0eXBlcyAqLwordHlwZWRlZiB1X2ludDhfdCB1aW50OF90OwordHlwZWRlZiB1X2ludDE2X3QgdWludDE2X3Q7Cit0eXBlZGVmIHVfaW50MzJfdCB1aW50MzJfdDsKKworLyogZ2xpYmMgY29tcGF0aWJpbGl0eSAqLworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfU1RESU5UX05FRURfSU5UX01PREVMX1QKKy8qIHdlIG11c3QgZ3Vlc3MgYWxsIHRoZSBiYXNpYyB0eXBlcy4gQXBhcnQgZnJvbSBieXRlLWFkcmVzc2FibGUgc3lzdGVtLCAqLworLyogdGhlcmUgYSBmZXcgMzItYml0LW9ubHkgZHNwLXN5c3RlbXMgdGhhdCB3ZSBndWFyZCB3aXRoIEJZVEVfTU9ERUwgOC19ICovCisvKiAoYnR3LCB0aG9zZSBuaWJibGUtYWRkcmVzc2FibGUgc3lzdGVtcyBhcmUgd2F5IG9mZiwgb3Igc28gd2UgYXNzdW1lKSAqLworCisKKyNpZiBkZWZpbmVkIF9TVERJTlRfQllURV9NT0RFTAorI2lmIF9TVERJTlRfTE9OR19NT0RFTCswID09IDI0MgorLyogMjo0OjIgPSAgSVAxNiA9IGEgbm9ybWFsIDE2LWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVpbnQzMl90OworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Cit0eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKK3R5cGVkZWYgICAgICAgICAgbG9uZyAgICBpbnQzMl90OworI2VuZGlmCisjZWxpZiBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSAyNDQgfHwgX1NURElOVF9MT05HX01PREVMID09IDQ0NAorLyogMjo0OjQgPSAgTFAzMiA9IGEgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQgKi8KKy8qIDQ6NDo0ID0gSUxQMzIgPSBhIG5vcm1hbCAzMi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKKyNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAorI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCit0eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwordHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Cit0eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKKyNlbmRpZgorI2VsaWYgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDg0IHx8IF9TVERJTlRfTE9OR19NT0RFTCswID09IDQ4OAorLyogNDo4OjQgPSAgSVAzMiA9IGEgMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0ICAgICovCisvKiA0Ojg6OCA9ICBMUDY0ID0gYSBub3JtYWwgNjQtYml0IHN5c3RlbSAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Cit0eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKK3R5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OworI2VuZGlmCisvKiB0aGlzIHN5c3RlbSBoYXMgYSAibG9uZyIgb2YgNjRiaXQgKi8KKyNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKKyNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVpbnQ2NF90OwordHlwZWRlZiAgICAgICAgICBsb25nICAgIGludDY0X3Q7CisjZW5kaWYKKyNlbGlmIF9TVERJTlRfTE9OR19NT0RFTCswID09IDQ0OAorLyogICAgICBMTFA2NCAgIGEgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQgc3lzdGVtICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKKyNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAorI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCit0eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwordHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Cit0eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKKyNlbmRpZgorLyogYXNzdW1pbmcgdGhlIHN5c3RlbSBoYXMgYSAibG9uZyBsb25nIiAqLworI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAorI2RlZmluZSBfSEFWRV9VSU5UNjRfVAorI2RlZmluZSBfSEFWRV9MT05HTE9OR19VSU5UNjRfVAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Cit0eXBlZGVmICAgICAgICAgIGxvbmcgbG9uZyAgaW50NjRfdDsKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX1NURElOVF9OT19JTlQzMl9UCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9TVERJTlRfTk9fSU5UOF9UCisjZGVmaW5lIF9TVERJTlRfTk9fSU5UMzJfVAorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHF1b3RlIGZyb20gU3VuT1MtNS44IHN5cy9pbnR0eXBlcy5oOgorICogVXNlIGF0IHlvdXIgb3duIHJpc2suICBBcyBvZiBGZWJydWFyeSAxOTk2LCB0aGUgY29tbWl0dGVlIGlzIHNxdWFyZWx5CisgKiBiZWhpbmQgdGhlIGZpeGVkIHNpemVkIHR5cGVzOyB0aGUgImxlYXN0IiBhbmQgImZhc3QiIHR5cGVzIGFyZSBzdGlsbCBiZWluZworICogZGlzY3Vzc2VkLiAgVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlICJmYXN0IiB0eXBlcyBtYXkgYmUgcmVtb3ZlZCBiZWZvcmUKKyAqIHRoZSBzdGFuZGFyZCBpcyBmaW5hbGl6ZWQgaXMgaGlnaCBlbm91Z2ggdGhhdCB0aGV5IGFyZSBub3QgY3VycmVudGx5CisgKiBpbXBsZW1lbnRlZC4KKyAqLworCisjaWYgZGVmaW5lZCBfU1RESU5UX05FRURfSU5UX0xFQVNUX1QKK3R5cGVkZWYgIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmICBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgIGludDMyX3QgICBpbnRfbGVhc3QzMl90OworI2lmZGVmIF9IQVZFX1VJTlQ2NF9UCit0eXBlZGVmICBpbnQ2NF90ICAgaW50X2xlYXN0NjRfdDsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQ4X3QgICB1aW50X2xlYXN0OF90OwordHlwZWRlZiB1aW50MTZfdCAgdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVpbnQzMl90ICB1aW50X2xlYXN0MzJfdDsKKyNpZmRlZiBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiB1aW50NjRfdCAgdWludF9sZWFzdDY0X3Q7CisjZW5kaWYKKyAgLyogbGVhc3QgdHlwZXMgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfU1RESU5UX05FRURfSU5UX0ZBU1RfVAordHlwZWRlZiAgaW50OF90ICAgIGludF9mYXN0OF90OwordHlwZWRlZiAgaW50ICAgICAgIGludF9mYXN0MTZfdDsKK3R5cGVkZWYgIGludDMyX3QgICBpbnRfZmFzdDMyX3Q7CisjaWZkZWYgX0hBVkVfVUlOVDY0X1QKK3R5cGVkZWYgIGludDY0X3QgICBpbnRfZmFzdDY0X3Q7CisjZW5kaWYKKwordHlwZWRlZiB1aW50OF90ICAgdWludF9mYXN0OF90OwordHlwZWRlZiB1bnNpZ25lZCAgdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDMyX3Q7CisjaWZkZWYgX0hBVkVfVUlOVDY0X1QKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7CisjZW5kaWYKKyAgLyogZmFzdCB0eXBlcyAqLworI2VuZGlmCisKKyNpZmRlZiBfU1RESU5UX05FRURfSU5UTUFYX1QKKyNpZmRlZiBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiAgaW50NjRfdCAgICAgICBpbnRtYXhfdDsKK3R5cGVkZWYgdWludDY0X3QgICAgICB1aW50bWF4X3Q7CisjZWxzZQordHlwZWRlZiAgICAgICAgICBsb25nICBpbnRtYXhfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50bWF4X3Q7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX1NURElOVF9ORUVEX0lOVFBUUl9UCisjaWZuZGVmIF9faW50cHRyX3RfZGVmaW5lZAorI2RlZmluZSBfX2ludHB0cl90X2RlZmluZWQKKy8qIHdlIGVuY291cmFnZSB1c2luZyAibG9uZyIgdG8gc3RvcmUgcG9pbnRlciB2YWx1ZXMsIG5ldmVyIHVzZSAiaW50IiAhICovCisjaWYgICBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSAyNDIgfHwgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDg0Cit0eXBlZGVmICB1bnNpbmdlZCBpbnQgICB1aW50cHRyX3Q7Cit0eXBlZGVmICAgICAgICAgICBpbnQgICAgaW50cHRyX3Q7CisjZWxpZiBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSAyNDQgfHwgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDQ0Cit0eXBlZGVmICB1bnNpZ25lZCBsb25nICB1aW50cHRyX3Q7Cit0eXBlZGVmICAgICAgICAgICBsb25nICAgaW50cHRyX3Q7CisjZWxpZiBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSA0NDggJiYgZGVmaW5lZCBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiAgICAgICAgdWludDY0X3QgdWludHB0cl90OwordHlwZWRlZiAgICAgICAgIGludDY0X3QgIGludHB0cl90OworI2Vsc2UgLyogbWF0Y2hlcyB0eXBpY2FsIHN5c3RlbSB0eXBlcyBJTFAzMiBhbmQgTFA2NCAtIGJ1dCBub3QgSVAxNiBvciBMTFA2NCAqLwordHlwZWRlZiAgdW5zaWduZWQgbG9uZyAgdWludHB0cl90OwordHlwZWRlZiAgICAgICAgICAgbG9uZyAgIGludHB0cl90OworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgSVNPIEM5OSBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBpbiBDKysgaW1wbGVtZW50YXRpb25zIHRoZXNlCisgICBzaG91bGQgb25seSBiZSBkZWZpbmVkIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyNpZm5kZWYgVUlOVDMyX0MKKworLyogU2lnbmVkLiAgKi8KKyMgZGVmaW5lIElOVDhfQyhjKSAgICAgIGMKKyMgZGVmaW5lIElOVDE2X0MoYykgICAgIGMKKyMgZGVmaW5lIElOVDMyX0MoYykgICAgIGMKKyMgaWZkZWYgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKKyMgIGRlZmluZSBJTlQ2NF9DKGMpICAgIGMgIyMgTAorIyBlbHNlCisjICBkZWZpbmUgSU5UNjRfQyhjKSAgICBjICMjIExMCisjIGVuZGlmCisKKy8qIFVuc2lnbmVkLiAgKi8KKyMgZGVmaW5lIFVJTlQ4X0MoYykgICAgIGMgIyMgVQorIyBkZWZpbmUgVUlOVDE2X0MoYykgICAgYyAjIyBVCisjIGRlZmluZSBVSU5UMzJfQyhjKSAgICBjICMjIFUKKyMgaWZkZWYgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKKyMgIGRlZmluZSBVSU5UNjRfQyhjKSAgIGMgIyMgVUwKKyMgZWxzZQorIyAgZGVmaW5lIFVJTlQ2NF9DKGMpICAgYyAjIyBVTEwKKyMgZW5kaWYKKworLyogTWF4aW1hbCB0eXBlLiAgKi8KKyMgaWZkZWYgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKKyMgIGRlZmluZSBJTlRNQVhfQyhjKSAgIGMgIyMgTAorIyAgZGVmaW5lIFVJTlRNQVhfQyhjKSAgYyAjIyBVTAorIyBlbHNlCisjICBkZWZpbmUgSU5UTUFYX0MoYykgICBjICMjIExMCisjICBkZWZpbmUgVUlOVE1BWF9DKGMpICBjICMjIFVMTAorIyBlbmRpZgorCisgIC8qIGxpdGVyYWxudW1iZXJzICovCisjZW5kaWYKKyNlbmRpZgorCisvKiBUaGVzZSBsaW1pdHMgYXJlIG1lcmlseSB0aG9zZSBvZiBhIHR3byBjb21wbGVtZW50IGJ5dGUtb3JpZW50ZWQgc3lzdGVtICovCisKKy8qIE1pbmltdW0gb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzLiAgKi8KKyMgZGVmaW5lIElOVDhfTUlOICAgICAgICAgICAgICAgKC0xMjgpCisjIGRlZmluZSBJTlQxNl9NSU4gICAgICAgICAgICAgICgtMzI3NjctMSkKKyMgZGVmaW5lIElOVDMyX01JTiAgICAgICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjIGRlZmluZSBJTlQ2NF9NSU4gICAgICAgICAgICAgICgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4gICovCisjIGRlZmluZSBJTlQ4X01BWCAgICAgICAgICAgICAgICgxMjcpCisjIGRlZmluZSBJTlQxNl9NQVggICAgICAgICAgICAgICgzMjc2NykKKyMgZGVmaW5lIElOVDMyX01BWCAgICAgICAgICAgICAgKDIxNDc0ODM2NDcpCisjIGRlZmluZSBJTlQ2NF9NQVggICAgICAgICAgICAgIChfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgICAgICAoMjU1KQorIyBkZWZpbmUgVUlOVDE2X01BWCAgICAgICAgICAgICAoNjU1MzUpCisjIGRlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKKyMgZGVmaW5lIFVJTlQ2NF9NQVggICAgICAgICAgICAgKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisvKiBNaW5pbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgSU5UX0xFQVNUOF9NSU4gICAgICAgICBJTlQ4X01JTgorIyBkZWZpbmUgSU5UX0xFQVNUMTZfTUlOICAgICAgICBJTlQxNl9NSU4KKyMgZGVmaW5lIElOVF9MRUFTVDMyX01JTiAgICAgICAgSU5UMzJfTUlOCisjIGRlZmluZSBJTlRfTEVBU1Q2NF9NSU4gICAgICAgIElOVDY0X01JTgorLyogTWF4aW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIElOVF9MRUFTVDhfTUFYICAgICAgICAgSU5UOF9NQVgKKyMgZGVmaW5lIElOVF9MRUFTVDE2X01BWCAgICAgICAgSU5UMTZfTUFYCisjIGRlZmluZSBJTlRfTEVBU1QzMl9NQVggICAgICAgIElOVDMyX01BWAorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUFYICAgICAgICBJTlQ2NF9NQVgKKworLyogTWF4aW11bSBvZiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgVUlOVF9MRUFTVDhfTUFYICAgICAgICBVSU5UOF9NQVgKKyMgZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggICAgICAgVUlOVDE2X01BWAorIyBkZWZpbmUgVUlOVF9MRUFTVDMyX01BWCAgICAgICBVSU5UMzJfTUFYCisjIGRlZmluZSBVSU5UX0xFQVNUNjRfTUFYICAgICAgIFVJTlQ2NF9NQVgKKworICAvKiBzaG9ydGNpcmN1aXQqLworI2VuZGlmCisgIC8qIG9uY2UgKi8KKyNlbmRpZgorI2VuZGlmCitTVERJTlRfRU9GCitmaQorICAgIGlmIGNtcCAtcyAkYWNfc3RkaW50X2ggJGFjX3N0ZGludCAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfc3RkaW50X2ggaXMgdW5jaGFuZ2VkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6ICRhY19zdGRpbnRfaCBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX3N0ZGludF9oIiB8fAorJGFzX2V4cHIgWCIkYWNfc3RkaW50X2giIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX3N0ZGludF9oIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19zdGRpbnRfaCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfc3RkaW50X2giIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYWNfc3RkaW50X2giIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgYXNfZGlyPSIkYWNfZGlyIjsgYXNfZm5fbWtkaXJfcAorICAgICAgcm0gLWYgJGFjX3N0ZGludF9oCisgICAgICBtdiAkYWNfc3RkaW50ICRhY19zdGRpbnRfaAorICAgIGZpCisgOzsKKworICBlc2FjCitkb25lICMgZm9yIGFjX3RhZworCisKK2FzX2ZuX2V4aXQgMAorX0FDRU9GCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCit0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAorICBhc19mbl9lcnJvciAkPyAid3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCisjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKyMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCisjIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisjIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCisjIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgYWNfY3Nfc3VjY2Vzcz06CisgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgYXNfZm5fZXhpdCAxCitmaQoraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMjt9CitmaQorCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9jb25maWd1cmUuYWMgYi9pcGVyZi0yLjAuNS9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyMGY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDI3MiBAQAorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBjb25maWd1cmUuYWMKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9nZW4uc2ggdG8gcHJvZHVjZSBjb25maWd1cmUgZmlsZXMKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworQUNfUFJFUkVRKDIuNTkpCitBQ19JTklUKElwZXJmLDIuMC41KQorQUNfQ09ORklHX0hFQURFUihbY29uZmlnLmhdKQorQU1fSU5JVF9BVVRPTUFLRSgpCisKK200X2luY2x1ZGUoW200L2F4X2NyZWF0ZV9zdGRpbnRfaC5tNF0pCittNF9pbmNsdWRlKFttNC9kYXN0Lm00XSkKK200X2luY2x1ZGUoW200L2FjeF9wdGhyZWFkLm00XSkKKworCitBQ19BUkdfRU5BQkxFKGlwdjYsIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtaXB2Nl0sCisJICAgIFtkaXNhYmxlIGlwdjYgc3VwcG9ydCAoZGVmYXVsdCBpcyBhdXRvZGV0ZWN0KV0pLCAKKwlhY19jdl9oYXZlX2lwdjY9JGVuYWJsZV9pcHY2LCkKKworQUNfQVJHX0VOQUJMRShtdWx0aWNhc3QsIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbXVsdGljYXN0XSwKKwkgICAgW2Rpc2FibGUgbXVsdGljYXN0IHN1cHBvcnQgKGRlZmF1bHQgaXMgYXV0b2RldGVjdCldKSwKKwlhY19jdl9tdWx0aWNhc3Q9JGVuYWJsZV9tdWx0aWNhc3QsKQorCitBQ19BUkdfRU5BQkxFKHRocmVhZHMsIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdGhyZWFkc10sCisJICAgIFtkaXNhYmxlIHRocmVhZCBzdXBwb3J0IChkZWZhdWx0IGlzIGF1dG9kZXRlY3QpXSkpCisKK0FDX0FSR19FTkFCTEUoZGVidWdpbmZvLCBBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZGVidWdpbmZvXSwKKwkgICAgW2VuYWJsZSBkZWJ1Z2dpbmcgaW5mbyBmb3Igc29ja2V0cyAoZGVmYXVsdCBpcyBubyldKSwKKwllbmFibGVfZGVidWdpbmZvPSRlbmFibGV2YWwsCisJZW5hYmxlX2RlYnVnaW5mbz1ubykKKworQUNfQVJHX0VOQUJMRSh3ZWIxMDAsIEFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtd2ViMTAwXSwKKwkgICAgW2Rpc2FibGUgd2ViMTAwIHN1cHBvcnQgKGRlZmF1bHQgaXMgYXV0b2RldGVjdCldKSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIENoZWNrcyBmb3IgcHJvZ3JhbXMKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FDX1BST0dfQ1hYCitDWFhGTEFHUz1gZWNobyAiICRDWFhGTEFHUyAiIHwgc2VkIC1lICJzLyAtZyAvIC8iYCAjIGRvIG5vdCB3YW50IGl0IGltcGxpY2l0bHkKK0FDX1BST0dfQ0MKK0NGTEFHUz1gZWNobyAiICRDRkxBR1MgIiB8IHNlZCAtZSAicy8gLWcgLyAvImAgIyBkbyBub3Qgd2FudCBpdCBpbXBsaWNpdGx5CitBQ19JU0NfUE9TSVgKK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19NQUtFX1NFVAorQUNfUFJPR19SQU5MSUIKK0FDX0xBTkcoQykKK0FDX0NBTk9OSUNBTF9IT1NUCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitkbmwgY2hlY2sgZm9yIC1scHRocmVhZAorIAoraWYgdGVzdCAiJGVuYWJsZV90aHJlYWRzIiAhPSBubzsgdGhlbgorICBBQ1hfUFRIUkVBRCgpCisgICAgaWYgdGVzdCAiJGFjeF9wdGhyZWFkX29rIiA9IHllczsgdGhlbgorICAgICAgQUNfREVGSU5FKFtIQVZFX1BPU0lYX1RIUkVBRF0sIDEsKQorICAgICAgQUNfREVGSU5FKFtfUkVFTlRSQU5UXSwgMSwpCisgICAgZmkKK2ZpCisKK2RubCBjaGVjayBmb3IgLWxuc2wsIC1sc29ja2V0CitBQ19DSEVDS19GVU5DKGdldGhvc3RieW5hbWUsLEFDX0NIRUNLX0xJQihuc2wsIGdldGhvc3RieW5hbWUpKQorQUNfQ0hFQ0tfRlVOQyhzb2NrZXQsLEFDX0NIRUNLX0xJQihzb2NrZXQsIHNvY2tldCkpCisKK2RubCBDaGVja3MgZm9yIGhlYWRlciBmaWxlcy4KK0FDX0hFQURFUl9TVERDCitBQ19DSEVDS19IRUFERVJTKFthcnBhL2luZXQuaCBsaWJpbnRsLmggbmV0ZGIuaCBuZXRpbmV0L2luLmggc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHN5cy9zb2NrZXQuaCBzeXMvdGltZS5oIHN5c2xvZy5oIHVuaXN0ZC5oXSkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBQ19DX0NPTlNUCitBQ19UWVBFX1NJWkVfVAorQUNfQ0hFQ0tfVFlQRVMoc3NpemVfdCwsQUNfREVGSU5FX1VOUVVPVEVEKHNzaXplX3QsIGludCkpCitBQ19IRUFERVJfVElNRQorQUNfU1RSVUNUX1RNCisKK2RubCB0aGVzZSBpbnRYWF90IGFuZCB1X2ludFhYX3QgbmVlZCB0byBiZSBkZWZpbmVkIHRvIGJlIHRoZSByaWdodCBzaXplLgorQVhfQ1JFQVRFX1NURElOVF9IKGluY2x1ZGUvaXBlcmYtaW50LmgpCisKK0FDX0NBQ0hFX0NIRUNLKDNyZCBhcmd1bWVudCBvZiBhY2NlcHQsIGFjX2N2X2FjY2VwdF9hcmcsIFsKKyAgZG5sIFRyeSBzb2NrbGVuX3QgKFBPU0lYKQorICBEQVNUX0FDQ0VQVF9BUkcoc29ja2xlbl90KQorCisgIGRubCBUcnkgaW50IChvcmlnaW5hbCBCU0QpCisgIERBU1RfQUNDRVBUX0FSRyhpbnQpCisKKyAgZG5sIFRyeSBzaXplX3QgKG9sZGVyIHN0YW5kYXJkOyBBSVgpCisgIERBU1RfQUNDRVBUX0FSRyhzaXplX3QpCisKKyAgZG5sIFRyeSBzaG9ydCAoc2hvdWxkbid0IGJlKQorICBEQVNUX0FDQ0VQVF9BUkcoc2hvcnQpCisKKyAgZG5sIFRyeSBsb25nIChzaG91bGRuJ3QgYmUpCisgIERBU1RfQUNDRVBUX0FSRyhsb25nKQorXSkKKworaWYgdGVzdCAteiAiJGFjX2N2X2FjY2VwdF9hcmciIDsgdGhlbgorICBhY19jdl9hY2NlcHRfYXJnPWludAorZmkKKworQUNfREVGSU5FX1VOUVVPVEVEKFtTb2NrbGVuX3RdLCAkYWNfY3ZfYWNjZXB0X2FyZywgW0RlZmluZSAzcmQgYXJnIG9mIGFjY2VwdF0pCisKK2RubCBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfRlVOQ19GT1JLCitBQ19GVU5DX01BTExPQworQUNfRlVOQ19NRU1DTVAKK0FDX0ZVTkNfU0VMRUNUX0FSR1RZUEVTCitBQ19UWVBFX1NJR05BTAorQUNfRlVOQ19TVFJGVElNRQorQUNfRlVOQ19WUFJJTlRGCitBQ19DSEVDS19GVU5DUyhbYXRleGl0IGdldHRpbWVvZmRheSBtZW1zZXQgcHRocmVhZF9jYW5jZWwgc2VsZWN0IHN0cmNociBzdHJlcnJvciBzdHJ0b2wgdXNsZWVwXSkKK0FDX1JFUExBQ0VfRlVOQ1Moc25wcmludGYgaW5ldF9wdG9uIGluZXRfbnRvcCBnZXR0aW1lb2ZkYXkpCisKK2RubCAgICAgICAgICAgICBHb3R0ZW4gZnJvbSBzb21lIE5ldEJTRCBjb25maWd1cmUuaW4KK2RubAkJV2UgYXNzdW1lIHRoYXQgaWYgc3ByaW50ZigpIHN1cHBvcnRzICVsbGQgb3IgJXFkLAorZG5sCQl0aGVuIGFsbCBvZiAqcHJpbnRmKCkgZG9lcy4gSWYgbm90LCBkaXNhYmxlIGxvbmcgbG9uZworZG5sCQlzdXBwb3J0IGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gZGlzcGxheSBpdC4KKworQUhfVEVNUExBVEUoSEFWRV9RVUFEX1NVUFBPUlQpCitBSF9URU1QTEFURShIQVZFX1BSSU5URl9RRCkKKworQUNfTVNHX0NIRUNLSU5HKCpwcmludGYoKSBzdXBwb3J0IGZvciAlbGxkKQorY2FuX3ByaW50Zl9sb25nbG9uZz1ubworQUNfVFJZX1JVTihbCisgICAgICAgICNpbmNsdWRlIDxzdGRpby5oPgorICAgICAgICBpbnQgbWFpbigpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAiJWxsZCIsIDIxNzI2NTg3NTkwTEwpOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RyY21wKGJ1ZiwgIjIxNzI2NTg3NTkwIikpOworICAgICAgICB9CisgICAgICAgIF0sIFsKKyAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgIGNhbl9wcmludGZfbG9uZ2xvbmc9eWVzCisgICAgICAgIF0sIFsKKyAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgXSwgWyA6IF0pCisKK2lmIHRlc3QgJGNhbl9wcmludGZfbG9uZ2xvbmcgIT0geWVzOyB0aGVuCisgICAgICAgIEFDX01TR19DSEVDS0lORygqcHJpbnRmKCkgc3VwcG9ydCBmb3IgJXFkKQorICAgICAgICBBQ19UUllfUlVOKFsKKyAgICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICAgICAgICAgICAgICBpbnQgbWFpbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVxZCIsIDIxNzI2NTg3NTkwTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzdHJjbXAoYnVmLCAiMjE3MjY1ODc1OTAiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF0sIFsKKyAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICAgICAgICBjYW5fcHJpbnRmX2xvbmdsb25nPXllcworICAgICAgICAgICAgICAgIEFDX0RFRklORShIQVZFX1BSSU5URl9RRCwgMSkKKyAgICAgICAgICAgICAgICBdLCBbCisgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgICAgICBdLCBbIDogXSkKK2ZpCisKK2lmIHRlc3QgJGNhbl9wcmludGZfbG9uZ2xvbmcgPSB5ZXM7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FKEhBVkVfUVVBRF9TVVBQT1JULCAxKQorZmkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBDaGVjayBmb3IgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzCisKK0RBU1RfQ0hFQ0tfQk9PTAorCitBQ19DX0JJR0VORElBTgorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIENoZWNrIGZvciBzeXN0ZW0gc2VydmljZXMKKworZG5sIGNoZWNrIGZvciBtdWx0aWNhc3QKK2lmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiICE9IG5vOyB0aGVuCisgIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBpcF9tcmVxLCwsWyNpbmNsdWRlICIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisgIEFDX0NIRUNLX0RFQ0xTKElQX0FERF9NRU1CRVJTSElQLCwsWyNpbmNsdWRlICIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisgIEFDX01TR19DSEVDS0lORyhmb3IgbXVsdGljYXN0IHN1cHBvcnQpCisgIGFjX2N2X211bHRpY2FzdD1ubworICBpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX0lQX0FERF9NRU1CRVJTSElQIiA9IHllczsgdGhlbgorICAgIGlmIHRlc3QgIiRhY19jdl90eXBlX3N0cnVjdF9pcF9tcmVxIiA9IHllczsgdGhlbgorICAgICAgYWNfY3ZfbXVsdGljYXN0PXllcworICAgIGZpCisgIGZpCisgIEFDX01TR19SRVNVTFQoJGFjX2N2X211bHRpY2FzdCkKKyAgaWYgdGVzdCAiJGFjX2N2X211bHRpY2FzdCIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoW0hBVkVfTVVMVElDQVNUXSwgMSwgW0RlZmluZSB0byBlbmFibGUgbXVsdGljYXN0IHN1cHBvcnRdKQorICBmaQorZmkKKworZG5sIGNoZWNrIGZvciBJUHY2CitpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9pcHY2IiAhPSBubzsgdGhlbgorICBBQ19DSEVDS19UWVBFUyhzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSwsLFsjaW5jbHVkZSAiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaCJdKQorICBBQ19DSEVDS19UWVBFUyhzdHJ1Y3Qgc29ja2FkZHJfaW42LCwsWyNpbmNsdWRlICIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisgIEFDX0NIRUNLX0RFQ0xTKEFGX0lORVQ2LCwsWyNpbmNsdWRlICIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisgIEFDX01TR19DSEVDS0lORyhmb3IgSVB2NiBoZWFkZXJzIGFuZCBzdHJ1Y3R1cmVzKQorICBhY19jdl9oYXZlX2lwdjY9bm8KKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID0geWVzOyB0aGVuCisgICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX2luNiIgPSB5ZXM7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfQUZfSU5FVDYiID0geWVzOyB0aGVuCisgICAgICAgIEFDX0RFRklORShbSEFWRV9JUFY2XSwgMSwgW0RlZmluZSB0byBlbmFibGUgSVB2NiBzdXBwb3J0XSkKKyAgICAgICAgYWNfY3ZfaGF2ZV9pcHY2PXllcworICAgICAgZmkKKyAgICBmaQorICBmaQorICBBQ19NU0dfUkVTVUxUKCRhY19jdl9oYXZlX2lwdjYpCitmaQorCitpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9pcHY2IiA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkYWNfY3ZfbXVsdGljYXN0IiA9IHllczsgdGhlbgorICAgIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBpcHY2X21yZXEsLCxbI2luY2x1ZGUgIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmgiXSkKKyAgICBBQ19DSEVDS19ERUNMUyhJUFY2X0FERF9NRU1CRVJTSElQLCwsWyNpbmNsdWRlICIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisgICAgQUNfQ0hFQ0tfREVDTFMoSVBWNl9NVUxUSUNBU1RfSE9QUywsLFsjaW5jbHVkZSAiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaCJdKQorICAgIEFDX01TR19DSEVDS0lORyhmb3IgSVB2NiBtdWx0aWNhc3Qgc3VwcG9ydCkKKyAgICBhY19jdl9oYXZlX2lwdjZfbXVsdGljYXN0PW5vCisgICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X2lwdjZfbXJlcSIgPSB5ZXM7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfSVBWNl9BRERfTUVNQkVSU0hJUCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGVjbF9JUFY2X01VTFRJQ0FTVF9IT1BTIiA9IHllczsgdGhlbgorICAgICAgICAgIEFDX0RFRklORShbSEFWRV9JUFY2X01VTFRJQ0FTVF0sIDEsIFtEZWZpbmUgdG8gZW5hYmxlIElQdjYgbXVsdGljYXN0IHN1cHBvcnRdKQorICAgICAgICAgIGFjX2N2X2hhdmVfaXB2Nl9tdWx0aWNhc3Q9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGZpCisgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfaGF2ZV9pcHY2X211bHRpY2FzdCkKKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRlbmFibGVfZGVidWdpbmZvIiA9IHllczsgdGhlbgorQUNfREVGSU5FKFtEQkdfTUpaXSwgMSwgW0RlZmluZSBpZiBkZWJ1Z2dpbmcgaW5mbyBpcyBkZXNpcmVkXSkKK2ZpCisKK2lmIHRlc3QgIiRlbmFibGVfd2ViMTAwIiAhPSBubzsgdGhlbgoraWYgdGVzdCAtZSAiL3Byb2Mvd2ViMTAwIjsgdGhlbgoraWYgdGVzdCAtZCAiL3Byb2Mvd2ViMTAwIjsgdGhlbgoraWYgdGVzdCAtZSAiL3Byb2Mvd2ViMTAwL2hlYWRlciI7IHRoZW4KK2lmIHRlc3QgLWYgIi9wcm9jL3dlYjEwMC9oZWFkZXIiOyB0aGVuCitpZiB0ZXN0IC1yICIvcHJvYy93ZWIxMDAvaGVhZGVyIjsgdGhlbgorQU1fUEFUSF9XRUIxMDAoKQoraWYgdGVzdCAiJHdlYjEwMF9zdWNjZXNzIiA9IHllczsgdGhlbiAKK0FDX0RFRklORShbSEFWRV9XRUIxMDBdLCAxLCBbRGVmaW5lIGlmIFdlYjEwMCBpcyBkZXNpcmVkIGFuZCBhdmFpbGFibGVdKQorZmkgZmkgZmkgZmkgZmkgZmkKK2ZpCisKK2RubCBHTlUgbWFrZSBhbGxvd3MgdXMgdG8gdXNlIHRoZSAkKHN0cmlwIC4uLikgYnVpbHRpbiB3aGljaCBlbGltaW5hdGVzIGEKK2RubCBsYXJnZSBhbW91bnQgb2YgZXh0cmEgd2hpdGVzcGFjZSBpbiBjb21waWxlIGxpbmVzLgorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgbWFrZSBpcyBHTlUgbWFrZSkKK1NUUklQX0JFR0lOPQorU1RSSVBfRU5EPQoraWYgJGFjX21ha2UgLS12ZXJzaW9uIDI+IC9kZXYvbnVsbCB8IGdyZXAgJ15HTlUgTWFrZSAnID4gL2Rldi9udWxsIDsgdGhlbgorICAgIFNUUklQX0JFR0lOPSckKHN0cmlwICQoU1RSSVBfRFVNTVkpJworICAgIFNUUklQX0VORD0nKScKKyAgICBBQ19NU0dfUkVTVUxUKHllcykKK2Vsc2UKKyAgICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKKworZG5sIHNvbWUgTWFrZSAzLjc5ICQoc3RyaXAgKSB2ZXJzaW9ucyBhcmUgYnJva2VuIGFuZCByZXF1aXJlIGFuIGVtcHR5IGFyZworU1RSSVBfRFVNTVk9CitBQ19TVUJTVChTVFJJUF9EVU1NWSkKK0FDX1NVQlNUKFNUUklQX0JFR0lOKQorQUNfU1VCU1QoU1RSSVBfRU5EKQorCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlCisJCWNvbXBhdC9NYWtlZmlsZQorCQlkb2MvTWFrZWZpbGUKKwkJaW5jbHVkZS9NYWtlZmlsZQorCQlzcmMvTWFrZWZpbGUKKyAgICAgICAgICAgICAgICBtYW4vTWFrZWZpbGVdKQorQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9kZXBjb21wIGIvaXBlcmYtMi4wLjUvZGVwY29tcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZmNkNTQwCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvZGVwY29tcApAQCAtMCwwICsxLDUyOSBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAwNS0wMi0wOS4yMgorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+LgorCitjYXNlICQxIGluCisgICcnKQorICAgICBlY2hvICIkMDogTm8gY29tbWFuZC4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgICAgIGV4aXQgMTsKKyAgICAgOzsKKyAgLWggfCAtLWgqKQorICAgIGNhdCA8PFxFT0YKK1VzYWdlOiBkZXBjb21wIFstLWhlbHBdIFstLXZlcnNpb25dIFBST0dSQU0gW0FSR1NdCisKK1J1biBQUk9HUkFNUyBBUkdTIHRvIGNvbXBpbGUgYSBmaWxlLCBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcworYXMgc2lkZS1lZmZlY3RzLgorCitFbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgIGRlcG1vZGUgICAgIERlcGVuZGVuY3kgdHJhY2tpbmcgbW9kZS4KKyAgc291cmNlICAgICAgU291cmNlIGZpbGUgcmVhZCBieSBgUFJPR1JBTVMgQVJHUycuCisgIG9iamVjdCAgICAgIE9iamVjdCBmaWxlIG91dHB1dCBieSBgUFJPR1JBTVMgQVJHUycuCisgIERFUERJUiAgICAgIGRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSBkZXBlbmRlbmNpZXMuCisgIGRlcGZpbGUgICAgIERlcGVuZGVuY3kgZmlsZSB0byBvdXRwdXQuCisgIHRtcGRlcGZpbGUgIFRlbXBvcmFyeSBmaWxlIHRvIHVzZSB3aGVuIG91dHB1dGluZyBkZXBlbmRlbmNpZXMuCisgIGxpYnRvb2wgICAgIFdoZXRoZXIgbGlidG9vbCBpcyB1c2VkICh5ZXMvbm8pLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LgorRU9GCisgICAgZXhpdCAkPworICAgIDs7CisgIC12IHwgLS12KikKKyAgICBlY2hvICJkZXBjb21wICRzY3JpcHR2ZXJzaW9uIgorICAgIGV4aXQgJD8KKyAgICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KKyAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCitkZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAorICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KK3RtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9CisKK3JtIC1mICIkdG1wZGVwZmlsZSIKKworIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCisjIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAorIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQorIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCisgICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgorICBnY2NmbGFnPS1NCisgIGRlcG1vZGU9Z2NjCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KKyAgIGRhc2htZmxhZz0teE0KKyAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKK2ZpCisKK2Nhc2UgIiRkZXBtb2RlIiBpbgorZ2NjMykKKyMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0CisjIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQorIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgorICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCisjIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKKyMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCisjIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCisjIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQorIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKKyMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgorIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQorIyMgICB0aGFuIHJlbmFtaW5nKS4KKyAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCisgICAgZ2NjZmxhZz0tTUQsCisgIGZpCisgICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisjIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCisgIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAorICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCisjIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQorIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCisjIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZworIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbworIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8CisjIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKKyMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcworIyMgd2VsbC4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcworICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKKyAgICB0ciAnCisnICcgJyA+PiAkZGVwZmlsZQorICAgIGVjaG8gPj4gJGRlcGZpbGUKKworICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAorICAgPj4gJGRlcGZpbGUKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2FpeCkKKyAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcworICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQorICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCisgICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgorICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKKyAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICIkQCIgLVdjLC1NCisgIGVsc2UKKyAgICAiJEAiIC1NCisgIGZpCisgIHN0YXQ9JD8KKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgorICBlbHNlCisgICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKKyAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKKyAgZmkKKworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCisgICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCisgICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2ljYykKKyAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCisgICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYworICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jCisgICMgICAgZm9vLm86IHN1Yi9mb28uaAorICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYworICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCisgICMgICAgc3ViL2Zvby5jOgorICAjICAgIHN1Yi9mb28uaDoKKyAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKKyAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAorICAjICAgICBzdWIvZm9vLmggLi4uIFwKKyAgIyAgICAgLi4uCisKKyAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCisgICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCisgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisgICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8CisgICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKwordHJ1NjQpCisgICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCisgICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCisgICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0CisgICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KKyAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KKyAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCisgICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKworICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGggVHJ1NjQgY2MsIHNoYXJlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbWFrZSBhCisgICAgICAjIHN0YXRpYyBsaWJyYXJ5LiAgVGhpcyBtZWNhbmlzbSBpcyB1c2VkIGluIGxpYnRvb2wgMS40IHNlcmllcyB0bworICAgICAgIyBoYW5kbGUgYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJpZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24uCisgICAgICAjIFdpdGggbGlidG9vbCAxLjQsIGRlcGVuZGVuY2llcyB3ZXJlIG91dHB1dCBpbiAkZGlyLmxpYnMvJGJhc2UubG8uZC4KKyAgICAgICMKKyAgICAgICMgV2l0aCBsaWJ0b29sIDEuNSB0aGlzIGV4Y2VwdGlvbiB3YXMgcmVtb3ZlZCwgYW5kIGxpYnRvb2wgbm93CisgICAgICAjIGdlbmVyYXRlcyAyIHNlcGFyYXRlIG9iamVjdHMgZm9yIHRoZSAyIGxpYnJhcmllcy4gIFRoZXNlIHR3bworICAgICAgIyBjb21waWxhdGlvbnMgb3V0cHV0IGRlcGVuZGVuY2llcyBpbiBpbiAkZGlyLmxpYnMvJGJhc2Uuby5kIGFuZAorICAgICAgIyBpbiAkZGlyJGJhc2Uuby5kLiAgV2UgaGF2ZSB0byBjaGVjayBmb3IgYm90aCBmaWxlcywgYmVjYXVzZQorICAgICAgIyBvbmUgb2YgdGhlIHR3byBjb21waWxhdGlvbnMgY2FuIGJlIGRpc2FibGVkLiAgV2Ugc2hvdWxkIHByZWZlcgorICAgICAgIyAkZGlyJGJhc2Uuby5kIG92ZXIgJGRpci5saWJzLyRiYXNlLm8uZCBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMKKyAgICAgICMgYXV0b21hdGljYWxseSBjbGVhbmVkIHdoZW4gLmxpYnMvIGlzIGRlbGV0ZWQsIHdoaWxlIGlnbm9yaW5nCisgICAgICAjIHRoZSBmb3JtZXIgd291bGQgY2F1c2UgYSBkaXN0Y2xlYW5jaGVjayBwYW5pYy4KKyAgICAgIHRtcGRlcGZpbGUxPSRkaXIubGlicy8kYmFzZS5sby5kICAgIyBsaWJ0b29sIDEuNAorICAgICAgdG1wZGVwZmlsZTI9JGRpciRiYXNlLm8uZCAgICAgICAgICAjIGxpYnRvb2wgMS41CisgICAgICB0bXBkZXBmaWxlMz0kZGlyLmxpYnMvJGJhc2Uuby5kICAgICMgbGlidG9vbCAxLjUKKyAgICAgIHRtcGRlcGZpbGU0PSRkaXIubGlicy8kYmFzZS5kICAgICAgIyBDb21wYXEgQ0NDIFY2LjItNTA0CisgICAgICAiJEAiIC1XYywtTUQKKyAgIGVsc2UKKyAgICAgIHRtcGRlcGZpbGUxPSRkaXIkYmFzZS5vLmQKKyAgICAgIHRtcGRlcGZpbGUyPSRkaXIkYmFzZS5kCisgICAgICB0bXBkZXBmaWxlMz0kZGlyJGJhc2UuZAorICAgICAgdG1wZGVwZmlsZTQ9JGRpciRiYXNlLmQKKyAgICAgICIkQCIgLU1ECisgICBmaQorCisgICBzdGF0PSQ/CisgICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgIGVsc2UKKyAgICAgIHJtIC1mICIkdG1wZGVwZmlsZTEiICIkdG1wZGVwZmlsZTIiICIkdG1wZGVwZmlsZTMiICIkdG1wZGVwZmlsZTQiCisgICAgICBleGl0ICRzdGF0CisgICBmaQorCisgICBmb3IgdG1wZGVwZmlsZSBpbiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIiAiJHRtcGRlcGZpbGU0IgorICAgZG8KKyAgICAgdGVzdCAtZiAiJHRtcGRlcGZpbGUiICYmIGJyZWFrCisgICBkb25lCisgICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4KKyAgICAgIHNlZCAtZSAicyxeLipcLlthLXpdKjosJG9iamVjdDosIiA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgICAgICAjIFRoYXQncyBhIHRhYiBhbmQgYSBzcGFjZSBpbiB0aGUgW10uCisgICAgICBzZWQgLWUgJ3MsXi4qXC5bYS16XSo6WwkgXSosLCcgLWUgJ3MsJCw6LCcgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgIGVsc2UKKyAgICAgIGVjaG8gIiNkdW1teSIgPiAiJGRlcGZpbGUiCisgICBmaQorICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgOzsKKworI25vc2lkZWVmZmVjdCkKKyAgIyBUaGlzIGNvbW1lbnQgYWJvdmUgaXMgdXNlZCBieSBhdXRvbWFrZSB0byB0ZWxsIHNpZGUtZWZmZWN0CisgICMgZGVwZW5kZW5jeSB0cmFja2luZyBtZWNoYW5pc21zIGZyb20gc2xvd2VyIG9uZXMuCisKK2Rhc2htc3Rkb3V0KQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dCwgcmVnYXJkbGVzcyBvZiAtby4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICB0ZXN0IC16ICIkZGFzaG1mbGFnIiAmJiBkYXNobWZsYWc9LU0KKyAgIyBSZXF1aXJlIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGA6JworICAjIGluIHRoZSB0YXJnZXQgbmFtZS4gIFRoaXMgaXMgdG8gY29wZSB3aXRoIERPUy1zdHlsZSBmaWxlbmFtZXM6CisgICMgYSBkZXBlbmRlbmN5IHN1Y2ggYXMgYGM6L2Zvby9iYXInIGNvdWxkIGJlIHNlZW4gYXMgdGFyZ2V0IGBjJyBvdGhlcndpc2UuCisgICIkQCIgJGRhc2htZmxhZyB8CisgICAgc2VkICdzOl5bICBdKlteOiBdW146XVteOl0qXDpbICAgIF0qOiciJG9iamVjdCInXDogOicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgdHIgJyAnICcKKycgPCAiJHRtcGRlcGZpbGUiIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworZGFzaFhtc3Rkb3V0KQorICAjIFRoaXMgY2FzZSBvbmx5IGV4aXN0cyB0byBzYXRpc2Z5IGRlcGVuZC5tNC4gIEl0IGlzIG5ldmVyIGFjdHVhbGx5CisgICMgcnVuLCBhcyB0aGlzIG1vZGUgaXMgc3BlY2lhbGx5IHJlY29nbml6ZWQgaW4gdGhlIHByZWFtYmxlLgorICBleGl0IDEKKyAgOzsKKworbWFrZWRlcGVuZCkKKyAgIiRAIiB8fCBleGl0ICQ/CisgICMgUmVtb3ZlIGFueSBMaWJ0b29sIGNhbGwKKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKyAgIyBYIG1ha2VkZXBlbmQKKyAgc2hpZnQKKyAgY2xlYXJlZD1ubworICBmb3IgYXJnIGluICIkQCI7IGRvCisgICAgY2FzZSAkY2xlYXJlZCBpbgorICAgIG5vKQorICAgICAgc2V0ICIiOyBzaGlmdAorICAgICAgY2xlYXJlZD15ZXMgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAtRCp8LUkqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgICMgU3RyaXAgYW55IG9wdGlvbiB0aGF0IG1ha2VkZXBlbmQgbWF5IG5vdCB1bmRlcnN0YW5kLiAgUmVtb3ZlCisgICAgIyB0aGUgb2JqZWN0IHRvbywgb3RoZXJ3aXNlIG1ha2VkZXBlbmQgd2lsbCBwYXJzZSBpdCBhcyBhIHNvdXJjZSBmaWxlLgorICAgIC0qfCRvYmplY3QpCisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyI7IHNoaWZ0IDs7CisgICAgZXNhYworICBkb25lCisgIG9ial9zdWZmaXg9ImBlY2hvICRvYmplY3QgfCBzZWQgJ3MvXi4qXC4vLi8nYCIKKyAgdG91Y2ggIiR0bXBkZXBmaWxlIgorICAke01BS0VERVBFTkQtbWFrZWRlcGVuZH0gLW8iJG9ial9zdWZmaXgiIC1mIiR0bXBkZXBmaWxlIiAiJEAiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+ICIkZGVwZmlsZSIKKyAgc2VkICcxLDJkJyAiJHRtcGRlcGZpbGUiIHwgdHIgJyAnICcKKycgfCBcCisjIyBTb21lIHZlcnNpb25zIG9mIHRoZSBIUFVYIDEwLjIwIHNlZCBjYW4ndCBwcm9jZXNzIHRoaXMgaW52b2NhdGlvbgorIyMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgICBzZWQgLWUgJ3MvXlxcJC8vJyAtZSAnL14kL2QnIC1lICcvOiQvZCcgfCBzZWQgLWUgJ3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIiAiJHRtcGRlcGZpbGUiLmJhaworICA7OworCitjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LgorICAiJEAiIHx8IGV4aXQgJD8KKworICAjIFJlbW92ZSB0aGUgY2FsbCB0byBMaWJ0b29sLgorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICB3aGlsZSB0ZXN0ICQxICE9ICctLW1vZGU9Y29tcGlsZSc7IGRvCisgICAgICBzaGlmdAorICAgIGRvbmUKKyAgICBzaGlmdAorICBmaQorCisgICMgUmVtb3ZlIGAtbyAkb2JqZWN0Jy4KKyAgSUZTPSIgIgorICBmb3IgYXJnCisgIGRvCisgICAgY2FzZSAkYXJnIGluCisgICAgLW8pCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAkb2JqZWN0KQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIgorICAgICAgc2hpZnQgIyBmbm9yZAorICAgICAgc2hpZnQgIyAkYXJnCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgICIkQCIgLUUgfAorICAgIHNlZCAtbiAnL14jIFswLTldWzAtOV0qICJcKFteIl0qXCkiLiovIHM6OiBcMSBcXDpwJyB8CisgICAgc2VkICckIHM6IFxcJDo6JyA+ICIkdG1wZGVwZmlsZSIKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBjYXQgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgc2VkIDwgIiR0bXBkZXBmaWxlIiAnL14kL2Q7cy9eIC8vO3MvIFxcJC8vO3MvJC8gOi8nID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCittc3Zpc3VhbGNwcCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8sCisgICMgYmVjYXVzZSB3ZSBtdXN0IHVzZSAtbyB3aGVuIHJ1bm5pbmcgbGlidG9vbC4KKyAgIiRAIiB8fCBleGl0ICQ/CisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgIiRhcmciIGluCisgICAgIi1HbSJ8Ii9HbSJ8Ii1HaSJ8Ii9HaSJ8Ii1aSSJ8Ii9aSSIpCisJc2V0IGZub3JkICIkQCIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICAqKQorCXNldCBmbm9yZCAiJEAiICIkYXJnIgorCXNoaWZ0CisJc2hpZnQKKwk7OworICAgIGVzYWMKKyAgZG9uZQorICAiJEAiIC1FIHwKKyAgc2VkIC1uICcvXiNsaW5lIFswLTldWzAtOV0qICJcKFteIl0qXCkiLyBzOjplY2hvICJgY3lncGF0aCAtdSBcXCJcMVxcImAiOnAnIHwgc29ydCB8IHVuaXEgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OglcMSBcXDpwJyA+PiAiJGRlcGZpbGUiCisgIGVjaG8gIgkiID4+ICIkZGVwZmlsZSIKKyAgLiAiJHRtcGRlcGZpbGUiIHwgc2VkICdzJSAlXFwgJWcnIHwgc2VkIC1uICcvXlwoLipcKSQvIHM6OlwxXDo6cCcgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK25vbmUpCisgIGV4ZWMgIiRAIgorICA7OworCisqKQorICBlY2hvICJVbmtub3duIGRlcG1vZGUgJGRlcG1vZGUiIDE+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9kb2MvTWFrZWZpbGUuYW0gYi9pcGVyZi0yLjAuNS9kb2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhZTcwZQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2RvYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxIEBACitFWFRSQV9ESVNUID0gaW5kZXguaHRtbCB1aV9saWNlbnNlLmh0bWwgZGFzdC5naWYKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2RvYy9NYWtlZmlsZS5pbiBiL2lwZXJmLTIuMC41L2RvYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRhNDA3Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvZG9jL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzA5IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNiBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4uCithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitJTlNUQUxMID0gQElOU1RBTExACitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBkb2MKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2Rhc3QubTQgJCh0b3Bfc3JjZGlyKS9tNC9hY3hfcHRocmVhZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1ERVBfRkFMU0UgPSBAQU1ERVBfRkFMU0VACitBTURFUF9UUlVFID0gQEFNREVQX1RSVUVACitBTVRBUiA9IEBBTVRBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQVEhSRUFEX0NDID0gQFBUSFJFQURfQ0NACitQVEhSRUFEX0NGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AKK1BUSFJFQURfTElCUyA9IEBQVEhSRUFEX0xJQlNACitSQU5MSUIgPSBAUkFOTElCQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1RSSVBfQkVHSU4gPSBAU1RSSVBfQkVHSU5ACitTVFJJUF9EVU1NWSA9IEBTVFJJUF9EVU1NWUAKK1NUUklQX0VORCA9IEBTVFJJUF9FTkRACitWRVJTSU9OID0gQFZFUlNJT05ACitXRUIxMDBfQ0ZMQUdTID0gQFdFQjEwMF9DRkxBR1NACitXRUIxMDBfQ09ORklHID0gQFdFQjEwMF9DT05GSUdACitXRUIxMDBfTElCUyA9IEBXRUIxMDBfTElCU0AKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjeF9wdGhyZWFkX2NvbmZpZyA9IEBhY3hfcHRocmVhZF9jb25maWdACithbV9fZmFzdGRlcENDX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ0NfRkFMU0VACithbV9fZmFzdGRlcENDX1RSVUUgPSBAYW1fX2Zhc3RkZXBDQ19UUlVFQAorYW1fX2Zhc3RkZXBDWFhfRkFMU0UgPSBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACithbV9fZmFzdGRlcENYWF9UUlVFID0gQGFtX19mYXN0ZGVwQ1hYX1RSVUVACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorRVhUUkFfRElTVCA9IGluZGV4Lmh0bWwgdWlfbGljZW5zZS5odG1sIGRhc3QuZ2lmCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBkb2MvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGRvYy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKK3VuaW5zdGFsbC1pbmZvLWFtOgordGFnczogVEFHUworVEFHUzoKKworY3RhZ3M6IENUQUdTCitDVEFHUzoKKworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBjYXNlICQkZmlsZSBpbiBcCisJICAgICQoc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisJICAgICQodG9wX3NyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3wiYDs7IFwKKwkgIGVzYWM7IFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgZGlyPSIvJCRkaXIiOyBcCisJICAgICQobWtkaXJfcCkgIiQoZGlzdGRpcikkJGRpciI7IFwKKwkgIGVsc2UgXAorCSAgICBkaXI9Jyc7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0KKworLlBIT05ZOiBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBcCisJaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gXAorCXVuaW5zdGFsbC1pbmZvLWFtCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2RvYy9kYXN0LmdpZiBiL2lwZXJmLTIuMC41L2RvYy9kYXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODExMGRhCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvZG9jL2Rhc3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2RvYy9pbmRleC5odG1sIGIvaXBlcmYtMi4wLjUvZG9jL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkMjEzZgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2RvYy9pbmRleC5odG1sCkBAIC0wLDAgKzEsNzU4IEBACis8SFRNTD4KKzxIRUFEPgorPFRJVExFPklwZXJmIHZlcnNpb24gMi4wLjA8L1RJVExFPgorPCEtLSAkSWQ6IGluZGV4Lmh0bWwsdiAxLjEuMS4xIDIwMDQvMDUvMTggMDE6NTA6NDQga2dpYmJzIEV4cCAkIC0tPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMSU5LPSIjMDA2NjMzIiBWTElOSz0iIzY2OTkwMCIgQUxJTks9IiM2Njk5NjYiPgorCis8Q0VOVEVSPgorPFA+PElNRyBTUkM9ImRhc3QuZ2lmIgorICAgICAgICBBTFQ9IkRpc3RyaWJ1dGVkIEFwcGxpY2F0aW9ucyBTdXBwb3J0IFRlYW0iPjwvUD4KKzwvQ0VOVEVSPgorCis8SDE+SXBlcmYgdmVyc2lvbiAyLjAuMDwvSDE+CisKKzxIMz5NYXkgMjAwNDwvSDM+CisKKzxIUj48IS0tIC0tLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tPgorCis8SDM+TkxBTlIgYXBwbGljYXRpb25zIHN1cHBvcnQKKzxCUj48QSBIUkVGPSJodHRwOi8vZGFzdC5ubGFuci5uZXQvIj5odHRwOi8vZGFzdC5ubGFuci5uZXQvPC9BPgorPEJSPjxBIEhSRUY9Im1haWx0bzpkYXN0QG5sYW5yLm5ldCI+Jmx0O2Rhc3RAbmxhbnIubmV0Jmd0OzwvQT4KKzwvSDM+Cis8UD48Rk9OVCBmYWNlPSJhcmlhbCxoZWx2ZXRpY2EiPgorPEgxPklwZXJmIFVzZXIgRG9jczwvSDE+Cis8SDQ+TWFyayBHYXRlczxicj4KKyAgICBBamF5IFRpcnVtYWxhPEJSPgorICAgIEpvbiBEdWdhbjxCUj4KKyAgICBLZXZpbiBHaWJiczxCUj4gPC9IND4KKworTWF5IDIwMDQgCis8UD48L0NFTlRFUj4KK1s8YSBocmVmPSIjY29tcGlsaW5nIj5Db21waWxpbmc8L0E+IHwgCis8QSBocmVmPSIjZmVhdHVyZXMiPkZlYXR1cmVzPC9BPiZuYnNwOyB8IAorPEEgaHJlZj0iI3R1bmluZ3RjcCI+VHVuaW5nIGEgVENQIGNvbm5lY3Rpb248L0E+IHwgCis8QSBocmVmPSIjdHVuaW5ndWRwIj5UdW5pbmcgYSBVRFAgY29ubmVjdGlvbjwvQT4gfCAKKzxBIGhyZWY9IiNtdWx0aWNhc3QiPlJ1bm5pbmcgbXVsdGljYXN0IHNlcnZlcnMgYW5kIGNsaWVudHM8L0E+IHwgCis8QSBocmVmPSIjaXB2NiI+SVB2NiBNb2RlPC9BPiB8IAorPEEgaHJlZj0iI3JlcG1vZGUiPlJlcHJlc2VudGF0aXZlIFN0cmVhbXM8L0E+IHwKKzxBIGhyZWY9IiNkYWVtb24iPiBSdW5uaW5nIElwZXJmIGFzIGEgZGFlbW9uPC9BPiB8Cis8IS0tPEEgaHJlZj0iI2FkYXB0aXZlIj5BZGFwdGl2ZSBXaW5kb3cgU2l6ZXM8L0E+IHwgLS0+IAorPEEgaHJlZj0iI3NlcnZpY2UiPlJ1bm5pbmcgSXBlcmYgYXMgYSBXaW5kb3dzIFNlcnZpY2U8L0E+IF0gCis8SFI+Cis8IS0tIC0tLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tPgorPEgyPjxBIG5hbWU9Y29tcGlsaW5nPjwvQT5Db21waWxpbmc8L0gyPgorCitPbmNlIHlvdSBoYXZlIHRoZSBkaXN0cmlidXRpb24sIG9uIFVOSVgsIAordW5wYWNrIGl0IHVzaW5nIGd6aXAgYW5kIHRhci4gVGhhdCB3aWxsIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgCisnaXBlcmYtJmx0O3ZlcnNpb24jJmd0Oycgd2l0aCB0aGUgc291cmNlIGZpbGVzIGFuZCBkb2N1bWVudGF0aW9uLiAKKzxQPgorCitJcGVyZiBjb21waWxlcyBjbGVhbmx5IG9uIG1hbnkgc3lzdGVtcyBpbmNsdWRpbmcgTGludXgsIFNHSSBJUklYLCBIUC1VWCwgCitTb2xhcmlzLCBBSVgsIGFuZCBDcmF5IFVOSUNPUy4gVXNlICc8VFQ+bWFrZTwvVFQ+JyB0byBjb25maWd1cmUgZm9yIHlvdXIgT1MgYW5kIAorY29tcGlsZSB0aGUgc291cmNlIGNvZGUuIAorCis8QkxPQ0tRVU9URT48UFJFPgorCitndW56aXAgLWMgaXBlcmYtJmx0O3ZlcnNpb24mZ3Q7LnRhci5neiB8IHRhciAteHZmIC0KK2NkIGlwZXJmLSZsdDt2ZXJzaW9uJmd0OworLi9jb25maWd1cmUKK21ha2UKKworPC9QUkU+PC9CTE9DS1FVT1RFPgorCitUbyBpbnN0YWxsIGlwZXJmLCB1c2UgJzxUVD5tYWtlIGluc3RhbGw8L1RUPicsIAord2hpY2ggd2lsbCBhc2sgeW91IHdoZXJlIHRvIGluc3RhbGwgaXQuIFRvIHJlY29tcGlsZSwgdGhlIGVhc2llc3Qgd2F5IGlzIHRvIAorc3RhcnQgb3Zlci4gRG8gJzxUVD5tYWtlIGRpc3RjbGVhbjwvVFQ+JyB0aGVuICc8VFQ+Li9jb25maWd1cmU7IG1ha2U8L1RUPicuIFNlZSB0aGUgTWFrZWZpbGUgCitmb3IgbW9yZSBvcHRpb25zLiAKKzxQPgorCitJZiB5b3UgaGF2ZSBwcm9ibGVtcywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIDxBIGhyZWY9Im1haWx0bzpkYXN0QG5sYW5yLm5ldCI+ZGFzdEBubGFuci5uZXQ8L0E+IGFuZCAKK3dlIHdpbGwgdHJ5IHRvIGZpeCB0aGVtIHF1aWNrbHkuIDxCUj4KKworPEhSPgorPCEtLSAtLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLT4KKworPEgyPjxBIG5hbWU9ZmVhdHVyZXM+PC9BPkZlYXR1cmVzPC9IMj4KKzxVTD4KKyAgPExJPlRDUCAKKyAgPFVMPgorICAgIDxMST5NZWFzdXJlIGJhbmR3aWR0aCAKKyAgICA8TEk+UmVwb3J0IE1TUy9NVFUgc2l6ZSBhbmQgb2JzZXJ2ZWQgcmVhZCBzaXplcy4gCisgICAgPExJPlN1cHBvcnQgZm9yIFRDUCB3aW5kb3cgc2l6ZSB2aWEgc29ja2V0IGJ1ZmZlcnMuIAorICAgIDxMST5NdWx0aS10aHJlYWRlZCBpZiBwdGhyZWFkcyBvciBXaW4zMiB0aHJlYWRzIGFyZSBhdmFpbGFibGUuIENsaWVudCBhbmQgCisgICAgc2VydmVyIGNhbiBoYXZlIG11bHRpcGxlIHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucy4gCisgPCEtLSAgIDxMST5TdWdnZXN0IHRoZSBvcHRpbWFsIHdpbmRvdyBzaXplIGZvciBhIGNvbm5lY3Rpb24gd2hlcmUgdGhlIE9TIGFsbG93cyAKKyAgICBzZXR0aW5nIHdpbmRvdyBzaXplcyBpbiB0aGUgZ3JhbnVsYXJpdHkgb2YgYnl0ZXMuIDwvTEk+LS0+PC9VTD4KKyAgPExJPlVEUCAKKyAgPFVMPgorICAgIDxMST5DbGllbnQgY2FuIGNyZWF0ZSBVRFAgc3RyZWFtcyBvZiBzcGVjaWZpZWQgYmFuZHdpZHRoLiAKKyAgICA8TEk+TWVhc3VyZSBwYWNrZXQgbG9zcyAKKyAgICA8TEk+TWVhc3VyZSBkZWxheSBqaXR0ZXIgCisgICAgPExJPk11bHRpY2FzdCBjYXBhYmxlIAorICAgIDxMST5NdWx0aS10aHJlYWRlZCBpZiBwdGhyZWFkcyBhcmUgYXZhaWxhYmxlLiBDbGllbnQgYW5kIHNlcnZlciBjYW4gaGF2ZSAKKyAgICBtdWx0aXBsZSBzaW11bHRhbmVvdXMgY29ubmVjdGlvbnMuIChUaGlzIGRvZXNuJ3Qgd29yayBpbiBXaW5kb3dzLikgPC9MST48L1VMPgorICA8TEk+V2hlcmUgYXBwcm9wcmlhdGUsIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIEsgKGtpbG8tKSBhbmQgTSAobWVnYS0pIAorICBzdWZmaWNlcy4gU28gMTI4SyBpbnN0ZWFkIG9mIDEzMTA3MiBieXRlcy4gCisgIDxMST5DYW4gcnVuIGZvciBzcGVjaWZpZWQgdGltZSwgcmF0aGVyIHRoYW4gYSBzZXQgYW1vdW50IG9mIGRhdGEgdG8gdHJhbnNmZXIuIAorICA8TEk+UGlja3MgdGhlIGJlc3QgdW5pdHMgZm9yIHRoZSBzaXplIG9mIGRhdGEgYmVpbmcgcmVwb3J0ZWQuIAorICA8TEk+U2VydmVyIGhhbmRsZXMgbXVsdGlwbGUgY29ubmVjdGlvbnMsIHJhdGhlciB0aGFuIHF1aXR0aW5nIGFmdGVyIGEgc2luZ2xlIAorICB0ZXN0LiAKKyAgPExJPlByaW50IHBlcmlvZGljLCBpbnRlcm1lZGlhdGUgYmFuZHdpZHRoLCBqaXR0ZXIsIGFuZCBsb3NzIHJlcG9ydHMgYXQgCisgIHNwZWNpZmllZCBpbnRlcnZhbHMuIAorICA8TEk+UnVuIHRoZSBzZXJ2ZXIgYXMgYSBkYWVtb24gKENoZWNrIG91dCA8QSAKKyAgaHJlZj0iaHR0cDovL3d3dy1pdGcubGJsLmdvdi9uZXR0ZXN0Ij5OZXR0ZXN0PC9BPiBmb3IgcnVubmluZyBpdCBhcyBhIHNlY3VyZSAKKyAgZGFlbW9uKS4gCisgIDxMST5SdW4gdGhlIHNlcnZlciBhcyBhIFdpbmRvd3MgTlQgU2VydmljZSAKKyAgPExJPlVzZSByZXByZXNlbnRhdGl2ZSBzdHJlYW1zIHRvIHRlc3Qgb3V0IGhvdyBsaW5rIGxheWVyIGNvbXByZXNzaW9uIGFmZmVjdHMgCisgIHlvdXIgYWNoaWV2YWJsZSBiYW5kd2lkdGguIAorCis8IS0tICA8TEk+QSBsaWJyYXJ5IG9mIDxBIAorICBocmVmPSJsaWIuaHRtbCI+dXNlZnVsIGZ1bmN0aW9ucyBhbmQgQysrIAorICBjbGFzc2VzLjwvQT4gPC9MST4KKy0tPgorPC9VTD4KKzxIUj4KKzwhLS0gLS0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0+PEJSPiZuYnNwOyAKKworPFRBQkxFIGNlbGxQYWRkaW5nPTMgYm9yZGVyPTE+CisgIDxUQk9EWT4KKyAgPFRSIHZBbGlnbj10b3A+CisgICAgPFRIIGFsaWduPWxlZnQ+Q29tbWFuZCBsaW5lIG9wdGlvbjwvVEg+CisgICAgPFRIIGFsaWduPWxlZnQ+RW52aXJvbm1lbnQgdmFyaWFibGUgb3B0aW9uPC9USD4KKyAgICA8VEggYWxpZ249bGVmdD5EZXNjcmlwdGlvbjwvVEg+PC9UUj4KKyAgPFRSPgorICAgIDxUSCBiZ0NvbG9yPSNjY2NjY2MgY29sU3Bhbj0zPkNsaWVudCBhbmQgU2VydmVyIG9wdGlvbnM8L1RIPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPWZvcm1hdD48L0E+PFRUPi1mLCAtLWZvcm1hdCA8ST5bYmttYUJLTUFdPC9JPjwvVFQ+PC9URD4KKyAgICA8VEQ+PFRUPiRJUEVSRl9GT1JNQVQ8L1RUPjwvVEQ+CisgICAgPFREPkEgbGV0dGVyIHNwZWNpZnlpbmcgdGhlIGZvcm1hdCB0byBwcmludCBiYW5kd2lkdGggbnVtYmVycyBpbi4gCisgICAgICBTdXBwb3J0ZWQgZm9ybWF0cyBhcmUmbmJzcDsgCisJPFBSRT4KKyZuYnNwOyZuYnNwOyZuYnNwOyAnYicgPSBiaXRzL3NlYyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAnQicgPSBCeXRlcy9zZWMKKyZuYnNwOyZuYnNwOyZuYnNwOyAnaycgPSBLYml0cy9zZWMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJ0snID0gS0J5dGVzL3NlYworJm5ic3A7Jm5ic3A7Jm5ic3A7ICdtJyA9IE1iaXRzL3NlYyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAnTScgPSBNQnl0ZXMvc2VjCismbmJzcDsmbmJzcDsmbmJzcDsgJ2cnID0gR2JpdHMvc2VjJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICdHJyA9IEdCeXRlcy9zZWMKKyZuYnNwOyZuYnNwOyZuYnNwOyAnYScgPSBhZGFwdGl2ZSBiaXRzL3NlYyZuYnNwOyZuYnNwOyAnQScgPSBhZGFwdGl2ZSBCeXRlcy9zZWMKKwk8L1BSRT4KKwlUaGUgYWRhcHRpdmUgZm9ybWF0cyBjaG9vc2UgYmV0d2VlbiBraWxvLSBhbmQgbWVnYS0gYXMgYXBwcm9wcmlhdGUuIEZpZWxkcyAKKyAgICAgIG90aGVyIHRoYW4gYmFuZHdpZHRoIGFsd2F5cyBwcmludCBieXRlcywgYnV0IG90aGVyd2lzZSBmb2xsb3cgdGhlIAorICAgICAgcmVxdWVzdGVkIGZvcm1hdC4gRGVmYXVsdCBpcyAnYScuJm5ic3A7IDxCUj48ST5OT1RFOjwvST4gaGVyZSBLaWxvID0gMTAyNCwgCisgICAgICBNZWdhID0gMTAyNF4yIGFuZCBHaWdhID0gMTAyNF4zIHdoZW4gZGVhbGluZyB3aXRoIGJ5dGVzLiBDb21tb25seSBpbiBuZXR3b3JraW5nLCAKKyAgICAgIEtpbG8gPSAxMDAwLCBNZWdhID0gMTAwMF4yLCBhbmQgR2lnYSA9IDEwMDBeMyBzbyB3ZSAgdXNlIHRoaXMgd2hlbiBkZWFsaW5nIHdpdGgKKyAgICAgIGJpdHMuIElmIHRoaXMgcmVhbGx5IGJvdGhlcnMgeW91LCB1c2UgLWYgYiBhbmQgZG8gdGhlIG1hdGguPC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1pbnRlcnZhbD48L0E+PFRUPi1pLCAtLWludGVydmFsIDxJPiM8L0k+PC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX0lOVEVSVkFMPC9UVD48L1REPgorICAgIDxURD5TZXRzIHRoZSBpbnRlcnZhbCB0aW1lIGluIHNlY29uZHMgYmV0d2VlbiBwZXJpb2RpYyBiYW5kd2lkdGgsIGppdHRlciwgCisgICAgICBhbmQgbG9zcyByZXBvcnRzLiBJZiBub24temVybywgYSByZXBvcnQgaXMgbWFkZSBldmVyeSA8ST5pbnRlcnZhbDwvST4gCisgICAgICBzZWNvbmRzIG9mIHRoZSBiYW5kd2lkdGggc2luY2UgdGhlIGxhc3QgcmVwb3J0LiBJZiB6ZXJvLCBubyBwZXJpb2RpYyAKKyAgICAgIHJlcG9ydHMgYXJlIHByaW50ZWQuIERlZmF1bHQgaXMgemVyby48L1REPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPWxlbj48L0E+PFRUPi1sLCAtLWxlbiA8ST4jW0tNXTwvST48L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfTEVOPC9UVD48L1REPgorICAgIDxURD5UaGUgbGVuZ3RoIG9mIGJ1ZmZlcnMgdG8gcmVhZCBvciB3cml0ZS4gSXBlcmYgd29ya3MgYnkgd3JpdGluZyBhbiAKKyAgICAgIGFycmF5IG9mIDxJPmxlbjwvST4gYnl0ZXMgYSBudW1iZXIgb2YgdGltZXMuIERlZmF1bHQgaXMgOCBLQiBmb3IgVENQLCAxNDcwIAorICAgICAgYnl0ZXMgZm9yIFVEUC4gTm90ZSBmb3IgVURQLCB0aGlzIGlzIHRoZSBkYXRhZ3JhbSBzaXplIGFuZCBuZWVkcyB0byBiZSBsb3dlcmVkIHdoZW4gdXNpbmcKKyAgICAgIElQdjYgYWRkcmVzc2luZyB0byAxNDUwIG9yIGxlc3MgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbi4gU2VlIGFsc28gdGhlIDxBIAorICAgICAgaHJlZj0iI251bSI+LW48L0E+IAorICAgICAgYW5kIDxBIAorICAgICAgaHJlZj0iI3RpbWUiPi10PC9BPiAKKyAgICAgIG9wdGlvbnMuPC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1wcmludF9tc3M+PC9BPjxUVD4tbSwgLS1wcmludF9tc3M8L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfUFJJTlRfTVNTPC9UVD48L1REPgorICAgIDxURD5QcmludCB0aGUgcmVwb3J0ZWQgVENQIE1TUyBzaXplICh2aWEgdGhlIFRDUF9NQVhTRUcgb3B0aW9uKSBhbmQgdGhlIAorICAgICAgb2JzZXJ2ZWQgcmVhZCBzaXplcyB3aGljaCBvZnRlbiBjb3JyZWxhdGUgd2l0aCB0aGUgTVNTLiBUaGUgTVNTIGlzIHVzdWFsbHkgCisgICAgICB0aGUgTVRVIC0gNDAgYnl0ZXMgZm9yIHRoZSBUQ1AvSVAgaGVhZGVyLiBPZnRlbiBhIHNsaWdodGx5IHNtYWxsZXIgTVNTIGlzIAorICAgICAgcmVwb3J0ZWQgYmVjYXVzZSBvZiBleHRyYSBoZWFkZXIgc3BhY2UgZnJvbSBJUCBvcHRpb25zLiBUaGUgaW50ZXJmYWNlIHR5cGUgCisgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBNVFUgaXMgYWxzbyBwcmludGVkIChldGhlcm5ldCwgRkRESSwgZXRjLikuIFRoaXMgCisgICAgICBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIG9uIG1hbnkgT1NlcywgYnV0IHRoZSByZWFkIHNpemVzIG1heSBzdGlsbCAKKyAgICAgIGluZGljYXRlIHRoZSBNU1MuPC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1wb3J0PjwvQT48VFQ+LXAsIC0tcG9ydCA8ST4jPC9JPjwvVFQ+PC9URD4KKyAgICA8VEQ+PFRUPiRJUEVSRl9QT1JUPC9UVD48L1REPgorICAgIDxURD5UaGUgc2VydmVyIHBvcnQgZm9yIHRoZSBzZXJ2ZXIgdG8gbGlzdGVuIG9uIGFuZCB0aGUgY2xpZW50IHRvIGNvbm5lY3QgCisgICAgICB0by4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgaW4gYm90aCBjbGllbnQgYW5kIHNlcnZlci4gRGVmYXVsdCBpcyA1MDAxLCAKKyAgICAgIHRoZSBzYW1lIGFzIHR0Y3AuPC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT11ZHA+PC9BPjxUVD4tdSwgLS11ZHA8L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfVURQPC9UVD48L1REPgorICAgIDxURD5Vc2UgVURQIHJhdGhlciB0aGFuIFRDUC4gU2VlIGFsc28gdGhlIDxBIAorICAgICAgaHJlZj0iI2JhbmR3aWR0aCI+LWI8L0E+IAorICAgICAgb3B0aW9uLjwvVEQ+PC9UUj4KKyAgPFRSIHZBbGlnbj10b3A+CisgICAgPFREPjxBIG5hbWU9d2luZG93PjwvQT48VFQ+LXcsIC0td2luZG93IDxJPiNbS01dPC9JPjwvVFQ+PC9URD4KKyAgICA8VEQ+PFRUPiRUQ1BfV0lORE9XX1NJWkU8L1RUPjwvVEQ+CisgICAgPFREPlNldHMgdGhlIHNvY2tldCBidWZmZXIgc2l6ZXMgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gRm9yIFRDUCwgdGhpcyAKKyAgICAgIHNldHMgdGhlIFRDUCB3aW5kb3cgc2l6ZS4gRm9yIFVEUCBpdCBpcyBqdXN0IHRoZSBidWZmZXIgd2hpY2ggZGF0YWdyYW1zIAorICAgICAgYXJlIHJlY2VpdmVkIGluLCBhbmQgc28gbGltaXRzIHRoZSBsYXJnZXN0IHJlY2VpdmFibGUgZGF0YWdyYW0gc2l6ZS48L1REPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPWJpbmQ+PC9BPjxUVD4tQiwgLS1iaW5kIDxJPmhvc3Q8L0k+PC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX0JJTkQ8L1RUPjwvVEQ+CisgICAgPFREPkJpbmQgdG8gPEk+aG9zdDwvST4sIG9uZSBvZiB0aGlzIG1hY2hpbmUncyBhZGRyZXNzZXMuIEZvciB0aGUgY2xpZW50IAorICAgICAgdGhpcyBzZXRzIHRoZSBvdXRib3VuZCBpbnRlcmZhY2UuIEZvciBhIHNlcnZlciB0aGlzIHNldHMgdGhlIGluY29taW5nIAorICAgICAgaW50ZXJmYWNlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIG11bHRpaG9tZWQgaG9zdHMsIHdoaWNoIGhhdmUgbXVsdGlwbGUgCisgICAgICBuZXR3b3JrIGludGVyZmFjZXMuJm5ic3A7IAorICAgICAgPFA+Rm9yIElwZXJmIGluIFVEUCBzZXJ2ZXIgbW9kZSwgdGhpcyBpcyBhbHNvIHVzZWQgdG8gYmluZCBhbmQgam9pbiB0byBhIAorICAgICAgbXVsdGljYXN0IGdyb3VwLiBVc2UgYWRkcmVzc2VzIGluIHRoZSByYW5nZSAyMjQuMC4wLjAgdG8gMjM5LjI1NS4yNTUuMjU1IAorICAgICAgZm9yIG11bHRpY2FzdC4gU2VlIGFsc28gdGhlIDxBIAorICAgICAgaHJlZj0iI3R0bCI+LVQ8L0E+IAorICAgICAgb3B0aW9uLjwvUD48L1REPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPWNvbXBhdGliaWxpdHk+PC9BPjxUVD4tQywgLS1jb21wYXRpYmlsaXR5IDwvVFQ+PC9URD4KKyAgICA8VEQ+PFRUPiRJUEVSRl9DT01QQVQ8L1RUPjwvVEQ+CisgICAgPFREPkNvbXBhdGliaWxpdHkgbW9kZSBhbGxvd3MgZm9yIHVzZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgaXBlcmYuIFRoaXMgbW9kZQorICAgICAgICBpcyBub3QgcmVxdWlyZWQgZm9yIGludGVyb3BlcmFiaWxpdHkgYnV0IGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZC4gSW4KKyAgICAgICAgc29tZSBjYXNlcyB3aGVuIHVzaW5nIHJlcHJlc2VudGF0aXZlIHN0cmVhbWluZyB5b3UgY291bGQgY2F1c2UgYSAxLjcgc2VydmVyCisgICAgICAgIHRvIGNyYXNoIG9yIGNhdXNlIHVuZGVzaXJlZCBjb25uZWN0aW9uIGF0dGVtcHRzLjwvUD48L1REPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPW1zcz48L0E+PFRUPi1NLCAtLW1zcyA8ST4jW0tNfTwvST48L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfTVNTPC9UVD48L1REPgorICAgIDxURD5BdHRlbXB0IHRvIHNldCB0aGUgVENQIG1heGltdW0gc2VnbWVudCBzaXplIChNU1MpIHZpYSB0aGUgVENQX01BWFNFRyAKKyAgICAgIG9wdGlvbi4gVGhlIE1TUyBpcyB1c3VhbGx5IHRoZSBNVFUgLSA0MCBieXRlcyBmb3IgdGhlIFRDUC9JUCBoZWFkZXIuIEZvciAKKyAgICAgIGV0aGVybmV0LCB0aGUgTVNTIGlzIDE0NjAgYnl0ZXMgKDE1MDAgYnl0ZSBNVFUpLiBUaGlzIG9wdGlvbiBpcyBub3QgCisgICAgICBpbXBsZW1lbnRlZCBvbiBtYW55IE9TZXMuPC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1ub2RlbGF5PjwvQT48VFQ+LU4sIC0tbm9kZWxheTwvVFQ+PC9URD4KKyAgICA8VEQ+PFRUPiRJUEVSRl9OT0RFTEFZPC9UVD48L1REPgorICAgIDxURD5TZXQgdGhlIFRDUCBubyBkZWxheSBvcHRpb24sIGRpc2FibGluZyBOYWdsZSdzIGFsZ29yaXRobS4gTm9ybWFsbHkgCisgICAgICB0aGlzIGlzIG9ubHkgZGlzYWJsZWQgZm9yIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucyBsaWtlIHRlbG5ldC48L1REPjwvVFI+CisgIDxUUj4KKyAgICA8VEQ+PFRUPi1WIDwvVFQ+KGZyb20gdjEuNiBvciBoaWdoZXIpPC9URD4KKyAgICA8VEQ+LjwvVEQ+CisgICAgPFREPkJpbmQgdG8gYW4gSVB2NiBhZGRyZXNzIDxCUj5TZXJ2ZXIgc2lkZTogPEJSPiQgaXBlcmYgLXMgLVYmbmJzcDsgCisgICAgICA8UD5DbGllbnQgc2lkZTogPEJSPiQgaXBlcmYgLWMgJmx0O1NlcnZlciBJUHY2IEFkZHJlc3MmZ3Q7IC1WIAorICAgICAgPEJSPiZuYnNwOzwvUD5Ob3RlOiBPbiB2ZXJzaW9uIDEuNi4zIGFuZCBsYXRlciBhIHNwZWNpZmljIElQdjYgQWRkcmVzcyBkb2VzCisgICAgICBub3QgbmVlZCB0byBiZSBib3VuZCB3aXRoIHRoZSA8QSBocmVmPSIjYmluZCI+LUI8L0E+IG9wdGlvbiwgcHJldmlvdXMgMS42IAorICAgICAgdmVyc2lvbnMgZG8uIEFsc28gb24gbW9zdCBPU2VzIHVzaW5nIHRoaXMgb3B0aW9uIHdpbGwgYWxzbyByZXNwb25kIHRvIElQdjQKKyAgICAgIGNsaWVudHMgdXNpbmcgSVB2NCBtYXBwZWQgYWRkcmVzc2VzLjwvVEQ+PC9UUj4KKyAgPFRSPgorICAgIDxUSCBiZ0NvbG9yPSNjY2NjY2MgY29sU3Bhbj0zPlNlcnZlciBzcGVjaWZpYyBvcHRpb25zPC9USD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1zZXJ2ZXI+PC9BPjxUVD4tcywgLS1zZXJ2ZXI8L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfU0VSVkVSPC9UVD48L1REPgorICAgIDxURD5SdW4gSXBlcmYgaW4gc2VydmVyIG1vZGUuPC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjxUVD4tRCA8L1RUPiAoZnJvbSB2MS4yIG9yIGhpZ2hlcik8L1REPgorICAgIDxURD4uPC9URD4KKyAgICA8VEQ+UnVuIHRoZSBzZXJ2ZXIgYXMgYSBkYWVtb24gKFVuaXggcGxhdGZvcm1zKSA8QlI+T24gV2luMzIgcGxhdGZvcm1zIAorICAgICAgd2hlcmUgc2VydmljZXMgYXJlIGF2YWlsYWJsZSwgSXBlcmYgd2lsbCBzdGFydCBydW5uaW5nIGFzIGEgc2VydmljZS48L1REPjwvVFI+CisgIDxUUj4KKyAgICA8VEQ+PFRUPi1SIDwvVFQ+KG9ubHkgZm9yIFdpbmRvd3MsIGZyb20gdjEuMiBvciBoaWdoZXIpPC9URD4KKyAgICA8VEQ+LjwvVEQ+CisgICAgPFREPlJlbW92ZSB0aGUgSXBlcmYgc2VydmljZSAoaWYgaXQncyBydW5uaW5nKS4mbmJzcDs8L1REPjwvVFI+PFRSPgorICAgIDxURD48VFQ+LW8gPC9UVD4ob25seSBmb3IgV2luZG93cywgZnJvbSB2MS4yIG9yIGhpZ2hlcik8L1REPgorICAgIDxURD4uPC9URD4KKyAgICA8VEQ+UmVkaXJlY3Qgb3V0cHV0IHRvIGdpdmVuIGZpbGUuJm5ic3A7PC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1zY2xpZW50PjwvQT48VFQ+LWMsIC0tY2xpZW50IDxJPmhvc3Q8L0k+PC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX0NMSUVOVDwvVFQ+PC9URD4KKyAgICA8VEQ+IElmIElwZXJmIGlzIGluIHNlcnZlciBtb2RlLCB0aGVuIHNwZWNpZnlpbmcgYSBob3N0IHdpdGggLWMKKyAgICAgICAgd2lsbCBsaW1pdCB0aGUgY29ubmVjdGlvbnMgdGhhdCBJcGVyZiB3aWxsIGFjY2VwdCB0byB0aGUKKyAgICAgICAgPEk+aG9zdDwvST4gc3BlY2lmaWVkLiBEb2VzIG5vdCB3b3JrIHdlbGwgZm9yIFVEUC48L1REPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPXNwYXJhbGxlbD48L0E+PFRUPi1QLCAtLXBhcmFsbGVsIDxJPiM8L0k+PC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX1BBUkFMTEVMPC9UVD48L1REPgorICAgIDxURD5UaGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIGhhbmRsZSBieSB0aGUgc2VydmVyIGJlZm9yZQorICAgICAgY2xvc2luZy4gRGVmYXVsdCBpcyAwICh3aGljaCBtZWFucyB0byBhY2NlcHQgY29ubmVjdGlvbnMgZm9yZXZlcikuPC9URD48L1RSPgorICA8VFI+CisgICAgPFRIIGJnQ29sb3I9I2NjY2NjYyBjb2xTcGFuPTM+Q2xpZW50IHNwZWNpZmljIG9wdGlvbnM8L1RIPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPWJhbmR3aWR0aD48L0E+PFRUPi1iLCAtLWJhbmR3aWR0aCA8ST4jW0tNXTwvST48L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfQkFORFdJRFRIPC9UVD48L1REPgorICAgIDxURD5UaGUgVURQIGJhbmR3aWR0aCB0byBzZW5kIGF0LCBpbiBiaXRzL3NlYy4gVGhpcyBpbXBsaWVzIHRoZSAtdSBvcHRpb24uIAorICAgICAgRGVmYXVsdCBpcyAxIE1iaXQvc2VjLjwvVEQ+PC9UUj4KKyAgPFRSIHZBbGlnbj10b3A+CisgICAgPFREPjxBIG5hbWU9Y2xpZW50PjwvQT48VFQ+LWMsIC0tY2xpZW50IDxJPmhvc3Q8L0k+PC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX0NMSUVOVDwvVFQ+PC9URD4KKyAgICA8VEQ+UnVuIElwZXJmIGluIGNsaWVudCBtb2RlLCBjb25uZWN0aW5nIHRvIGFuIElwZXJmIHNlcnZlciBydW5uaW5nIG9uIAorICAgICAgPEk+aG9zdDwvST4uPC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1kdWFsdGVzdD48L0E+PFRUPi1kLCAtLWR1YWx0ZXN0IDwvVFQ+PC9URD4KKyAgICA8VEQ+PFRUPiRJUEVSRl9EVUFMVEVTVDwvVFQ+PC9URD4KKyAgICA8VEQ+UnVuIElwZXJmIGluIGR1YWwgdGVzdGluZyBtb2RlLiBUaGlzIHdpbGwgY2F1c2UgdGhlIHNlcnZlciB0byBjb25uZWN0CisgICAgICAgIGJhY2sgdG8gdGhlIGNsaWVudCBvbiB0aGUgcG9ydCBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgIDxBIGhyZWY9IiNsaXN0ZW5wb3J0Ij4tTDwvQT4gb3B0aW9uIChvciBkZWZhdWx0cworICAgICAgICB0byB0aGUgcG9ydCB0aGUgY2xpZW50IGNvbm5lY3RlZCB0byB0aGUgc2VydmVyIG9uKS4gVGhpcyBpcyBkb25lIGltbWVkaWF0ZWx5CisgICAgICAgIHRoZXJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cyBzaW11bHRhbmVvdXNseS4gSWYgeW91IHdhbnQgYW4gYWx0ZXJuYXRpbmcKKyAgICAgICAgdGVzdCB0cnkgPEEgaHJlZj0iI3RyYWRlb2ZmIj4tci48L0E+PC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT1udW0+PC9BPjxUVD4tbiwgLS1udW0gPEk+I1tLTV08L0k+PC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX05VTTwvVFQ+PC9URD4KKyAgICA8VEQ+VGhlIG51bWJlciBvZiBidWZmZXJzIHRvIHRyYW5zbWl0LiBOb3JtYWxseSwgSXBlcmYgc2VuZHMgZm9yIDEwIAorICAgICAgc2Vjb25kcy4gVGhlIC1uIG9wdGlvbiBvdmVycmlkZXMgdGhpcyBhbmQgc2VuZHMgYW4gYXJyYXkgb2YgPEk+bGVuPC9JPiAKKyAgICAgIGJ5dGVzIDxJPm51bTwvST4gdGltZXMsIG5vIG1hdHRlciBob3cgbG9uZyB0aGF0IHRha2VzLiBTZWUgYWxzbyB0aGUgPEEgCisgICAgICBocmVmPSIjbGVuIj4tbDwvQT4gCisgICAgICBhbmQgPEEgCisgICAgICBocmVmPSIjdGltZSI+LXQ8L0E+IAorICAgICAgb3B0aW9ucy48L1REPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPXRyYWRlb2ZmPjwvQT48VFQ+LXIsIC0tdHJhZGVvZmYgPC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX1RSQURFT0ZGPC9UVD48L1REPgorICAgIDxURD5SdW4gSXBlcmYgaW4gdHJhZGVvZmYgdGVzdGluZyBtb2RlLiBUaGlzIHdpbGwgY2F1c2UgdGhlIHNlcnZlciB0byBjb25uZWN0CisgICAgICAgIGJhY2sgdG8gdGhlIGNsaWVudCBvbiB0aGUgcG9ydCBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgIDxBIGhyZWY9IiNsaXN0ZW5wb3J0Ij4tTDwvQT4gb3B0aW9uIChvciBkZWZhdWx0cworICAgICAgICB0byB0aGUgcG9ydCB0aGUgY2xpZW50IGNvbm5lY3RlZCB0byB0aGUgc2VydmVyIG9uKS4gVGhpcyBpcyBkb25lIGZvbGxvd2luZworICAgICAgICB0aGUgY2xpZW50IGNvbm5lY3Rpb24gdGVybWluYXRpb24sIHRoZXJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0cworICAgICAgICBhbHRlcm5hdGluZy4gSWYgeW91IHdhbnQgYW4gc2ltdWx0YW5lb3VzIHRlc3QgdHJ5CisgICAgICAgIDxBIGhyZWY9IiNkdWFsdGVzdCI+LWQuPC9BPjwvVEQ+PC9UUj4KKyAgPFRSIHZBbGlnbj10b3A+CisgICAgPFREPjxBIG5hbWU9dGltZT48L0E+PFRUPi10LCAtLXRpbWUgPEk+IzwvST48L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfVElNRTwvVFQ+PC9URD4KKyAgICA8VEQ+VGhlIHRpbWUgaW4gc2Vjb25kcyB0byB0cmFuc21pdCBmb3IuIElwZXJmIG5vcm1hbGx5IHdvcmtzIGJ5IAorICAgICAgcmVwZWF0ZWRseSBzZW5kaW5nIGFuIGFycmF5IG9mIDxJPmxlbjwvST4gYnl0ZXMgZm9yIDxJPnRpbWU8L0k+IHNlY29uZHMuIAorICAgICAgRGVmYXVsdCBpcyAxMCBzZWNvbmRzLiBTZWUgYWxzbyB0aGUgPEEgCisgICAgICBocmVmPSIjbGVuIj4tbDwvQT4gCisgICAgICBhbmQgPEEgCisgICAgICBocmVmPSIjbnVtIj4tbjwvQT4gCisgICAgICBvcHRpb25zLjwvVEQ+PC9UUj4KKyAgPFRSIHZBbGlnbj10b3A+CisgICAgPFREPjxBIG5hbWU9bGlzdGVucG9ydD48L0E+PFRUPi1MLCAtLWxpc3RlbnBvcnQgPEk+IzwvST48L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfTElTVEVOUE9SVDwvVFQ+PC9URD4KKyAgICA8VEQ+VGhpcyBzcGVjaWZpZXMgdGhlIHBvcnQgdGhhdCB0aGUgc2VydmVyIHdpbGwgY29ubmVjdCBiYWNrIHRvIHRoZQorICAgICAgICBjbGllbnQgb24uIEl0IGRlZmF1bHRzIHRvIHRoZSBwb3J0IHVzZWQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyCisgICAgICAgIGZyb20gdGhlIGNsaWVudC48L1REPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPXBhcmFsbGVsPjwvQT48VFQ+LVAsIC0tcGFyYWxsZWwgPEk+IzwvST48L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfUEFSQUxMRUw8L1RUPjwvVEQ+CisgICAgPFREPlRoZSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGNvbm5lY3Rpb25zIHRvIG1ha2UgdG8gdGhlIHNlcnZlci4gRGVmYXVsdCAKKyAgICAgIGlzIDEuIFJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IG9uIGJvdGggdGhlIGNsaWVudCBhbmQgc2VydmVyLjwvVEQ+PC9UUj4KKyAgPFRSIHZBbGlnbj10b3A+CisgICAgPFREPjxBIG5hbWU9dG9zPjwvQT48VFQ+LVMsIC0tdG9zIDxJPiM8L0k+PC9UVD48L1REPgorICAgIDxURD48VFQ+JElQRVJGX1RPUzwvVFQ+PC9URD4KKyAgICA8VEQ+VGhlIHR5cGUtb2Ytc2VydmljZSBmb3Igb3V0Z29pbmcgcGFja2V0cy4gKE1hbnkgcm91dGVycyBpZ25vcmUgdGhlIFRPUyAKKyAgICAgIGZpZWxkLikgWW91IG1heSBzcGVjaWZ5IHRoZSB2YWx1ZSBpbiBoZXggd2l0aCBhICcweCcgcHJlZml4LCBpbiBvY3RhbCB3aXRoIAorICAgICAgYSAnMCcgcHJlZml4LCBvciBpbiBkZWNpbWFsLiBGb3IgZXhhbXBsZSwgJzB4MTAnIGhleCA9ICcwMjAnIG9jdGFsID0gJzE2JyAKKyAgICAgIGRlY2ltYWwuIFRoZSBUT1MgbnVtYmVycyBzcGVjaWZpZWQgaW4gUkZDIDEzNDkgYXJlOiZuYnNwOyAKKwk8UFJFPgorJm5ic3A7Jm5ic3A7Jm5ic3A7IElQVE9TX0xPV0RFTEFZJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IG1pbmltaXplIGRlbGF5Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDB4MTAKKyZuYnNwOyZuYnNwOyZuYnNwOyBJUFRPU19USFJPVUdIUFVUJm5ic3A7Jm5ic3A7IG1heGltaXplIHRocm91Z2hwdXQmbmJzcDsmbmJzcDsgMHgwOAorJm5ic3A7Jm5ic3A7Jm5ic3A7IElQVE9TX1JFTElBQklMSVRZJm5ic3A7IG1heGltaXplIHJlbGlhYmlsaXR5Jm5ic3A7IDB4MDQKKyZuYnNwOyZuYnNwOyZuYnNwOyBJUFRPU19MT1dDT1NUJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IG1pbmltaXplIGNvc3QmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMHgwMgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisJPC9QUkU+CisJPC9URD48L1RSPgorICA8VFIgdkFsaWduPXRvcD4KKyAgICA8VEQ+PEEgbmFtZT10dGw+PC9BPjxUVD4tVCwgLS10dGwgPEk+IzwvST48L1RUPjwvVEQ+CisgICAgPFREPjxUVD4kSVBFUkZfVFRMPC9UVD48L1REPgorICAgIDxURD5UaGUgdGltZS10by1saXZlIGZvciBvdXRnb2luZyBtdWx0aWNhc3QgcGFja2V0cy4gVGhpcyBpcyBlc3NlbnRpYWxseSAKKyAgICAgIHRoZSBudW1iZXIgb2Ygcm91dGVyIGhvcHMgdG8gZ28gdGhyb3VnaCwgYW5kIGlzIGFsc28gdXNlZCBmb3Igc2NvcGluZy4gCisgICAgICBEZWZhdWx0IGlzIDEsIGxpbmstbG9jYWwuPC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjxUVD4tRjwvVFQ+IChmcm9tIHYxLjIgb3IgaGlnaGVyKTwvVEQ+CisgICAgPFREPi48L1REPgorICAgIDxURD5Vc2UgYSByZXByZXNlbnRhdGl2ZSBzdHJlYW0gdG8gbWVhc3VyZSBiYW5kd2lkdGgsIGUuZy4gOi0mbmJzcDsgPEJSPiQgCisgICAgICBpcGVyZiAtYyAmbHQ7c2VydmVyIGFkZHJlc3MmZ3Q7IC1GICZsdDtmaWxlLW5hbWUmZ3Q7PC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjxUVD4tSSA8L1RUPihmcm9tIHYxLjIgb3IgaGlnaGVyKTwvVEQ+CisgICAgPFREPi48L1REPgorICAgIDxURD5TYW1lIGFzIC1GLCBpbnB1dCBmcm9tIHN0ZGluLjwvVEQ+PC9UUj4KKyA8IS0tIDxUUj4KKyAgICA8VEQ+PFRUPi1XIDwvVFQ+KGZyb20gdjEuMiBvciBoaWdoZXIpPC9URD4KKyAgICA8VEQ+LjwvVEQ+CisgICAgPFREPkFkYXB0aXZlIFdpbmRvdyBTaXplcy4KKwkgIDxCUj5Vc2UgSXBlcmYgdG8gc3VnZ2VzdCB0aGUgYmVzdCBXaW5kb3cgc2l6ZSBmb3IgYSBjb25uZWN0aW9uLiBJcGVyZiB3aWxsIHN0YXJ0IGZyb20gYSBkZWZhdWx0IHdpbmRvdyBzaXplIGFuZCB0cnkgdG8gcGVyZm9ybSBhIHNlYXJjaCBmb3IgdGhlIG9wdGltYWwgd2luZG93IHNpemU8L1REPjwvVFI+CistLT4gIDxUUj4KKyAgICA8VEggYmdDb2xvcj0jY2NjY2NjIGNvbFNwYW49Mz5NaXNjZWxsYW5lb3VzIG9wdGlvbnM8L1RIPjwvVFI+CisgIDxUUiB2QWxpZ249dG9wPgorICAgIDxURD48QSBuYW1lPWhlbHA+PC9BPjxUVD4taCwgLS1oZWxwPC9UVD48L1REPgorICAgIDxURD4mbmJzcDs8L1REPgorICAgIDxURD5QcmludCBvdXQgYSBzdW1tYXJ5IG9mIGNvbW1hbmRzIGFuZCBxdWl0LjwvVEQ+PC9UUj4KKyAgPFRSIHZBbGlnbj10b3A+CisgICAgPFREPjxBIG5hbWU9dmVyc2lvbj48L0E+PFRUPi12LCAtLXZlcnNpb248L1RUPjwvVEQ+CisgICAgPFREPiZuYnNwOzwvVEQ+CisgICAgPFREPlByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIHF1aXQuIFByaW50cyAncHRocmVhZHMnIGlmIGNvbXBpbGVkIHdpdGggCisgICAgICBQT1NJWCB0aHJlYWRzLCAnd2luMzIgdGhyZWFkcycgaWYgY29tcGlsZWQgd2l0aCBNaWNyb3NvZnQgV2luMzIgdGhyZWFkcywgCisgICAgICBvciAnc2luZ2xlIHRocmVhZGVkJyBpZiBjb21waWxlZCB3aXRob3V0IHRocmVhZHMuPC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4KKzxQPgorPEhSPgorPCEtLSAtLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLT4KKzxIMj48QSBuYW1lPXR1bmluZ3RjcD48L0E+VHVuaW5nIGEgVENQIGNvbm5lY3Rpb248L0gyPgorCitUaGUgcHJpbWFyeSBnb2FsIG9mIElwZXJmIAoraXMgdG8gaGVscCBpbiB0dW5pbmcgVENQIGNvbm5lY3Rpb25zIG92ZXIgYSBwYXJ0aWN1bGFyIHBhdGguIFRoZSBtb3N0IAorZnVuZGFtZW50YWwgdHVuaW5nIGlzc3VlIGZvciBUQ1AgaXMgdGhlIFRDUCB3aW5kb3cgc2l6ZSwgd2hpY2ggY29udHJvbHMgaG93IG11Y2ggCitkYXRhIGNhbiBiZSBpbiB0aGUgbmV0d29yayBhdCBhbnkgb25lIHBvaW50LiBJZiBpdCBpcyB0b28gc21hbGwsIHRoZSBzZW5kZXIgd2lsbCAKK2JlIGlkbGUgYXQgdGltZXMgYW5kIGdldCBwb29yIHBlcmZvcm1hbmNlLiBUaGUgdGhlb3JldGljYWwgdmFsdWUgdG8gdXNlIGZvciB0aGUgCitUQ1Agd2luZG93IHNpemUgaXMgdGhlIDxJPmJhbmR3aWR0aCBkZWxheSBwcm9kdWN0PC9JPiwgCis8QkxPQ0tRVU9URT5ib3R0bGVuZWNrIGJhbmR3aWR0aCAqIHJvdW5kIHRyaXAgdGltZTwvQkxPQ0tRVU9URT5JbiB0aGUgYmVsb3cgCittb2RpNC9jeWNsb3BzIGV4YW1wbGUsIHRoZSBib3R0bGVuZWNrIGxpbmsgaXMgYSA0NSBNYml0L3NlYyBEUzMgbGluayBhbmQgdGhlIAorcm91bmQgdHJpcCB0aW1lIG1lYXN1cmVkIHdpdGggcGluZyBpcyA0MiBtcy4gVGhlIGJhbmR3aWR0aCBkZWxheSBwcm9kdWN0IGlzIAorPEJMT0NLUVVPVEU+NDUgTWJpdC9zZWMgKiA0MiBtcyA8QlI+PSAoNDVlNikgKiAoNDJlLTMpIDxCUj49IDE4OTAwMDAgYml0cyAKKyAgPEJSPj0gMjMwIEtCeXRlPC9CTE9DS1FVT1RFPlRoYXQgaXMgYSBzdGFydGluZyBwb2ludCBmb3IgZmlndXJpbmcgdGhlIGJlc3QgCit3aW5kb3cgc2l6ZTsgc2V0dGluZyBpdCBoaWdoZXIgb3IgbG93ZXIgbWF5IHByb2R1Y2UgYmV0dGVyIHJlc3VsdHMuIEluIG91ciAKK2V4YW1wbGUsIGJ1ZmZlciBzaXplcyBvdmVyIDEzMEsgZGlkIG5vdCBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSwgZGVzcGl0ZSB0aGUgCitiYW5kd2lkdGggZGVsYXkgcHJvZHVjdCBvZiAyMzBLLiAKKzxQPk5vdGUgdGhhdCBtYW55IE9TZXMgYW5kIGhvc3RzIGhhdmUgdXBwZXIgbGltaXRzIG9uIHRoZSBUQ1Agd2luZG93IHNpemUuIFRoZXNlIAorbWF5IGJlIGFzIGxvdyBhcyA2NCBLQiwgb3IgYXMgaGlnaCBhcyBzZXZlcmFsIE1CLiBJcGVyZiB0cmllcyB0byBkZXRlY3Qgd2hlbiAKK3RoZXNlIG9jY3VyIGFuZCBnaXZlIGEgd2FybmluZyB0aGF0IHRoZSBhY3R1YWwgYW5kIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZXMgYXJlIAorbm90IGVxdWFsIChhcyBiZWxvdywgdGhvdWdoIHRoYXQgaXMgZHVlIHRvIHJvdW5kaW5nIGluIElSSVgpLiBQU0MgaGFzIGEgPEEgCitocmVmPSJodHRwOi8vd3d3LnBzYy5lZHUvbmV0d29ya2luZy9wZXJmX3R1bmUuaHRtbCI+bGlzdCBkZXRhaWxpbmc8L0E+IGhvdyB0byAKK2NoYW5nZSB0aGUgZGVmYXVsdCBhbmQgbWF4aW11bSB3aW5kb3cgc2l6ZXMgZm9yIHZhcmlvdXMgT1Nlcy4gRm9yIG1vcmUgCitpbmZvcm1hdGlvbiBvbiBUQ1Agd2luZG93IHNpemVzLCBzZWUgdGhlIDxBIAoraHJlZj0iaHR0cDovL2Rhc3QubmxhbnIubmV0L0d1aWRlcy9HZXR0aW5nU3RhcnRlZC9UQ1Bfd2luZG93X3NpemUuaHRtbCI+VXNlcidzIAorR3VpZGUgdG8gVENQIFdpbmRvd3MuPC9BPiAKKzxQPkhlcmUgaXMgYW4gZXhhbXBsZSBzZXNzaW9uLCBiZXR3ZWVuIG5vZGUxIGluIElsbGlub2lzIGFuZCBub2RlMiBpbiBOb3J0aCAKK0Nhcm9saW5hLiBUaGVzZSBhcmUgY29ubmVjdGVkIHZpYSB0aGUgdkJOUyBiYWNrYm9uZSBhbmQgYSA0NSBNYml0L3NlYyBEUzMgbGluay4gCitOb3RpY2Ugd2UgaW1wcm92ZSBiYW5kd2lkdGggcGVyZm9ybWFuY2UgYnkgYSBmYWN0b3Igb2YgMyB1c2luZyBwcm9wZXIgVENQIHdpbmRvdyAKK3NpemVzLiBVc2UgdGhlIGFkYXB0aXZlIHdpbmRvdyBzaXplcyBmZWF0dXJlIG9uIHBsYXRmb3JtcyB3aGljaCBhbGxvdyBzZXR0aW5nIAord2luZG93IHNpemVzIGluIHRoZSBncmFudWxhcml0eSBvZiBieXRlcy4gCis8QkxPQ0tRVU9URT4KKzxQUkU+Cis8Qj5ub2RlMiZndDs8L0I+IGlwZXJmIC1zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NlcnZlciBsaXN0ZW5pbmcgb24gVENQIHBvcnQgNTAwMQorVENQIHdpbmRvdyBzaXplOiA2MC4wIEtCeXRlIChkZWZhdWx0KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbJm5ic3A7IDRdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGUyJmd0OyBwb3J0IDUwMDEgY29ubmVjdGVkIHdpdGggJmx0O0lQIEFkZHIgbm9kZTEmZ3Q7IHBvcnQgMjM1NworWyBJRF0gSW50ZXJ2YWwmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgVHJhbnNmZXImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQmFuZHdpZHRoCitbJm5ic3A7IDRdJm5ic3A7IDAuMC0xMC4xIHNlYyZuYnNwOyZuYnNwOyA2LjUgTUJ5dGVzJm5ic3A7Jm5ic3A7IDxCPjxGT05UIGNvbG9yPSNmZjAwMDA+NS4yIE1iaXRzL3NlYworCis8L0ZPTlQ+bm9kZTEmZ3Q7PC9CPiBpcGVyZiAtYyBub2RlMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDbGllbnQgY29ubmVjdGluZyB0byBub2RlMSwgVENQIHBvcnQgNTAwMQorVENQIHdpbmRvdyBzaXplOiA1OS45IEtCeXRlIChkZWZhdWx0KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbJm5ic3A7IDNdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGUxJmd0OyBwb3J0IDIzNTcgY29ubmVjdGVkIHdpdGggJmx0O0lQIEFkZHIgbm9kZTImZ3Q7IHBvcnQgNTAwMQorWyBJRF0gSW50ZXJ2YWwmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgVHJhbnNmZXImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQmFuZHdpZHRoCitbJm5ic3A7IDNdJm5ic3A7IDAuMC0xMC4wIHNlYyZuYnNwOyZuYnNwOyA2LjUgTUJ5dGVzJm5ic3A7Jm5ic3A7IDUuMiBNYml0cy9zZWM8L1BSRT4KKyAgPEhSPgorPFBSRT48Qj5ub2RlMiZndDs8L0I+IGlwZXJmIC1zIC13IDEzMGsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU2VydmVyIGxpc3RlbmluZyBvbiBUQ1AgcG9ydCA1MDAxCitUQ1Agd2luZG93IHNpemU6Jm5ic3A7IDEzMCBLQnl0ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbJm5ic3A7IDRdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGUgMiZndDsgcG9ydCA1MDAxIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGUgMSZndDsgcG9ydCAyNTMwCitbIElEXSBJbnRlcnZhbCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUcmFuc2ZlciZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYW5kd2lkdGgKK1smbmJzcDsgNF0mbmJzcDsgMC4wLTEwLjEgc2VjJm5ic3A7IDE5LjcgTUJ5dGVzJm5ic3A7IDxCPjxGT05UIGNvbG9yPSNmZjAwMDA+MTUuNyBNYml0cy9zZWMKKworPC9GT05UPm5vZGUxJmd0OzwvQj4gaXBlcmYgLWMgbm9kZTIgLXcgMTMwaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDbGllbnQgY29ubmVjdGluZyB0byBub2RlMiwgVENQIHBvcnQgNTAwMQorVENQIHdpbmRvdyBzaXplOiZuYnNwOyAxMjkgS0J5dGUgKFdBUk5JTkc6IHJlcXVlc3RlZCZuYnNwOyAxMzAgS0J5dGUpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1smbmJzcDsgM10gbG9jYWwgJmx0O0lQIEFkZHIgbm9kZTEmZ3Q7IHBvcnQgMjUzMCBjb25uZWN0ZWQgd2l0aCAmbHQ7SVAgQWRkciBub2RlMiZndDsgcG9ydCA1MDAxCitbIElEXSBJbnRlcnZhbCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUcmFuc2ZlciZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYW5kd2lkdGgKK1smbmJzcDsgM10mbmJzcDsgMC4wLTEwLjAgc2VjJm5ic3A7IDE5LjcgTUJ5dGVzJm5ic3A7IDE1LjggTWJpdHMvc2VjPC9QUkU+PC9CTE9DS1FVT1RFPkFub3RoZXIgCit0ZXN0IHRvIGRvIGlzIHJ1biBwYXJhbGxlbCBUQ1Agc3RyZWFtcy4gSWYgdGhlIHRvdGFsIGFnZ3JlZ2F0ZSBiYW5kd2lkdGggaXMgbW9yZSAKK3RoYW4gd2hhdCBhbiBpbmRpdmlkdWFsIHN0cmVhbSBnZXRzLCBzb21ldGhpbmcgaXMgd3JvbmcuIEVpdGhlciB0aGUgVENQIHdpbmRvdyAKK3NpemUgaXMgdG9vIHNtYWxsLCBvciB0aGUgT1MncyBUQ1AgaW1wbGVtZW50YXRpb24gaGFzIGJ1Z3MsIG9yIHRoZSBuZXR3b3JrIAoraXRzZWxmIGhhcyBkZWZpY2llbmNpZXMuIFNlZSBhYm92ZSBmb3IgVENQIHdpbmRvdyBzaXplczsgb3RoZXJ3aXNlIGRpYWdub3NpbmcgCit3aGljaCBpcyBzb21ld2hhdCBkaWZmaWN1bHQuIElmIElwZXJmIGlzIGNvbXBpbGVkIHdpdGggcHRocmVhZHMsIGEgc2luZ2xlIGNsaWVudCAKK2FuZCBzZXJ2ZXIgY2FuIHRlc3QgdGhpcywgb3RoZXJ3aXNlIHNldHVwIG11bHRpcGxlIGNsaWVudHMgYW5kIHNlcnZlcnMgb24gCitkaWZmZXJlbnQgcG9ydHMuIEhlcmUncyBhbiBleGFtcGxlIHdoZXJlIGEgc2luZ2xlIHN0cmVhbSBnZXRzIDE2LjUgTWJpdC9zZWMsIGJ1dCAKK3R3byBwYXJhbGxlbCBzdHJlYW1zIHRvZ2V0aGVyIGdldCAxNi43ICsgOS40ID0gMjYuMSBNYml0L3NlYywgZXZlbiB3aGVuIHVzaW5nIAorbGFyZ2UgVENQIHdpbmRvdyBzaXplczogCis8QkxPQ0tRVU9URT48UFJFPjxCPm5vZGUyJmd0OzwvQj4gaXBlcmYgLXMgLXcgMzAwaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTZXJ2ZXIgbGlzdGVuaW5nIG9uIFRDUCBwb3J0IDUwMDEKK1RDUCB3aW5kb3cgc2l6ZTombmJzcDsgMzAwIEtCeXRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1smbmJzcDsgNF0gbG9jYWwgJmx0O0lQIEFkZHIgbm9kZTImZ3Q7IHBvcnQgNTAwMSBjb25uZWN0ZWQgd2l0aCAmbHQ7SVAgQWRkciBub2RlMSZndDsgcG9ydCA2OTAyCitbIElEXSBJbnRlcnZhbCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUcmFuc2ZlciZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYW5kd2lkdGgKK1smbmJzcDsgNF0mbmJzcDsgMC4wLTEwLjIgc2VjJm5ic3A7IDIwLjkgTUJ5dGVzJm5ic3A7IDxCPjxGT05UIGNvbG9yPSNmZjAwMDA+MTYuNSBNYml0cy9zZWMKKworPC9GT05UPjwvQj5bJm5ic3A7IDRdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGUyJmd0OyBwb3J0IDUwMDEgY29ubmVjdGVkIHdpdGggJmx0O0lQIEFkZHIgbm9kZTEmZ3Q7IHBvcnQgNjkxMQorWyZuYnNwOyA1XSBsb2NhbCAmbHQ7SVAgQWRkciBub2RlMiZndDsgcG9ydCA1MDAxIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGUyJmd0OyBwb3J0IDY5MTIKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aAorWyZuYnNwOyA1XSZuYnNwOyAwLjAtMTAuMSBzZWMmbmJzcDsgMjEuMCBNQnl0ZXMmbmJzcDsgPEI+PEZPTlQgY29sb3I9I2ZmMDAwMD4xNi43IE1iaXRzL3NlYworPC9GT05UPjwvQj5bJm5ic3A7IDRdJm5ic3A7IDAuMC0xMC4zIHNlYyZuYnNwOyAxMi4wIE1CeXRlcyZuYnNwOyZuYnNwOzxCPjxGT05UIGNvbG9yPSNmZjAwMDA+IDkuNCBNYml0cy9zZWMKKworPC9GT05UPm5vZGUxJmd0OzwvQj4gLi9pcGVyZiAtYyBub2RlMiAtdyAzMDBrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NsaWVudCBjb25uZWN0aW5nIHRvIG5vZGUyLCBUQ1AgcG9ydCA1MDAxCitUQ1Agd2luZG93IHNpemU6Jm5ic3A7IDI5OSBLQnl0ZSAoV0FSTklORzogcmVxdWVzdGVkJm5ic3A7IDMwMCBLQnl0ZSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWyZuYnNwOyAzXSBsb2NhbCAmbHQ7SVAgQWRkciBub2RlMiZndDsgcG9ydCA2OTAyIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGUxJmd0OyBwb3J0IDUwMDEKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aAorWyZuYnNwOyAzXSZuYnNwOyAwLjAtMTAuMiBzZWMmbmJzcDsgMjAuOSBNQnl0ZXMmbmJzcDsgMTYuNCBNYml0cy9zZWMKKworPEI+bm9kZTEmZ3Q7PC9CPiBpcGVyZiAtYyBub2RlMiAtdyAzMDBrIC1QIDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ2xpZW50IGNvbm5lY3RpbmcgdG8gbm9kZTIsIFRDUCBwb3J0IDUwMDEKK1RDUCB3aW5kb3cgc2l6ZTombmJzcDsgMjk5IEtCeXRlIChXQVJOSU5HOiByZXF1ZXN0ZWQmbmJzcDsgMzAwIEtCeXRlKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbJm5ic3A7IDRdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGUyJmd0OyBwb3J0IDY5MTIgY29ubmVjdGVkIHdpdGggJmx0O0lQIEFkZHIgbm9kZTEmZ3Q7IHBvcnQgNTAwMQorWyZuYnNwOyAzXSBsb2NhbCAmbHQ7SVAgQWRkciBub2RlMiZndDsgcG9ydCA2OTExIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGUxJmd0OyBwb3J0IDUwMDEKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aAorWyZuYnNwOyA0XSZuYnNwOyAwLjAtMTAuMSBzZWMmbmJzcDsgMjEuMCBNQnl0ZXMmbmJzcDsgMTYuNiBNYml0cy9zZWMKK1smbmJzcDsgM10mbmJzcDsgMC4wLTEwLjIgc2VjJm5ic3A7IDEyLjAgTUJ5dGVzJm5ic3A7Jm5ic3A7IDkuNCBNYml0cy9zZWM8L1BSRT48L0JMT0NLUVVPVEU+QSAKK3NlY29uZGFyeSB0dW5pbmcgaXNzdWUgZm9yIFRDUCBpcyB0aGUgbWF4aW11bSB0cmFuc21pc3Npb24gdW5pdCAoTVRVKS4gVG8gYmUgCittb3N0IGVmZmVjdGl2ZSwgYm90aCBob3N0cyBzaG91bGQgc3VwcG9ydCBQYXRoIE1UVSBEaXNjb3ZlcnkuIFBTQyBoYXMgYSA8QSAKK2hyZWY9Imh0dHA6Ly93d3cucHNjLmVkdS9uZXR3b3JraW5nL3BlcmZfdHVuZS5odG1sIj5saXN0IGRldGFpbGluZzwvQT4gd2hhdCBPU2VzIAorc3VwcG9ydCBQYXRoIE1UVSBEaXNjb3ZlcnkuIEhvc3RzIHdpdGhvdXQgUGF0aCBNVFUgRGlzY292ZXJ5IG9mdGVuIHVzZSA1MzYgYXMgCit0aGUgTVNTLCB3aGljaCB3YXN0ZXMgYmFuZHdpZHRoIGFuZCBwcm9jZXNzaW5nIHRpbWUuIFVzZSB0aGUgLW0gb3B0aW9uIHRvIAorZGlzcGxheSB3aGF0IE1TUyBpcyBiZWluZyB1c2VkLCBhbmQgc2VlIGlmIHRoaXMgbWF0Y2hlcyB3aGF0IHlvdSBleHBlY3QuIE9mdGVuIAoraXQgaXMgYXJvdW5kIDE0NjAgYnl0ZXMgZm9yIGV0aGVybmV0LiAKKzxCTE9DS1FVT1RFPjxQUkU+PEI+bm9kZTMmZ3Q7PC9CPiBpcGVyZiAtcyAtbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTZXJ2ZXIgbGlzdGVuaW5nIG9uIFRDUCBwb3J0IDUwMDEKK1RDUCB3aW5kb3cgc2l6ZTogNjAuMCBLQnl0ZSAoZGVmYXVsdCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWyZuYnNwOyA0XSBsb2NhbCAmbHQ7SVAgQWRkciBub2RlMyZndDsgcG9ydCA1MDAxIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGU0Jmd0OyBwb3J0IDEwOTYKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aAorWyZuYnNwOyA0XSZuYnNwOyAwLjAtIDIuMCBzZWMmbmJzcDsmbmJzcDsgMS44IE1CeXRlcyZuYnNwOyZuYnNwOyA2LjkgTWJpdHMvc2VjCitbJm5ic3A7IDRdIDxCPjxGT05UIGNvbG9yPSNmZjAwMDA+TVNTIHNpemUgMTQ0OCBieXRlcyAoTVRVIDE1MDAgYnl0ZXMsIGV0aGVybmV0KQorPC9GT05UPjwvQj5bJm5ic3A7IDRdIFJlYWQgbGVuZ3RocyBvY2N1cnJpbmcgaW4gbW9yZSB0aGFuIDUlIG9mIHJlYWRzOgorWyZuYnNwOyA0XSZuYnNwOyZuYnNwOyA5NTIgYnl0ZXMgcmVhZCZuYnNwOyZuYnNwOyAyMTkgdGltZXMgKDE2LjIlKQorWyZuYnNwOyA0XSZuYnNwOyAxNDQ4IGJ5dGVzIHJlYWQmbmJzcDsgMTEyOCB0aW1lcyAoODMuNiUpPC9QUkU+PC9CTE9DS1FVT1RFPkhlcmUgCitpcyBhIGhvc3QgdGhhdCBkb2Vzbid0IHN1cHBvcnQgUGF0aCBNVFUgRGlzY292ZXJ5LiBJdCB3aWxsIG9ubHkgc2VuZCBhbmQgcmVjZWl2ZSAKK3NtYWxsIDU3NiBieXRlIHBhY2tldHMuIAorPEJMT0NLUVVPVEU+PFBSRT48Qj5ub2RlNCZndDs8L0I+IGlwZXJmIC1zIC1tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NlcnZlciBsaXN0ZW5pbmcgb24gVENQIHBvcnQgNTAwMQorVENQIHdpbmRvdyBzaXplOiAzMi4wIEtCeXRlIChkZWZhdWx0KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbJm5ic3A7IDRdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGU0Jmd0OyBwb3J0IDUwMDEgY29ubmVjdGVkIHdpdGggJmx0O0lQIEFkZHIgbm9kZTMmZ3Q7IHBvcnQgMTM5MTQKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aAorWyZuYnNwOyA0XSZuYnNwOyAwLjAtIDIuMyBzZWMmbmJzcDsmbmJzcDsgNjMyIEtCeXRlcyZuYnNwOyZuYnNwOyAyLjEgTWJpdHMvc2VjCis8Qj48Rk9OVCBjb2xvcj0jZmYwMDAwPldBUk5JTkc6IFBhdGggTVRVIERpc2NvdmVyeSBtYXkgbm90IGJlIGVuYWJsZWQuCis8L0ZPTlQ+PC9CPlsmbmJzcDsgNF0gPEI+PEZPTlQgY29sb3I9I2ZmMDAwMD5NU1Mgc2l6ZSA1MzYgYnl0ZXMgKE1UVSA1NzYgYnl0ZXMsIG1pbmltdW0pCis8L0ZPTlQ+PC9CPlsmbmJzcDsgNF0gUmVhZCBsZW5ndGhzIG9jY3VycmluZyBpbiBtb3JlIHRoYW4gNSUgb2YgcmVhZHM6CitbJm5ic3A7IDRdJm5ic3A7Jm5ic3A7IDUzNiBieXRlcyByZWFkJm5ic3A7Jm5ic3A7IDMwOCB0aW1lcyAoNTguNCUpCitbJm5ic3A7IDRdJm5ic3A7IDEwNzIgYnl0ZXMgcmVhZCZuYnNwOyZuYnNwOyZuYnNwOyA5MSB0aW1lcyAoMTcuMyUpCitbJm5ic3A7IDRdJm5ic3A7IDE2MDggYnl0ZXMgcmVhZCZuYnNwOyZuYnNwOyZuYnNwOyAyOSB0aW1lcyAoNS41JSk8L1BSRT48L0JMT0NLUVVPVEU+SXBlcmYgCitzdXBwb3J0cyBvdGhlciB0dW5pbmcgb3B0aW9ucywgd2hpY2ggd2VyZSBhZGRlZCBmb3IgZXhjZXB0aW9uYWwgbmV0d29yayAKK3NpdHVhdGlvbnMgbGlrZSBISVBQSS10by1ISVBQSSBvdmVyIEFUTS4gPEJSPgorPEhSPgorPCEtLSAtLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLT4KKworPEgyPjxBIG5hbWU9dHVuaW5ndWRwPjwvQT5UdW5pbmcgYSBVRFAgY29ubmVjdGlvbjwvSDI+CisKK0lwZXJmIGNyZWF0ZXMgYSBjb25zdGFudCBiaXQgcmF0ZSBVRFAgc3RyZWFtLiBUaGlzIGlzIGEgdmVyeSBhcnRpZmljaWFsIAorc3RyZWFtLCBzaW1pbGFyIHRvIHZvaWNlIGNvbW11bmljYXRpb24gYnV0IG5vdCBtdWNoIGVsc2UuIAorPFA+CisKK1lvdSB3aWxsIHdhbnQgdG8gYWRqdXN0IHRoZSBkYXRhZ3JhbSBzaXplICgtbCkgdG8gdGhlIHNpemUgeW91ciBhcHBsaWNhdGlvbiAKK3VzZXMuIAorPFA+CisKK1RoZSBzZXJ2ZXIgZGV0ZWN0cyBVRFAgZGF0YWdyYW0gbG9zcyBieSBJRCBudW1iZXJzIGluIHRoZSBkYXRhZ3JhbXMuIFVzdWFsbHkgCithIFVEUCBkYXRhZ3JhbSBiZWNvbWVzIHNldmVyYWwgSVAgcGFja2V0cy4gTG9zaW5nIGEgc2luZ2xlIElQIHBhY2tldCB3aWxsIGxvc2UgCit0aGUgZW50aXJlIGRhdGFncmFtLiBUbyBtZWFzdXJlIHBhY2tldCBsb3NzIGluc3RlYWQgb2YgZGF0YWdyYW0gbG9zcywgbWFrZSB0aGUgCitkYXRhZ3JhbXMgc21hbGwgZW5vdWdoIHRvIGZpdCBpbnRvIGEgc2luZ2xlIHBhY2tldCwgdXNpbmcgdGhlIC1sIG9wdGlvbi4gVGhlIAorZGVmYXVsdCBzaXplIG9mIDE0NzAgYnl0ZXMgd29ya3MgZm9yIGV0aGVybmV0LiBPdXQtb2Ytb3JkZXIgcGFja2V0cyBhcmUgYWxzbyAKK2RldGVjdGVkLiAoT3V0LW9mLW9yZGVyIHBhY2tldHMgY2F1c2Ugc29tZSBhbWJpZ3VpdHkgaW4gdGhlIGxvc3QgcGFja2V0IGNvdW50OyAKK0lwZXJmIGFzc3VtZXMgdGhleSBhcmUgbm90IGR1cGxpY2F0ZSBwYWNrZXRzLCBzbyB0aGV5IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBsb3N0IAorcGFja2V0IGNvdW50LikgU2luY2UgVENQIGRvZXMgbm90IHJlcG9ydCBsb3NzIHRvIHRoZSB1c2VyLCBJIGZpbmQgVURQIHRlc3RzIAoraGVscGZ1bCB0byBzZWUgcGFja2V0IGxvc3MgYWxvbmcgYSBwYXRoLiAKKzxQPgorCitKaXR0ZXIgY2FsY3VsYXRpb25zIGFyZSBjb250aW51b3VzbHkgY29tcHV0ZWQgYnkgdGhlIHNlcnZlciwgYXMgc3BlY2lmaWVkIGJ5IAorUlRQIGluIFJGQyAxODg5LiBUaGUgY2xpZW50IHJlY29yZHMgYSA2NCBiaXQgc2Vjb25kL21pY3Jvc2Vjb25kIHRpbWVzdGFtcCBpbiB0aGUgCitwYWNrZXQuIFRoZSBzZXJ2ZXIgY29tcHV0ZXMgdGhlIHJlbGF0aXZlIHRyYW5zaXQgdGltZSBhcyAoc2VydmVyJ3MgcmVjZWl2ZSB0aW1lIAorLSBjbGllbnQncyBzZW5kIHRpbWUpLiBUaGUgY2xpZW50J3MgYW5kIHNlcnZlcidzIGNsb2NrcyBkbyBub3QgbmVlZCB0byBiZSAKK3N5bmNocm9uaXplZDsgYW55IGRpZmZlcmVuY2UgaXMgc3VidHJhY3RlZCBvdXQgaW4gdGhlIGppdHRlciBjYWxjdWxhdGlvbi4gSml0dGVyIAoraXMgdGhlIHNtb290aGVkIG1lYW4gb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSB0cmFuc2l0IHRpbWVzLiAKKzxCTE9DS1FVT1RFPjxQUkU+PEI+bm9kZTImZ3Q7PC9CPiBpcGVyZiAtcyAtdSAtaSAxCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NlcnZlciBsaXN0ZW5pbmcgb24gVURQIHBvcnQgNTAwMQorUmVjZWl2aW5nIDE0NzAgYnl0ZSBkYXRhZ3JhbXMKK1VEUCBidWZmZXIgc2l6ZTogNjAuMCBLQnl0ZSAoZGVmYXVsdCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWyZuYnNwOyA0XSBsb2NhbCAmbHQ7SVAgQWRkciBub2RlMiZndDsgcG9ydCA1MDAxIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGUxJmd0OyBwb3J0IDk3MjYKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBKaXR0ZXImbmJzcDsmbmJzcDsgTG9zdC9Ub3RhbCBEYXRhZ3JhbXMKK1smbmJzcDsgNF0mbmJzcDsgMC4wLSAxLjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4yMDkgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMS8mbmJzcDsgODk0ICgwLjExJSkKK1smbmJzcDsgNF0mbmJzcDsgMS4wLSAyLjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4yMjEgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkyICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgMi4wLSAzLjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4yNzcgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkyICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgMy4wLSA0LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4zNTkgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkzICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgNC4wLSA1LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4yNTEgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkyICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgNS4wLSA2LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4yMTUgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkyICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgNi4wLSA3LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4zMjUgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkyICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgNy4wLSA4LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4yNTQgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkyICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgOC4wLSA5LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4yODIgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsgODkyICgwJSkKK1smbmJzcDsgNF0mbmJzcDsgMC4wLTEwLjAgc2VjJm5ic3A7IDEyLjUgTUJ5dGVzJm5ic3A7IDEwLjAgTWJpdHMvc2VjJm5ic3A7IDAuMjQzIG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDEvIDg5MjIgKDAuMDExJSkKKworPEI+bm9kZTEmZ3Q7PC9CPiBpcGVyZiAtYyBub2RlMiAtdSAtYiAxMG0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ2xpZW50IGNvbm5lY3RpbmcgdG8gbm9kZTIsIFVEUCBwb3J0IDUwMDEKK1NlbmRpbmcgMTQ3MCBieXRlIGRhdGFncmFtcworVURQIGJ1ZmZlciBzaXplOiA2MC4wIEtCeXRlIChkZWZhdWx0KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbJm5ic3A7IDNdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGUxJmd0OyBwb3J0IDk3MjYgY29ubmVjdGVkIHdpdGggJmx0O0lQIEFkZHIgbm9kZTImZ3Q7IHBvcnQgNTAwMQorWyBJRF0gSW50ZXJ2YWwmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgVHJhbnNmZXImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQmFuZHdpZHRoCitbJm5ic3A7IDNdJm5ic3A7IDAuMC0xMC4wIHNlYyZuYnNwOyAxMi41IE1CeXRlcyZuYnNwOyAxMC4wIE1iaXRzL3NlYworWyZuYnNwOyAzXSBTZW50IDg5MjIgZGF0YWdyYW1zPC9QUkU+PC9CTE9DS1FVT1RFPk5vdGljZSB0aGUgaGlnaGVyIGppdHRlciBkdWUgdG8gCitkYXRhZ3JhbSByZWFzc2VtYmx5IHdoZW4gdXNpbmcgbGFyZ2VyIDMyIEtCIGRhdGFncmFtcywgZWFjaCBzcGxpdCBpbnRvIDIzIAorcGFja2V0cyBvZiAxNTAwIGJ5dGVzLiBUaGUgaGlnaGVyIGRhdGFncmFtIGxvc3Mgc2VlbiBoZXJlIG1heSBiZSBkdWUgdG8gdGhlIAorYnVyc3RpbmVzcyBvZiB0aGUgdHJhZmZpYywgd2hpY2ggaXMgMjMgYmFjay10by1iYWNrIHBhY2tldHMgYW5kIHRoZW4gYSBsb25nIAorcGF1c2UsIHJhdGhlciB0aGFuIGV2ZW5seSBzcGFjZWQgaW5kaXZpZHVhbCBwYWNrZXRzLiAKKzxCTE9DS1FVT1RFPjxQUkU+PEI+bm9kZTImZ3Q7PC9CPiBpcGVyZiAtcyAtdSAtbCAzMmsgLXcgMTI4ayAtaSAxCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NlcnZlciBsaXN0ZW5pbmcgb24gVURQIHBvcnQgNTAwMQorUmVjZWl2aW5nIDMyNzY4IGJ5dGUgZGF0YWdyYW1zCitVRFAgYnVmZmVyIHNpemU6Jm5ic3A7IDEyOCBLQnl0ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbJm5ic3A7IDNdIGxvY2FsICZsdDtJUCBBZGRyIG5vZGUyJmd0OyBwb3J0IDUwMDEgY29ubmVjdGVkIHdpdGggJmx0O0lQIEFkZHIgbm9kZTEmZ3Q7IHBvcnQgMTEzMDMKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBKaXR0ZXImbmJzcDsmbmJzcDsgTG9zdC9Ub3RhbCBEYXRhZ3JhbXMKK1smbmJzcDsgM10mbmJzcDsgMC4wLSAxLjAgc2VjJm5ic3A7Jm5ic3A7IDEuMyBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC40MzAgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsmbmJzcDsgNDEgKDAlKQorWyZuYnNwOyAzXSZuYnNwOyAxLjAtIDIuMCBzZWMmbmJzcDsmbmJzcDsgMS4xIE1CeXRlcyZuYnNwOyZuYnNwOyA4LjUgTWJpdHMvc2VjJm5ic3A7IDUuOTk2IG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDYvJm5ic3A7Jm5ic3A7IDQwICgxNSUpCitbJm5ic3A7IDNdJm5ic3A7IDIuMC0gMy4wIHNlYyZuYnNwOyZuYnNwOyAxLjIgTUJ5dGVzJm5ic3A7Jm5ic3A7IDkuNyBNYml0cy9zZWMmbmJzcDsgMC43OTYgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMS8mbmJzcDsmbmJzcDsgNDAgKDIuNSUpCitbJm5ic3A7IDNdJm5ic3A7IDMuMC0gNC4wIHNlYyZuYnNwOyZuYnNwOyAxLjIgTUJ5dGVzJm5ic3A7IDEwLjAgTWJpdHMvc2VjJm5ic3A7IDAuNDAzIG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDAvJm5ic3A7Jm5ic3A7IDQwICgwJSkKK1smbmJzcDsgM10mbmJzcDsgNC4wLSA1LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMiBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC40NDggbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsmbmJzcDsgNDAgKDAlKQorWyZuYnNwOyAzXSZuYnNwOyA1LjAtIDYuMCBzZWMmbmJzcDsmbmJzcDsgMS4yIE1CeXRlcyZuYnNwOyAxMC4wIE1iaXRzL3NlYyZuYnNwOyAwLjQ2NCBtcyZuYnNwOyZuYnNwOyZuYnNwOyAwLyZuYnNwOyZuYnNwOyA0MCAoMCUpCitbJm5ic3A7IDNdJm5ic3A7IDYuMC0gNy4wIHNlYyZuYnNwOyZuYnNwOyAxLjIgTUJ5dGVzJm5ic3A7IDEwLjAgTWJpdHMvc2VjJm5ic3A7IDAuNDQyIG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDAvJm5ic3A7Jm5ic3A7IDQwICgwJSkKK1smbmJzcDsgM10mbmJzcDsgNy4wLSA4LjAgc2VjJm5ic3A7Jm5ic3A7IDEuMiBNQnl0ZXMmbmJzcDsgMTAuMCBNYml0cy9zZWMmbmJzcDsgMC4zNDIgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsmbmJzcDsgNDAgKDAlKQorWyZuYnNwOyAzXSZuYnNwOyA4LjAtIDkuMCBzZWMmbmJzcDsmbmJzcDsgMS4yIE1CeXRlcyZuYnNwOyAxMC4wIE1iaXRzL3NlYyZuYnNwOyAwLjQzMSBtcyZuYnNwOyZuYnNwOyZuYnNwOyAwLyZuYnNwOyZuYnNwOyA0MCAoMCUpCitbJm5ic3A7IDNdJm5ic3A7IDkuMC0xMC4wIHNlYyZuYnNwOyZuYnNwOyAxLjIgTUJ5dGVzJm5ic3A7IDEwLjAgTWJpdHMvc2VjJm5ic3A7IDAuNDA3IG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDAvJm5ic3A7Jm5ic3A7IDQwICgwJSkKK1smbmJzcDsgM10mbmJzcDsgMC4wLTEwLjAgc2VjJm5ic3A7IDEyLjMgTUJ5dGVzJm5ic3A7Jm5ic3A7IDkuOCBNYml0cy9zZWMmbmJzcDsgMC40MDcgbXMmbmJzcDsmbmJzcDsmbmJzcDsgNy8mbmJzcDsgNDAxICgxLjclKQorCis8Qj5ub2RlMSZndDs8L0I+IGlwZXJmIC1jIG5vZGUyIC1iIDEwbSAtbCAzMmsgLXcgMTI4aworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDbGllbnQgY29ubmVjdGluZyB0byBub2RlMiwgVURQIHBvcnQgNTAwMQorU2VuZGluZyAzMjc2OCBieXRlIGRhdGFncmFtcworVURQIGJ1ZmZlciBzaXplOiZuYnNwOyAxMjggS0J5dGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWyZuYnNwOyAzXSBsb2NhbCAmbHQ7SVAgQWRkciBub2RlMiZndDsgcG9ydCAxMTMwMyBjb25uZWN0ZWQgd2l0aCAmbHQ7SVAgQWRkciBub2RlMSZndDsgcG9ydCA1MDAxCitbIElEXSBJbnRlcnZhbCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUcmFuc2ZlciZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBCYW5kd2lkdGgKK1smbmJzcDsgM10mbmJzcDsgMC4wLTEwLjAgc2VjJm5ic3A7IDEyLjUgTUJ5dGVzJm5ic3A7IDEwLjAgTWJpdHMvc2VjCitbJm5ic3A7IDNdIFNlbnQgNDAxIGRhdGFncmFtczwvUFJFPjxQUkU+PC9QUkU+PC9CTE9DS1FVT1RFPgorPFA+PEEgbmFtZT1tdWx0aWNhc3Q+PC9BPgorPEI+PEZPTlQgc2l6ZT0rMT5NdWx0aWNhc3Q8L0ZPTlQ+PC9CPiAKKzxQPlRvIHRlc3QgbXVsdGljYXN0LCBydW4gc2V2ZXJhbCBzZXJ2ZXJzIHdpdGggdGhlIGJpbmQgb3B0aW9uICgtQiwgLS1iaW5kKSBzZXQgCit0byB0aGUgbXVsdGljYXN0IGdyb3VwIGFkZHJlc3MuIFJ1biB0aGUgY2xpZW50LCBjb25uZWN0aW5nIHRvIHRoZSBtdWx0aWNhc3QgCitncm91cCBhZGRyZXNzIGFuZCBzZXR0aW5nIHRoZSBUVEwgKC1ULCAtLXR0bCkgYXMgbmVlZGVkLiBVbmxpa2Ugbm9ybWFsIFRDUCBhbmQgCitVRFAgdGVzdHMsIG11bHRpY2FzdCBzZXJ2ZXJzIG1heSBiZSBzdGFydGVkIGFmdGVyIHRoZSBjbGllbnQuIEluIHRoYXQgY2FzZSwgCitkYXRhZ3JhbXMgc2VudCBiZWZvcmUgdGhlIHNlcnZlciBzdGFydGVkIHNob3cgdXAgYXMgbG9zc2VzIGluIHRoZSBmaXJzdCBwZXJpb2RpYyAKK3JlcG9ydCAoNjEgZGF0YWdyYW1zIG9uIGFybm8gYmVsb3cpLiAKKzxCTE9DS1FVT1RFPjxQUkU+PEI+bm9kZTUmZ3Q7PC9CPiBpcGVyZiAtYyAyMjQuMC42Ny42NyAtdSAtLXR0bCA1IC10IDUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ2xpZW50IGNvbm5lY3RpbmcgdG8gMjI0LjAuNjcuNjcsIFVEUCBwb3J0IDUwMDEKK1NlbmRpbmcgMTQ3MCBieXRlIGRhdGFncmFtcworU2V0dGluZyBtdWx0aWNhc3QgVFRMIHRvIDUKK1VEUCBidWZmZXIgc2l6ZTogMzIuMCBLQnl0ZSAoZGVmYXVsdCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorWyZuYnNwOyAzXSBsb2NhbCAmbHQ7SVAgQWRkciBub2RlNSZndDsgcG9ydCAxMDI1IGNvbm5lY3RlZCB3aXRoIDIyNC4wLjY3LjY3IHBvcnQgNTAwMQorWyBJRF0gSW50ZXJ2YWwmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgVHJhbnNmZXImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgQmFuZHdpZHRoCitbJm5ic3A7IDNdJm5ic3A7IDAuMC0gNS4wIHNlYyZuYnNwOyZuYnNwOyA2NDIgS0J5dGVzJm5ic3A7Jm5ic3A7IDEuMCBNYml0cy9zZWMKK1smbmJzcDsgM10gU2VudCA0NDcgZGF0YWdyYW1zCisKKzxCPm5vZGU1Jmd0OzwvQj4gaXBlcmYgLXMgLXUgLUIgMjI0LjAuNjcuNjcgLWkgMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTZXJ2ZXIgbGlzdGVuaW5nIG9uIFVEUCBwb3J0IDUwMDEKK0JpbmRpbmcgdG8gbG9jYWwgYWRkcmVzcyAyMjQuMC42Ny42NworSm9pbmluZyBtdWx0aWNhc3QgZ3JvdXAmbmJzcDsgMjI0LjAuNjcuNjcKK1JlY2VpdmluZyAxNDcwIGJ5dGUgZGF0YWdyYW1zCitVRFAgYnVmZmVyIHNpemU6IDMyLjAgS0J5dGUgKGRlZmF1bHQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1smbmJzcDsgM10gbG9jYWwgMjI0LjAuNjcuNjcgcG9ydCA1MDAxIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGU1Jmd0OyBwb3J0IDEwMjUKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBKaXR0ZXImbmJzcDsmbmJzcDsgTG9zdC9Ub3RhbCBEYXRhZ3JhbXMKK1smbmJzcDsgM10mbmJzcDsgMC4wLSAxLjAgc2VjJm5ic3A7Jm5ic3A7IDEzMSBLQnl0ZXMmbmJzcDsmbmJzcDsgMS4wIE1iaXRzL3NlYyZuYnNwOyAwLjAwNyBtcyZuYnNwOyZuYnNwOyZuYnNwOyAwLyZuYnNwOyZuYnNwOyA5MSAoMCUpCitbJm5ic3A7IDNdJm5ic3A7IDEuMC0gMi4wIHNlYyZuYnNwOyZuYnNwOyAxMjggS0J5dGVzJm5ic3A7Jm5ic3A7IDEuMCBNYml0cy9zZWMmbmJzcDsgMC4wMDggbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsmbmJzcDsgODkgKDAlKQorWyZuYnNwOyAzXSZuYnNwOyAyLjAtIDMuMCBzZWMmbmJzcDsmbmJzcDsgMTI4IEtCeXRlcyZuYnNwOyZuYnNwOyAxLjAgTWJpdHMvc2VjJm5ic3A7IDAuMDEwIG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDAvJm5ic3A7Jm5ic3A7IDg5ICgwJSkKK1smbmJzcDsgM10mbmJzcDsgMy4wLSA0LjAgc2VjJm5ic3A7Jm5ic3A7IDEyOCBLQnl0ZXMmbmJzcDsmbmJzcDsgMS4wIE1iaXRzL3NlYyZuYnNwOyAwLjAxMyBtcyZuYnNwOyZuYnNwOyZuYnNwOyAwLyZuYnNwOyZuYnNwOyA4OSAoMCUpCitbJm5ic3A7IDNdJm5ic3A7IDQuMC0gNS4wIHNlYyZuYnNwOyZuYnNwOyAxMjggS0J5dGVzJm5ic3A7Jm5ic3A7IDEuMCBNYml0cy9zZWMmbmJzcDsgMC4wMDggbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsmbmJzcDsgODkgKDAlKQorWyZuYnNwOyAzXSZuYnNwOyAwLjAtIDUuMCBzZWMmbmJzcDsmbmJzcDsgNjQyIEtCeXRlcyZuYnNwOyZuYnNwOyAxLjAgTWJpdHMvc2VjJm5ic3A7IDAuMDA4IG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDAvJm5ic3A7IDQ0NyAoMCUpCisKKzxCPm5vZGU2Jmd0OzwvQj4gaXBlcmYgLXMgLXUgLUIgMjI0LjAuNjcuNjcgLWkgMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTZXJ2ZXIgbGlzdGVuaW5nIG9uIFVEUCBwb3J0IDUwMDEKK0JpbmRpbmcgdG8gbG9jYWwgYWRkcmVzcyAyMjQuMC42Ny42NworSm9pbmluZyBtdWx0aWNhc3QgZ3JvdXAmbmJzcDsgMjI0LjAuNjcuNjcKK1JlY2VpdmluZyAxNDcwIGJ5dGUgZGF0YWdyYW1zCitVRFAgYnVmZmVyIHNpemU6IDYwLjAgS0J5dGUgKGRlZmF1bHQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1smbmJzcDsgM10gbG9jYWwgMjI0LjAuNjcuNjcgcG9ydCA1MDAxIGNvbm5lY3RlZCB3aXRoICZsdDtJUCBBZGRyIG5vZGU1Jmd0OyBwb3J0IDEwMjUKK1sgSURdIEludGVydmFsJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRyYW5zZmVyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEJhbmR3aWR0aCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBKaXR0ZXImbmJzcDsmbmJzcDsgTG9zdC9Ub3RhbCBEYXRhZ3JhbXMKK1smbmJzcDsgM10mbmJzcDsgMC4wLSAxLjAgc2VjJm5ic3A7Jm5ic3A7IDEyOSBLQnl0ZXMmbmJzcDsmbmJzcDsgMS4wIE1iaXRzL3NlYyZuYnNwOyAwLjc3OCBtcyZuYnNwOyZuYnNwOyA2MS8mbmJzcDsgMTUxICg0MCUpCitbJm5ic3A7IDNdJm5ic3A7IDEuMC0gMi4wIHNlYyZuYnNwOyZuYnNwOyAxMjggS0J5dGVzJm5ic3A7Jm5ic3A7IDEuMCBNYml0cy9zZWMmbmJzcDsgMC4yMzYgbXMmbmJzcDsmbmJzcDsmbmJzcDsgMC8mbmJzcDsmbmJzcDsgODkgKDAlKQorWyZuYnNwOyAzXSZuYnNwOyAyLjAtIDMuMCBzZWMmbmJzcDsmbmJzcDsgMTI4IEtCeXRlcyZuYnNwOyZuYnNwOyAxLjAgTWJpdHMvc2VjJm5ic3A7IDAuMjY0IG1zJm5ic3A7Jm5ic3A7Jm5ic3A7IDAvJm5ic3A7Jm5ic3A7IDg5ICgwJSkKK1smbmJzcDsgM10mbmJzcDsgMy4wLSA0LjAgc2VjJm5ic3A7Jm5ic3A7IDEyOCBLQnl0ZXMmbmJzcDsmbmJzcDsgMS4wIE1iaXRzL3NlYyZuYnNwOyAwLjI0OCBtcyZuYnNwOyZuYnNwOyZuYnNwOyAwLyZuYnNwOyZuYnNwOyA4OSAoMCUpCitbJm5ic3A7IDNdJm5ic3A7IDAuMC0gNC4zIHNlYyZuYnNwOyZuYnNwOyA1NTQgS0J5dGVzJm5ic3A7Jm5ic3A7IDEuMCBNYml0cy9zZWMmbmJzcDsgMC4yOTggbXMmbmJzcDsmbmJzcDsgNjEvJm5ic3A7IDQ0NyAoMTQlKTwvUFJFPjxQUkU+PEhSIHdpZHRoPSIxMDAlIj48L1BSRT48L0JMT0NLUVVPVEU+Cis8UD48QSBuYW1lPWlwdjY+PC9BPgorPERMPgorICA8RFQ+PEI+PEZPTlQgc2l6ZT0rMj5JUHY2IE1vZGU8L0ZPTlQ+PC9CPiAKKyAgPEREPkRvd25sb2FkIHRoZSBJUHY2IHZlcnNpb24gb2YgdGhpcyByZWxlYXNlLjxCUj5HZXQgdGhlIElQdjYgYWRkcmVzcyBvZiB0aGUgbm9kZSB1c2luZyB0aGUgJ2lmY29uZmlnJyBjb21tYW5kLjxCUj5Vc2UgdGhlIDxGT05UIGNvbG9yPSMwMDAwOTk+LVY8L0ZPTlQ+IG9wdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHlvdSBhcmUgdXNpbmcgYW4gSVB2NiBhZGRyZXNzIFBsZWFzZSBub3RlIHRoYXQgd2UgbmVlZCB0byBleHBsaWNpdGx5IGJpbmQgdGhlIHNlcnZlciBhZGRyZXNzIGFsc28uIAorICA8UD5TZXJ2ZXIgc2lkZTo8QlI+PEZPTlQgY29sb3I9IzAwMDA5OT4gJCBpcGVyZiAtcyAtVjwvRk9OVD4KKyAgPFA+Q2xpZW50IHNpZGU6PEJSPjxGT05UIGNvbG9yPSMwMDAwOTk+JCBpcGVyZiAtYyAmbHQ7U2VydmVyIElQdjYgQWRkcmVzcyZndDsgLVYgPC9GT05UPgorICA8UD5Ob3RlOiBJcGVyZiB2ZXJzaW9uIDEuNi4yIGFuZCBlYXJpbGVyIHJlcXVpcmUgYSBJUHY2IGFkZHJlc3MgdG8gYmUgZXhwbGljaXRseSBib3VuZAorICB3aXRoIHRoZSA8QSBIUkVGPSIjYmluZCI+LUI8L0E+IG9wdGlvbiBmb3IgdGhlIHNlcnZlci48L1A+PC9ERD48L0RMPgorPEhSPgorPFA+PEEgbmFtZT1yZXBtb2RlPjwvQT4KKzxETD4KKyAgPERUPjxCPjxGT05UIHNpemU9KzI+VXNpbmcgUmVwcmVzZW50YXRpdmUgU3RyZWFtcyB0byBtZWFzdXJlIAorICBiYW5kd2lkdGg8L0ZPTlQ+PC9CPiAKKyAgPEREPlVzZSB0aGUgLUYgb3IgLUkgb3B0aW9uLiBJZiB5b3Ugd2FudCB0byB0ZXN0IGhvdyB5b3VyIG5ldHdvcmsgcGVyZm9ybXMgCisgIHdpdGggY29tcHJlc3NlZCAvIHVuY29tcHJlc3NlZCBzdHJlYW1zLCBqdXN0IGNyZWF0ZSByZXByZXNlbnRhdGl2ZSBzdHJlYW1zIGFuZCAKKyAgdXNlIHRoZSAtRiBvcHRpb24gdG8gdGVzdCBpdC4gVGhpcyBpcyB1c3VhbGx5IGR1ZSB0byB0aGUgbGluayBsYXllciAKKyAgY29tcHJlc3NpbmcgZGF0YS4gCisgIDxQPlRoZSAtRiBvcHRpb24gaXMgZm9yIGZpbGUgaW5wdXQuPEJSPlRoZSAtSSBvcHRpb24gaXMgZm9yIGlucHV0IGZyb20gc3RkaW4uIAorICA8UD5FLmcuIDxCUj5DbGllbnQ6ICQgPEZPTlQgY29sb3I9IzAwMDA5OT4gaXBlcmYgLWMgJmx0O3NlcnZlciBhZGRyZXNzJmd0OyAtRiAmbHQ7ZmlsZS1uYW1lJmd0OzxCUj48L0ZPTlQ+CisgICAgICAgICAgPEJSPkNsaWVudDogJCA8Rk9OVCBjb2xvcj0jMDAwMDk5PiBpcGVyZiAtYyAmbHQ7c2VydmVyIGFkZHJlc3MmZ3Q7IC1JIDwvRk9OVD48L1A+PC9ERD48L0RMPgorPFA+PEEgbmFtZT1kYWVtb24+PC9BPgorPEhSPgorPERMPgorICA8RFQ+PEI+PEZPTlQgc2l6ZT0rMj5SdW5uaW5nIHRoZSBzZXJ2ZXIgYXMgYSBkYWVtb248L0ZPTlQ+PC9CPiAKKyAgPEREPlVzZSB0aGUgLUQgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBydW4gdGhlIHNlcnZlciBhcyBhIGRhZW1vbi4gUmVkaXJlY3QgdGhlIAorICBvdXRwdXQgdG8gYSBmaWxlLjxCUj5FLmcuIDxGT05UIGNvbG9yPSMwMDAwOTk+aXBlcmYgLXMgLUQgJmd0OyAKKyAgaXBlcmZMb2c8L0ZPTlQ+LiA8Rk9OVCBjb2xvcj0jMDAwMDAwPlRoaXMgd2lsbCBoYXZlIHRoZSBJcGVyZiBTZXJ2ZXIgcnVubmluZyAKKyAgYXMgYSBkYWVtb24gYW5kIHRoZSBzZXJ2ZXIgbWVzc2FnZXMgd2lsbCBiZSBsb2dnZWQgaW4gdGhlIGZpbGUgaXBlcmZMb2cuIAorPC9ERD48L0RMPgorPEhSPgorPFA+PEEgbmFtZT1zZXJ2aWNlPjwvQT4KKzxETD4KKyAgPERUPjxCPjxGT05UIHNpemU9KzI+VXNpbmcgSXBlcmYgYXMgYSBTZXJ2aWNlIHVuZGVyIFdpbjMyPC9GT05UPjwvQj4gCisgIDxERD5UaGVyZSBhcmUgdGhyZWUgb3B0aW9ucyBmb3IgV2luMzI6IAorICA8UD4KKyAgPERMPgorICAgIDxEVD4tbyBvdXRwdXRmaWxlbmFtZSAKKyAgICA8REQ+b3V0cHV0IHRoZSBtZXNzYWdlcyBpbnRvIHRoZSBzcGVjaWZpZWQgZmlsZSAKKyAgICA8RFQ+LXMgLUQgCisgICAgPEREPmluc3RhbGwgSXBlcmYgYXMgYSBzZXJ2aWNlIGFuZCBydW4gaXQgCisgICAgPERUPi1zIC1SIAorICAgIDxERD51bmluc3RhbGwgdGhlIElwZXJmIHNlcnZpY2UgPC9ERD48L0RMPgorICA8UD5FeGFtcGxlczogCisgIDxETD4KKyAgICA8RFQ+PEZPTlQgY29sb3I9IzMzNjZmZj5pcGVyZiAtcyAtRCAtbyBpcGVyZmxvZy50eHQ8L0ZPTlQ+IAorICAgIDxERD53aWxsIGluc3RhbGwgdGhlIElwZXJmIHNlcnZpY2UgYW5kIHJ1biBpdC4gTWVzc2FnZXMgd2lsbCBiZSByZXBvcnRlZCAKKyAgICBpbnRvICIld2luZGlyJVxzeXN0ZW0zMlxpcGVyZmxvZy50eHQiIAorICAgIDxQPjwvUD4KKyAgICA8RFQ+PEZPTlQgY29sb3I9IzMzNjZmZj5pcGVyZiAtcyAtUjwvRk9OVD4gCisgICAgPEREPndpbGwgdW5pbnN0YWxsIHRoZSBJcGVyZiBzZXJ2aWNlIGlmIGl0IGlzIGluc3RhbGxlZC4gCisgICAgPFA+Tm90ZTogSWYgeW91IHN0b3Agd2FudCB0byByZXN0YXJ0IHRoZSBJcGVyZiBzZXJ2aWNlIGFmdGVyIGhhdmluZyBraWxsZWQgCisgICAgaXQgd2l0aCB0aGUgTWljcm9zb2Z0IE1hbmFnZW1lbnQgQ29uc29sZSBvciB0aGUgV2luZG93cyBUYXNrIE1hbmFnZXIsIG1ha2UgCisgICAgc3VyZSB0byB1c2UgdGhlIHByb3BlciBPUFRJT04gaW4gdGhlIHNlcnZpY2UgcHJvcGVydGllcyBkaWFsb2cuIAorICA8L1A+PC9ERD48L0RMPjwvREQ+PC9ETD4KKzxIUj4KKzwhLS08UD48QSBuYW1lPW11bHRpY2FzdD48L0E+Cis8REw+CisgIDxEVD48Qj48Rk9OVCBzaXplPSsyPlJ1bm5pbmcgdGhlIG11bHRpY2FzdCBzZXJ2ZXIgYW5kIGNsaWVudDwvRk9OVD48L0I+IAorICA8REQ+VXNlIHRoZSAtQiBvcHRpb24gd2hpbGUgc3RhcnRpbmcgdGhlIHNlcnZlciB0byBiaW5kIGl0IHRvIGEgbXVsdGljYXN0IAorICBhZGRyZXNzLjxCUj5FLmcuIDotPEZPTlQgY29sb3I9IzMzNjZmZj5pcGVyZiAtcyAtdSAtQiAyMjQuMC41NS41NTwvRk9OVD4uIAorCisgIDxQPlRoaXMgd2lsbCBoYXZlIHRoZSBJcGVyZiBzZXJ2ZXIgbGlzdGVuaW5nIGZvciBkYXRhZ3JhbXMgKC11KSBmb3IgdGhlIAorICBhZGRyZXNzIDIyNC4wLjU1LjU1KC1CIDIyNC4wLjU1LjU1KS4gCisgIDxQPk5vdywgc3RhcnQgYSBjbGllbnQgc2VuZGluZyBwYWNrZXRzIHRvIHRoaXMgbXVsdGljYXN0IGFkZHJlc3MuIAorICA8UD5FLmcuIDogPEZPTlQgY29sb3I9IzMzNjZmZj5pcGVyZiAtYyAyMjQuMC41NS41NSAtdTwvRk9OVD4uIAorICBUaGlzIHdpbGwgaGF2ZSBhIFVEUCBjbGllbnQgKC11KSBzZW5kaW5nIHRvIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyAKKyAgMjI0LjAuNTUuNTUoLWMgMjI0LjAuNTUuNTUpLiAKKyAgPFA+PEZPTlQgY29sb3I9IzAwMDAwMD5TdGFydCBtdWx0aXBsZSBjbGllbnRzIG9yIHNlcnZlcnMgYXMgZXhwbGFpbmVkIGFib3ZlLCAKKyAgc2VuZGluZyBkYXRhIHRvIHRoZSBzYW1lIG11bHRpY2FzdCBzZXJ2ZXIuIChJZiB5b3UgaGF2ZSBtdWx0aXBsZSBzZXJ2ZXJzIAorICBsaXN0ZW5pbmcgb24gdGhlIG11bHRpY2FzdCBhZGRyZXNzLCBlYWNoIG9mIHRoZSBzZXJ2ZXJzIHdpbGwgYmUgZ2V0dGluZyB0aGUgZGF0YSkgCis8L1A+PC9ERD48L0RMPgorPEhSPi0tPgorPCEtLTxBIG5hbWU9YWRhcHRpdmU+PC9BPgorPERMPgorICA8RFQ+PEI+PEZPTlQgc2l6ZT0rMj5BZGFwdGl2ZSB3aW5kb3cgc2l6ZXM8L0ZPTlQ+PC9CPiAKKyAgPEREPlVzZSB0aGUgLVcgb3B0aW9uIG9uIHRoZSBjbGllbnQgdG8gcnVuIHRoZSBjbGllbnQgd2l0aCB0aGUgYWRhcHRpdmUgd2luZG93IAorICBzaXplLiBFbnN1cmUgdGhhdCB0aGUgc2VydmVyIHdpbmRvdyBzaXplIGlzIGZhaXJseSBiaWcgZm9yIHRoaXMgCisgIG9wdGlvbi48QlI+RS5nLi4gSWYgdGhlIHNlcnZlciBUQ1Agd2luZG93IHNpemUgaXMgOEtCLCBpdCBkb2VzIG5vdCBoZWxwIGhhdmluZyAKKyAgYSBjbGllbnQgVENQIHdpbmRvdyBzaXplIG9mIDI1NktCLjxCUj4yNTZLQiBTZXJ2ZXIgVENQIFdpbmRvdyBTaXplIHNob3VsZCAKKyAgc3VmZmljZSBmb3IgbW9zdCBoaWdoIGJhbmR3aWR0aCBuZXR3b3Jrcy4gCisgIDxQPkNsaWVudCBjaGFuZ2VzIHRoZSBUQ1Agd2luZG93IHNpemUgdXNpbmcgYSBiaW5hcnkgZXhwb25lbnRpYWwgCisgIGFsZ29yaXRobS4gVGhpcyBtZWFucyB0aGF0IHlvdSBtYXkgbm90aWNlIHRoYXQgVENQIHdpbmRvdyBzaXplIHN1Z2dlc3RlZCBtYXkgCisgIHZhcnkgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljIGluIHRoZSBuZXR3b3JrLCBJcGVyZiB3aWxsIHN1Z2dlc3QgdGhlIGJlc3QgCisgIHdpbmRvdyBzaXplIGZvciB0aGUgY3VycmVudCBuZXR3b3JrIHNjZW5hcmlvLiAKKzwvREw+Cis8SFIgd2lkdGg9IjEwMCUiPgorLS0+PFA+PCEtLSAtLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLT4KKzxDRU5URVI+Cis8UD5Db3B5cmlnaHQgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDQgPEJSPlRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiAKK0lsbGlub2lzIDxCUj5BbGwgcmlnaHRzIHJlc2VydmVkIDxCUj5TZWUgPEEgCitocmVmPSJ1aV9saWNlbnNlLmh0bWwiPlVJIExpY2Vuc2U8L0E+IGZvciAKK2NvbXBsZXRlIGRldGFpbHMuPC9DRU5URVI+Cis8L0JPRFk+Cis8L0hUTUw+CisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2RvYy91aV9saWNlbnNlLmh0bWwgYi9pcGVyZi0yLjAuNS9kb2MvdWlfbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOWIwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9kb2MvdWlfbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsOTAgQEAKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+SXBlcmYgQ29weXJpZ2h0PC9USVRMRT4KKzwhLS0gJElkOiB1aV9saWNlbnNlLmh0bWwsdiAxLjEuMS4xIDIwMDQvMDUvMTggMDE6NTA6NDQga2dpYmJzIEV4cCAkIC0tPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMSU5LPSIjMDA2NjMzIiBWTElOSz0iIzY2OTkwMCIgQUxJTks9IiM2Njk5NjYiPgorCis8Q0VOVEVSPgorPFA+PElNRyBTUkM9ImRhc3QuZ2lmIgorICAgICAgICBBTFQ9IkRpc3RyaWJ1dGVkIEFwcGxpY2F0aW9ucyBTdXBwb3J0IFRlYW0iPjwvUD4KKzwvQ0VOVEVSPgorCisKKzxIMSBBTElHTj1DRU5URVI+SXBlcmYgQ29weXJpZ2h0PC9IMT4KKworPEhSPjwhLS0gLS0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0+CisKKzxDRU5URVI+CitDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA0LDIwMDUgIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pczxicj4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCis8UD4KKworPGEgaHJlZj0iaHR0cDovL2Rhc3QubmxhbnIubmV0L1Byb2plY3RzL0lwZXJmIj5JcGVyZiBwZXJmb3JtYW5jZSB0ZXN0PC9hPjxCUj4KK01hcmsgR2F0ZXM8QlI+CitBamF5IFRpcnVtYWxhPGJyPgorSmltIEZlcmd1c29uPGJyPgorSm9uIER1Z2FuPGJyPgorRmVuZyBRaW48YnI+CitLZXZpbiBHaWJiczxicj4KK0pvaG4gRXN0YWJyb29rPEJSPgorTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIDxCUj4KK05hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIDxCUj4KK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiA8QlI+Cis8YSBocmVmPSJodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUiPmh0dHA6Ly93d3cubmNzYS51aXVjLmVkdTwvYT4KKzwvY2VudGVyPgorPFA+CisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpCithbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKK3Jlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCitTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorPHA+Cis8dWw+Cis8bGk+UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKKyAgICBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorPHA+CisKKzxsaT5SZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAorICAgIG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzxwPgorCis8bGk+TmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICAgIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorPC91bD4KKzxwPgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKK05PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SCitDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworPC9wcmU+CisKKworPEhSPjwhLS0gLS0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0tLSAtLS0tIC0tLS0gLS0+CisKKzxDRU5URVI+Cis8UD48Rk9OVCBGQUNFPSJoZWx2ZXRpY2EsYXJpYWwiIFNJWkU9IjIiPgorCis8QSBIUkVGPSJtYWlsdG86ZGFzdEBubGFuci5uZXQiPmRhc3RAbmxhbnIubmV0PC9BPgorCitMYXN0IG1vZGlmaWVkOiBKYW4gNSwgMjAwNDxicj4KKworPEEgSFJFRj0iaHR0cDovL3d3dy5ubGFuci5uZXQiPk5MQU5SPC9hPiB8fCAKKzxBIEhSRUY9Imh0dHA6Ly9kYXN0Lm5sYW5yLm5ldCI+YXBwbGljYXRpb25zIHN1cHBvcnQ8L2E+IHx8Cis8QSBIUkVGPSJodHRwOi8vbmNuZS5ubGFuci5uZXQiPmVuZ2luZWVyaW5nIHN1cHBvcnQ8L2E+IHx8Cis8QSBIUkVGPSJodHRwOi8vbW9hdC5ubGFuci5uZXQiPm1lYXN1cmVtZW50IGFuZCBvcGVyYXRpb25zPC9hPgorPC9GT05UPjwvUD4KKzwvQ0VOVEVSPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL0NsaWVudC5ocHAgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL0NsaWVudC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwOWEwMAotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvQ2xpZW50LmhwcApAQCAtMCwwICsxLDkzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKiBDbGllbnQuaHBwCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQSBjbGllbnQgdGhyZWFkIGluaXRpYXRlcyBhIGNvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgaGFuZGxlcworICogc2VuZGluZyBhbmQgcmVjZWl2aW5nIGRhdGEsIHRoZW4gY2xvc2VzIHRoZSBzb2NrZXQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICovCisKKyNpZm5kZWYgQ0xJRU5UX0gKKyNkZWZpbmUgQ0xJRU5UX0gKKworI2luY2x1ZGUgIlNldHRpbmdzLmhwcCIKKyNpbmNsdWRlICJUaW1lc3RhbXAuaHBwIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjbGFzcyBDbGllbnQgeworcHVibGljOgorICAgIC8vIHN0b3JlcyBzZXJ2ZXIgaG9zdG5hbWUsIHBvcnQsIFVEUC9UQ1AgbW9kZSwgYW5kIFVEUCByYXRlCisgICAgQ2xpZW50KCB0aHJlYWRfU2V0dGluZ3MgKmluU2V0dGluZ3MgKTsKKworICAgIC8vIGRlc3Ryb3kgdGhlIGNsaWVudCBvYmplY3QKKyAgICB+Q2xpZW50KCk7CisKKyAgICAvLyBjb25uZWN0cyBhbmQgc2VuZHMgZGF0YQorICAgIHZvaWQgUnVuKCB2b2lkICk7CisKKyAgICAvLyBUQ1Agc3BlY2lmaWMgdmVyc2lvbiBvZiBhYm92ZQorICAgIHZvaWQgUnVuVENQKCB2b2lkICk7CisKKyAgICB2b2lkIEluaXRpYXRlU2VydmVyKCk7CisKKyAgICAvLyBVRFAgLyBUQ1AKKyAgICB2b2lkIFNlbmQoIHZvaWQgKTsKKyAgICAgICAgCisgICAgdm9pZCB3cml0ZV9VRFBfRklOKCApOworCisgICAgLy8gY2xpZW50IGNvbm5lY3QKKyAgICB2b2lkIENvbm5lY3QoICk7CisKK3Byb3RlY3RlZDoKKyAgICB0aHJlYWRfU2V0dGluZ3MgKm1TZXR0aW5nczsKKyAgICBjaGFyKiBtQnVmOworICAgIFRpbWVzdGFtcCBtRW5kVGltZTsKKyAgICBUaW1lc3RhbXAgbGFzdFBhY2tldFRpbWU7CisKK307IC8vIGVuZCBjbGFzcyBDbGllbnQKKworI2VuZGlmIC8vIENMSUVOVF9ICmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL0NvbmRpdGlvbi5oIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9Db25kaXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTJkZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9Db25kaXRpb24uaApAQCAtMCwwICsxLDE2OSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIENvbmRpdGlvbi5oCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIHdhaXRpbmcgb24gYSBjb25kaXRpb24gdmFyaWFibGUuIElmCisgKiB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGlzIGRvZXMgbm90aGluZy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBDT05ESVRJT05fSAorI2RlZmluZSBDT05ESVRJT05fSAorCisjaW5jbHVkZSAiaGVhZGVycy5oIgorI2luY2x1ZGUgIk11dGV4LmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjaWYgICBkZWZpbmVkKCBIQVZFX1BPU0lYX1RIUkVBRCApCit0eXBlZGVmIHN0cnVjdCBDb25kaXRpb24geworICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKK30gQ29uZGl0aW9uOworI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQordHlwZWRlZiBzdHJ1Y3QgQ29uZGl0aW9uIHsKKyAgICBIQU5ETEUgbUNvbmRpdGlvbjsKKyAgICBIQU5ETEUgbU11dGV4OworfSBDb25kaXRpb247CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgQ29uZGl0aW9uIHsKKyAgICBpbnQgbUNvbmRpdGlvbjsKKyAgICBpbnQgbU11dGV4OworfSBDb25kaXRpb247CisjZW5kaWYKKworI2RlZmluZSBDb25kaXRpb25fTG9jayggQ29uZCApIE11dGV4X0xvY2soICZDb25kLm1NdXRleCApCisKKyNkZWZpbmUgQ29uZGl0aW9uX1VubG9jayggQ29uZCApIE11dGV4X1VubG9jayggJkNvbmQubU11dGV4ICkKKworICAgIC8vIGluaXRpYWxpemUgY29uZGl0aW9uCisjaWYgICBkZWZpbmVkKCBIQVZFX1BPU0lYX1RIUkVBRCApCisgICAgI2RlZmluZSBDb25kaXRpb25fSW5pdGlhbGl6ZSggQ29uZCApIGRvIHsgICAgICAgICAgICAgXAorICAgICAgICBNdXRleF9Jbml0aWFsaXplKCAmKENvbmQpLT5tTXV0ZXggKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgcHRocmVhZF9jb25kX2luaXQoICYoQ29uZCktPm1Db25kaXRpb24sIE5VTEwgKTsgICBcCisgICAgfSB3aGlsZSAoIDAgKQorI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgIC8vIHNldCBhbGwgY29uZGl0aW9ucyB0byBiZSBicm9hZGNhc3QKKyAgICAvLyB1bmZvcnR1bmF0ZWx5IGluIFdpbjMyIHlvdSBoYXZlIHRvIGtub3cgYXQgY3JlYXRpb24KKyAgICAvLyB3aGV0aGVyIHRoZSBzaWduYWwgaXMgYnJvYWRjYXN0IG9yIG5vdC4KKyAgICAjZGVmaW5lIENvbmRpdGlvbl9Jbml0aWFsaXplKCBDb25kICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11dGV4X0luaXRpYWxpemUoICYoQ29uZCktPm1NdXRleCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoQ29uZCktPm1Db25kaXRpb24gPSBDcmVhdGVFdmVudCggTlVMTCwgdHJ1ZSwgZmFsc2UsIE5VTEwgKTsgIFwKKyAgICB9IHdoaWxlICggMCApCisjZWxzZQorICAgICNkZWZpbmUgQ29uZGl0aW9uX0luaXRpYWxpemUoIENvbmQgKQorI2VuZGlmCisKKyAgICAvLyBkZXN0cm95IGNvbmRpdGlvbgorI2lmICAgZGVmaW5lZCggSEFWRV9QT1NJWF9USFJFQUQgKQorICAgICNkZWZpbmUgQ29uZGl0aW9uX0Rlc3Ryb3koIENvbmQgKSBkbyB7ICAgICAgICAgICAgXAorICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSggJihDb25kKS0+bUNvbmRpdGlvbiApOyAgXAorICAgICAgICBNdXRleF9EZXN0cm95KCAmKENvbmQpLT5tTXV0ZXggKTsgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKCAwICkKKyNlbGlmIGRlZmluZWQoIEhBVkVfV0lOMzJfVEhSRUFEICkKKyAgICAjZGVmaW5lIENvbmRpdGlvbl9EZXN0cm95KCBDb25kICkgZG8geyAgICAgICAgICAgIFwKKyAgICAgICAgQ2xvc2VIYW5kbGUoIChDb25kKS0+bUNvbmRpdGlvbiApOyAgICAgICAgICAgIFwKKyAgICAgICAgTXV0ZXhfRGVzdHJveSggJihDb25kKS0+bU11dGV4ICk7ICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICggMCApCisjZWxzZQorICAgICNkZWZpbmUgQ29uZGl0aW9uX0Rlc3Ryb3koIENvbmQgKQorI2VuZGlmCisKKyAgICAvLyBzbGVlcCB0aGlzIHRocmVhZCwgd2FpdGluZyBmb3IgY29uZGl0aW9uIHNpZ25hbAorI2lmICAgZGVmaW5lZCggSEFWRV9QT1NJWF9USFJFQUQgKQorICAgICNkZWZpbmUgQ29uZGl0aW9uX1dhaXQoIENvbmQgKSBwdGhyZWFkX2NvbmRfd2FpdCggJihDb25kKS0+bUNvbmRpdGlvbiwgJihDb25kKS0+bU11dGV4ICkKKyNlbGlmIGRlZmluZWQoIEhBVkVfV0lOMzJfVEhSRUFEICkKKyAgICAvLyBhdG9taWNhbGx5IHJlbGVhc2UgbXV0ZXggYW5kIHdhaXQgb24gY29uZGl0aW9uLCAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvLyB0aGVuIHJlLWFjcXVpcmUgdGhlIG11dGV4CisgICAgI2RlZmluZSBDb25kaXRpb25fV2FpdCggQ29uZCApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU2lnbmFsT2JqZWN0QW5kV2FpdCggKENvbmQpLT5tTXV0ZXgsIChDb25kKS0+bUNvbmRpdGlvbiwgSU5GSU5JVEUsIGZhbHNlICk7IFwKKyAgICAgICAgTXV0ZXhfTG9jayggJihDb25kKS0+bU11dGV4ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoIDAgKQorI2Vsc2UKKyAgICAjZGVmaW5lIENvbmRpdGlvbl9XYWl0KCBDb25kICkKKyNlbmRpZgorCisgICAgLy8gc2xlZXAgdGhpcyB0aHJlYWQsIHdhaXRpbmcgZm9yIGNvbmRpdGlvbiBzaWduYWwsCisgICAgLy8gYnV0IGJvdW5kIHNsZWVwIHRpbWUgYnkgdGhlIHJlbGF0aXZlIHRpbWUgaW5TZWNvbmRzLgorI2lmICAgZGVmaW5lZCggSEFWRV9QT1NJWF9USFJFQUQgKQorICAgICNkZWZpbmUgQ29uZGl0aW9uX1RpbWVkV2FpdCggQ29uZCwgaW5TZWNvbmRzICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBhYnNUaW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYWJzVGltZW91dC50dl9zZWMgID0gdGltZSggTlVMTCApICsgaW5TZWNvbmRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhYnNUaW1lb3V0LnR2X25zZWMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcHRocmVhZF9jb25kX3RpbWVkd2FpdCggJihDb25kKS0+bUNvbmRpdGlvbiwgJihDb25kKS0+bU11dGV4LCAmYWJzVGltZW91dCApOyBcCisgICAgfSB3aGlsZSAoIDAgKQorI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgIC8vIGF0b21pY2FsbHkgcmVsZWFzZSBtdXRleCBhbmQgd2FpdCBvbiBjb25kaXRpb24sCisgICAgLy8gdGhlbiByZS1hY3F1aXJlIHRoZSBtdXRleAorICAgICNkZWZpbmUgQ29uZGl0aW9uX1RpbWVkV2FpdCggQ29uZCwgaW5TZWNvbmRzICkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNpZ25hbE9iamVjdEFuZFdhaXQoIChDb25kKS0+bU11dGV4LCAoQ29uZCktPm1Db25kaXRpb24sIGluU2Vjb25kcyoxMDAwLCBmYWxzZSApOyBcCisgICAgICAgIE11dGV4X0xvY2soICYoQ29uZCktPm1NdXRleCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKCAwICkKKyNlbHNlCisgICAgI2RlZmluZSBDb25kaXRpb25fVGltZWRXYWl0KCBDb25kLCBpblNlY29uZHMgKQorI2VuZGlmCisKKyAgICAvLyBzZW5kIGEgY29uZGl0aW9uIHNpZ25hbCB0byB3YWtlIG9uZSB0aHJlYWQgd2FpdGluZyBvbiBjb25kaXRpb24KKyAgICAvLyBpbiBXaW4zMiwgdGhpcyBhY3R1YWxseSB3YWtlcyB1cCBhbGwgdGhyZWFkcywgc2FtZSBhcyBCcm9hZGNhc3QKKyAgICAvLyB1c2UgUHVsc2VFdmVudCB0byBhdXRvLXJlc2V0IHRoZSBzaWduYWwgYWZ0ZXIgd2FraW5nIGFsbCB0aHJlYWRzCisjaWYgICBkZWZpbmVkKCBIQVZFX1BPU0lYX1RIUkVBRCApCisgICAgI2RlZmluZSBDb25kaXRpb25fU2lnbmFsKCBDb25kICkgcHRocmVhZF9jb25kX3NpZ25hbCggJihDb25kKS0+bUNvbmRpdGlvbiApCisjZWxpZiBkZWZpbmVkKCBIQVZFX1dJTjMyX1RIUkVBRCApCisgICAgI2RlZmluZSBDb25kaXRpb25fU2lnbmFsKCBDb25kICkgUHVsc2VFdmVudCggKENvbmQpLT5tQ29uZGl0aW9uICkKKyNlbHNlCisgICAgI2RlZmluZSBDb25kaXRpb25fU2lnbmFsKCBDb25kICkKKyNlbmRpZgorCisgICAgLy8gc2VuZCBhIGNvbmRpdGlvbiBzaWduYWwgdG8gd2FrZSBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIGNvbmRpdGlvbgorI2lmICAgZGVmaW5lZCggSEFWRV9QT1NJWF9USFJFQUQgKQorICAgICNkZWZpbmUgQ29uZGl0aW9uX0Jyb2FkY2FzdCggQ29uZCApIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoICYoQ29uZCktPm1Db25kaXRpb24gKQorI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgICNkZWZpbmUgQ29uZGl0aW9uX0Jyb2FkY2FzdCggQ29uZCApIFB1bHNlRXZlbnQoIChDb25kKS0+bUNvbmRpdGlvbiApCisjZWxzZQorICAgICNkZWZpbmUgQ29uZGl0aW9uX0Jyb2FkY2FzdCggQ29uZCApCisjZW5kaWYKKworI2VuZGlmIC8vIENPTkRJVElPTl9ICmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL0V4dHJhY3Rvci5oIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9FeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjEzNWYxCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9FeHRyYWN0b3IuaApAQCAtMCwwICsxLDEyMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIEV4dHJhY3Rvci5oCisgKiBieSBBamF5IFRpcnVtYWxhICh0aXJ1bWFsYUBuY3NhLnVpdWMuZWR1KQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRXh0cmFjdCBkYXRhIGZyb20gYSBmaWxlLCB1c2VkIHRvIG1lYXN1cmUgdGhlIHRyYW5zZmVyIHJhdGVzCisgKiBmb3IgdmFyaW91cyBzdHJlYW0gZm9ybWF0cy4gCisgKgorICogRS5nLiBVc2UgYSBnemlwcGVkIGZpbGUgdG8gbWVhc3VyZSB0aGUgdHJhbnNmZXIgcmF0ZXMgZm9yIAorICogY29tcHJlc3NlZCBkYXRhCisgKiBVc2UgYW4gTVBFRyBmaWxlIHRvIG1lYXN1cmUgdGhlIHRyYW5zZmVyIHJhdGVzIG9mIAorICogTXVsdGltZWRpYSBkYXRhIGZvcm1hdHMKKyAqIFVzZSBhIHBsYWluIEJNUCBmaWxlIHRvIG1lYXN1cmUgdGhlIHRyYW5zZmVyIHJhdGVzIG9mIAorICogVW5jb21wcmVzc2VkIGRhdGEKKyAqCisgKiBUaGlzIGlzIGJlbmVmaWNpYWwgZXNwZWNpYWxseSBpbiBtZWFzdXJpbmcgYmFuZHdpZHRoIGFjcm9zcyBXQU4KKyAqIGxpbmtzIHdoZXJlIGRhdGEgY29tcHJlc3Npb24gdGFrZXMgcGxhY2UgYmVmb3JlIGRhdGEgdHJhbnNtaXNzaW9uIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIF9FWFRSQUNUT1JfSAorI2RlZmluZSBfRVhUUkFDVE9SX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiU2V0dGluZ3MuaHBwIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBhcmcgZmlsZU5hbWUgICBOYW1lIG9mIHRoZSBmaWxlIAorICAgICAqIEBhcmcgc2l6ZSAgICAgICBCbG9jayBzaXplIGZvciByZWFkaW5nCisgICAgICovCisgICAgdm9pZCBFeHRyYWN0b3JfSW5pdGlhbGl6ZSggY2hhciAqZmlsZU5hbWUsIGludCBzaXplLCB0aHJlYWRfU2V0dGluZ3MgKm1TZXR0aW5ncyApOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAYXJnIGZwICAgICAgICAgRmlsZSBQb2ludGVyIAorICAgICAqIEBhcmcgc2l6ZSAgICAgICBCbG9jayBzaXplIGZvciByZWFkaW5nCisgICAgICovCisgICAgdm9pZCBFeHRyYWN0b3JfSW5pdGlhbGl6ZUZpbGUoIEZJTEUgKmZwLCBpbnQgc2l6ZSwgdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKTsKKworCisgICAgLyoKKyAgICAgKiBGZXRjaGVzIHRoZSBuZXh0IGRhdGEgYmxvY2sgZnJvbSAKKyAgICAgKiB0aGUgZmlsZQorICAgICAqIEBhcmcgYmxvY2sgICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgcmVhZAorICAgICAqIEByZXR1cm4gICAgICAgIE51bWJlciBvZiBieXRlcyByZWFkCisgICAgICovCisgICAgaW50IEV4dHJhY3Rvcl9nZXROZXh0RGF0YUJsb2NrKCBjaGFyICpibG9jaywgdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKTsKKworCisgICAgLyoqCisgICAgICogRnVuY3Rpb24gd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyCisgICAgICogdGhlIGZpbGUgc3RyZWFtIGlzIHN0aWxsIHJlYWRhYmxlCisgICAgICogQHJldHVybiB0cnVlLCBpZiByZWFkYWJsZTsgZmFsc2UsIGlmIG5vdAorICAgICAqLworICAgIGludCBFeHRyYWN0b3JfY2FuUmVhZCggdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byByZWR1Y2UgdGhlIHJlYWQgc2l6ZQorICAgICAqIFVzZWQgaW4gVURQIHRyYW5zZmVyIHRvIGFjY29tb2RhdGUgdGhlCisgICAgICogdGhlIGhlYWRlciAodGltZXN0YW1wKQorICAgICAqIEBhcmcgZGVsdGEgICAgICAgICBTaXplIHRvIHJlZHVjZQorICAgICAqLworICAgIHZvaWQgRXh0cmFjdG9yX3JlZHVjZVJlYWRTaXplKCBpbnQgZGVsdGEsIHRocmVhZF9TZXR0aW5ncyAqbVNldHRpbmdzICk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yCisgICAgICovCisgICAgdm9pZCBFeHRyYWN0b3JfRGVzdHJveSggdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKTsgCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvaW5jbHVkZS9MaXN0LmggYi9pcGVyZi0yLjAuNS9pbmNsdWRlL0xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VjNDRjCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9MaXN0LmgKQEAgLTAsMCArMSw5NiBAQAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogTGlzdC5oCisgKiBieSBLZXZpbiBHaWJicyA8a2dpYmJzQG5jc2EudWl1Yy5lZHU+IAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqLworCisjaWZuZGVmIElwZXJmX0xJU1RfSAorI2RlZmluZSBJcGVyZl9MSVNUX0gKKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5ocHAiCisjaW5jbHVkZSAiUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJNdXRleC5oIgorCisvKgorICogTGlzdCBoYW5kbGluZyB1dGlsaXRpZXMgdG8gcmVwbGFjZSBTVEQgdmVjdG9yCisgKi8KKworc3RydWN0IElwZXJmX0xpc3RFbnRyeTsKKworLyoKKyAqIEEgTGlzdCBlbnRyeSB0aGF0IGNvbnNpc3RzIG9mIGEgc29ja2FkZHIKKyAqIGEgcG9pbnRlciB0byB0aGUgQXVkaWVuY2UgdGhhdCBzb2NrYWRkciBpcworICogYXNzb2NpYXRlZCB3aXRoIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5leHQKKyAqIGVudHJ5CisgKi8KK3N0cnVjdCBJcGVyZl9MaXN0RW50cnkgeworICAgIGlwZXJmX3NvY2thZGRyIGRhdGE7CisgICAgTXVsdGlIZWFkZXIgKmhvbGRlcjsKKyAgICB0aHJlYWRfU2V0dGluZ3MgKnNlcnZlcjsKKyAgICBJcGVyZl9MaXN0RW50cnkgKm5leHQ7Cit9OworCitleHRlcm4gTXV0ZXggY2xpZW50c19tdXRleDsKK2V4dGVybiBJcGVyZl9MaXN0RW50cnkgKmNsaWVudHM7CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gbW9kaWZ5IG9yIHNlYXJjaCB0aGUgTGlzdAorICovCit2b2lkIElwZXJmX3B1c2hiYWNrICggSXBlcmZfTGlzdEVudHJ5ICphZGQsIElwZXJmX0xpc3RFbnRyeSAqKnJvb3QgKTsKKwordm9pZCBJcGVyZl9kZWxldGUgKCBpcGVyZl9zb2NrYWRkciAqZGVsLCBJcGVyZl9MaXN0RW50cnkgKipyb290ICk7CisKK3ZvaWQgSXBlcmZfZGVzdHJveSAoIElwZXJmX0xpc3RFbnRyeSAqKnJvb3QgKTsKKworSXBlcmZfTGlzdEVudHJ5KiBJcGVyZl9wcmVzZW50ICggaXBlcmZfc29ja2FkZHIgKmZpbmQsIElwZXJmX0xpc3RFbnRyeSAqcm9vdCApOworCitJcGVyZl9MaXN0RW50cnkqIElwZXJmX2hvc3RwcmVzZW50ICggaXBlcmZfc29ja2FkZHIgKmZpbmQsIElwZXJmX0xpc3RFbnRyeSAqcm9vdCApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvTGlzdGVuZXIuaHBwIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9MaXN0ZW5lci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzMGYwZgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvTGlzdGVuZXIuaHBwCkBAIC0wLDAgKzEsOTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBMaXN0ZW5lci5ocHAKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMaXN0ZW5lciBzZXRzIHVwIGEgc29ja2V0IGxpc3RlbmluZyBvbiB0aGUgc2VydmVyIGhvc3QuIEZvciBlYWNoCisgKiBjb25uZWN0ZWQgc29ja2V0IHRoYXQgYWNjZXB0KCkgcmV0dXJucywgdGhpcyBjcmVhdGVzIGEgU2VydmVyCisgKiBzb2NrZXQgYW5kIHNwYXducyBhIHRocmVhZCBmb3IgaXQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTElTVEVORVJfSAorI2RlZmluZSBMSVNURU5FUl9ICisKKyNpbmNsdWRlICJUaHJlYWQuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5ocHAiCisKK2NsYXNzIExpc3RlbmVyOworCitjbGFzcyBMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgLy8gc3RvcmVzIHNlcnZlciBwb3J0IGFuZCBUQ1AvVURQIG1vZGUKKyAgICBMaXN0ZW5lciggdGhyZWFkX1NldHRpbmdzICppblNldHRpbmdzICk7CisKKyAgICAvLyBkZXN0cm95IHRoZSBzZXJ2ZXIgb2JqZWN0CisgICAgfkxpc3RlbmVyKCk7CisKKyAgICAvLyBhY2NlcHRzIGNvbm5lY3Rpb25zIGFuZCBzdGFydHMgU2VydmVycworICAgIHZvaWQgUnVuKCB2b2lkICk7CisKKyAgICAvLyBTdGFydHMgdGhlIFNlcnZlcnMgYXMgYSBkYWVtb24gCisgICAgdm9pZCBydW5Bc0RhZW1vbiggY29uc3QgY2hhciAqLCBpbnQgKTsKKworICAgIHZvaWQgTGlzdGVuKCApOworCisgICAgdm9pZCBNY2FzdEpvaW4oICk7CisKKyAgICB2b2lkIE1jYXN0U2V0VFRMKCBpbnQgdmFsICk7CisKKyAgICB2b2lkIEFjY2VwdCggdGhyZWFkX1NldHRpbmdzICpzZXJ2ZXIgKTsKKworICAgIHZvaWQgVURQU2luZ2xlU2VydmVyICgpOworCitwcm90ZWN0ZWQ6CisgICAgaW50IG1DbGllbnRzOworICAgIGNoYXIqIG1CdWY7CisgICAgdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3M7CisgICAgdGhyZWFkX1NldHRpbmdzICpzZXJ2ZXI7CisKK307IC8vIGVuZCBjbGFzcyBMaXN0ZW5lcgorCisjZW5kaWYgLy8gTElTVEVORVJfSApkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvaW5jbHVkZS9Mb2NhbGUuaCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvTG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjNGYyNQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvTG9jYWxlLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBMb2NhbGUuaAorICogYnkgQWpheSBUaXJ1bWFsYSA8dGlydW1hbGFAbmNzYS51aXVjLmVkdT4KKyAqICYgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0cmluZ3MgYW5kIG90aGVyIHN0dWZmIHRoYXQgaXMgbG9jYWxlIHNwZWNpZmljLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExPQ0FMRV9ICisjZGVmaW5lIExPQ0FMRV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHVzYWdlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBjb25zdCBjaGFyIHVzYWdlX3Nob3J0W107CisKK2V4dGVybiBjb25zdCBjaGFyIHVzYWdlX2xvbmcxW107CitleHRlcm4gY29uc3QgY2hhciB1c2FnZV9sb25nMltdOworCitleHRlcm4gY29uc3QgY2hhciB2ZXJzaW9uW107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldHRpbmdzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBjb25zdCBjaGFyIHNlcGFyYXRvcl9saW5lW107CisKK2V4dGVybiBjb25zdCBjaGFyIHNlcnZlcl9wb3J0W107CisKK2V4dGVybiBjb25zdCBjaGFyIGNsaWVudF9wb3J0W107CisKK2V4dGVybiBjb25zdCBjaGFyIGJpbmRfYWRkcmVzc1tdOworCitleHRlcm4gY29uc3QgY2hhciBtdWx0aWNhc3RfdHRsW107CisKK2V4dGVybiBjb25zdCBjaGFyIGpvaW5fbXVsdGljYXN0W107CisKK2V4dGVybiBjb25zdCBjaGFyIGNsaWVudF9kYXRhZ3JhbV9zaXplW107CisKK2V4dGVybiBjb25zdCBjaGFyIHNlcnZlcl9kYXRhZ3JhbV9zaXplW107CisKK2V4dGVybiBjb25zdCBjaGFyIHRjcF93aW5kb3dfc2l6ZVtdOworCitleHRlcm4gY29uc3QgY2hhciB1ZHBfYnVmZmVyX3NpemVbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgd2luZG93X2RlZmF1bHRbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgd2FpdF9zZXJ2ZXJfdGhyZWFkc1tdOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZXBvcnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBjb25zdCBjaGFyIHJlcG9ydF9yZWFkX2xlbmd0aHNbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0X3JlYWRfbGVuZ3RoX3RpbWVzW107CisKK2V4dGVybiBjb25zdCBjaGFyIHJlcG9ydF9id19oZWFkZXJbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0X2J3X2Zvcm1hdFtdOworCitleHRlcm4gY29uc3QgY2hhciByZXBvcnRfc3VtX2J3X2Zvcm1hdFtdOworCitleHRlcm4gY29uc3QgY2hhciByZXBvcnRfYndfaml0dGVyX2xvc3NfaGVhZGVyW107CisKK2V4dGVybiBjb25zdCBjaGFyIHJlcG9ydF9id19qaXR0ZXJfbG9zc19mb3JtYXRbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0X3N1bV9id19qaXR0ZXJfbG9zc19mb3JtYXRbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0X291dG9mb3JkZXJbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0X3N1bV9vdXRvZm9yZGVyW107CisKK2V4dGVybiBjb25zdCBjaGFyIHJlcG9ydF9wZWVyW107CisKK2V4dGVybiBjb25zdCBjaGFyIHJlcG9ydF9tc3NfdW5zdXBwb3J0ZWRbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0X21zc1tdOworCitleHRlcm4gY29uc3QgY2hhciByZXBvcnRfZGF0YWdyYW1zW107CisKK2V4dGVybiBjb25zdCBjaGFyIHJlcG9ydF9zdW1fZGF0YWdyYW1zW107CisKK2V4dGVybiBjb25zdCBjaGFyIHNlcnZlcl9yZXBvcnRpbmdbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0Q1NWX3BlZXJbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcmVwb3J0Q1NWX2J3X2Zvcm1hdFtdOworCitleHRlcm4gY29uc3QgY2hhciByZXBvcnRDU1ZfYndfaml0dGVyX2xvc3NfZm9ybWF0W107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHdhcm5pbmdzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBjb25zdCBjaGFyIHdhcm5fd2luZG93X3JlcXVlc3RlZFtdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX3dpbmRvd19zbWFsbFtdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2RlbGF5X2xhcmdlW107CisKK2V4dGVybiBjb25zdCBjaGFyIHdhcm5fbm9fcGF0aG10dVtdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX25vX2Fja1tdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2Fja19mYWlsZWRbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgd2Fybl9maWxlb3Blbl9mYWlsZWRbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgdW5hYmxlX3RvX2NoYW5nZV93aW5bXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgb3B0X2VzdGltYXRlW107CisKK2V4dGVybiBjb25zdCBjaGFyIHJlcG9ydF9pbnRlcnZhbF9zbWFsbFtdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2ludmFsaWRfc2VydmVyX29wdGlvbltdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2ludmFsaWRfY2xpZW50X29wdGlvbltdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2ludmFsaWRfY29tcGF0aWJpbGl0eV9vcHRpb25bXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgd2Fybl9pbXBsaWVkX3VkcFtdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2ltcGxpZWRfY29tcGF0aWJpbGl0eVtdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2J1ZmZlcl90b29fc21hbGxbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgd2Fybl9pbnZhbGlkX3NpbmdsZV90aHJlYWRlZFtdOworCitleHRlcm4gY29uc3QgY2hhciB3YXJuX2ludmFsaWRfcmVwb3J0X3N0eWxlW107CisKK2V4dGVybiBjb25zdCBjaGFyIHdhcm5faW52YWxpZF9yZXBvcnRbXTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKKyNlbmRpZiAvLyBMT0NBTEVfSAorCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDMxMDFkCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIgQEAKK0VYVFJBX0RJU1QgPSBDbGllbnQuaHBwIENvbmRpdGlvbi5oIEV4dHJhY3Rvci5oIExpc3QuaCBMaXN0ZW5lci5ocHAgTG9jYWxlLmggTWFrZWZpbGUuYW0gTXV0ZXguaCBQZXJmU29ja2V0LmhwcCBSZXBvcnRlci5oIFNlcnZlci5ocHAgU2V0dGluZ3MuaHBwIFNvY2tldEFkZHIuaCBUaHJlYWQuaCBUaW1lc3RhbXAuaHBwIGNvbmZpZy53aW4zMi5oIGRlbGF5LmhwcCBnZXR0aW1lb2ZkYXkuaCBnbnVfZ2V0b3B0LmggaGVhZGVycy5oIGluZXRfYXRvbi5oIHJlcG9ydF9DU1YuaCByZXBvcnRfZGVmYXVsdC5oIHNlcnZpY2UuaCBzbnByaW50Zi5oIHV0aWwuaCB2ZXJzaW9uLmgKK0RJU1RDTEVBTkZJTEVTID0gJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUvaXBlcmYtaW50LmgKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvTWFrZWZpbGUuaW4gYi9pcGVyZi0yLjAuNS9pbmNsdWRlL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDRmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzExIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNiBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4uCithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitJTlNUQUxMID0gQElOU1RBTExACitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBpbmNsdWRlCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL200L2F4X2NyZWF0ZV9zdGRpbnRfaC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9tNC9kYXN0Lm00ICQodG9wX3NyY2RpcikvbTQvYWN4X3B0aHJlYWQubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNREVQX0ZBTFNFID0gQEFNREVQX0ZBTFNFQAorQU1ERVBfVFJVRSA9IEBBTURFUF9UUlVFQAorQU1UQVIgPSBAQU1UQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWFggPSBAQ1hYQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0dSRVAgPSBAR1JFUEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVVJMID0gQFBBQ0tBR0VfVVJMQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUFRIUkVBRF9DQyA9IEBQVEhSRUFEX0NDQAorUFRIUkVBRF9DRkxBR1MgPSBAUFRIUkVBRF9DRkxBR1NACitQVEhSRUFEX0xJQlMgPSBAUFRIUkVBRF9MSUJTQAorUkFOTElCID0gQFJBTkxJQkAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NUUklQX0JFR0lOID0gQFNUUklQX0JFR0lOQAorU1RSSVBfRFVNTVkgPSBAU1RSSVBfRFVNTVlACitTVFJJUF9FTkQgPSBAU1RSSVBfRU5EQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorV0VCMTAwX0NGTEFHUyA9IEBXRUIxMDBfQ0ZMQUdTQAorV0VCMTAwX0NPTkZJRyA9IEBXRUIxMDBfQ09ORklHQAorV0VCMTAwX0xJQlMgPSBAV0VCMTAwX0xJQlNACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY3hfcHRocmVhZF9jb25maWcgPSBAYWN4X3B0aHJlYWRfY29uZmlnQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19mYXN0ZGVwQ1hYX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAorYW1fX2Zhc3RkZXBDWFhfVFJVRSA9IEBhbV9fZmFzdGRlcENYWF9UUlVFQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK0VYVFJBX0RJU1QgPSBDbGllbnQuaHBwIENvbmRpdGlvbi5oIEV4dHJhY3Rvci5oIExpc3QuaCBMaXN0ZW5lci5ocHAgTG9jYWxlLmggTWFrZWZpbGUuYW0gTXV0ZXguaCBQZXJmU29ja2V0LmhwcCBSZXBvcnRlci5oIFNlcnZlci5ocHAgU2V0dGluZ3MuaHBwIFNvY2tldEFkZHIuaCBUaHJlYWQuaCBUaW1lc3RhbXAuaHBwIGNvbmZpZy53aW4zMi5oIGRlbGF5LmhwcCBnZXR0aW1lb2ZkYXkuaCBnbnVfZ2V0b3B0LmggaGVhZGVycy5oIGluZXRfYXRvbi5oIHJlcG9ydF9DU1YuaCByZXBvcnRfZGVmYXVsdC5oIHNlcnZpY2UuaCBzbnByaW50Zi5oIHV0aWwuaCB2ZXJzaW9uLmgKK0RJU1RDTEVBTkZJTEVTID0gJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUvaXBlcmYtaW50LmgKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGluY2x1ZGUvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIGluY2x1ZGUvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6ICAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6ICAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCit1bmluc3RhbGwtaW5mby1hbToKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgIGRpcj0iLyQkZGlyIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCisJICBlbHNlIFwKKwkgICAgZGlyPScnOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYworCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSBcCisJdW5pbnN0YWxsLWluZm8tYW0KKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvaW5jbHVkZS9NdXRleC5oIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9NdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTBhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL011dGV4LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBNdXRleC5oCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGxvY2tpbmcgYSBtdXRleCAobXV0dWFsIGV4Y2x1c2lvbikuIElmCisgKiB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGlzIGRvZXMgbm90aGluZy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZm5kZWYgTVVURVhfSAorI2RlZmluZSBNVVRFWF9ICisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisKKyNpZiAgIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkKKyAgICB0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBNdXRleDsKKyNlbGlmIGRlZmluZWQoIEhBVkVfV0lOMzJfVEhSRUFEICkKKyAgICB0eXBlZGVmIEhBTkRMRSBNdXRleDsKKyNlbHNlCisgICAgdHlwZWRlZiBpbnQgTXV0ZXg7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCitjbGFzcyBNdXRleCB7CitwdWJsaWM6Ki8KKyAgICAKKyAgICAvLyBpbml0aWFsaXplIG11dGV4CisjaWYgICBkZWZpbmVkKCBIQVZFX1BPU0lYX1RIUkVBRCApCisgICAgI2RlZmluZSBNdXRleF9Jbml0aWFsaXplKCBNdXRleFB0ciApIHB0aHJlYWRfbXV0ZXhfaW5pdCggTXV0ZXhQdHIsIE5VTEwgKQorI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgICNkZWZpbmUgTXV0ZXhfSW5pdGlhbGl6ZSggTXV0ZXhQdHIgKSAqTXV0ZXhQdHIgPSBDcmVhdGVNdXRleCggTlVMTCwgZmFsc2UsIE5VTEwgKQorI2Vsc2UKKyAgICAjZGVmaW5lIE11dGV4X0luaXRpYWxpemUoIE11dGV4UHRyICkKKyNlbmRpZgorICAgIAorICAgIC8vIGxvY2sgdGhlIG11dGV4IHZhcmlhYmxlCisjaWYgICBkZWZpbmVkKCBIQVZFX1BPU0lYX1RIUkVBRCApCisgICAgI2RlZmluZSBNdXRleF9Mb2NrKCBNdXRleFB0ciApIHB0aHJlYWRfbXV0ZXhfbG9jayggTXV0ZXhQdHIgKQorI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgICNkZWZpbmUgTXV0ZXhfTG9jayggTXV0ZXhQdHIgKSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCAqTXV0ZXhQdHIsIElORklOSVRFICkKKyNlbHNlCisgICAgI2RlZmluZSBNdXRleF9Mb2NrKCBNdXRleFB0ciApCisjZW5kaWYKKworICAgIC8vIHVubG9jayB0aGUgbXV0ZXggdmFyaWFibGUKKyNpZiAgIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkKKyAgICAjZGVmaW5lIE11dGV4X1VubG9jayggTXV0ZXhQdHIgKSBwdGhyZWFkX211dGV4X3VubG9jayggTXV0ZXhQdHIgKQorI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgICNkZWZpbmUgTXV0ZXhfVW5sb2NrKCBNdXRleFB0ciApIFJlbGVhc2VNdXRleCggKk11dGV4UHRyICkKKyNlbHNlCisgICAgI2RlZmluZSBNdXRleF9VbmxvY2soIE11dGV4UHRyICkKKyNlbmRpZgorCisgICAgLy8gZGVzdHJveSwgbWFraW5nIHN1cmUgbXV0ZXggaXMgdW5sb2NrZWQKKyNpZiAgIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkKKyAgICAjZGVmaW5lIE11dGV4X0Rlc3Ryb3koIE11dGV4UHRyICkgIGRvIHsgICAgICAgICBcCisgICAgICAgIGludCByYyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggTXV0ZXhQdHIgKTsgXAorICAgICAgICBpZiAoIHJjID09IEVCVVNZICkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE11dGV4X1VubG9jayggTXV0ZXhQdHIgKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koIE11dGV4UHRyICk7ICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICggMCApCisjZWxpZiBkZWZpbmVkKCBIQVZFX1dJTjMyX1RIUkVBRCApCisgICAgI2RlZmluZSBNdXRleF9EZXN0cm95KCBNdXRleFB0ciApIENsb3NlSGFuZGxlKCAqTXV0ZXhQdHIgKQorI2Vsc2UKKyAgICAjZGVmaW5lIE11dGV4X0Rlc3Ryb3koIE11dGV4UHRyICkKKyNlbmRpZgorCisjZW5kaWYgLy8gTVVURVhfSApkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvaW5jbHVkZS9QZXJmU29ja2V0LmhwcCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvUGVyZlNvY2tldC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmZTNkZQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvUGVyZlNvY2tldC5ocHAKQEAgLTAsMCArMSw3OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIFBlcmZTb2NrZXQuaHBwCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogICYgIEFqYXkgVGlydW1hbGEgPHRpcnVtYWxhQG5jc2EudWl1Yy5lZHU+ICAgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDaGFuZ2VzIGluIHZlcnNpb24gMS42CisgKiAgIEluY29ycG9yYXRlcyBjbGFzcyBkZWNsYXJhdGlvbnMgZm9yIGZldGNoaW5nIGRhdGEgZnJvbSBmaWxlcyAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjaWZuZGVmIFBFUkZTT0NLRVRfSAorI2RlZmluZSBQRVJGU09DS0VUX0gKKworI2luY2x1ZGUgIk11dGV4LmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaHBwIgorCisgICAgdm9pZCBTZXRTb2NrZXRPcHRpb25zKCB0aHJlYWRfU2V0dGluZ3MgKmluU2V0dGluZ3MgKTsKKworICAgIC8vIGhhbmRsZSBpbnRlcnVwdHMKKyAgICB2b2lkIFNpZ19JbnRlcnVwdCggaW50IGluU2lnbm8gKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorICAgIGV4dGVybiBpbnQgc0ludGVydXB0ZWQ7CisgICAgZXh0ZXJuIGludCBncm91cElEOworICAgIGV4dGVybiBNdXRleCBncm91cENvbmQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvLyBQRVJGU09DS0VUX0gKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvUmVwb3J0ZXIuaCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvUmVwb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmRlMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9SZXBvcnRlci5oCkBAIC0wLDAgKzEsMjMwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogUmVwb3J0ZXIuaAorICogYnkgS2V2aW4gR2liYnMgPGtnaWJic0BubGFuci5uZXQ+CisgKgorICogU2luY2UgdmVyc2lvbiAyLjAgdGhpcyBoYW5kbGVzIGFsbCByZXBvcnRpbmcuCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCisKKyNpZm5kZWYgUkVQT1JURVJfSAorI2RlZmluZSBSRVBPUlRFUl9ICisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisjaW5jbHVkZSAiTXV0ZXguaCIKKworc3RydWN0IHRocmVhZF9TZXR0aW5nczsKK3N0cnVjdCBzZXJ2ZXJfaGRyOworCisjaW5jbHVkZSAiU2V0dGluZ3MuaHBwIgorCisjZGVmaW5lIE5VTV9SRVBPUlRfU1RSVUNUUyA3MDAKKyNkZWZpbmUgTlVNX01VTFRJX1NMT1RTICAgIDUKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgYWxsIGltcG9ydGFudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZW5kaW5nIG9yCisgKiByZWNpZXZpbmcgdGhyZWFkLgorICovCit0eXBlZGVmIHN0cnVjdCBSZXBvcnRTdHJ1Y3QgeworICAgIGludCBwYWNrZXRJRDsKKyAgICBtYXhfc2l6ZV90IHBhY2tldExlbjsKKyAgICBzdHJ1Y3QgdGltZXZhbCBwYWNrZXRUaW1lOworICAgIHN0cnVjdCB0aW1ldmFsIHNlbnRUaW1lOworfSBSZXBvcnRTdHJ1Y3Q7CisKKy8qCisgKiBUaGUgdHlwZSBmaWVsZCBvZiBSZXBvcnRlckRhdGEgaXMgYSBiaXRtYXNrCisgKiB3aXRoIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKKyAqLworI2RlZmluZSAgICBUUkFOU0ZFUl9SRVBPUlQgICAgICAweDAwMDAwMDAxCisjZGVmaW5lICAgIFNFUlZFUl9SRUxBWV9SRVBPUlQgIDB4MDAwMDAwMDIKKyNkZWZpbmUgICAgU0VUVElOR1NfUkVQT1JUICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSAgICBDT05ORUNUSU9OX1JFUE9SVCAgICAweDAwMDAwMDA4CisjZGVmaW5lICAgIE1VTFRJUExFX1JFUE9SVCAgICAgIDB4MDAwMDAwMTAKKwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNmZXJfSW5mbyB7CisgICAgdm9pZCAqcmVzZXJ2ZWRfZGVsYXk7CisgICAgaW50IHRyYW5zZmVySUQ7CisgICAgaW50IGdyb3VwSUQ7CisgICAgaW50IGNudEVycm9yOworICAgIGludCBjbnRPdXRvZk9yZGVyOworICAgIGludCBjbnREYXRhZ3JhbXM7CisgICAgLy8gSG9wZWZ1bGx5IGludDY0X3QncworICAgIG1heF9zaXplX3QgVG90YWxMZW47CisgICAgZG91YmxlIGppdHRlcjsKKyAgICBkb3VibGUgc3RhcnRUaW1lOworICAgIGRvdWJsZSBlbmRUaW1lOworICAgIC8vIGNoYXJzCisgICAgY2hhciAgIG1Gb3JtYXQ7ICAgICAgICAgICAgICAgICAvLyAtZgorICAgIHVfY2hhciBtVFRMOyAgICAgICAgICAgICAgICAgICAgLy8gLVQKKyAgICBjaGFyICAgbVVEUDsKKyAgICBjaGFyICAgZnJlZTsKK30gVHJhbnNmZXJfSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgQ29ubmVjdGlvbl9JbmZvIHsKKyAgICBpcGVyZl9zb2NrYWRkciBwZWVyOworICAgIFNvY2tsZW5fdCBzaXplX3BlZXI7CisgICAgaXBlcmZfc29ja2FkZHIgbG9jYWw7CisgICAgU29ja2xlbl90IHNpemVfbG9jYWw7Cit9IENvbm5lY3Rpb25fSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgUmVwb3J0ZXJEYXRhIHsKKyAgICBjaGFyKiAgbUhvc3Q7ICAgICAgICAgICAgICAgICAgIC8vIC1jCisgICAgY2hhciogIG1Mb2NhbGhvc3Q7ICAgICAgICAgICAgICAvLyAtQgorICAgIC8vIGludCdzCisgICAgaW50IHR5cGU7CisgICAgaW50IGNudEVycm9yOworICAgIGludCBsYXN0RXJyb3I7CisgICAgaW50IGNudE91dG9mT3JkZXI7CisgICAgaW50IGxhc3RPdXRvZk9yZGVyOworICAgIGludCBjbnREYXRhZ3JhbXM7CisgICAgaW50IGxhc3REYXRhZ3JhbXM7CisgICAgaW50IFBhY2tldElEOworICAgIGludCBtQnVmTGVuOyAgICAgICAgICAgICAgICAgICAgLy8gLWwKKyAgICBpbnQgbU1TUzsgICAgICAgICAgICAgICAgICAgICAgIC8vIC1NCisgICAgaW50IG1UQ1BXaW47ICAgICAgICAgICAgICAgICAgICAvLyAtdworICAgIC8qICAgZmxhZ3MgaXMgYSBCaXRNYXNrIG9mIG9sZCBib29scworICAgICAgICBib29sICAgbUJ1ZkxlblNldDsgICAgICAgICAgICAgIC8vIC1sCisgICAgICAgIGJvb2wgICBtQ29tcGF0OyAgICAgICAgICAgICAgICAgLy8gLUMKKyAgICAgICAgYm9vbCAgIG1EYWVtb247ICAgICAgICAgICAgICAgICAvLyAtRAorICAgICAgICBib29sICAgbURvbWFpbjsgICAgICAgICAgICAgICAgIC8vIC1WCisgICAgICAgIGJvb2wgICBtRmlsZUlucHV0OyAgICAgICAgICAgICAgLy8gLUYgb3IgLUkKKyAgICAgICAgYm9vbCAgIG1Ob2RlbGF5OyAgICAgICAgICAgICAgICAvLyAtTgorICAgICAgICBib29sICAgbVByaW50TVNTOyAgICAgICAgICAgICAgIC8vIC1tCisgICAgICAgIGJvb2wgICBtUmVtb3ZlU2VydmljZTsgICAgICAgICAgLy8gLVIKKyAgICAgICAgYm9vbCAgIG1TdGRpbjsgICAgICAgICAgICAgICAgICAvLyAtSQorICAgICAgICBib29sICAgbVN0ZG91dDsgICAgICAgICAgICAgICAgIC8vIC1vCisgICAgICAgIGJvb2wgICBtU3VnZ2VzdFdpbjsgICAgICAgICAgICAgLy8gLVcKKyAgICAgICAgYm9vbCAgIG1VRFA7CisgICAgICAgIGJvb2wgICBtTW9kZV90aW1lOyovCisgICAgaW50IGZsYWdzOyAKKyAgICAvLyBlbnVtcyAod2hpY2ggc2hvdWxkIGJlIHNwZWNpYWwgaW50J3MpCisgICAgVGhyZWFkTW9kZSBtVGhyZWFkTW9kZTsgICAgICAgICAvLyAtcyBvciAtYworICAgIFJlcG9ydE1vZGUgbW9kZTsKKyAgICBtYXhfc2l6ZV90IFRvdGFsTGVuOworICAgIG1heF9zaXplX3QgbGFzdFRvdGFsOworICAgIC8vIGRvdWJsZXMKKyAgICBkb3VibGUgbGFzdFRyYW5zaXQ7CisgICAgLy8gc2hvcnRzCisgICAgdW5zaWduZWQgc2hvcnQgbVBvcnQ7ICAgICAgICAgICAvLyAtcAorICAgIC8vIHN0cnVjdHMgb3IgbWlzY2VsbGFuZW91cworICAgIFRyYW5zZmVyX0luZm8gaW5mbzsKKyAgICBDb25uZWN0aW9uX0luZm8gY29ubmVjdGlvbjsKKyAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydFRpbWU7CisgICAgc3RydWN0IHRpbWV2YWwgcGFja2V0VGltZTsKKyAgICBzdHJ1Y3QgdGltZXZhbCBuZXh0VGltZTsKKyAgICBzdHJ1Y3QgdGltZXZhbCBpbnRlcnZhbFRpbWU7Cit9IFJlcG9ydGVyRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgTXVsdGlIZWFkZXIgeworICAgIGludCByZXBvcnRlcmluZGV4OworICAgIGludCBhZ2VudGluZGV4OworICAgIGludCBncm91cElEOworICAgIGludCB0aHJlYWRzOworICAgIFJlcG9ydGVyRGF0YSAqcmVwb3J0OworICAgIFRyYW5zZmVyX0luZm8gKmRhdGE7CisgICAgQ29uZGl0aW9uIGJhcnJpZXI7CisgICAgc3RydWN0IHRpbWV2YWwgc3RhcnRUaW1lOworfSBNdWx0aUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgUmVwb3J0SGVhZGVyIHsKKyAgICBpbnQgcmVwb3J0ZXJpbmRleDsKKyAgICBpbnQgYWdlbnRpbmRleDsKKyAgICBSZXBvcnRlckRhdGEgcmVwb3J0OworICAgIFJlcG9ydFN0cnVjdCAqZGF0YTsKKyAgICBNdWx0aUhlYWRlciAqbXVsdGlyZXBvcnQ7CisgICAgc3RydWN0IFJlcG9ydEhlYWRlciAqbmV4dDsKK30gUmVwb3J0SGVhZGVyOworCit0eXBlZGVmIHZvaWQqICgqIHJlcG9ydF9jb25uZWN0aW9uKSggQ29ubmVjdGlvbl9JbmZvKiwgaW50ICk7Cit0eXBlZGVmIHZvaWQgKCogcmVwb3J0X3NldHRpbmdzKSggUmVwb3J0ZXJEYXRhKiApOwordHlwZWRlZiB2b2lkICgqIHJlcG9ydF9zdGF0aXN0aWNzKSggVHJhbnNmZXJfSW5mbyogKTsKK3R5cGVkZWYgdm9pZCAoKiByZXBvcnRfc2VydmVyc3RhdGlzdGljcykoIENvbm5lY3Rpb25fSW5mbyosIFRyYW5zZmVyX0luZm8qICk7CisKK011bHRpSGVhZGVyKiBJbml0TXVsdGkoIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MgKmFnZW50LCBpbnQgaW5JRCApOworUmVwb3J0SGVhZGVyKiBJbml0UmVwb3J0KCBzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzICphZ2VudCApOwordm9pZCBSZXBvcnRQYWNrZXQoIFJlcG9ydEhlYWRlciAqYWdlbnQsIFJlcG9ydFN0cnVjdCAqcGFja2V0ICk7Cit2b2lkIENsb3NlUmVwb3J0KCBSZXBvcnRIZWFkZXIgKmFnZW50LCBSZXBvcnRTdHJ1Y3QgKnBhY2tldCApOwordm9pZCBFbmRSZXBvcnQoIFJlcG9ydEhlYWRlciAqYWdlbnQgKTsKK1RyYW5zZmVyX0luZm8qIEdldFJlcG9ydCggUmVwb3J0SGVhZGVyICphZ2VudCApOwordm9pZCBSZXBvcnRTZXJ2ZXJVRFAoIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MgKmFnZW50LCBzdHJ1Y3Qgc2VydmVyX2hkciAqc2VydmVyICk7Cit2b2lkIFJlcG9ydFNldHRpbmdzKCBzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzICphZ2VudCApOwordm9pZCBSZXBvcnRDb25uZWN0aW9ucyggc3RydWN0IHRocmVhZF9TZXR0aW5ncyAqYWdlbnQgKTsKKworZXh0ZXJuIHJlcG9ydF9jb25uZWN0aW9uIGNvbm5lY3Rpb25fcmVwb3J0c1tdOworCitleHRlcm4gcmVwb3J0X3NldHRpbmdzIHNldHRpbmdzX3JlcG9ydHNbXTsKKworZXh0ZXJuIHJlcG9ydF9zdGF0aXN0aWNzIHN0YXRpc3RpY3NfcmVwb3J0c1tdOworCitleHRlcm4gcmVwb3J0X3NlcnZlcnN0YXRpc3RpY3Mgc2VydmVyc3RhdGlzdGljc19yZXBvcnRzW107CisKK2V4dGVybiByZXBvcnRfc3RhdGlzdGljcyBtdWx0aXBsZV9yZXBvcnRzW107CisKK2V4dGVybiBjaGFyIGJ1ZmZlcls2NF07IC8vIEJ1ZmZlciBmb3IgcHJpbnRpbmcKKworI2RlZmluZSByTWlsbGlvbiAxMDAwMDAwCisKKyNkZWZpbmUgVGltZURpZmZlcmVuY2UoIGxlZnQsIHJpZ2h0ICkgKGxlZnQudHZfc2VjICAtIHJpZ2h0LnR2X3NlYykgKyAgIFwKKyAgICAgICAgKGxlZnQudHZfdXNlYyAtIHJpZ2h0LnR2X3VzZWMpIC8gKChkb3VibGUpIHJNaWxsaW9uKQorCisjZGVmaW5lIFRpbWVBZGQoIGxlZnQsIHJpZ2h0ICkgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LnR2X3VzZWMgKz0gcmlnaHQudHZfdXNlYzsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxlZnQudHZfdXNlYyA+IHJNaWxsaW9uICkgeyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdC50dl91c2VjIC09IHJNaWxsaW9uOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdC50dl9zZWMrKzsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LnR2X3NlYyArPSByaWdodC50dl9zZWM7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAwICkKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvLyBSRVBPUlRFUl9ICmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL1NlcnZlci5ocHAgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL1NlcnZlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExZDU0YgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvU2VydmVyLmhwcApAQCAtMCwwICsxLDg1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogU2VydmVyLmhwcAorICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEEgc2VydmVyIHRocmVhZCBpcyBpbml0aWF0ZWQgZm9yIGVhY2ggY29ubmVjdGlvbiBhY2NlcHQoKSByZXR1cm5zLgorICogSGFuZGxlcyBzZW5kaW5nIGFuZCByZWNlaXZpbmcgZGF0YSwgYW5kIHRoZW4gY2xvc2VzIHNvY2tldC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBTRVJWRVJfSAorI2RlZmluZSBTRVJWRVJfSAorCisKKyNpbmNsdWRlICJTZXR0aW5ncy5ocHAiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIlRpbWVzdGFtcC5ocHAiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NsYXNzIFNlcnZlciB7CitwdWJsaWM6CisgICAgLy8gc3RvcmVzIHNlcnZlciBzb2NrZXQsIHBvcnQgYW5kIFRDUC9VRFAgbW9kZQorICAgIFNlcnZlciggdGhyZWFkX1NldHRpbmdzICppblNldHRpbmdzICk7CisKKyAgICAvLyBkZXN0cm95IHRoZSBzZXJ2ZXIgb2JqZWN0CisgICAgflNlcnZlcigpOworCisgICAgLy8gYWNjZXB0cyBjb25uZWN0aW9uIGFuZCByZWNlaXZlcyBkYXRhCisgICAgdm9pZCBSdW4oIHZvaWQgKTsKKworICAgIHZvaWQgd3JpdGVfVURQX0Fja0ZJTiggKTsKKworICAgIHN0YXRpYyB2b2lkIFNpZ19JbnQoIGludCBpblNpZ25vICk7CisKK3ByaXZhdGU6CisgICAgdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3M7CisgICAgY2hhciogbUJ1ZjsKKyAgICBUaW1lc3RhbXAgbUVuZFRpbWU7CisKK307IC8vIGVuZCBjbGFzcyBTZXJ2ZXIKKworI2VuZGlmIC8vIFNFUlZFUl9ICmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL1NldHRpbmdzLmhwcCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvU2V0dGluZ3MuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGU1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL1NldHRpbmdzLmhwcApAQCAtMCwwICsxLDQyNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIFNldHRpbmdzLmhwcAorICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqICYgIEFqYXkgVGlydW1hbGEgPHRpcnVtYWxhQG5jc2EudWl1Yy5lZHU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdG9yZXMgYW5kIHBhcnNlcyB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGhlYWRlcnMKKyAqIHVzZXMKKyAqICAgPHN0ZGxpYi5oPgorICogICA8YXNzZXJ0Lmg+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgU0VUVElOR1NfSAorI2RlZmluZSBTRVRUSU5HU19ICisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisjaW5jbHVkZSAiVGhyZWFkLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNvbnN0YW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBzZXJ2ZXIvY2xpZW50IG1vZGUKK3R5cGVkZWYgZW51bSBUaHJlYWRNb2RlIHsKKyAgICBrTW9kZV9Vbmtub3duID0gMCwKKyAgICBrTW9kZV9TZXJ2ZXIsCisgICAga01vZGVfQ2xpZW50LAorICAgIGtNb2RlX1JlcG9ydGVyLAorICAgIGtNb2RlX0xpc3RlbmVyCit9IFRocmVhZE1vZGU7CisKKy8vIHJlcG9ydCBtb2RlCit0eXBlZGVmIGVudW0gUmVwb3J0TW9kZSB7CisgICAga1JlcG9ydF9EZWZhdWx0ID0gMCwKKyAgICBrUmVwb3J0X0NTViwKKyAgICAvL2tSZXBvcnRfWE1MLAorICAgIGtSZXBvcnRfTUFYSU1VTQorfSBSZXBvcnRNb2RlOworCisvLyB0ZXN0IG1vZGUKK3R5cGVkZWYgZW51bSBUZXN0TW9kZSB7CisgICAga1Rlc3RfTm9ybWFsID0gMCwKKyAgICBrVGVzdF9EdWFsVGVzdCwKKyAgICBrVGVzdF9UcmFkZU9mZiwKKyAgICBrVGVzdF9Vbmtub3duCit9IFRlc3RNb2RlOworCisjaW5jbHVkZSAiUmVwb3J0ZXIuaCIKKy8qCisgKiBUaGUgdGhyZWFkX1NldHRpbmdzIGlzIGEgc3RydWN0dXJlIHRoYXQgaG9sZHMgYWxsCisgKiBvcHRpb25zIGZvciBhIGdpdmVuIGV4ZWN1dGlvbiBvZiBlaXRoZXIgYSBjbGllbnQKKyAqIG9yIHNlcnZlci4gQnkgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4KKyAqIGEgZ2xvYmFsIHN0cnVjdHVyZSBvciBjbGFzcyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQorICogY2xpZW50cyBvciBzZXJ2ZXJzIHJ1bm5pbmcgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MuCisgKiBJbiB2ZXJzaW9uIDIuMCBhbmQgYWJvdmUgdGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgCisgKiBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgYSB0aHJlYWQgdG8gZXhlY3V0ZQorICogYW5kIGNvbnRhaW5zIG9ubHkgQyBlbGVtZW50cyBzbyBpdCBjYW4gYmUgbWFuaXB1bGF0ZWQKKyAqIGJ5IGVpdGhlciBDIG9yIEMrKy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzIHsKKyAgICAvLyBQb2ludGVycworICAgIGNoYXIqICBtRmlsZU5hbWU7ICAgICAgICAgICAgICAgLy8gLUYKKyAgICBjaGFyKiAgbUhvc3Q7ICAgICAgICAgICAgICAgICAgIC8vIC1jCisgICAgY2hhciogIG1Mb2NhbGhvc3Q7ICAgICAgICAgICAgICAvLyAtQgorICAgIGNoYXIqICBtT3V0cHV0RmlsZU5hbWU7ICAgICAgICAgLy8gLW8KKyAgICBGSUxFKiAgRXh0cmFjdG9yX2ZpbGU7CisgICAgUmVwb3J0SGVhZGVyKiAgcmVwb3J0aGRyOworICAgIE11bHRpSGVhZGVyKiAgIG11bHRpaGRyOworICAgIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MgKnJ1bk5vdzsKKyAgICBzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzICpydW5OZXh0OworICAgIC8vIGludCdzCisgICAgaW50IG1UaHJlYWRzOyAgICAgICAgICAgICAgICAgICAvLyAtUAorICAgIGludCBtVE9TOyAgICAgICAgICAgICAgICAgICAgICAgLy8gLVMKKyAgICBpbnQgbVNvY2s7CisgICAgaW50IEV4dHJhY3Rvcl9zaXplOworICAgIGludCBtQnVmTGVuOyAgICAgICAgICAgICAgICAgICAgLy8gLWwKKyAgICBpbnQgbU1TUzsgICAgICAgICAgICAgICAgICAgICAgIC8vIC1NCisgICAgaW50IG1UQ1BXaW47ICAgICAgICAgICAgICAgICAgICAvLyAtdworICAgIC8qICAgZmxhZ3MgaXMgYSBCaXRNYXNrIG9mIG9sZCBib29scworICAgICAgICBib29sICAgbUJ1ZkxlblNldDsgICAgICAgICAgICAgIC8vIC1sCisgICAgICAgIGJvb2wgICBtQ29tcGF0OyAgICAgICAgICAgICAgICAgLy8gLUMKKyAgICAgICAgYm9vbCAgIG1EYWVtb247ICAgICAgICAgICAgICAgICAvLyAtRAorICAgICAgICBib29sICAgbURvbWFpbjsgICAgICAgICAgICAgICAgIC8vIC1WCisgICAgICAgIGJvb2wgICBtRmlsZUlucHV0OyAgICAgICAgICAgICAgLy8gLUYgb3IgLUkKKyAgICAgICAgYm9vbCAgIG1Ob2RlbGF5OyAgICAgICAgICAgICAgICAvLyAtTgorICAgICAgICBib29sICAgbVByaW50TVNTOyAgICAgICAgICAgICAgIC8vIC1tCisgICAgICAgIGJvb2wgICBtUmVtb3ZlU2VydmljZTsgICAgICAgICAgLy8gLVIKKyAgICAgICAgYm9vbCAgIG1TdGRpbjsgICAgICAgICAgICAgICAgICAvLyAtSQorICAgICAgICBib29sICAgbVN0ZG91dDsgICAgICAgICAgICAgICAgIC8vIC1vCisgICAgICAgIGJvb2wgICBtU3VnZ2VzdFdpbjsgICAgICAgICAgICAgLy8gLVcKKyAgICAgICAgYm9vbCAgIG1VRFA7ICAgICAgICAgICAgICAgICAgICAvLyAtdQorICAgICAgICBib29sICAgbU1vZGVfdGltZTsKKyAgICAgICAgYm9vbCAgIG1SZXBvcnRTZXR0aW5nczsKKyAgICAgICAgYm9vbCAgIG1NdWx0aWNhc3Q7CisgICAgICAgIGJvb2wgICBtTm9TZXR0aW5nc1JlcG9ydDsgICAgICAgLy8gLXggcworICAgICAgICBib29sICAgbU5vQ29ubmVjdGlvblJlcG9ydDsgICAgIC8vIC14IGMKKyAgICAgICAgYm9vbCAgIG1Ob0RhdGFSZXBvcnQ7ICAgICAgICAgICAvLyAteCBkCisgICAgICAgIGJvb2wgICBtTm9TZXJ2ZXJSZXBvcnQ7ICAgICAgICAgLy8gLXggCisgICAgICAgIGJvb2wgICBtTm9NdWx0UmVwb3J0OyAgICAgICAgICAgLy8gLXggbQorICAgICAgICBib29sICAgbVNpbmxnZUNsaWVudDsgICAgICAgICAgIC8vIC0xICovCisgICAgaW50IGZsYWdzOyAKKyAgICAvLyBlbnVtcyAod2hpY2ggc2hvdWxkIGJlIHNwZWNpYWwgaW50J3MpCisgICAgVGhyZWFkTW9kZSBtVGhyZWFkTW9kZTsgICAgICAgICAvLyAtcyBvciAtYworICAgIFJlcG9ydE1vZGUgbVJlcG9ydE1vZGU7CisgICAgVGVzdE1vZGUgbU1vZGU7ICAgICAgICAgICAgICAgICAvLyAtciBvciAtZAorICAgIC8vIEhvcGVmdWxseSBpbnQ2NF90J3MKKyAgICBtYXhfc2l6ZV90IG1VRFBSYXRlOyAgICAgICAgICAgIC8vIC1iIG9yIC11CisgICAgbWF4X3NpemVfdCBtQW1vdW50OyAgICAgICAgICAgICAvLyAtbiBvciAtdAorICAgIC8vIGRvdWJsZXMKKyAgICBkb3VibGUgbUludGVydmFsOyAgICAgICAgICAgICAgIC8vIC1pCisgICAgLy8gc2hvcnRzCisgICAgdW5zaWduZWQgc2hvcnQgbUxpc3RlblBvcnQ7ICAgICAvLyAtTAorICAgIHVuc2lnbmVkIHNob3J0IG1Qb3J0OyAgICAgICAgICAgLy8gLXAKKyAgICAvLyBjaGFycworICAgIGNoYXIgICBtRm9ybWF0OyAgICAgICAgICAgICAgICAgLy8gLWYKKyAgICBpbnQgbVRUTDsgICAgICAgICAgICAgICAgICAgIC8vIC1UCisgICAgY2hhciBwYWQxWzJdOworICAgIC8vIHN0cnVjdHMgb3IgbWlzY2VsbGFuZW91cworICAgIGlwZXJmX3NvY2thZGRyIHBlZXI7CisgICAgU29ja2xlbl90IHNpemVfcGVlcjsKKyAgICBpcGVyZl9zb2NrYWRkciBsb2NhbDsKKyAgICBTb2NrbGVuX3Qgc2l6ZV9sb2NhbDsKKyAgICBudGhyZWFkX3QgbVRJRDsKKyAgICBjaGFyKiBtQ29uZ2VzdGlvbjsKKyNpZiBkZWZpbmVkKCBIQVZFX1dJTjMyX1RIUkVBRCApCisgICAgSEFORExFIG1IYW5kbGU7CisjZW5kaWYKK30gdGhyZWFkX1NldHRpbmdzOworCisvKgorICogRHVlIHRvIHRoZSB1c2Ugb2YgdGhyZWFkX1NldHRpbmdzIGluIEMgYW5kIEMrKworICogd2UgYXJlIHVuYWJsZSB0byB1c2UgYm9vbCB2YWx1ZXMuIFRvIHByb3ZpZGUKKyAqIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGJvb2xzIHdlIHVzZSB0aGUgZm9sbG93aW5nCisgKiBiaXRtYXNrIG92ZXIgYW4gYXNzdW1lZCAzMiBiaXQgaW50LiBUaGlzIHdpbGwKKyAqIHdvcmsgZmluZSBvbiA2NGJpdCBtYWNoaW5lcyB3ZSB3aWxsIGp1c3QgYmUgaWdub3JpbmcKKyAqIHRoZSB1cHBlciAzMmJpdHMuCisgKgorICogVG8gYWRkIGEgZmxhZyBzaW1wbHkgZGVmaW5lIGl0IGFzIHRoZSBuZXh0IGJpdCB0aGVuCisgKiBhZGQgdGhlIDMgc3VwcG9ydCBmdW5jdGlvbnMgYmVsb3cuCisgKi8KKyNkZWZpbmUgRkxBR19CVUZMRU5TRVQgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEZMQUdfQ09NUEFUICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBGTEFHX0RBRU1PTiAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRkxBR19ET01BSU4gICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEZMQUdfRklMRUlOUFVUICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBGTEFHX05PREVMQVkgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRkxBR19QUklOVE1TUyAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEZMQUdfUkVNT1ZFU0VSVklDRSAgMHgwMDAwMDA4MAorI2RlZmluZSBGTEFHX1NURElOICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRkxBR19TVERPVVQgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEZMQUdfU1VHR0VTVFdJTiAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBGTEFHX1VEUCAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRkxBR19NT0RFVElNRSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEZMQUdfUkVQT1JUU0VUVElOR1MgMHgwMDAwMjAwMAorI2RlZmluZSBGTEFHX01VTFRJQ0FTVCAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRkxBR19OT1NFVFRSRVBPUlQgICAweDAwMDA4MDAwCisjZGVmaW5lIEZMQUdfTk9DT05OUkVQT1JUICAgMHgwMDAxMDAwMAorI2RlZmluZSBGTEFHX05PREFUQVJFUE9SVCAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgRkxBR19OT1NFUlZSRVBPUlQgICAweDAwMDQwMDAwCisjZGVmaW5lIEZMQUdfTk9NVUxUUkVQT1JUICAgMHgwMDA4MDAwMAorI2RlZmluZSBGTEFHX1NJTkdMRUNMSUVOVCAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgRkxBR19TSU5HTEVVRFAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEZMQUdfQ09OR0VTVElPTiAgICAgMHgwMDQwMDAwMAorCisjZGVmaW5lIGlzQnVmbGVuU2V0KHNldHRpbmdzKSAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19CVUZMRU5TRVQpICE9IDApCisjZGVmaW5lIGlzQ29tcGF0KHNldHRpbmdzKSAgICAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19DT01QQVQpICE9IDApCisjZGVmaW5lIGlzRGFlbW9uKHNldHRpbmdzKSAgICAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19EQUVNT04pICE9IDApCisjZGVmaW5lIGlzSVBWNihzZXR0aW5ncykgICAgICAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19ET01BSU4pICE9IDApCisjZGVmaW5lIGlzRmlsZUlucHV0KHNldHRpbmdzKSAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19GSUxFSU5QVVQpICE9IDApCisjZGVmaW5lIGlzTm9EZWxheShzZXR0aW5ncykgICAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19OT0RFTEFZKSAhPSAwKQorI2RlZmluZSBpc1ByaW50TVNTKHNldHRpbmdzKSAgICAgICAoKHNldHRpbmdzLT5mbGFncyAmIEZMQUdfUFJJTlRNU1MpICE9IDApCisjZGVmaW5lIGlzUmVtb3ZlU2VydmljZShzZXR0aW5ncykgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19SRU1PVkVTRVJWSUNFKSAhPSAwKQorI2RlZmluZSBpc1NURElOKHNldHRpbmdzKSAgICAgICAgICAoKHNldHRpbmdzLT5mbGFncyAmIEZMQUdfU1RESU4pICE9IDApCisjZGVmaW5lIGlzU1RET1VUKHNldHRpbmdzKSAgICAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19TVERPVVQpICE9IDApCisjZGVmaW5lIGlzU3VnZ2VzdFdpbihzZXR0aW5ncykgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19TVUdHRVNUV0lOKSAhPSAwKQorI2RlZmluZSBpc1VEUChzZXR0aW5ncykgICAgICAgICAgICAoKHNldHRpbmdzLT5mbGFncyAmIEZMQUdfVURQKSAhPSAwKQorI2RlZmluZSBpc01vZGVUaW1lKHNldHRpbmdzKSAgICAgICAoKHNldHRpbmdzLT5mbGFncyAmIEZMQUdfTU9ERVRJTUUpICE9IDApCisjZGVmaW5lIGlzUmVwb3J0KHNldHRpbmdzKSAgICAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19SRVBPUlRTRVRUSU5HUykgIT0gMCkKKyNkZWZpbmUgaXNNdWx0aWNhc3Qoc2V0dGluZ3MpICAgICAgKChzZXR0aW5ncy0+ZmxhZ3MgJiBGTEFHX01VTFRJQ0FTVCkgIT0gMCkKKy8vIEFjdGl2ZSBMb3cgZm9yIFJlcG9ydHMKKyNkZWZpbmUgaXNTZXR0aW5nc1JlcG9ydChzZXR0aW5ncykgKChzZXR0aW5ncy0+ZmxhZ3MgJiBGTEFHX05PU0VUVFJFUE9SVCkgPT0gMCkKKyNkZWZpbmUgaXNDb25uZWN0aW9uUmVwb3J0KHNldHRpbmdzKSAgKChzZXR0aW5ncy0+ZmxhZ3MgJiBGTEFHX05PQ09OTlJFUE9SVCkgPT0gMCkKKyNkZWZpbmUgaXNEYXRhUmVwb3J0KHNldHRpbmdzKSAgICAgKChzZXR0aW5ncy0+ZmxhZ3MgJiBGTEFHX05PREFUQVJFUE9SVCkgPT0gMCkKKyNkZWZpbmUgaXNTZXJ2ZXJSZXBvcnQoc2V0dGluZ3MpICAgKChzZXR0aW5ncy0+ZmxhZ3MgJiBGTEFHX05PU0VSVlJFUE9SVCkgPT0gMCkKKyNkZWZpbmUgaXNNdWx0aXBsZVJlcG9ydChzZXR0aW5ncykgKChzZXR0aW5ncy0+ZmxhZ3MgJiBGTEFHX05PTVVMVFJFUE9SVCkgPT0gMCkKKy8vIGVuZCBBY3RpdmUgTG93CisjZGVmaW5lIGlzU2luZ2xlQ2xpZW50KHNldHRpbmdzKSAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19TSU5HTEVDTElFTlQpICE9IDApCisjZGVmaW5lIGlzU2luZ2xlVURQKHNldHRpbmdzKSAgICAgICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19TSU5HTEVVRFApICE9IDApCisjZGVmaW5lIGlzQ29uZ2VzdGlvbkNvbnRyb2woc2V0dGluZ3MpICgoc2V0dGluZ3MtPmZsYWdzICYgRkxBR19DT05HRVNUSU9OKSAhPSAwKQorCisjZGVmaW5lIHNldEJ1ZmxlblNldChzZXR0aW5ncykgICAgIHNldHRpbmdzLT5mbGFncyB8PSBGTEFHX0JVRkxFTlNFVAorI2RlZmluZSBzZXRDb21wYXQoc2V0dGluZ3MpICAgICAgICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19DT01QQVQKKyNkZWZpbmUgc2V0RGFlbW9uKHNldHRpbmdzKSAgICAgICAgc2V0dGluZ3MtPmZsYWdzIHw9IEZMQUdfREFFTU9OCisjZGVmaW5lIHNldElQVjYoc2V0dGluZ3MpICAgICAgICAgIHNldHRpbmdzLT5mbGFncyB8PSBGTEFHX0RPTUFJTgorI2RlZmluZSBzZXRGaWxlSW5wdXQoc2V0dGluZ3MpICAgICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19GSUxFSU5QVVQKKyNkZWZpbmUgc2V0Tm9EZWxheShzZXR0aW5ncykgICAgICAgc2V0dGluZ3MtPmZsYWdzIHw9IEZMQUdfTk9ERUxBWQorI2RlZmluZSBzZXRQcmludE1TUyhzZXR0aW5ncykgICAgICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19QUklOVE1TUworI2RlZmluZSBzZXRSZW1vdmVTZXJ2aWNlKHNldHRpbmdzKSBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19SRU1PVkVTRVJWSUNFCisjZGVmaW5lIHNldFNURElOKHNldHRpbmdzKSAgICAgICAgIHNldHRpbmdzLT5mbGFncyB8PSBGTEFHX1NURElOCisjZGVmaW5lIHNldFNURE9VVChzZXR0aW5ncykgICAgICAgIHNldHRpbmdzLT5mbGFncyB8PSBGTEFHX1NURE9VVAorI2RlZmluZSBzZXRTdWdnZXN0V2luKHNldHRpbmdzKSAgICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19TVUdHRVNUV0lOCisjZGVmaW5lIHNldFVEUChzZXR0aW5ncykgICAgICAgICAgIHNldHRpbmdzLT5mbGFncyB8PSBGTEFHX1VEUAorI2RlZmluZSBzZXRNb2RlVGltZShzZXR0aW5ncykgICAgICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19NT0RFVElNRQorI2RlZmluZSBzZXRSZXBvcnQoc2V0dGluZ3MpICAgICAgICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19SRVBPUlRTRVRUSU5HUworI2RlZmluZSBzZXRNdWx0aWNhc3Qoc2V0dGluZ3MpICAgICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19NVUxUSUNBU1QKKyNkZWZpbmUgc2V0Tm9TZXR0UmVwb3J0KHNldHRpbmdzKSAgc2V0dGluZ3MtPmZsYWdzIHw9IEZMQUdfTk9TRVRUUkVQT1JUCisjZGVmaW5lIHNldE5vQ29ublJlcG9ydChzZXR0aW5ncykgIHNldHRpbmdzLT5mbGFncyB8PSBGTEFHX05PQ09OTlJFUE9SVAorI2RlZmluZSBzZXROb0RhdGFSZXBvcnQoc2V0dGluZ3MpICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19OT0RBVEFSRVBPUlQKKyNkZWZpbmUgc2V0Tm9TZXJ2UmVwb3J0KHNldHRpbmdzKSAgc2V0dGluZ3MtPmZsYWdzIHw9IEZMQUdfTk9TRVJWUkVQT1JUCisjZGVmaW5lIHNldE5vTXVsdFJlcG9ydChzZXR0aW5ncykgIHNldHRpbmdzLT5mbGFncyB8PSBGTEFHX05PTVVMVFJFUE9SVAorI2RlZmluZSBzZXRTaW5nbGVDbGllbnQoc2V0dGluZ3MpICBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19TSU5HTEVDTElFTlQKKyNkZWZpbmUgc2V0U2luZ2xlVURQKHNldHRpbmdzKSAgICAgc2V0dGluZ3MtPmZsYWdzIHw9IEZMQUdfU0lOR0xFVURQCisjZGVmaW5lIHNldENvbmdlc3Rpb25Db250cm9sKHNldHRpbmdzKSBzZXR0aW5ncy0+ZmxhZ3MgfD0gRkxBR19DT05HRVNUSU9OCisKKyNkZWZpbmUgdW5zZXRCdWZsZW5TZXQoc2V0dGluZ3MpICAgc2V0dGluZ3MtPmZsYWdzICY9IH5GTEFHX0JVRkxFTlNFVAorI2RlZmluZSB1bnNldENvbXBhdChzZXR0aW5ncykgICAgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfQ09NUEFUCisjZGVmaW5lIHVuc2V0RGFlbW9uKHNldHRpbmdzKSAgICAgIHNldHRpbmdzLT5mbGFncyAmPSB+RkxBR19EQUVNT04KKyNkZWZpbmUgdW5zZXRJUFY2KHNldHRpbmdzKSAgICAgICAgc2V0dGluZ3MtPmZsYWdzICY9IH5GTEFHX0RPTUFJTgorI2RlZmluZSB1bnNldEZpbGVJbnB1dChzZXR0aW5ncykgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfRklMRUlOUFVUCisjZGVmaW5lIHVuc2V0Tm9EZWxheShzZXR0aW5ncykgICAgIHNldHRpbmdzLT5mbGFncyAmPSB+RkxBR19OT0RFTEFZCisjZGVmaW5lIHVuc2V0UHJpbnRNU1Moc2V0dGluZ3MpICAgIHNldHRpbmdzLT5mbGFncyAmPSB+RkxBR19QUklOVE1TUworI2RlZmluZSB1bnNldFJlbW92ZVNlcnZpY2Uoc2V0dGluZ3MpICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfUkVNT1ZFU0VSVklDRQorI2RlZmluZSB1bnNldFNURElOKHNldHRpbmdzKSAgICAgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfU1RESU4KKyNkZWZpbmUgdW5zZXRTVERPVVQoc2V0dGluZ3MpICAgICAgc2V0dGluZ3MtPmZsYWdzICY9IH5GTEFHX1NURE9VVAorI2RlZmluZSB1bnNldFN1Z2dlc3RXaW4oc2V0dGluZ3MpICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfU1VHR0VTVFdJTgorI2RlZmluZSB1bnNldFVEUChzZXR0aW5ncykgICAgICAgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfVURQCisjZGVmaW5lIHVuc2V0TW9kZVRpbWUoc2V0dGluZ3MpICAgIHNldHRpbmdzLT5mbGFncyAmPSB+RkxBR19NT0RFVElNRQorI2RlZmluZSB1bnNldFJlcG9ydChzZXR0aW5ncykgICAgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfUkVQT1JUU0VUVElOR1MKKyNkZWZpbmUgdW5zZXRNdWx0aWNhc3Qoc2V0dGluZ3MpICAgc2V0dGluZ3MtPmZsYWdzICY9IH5GTEFHX01VTFRJQ0FTVAorI2RlZmluZSB1bnNldE5vU2V0dFJlcG9ydChzZXR0aW5ncykgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfTk9TRVRUUkVQT1JUCisjZGVmaW5lIHVuc2V0Tm9Db25uUmVwb3J0KHNldHRpbmdzKSAgIHNldHRpbmdzLT5mbGFncyAmPSB+RkxBR19OT0NPTk5SRVBPUlQKKyNkZWZpbmUgdW5zZXROb0RhdGFSZXBvcnQoc2V0dGluZ3MpICAgc2V0dGluZ3MtPmZsYWdzICY9IH5GTEFHX05PREFUQVJFUE9SVAorI2RlZmluZSB1bnNldE5vU2VydlJlcG9ydChzZXR0aW5ncykgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfTk9TRVJWUkVQT1JUCisjZGVmaW5lIHVuc2V0Tm9NdWx0UmVwb3J0KHNldHRpbmdzKSAgIHNldHRpbmdzLT5mbGFncyAmPSB+RkxBR19OT01VTFRSRVBPUlQKKyNkZWZpbmUgdW5zZXRTaW5nbGVDbGllbnQoc2V0dGluZ3MpICAgc2V0dGluZ3MtPmZsYWdzICY9IH5GTEFHX1NJTkdMRUNMSUVOVAorI2RlZmluZSB1bnNldFNpbmdsZVVEUChzZXR0aW5ncykgICAgICBzZXR0aW5ncy0+ZmxhZ3MgJj0gfkZMQUdfU0lOR0xFVURQCisjZGVmaW5lIHVuc2V0Q29uZ2VzdGlvbkNvbnRyb2woc2V0dGluZ3MpIHNldHRpbmdzLT5mbGFncyAmPSB+RkxBR19DT05HRVNUSU9OCisKKworI2RlZmluZSBIRUFERVJfVkVSU0lPTjEgMHg4MDAwMDAwMAorI2RlZmluZSBSVU5fTk9XICAgICAgICAgMHgwMDAwMDAwMQorCisvLyB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgNCBieXRlIElEIG51bWJlciB3ZSBwbGFjZSBpbiBVRFAgZGF0YWdyYW1zCisvLyB1c2UgaW50MzJfdCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGEgMzIgYml0IGJpdGZpZWxkIChlLmcuIG9uIEo5MCkgCit0eXBlZGVmIHN0cnVjdCBVRFBfZGF0YWdyYW0geworI2lmZGVmIEhBVkVfSU5UMzJfVAorICAgIGludDMyX3QgaWQ7CisgICAgdV9pbnQzMl90IHR2X3NlYzsKKyAgICB1X2ludDMyX3QgdHZfdXNlYzsKKyNlbHNlCisgICAgc2lnbmVkICAgaW50IGlkICAgICAgOiAzMjsKKyAgICB1bnNpZ25lZCBpbnQgdHZfc2VjICA6IDMyOworICAgIHVuc2lnbmVkIGludCB0dl91c2VjIDogMzI7CisjZW5kaWYKK30gVURQX2RhdGFncmFtOworCisvKgorICogVGhlIGNsaWVudF9oZHIgc3RydWN0dXJlIGlzIHNlbnQgZnJvbSBjbGllbnRzCisgKiB0byBzZXJ2ZXJzIHRvIGFsZXJ0IHRoZW0gb2YgdGhpbmdzIHRoYXQgbmVlZAorICogdG8gaGFwcGVuLiBPcmRlciBtdXN0IGJlIHBlcnNlcnZlZCBpbiBhbGwgCisgKiBmdXR1cmUgcmVsZWFzZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKiAxLjcgaGFzIGZsYWdzLCBudW1UaHJlYWRzLCBtUG9ydCwgYW5kIGJ1ZmZlcmxlbgorICovCit0eXBlZGVmIHN0cnVjdCBjbGllbnRfaGRyIHsKKworI2lmZGVmIEhBVkVfSU5UMzJfVAorCisgICAgLyoKKyAgICAgKiBmbGFncyBpcyBhIGJpdG1hcCBmb3IgZGlmZmVyZW50IG9wdGlvbnMKKyAgICAgKiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZSBmb3IgZGV0ZXJtaW5pbmcKKyAgICAgKiB3aGljaCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuIFNvIDEuNyB1c2VzCisgICAgICogMHg4MDAwMDAwMCBhbmQgdGhlIG5leHQgdGltZSBpbmZvcm1hdGlvbiBpcyBhZGRlZAorICAgICAqIHRoZSAxLjcgYml0IHdpbGwgYmUgc2V0IGFuZCAweDQwMDAwMDAwIHdpbGwgYmUKKyAgICAgKiBzZXQgc2lnbmlmeWluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiBJZiBubyAKKyAgICAgKiBpbmZvcm1hdGlvbiBiaXRzIGFyZSBzZXQgdGhlbiB0aGUgaGVhZGVyIGlzIGlnbm9yZWQuCisgICAgICogVGhlIGxvd2VzdCBvcmRlciBkaWZlcmVudGlhdGVzIGJldHdlZW4gZHVhbHRlc3QgYW5kCisgICAgICogdHJhZGVvZmYgbW9kZXMsIHdoZWl0aGVyIHRoZSBzcGVha2VyIG5lZWRzIHRvIHN0YXJ0IAorICAgICAqIGltbWVkaWF0ZWx5IG9yIGFmdGVyIHRoZSBhdWRpZW5jZSBmaW5pc2hlcy4KKyAgICAgKi8KKyAgICBpbnQzMl90IGZsYWdzOworICAgIGludDMyX3QgbnVtVGhyZWFkczsKKyAgICBpbnQzMl90IG1Qb3J0OworICAgIGludDMyX3QgYnVmZmVybGVuOworICAgIGludDMyX3QgbVdpbkJhbmQ7CisgICAgaW50MzJfdCBtQW1vdW50OworI2Vsc2UKKyAgICBzaWduZWQgaW50IGZsYWdzICAgICAgOiAzMjsKKyAgICBzaWduZWQgaW50IG51bVRocmVhZHMgOiAzMjsKKyAgICBzaWduZWQgaW50IG1Qb3J0ICAgICAgOiAzMjsKKyAgICBzaWduZWQgaW50IGJ1ZmZlcmxlbiAgOiAzMjsKKyAgICBzaWduZWQgaW50IG1XaW5CYW5kICAgOiAzMjsKKyAgICBzaWduZWQgaW50IG1BbW91bnQgICAgOiAzMjsKKyNlbmRpZgorfSBjbGllbnRfaGRyOworCisvKgorICogVGhlIHNlcnZlcl9oZHIgc3RydWN0dXJlIGZhY2lsaXRhdGVzIHRoZSBzZXJ2ZXIKKyAqIHJlcG9ydCBvZiBqaXR0ZXIgYW5kIGxvc3Mgb24gdGhlIGNsaWVudCBzaWRlLgorICogSXQgcGlnZ3lfYmFja3Mgb24gdGhlIGV4aXN0aW5nIGNsZWFyIHRvIGNsb3NlCisgKiBwYWNrZXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNlcnZlcl9oZHIgeworCisjaWZkZWYgSEFWRV9JTlQzMl9UCisKKyAgICAvKgorICAgICAqIGZsYWdzIGlzIGEgYml0bWFwIGZvciBkaWZmZXJlbnQgb3B0aW9ucworICAgICAqIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIGZvciBkZXRlcm1pbmluZworICAgICAqIHdoaWNoIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gU28gMS43IHVzZXMKKyAgICAgKiAweDgwMDAwMDAwIGFuZCB0aGUgbmV4dCB0aW1lIGluZm9ybWF0aW9uIGlzIGFkZGVkCisgICAgICogdGhlIDEuNyBiaXQgd2lsbCBiZSBzZXQgYW5kIDB4NDAwMDAwMDAgd2lsbCBiZQorICAgICAqIHNldCBzaWduaWZ5aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uIElmIG5vIAorICAgICAqIGluZm9ybWF0aW9uIGJpdHMgYXJlIHNldCB0aGVuIHRoZSBoZWFkZXIgaXMgaWdub3JlZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IGZsYWdzOworICAgIGludDMyX3QgdG90YWxfbGVuMTsKKyAgICBpbnQzMl90IHRvdGFsX2xlbjI7CisgICAgaW50MzJfdCBzdG9wX3NlYzsKKyAgICBpbnQzMl90IHN0b3BfdXNlYzsKKyAgICBpbnQzMl90IGVycm9yX2NudDsKKyAgICBpbnQzMl90IG91dG9yZGVyX2NudDsKKyAgICBpbnQzMl90IGRhdGFncmFtczsKKyAgICBpbnQzMl90IGppdHRlcjE7CisgICAgaW50MzJfdCBqaXR0ZXIyOworI2Vsc2UKKyAgICBzaWduZWQgaW50IGZsYWdzICAgICAgICA6IDMyOworICAgIHNpZ25lZCBpbnQgdG90YWxfbGVuMSAgIDogMzI7CisgICAgc2lnbmVkIGludCB0b3RhbF9sZW4yICAgOiAzMjsKKyAgICBzaWduZWQgaW50IHN0b3Bfc2VjICAgICA6IDMyOworICAgIHNpZ25lZCBpbnQgc3RvcF91c2VjICAgIDogMzI7CisgICAgc2lnbmVkIGludCBlcnJvcl9jbnQgICAgOiAzMjsKKyAgICBzaWduZWQgaW50IG91dG9yZGVyX2NudCA6IDMyOworICAgIHNpZ25lZCBpbnQgZGF0YWdyYW1zICAgIDogMzI7CisgICAgc2lnbmVkIGludCBqaXR0ZXIxICAgICAgOiAzMjsKKyAgICBzaWduZWQgaW50IGppdHRlcjIgICAgICA6IDMyOworI2VuZGlmCisKK30gc2VydmVyX2hkcjsKKworICAgIC8vIHNldCB0byBkZWZhdWx0cworICAgIHZvaWQgU2V0dGluZ3NfSW5pdGlhbGl6ZSggdGhyZWFkX1NldHRpbmdzKiBtYWluICk7CisKKyAgICAvLyBjb3B5IHN0cnVjdHVyZQorICAgIHZvaWQgU2V0dGluZ3NfQ29weSggdGhyZWFkX1NldHRpbmdzKiBmcm9tLCB0aHJlYWRfU2V0dGluZ3MqKiBpbnRvICk7CisKKyAgICAvLyBmcmVlIGFzc29jaWF0ZWQgbWVtb3J5CisgICAgdm9pZCBTZXR0aW5nc19EZXN0cm95KCB0aHJlYWRfU2V0dGluZ3MgKm1TZXR0aW5ncyApOworCisgICAgLy8gcGFyc2Ugc2V0dGluZ3MgZnJvbSB1c2VyJ3MgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgdm9pZCBTZXR0aW5nc19QYXJzZUVudmlyb25tZW50KCB0aHJlYWRfU2V0dGluZ3MgKm1TZXR0aW5ncyApOworCisgICAgLy8gcGFyc2Ugc2V0dGluZ3MgZnJvbSBhcHAncyBjb21tYW5kIGxpbmUKKyAgICB2b2lkIFNldHRpbmdzX1BhcnNlQ29tbWFuZExpbmUoIGludCBhcmdjLCBjaGFyICoqYXJndiwgdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKTsKKworICAgIC8vIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSBmb3IgW0tNR11iaXRzL3NlYworICAgIHZvaWQgU2V0dGluZ3NfR2V0TG93ZXJDYXNlQXJnKGNvbnN0IGNoYXIgKixjaGFyICopOworCisgICAgLy8gY29udmVydCB0byB1cHBlciBjYXNlIGZvciBbS01HXWJ5dGVzL3NlYworICAgIHZvaWQgU2V0dGluZ3NfR2V0VXBwZXJDYXNlQXJnKGNvbnN0IGNoYXIgKixjaGFyICopOworCisgICAgLy8gZ2VuZXJhdGUgc2V0dGluZ3MgZm9yIGxpc3RlbmVyIGluc3RhbmNlCisgICAgdm9pZCBTZXR0aW5nc19HZW5lcmF0ZUxpc3RlbmVyU2V0dGluZ3MoIHRocmVhZF9TZXR0aW5ncyAqY2xpZW50LCB0aHJlYWRfU2V0dGluZ3MgKipsaXN0ZW5lcik7CisKKyAgICAvLyBnZW5lcmF0ZSBzZXR0aW5ncyBmb3Igc3BlYWtlciBpbnN0YW5jZQorICAgIHZvaWQgU2V0dGluZ3NfR2VuZXJhdGVDbGllbnRTZXR0aW5ncyggdGhyZWFkX1NldHRpbmdzICpzZXJ2ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX1NldHRpbmdzICoqY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2hkciAqaGRyICk7CisKKyAgICAvLyBnZW5lcmF0ZSBjbGllbnQgaGVhZGVyIGZvciBzZXJ2ZXIKKyAgICB2b2lkIFNldHRpbmdzX0dlbmVyYXRlQ2xpZW50SGRyKCB0aHJlYWRfU2V0dGluZ3MgKmNsaWVudCwgY2xpZW50X2hkciAqaGRyICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCisKKyNlbmRpZiAvLyBTRVRUSU5HU19ICmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL1NvY2tldEFkZHIuaCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvU29ja2V0QWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmZkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL1NvY2tldEFkZHIuaApAQCAtMCwwICsxLDEwNCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIFNvY2tldC5jcHAKKyAqIGJ5IEFqYXkgVGlydW1hbGEgPHRpcnVtYWxhQG5jc2EudWl1Yy5lZHU+IAorICogICAgYW5kIE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworI2lmbmRlZiBTT0NLRVRfQUREUl9ICisjZGVmaW5lIFNPQ0tFVF9BRERSX0gKKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5ocHAiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIHZvaWQgU29ja0FkZHJfbG9jYWxBZGRyKCB0aHJlYWRfU2V0dGluZ3MgKmluU2V0dGluZ3MgKTsKKyAgICB2b2lkIFNvY2tBZGRyX3JlbW90ZUFkZHIoIHRocmVhZF9TZXR0aW5ncyAqaW5TZXR0aW5ncyApOworCisgICAgdm9pZCBTb2NrQWRkcl9zZXRIb3N0bmFtZSggY29uc3QgY2hhciogaW5Ib3N0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzSVB2NiApOyAgICAgICAgICAvLyBETlMgbG9va3VwCisgICAgdm9pZCBTb2NrQWRkcl9nZXRIb3N0bmFtZSggaXBlcmZfc29ja2FkZHIgKmluU29ja0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogb3V0SG9zdG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gKTsgICAvLyByZXZlcnNlIEROUyBsb29rdXAKKyAgICB2b2lkIFNvY2tBZGRyX2dldEhvc3RBZGRyZXNzKCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogb3V0QWRkcmVzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiApOyAvLyBkb3R0ZWQgZGVjaW1hbAorCisgICAgdm9pZCBTb2NrQWRkcl9zZXRQb3J0KCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciwgdW5zaWduZWQgc2hvcnQgaW5Qb3J0ICk7CisgICAgdm9pZCBTb2NrQWRkcl9zZXRQb3J0QW55KCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciApOworICAgIHVuc2lnbmVkIHNob3J0IFNvY2tBZGRyX2dldFBvcnQoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICk7CisKKyAgICB2b2lkIFNvY2tBZGRyX3NldEFkZHJlc3NBbnkoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICk7CisKKyAgICAvLyByZXR1cm4gcG9pbnRlciB0byB0aGUgc3RydWN0IGluX2FkZHIKKyAgICBzdHJ1Y3QgaW5fYWRkciogU29ja0FkZHJfZ2V0X2luX2FkZHIoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICk7CisjaWZkZWYgSEFWRV9JUFY2CisgICAgLy8gcmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBpbl9hZGRyCisgICAgc3RydWN0IGluNl9hZGRyKiBTb2NrQWRkcl9nZXRfaW42X2FkZHIoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICk7CisjZW5kaWYKKyAgICAvLyByZXR1cm4gdGhlIHNpemVvZiB0aGUgYWRkZXNzIHN0cnVjdHVyZSAoc3RydWN0IHNvY2thZGRyX2luKQorICAgIFNvY2tsZW5fdCBTb2NrQWRkcl9nZXRfc2l6ZW9mX3NvY2thZGRyKCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciApOworCisgICAgaW50IFNvY2tBZGRyX2lzTXVsdGljYXN0KCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciApOworCisgICAgaW50IFNvY2tBZGRyX2lzSVB2NiggaXBlcmZfc29ja2FkZHIgKmluU29ja0FkZHIgKTsKKworICAgIGludCBTb2NrQWRkcl9hcmVfRXF1YWwoIHN0cnVjdCBzb2NrYWRkciAqZmlyc3QsIHN0cnVjdCBzb2NrYWRkciAqc2Vjb25kICk7CisgICAgaW50IFNvY2tBZGRyX0hvc3RhcmVfRXF1YWwoIHN0cnVjdCBzb2NrYWRkciAqZmlyc3QsIHN0cnVjdCBzb2NrYWRkciAqc2Vjb25kICk7CisKKyAgICB2b2lkIFNvY2tBZGRyX3plcm9BZGRyZXNzKCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciApOworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmIC8qIFNPQ0tFVF9BRERSX0ggKi8KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvVGhyZWFkLmggYi9pcGVyZi0yLjAuNS9pbmNsdWRlL1RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjQxODcKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL1RocmVhZC5oCkBAIC0wLDAgKzEsMTU5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogVGhyZWFkLmgKKyAqIGJ5IEtldmluIEdpYmJzIDxrZ2liYnNAbmxhbnIubmV0PgorICoKKyAqIEJhc2VkIG9uOgorICogVGhyZWFkLmhwcAorICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSB0aHJlYWQgc3Vic3lzdGVtIGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgdGhyZWFkIGZ1bmN0aW9ucy4gSXQKKyAqIHByb3ZpZGVzIGEgdGhyZWFkIGltcGxlbWVudGF0aW9uIGFnbm9zdGljIGludGVyZmFjZSB0byBJcGVyZi4gSWYgCisgKiB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlIChIQVZFX1RIUkVBRCBpcyB1bmRlZmluZWQpLCB0aHJlYWRfc3RhcnQKKyAqIGRvZXMgbm90IHN0YXJ0IGEgbmV3IHRocmVhZCBidXQganVzdCBsYXVuY2hlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCAKKyAqIGluIHRoZSBjdXJyZW50IHRocmVhZC4gRXZlcnl0aGluZyB0aGF0IGRlZmluZXMgYSB0aHJlYWQgb2YgCisgKiBleGVjdXRpb24gaW4gSXBlcmYgaXMgY29udGFpbmVkIGluIGFuIHRocmVhZF9TZXR0aW5ncyBzdHJ1Y3R1cmUuIFRvCisgKiBzdGFydCBhIHRocmVhZCBzaW1wbHkgcGFzcyBvbmUgc3VjaCBzdHJ1Y3R1cmUgaW50byB0aHJlYWRfc3RhcnQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgVEhSRUFEX0gKKyNkZWZpbmUgVEhSRUFEX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpZiAgIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkKKworLyogRGVmaW5pdGlvbnMgZm9yIFBvc2l4IFRocmVhZHMgKHB0aHJlYWRzKSAqLworICAgICNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3R5cGVkZWYgcHRocmVhZF90IG50aHJlYWRfdDsKKworICAgICNkZWZpbmUgSEFWRV9USFJFQUQgMQorCisjZWxpZiBkZWZpbmVkKCBIQVZFX1dJTjMyX1RIUkVBRCApCisKKy8qIERlZmluaXRpb25zIGZvciBXaW4zMiBOVCBUaHJlYWRzICovCit0eXBlZGVmIERXT1JEIG50aHJlYWRfdDsKKworICAgICNkZWZpbmUgSEFWRV9USFJFQUQgMQorCisjZWxzZQorCisvKiBEZWZpbml0aW9ucyBmb3Igbm8gdGhyZWFkcyAqLwordHlwZWRlZiBpbnQgbnRocmVhZF90OworCisgICAgI3VuZGVmIEhBVkVfVEhSRUFECisKKyNlbmRpZgorCisgICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbgorICAgIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3M7CisKKyNpbmNsdWRlICJDb25kaXRpb24uaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5ocHAiCisKKyAgICAvLyBpbml0aWFsaXplIG9yIGRlc3Ryb3kgdGhlIHRocmVhZCBzdWJzeXN0ZW0KKyAgICB2b2lkIHRocmVhZF9pbml0KCApOworICAgIHZvaWQgdGhyZWFkX2Rlc3Ryb3koICk7CisKKyAgICAvLyBzdGFydCBvciBzdG9wIGEgdGhyZWFkIGV4ZWN1dGluZworICAgIHZvaWQgdGhyZWFkX3N0YXJ0KCBzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzKiB0aHJlYWQgKTsKKyAgICB2b2lkIHRocmVhZF9zdG9wKCBzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzKiB0aHJlYWQgKTsKKworICAgIC8qIHdhaXQgZm9yIHRoaXMgb3IgYWxsIHRocmVhZHMgdG8gY29tcGxldGUgKi8KKyAgICB2b2lkIHRocmVhZF9qb2luYWxsKCB2b2lkICk7CisKKyAgICBpbnQgdGhyZWFkX251bXVzZXJ0aHJlYWRzKCB2b2lkICk7CisKKyAgICAvLyBzZXQgYSB0aHJlYWQgdG8gYmUgaWdub3JhYmxlLCBzbyBqb2luYWxsIHdvbid0IHdhaXQgb24gaXQKKyAgICB2b2lkIHRocmVhZF9zZXRpZ25vcmUoIHZvaWQgKTsKKyAgICB2b2lkIHRocmVhZF91bnNldGlnbm9yZSggdm9pZCApOworCisgICAgLy8gVXNlZCBmb3IgdGhyZWFkcyB0aGF0IG1heSBuZXZlciB0ZXJtaW5hdGUgKGllIExpc3RlbmVyIFRocmVhZCkKKyAgICB2b2lkIHRocmVhZF9yZWdpc3Rlcl9ub250ZXJtKCB2b2lkICk7CisgICAgdm9pZCB0aHJlYWRfdW5yZWdpc3Rlcl9ub250ZXJtKCB2b2lkICk7CisgICAgaW50IHRocmVhZF9yZWxlYXNlX25vbnRlcm0oIGludCBmb3JjZSApOworCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB0aHJlYWQncyBJRC4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgI2lmICAgZGVmaW5lZCggSEFWRV9QT1NJWF9USFJFQUQgKQorICAgICAgICAjZGVmaW5lIHRocmVhZF9nZXRpZCgpIHB0aHJlYWRfc2VsZigpCisgICAgI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgICAgICAjZGVmaW5lIHRocmVhZF9nZXRpZCgpIEdldEN1cnJlbnRUaHJlYWRJZCgpCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSB0aHJlYWRfZ2V0aWQoKSAwCisgICAgI2VuZGlmCisKKyAgICBpbnQgdGhyZWFkX2VxdWFsaWQoIG50aHJlYWRfdCBpbkxlZnQsIG50aHJlYWRfdCBpblJpZ2h0ICk7CisKKyAgICBudGhyZWFkX3QgdGhyZWFkX3plcm9pZCggdm9pZCApOworICAgIAorI2lmICAgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgIERXT1JEIFdJTkFQSSB0aHJlYWRfcnVuX3dyYXBwZXIoIHZvaWQqIHBhcmFtUHRyICk7CisjZWxzZQorICAgIHZvaWQqICAgICAgICB0aHJlYWRfcnVuX3dyYXBwZXIoIHZvaWQqIHBhcmFtUHRyICk7CisjZW5kaWYKKworICAgIHZvaWQgdGhyZWFkX3Jlc3QgKCB2b2lkICk7CisKKyAgICAvLyBkZWZpbmVkIGluIGxhdW5jaC5jcHAKKyAgICB2b2lkIHNlcnZlcl9zcGF3biggc3RydWN0IHRocmVhZF9TZXR0aW5ncyogdGhyZWFkICk7CisgICAgdm9pZCBjbGllbnRfc3Bhd24oIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MqIHRocmVhZCApOworICAgIHZvaWQgY2xpZW50X2luaXQoIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MqIGNsaWVudHMgKTsKKyAgICB2b2lkIGxpc3RlbmVyX3NwYXduKCBzdHJ1Y3QgdGhyZWFkX1NldHRpbmdzKiB0aHJlYWQgKTsKKworICAgIC8vIGRlZmluZWQgaW4gcmVwb3J0ZXIuYworICAgIHZvaWQgcmVwb3J0ZXJfc3Bhd24oIHN0cnVjdCB0aHJlYWRfU2V0dGluZ3MqIHRocmVhZCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorI2VuZGlmIC8vIFRIUkVBRF9ICmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL1RpbWVzdGFtcC5ocHAgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL1RpbWVzdGFtcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4YmNmYwotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvVGltZXN0YW1wLmhwcApAQCAtMCwwICsxLDI1NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogVGltZXN0YW1wLmhwcAorICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEEgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gYSB0aW1lc3RhbXAuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIHVuaXggZ2V0dGltZW9mZGF5KCkuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBoZWFkZXJzCisgKiB1c2VzCisgKiAgIDxzeXMvdHlwZXMuaD4KKyAqICAgPHN5cy90aW1lLmg+CisgKiAgIDx1bmlzdGQuaD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBUSU1FU1RBTVBfSAorI2RlZmluZSBUSU1FU1RBTVBfSAorCisjaW5jbHVkZSAiaGVhZGVycy5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjbGFzcyBUaW1lc3RhbXAgeworcHVibGljOgorICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBDcmVhdGUgYSB0aW1lc3RhbXAsIHdpdGggdGhlIGN1cnJlbnQgdGltZSBpbiBpdC4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgVGltZXN0YW1wKCB2b2lkICkgeworICAgICAgICBzZXRub3coKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ3JlYXRlIGEgdGltZXN0YW1wLCB3aXRoIHRoZSBnaXZlbiBzZWNvbmRzL21pY3Jvc2Vjb25kcworICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBUaW1lc3RhbXAoIGxvbmcgc2VjLCBsb25nIHVzZWMgKSB7CisgICAgICAgIHNldCggc2VjLCB1c2VjICk7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENyZWF0ZSBhIHRpbWVzdGFtcCwgd2l0aCB0aGUgZ2l2ZW4gc2Vjb25kcworICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBUaW1lc3RhbXAoIGRvdWJsZSBzZWMgKSB7CisgICAgICAgIHNldCggc2VjICk7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFNldCB0aW1lc3RhbXAgdG8gY3VycmVudCB0aW1lLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICB2b2lkIHNldG5vdyggdm9pZCApIHsKKyAgICAgICAgZ2V0dGltZW9mZGF5KCAmbVRpbWUsIE5VTEwgKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogU2V0IHRpbWVzdGFtcCB0byB0aGUgZ2l2ZW4gc2Vjb25kcy9taWNyb3NlY29uZHMKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgdm9pZCBzZXQoIGxvbmcgc2VjLCBsb25nIHVzZWMgKSB7CisgICAgICAgIGFzc2VydCggc2VjICA+PSAwICk7CisgICAgICAgIGFzc2VydCggdXNlYyA+PSAwICAmJiAgdXNlYyA8IGtNaWxsaW9uICk7CisKKyAgICAgICAgbVRpbWUudHZfc2VjICA9IHNlYzsKKyAgICAgICAgbVRpbWUudHZfdXNlYyA9IHVzZWM7ICAgICAgCisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFNldCB0aW1lc3RhbXAgdG8gdGhlIGdpdmVuIHNlY29uZHMKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgdm9pZCBzZXQoIGRvdWJsZSBzZWMgKSB7CisgICAgICAgIG1UaW1lLnR2X3NlYyAgPSAobG9uZykgc2VjOworICAgICAgICBtVGltZS50dl91c2VjID0gKGxvbmcpICgoc2VjIC0gbVRpbWUudHZfc2VjKSAqIGtNaWxsaW9uKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogcmV0dXJuIHNlY29uZHMgcG9ydGlvbiBvZiB0aW1lc3RhbXAKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgbG9uZyBnZXRTZWNzKCB2b2lkICkgeworICAgICAgICByZXR1cm4gbVRpbWUudHZfc2VjOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiByZXR1cm4gbWljcm9zZWNvbmRzIHBvcnRpb24gb2YgdGltZXN0YW1wCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGxvbmcgZ2V0VXNlY3MoIHZvaWQgKSB7CisgICAgICAgIHJldHVybiBtVGltZS50dl91c2VjOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiByZXR1cm4gdGltZXN0YW1wIGFzIGEgZmxvYXRpbmcgcG9pbnQgc2Vjb25kcworICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBkb3VibGUgZ2V0KCB2b2lkICkgeworICAgICAgICByZXR1cm4gbVRpbWUudHZfc2VjICsgbVRpbWUudHZfdXNlYyAvICgoZG91YmxlKSBrTWlsbGlvbik7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIHN1YnRyYWN0IHRoZSByaWdodCB0aW1lc3RhbXAgZnJvbSBteSB0aW1lc3RhbXAuCisgICAgICogcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIG1pY3Jvc2Vjb25kcy4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgbG9uZyBzdWJVc2VjKCBUaW1lc3RhbXAgcmlnaHQgKSB7CisgICAgICAgIHJldHVybihtVGltZS50dl9zZWMgIC0gcmlnaHQubVRpbWUudHZfc2VjKSAqIGtNaWxsaW9uICsKKyAgICAgICAgKG1UaW1lLnR2X3VzZWMgLSByaWdodC5tVGltZS50dl91c2VjKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogc3VidHJhY3QgdGhlIHJpZ2h0IHRpbWVzdGFtcCBmcm9tIG15IHRpbWVzdGFtcC4KKyAgICAgKiByZXR1cm4gdGhlIGRpZmZlcmVuY2UgaW4gbWljcm9zZWNvbmRzLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBsb25nIHN1YlVzZWMoIHRpbWV2YWwgcmlnaHQgKSB7CisgICAgICAgIHJldHVybihtVGltZS50dl9zZWMgIC0gcmlnaHQudHZfc2VjKSAqIGtNaWxsaW9uICsKKyAgICAgICAgKG1UaW1lLnR2X3VzZWMgLSByaWdodC50dl91c2VjKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGZyb20gbm93IHRvIGxhc3QgdGltZSBvZiBzZXR0aW5nLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBsb25nIGRlbHRhX3VzZWModm9pZCkgeworICAgICAgICBzdHJ1Y3QgdGltZXZhbCBwcmV2aW91cyA9IG1UaW1lOworCisgICAgICAgIHNldG5vdygpOworICAgICAgICByZXR1cm4gc3ViVXNlYyhwcmV2aW91cyk7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIHN1YnRyYWN0IHRoZSByaWdodCB0aW1lc3RhbXAgZnJvbSBteSB0aW1lc3RhbXAuCisgICAgICogcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIHNlY29uZHMgYXMgYSBmbG9hdGluZyBwb2ludC4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgZG91YmxlIHN1YlNlYyggVGltZXN0YW1wIHJpZ2h0ICkgeworICAgICAgICByZXR1cm4obVRpbWUudHZfc2VjICAtIHJpZ2h0Lm1UaW1lLnR2X3NlYykgKworICAgICAgICAobVRpbWUudHZfdXNlYyAtIHJpZ2h0Lm1UaW1lLnR2X3VzZWMpIC8gKChkb3VibGUpIGtNaWxsaW9uKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogYWRkIHRoZSByaWdodCB0aW1lc3RhbXAgdG8gbXkgdGltZXN0YW1wLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICB2b2lkIGFkZCggVGltZXN0YW1wIHJpZ2h0ICkgeworICAgICAgICBtVGltZS50dl9zZWMgICs9IHJpZ2h0Lm1UaW1lLnR2X3NlYzsKKyAgICAgICAgbVRpbWUudHZfdXNlYyArPSByaWdodC5tVGltZS50dl91c2VjOworCisgICAgICAgIC8vIHdhdGNoIGZvciB1bmRlci0gYW5kIG92ZXJmbG93CisgICAgICAgIGlmICggbVRpbWUudHZfdXNlYyA8IDAgKSB7CisgICAgICAgICAgICBtVGltZS50dl91c2VjICs9IGtNaWxsaW9uOworICAgICAgICAgICAgbVRpbWUudHZfc2VjLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBtVGltZS50dl91c2VjID49IGtNaWxsaW9uICkgeworICAgICAgICAgICAgbVRpbWUudHZfdXNlYyAtPSBrTWlsbGlvbjsKKyAgICAgICAgICAgIG1UaW1lLnR2X3NlYysrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KCBtVGltZS50dl91c2VjID49IDAgICYmCisgICAgICAgICAgICAgICAgbVRpbWUudHZfdXNlYyA8ICBrTWlsbGlvbiApOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBhZGQgdGhlIHNlY29uZHMgdG8gbXkgdGltZXN0YW1wLgorICAgICAqIFRPRE8gb3B0aW1pemU/CisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIHZvaWQgYWRkKCBkb3VibGUgc2VjICkgeworICAgICAgICBtVGltZS50dl9zZWMgICs9IChsb25nKSBzZWM7CisgICAgICAgIG1UaW1lLnR2X3VzZWMgKz0gKGxvbmcpICgoc2VjIC0gKChsb25nKSBzZWMgKSkgKiBrTWlsbGlvbik7CisKKyAgICAgICAgLy8gd2F0Y2ggZm9yIG92ZXJmbG93CisgICAgICAgIGlmICggbVRpbWUudHZfdXNlYyA+PSBrTWlsbGlvbiApIHsKKyAgICAgICAgICAgIG1UaW1lLnR2X3VzZWMgLT0ga01pbGxpb247CisgICAgICAgICAgICBtVGltZS50dl9zZWMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCggbVRpbWUudHZfdXNlYyA+PSAwICAmJgorICAgICAgICAgICAgICAgIG1UaW1lLnR2X3VzZWMgPCAga01pbGxpb24gKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogcmV0dXJuIHRydWUgaWYgbXkgdGltZXN0YW1wIGlzIGJlZm9yZSB0aGUgcmlnaHQgdGltZXN0YW1wLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBib29sIGJlZm9yZSggdGltZXZhbCByaWdodCApIHsKKyAgICAgICAgcmV0dXJuIG1UaW1lLnR2X3NlYyA8IHJpZ2h0LnR2X3NlYyAgfHwKKyAgICAgICAgKG1UaW1lLnR2X3NlYyA9PSByaWdodC50dl9zZWMgJiYKKyAgICAgICAgIG1UaW1lLnR2X3VzZWMgPCByaWdodC50dl91c2VjKTsKKyAgICB9CisgICAgYm9vbCBiZWZvcmUoIFRpbWVzdGFtcCByaWdodCApIHsgcmV0dXJuIGJlZm9yZShyaWdodC5tVGltZSk7IH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiByZXR1cm4gdHJ1ZSBpZiBteSB0aW1lc3RhbXAgaXMgYWZ0ZXIgdGhlIHJpZ2h0IHRpbWVzdGFtcC4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgYm9vbCBhZnRlciggdGltZXZhbCByaWdodCApIHsKKyAgICAgICAgcmV0dXJuIG1UaW1lLnR2X3NlYyA+IHJpZ2h0LnR2X3NlYyAgfHwKKyAgICAgICAgKG1UaW1lLnR2X3NlYyA9PSByaWdodC50dl9zZWMgJiYKKyAgICAgICAgIG1UaW1lLnR2X3VzZWMgPiByaWdodC50dl91c2VjKTsKKyAgICB9CisgICAgYm9vbCBhZnRlciggVGltZXN0YW1wIHJpZ2h0ICkgeyByZXR1cm4gYWZ0ZXIocmlnaHQubVRpbWUpOyB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZyYWN0aW9uIG9mIHRpbWUgZWxhcHNlZCBhZnRlciB0aGUgYmVnaW5uaW5nIAorICAgICAqIHRpbGwgdGhlIGVuZAorICAgICAqLworICAgIGRvdWJsZSBmcmFjdGlvbihUaW1lc3RhbXAgY3VycmVudFRpbWUsIFRpbWVzdGFtcCBlbmRUaW1lKSB7CisgICAgICAgIGlmICggKGN1cnJlbnRUaW1lLmFmdGVyKCp0aGlzKSkgJiYgKGVuZFRpbWUuYWZ0ZXIoY3VycmVudFRpbWUpKSApIHsKKyAgICAgICAgICAgIHJldHVybigoKGRvdWJsZSljdXJyZW50VGltZS5zdWJVc2VjKCp0aGlzKSkgLworICAgICAgICAgICAgICAgICAgICgoZG91YmxlKWVuZFRpbWUuc3ViVXNlYygqdGhpcykpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMS4wOworICAgICAgICB9CisgICAgfQorCisKK3Byb3RlY3RlZDoKKyAgICBlbnVtIHsKKyAgICAgICAga01pbGxpb24gPSAxMDAwMDAwCisgICAgfTsKKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lOworCit9OyAvLyBlbmQgY2xhc3MgVGltZXN0YW1wCisKKyNlbmRpZiAvLyBUSU1FU1RBTVBfSApkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvaW5jbHVkZS9jb25maWcud2luMzIuaCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvY29uZmlnLndpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhY2I4MwotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvY29uZmlnLndpbjMyLmgKQEAgLTAsMCArMSw4MiBAQAorLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgaGFuZCBmb3IgV2luZG93cy4gKi8KKyNpZm5kZWYgQ09ORklHX0gKKyNkZWZpbmUgQ09ORklHX0gKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29uZmlnLmgKKyAqCisgKiBjb25maWcuaCBpcyBkZXJpdmVkIGZyb20gY29uZmlnLmguaW4gLS0gZG8gbm90IGVkaXQgY29uZmlnLmgKKyAqCisgKiBUaGlzIGNvbnRhaW5zIHZhcmlhYmxlcyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNoZWNrcyBhbmQKKyAqIHRoZW4gZGVmaW5lcyBvciB1bmRlZmluZXMuIFRoZSBzb3VyY2UgY29kZSBjaGVja3MgZm9yIHRoZXNlCisgKiB2YXJpYWJsZXMgdG8ga25vdyBpZiBjZXJ0YWluIGZlYXR1cmVzIGFyZSBwcmVzZW50LgorICogCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICoKKyAqIENvcHlyaWdodCAgMTk5OSAgVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIGRvYy9saWNlbnNlLnR4dCBmb3IgY29tcGxldGUgdGV4dC4KKyAqCisgKiAkSWQ6IGNvbmZpZy53aW4zMi5oLHYgMS4xLjEuMSAyMDA0LzA1LzE4IDAxOjUwOjQ0IGtnaWJicyBFeHAgJAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBEZWZpbmUgaWYgdGhyZWFkcyBleGlzdCAodXNpbmcgcHRocmVhZHMgb3IgV2luMzIgdGhyZWFkcykgKi8KKy8qICN1bmRlZiBIQVZFX1BPU0lYX1RIUkVBRCAqLworI2RlZmluZSBIQVZFX1dJTjMyX1RIUkVBRCAxCisvKiAjdW5kZWYgX1JFRU5UUkFOVCAqLworCisvKiBEZWZpbmUgaWYgb24gT1NGMSBhbmQgbmVlZCBzcGVjaWFsIGV4dGVybiAiQyIgYXJvdW5kIHNvbWUgaGVhZGVyIGZpbGVzICovCisvKiAjdW5kZWYgU1BFQ0lBTF9PU0YxX0VYVEVSTiAqLworCisvKiBEZWZpbmUgaWYgdGhlIHN0cmluZ3MuaCBoZWFkZXIgZmlsZSBleGlzdHMgKi8KKy8qICN1bmRlZiBIQVZFX1NUUklOR1NfSCAqLworCisvKiBEZWZpbmUgdGhlIGludFhYX3QsIHVfaW50WFhfdCwgc2l6ZV90LCBzc2l6ZV90LCBhbmQgc29ja2xlbl90IHR5cGVzICovCisvKiBPbiB0aGUgQ3JheSBKOTAgdGhlcmUgaXMgbm8gNCBieXRlIGludGVnZXIsIHNvIHdlIGRlZmluZSBpbnQzMl90CisgKiBidXQgaXQgaXMgOCBieXRlcywgYW5kIHdlIGxlYXZlIEhBVkVfSU5UMzJfVCB1bmRlZmluZWQuICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorI2RlZmluZSBIQVZFX1VfSU5UMTZfVCAxCisjZGVmaW5lIEhBVkVfSU5UMzJfVCAgIDEKKyNkZWZpbmUgSEFWRV9JTlQ2NF9UICAgMQorI2RlZmluZSBIQVZFX1VfSU5UMzJfVCAxCisKKyNkZWZpbmUgaW50MzJfdCAgICAgTE9ORzMyCisjZGVmaW5lIHVfaW50MTZfdCAgIFVJTlQxNgorI2RlZmluZSB1X2ludDMyX3QgICBVTE9ORzMyCisvKiAjdW5kZWYgIHNpemVfdCAqLworI2RlZmluZSBzc2l6ZV90IGludAorCisvKiBzb2NrbGVuX3QgdXN1YWxseSBkZWZpbmVkIGluIDxzeXMvc29ja2V0Lmg+LiBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3QKKyAqIHdvcmsgb24gc29tZSBzeXN0ZW1zIChsaWtlIERFQyBPU0YvMSksIHNvIHdlJ2xsIHVzZSBvdXIgb3duIFNvY2tsZW5fdCAqLworI2RlZmluZSBTb2NrbGVuX3QgaW50CisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGVzZSBmdW5jdGlvbnMuICovCisjZGVmaW5lIEhBVkVfU05QUklOVEYgMQorLyogI3VuZGVmIEhBVkVfSU5FVF9QVE9OICovCisvKiAjdW5kZWYgSEFWRV9JTkVUX05UT1AgKi8KKy8qICN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWSAqLworLyogI3VuZGVmIEhBVkVfUFRIUkVBRF9DQU5DRUwgKi8KKyNkZWZpbmUgSEFWRV9VU0xFRVAgMQorLyogI3VuZGVmIEhBVkVfUVVBRF9TVVBQT1JUICovCisvKiAjdW5kZWYgSEFWRV9QUklOVEZfUUQgKi8KKworLyogc3RhbmRhcmQgQysrLCB3aGljaCBpc24ndCBhbHdheXMuLi4gKi8KKy8qICN1bmRlZiBib29sICovCisjZGVmaW5lIHRydWUgICAxCisjZGVmaW5lIGZhbHNlICAwCisKKy8qIERlZmluZSBpZiB0aGUgaG9zdCBpcyBCaWcgRW5kaWFuIChuZXR3b3JrIGJ5dGUgb3JkZXIpICovCisvKiAjdW5kZWYgV09SRFNfQklHRU5ESUFOICovCisKKy8qIERlZmluZSBpZiBtdWx0aWNhc3Qgc3VwcG9ydCBleGlzdHMgKi8KKyNkZWZpbmUgSEFWRV9NVUxUSUNBU1QgMQorCisvKiBEZWZpbmUgaWYgYWxsIElQdjYgaGVhZGVycy9zdHJ1Y3R1cmVzIGFyZSBwcmVzZW50ICovCisjZGVmaW5lIEhBVkVfSVBWNiAxCisKKy8qIERlZmluZSBpZiBJUHY2IG11bHRpY2FzdCBzdXBwb3J0IGV4aXN0cyAqLworI2RlZmluZSBIQVZFX0lQVjZfTVVMVElDQVNUIDEKKworLyogRGVmaW5lIGlmIERlYnVnZ2luZyBvZiBzb2NrZXRzIGlzIGRlc2lyZWQgKi8KKy8qICN1bmRlZiBEQkdfTUpaICovCisgCisjZW5kaWYgLyogQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvZGVsYXkuaHBwIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9kZWxheS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzNzQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvZGVsYXkuaHBwCkBAIC0wLDAgKzEsNTggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBkZWxheS5ocHAKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBhY2N1cmF0ZSBtaWNyb3NlY29uZCBkZWxheQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIERFTEFZX0gKKyNkZWZpbmUgREVMQVlfSAorCit2b2lkIGRlbGF5X2xvb3AoIHVuc2lnbmVkIGxvbmcgdXNlY3MgKTsKKworI2VuZGlmIC8qIERFTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvZ2V0dGltZW9mZGF5LmggYi9pcGVyZi0yLjAuNS9pbmNsdWRlL2dldHRpbWVvZmRheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzEwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL2dldHRpbWVvZmRheS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBnZXR0aW1lb2ZkYXkuaAorICoKKyAqIE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBnZXR0aW1lb2ZkYXkgZm9yIFdpbmRvd3MuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgR0VUVElNRU9GREFZX0gKKyNkZWZpbmUgR0VUVElNRU9GREFZX0gKKworI2lmbmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorCisgICAgI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitpbnQgZ2V0dGltZW9mZGF5KCBzdHJ1Y3QgdGltZXZhbCogdHYsIHZvaWQqIHRpbWV6b25lICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworICAgICNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9HRVRUSU1FT0ZEQVkgKi8KKyNlbmRpZiAvKiBHRVRUSU1FT0ZEQVlfSCAqLworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvZ251X2dldG9wdC5oIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9nbnVfZ2V0b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlMTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvZ251X2dldG9wdC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKiBEZWNsYXJhdGlvbnMgZm9yIGdudV9nZXRvcHQuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LiAgSXRzIG1hc3RlciBzb3VyY2UgaXMgTk9UIHBhcnQgb2YKKyAgIHRoZSBDIGxpYnJhcnksIGhvd2V2ZXIuICBUaGUgbWFzdGVyIHNvdXJjZSBsaXZlcyBpbiAvZ2QvZ251L2xpYi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsCisgICB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qCisgKiBtb2RpZmllZCBKdWx5IDksIDE5OTkgYnkgbWFyayBnYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqICAgICAgICAgIERlYyAxNywgMTk5OQorICoKKyAqIHJlbmFtZWQgYWxsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGJ5IHByZXBlbmRpbmcgImdudV8iCisgKiByZW1vdmVkL3JlZGlkIGEgYnVuY2ggb2Ygc3R1ZmYgdW5kZXIgdGhlIGFzc3VtcHRpb24gd2UncmUKKyAqICAgdXNpbmcgYSBtb2Rlcm4gc3RhbmRhcmQgQyBjb21waWxlci4KKyAqCisgKiAkSWQ6IGdudV9nZXRvcHQuaCx2IDEuMS4xLjEgMjAwNC8wNS8xOCAwMTo1MDo0NCBrZ2liYnMgRXhwICQKKyAqLworCisjaWZuZGVmIF9HRVRPUFRfSAorICAgICNkZWZpbmUgX0dFVE9QVF9IIDEKKworICAgICNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ251X2dldG9wdCcgdG8gdGhlIGNhbGxlci4KKyAgIFdoZW4gYGdudV9nZXRvcHQnIGZpbmRzIGFuIG9wdGlvbiB0aGF0IHRha2VzIGFuIGFyZ3VtZW50LAorICAgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGhlcmUuCisgICBBbHNvLCB3aGVuIGBvcmRlcmluZycgaXMgUkVUVVJOX0lOX09SREVSLAorICAgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudCBpcyByZXR1cm5lZCBoZXJlLiAgKi8KKworZXh0ZXJuIGNoYXIgKmdudV9vcHRhcmc7CisKKy8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgorICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKKyAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdudV9nZXRvcHQnLgorCisgICBPbiBlbnRyeSB0byBgZ251X2dldG9wdCcsIHplcm8gbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbDsgaW5pdGlhbGl6ZS4KKworICAgV2hlbiBgZ251X2dldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQorICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgorCisgICBPdGhlcndpc2UsIGBnbnVfb3B0aW5kJyBjb21tdW5pY2F0ZXMgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dAorICAgaG93IG11Y2ggb2YgQVJHViBoYXMgYmVlbiBzY2FubmVkIHNvIGZhci4gICovCisKK2V4dGVybiBpbnQgZ251X29wdGluZDsKKworLyogQ2FsbGVycyBzdG9yZSB6ZXJvIGhlcmUgdG8gaW5oaWJpdCB0aGUgZXJyb3IgbWVzc2FnZSBgZ251X2dldG9wdCcgcHJpbnRzCisgICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLworCitleHRlcm4gaW50IGdudV9vcHRlcnI7CisKKy8qIFNldCB0byBhbiBvcHRpb24gY2hhcmFjdGVyIHdoaWNoIHdhcyB1bnJlY29nbml6ZWQuICAqLworCitleHRlcm4gaW50IGdudV9vcHRvcHQ7CisKKy8qIERlc2NyaWJlIHRoZSBsb25nLW5hbWVkIG9wdGlvbnMgcmVxdWVzdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFRoZSBMT05HX09QVElPTlMgYXJndW1lbnQgdG8gZ251X2dldG9wdF9sb25nIG9yIGdldG9wdF9sb25nX29ubHkgaXMgYSB2ZWN0b3IKKyAgIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMKKyAgIHplcm8uCisKKyAgIFRoZSBmaWVsZCBgaGFzX2FyZycgaXM6CisgICBub19hcmd1bWVudAkJKG9yIDApIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudCwKKyAgIHJlcXVpcmVkX2FyZ3VtZW50CShvciAxKSBpZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LAorICAgb3B0aW9uYWxfYXJndW1lbnQgCShvciAyKSBpZiB0aGUgb3B0aW9uIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgorCisgICBJZiB0aGUgZmllbGQgYGZsYWcnIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gYSB2YXJpYWJsZSB0aGF0IGlzIHNldAorICAgdG8gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBmaWVsZCBgdmFsJyB3aGVuIHRoZSBvcHRpb24gaXMgZm91bmQsIGJ1dAorICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlIG9wdGlvbiBpcyBub3QgZm91bmQuCisKKyAgIFRvIGhhdmUgYSBsb25nLW5hbWVkIG9wdGlvbiBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXQgYW4gYGludCcgdG8KKyAgIGEgY29tcGlsZWQtaW4gY29uc3RhbnQsIHN1Y2ggYXMgc2V0IGEgdmFsdWUgZnJvbSBgZ251X29wdGFyZycsIHNldCB0aGUKKyAgIG9wdGlvbidzIGBmbGFnJyBmaWVsZCB0byB6ZXJvIGFuZCBpdHMgYHZhbCcgZmllbGQgdG8gYSBub256ZXJvCisgICB2YWx1ZSAodGhlIGVxdWl2YWxlbnQgc2luZ2xlLWxldHRlciBvcHRpb24gY2hhcmFjdGVyLCBpZiB0aGVyZSBpcworICAgb25lKS4gIEZvciBsb25nIG9wdGlvbnMgdGhhdCBoYXZlIGEgemVybyBgZmxhZycgZmllbGQsIGBnbnVfZ2V0b3B0JworICAgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGB2YWwnIGZpZWxkLiAgKi8KKworLyogaGFzX2FyZyBjYW4ndCBiZSBhbiBlbnVtIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQKKyAgIHR5cGUgbWlzbWF0Y2hlcyBpbiBhbGwgdGhlIGNvZGUgdGhhdCBhc3N1bWVzIGl0IGlzIGFuIGludC4gICovCisKK3N0cnVjdCBvcHRpb24geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IGhhc19hcmc7CisgICAgaW50ICpmbGFnOworICAgIGludCB2YWw7Cit9OworCisvKiBOYW1lcyBmb3IgdGhlIHZhbHVlcyBvZiB0aGUgYGhhc19hcmcnIGZpZWxkIG9mIGBzdHJ1Y3Qgb3B0aW9uJy4gICovCisKKyNkZWZpbmUJbm9fYXJndW1lbnQJCSAgICAwCisjZGVmaW5lIHJlcXVpcmVkX2FyZ3VtZW50CTEKKyNkZWZpbmUgb3B0aW9uYWxfYXJndW1lbnQJMgorCitpbnQgZ251X2dldG9wdCggaW50IGFyZ2MsCisgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2hvcnRvcHRzICk7CisKK2ludCBnbnVfZ2V0b3B0X2xvbmcoIGludCBhcmdjLAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywKKyAgICAgICAgICAgICAgICAgICAgIGludCAqbG9uZ2luZCApOworCitpbnQgZ251X2dldG9wdF9sb25nX29ubHkoIGludCBhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2hvcnRvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsb25naW5kICk7CisKKy8qIEludGVybmFsIG9ubHkuICBVc2VycyBzaG91bGQgbm90IGNhbGwgdGhpcyBkaXJlY3RseS4gICovCitpbnQgX2dudV9nZXRvcHRfaW50ZXJuYWwoIGludCBhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2hvcnRvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsb25naW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9uZ19vbmx5ICk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworICAgICNlbmRpZgorCisjZW5kaWYgLyogX0dFVE9QVF9IICovCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL2hlYWRlcnMuaCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvaGVhZGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjdiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL2hlYWRlcnMuaApAQCAtMCwwICsxLDIwMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIGhlYWRlcnMuaAorICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFsbCBzeXN0ZW0gaGVhZGVycyByZXF1aXJlZCBieSBpcGVyZi4KKyAqIFRoaXMgY291bGQgYmUgcHJvY2Vzc2VkIHRvIGZvcm0gYSBzaW5nbGUgcHJlY29tcGlsZWQgaGVhZGVyLAorICogdG8gYXZvaWQgb3ZlcmhlYWQgb2YgY29tcGlsaW5nIGl0IG11bHRpcGxlIHRpbWVzLgorICogVGhpcyBhbHNvIHZlcmlmaWVzIGEgZmV3IHRoaW5ncyBhcmUgZGVmaW5lZCwgZm9yIHBvcnRhYmlsaXR5LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIEhFQURFUlNfSAorI2RlZmluZSBIRUFERVJTX0gKKworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorICAgICNpbmNsdWRlICJjb25maWcuaCIKKworLyogT1NGMSAoYXQgbGVhc3QgdGhlIHN5c3RlbSBJIHVzZSkgbmVlZHMgZXh0ZXJuIEMKKyAqIGFyb3VuZCB0aGUgPG5ldGRiLmg+IGFuZCA8YXJwYS9pbmV0Lmg+IGZpbGVzLiAqLworICAgICNpZiBkZWZpbmVkKCBTUEVDSUFMX09TRjFfRVhURVJOICkgJiYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQorICAgICAgICAjZGVmaW5lIFNQRUNJQUxfT1NGMV9FWFRFUk5fQ19TVEFSVCBleHRlcm4gIkMiIHsKKyAgICAgICAgI2RlZmluZSBTUEVDSUFMX09TRjFfRVhURVJOX0NfU1RPUCAgfQorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgU1BFQ0lBTF9PU0YxX0VYVEVSTl9DX1NUQVJUCisgICAgICAgICNkZWZpbmUgU1BFQ0lBTF9PU0YxX0VYVEVSTl9DX1NUT1AKKyAgICAjZW5kaWYKKyNlbmRpZiAvKiBIQVZFX0NPTkZJR19IICovCisKKy8qIHR1cm4gb2ZmIGFzc2VydCBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgTkRFQlVHCisKKy8qIHN0YW5kYXJkIEMgaGVhZGVycyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpZmRlZiBXSU4zMgorCisvKiBXaW5kb3dzIGNvbmZpZyBmaWxlICovCisgICAgI2luY2x1ZGUgImNvbmZpZy53aW4zMi5oIgorCisvKiBXaW5kb3dzIGhlYWRlcnMgKi8KKyAgICAjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA0MDAgLyogdXNlIChhdCBsZWFzdCkgV2luTlQgNC4wIEFQSSAqLworICAgICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAvKiBleGNsdWRlIHVubmVjZXNhcnkgaGVhZGVycyAqLworICAgICNpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgI2luY2x1ZGUgPHdpbnNvY2syLmg+CisgICAgI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisKKy8qIGRlZmluZSBFSU5UUiwganVzdCB0byBoZWxwIGNvbXBpbGU7IGl0IGlzbid0IHVzZWZ1bCAqLworICAgICNpZm5kZWYgRUlOVFIKKyAgICAgICAgI2RlZmluZSBFSU5UUiAgV1NBRUlOVFIKKyAgICAjZW5kaWYgLy8gRUlOVFIKKworLyogVmlzdWFsIEMrKyBoYXMgSU5UNjQsIGJ1dCBub3QgJ2xvbmcgbG9uZycuCisgKiBNZXRyb3dlcmtzIGhhcyAnbG9uZyBsb25nJywgYnV0IElOVDY0IGRvZXNuJ3Qgd29yay4gKi8KKyAgICAjaWZkZWYgX19NV0VSS1NfXworICAgICAgICAjZGVmaW5lIGludDY0X3QgIGxvbmcgbG9uZyAKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIGludDY0X3QgIElOVDY0CisgICAgI2VuZGlmIC8vIF9fTVdFUktTX18KKworLyogVmlzdWFsIEMrKyBoYXMgX3NucHJpbnRmIGluc3RlYWQgb2Ygc25wcmludGYgKi8KKyAgICAjaWZuZGVmIF9fTVdFUktTX18KKyAgICAgICAgI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyAgICAjZW5kaWYgLy8gX19NV0VSS1NfXworCisvKiBjbG9zZSwgcmVhZCwgYW5kIHdyaXRlIG9ubHkgd29yayBvbiBmaWxlcyBpbiBXaW5kb3dzLgorICogSSBnZXQgYXdheSB3aXRoICNkZWZpbmluZyB0aGVtIGJlY2F1c2UgSSBkb24ndCByZWFkIGZpbGVzLiAqLworICAgICNkZWZpbmUgY2xvc2UoIHMgKSAgICAgICBjbG9zZXNvY2tldCggcyApCisgICAgI2RlZmluZSByZWFkKCBzLCBiLCBsICkgIHJlY3YoIHMsIChjaGFyKikgYiwgbCwgMCApCisgICAgI2RlZmluZSB3cml0ZSggcywgYiwgbCApIHNlbmQoIHMsIChjaGFyKikgYiwgbCwgMCApCisKKyNlbHNlIC8qIG5vdCBkZWZpbmVkIFdJTjMyICovCisKKy8qIHJlcXVpcmVkIG9uIEFJWCBmb3IgRkRfU0VUIChyZXF1aXJlcyBiemVybykuCisgKiBvZnRlbiB0aGlzIGlzIHRoZSBzYW1lIGFzIDxzdHJpbmcuaD4gKi8KKyAgICAjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyAgICAgICAgI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyAgICAjZW5kaWYgLy8gSEFWRV9TVFJJTkdTX0gKKworLyogdW5peCBoZWFkZXJzICovCisgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisgICAgI2luY2x1ZGUgPHNpZ25hbC5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyoqIEFkZGVkIGZvciBkYWVtb25pemluZyB0aGUgcHJvY2VzcyAqLworICAgICNpbmNsdWRlIDxzeXNsb2cuaD4KKworU1BFQ0lBTF9PU0YxX0VYVEVSTl9DX1NUQVJUCisgICAgI2luY2x1ZGUgPG5ldGRiLmg+CitTUEVDSUFMX09TRjFfRVhURVJOX0NfU1RPUAorICAgICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisgICAgI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisKK1NQRUNJQUxfT1NGMV9FWFRFUk5fQ19TVEFSVAorICAgICNpbmNsdWRlIDxhcnBhL2luZXQuaD4gICAvKiBuZXRpbmV0L2luLmggbXVzdCBiZSBiZWZvcmUgdGhpcyBvbiBTdW5PUyAqLworU1BFQ0lBTF9PU0YxX0VYVEVSTl9DX1NUT1AKKworICAgICNpZmRlZiBIQVZFX1BPU0lYX1RIUkVBRAorICAgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICNlbmRpZiAvLyBIQVZFX1BPU0lYX1RIUkVBRAorCisvKiB1c2VkIGluIFdpbjMyIGZvciBlcnJvciBjaGVja2luZywKKyAqIHJhdGhlciB0aGFuIGNoZWNraW5nIHJjIDwgMCBhcyB1bml4IHVzdWFsbHkgZG9lcyAqLworICAgICNkZWZpbmUgU09DS0VUX0VSUk9SICAgLTEKKyAgICAjZGVmaW5lIElOVkFMSURfU09DS0VUIC0xCisKKyNlbmRpZiAvKiBub3QgZGVmaW5lZCBXSU4zMiAqLworCisjaWZuZGVmIElORVQ2X0FERFJTVFJMRU4KKyAgICAjZGVmaW5lIElORVQ2X0FERFJTVFJMRU4gNDAKKyNlbmRpZgorI2lmbmRlZiBJTkVUX0FERFJTVFJMRU4KKyAgICAjZGVmaW5lIElORVRfQUREUlNUUkxFTiAxNQorI2VuZGlmCisKKy8vI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgI2lmZGVmIEhBVkVfSVBWNgorICAgICAgICAjZGVmaW5lIFJFUE9SVF9BRERSTEVOIChJTkVUNl9BRERSU1RSTEVOICsgMSkKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgaXBlcmZfc29ja2FkZHI7CisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBSRVBPUlRfQUREUkxFTiAoSU5FVF9BRERSU1RSTEVOICsgMSkKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyX2luIGlwZXJmX3NvY2thZGRyOworICAgICNlbmRpZgorLy8jZW5kaWYKKworLy8gUmF0aW9uYWxpemUgc3RkaW50IGRlZmluaXRpb25zIGFuZCBzaXplb2YsIHRoYW5rcyB0byBhY19jcmVhdGVfc3RkaW50X2gubTQKKy8vIGZyb20gdGhlIGdudSBhcmNoaXZlCisKKyNpbmNsdWRlIDxpcGVyZi1pbnQuaD4KK3R5cGVkZWYgdWludDY0X3QgbWF4X3NpemVfdDsKKworLyogaW4gY2FzZSB0aGUgT1MgZG9lc24ndCBoYXZlIHRoZXNlLCB3ZSBwcm92aWRlIG91ciBvd24gaW1wbGVtZW50YXRpb25zICovCisjaW5jbHVkZSAiZ2V0dGltZW9mZGF5LmgiCisjaW5jbHVkZSAiaW5ldF9hdG9uLmgiCisjaW5jbHVkZSAic25wcmludGYuaCIKKworI2lmbmRlZiBTSFVUX1JECisgICAgI2RlZmluZSBTSFVUX1JEICAgMAorICAgICNkZWZpbmUgU0hVVF9XUiAgIDEKKyAgICAjZGVmaW5lIFNIVVRfUkRXUiAyCisjZW5kaWYgLy8gU0hVVF9SRAorCisjZW5kaWYgLyogSEVBREVSU19IICovCisKKworCisKKworCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL2luZXRfYXRvbi5oIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9pbmV0X2F0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzc1ZTZhCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9pbmV0X2F0b24uaApAQCAtMCwwICsxLDEwNSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIGluZXRfYXRvbi5oCisgKgorICogTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqICAgICAgS2V2aW4gR2liYnMgPGtnaWJic0BuY3NhLnVpdWMuZWR1PiBTZXB0LiAyMDAyCisgKiB0byB1c2UgdGhpcyBwcm90b3R5cGUsIG1ha2Ugc3VyZSBIQVZFX0lORVRfUFRPTiBpcyBub3QgZGVmaW5lZAorICogdG8gdXNlIHRoaXMgcHJvdG90eXBlLCBtYWtlIHN1cmUgSEFWRV9JTkVUX05UT1AgaXMgbm90IGRlZmluZWQKKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgSU5FVF9BVE9OX0gKKyNkZWZpbmUgSU5FVF9BVE9OX0gKKworCisjaW5jbHVkZSAiaGVhZGVycy5oIgorCisvKgorICogaW5ldF9wdG9uIGlzIHRoZSBuZXcsIGJldHRlciB2ZXJzaW9uIG9mIGluZXRfYXRvbi4KKyAqIGluZXRfYXRvbiBpcyBub3QgSVAgdmVyc2lvbiBhZ25vc3RpYy4KKyAqIGluZXRfYXRvbiBpcyB0aGUgbmV3LCBiZXR0ZXIgdmVyc2lvbiBvZiBpbmV0X2FkZHIuCisgKiBpbmV0X2FkZHIgaXMgaW5jb3JyZWN0IGluIHRoYXQgaXQgcmV0dXJucyAtMSBhcyBhbiBlcnJvciB2YWx1ZSwKKyAqIHdoaWxlIC0xICgweEZGRkZGRkZGKSBpcyBhIHZhbGlkIElQIGFkZHJlc3MgKDI1NS4yNTUuMjU1LjI1NSkuCisgKi8KKworI2lmbmRlZiBIQVZFX0lORVRfTlRPUAorCisgICAgI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgoraW50IGluZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSk7CitpbnQgaW5ldF9udG9wNChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CisjaWZkZWYgSEFWRV9JUFY2CitpbnQgaW5ldF9udG9wNihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyAgICAjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfSU5FVF9OVE9QICovCisjaWZuZGVmIEhBVkVfSU5FVF9QVE9OCisKKyAgICAjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitpbnQgaW5ldF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICpkc3QpOworaW50IGluZXRfcHRvbjQoY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QpOworI2lmZGVmIEhBVkVfSVBWNgoraW50IGluZXRfcHRvbjYoY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworICAgICNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9JTkVUX1BUT04gKi8KKyNlbmRpZiAvKiBJTkVUX0FUT05fSCAqLwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvaW5jbHVkZS9yZXBvcnRfQ1NWLmggYi9pcGVyZi0yLjAuNS9pbmNsdWRlL3JlcG9ydF9DU1YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDc4OGJiCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9yZXBvcnRfQ1NWLmgKQEAgLTAsMCArMSw2MiBAQAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogcmVwb3J0X0NTVi5oCisgKiBieSBLZXZpbiBHaWJicyA8a2dpYmJzQG5sYW5yLm5ldD4KKyAqCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCisKKworI2lmbmRlZiBSRVBPUlRfQ1NWX0gKKyNkZWZpbmUgUkVQT1JUX0NTVl9ICisKK3ZvaWQgQ1NWX3N0YXRzKCBUcmFuc2Zlcl9JbmZvICpzdGF0cyApOwordm9pZCAqQ1NWX3BlZXIoIENvbm5lY3Rpb25fSW5mbyAqc3RhdHMsIGludCBJRCk7Cit2b2lkIENTVl9zZXJ2ZXJzdGF0cyggQ29ubmVjdGlvbl9JbmZvICpjb25uLCBUcmFuc2Zlcl9JbmZvICpzdGF0cyApOworCisKKyNlbmRpZiAvLyBSRVBPUlRfQ1NWX0gKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvcmVwb3J0X2RlZmF1bHQuaCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvcmVwb3J0X2RlZmF1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIxNDYzCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS9yZXBvcnRfZGVmYXVsdC5oCkBAIC0wLDAgKzEsNjQgQEAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIHJlcG9ydF9kZWZhdWx0LmgKKyAqIGJ5IEtldmluIEdpYmJzIDxrZ2liYnNAbmxhbnIubmV0PgorICoKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KKworCisjaWZuZGVmIFJFUE9SVF9ERUZBVUxUX0gKKyNkZWZpbmUgUkVQT1JUX0RFRkFVTFRfSAorCit2b2lkIHJlcG9ydGVyX3ByaW50c3RhdHMoIFRyYW5zZmVyX0luZm8gKnN0YXRzICk7Cit2b2lkIHJlcG9ydGVyX211bHRpc3RhdHMoIFRyYW5zZmVyX0luZm8gKnN0YXRzICk7Cit2b2lkIHJlcG9ydGVyX3NlcnZlcnN0YXRzKCBDb25uZWN0aW9uX0luZm8gKmNvbm4sIFRyYW5zZmVyX0luZm8gKnN0YXRzICk7Cit2b2lkIHJlcG9ydGVyX3JlcG9ydHNldHRpbmdzKCBSZXBvcnRlckRhdGEgKnN0YXRzICk7Cit2b2lkICpyZXBvcnRlcl9yZXBvcnRwZWVyKCBDb25uZWN0aW9uX0luZm8gKnN0YXRzLCBpbnQgSUQpOworCisKKyNlbmRpZiAvLyBSRVBPUlRfREVGQVVMVF9ICmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL3NlcnZpY2UuaCBiL2lwZXJmLTIuMC41L2luY2x1ZGUvc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxM2I0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbmNsdWRlL3NlcnZpY2UuaApAQCAtMCwwICsxLDE1OSBAQAorLy8gVEhJUyBDT0RFIEFORCBJTkZPUk1BVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YKKy8vIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORC9PUiBGSVRORVNTIEZPUiBBCisvLyBQQVJUSUNVTEFSIFBVUlBPU0UuCisvLworLy8gQ29weXJpZ2h0IChDKSAxOTkzLTE5OTcgIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gIE1PRFVMRTogc2VydmljZS5oCisvLworLy8gIEFVVEhPUjogQ3JhaWcgTGluaworLy8KKy8vCisvLyAgQ29tbWVudHM6ICBUaGUgdXNlIG9mIHRoaXMgaGVhZGVyIGZpbGUgYW5kIHRoZSBhY2NvbXBhbnlpbmcgc2VydmljZS5jCisvLyAgZmlsZSBzaW1wbGlmaWVzIHRoZSBwcm9jZXNzIG9mIHdyaXR0aW5nIGEgc2VydmljZS4gIFlvdSBhcyBhIGRldmVsb3BlcgorLy8gIHNpbXBseSBuZWVkIHRvIGZvbGxvdyB0aGUgVE9ETydzIG91dGxpbmVkIGluIHRoaXMgaGVhZGVyIGZpbGUsIGFuZCAKKy8vICBpbXBsZW1lbnQgdGhlIFNlcnZpY2VTdGFydCgpIGFuZCBTZXJ2aWNlU3RvcCgpIGZ1bmN0aW9ucy4KKy8vICAKKy8vICBUaGVyZSBpcyBubyBuZWVkIHRvIG1vZGlmeSB0aGUgY29kZSBpbiBzZXJ2aWNlLmMuICBKdXN0IGFkZCBzZXJ2aWNlLmMKKy8vICB0byB5b3VyIHByb2plY3QgYW5kIGxpbmsgd2l0aCB0aGUgZm9sbG93aW5nIGxpYnJhcmllcy4uLgorLy8KKy8vICBsaWJjbXQubGliIGtlcm5lbDMyLmxpYiBhZHZhcGkubGliIHNoZWxsMzIubGliCisvLworLy8gIFRoaXMgY29kZSBhbHNvIHN1cHBvcnRzIHVuaWNvZGUuICBCZSBzdXJlIHRvIGNvbXBpbGUgYm90aCBzZXJ2aWNlLmMgYW5kCisvLyAgYW5kIGNvZGUgI2luY2x1ZGUgInNlcnZpY2UuaCIgd2l0aCB0aGUgc2FtZSBVbmljb2RlIHNldHRpbmcuCisvLworLy8gIFVwb24gY29tcGxldGlvbiwgeW91ciBjb2RlIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UKKy8vCisvLyAgPHNlcnZpY2UgZXhlPiAtPyAgICAgICAgICAgICAgICB0byBkaXNwbGF5IHRoaXMgbGlzdAorLy8gIDxzZXJ2aWNlIGV4ZT4gLWluc3RhbGwgICAgICAgICAgdG8gaW5zdGFsbCB0aGUgc2VydmljZQorLy8gIDxzZXJ2aWNlIGV4ZT4gLXJlbW92ZSAgICAgICAgICAgdG8gcmVtb3ZlIHRoZSBzZXJ2aWNlCisvLyAgPHNlcnZpY2UgZXhlPiAtZGVidWcgPHBhcmFtcz4gICB0byBydW4gYXMgYSBjb25zb2xlIGFwcCBmb3IgZGVidWdnaW5nCisvLworLy8gIE5vdGU6IFRoaXMgY29kZSBhbHNvIGltcGxlbWVudHMgQ3RybCtDIGFuZCBDdHJsK0JyZWFrIGhhbmRsZXJzCisvLyAgICAgICAgd2hlbiB1c2luZyB0aGUgZGVidWcgb3B0aW9uLiAgVGhlc2UgY29uc29sZSBldmVudHMgY2F1c2UKKy8vICAgICAgICB5b3VyIFNlcnZpY2VTdG9wIHJvdXRpbmUgdG8gYmUgY2FsbGVkCisvLworLy8gICAgICAgIEFsc28sIHRoaXMgY29kZSBvbmx5IGhhbmRsZXMgdGhlIE9XTl9TRVJWSUNFIHNlcnZpY2UgdHlwZQorLy8gICAgICAgIHJ1bm5pbmcgaW4gdGhlIExPQ0FMX1NZU1RFTSBzZWN1cml0eSBjb250ZXh0LgorLy8KKy8vICAgICAgICBUbyBjb250cm9sIHlvdXIgc2VydmljZSAoIHN0YXJ0LCBzdG9wLCBldGMgKSB5b3UgbWF5IHVzZSB0aGUKKy8vICAgICAgICBTZXJ2aWNlcyBjb250cm9sIHBhbmVsIGFwcGxldCBvciB0aGUgTkVULkVYRSBwcm9ncmFtLgorLy8KKy8vICAgICAgICBUbyBhaWQgaW4gd3JpdGluZy9kZWJ1Z2dpbmcgc2VydmljZSwgdGhlCisvLyAgICAgICAgU0RLIGNvbnRhaW5zIGEgdXRpbGl0eSAoTVNUT09MU1xCSU5cU0MuRVhFKSB0aGF0CisvLyAgICAgICAgY2FuIGJlIHVzZWQgdG8gY29udHJvbCwgY29uZmlndXJlLCBvciBvYnRhaW4gc2VydmljZSBzdGF0dXMuCisvLyAgICAgICAgU0MgZGlzcGxheXMgY29tcGxldGUgc3RhdHVzIGZvciBhbnkgc2VydmljZS9kcml2ZXIKKy8vICAgICAgICBpbiB0aGUgc2VydmljZSBkYXRhYmFzZSwgYW5kIGFsbG93cyBhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKy8vICAgICAgICBwYXJhbWV0ZXJzIHRvIGJlIGVhc2lseSBjaGFuZ2VkIGF0IHRoZSBjb21tYW5kIGxpbmUuCisvLyAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gU0MuRVhFLCB0eXBlIFNDIGF0IHRoZSBjb21tYW5kIGxpbmUuCisvLworCisvKgorICogbW9kaWZpZWQgTWFyLjA3LCAyMDAyIGJ5IEZlbmcgUWluIDxmcWluQG5jc2EudWl1Yy5lZHU+CisgKiAgICAgICAgICBNYXIuMTUsIDIwMDIKKyAqCisgKiByZW1vdmVkIHNvbWUgZnVuY3Rpb25zIHdlIGRvbid0IHVzZSBhdCBhbGwKKyAqIGFkZCBjb2RlIHRvIHN0YXJ0IHRoZSBzZXJ2aWNlIGltbWVkaWF0ZWx5IGFmdGVyIHNlcnZpY2UgaXMgaW5zdGFsbGVkCisgKiAKKyAqICRJZDogc2VydmljZS5oLHYgMS4xLjEuMSAyMDA0LzA1LzE4IDAxOjUwOjQ0IGtnaWJicyBFeHAgJAorICovCisKKyNpZm5kZWYgX1NFUlZJQ0VfSAorI2RlZmluZSBfU0VSVklDRV9ICisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLyB0b2RvOiBjaGFuZ2UgdG8gZGVzaXJlZCBzdHJpbmdzCisvLy8vCisvLyBuYW1lIG9mIHRoZSBleGVjdXRhYmxlCisjZGVmaW5lIFNaQVBQTkFNRSAgICAgICAgICAgICJJUGVyZiIKKworLy8gaW50ZXJuYWwgbmFtZSBvZiB0aGUgc2VydmljZQorI2RlZmluZSBTWlNFUlZJQ0VOQU1FICAgICAgICAiSVBlcmZTZXJ2aWNlIgorCisvLyBkaXNwbGF5ZWQgbmFtZSBvZiB0aGUgc2VydmljZQorI2RlZmluZSBTWlNFUlZJQ0VESVNQTEFZTkFNRSAiSVBlcmYgU2VydmljZSIKKworLy8gbGlzdCBvZiBzZXJ2aWNlIGRlcGVuZGVuY2llcyAtICJkZXAxXDBkZXAyXDBcMCIKKyNkZWZpbmUgU1pERVBFTkRFTkNJRVMgICAgICAgIiIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8gdG9kbzogU2VydmljZVN0YXJ0KCltdXN0IGJlIGRlZmluZWQgYnkgaW4geW91ciBjb2RlLgorLy8vLyAgICAgICBUaGUgc2VydmljZSBzaG91bGQgdXNlIFJlcG9ydFN0YXR1c1RvU0NNZ3IgdG8gaW5kaWNhdGUKKy8vLy8gICAgICAgcHJvZ3Jlc3MuICBUaGlzIHJvdXRpbmUgbXVzdCBhbHNvIGJlIHVzZWQgYnkgU3RhcnRTZXJ2aWNlKCkKKy8vLy8gICAgICAgdG8gcmVwb3J0IHRvIHRoZSBTQ00gd2hlbiB0aGUgc2VydmljZSBpcyBydW5uaW5nLgorLy8vLworLy8vLyAgICAgICBJZiBhIFNlcnZpY2VTdG9wIHByb2NlZHVyZSBpcyBnb2luZyB0byB0YWtlIGxvbmdlciB0aGFuCisvLy8vICAgICAgIDMgc2Vjb25kcyB0byBleGVjdXRlLCBpdCBzaG91bGQgc3Bhd24gYSB0aHJlYWQgdG8KKy8vLy8gICAgICAgZXhlY3V0ZSB0aGUgc3RvcCBjb2RlLCBhbmQgcmV0dXJuLiAgT3RoZXJ3aXNlLCB0aGUKKy8vLy8gICAgICAgU2VydmljZUNvbnRyb2xNYW5hZ2VyIHdpbGwgYmVsaWV2ZSB0aGF0IHRoZSBzZXJ2aWNlIGhhcworLy8vLyAgICAgICBzdG9wcGVkIHJlc3BvbmRpbmcKKy8vLy8KK1ZPSUQgU2VydmljZVN0YXJ0KERXT1JEIGR3QXJnYywgTFBUU1RSICpscHN6QXJndik7CitWT0lEIFNlcnZpY2VTdG9wKCk7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVk9JRCBXSU5BUEkgc2VydmljZV9jdHJsKERXT1JEIGR3Q3RybENvZGUpOworVk9JRCBXSU5BUEkgc2VydmljZV9tYWluKERXT1JEIGR3QXJnYywgTFBUU1RSICpscHN6QXJndik7CitWT0lEIENtZEluc3RhbGxTZXJ2aWNlKGludCBhcmdjLCBjaGFyICoqYXJndik7CitCT09MIENtZFJlbW92ZVNlcnZpY2UoKTsKK0JPT0wgQ21kU3RhcnRTZXJ2aWNlKGludCBhcmdjLCBjaGFyICoqYXJndik7CitMUFRTVFIgR2V0TGFzdEVycm9yVGV4dCggTFBUU1RSIGxwc3pCdWYsIERXT1JEIGR3U2l6ZSApOworVk9JRCBTZXJ2aWNlU3RhcnQgKERXT1JEIGR3QXJnYywgTFBUU1RSICpscHN6QXJndik7CitWT0lEIFNlcnZpY2VTdG9wKCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLyBUaGUgZm9sbG93aW5nIGFyZSBwcm9jZWR1cmVzIHdoaWNoCisvLy8vIG1heSBiZSB1c2VmdWwgdG8gY2FsbCB3aXRoaW4gdGhlIGFib3ZlIHByb2NlZHVyZXMsCisvLy8vIGJ1dCByZXF1aXJlIG5vIGltcGxlbWVudGF0aW9uIGJ5IHRoZSB1c2VyLgorLy8vLyBUaGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBzZXJ2aWNlLmMKKworLy8KKy8vICBGVU5DVElPTjogUmVwb3J0U3RhdHVzVG9TQ01ncigpCisvLworLy8gIFBVUlBPU0U6IFNldHMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBzZXJ2aWNlIGFuZAorLy8gICAgICAgICAgIHJlcG9ydHMgaXQgdG8gdGhlIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyCisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBkd0N1cnJlbnRTdGF0ZSAtIHRoZSBzdGF0ZSBvZiB0aGUgc2VydmljZQorLy8gICAgZHdXaW4zMkV4aXRDb2RlIC0gZXJyb3IgY29kZSB0byByZXBvcnQKKy8vICAgIGR3V2FpdEhpbnQgLSB3b3JzdCBjYXNlIGVzdGltYXRlIHRvIG5leHQgY2hlY2twb2ludAorLy8KKy8vICBSRVRVUk4gVkFMVUU6CisvLyAgICBUUlVFICAtIHN1Y2Nlc3MgCisvLyAgICBGQUxTRSAtIGZhaWx1cmUKKy8vCitCT09MIFJlcG9ydFN0YXR1c1RvU0NNZ3IoRFdPUkQgZHdDdXJyZW50U3RhdGUsIERXT1JEIGR3V2luMzJFeGl0Q29kZSwgRFdPUkQgZHdXYWl0SGludCk7CisKKworLy8KKy8vICBGVU5DVElPTjogQWRkVG9NZXNzYWdlTG9nKExQVFNUUiBscHN6TXNnKQorLy8KKy8vICBQVVJQT1NFOiBBbGxvd3MgYW55IHRocmVhZCB0byBsb2cgYW4gZXJyb3IgbWVzc2FnZQorLy8KKy8vICBQQVJBTUVURVJTOgorLy8gICAgbHBzek1zZyAtIHRleHQgZm9yIG1lc3NhZ2UKKy8vCisvLyAgUkVUVVJOIFZBTFVFOgorLy8gICAgbm9uZQorLy8KK3ZvaWQgQWRkVG9NZXNzYWdlTG9nKExQVFNUUiBscHN6TXNnKTsKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9pbmNsdWRlL3NucHJpbnRmLmggYi9pcGVyZi0yLjAuNS9pbmNsdWRlL3NucHJpbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlODcwZgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvc25wcmludGYuaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIFNOUFJJTlRGX0gKKyNkZWZpbmUgU05QUklOVEZfSAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBzbnByaW50Zi5oCisgKgorICogVGhpcyBpcyBmcm9tCisgKiBXLiBSaWNoYXJkIFN0ZXZlbnMsICdVTklYIE5ldHdvcmsgUHJvZ3JhbW1pbmcnLCBWb2wgMSwgMm5kIEVkaXRpb24sCisgKiAgIFByZW50aWNlIEhhbGwsIDE5OTguCisgKgorICogTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIEp1bHkgMTk5OAorICoKKyAqIHRvIHVzZSB0aGlzIHByb3RvdHlwZSwgbWFrZSBzdXJlIEhBVkVfU05QUklOVEYgaXMgbm90IGRlZmluZWQKKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBUaHJvdWdob3V0IHRoZSBib29rIEkgdXNlIHNucHJpbnRmKCkgYmVjYXVzZSBpdCdzIHNhZmVyIHRoYW4gc3ByaW50ZigpLgorICogQnV0IGFzIG9mIHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgbm90IGFsbCBzeXN0ZW1zIHByb3ZpZGUgdGhpcworICogZnVuY3Rpb24uICBUaGUgZnVuY3Rpb24gYmVsb3cgc2hvdWxkIG9ubHkgYmUgYnVpbHQgb24gdGhvc2Ugc3lzdGVtcworICogdGhhdCBkbyBub3QgcHJvdmlkZSBhIHJlYWwgc25wcmludGYoKS4KKyAqIFRoZSBmdW5jdGlvbiBiZWxvdyBqdXN0IGFjdHMgbGlrZSBzcHJpbnRmKCk7IGl0IGlzIG5vdCBzYWZlLCBidXQgaXQKKyAqIHRyaWVzIHRvIGRldGVjdCBvdmVyZmxvdy4KKyAqLworCisjaWZuZGVmIEhBVkVfU05QUklOVEYKKworICAgICNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50IHNucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisgICAgI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX1NOUFJJTlRGICovCisjZW5kaWYgLyogU05QUklOVEZfSCAqLwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvaW5jbHVkZS91dGlsLmggYi9pcGVyZi0yLjAuNS9pbmNsdWRlL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWIwYTNmCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS91dGlsLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiB1dGlsLmgKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB2YXJpb3VzIEMgdXRpbGl0eSBmdW5jdGlvbnMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgVVRJTF9ICisjZGVmaW5lIFVUSUxfSAorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorICAgICNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldC9nZXRzb2Nrb3B0IHdyYXBwZXJzIGZvciBTT19SQ1ZCVUYgYW5kIFNPX1NOREJVRjsgVENQX01BWFNFRworICogc29ja2V0LmMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCBzZXRzb2NrX3RjcF93aW5kb3dzaXplKCBpbnQgaW5Tb2NrLCBpbnQgaW5UQ1BXaW4sIGludCBpblNlbmQgKTsKK2ludCBnZXRzb2NrX3RjcF93aW5kb3dzaXplKCBpbnQgaW5Tb2NrLCBpbnQgaW5TZW5kICk7CisKK3ZvaWQgc2V0c29ja190Y3BfbXNzKCBpbnQgaW5Tb2NrLCBpbnQgaW5UQ1BXaW4gKTsKK2ludCAgZ2V0c29ja190Y3BfbXNzKCBpbnQgaW5Tb2NrICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNpZ25hbCBoYW5kbGVycworICogc2lnbmFsLmMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3R5cGVkZWYgdm9pZCBTaWdmdW5jKGludCk7Cit2b2lkIHNpZ19leGl0KCBpbnQgaW5TaWdubyApOworCit0eXBlZGVmIFNpZ2Z1bmMgKlNpZ2Z1bmNQdHI7CisKK1NpZ2Z1bmNQdHIgbXlfc2lnbmFsKCBpbnQgaW5TaWdubywgU2lnZnVuY1B0ciBpbkZ1bmMgKTsKKworI2lmZGVmIFdJTjMyCisKKy8qIHVuZGVyIHdpbmRvd3MsIGVtdWxhdGUgdW5peCBzaWduYWxzICovCitlbnVtIHsKKyAgICBTSUdJTlQsCisgICAgU0lHVEVSTSwKKyAgICBTSUdQSVBFLAorICAgIF9OU0lHCit9OworCitCT09MIFdJTkFQSSBzaWdfZGlzcGF0Y2hlciggRFdPUkQgdHlwZSApOworCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZXJyb3IgaGFuZGxlcnMKKyAqIGVycm9yLmMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgd2FybiAgICAgICggY29uc3QgY2hhciAqaW5NZXNzYWdlLCBjb25zdCBjaGFyICppbkZpbGUsIGludCBpbkxpbmUgKTsKK3ZvaWQgd2Fybl9lcnJubyggY29uc3QgY2hhciAqaW5NZXNzYWdlLCBjb25zdCBjaGFyICppbkZpbGUsIGludCBpbkxpbmUgKTsKKworI2lmIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkgfHwgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQpCisjZGVmaW5lIEZBSUwoIGNvbmQsIG1zZywgc2V0dGluZ3MgKSAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBjb25kICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB3YXJuKCBtc2csIF9fRklMRV9fLCBfX0xJTkVfXyApOyAgICAgICAgICBcCisgICAgICB0aHJlYWRfc3RvcChzZXR0aW5ncyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoIDAgKQorI2Vsc2UKKyNkZWZpbmUgRkFJTCggY29uZCwgbXNnLCBzZXR0aW5ncyApICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGNvbmQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHdhcm4oIG1zZywgX19GSUxFX18sIF9fTElORV9fICk7ICAgICAgICAgIFwKKyAgICAgIGV4aXQoIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSggMCApCisjZW5kaWYKKworI2RlZmluZSBXQVJOKCBjb25kLCBtc2cgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggY29uZCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgd2FybiggbXNnLCBfX0ZJTEVfXywgX19MSU5FX18gKTsgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKCAwICkKKworI2lmIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkgfHwgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQpCisjZGVmaW5lIEZBSUxfZXJybm8oIGNvbmQsIG1zZywgc2V0dGluZ3MgKSAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBjb25kICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB3YXJuX2Vycm5vKCBtc2csIF9fRklMRV9fLCBfX0xJTkVfXyApOyAgICBcCisgICAgICB0aHJlYWRfc3RvcChzZXR0aW5ncyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUoIDAgKQorI2Vsc2UKKyNkZWZpbmUgRkFJTF9lcnJubyggY29uZCwgbXNnLCBzZXR0aW5ncyApICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGNvbmQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHdhcm5fZXJybm8oIG1zZywgX19GSUxFX18sIF9fTElORV9fICk7ICAgIFwKKyAgICAgIGV4aXQoIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSggMCApCisjZW5kaWYKKworI2RlZmluZSBXQVJOX2Vycm5vKCBjb25kLCBtc2cgKSAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggY29uZCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgd2Fybl9lcnJubyggbXNnLCBfX0ZJTEVfXywgX19MSU5FX18gKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKCAwICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaW5pdGlhbGl6ZSBidWZmZXIgdG8gYSBwYXR0ZXJuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIHBhdHRlcm4oIGNoYXIgKm91dEJ1ZiwgaW50IGluQnl0ZXMgKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaW5wdXQgYW5kIG91dHB1dCBudW1iZXJzLCBjb252ZXJ0aW5nIHdpdGgga2lsbywgbWVnYSwgZ2lnYQorICogc3RkaW8uYworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZG91YmxlIGJ5dGVfYXRvZiggY29uc3QgY2hhciAqaW5TdHJpbmcgKTsKK21heF9zaXplX3QgYnl0ZV9hdG9pKCBjb25zdCBjaGFyICAqaW5TdHJpbmcgKTsKK3ZvaWQgYnl0ZV9zbnByaW50ZiggY2hhciogb3V0U3RyaW5nLCBpbnQgaW5MZW4sIGRvdWJsZSBpbk51bSwgY2hhciBpbkZvcm1hdCApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZWRpcmVjdCB0aGUgc3Rkb3V0IHRvIGEgc3BlY2lmaWVkIGZpbGUKKyAqIHN0ZGlvLmMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgcmVkaXJlY3QoY29uc3QgY2hhciAqaW5PdXRwdXRGaWxlTmFtZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRlbGV0ZSBtYWNybworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBERUxFVEVfUFRSKCBwdHIgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggcHRyICE9IE5VTEwgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGVsZXRlIHB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHRyID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKCBmYWxzZSApCisKKyNkZWZpbmUgREVMRVRFX0FSUkFZKCBwdHIgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRlbGV0ZSBbXSBwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHB0ciA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSggZmFsc2UgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogVVRJTF9IICovCisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luY2x1ZGUvdmVyc2lvbi5oIGIvaXBlcmYtMi4wLjUvaW5jbHVkZS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyZDJlYQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBJUEVSRl9WRVJTSU9OICIyLjAuNSIKKyNkZWZpbmUgSVBFUkZfVkVSU0lPTl9EQVRFICIwOCBKdWwgMjAxMCIKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L2luc3RhbGwtc2ggYi9pcGVyZi0yLjAuNS9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhODM1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMzIzIEBACisjIS9iaW4vc2gKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisKK3NjcmlwdHZlcnNpb249MjAwNS0wMi0wMi4yMQorCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0KK2NoZ3JwY21kPQorc3RyaXBjbWQ9CitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPQorZHN0PQorZGlyX2FyZz0KK2RzdGFyZz0KK25vX3RhcmdldF9kaXJlY3Rvcnk9CisKK3VzYWdlPSJVc2FnZTogJDAgW09QVElPTl0uLi4gWy1UXSBTUkNGSUxFIERTVEZJTEUKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiBTUkNGSUxFUy4uLiBESVJFQ1RPUlkKKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtdCBESVJFQ1RPUlkgU1JDRklMRVMuLi4KKyAgIG9yOiAkMCBbT1BUSU9OXS4uLiAtZCBESVJFQ1RPUklFUy4uLgorCitJbiB0aGUgMXN0IGZvcm0sIGNvcHkgU1JDRklMRSB0byBEU1RGSUxFLgorSW4gdGhlIDJuZCBhbmQgM3JkLCBjb3B5IGFsbCBTUkNGSUxFUyB0byBESVJFQ1RPUlkuCitJbiB0aGUgNHRoLCBjcmVhdGUgRElSRUNUT1JJRVMuCisKK09wdGlvbnM6CistYyAgICAgICAgIChpZ25vcmVkKQorLWQgICAgICAgICBjcmVhdGUgZGlyZWN0b3JpZXMgaW5zdGVhZCBvZiBpbnN0YWxsaW5nIGZpbGVzLgorLWcgR1JPVVAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKy1tIE1PREUgICAgJGNobW9kcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gTU9ERS4KKy1vIFVTRVIgICAgJGNob3ducHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gVVNFUi4KKy1zICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCistdCBESVJFQ1RPUlkgIGluc3RhbGwgaW50byBESVJFQ1RPUlkuCistVCAgICAgICAgIHJlcG9ydCBhbiBlcnJvciBpZiBEU1RGSUxFIGlzIGEgZGlyZWN0b3J5LgorLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKy0tdmVyc2lvbiAgZGlzcGxheSB2ZXJzaW9uIGluZm8gYW5kIGV4aXQuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlcyBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb21tYW5kczoKKyAgQ0hHUlBQUk9HIENITU9EUFJPRyBDSE9XTlBST0cgQ1BQUk9HIE1LRElSUFJPRyBNVlBST0cgUk1QUk9HIFNUUklQUFJPRworIgorCit3aGlsZSB0ZXN0IC1uICIkMSI7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtYykgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZQorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisgICAgICAgIHNoaWZ0CisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC0taGVscCkgZWNobyAiJHVzYWdlIjsgZXhpdCAkPzs7CisKKyAgICAtbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCisgICAgICAgIHNoaWZ0CisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLXMpIHN0cmlwY21kPSRzdHJpcHByb2cKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLXQpIGRzdGFyZz0kMgorCXNoaWZ0CisJc2hpZnQKKwljb250aW51ZTs7CisKKyAgICAtVCkgbm9fdGFyZ2V0X2RpcmVjdG9yeT10cnVlCisJc2hpZnQKKwljb250aW51ZTs7CisKKyAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAkPzs7CisKKyAgICAqKSAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisJIyBXaGVuIC10IGlzIHVzZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZC4KKwl0ZXN0IC1uICIkZGlyX2FyZyRkc3RhcmciICYmIGJyZWFrCisgICAgICAgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KKwlmb3IgYXJnCisJZG8KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkZHN0YXJnIjsgdGhlbgorCSAgICAjICRAIGlzIG5vdCBlbXB0eTogaXQgY29udGFpbnMgYXQgbGVhc3QgJGFyZy4KKwkgICAgc2V0IGZub3JkICIkQCIgIiRkc3RhcmciCisJICAgIHNoaWZ0ICMgZm5vcmQKKwkgIGZpCisJICBzaGlmdCAjIGFyZworCSAgZHN0YXJnPSRhcmcKKwlkb25lCisJYnJlYWs7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLXogIiQxIjsgdGhlbgorICBpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgICBlY2hvICIkMDogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuIiA+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgIyBJdCdzIE9LIHRvIGNhbGwgYGluc3RhbGwtc2ggLWQnIHdpdGhvdXQgYXJndW1lbnQuCisgICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gY3JlYXRpbmcgY29uZGl0aW9uYWwgZGlyZWN0b3JpZXMuCisgIGV4aXQgMAorZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICBjYXNlICRzcmMgaW4KKyAgICAtKikgc3JjPS4vJHNyYyA7OworICBlc2FjCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgZHN0PSRzcmMKKyAgICBzcmM9CisKKyAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgorICAgICAgbWtkaXJjbWQ9OgorICAgICAgY2htb2RjbWQ9CisgICAgZWxzZQorICAgICAgbWtkaXJjbWQ9JG1rZGlycHJvZworICAgIGZpCisgIGVsc2UKKyAgICAjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZAorICAgICMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQKKyAgICAjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKyAgICBpZiB0ZXN0ICEgLWYgIiRzcmMiICYmIHRlc3QgISAtZCAiJHNyYyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiAkc3JjIGRvZXMgbm90IGV4aXN0LiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGRzdGFyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBkc3Q9JGRzdGFyZworICAgICMgUHJvdGVjdCBuYW1lcyBzdGFydGluZyB3aXRoIGAtJy4KKyAgICBjYXNlICRkc3QgaW4KKyAgICAgIC0qKSBkc3Q9Li8kZHN0IDs7CisgICAgZXNhYworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0YXJnOiBJcyBhIGRpcmVjdG9yeSIgPiYyCisJZXhpdCAxCisgICAgICBmaQorICAgICAgZHN0PSRkc3QvYGJhc2VuYW1lICIkc3JjImAKKyAgICBmaQorICBmaQorCisgICMgVGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kLgorICBkc3RkaXI9YGVjaG8gIiRkc3QiIHwgc2VkIC1lICdzLC8qJCwsO3MsW14vXSokLCw7cywvKiQsLDtzLF4kLC4sJ2AKKworICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgorCisgICMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCisgIGlmIHRlc3QgISAtZCAiJGRzdGRpciI7IHRoZW4KKyAgICBkZWZhdWx0SUZTPScKKwkgJworICAgIElGUz0iJHtJRlMtJGRlZmF1bHRJRlN9IgorCisgICAgb0lGUz0kSUZTCisgICAgIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KKyAgICBJRlM9JyUnCisgICAgc2V0IHggYGVjaG8gIiRkc3RkaXIiIHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCisgICAgc2hpZnQKKyAgICBJRlM9JG9JRlMKKworICAgIHBhdGhjb21wPQorCisgICAgd2hpbGUgdGVzdCAkIyAtbmUgMCA7IGRvCisgICAgICBwYXRoY29tcD0kcGF0aGNvbXAkMQorICAgICAgc2hpZnQKKyAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAgICAgICAkbWtkaXJwcm9nICIkcGF0aGNvbXAiCisJIyBta2RpciBjYW4gZmFpbCB3aXRoIGEgYEZpbGUgZXhpc3QnIGVycm9yIGluIGNhc2Ugc2V2ZXJhbAorCSMgaW5zdGFsbC1zaCBhcmUgY3JlYXRpbmcgdGhlIGRpcmVjdG9yeSBjb25jdXJyZW50bHkuICBUaGlzCisJIyBpcyBPSy4KKwl0ZXN0IC1kICIkcGF0aGNvbXAiIHx8IGV4aXQKKyAgICAgIGZpCisgICAgICBwYXRoY29tcD0kcGF0aGNvbXAvCisgICAgZG9uZQorICBmaQorCisgIGlmIHRlc3QgLW4gIiRkaXJfYXJnIjsgdGhlbgorICAgICRkb2l0ICRta2RpcmNtZCAiJGRzdCIgXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAiJGRzdCI7IH0KKworICBlbHNlCisgICAgZHN0ZmlsZT1gYmFzZW5hbWUgIiRkc3QiYAorCisgICAgIyBNYWtlIGEgY291cGxlIG9mIHRlbXAgZmlsZSBuYW1lcyBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKyAgICBkc3R0bXA9JGRzdGRpci9faW5zdC4kJF8KKyAgICBybXRtcD0kZHN0ZGlyL19ybS4kJF8KKworICAgICMgVHJhcCB0byBjbGVhbiB1cCB0aG9zZSB0ZW1wIGZpbGVzIGF0IGV4aXQuCisgICAgdHJhcCAncmV0PSQ/OyBybSAtZiAiJGRzdHRtcCIgIiRybXRtcCIgJiYgZXhpdCAkcmV0JyAwCisgICAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKKworICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCisgICAgJGRvaXQgJGNwcHJvZyAiJHNyYyIgIiRkc3R0bXAiICYmCisKKyAgICAjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMuCisgICAgIworICAgICMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyAgICAjIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKKyAgICAjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGNwcHJvZyAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCisgICAgIworICAgIHsgdGVzdCAteiAiJGNob3duY21kIiB8fCAkZG9pdCAkY2hvd25jbWQgIiRkc3R0bXAiOyB9IFwKKyAgICAgICYmIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3R0bXAiOyB9IFwKKyAgICAgICYmIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9IFwKKyAgICAgICYmIHsgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgIiRkc3R0bXAiOyB9ICYmCisKKyAgICAjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisgICAgeyAkZG9pdCAkbXZjbWQgLWYgIiRkc3R0bXAiICIkZHN0ZGlyLyRkc3RmaWxlIiAyPi9kZXYvbnVsbCBcCisgICAgICB8fCB7CisJICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQorCSAgICMgdG8gaXRzZWxmLCBvciBwZXJoYXBzIGJlY2F1c2UgbXYgaXMgc28gYW5jaWVudCB0aGF0IGl0IGRvZXMgbm90CisJICAgIyBzdXBwb3J0IC1mLgorCisJICAgIyBOb3cgcmVtb3ZlIG9yIG1vdmUgYXNpZGUgYW55IG9sZCBmaWxlIGF0IGRlc3RpbmF0aW9uIGxvY2F0aW9uLgorCSAgICMgV2UgdHJ5IHRoaXMgdHdvIHdheXMgc2luY2Ugcm0gY2FuJ3QgdW5saW5rIGl0c2VsZiBvbiBzb21lCisJICAgIyBzeXN0ZW1zIGFuZCB0aGUgZGVzdGluYXRpb24gZmlsZSBtaWdodCBiZSBidXN5IGZvciBvdGhlcgorCSAgICMgcmVhc29ucy4gIEluIHRoaXMgY2FzZSwgdGhlIGZpbmFsIGNsZWFudXAgbWlnaHQgZmFpbCBidXQgdGhlIG5ldworCSAgICMgZmlsZSBzaG91bGQgc3RpbGwgaW5zdGFsbCBzdWNjZXNzZnVsbHkuCisJICAgeworCSAgICAgaWYgdGVzdCAtZiAiJGRzdGRpci8kZHN0ZmlsZSI7IHRoZW4KKwkgICAgICAgJGRvaXQgJHJtY21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAyPi9kZXYvbnVsbCBcCisJICAgICAgIHx8ICRkb2l0ICRtdmNtZCAtZiAiJGRzdGRpci8kZHN0ZmlsZSIgIiRybXRtcCIgMj4vZGV2L251bGwgXAorCSAgICAgICB8fCB7CisJCSBlY2hvICIkMDogY2Fubm90IHVubGluayBvciByZW5hbWUgJGRzdGRpci8kZHN0ZmlsZSIgPiYyCisJCSAoZXhpdCAxKTsgZXhpdCAxCisJICAgICAgIH0KKwkgICAgIGVsc2UKKwkgICAgICAgOgorCSAgICAgZmkKKwkgICB9ICYmCisKKwkgICAjIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCisJICAgJGRvaXQgJG12Y21kICIkZHN0dG1wIiAiJGRzdGRpci8kZHN0ZmlsZSIKKwkgfQorICAgIH0KKyAgZmkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Citkb25lCisKKyMgVGhlIGZpbmFsIGxpdHRsZSB0cmljayB0byAiY29ycmVjdGx5IiBwYXNzIHRoZSBleGl0IHN0YXR1cyB0byB0aGUgZXhpdCB0cmFwLgoreworICAoZXhpdCAwKTsgZXhpdCAwCit9CisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvbTQvYWN4X3B0aHJlYWQubTQgYi9pcGVyZi0yLjAuNS9tNC9hY3hfcHRocmVhZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWRmNTFjCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvbTQvYWN4X3B0aHJlYWQubTQKQEAgLTAsMCArMSwxOTkgQEAKK2RubCBBdmFpbGFibGUgZnJvbSB0aGUgR05VIEF1dG9jb25mIE1hY3JvIEFyY2hpdmUgYXQ6CitkbmwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY3hfcHRocmVhZC5odG1sCitkbmwKK0FDX0RFRlVOKFtBQ1hfUFRIUkVBRF0sIFsKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKK0FDX0xBTkdfU0FWRQorQUNfTEFOR19DCithY3hfcHRocmVhZF9vaz1ubworCisjIFdlIHVzZWQgdG8gY2hlY2sgZm9yIHB0aHJlYWQuaCBmaXJzdCwgYnV0IHRoaXMgZmFpbHMgaWYgcHRocmVhZC5oCisjIHJlcXVpcmVzIHNwZWNpYWwgY29tcGlsZXIgZmxhZ3MgKGUuZy4gb24gVHJ1ZTY0IG9yIFNlcXVlbnQpLgorIyBJdCBnZXRzIGNoZWNrZWQgZm9yIGluIHRoZSBsaW5rIHRlc3QgYW55d2F5LgorCisjIEZpcnN0IG9mIGFsbCwgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbnkgb2YgdGhlIFBUSFJFQURfTElCUywKKyMgZXRjZXRlcmEgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgaWYgdGhyZWFkcyBsaW5raW5nIHdvcmtzIHVzaW5nCisjIHRoZW06CitpZiB0ZXN0IHgiJFBUSFJFQURfTElCUyRQVEhSRUFEX0NGTEFHUyIgIT0geDsgdGhlbgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgcHRocmVhZF9qb2luIGluIExJQlM9JFBUSFJFQURfTElCUyB3aXRoIENGTEFHUz0kUFRIUkVBRF9DRkxBR1NdKQorICAgICAgICBBQ19UUllfTElOS19GVU5DKHB0aHJlYWRfam9pbiwgYWN4X3B0aHJlYWRfb2s9eWVzKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRhY3hfcHRocmVhZF9vaykKKyAgICAgICAgaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9vayIgPSB4bm87IHRoZW4KKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9IiIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorICAgICAgICBmaQorICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKK2ZpCisKKyMgV2UgbXVzdCBjaGVjayBmb3IgdGhlIHRocmVhZHMgbGlicmFyeSB1bmRlciBhIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgbmFtZXM7IHRoZSBvcmRlcmluZyBpcyB2ZXJ5IGltcG9ydGFudCBiZWNhdXNlIHNvbWUgc3lzdGVtcworIyAoZS5nLiBERUMpIGhhdmUgYm90aCAtbHB0aHJlYWQgYW5kIC1scHRocmVhZHMsIHdoZXJlIG9uZSBvZiB0aGUKKyMgbGlicmFyaWVzIGlzIGJyb2tlbiAobm9uLVBPU0lYKS4KKworIyBDcmVhdGUgYSBsaXN0IG9mIHRocmVhZCBmbGFncyB0byB0cnkuICBJdGVtcyBzdGFydGluZyB3aXRoIGEgIi0iIGFyZQorIyBDIGNvbXBpbGVyIGZsYWdzLCBhbmQgb3RoZXIgaXRlbXMgYXJlIGxpYnJhcnkgbmFtZXMsIGV4Y2VwdCBmb3IgIm5vbmUiCisjIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHRyeSB3aXRob3V0IGFueSBmbGFncyBhdCBhbGwsIGFuZCAicHRocmVhZC1jb25maWciCisjIHdoaWNoIGlzIGEgcHJvZ3JhbSByZXR1cm5pbmcgdGhlIGZsYWdzIGZvciB0aGUgUHRoIGVtdWxhdGlvbiBsaWJyYXJ5LgorCithY3hfcHRocmVhZF9mbGFncz0icHRocmVhZHMgbm9uZSAtS3RocmVhZCAta3RocmVhZCBsdGhyZWFkIC1wdGhyZWFkIC1wdGhyZWFkcyAtbXRocmVhZHMgcHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCBwdGhyZWFkLWNvbmZpZyIKKworIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorIyBpbmRpdmlkdWFsIGl0ZW1zIGZvbGxvdzoKKworIyBwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyMgbm9uZTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorIyAgICAgICBvdGhlciBjb21waWxlciBmbGFncyB0byBwcmV2ZW50IGNvbnRpbnVhbCBjb21waWxlciB3YXJuaW5ncworIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisjIC1rdGhyZWFkOiBGcmVlQlNEIGtlcm5lbCB0aHJlYWRzIChwcmVmZXJyZWQgdG8gLXB0aHJlYWQgc2luY2UgU01QLWFibGUpCisjIGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorIyAtcHRocmVhZDogTGludXgvZ2NjIChrZXJuZWwgdGhyZWFkcyksIEJTRC9nY2MgKHVzZXJsYW5kIHRocmVhZHMpCisjIC1wdGhyZWFkczogU29sYXJpcy9nY2MKKyMgLW10aHJlYWRzOiBNaW5ndzMyL2djYywgTHlueC9nY2MKKyMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorIyAgICAgIGRvZXNuJ3QgaHVydCB0byBjaGVjayBzaW5jZSB0aGlzIHNvbWV0aW1lcyBkZWZpbmVzIHB0aHJlYWRzIHRvbzsKKyMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorIyBwdGhyZWFkOiBMaW51eCwgZXRjZXRlcmEKKyMgLS10aHJlYWQtc2FmZTogS0FJIEMrKworIyBwdGhyZWFkLWNvbmZpZzogdXNlIHB0aHJlYWQtY29uZmlnIHByb2dyYW0gKGZvciBHTlUgUHRoIGxpYnJhcnkpCisKK2Nhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICpzb2xhcmlzKikKKworICAgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAgICMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkIG9yCisgICAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICAgIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKyAgICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCisgICAgICAgIGFjeF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZCAtcHRocmVhZHMgcHRocmVhZCAtbXQgJGFjeF9wdGhyZWFkX2ZsYWdzIgorICAgICAgICA7OworZXNhYworCitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorZm9yIGZsYWcgaW4gJGFjeF9wdGhyZWFkX2ZsYWdzOyBkbworCisgICAgICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgICAgICAgICAgICBub25lKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGhvdXQgYW55IGZsYWdzXSkKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgLSopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aCAkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisKKwkJcHRocmVhZC1jb25maWcpCisJCUFDX0NIRUNLX1BST0coYWN4X3B0aHJlYWRfY29uZmlnLCBwdGhyZWFkLWNvbmZpZywgeWVzLCBubykKKwkJaWYgdGVzdCB4IiRhY3hfcHRocmVhZF9jb25maWciID0geG5vOyB0aGVuIGNvbnRpbnVlOyBmaQorCQlQVEhSRUFEX0NGTEFHUz0iYHB0aHJlYWQtY29uZmlnIC0tY2ZsYWdzYCIKKwkJUFRIUkVBRF9MSUJTPSJgcHRocmVhZC1jb25maWcgLS1sZGZsYWdzYCBgcHRocmVhZC1jb25maWcgLS1saWJzYCIKKwkJOzsKKworICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGhlIHB0aHJlYWRzIGxpYnJhcnkgLWwkZmxhZ10pCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSItbCRmbGFnIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIENoZWNrIGZvciB2YXJpb3VzIGZ1bmN0aW9ucy4gIFdlIG11c3QgaW5jbHVkZSBwdGhyZWFkLmgsCisgICAgICAgICMgc2luY2Ugc29tZSBmdW5jdGlvbnMgbWF5IGJlIG1hY3Jvcy4gIChPbiB0aGUgU2VxdWVudCwgd2UKKyAgICAgICAgIyBuZWVkIGEgc3BlY2lhbCBmbGFnIC1LdGhyZWFkIHRvIG1ha2UgdGhpcyBoZWFkZXIgY29tcGlsZS4pCisgICAgICAgICMgV2UgY2hlY2sgZm9yIHB0aHJlYWRfam9pbiBiZWNhdXNlIGl0IGlzIGluIC1scHRocmVhZCBvbiBJUklYCisgICAgICAgICMgd2hpbGUgcHRocmVhZF9jcmVhdGUgaXMgaW4gbGliYy4gIFdlIGNoZWNrIGZvciBwdGhyZWFkX2F0dHJfaW5pdAorICAgICAgICAjIGR1ZSB0byBERUMgY3JhemluZXNzIHdpdGggLWxwdGhyZWFkcy4gIFdlIGNoZWNrIGZvcgorICAgICAgICAjIHB0aHJlYWRfY2xlYW51cF9wdXNoIGJlY2F1c2UgaXQgaXMgb25lIG9mIHRoZSBmZXcgcHRocmVhZAorICAgICAgICAjIGZ1bmN0aW9ucyBvbiBTb2xhcmlzIHRoYXQgZG9lc24ndCBoYXZlIGEgbm9uLWZ1bmN0aW9uYWwgbGliYyBzdHViLgorICAgICAgICAjIFdlIHRyeSBwdGhyZWFkX2NyZWF0ZSBvbiBnZW5lcmFsIHByaW5jaXBsZXMuCisgICAgICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisgICAgICAgICAgICAgICAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgwLDAsMCwwKTsgcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsgXSwKKyAgICAgICAgICAgICAgICAgICAgW2FjeF9wdGhyZWFkX29rPXllc10pCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkYWN4X3B0aHJlYWRfb2spCisgICAgICAgIGlmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorCisgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorZG9uZQorZmkKKworIyBWYXJpb3VzIG90aGVyIGNoZWNrczoKK2lmIHRlc3QgIngkYWN4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKworICAgICAgICAjIERldGVjdCBBSVggbG9zc2FnZTogdGhyZWFkcyBhcmUgY3JlYXRlZCBkZXRhY2hlZCBieSBkZWZhdWx0CisgICAgICAgICMgYW5kIHRoZSBKT0lOQUJMRSBhdHRyaWJ1dGUgaGFzIGEgbm9uc3RhbmRhcmQgbmFtZSAoVU5ERVRBQ0hFRCkuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGpvaW5hYmxlIHB0aHJlYWQgYXR0cmlidXRlXSkKKyAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKKyAgICAgICAgICAgICAgICAgICAgW2ludCBhdHRyPVBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFO10sCisgICAgICAgICAgICAgICAgICAgIG9rPVBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFLCBvaz11bmtub3duKQorICAgICAgICBpZiB0ZXN0IHgiJG9rIiA9IHh1bmtub3duOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW50IGF0dHI9UFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRDtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rPVBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQsIG9rPXVua25vd24pCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgeCIkb2siICE9IHhQVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsgdGhlbgorICAgICAgICAgICAgICAgIEFDX0RFRklORShQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSwgJG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIHRoZSBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbiB5b3VyIHN5c3RlbS5dKQorICAgICAgICBmaQorICAgICAgICBBQ19NU0dfUkVTVUxUKCR7b2t9KQorICAgICAgICBpZiB0ZXN0IHgiJG9rIiA9IHh1bmtub3duOyB0aGVuCisgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW3dlIGRvIG5vdCBrbm93IGhvdyB0byBjcmVhdGUgam9pbmFibGUgcHRocmVhZHNdKQorICAgICAgICBmaQorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgbW9yZSBzcGVjaWFsIGZsYWdzIGFyZSByZXF1aXJlZCBmb3IgcHRocmVhZHNdKQorICAgICAgICBmbGFnPW5vCisgICAgICAgIGNhc2UgIiR7aG9zdF9jcHV9LSR7aG9zdF9vc30iIGluCisgICAgICAgICAgICAgICAgKi1haXgqIHwgKi1mcmVlYnNkKiB8ICotZGFyd2luKikgZmxhZz0iLURfVEhSRUFEX1NBRkUiOzsKKyAgICAgICAgICAgICAgICAqc29sYXJpcyogfCAqLW9zZiogfCAqLWhwdXgqKSBmbGFnPSItRF9SRUVOVFJBTlQiOzsKKyAgICAgICAgZXNhYworICAgICAgICBBQ19NU0dfUkVTVUxUKCR7ZmxhZ30pCisgICAgICAgIGlmIHRlc3QgIngkZmxhZyIgIT0geG5vOyB0aGVuCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgZmkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICAjIE1vcmUgQUlYIGxvc3NhZ2U6IG11c3QgY29tcGlsZSB3aXRoIGNjX3IKKyAgICAgICAgQUNfQ0hFQ0tfUFJPRyhQVEhSRUFEX0NDLCBjY19yLCBjY19yLCAke0NDfSkKK2Vsc2UKKyAgICAgICAgUFRIUkVBRF9DQz0iJENDIgorZmkKKworQUNfU1VCU1QoUFRIUkVBRF9MSUJTKQorQUNfU1VCU1QoUFRIUkVBRF9DRkxBR1MpCitBQ19TVUJTVChQVEhSRUFEX0NDKQorCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGFjeF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWZlbHNlKFskMV0sLEFDX0RFRklORShIQVZFX1BUSFJFQUQsMSxbRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuXSksWyQxXSkKKyAgICAgICAgOgorZWxzZQorICAgICAgICBhY3hfcHRocmVhZF9vaz1ubworICAgICAgICAkMgorZmkKK0FDX0xBTkdfUkVTVE9SRQorXSlkbmwgQUNYX1BUSFJFQUQKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L200L2F4X2NyZWF0ZV9zdGRpbnRfaC5tNCBiL2lwZXJmLTIuMC41L200L2F4X2NyZWF0ZV9zdGRpbnRfaC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYzMjliCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00CkBAIC0wLDAgKzEsNjg1IEBACitkbmwgQHN5bm9wc2lzIEFYX0NSRUFURV9TVERJTlRfSCBbKCBIRUFERVItVE8tR0VORVJBVEUgWywgSEVERVJTLVRPLUNIRUNLXSldCitkbmwKK2RubCB0aGUgIklTTyBDOVg6IDcuMTggSW50ZWdlciB0eXBlcyA8c3RkaW50Lmg+IiBzZWN0aW9uIHJlcXVpcmVzIHRoZQorZG5sIGV4aXN0ZW5jZSBvZiBhbiBpbmNsdWRlIGZpbGUgPHN0ZGludC5oPiB0aGF0IGRlZmluZXMgYSBzZXQgb2YKK2RubCB0eXBlZGVmcywgZXNwZWNpYWxseSB1aW50OF90LGludDMyX3QsdWludHB0cl90LiBNYW55IG9sZGVyCitkbmwgaW5zdGFsbGF0aW9ucyB3aWxsIG5vdCBwcm92aWRlIHRoaXMgZmlsZSwgYnV0IHNvbWUgd2lsbCBoYXZlIHRoZQorZG5sIHZlcnkgc2FtZSBkZWZpbml0aW9ucyBpbiA8aW50dHlwZXMuaD4uIEluIG90aGVyIGVudmlyb21lbnRzIHdlIGNhbgorZG5sIHVzZSB0aGUgaW5ldC10eXBlcyBpbiA8c3lzL3R5cGVzLmg+IHdoaWNoIHdvdWxkIGRlZmluZSB0aGUgdHlwZWRlZnMKK2RubCBpbnQ4X3QgYW5kIHVfaW50OF90IHJlc3BlY3Rpdmx5LgorZG5sCitkbmwgVGhpcyBtYWNyb3Mgd2lsbCBjcmVhdGUgYSBsb2NhbCAiX3N0ZGludC5oIiBvciB0aGUgaGVhZGVyZmlsZSBnaXZlbgorZG5sIGFzIGFuIGFyZ3VtZW50LiBJbiBtYW55IGNhc2VzIHRoYXQgZmlsZSB3aWxsIGp1c3QgIiNpbmNsdWRlCitkbmwgPHN0ZGludC5oPiIgb3IgIiNpbmNsdWRlIDxpbnR0eXBlcy5oPiIsIHdoaWxlIGluIG90aGVyIGVudmlyb25tZW50cworZG5sIGl0IHdpbGwgcHJvdmlkZSB0aGUgc2V0IG9mIGJhc2ljICdzdGRpbnQncyBkZWZpbml0aW9ucy90eXBlZGVmczoKK2RubAorZG5sICAgaW50OF90LHVpbnQ4X3QsaW50MTZfdCx1aW50MTZfdCxpbnQzMl90LHVpbnQzMl90LGludHB0cl90LHVpbnRwdHJfdAorZG5sICAgaW50X2xlYXN0MzJfdC4uIGludF9mYXN0MzJfdC4uIGludG1heF90CitkbmwKK2RubCB3aGljaCBtYXkgb3IgbWF5IG5vdCByZWx5IG9uIHRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBmaWxlcywgb3IKK2RubCB1c2luZyB0aGUgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIHNpemVvZiBlYWNoCitkbmwgdHlwZS4KK2RubAorZG5sIGlmIHlvdXIgaGVhZGVyIGZpbGVzIHJlcXVpcmUgdGhlIHN0ZGludC10eXBlcyB5b3Ugd2lsbCB3YW50IHRvCitkbmwgY3JlYXRlIGFuIGluc3RhbGxhYmxlIGZpbGUgbXlsaWItaW50LmggdGhhdCBhbGwgeW91ciBvdGhlcgorZG5sIGluc3RhbGxhYmxlIGhlYWRlciBtYXkgaW5jbHVkZS4gU28gaWYgeW91IGhhdmUgYSBsaWJyYXJ5IHBhY2thZ2UKK2RubCBuYW1lZCAibXlsaWIiLCBqdXN0IHVzZQorZG5sCitkbmwgICAgICBBWF9DUkVBVEVfU1RESU5UX0gobXlsaWItaW50LmgpCitkbmwKK2RubCBpbiBjb25maWd1cmUuYWMgYW5kIGdvIHRvIGluc3RhbGwgdGhhdCB2ZXJ5IGhlYWRlciBmaWxlIGluCitkbmwgTWFrZWZpbGUuYW0gYWxvbmcgd2l0aCB0aGUgb3RoZXIgaGVhZGVycyAobXlsaWIuaCkgLSBhbmQgdGhlCitkbmwgbXlsaWItc3BlY2lmaWMgaGVhZGVycyBjYW4gc2ltcGx5IHVzZSAiI2luY2x1ZGUgPG15bGliLWludC5oPiIgdG8KK2RubCBvYnRhaW4gdGhlIHN0ZGludC10eXBlcy4KK2RubAorZG5sIFJlbWVtYmVyLCBpZiB0aGUgc3lzdGVtIGFscmVhZHkgaGFkIGEgdmFsaWQgPHN0ZGludC5oPiwgdGhlCitkbmwgZ2VuZXJhdGVkIGZpbGUgd2lsbCBpbmNsdWRlIGl0IGRpcmVjdGx5LiBObyBuZWVkIGZvciBmdXp6eQorZG5sIEhBVkVfU1RESU5UX0ggdGhpbmdzLi4uCitkbmwKK2RubCBAY2F0ZWdvcnkgQworZG5sIEBhdXRob3IgR3VpZG8gRHJhaGVpbSA8Z3VpZG9kQGdteC5kZT4KK2RubCBAdmVyc2lvbiAyMDAzLTEyLTA3CitkbmwgQGxpY2Vuc2UgR1BMV2l0aEFDRXhjZXB0aW9uCisKK0FDX0RFRlVOKFtBWF9DSEVDS19EQVRBX01PREVMXSxbCisgICBBQ19DSEVDS19TSVpFT0YoY2hhcikKKyAgIEFDX0NIRUNLX1NJWkVPRihzaG9ydCkKKyAgIEFDX0NIRUNLX1NJWkVPRihpbnQpCisgICBBQ19DSEVDS19TSVpFT0YobG9uZykKKyAgIEFDX0NIRUNLX1NJWkVPRih2b2lkKikKKyAgIGFjX2N2X2NoYXJfZGF0YV9tb2RlbD0iIgorICAgYWNfY3ZfY2hhcl9kYXRhX21vZGVsPSIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsJGFjX2N2X3NpemVvZl9jaGFyIgorICAgYWNfY3ZfY2hhcl9kYXRhX21vZGVsPSIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsJGFjX2N2X3NpemVvZl9zaG9ydCIKKyAgIGFjX2N2X2NoYXJfZGF0YV9tb2RlbD0iJGFjX2N2X2NoYXJfZGF0YV9tb2RlbCRhY19jdl9zaXplb2ZfaW50IgorICAgYWNfY3ZfbG9uZ19kYXRhX21vZGVsPSIiCisgICBhY19jdl9sb25nX2RhdGFfbW9kZWw9IiRhY19jdl9sb25nX2RhdGFfbW9kZWwkYWNfY3Zfc2l6ZW9mX2ludCIKKyAgIGFjX2N2X2xvbmdfZGF0YV9tb2RlbD0iJGFjX2N2X2xvbmdfZGF0YV9tb2RlbCRhY19jdl9zaXplb2ZfbG9uZyIKKyAgIGFjX2N2X2xvbmdfZGF0YV9tb2RlbD0iJGFjX2N2X2xvbmdfZGF0YV9tb2RlbCRhY19jdl9zaXplb2Zfdm9pZHAiCisgICBBQ19NU0dfQ0hFQ0tJTkcoW2RhdGEgbW9kZWxdKQorICAgY2FzZSAiJGFjX2N2X2NoYXJfZGF0YV9tb2RlbC8kYWNfY3ZfbG9uZ19kYXRhX21vZGVsIiBpbgorICAgIDEyMi8yNDIpICAgICBhY19jdl9kYXRhX21vZGVsPSJJUDE2IiAgOyBuPSJzdGFuZGFyZCAxNmJpdCBtYWNoaW5lIiA7OworICAgIDEyMi8yNDQpICAgICBhY19jdl9kYXRhX21vZGVsPSJMUDMyIiAgOyBuPSJzdGFuZGFyZCAzMmJpdCBtYWNoaW5lIiA7OworICAgIDEyMi8qKSAgICAgICBhY19jdl9kYXRhX21vZGVsPSJpMTYiICAgOyBuPSJ1bnVzdWFsIGludDE2IG1vZGVsIiA7OworICAgIDEyNC80NDQpICAgICBhY19jdl9kYXRhX21vZGVsPSJJTFAzMiIgOyBuPSJzdGFuZGFyZCAzMmJpdCB1bml4aXNoIiA7OworICAgIDEyNC80ODgpICAgICBhY19jdl9kYXRhX21vZGVsPSJMUDY0IiAgOyBuPSJzdGFuZGFyZCA2NGJpdCB1bml4aXNoIiA7OworICAgIDEyNC80NDgpICAgICBhY19jdl9kYXRhX21vZGVsPSJMTFA2NCIgOyBuPSJ1bnVzdWFsIDY0Yml0IHVuaXhpc2giIDs7CisgICAgMTI0LyopICAgICAgIGFjX2N2X2RhdGFfbW9kZWw9ImkzMiIgICA7IG49InVudXN1YWwgaW50MzIgbW9kZWwiIDs7CisgICAgMTI4Lzg4OCkgICAgIGFjX2N2X2RhdGFfbW9kZWw9IklMUDY0IiA7IG49InVudXN1YWwgNjRiaXQgbnVtZXJpYyIgOzsKKyAgICAxMjgvKikgICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iaTY0IiAgIDsgbj0idW51c3VhbCBpbnQ2NCBtb2RlbCIgOzsKKyAgICAyMjIvKjIpICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iRFNQMTYiIDsgbj0ic3RyaWN0IDE2Yml0IGRzcHR5cGUiIDs7CisgICAgMzMzLyozKSAgICAgIGFjX2N2X2RhdGFfbW9kZWw9IkRTUDI0IiA7IG49InN0cmljdCAyNGJpdCBkc3B0eXBlIiA7OworICAgIDQ0NC8qNCkgICAgICBhY19jdl9kYXRhX21vZGVsPSJEU1AzMiIgOyBuPSJzdHJpY3QgMzJiaXQgZHNwdHlwZSIgOzsKKyAgICA2NjYvKjYpICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0iRFNQNDgiIDsgbj0ic3RyaWN0IDQ4Yml0IGRzcHR5cGUiIDs7CisgICAgODg4Lyo4KSAgICAgIGFjX2N2X2RhdGFfbW9kZWw9IkRTUDY0IiA7IG49InN0cmljdCA2NGJpdCBkc3B0eXBlIiA7OworICAgIDIyMi8qfDMzMy8qfDQ0NC8qfDY2Ni8qfDg4OC8qKSA6CisgICAgICAgICAgICAgICAgIGFjX2N2X2RhdGFfbW9kZWw9ImlEU1AiICA7IG49InVudXN1YWwgZHNwdHlwZSIgOzsKKyAgICAgKikgICAgICAgICAgYWNfY3ZfZGF0YV9tb2RlbD0ibm9uZSIgIDsgbj0idmVyeSB1bnVzdWFsIG1vZGVsIiA7OworICAgZXNhYworICAgQUNfTVNHX1JFU1VMVChbJGFjX2N2X2RhdGFfbW9kZWwgKCRhY19jdl9sb25nX2RhdGFfbW9kZWwsICRuKV0pCitdKQorCitkbmwgQVhfQ0hFQ0tfSEVBREVSX1NURElOVF9YKFtIRUFERVJMSVNUXVssQUNUSU9OLUlGXSkKK0FDX0RFRlVOKFtBWF9DSEVDS19IRUFERVJfU1RESU5UX1hdLFsKK0FDX0NBQ0hFX0NIRUNLKFtmb3Igc3RkaW50IHVpbnRwdHJfdF0sIFthY19jdl9oZWFkZXJfc3RkaW50X3hdLFsKKyBhY19jdl9oZWFkZXJfc3RkaW50X3g9IiIgIyB0aGUgMTk5NyB0eXBlZGVmcyAoaW50dHlwZXMuaCkKKyAgQUNfTVNHX1JFU1VMVChbKC4uKV0pCisgIGZvciBpIGluIG00X2lmdmFsKFskMV0sWyQxXSxbc3RkaW50LmggaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaF0pIDsgZG8KKyAgIHVuc2V0IGFjX2N2X3R5cGVfdWludHB0cl90CisgICB1bnNldCBhY19jdl90eXBlX3VpbnQ2NF90CisgICBBQ19DSEVDS19UWVBFKHVpbnRwdHJfdCxbYWNfY3ZfaGVhZGVyX3N0ZGludF94PSRpXSxjb250aW51ZSxbI2luY2x1ZGUgPCRpPl0pCisgICBBQ19DSEVDS19UWVBFKHVpbnQ2NF90LFthbmQ2ND0iL3VpbnQ2NF90Il0sW2FuZDY0PSIiXSxbI2luY2x1ZGU8JGk+XSkKKyAgIG00X2lmdmFsbihbJDFdLFskMV0pIGJyZWFrCisgIGRvbmUKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3RkaW50IHVpbnRwdHJfdF0pCisgXSkKK10pCisKK0FDX0RFRlVOKFtBWF9DSEVDS19IRUFERVJfU1RESU5UX09dLFsKK0FDX0NBQ0hFX0NIRUNLKFtmb3Igc3RkaW50IHVpbnQzMl90XSwgW2FjX2N2X2hlYWRlcl9zdGRpbnRfb10sWworIGFjX2N2X2hlYWRlcl9zdGRpbnRfbz0iIiAjIHRoZSAxOTk1IHR5cGVkZWZzIChzeXMvaW50dHlwZXMuaCkKKyAgQUNfTVNHX1JFU1VMVChbKC4uKV0pCisgIGZvciBpIGluIG00X2lmdmFsKFskMV0sWyQxXSxbaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCBzdGRpbnQuaF0pIDsgZG8KKyAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDMyX3QKKyAgIHVuc2V0IGFjX2N2X3R5cGVfdWludDY0X3QKKyAgIEFDX0NIRUNLX1RZUEUodWludDMyX3QsW2FjX2N2X2hlYWRlcl9zdGRpbnRfbz0kaV0sY29udGludWUsWyNpbmNsdWRlIDwkaT5dKQorICAgQUNfQ0hFQ0tfVFlQRSh1aW50NjRfdCxbYW5kNjQ9Ii91aW50NjRfdCJdLFthbmQ2ND0iIl0sWyNpbmNsdWRlPCRpPl0pCisgICBtNF9pZnZhbG4oWyQxXSxbJDFdKSBicmVhaworICAgYnJlYWs7CisgIGRvbmUKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3RkaW50IHVpbnQzMl90XSkKKyBdKQorXSkKKworQUNfREVGVU4oW0FYX0NIRUNLX0hFQURFUl9TVERJTlRfVV0sWworQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdGRpbnQgdV9pbnQzMl90XSwgW2FjX2N2X2hlYWRlcl9zdGRpbnRfdV0sWworIGFjX2N2X2hlYWRlcl9zdGRpbnRfdT0iIiAjIHRoZSBCU0QgdHlwZWRlZnMgKHN5cy90eXBlcy5oKQorICBBQ19NU0dfUkVTVUxUKFsoLi4pXSkKKyAgZm9yIGkgaW4gbTRfaWZ2YWwoWyQxXSxbJDFdLFtzeXMvdHlwZXMuaCBpbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oXSkgOyBkbworICAgdW5zZXQgYWNfY3ZfdHlwZV91X2ludDMyX3QKKyAgIHVuc2V0IGFjX2N2X3R5cGVfdV9pbnQ2NF90CisgICBBQ19DSEVDS19UWVBFKHVfaW50MzJfdCxbYWNfY3ZfaGVhZGVyX3N0ZGludF91PSRpXSxjb250aW51ZSxbI2luY2x1ZGUgPCRpPl0pCisgICBBQ19DSEVDS19UWVBFKHVfaW50NjRfdCxbYW5kNjQ9Ii91X2ludDY0X3QiXSxbYW5kNjQ9IiJdLFsjaW5jbHVkZTwkaT5dKQorICAgbTRfaWZ2YWxuKFskMV0sWyQxXSkgYnJlYWsKKyAgIGJyZWFrOworICBkb25lCisgIEFDX01TR19DSEVDS0lORyhbZm9yIHN0ZGludCB1X2ludDMyX3RdKQorIF0pCitdKQorCitBQ19ERUZVTihbQVhfQ1JFQVRFX1NURElOVF9IXSwKK1sjIC0tLS0tLSBBWCBDUkVBVEUgU1RESU5UIEggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3RkaW50IHR5cGVzXSkKK2FjX3N0ZGludF9oPWBlY2hvIGlmZWxzZSgkMSwgLCBfc3RkaW50LmgsICQxKWAKKyMgdHJ5IHRvIHNob3J0Y2lyY3VpdCAtIGlmIHRoZSBkZWZhdWx0IGluY2x1ZGUgcGF0aCBvZiB0aGUgY29tcGlsZXIKKyMgY2FuIGZpbmQgYSAic3RkaW50LmgiIGhlYWRlciB0aGVuIHdlIGFzc3VtZSB0aGF0IGFsbCBjb21waWxlcnMgY2FuLgorQUNfQ0FDSEVfVkFMKFthY19jdl9oZWFkZXJfc3RkaW50X3RdLFsKK29sZF9DWFhGTEFHUz0iJENYWEZMQUdTIiA7IENYWEZMQUdTPSIiCitvbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIgOyBDUFBGTEFHUz0iIgorb2xkX0NGTEFHUz0iJENGTEFHUyIgICAgIDsgQ0ZMQUdTPSIiCitBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGludC5oPl0sW2ludF9sZWFzdDMyX3QgdiA9IDA7XSwKK1thY19jdl9zdGRpbnRfcmVzdWx0PSIoYXNzdW1pbmcgQzk5IGNvbXBhdGlibGUgc3lzdGVtKSIKKyBhY19jdl9oZWFkZXJfc3RkaW50X3Q9InN0ZGludC5oIjsgXSwKK1thY19jdl9oZWFkZXJfc3RkaW50X3Q9IiJdKQorQ1hYRkxBR1M9IiRvbGRfQ1hYRkxBR1MiCitDUFBGTEFHUz0iJG9sZF9DUFBGTEFHUyIKK0NGTEFHUz0iJG9sZF9DRkxBR1MiIF0pCisKK3Y9Ii4uLiAkYWNfY3ZfaGVhZGVyX3N0ZGludF9oIgoraWYgdGVzdCAiJGFjX3N0ZGludF9oIiA9ICJzdGRpbnQuaCIgOyB0aGVuCisgQUNfTVNHX1JFU1VMVChbKGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGVtIGluIC4vc3RkaW50Lmg/KV0pCitlbGlmIHRlc3QgIiRhY19zdGRpbnRfaCIgPSAiaW50dHlwZXMuaCIgOyB0aGVuCisgQUNfTVNHX1JFU1VMVChbKGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0aGVtIGluIC4vaW50dHlwZXMuaD8pXSkKK2VsaWYgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3QiID0gIl8iIDsgdGhlbgorIEFDX01TR19SRVNVTFQoWyhwdXR0aW5nIHRoZW0gaW50byAkYWNfc3RkaW50X2gpJHZdKQorZWxzZQorIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X3QiCisgQUNfTVNHX1JFU1VMVChbJGFjX2N2X2hlYWRlcl9zdGRpbnQgKHNob3J0Y2lyY3VpdCldKQorZmkKKworaWYgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3QiID0gIl8iIDsgdGhlbiAjIGNhbiBub3Qgc2hvcnRjaXJjdWl0Li4KKworZG5sIC4uLi4uaW50cm8gbWVzc2FnZSBkb25lLCBub3cgZG8gYSBmZXcgc3lzdGVtIGNoZWNrcy4uLi4uCitkbmwgYnR3LCBhbGwgb2xkIENIRUNLX1RZUEUgbWFjcm9zIGRvIGF1dG9tYXRpY2FsbHkgIkRFRklORSIgYSB0eXBlLAorZG5sIHRoZXJlZm9yZSB3ZSB1c2UgdGhlIGF1dG9jb25mIGltcGxlbWVudGF0aW9uIGRldGFpbCBDSEVDS19UWVBFX05FVworZG5sIGluc3RlYWQgdGhhdCBpcyB0cmlnZ2VyZWQgd2l0aCAzIG9yIG1vcmUgYXJndW1lbnRzIChzZWUgdHlwZXMubTQpCisKK2ludHR5cGVfaGVhZGVycz1gZWNobyAkMiB8IHNlZCAtZSAncy8sLyAvZydgCisKK2FjX2N2X3N0ZGludF9yZXN1bHQ9IihubyBoZWxwZnVsIHN5c3RlbSB0eXBlZGVmcyBzZWVuKSIKK0FYX0NIRUNLX0hFQURFUl9TVERJTlRfWChkbmwKKyAgIHN0ZGludC5oIGludHR5cGVzLmggc3lzL2ludHR5cGVzLmggJGludHR5cGVfaGVhZGVycywKKyAgIGFjX2N2X3N0ZGludF9yZXN1bHQ9IihzZWVuIHVpbnRwdHJfdCRhbmQ2NCBpbiAkaSkiKQorCitpZiB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfeCIgPSAiXyIgOyB0aGVuCitBWF9DSEVDS19IRUFERVJfU1RESU5UX08oZG5sLAorICAgaW50dHlwZXMuaCBzeXMvaW50dHlwZXMuaCBzdGRpbnQuaCAkaW50dHlwZV9oZWFkZXJzLAorICAgYWNfY3Zfc3RkaW50X3Jlc3VsdD0iKHNlZW4gdWludDMyX3QkYW5kNjQgaW4gJGkpIikKK2ZpCisKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJfIiA7IHRoZW4KK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF9vIiA9ICJfIiA7IHRoZW4KK0FYX0NIRUNLX0hFQURFUl9TVERJTlRfVShkbmwsCisgICBzeXMvdHlwZXMuaCBpbnR0eXBlcy5oIHN5cy9pbnR0eXBlcy5oICRpbnR0eXBlX2hlYWRlcnMsCisgICBhY19jdl9zdGRpbnRfcmVzdWx0PSIoc2VlbiB1X2ludDMyX3QkYW5kNjQgaW4gJGkpIikKK2ZpIGZpCisKK2RubCBpZiB0aGVyZSB3YXMgbm8gZ29vZCBDOTkgaGVhZGVyIGZpbGUsIGRvIHNvbWUgdHlwZWRlZiBjaGVja3MuLi4KK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF94IiA9ICJfIiA7IHRoZW4KKyAgIEFDX01TR19DSEVDS0lORyhbZm9yIHN0ZGludCBkYXRhdHlwZSBtb2RlbF0pCisgICBBQ19NU0dfUkVTVUxUKFsoLi4pXSkKKyAgIEFYX0NIRUNLX0RBVEFfTU9ERUwKK2ZpCisKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF94IiAhPSAiXyIgOyB0aGVuCisgICBhY19jdl9oZWFkZXJfc3RkaW50PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgorZWxpZiAgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X28iICE9ICJfIiA7IHRoZW4KKyAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9IiRhY19jdl9oZWFkZXJfc3RkaW50X28iCitlbGlmICB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIgIT0gIl8iIDsgdGhlbgorICAgYWNfY3ZfaGVhZGVyX3N0ZGludD0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIKK2Vsc2UKKyAgIGFjX2N2X2hlYWRlcl9zdGRpbnQ9InN0ZGRlZi5oIgorZmkKKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgZXh0cmEgaW50dHlwZXMgaW4gY2hvc2VuIGhlYWRlcl0pCitBQ19NU0dfUkVTVUxUKFsoJGFjX2N2X2hlYWRlcl9zdGRpbnQpXSkKK2RubCBzZWUgaWYgaW50X2xlYXN0IGFuZCBpbnRfZmFzdCB0eXBlcyBhcmUgcHJlc2VudCBpbiBfdGhpc18gaGVhZGVyLgordW5zZXQgYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90Cit1bnNldCBhY19jdl90eXBlX2ludF9mYXN0MzJfdAorQUNfQ0hFQ0tfVFlQRShpbnRfbGVhc3QzMl90LCwsWyNpbmNsdWRlIDwkYWNfY3ZfaGVhZGVyX3N0ZGludD5dKQorQUNfQ0hFQ0tfVFlQRShpbnRfZmFzdDMyX3QsLCxbI2luY2x1ZGU8JGFjX2N2X2hlYWRlcl9zdGRpbnQ+XSkKK0FDX0NIRUNLX1RZUEUoaW50bWF4X3QsLCxbI2luY2x1ZGUgPCRhY19jdl9oZWFkZXJfc3RkaW50Pl0pCisKK2ZpICMgc2hvcnRjaXJjdXQgdG8gc3lzdGVtICJzdGRpbnQuaCIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tIFBSRVBBUkUgVkFSSUFCTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KK2FjX2N2X3N0ZGludF9tZXNzYWdlPSJ1c2luZyBnbnUgY29tcGlsZXIgImAkQ0MgLS12ZXJzaW9uIHwgaGVhZCAtMWAKK2Vsc2UKK2FjX2N2X3N0ZGludF9tZXNzYWdlPSJ1c2luZyAkQ0MiCitmaQorCitBQ19NU0dfUkVTVUxUKFttYWtlIHVzZSBvZiAkYWNfY3ZfaGVhZGVyX3N0ZGludCBpbiAkYWNfc3RkaW50X2ggZG5sCiskYWNfY3Zfc3RkaW50X3Jlc3VsdF0pCisKK2RubCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAtLS0tLS0tLS0tLS0tLS0tLSBET05FIGludHR5cGVzLmggY2hlY2tzIFNUQVJUIGhlYWRlciAtLS0tLS0tLS0tLS0tCitBQ19DT05GSUdfQ09NTUFORFMoWyRhY19zdGRpbnRfaF0sWworQUNfTVNHX05PVElDRShjcmVhdGluZyAkYWNfc3RkaW50X2ggOiAkX2FjX3N0ZGludF9oKQorYWNfc3RkaW50PSR0bXAvX3N0ZGludC5oCisKK2VjaG8gIiNpZm5kZWYiICRfYWNfc3RkaW50X2ggPiRhY19zdGRpbnQKK2VjaG8gIiNkZWZpbmUiICRfYWNfc3RkaW50X2ggIjEiID4+JGFjX3N0ZGludAorZWNobyAiI2lmbmRlZiIgX0dFTkVSQVRFRF9TVERJTlRfSCA+PiRhY19zdGRpbnQKK2VjaG8gIiNkZWZpbmUiIF9HRU5FUkFURURfU1RESU5UX0ggJyInJFBBQ0tBR0UgJFZFUlNJT04nIicgPj4kYWNfc3RkaW50CitlY2hvICIvKiBnZW5lcmF0ZWQgJGFjX2N2X3N0ZGludF9tZXNzYWdlICovIiA+PiRhY19zdGRpbnQKK2lmIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF90IiAhPSAiXyIgOyB0aGVuCitlY2hvICIjZGVmaW5lIF9TVERJTlRfSEFWRV9TVERJTlRfSCIgIjEiID4+JGFjX3N0ZGludAorZWNobyAiI2luY2x1ZGUgPHN0ZGludC5oPiIgPj4kYWNfc3RkaW50CitlY2hvICIjZW5kaWYiID4+JGFjX3N0ZGludAorZWNobyAiI2VuZGlmIiA+PiRhY19zdGRpbnQKK2Vsc2UKKworY2F0ID4+JGFjX3N0ZGludCA8PFNURElOVF9FT0YKKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLiBzaG9ydGNpcmN1aXQgcGFydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSCB8fCBkZWZpbmVkIF9TVERJTlRfSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4gY29uZmlndXJlZCBwYXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworU1RESU5UX0VPRgorCitlY2hvICIvKiB3aGV0aGVyIHdlIGhhdmUgYSBDOTkgY29tcGF0aWJsZSBzdGRpbnQgaGVhZGVyIGZpbGUgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiXyRhY19jdl9oZWFkZXJfc3RkaW50X3giICE9ICJfIiA7IHRoZW4KKyAgYWNfaGVhZGVyPSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgorICBlY2hvICIjZGVmaW5lIF9TVERJTlRfSEVBREVSX0lOVFBUUiIgJyInIiRhY19oZWFkZXIiJyInID4+JGFjX3N0ZGludAorZWxzZQorICBlY2hvICIvKiAjdW5kZWYgX1NURElOVF9IRUFERVJfSU5UUFRSICovIiA+PiRhY19zdGRpbnQKK2ZpCisKK2VjaG8gIi8qIHdoZXRoZXIgd2UgaGF2ZSBhIEM5NiBjb21wYXRpYmxlIGludHR5cGVzIGhlYWRlciBmaWxlICovIiA+PiRhY19zdGRpbnQKK2lmICB0ZXN0ICJfJGFjX2N2X2hlYWRlcl9zdGRpbnRfbyIgIT0gIl8iIDsgdGhlbgorICBhY19oZWFkZXI9IiRhY19jdl9oZWFkZXJfc3RkaW50X28iCisgIGVjaG8gIiNkZWZpbmUgX1NURElOVF9IRUFERVJfVUlOVDMyIiAnIiciJGFjX2hlYWRlciInIicgPj4kYWNfc3RkaW50CitlbHNlCisgIGVjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hFQURFUl9VSU5UMzIgKi8iID4+JGFjX3N0ZGludAorZmkKKworZWNobyAiLyogd2hldGhlciB3ZSBoYXZlIGEgQlNEIGNvbXBhdGlibGUgaW5ldCB0eXBlcyBoZWFkZXIgKi8iID4+JGFjX3N0ZGludAoraWYgIHRlc3QgIl8kYWNfY3ZfaGVhZGVyX3N0ZGludF91IiAhPSAiXyIgOyB0aGVuCisgIGFjX2hlYWRlcj0iJGFjX2N2X2hlYWRlcl9zdGRpbnRfdSIKKyAgZWNobyAiI2RlZmluZSBfU1RESU5UX0hFQURFUl9VX0lOVDMyIiAnIiciJGFjX2hlYWRlciInIicgPj4kYWNfc3RkaW50CitlbHNlCisgIGVjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hFQURFUl9VX0lOVDMyICovIiA+PiRhY19zdGRpbnQKK2ZpCisKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKK2lmIHRlc3QgIl8kYWNfaGVhZGVyIiAhPSAiXyIgOyB0aGVuIGlmIHRlc3QgIiRhY19oZWFkZXIiICE9ICJzdGRkZWYuaCIgOyB0aGVuCisgIGVjaG8gIiNpbmNsdWRlIDwkYWNfaGVhZGVyPiIgPj4kYWNfc3RkaW50CisgIGVjaG8gIiIgPj4kYWNfc3RkaW50CitmaSBmaQorCitlY2hvICIvKiB3aGljaCA2NGJpdCB0eXBlZGVmIGhhcyBiZWVuIGZvdW5kICovIiA+PiRhY19zdGRpbnQKK2lmIHRlc3QgIiRhY19jdl90eXBlX3VpbnQ2NF90IiA9ICJ5ZXMiIDsgdGhlbgorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfSEFWRV9VSU5UNjRfVCIgIjEiICA+PiRhY19zdGRpbnQKK2Vsc2UKK2VjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hBVkVfVUlOVDY0X1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2lmIHRlc3QgIiRhY19jdl90eXBlX3VfaW50NjRfdCIgPSAieWVzIiA7IHRoZW4KK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0hBVkVfVV9JTlQ2NF9UIiAiMSIgID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9VX0lOVDY0X1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKK2VjaG8gIi8qIHdoaWNoIHR5cGUgbW9kZWwgaGFzIGJlZW4gZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiXyRhY19jdl9jaGFyX2RhdGFfbW9kZWwiICE9ICJfIiA7IHRoZW4KK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0NIQVJfTU9ERUwiICIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsIiA+PiRhY19zdGRpbnQKK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0xPTkdfTU9ERUwiICIkYWNfY3ZfbG9uZ19kYXRhX21vZGVsIiA+PiRhY19zdGRpbnQKK2Vsc2UKK2VjaG8gIi8qICN1bmRlZiBfU1RESU5UX0NIQVJfTU9ERUwgLy8gc2tpcHBlZCAqLyIgPj4kYWNfc3RkaW50CitlY2hvICIvKiAjdW5kZWYgX1NURElOVF9MT05HX01PREVMIC8vIHNraXBwZWQgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKK2VjaG8gIi8qIHdoZXRoZXIgaW50X2xlYXN0IHR5cGVzIHdlcmUgZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2xlYXN0MzJfdCIgPSAieWVzIjsgdGhlbgorZWNobyAiI2RlZmluZSAgIF9TVERJTlRfSEFWRV9JTlRfTEVBU1QzMl9UIiAiMSIgID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9JTlRfTEVBU1QzMl9UICovIiA+PiRhY19zdGRpbnQKK2ZpCitlY2hvICIvKiB3aGV0aGVyIGludF9mYXN0IHR5cGVzIHdlcmUgZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50X2Zhc3QzMl90IiA9ICJ5ZXMiOyB0aGVuCitlY2hvICIjZGVmaW5lICAgX1NURElOVF9IQVZFX0lOVF9GQVNUMzJfVCIgIjEiID4+JGFjX3N0ZGludAorZWxzZQorZWNobyAiLyogI3VuZGVmIF9TVERJTlRfSEFWRV9JTlRfRkFTVDMyX1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIi8qIHdoZXRoZXIgaW50bWF4X3QgdHlwZSB3YXMgZGV0ZWN0ZWQgKi8iID4+JGFjX3N0ZGludAoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50bWF4X3QiID0gInllcyI7IHRoZW4KK2VjaG8gIiNkZWZpbmUgICBfU1RESU5UX0hBVkVfSU5UTUFYX1QiICIxIiA+PiRhY19zdGRpbnQKK2Vsc2UKK2VjaG8gIi8qICN1bmRlZiBfU1RESU5UX0hBVkVfSU5UTUFYX1QgKi8iID4+JGFjX3N0ZGludAorZmkKK2VjaG8gIiIgPj4kYWNfc3RkaW50CisKKyAgY2F0ID4+JGFjX3N0ZGludCA8PFNURElOVF9FT0YKKy8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uIGRldGVjdGlvbnMgcGFydCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKy8qIHdoZXRoZXIgd2UgbmVlZCB0byBkZWZpbmUgYml0c3BlY2lmaWMgdHlwZXMgZnJvbSBjb21waWxlciBiYXNlIHR5cGVzICovCisjaWZuZGVmIF9TVERJTlRfSEVBREVSX0lOVFBUUgorI2lmbmRlZiBfU1RESU5UX0hFQURFUl9VSU5UMzIKKyNpZm5kZWYgX1NURElOVF9IRUFERVJfVV9JTlQzMgorI2RlZmluZSBfU1RESU5UX05FRURfSU5UX01PREVMX1QKKyNlbHNlCisjZGVmaW5lIF9TVERJTlRfSEFWRV9VX0lOVF9UWVBFUworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX1NURElOVF9IQVZFX1VfSU5UX1RZUEVTCisjdW5kZWYgX1NURElOVF9ORUVEX0lOVF9NT0RFTF9UCisjZW5kaWYKKworI2lmZGVmICBfU1RESU5UX0NIQVJfTU9ERUwKKyNpZiAgICAgX1NURElOVF9DSEFSX01PREVMKzAgPT0gMTIyIHx8IF9TVERJTlRfQ0hBUl9NT0RFTCswID09IDEyNAorI2lmbmRlZiBfU1RESU5UX0JZVEVfTU9ERUwKKyNkZWZpbmUgX1NURElOVF9CWVRFX01PREVMIDEyCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1NURElOVF9IQVZFX0lOVF9MRUFTVDMyX1QKKyNkZWZpbmUgX1NURElOVF9ORUVEX0lOVF9MRUFTVF9UCisjZW5kaWYKKworI2lmbmRlZiBfU1RESU5UX0hBVkVfSU5UX0ZBU1QzMl9UCisjZGVmaW5lIF9TVERJTlRfTkVFRF9JTlRfRkFTVF9UCisjZW5kaWYKKworI2lmbmRlZiBfU1RESU5UX0hFQURFUl9JTlRQVFIKKyNkZWZpbmUgX1NURElOVF9ORUVEX0lOVFBUUl9UCisjaWZuZGVmIF9TVERJTlRfSEFWRV9JTlRNQVhfVAorI2RlZmluZSBfU1RESU5UX05FRURfSU5UTUFYX1QKKyNlbmRpZgorI2VuZGlmCisKKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4gZGVmaW5pdGlvbiBwYXJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworLyogc29tZSBzeXN0ZW0gaGVhZGVycyBoYXZlIGdvb2QgdWludDY0X3QgKi8KKyNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKKyNpZiAgICAgZGVmaW5lZCBfU1RESU5UX0hBVkVfVUlOVDY0X1QgIHx8IGRlZmluZWQgSEFWRV9VSU5UNjRfVAorI2RlZmluZSBfSEFWRV9VSU5UNjRfVAorI2VsaWYgICBkZWZpbmVkIF9TVERJTlRfSEFWRV9VX0lOVDY0X1QgfHwgZGVmaW5lZCBIQVZFX1VfSU5UNjRfVAorI2RlZmluZSBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiB1X2ludDY0X3QgdWludDY0X3Q7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9IQVZFX1VJTlQ2NF9UCisvKiAuLiBoZXJlIGFyZSBzb21lIGNvbW1vbiBoZXVyaXN0aWNzIHVzaW5nIGNvbXBpbGVyIHJ1bnRpbWUgc3BlY2lmaWNzICovCisjaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCisjZGVmaW5lIF9IQVZFX0xPTkdMT05HX1VJTlQ2NF9UCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisKKyNlbGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXworI2lmIGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX1dBVENPTUNfXyB8fCBkZWZpbmVkIF9fQk9STEFORENfXworI2RlZmluZSBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiBfX2ludDY0IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7CisKKyNlbGlmIGRlZmluZWQgX19HTlVDX18gfHwgZGVmaW5lZCBfX01XRVJLU19fIHx8IGRlZmluZWQgX19FTEZfXworLyogbm90ZTogYWxsIEVMRi1zeXN0ZW1zIHNlZW0gdG8gaGF2ZSBsb2ZmLXN1cHBvcnQgd2hpY2ggbmVlZHMgNjQtYml0ICovCisjaWYgIWRlZmluZWQgX05PX0xPTkdMT05HCisjZGVmaW5lIF9IQVZFX1VJTlQ2NF9UCisjZGVmaW5lIF9IQVZFX0xPTkdMT05HX1VJTlQ2NF9UCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisjZW5kaWYKKworI2VsaWYgZGVmaW5lZCBfX2FscGhhIHx8IChkZWZpbmVkIF9fbWlwcyAmJiBkZWZpbmVkIF9BQklOMzIpCisjaWYgIWRlZmluZWQgX05PX0xPTkdMT05HCit0eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKKyNlbmRpZgorICAvKiBjb21waWxlci9jcHUgdHlwZSB0byBkZWZpbmUgaW50NjRfdCAqLworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfU1RESU5UX0hBVkVfVV9JTlRfVFlQRVMKKy8qIGludDhfdCBpbnQxNl90IGludDMyX3QgZGVmaW5lZCBieSBpbmV0IGNvZGUsIHJlZGVjbGFyZSB0aGUgdV9pbnRYWCB0eXBlcyAqLwordHlwZWRlZiB1X2ludDhfdCB1aW50OF90OwordHlwZWRlZiB1X2ludDE2X3QgdWludDE2X3Q7Cit0eXBlZGVmIHVfaW50MzJfdCB1aW50MzJfdDsKKworLyogZ2xpYmMgY29tcGF0aWJpbGl0eSAqLworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfU1RESU5UX05FRURfSU5UX01PREVMX1QKKy8qIHdlIG11c3QgZ3Vlc3MgYWxsIHRoZSBiYXNpYyB0eXBlcy4gQXBhcnQgZnJvbSBieXRlLWFkcmVzc2FibGUgc3lzdGVtLCAqLworLyogdGhlcmUgYSBmZXcgMzItYml0LW9ubHkgZHNwLXN5c3RlbXMgdGhhdCB3ZSBndWFyZCB3aXRoIEJZVEVfTU9ERUwgOC19ICovCisvKiAoYnR3LCB0aG9zZSBuaWJibGUtYWRkcmVzc2FibGUgc3lzdGVtcyBhcmUgd2F5IG9mZiwgb3Igc28gd2UgYXNzdW1lKSAqLworCitkbmwgICAvKiBoYXZlIGEgbG9vayBhdCAiNjRiaXQgYW5kIGRhdGEgc2l6ZSBuZXV0cmFsaXR5IiBhdCAqLworZG5sICAgLyogaHR0cDovL3VuaXgub3JnL3ZlcnNpb24yL3doYXRzbmV3L2xvZ2luXzY0Yml0Lmh0bWwgKi8KK2RubCAgIC8qICh0aGUgc2hvcnRoYW5kICJJTFAiIHR5cGVzIGFsd2F5cyBoYXZlIGEgIlAiIHBhcnQpICovCisKKyNpZiBkZWZpbmVkIF9TVERJTlRfQllURV9NT0RFTAorI2lmIF9TVERJTlRfTE9OR19NT0RFTCswID09IDI0MgorLyogMjo0OjIgPSAgSVAxNiA9IGEgbm9ybWFsIDE2LWJpdCBzeXN0ZW0gICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVpbnQzMl90OworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Cit0eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKK3R5cGVkZWYgICAgICAgICAgbG9uZyAgICBpbnQzMl90OworI2VuZGlmCisjZWxpZiBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSAyNDQgfHwgX1NURElOVF9MT05HX01PREVMID09IDQ0NAorLyogMjo0OjQgPSAgTFAzMiA9IGEgMzItYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAxNi1iaXQgKi8KKy8qIDQ6NDo0ID0gSUxQMzIgPSBhIG5vcm1hbCAzMi1iaXQgc3lzdGVtICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKKyNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAorI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCit0eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwordHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Cit0eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKKyNlbmRpZgorI2VsaWYgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDg0IHx8IF9TVERJTlRfTE9OR19NT0RFTCswID09IDQ4OAorLyogNDo4OjQgPSAgSVAzMiA9IGEgMzItYml0IHN5c3RlbSBwcmVwYXJlZCBmb3IgNjQtYml0ICAgICovCisvKiA0Ojg6OCA9ICBMUDY0ID0gYSBub3JtYWwgNjQtYml0IHN5c3RlbSAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIHVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIHVpbnQzMl90OworI2lmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjZGVmaW5lIF9faW50OF90X2RlZmluZWQKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICBpbnQ4X3Q7Cit0eXBlZGVmICAgICAgICAgIHNob3J0ICAgaW50MTZfdDsKK3R5cGVkZWYgICAgICAgICAgaW50ICAgICBpbnQzMl90OworI2VuZGlmCisvKiB0aGlzIHN5c3RlbSBoYXMgYSAibG9uZyIgb2YgNjRiaXQgKi8KKyNpZm5kZWYgX0hBVkVfVUlOVDY0X1QKKyNkZWZpbmUgX0hBVkVfVUlOVDY0X1QKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVpbnQ2NF90OwordHlwZWRlZiAgICAgICAgICBsb25nICAgIGludDY0X3Q7CisjZW5kaWYKKyNlbGlmIF9TVERJTlRfTE9OR19NT0RFTCswID09IDQ0OAorLyogICAgICBMTFA2NCAgIGEgNjQtYml0IHN5c3RlbSBkZXJpdmVkIGZyb20gYSAzMi1iaXQgc3lzdGVtICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1aW50MzJfdDsKKyNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAorI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkCit0eXBlZGVmICAgICAgICAgIGNoYXIgICAgaW50OF90OwordHlwZWRlZiAgICAgICAgICBzaG9ydCAgIGludDE2X3Q7Cit0eXBlZGVmICAgICAgICAgIGludCAgICAgaW50MzJfdDsKKyNlbmRpZgorLyogYXNzdW1pbmcgdGhlIHN5c3RlbSBoYXMgYSAibG9uZyBsb25nIiAqLworI2lmbmRlZiBfSEFWRV9VSU5UNjRfVAorI2RlZmluZSBfSEFWRV9VSU5UNjRfVAorI2RlZmluZSBfSEFWRV9MT05HTE9OR19VSU5UNjRfVAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Cit0eXBlZGVmICAgICAgICAgIGxvbmcgbG9uZyAgaW50NjRfdDsKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX1NURElOVF9OT19JTlQzMl9UCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9TVERJTlRfTk9fSU5UOF9UCisjZGVmaW5lIF9TVERJTlRfTk9fSU5UMzJfVAorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIHF1b3RlIGZyb20gU3VuT1MtNS44IHN5cy9pbnR0eXBlcy5oOgorICogVXNlIGF0IHlvdXIgb3duIHJpc2suICBBcyBvZiBGZWJydWFyeSAxOTk2LCB0aGUgY29tbWl0dGVlIGlzIHNxdWFyZWx5CisgKiBiZWhpbmQgdGhlIGZpeGVkIHNpemVkIHR5cGVzOyB0aGUgImxlYXN0IiBhbmQgImZhc3QiIHR5cGVzIGFyZSBzdGlsbCBiZWluZworICogZGlzY3Vzc2VkLiAgVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlICJmYXN0IiB0eXBlcyBtYXkgYmUgcmVtb3ZlZCBiZWZvcmUKKyAqIHRoZSBzdGFuZGFyZCBpcyBmaW5hbGl6ZWQgaXMgaGlnaCBlbm91Z2ggdGhhdCB0aGV5IGFyZSBub3QgY3VycmVudGx5CisgKiBpbXBsZW1lbnRlZC4KKyAqLworCisjaWYgZGVmaW5lZCBfU1RESU5UX05FRURfSU5UX0xFQVNUX1QKK3R5cGVkZWYgIGludDhfdCAgICBpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmICBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgIGludDMyX3QgICBpbnRfbGVhc3QzMl90OworI2lmZGVmIF9IQVZFX1VJTlQ2NF9UCit0eXBlZGVmICBpbnQ2NF90ICAgaW50X2xlYXN0NjRfdDsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQ4X3QgICB1aW50X2xlYXN0OF90OwordHlwZWRlZiB1aW50MTZfdCAgdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVpbnQzMl90ICB1aW50X2xlYXN0MzJfdDsKKyNpZmRlZiBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiB1aW50NjRfdCAgdWludF9sZWFzdDY0X3Q7CisjZW5kaWYKKyAgLyogbGVhc3QgdHlwZXMgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfU1RESU5UX05FRURfSU5UX0ZBU1RfVAordHlwZWRlZiAgaW50OF90ICAgIGludF9mYXN0OF90OwordHlwZWRlZiAgaW50ICAgICAgIGludF9mYXN0MTZfdDsKK3R5cGVkZWYgIGludDMyX3QgICBpbnRfZmFzdDMyX3Q7CisjaWZkZWYgX0hBVkVfVUlOVDY0X1QKK3R5cGVkZWYgIGludDY0X3QgICBpbnRfZmFzdDY0X3Q7CisjZW5kaWYKKwordHlwZWRlZiB1aW50OF90ICAgdWludF9mYXN0OF90OwordHlwZWRlZiB1bnNpZ25lZCAgdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDMyX3Q7CisjaWZkZWYgX0hBVkVfVUlOVDY0X1QKK3R5cGVkZWYgdWludDY0X3QgIHVpbnRfZmFzdDY0X3Q7CisjZW5kaWYKKyAgLyogZmFzdCB0eXBlcyAqLworI2VuZGlmCisKKyNpZmRlZiBfU1RESU5UX05FRURfSU5UTUFYX1QKKyNpZmRlZiBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiAgaW50NjRfdCAgICAgICBpbnRtYXhfdDsKK3R5cGVkZWYgdWludDY0X3QgICAgICB1aW50bWF4X3Q7CisjZWxzZQordHlwZWRlZiAgICAgICAgICBsb25nICBpbnRtYXhfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50bWF4X3Q7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX1NURElOVF9ORUVEX0lOVFBUUl9UCisjaWZuZGVmIF9faW50cHRyX3RfZGVmaW5lZAorI2RlZmluZSBfX2ludHB0cl90X2RlZmluZWQKKy8qIHdlIGVuY291cmFnZSB1c2luZyAibG9uZyIgdG8gc3RvcmUgcG9pbnRlciB2YWx1ZXMsIG5ldmVyIHVzZSAiaW50IiAhICovCisjaWYgICBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSAyNDIgfHwgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDg0Cit0eXBlZGVmICB1bnNpbmdlZCBpbnQgICB1aW50cHRyX3Q7Cit0eXBlZGVmICAgICAgICAgICBpbnQgICAgaW50cHRyX3Q7CisjZWxpZiBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSAyNDQgfHwgX1NURElOVF9MT05HX01PREVMKzAgPT0gNDQ0Cit0eXBlZGVmICB1bnNpZ25lZCBsb25nICB1aW50cHRyX3Q7Cit0eXBlZGVmICAgICAgICAgICBsb25nICAgaW50cHRyX3Q7CisjZWxpZiBfU1RESU5UX0xPTkdfTU9ERUwrMCA9PSA0NDggJiYgZGVmaW5lZCBfSEFWRV9VSU5UNjRfVAordHlwZWRlZiAgICAgICAgdWludDY0X3QgdWludHB0cl90OwordHlwZWRlZiAgICAgICAgIGludDY0X3QgIGludHB0cl90OworI2Vsc2UgLyogbWF0Y2hlcyB0eXBpY2FsIHN5c3RlbSB0eXBlcyBJTFAzMiBhbmQgTFA2NCAtIGJ1dCBub3QgSVAxNiBvciBMTFA2NCAqLwordHlwZWRlZiAgdW5zaWduZWQgbG9uZyAgdWludHB0cl90OwordHlwZWRlZiAgICAgICAgICAgbG9uZyAgIGludHB0cl90OworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgSVNPIEM5OSBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBpbiBDKysgaW1wbGVtZW50YXRpb25zIHRoZXNlCisgICBzaG91bGQgb25seSBiZSBkZWZpbmVkIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyNpZm5kZWYgVUlOVDMyX0MKKworLyogU2lnbmVkLiAgKi8KKyMgZGVmaW5lIElOVDhfQyhjKSAgICAgIGMKKyMgZGVmaW5lIElOVDE2X0MoYykgICAgIGMKKyMgZGVmaW5lIElOVDMyX0MoYykgICAgIGMKKyMgaWZkZWYgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKKyMgIGRlZmluZSBJTlQ2NF9DKGMpICAgIGMgIyMgTAorIyBlbHNlCisjICBkZWZpbmUgSU5UNjRfQyhjKSAgICBjICMjIExMCisjIGVuZGlmCisKKy8qIFVuc2lnbmVkLiAgKi8KKyMgZGVmaW5lIFVJTlQ4X0MoYykgICAgIGMgIyMgVQorIyBkZWZpbmUgVUlOVDE2X0MoYykgICAgYyAjIyBVCisjIGRlZmluZSBVSU5UMzJfQyhjKSAgICBjICMjIFUKKyMgaWZkZWYgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKKyMgIGRlZmluZSBVSU5UNjRfQyhjKSAgIGMgIyMgVUwKKyMgZWxzZQorIyAgZGVmaW5lIFVJTlQ2NF9DKGMpICAgYyAjIyBVTEwKKyMgZW5kaWYKKworLyogTWF4aW1hbCB0eXBlLiAgKi8KKyMgaWZkZWYgX0hBVkVfTE9OR0xPTkdfVUlOVDY0X1QKKyMgIGRlZmluZSBJTlRNQVhfQyhjKSAgIGMgIyMgTAorIyAgZGVmaW5lIFVJTlRNQVhfQyhjKSAgYyAjIyBVTAorIyBlbHNlCisjICBkZWZpbmUgSU5UTUFYX0MoYykgICBjICMjIExMCisjICBkZWZpbmUgVUlOVE1BWF9DKGMpICBjICMjIFVMTAorIyBlbmRpZgorCisgIC8qIGxpdGVyYWxudW1iZXJzICovCisjZW5kaWYKKyNlbmRpZgorCisvKiBUaGVzZSBsaW1pdHMgYXJlIG1lcmlseSB0aG9zZSBvZiBhIHR3byBjb21wbGVtZW50IGJ5dGUtb3JpZW50ZWQgc3lzdGVtICovCisKKy8qIE1pbmltdW0gb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzLiAgKi8KKyMgZGVmaW5lIElOVDhfTUlOICAgICAgICAgICAgICAgKC0xMjgpCisjIGRlZmluZSBJTlQxNl9NSU4gICAgICAgICAgICAgICgtMzI3NjctMSkKKyMgZGVmaW5lIElOVDMyX01JTiAgICAgICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjIGRlZmluZSBJTlQ2NF9NSU4gICAgICAgICAgICAgICgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4gICovCisjIGRlZmluZSBJTlQ4X01BWCAgICAgICAgICAgICAgICgxMjcpCisjIGRlZmluZSBJTlQxNl9NQVggICAgICAgICAgICAgICgzMjc2NykKKyMgZGVmaW5lIElOVDMyX01BWCAgICAgICAgICAgICAgKDIxNDc0ODM2NDcpCisjIGRlZmluZSBJTlQ2NF9NQVggICAgICAgICAgICAgIChfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgICAgICAoMjU1KQorIyBkZWZpbmUgVUlOVDE2X01BWCAgICAgICAgICAgICAoNjU1MzUpCisjIGRlZmluZSBVSU5UMzJfTUFYICAgICAgICAgICAgICg0Mjk0OTY3Mjk1VSkKKyMgZGVmaW5lIFVJTlQ2NF9NQVggICAgICAgICAgICAgKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisvKiBNaW5pbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgSU5UX0xFQVNUOF9NSU4gICAgICAgICBJTlQ4X01JTgorIyBkZWZpbmUgSU5UX0xFQVNUMTZfTUlOICAgICAgICBJTlQxNl9NSU4KKyMgZGVmaW5lIElOVF9MRUFTVDMyX01JTiAgICAgICAgSU5UMzJfTUlOCisjIGRlZmluZSBJTlRfTEVBU1Q2NF9NSU4gICAgICAgIElOVDY0X01JTgorLyogTWF4aW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIElOVF9MRUFTVDhfTUFYICAgICAgICAgSU5UOF9NQVgKKyMgZGVmaW5lIElOVF9MRUFTVDE2X01BWCAgICAgICAgSU5UMTZfTUFYCisjIGRlZmluZSBJTlRfTEVBU1QzMl9NQVggICAgICAgIElOVDMyX01BWAorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUFYICAgICAgICBJTlQ2NF9NQVgKKworLyogTWF4aW11bSBvZiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgVUlOVF9MRUFTVDhfTUFYICAgICAgICBVSU5UOF9NQVgKKyMgZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggICAgICAgVUlOVDE2X01BWAorIyBkZWZpbmUgVUlOVF9MRUFTVDMyX01BWCAgICAgICBVSU5UMzJfTUFYCisjIGRlZmluZSBVSU5UX0xFQVNUNjRfTUFYICAgICAgIFVJTlQ2NF9NQVgKKworICAvKiBzaG9ydGNpcmN1aXQqLworI2VuZGlmCisgIC8qIG9uY2UgKi8KKyNlbmRpZgorI2VuZGlmCitTVERJTlRfRU9GCitmaQorICAgIGlmIGNtcCAtcyAkYWNfc3RkaW50X2ggJGFjX3N0ZGludCAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgQUNfTVNHX05PVElDRShbJGFjX3N0ZGludF9oIGlzIHVuY2hhbmdlZF0pCisgICAgZWxzZQorICAgICAgYWNfZGlyPWBBU19ESVJOQU1FKFsiJGFjX3N0ZGludF9oIl0pYAorICAgICAgQVNfTUtESVJfUChbIiRhY19kaXIiXSkKKyAgICAgIHJtIC1mICRhY19zdGRpbnRfaAorICAgICAgbXYgJGFjX3N0ZGludCAkYWNfc3RkaW50X2gKKyAgICBmaQorXSxbIyB2YXJpYWJsZXMgZm9yIGNyZWF0ZSBzdGRpbnQuaCByZXBsYWNlbWVudAorUEFDS0FHRT0iJFBBQ0tBR0UiCitWRVJTSU9OPSIkVkVSU0lPTiIKK2FjX3N0ZGludF9oPSIkYWNfc3RkaW50X2giCitfYWNfc3RkaW50X2g9QVNfVFJfQ1BQKF8kUEFDS0FHRS0kYWNfc3RkaW50X2gpCithY19jdl9zdGRpbnRfbWVzc2FnZT0iJGFjX2N2X3N0ZGludF9tZXNzYWdlIgorYWNfY3ZfaGVhZGVyX3N0ZGludF90PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF90IgorYWNfY3ZfaGVhZGVyX3N0ZGludF94PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF94IgorYWNfY3ZfaGVhZGVyX3N0ZGludF9vPSIkYWNfY3ZfaGVhZGVyX3N0ZGludF9vIgorYWNfY3ZfaGVhZGVyX3N0ZGludF91PSIkYWNfY3ZfaGVhZGVyX3N0ZGludF91IgorYWNfY3ZfdHlwZV91aW50NjRfdD0iJGFjX2N2X3R5cGVfdWludDY0X3QiCithY19jdl90eXBlX3VfaW50NjRfdD0iJGFjX2N2X3R5cGVfdV9pbnQ2NF90IgorYWNfY3ZfY2hhcl9kYXRhX21vZGVsPSIkYWNfY3ZfY2hhcl9kYXRhX21vZGVsIgorYWNfY3ZfbG9uZ19kYXRhX21vZGVsPSIkYWNfY3ZfbG9uZ19kYXRhX21vZGVsIgorYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90PSIkYWNfY3ZfdHlwZV9pbnRfbGVhc3QzMl90IgorYWNfY3ZfdHlwZV9pbnRfZmFzdDMyX3Q9IiRhY19jdl90eXBlX2ludF9mYXN0MzJfdCIKK2FjX2N2X3R5cGVfaW50bWF4X3Q9IiRhY19jdl90eXBlX2ludG1heF90IgorXSkKK10pCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9tNC9kYXN0Lm00IGIvaXBlcmYtMi4wLjUvbTQvZGFzdC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjcyOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvbTQvZGFzdC5tNApAQCAtMCwwICsxLDE3OCBAQAorCitkbmwgREFTVF9DSEVDS19CT09MCitkbmwgQ2hlY2sgZm9yIGJvb2wgc3VwcG9ydC4gRGVmaW5lcyBib29sLCB0cnVlLCBhbmQgZmFsc2UuCisKK0FIX1RFTVBMQVRFKFtIQVZFX1BPU0lYX1RIUkVBRF0sIFtdKQorQUhfVEVNUExBVEUoW19SRUVOVFJBTlRdLCBbXSkKK0FIX1RFTVBMQVRFKFtzc2l6ZV90XSwgW0RlZmluZSB0byAiaW50IiBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS5dKQorQUhfVEVNUExBVEUoW2Jvb2xdKQorQUhfVEVNUExBVEUoW3RydWVdKQorQUhfVEVNUExBVEUoW2ZhbHNlXSkKKworQUNfREVGVU4oREFTVF9DSEVDS19CT09MLCBbCisKK0FDX0NIRUNLX1NJWkVPRihib29sKQoraWYgdGVzdCAiJGFjX2N2X3NpemVvZl9ib29sIiA9IDAgOyB0aGVuCisgIEFDX0RFRklORShib29sLCBpbnQpCitmaQorCitBQ19DQUNIRV9DSEVDSyhpZiB0cnVlIGlzIGRlZmluZWQsIGFjX2N2X2hhdmVfdHJ1ZSwKKyBbQUNfTEFOR19TQVZFCisgIEFDX0xBTkdfQ1BMVVNQTFVTCisgIEFDX1RSWV9DT01QSUxFKFtdLAorICAgIFt1bnNpZ25lZCBpbnQgaSA9IHRydWVdLAorICBhY19jdl9oYXZlX3RydWU9eWVzLAorICBhY19jdl9oYXZlX3RydWU9bm8pCisgIEFDX0xBTkdfUkVTVE9SRQorIF0pCisKK2lmIHRlc3QgIiRhY19jdl9oYXZlX3RydWUiICE9IHllcyA7IHRoZW4KKyAgQUNfREVGSU5FKHRydWUsICAxKQorICBBQ19ERUZJTkUoZmFsc2UsIDApCitmaQorCitdKQorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIERBU1RfUkVQTEFDRV9UWVBFKCB0eXBlLCBzaXplb2YgKQorZG5sIENoZWNrIGZvciB0aGUgdHlwZSBhcyBBQ19DSEVDS19UWVBFIGRvZXMuIERlZmluZSBIQVZFXzx0eXBlPgorZG5sIGlmIHR5cGUgZXhpc3RzOyBkb24ndCBkZWZpbmUgPHR5cGU+IHRvIGFueXRoaW5nIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCitkbmwgVXNlZnVsIGlmIHRoZXJlIGlzIG5vIHdlbGwtZGVmaW5lZCBkZWZhdWx0IHR5cGUsIHN1Y2ggYXMgaW50MzJfdAorCitBQ19ERUZVTihEQVNUX1JFUExBQ0VfVFlQRSwgWworCitBQ19DQUNIRV9DSEVDSyhmb3IgJDEsIGFjX2N2X3R5cGVfJDEsCisgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1skYWNfaW5jbHVkZXNfZGVmYXVsdF1dLAorICAgIFtbJDEgZm9vXV0pXSwKKyAgYWNfY3ZfdHlwZV8kMT15ZXMsCisgIGFjX2N2X3R5cGVfJDE9bm8pCisKK2lmIHRlc3QgJGFjX2N2X3R5cGVfJDEgIT0geWVzIDsgdGhlbgorICBpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2NoYXIiID0gJDI7IHRoZW4KKyAgICBhY19jdl90eXBlXyQxPSJjaGFyIgorICBlbGlmIHRlc3QgIiRhY19jdl9zaXplb2Zfc2hvcnQiID0gJDI7IHRoZW4KKyAgICBhY19jdl90eXBlXyQxPSJzaG9ydCIKKyAgZWxpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2ludCIgPSAkMjsgdGhlbgorICAgIGFjX2N2X3R5cGVfJDE9ImludCIKKyAgZWxpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX2xvbmciID0gJDI7IHRoZW4KKyAgICBhY19jdl90eXBlXyQxPSJsb25nIgorICBlbGlmIHRlc3QgIiRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA9ICQyOyB0aGVuCisgICAgYWNfY3ZfdHlwZV8kMT0ibG9uZyBsb25nIgorICBmaQorZmkpCisKK2lmIHRlc3QgIiRhY19jdl90eXBlXyQxIiAhPSBubzsgdGhlbgorICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV8kMSIgIT0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKCQxLCAkYWNfY3ZfdHlwZV8kMSkKKyAgZmkKKyAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfYGVjaG8gJDEgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgKQorZmkKKworXSkKKworQUNfREVGVU4oREFTVF9SRVBMQUNFX1RZUEVfVU5TSUdORUQsIFsKKworQUNfQ0FDSEVfQ0hFQ0soZm9yICQxLCBhY19jdl90eXBlXyQxLAorICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbJGFjX2luY2x1ZGVzX2RlZmF1bHRdXSwKKyAgICBbWyQxIGZvb11dKV0sCisgIGFjX2N2X3R5cGVfJDE9eWVzLAorICBhY19jdl90eXBlXyQxPW5vKQorCitpZiB0ZXN0ICRhY19jdl90eXBlXyQxICE9IHllcyA7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9jaGFyIiA9ICQyOyB0aGVuCisgICAgYWNfY3ZfdHlwZV8kMT0idW5zaWduZWQgY2hhciIKKyAgZWxpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX3Nob3J0IiA9ICQyOyB0aGVuCisgICAgYWNfY3ZfdHlwZV8kMT0idW5zaWduZWQgc2hvcnQiCisgIGVsaWYgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9pbnQiID0gJDI7IHRoZW4KKyAgICBhY19jdl90eXBlXyQxPSJ1bnNpZ25lZCBpbnQiCisgIGVsaWYgdGVzdCAiJGFjX2N2X3NpemVvZl91bnNpZ25lZF9sb25nIiA9ICQyOyB0aGVuCisgICAgYWNfY3ZfdHlwZV8kMT0idW5zaWduZWQgbG9uZyIKKyAgZWxpZiB0ZXN0ICIkYWNfY3Zfc2l6ZW9mX3Vuc2lnbmVkX2xvbmdfbG9uZyIgPSAkMjsgdGhlbgorICAgIGFjX2N2X3R5cGVfJDE9InVuc2lnbmVkIGxvbmcgbG9uZyIKKyAgZmkKK2ZpKQorCitpZiB0ZXN0ICIkYWNfY3ZfdHlwZV8kMSIgIT0gbm87IHRoZW4KKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfJDEiICE9IHllczsgdGhlbgorICAgIEFDX0RFRklORV9VTlFVT1RFRCgkMSwgJGFjX2N2X3R5cGVfJDEpCisgIGZpCisgIEFDX0RFRklORV9VTlFVT1RFRChIQVZFX2BlY2hvICQxIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYCkKK2ZpCisKK10pCisKK2RubCBEQVNUX0NIRUNLX0FSRworZG5sIENoZWNrIGZvciB0aGUgM3JkIGFyZ3VlbWVudCB0byBhY2NlcHQKKworQUNfREVGVU4oREFTVF9BQ0NFUFRfQVJHLCBbCisgIGlmIHRlc3QgLXogIiRhY19jdl9hY2NlcHRfYXJnIiA7IHRoZW4KKyAgICBBQ19MQU5HX1NBVkUKKyAgICBBQ19MQU5HX0NQTFVTUExVUworCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKKyAgICAgIFtbJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgICAgICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPl1dLAorICAgICAgW1skMSBsZW5ndGg7CisgICAgICAgYWNjZXB0KCAwLCAwLCAmbGVuZ3RoICk7XV0pXSwKKyAgICBhY19jdl9hY2NlcHRfYXJnPSQxKQorCisgICAgQUNfTEFOR19SRVNUT1JFCisgIGZpCitdKQorCitkbmwgQ29uZmlndXJlIHBhdGhzIGZvciBXZWIxMDAuICBCYXNlZCBvZmYgb2YgT3dlbiBUYXlsb3IncyBndGsubTQgZnJvbSBndGsrLTEuMi4xMAorZG5sIEFNX1BBVEhfV0VCMTAwKFtFWEFDVC1WRVJTSU9OIFssIEFDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV1dKQorZG5sIFRlc3QgZm9yIFdlYjEwMCwgYW5kIGRlZmluZSBXRUIxMDBfQ0ZMQUdTIGFuZCBXRUIxMDBfTElCUworZG5sCitBQ19ERUZVTihBTV9QQVRIX1dFQjEwMCwKK1sKK3dlYjEwMF9zdWNjZXNzPSIiCisKK0FDX1BBVEhfUFJPRyhbV0VCMTAwX0NPTkZJR10sIFt3ZWIxMDAtY29uZmlnXSwgW25vXSkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBXZWIxMDApCisKK2lmIHRlc3QgIiRXRUIxMDBfQ09ORklHIiAhPSAibm8iOyB0aGVuCisgIFdFQjEwMF9DRkxBR1M9YCRXRUIxMDBfQ09ORklHIC0tY2ZsYWdzYAorICBXRUIxMDBfTElCUz1gJFdFQjEwMF9DT05GSUcgLS1saWJzYAorICBBQ19NU0dfUkVTVUxUKHllcykKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKKyAgZWNobyAiKioqIFRoZSB3ZWIxMDAtY29uZmlnIHNjcmlwdCBpbnN0YWxsZWQgYnkgV2ViMTAwIGNvdWxkIG5vdCBiZSBmb3VuZCIKKyAgZWNobyAiKioqIElmIFdlYjEwMCB3YXMgaW5zdGFsbGVkIGluIFBSRUZJWCwgbWFrZSBzdXJlIFBSRUZJWC9iaW4gaXMgaW4iCisgIGVjaG8gIioqKiB5b3VyIHBhdGgsIG9yIHNldCB0aGUgV0VCMTAwX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUiCisgIGVjaG8gIioqKiBmdWxsIHBhdGggdG8gd2ViMTAwLWNvbmZpZyIKKyAgd2ViMTAwX3N1Y2Nlc3M9Im5vIgorZmkKKworaWYgdGVzdCB4JHdlYjEwMF9zdWNjZXNzID0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JDEiICE9ICJ4IjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhmb3IgV2ViMTAwIC0gdmVyc2lvbiAkMSkKKworICAgIFdFQjEwMF9WRVJTSU9OPWAkV0VCMTAwX0NPTkZJRyAtLXZlcnNpb25gCisgICAgaWYgdGVzdCAiJFdFQjEwMF9WRVJTSU9OIiA9ICIkMSI7IHRoZW4KKyAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgIGVsc2UKKyAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICBlY2hvICIqKiogVGhlIHJlcXVlc3RlZCAoJDEpIGFuZCBpbnN0YWxsZWQgKCRXRUIxMDBfVkVSU0lPTikgdmVyc2lvbnMiCisgICAgICBlY2hvICIqKiogb2YgV2ViMTAwIGRvIG5vdCBtYXRjaC4iCisgICAgICB3ZWIxMDBfc3VjY2Vzcz0ibm8iCisgICAgZmkKKyAgZmkKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHg7IHRoZW4KKyAgd2ViMTAwX3N1Y2Nlc3M9InllcyIKK2ZpCisKK2lmIHRlc3QgeCR3ZWIxMDBfc3VjY2VzcyA9IHh5ZXM7IHRoZW4KKyAgbTRfaWYoWyQyXSwgW10sIFs6XSwgWyQyXSkKK2Vsc2UKKyAgV0VCMTAwX0NGTEFHUz0iIgorICBXRUIxMDBfTElCUz0iIgorICBtNF9pZihbJDNdLCBbXSwgWzpdLCBbJDNdKQorZmkKKworQUNfU1VCU1QoV0VCMTAwX0NGTEFHUykKK0FDX1NVQlNUKFdFQjEwMF9MSUJTKQorXSkKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L21hbi9NYWtlZmlsZS5hbSBiL2lwZXJmLTIuMC41L21hbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDk3YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvbWFuL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMiBAQAorbWFuX01BTlMgPSBpcGVyZi4xCitkaXN0X21hbl9NQU5TID0gJChtYW5fTUFOUykKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L21hbi9NYWtlZmlsZS5pbiBiL2lwZXJmLTIuMC41L21hbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzBiZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvbWFuL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMzY1IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNiBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4uCithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitJTlNUQUxMID0gQElOU1RBTExACitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBtYW4KK0RJU1RfQ09NTU9OID0gJChkaXN0X21hbl9NQU5TKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvbTQvYXhfY3JlYXRlX3N0ZGludF9oLm00IFwKKwkkKHRvcF9zcmNkaXIpL200L2Rhc3QubTQgJCh0b3Bfc3JjZGlyKS9tNC9hY3hfcHRocmVhZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CittYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChtYW4xZGlyKSIKK05ST0ZGID0gbnJvZmYKK01BTlMgPSAkKGRpc3RfbWFuX01BTlMpICQobWFuX01BTlMpCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1ERVBfRkFMU0UgPSBAQU1ERVBfRkFMU0VACitBTURFUF9UUlVFID0gQEFNREVQX1RSVUVACitBTVRBUiA9IEBBTVRBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQVEhSRUFEX0NDID0gQFBUSFJFQURfQ0NACitQVEhSRUFEX0NGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AKK1BUSFJFQURfTElCUyA9IEBQVEhSRUFEX0xJQlNACitSQU5MSUIgPSBAUkFOTElCQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1RSSVBfQkVHSU4gPSBAU1RSSVBfQkVHSU5ACitTVFJJUF9EVU1NWSA9IEBTVFJJUF9EVU1NWUAKK1NUUklQX0VORCA9IEBTVFJJUF9FTkRACitWRVJTSU9OID0gQFZFUlNJT05ACitXRUIxMDBfQ0ZMQUdTID0gQFdFQjEwMF9DRkxBR1NACitXRUIxMDBfQ09ORklHID0gQFdFQjEwMF9DT05GSUdACitXRUIxMDBfTElCUyA9IEBXRUIxMDBfTElCU0AKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjeF9wdGhyZWFkX2NvbmZpZyA9IEBhY3hfcHRocmVhZF9jb25maWdACithbV9fZmFzdGRlcENDX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ0NfRkFMU0VACithbV9fZmFzdGRlcENDX1RSVUUgPSBAYW1fX2Zhc3RkZXBDQ19UUlVFQAorYW1fX2Zhc3RkZXBDWFhfRkFMU0UgPSBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACithbV9fZmFzdGRlcENYWF9UUlVFID0gQGFtX19mYXN0ZGVwQ1hYX1RSVUVACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorbWFuX01BTlMgPSBpcGVyZi4xCitkaXN0X21hbl9NQU5TID0gJChtYW5fTUFOUykKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIG1hbi9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiAgbWFuL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAordW5pbnN0YWxsLWluZm8tYW06CitpbnN0YWxsLW1hbjE6ICQobWFuMV9NQU5TKSAkKG1hbl9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuMWRpcikiIHx8ICQobWtkaXJfcCkgIiQoREVTVERJUikkKG1hbjFkaXIpIgorCUBsaXN0PSckKG1hbjFfTUFOUykgJChkaXN0X21hbjFfTUFOUykgJChub2Rpc3RfbWFuMV9NQU5TKSc7IFwKKwlsMj0nJChtYW5fTUFOUykgJChkaXN0X21hbl9NQU5TKSAkKG5vZGlzdF9tYW5fTUFOUyknOyBcCisJZm9yIGkgaW4gJCRsMjsgZG8gXAorCSAgY2FzZSAiJCRpIiBpbiBcCisJICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICQoc3JjZGlyKS8kJGk7IHRoZW4gZmlsZT0kKHNyY2RpcikvJCRpOyBcCisJICBlbHNlIGZpbGU9JCRpOyBmaTsgXAorCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCisJICBjYXNlICIkJGV4dCIgaW4gXAorCSAgICAxKikgOzsgXAorCSAgICAqKSBleHQ9JzEnIDs7IFwKKwkgIGVzYWM7IFwKKwkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgLWUgJ3MvXi4qXC8vLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKKwkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZmlsZScgJyQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCciOyBcCisJICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKKwlkb25lCit1bmluc3RhbGwtbWFuMToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKG1hbjFfTUFOUykgJChkaXN0X21hbjFfTUFOUykgJChub2Rpc3RfbWFuMV9NQU5TKSc7IFwKKwlsMj0nJChtYW5fTUFOUykgJChkaXN0X21hbl9NQU5TKSAkKG5vZGlzdF9tYW5fTUFOUyknOyBcCisJZm9yIGkgaW4gJCRsMjsgZG8gXAorCSAgY2FzZSAiJCRpIiBpbiBcCisJICAgICouMSopIGxpc3Q9IiQkbGlzdCAkJGkiIDs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKKwkgIGNhc2UgIiQkZXh0IiBpbiBcCisJICAgIDEqKSA7OyBcCisJICAgICopIGV4dD0nMScgOzsgXAorCSAgZXNhYzsgXAorCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAtZSAncy9eLipcLy8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAorCSAgZWNobyAiIHJtIC1mICckKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKKwlkb25lCit0YWdzOiBUQUdTCitUQUdTOgorCitjdGFnczogQ1RBR1MKK0NUQUdTOgorCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGNhc2UgJCRmaWxlIGluIFwKKwkgICAgJChzcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKwkgICAgJCh0b3Bfc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfCJgOzsgXAorCSAgZXNhYzsgXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgZGlyPWBlY2hvICIkJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgaWYgdGVzdCAiJCRkaXIiICE9ICIkJGZpbGUiICYmIHRlc3QgIiQkZGlyIiAhPSAiLiI7IHRoZW4gXAorCSAgICBkaXI9Ii8kJGRpciI7IFwKKwkgICAgJChta2Rpcl9wKSAiJChkaXN0ZGlyKSQkZGlyIjsgXAorCSAgZWxzZSBcCisJICAgIGRpcj0nJzsgXAorCSAgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1wUiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLXBSICQkZC8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKE1BTlMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChtYW4xZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKG1rZGlyX3ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjogaW5zdGFsbC1tYW4xCisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLW1hbgorCit1bmluc3RhbGwtbWFuOiB1bmluc3RhbGwtbWFuMQorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLW1hbjEgaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIFwKKwlpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCBcCisJdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbjEKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvbWFuL2lwZXJmLjEgYi9pcGVyZi0yLjAuNS9tYW4vaXBlcmYuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU0Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvbWFuL2lwZXJmLjEKQEAgLTAsMCArMSwxNDggQEAKKy5USCBJUEVSRiAxICJBUFJJTCAyMDA4IiBOTEFOUi9EQVNUICJVc2VyIE1hbnVhbHMiCisuU0ggTkFNRQoraXBlcmYgXC0gcGVyZm9ybSBuZXR3b3JrIHRocm91Z2hwdXQgdGVzdHMKKy5TSCBTWU5PUFNJUworLkIgaXBlcmYgLXMgWworLkkgb3B0aW9ucworLkIgXQorCisuQiBpcGVyZiAtYyAKKy5JIHNlcnZlcgorLkIgWworLkkgb3B0aW9ucworLkIgXQorCisuQiBpcGVyZiAtdSAtcyBbCisuSSBvcHRpb25zCisuQiBdCisKKy5CIGlwZXJmIC11IC1jIAorLkkgc2VydmVyCisuQiBbCisuSSBvcHRpb25zCisuQiBdCisuU0ggREVTQ1JJUFRJT04KK2lwZXJmIGlzIGEgdG9vbCBmb3IgcGVyZm9ybWluZyBuZXR3b3JrIHRocm91Z2hwdXQgbWVhc3VyZW1lbnRzLiAgSXQgY2FuIHRlc3QKK2VpdGhlciBUQ1Agb3IgVURQIHRocm91Z2hwdXQuICBUbyBwZXJmb3JtIGFuIGlwZXJmIHRlc3QgdGhlIHVzZXIgbXVzdAorZXN0YWJsaXNoIGJvdGggYSBzZXJ2ZXIgKHRvIGRpc2NhcmQgdHJhZmZpYykgYW5kIGEgY2xpZW50ICh0byBnZW5lcmF0ZQordHJhZmZpYykuICAKKy5TSCAiR0VORVJBTCBPUFRJT05TIgorLlRQCisuQlIgLWYgIiwgIiAtLWZvcm1hdCAiICIKK1trbUtNXSAgIGZvcm1hdCB0byByZXBvcnQ6IEtiaXRzLCBNYml0cywgS0J5dGVzLCBNQnl0ZXMKKy5UUAorLkJSIC1oICIsICIgLS1oZWxwICIgIgorcHJpbnQgYSBoZWxwIHN5bm9wc2lzCisuVFAKKy5CUiAtaSAiLCAiIC0taW50ZXJ2YWwgIiBcZkluXGZSIgorcGF1c2UgXGZJblxmUiBzZWNvbmRzIGJldHdlZW4gcGVyaW9kaWMgYmFuZHdpZHRoIHJlcG9ydHMKKy5UUAorLkJSIC1sICIsICIgLS1sZW4gIiBcZkluXGZSW0tNXSIKK3NldCBsZW5ndGggcmVhZC93cml0ZSBidWZmZXIgdG8gXGZJblxmUiAoZGVmYXVsdCA4IEtCKQorLlRQCisuQlIgLW0gIiwgIiAtLXByaW50X21zcyAiICIKK3ByaW50IFRDUCBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAoTVRVIC0gVENQL0lQIGhlYWRlcikKKy5UUAorLkJSIC1vICIsICIgLS1vdXRwdXQgIiA8ZmlsZW5hbWU+Igorb3V0cHV0IHRoZSByZXBvcnQgb3IgZXJyb3IgbWVzc2FnZSB0byB0aGlzIHNwZWNpZmllZCBmaWxlCisuVFAKKy5CUiAtcCAiLCAiIC0tcG9ydCAiIFxmSW5cZlIiCitzZXQgc2VydmVyIHBvcnQgdG8gbGlzdGVuIG9uL2Nvbm5lY3QgdG8gdG8gXGZJblxmUiAoZGVmYXVsdCA1MDAxKQorLlRQCisuQlIgLXUgIiwgIiAtLXVkcCAiICIKK3VzZSBVRFAgcmF0aGVyIHRoYW4gVENQCisuVFAKKy5CUiAtdyAiLCAiIC0td2luZG93ICIgXGZJblxmUltLTV0iCitUQ1Agd2luZG93IHNpemUgKHNvY2tldCBidWZmZXIgc2l6ZSkKKy5UUAorLkJSIC1CICIsICIgLS1iaW5kICIgPGhvc3Q+IgorYmluZCB0byA8aG9zdD4sIGFuIGludGVyZmFjZSBvciBtdWx0aWNhc3QgYWRkcmVzcworLlRQCisuQlIgLUMgIiwgIiAtLWNvbXBhdGliaWxpdHkgIiAiCitmb3IgdXNlIHdpdGggb2xkZXIgdmVyc2lvbnMgZG9lcyBub3Qgc2VudCBleHRyYSBtc2dzCisuVFAKKy5CUiAtTSAiLCAiIC0tbXNzICIgXGZJblxmUiIKK3NldCBUQ1AgbWF4aW11bSBzZWdtZW50IHNpemUgKE1UVSAtIDQwIGJ5dGVzKQorLlRQCisuQlIgLU4gIiwgIiAtLW5vZGVsYXkgIiAiCitzZXQgVENQIG5vIGRlbGF5LCBkaXNhYmxpbmcgTmFnbGUncyBBbGdvcml0aG0KKy5UUAorLkJSIC12ICIsICIgLS12ZXJzaW9uICIgIgorcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgcXVpdAorLlRQCisuQlIgLVYgIiwgIiAtLUlQdjZWZXJzaW9uICIgIgorU2V0IHRoZSBkb21haW4gdG8gSVB2NgorLlRQCisuQlIgLXggIiwgIiAtLXJlcG9ydGV4Y2x1ZGUgIiAiCitbQ0RNU1ZdICAgZXhjbHVkZSBDKGNvbm5lY3Rpb24pIEQoZGF0YSkgTShtdWx0aWNhc3QpIFMoc2V0dGluZ3MpIFYoc2VydmVyKSByZXBvcnRzCisuVFAKKy5CUiAteSAiLCAiIC0tcmVwb3J0c3R5bGUgIiBDfGMiCitpZiBzZXQgdG8gQyBvciBjIHJlcG9ydCByZXN1bHRzIGFzIENTViAoY29tbWEgc2VwYXJhdGVkIHZhbHVlcykKKy5TSCAiU0VSVkVSIFNQRUNJRklDIE9QVElPTlMiCisuVFAKKy5CUiAtcyAiLCAiIC0tc2VydmVyICIgIgorcnVuIGluIHNlcnZlciBtb2RlCisuVFAKKy5CUiAtVSAiLCAiIC0tc2luZ2xlX3VkcCAiICIKK3J1biBpbiBzaW5nbGUgdGhyZWFkZWQgVURQIG1vZGUKKy5UUAorLkJSIC1EICIsICIgLS1kYWVtb24gIiAiCitydW4gdGhlIHNlcnZlciBhcyBhIGRhZW1vbgorLlNIICJDTElFTlQgU1BFQ0lGSUMgT1BUSU9OUyIKKy5UUAorLkJSIC1iICIsICIgLS1iYW5kd2lkdGggIiBcZkluXGZSW0tNXSIKK3NldCB0YXJnZXQgYmFuZHdpZHRoIHRvIFxmSW5cZlIgYml0cy9zZWMgKGRlZmF1bHQgMSBNYml0L3NlYykuCitUaGlzIHNldHRpbmcgcmVxdWlyZXMgVURQICgtdSkuCisuVFAKKy5CUiAtYyAiLCAiIC0tY2xpZW50ICIgPGhvc3Q+IgorcnVuIGluIGNsaWVudCBtb2RlLCBjb25uZWN0aW5nIHRvIDxob3N0PgorLlRQCisuQlIgLWQgIiwgIiAtLWR1YWx0ZXN0ICIgIgorRG8gYSBiaWRpcmVjdGlvbmFsIHRlc3Qgc2ltdWx0YW5lb3VzbHkKKy5UUAorLkJSIC1uICIsICIgLS1udW0gIiBcZkluXGZSW0tNXSIKK251bWJlciBvZiBieXRlcyB0byB0cmFuc21pdCAoaW5zdGVhZCBvZiAtdCkKKy5UUAorLkJSIC1yICIsICIgLS10cmFkZW9mZiAiICIKK0RvIGEgYmlkaXJlY3Rpb25hbCB0ZXN0IGluZGl2aWR1YWxseQorLlRQCisuQlIgLXQgIiwgIiAtLXRpbWUgIiBcZkluXGZSIgordGltZSBpbiBzZWNvbmRzIHRvIHRyYW5zbWl0IGZvciAoZGVmYXVsdCAxMCBzZWNzKQorLlRQCisuQlIgLUYgIiwgIiAtLWZpbGVpbnB1dCAiIDxuYW1lPiIKK2lucHV0IHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkIGZyb20gYSBmaWxlCisuVFAKKy5CUiAtSSAiLCAiIC0tc3RkaW4gIiAiCitpbnB1dCB0aGUgZGF0YSB0byBiZSB0cmFuc21pdHRlZCBmcm9tIHN0ZGluCisuVFAKKy5CUiAtTCAiLCAiIC0tbGlzdGVucG9ydCAiIFxmSW5cZlIiCitwb3J0IHRvIHJlY2lldmUgYmlkaXJlY3Rpb25hbCB0ZXN0cyBiYWNrIG9uCisuVFAKKy5CUiAtUCAiLCAiIC0tcGFyYWxsZWwgIiBcZkluXGZSIgorbnVtYmVyIG9mIHBhcmFsbGVsIGNsaWVudCB0aHJlYWRzIHRvIHJ1bgorLlRQCisuQlIgLVQgIiwgIiAtLXR0bCAiIFxmSW5cZlIiCit0aW1lLXRvLWxpdmUsIGZvciBtdWx0aWNhc3QgKGRlZmF1bHQgMSkKKy5UUAorLkJSIC1aICIsICIgLS1saW51eC1jb25nZXN0aW9uICIgPGFsZ28+Igorc2V0IFRDUCBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtIChMaW51eCBvbmx5KQorLlNIIEVOVklST05NRU5UCisuVFAKKy5CUiBUQ1BfV0lORE9XX1NJWkUKK0NvbnRyb2xzIHRoZSBzaXplIG9mIFRDUCBidWZmZXJzLgorLlNIIERJQUdOT1NUSUNTCitUaGlzIHNlY3Rpb24gbmVlZHMgdG8gYmUgZmlsbGVkIGluLgorLlNIIEJVR1MKK0V4aXQgc3RhdHVzZXMgYXJlIGluY29uc2lzdGVudC4KK1RoZSB0aHJlYWRpbmcgaW1wbGVtZW50YXRpb24gaXMgcmF0aGVyIGhlaW5vdXMuCisuU0ggQVVUSE9SUworSXBlcmYgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNYXJrIEdhdGVzIGFuZCBBbGV4IFdhcnNoYXZza3kuCitNYW4gcGFnZSBhbmQgbWFpbnRlbmNlIGJ5IEpvbiBEdWdhbiA8amR1Z2FuIGF0IHgxMDI0IGRvdCBuZXQ+LgorT3RoZXIgY29udHJpYnV0aW9ucyBmcm9tIEFqYXkgVGlydW1hbGEsIEppbSBGZXJndXNvbiwKK0ZlbmcgUWluLAorS2V2aW4gR2liYnMsCitKb2huIEVzdGFicm9vayA8amVzdGFicm8gYXQgbmNzYS51aXVjLmVkdT4sCitBbmRyZXcgR2FsbGF0aW4gPGdhbGxhdGluIGF0IGdtYWlsLmNvbT4sCitTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlciBhdCBsaW51eC1mb3VuZGF0aW9uLm9yZz4KKy5TSCAiU0VFIEFMU08iCitodHRwOi8vaXBlcmYuc291cmNlZm9yZ2UubmV0LwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvbWlzc2luZyBiL2lwZXJmLTIuMC41L21pc3NpbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDllZGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L21pc3NpbmcKQEAgLTAsMCArMSwzNTcgQEAKKyMhIC9iaW4vc2gKKyMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCisKK3NjcmlwdHZlcnNpb249MjAwNS0wMi0wOC4yMgorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNQorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEZyYW4sY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPiwgMTk5Ni4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICBleGl0IDEKK2ZpCisKK3J1bj06CisKKyMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKKyMgc3JjZGlyIGFscmVhZHkuCitpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCitlbHNlCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KK2ZpCisKK21zZz0ibWlzc2luZyBvbiB5b3VyIHN5c3RlbSIKKworY2FzZSAiJDEiIGluCistLXJ1bikKKyAgIyBUcnkgdG8gcnVuIHJlcXVlc3RlZCBwcm9ncmFtLCBhbmQganVzdCBleGl0IGlmIGl0IHN1Y2NlZWRzLgorICBydW49CisgIHNoaWZ0CisgICIkQCIgJiYgZXhpdCAwCisgICMgRXhpdCBjb2RlIDYzIG1lYW5zIHZlcnNpb24gbWlzbWF0Y2guICBUaGlzIG9mdGVuIGhhcHBlbnMKKyAgIyB3aGVuIHRoZSB1c2VyIHRyeSB0byB1c2UgYW4gYW5jaWVudCB2ZXJzaW9uIG9mIGEgdG9vbCBvbgorICAjIGEgZmlsZSB0aGF0IHJlcXVpcmVzIGEgbWluaW11bSB2ZXJzaW9uLiAgSW4gdGhpcyBjYXNlIHdlCisgICMgd2Ugc2hvdWxkIHByb2NlZWQgaGFzIGlmIHRoZSBwcm9ncmFtIGhhZCBiZWVuIGFic2VudCwgb3IKKyAgIyBpZiAtLXJ1biBoYWRuJ3QgYmVlbiBwYXNzZWQuCisgIGlmIHRlc3QgJD8gPSA2MzsgdGhlbgorICAgIHJ1bj06CisgICAgbXNnPSJwcm9iYWJseSB0b28gb2xkIgorICBmaQorICA7OworCisgIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKyAgICBlY2hvICJcCiskMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KKworSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgorZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC0tcnVuICAgICAgICAgICB0cnkgdG8gcnVuIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgZW11bGF0ZSBpdCBpZiBpdCBmYWlscworCitTdXBwb3J0ZWQgUFJPR1JBTSB2YWx1ZXM6CisgIGFjbG9jYWwgICAgICB0b3VjaCBmaWxlIFxgYWNsb2NhbC5tNCcKKyAgYXV0b2NvbmYgICAgIHRvdWNoIGZpbGUgXGBjb25maWd1cmUnCisgIGF1dG9oZWFkZXIgICB0b3VjaCBmaWxlIFxgY29uZmlnLmguaW4nCisgIGF1dG9tYWtlICAgICB0b3VjaCBhbGwgXGBNYWtlZmlsZS5pbicgZmlsZXMKKyAgYmlzb24gICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQorICBmbGV4ICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBoZWxwMm1hbiAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgdGFyICAgICAgICAgIHRyeSB0YXIsIGdudXRhciwgZ3RhciwgdGhlbiB0YXIgd2l0aG91dCBub24tcG9ydGFibGUgZmxhZ3MKKyAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXQorCitTZW5kIGJ1ZyByZXBvcnRzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKKyAgICBlY2hvICJtaXNzaW5nICRzY3JpcHR2ZXJzaW9uIChHTlUgQXV0b21ha2UpIgorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCitlc2FjCisKKyMgTm93IGV4aXQgaWYgd2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4gIEFsc28gZXhpdCBub3cgaWYgd2UKKyMgZG9uJ3QgaGF2ZSBpdCBhbmQgLS12ZXJzaW9uIHdhcyBwYXNzZWQgKG1vc3QgbGlrZWx5IHRvIGRldGVjdAorIyB0aGUgcHJvZ3JhbSkuCitjYXNlICIkMSIgaW4KKyAgbGV4fHlhY2MpCisgICAgIyBOb3QgR05VIHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgLS12ZXJzaW9uLgorICAgIDs7CisKKyAgdGFyKQorICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCisgICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgorICAgICAgIGV4aXQgMQorICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KKyAgICAgICBleGl0IDEKKyAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgorICAgICAgICMgQ291bGQgbm90IHJ1biAtLXZlcnNpb24gb3IgLS1oZWxwLiAgVGhpcyBpcyBwcm9iYWJseSBzb21lb25lCisgICAgICAgIyBydW5uaW5nIGAkVE9PTCAtLXZlcnNpb24nIG9yIGAkVE9PTCAtLWhlbHAnIHRvIGNoZWNrIHdoZXRoZXIKKyAgICAgICAjICRUT09MIGV4aXN0cyBhbmQgbm90IGtub3dpbmcgJFRPT0wgdXNlcyBtaXNzaW5nLgorICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgOzsKK2VzYWMKKworIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKKyMgdHJ5IHRvIGVtdWxhdGUgaXQuCitjYXNlICIkMSIgaW4KKyAgYWNsb2NhbCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50CisgICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCisgICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgJHtjb25maWd1cmVfYWN9YAorICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgorICAgIHRvdWNoX2ZpbGVzPQorICAgIGZvciBmIGluICRmaWxlczsgZG8KKyAgICAgIGNhc2UgIiRmIiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCisgICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KKyAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAorCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8CisJICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCisgICAgOzsKKworICBhdXRvbTR0ZSkKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCisgICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0WyA9XSpcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW9bIF0qXChbXiBdKlwpLiovXDEvcCdgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiIyEgL2Jpbi9zaCIKKwllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKKwllY2hvICIjICAkICRAIgorCWVjaG8gImV4aXQgMCIKKwljaG1vZCAreCAkZmlsZQorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBiaXNvbnx5YWNjKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKKyAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAiJExBU1RBUkciIGluCisJKi55KQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYworCSAgICBmaQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCisJZWNobyA+eS50YWIuaAorICAgIGZpCisgICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgorCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYworICAgIGZpCisgICAgOzsKKworICBsZXh8ZmxleCkKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIGxleC55eS5jCisgICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCisgICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgorCWNhc2UgIiRMQVNUQVJHIiBpbgorCSoubCkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKKwkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYworICAgIGZpCisgICAgOzsKKworICBoZWxwMm1hbikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCisJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQorCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAorICAgIGZpCisgICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBtYWtlaW5mbykKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKKyAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cworICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKKyAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgorICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICAjIFRoZSBmaWxlIHRvIHRvdWNoIGlzIHRoYXQgc3BlY2lmaWVkIHdpdGggLW8gLi4uCisgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW8gXChbXiBdKlwpLiovXDEvcCdgCisgICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCisgICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KKyAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAorICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRpbmZpbGVgCisgICAgICAjIC4uLiBvciBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIHNvdXJjZSBuYW1lIChkaXIvZi50ZXhpIGJlY29tZXMgZi5pbmZvKQorICAgICAgdGVzdCAteiAiJGZpbGUiICYmIGZpbGU9YGVjaG8gIiRpbmZpbGUiIHwgc2VkICdzLC4qLywsO3MsLlteLl0qJCwsJ2AuaW5mbworICAgIGZpCisgICAgdG91Y2ggJGZpbGUKKyAgICA7OworCisgIHRhcikKKyAgICBzaGlmdAorCisgICAgIyBXZSBoYXZlIGFscmVhZHkgdHJpZWQgdGFyIGluIHRoZSBnZW5lcmljIHBhcnQuCisgICAgIyBMb29rIGZvciBnbnV0YXIvZ3RhciBiZWZvcmUgaW52b2NhdGlvbiB0byBhdm9pZCB1Z2x5IGVycm9yCisgICAgIyBtZXNzYWdlcy4KKyAgICBpZiAoZ251dGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgorICAgICAgIGdudXRhciAiJEAiICYmIGV4aXQgMAorICAgIGZpCisgICAgaWYgKGd0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgICAgZ3RhciAiJEAiICYmIGV4aXQgMAorICAgIGZpCisgICAgZmlyc3Rhcmc9IiQxIgorICAgIGlmIHNoaWZ0OyB0aGVuCisJY2FzZSAiJGZpcnN0YXJnIiBpbgorCSpvKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKwljYXNlICIkZmlyc3RhcmciIGluCisJKmgqKQorCSAgICBmaXJzdGFyZz1gZWNobyAiJGZpcnN0YXJnIiB8IHNlZCBzL2gvL2AKKwkgICAgdGFyICIkZmlyc3RhcmciICIkQCIgJiYgZXhpdCAwCisJICAgIDs7CisJZXNhYworICAgIGZpCisKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IEkgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHJ1biBcYHRhcicgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAgICAgWW91IG1heSB3YW50IHRvIGluc3RhbGwgR05VIHRhciBvciBGcmVlIHBheHV0aWxzLCBvciBjaGVjayB0aGUKKyAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIgorICAgIGV4aXQgMQorICAgIDs7CisKKyAgKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYW5kIGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCisgICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXNpdGVzIGZvciBpbnN0YWxsaW5nCisgICAgICAgICB0aGlzIHBhY2thZ2UuICBZb3UgbWF5IGFsc28gcGVlayBhdCBhbnkgR05VIGFyY2hpdmUgc2l0ZSwgaW4gY2FzZQorICAgICAgICAgc29tZSBvdGhlciBwYWNrYWdlIHdvdWxkIGNvbnRhaW4gdGhpcyBtaXNzaW5nIFxgJDEnIHByb2dyYW0uIgorICAgIGV4aXQgMQorICAgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9DbGllbnQuY3BwIGIvaXBlcmYtMi4wLjUvc3JjL0NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhNWI1YwotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L3NyYy9DbGllbnQuY3BwCkBAIC0wLDAgKzEsNDcwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogQ2xpZW50LmNwcAorICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEEgY2xpZW50IHRocmVhZCBpbml0aWF0ZXMgYSBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgYW5kIGhhbmRsZXMKKyAqIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBkYXRhLCB0aGVuIGNsb3NlcyB0aGUgc29ja2V0LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiaGVhZGVycy5oIgorI2luY2x1ZGUgIkNsaWVudC5ocHAiCisjaW5jbHVkZSAiVGhyZWFkLmgiCisjaW5jbHVkZSAiU29ja2V0QWRkci5oIgorI2luY2x1ZGUgIlBlcmZTb2NrZXQuaHBwIgorI2luY2x1ZGUgIkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImRlbGF5LmhwcCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAiTG9jYWxlLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0b3JlIHNlcnZlciBob3N0bmFtZSwgb3B0aW9uYWxseSBsb2NhbCBob3N0bmFtZSwgYW5kIHNvY2tldCBpbmZvLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDbGllbnQ6OkNsaWVudCggdGhyZWFkX1NldHRpbmdzICppblNldHRpbmdzICkgeworICAgIG1TZXR0aW5ncyA9IGluU2V0dGluZ3M7CisgICAgbUJ1ZiA9IE5VTEw7CisKKyAgICAvLyBpbml0aWFsaXplIGJ1ZmZlcgorICAgIG1CdWYgPSBuZXcgY2hhclsgbVNldHRpbmdzLT5tQnVmTGVuIF07CisgICAgcGF0dGVybiggbUJ1ZiwgbVNldHRpbmdzLT5tQnVmTGVuICk7CisgICAgaWYgKCBpc0ZpbGVJbnB1dCggbVNldHRpbmdzICkgKSB7CisgICAgICAgIGlmICggIWlzU1RESU4oIG1TZXR0aW5ncyApICkKKyAgICAgICAgICAgIEV4dHJhY3Rvcl9Jbml0aWFsaXplKCBtU2V0dGluZ3MtPm1GaWxlTmFtZSwgbVNldHRpbmdzLT5tQnVmTGVuLCBtU2V0dGluZ3MgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRXh0cmFjdG9yX0luaXRpYWxpemVGaWxlKCBzdGRpbiwgbVNldHRpbmdzLT5tQnVmTGVuLCBtU2V0dGluZ3MgKTsKKworICAgICAgICBpZiAoICFFeHRyYWN0b3JfY2FuUmVhZCggbVNldHRpbmdzICkgKSB7CisgICAgICAgICAgICB1bnNldEZpbGVJbnB1dCggbVNldHRpbmdzICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb25uZWN0CisgICAgQ29ubmVjdCggKTsKKworICAgIGlmICggaXNSZXBvcnQoIGluU2V0dGluZ3MgKSApIHsKKyAgICAgICAgUmVwb3J0U2V0dGluZ3MoIGluU2V0dGluZ3MgKTsKKyAgICAgICAgaWYgKCBtU2V0dGluZ3MtPm11bHRpaGRyICYmIGlzTXVsdGlwbGVSZXBvcnQoIGluU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgIG1TZXR0aW5ncy0+bXVsdGloZHItPnJlcG9ydC0+Y29ubmVjdGlvbi5wZWVyID0gbVNldHRpbmdzLT5wZWVyOworICAgICAgICAgICAgbVNldHRpbmdzLT5tdWx0aWhkci0+cmVwb3J0LT5jb25uZWN0aW9uLnNpemVfcGVlciA9IG1TZXR0aW5ncy0+c2l6ZV9wZWVyOworICAgICAgICAgICAgbVNldHRpbmdzLT5tdWx0aWhkci0+cmVwb3J0LT5jb25uZWN0aW9uLmxvY2FsID0gbVNldHRpbmdzLT5sb2NhbDsKKyAgICAgICAgICAgIFNvY2tBZGRyX3NldFBvcnRBbnkoICZtU2V0dGluZ3MtPm11bHRpaGRyLT5yZXBvcnQtPmNvbm5lY3Rpb24ubG9jYWwgKTsKKyAgICAgICAgICAgIG1TZXR0aW5ncy0+bXVsdGloZHItPnJlcG9ydC0+Y29ubmVjdGlvbi5zaXplX2xvY2FsID0gbVNldHRpbmdzLT5zaXplX2xvY2FsOworICAgICAgICB9CisgICAgfQorCit9IC8vIGVuZCBDbGllbnQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVsZXRlIG1lbW9yeSAoaG9zdG5hbWUgc3RyaW5ncykuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0NsaWVudDo6fkNsaWVudCgpIHsKKyAgICBpZiAoIG1TZXR0aW5ncy0+bVNvY2sgIT0gSU5WQUxJRF9TT0NLRVQgKSB7CisgICAgICAgIGludCByYyA9IGNsb3NlKCBtU2V0dGluZ3MtPm1Tb2NrICk7CisgICAgICAgIFdBUk5fZXJybm8oIHJjID09IFNPQ0tFVF9FUlJPUiwgImNsb3NlIiApOworICAgICAgICBtU2V0dGluZ3MtPm1Tb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIERFTEVURV9BUlJBWSggbUJ1ZiApOworfSAvLyBlbmQgfkNsaWVudAorCitjb25zdCBkb3VibGUga1NlY3NfdG9fdXNlY3MgPSAxZTY7IAorY29uc3QgaW50ICAgIGtCeXRlc190b19CaXRzID0gODsgCisKK3ZvaWQgQ2xpZW50OjpSdW5UQ1AoIHZvaWQgKSB7CisgICAgdW5zaWduZWQgbG9uZyBjdXJyTGVuID0gMDsgCisgICAgc3RydWN0IGl0aW1lcnZhbCBpdDsKKyAgICBtYXhfc2l6ZV90IHRvdExlbiA9IDA7CisKKyAgICBpbnQgZXJyOworCisgICAgY2hhciogcmVhZEF0ID0gbUJ1ZjsKKworICAgIC8vIEluZGljYXRlcyBpZiB0aGUgc3RyZWFtIGlzIHJlYWRhYmxlIAorICAgIGJvb2wgY2FuUmVhZCA9IHRydWUsIG1Nb2RlX1RpbWUgPSBpc01vZGVUaW1lKCBtU2V0dGluZ3MgKTsgCisKKyAgICBSZXBvcnRTdHJ1Y3QgKnJlcG9ydHN0cnVjdCA9IE5VTEw7CisKKyAgICAvLyBJbml0UmVwb3J0IGhhbmRsZXMgQmFycmllciBmb3IgbXVsdGlwbGUgU3RyZWFtcworICAgIG1TZXR0aW5ncy0+cmVwb3J0aGRyID0gSW5pdFJlcG9ydCggbVNldHRpbmdzICk7CisgICAgcmVwb3J0c3RydWN0ID0gbmV3IFJlcG9ydFN0cnVjdDsKKyAgICByZXBvcnRzdHJ1Y3QtPnBhY2tldElEID0gMDsKKworICAgIGxhc3RQYWNrZXRUaW1lLnNldG5vdygpOworICAgIGlmICggbU1vZGVfVGltZSApIHsKKwltZW1zZXQgKCZpdCwgMCwgc2l6ZW9mIChpdCkpOworCWl0Lml0X3ZhbHVlLnR2X3NlYyA9IChpbnQpIChtU2V0dGluZ3MtPm1BbW91bnQgLyAxMDAuMCk7CisJaXQuaXRfdmFsdWUudHZfdXNlYyA9IChpbnQpIDEwMDAwICogKG1TZXR0aW5ncy0+bUFtb3VudCAtCisJICAgIGl0Lml0X3ZhbHVlLnR2X3NlYyAqIDEwMC4wKTsKKwllcnIgPSBzZXRpdGltZXIoIElUSU1FUl9SRUFMLCAmaXQsIE5VTEwgKTsKKwlpZiAoIGVyciAhPSAwICkgeworCSAgICBwZXJyb3IoInNldGl0aW1lciIpOworCSAgICBleGl0KDEpOworCX0KKyAgICB9CisgICAgZG8geworICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGRhdGEgYmxvY2sgZnJvbSAKKyAgICAgICAgLy8gdGhlIGZpbGUgaWYgaXQncyBmaWxlIGlucHV0IAorICAgICAgICBpZiAoIGlzRmlsZUlucHV0KCBtU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgIEV4dHJhY3Rvcl9nZXROZXh0RGF0YUJsb2NrKCByZWFkQXQsIG1TZXR0aW5ncyApOyAKKyAgICAgICAgICAgIGNhblJlYWQgPSBFeHRyYWN0b3JfY2FuUmVhZCggbVNldHRpbmdzICkgIT0gMDsgCisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY2FuUmVhZCA9IHRydWU7IAorCisgICAgICAgIC8vIHBlcmZvcm0gd3JpdGUgCisgICAgICAgIGN1cnJMZW4gPSB3cml0ZSggbVNldHRpbmdzLT5tU29jaywgbUJ1ZiwgbVNldHRpbmdzLT5tQnVmTGVuICk7IAorICAgICAgICBpZiAoIGN1cnJMZW4gPCAwICkgeworICAgICAgICAgICAgV0FSTl9lcnJubyggY3VyckxlbiA8IDAsICJ3cml0ZTIiICk7IAorICAgICAgICAgICAgYnJlYWs7IAorICAgICAgICB9CisJdG90TGVuICs9IGN1cnJMZW47CisKKwlpZihtU2V0dGluZ3MtPm1JbnRlcnZhbCA+IDApIHsKKyAgICAJICAgIGdldHRpbWVvZmRheSggJihyZXBvcnRzdHJ1Y3QtPnBhY2tldFRpbWUpLCBOVUxMICk7CisgICAgICAgICAgICByZXBvcnRzdHJ1Y3QtPnBhY2tldExlbiA9IGN1cnJMZW47CisgICAgICAgICAgICBSZXBvcnRQYWNrZXQoIG1TZXR0aW5ncy0+cmVwb3J0aGRyLCByZXBvcnRzdHJ1Y3QgKTsKKyAgICAgICAgfQkKKworICAgICAgICBpZiAoICFtTW9kZV9UaW1lICkgeworICAgICAgICAgICAgLyogbUFtb3VudCBtYXkgYmUgdW5zaWduZWQsIHNvIGRvbid0IGxldCBpdCB1bmRlcmZsb3chICovCisgICAgICAgICAgICBpZiggbVNldHRpbmdzLT5tQW1vdW50ID49IGN1cnJMZW4gKSB7CisgICAgICAgICAgICAgICAgbVNldHRpbmdzLT5tQW1vdW50IC09IGN1cnJMZW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZXR0aW5ncy0+bUFtb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKCAhIChzSW50ZXJ1cHRlZCAgfHwgCisgICAgICAgICAgICAgICAgICAgKCFtTW9kZV9UaW1lICAmJiAgMCA+PSBtU2V0dGluZ3MtPm1BbW91bnQpKSAmJiBjYW5SZWFkICk7IAorCisgICAgLy8gc3RvcCB0aW1pbmcKKyAgICBnZXR0aW1lb2ZkYXkoICYocmVwb3J0c3RydWN0LT5wYWNrZXRUaW1lKSwgTlVMTCApOworCisgICAgLy8gaWYgd2UncmUgbm90IGRvaW5nIGludGVydmFsIHJlcG9ydGluZywgcmVwb3J0IHRoZSBlbnRpcmUgdHJhbnNmZXIgYXMgb25lIGJpZyBwYWNrZXQKKyAgICBpZigwLjAgPT0gbVNldHRpbmdzLT5tSW50ZXJ2YWwpIHsKKyAgICAgICAgcmVwb3J0c3RydWN0LT5wYWNrZXRMZW4gPSB0b3RMZW47CisgICAgICAgIFJlcG9ydFBhY2tldCggbVNldHRpbmdzLT5yZXBvcnRoZHIsIHJlcG9ydHN0cnVjdCApOworICAgIH0KKyAgICBDbG9zZVJlcG9ydCggbVNldHRpbmdzLT5yZXBvcnRoZHIsIHJlcG9ydHN0cnVjdCApOworCisgICAgREVMRVRFX1BUUiggcmVwb3J0c3RydWN0ICk7CisgICAgRW5kUmVwb3J0KCBtU2V0dGluZ3MtPnJlcG9ydGhkciApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogU2VuZCBkYXRhIHVzaW5nIHRoZSBjb25uZWN0ZWQgVURQL1RDUCBzb2NrZXQsIAorICogdW50aWwgYSB0ZXJtaW5hdGlvbiBmbGFnIGlzIHJlYWNoZWQuIAorICogRG9lcyBub3QgY2xvc2UgdGhlIHNvY2tldC4gCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovIAorCit2b2lkIENsaWVudDo6UnVuKCB2b2lkICkgeworICAgIHN0cnVjdCBVRFBfZGF0YWdyYW0qIG1CdWZfVURQID0gKHN0cnVjdCBVRFBfZGF0YWdyYW0qKSBtQnVmOyAKKyAgICB1bnNpZ25lZCBsb25nIGN1cnJMZW4gPSAwOyAKKworICAgIGludCBkZWxheV90YXJnZXQgPSAwOyAKKyAgICBpbnQgZGVsYXkgPSAwOyAKKyAgICBpbnQgYWRqdXN0ID0gMDsgCisKKyAgICBjaGFyKiByZWFkQXQgPSBtQnVmOworCisjaWYgSEFWRV9USFJFQUQKKyAgICBpZiAoICFpc1VEUCggbVNldHRpbmdzICkgKSB7CisJUnVuVENQKCk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8vIEluZGljYXRlcyBpZiB0aGUgc3RyZWFtIGlzIHJlYWRhYmxlIAorICAgIGJvb2wgY2FuUmVhZCA9IHRydWUsIG1Nb2RlX1RpbWUgPSBpc01vZGVUaW1lKCBtU2V0dGluZ3MgKTsgCisKKyAgICAvLyBzZXR1cCB0ZXJtaW5hdGlvbiB2YXJpYWJsZXMKKyAgICBpZiAoIG1Nb2RlX1RpbWUgKSB7CisgICAgICAgIG1FbmRUaW1lLnNldG5vdygpOworICAgICAgICBtRW5kVGltZS5hZGQoIG1TZXR0aW5ncy0+bUFtb3VudCAvIDEwMC4wICk7CisgICAgfQorCisgICAgaWYgKCBpc1VEUCggbVNldHRpbmdzICkgKSB7CisgICAgICAgIC8vIER1ZSB0byB0aGUgVURQIHRpbWVzdGFtcHMgZXRjLCBpbmNsdWRlZCAKKyAgICAgICAgLy8gcmVkdWNlIHRoZSByZWFkIHNpemUgYnkgYW4gYW1vdW50IAorICAgICAgICAvLyBlcXVhbCB0byB0aGUgaGVhZGVyIHNpemUKKyAgICAKKyAgICAgICAgLy8gY29tcHV0ZSBkZWxheSBmb3IgYmFuZHdpZHRoIHJlc3RyaWN0aW9uLCBjb25zdHJhaW5lZCB0byBbMCwxXSBzZWNvbmRzIAorICAgICAgICBkZWxheV90YXJnZXQgPSAoaW50KSAoIG1TZXR0aW5ncy0+bUJ1ZkxlbiAqICgoa1NlY3NfdG9fdXNlY3MgKiBrQnl0ZXNfdG9fQml0cykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNldHRpbmdzLT5tVURQUmF0ZSkgKTsgCisgICAgICAgIGlmICggZGVsYXlfdGFyZ2V0IDwgMCAgfHwgCisgICAgICAgICAgICAgZGVsYXlfdGFyZ2V0ID4gKGludCkgMSAqIGtTZWNzX3RvX3VzZWNzICkgeworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2RlbGF5X2xhcmdlLCBkZWxheV90YXJnZXQgLyBrU2Vjc190b191c2VjcyApOyAKKyAgICAgICAgICAgIGRlbGF5X3RhcmdldCA9IChpbnQpIGtTZWNzX3RvX3VzZWNzICogMTsgCisgICAgICAgIH0KKyAgICAgICAgaWYgKCBpc0ZpbGVJbnB1dCggbVNldHRpbmdzICkgKSB7CisgICAgICAgICAgICBpZiAoIGlzQ29tcGF0KCBtU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBFeHRyYWN0b3JfcmVkdWNlUmVhZFNpemUoIHNpemVvZihzdHJ1Y3QgVURQX2RhdGFncmFtKSwgbVNldHRpbmdzICk7CisgICAgICAgICAgICAgICAgcmVhZEF0ICs9IHNpemVvZihzdHJ1Y3QgVURQX2RhdGFncmFtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRXh0cmFjdG9yX3JlZHVjZVJlYWRTaXplKCBzaXplb2Yoc3RydWN0IFVEUF9kYXRhZ3JhbSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBjbGllbnRfaGRyKSwgbVNldHRpbmdzICk7CisgICAgICAgICAgICAgICAgcmVhZEF0ICs9IHNpemVvZihzdHJ1Y3QgVURQX2RhdGFncmFtKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgY2xpZW50X2hkcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSZXBvcnRTdHJ1Y3QgKnJlcG9ydHN0cnVjdCA9IE5VTEw7CisKKyAgICAvLyBJbml0UmVwb3J0IGhhbmRsZXMgQmFycmllciBmb3IgbXVsdGlwbGUgU3RyZWFtcworICAgIG1TZXR0aW5ncy0+cmVwb3J0aGRyID0gSW5pdFJlcG9ydCggbVNldHRpbmdzICk7CisgICAgcmVwb3J0c3RydWN0ID0gbmV3IFJlcG9ydFN0cnVjdDsKKyAgICByZXBvcnRzdHJ1Y3QtPnBhY2tldElEID0gMDsKKworICAgIGxhc3RQYWNrZXRUaW1lLnNldG5vdygpOworICAgIAorICAgIGRvIHsKKworICAgICAgICAvLyBUZXN0IGNhc2U6IGRyb3AgMTcgcGFja2V0cyBhbmQgc2VuZCAyIG91dC1vZi1vcmRlcjogCisgICAgICAgIC8vIHNlcXVlbmNlIDUxLCA1MiwgNzAsIDUzLCA1NCwgNzEsIDcyIAorICAgICAgICAvL3N3aXRjaCggZGF0YWdyYW1JRCApIHsgCisgICAgICAgIC8vICBjYXNlIDUzOiBkYXRhZ3JhbUlEID0gNzA7IGJyZWFrOyAKKyAgICAgICAgLy8gIGNhc2UgNzE6IGRhdGFncmFtSUQgPSA1MzsgYnJlYWs7IAorICAgICAgICAvLyAgY2FzZSA1NTogZGF0YWdyYW1JRCA9IDcxOyBicmVhazsgCisgICAgICAgIC8vICBkZWZhdWx0OiBicmVhazsgCisgICAgICAgIC8vfSAKKyAgICAgICAgZ2V0dGltZW9mZGF5KCAmKHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZSksIE5VTEwgKTsKKworICAgICAgICBpZiAoIGlzVURQKCBtU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgIC8vIHN0b3JlIGRhdGFncmFtIElEIGludG8gYnVmZmVyIAorICAgICAgICAgICAgbUJ1Zl9VRFAtPmlkICAgICAgPSBodG9ubCggKHJlcG9ydHN0cnVjdC0+cGFja2V0SUQpKysgKTsgCisgICAgICAgICAgICBtQnVmX1VEUC0+dHZfc2VjICA9IGh0b25sKCByZXBvcnRzdHJ1Y3QtPnBhY2tldFRpbWUudHZfc2VjICk7IAorICAgICAgICAgICAgbUJ1Zl9VRFAtPnR2X3VzZWMgPSBodG9ubCggcmVwb3J0c3RydWN0LT5wYWNrZXRUaW1lLnR2X3VzZWMgKTsKKworICAgICAgICAgICAgLy8gZGVsYXkgYmV0d2VlbiB3cml0ZXMgCisgICAgICAgICAgICAvLyBtYWtlIGFuIGFkanVzdG1lbnQgZm9yIGhvdyBsb25nIHRoZSBsYXN0IGxvb3AgaXRlcmF0aW9uIHRvb2sgCisgICAgICAgICAgICAvLyBUT0RPIHRoaXMgZG9lc24ndCB3b3JrIHdlbGwgaW4gY2VydGFpbiBjYXNlcywgbGlrZSAyIHBhcmFsbGVsIHN0cmVhbXMgCisgICAgICAgICAgICBhZGp1c3QgPSBkZWxheV90YXJnZXQgKyBsYXN0UGFja2V0VGltZS5zdWJVc2VjKCByZXBvcnRzdHJ1Y3QtPnBhY2tldFRpbWUgKTsgCisgICAgICAgICAgICBsYXN0UGFja2V0VGltZS5zZXQoIHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZS50dl9zZWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRzdHJ1Y3QtPnBhY2tldFRpbWUudHZfdXNlYyApOyAKKworICAgICAgICAgICAgaWYgKCBhZGp1c3QgPiAwICB8fCAgZGVsYXkgPiAwICkgeworICAgICAgICAgICAgICAgIGRlbGF5ICs9IGFkanVzdDsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGRhdGEgYmxvY2sgZnJvbSAKKyAgICAgICAgLy8gdGhlIGZpbGUgaWYgaXQncyBmaWxlIGlucHV0IAorICAgICAgICBpZiAoIGlzRmlsZUlucHV0KCBtU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgIEV4dHJhY3Rvcl9nZXROZXh0RGF0YUJsb2NrKCByZWFkQXQsIG1TZXR0aW5ncyApOyAKKyAgICAgICAgICAgIGNhblJlYWQgPSBFeHRyYWN0b3JfY2FuUmVhZCggbVNldHRpbmdzICkgIT0gMDsgCisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgY2FuUmVhZCA9IHRydWU7IAorCisgICAgICAgIC8vIHBlcmZvcm0gd3JpdGUgCisgICAgICAgIGN1cnJMZW4gPSB3cml0ZSggbVNldHRpbmdzLT5tU29jaywgbUJ1ZiwgbVNldHRpbmdzLT5tQnVmTGVuICk7IAorICAgICAgICBpZiAoIGN1cnJMZW4gPCAwICYmIGVycm5vICE9IEVOT0JVRlMgKSB7CisgICAgICAgICAgICBXQVJOX2Vycm5vKCBjdXJyTGVuIDwgMCwgIndyaXRlMiIgKTsgCisgICAgICAgICAgICBicmVhazsgCisgICAgICAgIH0KKworICAgICAgICAvLyByZXBvcnQgcGFja2V0cyAKKyAgICAgICAgcmVwb3J0c3RydWN0LT5wYWNrZXRMZW4gPSBjdXJyTGVuOworICAgICAgICBSZXBvcnRQYWNrZXQoIG1TZXR0aW5ncy0+cmVwb3J0aGRyLCByZXBvcnRzdHJ1Y3QgKTsKKyAgICAgICAgCisgICAgICAgIGlmICggZGVsYXkgPiAwICkgeworICAgICAgICAgICAgZGVsYXlfbG9vcCggZGVsYXkgKTsgCisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhbU1vZGVfVGltZSApIHsKKyAgICAgICAgICAgIC8qIG1BbW91bnQgbWF5IGJlIHVuc2lnbmVkLCBzbyBkb24ndCBsZXQgaXQgdW5kZXJmbG93ISAqLworICAgICAgICAgICAgaWYoIG1TZXR0aW5ncy0+bUFtb3VudCA+PSBjdXJyTGVuICkgeworICAgICAgICAgICAgICAgIG1TZXR0aW5ncy0+bUFtb3VudCAtPSBjdXJyTGVuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2V0dGluZ3MtPm1BbW91bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IHdoaWxlICggISAoc0ludGVydXB0ZWQgIHx8IAorICAgICAgICAgICAgICAgICAobU1vZGVfVGltZSAgICYmICBtRW5kVGltZS5iZWZvcmUoIHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZSApKSAgfHwgCisgICAgICAgICAgICAgICAgICghbU1vZGVfVGltZSAgJiYgIDAgPj0gbVNldHRpbmdzLT5tQW1vdW50KSkgJiYgY2FuUmVhZCApOyAKKworICAgIC8vIHN0b3AgdGltaW5nCisgICAgZ2V0dGltZW9mZGF5KCAmKHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZSksIE5VTEwgKTsKKyAgICBDbG9zZVJlcG9ydCggbVNldHRpbmdzLT5yZXBvcnRoZHIsIHJlcG9ydHN0cnVjdCApOworCisgICAgaWYgKCBpc1VEUCggbVNldHRpbmdzICkgKSB7CisgICAgICAgIC8vIHNlbmQgYSBmaW5hbCB0ZXJtaW5hdGluZyBkYXRhZ3JhbSAKKyAgICAgICAgLy8gRG9uJ3QgY291bnQgaW4gdGhlIG1Ub3RhbExlbi4gVGhlIHNlcnZlciBjb3VudHMgdGhpcyBvbmUsIAorICAgICAgICAvLyBidXQgZGlkbid0IGNvdW50IG91ciBmaXJzdCBkYXRhZ3JhbSwgc28gd2UncmUgZXZlbiBub3cuIAorICAgICAgICAvLyBUaGUgbmVnYXRpdmUgZGF0YWdyYW0gSUQgc2lnbmlmaWVzIHRlcm1pbmF0aW9uIHRvIHRoZSBzZXJ2ZXIuIAorICAgIAorICAgICAgICAvLyBzdG9yZSBkYXRhZ3JhbSBJRCBpbnRvIGJ1ZmZlciAKKyAgICAgICAgbUJ1Zl9VRFAtPmlkICAgICAgPSBodG9ubCggLShyZXBvcnRzdHJ1Y3QtPnBhY2tldElEKSAgKTsgCisgICAgICAgIG1CdWZfVURQLT50dl9zZWMgID0gaHRvbmwoIHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZS50dl9zZWMgKTsgCisgICAgICAgIG1CdWZfVURQLT50dl91c2VjID0gaHRvbmwoIHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZS50dl91c2VjICk7IAorCisgICAgICAgIGlmICggaXNNdWx0aWNhc3QoIG1TZXR0aW5ncyApICkgeworICAgICAgICAgICAgd3JpdGUoIG1TZXR0aW5ncy0+bVNvY2ssIG1CdWYsIG1TZXR0aW5ncy0+bUJ1ZkxlbiApOyAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlX1VEUF9GSU4oICk7IAorICAgICAgICB9CisgICAgfQorICAgIERFTEVURV9QVFIoIHJlcG9ydHN0cnVjdCApOworICAgIEVuZFJlcG9ydCggbVNldHRpbmdzLT5yZXBvcnRoZHIgKTsKK30gCisvLyBlbmQgUnVuCisKK3ZvaWQgQ2xpZW50OjpJbml0aWF0ZVNlcnZlcigpIHsKKyAgICBpZiAoICFpc0NvbXBhdCggbVNldHRpbmdzICkgKSB7CisgICAgICAgIGludCBjdXJyTGVuOworICAgICAgICBjbGllbnRfaGRyKiB0ZW1wX2hkcjsKKyAgICAgICAgaWYgKCBpc1VEUCggbVNldHRpbmdzICkgKSB7CisgICAgICAgICAgICBVRFBfZGF0YWdyYW0gKlVEUGhkciA9IChVRFBfZGF0YWdyYW0gKiltQnVmOworICAgICAgICAgICAgdGVtcF9oZHIgPSAoY2xpZW50X2hkciopKFVEUGhkciArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGVtcF9oZHIgPSAoY2xpZW50X2hkciopbUJ1ZjsKKyAgICAgICAgfQorICAgICAgICBTZXR0aW5nc19HZW5lcmF0ZUNsaWVudEhkciggbVNldHRpbmdzLCB0ZW1wX2hkciApOworICAgICAgICBpZiAoICFpc1VEUCggbVNldHRpbmdzICkgKSB7CisgICAgICAgICAgICBjdXJyTGVuID0gc2VuZCggbVNldHRpbmdzLT5tU29jaywgbUJ1Ziwgc2l6ZW9mKGNsaWVudF9oZHIpLCAwICk7CisgICAgICAgICAgICBpZiAoIGN1cnJMZW4gPCAwICkgeworICAgICAgICAgICAgICAgIFdBUk5fZXJybm8oIGN1cnJMZW4gPCAwLCAid3JpdGUxIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZXR1cCBhIHNvY2tldCBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIuCisgKiBJZiBpbkxvY2FsaG9zdCBpcyBub3QgbnVsbCwgYmluZCB0byB0aGF0IGFkZHJlc3MsIHNwZWNpZnlpbmcKKyAqIHdoaWNoIG91dGdvaW5nIGludGVyZmFjZSB0byB1c2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgQ2xpZW50OjpDb25uZWN0KCApIHsKKyAgICBpbnQgcmM7CisgICAgU29ja0FkZHJfcmVtb3RlQWRkciggbVNldHRpbmdzICk7CisKKyAgICBhc3NlcnQoIG1TZXR0aW5ncy0+aW5Ib3N0bmFtZSAhPSBOVUxMICk7CisKKyAgICAvLyBjcmVhdGUgYW4gaW50ZXJuZXQgc29ja2V0CisgICAgaW50IHR5cGUgPSAoIGlzVURQKCBtU2V0dGluZ3MgKSAgPyAgU09DS19ER1JBTSA6IFNPQ0tfU1RSRUFNKTsKKworICAgIGludCBkb21haW4gPSAoU29ja0FkZHJfaXNJUHY2KCAmbVNldHRpbmdzLT5wZWVyICkgPyAKKyNpZmRlZiBIQVZFX0lQVjYKKyAgICAgICAgICAgICAgICAgIEFGX0lORVQ2CisjZWxzZQorICAgICAgICAgICAgICAgICAgQUZfSU5FVAorI2VuZGlmCisgICAgICAgICAgICAgICAgICA6IEFGX0lORVQpOworCisgICAgbVNldHRpbmdzLT5tU29jayA9IHNvY2tldCggZG9tYWluLCB0eXBlLCAwICk7CisgICAgV0FSTl9lcnJubyggbVNldHRpbmdzLT5tU29jayA9PSBJTlZBTElEX1NPQ0tFVCwgInNvY2tldCIgKTsKKworICAgIFNldFNvY2tldE9wdGlvbnMoIG1TZXR0aW5ncyApOworCisKKyAgICBTb2NrQWRkcl9sb2NhbEFkZHIoIG1TZXR0aW5ncyApOworICAgIGlmICggbVNldHRpbmdzLT5tTG9jYWxob3N0ICE9IE5VTEwgKSB7CisgICAgICAgIC8vIGJpbmQgc29ja2V0IHRvIGxvY2FsIGFkZHJlc3MKKyAgICAgICAgcmMgPSBiaW5kKCBtU2V0dGluZ3MtPm1Tb2NrLCAoc29ja2FkZHIqKSAmbVNldHRpbmdzLT5sb2NhbCwgCisgICAgICAgICAgICAgICAgICAgU29ja0FkZHJfZ2V0X3NpemVvZl9zb2NrYWRkciggJm1TZXR0aW5ncy0+bG9jYWwgKSApOworICAgICAgICBXQVJOX2Vycm5vKCByYyA9PSBTT0NLRVRfRVJST1IsICJiaW5kIiApOworICAgIH0KKworICAgIC8vIGNvbm5lY3Qgc29ja2V0CisgICAgcmMgPSBjb25uZWN0KCBtU2V0dGluZ3MtPm1Tb2NrLCAoc29ja2FkZHIqKSAmbVNldHRpbmdzLT5wZWVyLCAKKyAgICAgICAgICAgICAgICAgIFNvY2tBZGRyX2dldF9zaXplb2Zfc29ja2FkZHIoICZtU2V0dGluZ3MtPnBlZXIgKSk7CisgICAgRkFJTF9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAiY29ubmVjdCIsIG1TZXR0aW5ncyApOworCisgICAgZ2V0c29ja25hbWUoIG1TZXR0aW5ncy0+bVNvY2ssIChzb2NrYWRkciopICZtU2V0dGluZ3MtPmxvY2FsLCAKKyAgICAgICAgICAgICAgICAgJm1TZXR0aW5ncy0+c2l6ZV9sb2NhbCApOworICAgIGdldHBlZXJuYW1lKCBtU2V0dGluZ3MtPm1Tb2NrLCAoc29ja2FkZHIqKSAmbVNldHRpbmdzLT5wZWVyLAorICAgICAgICAgICAgICAgICAmbVNldHRpbmdzLT5zaXplX3BlZXIgKTsKK30gLy8gZW5kIENvbm5lY3QKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFNlbmQgYSBkYXRhZ3JhbSBvbiB0aGUgc29ja2V0LiBUaGUgZGF0YWdyYW0ncyBjb250ZW50cyBzaG91bGQgc2lnbmlmeSAKKyAqIGEgRklOIHRvIHRoZSBhcHBsaWNhdGlvbi4gS2VlcCByZS10cmFuc21pdHRpbmcgdW50aWwgYW4gCisgKiBhY2tub3dsZWRnZW1lbnQgZGF0YWdyYW0gaXMgcmVjZWl2ZWQuIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKKwordm9pZCBDbGllbnQ6OndyaXRlX1VEUF9GSU4oICkgeworICAgIGludCByYzsgCisgICAgZmRfc2V0IHJlYWRTZXQ7IAorICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7IAorCisgICAgaW50IGNvdW50ID0gMDsgCisgICAgd2hpbGUgKCBjb3VudCA8IDEwICkgeworICAgICAgICBjb3VudCsrOyAKKworICAgICAgICAvLyB3cml0ZSBkYXRhIAorICAgICAgICB3cml0ZSggbVNldHRpbmdzLT5tU29jaywgbUJ1ZiwgbVNldHRpbmdzLT5tQnVmTGVuICk7IAorCisgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIHNvY2tldCBpcyByZWFkYWJsZSwgb3Igb3VyIHRpbWVvdXQgZXhwaXJlcyAKKyAgICAgICAgRkRfWkVSTyggJnJlYWRTZXQgKTsgCisgICAgICAgIEZEX1NFVCggbVNldHRpbmdzLT5tU29jaywgJnJlYWRTZXQgKTsgCisgICAgICAgIHRpbWVvdXQudHZfc2VjICA9IDA7IAorICAgICAgICB0aW1lb3V0LnR2X3VzZWMgPSAyNTAwMDA7IC8vIHF1YXJ0ZXIgc2Vjb25kLCAyNTAgbXMgCisKKyAgICAgICAgcmMgPSBzZWxlY3QoIG1TZXR0aW5ncy0+bVNvY2srMSwgJnJlYWRTZXQsIE5VTEwsIE5VTEwsICZ0aW1lb3V0ICk7IAorICAgICAgICBGQUlMX2Vycm5vKCByYyA9PSBTT0NLRVRfRVJST1IsICJzZWxlY3QiLCBtU2V0dGluZ3MgKTsgCisKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgLy8gc2VsZWN0IHRpbWVkIG91dCAKKyAgICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNvY2tldCByZWFkeSB0byByZWFkIAorICAgICAgICAgICAgcmMgPSByZWFkKCBtU2V0dGluZ3MtPm1Tb2NrLCBtQnVmLCBtU2V0dGluZ3MtPm1CdWZMZW4gKTsgCisgICAgICAgICAgICBXQVJOX2Vycm5vKCByYyA8IDAsICJyZWFkIiApOworICAgIAkgICAgaWYgKCByYyA8IDAgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCByYyA+PSAoaW50KSAoc2l6ZW9mKFVEUF9kYXRhZ3JhbSkgKyBzaXplb2Yoc2VydmVyX2hkcikpICkgeworICAgICAgICAgICAgICAgIFJlcG9ydFNlcnZlclVEUCggbVNldHRpbmdzLCAoc2VydmVyX2hkciopICgoVURQX2RhdGFncmFtKiltQnVmICsgMSkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOyAKKyAgICAgICAgfSAKKyAgICB9IAorCisgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX25vX2FjaywgbVNldHRpbmdzLT5tU29jaywgY291bnQgKTsgCit9IAorLy8gZW5kIHdyaXRlX1VEUF9GSU4gCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9zcmMvRXh0cmFjdG9yLmMgYi9pcGVyZi0yLjAuNS9zcmMvRXh0cmFjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3MWViZgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L3NyYy9FeHRyYWN0b3IuYwpAQCAtMCwwICsxLDE4OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICogRXh0cmFjdG9yLmNwcAorICogYnkgQWpheSBUaXJ1bWFsYSAodGlydW1hbGFAbmNzYS51aXVjLmVkdSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEV4dHJhY3QgZGF0YSBmcm9tIGEgZmlsZSwgdXNlZCB0byBtZWFzdXJlIHRoZSB0cmFuc2ZlciByYXRlcworICogZm9yIHZhcmlvdXMgc3RyZWFtIGZvcm1hdHMuIAorICoKKyAqIEUuZy4gVXNlIGEgZ3ppcHBlZCBmaWxlIHRvIG1lYXN1cmUgdGhlIHRyYW5zZmVyIHJhdGVzIGZvciAKKyAqIGNvbXByZXNzZWQgZGF0YQorICogVXNlIGFuIE1QRUcgZmlsZSB0byBtZWFzdXJlIHRoZSB0cmFuc2ZlciByYXRlcyBvZiAKKyAqIE11bHRpbWVkaWEgZGF0YSBmb3JtYXRzCisgKiBVc2UgYSBwbGFpbiBCTVAgZmlsZSB0byBtZWFzdXJlIHRoZSB0cmFuc2ZlciByYXRlcyBvZiAKKyAqIFVuY29tcHJlc3NlZCBkYXRhCisgKgorICogVGhpcyBpcyBiZW5lZmljaWFsIGVzcGVjaWFsbHkgaW4gbWVhc3VyaW5nIGJhbmR3aWR0aCBhY3Jvc3MgV0FOCisgKiBsaW5rcyB3aGVyZSBkYXRhIGNvbXByZXNzaW9uIHRha2VzIHBsYWNlIGJlZm9yZSBkYXRhIHRyYW5zbWlzc2lvbiAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKi8KKworI2luY2x1ZGUgIkV4dHJhY3Rvci5oIgorCisKKy8qKgorICogQ29uc3RydWN0b3IKKyAqIEBhcmcgZmlsZU5hbWUgICBOYW1lIG9mIHRoZSBmaWxlIAorICogQGFyZyBzaXplICAgICAgIEJsb2NrIHNpemUgZm9yIHJlYWRpbmcKKyAqIE9wZW4gdGhlIGZpbGUgYW5kIHNldCB0aGUgYmxvY2sgc2l6ZQorICovCit2b2lkIEV4dHJhY3Rvcl9Jbml0aWFsaXplICggY2hhciAqZmlsZU5hbWUsIGludCBpblNpemUsIHRocmVhZF9TZXR0aW5ncyAqbVNldHRpbmdzICkgeworCisgICAgaWYgKCAobVNldHRpbmdzLT5FeHRyYWN0b3JfZmlsZSA9IGZvcGVuIChmaWxlTmFtZSwgInJiIikpID09IE5VTEwgKSB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIHRoZSBmaWxlIHN0cmVhbVxuIik7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldpbGwgdXNlIHRoZSBkZWZhdWx0IGRhdGEgc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU2V0dGluZ3MtPkV4dHJhY3Rvcl9zaXplID0gIGluU2l6ZTsKK30KKworCisvKioKKyAqIENvbnN0cnVjdG9yCisgKiBAYXJnIGZwICAgICAgICAgRmlsZSBQb2ludGVyIAorICogQGFyZyBzaXplICAgICAgIEJsb2NrIHNpemUgZm9yIHJlYWRpbmcKKyAqIFNldCB0aGUgYmxvY2sgc2l6ZSxmaWxlIHBvaW50ZXIKKyAqLwordm9pZCBFeHRyYWN0b3JfSW5pdGlhbGl6ZUZpbGUgKCBGSUxFICpmcCwgaW50IGluU2l6ZSwgdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKSB7CisgICAgbVNldHRpbmdzLT5FeHRyYWN0b3JfZmlsZSA9IGZwOworICAgIG1TZXR0aW5ncy0+RXh0cmFjdG9yX3NpemUgPSAgaW5TaXplOworfQorCisKKy8qKgorICogRGVzdHJ1Y3RvciAtIENsb3NlIHRoZSBmaWxlCisgKi8KK3ZvaWQgRXh0cmFjdG9yX0Rlc3Ryb3kgKCB0aHJlYWRfU2V0dGluZ3MgKm1TZXR0aW5ncyApIHsKKyAgICBpZiAoIG1TZXR0aW5ncy0+RXh0cmFjdG9yX2ZpbGUgIT0gTlVMTCApCisgICAgICAgIGZjbG9zZSggbVNldHRpbmdzLT5FeHRyYWN0b3JfZmlsZSApOworfQorCisKKy8qCisgKiBGZXRjaGVzIHRoZSBuZXh0IGRhdGEgYmxvY2sgZnJvbSAKKyAqIHRoZSBmaWxlCisgKiBAYXJnIGJsb2NrICAgICBQb2ludGVyIHRvIHRoZSBkYXRhIHJlYWQKKyAqIEByZXR1cm4gICAgICAgIE51bWJlciBvZiBieXRlcyByZWFkCisgKi8KK2ludCBFeHRyYWN0b3JfZ2V0TmV4dERhdGFCbG9jayAoIGNoYXIgKmRhdGEsIHRocmVhZF9TZXR0aW5ncyAqbVNldHRpbmdzICkgeworICAgIGlmICggRXh0cmFjdG9yX2NhblJlYWQoIG1TZXR0aW5ncyApICkgeworICAgICAgICByZXR1cm4oZnJlYWQoIGRhdGEsIDEsIG1TZXR0aW5ncy0+RXh0cmFjdG9yX3NpemUsIAorICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5ncy0+RXh0cmFjdG9yX2ZpbGUgKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEZ1bmN0aW9uIHdoaWNoIGRldGVybWluZXMgd2hldGhlcgorICogdGhlIGZpbGUgc3RyZWFtIGlzIHN0aWxsIHJlYWRhYmxlCisgKiBAcmV0dXJuIGJvb2xlYW4gICAgdHJ1ZSwgaWYgcmVhZGFibGU7IGZhbHNlLCBpZiBub3QKKyAqLworaW50IEV4dHJhY3Rvcl9jYW5SZWFkICggdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKSB7CisgICAgcmV0dXJuKCggbVNldHRpbmdzLT5FeHRyYWN0b3JfZmlsZSAhPSBOVUxMICkgCisgICAgICAgICAgICYmICEoZmVvZiggbVNldHRpbmdzLT5FeHRyYWN0b3JfZmlsZSApKSk7Cit9CisKKy8qKgorICogVGhpcyBpcyB1c2VkIHRvIHJlZHVjZSB0aGUgcmVhZCBzaXplCisgKiBVc2VkIGluIFVEUCB0cmFuc2ZlciB0byBhY2NvbW9kYXRlIHRoZQorICogdGhlIGhlYWRlciAodGltZXN0YW1wKQorICogQGFyZyBkZWx0YSAgICAgICAgIFNpemUgdG8gcmVkdWNlCisgKi8KK3ZvaWQgRXh0cmFjdG9yX3JlZHVjZVJlYWRTaXplICggaW50IGRlbHRhLCB0aHJlYWRfU2V0dGluZ3MgKm1TZXR0aW5ncyApIHsKKyAgICBtU2V0dGluZ3MtPkV4dHJhY3Rvcl9zaXplIC09IGRlbHRhOworfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvc3JjL0xhdW5jaC5jcHAgYi9pcGVyZi0yLjAuNS9zcmMvTGF1bmNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTg0YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvc3JjL0xhdW5jaC5jcHAKQEAgLTAsMCArMSwxNzEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBMYXVuY2guY3BwCisgKiBieSBLZXZpbiBHaWJicyA8a2dpYmJzQG5sYW5yLm5ldD4gCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogRnVuY3Rpb25zIHRvIGxhdW5jaCBuZXcgc2VydmVyIGFuZCBjbGllbnQgdGhyZWFkcyBmcm9tIEMgd2hpbGUKKyAqIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBhcmUgaW4gQysrLgorICogVGhlIGxhdW5jaCBmdW5jdGlvbiBmb3IgcmVwb3J0ZXJzIGlzIGluIFJlcG9ydGVyLmMgc2luY2UgaXQgaXMKKyAqIGluIEMgYW5kIGRvZXMgbm90IG5lZWQgYSBzcGVjaWFsIGxhdW5jaGluZyBmdW5jdGlvbi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisjaW5jbHVkZSAiVGhyZWFkLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaHBwIgorI2luY2x1ZGUgIkNsaWVudC5ocHAiCisjaW5jbHVkZSAiTGlzdGVuZXIuaHBwIgorI2luY2x1ZGUgIlNlcnZlci5ocHAiCisjaW5jbHVkZSAiUGVyZlNvY2tldC5ocHAiCisKKy8qCisgKiBsaXN0ZW5lcl9zcGF3biBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBMaXN0ZW5lciBjbGFzcworICogYW5kIGxhdW5jaGluZyB0aGUgbGlzdGVuZXIuIEl0IGlzIHByb3ZpZGVkIGFzIGEgbWVhbnMgZm9yCisgKiB0aGUgQyB0aHJlYWQgc3Vic3lzdGVtIHRvIGxhdW5jaCB0aGUgbGlzdGVuZXIgQysrIG9iamVjdC4KKyAqLwordm9pZCBsaXN0ZW5lcl9zcGF3biggdGhyZWFkX1NldHRpbmdzICp0aHJlYWQgKSB7CisgICAgTGlzdGVuZXIgKnRoZUxpc3RlbmVyID0gTlVMTDsKKworICAgIC8vIHN0YXJ0IHVwIGEgbGlzdGVuZXIKKyAgICB0aGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciggdGhyZWFkICk7CisjaWZuZGVmIFdJTjMyCisgICAgLy8gaGFuZGxpbmcgb2YgZGFlbW9uIG1vZGUgaW4gbm9uLXdpbjMyIGJ1aWxkcworICAgIGlmICggaXNEYWVtb24oIHRocmVhZCApICkgeworICAgICAgICB0aGVMaXN0ZW5lci0+cnVuQXNEYWVtb24oImlwZXJmIixMT0dfREFFTU9OKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIFN0YXJ0IGxpc3RlbmluZworICAgIHRoZUxpc3RlbmVyLT5SdW4oKTsKKyAgICBERUxFVEVfUFRSKCB0aGVMaXN0ZW5lciApOworfQorCisvKgorICogc2VydmVyX3NwYXduIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIFNlcnZlciBjbGFzcworICogYW5kIGxhdW5jaGluZyB0aGUgc2VydmVyLiBJdCBpcyBwcm92aWRlZCBhcyBhIG1lYW5zIGZvcgorICogdGhlIEMgdGhyZWFkIHN1YnN5c3RlbSB0byBsYXVuY2ggdGhlIHNlcnZlciBDKysgb2JqZWN0LgorICovCit2b2lkIHNlcnZlcl9zcGF3biggdGhyZWFkX1NldHRpbmdzICp0aHJlYWQpIHsKKyAgICBTZXJ2ZXIgKnRoZVNlcnZlciA9IE5VTEw7CisKKyAgICAvLyBTdGFydCB1cCB0aGUgc2VydmVyCisgICAgdGhlU2VydmVyID0gbmV3IFNlcnZlciggdGhyZWFkICk7CisgICAgCisgICAgLy8gUnVuIHRoZSB0ZXN0CisgICAgdGhlU2VydmVyLT5SdW4oKTsKKyAgICBERUxFVEVfUFRSKCB0aGVTZXJ2ZXIpOworfQorCisvKgorICogY2xpZW50X3NwYXduIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIENsaWVudCBjbGFzcworICogYW5kIGxhdW5jaGluZyB0aGUgY2xpZW50LiBJdCBpcyBwcm92aWRlZCBhcyBhIG1lYW5zIGZvcgorICogdGhlIEMgdGhyZWFkIHN1YnN5c3RlbSB0byBsYXVuY2ggdGhlIGNsaWVudCBDKysgb2JqZWN0LgorICovCit2b2lkIGNsaWVudF9zcGF3biggdGhyZWFkX1NldHRpbmdzICp0aHJlYWQgKSB7CisgICAgQ2xpZW50ICp0aGVDbGllbnQgPSBOVUxMOworCisgICAgLy9zdGFydCB1cCB0aGUgY2xpZW50CisgICAgdGhlQ2xpZW50ID0gbmV3IENsaWVudCggdGhyZWFkICk7CisKKyAgICAvLyBMZXQgdGhlIHNlcnZlciBrbm93IGFib3V0IG91ciBzZXR0aW5ncworICAgIHRoZUNsaWVudC0+SW5pdGlhdGVTZXJ2ZXIoKTsKKworICAgIC8vIFJ1biB0aGUgdGVzdAorICAgIHRoZUNsaWVudC0+UnVuKCk7CisgICAgREVMRVRFX1BUUiggdGhlQ2xpZW50ICk7Cit9CisKKy8qCisgKiBjbGllbnRfaW5pdCBoYW5kbGVzIG11bHRpcGxlIHRocmVhZGVkIGNvbm5lY3RzLiBJdCBjcmVhdGVzCisgKiBhIGxpc3RlbmVyIG9iamVjdCBpZiBlaXRoZXIgdGhlIGR1YWwgdGVzdCBvciB0cmFkZW9mZiB3ZXJlCisgKiBzcGVjaWZpZWQuIEl0IGFsc28gY3JlYXRlcyBzZXR0aW5ncyBzdHJ1Y3R1cmVzIGZvciBhbGwgdGhlCisgKiB0aHJlYWRzIGFuZCBhcnJhbmdlcyB0aGVtIHNvIHRoZXkgY2FuIGJlIG1hbmFnZWQgYW5kIHN0YXJ0ZWQKKyAqIHZpYSB0aGUgb25lIHNldHRpbmdzIHN0cnVjdHVyZSB0aGF0IHdhcyBwYXNzZWQgaW4uCisgKi8KK3ZvaWQgY2xpZW50X2luaXQoIHRocmVhZF9TZXR0aW5ncyAqY2xpZW50cyApIHsKKyAgICB0aHJlYWRfU2V0dGluZ3MgKml0ciA9IE5VTEw7CisgICAgdGhyZWFkX1NldHRpbmdzICpuZXh0ID0gTlVMTDsKKworICAgIC8vIFNldCB0aGUgZmlyc3QgdGhyZWFkIHRvIHJlcG9ydCBTZXR0aW5ncworICAgIHNldFJlcG9ydCggY2xpZW50cyApOworICAgIGl0ciA9IGNsaWVudHM7CisKKyAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBzdGFydCBhIGxpc3RlbmVyIGFzIHdlbGwKKyAgICBTZXR0aW5nc19HZW5lcmF0ZUxpc3RlbmVyU2V0dGluZ3MoIGNsaWVudHMsICZuZXh0ICk7CisKKyAgICAvLyBDcmVhdGUgYSBtdWx0aXBsZSByZXBvcnQgaGVhZGVyIHRvIGhhbmRsZSByZXBvcnRpbmcgdGhlCisgICAgLy8gc3VtIG9mIG11bHRpcGxlIGNsaWVudCB0aHJlYWRzCisgICAgTXV0ZXhfTG9jayggJmdyb3VwQ29uZCApOworICAgIGdyb3VwSUQtLTsKKyAgICBjbGllbnRzLT5tdWx0aWhkciA9IEluaXRNdWx0aSggY2xpZW50cywgZ3JvdXBJRCApOworICAgIE11dGV4X1VubG9jayggJmdyb3VwQ29uZCApOworCisjaWZkZWYgSEFWRV9USFJFQUQKKyAgICBpZiAoIG5leHQgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gV2UgaGF2ZSB0aHJlYWRzIGFuZCB3ZSBuZWVkIHRvIHN0YXJ0IGEgbGlzdGVuZXIgc28KKyAgICAgICAgLy8gaGF2ZSBpdCByYW4gYmVmb3JlIHRoZSBjbGllbnQgaXMgbGF1bmNoZWQKKyAgICAgICAgaXRyLT5ydW5Ob3cgPSBuZXh0OworICAgICAgICBpdHIgPSBuZXh0OworICAgIH0KKyNlbmRpZgorICAgIC8vIEZvciBlYWNoIG9mIHRoZSBuZWVkZWQgdGhyZWFkcyBjcmVhdGUgYSBjb3B5IG9mIHRoZQorICAgIC8vIHByb3ZpZGVkIHNldHRpbmdzLCB1bnNldHRpbmcgdGhlIHJlcG9ydCBmbGFnIGFuZCBhZGQKKyAgICAvLyB0byB0aGUgbGlzdCBvZiB0aHJlYWRzIHRvIHN0YXJ0CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbGllbnRzLT5tVGhyZWFkczsgaSsrKSB7CisgICAgICAgIFNldHRpbmdzX0NvcHkoIGNsaWVudHMsICZuZXh0ICk7CisgICAgICAgIHVuc2V0UmVwb3J0KCBuZXh0ICk7CisgICAgICAgIGl0ci0+cnVuTm93ID0gbmV4dDsKKyAgICAgICAgaXRyID0gbmV4dDsKKyAgICB9CisjaWZuZGVmIEhBVkVfVEhSRUFECisgICAgaWYgKCBuZXh0ICE9IE5VTEwgKSB7CisgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdGhyZWFkcyBhbmQgd2UgbmVlZCB0byBzdGFydCBhIGxpc3RlbmVyIHNvCisgICAgICAgIC8vIGhhdmUgaXQgcmFuIGFmdGVyIHRoZSBjbGllbnQgaXMgZmluaXNoZWQKKyAgICAgICAgaXRyLT5ydW5OZXh0ID0gbmV4dDsKKyAgICB9CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvc3JjL0xpc3QuY3BwIGIvaXBlcmYtMi4wLjUvc3JjL0xpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmEwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvTGlzdC5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIExpc3QuY3BwCisgKiBieSBLZXZpbiBHaWJicyA8a2dpYmJzQG5jc2EudWl1Yy5lZHU+IAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqLworCisjaW5jbHVkZSAiTGlzdC5oIgorI2luY2x1ZGUgIk11dGV4LmgiCisjaW5jbHVkZSAiU29ja2V0QWRkci5oIgorCisvKgorICogR2xvYmFsIExpc3QgYW5kIE11dGV4IHZhcmlhYmxlcworICovCitJcGVyZl9MaXN0RW50cnkgKmNsaWVudHMgPSBOVUxMOworTXV0ZXggY2xpZW50c19tdXRleDsgCisKKy8qCisgKiBBZGQgRW50cnkgYWRkIHRvIHRoZSBMaXN0CisgKi8KK3ZvaWQgSXBlcmZfcHVzaGJhY2sgKCBJcGVyZl9MaXN0RW50cnkgKmFkZCwgSXBlcmZfTGlzdEVudHJ5ICoqcm9vdCApIHsKKyAgICBhZGQtPm5leHQgPSAqcm9vdDsKKyAgICAqcm9vdCA9IGFkZDsKK30KKworLyoKKyAqIERlbGV0ZSBFbnRyeSBkZWwgZnJvbSB0aGUgTGlzdAorICovCit2b2lkIElwZXJmX2RlbGV0ZSAoIGlwZXJmX3NvY2thZGRyICpkZWwsIElwZXJmX0xpc3RFbnRyeSAqKnJvb3QgKSB7CisgICAgSXBlcmZfTGlzdEVudHJ5ICp0ZW1wID0gSXBlcmZfcHJlc2VudCggZGVsLCAqcm9vdCApOworICAgIGlmICggdGVtcCAhPSBOVUxMICkgeworICAgICAgICBpZiAoIHRlbXAgPT0gKnJvb3QgKSB7CisgICAgICAgICAgICAqcm9vdCA9ICgqcm9vdCktPm5leHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJcGVyZl9MaXN0RW50cnkgKml0ciA9ICpyb290OworICAgICAgICAgICAgd2hpbGUgKCBpdHItPm5leHQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0ci0+bmV4dCA9PSB0ZW1wICkgeworICAgICAgICAgICAgICAgICAgICBpdHItPm5leHQgPSBpdHItPm5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpdHIgPSBpdHItPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIHRlbXA7CisgICAgfQorfQorCisvKgorICogRGVzdHJveSB0aGUgTGlzdCAoY2xlYW51cCBmdW5jdGlvbikKKyAqLwordm9pZCBJcGVyZl9kZXN0cm95ICggSXBlcmZfTGlzdEVudHJ5ICoqcm9vdCApIHsKKyAgICBJcGVyZl9MaXN0RW50cnkgKml0cjEgPSAqcm9vdCwgKml0cjI7CisgICAgd2hpbGUgKCBpdHIxICE9IE5VTEwgKSB7CisgICAgICAgIGl0cjIgPSBpdHIxLT5uZXh0OworICAgICAgICBkZWxldGUgaXRyMTsKKyAgICAgICAgaXRyMSA9IGl0cjI7CisgICAgfQorICAgICpyb290ID0gTlVMTDsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBleGFjdCBFbnRyeSBmaW5kIGlzIHByZXNlbnQKKyAqLworSXBlcmZfTGlzdEVudHJ5KiBJcGVyZl9wcmVzZW50ICggaXBlcmZfc29ja2FkZHIgKmZpbmQsIElwZXJmX0xpc3RFbnRyeSAqcm9vdCApIHsKKyAgICBJcGVyZl9MaXN0RW50cnkgKml0ciA9IHJvb3Q7CisgICAgd2hpbGUgKCBpdHIgIT0gTlVMTCApIHsKKyAgICAgICAgaWYgKCBTb2NrQWRkcl9hcmVfRXF1YWwoIChzb2NrYWRkciopaXRyLCAoc29ja2FkZHIqKWZpbmQgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBpdHI7CisgICAgICAgIH0KKyAgICAgICAgaXRyID0gaXRyLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENoZWNrIGlmIGEgRW50cnkgZmluZCBpcyBpbiB0aGUgTGlzdCBvciBpZiBhbnkKKyAqIEVudHJ5IGV4aXN0cyB0aGF0IGhhcyB0aGUgc2FtZSBob3N0IGFzIHRoZSAKKyAqIEVudHJ5IGZpbmQKKyAqLworSXBlcmZfTGlzdEVudHJ5KiBJcGVyZl9ob3N0cHJlc2VudCAoIGlwZXJmX3NvY2thZGRyICpmaW5kLCBJcGVyZl9MaXN0RW50cnkgKnJvb3QgKSB7CisgICAgSXBlcmZfTGlzdEVudHJ5ICppdHIgPSByb290OworICAgIHdoaWxlICggaXRyICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggU29ja0FkZHJfSG9zdGFyZV9FcXVhbCggKHNvY2thZGRyKilpdHIsIChzb2NrYWRkciopZmluZCApICkgeworICAgICAgICAgICAgcmV0dXJuIGl0cjsKKyAgICAgICAgfQorICAgICAgICBpdHIgPSBpdHItPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvc3JjL0xpc3RlbmVyLmNwcCBiL2lwZXJmLTIuMC41L3NyYy9MaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlMzJkZQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L3NyYy9MaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw3MTYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBMaXN0ZW5lci5jcHAKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+IAorICogJiAgQWpheSBUaXJ1bWFsYSA8dGlydW1hbGFAbmNzYS51aXVjLmVkdT4gCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogTGlzdGVuZXIgc2V0cyB1cCBhIHNvY2tldCBsaXN0ZW5pbmcgb24gdGhlIHNlcnZlciBob3N0LiBGb3IgZWFjaCAKKyAqIGNvbm5lY3RlZCBzb2NrZXQgdGhhdCBhY2NlcHQoKSByZXR1cm5zLCB0aGlzIGNyZWF0ZXMgYSBTZXJ2ZXIgCisgKiBzb2NrZXQgYW5kIHNwYXducyBhIHRocmVhZCBmb3IgaXQuIAorICogCisgKiBDaGFuZ2VzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi4gTGlzdGVuZXIgd2lsbCBydW4gYXMgYSBkYWVtb24gCisgKiBNdWx0aWNhc3QgU2VydmVyIGlzIG5vdyBNdWx0aS10aHJlYWRlZCAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBoZWFkZXJzIAorICogdXNlcyAKKyAqICAgPHN0ZGxpYi5oPiAKKyAqICAgPHN0ZGlvLmg+IAorICogICA8c3RyaW5nLmg+IAorICogICA8ZXJybm8uaD4gCisgKiAKKyAqICAgPHN5cy90eXBlcy5oPiAKKyAqICAgPHVuaXN0ZC5oPiAKKyAqIAorICogICA8bmV0ZGIuaD4gCisgKiAgIDxuZXRpbmV0L2luLmg+IAorICogICA8c3lzL3NvY2tldC5oPiAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKKworI2RlZmluZSBIRUFERVJTKCkgCisKKyNpbmNsdWRlICJoZWFkZXJzLmgiIAorI2luY2x1ZGUgIkxpc3RlbmVyLmhwcCIKKyNpbmNsdWRlICJTb2NrZXRBZGRyLmgiCisjaW5jbHVkZSAiUGVyZlNvY2tldC5ocHAiCisjaW5jbHVkZSAiTGlzdC5oIgorI2luY2x1ZGUgInV0aWwuaCIgCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBTdG9yZXMgbG9jYWwgaG9zdG5hbWUgYW5kIHNvY2tldCBpbmZvLiAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKK0xpc3RlbmVyOjpMaXN0ZW5lciggdGhyZWFkX1NldHRpbmdzICppblNldHRpbmdzICkgeworCisgICAgbUNsaWVudHMgPSBpblNldHRpbmdzLT5tVGhyZWFkczsKKyAgICBtQnVmID0gTlVMTDsKKyAgICBtU2V0dGluZ3MgPSBpblNldHRpbmdzOworCisgICAgLy8gaW5pdGlhbGl6ZSBidWZmZXIKKyAgICBtQnVmID0gbmV3IGNoYXJbIG1TZXR0aW5ncy0+bUJ1ZkxlbiBdOworCisgICAgLy8gb3BlbiBsaXN0ZW5pbmcgc29ja2V0IAorICAgIExpc3RlbiggKTsgCisgICAgUmVwb3J0U2V0dGluZ3MoIGluU2V0dGluZ3MgKTsKKworfSAvLyBlbmQgTGlzdGVuZXIgCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBEZWxldGUgbWVtb3J5IChidWZmZXIpLiAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCitMaXN0ZW5lcjo6fkxpc3RlbmVyKCkgeworICAgIGlmICggbVNldHRpbmdzLT5tU29jayAhPSBJTlZBTElEX1NPQ0tFVCApIHsKKyAgICAgICAgaW50IHJjID0gY2xvc2UoIG1TZXR0aW5ncy0+bVNvY2sgKTsKKyAgICAgICAgV0FSTl9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAiY2xvc2UiICk7CisgICAgICAgIG1TZXR0aW5ncy0+bVNvY2sgPSBJTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgICAgREVMRVRFX0FSUkFZKCBtQnVmICk7Cit9IC8vIGVuZCB+TGlzdGVuZXIgCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBMaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBhbmQgc3RhcnRzIFNlcnZlcnMgdG8gaGFuZGxlIGRhdGEuIAorICogRm9yIFRDUCwgZWFjaCBhY2NlcHRlZCBjb25uZWN0aW9uIHNwYXducyBhIFNlcnZlciB0aHJlYWQuIAorICogRm9yIFVEUCwgaGFuZGxlIGFsbCBkYXRhIGluIHRoaXMgdGhyZWFkIGZvciBXaW4zMiBPbmx5LCBvdGhlcndpc2UKKyAqICAgICAgICAgIHNwYXduIGEgbmV3IFNlcnZlciB0aHJlYWQuIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKK3ZvaWQgTGlzdGVuZXI6OlJ1biggdm9pZCApIHsKKyNpZmRlZiBXSU4zMgorICAgIGlmICggaXNVRFAoIG1TZXR0aW5ncyApICYmICFpc1NpbmdsZVVEUCggbVNldHRpbmdzICkgKSB7CisgICAgICAgIFVEUFNpbmdsZVNlcnZlcigpOworICAgIH0gZWxzZQorI2Vsc2UKKyNpZmRlZiBzdW4KKyAgICBpZiAoICggaXNVRFAoIG1TZXR0aW5ncyApICYmIAorICAgICAgICAgICBpc011bHRpY2FzdCggbVNldHRpbmdzICkgJiYgCisgICAgICAgICAgICFpc1NpbmdsZVVEUCggbVNldHRpbmdzICkgKSB8fAorICAgICAgICAgaXNTaW5nbGVVRFAoIG1TZXR0aW5ncyApICkgeworICAgICAgICBVRFBTaW5nbGVTZXJ2ZXIoKTsKKyAgICB9IGVsc2UKKyNlbHNlCisgICAgaWYgKCBpc1NpbmdsZVVEUCggbVNldHRpbmdzICkgKSB7CisgICAgICAgIFVEUFNpbmdsZVNlcnZlcigpOworICAgIH0gZWxzZQorI2VuZGlmCisjZW5kaWYKKyAgICB7CisgICAgICAgIGJvb2wgY2xpZW50ID0gZmFsc2UsIFVEUCA9IGlzVURQKCBtU2V0dGluZ3MgKSwgbUNvdW50ID0gKG1TZXR0aW5ncy0+bVRocmVhZHMgIT0gMCk7CisgICAgICAgIHRocmVhZF9TZXR0aW5ncyAqdGVtcFNldHRpbmdzID0gTlVMTDsKKyAgICAgICAgSXBlcmZfTGlzdEVudHJ5ICpleGlzdCwgKmxpc3R0ZW1wOworICAgICAgICBjbGllbnRfaGRyKiBoZHIgPSAoIFVEUCA/IChjbGllbnRfaGRyKikgKCgoVURQX2RhdGFncmFtKiltQnVmKSArIDEpIDogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWVudF9oZHIqKSBtQnVmKTsKKyAgICAgICAgCisgICAgICAgIGlmICggbVNldHRpbmdzLT5tSG9zdCAhPSBOVUxMICkgeworICAgICAgICAgICAgY2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIFNvY2tBZGRyX3JlbW90ZUFkZHIoIG1TZXR0aW5ncyApOworICAgICAgICB9CisgICAgICAgIFNldHRpbmdzX0NvcHkoIG1TZXR0aW5ncywgJnNlcnZlciApOworICAgICAgICBzZXJ2ZXItPm1UaHJlYWRNb2RlID0ga01vZGVfU2VydmVyOworICAgIAorICAgIAorICAgICAgICAvLyBBY2NlcHQgZWFjaCBwYWNrZXQsIAorICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBleGlzdGluZyBjbGllbnQsIHRoZW4gc3RhcnQgIAorICAgICAgICAvLyBhIG5ldyB0aHJlYWQgdG8gc2VydmljZSB0aGUgbmV3IGNsaWVudCAKKyAgICAgICAgLy8gVGhlIGxpc3RlbmVyIHJ1bnMgaW4gYSBzaW5nbGUgdGhyZWFkIAorICAgICAgICAvLyBUaHJlYWQgcGVyIGNsaWVudCBtb2RlbCBpcyBmb2xsb3dlZCAKKyAgICAgICAgZG8geworICAgICAgICAgICAgLy8gR2V0IGEgbmV3IHNvY2tldAorICAgICAgICAgICAgQWNjZXB0KCBzZXJ2ZXIgKTsKKyAgICAgICAgICAgIGlmICggc2VydmVyLT5tU29jayA9PSBJTlZBTElEX1NPQ0tFVCApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc0ludGVydXB0ZWQgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBjbG9zZSggc2VydmVyLT5tU29jayApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVzZXQgU2luZ2xlIENsaWVudCBTdHVmZgorICAgICAgICAgICAgaWYgKCBpc1NpbmdsZUNsaWVudCggbVNldHRpbmdzICkgJiYgY2xpZW50cyA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIG1TZXR0aW5ncy0+cGVlciA9IHNlcnZlci0+cGVlcjsKKyAgICAgICAgICAgICAgICBtQ2xpZW50cy0tOworICAgICAgICAgICAgICAgIGNsaWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gT25jZSBhbGwgdGhlIHNlcnZlciB0aHJlYWRzIGV4aXQgdGhlbiBxdWl0CisgICAgICAgICAgICAgICAgLy8gTXVzdCBrZWVwIGdvaW5nIGluIGNhc2UgdGhpcyBjbGllbnQgc2VuZHMKKyAgICAgICAgICAgICAgICAvLyBtb3JlIHN0cmVhbXMKKyAgICAgICAgICAgICAgICBpZiAoIG1DbGllbnRzID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZF9yZWxlYXNlX25vbnRlcm0oIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgbUNsaWVudHMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IGl0IGlzIGFsbG93ZWQKKyAgICAgICAgICAgIGlmICggY2xpZW50ICkgeworICAgICAgICAgICAgICAgIGlmICggIVNvY2tBZGRyX0hvc3RhcmVfRXF1YWwoIChzb2NrYWRkciopICZtU2V0dGluZ3MtPnBlZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb2NrYWRkciopICZzZXJ2ZXItPnBlZXIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFsbG93ZWQgdHJ5IGFnYWluCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBzZXJ2ZXItPm1Tb2NrICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggaXNVRFAoIG1TZXR0aW5ncyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLT5tU29jayA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGVudHJ5IGZvciB0aGUgY29ubmVjdGlvbiBsaXN0CisgICAgICAgICAgICBsaXN0dGVtcCA9IG5ldyBJcGVyZl9MaXN0RW50cnk7CisgICAgICAgICAgICBtZW1jcHkobGlzdHRlbXAsICZzZXJ2ZXItPnBlZXIsIHNpemVvZihpcGVyZl9zb2NrYWRkcikpOworICAgICAgICAgICAgbGlzdHRlbXAtPm5leHQgPSBOVUxMOworICAgIAorICAgICAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gZG8gc3VtbWluZworICAgICAgICAgICAgTXV0ZXhfTG9jayggJmNsaWVudHNfbXV0ZXggKTsKKyAgICAgICAgICAgIGV4aXN0ID0gSXBlcmZfaG9zdHByZXNlbnQoICZzZXJ2ZXItPnBlZXIsIGNsaWVudHMpOyAKKyAgICAKKyAgICAgICAgICAgIGlmICggZXhpc3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBDb3B5IGdyb3VwIElECisgICAgICAgICAgICAgICAgbGlzdHRlbXAtPmhvbGRlciA9IGV4aXN0LT5ob2xkZXI7CisgICAgICAgICAgICAgICAgc2VydmVyLT5tdWx0aWhkciA9IGV4aXN0LT5ob2xkZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlcnZlci0+bVRocmVhZHMgPSAwOworICAgICAgICAgICAgICAgIE11dGV4X0xvY2soICZncm91cENvbmQgKTsKKyAgICAgICAgICAgICAgICBncm91cElELS07CisgICAgICAgICAgICAgICAgbGlzdHRlbXAtPmhvbGRlciA9IEluaXRNdWx0aSggc2VydmVyLCBncm91cElEICk7CisgICAgICAgICAgICAgICAgc2VydmVyLT5tdWx0aWhkciA9IGxpc3R0ZW1wLT5ob2xkZXI7CisgICAgICAgICAgICAgICAgTXV0ZXhfVW5sb2NrKCAmZ3JvdXBDb25kICk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAvLyBTdG9yZSBlbnRyeSBpbiBjb25uZWN0aW9uIGxpc3QKKyAgICAgICAgICAgIElwZXJmX3B1c2hiYWNrKCBsaXN0dGVtcCwgJmNsaWVudHMgKTsgCisgICAgICAgICAgICBNdXRleF9VbmxvY2soICZjbGllbnRzX211dGV4ICk7IAorICAgIAorICAgICAgICAgICAgdGVtcFNldHRpbmdzID0gTlVMTDsKKyAgICAgICAgICAgIGlmICggIWlzQ29tcGF0KCBtU2V0dGluZ3MgKSAmJiAhaXNNdWx0aWNhc3QoIG1TZXR0aW5ncyApICkgeworICAgICAgICAgICAgICAgIGlmICggIVVEUCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVENQIGRvZXMgbm90IGhhdmUgdGhlIGluZm8geWV0CisgICAgICAgICAgICAgICAgICAgIGlmICggcmVjdiggc2VydmVyLT5tU29jaywgKGNoYXIqKWhkciwgc2l6ZW9mKGNsaWVudF9oZHIpLCAwKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc19HZW5lcmF0ZUNsaWVudFNldHRpbmdzKCBzZXJ2ZXIsICZ0ZW1wU2V0dGluZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkciApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NfR2VuZXJhdGVDbGllbnRTZXR0aW5ncyggc2VydmVyLCAmdGVtcFNldHRpbmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgICAgIGlmICggdGVtcFNldHRpbmdzICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgY2xpZW50X2luaXQoIHRlbXBTZXR0aW5ncyApOworICAgICAgICAgICAgICAgIGlmICggdGVtcFNldHRpbmdzLT5tTW9kZSA9PSBrVGVzdF9EdWFsVGVzdCApIHsKKyNpZmRlZiBIQVZFX1RIUkVBRAorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPnJ1bk5vdyA9ICB0ZW1wU2V0dGluZ3M7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPnJ1bk5leHQgPSB0ZW1wU2V0dGluZ3M7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPnJ1bk5leHQgPSAgdGVtcFNldHRpbmdzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKEhBVkVfVEhSRUFEKQorICAgICAgICAgICAgaWYgKCBVRFAgKSB7CisgICAgICAgICAgICAgICAgLy8gV0lOMzIgZG9lcyBiYWQgVURQIGhhbmRsaW5nIHNvIHJ1biBzaW5nbGUgdGhyZWFkZWQKKyAgICAgICAgICAgICAgICBpZiAoIHNlcnZlci0+cnVuTm93ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZF9zdGFydCggc2VydmVyLT5ydW5Ob3cgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VydmVyX3NwYXduKCBzZXJ2ZXIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHNlcnZlci0+cnVuTmV4dCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRfc3RhcnQoIHNlcnZlci0+cnVuTmV4dCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB0aHJlYWRfc3RhcnQoIHNlcnZlciApOworICAgIAorICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHNvY2tldAorICAgICAgICAgICAgaWYgKCBVRFAgKSB7CisgICAgICAgICAgICAgICAgbVNldHRpbmdzLT5tU29jayA9IC0xOyAKKyAgICAgICAgICAgICAgICBMaXN0ZW4oICk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAvLyBQcmVwIGZvciBuZXh0IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmICggIWlzU2luZ2xlQ2xpZW50KCBtU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBtQ2xpZW50cy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0dGluZ3NfQ29weSggbVNldHRpbmdzLCAmc2VydmVyICk7CisgICAgICAgICAgICBzZXJ2ZXItPm1UaHJlYWRNb2RlID0ga01vZGVfU2VydmVyOworICAgICAgICB9IHdoaWxlICggIXNJbnRlcnVwdGVkICYmICghbUNvdW50IHx8ICggbUNvdW50ICYmIG1DbGllbnRzID4gMCApKSApOworICAgIAorICAgICAgICBTZXR0aW5nc19EZXN0cm95KCBzZXJ2ZXIgKTsKKyAgICB9Cit9IC8vIGVuZCBSdW4gCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldHVwIGEgc29ja2V0IGxpc3RlbmluZyBvbiBhIHBvcnQuCisgKiBGb3IgVENQLCB0aGlzIGNhbGxzIGJpbmQoKSBhbmQgbGlzdGVuKCkuCisgKiBGb3IgVURQLCB0aGlzIGp1c3QgY2FsbHMgYmluZCgpLgorICogSWYgaW5Mb2NhbGhvc3QgaXMgbm90IG51bGwsIGJpbmQgdG8gdGhhdCBhZGRyZXNzIHJhdGhlciB0aGFuIHRoZQorICogd2lsZGNhcmQgc2VydmVyIGFkZHJlc3MsIHNwZWNpZnlpbmcgd2hhdCBpbmNvbWluZyBpbnRlcmZhY2UgdG8KKyAqIGFjY2VwdCBjb25uZWN0aW9ucyBvbi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgTGlzdGVuZXI6Okxpc3RlbiggKSB7CisgICAgaW50IHJjOworCisgICAgU29ja0FkZHJfbG9jYWxBZGRyKCBtU2V0dGluZ3MgKTsKKworICAgIC8vIGNyZWF0ZSBhbiBpbnRlcm5ldCBUQ1Agc29ja2V0CisgICAgaW50IHR5cGUgPSAoaXNVRFAoIG1TZXR0aW5ncyApICA/ICBTT0NLX0RHUkFNICA6ICBTT0NLX1NUUkVBTSk7CisgICAgaW50IGRvbWFpbiA9IChTb2NrQWRkcl9pc0lQdjYoICZtU2V0dGluZ3MtPmxvY2FsICkgPyAKKyNpZmRlZiBIQVZFX0lQVjYKKyAgICAgICAgICAgICAgICAgIEFGX0lORVQ2CisjZWxzZQorICAgICAgICAgICAgICAgICAgQUZfSU5FVAorI2VuZGlmCisgICAgICAgICAgICAgICAgICA6IEFGX0lORVQpOworCisjaWZkZWYgV0lOMzIKKyAgICBpZiAoIFNvY2tBZGRyX2lzTXVsdGljYXN0KCAmbVNldHRpbmdzLT5sb2NhbCApICkgeworICAgICAgICAvLyBNdWx0aWNhc3Qgb24gV2luMzIgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZworICAgICAgICBtU2V0dGluZ3MtPm1Tb2NrID0gV1NBU29ja2V0KCBkb21haW4sIHR5cGUsIDAsIDAsIDAsIFdTQV9GTEFHX01VTFRJUE9JTlRfQ19MRUFGIHwgV1NBX0ZMQUdfTVVMVElQT0lOVF9EX0xFQUYgKTsKKyAgICAgICAgV0FSTl9lcnJubyggbVNldHRpbmdzLT5tU29jayA9PSBJTlZBTElEX1NPQ0tFVCwgInNvY2tldCIgKTsKKworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBtU2V0dGluZ3MtPm1Tb2NrID0gc29ja2V0KCBkb21haW4sIHR5cGUsIDAgKTsKKyAgICAgICAgV0FSTl9lcnJubyggbVNldHRpbmdzLT5tU29jayA9PSBJTlZBTElEX1NPQ0tFVCwgInNvY2tldCIgKTsKKyAgICB9IAorCisgICAgU2V0U29ja2V0T3B0aW9ucyggbVNldHRpbmdzICk7CisKKyAgICAvLyByZXVzZSB0aGUgYWRkcmVzcywgc28gd2UgY2FuIHJ1biBpZiBhIGZvcm1lciBzZXJ2ZXIgd2FzIGtpbGxlZCBvZmYKKyAgICBpbnQgYm9vbGVhbiA9IDE7CisgICAgU29ja2xlbl90IGxlbiA9IHNpemVvZihib29sZWFuKTsKKyAgICBzZXRzb2Nrb3B0KCBtU2V0dGluZ3MtPm1Tb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyKikgJmJvb2xlYW4sIGxlbiApOworCisgICAgLy8gYmluZCBzb2NrZXQgdG8gc2VydmVyIGFkZHJlc3MKKyNpZmRlZiBXSU4zMgorICAgIGlmICggU29ja0FkZHJfaXNNdWx0aWNhc3QoICZtU2V0dGluZ3MtPmxvY2FsICkgKSB7CisgICAgICAgIC8vIE11bHRpY2FzdCBvbiBXaW4zMiByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nCisgICAgICAgIHJjID0gV1NBSm9pbkxlYWYoIG1TZXR0aW5ncy0+bVNvY2ssIChzb2NrYWRkciopICZtU2V0dGluZ3MtPmxvY2FsLCBtU2V0dGluZ3MtPnNpemVfbG9jYWwsMCwwLDAsMCxKTF9CT1RIKTsKKyAgICAgICAgV0FSTl9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAiV1NBSm9pbkxlYWYgKGFrYSBiaW5kKSIgKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgcmMgPSBiaW5kKCBtU2V0dGluZ3MtPm1Tb2NrLCAoc29ja2FkZHIqKSAmbVNldHRpbmdzLT5sb2NhbCwgbVNldHRpbmdzLT5zaXplX2xvY2FsICk7CisgICAgICAgIFdBUk5fZXJybm8oIHJjID09IFNPQ0tFVF9FUlJPUiwgImJpbmQiICk7CisgICAgfQorICAgIC8vIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgKFRDUCBvbmx5KS4KKyAgICAvLyBkZWZhdWx0IGJhY2tsb2cgdHJhZGl0aW9uYWxseSA1CisgICAgaWYgKCAhaXNVRFAoIG1TZXR0aW5ncyApICkgeworICAgICAgICByYyA9IGxpc3RlbiggbVNldHRpbmdzLT5tU29jaywgNSApOworICAgICAgICBXQVJOX2Vycm5vKCByYyA9PSBTT0NLRVRfRVJST1IsICJsaXN0ZW4iICk7CisgICAgfQorCisjaWZuZGVmIFdJTjMyCisgICAgLy8gaWYgbXVsdGljYXN0LCBqb2luIHRoZSBncm91cAorICAgIGlmICggU29ja0FkZHJfaXNNdWx0aWNhc3QoICZtU2V0dGluZ3MtPmxvY2FsICkgKSB7CisgICAgICAgIE1jYXN0Sm9pbiggKTsKKyAgICB9CisjZW5kaWYKK30gLy8gZW5kIExpc3RlbgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBKb2lucyB0aGUgbXVsdGljYXN0IGdyb3VwLCB3aXRoIHRoZSBkZWZhdWx0IGludGVyZmFjZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBMaXN0ZW5lcjo6TWNhc3RKb2luKCApIHsKKyNpZmRlZiBIQVZFX01VTFRJQ0FTVAorICAgIGlmICggIVNvY2tBZGRyX2lzSVB2NiggJm1TZXR0aW5ncy0+bG9jYWwgKSApIHsKKyAgICAgICAgc3RydWN0IGlwX21yZXEgbXJlcTsKKworICAgICAgICBtZW1jcHkoICZtcmVxLmltcl9tdWx0aWFkZHIsIFNvY2tBZGRyX2dldF9pbl9hZGRyKCAmbVNldHRpbmdzLT5sb2NhbCApLCAKKyAgICAgICAgICAgICAgICBzaXplb2YobXJlcS5pbXJfbXVsdGlhZGRyKSk7CisKKyAgICAgICAgbXJlcS5pbXJfaW50ZXJmYWNlLnNfYWRkciA9IGh0b25sKCBJTkFERFJfQU5ZICk7CisKKyAgICAgICAgaW50IHJjID0gc2V0c29ja29wdCggbVNldHRpbmdzLT5tU29jaywgSVBQUk9UT19JUCwgSVBfQUREX01FTUJFUlNISVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgJm1yZXEsIHNpemVvZihtcmVxKSk7CisgICAgICAgIFdBUk5fZXJybm8oIHJjID09IFNPQ0tFVF9FUlJPUiwgIm11bHRpY2FzdCBqb2luIiApOworICAgIH0KKyNpZmRlZiBIQVZFX0lQVjZfTVVMVElDQVNUCisgICAgICBlbHNlIHsKKyAgICAgICAgc3RydWN0IGlwdjZfbXJlcSBtcmVxOworCisgICAgICAgIG1lbWNweSggJm1yZXEuaXB2Nm1yX211bHRpYWRkciwgU29ja0FkZHJfZ2V0X2luNl9hZGRyKCAmbVNldHRpbmdzLT5sb2NhbCApLCAKKyAgICAgICAgICAgICAgICBzaXplb2YobXJlcS5pcHY2bXJfbXVsdGlhZGRyKSk7CisKKyAgICAgICAgbXJlcS5pcHY2bXJfaW50ZXJmYWNlID0gMDsKKworICAgICAgICBpbnQgcmMgPSBzZXRzb2Nrb3B0KCBtU2V0dGluZ3MtPm1Tb2NrLCBJUFBST1RPX0lQVjYsIElQVjZfQUREX01FTUJFUlNISVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgJm1yZXEsIHNpemVvZihtcmVxKSk7CisgICAgICAgIFdBUk5fZXJybm8oIHJjID09IFNPQ0tFVF9FUlJPUiwgIm11bHRpY2FzdCBqb2luIiApOworICAgIH0KKyNlbmRpZgorI2VuZGlmCit9CisvLyBlbmQgTWNhc3RKb2luCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldHMgdGhlIE11bHRpY2FzdCBUVEwgZm9yIG91dGdvaW5nIHBhY2tldHMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgTGlzdGVuZXI6Ok1jYXN0U2V0VFRMKCBpbnQgdmFsICkgeworI2lmZGVmIEhBVkVfTVVMVElDQVNUCisgICAgaWYgKCAhU29ja0FkZHJfaXNJUHY2KCAmbVNldHRpbmdzLT5sb2NhbCApICkgeworICAgICAgICBpbnQgcmMgPSBzZXRzb2Nrb3B0KCBtU2V0dGluZ3MtPm1Tb2NrLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfVFRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopICZ2YWwsIHNpemVvZih2YWwpKTsKKyAgICAgICAgV0FSTl9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAibXVsdGljYXN0IHR0bCIgKTsKKyAgICB9CisjaWZkZWYgSEFWRV9JUFY2X01VTFRJQ0FTVAorICAgICAgZWxzZSB7CisgICAgICAgIGludCByYyA9IHNldHNvY2tvcHQoIG1TZXR0aW5ncy0+bVNvY2ssIElQUFJPVE9fSVBWNiwgSVBWNl9NVUxUSUNBU1RfSE9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAmdmFsLCBzaXplb2YodmFsKSk7CisgICAgICAgIFdBUk5fZXJybm8oIHJjID09IFNPQ0tFVF9FUlJPUiwgIm11bHRpY2FzdCB0dGwiICk7CisgICAgfQorI2VuZGlmCisjZW5kaWYKK30KKy8vIGVuZCBNY2FzdFNldFRUTAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBZnRlciBMaXN0ZW4oKSBoYXMgc2V0dXAgbVNvY2ssIHRoaXMgd2lsbCBibG9jaworICogdW50aWwgYSBuZXcgY29ubmVjdGlvbiBhcnJpdmVzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIExpc3RlbmVyOjpBY2NlcHQoIHRocmVhZF9TZXR0aW5ncyAqc2VydmVyICkgeworCisgICAgc2VydmVyLT5zaXplX3BlZXIgPSBzaXplb2YoaXBlcmZfc29ja2FkZHIpOyAKKyAgICBpZiAoIGlzVURQKCBzZXJ2ZXIgKSApIHsKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAgICAgICAgICogRG8gdGhlIGVxdWl2YWxlbnQgb2YgYW4gYWNjZXB0KCkgY2FsbCBmb3IgVURQIHNvY2tldHMuIFRoaXMgd2FpdHMgCisgICAgICAgICAqIG9uIGEgbGlzdGVuaW5nIFVEUCBzb2NrZXQgdW50aWwgd2UgZ2V0IGEgZGF0YWdyYW0uIAorICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIGludCByYzsKKyAgICAgICAgSXBlcmZfTGlzdEVudHJ5ICpleGlzdDsKKyAgICAgICAgaW50MzJfdCBkYXRhZ3JhbUlEOworICAgICAgICBzZXJ2ZXItPm1Tb2NrID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIHdoaWxlICggc2VydmVyLT5tU29jayA9PSBJTlZBTElEX1NPQ0tFVCApIHsKKyAgICAgICAgICAgIHJjID0gcmVjdmZyb20oIG1TZXR0aW5ncy0+bVNvY2ssIG1CdWYsIG1TZXR0aW5ncy0+bUJ1ZkxlbiwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyKikgJnNlcnZlci0+cGVlciwgJnNlcnZlci0+c2l6ZV9wZWVyICk7CisgICAgICAgICAgICBGQUlMX2Vycm5vKCByYyA9PSBTT0NLRVRfRVJST1IsICJyZWN2ZnJvbSIsIG1TZXR0aW5ncyApOworCisgICAgICAgICAgICBNdXRleF9Mb2NrKCAmY2xpZW50c19tdXRleCApOworICAgIAorICAgICAgICAgICAgLy8gSGFuZGxlIGNvbm5lY3Rpb24gZm9yIFVEUCBzb2NrZXRzLgorICAgICAgICAgICAgZXhpc3QgPSBJcGVyZl9wcmVzZW50KCAmc2VydmVyLT5wZWVyLCBjbGllbnRzKTsKKyAgICAgICAgICAgIGRhdGFncmFtSUQgPSBudG9obCggKChVRFBfZGF0YWdyYW0qKSBtQnVmKS0+aWQgKTsgCisgICAgICAgICAgICBpZiAoIGV4aXN0ID09IE5VTEwgJiYgZGF0YWdyYW1JRCA+PSAwICkgeworICAgICAgICAgICAgICAgIHNlcnZlci0+bVNvY2sgPSBtU2V0dGluZ3MtPm1Tb2NrOworICAgICAgICAgICAgICAgIGludCByYyA9IGNvbm5lY3QoIHNlcnZlci0+bVNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSAmc2VydmVyLT5wZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci0+c2l6ZV9wZWVyICk7CisgICAgICAgICAgICAgICAgRkFJTF9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAiY29ubmVjdCBVRFAiLCBtU2V0dGluZ3MgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VydmVyLT5tU29jayA9IElOVkFMSURfU09DS0VUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTXV0ZXhfVW5sb2NrKCAmY2xpZW50c19tdXRleCApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSGFuZGxlcyBpbnRlcnVwdGVkIGFjY2VwdHMuIFJldHVybnMgdGhlIG5ld2x5IGNvbm5lY3RlZCBzb2NrZXQuCisgICAgICAgIHNlcnZlci0+bVNvY2sgPSBJTlZBTElEX1NPQ0tFVDsKKyAgICAKKyAgICAgICAgd2hpbGUgKCBzZXJ2ZXItPm1Tb2NrID09IElOVkFMSURfU09DS0VUICkgeworICAgICAgICAgICAgLy8gYWNjZXB0IGEgY29ubmVjdGlvbgorICAgICAgICAgICAgc2VydmVyLT5tU29jayA9IGFjY2VwdCggbVNldHRpbmdzLT5tU29jaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2FkZHIqKSAmc2VydmVyLT5wZWVyLCAmc2VydmVyLT5zaXplX3BlZXIgKTsKKyAgICAgICAgICAgIGlmICggc2VydmVyLT5tU29jayA9PSBJTlZBTElEX1NPQ0tFVCAmJiAgZXJybm8gPT0gRUlOVFIgKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc2VydmVyLT5zaXplX2xvY2FsID0gc2l6ZW9mKGlwZXJmX3NvY2thZGRyKTsgCisgICAgZ2V0c29ja25hbWUoIHNlcnZlci0+bVNvY2ssIChzb2NrYWRkciopICZzZXJ2ZXItPmxvY2FsLCAKKyAgICAgICAgICAgICAgICAgJnNlcnZlci0+c2l6ZV9sb2NhbCApOworfSAvLyBlbmQgQWNjZXB0CisKK3ZvaWQgTGlzdGVuZXI6OlVEUFNpbmdsZVNlcnZlciggKSB7CisgICAgCisgICAgYm9vbCBjbGllbnQgPSBmYWxzZSwgVURQID0gaXNVRFAoIG1TZXR0aW5ncyApLCBtQ291bnQgPSAobVNldHRpbmdzLT5tVGhyZWFkcyAhPSAwKTsKKyAgICB0aHJlYWRfU2V0dGluZ3MgKnRlbXBTZXR0aW5ncyA9IE5VTEw7CisgICAgSXBlcmZfTGlzdEVudHJ5ICpleGlzdCwgKmxpc3R0ZW1wOworICAgIGludCByYzsKKyAgICBpbnQzMl90IGRhdGFncmFtSUQ7CisgICAgY2xpZW50X2hkciogaGRyID0gKCBVRFAgPyAoY2xpZW50X2hkciopICgoKFVEUF9kYXRhZ3JhbSopbUJ1ZikgKyAxKSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWVudF9oZHIqKSBtQnVmKTsKKyAgICBSZXBvcnRTdHJ1Y3QgKnJlcG9ydHN0cnVjdCA9IG5ldyBSZXBvcnRTdHJ1Y3Q7CisgICAgCisgICAgaWYgKCBtU2V0dGluZ3MtPm1Ib3N0ICE9IE5VTEwgKSB7CisgICAgICAgIGNsaWVudCA9IHRydWU7CisgICAgICAgIFNvY2tBZGRyX3JlbW90ZUFkZHIoIG1TZXR0aW5ncyApOworICAgIH0KKyAgICBTZXR0aW5nc19Db3B5KCBtU2V0dGluZ3MsICZzZXJ2ZXIgKTsKKyAgICBzZXJ2ZXItPm1UaHJlYWRNb2RlID0ga01vZGVfU2VydmVyOworCisKKyAgICAvLyBBY2NlcHQgZWFjaCBwYWNrZXQsIAorICAgIC8vIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGNsaWVudCwgdGhlbiBzdGFydCAgCisgICAgLy8gYSBuZXcgcmVwb3J0IHRvIHNlcnZpY2UgdGhlIG5ldyBjbGllbnQgCisgICAgLy8gVGhlIGxpc3RlbmVyIHJ1bnMgaW4gYSBzaW5nbGUgdGhyZWFkIAorICAgIE11dGV4X0xvY2soICZjbGllbnRzX211dGV4ICk7CisgICAgZG8geworICAgICAgICAvLyBHZXQgbmV4dCBwYWNrZXQKKyAgICAgICAgd2hpbGUgKCBzSW50ZXJ1cHRlZCA9PSAwKSB7CisgICAgICAgICAgICBzZXJ2ZXItPnNpemVfcGVlciA9IHNpemVvZiggaXBlcmZfc29ja2FkZHIgKTsKKyAgICAgICAgICAgIHJjID0gcmVjdmZyb20oIG1TZXR0aW5ncy0+bVNvY2ssIG1CdWYsIG1TZXR0aW5ncy0+bUJ1ZkxlbiwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyKikgJnNlcnZlci0+cGVlciwgJnNlcnZlci0+c2l6ZV9wZWVyICk7CisgICAgICAgICAgICBXQVJOX2Vycm5vKCByYyA9PSBTT0NLRVRfRVJST1IsICJyZWN2ZnJvbSIgKTsKKyAgICAgICAgICAgIGlmICggcmMgPT0gU09DS0VUX0VSUk9SICkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgLy8gSGFuZGxlIGNvbm5lY3Rpb24gZm9yIFVEUCBzb2NrZXRzLgorICAgICAgICAgICAgZXhpc3QgPSBJcGVyZl9wcmVzZW50KCAmc2VydmVyLT5wZWVyLCBjbGllbnRzKTsKKyAgICAgICAgICAgIGRhdGFncmFtSUQgPSBudG9obCggKChVRFBfZGF0YWdyYW0qKSBtQnVmKS0+aWQgKTsgCisgICAgICAgICAgICBpZiAoIGRhdGFncmFtSUQgPj0gMCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGV4aXN0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIGRhdGFncmFtIElEIGFuZCBzZW50VGltZSBvdXQgb2YgdGhlIGJ1ZmZlciAKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0c3RydWN0LT5wYWNrZXRJRCA9IGRhdGFncmFtSUQ7IAorICAgICAgICAgICAgICAgICAgICByZXBvcnRzdHJ1Y3QtPnNlbnRUaW1lLnR2X3NlYyA9IG50b2hsKCAoKFVEUF9kYXRhZ3JhbSopIG1CdWYpLT50dl9zZWMgICk7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydHN0cnVjdC0+c2VudFRpbWUudHZfdXNlYyA9IG50b2hsKCAoKFVEUF9kYXRhZ3JhbSopIG1CdWYpLT50dl91c2VjICk7IAorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0c3RydWN0LT5wYWNrZXRMZW4gPSByYzsKKyAgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCAmKHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZSksIE5VTEwgKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFJlcG9ydFBhY2tldCggZXhpc3QtPnNlcnZlci0+cmVwb3J0aGRyLCByZXBvcnRzdHJ1Y3QgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBNdXRleF9Mb2NrKCAmZ3JvdXBDb25kICk7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwSUQtLTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLT5tU29jayA9IC1ncm91cElEOworICAgICAgICAgICAgICAgICAgICBNdXRleF9VbmxvY2soICZncm91cENvbmQgKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLT5zaXplX2xvY2FsID0gc2l6ZW9mKGlwZXJmX3NvY2thZGRyKTsgCisgICAgICAgICAgICAgICAgICAgIGdldHNvY2tuYW1lKCBtU2V0dGluZ3MtPm1Tb2NrLCAoc29ja2FkZHIqKSAmc2VydmVyLT5sb2NhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VydmVyLT5zaXplX2xvY2FsICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBleGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSBkYXRhZ3JhbSBJRCBhbmQgc2VudFRpbWUgb3V0IG9mIHRoZSBidWZmZXIgCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydHN0cnVjdC0+cGFja2V0SUQgPSAtZGF0YWdyYW1JRDsgCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydHN0cnVjdC0+c2VudFRpbWUudHZfc2VjID0gbnRvaGwoICgoVURQX2RhdGFncmFtKikgbUJ1ZiktPnR2X3NlYyAgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0c3RydWN0LT5zZW50VGltZS50dl91c2VjID0gbnRvaGwoICgoVURQX2RhdGFncmFtKikgbUJ1ZiktPnR2X3VzZWMgKTsgCisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXBvcnRzdHJ1Y3QtPnBhY2tldExlbiA9IHJjOworICAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoICYocmVwb3J0c3RydWN0LT5wYWNrZXRUaW1lKSwgTlVMTCApOworICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgUmVwb3J0UGFja2V0KCBleGlzdC0+c2VydmVyLT5yZXBvcnRoZHIsIHJlcG9ydHN0cnVjdCApOworICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHRpbWluZyAKKyAgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCAmKHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZSksIE5VTEwgKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xvc2VSZXBvcnQoIGV4aXN0LT5zZXJ2ZXItPnJlcG9ydGhkciwgcmVwb3J0c3RydWN0ICk7CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIHJjID4gKGludCkgKCBzaXplb2YoIFVEUF9kYXRhZ3JhbSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiggc2VydmVyX2hkciApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVRFBfZGF0YWdyYW0gKlVEUF9IZHI7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaGRyICpoZHI7CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgVURQX0hkciA9IChVRFBfZGF0YWdyYW0qKSBtQnVmOworICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJfSW5mbyAqc3RhdHMgPSBHZXRSZXBvcnQoIGV4aXN0LT5zZXJ2ZXItPnJlcG9ydGhkciApOworICAgICAgICAgICAgICAgICAgICAgICAgaGRyID0gKHNlcnZlcl9oZHIqKSAoVURQX0hkcisxKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBoZHItPmZsYWdzICAgICAgICA9IGh0b25sKCBIRUFERVJfVkVSU0lPTjEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkci0+dG90YWxfbGVuMSAgID0gaHRvbmwoIChsb25nKSAoc3RhdHMtPlRvdGFsTGVuID4+IDMyKSApOworICAgICAgICAgICAgICAgICAgICAgICAgaGRyLT50b3RhbF9sZW4yICAgPSBodG9ubCggKGxvbmcpIChzdGF0cy0+VG90YWxMZW4gJiAweEZGRkZGRkZGKSApOworICAgICAgICAgICAgICAgICAgICAgICAgaGRyLT5zdG9wX3NlYyAgICAgPSBodG9ubCggKGxvbmcpIHN0YXRzLT5lbmRUaW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZHItPnN0b3BfdXNlYyAgICA9IGh0b25sKCAobG9uZykoKHN0YXRzLT5lbmRUaW1lIC0gKGxvbmcpc3RhdHMtPmVuZFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByTWlsbGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgaGRyLT5lcnJvcl9jbnQgICAgPSBodG9ubCggc3RhdHMtPmNudEVycm9yICk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZHItPm91dG9yZGVyX2NudCA9IGh0b25sKCBzdGF0cy0+Y250T3V0b2ZPcmRlciApOworICAgICAgICAgICAgICAgICAgICAgICAgaGRyLT5kYXRhZ3JhbXMgICAgPSBodG9ubCggc3RhdHMtPmNudERhdGFncmFtcyApOworICAgICAgICAgICAgICAgICAgICAgICAgaGRyLT5qaXR0ZXIxICAgICAgPSBodG9ubCggKGxvbmcpIHN0YXRzLT5qaXR0ZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkci0+aml0dGVyMiAgICAgID0gaHRvbmwoIChsb25nKSAoKHN0YXRzLT5qaXR0ZXIgLSAobG9uZylzdGF0cy0+aml0dGVyKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByTWlsbGlvbikgKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRW5kUmVwb3J0KCBleGlzdC0+c2VydmVyLT5yZXBvcnRoZHIgKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpc3QtPnNlcnZlci0+cmVwb3J0aGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgSXBlcmZfZGVsZXRlKCAmKGV4aXN0LT5zZXJ2ZXItPnBlZXIpLCAmY2xpZW50cyApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHJjID4gKGludCkgKCBzaXplb2YoIFVEUF9kYXRhZ3JhbSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKCBzZXJ2ZXJfaGRyICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgVURQX2RhdGFncmFtICpVRFBfSGRyOworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaGRyICpoZHI7CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBVRFBfSGRyID0gKFVEUF9kYXRhZ3JhbSopIG1CdWY7CisgICAgICAgICAgICAgICAgICAgIGhkciA9IChzZXJ2ZXJfaGRyKikgKFVEUF9IZHIrMSk7CisgICAgICAgICAgICAgICAgICAgIGhkci0+ZmxhZ3MgPSBodG9ubCggMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kdG8oIG1TZXR0aW5ncy0+bVNvY2ssIG1CdWYsIG1TZXR0aW5ncy0+bUJ1ZkxlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIqKSAmc2VydmVyLT5wZWVyLCBzZXJ2ZXItPnNpemVfcGVlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzZXJ2ZXItPm1Tb2NrID09IElOVkFMSURfU09DS0VUICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzSW50ZXJ1cHRlZCAhPSAwICkgeworICAgICAgICAgICAgY2xvc2UoIHNlcnZlci0+bVNvY2sgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFJlc2V0IFNpbmdsZSBDbGllbnQgU3R1ZmYKKyAgICAgICAgaWYgKCBpc1NpbmdsZUNsaWVudCggbVNldHRpbmdzICkgJiYgY2xpZW50cyA9PSBOVUxMICkgeworICAgICAgICAgICAgbVNldHRpbmdzLT5wZWVyID0gc2VydmVyLT5wZWVyOworICAgICAgICAgICAgbUNsaWVudHMtLTsKKyAgICAgICAgICAgIGNsaWVudCA9IHRydWU7CisgICAgICAgICAgICAvLyBPbmNlIGFsbCB0aGUgc2VydmVyIHRocmVhZHMgZXhpdCB0aGVuIHF1aXQKKyAgICAgICAgICAgIC8vIE11c3Qga2VlcCBnb2luZyBpbiBjYXNlIHRoaXMgY2xpZW50IHNlbmRzCisgICAgICAgICAgICAvLyBtb3JlIHN0cmVhbXMKKyAgICAgICAgICAgIGlmICggbUNsaWVudHMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRfcmVsZWFzZV9ub250ZXJtKCAwICk7CisgICAgICAgICAgICAgICAgbUNsaWVudHMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IGl0IGlzIGFsbG93ZWQKKyAgICAgICAgaWYgKCBjbGllbnQgKSB7CisgICAgICAgICAgICBpZiAoICFTb2NrQWRkcl9Ib3N0YXJlX0VxdWFsKCAoc29ja2FkZHIqKSAmbVNldHRpbmdzLT5wZWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb2NrYWRkciopICZzZXJ2ZXItPnBlZXIgKSApIHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgYWxsb3dlZCB0cnkgYWdhaW4KKyAgICAgICAgICAgICAgICBjb25uZWN0KCBtU2V0dGluZ3MtPm1Tb2NrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc29ja2FkZHIqKSAmc2VydmVyLT5wZWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXItPnNpemVfcGVlciApOworICAgICAgICAgICAgICAgIGNsb3NlKCBtU2V0dGluZ3MtPm1Tb2NrICk7CisgICAgICAgICAgICAgICAgbVNldHRpbmdzLT5tU29jayA9IC0xOyAKKyAgICAgICAgICAgICAgICBMaXN0ZW4oICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW4gZW50cnkgZm9yIHRoZSBjb25uZWN0aW9uIGxpc3QKKyAgICAgICAgbGlzdHRlbXAgPSBuZXcgSXBlcmZfTGlzdEVudHJ5OworICAgICAgICBtZW1jcHkobGlzdHRlbXAsICZzZXJ2ZXItPnBlZXIsIHNpemVvZihpcGVyZl9zb2NrYWRkcikpOworICAgICAgICBsaXN0dGVtcC0+c2VydmVyID0gc2VydmVyOworICAgICAgICBsaXN0dGVtcC0+bmV4dCA9IE5VTEw7CisKKyAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gZG8gc3VtbWluZworICAgICAgICBleGlzdCA9IElwZXJmX2hvc3RwcmVzZW50KCAmc2VydmVyLT5wZWVyLCBjbGllbnRzKTsgCisKKyAgICAgICAgaWYgKCBleGlzdCAhPSBOVUxMICkgeworICAgICAgICAgICAgLy8gQ29weSBncm91cCBJRAorICAgICAgICAgICAgbGlzdHRlbXAtPmhvbGRlciA9IGV4aXN0LT5ob2xkZXI7CisgICAgICAgICAgICBzZXJ2ZXItPm11bHRpaGRyID0gZXhpc3QtPmhvbGRlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlcnZlci0+bVRocmVhZHMgPSAwOworICAgICAgICAgICAgTXV0ZXhfTG9jayggJmdyb3VwQ29uZCApOworICAgICAgICAgICAgZ3JvdXBJRC0tOworICAgICAgICAgICAgbGlzdHRlbXAtPmhvbGRlciA9IEluaXRNdWx0aSggc2VydmVyLCBncm91cElEICk7CisgICAgICAgICAgICBzZXJ2ZXItPm11bHRpaGRyID0gbGlzdHRlbXAtPmhvbGRlcjsKKyAgICAgICAgICAgIE11dGV4X1VubG9jayggJmdyb3VwQ29uZCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgZW50cnkgaW4gY29ubmVjdGlvbiBsaXN0CisgICAgICAgIElwZXJmX3B1c2hiYWNrKCBsaXN0dGVtcCwgJmNsaWVudHMgKTsgCisKKyAgICAgICAgdGVtcFNldHRpbmdzID0gTlVMTDsKKyAgICAgICAgaWYgKCAhaXNDb21wYXQoIG1TZXR0aW5ncyApICYmICFpc011bHRpY2FzdCggbVNldHRpbmdzICkgKSB7CisgICAgICAgICAgICBTZXR0aW5nc19HZW5lcmF0ZUNsaWVudFNldHRpbmdzKCBzZXJ2ZXIsICZ0ZW1wU2V0dGluZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkciApOworICAgICAgICB9CisKKworICAgICAgICBpZiAoIHRlbXBTZXR0aW5ncyAhPSBOVUxMICkgeworICAgICAgICAgICAgY2xpZW50X2luaXQoIHRlbXBTZXR0aW5ncyApOworICAgICAgICAgICAgaWYgKCB0ZW1wU2V0dGluZ3MtPm1Nb2RlID09IGtUZXN0X0R1YWxUZXN0ICkgeworI2lmZGVmIEhBVkVfVEhSRUFECisgICAgICAgICAgICAgICAgdGhyZWFkX3N0YXJ0KCB0ZW1wU2V0dGluZ3MgKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgc2VydmVyLT5ydW5OZXh0ID0gdGVtcFNldHRpbmdzOworI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlcnZlci0+cnVuTmV4dCA9ICB0ZW1wU2V0dGluZ3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2VydmVyLT5yZXBvcnRoZHIgPSBJbml0UmVwb3J0KCBzZXJ2ZXIgKTsKKworICAgICAgICAvLyBQcmVwIGZvciBuZXh0IGNvbm5lY3Rpb24KKyAgICAgICAgaWYgKCAhaXNTaW5nbGVDbGllbnQoIG1TZXR0aW5ncyApICkgeworICAgICAgICAgICAgbUNsaWVudHMtLTsKKyAgICAgICAgfQorICAgICAgICBTZXR0aW5nc19Db3B5KCBtU2V0dGluZ3MsICZzZXJ2ZXIgKTsKKyAgICAgICAgc2VydmVyLT5tVGhyZWFkTW9kZSA9IGtNb2RlX1NlcnZlcjsKKyAgICB9IHdoaWxlICggIXNJbnRlcnVwdGVkICYmICghbUNvdW50IHx8ICggbUNvdW50ICYmIG1DbGllbnRzID4gMCApKSApOworICAgIE11dGV4X1VubG9jayggJmNsaWVudHNfbXV0ZXggKTsKKworICAgIFNldHRpbmdzX0Rlc3Ryb3koIHNlcnZlciApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFJ1biB0aGUgc2VydmVyIGFzIGEgZGFlbW9uICAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisKK3ZvaWQgTGlzdGVuZXI6OnJ1bkFzRGFlbW9uKGNvbnN0IGNoYXIgKnBuYW1lLCBpbnQgZmFjaWxpdHkpIHsKKyNpZm5kZWYgV0lOMzIgCisgICAgcGlkX3QgcGlkOyAKKworICAgIC8qIENyZWF0ZSBhIGNoaWxkIHByb2Nlc3MgJiBpZiBzdWNjZXNzZnVsLCBleGl0IGZyb20gdGhlIHBhcmVudCBwcm9jZXNzICovIAorICAgIGlmICggKHBpZCA9IGZvcmsoKSkgPT0gLTEgKSB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgImVycm9yIGluIGZpcnN0IGNoaWxkIGNyZWF0ZVxuIik7ICAgICAKKyAgICAgICAgZXhpdCgwKTsgCisgICAgfSBlbHNlIGlmICggcGlkICE9IDAgKSB7CisgICAgICAgIGV4aXQoMCk7IAorICAgIH0KKworICAgIC8qIFRyeSBiZWNvbWluZyB0aGUgc2Vzc2lvbiBsZWFkZXIsIG9uY2UgdGhlIHBhcmVudCBleGl0cyAqLworICAgIGlmICggc2V0c2lkKCkgPT0gLTEgKSB7ICAgICAgICAgICAvKiBCZWNvbWUgdGhlIHNlc3Npb24gbGVhZGVyICovIAorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDYW5ub3QgY2hhbmdlIHRoZSBzZXNzaW9uIGdyb3VwIGxlYWRlclxuIik7IAorICAgIH0gZWxzZSB7CisgICAgfSAKKyAgICBzaWduYWwoU0lHSFVQLFNJR19JR04pOyAKKworCisgICAgLyogTm93IGZvcmsoKSBhbmQgZ2V0IHJlbGVhc2VkIGZyb20gdGhlIHRlcm1pbmFsICovICAKKyAgICBpZiAoIChwaWQgPSBmb3JrKCkpID09IC0xICkgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJlcnJvclxuIik7ICAgCisgICAgICAgIGV4aXQoMCk7IAorICAgIH0gZWxzZSBpZiAoIHBpZCAhPSAwICkgeworICAgICAgICBleGl0KDApOyAKKyAgICB9CisKKyAgICBjaGRpcigiLiIpOyAKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJSdW5uaW5nIElwZXJmIFNlcnZlciBhcyBhIGRhZW1vblxuIik7IAorICAgIGZwcmludGYoIHN0ZGVyciwgIlRoZSBJcGVyZiBkYWVtb24gcHJvY2VzcyBJRCA6ICVkXG4iLCgoaW50KWdldHBpZCgpKSk7IAorICAgIGZmbHVzaChzdGRlcnIpOyAKKworICAgIGZjbG9zZShzdGRpbik7IAorI2Vsc2UgCisgICAgZnByaW50Ziggc3RkZXJyLCAiVXNlIHRoZSBwcmVjb21waWxlZCB3aW5kb3dzIHZlcnNpb24gZm9yIHNlcnZpY2UgKGRhZW1vbikgb3B0aW9uXG4iKTsgCisjZW5kaWYgIAorCit9CisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9Mb2NhbGUuYyBiL2lwZXJmLTIuMC41L3NyYy9Mb2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQ0MmIxCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvc3JjL0xvY2FsZS5jCkBAIC0wLDAgKzEsMzM1IEBACisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBMb2NhbGUuYworICogYnkgQWpheSBUaXJ1bWFsYSA8dGlydW1hbGFAbmNzYS51aXVjLmVkdT4KKyAqICYgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0cmluZ3MgYW5kIG90aGVyIHN0dWZmIHRoYXQgaXMgbG9jYWxlIHNwZWNpZmljLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZWxzZQorI2lmZGVmIFdJTjMyCisjaW5jbHVkZSAiY29uZmlnLndpbjMyLmgiCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB1c2FnZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyIHVzYWdlX3Nob3J0W10gPSAiXAorVXNhZ2U6ICVzIFstc3wtYyBob3N0XSBbb3B0aW9uc11cblwKK1RyeSBgJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiI7CisKK2NvbnN0IGNoYXIgdXNhZ2VfbG9uZzFbXSA9ICJcCitVc2FnZTogaXBlcmYgWy1zfC1jIGhvc3RdIFtvcHRpb25zXVxuXAorICAgICAgIGlwZXJmIFstaHwtLWhlbHBdIFstdnwtLXZlcnNpb25dXG5cCitcblwKK0NsaWVudC9TZXJ2ZXI6XG5cCisgIC1mLCAtLWZvcm1hdCAgICBba21LTV0gICBmb3JtYXQgdG8gcmVwb3J0OiBLYml0cywgTWJpdHMsIEtCeXRlcywgTUJ5dGVzXG5cCisgIC1pLCAtLWludGVydmFsICAjICAgICAgICBzZWNvbmRzIGJldHdlZW4gcGVyaW9kaWMgYmFuZHdpZHRoIHJlcG9ydHNcblwKKyAgLWwsIC0tbGVuICAgICAgICNbS01dICAgIGxlbmd0aCBvZiBidWZmZXIgdG8gcmVhZCBvciB3cml0ZSAoZGVmYXVsdCA4IEtCKVxuXAorICAtbSwgLS1wcmludF9tc3MgICAgICAgICAgcHJpbnQgVENQIG1heGltdW0gc2VnbWVudCBzaXplIChNVFUgLSBUQ1AvSVAgaGVhZGVyKVxuXAorICAtbywgLS1vdXRwdXQgICAgPGZpbGVuYW1lPiBvdXRwdXQgdGhlIHJlcG9ydCBvciBlcnJvciBtZXNzYWdlIHRvIHRoaXMgc3BlY2lmaWVkIGZpbGVcblwKKyAgLXAsIC0tcG9ydCAgICAgICMgICAgICAgIHNlcnZlciBwb3J0IHRvIGxpc3RlbiBvbi9jb25uZWN0IHRvXG5cCisgIC11LCAtLXVkcCAgICAgICAgICAgICAgICB1c2UgVURQIHJhdGhlciB0aGFuIFRDUFxuXAorICAtdywgLS13aW5kb3cgICAgI1tLTV0gICAgVENQIHdpbmRvdyBzaXplIChzb2NrZXQgYnVmZmVyIHNpemUpXG5cCisgIC1CLCAtLWJpbmQgICAgICA8aG9zdD4gICBiaW5kIHRvIDxob3N0PiwgYW4gaW50ZXJmYWNlIG9yIG11bHRpY2FzdCBhZGRyZXNzXG5cCisgIC1DLCAtLWNvbXBhdGliaWxpdHkgICAgICBmb3IgdXNlIHdpdGggb2xkZXIgdmVyc2lvbnMgZG9lcyBub3Qgc2VudCBleHRyYSBtc2dzXG5cCisgIC1NLCAtLW1zcyAgICAgICAjICAgICAgICBzZXQgVENQIG1heGltdW0gc2VnbWVudCBzaXplIChNVFUgLSA0MCBieXRlcylcblwKKyAgLU4sIC0tbm9kZWxheSAgICAgICAgICAgIHNldCBUQ1Agbm8gZGVsYXksIGRpc2FibGluZyBOYWdsZSdzIEFsZ29yaXRobVxuXAorICAtViwgLS1JUHY2VmVyc2lvbiAgICAgICAgU2V0IHRoZSBkb21haW4gdG8gSVB2NlxuXAorXG5cCitTZXJ2ZXIgc3BlY2lmaWM6XG5cCisgIC1zLCAtLXNlcnZlciAgICAgICAgICAgICBydW4gaW4gc2VydmVyIG1vZGVcblwKKyAgLVUsIC0tc2luZ2xlX3VkcCAgICAgICAgIHJ1biBpbiBzaW5nbGUgdGhyZWFkZWQgVURQIG1vZGVcblwKKyAgLUQsIC0tZGFlbW9uICAgICAgICAgICAgIHJ1biB0aGUgc2VydmVyIGFzIGEgZGFlbW9uXG4iCisjaWZkZWYgV0lOMzIKKyIgIC1SLCAtLXJlbW92ZSAgICAgICAgICAgICByZW1vdmUgc2VydmljZSBpbiB3aW4zMlxuIgorI2VuZGlmCis7CisKK2NvbnN0IGNoYXIgdXNhZ2VfbG9uZzJbXSA9ICJcCitcblwKK0NsaWVudCBzcGVjaWZpYzpcblwKKyAgLWIsIC0tYmFuZHdpZHRoICNbS01dICAgIGZvciBVRFAsIGJhbmR3aWR0aCB0byBzZW5kIGF0IGluIGJpdHMvc2VjXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAxIE1iaXQvc2VjLCBpbXBsaWVzIC11KVxuXAorICAtYywgLS1jbGllbnQgICAgPGhvc3Q+ICAgcnVuIGluIGNsaWVudCBtb2RlLCBjb25uZWN0aW5nIHRvIDxob3N0PlxuXAorICAtZCwgLS1kdWFsdGVzdCAgICAgICAgICAgRG8gYSBiaWRpcmVjdGlvbmFsIHRlc3Qgc2ltdWx0YW5lb3VzbHlcblwKKyAgLW4sIC0tbnVtICAgICAgICNbS01dICAgIG51bWJlciBvZiBieXRlcyB0byB0cmFuc21pdCAoaW5zdGVhZCBvZiAtdClcblwKKyAgLXIsIC0tdHJhZGVvZmYgICAgICAgICAgIERvIGEgYmlkaXJlY3Rpb25hbCB0ZXN0IGluZGl2aWR1YWxseVxuXAorICAtdCwgLS10aW1lICAgICAgIyAgICAgICAgdGltZSBpbiBzZWNvbmRzIHRvIHRyYW5zbWl0IGZvciAoZGVmYXVsdCAxMCBzZWNzKVxuXAorICAtRiwgLS1maWxlaW5wdXQgPG5hbWU+ICAgaW5wdXQgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQgZnJvbSBhIGZpbGVcblwKKyAgLUksIC0tc3RkaW4gICAgICAgICAgICAgIGlucHV0IHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkIGZyb20gc3RkaW5cblwKKyAgLUwsIC0tbGlzdGVucG9ydCAjICAgICAgIHBvcnQgdG8gcmVjZWl2ZSBiaWRpcmVjdGlvbmFsIHRlc3RzIGJhY2sgb25cblwKKyAgLVAsIC0tcGFyYWxsZWwgICMgICAgICAgIG51bWJlciBvZiBwYXJhbGxlbCBjbGllbnQgdGhyZWFkcyB0byBydW5cblwKKyAgLVQsIC0tdHRsICAgICAgICMgICAgICAgIHRpbWUtdG8tbGl2ZSwgZm9yIG11bHRpY2FzdCAoZGVmYXVsdCAxKVxuXAorICAtWiwgLS1saW51eC1jb25nZXN0aW9uIDxhbGdvPiAgc2V0IFRDUCBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtIChMaW51eCBvbmx5KVxuXAorXG5cCitNaXNjZWxsYW5lb3VzOlxuXAorICAteCwgLS1yZXBvcnRleGNsdWRlIFtDRE1TVl0gICBleGNsdWRlIEMoY29ubmVjdGlvbikgRChkYXRhKSBNKG11bHRpY2FzdCkgUyhzZXR0aW5ncykgVihzZXJ2ZXIpIHJlcG9ydHNcblwKKyAgLXksIC0tcmVwb3J0c3R5bGUgQyAgICAgIHJlcG9ydCBhcyBhIENvbW1hLVNlcGFyYXRlZCBWYWx1ZXNcblwKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgcXVpdFxuXAorICAtdiwgLS12ZXJzaW9uICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgcXVpdFxuXAorXG5cCitbS01dIEluZGljYXRlcyBvcHRpb25zIHRoYXQgc3VwcG9ydCBhIEsgb3IgTSBzdWZmaXggZm9yIGtpbG8tIG9yIG1lZ2EtXG5cCitcblwKK1RoZSBUQ1Agd2luZG93IHNpemUgb3B0aW9uIGNhbiBiZSBzZXQgYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlXG5cCitUQ1BfV0lORE9XX1NJWkUuIE1vc3Qgb3RoZXIgb3B0aW9ucyBjYW4gYmUgc2V0IGJ5IGFuIGVudmlyb25tZW50IHZhcmlhYmxlXG5cCitJUEVSRl88bG9uZyBvcHRpb24gbmFtZT4sIHN1Y2ggYXMgSVBFUkZfQkFORFdJRFRILlxuXAorXG5cCitSZXBvcnQgYnVncyB0byA8aXBlcmYtdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIjsKKworLy8gaW5jbHVkZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0aHJlYWRpbmcgaW4gdGhlIHZlcnNpb24KKyNpZiAgIGRlZmluZWQoIEhBVkVfUE9TSVhfVEhSRUFEICkKKyAgICAjZGVmaW5lIElQRVJGX1RIUkVBRFMgInB0aHJlYWRzIgorI2VsaWYgZGVmaW5lZCggSEFWRV9XSU4zMl9USFJFQUQgKQorICAgICNkZWZpbmUgSVBFUkZfVEhSRUFEUyAid2luMzIgdGhyZWFkcyIKKyNlbHNlCisgICAgI2RlZmluZSBJUEVSRl9USFJFQURTICJzaW5nbGUgdGhyZWFkZWQiCisjZW5kaWYKKworY29uc3QgY2hhciB2ZXJzaW9uW10gPQorImlwZXJmIHZlcnNpb24gIiBJUEVSRl9WRVJTSU9OICIgKCIgSVBFUkZfVkVSU0lPTl9EQVRFICIpICIgSVBFUkZfVEhSRUFEUyAiXG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXR0aW5ncworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyIHNlcGFyYXRvcl9saW5lW10gPQorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKworY29uc3QgY2hhciBzZXJ2ZXJfcG9ydFtdID0KKyJTZXJ2ZXIgbGlzdGVuaW5nIG9uICVzIHBvcnQgJWRcbiI7CisKK2NvbnN0IGNoYXIgY2xpZW50X3BvcnRbXSA9CisiQ2xpZW50IGNvbm5lY3RpbmcgdG8gJXMsICVzIHBvcnQgJWRcbiI7CisKK2NvbnN0IGNoYXIgYmluZF9hZGRyZXNzW10gPQorIkJpbmRpbmcgdG8gbG9jYWwgYWRkcmVzcyAlc1xuIjsKKworY29uc3QgY2hhciBtdWx0aWNhc3RfdHRsW10gPQorIlNldHRpbmcgbXVsdGljYXN0IFRUTCB0byAlZFxuIjsKKworY29uc3QgY2hhciBqb2luX211bHRpY2FzdFtdID0KKyJKb2luaW5nIG11bHRpY2FzdCBncm91cCAgJXNcbiI7CisKK2NvbnN0IGNoYXIgY2xpZW50X2RhdGFncmFtX3NpemVbXSA9CisiU2VuZGluZyAlZCBieXRlIGRhdGFncmFtc1xuIjsKKworY29uc3QgY2hhciBzZXJ2ZXJfZGF0YWdyYW1fc2l6ZVtdID0KKyJSZWNlaXZpbmcgJWQgYnl0ZSBkYXRhZ3JhbXNcbiI7CisKK2NvbnN0IGNoYXIgdGNwX3dpbmRvd19zaXplW10gPQorIlRDUCB3aW5kb3cgc2l6ZSI7CisKK2NvbnN0IGNoYXIgdWRwX2J1ZmZlcl9zaXplW10gPQorIlVEUCBidWZmZXIgc2l6ZSI7CisKK2NvbnN0IGNoYXIgd2luZG93X2RlZmF1bHRbXSA9CisiKGRlZmF1bHQpIjsKKworY29uc3QgY2hhciB3YWl0X3NlcnZlcl90aHJlYWRzW10gPQorIldhaXRpbmcgZm9yIHNlcnZlciB0aHJlYWRzIHRvIGNvbXBsZXRlLiBJbnRlcnJ1cHQgYWdhaW4gdG8gZm9yY2UgcXVpdC5cbiI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlcG9ydHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY29uc3QgY2hhciByZXBvcnRfcmVhZF9sZW5ndGhzW10gPQorIlslM2RdIFJlYWQgbGVuZ3RocyBvY2N1cnJpbmcgaW4gbW9yZSB0aGFuIDUlJSBvZiByZWFkczpcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0X3JlYWRfbGVuZ3RoX3RpbWVzW10gPQorIlslM2RdICU1ZCBieXRlcyByZWFkICU1ZCB0aW1lcyAoJS4zZyUlKVxuIjsKKworY29uc3QgY2hhciByZXBvcnRfYndfaGVhZGVyW10gPQorIlsgSURdIEludGVydmFsICAgICAgIFRyYW5zZmVyICAgICBCYW5kd2lkdGhcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0X2J3X2Zvcm1hdFtdID0KKyJbJTNkXSAlNC4xZi0lNC4xZiBzZWMgICVzcyAgJXNzL3NlY1xuIjsKKworY29uc3QgY2hhciByZXBvcnRfc3VtX2J3X2Zvcm1hdFtdID0KKyJbU1VNXSAlNC4xZi0lNC4xZiBzZWMgICVzcyAgJXNzL3NlY1xuIjsKKworY29uc3QgY2hhciByZXBvcnRfYndfaml0dGVyX2xvc3NfaGVhZGVyW10gPQorIlsgSURdIEludGVydmFsICAgICAgIFRyYW5zZmVyICAgICBCYW5kd2lkdGggICAgICAgIEppdHRlciAgIExvc3QvVG90YWwgXAorRGF0YWdyYW1zXG4iOworCitjb25zdCBjaGFyIHJlcG9ydF9id19qaXR0ZXJfbG9zc19mb3JtYXRbXSA9CisiWyUzZF0gJTQuMWYtJTQuMWYgc2VjICAlc3MgICVzcy9zZWMgICU2LjNmIG1zICU0ZC8lNWQgKCUuMmclJSlcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0X3N1bV9id19qaXR0ZXJfbG9zc19mb3JtYXRbXSA9CisiW1NVTV0gJTQuMWYtJTQuMWYgc2VjICAlc3MgICVzcy9zZWMgICU2LjNmIG1zICU0ZC8lNWQgKCUuMmclJSlcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0X291dG9mb3JkZXJbXSA9CisiWyUzZF0gJTQuMWYtJTQuMWYgc2VjICAlZCBkYXRhZ3JhbXMgcmVjZWl2ZWQgb3V0LW9mLW9yZGVyXG4iOworCitjb25zdCBjaGFyIHJlcG9ydF9zdW1fb3V0b2ZvcmRlcltdID0KKyJbU1VNXSAlNC4xZi0lNC4xZiBzZWMgICVkIGRhdGFncmFtcyByZWNlaXZlZCBvdXQtb2Ytb3JkZXJcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0X3BlZXJbXSA9CisiWyUzZF0gbG9jYWwgJXMgcG9ydCAldSBjb25uZWN0ZWQgd2l0aCAlcyBwb3J0ICV1XG4iOworCitjb25zdCBjaGFyIHJlcG9ydF9tc3NfdW5zdXBwb3J0ZWRbXSA9CisiWyUzZF0gTVNTIGFuZCBNVFUgc2l6ZSB1bmtub3duIChUQ1BfTUFYU0VHIG5vdCBzdXBwb3J0ZWQgYnkgT1M/KVxuIjsKKworY29uc3QgY2hhciByZXBvcnRfbXNzW10gPQorIlslM2RdIE1TUyBzaXplICVkIGJ5dGVzIChNVFUgJWQgYnl0ZXMsICVzKVxuIjsKKworY29uc3QgY2hhciByZXBvcnRfZGF0YWdyYW1zW10gPQorIlslM2RdIFNlbnQgJWQgZGF0YWdyYW1zXG4iOworCitjb25zdCBjaGFyIHJlcG9ydF9zdW1fZGF0YWdyYW1zW10gPQorIltTVU1dIFNlbnQgJWQgZGF0YWdyYW1zXG4iOworCitjb25zdCBjaGFyIHNlcnZlcl9yZXBvcnRpbmdbXSA9CisiWyUzZF0gU2VydmVyIFJlcG9ydDpcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0Q1NWX3BlZXJbXSA9CisiJXMsJXUsJXMsJXUiOworCisjaWZkZWYgSEFWRV9RVUFEX1NVUFBPUlQKKyNpZmRlZiBIQVZFX1BSSU5URl9RRAorY29uc3QgY2hhciByZXBvcnRDU1ZfYndfZm9ybWF0W10gPQorIiVzLCVzLCVkLCUuMWYtJS4xZiwlcWQsJXFkXG4iOworCitjb25zdCBjaGFyIHJlcG9ydENTVl9id19qaXR0ZXJfbG9zc19mb3JtYXRbXSA9CisiJXMsJXMsJWQsJS4xZi0lLjFmLCVxZCwlcWQsJS4zZiwlZCwlZCwlLjNmLCVkXG4iOworI2Vsc2UgLy8gSEFWRV9QUklOVEZfUUQKK2NvbnN0IGNoYXIgcmVwb3J0Q1NWX2J3X2Zvcm1hdFtdID0KKyIlcywlcywlZCwlLjFmLSUuMWYsJWxsZCwlbGxkXG4iOworCitjb25zdCBjaGFyIHJlcG9ydENTVl9id19qaXR0ZXJfbG9zc19mb3JtYXRbXSA9CisiJXMsJXMsJWQsJS4xZi0lLjFmLCVsbGQsJWxsZCwlLjNmLCVkLCVkLCUuM2YsJWRcbiI7CisjZW5kaWYgLy8gSEFWRV9QUklOVEZfUUQKKyNlbHNlIC8vIEhBVkVfUVVBRF9TVVBQT1JUCisjaWZkZWYgV0lOMzIKK2NvbnN0IGNoYXIgcmVwb3J0Q1NWX2J3X2Zvcm1hdFtdID0KKyIlcywlcywlZCwlLjFmLSUuMWYsJUk2NGQsJUk2NGRcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0Q1NWX2J3X2ppdHRlcl9sb3NzX2Zvcm1hdFtdID0KKyIlcywlcywlZCwlLjFmLSUuMWYsJUk2NGQsJUk2NGQsJS4zZiwlZCwlZCwlLjNmLCVkXG4iOworI2Vsc2UKK2NvbnN0IGNoYXIgcmVwb3J0Q1NWX2J3X2Zvcm1hdFtdID0KKyIlcywlcywlZCwlLjFmLSUuMWYsJWQsJWRcbiI7CisKK2NvbnN0IGNoYXIgcmVwb3J0Q1NWX2J3X2ppdHRlcl9sb3NzX2Zvcm1hdFtdID0KKyIlcywlcywlZCwlLjFmLSUuMWYsJWQsJWQsJS4zZiwlZCwlZCwlLjNmLCVkXG4iOworI2VuZGlmIC8vV0lOMzIKKyNlbmRpZiAvL0hBVkVfUVVBRF9TVVBQT1JUCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3YXJuaW5ncworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyIHdhcm5fd2luZG93X3JlcXVlc3RlZFtdID0KKyIgKFdBUk5JTkc6IHJlcXVlc3RlZCAlcykiOworCitjb25zdCBjaGFyIHdhcm5fd2luZG93X3NtYWxsW10gPSAiXAorV0FSTklORzogVENQIHdpbmRvdyBzaXplIHNldCB0byAlZCBieXRlcy4gQSBzbWFsbCB3aW5kb3cgc2l6ZVxuXAord2lsbCBnaXZlIHBvb3IgcGVyZm9ybWFuY2UuIFNlZSB0aGUgSXBlcmYgZG9jdW1lbnRhdGlvbi5cbiI7CisKK2NvbnN0IGNoYXIgd2Fybl9kZWxheV9sYXJnZVtdID0KKyJXQVJOSU5HOiBkZWxheSB0b28gbGFyZ2UsIHJlZHVjaW5nIGZyb20gJS4xZiB0byAxLjAgc2Vjb25kcy5cbiI7CisKK2NvbnN0IGNoYXIgd2Fybl9ub19wYXRobXR1W10gPQorIldBUk5JTkc6IFBhdGggTVRVIERpc2NvdmVyeSBtYXkgbm90IGJlIGVuYWJsZWQuXG4iOworCitjb25zdCBjaGFyIHdhcm5fbm9fYWNrW109CisiWyUzZF0gV0FSTklORzogZGlkIG5vdCByZWNlaXZlIGFjayBvZiBsYXN0IGRhdGFncmFtIGFmdGVyICVkIHRyaWVzLlxuIjsKKworY29uc3QgY2hhciB3YXJuX2Fja19mYWlsZWRbXT0KKyJbJTNkXSBXQVJOSU5HOiBhY2sgb2YgbGFzdCBkYXRhZ3JhbSBmYWlsZWQgYWZ0ZXIgJWQgdHJpZXMuXG4iOworCitjb25zdCBjaGFyIHdhcm5fZmlsZW9wZW5fZmFpbGVkW109CisiV0FSTklORzogVW5hYmxlIHRvIG9wZW4gZmlsZSBzdHJlYW0gZm9yIHRyYW5zZmVyXG5cCitVc2luZyBkZWZhdWx0IGRhdGEgc3RyZWFtLiBcbiI7CisKK2NvbnN0IGNoYXIgdW5hYmxlX3RvX2NoYW5nZV93aW5bXT0KKyJXQVJOSU5HOiBVbmFibGUgdG8gY2hhbmdlIHRoZSB3aW5kb3cgc2l6ZVxuIjsKKworY29uc3QgY2hhciBvcHRfZXN0aW1hdGVbXT0KKyJPcHRpbWFsIEVzdGltYXRlXG4iOworCitjb25zdCBjaGFyIHJlcG9ydF9pbnRlcnZhbF9zbWFsbFtdID0KKyJXQVJOSU5HOiBpbnRlcnZhbCB0b28gc21hbGwsIGluY3JlYXNpbmcgZnJvbSAlMy4yZiB0byAwLjUgc2Vjb25kcy5cbiI7CisKK2NvbnN0IGNoYXIgd2Fybl9pbnZhbGlkX3NlcnZlcl9vcHRpb25bXSA9CisiV0FSTklORzogb3B0aW9uIC0lYyBpcyBub3QgdmFsaWQgZm9yIHNlcnZlciBtb2RlXG4iOworCitjb25zdCBjaGFyIHdhcm5faW52YWxpZF9jbGllbnRfb3B0aW9uW10gPQorIldBUk5JTkc6IG9wdGlvbiAtJWMgaXMgbm90IHZhbGlkIGZvciBjbGllbnQgbW9kZVxuIjsKKworY29uc3QgY2hhciB3YXJuX2ludmFsaWRfY29tcGF0aWJpbGl0eV9vcHRpb25bXSA9CisiV0FSTklORzogb3B0aW9uIC0lYyBpcyBub3QgdmFsaWQgaW4gY29tcGF0aWJpbGl0eSBtb2RlXG4iOworCitjb25zdCBjaGFyIHdhcm5faW1wbGllZF91ZHBbXSA9CisiV0FSTklORzogb3B0aW9uIC0lYyBpbXBsaWVzIHVkcCB0ZXN0aW5nXG4iOworCitjb25zdCBjaGFyIHdhcm5faW1wbGllZF9jb21wYXRpYmlsaXR5W10gPQorIldBUk5JTkc6IG9wdGlvbiAtJWMgaGFzIGltcGxpZWQgY29tcGF0aWJpbGl0eSBtb2RlXG4iOworCitjb25zdCBjaGFyIHdhcm5fYnVmZmVyX3Rvb19zbWFsbFtdID0KKyJXQVJOSU5HOiB0aGUgVURQIGJ1ZmZlciB3YXMgaW5jcmVhc2VkIHRvICVkIGZvciBwcm9wZXIgb3BlcmF0aW9uXG4iOworCitjb25zdCBjaGFyIHdhcm5faW52YWxpZF9zaW5nbGVfdGhyZWFkZWRbXSA9CisiV0FSTklORzogb3B0aW9uIC0lYyBpcyBub3QgdmFsaWQgaW4gc2luZ2xlIHRocmVhZGVkIHZlcnNpb25zXG4iOworCitjb25zdCBjaGFyIHdhcm5faW52YWxpZF9yZXBvcnRfc3R5bGVbXSA9CisiV0FSTklORzogdW5rbm93biByZXBvcnRpbmcgc3R5bGUgXCIlc1wiLCBzd2l0Y2hpbmcgdG8gZGVmYXVsdFxuIjsKKworY29uc3QgY2hhciB3YXJuX2ludmFsaWRfcmVwb3J0W10gPQorIldBUk5JTkc6IHVua25vd24gcmVwb3J0aW5nIHR5cGUgXCIlY1wiLCBpZ25vcmVkXG4gdmFsaWQgb3B0aW9ucyBhcmU6XG5cdCBleGNsdWRlOiBDKGNvbm5lY3Rpb24pIEQoZGF0YSkgTShtdWx0aWNhc3QpIFMoc2V0dGluZ3MpIFYoc2VydmVyKSByZXBvcnRcblxuIjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9NYWtlZmlsZS5hbSBiL2lwZXJmLTIuMC41L3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZiNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzkgQEAKK2Jpbl9QUk9HUkFNUyA9IGlwZXJmCisKK0xJQkNPTVBBVF9MREFERFMgPSBAU1RSSVBfQkVHSU5AIFwKKwkJICAgJCh0b3BfYnVpbGRkaXIpL2NvbXBhdC9saWJjb21wYXQuYSBcCisJCSAgIEBTVFJJUF9FTkRACisKK0FNX0NQUEZMQUdTID0gQFNUUklQX0JFR0lOQCBcCisJICAgICAgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUgXAorCSAgICAgIC1JJCh0b3BfYnVpbGRkaXIpL2luY2x1ZGUgXAorCSAgICAgIEBTVFJJUF9FTkRACisKK0FNX0NYWEZMQUdTID0gLVdhbGwKK0FNX0NGTEFHUyA9IC1XYWxsCisKK2lwZXJmX0xERkxBR1MgPSBAQ0ZMQUdTQCBAUFRIUkVBRF9DRkxBR1NAIEBXRUIxMDBfQ0ZMQUdTQCBAREVGU0AKKworaXBlcmZfU09VUkNFUyA9IFwKKwkJQ2xpZW50LmNwcCBcCisJCUV4dHJhY3Rvci5jIFwKKwkJTGF1bmNoLmNwcCBcCisJCUxpc3QuY3BwIFwKKwkJTGlzdGVuZXIuY3BwIFwKKwkJTG9jYWxlLmMgXAorCQlQZXJmU29ja2V0LmNwcCBcCisJCVJlcG9ydENTVi5jIFwKKwkJUmVwb3J0RGVmYXVsdC5jIFwKKwkJUmVwb3J0ZXIuYyBcCisJCVNlcnZlci5jcHAgXAorCQlTZXR0aW5ncy5jcHAgXAorCQlTb2NrZXRBZGRyLmMgXAorCQlnbnVfZ2V0b3B0LmMgXAorCQlnbnVfZ2V0b3B0X2xvbmcuYyBcCisJCW1haW4uY3BwIFwKKwkJc2VydmljZS5jIFwKKwkJc29ja2V0cy5jIFwKKwkJc3RkaW8uYyBcCisJCXRjcF93aW5kb3dfc2l6ZS5jCisKK2lwZXJmX0xEQUREID0gJChMSUJDT01QQVRfTERBRERTKQpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvc3JjL01ha2VmaWxlLmluIGIvaXBlcmYtMi4wLjUvc3JjL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNGU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MDQgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuOS42IGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuLgorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAorSU5TVEFMTCA9IEBJTlNUQUxMQAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorYmluX1BST0dSQU1TID0gaXBlcmYkKEVYRUVYVCkKK3N1YmRpciA9IHNyYworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9tNC9heF9jcmVhdGVfc3RkaW50X2gubTQgXAorCSQodG9wX3NyY2RpcikvbTQvZGFzdC5tNCAkKHRvcF9zcmNkaXIpL200L2FjeF9wdGhyZWFkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChiaW5kaXIpIgorYmluUFJPR1JBTVNfSU5TVEFMTCA9ICQoSU5TVEFMTF9QUk9HUkFNKQorUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKK2FtX2lwZXJmX09CSkVDVFMgPSBDbGllbnQuJChPQkpFWFQpIEV4dHJhY3Rvci4kKE9CSkVYVCkgXAorCUxhdW5jaC4kKE9CSkVYVCkgTGlzdC4kKE9CSkVYVCkgTGlzdGVuZXIuJChPQkpFWFQpIFwKKwlMb2NhbGUuJChPQkpFWFQpIFBlcmZTb2NrZXQuJChPQkpFWFQpIFJlcG9ydENTVi4kKE9CSkVYVCkgXAorCVJlcG9ydERlZmF1bHQuJChPQkpFWFQpIFJlcG9ydGVyLiQoT0JKRVhUKSBTZXJ2ZXIuJChPQkpFWFQpIFwKKwlTZXR0aW5ncy4kKE9CSkVYVCkgU29ja2V0QWRkci4kKE9CSkVYVCkgZ251X2dldG9wdC4kKE9CSkVYVCkgXAorCWdudV9nZXRvcHRfbG9uZy4kKE9CSkVYVCkgbWFpbi4kKE9CSkVYVCkgc2VydmljZS4kKE9CSkVYVCkgXAorCXNvY2tldHMuJChPQkpFWFQpIHN0ZGlvLiQoT0JKRVhUKSB0Y3Bfd2luZG93X3NpemUuJChPQkpFWFQpCitpcGVyZl9PQkpFQ1RTID0gJChhbV9pcGVyZl9PQkpFQ1RTKQorYW1fX0RFUEVOREVOQ0lFU18xID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBhdC9saWJjb21wYXQuYQoraXBlcmZfREVQRU5ERU5DSUVTID0gJChhbV9fREVQRU5ERU5DSUVTXzEpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpCitDWFhMRCA9ICQoQ1hYKQorQ1hYTElOSyA9ICQoQ1hYTEQpICQoQU1fQ1hYRkxBR1MpICQoQ1hYRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSBcCisJLW8gJEAKK1NPVVJDRVMgPSAkKGlwZXJmX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGlwZXJmX1NPVVJDRVMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1ERVBfRkFMU0UgPSBAQU1ERVBfRkFMU0VACitBTURFUF9UUlVFID0gQEFNREVQX1RSVUVACitBTVRBUiA9IEBBTVRBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NYWCA9IEBDWFhACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorR1JFUCA9IEBHUkVQQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQVEhSRUFEX0NDID0gQFBUSFJFQURfQ0NACitQVEhSRUFEX0NGTEFHUyA9IEBQVEhSRUFEX0NGTEFHU0AKK1BUSFJFQURfTElCUyA9IEBQVEhSRUFEX0xJQlNACitSQU5MSUIgPSBAUkFOTElCQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1RSSVBfQkVHSU4gPSBAU1RSSVBfQkVHSU5ACitTVFJJUF9EVU1NWSA9IEBTVFJJUF9EVU1NWUAKK1NUUklQX0VORCA9IEBTVFJJUF9FTkRACitWRVJTSU9OID0gQFZFUlNJT05ACitXRUIxMDBfQ0ZMQUdTID0gQFdFQjEwMF9DRkxBR1NACitXRUIxMDBfQ09ORklHID0gQFdFQjEwMF9DT05GSUdACitXRUIxMDBfTElCUyA9IEBXRUIxMDBfTElCU0AKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjeF9wdGhyZWFkX2NvbmZpZyA9IEBhY3hfcHRocmVhZF9jb25maWdACithbV9fZmFzdGRlcENDX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ0NfRkFMU0VACithbV9fZmFzdGRlcENDX1RSVUUgPSBAYW1fX2Zhc3RkZXBDQ19UUlVFQAorYW1fX2Zhc3RkZXBDWFhfRkFMU0UgPSBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACithbV9fZmFzdGRlcENYWF9UUlVFID0gQGFtX19mYXN0ZGVwQ1hYX1RSVUVACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorTElCQ09NUEFUX0xEQUREUyA9IEBTVFJJUF9CRUdJTkAgXAorCQkgICAkKHRvcF9idWlsZGRpcikvY29tcGF0L2xpYmNvbXBhdC5hIFwKKwkJICAgQFNUUklQX0VOREAKKworQU1fQ1BQRkxBR1MgPSBAU1RSSVBfQkVHSU5AIFwKKwkgICAgICAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSBcCisJICAgICAgLUkkKHRvcF9idWlsZGRpcikvaW5jbHVkZSBcCisJICAgICAgQFNUUklQX0VOREAKKworQU1fQ1hYRkxBR1MgPSAtV2FsbAorQU1fQ0ZMQUdTID0gLVdhbGwKK2lwZXJmX0xERkxBR1MgPSBAQ0ZMQUdTQCBAUFRIUkVBRF9DRkxBR1NAIEBXRUIxMDBfQ0ZMQUdTQCBAREVGU0AKK2lwZXJmX1NPVVJDRVMgPSBcCisJCUNsaWVudC5jcHAgXAorCQlFeHRyYWN0b3IuYyBcCisJCUxhdW5jaC5jcHAgXAorCQlMaXN0LmNwcCBcCisJCUxpc3RlbmVyLmNwcCBcCisJCUxvY2FsZS5jIFwKKwkJUGVyZlNvY2tldC5jcHAgXAorCQlSZXBvcnRDU1YuYyBcCisJCVJlcG9ydERlZmF1bHQuYyBcCisJCVJlcG9ydGVyLmMgXAorCQlTZXJ2ZXIuY3BwIFwKKwkJU2V0dGluZ3MuY3BwIFwKKwkJU29ja2V0QWRkci5jIFwKKwkJZ251X2dldG9wdC5jIFwKKwkJZ251X2dldG9wdF9sb25nLmMgXAorCQltYWluLmNwcCBcCisJCXNlcnZpY2UuYyBcCisJCXNvY2tldHMuYyBcCisJCXN0ZGlvLmMgXAorCQl0Y3Bfd2luZG93X3NpemUuYworCitpcGVyZl9MREFERCA9ICQoTElCQ09NUEFUX0xEQUREUykKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmNwcCAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46ICAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduICBzcmMvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gIHNyYy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKK2luc3RhbGwtYmluUFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoYmluZGlyKSIgfHwgJChta2Rpcl9wKSAiJChERVNURElSKSQoYmluZGlyKSIKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBwMT1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCSAgaWYgdGVzdCAtZiAkJHAgXAorCSAgOyB0aGVuIFwKKwkgICAgZj1gZWNobyAiJCRwMSIgfCBzZWQgJ3MsXi4qLywsOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoYmluUFJPR1JBTVNfSU5TVEFMTCkgJyQkcCcgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKKwkgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoYmluUFJPR1JBTVNfSU5TVEFMTCkgIiQkcCIgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1iaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoYmluZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKGJpbmRpcikvJCRmIjsgXAorCWRvbmUKKworY2xlYW4tYmluUFJPR1JBTVM6CisJLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCitpcGVyZiQoRVhFRVhUKTogJChpcGVyZl9PQkpFQ1RTKSAkKGlwZXJmX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGlwZXJmJChFWEVFWFQpCisJJChDWFhMSU5LKSAkKGlwZXJmX0xERkxBR1MpICQoaXBlcmZfT0JKRUNUUykgJChpcGVyZl9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvQ2xpZW50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9FeHRyYWN0b3IuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL0xhdW5jaC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvTGlzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvTGlzdGVuZXIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL0xvY2FsZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvUGVyZlNvY2tldC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvUmVwb3J0Q1NWLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9SZXBvcnREZWZhdWx0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9SZXBvcnRlci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvU2VydmVyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9TZXR0aW5ncy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvU29ja2V0QWRkci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ251X2dldG9wdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ251X2dldG9wdF9sb25nLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tYWluLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zZXJ2aWNlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zb2NrZXRzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdGRpby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGNwX3dpbmRvd19zaXplLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICIkKERFUERJUikvJCouVHBvIiAtYyAtbyAkQCAkPDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpLyQqLlRwbyIgIiQoREVQRElSKS8kKi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpLyQqLlRwbyIgIiQoREVQRElSKS8kKi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jcHAubzoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAlpZiAkKENYWENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgJDw7IFwKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDWFhfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDWFhERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENYWF9GQUxTRUAJJChDWFhDT01QSUxFKSAtYyAtbyAkQCAkPAorCisuY3BwLm9iajoKK0BhbV9fZmFzdGRlcENYWF9UUlVFQAlpZiAkKENYWENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYDsgXAorQGFtX19mYXN0ZGVwQ1hYX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS8kKi5UcG8iICIkKERFUERJUikvJCouUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENYWF9GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENYWERFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ1hYX0ZBTFNFQAkkKENYWENPTVBJTEUpIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK3VuaW5zdGFsbC1pbmZvLWFtOgorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgIGRpcj0iLyQkZGlyIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCisJICBlbHNlIFwKKwkgICAgZGlyPScnOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChiaW5kaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQobWtkaXJfcCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1iaW5QUk9HUkFNUworCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYworCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLWluZm8tYW0KKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWJpblBST0dSQU1TIFwKKwljbGVhbi1nZW5lcmljIGN0YWdzIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBcCisJZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWJpblBST0dSQU1TIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIFwKKwl1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWJpblBST0dSQU1TIHVuaW5zdGFsbC1pbmZvLWFtCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9QZXJmU29ja2V0LmNwcCBiL2lwZXJmLTIuMC41L3NyYy9QZXJmU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWNkYmUwCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvc3JjL1BlcmZTb2NrZXQuY3BwCkBAIC0wLDAgKzEsMTU4IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogUGVyZlNvY2tldC5jcHAKKyAqIGJ5IE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAgICBBamF5IFRpcnVtYWxhIDx0aXJ1bWFsYUBuY3NhLnVpdWMuZWR1PgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGFzIHJvdXRpbmVzIHRoZSBDbGllbnQgYW5kIFNlcnZlciBjbGFzc2VzIHVzZSBpbiBjb21tb24gZm9yCisgKiBwZXJmb3JtYW5jZSB0ZXN0aW5nIHRoZSBuZXR3b3JrLgorICogQ2hhbmdlcyBpbiB2ZXJzaW9uIDEuMi4wCisgKiAgICAgZm9yIGV4dHJhY3RpbmcgZGF0YSBmcm9tIGZpbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBoZWFkZXJzCisgKiB1c2VzCisgKiAgIDxzdGRsaWIuaD4KKyAqICAgPHN0ZGlvLmg+CisgKiAgIDxzdHJpbmcuaD4KKyAqCisgKiAgIDxzeXMvdHlwZXMuaD4KKyAqICAgPHN5cy9zb2NrZXQuaD4KKyAqICAgPHVuaXN0ZC5oPgorICoKKyAqICAgPGFycGEvaW5ldC5oPgorICogICA8bmV0ZGIuaD4KKyAqICAgPG5ldGluZXQvaW4uaD4KKyAqICAgPHN5cy9zb2NrZXQuaD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjZGVmaW5lIEhFQURFUlMoKQorCisjaW5jbHVkZSAiaGVhZGVycy5oIgorCisjaW5jbHVkZSAiUGVyZlNvY2tldC5ocHAiCisjaW5jbHVkZSAiU29ja2V0QWRkci5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2V0IHNvY2tldCBvcHRpb25zIGJlZm9yZSB0aGUgbGlzdGVuKCkgb3IgY29ubmVjdCgpIGNhbGxzLgorICogVGhlc2UgYXJlIG9wdGlvbmFsIHBlcmZvcm1hbmNlIHR1bmluZyBmYWN0b3JzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIFNldFNvY2tldE9wdGlvbnMoIHRocmVhZF9TZXR0aW5ncyAqaW5TZXR0aW5ncyApIHsKKyAgICAvLyBzZXQgdGhlIFRDUCB3aW5kb3cgc2l6ZSAoc29ja2V0IGJ1ZmZlciBzaXplcykKKyAgICAvLyBhbHNvIHRoZSBVRFAgYnVmZmVyIHNpemUKKyAgICAvLyBtdXN0IG9jY3VyIGJlZm9yZSBjYWxsIHRvIGFjY2VwdCgpIGZvciBsYXJnZSB3aW5kb3cgc2l6ZXMKKyAgICBzZXRzb2NrX3RjcF93aW5kb3dzaXplKCBpblNldHRpbmdzLT5tU29jaywgaW5TZXR0aW5ncy0+bVRDUFdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5TZXR0aW5ncy0+bVRocmVhZE1vZGUgPT0ga01vZGVfQ2xpZW50ID8gMSA6IDApICk7CisKKyAgICBpZiAoIGlzQ29uZ2VzdGlvbkNvbnRyb2woIGluU2V0dGluZ3MgKSApIHsKKyNpZmRlZiBUQ1BfQ09OR0VTVElPTgorCVNvY2tsZW5fdCBsZW4gPSBzdHJsZW4oIGluU2V0dGluZ3MtPm1Db25nZXN0aW9uICkgKyAxOworCWludCByYyA9IHNldHNvY2tvcHQoIGluU2V0dGluZ3MtPm1Tb2NrLCBJUFBST1RPX1RDUCwgVENQX0NPTkdFU1RJT04sCisJCQkgICAgIGluU2V0dGluZ3MtPm1Db25nZXN0aW9uLCBsZW4pOworCWlmIChyYyA9PSBTT0NLRVRfRVJST1IgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQXR0ZW1wdCB0byBzZXQgJyVzJyBjb25nZXN0aW9uIGNvbnRyb2wgZmFpbGVkOiAlc1xuIiwKKwkJCWluU2V0dGluZ3MtPm1Db25nZXN0aW9uLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKyNlbHNlCisJZnByaW50Ziggc3RkZXJyLCAiVGhlIC1aIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbVxuIik7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIG11bHRpY2FzdCwgYW5kIHNldCBUVEwKKyAgICBpZiAoIGlzTXVsdGljYXN0KCBpblNldHRpbmdzICkgJiYgKCBpblNldHRpbmdzLT5tVFRMID4gMCApICkgeworCWludCB2YWwgPSBpblNldHRpbmdzLT5tVFRMOworI2lmZGVmIEhBVkVfTVVMVElDQVNUCisJaWYgKCAhU29ja0FkZHJfaXNJUHY2KCAmaW5TZXR0aW5ncy0+bG9jYWwgKSApIHsKKwkgICAgaW50IHJjID0gc2V0c29ja29wdCggaW5TZXR0aW5ncy0+bVNvY2ssIElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9UVEwsCisJCSAgICAoY29uc3Qgdm9pZCopICZ2YWwsIChTb2NrbGVuX3QpIHNpemVvZih2YWwpKTsKKworCSAgICBXQVJOX2Vycm5vKCByYyA9PSBTT0NLRVRfRVJST1IsICJtdWx0aWNhc3QgdHRsIiApOworCX0KKyNpZmRlZiBIQVZFX0lQVjZfTVVMVElDQVNUCisJZWxzZSB7CisJICAgIGludCByYyA9IHNldHNvY2tvcHQoIGluU2V0dGluZ3MtPm1Tb2NrLCBJUFBST1RPX0lQVjYsIElQVjZfTVVMVElDQVNUX0hPUFMsCisJCSAgICAoY29uc3Qgdm9pZCopICZ2YWwsIChTb2NrbGVuX3QpIHNpemVvZih2YWwpKTsKKwkgICAgV0FSTl9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAibXVsdGljYXN0IHR0bCIgKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorICAgIH0KKworCisjaWZkZWYgSVBfVE9TCisKKyAgICAvLyBzZXQgSVAgVE9TICh0eXBlLW9mLXNlcnZpY2UpIGZpZWxkCisgICAgaWYgKCBpblNldHRpbmdzLT5tVE9TID4gMCApIHsKKyAgICAgICAgaW50ICB0b3MgPSBpblNldHRpbmdzLT5tVE9TOworICAgICAgICBTb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHRvcyk7CisgICAgICAgIGludCByYyA9IHNldHNvY2tvcHQoIGluU2V0dGluZ3MtPm1Tb2NrLCBJUFBST1RPX0lQLCBJUF9UT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgJnRvcywgbGVuICk7CisgICAgICAgIFdBUk5fZXJybm8oIHJjID09IFNPQ0tFVF9FUlJPUiwgInNldHNvY2tvcHQgSVBfVE9TIiApOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCAhaXNVRFAoIGluU2V0dGluZ3MgKSApIHsKKyAgICAgICAgLy8gc2V0IHRoZSBUQ1AgbWF4aW11bSBzZWdtZW50IHNpemUKKyAgICAgICAgc2V0c29ja190Y3BfbXNzKCBpblNldHRpbmdzLT5tU29jaywgaW5TZXR0aW5ncy0+bU1TUyApOworCisjaWZkZWYgVENQX05PREVMQVkKKworICAgICAgICAvLyBzZXQgVENQIG5vZGVsYXkgb3B0aW9uCisgICAgICAgIGlmICggaXNOb0RlbGF5KCBpblNldHRpbmdzICkgKSB7CisgICAgICAgICAgICBpbnQgbm9kZWxheSA9IDE7CisgICAgICAgICAgICBTb2NrbGVuX3QgbGVuID0gc2l6ZW9mKG5vZGVsYXkpOworICAgICAgICAgICAgaW50IHJjID0gc2V0c29ja29wdCggaW5TZXR0aW5ncy0+bVNvY2ssIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgJm5vZGVsYXksIGxlbiApOworICAgICAgICAgICAgV0FSTl9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAic2V0c29ja29wdCBUQ1BfTk9ERUxBWSIgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorLy8gZW5kIFNldFNvY2tldE9wdGlvbnMKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9SZXBvcnRDU1YuYyBiL2lwZXJmLTIuMC41L3NyYy9SZXBvcnRDU1YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWVhNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvc3JjL1JlcG9ydENTVi5jCkBAIC0wLDAgKzEsMTU3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogUmVwb3J0Q1NWLmMKKyAqIGJ5IEtldmluIEdpYmJzIDxrZ2liYnNAbmxhbnIubmV0PgorICoKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5ocHAiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIlJlcG9ydGVyLmgiCisjaW5jbHVkZSAicmVwb3J0X0NTVi5oIgorI2luY2x1ZGUgIkxvY2FsZS5oIgorCit2b2lkIENTVl90aW1lc3RhbXAoIGNoYXIgKnRpbWVzdGFtcCwgaW50IGxlbmd0aCApOworIAordm9pZCBDU1Zfc3RhdHMoIFRyYW5zZmVyX0luZm8gKnN0YXRzICkgeworICAgIC8vICRUSU1FU1RBTVAsJElELCRJTlRFUlZBTCwkQllURSwkU1BFRUQsJEpJVFRFUiwkTE9TUywkUEFDS0VULCQlTE9TUworICAgIG1heF9zaXplX3Qgc3BlZWQgPSAobWF4X3NpemVfdCkoKChkb3VibGUpc3RhdHMtPlRvdGFsTGVuICogOC4wKSAvIChzdGF0cy0+ZW5kVGltZSAtIHN0YXRzLT5zdGFydFRpbWUpKTsKKyAgICBjaGFyIHRpbWVzdGFtcFsxNl07CisgICAgQ1NWX3RpbWVzdGFtcCggdGltZXN0YW1wLCBzaXplb2YodGltZXN0YW1wKSApOworICAgIGlmICggc3RhdHMtPm1VRFAgIT0gKGNoYXIpa01vZGVfU2VydmVyICkgeworICAgICAgICAvLyBUQ1AgUmVwb3J0aW5nCisgICAgICAgIHByaW50ZiggcmVwb3J0Q1NWX2J3X2Zvcm1hdCwgCisgICAgICAgICAgICAgICAgdGltZXN0YW1wLCAKKyAgICAgICAgICAgICAgICAoc3RhdHMtPnJlc2VydmVkX2RlbGF5ID09IE5VTEwgPyAiLCwsIiA6IHN0YXRzLT5yZXNlcnZlZF9kZWxheSksCisgICAgICAgICAgICAgICAgc3RhdHMtPnRyYW5zZmVySUQsIAorICAgICAgICAgICAgICAgIHN0YXRzLT5zdGFydFRpbWUsIAorICAgICAgICAgICAgICAgIHN0YXRzLT5lbmRUaW1lLCAKKyAgICAgICAgICAgICAgICBzdGF0cy0+VG90YWxMZW4sIAorICAgICAgICAgICAgICAgIHNwZWVkKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVRFAgUmVwb3J0aW5nCisgICAgICAgIHByaW50ZiggcmVwb3J0Q1NWX2J3X2ppdHRlcl9sb3NzX2Zvcm1hdCwgCisgICAgICAgICAgICAgICAgdGltZXN0YW1wLCAKKyAgICAgICAgICAgICAgICAoc3RhdHMtPnJlc2VydmVkX2RlbGF5ID09IE5VTEwgPyAiLCwsIiA6IHN0YXRzLT5yZXNlcnZlZF9kZWxheSksCisgICAgICAgICAgICAgICAgc3RhdHMtPnRyYW5zZmVySUQsIAorICAgICAgICAgICAgICAgIHN0YXRzLT5zdGFydFRpbWUsIAorICAgICAgICAgICAgICAgIHN0YXRzLT5lbmRUaW1lLCAKKyAgICAgICAgICAgICAgICBzdGF0cy0+VG90YWxMZW4sIAorICAgICAgICAgICAgICAgIHNwZWVkLAorICAgICAgICAgICAgICAgIHN0YXRzLT5qaXR0ZXIqMTAwMC4wLCAKKyAgICAgICAgICAgICAgICBzdGF0cy0+Y250RXJyb3IsIAorICAgICAgICAgICAgICAgIHN0YXRzLT5jbnREYXRhZ3JhbXMsCisgICAgICAgICAgICAgICAgKDEwMC4wICogc3RhdHMtPmNudEVycm9yKSAvIHN0YXRzLT5jbnREYXRhZ3JhbXMsIHN0YXRzLT5jbnRPdXRvZk9yZGVyICk7CisgICAgfQorICAgIGlmICggc3RhdHMtPmZyZWUgPT0gMSAmJiBzdGF0cy0+cmVzZXJ2ZWRfZGVsYXkgIT0gTlVMTCApIHsKKyAgICAgICAgZnJlZSggc3RhdHMtPnJlc2VydmVkX2RlbGF5ICk7CisgICAgfQorfQorCit2b2lkICpDU1ZfcGVlciggQ29ubmVjdGlvbl9JbmZvICpzdGF0cywgaW50IElEICkgeworICAgIAorICAgIC8vIGNvcHkgdGhlIGluZXRfbnRvcCBpbnRvIHRlbXAgYnVmZmVycywgdG8gYXZvaWQgb3ZlcndyaXRpbmcKKyAgICBjaGFyIGxvY2FsX2FkZHJbIFJFUE9SVF9BRERSTEVOIF07CisgICAgY2hhciByZW1vdGVfYWRkclsgUkVQT1JUX0FERFJMRU4gXTsKKyAgICBjaGFyICpidWYgPSBtYWxsb2MoIFJFUE9SVF9BRERSTEVOKjIgKyAxMCApOworICAgIHN0cnVjdCBzb2NrYWRkciAqbG9jYWwgPSAoKHN0cnVjdCBzb2NrYWRkciopJnN0YXRzLT5sb2NhbCk7CisgICAgc3RydWN0IHNvY2thZGRyICpwZWVyID0gKChzdHJ1Y3Qgc29ja2FkZHIqKSZzdGF0cy0+cGVlcik7CisKKyAgICBpZiAoIGxvY2FsLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCApIHsKKyAgICAgICAgaW5ldF9udG9wKCBBRl9JTkVULCAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKWxvY2FsKS0+c2luX2FkZHIsIAorICAgICAgICAgICAgICAgICAgIGxvY2FsX2FkZHIsIFJFUE9SVF9BRERSTEVOKTsKKyAgICB9CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICBlbHNlIHsKKyAgICAgICAgaW5ldF9udG9wKCBBRl9JTkVUNiwgJigoc3RydWN0IHNvY2thZGRyX2luNiopbG9jYWwpLT5zaW42X2FkZHIsIAorICAgICAgICAgICAgICAgICAgIGxvY2FsX2FkZHIsIFJFUE9SVF9BRERSTEVOKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggcGVlci0+c2FfZmFtaWx5ID09IEFGX0lORVQgKSB7CisgICAgICAgIGluZXRfbnRvcCggQUZfSU5FVCwgJigoc3RydWN0IHNvY2thZGRyX2luKilwZWVyKS0+c2luX2FkZHIsIAorICAgICAgICAgICAgICAgICAgIHJlbW90ZV9hZGRyLCBSRVBPUlRfQUREUkxFTik7CisgICAgfQorI2lmZGVmIEhBVkVfSVBWNgorICAgICAgZWxzZSB7CisgICAgICAgIGluZXRfbnRvcCggQUZfSU5FVDYsICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXBlZXIpLT5zaW42X2FkZHIsIAorICAgICAgICAgICAgICAgICAgIHJlbW90ZV9hZGRyLCBSRVBPUlRfQUREUkxFTik7CisgICAgfQorI2VuZGlmCisKKyAgICBzbnByaW50ZihidWYsIFJFUE9SVF9BRERSTEVOKjIrMTAsIHJlcG9ydENTVl9wZWVyLCAKKyAgICAgICAgICAgICBsb2NhbF9hZGRyLCAoIGxvY2FsLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luKilsb2NhbCktPnNpbl9wb3J0KSA6CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luNiopbG9jYWwpLT5zaW42X3BvcnQpKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorI2VuZGlmCisgICAgICAgICAgICByZW1vdGVfYWRkciwgKCBwZWVyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luKilwZWVyKS0+c2luX3BvcnQpIDoKKyNpZmRlZiBIQVZFX0lQVjYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilwZWVyKS0+c2luNl9wb3J0KSkpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpOworI2VuZGlmCisgICAgcmV0dXJuIGJ1ZjsKK30KKwordm9pZCBDU1Zfc2VydmVyc3RhdHMoIENvbm5lY3Rpb25fSW5mbyAqY29ubiwgVHJhbnNmZXJfSW5mbyAqc3RhdHMgKSB7CisgICAgc3RhdHMtPnJlc2VydmVkX2RlbGF5ID0gQ1NWX3BlZXIoIGNvbm4sIHN0YXRzLT50cmFuc2ZlcklEICk7CisgICAgc3RhdHMtPmZyZWUgPSAxOworICAgIENTVl9zdGF0cyggc3RhdHMgKTsKK30KKwordm9pZCBDU1ZfdGltZXN0YW1wKCBjaGFyICp0aW1lc3RhbXAsIGludCBsZW5ndGggKSB7CisgICAgdGltZV90IHRpbWVzOworICAgIHN0cnVjdCB0bSAqdGltZXN0OworICAgIHRpbWVzID0gdGltZSggTlVMTCApOworICAgIHRpbWVzdCA9IGxvY2FsdGltZSggJnRpbWVzICk7CisgICAgc3RyZnRpbWUoIHRpbWVzdGFtcCwgbGVuZ3RoLCIlWSVtJWQlSCVNJVMiLCB0aW1lc3QgKTsKK30KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9SZXBvcnREZWZhdWx0LmMgYi9pcGVyZi0yLjAuNS9zcmMvUmVwb3J0RGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzQxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvUmVwb3J0RGVmYXVsdC5jCkBAIC0wLDAgKzEsMzAzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogUmVwb3J0RGVmYXVsdC5jCisgKiBieSBLZXZpbiBHaWJicyA8a2dpYmJzQG5sYW5yLm5ldD4KKyAqCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaHBwIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJSZXBvcnRlci5oIgorI2luY2x1ZGUgInJlcG9ydF9kZWZhdWx0LmgiCisjaW5jbHVkZSAiVGhyZWFkLmgiCisjaW5jbHVkZSAiTG9jYWxlLmgiCisjaW5jbHVkZSAiUGVyZlNvY2tldC5ocHAiCisjaW5jbHVkZSAiU29ja2V0QWRkci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBQcmludHMgdHJhbnNmZXIgcmVwb3J0cyBpbiBkZWZhdWx0IHN0eWxlCisgKi8KK3ZvaWQgcmVwb3J0ZXJfcHJpbnRzdGF0cyggVHJhbnNmZXJfSW5mbyAqc3RhdHMgKSB7CisgICAgc3RhdGljIGNoYXIgaGVhZGVyX3ByaW50ZWQgPSAwOworCisgICAgYnl0ZV9zbnByaW50ZiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKS8yLCAoZG91YmxlKSBzdGF0cy0+VG90YWxMZW4sCisgICAgICAgICAgICAgICAgICAgdG91cHBlciggc3RhdHMtPm1Gb3JtYXQpKTsKKyAgICBieXRlX3NucHJpbnRmKCAmYnVmZmVyW3NpemVvZihidWZmZXIpLzJdLCBzaXplb2YoYnVmZmVyKS8yLAorICAgICAgICAgICAgICAgICAgIHN0YXRzLT5Ub3RhbExlbiAvIChzdGF0cy0+ZW5kVGltZSAtIHN0YXRzLT5zdGFydFRpbWUpLCAKKyAgICAgICAgICAgICAgICAgICBzdGF0cy0+bUZvcm1hdCk7CisKKyAgICBpZiAoIHN0YXRzLT5tVURQICE9IChjaGFyKWtNb2RlX1NlcnZlciApIHsKKyAgICAgICAgLy8gVENQIFJlcG9ydGluZworICAgICAgICBpZiggIWhlYWRlcl9wcmludGVkICkgeworICAgICAgICAgICAgcHJpbnRmKCByZXBvcnRfYndfaGVhZGVyKTsKKyAgICAgICAgICAgIGhlYWRlcl9wcmludGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIHJlcG9ydF9id19mb3JtYXQsIHN0YXRzLT50cmFuc2ZlcklELCAKKyAgICAgICAgICAgICAgICBzdGF0cy0+c3RhcnRUaW1lLCBzdGF0cy0+ZW5kVGltZSwgCisgICAgICAgICAgICAgICAgYnVmZmVyLCAmYnVmZmVyW3NpemVvZihidWZmZXIpLzJdICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVURQIFJlcG9ydGluZworICAgICAgICBpZiggIWhlYWRlcl9wcmludGVkICkgeworICAgICAgICAgICAgcHJpbnRmKCByZXBvcnRfYndfaml0dGVyX2xvc3NfaGVhZGVyKTsKKyAgICAgICAgICAgIGhlYWRlcl9wcmludGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIHJlcG9ydF9id19qaXR0ZXJfbG9zc19mb3JtYXQsIHN0YXRzLT50cmFuc2ZlcklELCAKKyAgICAgICAgICAgICAgICBzdGF0cy0+c3RhcnRUaW1lLCBzdGF0cy0+ZW5kVGltZSwgCisgICAgICAgICAgICAgICAgYnVmZmVyLCAmYnVmZmVyW3NpemVvZihidWZmZXIpLzJdLAorICAgICAgICAgICAgICAgIHN0YXRzLT5qaXR0ZXIqMTAwMC4wLCBzdGF0cy0+Y250RXJyb3IsIHN0YXRzLT5jbnREYXRhZ3JhbXMsCisgICAgICAgICAgICAgICAgKDEwMC4wICogc3RhdHMtPmNudEVycm9yKSAvIHN0YXRzLT5jbnREYXRhZ3JhbXMgKTsKKyAgICAgICAgaWYgKCBzdGF0cy0+Y250T3V0b2ZPcmRlciA+IDAgKSB7CisgICAgICAgICAgICBwcmludGYoIHJlcG9ydF9vdXRvZm9yZGVyLAorICAgICAgICAgICAgICAgICAgICBzdGF0cy0+dHJhbnNmZXJJRCwgc3RhdHMtPnN0YXJ0VGltZSwgCisgICAgICAgICAgICAgICAgICAgIHN0YXRzLT5lbmRUaW1lLCBzdGF0cy0+Y250T3V0b2ZPcmRlciApOworICAgICAgICB9CisgICAgfQorICAgIGlmICggc3RhdHMtPmZyZWUgPT0gMSAmJiBzdGF0cy0+bVVEUCA9PSAoY2hhcilrTW9kZV9DbGllbnQgKSB7CisgICAgICAgIHByaW50ZiggcmVwb3J0X2RhdGFncmFtcywgc3RhdHMtPnRyYW5zZmVySUQsIHN0YXRzLT5jbnREYXRhZ3JhbXMgKTsgCisgICAgfQorfQorCisKKy8qCisgKiBQcmludHMgbXVsdGlwbGUgdHJhbnNmZXIgcmVwb3J0cyBpbiBkZWZhdWx0IHN0eWxlCisgKi8KK3ZvaWQgcmVwb3J0ZXJfbXVsdGlzdGF0cyggVHJhbnNmZXJfSW5mbyAqc3RhdHMgKSB7CisKKyAgICBieXRlX3NucHJpbnRmKCBidWZmZXIsIHNpemVvZihidWZmZXIpLzIsIChkb3VibGUpIHN0YXRzLT5Ub3RhbExlbiwKKyAgICAgICAgICAgICAgICAgICB0b3VwcGVyKCBzdGF0cy0+bUZvcm1hdCkpOworICAgIGJ5dGVfc25wcmludGYoICZidWZmZXJbc2l6ZW9mKGJ1ZmZlcikvMl0sIHNpemVvZihidWZmZXIpLzIsCisgICAgICAgICAgICAgICAgICAgc3RhdHMtPlRvdGFsTGVuIC8gKHN0YXRzLT5lbmRUaW1lIC0gc3RhdHMtPnN0YXJ0VGltZSksIAorICAgICAgICAgICAgICAgICAgIHN0YXRzLT5tRm9ybWF0KTsKKworICAgIGlmICggc3RhdHMtPm1VRFAgIT0gKGNoYXIpa01vZGVfU2VydmVyICkgeworICAgICAgICAvLyBUQ1AgUmVwb3J0aW5nCisgICAgICAgIHByaW50ZiggcmVwb3J0X3N1bV9id19mb3JtYXQsIAorICAgICAgICAgICAgICAgIHN0YXRzLT5zdGFydFRpbWUsIHN0YXRzLT5lbmRUaW1lLCAKKyAgICAgICAgICAgICAgICBidWZmZXIsICZidWZmZXJbc2l6ZW9mKGJ1ZmZlcikvMl0gKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVRFAgUmVwb3J0aW5nCisgICAgICAgIHByaW50ZiggcmVwb3J0X3N1bV9id19qaXR0ZXJfbG9zc19mb3JtYXQsIAorICAgICAgICAgICAgICAgIHN0YXRzLT5zdGFydFRpbWUsIHN0YXRzLT5lbmRUaW1lLCAKKyAgICAgICAgICAgICAgICBidWZmZXIsICZidWZmZXJbc2l6ZW9mKGJ1ZmZlcikvMl0sCisgICAgICAgICAgICAgICAgc3RhdHMtPmppdHRlcioxMDAwLjAsIHN0YXRzLT5jbnRFcnJvciwgc3RhdHMtPmNudERhdGFncmFtcywKKyAgICAgICAgICAgICAgICAoMTAwLjAgKiBzdGF0cy0+Y250RXJyb3IpIC8gc3RhdHMtPmNudERhdGFncmFtcyApOworICAgICAgICBpZiAoIHN0YXRzLT5jbnRPdXRvZk9yZGVyID4gMCApIHsKKyAgICAgICAgICAgIHByaW50ZiggcmVwb3J0X3N1bV9vdXRvZm9yZGVyLAorICAgICAgICAgICAgICAgICAgICBzdGF0cy0+c3RhcnRUaW1lLCAKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMtPmVuZFRpbWUsIHN0YXRzLT5jbnRPdXRvZk9yZGVyICk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBzdGF0cy0+ZnJlZSA9PSAxICYmIHN0YXRzLT5tVURQID09IChjaGFyKWtNb2RlX0NsaWVudCApIHsKKyAgICAgICAgcHJpbnRmKCByZXBvcnRfc3VtX2RhdGFncmFtcywgc3RhdHMtPmNudERhdGFncmFtcyApOyAKKyAgICB9Cit9CisKKy8qCisgKiBQcmludHMgc2VydmVyIHRyYW5zZmVyIHJlcG9ydHMgaW4gZGVmYXVsdCBzdHlsZQorICovCit2b2lkIHJlcG9ydGVyX3NlcnZlcnN0YXRzKCBDb25uZWN0aW9uX0luZm8gKm51c2VkLCBUcmFuc2Zlcl9JbmZvICpzdGF0cyApIHsKKyAgICBwcmludGYoIHNlcnZlcl9yZXBvcnRpbmcsIHN0YXRzLT50cmFuc2ZlcklEICk7CisgICAgcmVwb3J0ZXJfcHJpbnRzdGF0cyggc3RhdHMgKTsKK30KKworLyoKKyAqIFJlcG9ydCB0aGUgY2xpZW50IG9yIGxpc3RlbmVyIFNldHRpbmdzIGluIGRlZmF1bHQgc3R5bGUKKyAqLwordm9pZCByZXBvcnRlcl9yZXBvcnRzZXR0aW5ncyggUmVwb3J0ZXJEYXRhICpkYXRhICkgeworICAgIGludCB3aW4sIHdpbl9yZXF1ZXN0ZWQ7CisKKyAgICB3aW4gPSBnZXRzb2NrX3RjcF93aW5kb3dzaXplKCBkYXRhLT5pbmZvLnRyYW5zZmVySUQsCisgICAgICAgICAgICAgICAgICAoZGF0YS0+bVRocmVhZE1vZGUgPT0ga01vZGVfTGlzdGVuZXIgPyAwIDogMSkgKTsKKyAgICB3aW5fcmVxdWVzdGVkID0gZGF0YS0+bVRDUFdpbjsKKworICAgIHByaW50Ziggc2VwYXJhdG9yX2xpbmUgKTsKKyAgICBpZiAoIGRhdGEtPm1UaHJlYWRNb2RlID09IGtNb2RlX0xpc3RlbmVyICkgeworICAgICAgICBwcmludGYoIHNlcnZlcl9wb3J0LAorICAgICAgICAgICAgICAgIChpc1VEUCggZGF0YSApID8gIlVEUCIgOiAiVENQIiksIAorICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0ICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCBjbGllbnRfcG9ydCwKKyAgICAgICAgICAgICAgICBkYXRhLT5tSG9zdCwKKyAgICAgICAgICAgICAgICAoaXNVRFAoIGRhdGEgKSA/ICJVRFAiIDogIlRDUCIpLAorICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0ICk7CisgICAgfQorICAgIGlmICggZGF0YS0+bUxvY2FsaG9zdCAhPSBOVUxMICkgeworICAgICAgICBwcmludGYoIGJpbmRfYWRkcmVzcywgZGF0YS0+bUxvY2FsaG9zdCApOworICAgICAgICBpZiAoIFNvY2tBZGRyX2lzTXVsdGljYXN0KCAmZGF0YS0+Y29ubmVjdGlvbi5sb2NhbCApICkgeworICAgICAgICAgICAgcHJpbnRmKCBqb2luX211bHRpY2FzdCwgZGF0YS0+bUxvY2FsaG9zdCApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBpc1VEUCggZGF0YSApICkgeworICAgICAgICBwcmludGYoIChkYXRhLT5tVGhyZWFkTW9kZSA9PSBrTW9kZV9MaXN0ZW5lciA/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfZGF0YWdyYW1fc2l6ZSA6IGNsaWVudF9kYXRhZ3JhbV9zaXplKSwKKyAgICAgICAgICAgICAgICBkYXRhLT5tQnVmTGVuICk7CisgICAgICAgIGlmICggU29ja0FkZHJfaXNNdWx0aWNhc3QoICZkYXRhLT5jb25uZWN0aW9uLnBlZXIgKSApIHsKKyAgICAgICAgICAgIHByaW50ZiggbXVsdGljYXN0X3R0bCwgZGF0YS0+aW5mby5tVFRMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBieXRlX3NucHJpbnRmKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCB3aW4sCisgICAgICAgICAgICAgICAgICAgdG91cHBlciggZGF0YS0+aW5mby5tRm9ybWF0KSk7CisgICAgcHJpbnRmKCAiJXM6ICVzIiwgKGlzVURQKCBkYXRhICkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRwX2J1ZmZlcl9zaXplIDogdGNwX3dpbmRvd19zaXplKSwgYnVmZmVyICk7CisKKyAgICBpZiAoIHdpbl9yZXF1ZXN0ZWQgPT0gMCApIHsKKyAgICAgICAgcHJpbnRmKCAiICVzIiwgd2luZG93X2RlZmF1bHQgKTsKKyAgICB9IGVsc2UgaWYgKCB3aW4gIT0gd2luX3JlcXVlc3RlZCApIHsKKyAgICAgICAgYnl0ZV9zbnByaW50ZiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgd2luX3JlcXVlc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG91cHBlciggZGF0YS0+aW5mby5tRm9ybWF0KSk7CisgICAgICAgIHByaW50Ziggd2Fybl93aW5kb3dfcmVxdWVzdGVkLCBidWZmZXIgKTsKKyAgICB9CisgICAgcHJpbnRmKCAiXG4iICk7CisgICAgcHJpbnRmKCBzZXBhcmF0b3JfbGluZSApOworfQorCisvKgorICogUmVwb3J0IGEgc29ja2V0J3MgcGVlciBJUCBhZGRyZXNzIGluIGRlZmF1bHQgc3R5bGUKKyAqLwordm9pZCAqcmVwb3J0ZXJfcmVwb3J0cGVlciggQ29ubmVjdGlvbl9JbmZvICpzdGF0cywgaW50IElEICkgeworICAgIGlmICggSUQgPiAwICkgeworICAgICAgICAvLyBjb3B5IHRoZSBpbmV0X250b3AgaW50byB0ZW1wIGJ1ZmZlcnMsIHRvIGF2b2lkIG92ZXJ3cml0aW5nCisgICAgICAgIGNoYXIgbG9jYWxfYWRkclsgUkVQT1JUX0FERFJMRU4gXTsKKyAgICAgICAgY2hhciByZW1vdGVfYWRkclsgUkVQT1JUX0FERFJMRU4gXTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyICpsb2NhbCA9ICgoc3RydWN0IHNvY2thZGRyKikmc3RhdHMtPmxvY2FsKTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyICpwZWVyID0gKChzdHJ1Y3Qgc29ja2FkZHIqKSZzdGF0cy0+cGVlcik7CisgICAgCisgICAgICAgIGlmICggbG9jYWwtPnNhX2ZhbWlseSA9PSBBRl9JTkVUICkgeworICAgICAgICAgICAgaW5ldF9udG9wKCBBRl9JTkVULCAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKWxvY2FsKS0+c2luX2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9hZGRyLCBSRVBPUlRfQUREUkxFTik7CisgICAgICAgIH0KKyNpZmRlZiBIQVZFX0lQVjYKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZXRfbnRvcCggQUZfSU5FVDYsICYoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKWxvY2FsKS0+c2luNl9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfYWRkciwgUkVQT1JUX0FERFJMRU4pOworICAgICAgICB9CisjZW5kaWYKKyAgICAKKyAgICAgICAgaWYgKCBwZWVyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCApIHsKKyAgICAgICAgICAgIGluZXRfbnRvcCggQUZfSU5FVCwgJigoc3RydWN0IHNvY2thZGRyX2luKilwZWVyKS0+c2luX2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVfYWRkciwgUkVQT1JUX0FERFJMRU4pOworICAgICAgICB9CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbmV0X250b3AoIEFGX0lORVQ2LCAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilwZWVyKS0+c2luNl9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX2FkZHIsIFJFUE9SVF9BRERSTEVOKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgCisgICAgICAgIHByaW50ZiggcmVwb3J0X3BlZXIsCisgICAgICAgICAgICAgICAgSUQsCisgICAgICAgICAgICAgICAgbG9jYWxfYWRkciwgICggbG9jYWwtPnNhX2ZhbWlseSA9PSBBRl9JTkVUID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luKilsb2NhbCktPnNpbl9wb3J0KSA6CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKWxvY2FsKS0+c2luNl9wb3J0KSksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCksCisjZW5kaWYKKyAgICAgICAgICAgICAgICByZW1vdGVfYWRkciwgKCBwZWVyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiopcGVlciktPnNpbl9wb3J0KSA6CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXBlZXIpLT5zaW42X3BvcnQpKSk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorLy8gZW5kIFJlcG9ydFBlZXIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVwb3J0IHRoZSBNU1MgYW5kIE1UVSwgZ2l2ZW4gdGhlIE1TUyAob3IgYSBndWVzcyB0aGVyZW9mKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBjb21wYXJlIHRoZSBNU1MgYWdhaW5zdCB0aGUgKE1UVSAtIDQwKSB0byAoTVRVIC0gODApIGJ5dGVzLgorLy8gNDAgYnl0ZSBJUCBoZWFkZXIgYW5kIHNvbWV3aGF0IGFyYml0cmFyaWx5LCA0MCBtb3JlIGJ5dGVzIG9mIElQIG9wdGlvbnMuCisKKyNkZWZpbmUgY2hlY2tNU1NfTVRVKCBpbk1TUywgaW5NVFUgKSAoaW5NVFUtNDApID49IGluTVNTICAmJiAgaW5NU1MgPj0gKGluTVRVLTgwKQorCit2b2lkIHJlcG9ydGVyX3JlcG9ydE1TUyggaW50IGluTVNTLCB0aHJlYWRfU2V0dGluZ3MgKmluU2V0dGluZ3MgKSB7CisgICAgaWYgKCBpbk1TUyA8PSAwICkgeworICAgICAgICBwcmludGYoIHJlcG9ydF9tc3NfdW5zdXBwb3J0ZWQsIGluU2V0dGluZ3MtPm1Tb2NrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciogbmV0OworICAgICAgICBpbnQgbXR1ID0gMDsKKworICAgICAgICBpZiAoIGNoZWNrTVNTX01UVSggaW5NU1MsIDE1MDAgKSApIHsKKyAgICAgICAgICAgIG5ldCA9ICJldGhlcm5ldCI7CisgICAgICAgICAgICBtdHUgPSAxNTAwOworICAgICAgICB9IGVsc2UgaWYgKCBjaGVja01TU19NVFUoIGluTVNTLCA0MzUyICkgKSB7CisgICAgICAgICAgICBuZXQgPSAiRkRESSI7CisgICAgICAgICAgICBtdHUgPSA0MzUyOworICAgICAgICB9IGVsc2UgaWYgKCBjaGVja01TU19NVFUoIGluTVNTLCA5MTgwICkgKSB7CisgICAgICAgICAgICBuZXQgPSAiQVRNIjsKKyAgICAgICAgICAgIG10dSA9IDkxODA7CisgICAgICAgIH0gZWxzZSBpZiAoIGNoZWNrTVNTX01UVSggaW5NU1MsIDY1MjgwICkgKSB7CisgICAgICAgICAgICBuZXQgPSAiSElQUEkiOworICAgICAgICAgICAgbXR1ID0gNjUyODA7CisgICAgICAgIH0gZWxzZSBpZiAoIGNoZWNrTVNTX01UVSggaW5NU1MsIDU3NiApICkgeworICAgICAgICAgICAgbmV0ID0gIm1pbmltdW0iOworICAgICAgICAgICAgbXR1ID0gNTc2OworICAgICAgICAgICAgcHJpbnRmKCB3YXJuX25vX3BhdGhtdHUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG10dSA9IGluTVNTICsgNDA7CisgICAgICAgICAgICBuZXQgPSAidW5rbm93biBpbnRlcmZhY2UiOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCByZXBvcnRfbXNzLAorICAgICAgICAgICAgICAgIGluU2V0dGluZ3MtPm1Tb2NrLCBpbk1TUywgbXR1LCBuZXQgKTsKKyAgICB9Cit9CisvLyBlbmQgUmVwb3J0TVNTCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9zcmMvUmVwb3J0ZXIuYyBiL2lwZXJmLTIuMC41L3NyYy9SZXBvcnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTI2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvUmVwb3J0ZXIuYwpAQCAtMCwwICsxLDkxMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIFJlcG9ydGVyLmMKKyAqIGJ5IEtldmluIEdpYmJzIDxrZ2liYnNAbmxhbnIubmV0PgorICoKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5ocHAiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIlJlcG9ydGVyLmgiCisjaW5jbHVkZSAiVGhyZWFkLmgiCisjaW5jbHVkZSAiTG9jYWxlLmgiCisjaW5jbHVkZSAiUGVyZlNvY2tldC5ocHAiCisjaW5jbHVkZSAiU29ja2V0QWRkci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgNCBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBSZXBvcnRpbmcKKyAgc3R5bGVzIHRoYXQgZG8gbm90IGhhdmUgYWxsIHRoZSByZXBvcnRpbmcgZm9ybWF0cy4gRm9yCisgIGluc3RhbmNlIHRoZSBwcm92aWRlZCBDU1YgZm9ybWF0IGRvZXMgbm90IGhhdmUgYSBzZXR0aW5ncworICByZXBvcnQgc28gaXQgdXNlcyBzZXR0aW5nc19ub3RpbXBsLgorICAqLwordm9pZCogY29ubmVjdGlvbl9ub3RpbXBsKCBDb25uZWN0aW9uX0luZm8gKiBudXNlZCwgaW50IG51c2UgKSB7IAorICAgIHJldHVybiBOVUxMOyAKK30KK3ZvaWQgc2V0dGluZ3Nfbm90aW1wbCggUmVwb3J0ZXJEYXRhICogbnVzZWQgKSB7IH0KK3ZvaWQgc3RhdGlzdGljc19ub3RpbXBsKCBUcmFuc2Zlcl9JbmZvICogbnVzZWQgKSB7IH0KK3ZvaWQgc2VydmVyc3RhdGlzdGljc19ub3RpbXBsKCBDb25uZWN0aW9uX0luZm8gKm51c2VkMSwgVHJhbnNmZXJfSW5mbyAqbnVzZWQyICkgeyB9CisKKy8vIFRvIGFkZCBhIHJlcG9ydGluZyBzdHlsZSBpbmNsdWRlIGl0cyBoZWFkZXIgaGVyZS4KKyNpbmNsdWRlICJyZXBvcnRfZGVmYXVsdC5oIgorI2luY2x1ZGUgInJlcG9ydF9DU1YuaCIKKworLy8gVGhlIGZvbGxvd2luZyBhcnJheSBvZiByZXBvcnQgc3RydWN0cyBjb250YWlucyB0aGUKKy8vIHBvaW50ZXJzIHJlcXVpcmVkIGZvciByZXBvcnRpbmcgaW4gZGlmZmVyZW50IHJlcG9ydGluZworLy8gc3R5bGVzLiBUbyBhZGQgYSByZXBvcnRpbmcgc3R5bGUgYWRkIGEgcmVwb3J0IHN0cnVjdAorLy8gYmVsb3cuCityZXBvcnRfY29ubmVjdGlvbiBjb25uZWN0aW9uX3JlcG9ydHNba1JlcG9ydF9NQVhJTVVNXSA9IHsKKyAgICByZXBvcnRlcl9yZXBvcnRwZWVyLAorICAgIENTVl9wZWVyCit9OworCityZXBvcnRfc2V0dGluZ3Mgc2V0dGluZ3NfcmVwb3J0c1trUmVwb3J0X01BWElNVU1dID0geworICAgIHJlcG9ydGVyX3JlcG9ydHNldHRpbmdzLAorICAgIHNldHRpbmdzX25vdGltcGwKK307CisKK3JlcG9ydF9zdGF0aXN0aWNzIHN0YXRpc3RpY3NfcmVwb3J0c1trUmVwb3J0X01BWElNVU1dID0geworICAgIHJlcG9ydGVyX3ByaW50c3RhdHMsCisgICAgQ1NWX3N0YXRzCit9OworCityZXBvcnRfc2VydmVyc3RhdGlzdGljcyBzZXJ2ZXJzdGF0aXN0aWNzX3JlcG9ydHNba1JlcG9ydF9NQVhJTVVNXSA9IHsKKyAgICByZXBvcnRlcl9zZXJ2ZXJzdGF0cywKKyAgICBDU1Zfc2VydmVyc3RhdHMKK307CisKK3JlcG9ydF9zdGF0aXN0aWNzIG11bHRpcGxlX3JlcG9ydHNba1JlcG9ydF9NQVhJTVVNXSA9IHsKKyAgICByZXBvcnRlcl9tdWx0aXN0YXRzLAorICAgIENTVl9zdGF0cworfTsKKworY2hhciBidWZmZXJbNjRdOyAvLyBCdWZmZXIgZm9yIHByaW50aW5nCitSZXBvcnRIZWFkZXIgKlJlcG9ydFJvb3QgPSBOVUxMOworZXh0ZXJuIENvbmRpdGlvbiBSZXBvcnRDb25kOworZXh0ZXJuIENvbmRpdGlvbiBSZXBvcnREb25lQ29uZDsKK2ludCByZXBvcnRlcl9wcm9jZXNzX3JlcG9ydCAoIFJlcG9ydEhlYWRlciAqcmVwb3J0ICk7Cit2b2lkIHByb2Nlc3NfcmVwb3J0ICggUmVwb3J0SGVhZGVyICpyZXBvcnQgKTsKK2ludCByZXBvcnRlcl9oYW5kbGVfcGFja2V0KCBSZXBvcnRIZWFkZXIgKnJlcG9ydCApOworaW50IHJlcG9ydGVyX2NvbmRwcmludHN0YXRzKCBSZXBvcnRlckRhdGEgKnN0YXRzLCBNdWx0aUhlYWRlciAqbXVsdGlyZXBvcnQsIGludCBmb3JjZSApOworaW50IHJlcG9ydGVyX3ByaW50KCBSZXBvcnRlckRhdGEgKnN0YXRzLCBpbnQgdHlwZSwgaW50IGVuZCApOwordm9pZCBQcmludE1TUyggUmVwb3J0ZXJEYXRhICpzdGF0cyApOworCitNdWx0aUhlYWRlciogSW5pdE11bHRpKCB0aHJlYWRfU2V0dGluZ3MgKmFnZW50LCBpbnQgaW5JRCApIHsKKyAgICBNdWx0aUhlYWRlciAqbXVsdGloZHIgPSBOVUxMOworICAgIGlmICggYWdlbnQtPm1UaHJlYWRzID4gMSB8fCBhZ2VudC0+bVRocmVhZE1vZGUgPT0ga01vZGVfU2VydmVyICkgeworICAgICAgICBpZiAoIGlzTXVsdGlwbGVSZXBvcnQoIGFnZW50ICkgKSB7CisgICAgICAgICAgICBtdWx0aWhkciA9IG1hbGxvYyhzaXplb2YoTXVsdGlIZWFkZXIpICsgIHNpemVvZihSZXBvcnRlckRhdGEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9NVUxUSV9TTE9UUyAqIHNpemVvZihUcmFuc2Zlcl9JbmZvKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdWx0aWhkciA9IG1hbGxvYyhzaXplb2YoTXVsdGlIZWFkZXIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG11bHRpaGRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBtZW1zZXQoIG11bHRpaGRyLCAwLCBzaXplb2YoTXVsdGlIZWFkZXIpICk7CisgICAgICAgICAgICBDb25kaXRpb25fSW5pdGlhbGl6ZSggJm11bHRpaGRyLT5iYXJyaWVyICk7CisgICAgICAgICAgICBtdWx0aWhkci0+Z3JvdXBJRCA9IGluSUQ7CisgICAgICAgICAgICBtdWx0aWhkci0+dGhyZWFkcyA9IGFnZW50LT5tVGhyZWFkczsKKyAgICAgICAgICAgIGlmICggaXNNdWx0aXBsZVJlcG9ydCggYWdlbnQgKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBSZXBvcnRlckRhdGEgKmRhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIG11bHRpaGRyLT5yZXBvcnQgPSAoUmVwb3J0ZXJEYXRhKikobXVsdGloZHIgKyAxKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobXVsdGloZHItPnJlcG9ydCwgMCwgc2l6ZW9mKFJlcG9ydGVyRGF0YSkpOworICAgICAgICAgICAgICAgIG11bHRpaGRyLT5kYXRhID0gKFRyYW5zZmVyX0luZm8qKShtdWx0aWhkci0+cmVwb3J0ICsgMSk7CisgICAgICAgICAgICAgICAgZGF0YSA9IG11bHRpaGRyLT5yZXBvcnQ7CisgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBOVU1fTVVMVElfU0xPVFM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGloZHItPmRhdGFbaV0uc3RhcnRUaW1lID0gLTE7CisgICAgICAgICAgICAgICAgICAgIG11bHRpaGRyLT5kYXRhW2ldLnRyYW5zZmVySUQgPSBpbklEOworICAgICAgICAgICAgICAgICAgICBtdWx0aWhkci0+ZGF0YVtpXS5ncm91cElEID0gLTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRhdGEtPnR5cGUgPSBUUkFOU0ZFUl9SRVBPUlQ7CisgICAgICAgICAgICAgICAgaWYgKCBhZ2VudC0+bUludGVydmFsICE9IDAuMCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKmludGVydmFsID0gJmRhdGEtPmludGVydmFsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnR2X3NlYyA9IChsb25nKSBhZ2VudC0+bUludGVydmFsOworICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC0+dHZfdXNlYyA9IChsb25nKSAoKGFnZW50LT5tSW50ZXJ2YWwgLSBpbnRlcnZhbC0+dHZfc2VjKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogck1pbGxpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXRhLT5tSG9zdCA9IGFnZW50LT5tSG9zdDsKKyAgICAgICAgICAgICAgICBkYXRhLT5tTG9jYWxob3N0ID0gYWdlbnQtPm1Mb2NhbGhvc3Q7CisgICAgICAgICAgICAgICAgZGF0YS0+bUJ1ZkxlbiA9IGFnZW50LT5tQnVmTGVuOworICAgICAgICAgICAgICAgIGRhdGEtPm1NU1MgPSBhZ2VudC0+bU1TUzsKKyAgICAgICAgICAgICAgICBkYXRhLT5tVENQV2luID0gYWdlbnQtPm1UQ1BXaW47CisgICAgICAgICAgICAgICAgZGF0YS0+ZmxhZ3MgPSBhZ2VudC0+ZmxhZ3M7CisgICAgICAgICAgICAgICAgZGF0YS0+bVRocmVhZE1vZGUgPSBhZ2VudC0+bVRocmVhZE1vZGU7CisgICAgICAgICAgICAgICAgZGF0YS0+bW9kZSA9IGFnZW50LT5tUmVwb3J0TW9kZTsKKyAgICAgICAgICAgICAgICBkYXRhLT5pbmZvLm1Gb3JtYXQgPSBhZ2VudC0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICBkYXRhLT5pbmZvLm1UVEwgPSBhZ2VudC0+bVRUTDsKKyAgICAgICAgICAgICAgICBpZiAoIGlzVURQKCBhZ2VudCApICkgeworICAgICAgICAgICAgICAgICAgICBtdWx0aWhkci0+cmVwb3J0LT5pbmZvLm1VRFAgPSAoY2hhcilhZ2VudC0+bVRocmVhZE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggaXNDb25uZWN0aW9uUmVwb3J0KCBhZ2VudCApICkgeworICAgICAgICAgICAgICAgICAgICBkYXRhLT50eXBlIHw9IENPTk5FQ1RJT05fUkVQT1JUOworICAgICAgICAgICAgICAgICAgICBkYXRhLT5jb25uZWN0aW9uLnBlZXIgPSBhZ2VudC0+cGVlcjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29ubmVjdGlvbi5zaXplX3BlZXIgPSBhZ2VudC0+c2l6ZV9wZWVyOworICAgICAgICAgICAgICAgICAgICBTb2NrQWRkcl9zZXRQb3J0QW55KCAmZGF0YS0+Y29ubmVjdGlvbi5wZWVyICk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEtPmNvbm5lY3Rpb24ubG9jYWwgPSBhZ2VudC0+bG9jYWw7CisgICAgICAgICAgICAgICAgICAgIGRhdGEtPmNvbm5lY3Rpb24uc2l6ZV9sb2NhbCA9IGFnZW50LT5zaXplX2xvY2FsOworICAgICAgICAgICAgICAgICAgICBTb2NrQWRkcl9zZXRQb3J0QW55KCAmZGF0YS0+Y29ubmVjdGlvbi5sb2NhbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoMSwgIk91dCBvZiBNZW1vcnkhIVxuIiwgYWdlbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtdWx0aWhkcjsKK30KKworLyoKKyAqIEJhcnJpZXJDbGllbnQgYWxsb3dzIGZvciBtdWx0aXBsZSBzdHJlYW0gY2xpZW50cyB0byBiZSBzeW5jcm9uaXplZAorICovCit2b2lkIEJhcnJpZXJDbGllbnQoIFJlcG9ydEhlYWRlciAqYWdlbnQgKSB7CisgICAgQ29uZGl0aW9uX0xvY2soYWdlbnQtPm11bHRpcmVwb3J0LT5iYXJyaWVyKTsKKyAgICBhZ2VudC0+bXVsdGlyZXBvcnQtPnRocmVhZHMtLTsKKyAgICBpZiAoIGFnZW50LT5tdWx0aXJlcG9ydC0+dGhyZWFkcyA9PSAwICkgeworICAgICAgICAvLyBsYXN0IG9uZSBzZXQgdGltZSBhbmQgd2FrZSB1cCBldmVyeW9uZQorICAgICAgICBnZXR0aW1lb2ZkYXkoICYoYWdlbnQtPm11bHRpcmVwb3J0LT5zdGFydFRpbWUpLCBOVUxMICk7CisgICAgICAgIENvbmRpdGlvbl9Ccm9hZGNhc3QoICZhZ2VudC0+bXVsdGlyZXBvcnQtPmJhcnJpZXIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDb25kaXRpb25fV2FpdCggJmFnZW50LT5tdWx0aXJlcG9ydC0+YmFycmllciApOworICAgIH0KKyAgICBhZ2VudC0+bXVsdGlyZXBvcnQtPnRocmVhZHMrKzsKKyAgICBDb25kaXRpb25fVW5sb2NrKCBhZ2VudC0+bXVsdGlyZXBvcnQtPmJhcnJpZXIgKTsKKyAgICBhZ2VudC0+cmVwb3J0LnN0YXJ0VGltZSA9IGFnZW50LT5tdWx0aXJlcG9ydC0+c3RhcnRUaW1lOworICAgIGFnZW50LT5yZXBvcnQubmV4dFRpbWUgPSBhZ2VudC0+cmVwb3J0LnN0YXJ0VGltZTsKKyAgICBUaW1lQWRkKCBhZ2VudC0+cmVwb3J0Lm5leHRUaW1lLCBhZ2VudC0+cmVwb3J0LmludGVydmFsVGltZSApOworfQorCisvKgorICogSW5pdFJlcG9ydCBpcyBjYWxsZWQgYnkgYSB0cmFuc2ZlciBhZ2VudCAoY2xpZW50IG9yCisgKiBzZXJ2ZXIpIHRvIHNldHVwIHRoZSBuZWVkZWQgc3RydWN0dXJlcyB0byBjb21tdW5pY2F0ZQorICogdHJhZmZpYy4KKyAqLworUmVwb3J0SGVhZGVyKiBJbml0UmVwb3J0KCB0aHJlYWRfU2V0dGluZ3MgKmFnZW50ICkgeworICAgIFJlcG9ydEhlYWRlciAqcmVwb3J0aGRyID0gTlVMTDsKKyAgICBSZXBvcnRlckRhdGEgKmRhdGEgPSBOVUxMOworICAgIGlmICggaXNEYXRhUmVwb3J0KCBhZ2VudCApICkgeworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGUgaW4gb25lIGJpZyBjaHVuaworICAgICAgICAgKi8KKyAgICAgICAgcmVwb3J0aGRyID0gbWFsbG9jKCBzaXplb2YoUmVwb3J0SGVhZGVyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX1JFUE9SVF9TVFJVQ1RTICogc2l6ZW9mKFJlcG9ydFN0cnVjdCkgKTsKKyAgICAgICAgaWYgKCByZXBvcnRoZHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGhlYWRlcnMgYXJlIGNsZWFuCisgICAgICAgICAgICBtZW1zZXQoIHJlcG9ydGhkciwgMCwgc2l6ZW9mKFJlcG9ydEhlYWRlcikpOworICAgICAgICAgICAgcmVwb3J0aGRyLT5kYXRhID0gKFJlcG9ydFN0cnVjdCopKHJlcG9ydGhkcisxKTsKKyAgICAgICAgICAgIHJlcG9ydGhkci0+bXVsdGlyZXBvcnQgPSBhZ2VudC0+bXVsdGloZHI7CisgICAgICAgICAgICBkYXRhID0gJnJlcG9ydGhkci0+cmVwb3J0OworICAgICAgICAgICAgcmVwb3J0aGRyLT5yZXBvcnRlcmluZGV4ID0gTlVNX1JFUE9SVF9TVFJVQ1RTIC0gMTsKKyAgICAgICAgICAgIGRhdGEtPmluZm8udHJhbnNmZXJJRCA9IGFnZW50LT5tU29jazsKKyAgICAgICAgICAgIGRhdGEtPmluZm8uZ3JvdXBJRCA9IChhZ2VudC0+bXVsdGloZHIgIT0gTlVMTCA/IGFnZW50LT5tdWx0aWhkci0+Z3JvdXBJRCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC0xKTsKKyAgICAgICAgICAgIGRhdGEtPnR5cGUgPSBUUkFOU0ZFUl9SRVBPUlQ7CisgICAgICAgICAgICBpZiAoIGFnZW50LT5tSW50ZXJ2YWwgIT0gMC4wICkgeworICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICppbnRlcnZhbCA9ICZkYXRhLT5pbnRlcnZhbFRpbWU7CisgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnR2X3NlYyA9IChsb25nKSBhZ2VudC0+bUludGVydmFsOworICAgICAgICAgICAgICAgIGludGVydmFsLT50dl91c2VjID0gKGxvbmcpICgoYWdlbnQtPm1JbnRlcnZhbCAtIGludGVydmFsLT50dl9zZWMpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJNaWxsaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEtPm1Ib3N0ID0gYWdlbnQtPm1Ib3N0OworICAgICAgICAgICAgZGF0YS0+bUxvY2FsaG9zdCA9IGFnZW50LT5tTG9jYWxob3N0OworICAgICAgICAgICAgZGF0YS0+bUJ1ZkxlbiA9IGFnZW50LT5tQnVmTGVuOworICAgICAgICAgICAgZGF0YS0+bU1TUyA9IGFnZW50LT5tTVNTOworICAgICAgICAgICAgZGF0YS0+bVRDUFdpbiA9IGFnZW50LT5tVENQV2luOworICAgICAgICAgICAgZGF0YS0+ZmxhZ3MgPSBhZ2VudC0+ZmxhZ3M7CisgICAgICAgICAgICBkYXRhLT5tVGhyZWFkTW9kZSA9IGFnZW50LT5tVGhyZWFkTW9kZTsKKyAgICAgICAgICAgIGRhdGEtPm1vZGUgPSBhZ2VudC0+bVJlcG9ydE1vZGU7CisgICAgICAgICAgICBkYXRhLT5pbmZvLm1Gb3JtYXQgPSBhZ2VudC0+bUZvcm1hdDsKKyAgICAgICAgICAgIGRhdGEtPmluZm8ubVRUTCA9IGFnZW50LT5tVFRMOworICAgICAgICAgICAgaWYgKCBpc1VEUCggYWdlbnQgKSApIHsKKyAgICAgICAgICAgICAgICByZXBvcnRoZHItPnJlcG9ydC5pbmZvLm1VRFAgPSAoY2hhcilhZ2VudC0+bVRocmVhZE1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGQUlMKDEsICJPdXQgb2YgTWVtb3J5ISFcbiIsIGFnZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGlzQ29ubmVjdGlvblJlcG9ydCggYWdlbnQgKSApIHsKKyAgICAgICAgaWYgKCByZXBvcnRoZHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDcmVhdGUgaW4gb25lIGJpZyBjaHVuaworICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXBvcnRoZHIgPSBtYWxsb2MoIHNpemVvZihSZXBvcnRIZWFkZXIpICk7CisgICAgICAgICAgICBpZiAoIHJlcG9ydGhkciAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGhlYWRlcnMgYXJlIGNsZWFuCisgICAgICAgICAgICAgICAgbWVtc2V0KCByZXBvcnRoZHIsIDAsIHNpemVvZihSZXBvcnRIZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gJnJlcG9ydGhkci0+cmVwb3J0OworICAgICAgICAgICAgICAgIGRhdGEtPmluZm8udHJhbnNmZXJJRCA9IGFnZW50LT5tU29jazsKKyAgICAgICAgICAgICAgICBkYXRhLT5pbmZvLmdyb3VwSUQgPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRkFJTCgxLCAiT3V0IG9mIE1lbW9yeSEhXG4iLCBhZ2VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCByZXBvcnRoZHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGRhdGEtPnR5cGUgfD0gQ09OTkVDVElPTl9SRVBPUlQ7CisgICAgICAgICAgICBkYXRhLT5jb25uZWN0aW9uLnBlZXIgPSBhZ2VudC0+cGVlcjsKKyAgICAgICAgICAgIGRhdGEtPmNvbm5lY3Rpb24uc2l6ZV9wZWVyID0gYWdlbnQtPnNpemVfcGVlcjsKKyAgICAgICAgICAgIGRhdGEtPmNvbm5lY3Rpb24ubG9jYWwgPSBhZ2VudC0+bG9jYWw7CisgICAgICAgICAgICBkYXRhLT5jb25uZWN0aW9uLnNpemVfbG9jYWwgPSBhZ2VudC0+c2l6ZV9sb2NhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoMSwgIk91dCBvZiBNZW1vcnkhIVxuIiwgYWdlbnQpOworICAgICAgICB9CisgICAgfQorICAgIGlmICggaXNDb25uZWN0aW9uUmVwb3J0KCBhZ2VudCApIHx8IGlzRGF0YVJlcG9ydCggYWdlbnQgKSApIHsKKworI2lmZGVmIEhBVkVfVEhSRUFECisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgUmVwb3J0Um9vdCB0byBpbmNsdWRlIHRoaXMgcmVwb3J0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCByZXBvcnRoZHItPnJlcG9ydC5tVGhyZWFkTW9kZSA9PSBrTW9kZV9DbGllbnQgJiYKKyAgICAgICAgICAgICByZXBvcnRoZHItPm11bHRpcmVwb3J0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBzeW5jcm9uaXplIHdhdGNoZXMgb24gbXkgbWFyay4uLi4uLgorICAgICAgICAgICAgQmFycmllckNsaWVudCggcmVwb3J0aGRyICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHJlcG9ydGhkci0+bXVsdGlyZXBvcnQgIT0gTlVMTCAmJiBpc011bHRpcGxlUmVwb3J0KCBhZ2VudCApKSB7CisgICAgICAgICAgICAgICAgcmVwb3J0aGRyLT5tdWx0aXJlcG9ydC0+dGhyZWFkcysrOworICAgICAgICAgICAgICAgIGlmICggcmVwb3J0aGRyLT5tdWx0aXJlcG9ydC0+cmVwb3J0LT5zdGFydFRpbWUudHZfc2VjID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheSggJihyZXBvcnRoZHItPm11bHRpcmVwb3J0LT5yZXBvcnQtPnN0YXJ0VGltZSksIE5VTEwgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0aGRyLT5yZXBvcnQuc3RhcnRUaW1lID0gcmVwb3J0aGRyLT5tdWx0aXJlcG9ydC0+cmVwb3J0LT5zdGFydFRpbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHNldCBzdGFydCB0aW1lCisgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCAmKHJlcG9ydGhkci0+cmVwb3J0LnN0YXJ0VGltZSksIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydGhkci0+cmVwb3J0Lm5leHRUaW1lID0gcmVwb3J0aGRyLT5yZXBvcnQuc3RhcnRUaW1lOworICAgICAgICAgICAgVGltZUFkZCggcmVwb3J0aGRyLT5yZXBvcnQubmV4dFRpbWUsIHJlcG9ydGhkci0+cmVwb3J0LmludGVydmFsVGltZSApOworICAgICAgICB9CisgICAgICAgIENvbmRpdGlvbl9Mb2NrKCBSZXBvcnRDb25kICk7CisgICAgICAgIHJlcG9ydGhkci0+bmV4dCA9IFJlcG9ydFJvb3Q7CisgICAgICAgIFJlcG9ydFJvb3QgPSByZXBvcnRoZHI7CisgICAgICAgIENvbmRpdGlvbl9TaWduYWwoICZSZXBvcnRDb25kICk7CisgICAgICAgIENvbmRpdGlvbl9VbmxvY2soIFJlcG9ydENvbmQgKTsKKyNlbHNlCisgICAgICAgIC8vIHNldCBzdGFydCB0aW1lCisgICAgICAgIGdldHRpbWVvZmRheSggJihyZXBvcnRoZHItPnJlcG9ydC5zdGFydFRpbWUpLCBOVUxMICk7CisgICAgICAgIC8qCisgICAgICAgICAqIFByb2Nlc3MgdGhlIHJlcG9ydCBpbiB0aGlzIHRocmVhZAorICAgICAgICAgKi8KKyAgICAgICAgcmVwb3J0aGRyLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgcHJvY2Vzc19yZXBvcnQgKCByZXBvcnRoZHIgKTsKKyNlbmRpZiAKKyAgICB9CisgICAgaWYgKCAhaXNEYXRhUmVwb3J0KCBhZ2VudCApICkgeworICAgICAgICByZXBvcnRoZHIgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVwb3J0aGRyOworfQorCisvKgorICogUmVwb3J0UGFja2V0IGlzIGNhbGxlZCBieSBhIHRyYW5zZmVyIGFnZW50IHRvIHJlY29yZAorICogdGhlIGFycml2YWwgb3IgZGVwYXJ0dXJlIG9mIGEgInBhY2tldCIgKGZvciBUQ1AgaXQgCisgKiB3aWxsIGFjdHVhbGx5IHJlcHJlc2VudCBtYW55IHBhY2tldHMpLiBUaGlzIG5lZWRzIHRvCisgKiBiZSBhcyBzaW1wbGUgYW5kIGZhc3QgYXMgcG9zc2libGUgYXMgaXQgZ2V0cyBjYWxsZWQgZm9yCisgKiBldmVyeSAicGFja2V0Ii4KKyAqLwordm9pZCBSZXBvcnRQYWNrZXQoIFJlcG9ydEhlYWRlciogYWdlbnQsIFJlcG9ydFN0cnVjdCAqcGFja2V0ICkgeworICAgIGlmICggYWdlbnQgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGluZGV4ID0gYWdlbnQtPnJlcG9ydGVyaW5kZXg7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGZpbmQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlIHRvIHB1dCB0aGUgaW5mb3JtYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICggYWdlbnQtPmFnZW50aW5kZXggPT0gTlVNX1JFUE9SVF9TVFJVQ1RTICkgeworICAgICAgICAgICAgLy8gSnVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHJlcG9ydGVyIGlzIG5vdCBvbiB0aGUgZmlyc3QKKyAgICAgICAgICAgIC8vIGl0ZW0KKyAgICAgICAgICAgIHdoaWxlICggaW5kZXggPT0gMCApIHsKKyAgICAgICAgICAgICAgICBDb25kaXRpb25fU2lnbmFsKCAmUmVwb3J0Q29uZCApOworICAgICAgICAgICAgICAgIENvbmRpdGlvbl9XYWl0KCAmUmVwb3J0RG9uZUNvbmQgKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGFnZW50LT5yZXBvcnRlcmluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWdlbnQtPmFnZW50aW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgcmVwb3J0ZXIgaXMgbm90IGFib3V0IHRvIGJlICJsYXBwZWQiCisgICAgICAgIHdoaWxlICggaW5kZXggLSAxID09IGFnZW50LT5hZ2VudGluZGV4ICkgeworICAgICAgICAgICAgQ29uZGl0aW9uX1NpZ25hbCggJlJlcG9ydENvbmQgKTsKKyAgICAgICAgICAgIENvbmRpdGlvbl9XYWl0KCAmUmVwb3J0RG9uZUNvbmQgKTsKKyAgICAgICAgICAgIGluZGV4ID0gYWdlbnQtPnJlcG9ydGVyaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICAvLyBQdXQgdGhlIGluZm9ybWF0aW9uIHRoZXJlCisgICAgICAgIG1lbWNweSggYWdlbnQtPmRhdGEgKyBhZ2VudC0+YWdlbnRpbmRleCwgcGFja2V0LCBzaXplb2YoUmVwb3J0U3RydWN0KSApOworICAgICAgICAKKyAgICAgICAgLy8gVXBkYXRpbmcgYWdlbnRpbmRleCBNVVNUIGJlIHRoZSBsYXN0IHRoaW5nIGRvbmUKKyAgICAgICAgYWdlbnQtPmFnZW50aW5kZXgrKzsKKyNpZm5kZWYgSEFWRV9USFJFQUQKKyAgICAgICAgLyoKKyAgICAgICAgICogUHJvY2VzcyB0aGUgcmVwb3J0IGluIHRoaXMgdGhyZWFkCisgICAgICAgICAqLworICAgICAgICBwcm9jZXNzX3JlcG9ydCAoIGFnZW50ICk7CisjZW5kaWYgCisgICAgfQorfQorCisvKgorICogQ2xvc2VSZXBvcnQgaXMgY2FsbGVkIGJ5IGEgdHJhbnNmZXIgYWdlbnQgdG8gZmluYWxpemUKKyAqIHRoZSByZXBvcnQgYW5kIHNpZ25hbCB0cmFuc2ZlciBpcyBvdmVyLgorICovCit2b2lkIENsb3NlUmVwb3J0KCBSZXBvcnRIZWFkZXIgKmFnZW50LCBSZXBvcnRTdHJ1Y3QgKnBhY2tldCApIHsKKyAgICBpZiAoIGFnZW50ICE9IE5VTEwpIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBVc2luZyBQYWNrZXRJRCBvZiAtMSBlbmRzIHJlcG9ydGluZworICAgICAgICAgKi8KKyAgICAgICAgcGFja2V0LT5wYWNrZXRJRCA9IC0xOworICAgICAgICBwYWNrZXQtPnBhY2tldExlbiA9IDA7CisgICAgICAgIFJlcG9ydFBhY2tldCggYWdlbnQsIHBhY2tldCApOworICAgICAgICBwYWNrZXQtPnBhY2tldElEID0gYWdlbnQtPnJlcG9ydC5jbnREYXRhZ3JhbXM7CisgICAgfQorfQorCisvKgorICogRW5kUmVwb3J0IHNpZ25pZmllcyB0aGUgYWdlbnQgbm8gbG9uZ2VyIGlzIGludGVyZXN0ZWQKKyAqIGluIHRoZSByZXBvcnQuIENhbGxzIHRvIEdldFJlcG9ydCB3aWxsIG5vIGxvbmdlciBiZQorICogZmlsbGVkCisgKi8KK3ZvaWQgRW5kUmVwb3J0KCBSZXBvcnRIZWFkZXIgKmFnZW50ICkgeworICAgIGlmICggYWdlbnQgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGluZGV4ID0gYWdlbnQtPnJlcG9ydGVyaW5kZXg7CisgICAgICAgIHdoaWxlICggaW5kZXggIT0gLTEgKSB7CisgICAgICAgICAgICB0aHJlYWRfcmVzdCgpOworICAgICAgICAgICAgaW5kZXggPSBhZ2VudC0+cmVwb3J0ZXJpbmRleDsKKyAgICAgICAgfQorICAgICAgICBhZ2VudC0+YWdlbnRpbmRleCA9IC0xOworI2lmbmRlZiBIQVZFX1RIUkVBRAorICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSByZXBvcnQgaW4gdGhpcyB0aHJlYWQKKyAgICAgICAgICovCisgICAgICAgIHByb2Nlc3NfcmVwb3J0ICggYWdlbnQgKTsKKyNlbmRpZgorICAgIH0KK30KKworLyoKKyAqIEdldFJlcG9ydCBpcyBjYWxsZWQgYnkgdGhlIGFnZW50IGFmdGVyIGEgQ2xvc2VSZXBvcnQKKyAqIGJ1dCBiZWZvcmUgYW4gRW5kUmVwb3J0IHRvIGdldCB0aGUgc3RhdHMgZ2VuZXJhdGVkCisgKiBieSB0aGUgcmVwb3J0ZXIgdGhyZWFkLgorICovCitUcmFuc2Zlcl9JbmZvICpHZXRSZXBvcnQoIFJlcG9ydEhlYWRlciAqYWdlbnQgKSB7CisgICAgaW50IGluZGV4ID0gYWdlbnQtPnJlcG9ydGVyaW5kZXg7CisgICAgd2hpbGUgKCBpbmRleCAhPSAtMSApIHsKKyAgICAgICAgdGhyZWFkX3Jlc3QoKTsKKyAgICAgICAgaW5kZXggPSBhZ2VudC0+cmVwb3J0ZXJpbmRleDsKKyAgICB9CisgICAgcmV0dXJuICZhZ2VudC0+cmVwb3J0LmluZm87Cit9CisKKy8qCisgKiBSZXBvcnRTZXR0aW5ncyB3aWxsIGdlbmVyYXRlIGEgc3VtbWFyeSByZXBvcnQgZm9yCisgKiBzZXR0aW5ncyBiZWluZyB1c2VkIHdpdGggTGlzdGVuZXJzIG9yIENsaWVudHMKKyAqLwordm9pZCBSZXBvcnRTZXR0aW5ncyggdGhyZWFkX1NldHRpbmdzICphZ2VudCApIHsKKyAgICBpZiAoIGlzU2V0dGluZ3NSZXBvcnQoIGFnZW50ICkgKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIENyZWF0ZSBpbiBvbmUgYmlnIGNodW5rCisgICAgICAgICAqLworICAgICAgICBSZXBvcnRIZWFkZXIgKnJlcG9ydGhkciA9IG1hbGxvYyggc2l6ZW9mKFJlcG9ydEhlYWRlcikgKTsKKyAgICAKKyAgICAgICAgaWYgKCByZXBvcnRoZHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIFJlcG9ydGVyRGF0YSAqZGF0YSA9ICZyZXBvcnRoZHItPnJlcG9ydDsKKyAgICAgICAgICAgIGRhdGEtPmluZm8udHJhbnNmZXJJRCA9IGFnZW50LT5tU29jazsKKyAgICAgICAgICAgIGRhdGEtPmluZm8uZ3JvdXBJRCA9IC0xOworICAgICAgICAgICAgcmVwb3J0aGRyLT5hZ2VudGluZGV4ID0gLTE7CisgICAgICAgICAgICByZXBvcnRoZHItPnJlcG9ydGVyaW5kZXggPSAtMTsKKyAgICAgICAgCisgICAgICAgICAgICBkYXRhLT5tSG9zdCA9IGFnZW50LT5tSG9zdDsKKyAgICAgICAgICAgIGRhdGEtPm1Mb2NhbGhvc3QgPSBhZ2VudC0+bUxvY2FsaG9zdDsKKyAgICAgICAgICAgIGRhdGEtPm1vZGUgPSBhZ2VudC0+bVJlcG9ydE1vZGU7CisgICAgICAgICAgICBkYXRhLT50eXBlID0gU0VUVElOR1NfUkVQT1JUOworICAgICAgICAgICAgZGF0YS0+bUJ1ZkxlbiA9IGFnZW50LT5tQnVmTGVuOworICAgICAgICAgICAgZGF0YS0+bU1TUyA9IGFnZW50LT5tTVNTOworICAgICAgICAgICAgZGF0YS0+bVRDUFdpbiA9IGFnZW50LT5tVENQV2luOworICAgICAgICAgICAgZGF0YS0+ZmxhZ3MgPSBhZ2VudC0+ZmxhZ3M7CisgICAgICAgICAgICBkYXRhLT5tVGhyZWFkTW9kZSA9IGFnZW50LT5tVGhyZWFkTW9kZTsKKyAgICAgICAgICAgIGRhdGEtPm1Qb3J0ID0gYWdlbnQtPm1Qb3J0OworICAgICAgICAgICAgZGF0YS0+aW5mby5tRm9ybWF0ID0gYWdlbnQtPm1Gb3JtYXQ7CisgICAgICAgICAgICBkYXRhLT5pbmZvLm1UVEwgPSBhZ2VudC0+bVRUTDsKKyAgICAgICAgICAgIGRhdGEtPmNvbm5lY3Rpb24ucGVlciA9IGFnZW50LT5wZWVyOworICAgICAgICAgICAgZGF0YS0+Y29ubmVjdGlvbi5zaXplX3BlZXIgPSBhZ2VudC0+c2l6ZV9wZWVyOworICAgICAgICAgICAgZGF0YS0+Y29ubmVjdGlvbi5sb2NhbCA9IGFnZW50LT5sb2NhbDsKKyAgICAgICAgICAgIGRhdGEtPmNvbm5lY3Rpb24uc2l6ZV9sb2NhbCA9IGFnZW50LT5zaXplX2xvY2FsOworICAgIAorICAgICNpZmRlZiBIQVZFX1RIUkVBRAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgUmVwb3J0Um9vdCB0byBpbmNsdWRlIHRoaXMgcmVwb3J0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb25kaXRpb25fTG9jayggUmVwb3J0Q29uZCApOworICAgICAgICAgICAgcmVwb3J0aGRyLT5uZXh0ID0gUmVwb3J0Um9vdDsKKyAgICAgICAgICAgIFJlcG9ydFJvb3QgPSByZXBvcnRoZHI7CisgICAgICAgICAgICBDb25kaXRpb25fU2lnbmFsKCAmUmVwb3J0Q29uZCApOworICAgICAgICAgICAgQ29uZGl0aW9uX1VubG9jayggUmVwb3J0Q29uZCApOworICAgICNlbHNlCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUHJvY2VzcyB0aGUgcmVwb3J0IGluIHRoaXMgdGhyZWFkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlcG9ydGhkci0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBwcm9jZXNzX3JlcG9ydCAoIHJlcG9ydGhkciApOworICAgICNlbmRpZiAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoMSwgIk91dCBvZiBNZW1vcnkhIVxuIiwgYWdlbnQpOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogUmVwb3J0U2VydmVyVURQIHdpbGwgZ2VuZXJhdGUgYSByZXBvcnQgb2YgdGhlIFVEUAorICogc3RhdGlzdGljcyBhcyByZXBvcnRlZCBieSB0aGUgc2VydmVyIG9uIHRoZSBjbGllbnQKKyAqIHNpZGUuCisgKi8KK3ZvaWQgUmVwb3J0U2VydmVyVURQKCB0aHJlYWRfU2V0dGluZ3MgKmFnZW50LCBzZXJ2ZXJfaGRyICpzZXJ2ZXIgKSB7CisgICAgaWYgKCAobnRvaGwoc2VydmVyLT5mbGFncykgJiBIRUFERVJfVkVSU0lPTjEpICE9IDAgJiYKKyAgICAgICAgIGlzU2VydmVyUmVwb3J0KCBhZ2VudCApICkgeworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGUgaW4gb25lIGJpZyBjaHVuaworICAgICAgICAgKi8KKyAgICAgICAgUmVwb3J0SGVhZGVyICpyZXBvcnRoZHIgPSBtYWxsb2MoIHNpemVvZihSZXBvcnRIZWFkZXIpICk7CisgICAgICAgIFRyYW5zZmVyX0luZm8gKnN0YXRzID0gJnJlcG9ydGhkci0+cmVwb3J0LmluZm87CisKKyAgICAgICAgaWYgKCByZXBvcnRoZHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YXRzLT50cmFuc2ZlcklEID0gYWdlbnQtPm1Tb2NrOworICAgICAgICAgICAgc3RhdHMtPmdyb3VwSUQgPSAoYWdlbnQtPm11bHRpaGRyICE9IE5VTEwgPyBhZ2VudC0+bXVsdGloZHItPmdyb3VwSUQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC0xKTsKKyAgICAgICAgICAgIHJlcG9ydGhkci0+YWdlbnRpbmRleCA9IC0xOworICAgICAgICAgICAgcmVwb3J0aGRyLT5yZXBvcnRlcmluZGV4ID0gLTE7CisKKyAgICAgICAgICAgIHJlcG9ydGhkci0+cmVwb3J0LnR5cGUgPSBTRVJWRVJfUkVMQVlfUkVQT1JUOworICAgICAgICAgICAgcmVwb3J0aGRyLT5yZXBvcnQubW9kZSA9IGFnZW50LT5tUmVwb3J0TW9kZTsKKyAgICAgICAgICAgIHN0YXRzLT5tRm9ybWF0ID0gYWdlbnQtPm1Gb3JtYXQ7CisgICAgICAgICAgICBzdGF0cy0+aml0dGVyID0gbnRvaGwoIHNlcnZlci0+aml0dGVyMSApOworICAgICAgICAgICAgc3RhdHMtPmppdHRlciArPSBudG9obCggc2VydmVyLT5qaXR0ZXIyICkgLyAoZG91YmxlKXJNaWxsaW9uOworICAgICAgICAgICAgc3RhdHMtPlRvdGFsTGVuID0gKCgobWF4X3NpemVfdCkgbnRvaGwoIHNlcnZlci0+dG90YWxfbGVuMSApKSA8PCAzMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hsKCBzZXJ2ZXItPnRvdGFsX2xlbjIgKTsgCisgICAgICAgICAgICBzdGF0cy0+c3RhcnRUaW1lID0gMDsKKyAgICAgICAgICAgIHN0YXRzLT5lbmRUaW1lID0gbnRvaGwoIHNlcnZlci0+c3RvcF9zZWMgKTsKKyAgICAgICAgICAgIHN0YXRzLT5lbmRUaW1lICs9IG50b2hsKCBzZXJ2ZXItPnN0b3BfdXNlYyApIC8gKGRvdWJsZSlyTWlsbGlvbjsKKyAgICAgICAgICAgIHN0YXRzLT5jbnRFcnJvciA9IG50b2hsKCBzZXJ2ZXItPmVycm9yX2NudCApOworICAgICAgICAgICAgc3RhdHMtPmNudE91dG9mT3JkZXIgPSBudG9obCggc2VydmVyLT5vdXRvcmRlcl9jbnQgKTsKKyAgICAgICAgICAgIHN0YXRzLT5jbnREYXRhZ3JhbXMgPSBudG9obCggc2VydmVyLT5kYXRhZ3JhbXMgKTsKKyAgICAgICAgICAgIHN0YXRzLT5tVURQID0gKGNoYXIpa01vZGVfU2VydmVyOworICAgICAgICAgICAgcmVwb3J0aGRyLT5yZXBvcnQuY29ubmVjdGlvbi5wZWVyID0gYWdlbnQtPmxvY2FsOworICAgICAgICAgICAgcmVwb3J0aGRyLT5yZXBvcnQuY29ubmVjdGlvbi5zaXplX3BlZXIgPSBhZ2VudC0+c2l6ZV9sb2NhbDsKKyAgICAgICAgICAgIHJlcG9ydGhkci0+cmVwb3J0LmNvbm5lY3Rpb24ubG9jYWwgPSBhZ2VudC0+cGVlcjsKKyAgICAgICAgICAgIHJlcG9ydGhkci0+cmVwb3J0LmNvbm5lY3Rpb24uc2l6ZV9sb2NhbCA9IGFnZW50LT5zaXplX3BlZXI7CisgICAgICAgICAgICAKKyNpZmRlZiBIQVZFX1RIUkVBRAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgUmVwb3J0Um9vdCB0byBpbmNsdWRlIHRoaXMgcmVwb3J0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb25kaXRpb25fTG9jayggUmVwb3J0Q29uZCApOworICAgICAgICAgICAgcmVwb3J0aGRyLT5uZXh0ID0gUmVwb3J0Um9vdDsKKyAgICAgICAgICAgIFJlcG9ydFJvb3QgPSByZXBvcnRoZHI7CisgICAgICAgICAgICBDb25kaXRpb25fU2lnbmFsKCAmUmVwb3J0Q29uZCApOworICAgICAgICAgICAgQ29uZGl0aW9uX1VubG9jayggUmVwb3J0Q29uZCApOworI2Vsc2UKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBQcm9jZXNzIHRoZSByZXBvcnQgaW4gdGhpcyB0aHJlYWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmVwb3J0aGRyLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIHByb2Nlc3NfcmVwb3J0ICggcmVwb3J0aGRyICk7CisjZW5kaWYgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGQUlMKDEsICJPdXQgb2YgTWVtb3J5ISFcbiIsIGFnZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgcmVwb3J0ZXIgdGhyZWFkCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBsb29wIHRoYXQgdGhlIHJlcG9ydGVyIHRocmVhZCBwcm9jZXNzZXMKKyAqLwordm9pZCByZXBvcnRlcl9zcGF3biggdGhyZWFkX1NldHRpbmdzICp0aHJlYWQgKSB7CisgICAgZG8geworICAgICAgICAvLyBUaGlzIHNlY3Rpb24gYWxsb3dzIGZvciBzYWZlIGV4aXRpbmcgd2l0aCBDdHJsLUMKKyAgICAgICAgQ29uZGl0aW9uX0xvY2sgKCBSZXBvcnRDb25kICk7CisgICAgICAgIGlmICggUmVwb3J0Um9vdCA9PSBOVUxMICkgeworICAgICAgICAgICAgLy8gQWxsb3cgbWFpbiB0aHJlYWQgdG8gZXhpdCBpZiBDdHJsLUMgaXMgcmVjZWl2ZWQKKyAgICAgICAgICAgIHRocmVhZF9zZXRpZ25vcmUoKTsKKyAgICAgICAgICAgIENvbmRpdGlvbl9XYWl0ICggJlJlcG9ydENvbmQgKTsKKyAgICAgICAgICAgIC8vIFN0b3AgbWFpbiB0aHJlYWQgZnJvbSBleGl0aW5nIHVudGlsIGRvbmUgd2l0aCBhbGwgcmVwb3J0cworICAgICAgICAgICAgdGhyZWFkX3Vuc2V0aWdub3JlKCk7CisgICAgICAgIH0KKyAgICAgICAgQ29uZGl0aW9uX1VubG9jayAoIFJlcG9ydENvbmQgKTsKKworYWdhaW46CisgICAgICAgIGlmICggUmVwb3J0Um9vdCAhPSBOVUxMICkgeworICAgICAgICAgICAgUmVwb3J0SGVhZGVyICp0ZW1wID0gUmVwb3J0Um9vdDsKKyAgICAgICAgICAgIC8vQ29uZGl0aW9uX1VubG9jayAoIFJlcG9ydENvbmQgKTsKKyAgICAgICAgICAgIGlmICggcmVwb3J0ZXJfcHJvY2Vzc19yZXBvcnQgKCB0ZW1wICkgKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGFsbG93cyBmb3IgbW9yZSByZXBvcnRzIHRvIGJlIGFkZGVkIHdoaWxlCisgICAgICAgICAgICAgICAgLy8gdGhlIHJlcG9ydGVyIGlzIHByb2Nlc3NpbmcgcmVwb3J0cyB3aXRob3V0IG5lZWRpbmcgdG8KKyAgICAgICAgICAgICAgICAvLyBzdG9wIHRoZSByZXBvcnRlciBvciBpbW1lZGlhdGVseSBub3RpZnkgaXQKKyAgICAgICAgICAgICAgICBDb25kaXRpb25fTG9jayAoIFJlcG9ydENvbmQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHRlbXAgPT0gUmVwb3J0Um9vdCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmV3IHJlcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgUmVwb3J0Um9vdCA9IHRlbXAtPm5leHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHJlcG9ydHMgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgUmVwb3J0SGVhZGVyICppdHIgPSBSZXBvcnRSb290OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGl0ci0+bmV4dCAhPSB0ZW1wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRyID0gaXRyLT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGl0ci0+bmV4dCA9IHRlbXAtPm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkIHdpdGggcmVwb3J0IHNvIGZyZWUgaXQKKyAgICAgICAgICAgICAgICBmcmVlKCB0ZW1wICk7CisgICAgICAgICAgICAgICAgQ29uZGl0aW9uX1VubG9jayAoIFJlcG9ydENvbmQgKTsKKyAgICAgICAgICAgICAgICBDb25kaXRpb25fU2lnbmFsKCAmUmVwb3J0RG9uZUNvbmQgKTsKKyAgICAgICAgICAgICAgICBpZiAoUmVwb3J0Um9vdCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbmRpdGlvbl9TaWduYWwoICZSZXBvcnREb25lQ29uZCApOworICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vQ29uZGl0aW9uX1VubG9jayAoIFJlcG9ydENvbmQgKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCAxICk7Cit9CisKKy8qCisgKiBVc2VkIGZvciBzaW5nbGUgdGhyZWFkZWQgcmVwb3J0aW5nCisgKi8KK3ZvaWQgcHJvY2Vzc19yZXBvcnQgKCBSZXBvcnRIZWFkZXIgKnJlcG9ydCApIHsKKyAgICBpZiAoIHJlcG9ydCAhPSBOVUxMICkgeworICAgICAgICBpZiAoIHJlcG9ydGVyX3Byb2Nlc3NfcmVwb3J0KCByZXBvcnQgKSApIHsKKyAgICAgICAgICAgIGZyZWUoIHJlcG9ydCApOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogUHJvY2VzcyByZXBvcnRzIHN0YXJ0aW5nIHdpdGggInJlcG9ydGhkciIKKyAqLworaW50IHJlcG9ydGVyX3Byb2Nlc3NfcmVwb3J0ICggUmVwb3J0SGVhZGVyICpyZXBvcnRoZHIgKSB7CisgICAgaW50IG5lZWRfZnJlZSA9IDA7CisKKyAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIHJlcG9ydHMKKyAgICBpZiAoIHJlcG9ydGhkci0+bmV4dCAhPSBOVUxMICkgeworICAgICAgICBpZiAoIHJlcG9ydGVyX3Byb2Nlc3NfcmVwb3J0KCByZXBvcnRoZHItPm5leHQgKSApIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBkb25lIHdpdGggdGhpcyByZXBvcnQgdGhlbiBmcmVlIGl0CisgICAgICAgICAgICBSZXBvcnRIZWFkZXIgKnRlbXAgPSByZXBvcnRoZHItPm5leHQ7CisgICAgICAgICAgICByZXBvcnRoZHItPm5leHQgPSByZXBvcnRoZHItPm5leHQtPm5leHQ7CisgICAgICAgICAgICBmcmVlKCB0ZW1wICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIChyZXBvcnRoZHItPnJlcG9ydC50eXBlICYgU0VUVElOR1NfUkVQT1JUKSAhPSAwICkgeworICAgICAgICByZXBvcnRoZHItPnJlcG9ydC50eXBlICY9IH5TRVRUSU5HU19SRVBPUlQ7CisgICAgICAgIHJldHVybiByZXBvcnRlcl9wcmludCggJnJlcG9ydGhkci0+cmVwb3J0LCBTRVRUSU5HU19SRVBPUlQsIDEgKTsKKyAgICB9IGVsc2UgaWYgKCAocmVwb3J0aGRyLT5yZXBvcnQudHlwZSAmIENPTk5FQ1RJT05fUkVQT1JUKSAhPSAwICkgeworICAgICAgICByZXBvcnRoZHItPnJlcG9ydC50eXBlICY9IH5DT05ORUNUSU9OX1JFUE9SVDsKKyAgICAgICAgcmVwb3J0ZXJfcHJpbnQoICZyZXBvcnRoZHItPnJlcG9ydCwgQ09OTkVDVElPTl9SRVBPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcG9ydGhkci0+cmVwb3J0LnR5cGUgPT0gMCA/IDEgOiAwKSApOworICAgICAgICBpZiAoIHJlcG9ydGhkci0+bXVsdGlyZXBvcnQgIT0gTlVMTCAmJiBpc011bHRpcGxlUmVwb3J0KCAoJnJlcG9ydGhkci0+cmVwb3J0KSApKSB7CisgICAgICAgICAgICBpZiAoIChyZXBvcnRoZHItPm11bHRpcmVwb3J0LT5yZXBvcnQtPnR5cGUgJiBDT05ORUNUSU9OX1JFUE9SVCkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICByZXBvcnRoZHItPm11bHRpcmVwb3J0LT5yZXBvcnQtPnR5cGUgJj0gfkNPTk5FQ1RJT05fUkVQT1JUOworICAgICAgICAgICAgICAgIHJlcG9ydGVyX3ByaW50KCByZXBvcnRoZHItPm11bHRpcmVwb3J0LT5yZXBvcnQsIENPTk5FQ1RJT05fUkVQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwb3J0aGRyLT5yZXBvcnQudHlwZSA9PSAwID8gMSA6IDApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCAocmVwb3J0aGRyLT5yZXBvcnQudHlwZSAmIFNFUlZFUl9SRUxBWV9SRVBPUlQpICE9IDAgKSB7CisgICAgICAgIHJlcG9ydGhkci0+cmVwb3J0LnR5cGUgJj0gflNFUlZFUl9SRUxBWV9SRVBPUlQ7CisgICAgICAgIHJldHVybiByZXBvcnRlcl9wcmludCggJnJlcG9ydGhkci0+cmVwb3J0LCBTRVJWRVJfUkVMQVlfUkVQT1JULCAxICk7CisgICAgfQorICAgIGlmICggKHJlcG9ydGhkci0+cmVwb3J0LnR5cGUgJiBUUkFOU0ZFUl9SRVBPUlQpICE9IDAgKSB7CisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIHBhY2tldHMgdG8gcHJvY2VzcyB0aGVuIGhhbmRsZSB0aGVtCisgICAgICAgIGlmICggcmVwb3J0aGRyLT5yZXBvcnRlcmluZGV4ID49IDAgKSB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3QgcGFzcyB0aGUgImFnZW50IgorICAgICAgICAgICAgd2hpbGUgKCByZXBvcnRoZHItPnJlcG9ydGVyaW5kZXggIT0gcmVwb3J0aGRyLT5hZ2VudGluZGV4IC0gMSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJlcG9ydGhkci0+cmVwb3J0ZXJpbmRleCA9PSBOVU1fUkVQT1JUX1NUUlVDVFMgLSAxICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHJlcG9ydGhkci0+YWdlbnRpbmRleCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRoZHItPnJlcG9ydGVyaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0aGRyLT5yZXBvcnRlcmluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggcmVwb3J0ZXJfaGFuZGxlX3BhY2tldCggcmVwb3J0aGRyICkgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1vcmUgcGFja2V0cyB0byBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydGhkci0+cmVwb3J0ZXJpbmRleCA9IC0xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlIGFnZW50IGlzIGRvbmUgd2l0aCB0aGUgcmVwb3J0IHRoZW4gZnJlZSBpdAorICAgICAgICBpZiAoIHJlcG9ydGhkci0+YWdlbnRpbmRleCA9PSAtMSApIHsKKyAgICAgICAgICAgIG5lZWRfZnJlZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5lZWRfZnJlZTsKK30KKworLyoKKyAqIFVwZGF0ZXMgY29ubmVjdGlvbiBzdGF0cworICovCitpbnQgcmVwb3J0ZXJfaGFuZGxlX3BhY2tldCggUmVwb3J0SGVhZGVyICpyZXBvcnRoZHIgKSB7CisgICAgUmVwb3J0U3RydWN0ICpwYWNrZXQgPSAmcmVwb3J0aGRyLT5kYXRhW3JlcG9ydGhkci0+cmVwb3J0ZXJpbmRleF07CisgICAgUmVwb3J0ZXJEYXRhICpkYXRhID0gJnJlcG9ydGhkci0+cmVwb3J0OworICAgIFRyYW5zZmVyX0luZm8gKnN0YXRzID0gJnJlcG9ydGhkci0+cmVwb3J0LmluZm87CisgICAgaW50IGZpbmlzaGVkID0gMDsKKworICAgIGRhdGEtPmNudERhdGFncmFtcysrOworICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgcGFja2V0IHNldCB0aGUgZW5kVGltZQorICAgIGlmICggcGFja2V0LT5wYWNrZXRJRCA8IDAgKSB7CisgICAgICAgIGRhdGEtPnBhY2tldFRpbWUgPSBwYWNrZXQtPnBhY2tldFRpbWU7CisgICAgICAgIGZpbmlzaGVkID0gMTsKKyAgICAgICAgaWYgKCByZXBvcnRoZHItPnJlcG9ydC5tVGhyZWFkTW9kZSAhPSBrTW9kZV9DbGllbnQgKSB7CisgICAgICAgICAgICBkYXRhLT5Ub3RhbExlbiArPSBwYWNrZXQtPnBhY2tldExlbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHVwZGF0ZSByZWNpZXZlZCBhbW91bnQgYW5kIHRpbWUKKyAgICAgICAgZGF0YS0+cGFja2V0VGltZSA9IHBhY2tldC0+cGFja2V0VGltZTsKKyAgICAgICAgcmVwb3J0ZXJfY29uZHByaW50c3RhdHMoICZyZXBvcnRoZHItPnJlcG9ydCwgcmVwb3J0aGRyLT5tdWx0aXJlcG9ydCwgZmluaXNoZWQgKTsKKyAgICAgICAgZGF0YS0+VG90YWxMZW4gKz0gcGFja2V0LT5wYWNrZXRMZW47CisgICAgICAgIGlmICggcGFja2V0LT5wYWNrZXRJRCAhPSAwICkgeworICAgICAgICAgICAgLy8gVURQIHBhY2tldAorICAgICAgICAgICAgZG91YmxlIHRyYW5zaXQ7CisgICAgICAgICAgICBkb3VibGUgZGVsdGFUcmFuc2l0OworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBmcm9tIFJGQyAxODg5LCBSZWFsIFRpbWUgUHJvdG9jb2wgKFJUUCkgCisgICAgICAgICAgICAvLyBKID0gSiArICggfCBEKGktMSxpKSB8IC0gSiApIC8gMTYgCisgICAgICAgICAgICB0cmFuc2l0ID0gVGltZURpZmZlcmVuY2UoIHBhY2tldC0+cGFja2V0VGltZSwgcGFja2V0LT5zZW50VGltZSApOworICAgICAgICAgICAgaWYgKCBkYXRhLT5sYXN0VHJhbnNpdCAhPSAwLjAgKSB7CisgICAgICAgICAgICAgICAgZGVsdGFUcmFuc2l0ID0gdHJhbnNpdCAtIGRhdGEtPmxhc3RUcmFuc2l0OworICAgICAgICAgICAgICAgIGlmICggZGVsdGFUcmFuc2l0IDwgMC4wICkgeworICAgICAgICAgICAgICAgICAgICBkZWx0YVRyYW5zaXQgPSAtZGVsdGFUcmFuc2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0cy0+aml0dGVyICs9IChkZWx0YVRyYW5zaXQgLSBzdGF0cy0+aml0dGVyKSAvICgxNi4wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEtPmxhc3RUcmFuc2l0ID0gdHJhbnNpdDsKKyAgICAKKyAgICAgICAgICAgIC8vIHBhY2tldCBsb3NzIG9jY3VyZWQgaWYgdGhlIGRhdGFncmFtIG51bWJlcnMgYXJlbid0IHNlcXVlbnRpYWwgCisgICAgICAgICAgICBpZiAoIHBhY2tldC0+cGFja2V0SUQgIT0gZGF0YS0+UGFja2V0SUQgKyAxICkgeworICAgICAgICAgICAgICAgIGlmICggcGFja2V0LT5wYWNrZXRJRCA8IGRhdGEtPlBhY2tldElEICsgMSApIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y250T3V0b2ZPcmRlcisrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEtPmNudEVycm9yICs9IHBhY2tldC0+cGFja2V0SUQgLSBkYXRhLT5QYWNrZXRJRCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbmV2ZXIgZGVjcmVhc2UgZGF0YWdyYW1JRCAoZS5nLiBpZiB3ZSBnZXQgYW4gb3V0LW9mLW9yZGVyIHBhY2tldCkgCisgICAgICAgICAgICBpZiAoIHBhY2tldC0+cGFja2V0SUQgPiBkYXRhLT5QYWNrZXRJRCApIHsKKyAgICAgICAgICAgICAgICBkYXRhLT5QYWNrZXRJRCA9IHBhY2tldC0+cGFja2V0SUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcmludCBhIHJlcG9ydCBpZiBhcHByb3ByaWF0ZQorICAgIHJldHVybiByZXBvcnRlcl9jb25kcHJpbnRzdGF0cyggJnJlcG9ydGhkci0+cmVwb3J0LCByZXBvcnRoZHItPm11bHRpcmVwb3J0LCBmaW5pc2hlZCApOworfQorCisvKgorICogSGFuZGxlcyBzdW1taW5nIG9mIHRocmVhZHMKKyAqLwordm9pZCByZXBvcnRlcl9oYW5kbGVfbXVsdGlwbGVfcmVwb3J0cyggTXVsdGlIZWFkZXIgKnJlcG9ydGhkciwgVHJhbnNmZXJfSW5mbyAqc3RhdHMsIGludCBmb3JjZSApIHsKKyAgICBpZiAoIHJlcG9ydGhkciAhPSBOVUxMICkgeworICAgICAgICBpZiAoIHJlcG9ydGhkci0+dGhyZWFkcyA+IDEgKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIFRyYW5zZmVyX0luZm8gKmN1cnJlbnQgPSBOVUxMOworICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBzdGFydCBUaW1lCisgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IE5VTV9NVUxUSV9TTE9UUzsgaSsrICkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAmcmVwb3J0aGRyLT5kYXRhW2ldOworICAgICAgICAgICAgICAgIGlmICggY3VycmVudC0+c3RhcnRUaW1lID09IHN0YXRzLT5zdGFydFRpbWUgKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggY3VycmVudC0+c3RhcnRUaW1lICE9IHN0YXRzLT5zdGFydFRpbWUgKSB7CisgICAgICAgICAgICAgICAgLy8gRmluZCBmaXJzdCBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IE5VTV9NVUxUSV9TTE9UUzsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gJnJlcG9ydGhkci0+ZGF0YVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjdXJyZW50LT5zdGFydFRpbWUgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudC0+Y250RGF0YWdyYW1zID0gc3RhdHMtPmNudERhdGFncmFtczsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5jbnRFcnJvciA9IHN0YXRzLT5jbnRFcnJvcjsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5jbnRPdXRvZk9yZGVyID0gc3RhdHMtPmNudE91dG9mT3JkZXI7CisgICAgICAgICAgICAgICAgY3VycmVudC0+VG90YWxMZW4gPSBzdGF0cy0+VG90YWxMZW47CisgICAgICAgICAgICAgICAgY3VycmVudC0+bUZvcm1hdCA9IHN0YXRzLT5tRm9ybWF0OworICAgICAgICAgICAgICAgIGN1cnJlbnQtPmVuZFRpbWUgPSBzdGF0cy0+ZW5kVGltZTsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5qaXR0ZXIgPSBzdGF0cy0+aml0dGVyOworICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXJ0VGltZSA9IHN0YXRzLT5zdGFydFRpbWU7CisgICAgICAgICAgICAgICAgY3VycmVudC0+ZnJlZSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnQtPmNudERhdGFncmFtcyArPSBzdGF0cy0+Y250RGF0YWdyYW1zOworICAgICAgICAgICAgICAgIGN1cnJlbnQtPmNudEVycm9yICs9IHN0YXRzLT5jbnRFcnJvcjsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5jbnRPdXRvZk9yZGVyICs9IHN0YXRzLT5jbnRPdXRvZk9yZGVyOworICAgICAgICAgICAgICAgIGN1cnJlbnQtPlRvdGFsTGVuICs9IHN0YXRzLT5Ub3RhbExlbjsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5tRm9ybWF0ID0gc3RhdHMtPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKCBjdXJyZW50LT5lbmRUaW1lIDwgc3RhdHMtPmVuZFRpbWUgKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPmVuZFRpbWUgPSBzdGF0cy0+ZW5kVGltZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBjdXJyZW50LT5qaXR0ZXIgPCBzdGF0cy0+aml0dGVyICkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5qaXR0ZXIgPSBzdGF0cy0+aml0dGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50LT5mcmVlKys7CisgICAgICAgICAgICAgICAgaWYgKCBjdXJyZW50LT5mcmVlID09IHJlcG9ydGhkci0+dGhyZWFkcyApIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzZXJ2ZWQgPSByZXBvcnRoZHItPnJlcG9ydC0+aW5mby5yZXNlcnZlZF9kZWxheTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+ZnJlZSA9IGZvcmNlOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICZyZXBvcnRoZHItPnJlcG9ydC0+aW5mbywgY3VycmVudCwgc2l6ZW9mKFRyYW5zZmVyX0luZm8pICk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXJ0VGltZSA9IC0xOworICAgICAgICAgICAgICAgICAgICByZXBvcnRoZHItPnJlcG9ydC0+aW5mby5yZXNlcnZlZF9kZWxheSA9IHJlc2VydmVkOworICAgICAgICAgICAgICAgICAgICByZXBvcnRlcl9wcmludCggcmVwb3J0aGRyLT5yZXBvcnQsIE1VTFRJUExFX1JFUE9SVCwgZm9yY2UgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBQcmludHMgcmVwb3J0cyBjb25kaXRpb25hbGx5CisgKi8KK2ludCByZXBvcnRlcl9jb25kcHJpbnRzdGF0cyggUmVwb3J0ZXJEYXRhICpzdGF0cywgTXVsdGlIZWFkZXIgKm11bHRpcmVwb3J0LCBpbnQgZm9yY2UgKSB7CisgICAgaWYgKCBmb3JjZSAhPSAwICkgeworICAgICAgICBzdGF0cy0+aW5mby5jbnRPdXRvZk9yZGVyID0gc3RhdHMtPmNudE91dG9mT3JkZXI7CisgICAgICAgIC8vIGFzc3VtZSBtb3N0IG9mIHRoZSB0aW1lIG91dC1vZi1vcmRlciBwYWNrZXRzIGFyZSBub3QKKyAgICAgICAgLy8gZHVwbGljYXRlIHBhY2tldHMsIHNvIGNvbmRpdGlvbmFsbHkgc3VidHJhY3QgdGhlbSBmcm9tIHRoZSBsb3N0IHBhY2tldHMuCisgICAgICAgIHN0YXRzLT5pbmZvLmNudEVycm9yID0gc3RhdHMtPmNudEVycm9yOworICAgICAgICBpZiAoIHN0YXRzLT5pbmZvLmNudEVycm9yID4gc3RhdHMtPmluZm8uY250T3V0b2ZPcmRlciApIHsKKyAgICAgICAgICAgIHN0YXRzLT5pbmZvLmNudEVycm9yIC09IHN0YXRzLT5pbmZvLmNudE91dG9mT3JkZXI7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHMtPmluZm8uY250RGF0YWdyYW1zID0gKGlzVURQKHN0YXRzKSA/IHN0YXRzLT5QYWNrZXRJRCA6IHN0YXRzLT5jbnREYXRhZ3JhbXMpOworICAgICAgICBzdGF0cy0+aW5mby5Ub3RhbExlbiA9IHN0YXRzLT5Ub3RhbExlbjsKKyAgICAgICAgc3RhdHMtPmluZm8uc3RhcnRUaW1lID0gMDsKKyAgICAgICAgc3RhdHMtPmluZm8uZW5kVGltZSA9IFRpbWVEaWZmZXJlbmNlKCBzdGF0cy0+cGFja2V0VGltZSwgc3RhdHMtPnN0YXJ0VGltZSApOworICAgICAgICBzdGF0cy0+aW5mby5mcmVlID0gMTsKKyAgICAgICAgcmVwb3J0ZXJfcHJpbnQoIHN0YXRzLCBUUkFOU0ZFUl9SRVBPUlQsIGZvcmNlICk7CisgICAgICAgIGlmICggaXNNdWx0aXBsZVJlcG9ydChzdGF0cykgKSB7CisgICAgICAgICAgICByZXBvcnRlcl9oYW5kbGVfbXVsdGlwbGVfcmVwb3J0cyggbXVsdGlyZXBvcnQsICZzdGF0cy0+aW5mbywgZm9yY2UgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB3aGlsZSAoKHN0YXRzLT5pbnRlcnZhbFRpbWUudHZfc2VjICE9IDAgfHwgCisgICAgICAgICAgICAgICAgICAgc3RhdHMtPmludGVydmFsVGltZS50dl91c2VjICE9IDApICYmIAorICAgICAgICAgICAgICAgICAgVGltZURpZmZlcmVuY2UoIHN0YXRzLT5uZXh0VGltZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPnBhY2tldFRpbWUgKSA8IDAgKSB7CisgICAgICAgIHN0YXRzLT5pbmZvLmNudE91dG9mT3JkZXIgPSBzdGF0cy0+Y250T3V0b2ZPcmRlciAtIHN0YXRzLT5sYXN0T3V0b2ZPcmRlcjsKKyAgICAgICAgc3RhdHMtPmxhc3RPdXRvZk9yZGVyID0gc3RhdHMtPmNudE91dG9mT3JkZXI7CisgICAgICAgIC8vIGFzc3VtZSBtb3N0IG9mIHRoZSB0aW1lIG91dC1vZi1vcmRlciBwYWNrZXRzIGFyZSBub3QKKyAgICAgICAgLy8gZHVwbGljYXRlIHBhY2tldHMsIHNvIGNvbmRpdGlvbmFsbHkgc3VidHJhY3QgdGhlbSBmcm9tIHRoZSBsb3N0IHBhY2tldHMuCisgICAgICAgIHN0YXRzLT5pbmZvLmNudEVycm9yID0gc3RhdHMtPmNudEVycm9yIC0gc3RhdHMtPmxhc3RFcnJvcjsKKyAgICAgICAgaWYgKCBzdGF0cy0+aW5mby5jbnRFcnJvciA+IHN0YXRzLT5pbmZvLmNudE91dG9mT3JkZXIgKSB7CisgICAgICAgICAgICBzdGF0cy0+aW5mby5jbnRFcnJvciAtPSBzdGF0cy0+aW5mby5jbnRPdXRvZk9yZGVyOworICAgICAgICB9CisgICAgICAgIHN0YXRzLT5sYXN0RXJyb3IgPSBzdGF0cy0+Y250RXJyb3I7CisgICAgICAgIHN0YXRzLT5pbmZvLmNudERhdGFncmFtcyA9IChpc1VEUCggc3RhdHMgKSA/IHN0YXRzLT5QYWNrZXRJRCAtIHN0YXRzLT5sYXN0RGF0YWdyYW1zIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPmNudERhdGFncmFtcyAtIHN0YXRzLT5sYXN0RGF0YWdyYW1zKTsKKyAgICAgICAgc3RhdHMtPmxhc3REYXRhZ3JhbXMgPSAoaXNVRFAoIHN0YXRzICkgPyBzdGF0cy0+UGFja2V0SUQgOiBzdGF0cy0+Y250RGF0YWdyYW1zKTsKKyAgICAgICAgc3RhdHMtPmluZm8uVG90YWxMZW4gPSBzdGF0cy0+VG90YWxMZW4gLSBzdGF0cy0+bGFzdFRvdGFsOworICAgICAgICBzdGF0cy0+bGFzdFRvdGFsID0gc3RhdHMtPlRvdGFsTGVuOworICAgICAgICBzdGF0cy0+aW5mby5zdGFydFRpbWUgPSBzdGF0cy0+aW5mby5lbmRUaW1lOworICAgICAgICBzdGF0cy0+aW5mby5lbmRUaW1lID0gVGltZURpZmZlcmVuY2UoIHN0YXRzLT5uZXh0VGltZSwgc3RhdHMtPnN0YXJ0VGltZSApOworICAgICAgICBUaW1lQWRkKCBzdGF0cy0+bmV4dFRpbWUsIHN0YXRzLT5pbnRlcnZhbFRpbWUgKTsKKyAgICAgICAgc3RhdHMtPmluZm8uZnJlZSA9IDA7CisgICAgICAgIHJlcG9ydGVyX3ByaW50KCBzdGF0cywgVFJBTlNGRVJfUkVQT1JULCBmb3JjZSApOworICAgICAgICBpZiAoIGlzTXVsdGlwbGVSZXBvcnQoc3RhdHMpICkgeworICAgICAgICAgICAgcmVwb3J0ZXJfaGFuZGxlX211bHRpcGxlX3JlcG9ydHMoIG11bHRpcmVwb3J0LCAmc3RhdHMtPmluZm8sIGZvcmNlICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZvcmNlOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIG11bHRpcGxlIGZvcm1hdCBwcmludGluZyBieSBzZW5kaW5nIHRvIHRoZQorICogYXBwcm9wcmlhdGUgZGlzcGF0Y2ggZnVuY3Rpb24KKyAqLworaW50IHJlcG9ydGVyX3ByaW50KCBSZXBvcnRlckRhdGEgKnN0YXRzLCBpbnQgdHlwZSwgaW50IGVuZCApIHsKKyAgICBzd2l0Y2ggKCB0eXBlICkgeworICAgICAgICBjYXNlIFRSQU5TRkVSX1JFUE9SVDoKKyAgICAgICAgICAgIHN0YXRpc3RpY3NfcmVwb3J0c1tzdGF0cy0+bW9kZV0oICZzdGF0cy0+aW5mbyApOworICAgICAgICAgICAgaWYgKCBlbmQgIT0gMCAmJiBpc1ByaW50TVNTKCBzdGF0cyApICYmICFpc1VEUCggc3RhdHMgKSApIHsKKyAgICAgICAgICAgICAgICBQcmludE1TUyggc3RhdHMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFUlZFUl9SRUxBWV9SRVBPUlQ6CisgICAgICAgICAgICBzZXJ2ZXJzdGF0aXN0aWNzX3JlcG9ydHNbc3RhdHMtPm1vZGVdKCAmc3RhdHMtPmNvbm5lY3Rpb24sICZzdGF0cy0+aW5mbyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VUVElOR1NfUkVQT1JUOgorICAgICAgICAgICAgc2V0dGluZ3NfcmVwb3J0c1tzdGF0cy0+bW9kZV0oIHN0YXRzICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDT05ORUNUSU9OX1JFUE9SVDoKKyAgICAgICAgICAgIHN0YXRzLT5pbmZvLnJlc2VydmVkX2RlbGF5ID0gY29ubmVjdGlvbl9yZXBvcnRzW3N0YXRzLT5tb2RlXSggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0cy0+Y29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPmluZm8udHJhbnNmZXJJRCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVVMVElQTEVfUkVQT1JUOgorICAgICAgICAgICAgbXVsdGlwbGVfcmVwb3J0c1tzdGF0cy0+bW9kZV0oICZzdGF0cy0+aW5mbyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJQcmludGluZyB0eXBlIG5vdCBpbXBsZW1lbnRlZCEgTm8gT3V0cHV0XG4iICk7CisgICAgfQorICAgIGZmbHVzaCggc3Rkb3V0ICk7CisgICAgcmV0dXJuIGVuZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVwb3J0IHRoZSBNU1MgYW5kIE1UVSwgZ2l2ZW4gdGhlIE1TUyAob3IgYSBndWVzcyB0aGVyZW9mKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBjb21wYXJlIHRoZSBNU1MgYWdhaW5zdCB0aGUgKE1UVSAtIDQwKSB0byAoTVRVIC0gODApIGJ5dGVzLgorLy8gNDAgYnl0ZSBJUCBoZWFkZXIgYW5kIHNvbWV3aGF0IGFyYml0cmFyaWx5LCA0MCBtb3JlIGJ5dGVzIG9mIElQIG9wdGlvbnMuCisKKyNkZWZpbmUgY2hlY2tNU1NfTVRVKCBpbk1TUywgaW5NVFUgKSAoaW5NVFUtNDApID49IGluTVNTICAmJiAgaW5NU1MgPj0gKGluTVRVLTgwKQorCit2b2lkIFByaW50TVNTKCBSZXBvcnRlckRhdGEgKnN0YXRzICkgeworICAgIGludCBpbk1TUyA9IGdldHNvY2tfdGNwX21zcyggc3RhdHMtPmluZm8udHJhbnNmZXJJRCApOworCisgICAgaWYgKCBpbk1TUyA8PSAwICkgeworICAgICAgICBwcmludGYoIHJlcG9ydF9tc3NfdW5zdXBwb3J0ZWQsIHN0YXRzLT5pbmZvLnRyYW5zZmVySUQgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyKiBuZXQ7CisgICAgICAgIGludCBtdHUgPSAwOworCisgICAgICAgIGlmICggY2hlY2tNU1NfTVRVKCBpbk1TUywgMTUwMCApICkgeworICAgICAgICAgICAgbmV0ID0gImV0aGVybmV0IjsKKyAgICAgICAgICAgIG10dSA9IDE1MDA7CisgICAgICAgIH0gZWxzZSBpZiAoIGNoZWNrTVNTX01UVSggaW5NU1MsIDQzNTIgKSApIHsKKyAgICAgICAgICAgIG5ldCA9ICJGRERJIjsKKyAgICAgICAgICAgIG10dSA9IDQzNTI7CisgICAgICAgIH0gZWxzZSBpZiAoIGNoZWNrTVNTX01UVSggaW5NU1MsIDkxODAgKSApIHsKKyAgICAgICAgICAgIG5ldCA9ICJBVE0iOworICAgICAgICAgICAgbXR1ID0gOTE4MDsKKyAgICAgICAgfSBlbHNlIGlmICggY2hlY2tNU1NfTVRVKCBpbk1TUywgNjUyODAgKSApIHsKKyAgICAgICAgICAgIG5ldCA9ICJISVBQSSI7CisgICAgICAgICAgICBtdHUgPSA2NTI4MDsKKyAgICAgICAgfSBlbHNlIGlmICggY2hlY2tNU1NfTVRVKCBpbk1TUywgNTc2ICkgKSB7CisgICAgICAgICAgICBuZXQgPSAibWluaW11bSI7CisgICAgICAgICAgICBtdHUgPSA1NzY7CisgICAgICAgICAgICBwcmludGYoIHdhcm5fbm9fcGF0aG10dSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXR1ID0gaW5NU1MgKyA0MDsKKyAgICAgICAgICAgIG5ldCA9ICJ1bmtub3duIGludGVyZmFjZSI7CisgICAgICAgIH0KKworICAgICAgICBwcmludGYoIHJlcG9ydF9tc3MsCisgICAgICAgICAgICAgICAgc3RhdHMtPmluZm8udHJhbnNmZXJJRCwgaW5NU1MsIG10dSwgbmV0ICk7CisgICAgfQorfQorLy8gZW5kIFJlcG9ydE1TUworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvc3JjL1NlcnZlci5jcHAgYi9pcGVyZi0yLjAuNS9zcmMvU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWM3ZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvc3JjL1NlcnZlci5jcHAKQEAgLTAsMCArMSwyNDggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBTZXJ2ZXIuY3BwCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogICAgIEFqYXkgVGlydW1hbGEgKHRpcnVtYWxhQG5jc2EudWl1Yy5lZHU+LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQSBzZXJ2ZXIgdGhyZWFkIGlzIGluaXRpYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uIGFjY2VwdCgpIHJldHVybnMuCisgKiBIYW5kbGVzIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBkYXRhLCBhbmQgdGhlbiBjbG9zZXMgc29ja2V0LgorICogQ2hhbmdlcyB0byB0aGlzIHZlcnNpb24gOiBUaGUgc2VydmVyIGNhbiBiZSBydW4gYXMgYSBkYWVtb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBIRUFERVJTKCkKKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJTZXJ2ZXIuaHBwIgorI2luY2x1ZGUgIkxpc3QuaCIKKyNpbmNsdWRlICJFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJSZXBvcnRlci5oIgorI2luY2x1ZGUgIkxvY2FsZS5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdG9yZXMgY29ubmVjdGVkIHNvY2tldCBhbmQgc29ja2V0IGluZm8uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1NlcnZlcjo6U2VydmVyKCB0aHJlYWRfU2V0dGluZ3MgKmluU2V0dGluZ3MgKSB7CisgICAgbVNldHRpbmdzID0gaW5TZXR0aW5nczsKKyAgICBtQnVmID0gTlVMTDsKKworICAgIC8vIGluaXRpYWxpemUgYnVmZmVyCisgICAgbUJ1ZiA9IG5ldyBjaGFyWyBtU2V0dGluZ3MtPm1CdWZMZW4gXTsKKyAgICBGQUlMX2Vycm5vKCBtQnVmID09IE5VTEwsICJObyBtZW1vcnkgZm9yIGJ1ZmZlclxuIiwgbVNldHRpbmdzICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc3RydWN0b3IgY2xvc2Ugc29ja2V0LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitTZXJ2ZXI6On5TZXJ2ZXIoKSB7CisgICAgaWYgKCBtU2V0dGluZ3MtPm1Tb2NrICE9IElOVkFMSURfU09DS0VUICkgeworICAgICAgICBpbnQgcmMgPSBjbG9zZSggbVNldHRpbmdzLT5tU29jayApOworICAgICAgICBXQVJOX2Vycm5vKCByYyA9PSBTT0NLRVRfRVJST1IsICJjbG9zZSIgKTsKKyAgICAgICAgbVNldHRpbmdzLT5tU29jayA9IElOVkFMSURfU09DS0VUOworICAgIH0KKyAgICBERUxFVEVfQVJSQVkoIG1CdWYgKTsKK30KKwordm9pZCBTZXJ2ZXI6OlNpZ19JbnQoIGludCBpblNpZ25vICkgeworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUmVjZWl2ZSBkYXRhIGZyb20gdGhlIChjb25uZWN0ZWQpIHNvY2tldC4KKyAqIFNlbmRzIHRlcm1pbmF0aW9uIGZsYWcgc2V2ZXJhbCB0aW1lcyBhdCB0aGUgZW5kLiAKKyAqIERvZXMgbm90IGNsb3NlIHRoZSBzb2NrZXQuIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAKK3ZvaWQgU2VydmVyOjpSdW4oIHZvaWQgKSB7CisgICAgbG9uZyBjdXJyTGVuOyAKKyAgICBtYXhfc2l6ZV90IHRvdExlbiA9IDA7CisgICAgc3RydWN0IFVEUF9kYXRhZ3JhbSogbUJ1Zl9VRFAgID0gKHN0cnVjdCBVRFBfZGF0YWdyYW0qKSBtQnVmOyAKKworICAgIFJlcG9ydFN0cnVjdCAqcmVwb3J0c3RydWN0ID0gTlVMTDsKKworICAgIHJlcG9ydHN0cnVjdCA9IG5ldyBSZXBvcnRTdHJ1Y3Q7CisgICAgaWYgKCByZXBvcnRzdHJ1Y3QgIT0gTlVMTCApIHsKKyAgICAgICAgcmVwb3J0c3RydWN0LT5wYWNrZXRJRCA9IDA7CisgICAgICAgIG1TZXR0aW5ncy0+cmVwb3J0aGRyID0gSW5pdFJlcG9ydCggbVNldHRpbmdzICk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIHBlcmZvcm0gcmVhZCAKKyAgICAgICAgICAgIGN1cnJMZW4gPSByZWN2KCBtU2V0dGluZ3MtPm1Tb2NrLCBtQnVmLCBtU2V0dGluZ3MtPm1CdWZMZW4sIDAgKTsgCisgICAgICAgIAorICAgICAgICAgICAgaWYgKCBpc1VEUCggbVNldHRpbmdzICkgKSB7CisgICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgZGF0YWdyYW0gSUQgYW5kIHNlbnRUaW1lIG91dCBvZiB0aGUgYnVmZmVyIAorICAgICAgICAgICAgICAgIHJlcG9ydHN0cnVjdC0+cGFja2V0SUQgPSBudG9obCggbUJ1Zl9VRFAtPmlkICk7IAorICAgICAgICAgICAgICAgIHJlcG9ydHN0cnVjdC0+c2VudFRpbWUudHZfc2VjID0gbnRvaGwoIG1CdWZfVURQLT50dl9zZWMgICk7CisgICAgICAgICAgICAgICAgcmVwb3J0c3RydWN0LT5zZW50VGltZS50dl91c2VjID0gbnRvaGwoIG1CdWZfVURQLT50dl91c2VjICk7IAorCQlyZXBvcnRzdHJ1Y3QtPnBhY2tldExlbiA9IGN1cnJMZW47CisJCWdldHRpbWVvZmRheSggJihyZXBvcnRzdHJ1Y3QtPnBhY2tldFRpbWUpLCBOVUxMICk7CisgICAgICAgICAgICB9IGVsc2UgeworCQl0b3RMZW4gKz0gY3VyckxlbjsKKwkgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIC8vIHRlcm1pbmF0ZSB3aGVuIGRhdGFncmFtIGJlZ2lucyB3aXRoIG5lZ2F0aXZlIGluZGV4IAorICAgICAgICAgICAgLy8gdGhlIGRhdGFncmFtIElEIHNob3VsZCBiZSBjb3JyZWN0LCBqdXN0IG5lZ2F0ZWQgCisgICAgICAgICAgICBpZiAoIHJlcG9ydHN0cnVjdC0+cGFja2V0SUQgPCAwICkgeworICAgICAgICAgICAgICAgIHJlcG9ydHN0cnVjdC0+cGFja2V0SUQgPSAtcmVwb3J0c3RydWN0LT5wYWNrZXRJRDsKKyAgICAgICAgICAgICAgICBjdXJyTGVuID0gLTE7IAorICAgICAgICAgICAgfQorCisJICAgIGlmICggaXNVRFAgKG1TZXR0aW5ncykpIHsKKwkJUmVwb3J0UGFja2V0KCBtU2V0dGluZ3MtPnJlcG9ydGhkciwgcmVwb3J0c3RydWN0ICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCAhaXNVRFAgKG1TZXR0aW5ncykgJiYgbVNldHRpbmdzLT5tSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVwb3J0c3RydWN0LT5wYWNrZXRMZW4gPSBjdXJyTGVuOworICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheSggJihyZXBvcnRzdHJ1Y3QtPnBhY2tldFRpbWUpLCBOVUxMICk7CisgICAgICAgICAgICAgICAgUmVwb3J0UGFja2V0KCBtU2V0dGluZ3MtPnJlcG9ydGhkciwgcmVwb3J0c3RydWN0ICk7CisgICAgICAgICAgICB9CisKKworCisgICAgICAgIH0gd2hpbGUgKCBjdXJyTGVuID4gMCApOyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBzdG9wIHRpbWluZyAKKyAgICAgICAgZ2V0dGltZW9mZGF5KCAmKHJlcG9ydHN0cnVjdC0+cGFja2V0VGltZSksIE5VTEwgKTsKKyAgICAgICAgCisJaWYgKCAhaXNVRFAgKG1TZXR0aW5ncykpIHsKKwkJaWYoMC4wID09IG1TZXR0aW5ncy0+bUludGVydmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRzdHJ1Y3QtPnBhY2tldExlbiA9IHRvdExlbjsKKyAgICAgICAgICAgICAgICB9CisJCVJlcG9ydFBhY2tldCggbVNldHRpbmdzLT5yZXBvcnRoZHIsIHJlcG9ydHN0cnVjdCApOworCX0KKyAgICAgICAgQ2xvc2VSZXBvcnQoIG1TZXR0aW5ncy0+cmVwb3J0aGRyLCByZXBvcnRzdHJ1Y3QgKTsKKyAgICAgICAgCisgICAgICAgIC8vIHNlbmQgYSBhY2tub3dsZWRnZW1lbnQgYmFjayBvbmx5IGlmIHdlJ3JlIE5PVCByZWNlaXZpbmcgbXVsdGljYXN0IAorICAgICAgICBpZiAoIGlzVURQKCBtU2V0dGluZ3MgKSAmJiAhaXNNdWx0aWNhc3QoIG1TZXR0aW5ncyApICkgeworICAgICAgICAgICAgLy8gc2VuZCBiYWNrIGFuIGFja25vd2xlZGdlbWVudCBvZiB0aGUgdGVybWluYXRpbmcgZGF0YWdyYW0gCisgICAgICAgICAgICB3cml0ZV9VRFBfQWNrRklOKCApOyAKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEZBSUwoMSwgIk91dCBvZiBtZW1vcnkhIENsb3Npbmcgc2VydmVyIHRocmVhZFxuIiwgbVNldHRpbmdzKTsKKyAgICB9CisKKyAgICBNdXRleF9Mb2NrKCAmY2xpZW50c19tdXRleCApOyAgICAgCisgICAgSXBlcmZfZGVsZXRlKCAmKG1TZXR0aW5ncy0+cGVlciksICZjbGllbnRzICk7IAorICAgIE11dGV4X1VubG9jayggJmNsaWVudHNfbXV0ZXggKTsKKworICAgIERFTEVURV9QVFIoIHJlcG9ydHN0cnVjdCApOworICAgIEVuZFJlcG9ydCggbVNldHRpbmdzLT5yZXBvcnRoZHIgKTsKK30gCisvLyBlbmQgUmVjdiAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFNlbmQgYW4gQWNrRklOIChhIGRhdGFncmFtIGFja25vd2xlZGdpbmcgYSBGSU4pIG9uIHRoZSBzb2NrZXQsIAorICogdGhlbiBzZWxlY3Qgb24gdGhlIHNvY2tldCBmb3Igc29tZSB0aW1lLiBJZiBhZGRpdGlvbmFsIGRhdGFncmFtcyAKKyAqIGNvbWUgaW4sIHByb2JhYmx5IG91ciBBY2tGSU4gd2FzIGxvc3QgYW5kIHRoZXkgYXJlIHJlLXRyYW5zbWl0dGVkIAorICogdGVybWluYXRpb24gZGF0YWdyYW1zLCBzbyByZS10cmFuc21pdCBvdXIgQWNrRklOLiAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gCisKK3ZvaWQgU2VydmVyOjp3cml0ZV9VRFBfQWNrRklOKCApIHsKKworICAgIGludCByYzsgCisKKyAgICBmZF9zZXQgcmVhZFNldDsgCisgICAgRkRfWkVSTyggJnJlYWRTZXQgKTsgCisKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OyAKKworICAgIGludCBjb3VudCA9IDA7IAorICAgIHdoaWxlICggY291bnQgPCAxMCApIHsKKyAgICAgICAgY291bnQrKzsgCisKKyAgICAgICAgVURQX2RhdGFncmFtICpVRFBfSGRyOworICAgICAgICBzZXJ2ZXJfaGRyICpoZHI7CisKKyAgICAgICAgVURQX0hkciA9IChVRFBfZGF0YWdyYW0qKSBtQnVmOworCisgICAgICAgIGlmICggbVNldHRpbmdzLT5tQnVmTGVuID4gKGludCkgKCBzaXplb2YoIFVEUF9kYXRhZ3JhbSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiggc2VydmVyX2hkciApICkgKSB7CisgICAgICAgICAgICBUcmFuc2Zlcl9JbmZvICpzdGF0cyA9IEdldFJlcG9ydCggbVNldHRpbmdzLT5yZXBvcnRoZHIgKTsKKyAgICAgICAgICAgIGhkciA9IChzZXJ2ZXJfaGRyKikgKFVEUF9IZHIrMSk7CisKKyAgICAgICAgICAgIGhkci0+ZmxhZ3MgICAgICAgID0gaHRvbmwoIEhFQURFUl9WRVJTSU9OMSApOworICAgICAgICAgICAgaGRyLT50b3RhbF9sZW4xICAgPSBodG9ubCggKGxvbmcpIChzdGF0cy0+VG90YWxMZW4gPj4gMzIpICk7CisgICAgICAgICAgICBoZHItPnRvdGFsX2xlbjIgICA9IGh0b25sKCAobG9uZykgKHN0YXRzLT5Ub3RhbExlbiAmIDB4RkZGRkZGRkYpICk7CisgICAgICAgICAgICBoZHItPnN0b3Bfc2VjICAgICA9IGh0b25sKCAobG9uZykgc3RhdHMtPmVuZFRpbWUgKTsKKyAgICAgICAgICAgIGhkci0+c3RvcF91c2VjICAgID0gaHRvbmwoIChsb25nKSgoc3RhdHMtPmVuZFRpbWUgLSAobG9uZylzdGF0cy0+ZW5kVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJNaWxsaW9uKSk7CisgICAgICAgICAgICBoZHItPmVycm9yX2NudCAgICA9IGh0b25sKCBzdGF0cy0+Y250RXJyb3IgKTsKKyAgICAgICAgICAgIGhkci0+b3V0b3JkZXJfY250ID0gaHRvbmwoIHN0YXRzLT5jbnRPdXRvZk9yZGVyICk7CisgICAgICAgICAgICBoZHItPmRhdGFncmFtcyAgICA9IGh0b25sKCBzdGF0cy0+Y250RGF0YWdyYW1zICk7CisgICAgICAgICAgICBoZHItPmppdHRlcjEgICAgICA9IGh0b25sKCAobG9uZykgc3RhdHMtPmppdHRlciApOworICAgICAgICAgICAgaGRyLT5qaXR0ZXIyICAgICAgPSBodG9ubCggKGxvbmcpICgoc3RhdHMtPmppdHRlciAtIChsb25nKXN0YXRzLT5qaXR0ZXIpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJNaWxsaW9uKSApOworCisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBkYXRhIAorICAgICAgICB3cml0ZSggbVNldHRpbmdzLT5tU29jaywgbUJ1ZiwgbVNldHRpbmdzLT5tQnVmTGVuICk7IAorCisgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIHNvY2tldCBpcyByZWFkYWJsZSwgb3Igb3VyIHRpbWVvdXQgZXhwaXJlcyAKKyAgICAgICAgRkRfU0VUKCBtU2V0dGluZ3MtPm1Tb2NrLCAmcmVhZFNldCApOyAKKyAgICAgICAgdGltZW91dC50dl9zZWMgID0gMTsgCisgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IDA7IAorCisgICAgICAgIHJjID0gc2VsZWN0KCBtU2V0dGluZ3MtPm1Tb2NrKzEsICZyZWFkU2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCApOyAKKyAgICAgICAgRkFJTF9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAic2VsZWN0IiwgbVNldHRpbmdzICk7IAorCisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHNlbGVjdCB0aW1lZCBvdXQgCisgICAgICAgICAgICByZXR1cm47IAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc29ja2V0IHJlYWR5IHRvIHJlYWQgCisgICAgICAgICAgICByYyA9IHJlYWQoIG1TZXR0aW5ncy0+bVNvY2ssIG1CdWYsIG1TZXR0aW5ncy0+bUJ1ZkxlbiApOyAKKyAgICAgICAgICAgIFdBUk5fZXJybm8oIHJjIDwgMCwgInJlYWQiICk7CisgICAgICAgICAgICBpZiAoIHJjIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBjbG9zZWQgb3IgZXJyb3JlZAorICAgICAgICAgICAgICAgIC8vIFN0b3AgdXNpbmcgaXQuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgIH0gCisKKyAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5fYWNrX2ZhaWxlZCwgbVNldHRpbmdzLT5tU29jaywgY291bnQgKTsgCit9IAorLy8gZW5kIHdyaXRlX1VEUF9BY2tGSU4gCisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9TZXR0aW5ncy5jcHAgYi9pcGVyZi0yLjAuNS9zcmMvU2V0dGluZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWYwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvU2V0dGluZ3MuY3BwCkBAIC0wLDAgKzEsODQzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogU2V0dGluZ3MuY3BwCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogJiBBamF5IFRpcnVtYWxhIDx0aXJ1bWFsYUBuY3NhLnVpdWMuZWR1PgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RvcmVzIGFuZCBwYXJzZXMgdGhlIGluaXRpYWwgdmFsdWVzIGZvciBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBoZWFkZXJzCisgKiB1c2VzCisgKiAgIDxzdGRsaWIuaD4KKyAqICAgPHN0ZGlvLmg+CisgKiAgIDxzdHJpbmcuaD4KKyAqCisgKiAgIDx1bmlzdGQuaD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBIRUFERVJTKCkKKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKworI2luY2x1ZGUgIlNldHRpbmdzLmhwcCIKKyNpbmNsdWRlICJMb2NhbGUuaCIKKyNpbmNsdWRlICJTb2NrZXRBZGRyLmgiCisKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyNpbmNsdWRlICJnbnVfZ2V0b3B0LmgiCisKK3ZvaWQgU2V0dGluZ3NfSW50ZXJwcmV0KCBjaGFyIG9wdGlvbiwgY29uc3QgY2hhciAqb3B0YXJnLCB0aHJlYWRfU2V0dGluZ3MgKm1FeHRTZXR0aW5ncyApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjb21tYW5kIGxpbmUgb3B0aW9ucworICoKKyAqIFRoZSBvcHRpb24gc3RydWN0IGVzc2VudGlhbGx5IG1hcHMgYSBsb25nIG9wdGlvbiBuYW1lICgtLWZvb2JhcikKKyAqIG9yIGVudmlyb25tZW50IHZhcmlhYmxlICgkRk9PQkFSKSB0byBpdHMgc2hvcnQgb3B0aW9uIGNoYXIgKGYpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBMT05HX09QVElPTlMoKQorCitjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KK3sKK3sic2luZ2xlY2xpZW50IiwgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAnMSd9LAoreyJiYW5kd2lkdGgiLCAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdiJ30sCit7ImNsaWVudCIsICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2MnfSwKK3siZHVhbHRlc3QiLCAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAoreyJmb3JtYXQiLCAgICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCit7ImhlbHAiLCAgICAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKK3siaW50ZXJ2YWwiLCAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaSd9LAoreyJsZW4iLCAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdsJ30sCit7InByaW50X21zcyIsICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgJ20nfSwKK3sibnVtIiwgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbid9LAoreyJvdXRwdXQiLCAgICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdvJ30sCit7InBvcnQiLCAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3AnfSwKK3sidHJhZGVvZmYiLCAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAoreyJzZXJ2ZXIiLCAgICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCit7InRpbWUiLCAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3QnfSwKK3sidWRwIiwgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAndSd9LAoreyJ2ZXJzaW9uIiwgICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICd2J30sCit7IndpbmRvdyIsICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3cnfSwKK3sicmVwb3J0ZXhjbHVkZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAneCd9LAoreyJyZXBvcnRzdHlsZSIscmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd5J30sCisKKy8vIG1vcmUgZXNvdGVyaWMgb3B0aW9ucworeyJiaW5kIiwgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdCJ30sCit7ImNvbXBhdGliaWxpdHkiLCAgICBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKK3siZGFlbW9uIiwgICAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAnRCd9LAoreyJmaWxlX2lucHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdGJ30sCit7InN0ZGluX2lucHV0IiwgICAgICBub19hcmd1bWVudCwgTlVMTCwgJ0knfSwKK3sibXNzIiwgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAoreyJub2RlbGF5IiwgICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdOJ30sCit7Imxpc3RlbnBvcnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0wnfSwKK3sicGFyYWxsZWwiLCAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUCd9LAoreyJyZW1vdmUiLCAgICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdSJ30sCit7InRvcyIsICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1MnfSwKK3sidHRsIiwgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnVCd9LAoreyJzaW5nbGVfdWRwIiwgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdVJ30sCit7ImlwdjZfZG9tYWluIiwgICAgICBub19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKK3sic3VnZ2VzdF93aW5fc2l6ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVyd9LAoreyJsaW51eC1jb25nZXN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdaJ30sCit7MCwgMCwgMCwgMH0KK307CisKKyNkZWZpbmUgRU5WX09QVElPTlMoKQorCitjb25zdCBzdHJ1Y3Qgb3B0aW9uIGVudl9vcHRpb25zW10gPQoreworeyJJUEVSRl9TSU5HTEVDTElFTlQiLCAgICAgbm9fYXJndW1lbnQsIE5VTEwsICcxJ30sCit7IklQRVJGX0JBTkRXSURUSCIsICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKK3siSVBFUkZfQ0xJRU5UIiwgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYyd9LAoreyJJUEVSRl9EVUFMVEVTVCIsICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCit7IklQRVJGX0ZPUk1BVCIsICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2YnfSwKKy8vIHNraXAgaGVscAoreyJJUEVSRl9JTlRFUlZBTCIsICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdpJ30sCit7IklQRVJGX0xFTiIsICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2wnfSwKK3siSVBFUkZfUFJJTlRfTVNTIiwgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAoreyJJUEVSRl9OVU0iLCAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICduJ30sCit7IklQRVJGX1BPUlQiLCAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3AnfSwKK3siSVBFUkZfVFJBREVPRkYiLCAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAoreyJJUEVSRl9TRVJWRVIiLCAgICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCit7IklQRVJGX1RJTUUiLCAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3QnfSwKK3siSVBFUkZfVURQIiwgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAndSd9LAorLy8gc2tpcCB2ZXJzaW9uCit7IlRDUF9XSU5ET1dfU0laRSIsICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3cnfSwKK3siSVBFUkZfUkVQT1JURVhDTFVERSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAneCd9LAoreyJJUEVSRl9SRVBPUlRTVFlMRSIscmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd5J30sCisKKy8vIG1vcmUgZXNvdGVyaWMgb3B0aW9ucworeyJJUEVSRl9CSU5EIiwgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdCJ30sCit7IklQRVJGX0NPTVBBVCIsICAgICAgICAgICBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKK3siSVBFUkZfREFFTU9OIiwgICAgICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAnRCd9LAoreyJJUEVSRl9GSUxFX0lOUFVUIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdGJ30sCit7IklQRVJGX1NURElOX0lOUFVUIiwgICAgICBub19hcmd1bWVudCwgTlVMTCwgJ0knfSwKK3siSVBFUkZfTVNTIiwgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnTSd9LAoreyJJUEVSRl9OT0RFTEFZIiwgICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdOJ30sCit7IklQRVJGX0xJU1RFTlBPUlQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0wnfSwKK3siSVBFUkZfUEFSQUxMRUwiLCAgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUCd9LAoreyJJUEVSRl9UT1MiLCAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdTJ30sCit7IklQRVJGX1RUTCIsICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnfSwKK3siSVBFUkZfU0lOR0xFX1VEUCIsICAgICAgIG5vX2FyZ3VtZW50LCBOVUxMLCAnVSd9LAoreyJJUEVSRl9JUFY2X0RPTUFJTiIsICAgICAgbm9fYXJndW1lbnQsIE5VTEwsICdWJ30sCit7IklQRVJGX1NVR0dFU1RfV0lOX1NJWkUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1cnfSwKK3siSVBFUkZfQ09OR0VTVElPTl9DT05UUk9MIiwgIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnWid9LAorezAsIDAsIDAsIDB9Cit9OworCisjZGVmaW5lIFNIT1JUX09QVElPTlMoKQorCitjb25zdCBjaGFyIHNob3J0X29wdGlvbnNbXSA9ICIxYjpjOmRmOmhpOmw6bW46bzpwOnJzdDp1dnc6eDp5OkI6Q0RGOklMOk06TlA6UlM6VDpVVldaOiI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRlZmF1bHRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIERFRkFVTFRTKCkKKworY29uc3QgbG9uZyBrRGVmYXVsdF9VRFBSYXRlID0gMTAyNCAqIDEwMjQ7IC8vIC11ICBpZiBzZXQsIDEgTWJpdC9zZWMKK2NvbnN0IGludCAga0RlZmF1bHRfVURQQnVmTGVuID0gMTQ3MDsgICAgICAvLyAtdSAgaWYgc2V0LCByZWFkL3dyaXRlIDE0NzAgYnl0ZXMKKy8vIDE0NzAgYnl0ZXMgaXMgc21hbGwgZW5vdWdoIHRvIGJlIHNlbmRpbmcgb25lIHBhY2tldCBwZXIgZGF0YWdyYW0gb24gZXRoZXJuZXQKKworLy8gMTQ1MCBieXRlcyBpcyBzbWFsbCBlbm91Z2ggdG8gYmUgc2VuZGluZyBvbmUgcGFja2V0IHBlciBkYXRhZ3JhbSBvbiBldGhlcm5ldAorLy8gICoqKiogd2l0aCBJUHY2ICoqKioKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5pdGlhbGl6ZSBhbGwgc2V0dGluZ3MgdG8gZGVmYXVsdHMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgU2V0dGluZ3NfSW5pdGlhbGl6ZSggdGhyZWFkX1NldHRpbmdzICptYWluICkgeworICAgIC8vIEV2ZXJ5dGhpbmcgZGVmYXVsdHMgdG8gemVybyBvciBOVUxMIHdpdGgKKyAgICAvLyB0aGlzIG1lbXNldC4gT25seSBuZWVkIHRvIHNldCBub24temVybyB2YWx1ZXMKKyAgICAvLyBiZWxvdy4KKyAgICBtZW1zZXQoIG1haW4sIDAsIHNpemVvZih0aHJlYWRfU2V0dGluZ3MpICk7CisgICAgbWFpbi0+bVNvY2sgPSBJTlZBTElEX1NPQ0tFVDsKKyAgICBtYWluLT5tUmVwb3J0TW9kZSA9IGtSZXBvcnRfRGVmYXVsdDsKKyAgICAvLyBvcHRpb24sIGRlZmF1bHRzCisgICAgbWFpbi0+ZmxhZ3MgICAgICAgICA9IEZMQUdfTU9ERVRJTUUgfCBGTEFHX1NURE9VVDsgLy8gRGVmYXVsdCB0aW1lIGFuZCBzdGRvdXQKKyAgICAvL21haW4tPm1VRFBSYXRlICAgICAgPSAwOyAgICAgICAgICAgLy8gLWIsICBpZS4gVENQIG1vZGUKKyAgICAvL21haW4tPm1Ib3N0ICAgICAgICAgPSBOVUxMOyAgICAgICAgLy8gLWMsICBub25lLCByZXF1aXJlZCBmb3IgY2xpZW50CisgICAgbWFpbi0+bU1vZGUgICAgICAgICA9IGtUZXN0X05vcm1hbDsgIC8vIC1kLCAgbU1vZGUgPT0ga1Rlc3RfRHVhbFRlc3QKKyAgICBtYWluLT5tRm9ybWF0ICAgICAgID0gJ2EnOyAgICAgICAgICAgLy8gLWYsICBhZGFwdGl2ZSBiaXRzCisgICAgLy8gc2tpcCBoZWxwICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1oLAorICAgIC8vbWFpbi0+bUJ1ZkxlblNldCAgPSBmYWxzZTsgICAgICAgICAvLyAtbCwJCisgICAgbWFpbi0+bUJ1ZkxlbiAgICAgICA9IDEyOCAqIDEwMjQ7ICAgICAgLy8gLWwsICA4IEtieXRlCisgICAgLy9tYWluLT5tSW50ZXJ2YWwgICAgID0gMDsgICAgICAgICAgIC8vIC1pLCAgaWUuIG5vIHBlcmlvZGljIGJ3IHJlcG9ydHMKKyAgICAvL21haW4tPm1QcmludE1TUyAgID0gZmFsc2U7ICAgICAgICAgLy8gLW0sICBkb24ndCBwcmludCBNU1MKKyAgICAvLyBtQW1vdW50IGlzIHRpbWUgYWxzbyAgICAgICAgICAgICAgLy8gLW4sICBOL0EKKyAgICAvL21haW4tPm1PdXRwdXRGaWxlTmFtZSA9IE5VTEw7ICAgICAgLy8gLW8sICBmaWxlbmFtZQorICAgIG1haW4tPm1Qb3J0ICAgICAgICAgPSA1MDAxOyAgICAgICAgICAvLyAtcCwgIHR0Y3AgcG9ydAorICAgIC8vIG1Nb2RlICAgID0ga1Rlc3RfTm9ybWFsOyAgICAgICAgICAvLyAtciwgIG1Nb2RlID09IGtUZXN0X1RyYWRlT2ZmCisgICAgbWFpbi0+bVRocmVhZE1vZGUgICA9IGtNb2RlX1Vua25vd247IC8vIC1zLCAgb3IgLWMsIG5vbmUKKyAgICBtYWluLT5tQW1vdW50ICAgICAgID0gMTAwMDsgICAgICAgICAgLy8gLXQsICAxMCBzZWNvbmRzCisgICAgLy8gbVVEUFJhdGUgPiAwIG1lYW5zIFVEUCAgICAgICAgICAgIC8vIC11LCAgTi9BLCBzZWUga0RlZmF1bHRfVURQUmF0ZQorICAgIC8vIHNraXAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAvLyAtdiwKKyAgICAvL21haW4tPm1UQ1BXaW4gICAgICAgPSAwOyAgICAgICAgICAgLy8gLXcsICBpZS4gZG9uJ3Qgc2V0IHdpbmRvdworCisgICAgLy8gbW9yZSBlc290ZXJpYyBvcHRpb25zCisgICAgLy9tYWluLT5tTG9jYWxob3N0ICAgID0gTlVMTDsgICAgICAgIC8vIC1CLCAgbm9uZQorICAgIC8vbWFpbi0+bUNvbXBhdCAgICAgPSBmYWxzZTsgICAgICAgICAvLyAtQywgIHJ1biBpbiBDb21wYXRpYmlsaXR5IG1vZGUKKyAgICAvL21haW4tPm1EYWVtb24gICAgID0gZmFsc2U7ICAgICAgICAgLy8gLUQsICBydW4gYXMgYSBkYWVtb24KKyAgICAvL21haW4tPm1GaWxlSW5wdXQgID0gZmFsc2U7ICAgICAgICAgLy8gLUYsCisgICAgLy9tYWluLT5tRmlsZU5hbWUgICAgID0gTlVMTDsgICAgICAgIC8vIC1GLCAgZmlsZW5hbWUgCisgICAgLy9tYWluLT5tU3RkaW4gICAgICA9IGZhbHNlOyAgICAgICAgIC8vIC1JLCAgZGVmYXVsdCBub3Qgc3RkaW4KKyAgICAvL21haW4tPm1MaXN0ZW5Qb3J0ICAgPSAwOyAgICAgICAgICAgLy8gLUwsICBsaXN0ZW4gcG9ydAorICAgIC8vbWFpbi0+bU1TUyAgICAgICAgICA9IDA7ICAgICAgICAgICAvLyAtTSwgIGllLiBkb24ndCBzZXQgTVNTCisgICAgLy9tYWluLT5tTm9kZWxheSAgICA9IGZhbHNlOyAgICAgICAgIC8vIC1OLCAgZG9uJ3Qgc2V0IG5vZGVsYXkKKyAgICAvL21haW4tPm1UaHJlYWRzICAgICAgPSAwOyAgICAgICAgICAgLy8gLVAsCisgICAgLy9tYWluLT5tUmVtb3ZlU2VydmljZSA9IGZhbHNlOyAgICAgIC8vIC1SLAorICAgIC8vbWFpbi0+bVRPUyAgICAgICAgICA9IDA7ICAgICAgICAgICAvLyAtUywgIGllLiBkb24ndCBzZXQgdHlwZSBvZiBzZXJ2aWNlCisgICAgbWFpbi0+bVRUTCAgICAgICAgICA9IDE7ICAgICAgICAgICAgIC8vIC1ULCAgbGluay1sb2NhbCBUVEwKKyAgICAvL21haW4tPm1Eb21haW4gICAgID0ga01vZGVfSVB2NDsgICAgLy8gLVYsCisgICAgLy9tYWluLT5tU3VnZ2VzdFdpbiA9IGZhbHNlOyAgICAgICAgIC8vIC1XLCAgU3VnZ2VzdCB0aGUgd2luZG93IHNpemUuCisKK30gLy8gZW5kIFNldHRpbmdzCisKK3ZvaWQgU2V0dGluZ3NfQ29weSggdGhyZWFkX1NldHRpbmdzICpmcm9tLCB0aHJlYWRfU2V0dGluZ3MgKippbnRvICkgeworICAgICppbnRvID0gbmV3IHRocmVhZF9TZXR0aW5nczsKKyAgICBtZW1jcHkoICppbnRvLCBmcm9tLCBzaXplb2YodGhyZWFkX1NldHRpbmdzKSApOworICAgIGlmICggZnJvbS0+bUhvc3QgIT0gTlVMTCApIHsKKyAgICAgICAgKCppbnRvKS0+bUhvc3QgPSBuZXcgY2hhclsgc3RybGVuKGZyb20tPm1Ib3N0KSArIDFdOworICAgICAgICBzdHJjcHkoICgqaW50byktPm1Ib3N0LCBmcm9tLT5tSG9zdCApOworICAgIH0KKyAgICBpZiAoIGZyb20tPm1PdXRwdXRGaWxlTmFtZSAhPSBOVUxMICkgeworICAgICAgICAoKmludG8pLT5tT3V0cHV0RmlsZU5hbWUgPSBuZXcgY2hhclsgc3RybGVuKGZyb20tPm1PdXRwdXRGaWxlTmFtZSkgKyAxXTsKKyAgICAgICAgc3RyY3B5KCAoKmludG8pLT5tT3V0cHV0RmlsZU5hbWUsIGZyb20tPm1PdXRwdXRGaWxlTmFtZSApOworICAgIH0KKyAgICBpZiAoIGZyb20tPm1Mb2NhbGhvc3QgIT0gTlVMTCApIHsKKyAgICAgICAgKCppbnRvKS0+bUxvY2FsaG9zdCA9IG5ldyBjaGFyWyBzdHJsZW4oZnJvbS0+bUxvY2FsaG9zdCkgKyAxXTsKKyAgICAgICAgc3RyY3B5KCAoKmludG8pLT5tTG9jYWxob3N0LCBmcm9tLT5tTG9jYWxob3N0ICk7CisgICAgfQorICAgIGlmICggZnJvbS0+bUZpbGVOYW1lICE9IE5VTEwgKSB7CisgICAgICAgICgqaW50byktPm1GaWxlTmFtZSA9IG5ldyBjaGFyWyBzdHJsZW4oZnJvbS0+bUZpbGVOYW1lKSArIDFdOworICAgICAgICBzdHJjcHkoICgqaW50byktPm1GaWxlTmFtZSwgZnJvbS0+bUZpbGVOYW1lICk7CisgICAgfQorICAgIC8vIFplcm8gb3V0IGNlcnRhaW4gZW50cmllcworICAgICgqaW50byktPm1USUQgPSB0aHJlYWRfemVyb2lkKCk7CisgICAgKCppbnRvKS0+cnVuTmV4dCA9IE5VTEw7CisgICAgKCppbnRvKS0+cnVuTm93ID0gTlVMTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVsZXRlIG1lbW9yeTogRG9lcyBub3QgY2xlYW4gdXAgb3BlbiBmaWxlIHBvaW50ZXJzIG9yIHB0cl9wYXJlbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgU2V0dGluZ3NfRGVzdHJveSggdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MpIHsKKyAgICBERUxFVEVfQVJSQVkoIG1TZXR0aW5ncy0+bUhvc3QgICAgICApOworICAgIERFTEVURV9BUlJBWSggbVNldHRpbmdzLT5tTG9jYWxob3N0ICk7CisgICAgREVMRVRFX0FSUkFZKCBtU2V0dGluZ3MtPm1GaWxlTmFtZSAgKTsKKyAgICBERUxFVEVfQVJSQVkoIG1TZXR0aW5ncy0+bU91dHB1dEZpbGVOYW1lICk7CisgICAgREVMRVRFX1BUUiggbVNldHRpbmdzICk7Cit9IC8vIGVuZCB+U2V0dGluZ3MKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUGFyc2VzIHNldHRpbmdzIGZyb20gdXNlcidzIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgU2V0dGluZ3NfUGFyc2VFbnZpcm9ubWVudCggdGhyZWFkX1NldHRpbmdzICptU2V0dGluZ3MgKSB7CisgICAgY2hhciAqdGhlVmFyaWFibGU7CisKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKCBlbnZfb3B0aW9uc1tpXS5uYW1lICE9IE5VTEwgKSB7CisgICAgICAgIHRoZVZhcmlhYmxlID0gZ2V0ZW52KCBlbnZfb3B0aW9uc1tpXS5uYW1lICk7CisgICAgICAgIGlmICggdGhlVmFyaWFibGUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIFNldHRpbmdzX0ludGVycHJldCggZW52X29wdGlvbnNbaV0udmFsLCB0aGVWYXJpYWJsZSwgbVNldHRpbmdzICk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KK30gLy8gZW5kIFBhcnNlRW52aXJvbm1lbnQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUGFyc2Ugc2V0dGluZ3MgZnJvbSBhcHAncyBjb21tYW5kIGxpbmUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgU2V0dGluZ3NfUGFyc2VDb21tYW5kTGluZSggaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB0aHJlYWRfU2V0dGluZ3MgKm1TZXR0aW5ncyApIHsKKyAgICBpbnQgb3B0aW9uOworICAgIHdoaWxlICggKG9wdGlvbiA9CisgICAgICAgICAgICAgZ251X2dldG9wdF9sb25nKCBhcmdjLCBhcmd2LCBzaG9ydF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19vcHRpb25zLCBOVUxMICkpICE9IEVPRiApIHsKKyAgICAgICAgU2V0dGluZ3NfSW50ZXJwcmV0KCBvcHRpb24sIGdudV9vcHRhcmcsIG1TZXR0aW5ncyApOworICAgIH0KKworICAgIGZvciAoIGludCBpID0gZ251X29wdGluZDsgaSA8IGFyZ2M7IGkrKyApIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJXM6IGlnbm9yaW5nIGV4dHJhIGFyZ3VtZW50IC0tICVzXG4iLCBhcmd2WzBdLCBhcmd2W2ldICk7CisgICAgfQorfSAvLyBlbmQgUGFyc2VDb21tYW5kTGluZQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcnByZXQgaW5kaXZpZHVhbCBvcHRpb25zLCBlaXRoZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lCisgKiBvciBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBTZXR0aW5nc19JbnRlcnByZXQoIGNoYXIgb3B0aW9uLCBjb25zdCBjaGFyICpvcHRhcmcsIHRocmVhZF9TZXR0aW5ncyAqbUV4dFNldHRpbmdzICkgeworICAgIGNoYXIgb3V0YXJnWzEwMF07CisKKyAgICBzd2l0Y2ggKCBvcHRpb24gKSB7CisgICAgICAgIGNhc2UgJzEnOiAvLyBTaW5nbGUgQ2xpZW50CisgICAgICAgICAgICBzZXRTaW5nbGVDbGllbnQoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2InOiAvLyBVRFAgYmFuZHdpZHRoCisgICAgICAgICAgICBpZiAoICFpc1VEUCggbUV4dFNldHRpbmdzICkgKSB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ltcGxpZWRfdWRwLCBvcHRpb24gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBtRXh0U2V0dGluZ3MtPm1UaHJlYWRNb2RlICE9IGtNb2RlX0NsaWVudCApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5faW52YWxpZF9zZXJ2ZXJfb3B0aW9uLCBvcHRpb24gKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2V0dGluZ3NfR2V0TG93ZXJDYXNlQXJnKG9wdGFyZyxvdXRhcmcpOworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tVURQUmF0ZSA9IGJ5dGVfYXRvaShvdXRhcmcpOworICAgICAgICAgICAgc2V0VURQKCBtRXh0U2V0dGluZ3MgKTsKKworICAgICAgICAgICAgLy8gaWYgLWwgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIG1CdWZMZW5TZXQgaXMgdHJ1ZQorICAgICAgICAgICAgLy8gc28gZG9uJ3Qgb3ZlcndyaXRlIHRoYXQgdmFsdWUuCisgICAgICAgICAgICBpZiAoICFpc0J1ZmxlblNldCggbUV4dFNldHRpbmdzICkgKSB7CisgICAgICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tQnVmTGVuID0ga0RlZmF1bHRfVURQQnVmTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnYyc6IC8vIGNsaWVudCBtb2RlIHcvIHNlcnZlciBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bUhvc3QgPSBuZXcgY2hhclsgc3RybGVuKCBvcHRhcmcgKSArIDEgXTsKKyAgICAgICAgICAgIHN0cmNweSggbUV4dFNldHRpbmdzLT5tSG9zdCwgb3B0YXJnICk7CisKKyAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tVGhyZWFkTW9kZSA9PSBrTW9kZV9Vbmtub3duICkgeworICAgICAgICAgICAgICAgIC8vIFRlc3QgZm9yIE11bHRpY2FzdAorICAgICAgICAgICAgICAgIGlwZXJmX3NvY2thZGRyIHRlbXA7CisgICAgICAgICAgICAgICAgU29ja0FkZHJfc2V0SG9zdG5hbWUoIG1FeHRTZXR0aW5ncy0+bUhvc3QsICZ0ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNJUFY2KCBtRXh0U2V0dGluZ3MgKSA/IDEgOiAwICkpOworICAgICAgICAgICAgICAgIGlmICggU29ja0FkZHJfaXNNdWx0aWNhc3QoICZ0ZW1wICkgKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE11bHRpY2FzdCggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bVRocmVhZE1vZGUgPSBrTW9kZV9DbGllbnQ7CisgICAgICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tVGhyZWFkcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gRHVhbC10ZXN0IE1vZGUKKyAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tVGhyZWFkTW9kZSAhPSBrTW9kZV9DbGllbnQgKSB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ludmFsaWRfc2VydmVyX29wdGlvbiwgb3B0aW9uICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGlzQ29tcGF0KCBtRXh0U2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5faW52YWxpZF9jb21wYXRpYmlsaXR5X29wdGlvbiwgb3B0aW9uICk7CisgICAgICAgICAgICB9CisjaWZkZWYgSEFWRV9USFJFQUQKKyAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bU1vZGUgPSBrVGVzdF9EdWFsVGVzdDsKKyNlbHNlCisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5faW52YWxpZF9zaW5nbGVfdGhyZWFkZWQsIG9wdGlvbiApOworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tTW9kZSA9IGtUZXN0X1RyYWRlT2ZmOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZm9ybWF0IHRvIHByaW50IGluCisgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1Gb3JtYXQgPSAoKm9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdoJzogLy8gcHJpbnQgaGVscCBhbmQgZXhpdAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIHVzYWdlX2xvbmcxKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCB1c2FnZV9sb25nMik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnaSc6IC8vIHNwZWNpZnkgaW50ZXJ2YWwgYmV0d2VlbiBwZXJpb2RpYyBidyByZXBvcnRzCisgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1JbnRlcnZhbCA9IGF0b2YoIG9wdGFyZyApOworICAgICAgICAgICAgaWYgKCBtRXh0U2V0dGluZ3MtPm1JbnRlcnZhbCA8IDAuNSApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIHJlcG9ydF9pbnRlcnZhbF9zbWFsbCwgbUV4dFNldHRpbmdzLT5tSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bUludGVydmFsID0gMC41OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnbCc6IC8vIGxlbmd0aCBvZiBlYWNoIGJ1ZmZlcgorICAgICAgICAgICAgU2V0dGluZ3NfR2V0VXBwZXJDYXNlQXJnKG9wdGFyZyxvdXRhcmcpOworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tQnVmTGVuID0gYnl0ZV9hdG9pKCBvdXRhcmcgKTsKKyAgICAgICAgICAgIHNldEJ1ZmxlblNldCggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICBpZiAoICFpc1VEUCggbUV4dFNldHRpbmdzICkgKSB7CisgICAgICAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tQnVmTGVuIDwgKGludCkgc2l6ZW9mKCBjbGllbnRfaGRyICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAhaXNDb21wYXQoIG1FeHRTZXR0aW5ncyApICkgeworICAgICAgICAgICAgICAgICAgICBzZXRDb21wYXQoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5faW1wbGllZF9jb21wYXRpYmlsaXR5LCBvcHRpb24gKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIG1FeHRTZXR0aW5ncy0+bUJ1ZkxlbiA8IChpbnQpIHNpemVvZiggVURQX2RhdGFncmFtICkgKSB7CisgICAgICAgICAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bUJ1ZkxlbiA9IHNpemVvZiggVURQX2RhdGFncmFtICk7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgd2Fybl9idWZmZXJfdG9vX3NtYWxsLCBtRXh0U2V0dGluZ3MtPm1CdWZMZW4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCAhaXNDb21wYXQoIG1FeHRTZXR0aW5ncyApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tQnVmTGVuIDwgKGludCkgKCBzaXplb2YoIFVEUF9kYXRhZ3JhbSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoIGNsaWVudF9oZHIgKSApICkgeworICAgICAgICAgICAgICAgICAgICBzZXRDb21wYXQoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5faW1wbGllZF9jb21wYXRpYmlsaXR5LCBvcHRpb24gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ20nOiAvLyBwcmludCBUQ1AgTVNTCisgICAgICAgICAgICBzZXRQcmludE1TUyggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICduJzogLy8gYnl0ZXMgb2YgZGF0YQorICAgICAgICAgICAgLy8gYW1vdW50IG1vZGUgKGluc3RlYWQgb2YgdGltZSBtb2RlKQorICAgICAgICAgICAgdW5zZXRNb2RlVGltZSggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICBTZXR0aW5nc19HZXRVcHBlckNhc2VBcmcob3B0YXJnLG91dGFyZyk7CisgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1BbW91bnQgPSBieXRlX2F0b2koIG91dGFyZyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnbycgOiAvLyBvdXRwdXQgdGhlIHJlcG9ydCBhbmQgb3RoZXIgbWVzc2FnZXMgaW50byB0aGUgZmlsZQorICAgICAgICAgICAgdW5zZXRTVERPVVQoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tT3V0cHV0RmlsZU5hbWUgPSBuZXcgY2hhcltzdHJsZW4ob3B0YXJnKSsxXTsKKyAgICAgICAgICAgIHN0cmNweSggbUV4dFNldHRpbmdzLT5tT3V0cHV0RmlsZU5hbWUsIG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdwJzogLy8gc2VydmVyIHBvcnQKKyAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bVBvcnQgPSBhdG9pKCBvcHRhcmcgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3InOiAvLyB0ZXN0IG1vZGUgdHJhZGVvZmYKKyAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tVGhyZWFkTW9kZSAhPSBrTW9kZV9DbGllbnQgKSB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ludmFsaWRfc2VydmVyX29wdGlvbiwgb3B0aW9uICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGlzQ29tcGF0KCBtRXh0U2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5faW52YWxpZF9jb21wYXRpYmlsaXR5X29wdGlvbiwgb3B0aW9uICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bU1vZGUgPSBrVGVzdF9UcmFkZU9mZjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3MnOiAvLyBzZXJ2ZXIgbW9kZQorICAgICAgICAgICAgaWYgKCBtRXh0U2V0dGluZ3MtPm1UaHJlYWRNb2RlICE9IGtNb2RlX1Vua25vd24gKSB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ludmFsaWRfY2xpZW50X29wdGlvbiwgb3B0aW9uICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bVRocmVhZE1vZGUgPSBrTW9kZV9MaXN0ZW5lcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOiAvLyBzZWNvbmRzIHRvIHdyaXRlIGZvcgorICAgICAgICAgICAgLy8gdGltZSBtb2RlIChpbnN0ZWFkIG9mIGFtb3VudCBtb2RlKQorICAgICAgICAgICAgc2V0TW9kZVRpbWUoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tQW1vdW50ID0gKGludCkgKGF0b2YoIG9wdGFyZyApICogMTAwLjApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndSc6IC8vIFVEUCBpbnN0ZWFkIG9mIFRDUAorICAgICAgICAgICAgLy8gaWYgLWIgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIFVEUCByYXRlIHdpbGwKKyAgICAgICAgICAgIC8vIGFscmVhZHkgYmUgbm9uLXplcm8sIHNvIGRvbid0IG92ZXJ3cml0ZSB0aGF0IHZhbHVlCisgICAgICAgICAgICBpZiAoICFpc1VEUCggbUV4dFNldHRpbmdzICkgKSB7CisgICAgICAgICAgICAgICAgc2V0VURQKCBtRXh0U2V0dGluZ3MgKTsKKyAgICAgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1VRFBSYXRlID0ga0RlZmF1bHRfVURQUmF0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgLWwgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIG1CdWZMZW5TZXQgaXMgdHJ1ZQorICAgICAgICAgICAgLy8gc28gZG9uJ3Qgb3ZlcndyaXRlIHRoYXQgdmFsdWUuCisgICAgICAgICAgICBpZiAoICFpc0J1ZmxlblNldCggbUV4dFNldHRpbmdzICkgKSB7CisgICAgICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tQnVmTGVuID0ga0RlZmF1bHRfVURQQnVmTGVuOworICAgICAgICAgICAgfSBlbHNlIGlmICggbUV4dFNldHRpbmdzLT5tQnVmTGVuIDwgKGludCkgKCBzaXplb2YoIFVEUF9kYXRhZ3JhbSApIAorICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoIGNsaWVudF9oZHIgKSApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhaXNDb21wYXQoIG1FeHRTZXR0aW5ncyApICkgeworICAgICAgICAgICAgICAgIHNldENvbXBhdCggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ltcGxpZWRfY29tcGF0aWJpbGl0eSwgb3B0aW9uICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd2JzogLy8gcHJpbnQgdmVyc2lvbiBhbmQgZXhpdAorICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB2ZXJzaW9uICk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndyc6IC8vIFRDUCB3aW5kb3cgc2l6ZSAoc29ja2V0IGJ1ZmZlciBzaXplKQorICAgICAgICAgICAgU2V0dGluZ3NfR2V0VXBwZXJDYXNlQXJnKG9wdGFyZyxvdXRhcmcpOworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tVENQV2luID0gYnl0ZV9hdG9pKG91dGFyZyk7CisKKyAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tVENQV2luIDwgMjA0OCApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5fd2luZG93X3NtYWxsLCBtRXh0U2V0dGluZ3MtPm1UQ1BXaW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3gnOiAvLyBMaW1pdCBSZXBvcnRzCisgICAgICAgICAgICB3aGlsZSAoICpvcHRhcmcgIT0gJ1wwJyApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCAqb3B0YXJnICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXROb1NldHRSZXBvcnQoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vQ29ublJlcG9ydCggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0Tm9EYXRhUmVwb3J0KCBtRXh0U2V0dGluZ3MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnVic6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXROb1NlcnZSZXBvcnQoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vTXVsdFJlcG9ydCggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCB3YXJuX2ludmFsaWRfcmVwb3J0LCAqb3B0YXJnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3B0YXJnKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd5JzogLy8gUmVwb3J0aW5nIFN0eWxlCisgICAgICAgICAgICBzd2l0Y2ggKCAqb3B0YXJnICkgeworICAgICAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1SZXBvcnRNb2RlID0ga1JlcG9ydF9DU1Y7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgd2Fybl9pbnZhbGlkX3JlcG9ydF9zdHlsZSwgb3B0YXJnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICAvLyBtb3JlIGVzb3RlcmljIG9wdGlvbnMKKyAgICAgICAgY2FzZSAnQic6IC8vIHNwZWNpZnkgYmluZCBhZGRyZXNzCisgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1Mb2NhbGhvc3QgPSBuZXcgY2hhclsgc3RybGVuKCBvcHRhcmcgKSArIDEgXTsKKyAgICAgICAgICAgIHN0cmNweSggbUV4dFNldHRpbmdzLT5tTG9jYWxob3N0LCBvcHRhcmcgKTsKKyAgICAgICAgICAgIC8vIFRlc3QgZm9yIE11bHRpY2FzdAorICAgICAgICAgICAgaXBlcmZfc29ja2FkZHIgdGVtcDsKKyAgICAgICAgICAgIFNvY2tBZGRyX3NldEhvc3RuYW1lKCBtRXh0U2V0dGluZ3MtPm1Mb2NhbGhvc3QsICZ0ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc0lQVjYoIG1FeHRTZXR0aW5ncyApID8gMSA6IDAgKSk7CisgICAgICAgICAgICBpZiAoIFNvY2tBZGRyX2lzTXVsdGljYXN0KCAmdGVtcCApICkgeworICAgICAgICAgICAgICAgIHNldE11bHRpY2FzdCggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdDJzogLy8gUnVuIGluIENvbXBhdGliaWxpdHkgTW9kZQorICAgICAgICAgICAgc2V0Q29tcGF0KCBtRXh0U2V0dGluZ3MgKTsKKyAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tTW9kZSAhPSBrVGVzdF9Ob3JtYWwgKSB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ludmFsaWRfY29tcGF0aWJpbGl0eV9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAoIG1FeHRTZXR0aW5ncy0+bU1vZGUgPT0ga1Rlc3RfRHVhbFRlc3QgPworICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcgOiAncicgKSApOworICAgICAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bU1vZGUgPSBrVGVzdF9Ob3JtYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdEJzogLy8gUnVuIGFzIGEgZGFlbW9uCisgICAgICAgICAgICBzZXREYWVtb24oIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnRicgOiAvLyBHZXQgdGhlIGlucHV0IGZvciB0aGUgZGF0YSBzdHJlYW0gZnJvbSBhIGZpbGUKKyAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tVGhyZWFkTW9kZSAhPSBrTW9kZV9DbGllbnQgKSB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ludmFsaWRfc2VydmVyX29wdGlvbiwgb3B0aW9uICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldEZpbGVJbnB1dCggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1GaWxlTmFtZSA9IG5ldyBjaGFyW3N0cmxlbihvcHRhcmcpKzFdOworICAgICAgICAgICAgc3RyY3B5KCBtRXh0U2V0dGluZ3MtPm1GaWxlTmFtZSwgb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ0knIDogLy8gU2V0IHRoZSBzdGRpbiBhcyB0aGUgaW5wdXQgc291cmNlCisgICAgICAgICAgICBpZiAoIG1FeHRTZXR0aW5ncy0+bVRocmVhZE1vZGUgIT0ga01vZGVfQ2xpZW50ICkgeworICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgd2Fybl9pbnZhbGlkX3NlcnZlcl9vcHRpb24sIG9wdGlvbiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXRGaWxlSW5wdXQoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgc2V0U1RESU4oIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tRmlsZU5hbWUgPSBuZXcgY2hhcltzdHJsZW4oIjxzdGRpbj4iKSsxXTsKKyAgICAgICAgICAgIHN0cmNweSggbUV4dFNldHRpbmdzLT5tRmlsZU5hbWUsIjxzdGRpbj4iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ0wnOiAvLyBMaXN0ZW4gUG9ydCAoYmlkaXJlY3Rpb25hbCB0ZXN0aW5nIGNsaWVudC1zaWRlKQorICAgICAgICAgICAgaWYgKCBtRXh0U2V0dGluZ3MtPm1UaHJlYWRNb2RlICE9IGtNb2RlX0NsaWVudCApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5faW52YWxpZF9zZXJ2ZXJfb3B0aW9uLCBvcHRpb24gKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tTGlzdGVuUG9ydCA9IGF0b2koIG9wdGFyZyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnTSc6IC8vIHNwZWNpZnkgVENQIE1TUyAobWF4aW11bSBzZWdtZW50IHNpemUpCisgICAgICAgICAgICBTZXR0aW5nc19HZXRVcHBlckNhc2VBcmcob3B0YXJnLG91dGFyZyk7CisKKyAgICAgICAgICAgIG1FeHRTZXR0aW5ncy0+bU1TUyA9IGJ5dGVfYXRvaSggb3V0YXJnICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdOJzogLy8gc3BlY2lmeSBUQ1Agbm9kZWxheSBvcHRpb24gKGRpc2FibGUgSmFjb2Jzb24ncyBBbGdvcml0aG0pCisgICAgICAgICAgICBzZXROb0RlbGF5KCBtRXh0U2V0dGluZ3MgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ1AnOiAvLyBudW1iZXIgb2YgY2xpZW50IHRocmVhZHMKKyNpZmRlZiBIQVZFX1RIUkVBRAorICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tVGhyZWFkcyA9IGF0b2koIG9wdGFyZyApOworI2Vsc2UKKyAgICAgICAgICAgIGlmICggbUV4dFNldHRpbmdzLT5tVGhyZWFkTW9kZSAhPSBrTW9kZV9TZXJ2ZXIgKSB7CisgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCB3YXJuX2ludmFsaWRfc2luZ2xlX3RocmVhZGVkLCBvcHRpb24gKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUV4dFNldHRpbmdzLT5tVGhyZWFkcyA9IGF0b2koIG9wdGFyZyApOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgIHNldFJlbW92ZVNlcnZpY2UoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnUyc6IC8vIElQIHR5cGUtb2Ytc2VydmljZQorICAgICAgICAgICAgLy8gVE9ETyB1c2UgYSBmdW5jdGlvbiB0aGF0IHVuZGVyc3RhbmRzIGJhc2UtMgorICAgICAgICAgICAgLy8gdGhlIHplcm8gYmFzZSBoZXJlIGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5CisgICAgICAgICAgICAvLyAiMHgjIiBoZXgsICIwIyIgb2N0YWwsIGFuZCAiIyIgZGVjaW1hbCBudW1iZXJzCisgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1UT1MgPSBzdHJ0b2woIG9wdGFyZywgTlVMTCwgMCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnVCc6IC8vIHRpbWUtdG8tbGl2ZSBmb3IgbXVsdGljYXN0CisgICAgICAgICAgICBtRXh0U2V0dGluZ3MtPm1UVEwgPSBhdG9pKCBvcHRhcmcgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ1UnOiAvLyBzaW5nbGUgdGhyZWFkZWQgVURQIHNlcnZlcgorICAgICAgICAgICAgc2V0U2luZ2xlVURQKCBtRXh0U2V0dGluZ3MgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ1YnOiAvLyBJUHY2IERvbWFpbgorICAgICAgICAgICAgc2V0SVBWNiggbUV4dFNldHRpbmdzICk7CisgICAgICAgICAgICBpZiAoIG1FeHRTZXR0aW5ncy0+bVRocmVhZE1vZGUgPT0ga01vZGVfU2VydmVyIAorICAgICAgICAgICAgICAgICAmJiBtRXh0U2V0dGluZ3MtPm1Mb2NhbGhvc3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvLyBUZXN0IGZvciBNdWx0aWNhc3QKKyAgICAgICAgICAgICAgICBpcGVyZl9zb2NrYWRkciB0ZW1wOworICAgICAgICAgICAgICAgIFNvY2tBZGRyX3NldEhvc3RuYW1lKCBtRXh0U2V0dGluZ3MtPm1Mb2NhbGhvc3QsICZ0ZW1wLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoIFNvY2tBZGRyX2lzTXVsdGljYXN0KCAmdGVtcCApICkgeworICAgICAgICAgICAgICAgICAgICBzZXRNdWx0aWNhc3QoIG1FeHRTZXR0aW5ncyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG1FeHRTZXR0aW5ncy0+bVRocmVhZE1vZGUgPT0ga01vZGVfQ2xpZW50ICkgeworICAgICAgICAgICAgICAgIC8vIFRlc3QgZm9yIE11bHRpY2FzdAorICAgICAgICAgICAgICAgIGlwZXJmX3NvY2thZGRyIHRlbXA7CisgICAgICAgICAgICAgICAgU29ja0FkZHJfc2V0SG9zdG5hbWUoIG1FeHRTZXR0aW5ncy0+bUhvc3QsICZ0ZW1wLCAxICk7CisgICAgICAgICAgICAgICAgaWYgKCBTb2NrQWRkcl9pc011bHRpY2FzdCggJnRlbXAgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0TXVsdGljYXN0KCBtRXh0U2V0dGluZ3MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdXJyA6CisgICAgICAgICAgICBzZXRTdWdnZXN0V2luKCBtRXh0U2V0dGluZ3MgKTsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlRoZSAtVyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHJlbGVhc2VcbiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnWic6CisjaWZkZWYgVENQX0NPTkdFU1RJT04KKwkgICAgc2V0Q29uZ2VzdGlvbkNvbnRyb2woIG1FeHRTZXR0aW5ncyApOworCSAgICBtRXh0U2V0dGluZ3MtPm1Db25nZXN0aW9uID0gbmV3IGNoYXJbc3RybGVuKG9wdGFyZykrMV07CisJICAgIHN0cmNweSggbUV4dFNldHRpbmdzLT5tQ29uZ2VzdGlvbiwgb3B0YXJnKTsKKyNlbHNlCisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJUaGUgLVogb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBvcGVyYXRpbmcgc3lzdGVtXG4iKTsKKyNlbmRpZgorCSAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvLyBpZ25vcmUgdW5rbm93bgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfSAvLyBlbmQgSW50ZXJwcmV0CisKK3ZvaWQgU2V0dGluZ3NfR2V0VXBwZXJDYXNlQXJnKGNvbnN0IGNoYXIgKmluYXJnLCBjaGFyICpvdXRhcmcpIHsKKworICAgIGludCBsZW4gPSBzdHJsZW4oaW5hcmcpOworICAgIHN0cmNweShvdXRhcmcsaW5hcmcpOworCisgICAgaWYgKCAobGVuID4gMCkgJiYgKGluYXJnW2xlbi0xXSA+PSdhJykgCisgICAgICAgICAmJiAoaW5hcmdbbGVuLTFdIDw9ICd6JykgKQorICAgICAgICBvdXRhcmdbbGVuLTFdPSBvdXRhcmdbbGVuLTFdKydBJy0nYSc7Cit9CisKK3ZvaWQgU2V0dGluZ3NfR2V0TG93ZXJDYXNlQXJnKGNvbnN0IGNoYXIgKmluYXJnLCBjaGFyICpvdXRhcmcpIHsKKworICAgIGludCBsZW4gPSBzdHJsZW4oaW5hcmcpOworICAgIHN0cmNweShvdXRhcmcsaW5hcmcpOworCisgICAgaWYgKCAobGVuID4gMCkgJiYgKGluYXJnW2xlbi0xXSA+PSdBJykgCisgICAgICAgICAmJiAoaW5hcmdbbGVuLTFdIDw9ICdaJykgKQorICAgICAgICBvdXRhcmdbbGVuLTFdPSBvdXRhcmdbbGVuLTFdLSdBJysnYSc7Cit9CisKKy8qCisgKiBTZXR0aW5nc19HZW5lcmF0ZUxpc3RlbmVyU2V0dGluZ3MKKyAqIENhbGxlZCB0byBnZW5lcmF0ZSB0aGUgc2V0dGluZ3MgdG8gYmUgcGFzc2VkIHRvIHRoZSBMaXN0ZW5lcgorICogaW5zdGFuY2UgdGhhdCB3aWxsIGhhbmRsZSBkdWFsIHRlc3RpbmdzIGZyb20gdGhlIGNsaWVudCBzaWRlCisgKiB0aGlzIHNob3VsZCBvbmx5IHJldHVybiBhbiBpbnN0YW5jZSBpZiBpdCB3YXMgY2FsbGVkIG9uIAorICogdGhlIHRocmVhZF9TZXR0aW5ncyBpbnN0YW5jZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIAorICogZm9yIGNsaWVudCBzaWRlIGV4ZWN1dGlvbiAKKyAqLwordm9pZCBTZXR0aW5nc19HZW5lcmF0ZUxpc3RlbmVyU2V0dGluZ3MoIHRocmVhZF9TZXR0aW5ncyAqY2xpZW50LCB0aHJlYWRfU2V0dGluZ3MgKipsaXN0ZW5lciApIHsKKyAgICBpZiAoICFpc0NvbXBhdCggY2xpZW50ICkgJiYgCisgICAgICAgICAoY2xpZW50LT5tTW9kZSA9PSBrVGVzdF9EdWFsVGVzdCB8fCBjbGllbnQtPm1Nb2RlID09IGtUZXN0X1RyYWRlT2ZmKSApIHsKKyAgICAgICAgKmxpc3RlbmVyID0gbmV3IHRocmVhZF9TZXR0aW5nczsKKyAgICAgICAgbWVtY3B5KCpsaXN0ZW5lciwgY2xpZW50LCBzaXplb2YoIHRocmVhZF9TZXR0aW5ncyApKTsKKyAgICAgICAgc2V0Q29tcGF0KCAoKmxpc3RlbmVyKSApOworICAgICAgICB1bnNldERhZW1vbiggKCpsaXN0ZW5lcikgKTsKKyAgICAgICAgaWYgKCBjbGllbnQtPm1MaXN0ZW5Qb3J0ICE9IDAgKSB7CisgICAgICAgICAgICAoKmxpc3RlbmVyKS0+bVBvcnQgICA9IGNsaWVudC0+bUxpc3RlblBvcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKmxpc3RlbmVyKS0+bVBvcnQgICA9IGNsaWVudC0+bVBvcnQ7CisgICAgICAgIH0KKyAgICAgICAgKCpsaXN0ZW5lciktPm1GaWxlTmFtZSAgID0gTlVMTDsKKyAgICAgICAgKCpsaXN0ZW5lciktPm1Ib3N0ICAgICAgID0gTlVMTDsKKyAgICAgICAgKCpsaXN0ZW5lciktPm1Mb2NhbGhvc3QgID0gTlVMTDsKKyAgICAgICAgKCpsaXN0ZW5lciktPm1PdXRwdXRGaWxlTmFtZSA9IE5VTEw7CisgICAgICAgICgqbGlzdGVuZXIpLT5tTW9kZSAgICAgICA9IGtUZXN0X05vcm1hbDsKKyAgICAgICAgKCpsaXN0ZW5lciktPm1UaHJlYWRNb2RlID0ga01vZGVfTGlzdGVuZXI7CisgICAgICAgIGlmICggY2xpZW50LT5tSG9zdCAhPSBOVUxMICkgeworICAgICAgICAgICAgKCpsaXN0ZW5lciktPm1Ib3N0ID0gbmV3IGNoYXJbc3RybGVuKCBjbGllbnQtPm1Ib3N0ICkgKyAxXTsKKyAgICAgICAgICAgIHN0cmNweSggKCpsaXN0ZW5lciktPm1Ib3N0LCBjbGllbnQtPm1Ib3N0ICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBjbGllbnQtPm1Mb2NhbGhvc3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICgqbGlzdGVuZXIpLT5tTG9jYWxob3N0ID0gbmV3IGNoYXJbc3RybGVuKCBjbGllbnQtPm1Mb2NhbGhvc3QgKSArIDFdOworICAgICAgICAgICAgc3RyY3B5KCAoKmxpc3RlbmVyKS0+bUxvY2FsaG9zdCwgY2xpZW50LT5tTG9jYWxob3N0ICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqbGlzdGVuZXIgPSBOVUxMOworICAgIH0KK30KKworLyoKKyAqIFNldHRpbmdzX0dlbmVyYXRlU3BlYWtlclNldHRpbmdzCisgKiBDYWxsZWQgdG8gZ2VuZXJhdGUgdGhlIHNldHRpbmdzIHRvIGJlIHBhc3NlZCB0byB0aGUgU3BlYWtlcgorICogaW5zdGFuY2UgdGhhdCB3aWxsIGhhbmRsZSBkdWFsIHRlc3RpbmdzIGZyb20gdGhlIHNlcnZlciBzaWRlCisgKiB0aGlzIHNob3VsZCBvbmx5IHJldHVybiBhbiBpbnN0YW5jZSBpZiBpdCB3YXMgY2FsbGVkIG9uIAorICogdGhlIHRocmVhZF9TZXR0aW5ncyBpbnN0YW5jZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIAorICogZm9yIHNlcnZlciBzaWRlIGV4ZWN1dGlvbi4gVGhpcyBzaG91bGQgYmUgYW4gaW52ZXJzZSBvcGVyYXRpb24KKyAqIG9mIEdlbmVyYXRlQ2xpZW50SGRyLiAKKyAqLwordm9pZCBTZXR0aW5nc19HZW5lcmF0ZUNsaWVudFNldHRpbmdzKCB0aHJlYWRfU2V0dGluZ3MgKnNlcnZlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9TZXR0aW5ncyAqKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2hkciAqaGRyICkgeworICAgIGludCBmbGFncyA9IG50b2hsKGhkci0+ZmxhZ3MpOworICAgIGlmICggKGZsYWdzICYgSEVBREVSX1ZFUlNJT04xKSAhPSAwICkgeworICAgICAgICAqY2xpZW50ID0gbmV3IHRocmVhZF9TZXR0aW5nczsKKyAgICAgICAgbWVtY3B5KCpjbGllbnQsIHNlcnZlciwgc2l6ZW9mKCB0aHJlYWRfU2V0dGluZ3MgKSk7CisgICAgICAgIHNldENvbXBhdCggKCpjbGllbnQpICk7CisgICAgICAgICgqY2xpZW50KS0+bVRJRCA9IHRocmVhZF96ZXJvaWQoKTsKKyAgICAgICAgKCpjbGllbnQpLT5tUG9ydCAgICAgICA9ICh1bnNpZ25lZCBzaG9ydCkgbnRvaGwoaGRyLT5tUG9ydCk7CisgICAgICAgICgqY2xpZW50KS0+bVRocmVhZHMgICAgPSBudG9obChoZHItPm51bVRocmVhZHMpOworICAgICAgICBpZiAoIGhkci0+YnVmZmVybGVuICE9IDAgKSB7CisgICAgICAgICAgICAoKmNsaWVudCktPm1CdWZMZW4gPSBudG9obChoZHItPmJ1ZmZlcmxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBoZHItPm1XaW5CYW5kICE9IDAgKSB7CisgICAgICAgICAgICBpZiAoIGlzVURQKCBzZXJ2ZXIgKSApIHsKKyAgICAgICAgICAgICAgICAoKmNsaWVudCktPm1VRFBSYXRlID0gbnRvaGwoaGRyLT5tV2luQmFuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICgqY2xpZW50KS0+bVRDUFdpbiA9IG50b2hsKGhkci0+bVdpbkJhbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICgqY2xpZW50KS0+bUFtb3VudCAgICAgPSBudG9obChoZHItPm1BbW91bnQpOworICAgICAgICBpZiAoICgoKmNsaWVudCktPm1BbW91bnQgJiAweDgwMDAwMDAwKSA+IDAgKSB7CisgICAgICAgICAgICBzZXRNb2RlVGltZSggKCpjbGllbnQpICk7CisjaWZuZGVmIFdJTjMyCisgICAgICAgICAgICAoKmNsaWVudCktPm1BbW91bnQgfD0gMHhGRkZGRkZGRjAwMDAwMDAwTEw7CisjZWxzZQorICAgICAgICAgICAgKCpjbGllbnQpLT5tQW1vdW50IHw9IDB4RkZGRkZGRkYwMDAwMDAwMDsKKyNlbmRpZgorICAgICAgICAgICAgKCpjbGllbnQpLT5tQW1vdW50ID0gLSgqY2xpZW50KS0+bUFtb3VudDsKKyAgICAgICAgfQorICAgICAgICAoKmNsaWVudCktPm1GaWxlTmFtZSAgID0gTlVMTDsKKyAgICAgICAgKCpjbGllbnQpLT5tSG9zdCAgICAgICA9IE5VTEw7CisgICAgICAgICgqY2xpZW50KS0+bUxvY2FsaG9zdCAgPSBOVUxMOworICAgICAgICAoKmNsaWVudCktPm1PdXRwdXRGaWxlTmFtZSA9IE5VTEw7CisgICAgICAgICgqY2xpZW50KS0+bU1vZGUgICAgICAgPSAoKGZsYWdzICYgUlVOX05PVykgPT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0X1RyYWRlT2ZmIDoga1Rlc3RfRHVhbFRlc3QpOworICAgICAgICAoKmNsaWVudCktPm1UaHJlYWRNb2RlID0ga01vZGVfQ2xpZW50OworICAgICAgICBpZiAoIHNlcnZlci0+bUxvY2FsaG9zdCAhPSBOVUxMICkgeworICAgICAgICAgICAgKCpjbGllbnQpLT5tTG9jYWxob3N0ID0gbmV3IGNoYXJbc3RybGVuKCBzZXJ2ZXItPm1Mb2NhbGhvc3QgKSArIDFdOworICAgICAgICAgICAgc3RyY3B5KCAoKmNsaWVudCktPm1Mb2NhbGhvc3QsIHNlcnZlci0+bUxvY2FsaG9zdCApOworICAgICAgICB9CisgICAgICAgICgqY2xpZW50KS0+bUhvc3QgPSBuZXcgY2hhcltSRVBPUlRfQUREUkxFTl07CisgICAgICAgIGlmICggKChzb2NrYWRkciopJnNlcnZlci0+cGVlciktPnNhX2ZhbWlseSA9PSBBRl9JTkVUICkgeworICAgICAgICAgICAgaW5ldF9udG9wKCBBRl9JTkVULCAmKChzb2NrYWRkcl9pbiopJnNlcnZlci0+cGVlciktPnNpbl9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgKCpjbGllbnQpLT5tSG9zdCwgUkVQT1JUX0FERFJMRU4pOworICAgICAgICB9CisjaWZkZWYgSEFWRV9JUFY2CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbmV0X250b3AoIEFGX0lORVQ2LCAmKChzb2NrYWRkcl9pbjYqKSZzZXJ2ZXItPnBlZXIpLT5zaW42X2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAoKmNsaWVudCktPm1Ib3N0LCBSRVBPUlRfQUREUkxFTik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgICpjbGllbnQgPSBOVUxMOworICAgIH0KK30KKworLyoKKyAqIFNldHRpbmdzX0dlbmVyYXRlQ2xpZW50SGRyCisgKiBDYWxsZWQgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudCBoZWFkZXIgdG8gYmUgcGFzc2VkIHRvIHRoZQorICogc2VydmVyIHRoYXQgd2lsbCBoYW5kbGUgZHVhbCB0ZXN0aW5ncyBmcm9tIHRoZSBzZXJ2ZXIgc2lkZQorICogVGhpcyBzaG91bGQgYmUgYW4gaW52ZXJzZSBvcGVyYXRpb24gb2YgR2VuZXJhdGVTcGVha2VyU2V0dGluZ3MKKyAqLwordm9pZCBTZXR0aW5nc19HZW5lcmF0ZUNsaWVudEhkciggdGhyZWFkX1NldHRpbmdzICpjbGllbnQsIGNsaWVudF9oZHIgKmhkciApIHsKKyAgICBpZiAoIGNsaWVudC0+bU1vZGUgIT0ga1Rlc3RfTm9ybWFsICkgeworICAgICAgICBoZHItPmZsYWdzICA9IGh0b25sKEhFQURFUl9WRVJTSU9OMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGRyLT5mbGFncyAgPSAwOworICAgIH0KKyAgICBpZiAoIGlzQnVmbGVuU2V0KCBjbGllbnQgKSApIHsKKyAgICAgICAgaGRyLT5idWZmZXJsZW4gPSBodG9ubChjbGllbnQtPm1CdWZMZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGhkci0+YnVmZmVybGVuID0gMDsKKyAgICB9CisgICAgaWYgKCBpc1VEUCggY2xpZW50ICkgKSB7CisgICAgICAgIGhkci0+bVdpbkJhbmQgID0gaHRvbmwoY2xpZW50LT5tVURQUmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGRyLT5tV2luQmFuZCAgPSBodG9ubChjbGllbnQtPm1UQ1BXaW4pOworICAgIH0KKyAgICBpZiAoIGNsaWVudC0+bUxpc3RlblBvcnQgIT0gMCApIHsKKyAgICAgICAgaGRyLT5tUG9ydCAgPSBodG9ubChjbGllbnQtPm1MaXN0ZW5Qb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoZHItPm1Qb3J0ICA9IGh0b25sKGNsaWVudC0+bVBvcnQpOworICAgIH0KKyAgICBoZHItPm51bVRocmVhZHMgPSBodG9ubChjbGllbnQtPm1UaHJlYWRzKTsKKyAgICBpZiAoIGlzTW9kZVRpbWUoIGNsaWVudCApICkgeworICAgICAgICBoZHItPm1BbW91bnQgICAgPSBodG9ubCgtKGxvbmcpY2xpZW50LT5tQW1vdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoZHItPm1BbW91bnQgICAgPSBodG9ubCgobG9uZyljbGllbnQtPm1BbW91bnQpOworICAgICAgICBoZHItPm1BbW91bnQgJj0gaHRvbmwoIDB4N0ZGRkZGRkYgKTsKKyAgICB9CisgICAgaWYgKCBjbGllbnQtPm1Nb2RlID09IGtUZXN0X0R1YWxUZXN0ICkgeworICAgICAgICBoZHItPmZsYWdzIHw9IGh0b25sKFJVTl9OT1cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9Tb2NrZXRBZGRyLmMgYi9pcGVyZi0yLjAuNS9zcmMvU29ja2V0QWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzhiZGYKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvU29ja2V0QWRkci5jCkBAIC0wLDAgKzEsNDIyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogU29ja2V0LmNwcAorICogYnkgICAgICAgQWpheSBUaXJ1bWFsYSA8dGlydW1hbGFAbmNzYS51aXVjLmVkdT4KKyAqIGFuZCAgICAgIE1hcmsgR2F0ZXMgPG1nYXRlc0BubGFuci5uZXQ+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSEVBREVSUygpCisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisKKyNpbmNsdWRlICJTb2NrZXRBZGRyLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ3JlYXRlIGEgc29ja2V0IGFkZHJlc3MuIElmIGluSG9zdG5hbWUgaXMgbm90IG51bGwsIHJlc29sdmUgdGhhdAorICogYWRkcmVzcyBhbmQgZmlsbCBpdCBpbi4gRmlsbCBpbiB0aGUgcG9ydCBudW1iZXIuIFVzZSBJUHY2IEFERFJfQU5ZCisgKiBpZiB0aGF0IGlzIHdoYXQgaXMgZGVzaXJlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBTb2NrQWRkcl9yZW1vdGVBZGRyKCB0aHJlYWRfU2V0dGluZ3MgKmluU2V0dGluZ3MgKSB7CisgICAgU29ja0FkZHJfemVyb0FkZHJlc3MoICZpblNldHRpbmdzLT5wZWVyICk7CisgICAgaWYgKCBpblNldHRpbmdzLT5tSG9zdCAhPSBOVUxMICkgeworICAgICAgICBTb2NrQWRkcl9zZXRIb3N0bmFtZSggaW5TZXR0aW5ncy0+bUhvc3QsICZpblNldHRpbmdzLT5wZWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSVBWNiggaW5TZXR0aW5ncyApICk7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBIQVZFX0lQVjYKKyAgICAgICAgaWYgKCBpc0lQVjYoIGluU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyKikmaW5TZXR0aW5ncy0+cGVlciktPnNhX2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHIqKSZpblNldHRpbmdzLT5wZWVyKS0+c2FfZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggU29ja0FkZHJfaXNJUHY2KCAmaW5TZXR0aW5ncy0+cGVlciApICkgeworICAgICAgICBpblNldHRpbmdzLT5zaXplX3BlZXIgPSBzaXplb2YoIHN0cnVjdCBzb2NrYWRkcl9pbjYgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpblNldHRpbmdzLT5zaXplX3BlZXIgPSBzaXplb2YoIHN0cnVjdCBzb2NrYWRkcl9pbiApOworICAgIH0KKyNlbHNlCisgICAgICAgICgoc3RydWN0IHNvY2thZGRyKikmaW5TZXR0aW5ncy0+cGVlciktPnNhX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgfQorICAgIGluU2V0dGluZ3MtPnNpemVfcGVlciA9IHNpemVvZiggc3RydWN0IHNvY2thZGRyX2luICk7CisjZW5kaWYKKyAgICBTb2NrQWRkcl9zZXRQb3J0KCAmaW5TZXR0aW5ncy0+cGVlciwgaW5TZXR0aW5ncy0+bVBvcnQgKTsKK30KKy8vIGVuZCBTb2NrZXRBZGRyCisKK3ZvaWQgU29ja0FkZHJfbG9jYWxBZGRyKCB0aHJlYWRfU2V0dGluZ3MgKmluU2V0dGluZ3MgKSB7CisgICAgU29ja0FkZHJfemVyb0FkZHJlc3MoICZpblNldHRpbmdzLT5sb2NhbCApOworICAgIGlmICggaW5TZXR0aW5ncy0+bUxvY2FsaG9zdCAhPSBOVUxMICkgeworICAgICAgICBTb2NrQWRkcl9zZXRIb3N0bmFtZSggaW5TZXR0aW5ncy0+bUxvY2FsaG9zdCwgJmluU2V0dGluZ3MtPmxvY2FsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSVBWNiggaW5TZXR0aW5ncyApICk7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBIQVZFX0lQVjYKKyAgICAgICAgaWYgKCBpc0lQVjYoIGluU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyKikmaW5TZXR0aW5ncy0+bG9jYWwpLT5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyKikmaW5TZXR0aW5ncy0+bG9jYWwpLT5zYV9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBTb2NrQWRkcl9pc0lQdjYoICZpblNldHRpbmdzLT5sb2NhbCApICkgeworICAgICAgICBpblNldHRpbmdzLT5zaXplX2xvY2FsID0gc2l6ZW9mKCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5TZXR0aW5ncy0+c2l6ZV9sb2NhbCA9IHNpemVvZiggc3RydWN0IHNvY2thZGRyX2luICk7CisgICAgfQorI2Vsc2UKKyAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHIqKSZpblNldHRpbmdzLT5sb2NhbCktPnNhX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgfQorICAgICAgICBpblNldHRpbmdzLT5zaXplX2xvY2FsID0gc2l6ZW9mKCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKTsKKyNlbmRpZgorICAgIFNvY2tBZGRyX3NldFBvcnQoICZpblNldHRpbmdzLT5sb2NhbCwgaW5TZXR0aW5ncy0+bVBvcnQgKTsKK30KKy8vIGVuZCBTb2NrZXRBZGRyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlc29sdmUgdGhlIGhvc3RuYW1lIGFkZHJlc3MgYW5kIGZpbGwgaXQgaW4uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgU29ja0FkZHJfc2V0SG9zdG5hbWUoIGNvbnN0IGNoYXIqIGluSG9zdG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBlcmZfc29ja2FkZHIgKmluU29ja0FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzSVB2NiApIHsKKworICAgIC8vIC4uSSB0aGluayB0aGlzIHdvcmtzIGZvciBib3RoIGlwdjYgJiBpcHY0Li4uIHdlJ2xsIHNlZQorI2lmIGRlZmluZWQoSEFWRV9JUFY2KQorICAgIHsKKyAgICAgICAgc3RydWN0IGFkZHJpbmZvICpyZXMsICppdHI7CisgICAgICAgIGludCByZXRfZ2E7CisKKyAgICAgICAgcmV0X2dhID0gZ2V0YWRkcmluZm8oaW5Ib3N0bmFtZSwgTlVMTCwgTlVMTCwgJnJlcyk7CisgICAgICAgIGlmICggcmV0X2dhICkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXNcbiIsIGdhaV9zdHJlcnJvcihyZXRfZ2EpKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhcmVzLT5haV9hZGRyICkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRhZGRyaW5mbyBmYWlsZWQgdG8gZ2V0IGFuIGFkZHJlc3MuLi4gdGFyZ2V0IHdhcyAnJXMnXG4iLCBpbkhvc3RuYW1lKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBhZGRyZXNzIHR5cGUgYmVmb3JlIGZpbGxpbmcgaW4gdGhlIGFkZHJlc3MKKyAgICAgICAgLy8gYWlfZmFtaWx5ID0gUEZfeHh4OyBhaV9wcm90b2NvbCA9IElQUFJPVE9feHh4LCBzZWUgbmV0ZGIuaAorICAgICAgICAvLyAuLi5idXQgQUZfSU5FVDYgPT0gUEZfSU5FVDYKKyAgICAgICAgaXRyID0gcmVzOworICAgICAgICBpZiAoIGlzSVB2NiApIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGFsbCByZXN1bHRzIGZvciBhIElQdjYgQWRkcmVzcworICAgICAgICAgICAgd2hpbGUgKCBpdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0ci0+YWlfZmFtaWx5ID09IEFGX0lORVQ2ICkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaW5Tb2NrQWRkciwgKGl0ci0+YWlfYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRyLT5haV9hZGRybGVuKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaXRyID0gaXRyLT5haV9uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdHIgPSByZXM7CisgICAgICAgIC8vIE5vdyBmaW5kIGEgSVB2NCBBZGRyZXNzCisgICAgICAgIHdoaWxlICggaXRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBpZiAoIGl0ci0+YWlfZmFtaWx5ID09IEFGX0lORVQgKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGluU29ja0FkZHIsIChpdHItPmFpX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAoaXRyLT5haV9hZGRybGVuKSk7CisgICAgICAgICAgICAgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdHIgPSBpdHItPmFpX25leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIC8vIGZpcnN0IHRyeSBqdXN0IGNvbnZlcnRpbmcgZG90dGVkIGRlY2ltYWwKKyAgICAvLyBvbiBXaW5kb3dzIGdldGhvc3RieW5hbWUgZG9lc24ndCB1bmRlcnN0YW5kIGRvdHRlZCBkZWNpbWFsCisgICAgaW50IHJjID0gaW5ldF9wdG9uKCBBRl9JTkVULCBpbkhvc3RuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikmKCgoc3RydWN0IHNvY2thZGRyX2luKilpblNvY2tBZGRyKS0+c2luX2FkZHIpICk7CisgICAgaW5Tb2NrQWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaG9zdFAgPSBnZXRob3N0YnluYW1lKCBpbkhvc3RuYW1lICk7CisgICAgICAgIGlmICggaG9zdFAgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIHNhbWUgYXMgaGVycm9yKCkgYnV0IHdvcmtzIG9uIG1vcmUgc3lzdGVtcyAqLworICAgICAgICAgICAgY29uc3QgY2hhciogZm9ybWF0OworICAgICAgICAgICAgc3dpdGNoICggaF9lcnJubyApIHsKKyAgICAgICAgICAgICAgICBjYXNlIEhPU1RfTk9UX0ZPVU5EOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiJXM6IFVua25vd24gaG9zdFxuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBOT19BRERSRVNTOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiJXM6IE5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIG5hbWVcbiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTk9fUkVDT1ZFUlk6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIlczogVW5rbm93biBzZXJ2ZXIgZXJyb3JcbiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVFJZX0FHQUlOOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiJXM6IEhvc3QgbmFtZSBsb29rdXAgZmFpbHVyZVxuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiJXM6IFVua25vd24gcmVzb2x2ZXIgZXJyb3JcbiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCBmb3JtYXQsIGluSG9zdG5hbWUgKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisKKyAgICAgICAgICAgIHJldHVybjsgLy8gVE9ETyB0aHJvdworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKWluU29ja0FkZHIpLT5zaW5fYWRkciksICooaG9zdFAtPmhfYWRkcl9saXN0KSwKKyAgICAgICAgICAgICAgIChob3N0UC0+aF9sZW5ndGgpKTsKKyAgICB9CisjZW5kaWYKK30KKy8vIGVuZCBzZXRIb3N0bmFtZQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5IHRoZSBJUCBhZGRyZXNzIGludG8gdGhlIHN0cmluZy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgU29ja0FkZHJfZ2V0SG9zdEFkZHJlc3MoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyLCBjaGFyKiBvdXRBZGRyZXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiApIHsKKyAgICBpZiAoICgoc3RydWN0IHNvY2thZGRyKilpblNvY2tBZGRyKS0+c2FfZmFtaWx5ID09IEFGX0lORVQgKSB7CisgICAgICAgIGluZXRfbnRvcCggQUZfSU5FVCwgJigoKHN0cnVjdCBzb2NrYWRkcl9pbiopIGluU29ja0FkZHIpLT5zaW5fYWRkciksIAorICAgICAgICAgICAgICAgICAgIG91dEFkZHJlc3MsIGxlbik7CisgICAgfQorI2lmZGVmIEhBVkVfSVBWNgorICAgIGVsc2UgeworICAgICAgICBpbmV0X250b3AoIEFGX0lORVQ2LCAmKCgoc3RydWN0IHNvY2thZGRyX2luNiopIGluU29ja0FkZHIpLT5zaW42X2FkZHIpLCAKKyAgICAgICAgICAgICAgICAgICBvdXRBZGRyZXNzLCBsZW4pOworICAgIH0KKyNlbmRpZgorfQorLy8gZW5kIGdldEhvc3RBZGRyZXNzCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldCB0aGUgYWRkcmVzcyB0byBhbnkgKGdlbmVyYWxseSBhbGwgemVyb3MpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIFNvY2tBZGRyX3NldEFkZHJlc3NBbnkoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICkgeworICAgIGlmICggKChzdHJ1Y3Qgc29ja2FkZHIqKWluU29ja0FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCApCisgICAgICAgIG1lbXNldCggJigoKHN0cnVjdCBzb2NrYWRkcl9pbiopIGluU29ja0FkZHIpLT5zaW5fYWRkciksIDAsIAorICAgICAgICAgICAgICAgIHNpemVvZiggc3RydWN0IGluX2FkZHIgKSk7CisjaWYgZGVmaW5lZChIQVZFX0lQVjYpICAKKyAgICBlbHNlCisgICAgICAgIG1lbXNldCggJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSBpblNvY2tBZGRyKS0+c2luNl9hZGRyKSwgMCwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKCBzdHJ1Y3QgaW42X2FkZHIgKSk7CisjZW5kaWYKK30KKy8vIGVuZCBzZXRBZGRyZXNzQW55CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldCB0aGUgcG9ydCB0byB0aGUgZ2l2ZW4gcG9ydC4gSGFuZGxlcyB0aGUgYnl0ZSBzd2FwcGluZy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBTb2NrQWRkcl9zZXRQb3J0KCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciwgdW5zaWduZWQgc2hvcnQgaW5Qb3J0ICkgeworICAgIGlmICggKChzdHJ1Y3Qgc29ja2FkZHIqKWluU29ja0FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCApCisgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luKikgaW5Tb2NrQWRkciktPnNpbl9wb3J0ID0gaHRvbnMoIGluUG9ydCApOworI2lmIGRlZmluZWQoSEFWRV9JUFY2KSAgCisgICAgZWxzZQorICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSBpblNvY2tBZGRyKS0+c2luNl9wb3J0ID0gaHRvbnMoIGluUG9ydCApOworI2VuZGlmCisKK30KKy8vIGVuZCBzZXRQb3J0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldCB0aGUgcG9ydCB0byB6ZXJvLCB3aGljaCBsZXRzIHRoZSBPUyBwaWNrIHRoZSBwb3J0LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIFNvY2tBZGRyX3NldFBvcnRBbnkoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICkgeworICAgIFNvY2tBZGRyX3NldFBvcnQoIGluU29ja0FkZHIsIDAgKTsKK30KKy8vIGVuZCBzZXRQb3J0QW55CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldHVybiB0aGUgcG9ydC4gSGFuZGxlcyB0aGUgYnl0ZSBzd2FwcGluZy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordW5zaWduZWQgc2hvcnQgU29ja0FkZHJfZ2V0UG9ydCggaXBlcmZfc29ja2FkZHIgKmluU29ja0FkZHIgKSB7CisgICAgaWYgKCAoKHN0cnVjdCBzb2NrYWRkciopaW5Tb2NrQWRkciktPnNhX2ZhbWlseSA9PSBBRl9JTkVUICkKKyAgICAgICAgcmV0dXJuIG50b2hzKCAoKHN0cnVjdCBzb2NrYWRkcl9pbiopIGluU29ja0FkZHIpLT5zaW5fcG9ydCApOworI2lmIGRlZmluZWQoSEFWRV9JUFY2KQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG50b2hzKCAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSBpblNvY2tBZGRyKS0+c2luNl9wb3J0KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworCit9CisvLyBlbmQgZ2V0UG9ydAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXR1cm4gdGhlIElQdjQgSW50ZXJuZXQgQWRkcmVzcyBmcm9tIHRoZSBzb2NrYWRkcl9pbiBzdHJ1Y3R1cmUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGluX2FkZHIqIFNvY2tBZGRyX2dldF9pbl9hZGRyKCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciApIHsKKyAgICBpZiAoICgoc3RydWN0IHNvY2thZGRyKilpblNvY2tBZGRyKS0+c2FfZmFtaWx5ID09IEFGX0lORVQgKQorICAgICAgICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbiopIGluU29ja0FkZHIpLT5zaW5fYWRkcik7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZBVEFMOiBnZXRfaW5fYWRkciBjYWxsZWQgb24gSVB2NiBhZGRyZXNzXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV0dXJuIHRoZSBJUHY2IEludGVybmV0IEFkZHJlc3MgZnJvbSB0aGUgc29ja2FkZHJfaW42IHN0cnVjdHVyZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIEhBVkVfSVBWNgorc3RydWN0IGluNl9hZGRyKiBTb2NrQWRkcl9nZXRfaW42X2FkZHIoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICkgeworICAgIGlmICggKChzdHJ1Y3Qgc29ja2FkZHIqKWluU29ja0FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYgKQorICAgICAgICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSBpblNvY2tBZGRyKS0+c2luNl9hZGRyKTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiRkFUQUw6IGdldF9pbjZfYWRkciBjYWxsZWQgb24gSVB2NCBhZGRyZXNzXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXBwcm9wcmlhdGUgYWRkcmVzcyBzdHJ1Y3R1cmUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1NvY2tsZW5fdCBTb2NrQWRkcl9nZXRfc2l6ZW9mX3NvY2thZGRyKCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciApIHsKKworI2lmIGRlZmluZWQoSEFWRV9JUFY2KQorICAgIGlmICggKChzdHJ1Y3Qgc29ja2FkZHIqKWluU29ja0FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYgKSB7CisgICAgICAgIHJldHVybihzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybihzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Cit9CisvLyBlbmQgZ2V0X3NpemVvZl9zb2NrYWRkcgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldHVybiBpZiBJUHY2IHNvY2tldAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgU29ja0FkZHJfaXNJUHY2KCBpcGVyZl9zb2NrYWRkciAqaW5Tb2NrQWRkciApIHsKKworI2lmIGRlZmluZWQoSEFWRV9JUFY2KQorICAgIGlmICggKChzdHJ1Y3Qgc29ja2FkZHIqKWluU29ja0FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYgKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorLy8gZW5kIGdldF9zaXplb2Zfc29ja2FkZHIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBJUHY0IG11bHRpY2FzdCBhZGRyZXNzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgU29ja0FkZHJfaXNNdWx0aWNhc3QoIGlwZXJmX3NvY2thZGRyICppblNvY2tBZGRyICkgeworCisjaWYgZGVmaW5lZChIQVZFX0lQVjYpCisgICAgaWYgKCAoKHN0cnVjdCBzb2NrYWRkciopaW5Tb2NrQWRkciktPnNhX2ZhbWlseSA9PSBBRl9JTkVUNiApIHsKKyAgICAgICAgcmV0dXJuKCBJTjZfSVNfQUREUl9NVUxUSUNBU1QoJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSBpblNvY2tBZGRyKS0+c2luNl9hZGRyKSApKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgLy8gMjI0LjAuMC4wIHRvIDIzOS4yNTUuMjU1LjI1NSAoZTAuMDAuMDAuMDAgdG8gZWYuZmYuZmYuZmYpCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcga011bHRpY2FzdF9NYXNrID0gMHhlMDAwMDAwMEw7CisKKyAgICAgICAgcmV0dXJuKGtNdWx0aWNhc3RfTWFzayA9PQorICAgICAgICAgICAgICAgKG50b2hsKCAoKHN0cnVjdCBzb2NrYWRkcl9pbiopIGluU29ja0FkZHIpLT5zaW5fYWRkci5zX2FkZHIpICYga011bHRpY2FzdF9NYXNrKSk7CisgICAgfQorfQorLy8gZW5kIGlzTXVsdGljYXN0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFplcm8gb3V0IHRoZSBhZGRyZXNzIHN0cnVjdHVyZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBTb2NrQWRkcl96ZXJvQWRkcmVzcyggaXBlcmZfc29ja2FkZHIgKmluU29ja0FkZHIgKSB7CisgICAgbWVtc2V0KCBpblNvY2tBZGRyLCAwLCBzaXplb2YoIGlwZXJmX3NvY2thZGRyICkpOworfQorLy8gemVyb0FkZHJlc3MKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29tcGFyZSB0d28gc29ja2FkZHJzIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZSBlcXVhbAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IFNvY2tBZGRyX2FyZV9FcXVhbCggc3RydWN0IHNvY2thZGRyKiBmaXJzdCwgc3RydWN0IHNvY2thZGRyKiBzZWNvbmQgKSB7CisgICAgaWYgKCBmaXJzdC0+c2FfZmFtaWx5ID09IEFGX0lORVQgJiYgc2Vjb25kLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCApIHsKKyAgICAgICAgLy8gY29tcGFyZSBJUHY0IGFkcmVzc2VzCisgICAgICAgIHJldHVybiggKChsb25nKSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopZmlyc3QpLT5zaW5fYWRkci5zX2FkZHIgPT0gKGxvbmcpICgoc3RydWN0IHNvY2thZGRyX2luKilzZWNvbmQpLT5zaW5fYWRkci5zX2FkZHIpCisgICAgICAgICAgICAgICAgJiYgKCAoKHN0cnVjdCBzb2NrYWRkcl9pbiopZmlyc3QpLT5zaW5fcG9ydCA9PSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopc2Vjb25kKS0+c2luX3BvcnQpICk7CisgICAgfQorI2lmIGRlZmluZWQoSEFWRV9JUFY2KSAgICAgIAorICAgIGlmICggZmlyc3QtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBzZWNvbmQtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNiApIHsKKyAgICAgICAgLy8gY29tcGFyZSBJUHY2IGFkZHJlc3NlcworICAgICAgICByZXR1cm4oICFtZW1jbXAoKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilmaXJzdCktPnNpbjZfYWRkci5zNl9hZGRyLCAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNlY29uZCktPnNpbjZfYWRkci5zNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgCisgICAgICAgICAgICAgICAgJiYgKCgoc3RydWN0IHNvY2thZGRyX2luNiopZmlyc3QpLT5zaW42X3BvcnQgPT0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilzZWNvbmQpLT5zaW42X3BvcnQpICk7CisgICAgfQorI2VuZGlmIAorICAgIHJldHVybiAwOworCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbXBhcmUgdHdvIHNvY2thZGRycyBhbmQgcmV0dXJuIHRydWUgaWYgdGhlIGhvc3RzIGFyZSBlcXVhbAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IFNvY2tBZGRyX0hvc3RhcmVfRXF1YWwoIHN0cnVjdCBzb2NrYWRkciogZmlyc3QsIHN0cnVjdCBzb2NrYWRkciogc2Vjb25kICkgeworICAgIGlmICggZmlyc3QtPnNhX2ZhbWlseSA9PSBBRl9JTkVUICYmIHNlY29uZC0+c2FfZmFtaWx5ID09IEFGX0lORVQgKSB7CisgICAgICAgIC8vIGNvbXBhcmUgSVB2NCBhZHJlc3NlcworICAgICAgICByZXR1cm4oIChsb25nKSAoKHN0cnVjdCBzb2NrYWRkcl9pbiopZmlyc3QpLT5zaW5fYWRkci5zX2FkZHIgPT0gCisgICAgICAgICAgICAgICAgKGxvbmcpICgoc3RydWN0IHNvY2thZGRyX2luKilzZWNvbmQpLT5zaW5fYWRkci5zX2FkZHIpOworICAgIH0KKyNpZiBkZWZpbmVkKEhBVkVfSVBWNikgICAgICAKKyAgICBpZiAoIGZpcnN0LT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgc2Vjb25kLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYgKSB7CisgICAgICAgIC8vIGNvbXBhcmUgSVB2NiBhZGRyZXNzZXMKKyAgICAgICAgcmV0dXJuKCAhbWVtY21wKCgoc3RydWN0IHNvY2thZGRyX2luNiopZmlyc3QpLT5zaW42X2FkZHIuczZfYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNlY29uZCktPnNpbjZfYWRkci5zNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkpOworICAgIH0KKyNlbmRpZiAKKyAgICByZXR1cm4gMDsKKworfQorI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9nbnVfZ2V0b3B0LmMgYi9pcGVyZi0yLjAuNS9zcmMvZ251X2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDdlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvZ251X2dldG9wdC5jCkBAIC0wLDAgKzEsODE4IEBACisvKiBHZXRvcHQgZm9yIEdOVS4KKyAgIE5PVEU6IGdudV9nZXRvcHQgaXMgbm93IHBhcnQgb2YgdGhlIEMgbGlicmFyeSwgc28gaWYgeW91IGRvbid0IGtub3cgd2hhdAorICAgIktlZXAgdGhpcyBmaWxlIG5hbWUtc3BhY2UgY2xlYW4iIG1lYW5zLCB0YWxrIHRvIHJvbGFuZEBnbnUuYWkubWl0LmVkdQorICAgYmVmb3JlIGNoYW5naW5nIGl0IQorCisgICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuICBJdHMgbWFzdGVyIHNvdXJjZSBpcyBOT1QgcGFydCBvZgorICAgdGhlIEMgbGlicmFyeSwgaG93ZXZlci4gIFRoZSBtYXN0ZXIgc291cmNlIGxpdmVzIGluIC9nZC9nbnUvbGliLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIG1vZGlmaWVkIEp1bHkgOSwgMTk5OSBieSBtYXJrIGdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogICAgICAgICAgRGVjIDE3LCAxOTk5CisgKgorICogcmVuYW1lZCBhbGwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYnkgcHJlcGVuZGluZyAiZ251XyIKKyAqIHJlbW92ZWQvcmVkaWQgYSBidW5jaCBvZiBzdHVmZiB1bmRlciB0aGUgYXNzdW1wdGlvbiB3ZSdyZQorICogICB1c2luZyBhIG1vZGVybiBzdGFuZGFyZCBDIGNvbXBpbGVyLgorICogYWRkICNpbmNsdWRlIDxzdHJpbmcuaD4gaGVyZSBmb3Igc3RybmNtcCgpLiBPcmlnaW5hbGx5CisgKiAgIGl0IHdhcyBpbmNsdWRlZCBvbmx5IHVuZGVyIHNwZWNpYWwgY29uZGl0aW9ucy4KKyAqCisgKiAkSWQ6IGdudV9nZXRvcHQuYyx2IDEuMS4xLjEgMjAwNC8wNS8xOCAwMTo1MDo0NCBrZ2liYnMgRXhwICQKKyAqLworCisMCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmbmRlZiBfTVNDX1ZFUiAvKiBWaXN1YWwgQysrIGRvZXNuJ3QgaGF2ZSB1bmlzdGQuaCAqLworICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZuZGVmIF8KKy8qIFRoaXMgaXMgZm9yIG90aGVyIEdOVSBkaXN0cmlidXRpb25zIHdpdGggaW50ZXJuYXRpb25hbGl6ZWQgbWVzc2FnZXMuCisgICBXaGVuIGNvbXBpbGluZyBsaWJjLCB0aGUgXyBtYWNybyBpcyBwcmVkZWZpbmVkLiAgKi8KKyAgICAjaWZkZWYgSEFWRV9MSUJJTlRMX0gKKyAgICAgICAgI2luY2x1ZGUgPGxpYmludGwuaD4KKyAgICAgICAgI2RlZmluZSBfKG1zZ2lkKQlnZXR0ZXh0IChtc2dpZCkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIF8obXNnaWQpCShtc2dpZCkKKyAgICAjZW5kaWYKKyNlbmRpZgorCisvKiBUaGlzIHZlcnNpb24gb2YgYGdudV9nZXRvcHQnIGFwcGVhcnMgdG8gdGhlIGNhbGxlciBsaWtlIHN0YW5kYXJkCisgICBVbml4IGBnZXRvcHQnIGJ1dCBpdCBiZWhhdmVzIGRpZmZlcmVudGx5IGZvciB0aGUgdXNlciwgc2luY2UgaXQKKyAgIGFsbG93cyB0aGUgdXNlciB0byBpbnRlcnNwZXJzZSB0aGUgb3B0aW9ucyB3aXRoIHRoZSBvdGhlcgorICAgYXJndW1lbnRzLgorCisgICBBcyBgZ251X2dldG9wdCcgd29ya3MsIGl0IHBlcm11dGVzIHRoZSBlbGVtZW50cyBvZiBBUkdWIHNvIHRoYXQsCisgICB3aGVuIGl0IGlzIGRvbmUsIGFsbCB0aGUgb3B0aW9ucyBwcmVjZWRlIGV2ZXJ5dGhpbmcgZWxzZS4gIFRodXMKKyAgIGFsbCBhcHBsaWNhdGlvbiBwcm9ncmFtcyBhcmUgZXh0ZW5kZWQgdG8gaGFuZGxlIGZsZXhpYmxlIGFyZ3VtZW50IG9yZGVyLgorCisgICBTZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQT1NJWExZX0NPUlJFQ1QgZGlzYWJsZXMgcGVybXV0YXRpb24uCisgICBUaGVuIHRoZSBiZWhhdmlvciBpcyBjb21wbGV0ZWx5IHN0YW5kYXJkLgorCisgICBHTlUgYXBwbGljYXRpb24gcHJvZ3JhbXMgY2FuIHVzZSBhIHRoaXJkIGFsdGVybmF0aXZlIG1vZGUgaW4gd2hpY2gKKyAgIHRoZXkgY2FuIGRpc3Rpbmd1aXNoIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBvcHRpb25zIGFuZCBvdGhlciBhcmd1bWVudHMuICAqLworCisjaW5jbHVkZSAiZ251X2dldG9wdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEZvciBjb21tdW5pY2F0aW9uIGZyb20gYGdudV9nZXRvcHQnIHRvIHRoZSBjYWxsZXIuCisgICBXaGVuIGBnbnVfZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKKyAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgorICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKKyAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCisKK2NoYXIgKmdudV9vcHRhcmcgPSBOVUxMOworCisvKiBJbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgc2Nhbm5lZC4KKyAgIFRoaXMgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB0byBhbmQgZnJvbSB0aGUgY2FsbGVyCisgICBhbmQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzIHRvIGBnbnVfZ2V0b3B0Jy4KKworICAgT24gZW50cnkgdG8gYGdudV9nZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCisKKyAgIFdoZW4gYGdudV9nZXRvcHQnIHJldHVybnMgLTEsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvZiB0aGUKKyAgIG5vbi1vcHRpb24gZWxlbWVudHMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBpdHNlbGYgc2Nhbi4KKworICAgT3RoZXJ3aXNlLCBgZ251X29wdGluZCcgY29tbXVuaWNhdGVzIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQKKyAgIGhvdyBtdWNoIG9mIEFSR1YgaGFzIGJlZW4gc2Nhbm5lZCBzbyBmYXIuICAqLworCisvKiAxMDAzLjIgc2F5cyB0aGlzIG11c3QgYmUgMSBiZWZvcmUgYW55IGNhbGwuICAqLworaW50IGdudV9vcHRpbmQgPSAxOworCisvKiBGb3JtZXJseSwgaW5pdGlhbGl6YXRpb24gb2YgZ251X2dldG9wdCBkZXBlbmRlZCBvbiBnbnVfb3B0aW5kPT0wLCB3aGljaAorICAgY2F1c2VzIHByb2JsZW1zIHdpdGggcmUtY2FsbGluZyBnbnVfZ2V0b3B0IGFzIHByb2dyYW1zIGdlbmVyYWxseSBkb24ndAorICAga25vdyB0aGF0LiAqLworCitpbnQgX19nbnVfZ2V0b3B0X2luaXRpYWxpemVkID0gMDsKKworLyogVGhlIG5leHQgY2hhciB0byBiZSBzY2FubmVkIGluIHRoZSBvcHRpb24tZWxlbWVudAorICAgaW4gd2hpY2ggdGhlIGxhc3Qgb3B0aW9uIGNoYXJhY3RlciB3ZSByZXR1cm5lZCB3YXMgZm91bmQuCisgICBUaGlzIGFsbG93cyB1cyB0byBwaWNrIHVwIHRoZSBzY2FuIHdoZXJlIHdlIGxlZnQgb2ZmLgorCisgICBJZiB0aGlzIGlzIHplcm8sIG9yIGEgbnVsbCBzdHJpbmcsIGl0IG1lYW5zIHJlc3VtZSB0aGUgc2NhbgorICAgYnkgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IEFSR1YtZWxlbWVudC4gICovCisKK3N0YXRpYyBjaGFyICpuZXh0Y2hhcjsKKworLyogQ2FsbGVycyBzdG9yZSB6ZXJvIGhlcmUgdG8gaW5oaWJpdCB0aGUgZXJyb3IgbWVzc2FnZQorICAgZm9yIHVucmVjb2duaXplZCBvcHRpb25zLiAgKi8KKworaW50IGdudV9vcHRlcnIgPSAxOworCisvKiBTZXQgdG8gYW4gb3B0aW9uIGNoYXJhY3RlciB3aGljaCB3YXMgdW5yZWNvZ25pemVkLgorICAgVGhpcyBtdXN0IGJlIGluaXRpYWxpemVkIG9uIHNvbWUgc3lzdGVtcyB0byBhdm9pZCBsaW5raW5nIGluIHRoZQorICAgc3lzdGVtJ3Mgb3duIGdudV9nZXRvcHQgaW1wbGVtZW50YXRpb24uICAqLworCitpbnQgZ251X29wdG9wdCA9ICc/JzsKKworLyogRGVzY3JpYmUgaG93IHRvIGRlYWwgd2l0aCBvcHRpb25zIHRoYXQgZm9sbG93IG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cy4KKworICAgSWYgdGhlIGNhbGxlciBkaWQgbm90IHNwZWNpZnkgYW55dGhpbmcsCisgICB0aGUgZGVmYXVsdCBpcyBSRVFVSVJFX09SREVSIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgUE9TSVhMWV9DT1JSRUNUIGlzIGRlZmluZWQsIFBFUk1VVEUgb3RoZXJ3aXNlLgorCisgICBSRVFVSVJFX09SREVSIG1lYW5zIGRvbid0IHJlY29nbml6ZSB0aGVtIGFzIG9wdGlvbnM7CisgICBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nIHdoZW4gdGhlIGZpcnN0IG5vbi1vcHRpb24gaXMgc2Vlbi4KKyAgIFRoaXMgaXMgd2hhdCBVbml4IGRvZXMuCisgICBUaGlzIG1vZGUgb2Ygb3BlcmF0aW9uIGlzIHNlbGVjdGVkIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAorICAgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNULCBvciB1c2luZyBgKycgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9uIGNoYXJhY3RlcnMuCisKKyAgIFBFUk1VVEUgaXMgdGhlIGRlZmF1bHQuICBXZSBwZXJtdXRlIHRoZSBjb250ZW50cyBvZiBBUkdWIGFzIHdlIHNjYW4sCisgICBzbyB0aGF0IGV2ZW50dWFsbHkgYWxsIHRoZSBub24tb3B0aW9ucyBhcmUgYXQgdGhlIGVuZC4gIFRoaXMgYWxsb3dzIG9wdGlvbnMKKyAgIHRvIGJlIGdpdmVuIGluIGFueSBvcmRlciwgZXZlbiB3aXRoIHByb2dyYW1zIHRoYXQgd2VyZSBub3Qgd3JpdHRlbiB0bworICAgZXhwZWN0IHRoaXMuCisKKyAgIFJFVFVSTl9JTl9PUkRFUiBpcyBhbiBvcHRpb24gYXZhaWxhYmxlIHRvIHByb2dyYW1zIHRoYXQgd2VyZSB3cml0dGVuCisgICB0byBleHBlY3Qgb3B0aW9ucyBhbmQgb3RoZXIgQVJHVi1lbGVtZW50cyBpbiBhbnkgb3JkZXIgYW5kIHRoYXQgY2FyZSBhYm91dAorICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50CisgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLgorICAgVXNpbmcgYC0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9uIGNoYXJhY3RlcnMKKyAgIHNlbGVjdHMgdGhpcyBtb2RlIG9mIG9wZXJhdGlvbi4KKworICAgVGhlIHNwZWNpYWwgYXJndW1lbnQgYC0tJyBmb3JjZXMgYW4gZW5kIG9mIG9wdGlvbi1zY2FubmluZyByZWdhcmRsZXNzCisgICBvZiB0aGUgdmFsdWUgb2YgYG9yZGVyaW5nJy4gIEluIHRoZSBjYXNlIG9mIFJFVFVSTl9JTl9PUkRFUiwgb25seQorICAgYC0tJyBjYW4gY2F1c2UgYGdudV9nZXRvcHQnIHRvIHJldHVybiAtMSB3aXRoIGBnbnVfb3B0aW5kJyAhPSBBUkdDLiAgKi8KKworc3RhdGljIGVudW0geworICAgIFJFUVVJUkVfT1JERVIsIFBFUk1VVEUsIFJFVFVSTl9JTl9PUkRFUgorfSBvcmRlcmluZzsKKworLyogVmFsdWUgb2YgUE9TSVhMWV9DT1JSRUNUIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KK3N0YXRpYyBjaGFyICpwb3NpeGx5X2NvcnJlY3Q7CisMCisKKy8qIEF2b2lkIGRlcGVuZGluZyBvbiBsaWJyYXJ5IGZ1bmN0aW9ucyBvciBmaWxlcworICAgd2hvc2UgbmFtZXMgYXJlIGluY29uc2lzdGVudC4gICovCisKK3N0YXRpYyBjaGFyICoKK215X2luZGV4KCBjb25zdCBjaGFyKiBzdHIsIGludCBjaHIgKSB7CisgICAgd2hpbGUgKCAqc3RyICkgeworICAgICAgICBpZiAoICpzdHIgPT0gY2hyICkKKyAgICAgICAgICAgIHJldHVybihjaGFyICopIHN0cjsKKyAgICAgICAgc3RyKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisMCisvKiBIYW5kbGUgcGVybXV0YXRpb24gb2YgYXJndW1lbnRzLiAgKi8KKworLyogRGVzY3JpYmUgdGhlIHBhcnQgb2YgQVJHViB0aGF0IGNvbnRhaW5zIG5vbi1vcHRpb25zIHRoYXQgaGF2ZQorICAgYmVlbiBza2lwcGVkLiAgYGZpcnN0X25vbm9wdCcgaXMgdGhlIGluZGV4IGluIEFSR1Ygb2YgdGhlIGZpcnN0IG9mIHRoZW07CisgICBgbGFzdF9ub25vcHQnIGlzIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBvZiB0aGVtLiAgKi8KKworc3RhdGljIGludCBmaXJzdF9ub25vcHQ7CitzdGF0aWMgaW50IGxhc3Rfbm9ub3B0OworCisvKiBFeGNoYW5nZSB0d28gYWRqYWNlbnQgc3Vic2VxdWVuY2VzIG9mIEFSR1YuCisgICBPbmUgc3Vic2VxdWVuY2UgaXMgZWxlbWVudHMgW2ZpcnN0X25vbm9wdCxsYXN0X25vbm9wdCkKKyAgIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgbm9uLW9wdGlvbnMgdGhhdCBoYXZlIGJlZW4gc2tpcHBlZCBzbyBmYXIuCisgICBUaGUgb3RoZXIgaXMgZWxlbWVudHMgW2xhc3Rfbm9ub3B0LGdudV9vcHRpbmQpLCB3aGljaCBjb250YWlucyBhbGwKKyAgIHRoZSBvcHRpb25zIHByb2Nlc3NlZCBzaW5jZSB0aG9zZSBub24tb3B0aW9ucyB3ZXJlIHNraXBwZWQuCisKKyAgIGBmaXJzdF9ub25vcHQnIGFuZCBgbGFzdF9ub25vcHQnIGFyZSByZWxvY2F0ZWQgc28gdGhhdCB0aGV5IGRlc2NyaWJlCisgICB0aGUgbmV3IGluZGljZXMgb2YgdGhlIG5vbi1vcHRpb25zIGluIEFSR1YgYWZ0ZXIgdGhleSBhcmUgbW92ZWQuICAqLworCitzdGF0aWMgdm9pZCBleGNoYW5nZSggY2hhciAqKmFyZ3YgKTsKKworc3RhdGljIHZvaWQKK2V4Y2hhbmdlKCBjaGFyICoqYXJndiApIHsKKyAgICBpbnQgYm90dG9tID0gZmlyc3Rfbm9ub3B0OworICAgIGludCBtaWRkbGUgPSBsYXN0X25vbm9wdDsKKyAgICBpbnQgdG9wID0gZ251X29wdGluZDsKKyAgICBjaGFyICp0ZW07CisKKyAgICAvKiBFeGNoYW5nZSB0aGUgc2hvcnRlciBzZWdtZW50IHdpdGggdGhlIGZhciBlbmQgb2YgdGhlIGxvbmdlciBzZWdtZW50LgorICAgICAgIFRoYXQgcHV0cyB0aGUgc2hvcnRlciBzZWdtZW50IGludG8gdGhlIHJpZ2h0IHBsYWNlLgorICAgICAgIEl0IGxlYXZlcyB0aGUgbG9uZ2VyIHNlZ21lbnQgaW4gdGhlIHJpZ2h0IHBsYWNlIG92ZXJhbGwsCisgICAgICAgYnV0IGl0IGNvbnNpc3RzIG9mIHR3byBwYXJ0cyB0aGF0IG5lZWQgdG8gYmUgc3dhcHBlZCBuZXh0LiAgKi8KKworICAgIHdoaWxlICggdG9wID4gbWlkZGxlICYmIG1pZGRsZSA+IGJvdHRvbSApIHsKKyAgICAgICAgaWYgKCB0b3AgLSBtaWRkbGUgPiBtaWRkbGUgLSBib3R0b20gKSB7CisgICAgICAgICAgICAvKiBCb3R0b20gc2VnbWVudCBpcyB0aGUgc2hvcnQgb25lLiAgKi8KKyAgICAgICAgICAgIGludCBsZW4gPSBtaWRkbGUgLSBib3R0b207CisgICAgICAgICAgICByZWdpc3RlciBpbnQgaTsKKworICAgICAgICAgICAgLyogU3dhcCBpdCB3aXRoIHRoZSB0b3AgcGFydCBvZiB0aGUgdG9wIHNlZ21lbnQuICAqLworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICB0ZW0gPSBhcmd2W2JvdHRvbSArIGldOworICAgICAgICAgICAgICAgIGFyZ3ZbYm90dG9tICsgaV0gPSBhcmd2W3RvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaV07CisgICAgICAgICAgICAgICAgYXJndlt0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGldID0gdGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRXhjbHVkZSB0aGUgbW92ZWQgYm90dG9tIHNlZ21lbnQgZnJvbSBmdXJ0aGVyIHN3YXBwaW5nLiAgKi8KKyAgICAgICAgICAgIHRvcCAtPSBsZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUb3Agc2VnbWVudCBpcyB0aGUgc2hvcnQgb25lLiAgKi8KKyAgICAgICAgICAgIGludCBsZW4gPSB0b3AgLSBtaWRkbGU7CisgICAgICAgICAgICByZWdpc3RlciBpbnQgaTsKKworICAgICAgICAgICAgLyogU3dhcCBpdCB3aXRoIHRoZSBib3R0b20gcGFydCBvZiB0aGUgYm90dG9tIHNlZ21lbnQuICAqLworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgICAgICAgICB0ZW0gPSBhcmd2W2JvdHRvbSArIGldOworICAgICAgICAgICAgICAgIGFyZ3ZbYm90dG9tICsgaV0gPSBhcmd2W21pZGRsZSArIGldOworICAgICAgICAgICAgICAgIGFyZ3ZbbWlkZGxlICsgaV0gPSB0ZW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFeGNsdWRlIHRoZSBtb3ZlZCB0b3Agc2VnbWVudCBmcm9tIGZ1cnRoZXIgc3dhcHBpbmcuICAqLworICAgICAgICAgICAgYm90dG9tICs9IGxlbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSByZWNvcmRzIGZvciB0aGUgc2xvdHMgdGhlIG5vbi1vcHRpb25zIG5vdyBvY2N1cHkuICAqLworCisgICAgZmlyc3Rfbm9ub3B0ICs9IChnbnVfb3B0aW5kIC0gbGFzdF9ub25vcHQpOworICAgIGxhc3Rfbm9ub3B0ID0gZ251X29wdGluZDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgZGF0YSB3aGVuIHRoZSBmaXJzdCBjYWxsIGlzIG1hZGUuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitfZ251X2dldG9wdF9pbml0aWFsaXplKCBpbnQgYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0ICogYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZyApOworCitzdGF0aWMgY29uc3QgY2hhciAqCitfZ251X2dldG9wdF9pbml0aWFsaXplKCBpbnQgYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0ICogYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZyApIHsKKyAgICAvKiBTdGFydCBwcm9jZXNzaW5nIG9wdGlvbnMgd2l0aCBBUkdWLWVsZW1lbnQgMSAoc2luY2UgQVJHVi1lbGVtZW50IDAKKyAgICAgICBpcyB0aGUgcHJvZ3JhbSBuYW1lKTsgdGhlIHNlcXVlbmNlIG9mIHByZXZpb3VzbHkgc2tpcHBlZAorICAgICAgIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cyBpcyBlbXB0eS4gICovCisKKyAgICBmaXJzdF9ub25vcHQgPSBsYXN0X25vbm9wdCA9IGdudV9vcHRpbmQgPSAxOworCisgICAgbmV4dGNoYXIgPSBOVUxMOworCisgICAgcG9zaXhseV9jb3JyZWN0ID0gZ2V0ZW52ICgiUE9TSVhMWV9DT1JSRUNUIik7CisKKyAgICAvKiBEZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0aGUgb3JkZXJpbmcgb2Ygb3B0aW9ucyBhbmQgbm9ub3B0aW9ucy4gICovCisKKyAgICBpZiAoIG9wdHN0cmluZ1swXSA9PSAnLScgKSB7CisgICAgICAgIG9yZGVyaW5nID0gUkVUVVJOX0lOX09SREVSOworICAgICAgICArK29wdHN0cmluZzsKKyAgICB9IGVsc2UgaWYgKCBvcHRzdHJpbmdbMF0gPT0gJysnICkgeworICAgICAgICBvcmRlcmluZyA9IFJFUVVJUkVfT1JERVI7CisgICAgICAgICsrb3B0c3RyaW5nOworICAgIH0gZWxzZSBpZiAoIHBvc2l4bHlfY29ycmVjdCAhPSBOVUxMICkKKyAgICAgICAgb3JkZXJpbmcgPSBSRVFVSVJFX09SREVSOworICAgIGVsc2UKKyAgICAgICAgb3JkZXJpbmcgPSBQRVJNVVRFOworCisgICAgcmV0dXJuIG9wdHN0cmluZzsKK30KKwwKKy8qIFNjYW4gZWxlbWVudHMgb2YgQVJHViAod2hvc2UgbGVuZ3RoIGlzIEFSR0MpIGZvciBvcHRpb24gY2hhcmFjdGVycworICAgZ2l2ZW4gaW4gT1BUU1RSSU5HLgorCisgICBJZiBhbiBlbGVtZW50IG9mIEFSR1Ygc3RhcnRzIHdpdGggJy0nLCBhbmQgaXMgbm90IGV4YWN0bHkgIi0iIG9yICItLSIsCisgICB0aGVuIGl0IGlzIGFuIG9wdGlvbiBlbGVtZW50LiAgVGhlIGNoYXJhY3RlcnMgb2YgdGhpcyBlbGVtZW50CisgICAoYXNpZGUgZnJvbSB0aGUgaW5pdGlhbCAnLScpIGFyZSBvcHRpb24gY2hhcmFjdGVycy4gIElmIGBnbnVfZ2V0b3B0JworICAgaXMgY2FsbGVkIHJlcGVhdGVkbHksIGl0IHJldHVybnMgc3VjY2Vzc2l2ZWx5IGVhY2ggb2YgdGhlIG9wdGlvbiBjaGFyYWN0ZXJzCisgICBmcm9tIGVhY2ggb2YgdGhlIG9wdGlvbiBlbGVtZW50cy4KKworICAgSWYgYGdudV9nZXRvcHQnIGZpbmRzIGFub3RoZXIgb3B0aW9uIGNoYXJhY3RlciwgaXQgcmV0dXJucyB0aGF0IGNoYXJhY3RlciwKKyAgIHVwZGF0aW5nIGBnbnVfb3B0aW5kJyBhbmQgYG5leHRjaGFyJyBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gYGdudV9nZXRvcHQnIGNhbgorICAgcmVzdW1lIHRoZSBzY2FuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb24gY2hhcmFjdGVyIG9yIEFSR1YtZWxlbWVudC4KKworICAgSWYgdGhlcmUgYXJlIG5vIG1vcmUgb3B0aW9uIGNoYXJhY3RlcnMsIGBnbnVfZ2V0b3B0JyByZXR1cm5zIC0xLgorICAgVGhlbiBgZ251X29wdGluZCcgaXMgdGhlIGluZGV4IGluIEFSR1Ygb2YgdGhlIGZpcnN0IEFSR1YtZWxlbWVudAorICAgdGhhdCBpcyBub3QgYW4gb3B0aW9uLiAgKFRoZSBBUkdWLWVsZW1lbnRzIGhhdmUgYmVlbiBwZXJtdXRlZAorICAgc28gdGhhdCB0aG9zZSB0aGF0IGFyZSBub3Qgb3B0aW9ucyBub3cgY29tZSBsYXN0LikKKworICAgT1BUU1RSSU5HIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxlZ2l0aW1hdGUgb3B0aW9uIGNoYXJhY3RlcnMuCisgICBJZiBhbiBvcHRpb24gY2hhcmFjdGVyIGlzIHNlZW4gdGhhdCBpcyBub3QgbGlzdGVkIGluIE9QVFNUUklORywKKyAgIHJldHVybiAnPycgYWZ0ZXIgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZS4gIElmIHlvdSBzZXQgYGdudV9vcHRlcnInIHRvCisgICB6ZXJvLCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBzdXBwcmVzc2VkIGJ1dCB3ZSBzdGlsbCByZXR1cm4gJz8nLgorCisgICBJZiBhIGNoYXIgaW4gT1BUU1RSSU5HIGlzIGZvbGxvd2VkIGJ5IGEgY29sb24sIHRoYXQgbWVhbnMgaXQgd2FudHMgYW4gYXJnLAorICAgc28gdGhlIGZvbGxvd2luZyB0ZXh0IGluIHRoZSBzYW1lIEFSR1YtZWxlbWVudCwgb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZworICAgQVJHVi1lbGVtZW50LCBpcyByZXR1cm5lZCBpbiBgZ251X29wdGFyZycuICBUd28gY29sb25zIG1lYW4gYW4gb3B0aW9uIHRoYXQKKyAgIHdhbnRzIGFuIG9wdGlvbmFsIGFyZzsgaWYgdGhlcmUgaXMgdGV4dCBpbiB0aGUgY3VycmVudCBBUkdWLWVsZW1lbnQsCisgICBpdCBpcyByZXR1cm5lZCBpbiBgZ251X29wdGFyZycsIG90aGVyd2lzZSBgZ251X29wdGFyZycgaXMgc2V0IHRvIHplcm8uCisKKyAgIElmIE9QVFNUUklORyBzdGFydHMgd2l0aCBgLScgb3IgYCsnLCBpdCByZXF1ZXN0cyBkaWZmZXJlbnQgbWV0aG9kcyBvZgorICAgaGFuZGxpbmcgdGhlIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cy4KKyAgIFNlZSB0aGUgY29tbWVudHMgYWJvdXQgUkVUVVJOX0lOX09SREVSIGFuZCBSRVFVSVJFX09SREVSLCBhYm92ZS4KKworICAgTG9uZy1uYW1lZCBvcHRpb25zIGJlZ2luIHdpdGggYC0tJyBpbnN0ZWFkIG9mIGAtJy4KKyAgIFRoZWlyIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCBhcyBsb25nIGFzIHRoZSBhYmJyZXZpYXRpb24gaXMgdW5pcXVlCisgICBvciBpcyBhbiBleGFjdCBtYXRjaCBmb3Igc29tZSBkZWZpbmVkIG9wdGlvbi4gIElmIHRoZXkgaGF2ZSBhbgorICAgYXJndW1lbnQsIGl0IGZvbGxvd3MgdGhlIG9wdGlvbiBuYW1lIGluIHRoZSBzYW1lIEFSR1YtZWxlbWVudCwgc2VwYXJhdGVkCisgICBmcm9tIHRoZSBvcHRpb24gbmFtZSBieSBhIGA9Jywgb3IgZWxzZSB0aGUgaW4gbmV4dCBBUkdWLWVsZW1lbnQuCisgICBXaGVuIGBnbnVfZ2V0b3B0JyBmaW5kcyBhIGxvbmctbmFtZWQgb3B0aW9uLCBpdCByZXR1cm5zIDAgaWYgdGhhdCBvcHRpb24ncworICAgYGZsYWcnIGZpZWxkIGlzIG5vbnplcm8sIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uJ3MgYHZhbCcgZmllbGQKKyAgIGlmIHRoZSBgZmxhZycgZmllbGQgaXMgemVyby4KKworICAgVGhlIGVsZW1lbnRzIG9mIEFSR1YgYXJlbid0IHJlYWxseSBjb25zdCwgYmVjYXVzZSB3ZSBwZXJtdXRlIHRoZW0uCisgICBCdXQgd2UgcHJldGVuZCB0aGV5J3JlIGNvbnN0IGluIHRoZSBwcm90b3R5cGUgdG8gYmUgY29tcGF0aWJsZQorICAgd2l0aCBvdGhlciBzeXN0ZW1zLgorCisgICBMT05HT1BUUyBpcyBhIHZlY3RvciBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbgorICAgZWxlbWVudCBjb250YWluaW5nIGEgbmFtZSB3aGljaCBpcyB6ZXJvLgorCisgICBMT05HSU5EIHJldHVybnMgdGhlIGluZGV4IGluIExPTkdPUFQgb2YgdGhlIGxvbmctbmFtZWQgb3B0aW9uIGZvdW5kLgorICAgSXQgaXMgb25seSB2YWxpZCB3aGVuIGEgbG9uZy1uYW1lZCBvcHRpb24gaGFzIGJlZW4gZm91bmQgYnkgdGhlIG1vc3QKKyAgIHJlY2VudCBjYWxsLgorCisgICBJZiBMT05HX09OTFkgaXMgbm9uemVybywgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW50cm9kdWNlCisgICBsb25nLW5hbWVkIG9wdGlvbnMuICAqLworCitpbnQKK19nbnVfZ2V0b3B0X2ludGVybmFsKCBpbnQgYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcHRzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpsb25naW5kLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsb25nX29ubHkgKSB7CisgICAgZ251X29wdGFyZyA9IE5VTEw7CisKKyAgICBpZiAoICFfX2dudV9nZXRvcHRfaW5pdGlhbGl6ZWQgfHwgZ251X29wdGluZCA9PSAwICkgeworICAgICAgICBvcHRzdHJpbmcgPSBfZ251X2dldG9wdF9pbml0aWFsaXplIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpOworICAgICAgICBnbnVfb3B0aW5kID0gMTsgICAgICAgLyogRG9uJ3Qgc2NhbiBBUkdWWzBdLCB0aGUgcHJvZ3JhbSBuYW1lLiAgKi8KKyAgICAgICAgX19nbnVfZ2V0b3B0X2luaXRpYWxpemVkID0gMTsKKyAgICB9CisKKyAgICAvKiBUZXN0IHdoZXRoZXIgQVJHVltnbnVfb3B0aW5kXSBwb2ludHMgdG8gYSBub24tb3B0aW9uIGFyZ3VtZW50LgorICAgICAgIEVpdGhlciBpdCBkb2VzIG5vdCBoYXZlIG9wdGlvbiBzeW50YXgsIG9yIHRoZXJlIGlzIGFuIGVudmlyb25tZW50IGZsYWcKKyAgICAgICBmcm9tIHRoZSBzaGVsbCBpbmRpY2F0aW5nIGl0IGlzIG5vdCBhbiBvcHRpb24uICBUaGUgbGF0ZXIgaW5mb3JtYXRpb24KKyAgICAgICBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgdXNlZCBpbiB0aGUgR05VIGxpYmMuICAqLworCisjZGVmaW5lIE5PTk9QVElPTl9QIChhcmd2W2dudV9vcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W2dudV9vcHRpbmRdWzFdID09ICdcMCcpCisKKyAgICBpZiAoIG5leHRjaGFyID09IE5VTEwgfHwgKm5leHRjaGFyID09ICdcMCcgKSB7CisgICAgICAgIC8qIEFkdmFuY2UgdG8gdGhlIG5leHQgQVJHVi1lbGVtZW50LiAgKi8KKworICAgICAgICAvKiBHaXZlIEZJUlNUX05PTk9QVCAmIExBU1RfTk9OT1BUIHJhdGlvbmFsIHZhbHVlcyBpZiBPUFRJTkQgaGFzIGJlZW4KKyAgICAgICBtb3ZlZCBiYWNrIGJ5IHRoZSB1c2VyICh3aG8gbWF5IGFsc28gaGF2ZSBjaGFuZ2VkIHRoZSBhcmd1bWVudHMpLiAgKi8KKyAgICAgICAgaWYgKCBsYXN0X25vbm9wdCA+IGdudV9vcHRpbmQgKQorICAgICAgICAgICAgbGFzdF9ub25vcHQgPSBnbnVfb3B0aW5kOworICAgICAgICBpZiAoIGZpcnN0X25vbm9wdCA+IGdudV9vcHRpbmQgKQorICAgICAgICAgICAgZmlyc3Rfbm9ub3B0ID0gZ251X29wdGluZDsKKworICAgICAgICBpZiAoIG9yZGVyaW5nID09IFBFUk1VVEUgKSB7CisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGp1c3QgcHJvY2Vzc2VkIHNvbWUgb3B0aW9ucyBmb2xsb3dpbmcgc29tZSBub24tb3B0aW9ucywKKyAgICAgICAgICAgICAgIGV4Y2hhbmdlIHRoZW0gc28gdGhhdCB0aGUgb3B0aW9ucyBjb21lIGZpcnN0LiAgKi8KKworICAgICAgICAgICAgaWYgKCBmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQgJiYgbGFzdF9ub25vcHQgIT0gZ251X29wdGluZCApCisgICAgICAgICAgICAgICAgZXhjaGFuZ2UgKChjaGFyICoqKSBhcmd2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBsYXN0X25vbm9wdCAhPSBnbnVfb3B0aW5kICkKKyAgICAgICAgICAgICAgICBmaXJzdF9ub25vcHQgPSBnbnVfb3B0aW5kOworCisgICAgICAgICAgICAvKiBTa2lwIGFueSBhZGRpdGlvbmFsIG5vbi1vcHRpb25zCisgICAgICAgICAgICAgICBhbmQgZXh0ZW5kIHRoZSByYW5nZSBvZiBub24tb3B0aW9ucyBwcmV2aW91c2x5IHNraXBwZWQuICAqLworCisgICAgICAgICAgICB3aGlsZSAoIGdudV9vcHRpbmQgPCBhcmdjICYmIE5PTk9QVElPTl9QICkKKyAgICAgICAgICAgICAgICBnbnVfb3B0aW5kKys7CisgICAgICAgICAgICBsYXN0X25vbm9wdCA9IGdudV9vcHRpbmQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgc3BlY2lhbCBBUkdWLWVsZW1lbnQgYC0tJyBtZWFucyBwcmVtYXR1cmUgZW5kIG9mIG9wdGlvbnMuCisgICAgICAgU2tpcCBpdCBsaWtlIGEgbnVsbCBvcHRpb24sCisgICAgICAgdGhlbiBleGNoYW5nZSB3aXRoIHByZXZpb3VzIG5vbi1vcHRpb25zIGFzIGlmIGl0IHdlcmUgYW4gb3B0aW9uLAorICAgICAgIHRoZW4gc2tpcCBldmVyeXRoaW5nIGVsc2UgbGlrZSBhIG5vbi1vcHRpb24uICAqLworCisgICAgICAgIGlmICggZ251X29wdGluZCAhPSBhcmdjICYmICFzdHJjbXAgKGFyZ3ZbZ251X29wdGluZF0sICItLSIpICkgeworICAgICAgICAgICAgZ251X29wdGluZCsrOworCisgICAgICAgICAgICBpZiAoIGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCAmJiBsYXN0X25vbm9wdCAhPSBnbnVfb3B0aW5kICkKKyAgICAgICAgICAgICAgICBleGNoYW5nZSAoKGNoYXIgKiopIGFyZ3YpOworICAgICAgICAgICAgZWxzZSBpZiAoIGZpcnN0X25vbm9wdCA9PSBsYXN0X25vbm9wdCApCisgICAgICAgICAgICAgICAgZmlyc3Rfbm9ub3B0ID0gZ251X29wdGluZDsKKyAgICAgICAgICAgIGxhc3Rfbm9ub3B0ID0gYXJnYzsKKworICAgICAgICAgICAgZ251X29wdGluZCA9IGFyZ2M7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB3ZSBoYXZlIGRvbmUgYWxsIHRoZSBBUkdWLWVsZW1lbnRzLCBzdG9wIHRoZSBzY2FuCisgICAgICAgYW5kIGJhY2sgb3ZlciBhbnkgbm9uLW9wdGlvbnMgdGhhdCB3ZSBza2lwcGVkIGFuZCBwZXJtdXRlZC4gICovCisKKyAgICAgICAgaWYgKCBnbnVfb3B0aW5kID09IGFyZ2MgKSB7CisgICAgICAgICAgICAvKiBTZXQgdGhlIG5leHQtYXJnLWluZGV4IHRvIHBvaW50IGF0IHRoZSBub24tb3B0aW9ucworICAgICAgICAgICAgICAgdGhhdCB3ZSBwcmV2aW91c2x5IHNraXBwZWQsIHNvIHRoZSBjYWxsZXIgd2lsbCBkaWdlc3QgdGhlbS4gICovCisgICAgICAgICAgICBpZiAoIGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCApCisgICAgICAgICAgICAgICAgZ251X29wdGluZCA9IGZpcnN0X25vbm9wdDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGhhdmUgY29tZSB0byBhIG5vbi1vcHRpb24gYW5kIGRpZCBub3QgcGVybXV0ZSBpdCwKKyAgICAgICBlaXRoZXIgc3RvcCB0aGUgc2NhbiBvciBkZXNjcmliZSBpdCB0byB0aGUgY2FsbGVyIGFuZCBwYXNzIGl0IGJ5LiAgKi8KKworICAgICAgICBpZiAoIE5PTk9QVElPTl9QICkgeworICAgICAgICAgICAgaWYgKCBvcmRlcmluZyA9PSBSRVFVSVJFX09SREVSICkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBnbnVfb3B0YXJnID0gYXJndltnbnVfb3B0aW5kKytdOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBoYXZlIGZvdW5kIGFub3RoZXIgb3B0aW9uLUFSR1YtZWxlbWVudC4KKyAgICAgICBTa2lwIHRoZSBpbml0aWFsIHB1bmN0dWF0aW9uLiAgKi8KKworICAgICAgICBuZXh0Y2hhciA9IChhcmd2W2dudV9vcHRpbmRdICsgMQorICAgICAgICAgICAgICAgICAgICArIChsb25nb3B0cyAhPSBOVUxMICYmIGFyZ3ZbZ251X29wdGluZF1bMV0gPT0gJy0nKSk7CisgICAgfQorCisgICAgLyogRGVjb2RlIHRoZSBjdXJyZW50IG9wdGlvbi1BUkdWLWVsZW1lbnQuICAqLworCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgQVJHVi1lbGVtZW50IGlzIGEgbG9uZyBvcHRpb24uCisgIAorICAgICAgIElmIGxvbmdfb25seSBhbmQgdGhlIEFSR1YtZWxlbWVudCBoYXMgdGhlIGZvcm0gIi1mIiwgd2hlcmUgZiBpcworICAgICAgIGEgdmFsaWQgc2hvcnQgb3B0aW9uLCBkb24ndCBjb25zaWRlciBpdCBhbiBhYmJyZXZpYXRlZCBmb3JtIG9mCisgICAgICAgYSBsb25nIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGYuICBPdGhlcndpc2UgdGhlcmUgd291bGQgYmUgbm8KKyAgICAgICB3YXkgdG8gZ2l2ZSB0aGUgLWYgc2hvcnQgb3B0aW9uLgorICAKKyAgICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlcmUncyBhIGxvbmcgb3B0aW9uICJmdWJhciIgYW5kCisgICAgICAgdGhlIEFSR1YtZWxlbWVudCBpcyAiLWZ1IiwgZG8gY29uc2lkZXIgdGhhdCBhbiBhYmJyZXZpYXRpb24gb2YKKyAgICAgICB0aGUgbG9uZyBvcHRpb24sIGp1c3QgbGlrZSAiLS1mdSIsIGFuZCBub3QgIi1mIiB3aXRoIGFyZyAidSIuCisgIAorICAgICAgIFRoaXMgZGlzdGluY3Rpb24gc2VlbXMgdG8gYmUgdGhlIG1vc3QgdXNlZnVsIGFwcHJvYWNoLiAgKi8KKworICAgIGlmICggbG9uZ29wdHMgIT0gTlVMTAorICAgICAgICAgJiYgKGFyZ3ZbZ251X29wdGluZF1bMV0gPT0gJy0nCisgICAgICAgICAgICAgfHwgKGxvbmdfb25seSAmJiAoYXJndltnbnVfb3B0aW5kXVsyXSB8fCAhbXlfaW5kZXggKG9wdHN0cmluZywgYXJndltnbnVfb3B0aW5kXVsxXSkpKSkgKSB7CisgICAgICAgIGNoYXIgKm5hbWVlbmQ7CisgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnA7CisgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnBmb3VuZCA9IE5VTEw7CisgICAgICAgIGludCBleGFjdCA9IDA7CisgICAgICAgIGludCBhbWJpZyA9IDA7CisgICAgICAgIGludCBpbmRmb3VuZCA9IC0xOworICAgICAgICBpbnQgb3B0aW9uX2luZGV4OworCisgICAgICAgIGZvciAoIG5hbWVlbmQgPSBuZXh0Y2hhcjsgKm5hbWVlbmQgJiYgKm5hbWVlbmQgIT0gJz0nOyBuYW1lZW5kKysgKQorICAgICAgICAgICAgLyogRG8gbm90aGluZy4gICovIDsKKworICAgICAgICAvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAorICAgICAgIG9yIGFiYnJldmlhdGVkIG1hdGNoZXMuICAqLworICAgICAgICBmb3IgKCBwID0gbG9uZ29wdHMsIG9wdGlvbl9pbmRleCA9IDA7IHAtPm5hbWU7IHArKywgb3B0aW9uX2luZGV4KysgKQorICAgICAgICAgICAgaWYgKCAhc3RybmNtcCAocC0+bmFtZSwgbmV4dGNoYXIsIG5hbWVlbmQgLSBuZXh0Y2hhcikgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAodW5zaWduZWQgaW50KSAobmFtZWVuZCAtIG5leHRjaGFyKQorICAgICAgICAgICAgICAgICAgICAgPT0gKHVuc2lnbmVkIGludCkgc3RybGVuIChwLT5uYW1lKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRXhhY3QgbWF0Y2ggZm91bmQuICAqLworICAgICAgICAgICAgICAgICAgICBwZm91bmQgPSBwOworICAgICAgICAgICAgICAgICAgICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgZXhhY3QgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBwZm91bmQgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmlyc3Qgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLworICAgICAgICAgICAgICAgICAgICBwZm91bmQgPSBwOworICAgICAgICAgICAgICAgICAgICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIG9yIGxhdGVyIG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgYW1iaWcgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgIGlmICggYW1iaWcgJiYgIWV4YWN0ICkgeworICAgICAgICAgICAgaWYgKCBnbnVfb3B0ZXJyICkKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYCVzJyBpcyBhbWJpZ3VvdXNcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIGFyZ3ZbZ251X29wdGluZF0pOworICAgICAgICAgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisgICAgICAgICAgICBnbnVfb3B0aW5kKys7CisgICAgICAgICAgICBnbnVfb3B0b3B0ID0gMDsKKyAgICAgICAgICAgIHJldHVybiAnPyc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBmb3VuZCAhPSBOVUxMICkgeworICAgICAgICAgICAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7CisgICAgICAgICAgICBnbnVfb3B0aW5kKys7CisgICAgICAgICAgICBpZiAoICpuYW1lZW5kICkgeworICAgICAgICAgICAgICAgIC8qIERvbid0IHRlc3QgaGFzX2FyZyB3aXRoID4sIGJlY2F1c2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndAorICAgICAgICAgICAgICAgYWxsb3cgaXQgdG8gYmUgdXNlZCBvbiBlbnVtcy4gICovCisgICAgICAgICAgICAgICAgaWYgKCBwZm91bmQtPmhhc19hcmcgKQorICAgICAgICAgICAgICAgICAgICBnbnVfb3B0YXJnID0gbmFtZWVuZCArIDE7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggZ251X29wdGVyciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYXJndltnbnVfb3B0aW5kIC0gMV1bMV0gPT0gJy0nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tb3B0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIiVzOiBvcHRpb24gYC0tJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIHBmb3VuZC0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICtvcHRpb24gb3IgLW9wdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCIlczogb3B0aW9uIGAlYyVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBhcmd2W2dudV9vcHRpbmQgLSAxXVswXSwgcGZvdW5kLT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworCisgICAgICAgICAgICAgICAgICAgIGdudV9vcHRvcHQgPSBwZm91bmQtPnZhbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc/JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBwZm91bmQtPmhhc19hcmcgPT0gMSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGdudV9vcHRpbmQgPCBhcmdjICkKKyAgICAgICAgICAgICAgICAgICAgZ251X29wdGFyZyA9IGFyZ3ZbZ251X29wdGluZCsrXTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBnbnVfb3B0ZXJyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIiVzOiBvcHRpb24gYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBhcmd2W2dudV9vcHRpbmQgLSAxXSk7CisgICAgICAgICAgICAgICAgICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworICAgICAgICAgICAgICAgICAgICBnbnVfb3B0b3B0ID0gcGZvdW5kLT52YWw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzdHJpbmdbMF0gPT0gJzonID8gJzonIDogJz8nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworICAgICAgICAgICAgaWYgKCBsb25naW5kICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpsb25naW5kID0gb3B0aW9uX2luZGV4OworICAgICAgICAgICAgaWYgKCBwZm91bmQtPmZsYWcgKSB7CisgICAgICAgICAgICAgICAgKihwZm91bmQtPmZsYWcpID0gcGZvdW5kLT52YWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGZvdW5kLT52YWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBDYW4ndCBmaW5kIGl0IGFzIGEgbG9uZyBvcHRpb24uICBJZiB0aGlzIGlzIG5vdCBnbnVfZ2V0b3B0X2xvbmdfb25seSwKKyAgICAgICBvciB0aGUgb3B0aW9uIHN0YXJ0cyB3aXRoICctLScgb3IgaXMgbm90IGEgdmFsaWQgc2hvcnQKKyAgICAgICBvcHRpb24sIHRoZW4gaXQncyBhbiBlcnJvci4KKyAgICAgICBPdGhlcndpc2UgaW50ZXJwcmV0IGl0IGFzIGEgc2hvcnQgb3B0aW9uLiAgKi8KKyAgICAgICAgaWYgKCAhbG9uZ19vbmx5IHx8IGFyZ3ZbZ251X29wdGluZF1bMV0gPT0gJy0nCisgICAgICAgICAgICAgfHwgbXlfaW5kZXggKG9wdHN0cmluZywgKm5leHRjaGFyKSA9PSBOVUxMICkgeworICAgICAgICAgICAgaWYgKCBnbnVfb3B0ZXJyICkgeworICAgICAgICAgICAgICAgIGlmICggYXJndltnbnVfb3B0aW5kXVsxXSA9PSAnLScgKQorICAgICAgICAgICAgICAgICAgICAvKiAtLW9wdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIGAtLSVzJ1xuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIG5leHRjaGFyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8qICtvcHRpb24gb3IgLW9wdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIGAlYyVzJ1xuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIGFyZ3ZbZ251X29wdGluZF1bMF0sIG5leHRjaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRjaGFyID0gKGNoYXIgKikgIiI7CisgICAgICAgICAgICBnbnVfb3B0aW5kKys7CisgICAgICAgICAgICBnbnVfb3B0b3B0ID0gMDsKKyAgICAgICAgICAgIHJldHVybiAnPyc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBMb29rIGF0IGFuZCBoYW5kbGUgdGhlIG5leHQgc2hvcnQgb3B0aW9uLWNoYXJhY3Rlci4gICovCisKKyAgICB7CisgICAgICAgIGNoYXIgYyA9ICpuZXh0Y2hhcisrOworICAgICAgICBjaGFyICp0ZW1wID0gbXlfaW5kZXggKG9wdHN0cmluZywgYyk7CisKKyAgICAgICAgLyogSW5jcmVtZW50IGBnbnVfb3B0aW5kJyB3aGVuIHdlIHN0YXJ0IHRvIHByb2Nlc3MgaXRzIGxhc3QgY2hhcmFjdGVyLiAgKi8KKyAgICAgICAgaWYgKCAqbmV4dGNoYXIgPT0gJ1wwJyApCisgICAgICAgICAgICArK2dudV9vcHRpbmQ7CisKKyAgICAgICAgaWYgKCB0ZW1wID09IE5VTEwgfHwgYyA9PSAnOicgKSB7CisgICAgICAgICAgICBpZiAoIGdudV9vcHRlcnIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwb3NpeGx5X2NvcnJlY3QgKQorICAgICAgICAgICAgICAgICAgICAvKiAxMDAzLjIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgdGhpcyBtZXNzYWdlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBjKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGludmFsaWQgb3B0aW9uIC0tICVjXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlswXSwgYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnbnVfb3B0b3B0ID0gYzsKKyAgICAgICAgICAgIHJldHVybiAnPyc7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29udmVuaWVuY2UuIFRyZWF0IFBPU0lYIC1XIGZvbyBzYW1lIGFzIGxvbmcgb3B0aW9uIC0tZm9vICovCisgICAgICAgIGlmICggdGVtcFswXSA9PSAnVycgJiYgdGVtcFsxXSA9PSAnOycgKSB7CisgICAgICAgICAgICBjaGFyICpuYW1lZW5kOworICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqcDsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnBmb3VuZCA9IE5VTEw7CisgICAgICAgICAgICBpbnQgZXhhY3QgPSAwOworICAgICAgICAgICAgaW50IGFtYmlnID0gMDsKKyAgICAgICAgICAgIGludCBpbmRmb3VuZCA9IDA7CisgICAgICAgICAgICBpbnQgb3B0aW9uX2luZGV4OworCisgICAgICAgICAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IHJlcXVpcmVzIGFuIGFyZ3VtZW50LiAgKi8KKyAgICAgICAgICAgIGlmICggKm5leHRjaGFyICE9ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgZ251X29wdGFyZyA9IG5leHRjaGFyOworICAgICAgICAgICAgICAgIC8qIElmIHdlIGVuZCB0aGlzIEFSR1YtZWxlbWVudCBieSB0YWtpbmcgdGhlIHJlc3QgYXMgYW4gYXJnLAorICAgICAgICAgICAgICAgICAgIHdlIG11c3QgYWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IG5vdy4gICovCisgICAgICAgICAgICAgICAgZ251X29wdGluZCsrOworICAgICAgICAgICAgfSBlbHNlIGlmICggZ251X29wdGluZCA9PSBhcmdjICkgeworICAgICAgICAgICAgICAgIGlmICggZ251X29wdGVyciApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogMTAwMy4yIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4gICovCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnbnVfb3B0b3B0ID0gYzsKKyAgICAgICAgICAgICAgICBpZiAoIG9wdHN0cmluZ1swXSA9PSAnOicgKQorICAgICAgICAgICAgICAgICAgICBjID0gJzonOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYyA9ICc/JzsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIC8qIFdlIGFscmVhZHkgaW5jcmVtZW50ZWQgYGdudV9vcHRpbmQnIG9uY2U7CisgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50IGl0IGFnYWluIHdoZW4gdGFraW5nIG5leHQgQVJHVi1lbHQgYXMgYXJndW1lbnQuICAqLworICAgICAgICAgICAgICAgIGdudV9vcHRhcmcgPSBhcmd2W2dudV9vcHRpbmQrK107CisKKyAgICAgICAgICAgIC8qIGdudV9vcHRhcmcgaXMgbm93IHRoZSBhcmd1bWVudCwgc2VlIGlmIGl0J3MgaW4gdGhlCisgICAgICAgICAgICAgICB0YWJsZSBvZiBsb25nb3B0cy4gICovCisKKyAgICAgICAgICAgIGZvciAoIG5leHRjaGFyID0gbmFtZWVuZCA9IGdudV9vcHRhcmc7ICpuYW1lZW5kICYmICpuYW1lZW5kICE9ICc9JzsgbmFtZWVuZCsrICkKKyAgICAgICAgICAgICAgICAvKiBEbyBub3RoaW5nLiAgKi8gOworCisgICAgICAgICAgICAvKiBUZXN0IGFsbCBsb25nIG9wdGlvbnMgZm9yIGVpdGhlciBleGFjdCBtYXRjaAorICAgICAgICAgICAgICAgb3IgYWJicmV2aWF0ZWQgbWF0Y2hlcy4gICovCisgICAgICAgICAgICBmb3IgKCBwID0gbG9uZ29wdHMsIG9wdGlvbl9pbmRleCA9IDA7IHAtPm5hbWU7IHArKywgb3B0aW9uX2luZGV4KysgKQorICAgICAgICAgICAgICAgIGlmICggIXN0cm5jbXAgKHAtPm5hbWUsIG5leHRjaGFyLCBuYW1lZW5kIC0gbmV4dGNoYXIpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh1bnNpZ25lZCBpbnQpIChuYW1lZW5kIC0gbmV4dGNoYXIpID09IHN0cmxlbiAocC0+bmFtZSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGFjdCBtYXRjaCBmb3VuZC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBwZm91bmQgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZm91bmQgPSBvcHRpb25faW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggcGZvdW5kID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBwZm91bmQgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZm91bmQgPSBvcHRpb25faW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIG9yIGxhdGVyIG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFtYmlnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFtYmlnICYmICFleGFjdCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGdudV9vcHRlcnIgKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBvcHRpb24gYC1XICVzJyBpcyBhbWJpZ3VvdXNcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBhcmd2W2dudV9vcHRpbmRdKTsKKyAgICAgICAgICAgICAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKKyAgICAgICAgICAgICAgICBnbnVfb3B0aW5kKys7CisgICAgICAgICAgICAgICAgcmV0dXJuICc/JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggcGZvdW5kICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgb3B0aW9uX2luZGV4ID0gaW5kZm91bmQ7CisgICAgICAgICAgICAgICAgaWYgKCAqbmFtZWVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgdGVzdCBoYXNfYXJnIHdpdGggPiwgYmVjYXVzZSBzb21lIEMgY29tcGlsZXJzIGRvbid0CisgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGl0IHRvIGJlIHVzZWQgb24gZW51bXMuICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIHBmb3VuZC0+aGFzX2FyZyApCisgICAgICAgICAgICAgICAgICAgICAgICBnbnVfb3B0YXJnID0gbmFtZWVuZCArIDE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBnbnVfb3B0ZXJyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlwKKyVzOiBvcHRpb24gYC1XICVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBwZm91bmQtPm5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPyc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBwZm91bmQtPmhhc19hcmcgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBnbnVfb3B0aW5kIDwgYXJnYyApCisgICAgICAgICAgICAgICAgICAgICAgICBnbnVfb3B0YXJnID0gYXJndltnbnVfb3B0aW5kKytdOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZ251X29wdGVyciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIiVzOiBvcHRpb24gYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlswXSwgYXJndltnbnVfb3B0aW5kIC0gMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0c3RyaW5nWzBdID09ICc6JyA/ICc6JyA6ICc/JzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKKyAgICAgICAgICAgICAgICBpZiAoIGxvbmdpbmQgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICpsb25naW5kID0gb3B0aW9uX2luZGV4OworICAgICAgICAgICAgICAgIGlmICggcGZvdW5kLT5mbGFnICkgeworICAgICAgICAgICAgICAgICAgICAqKHBmb3VuZC0+ZmxhZykgPSBwZm91bmQtPnZhbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBwZm91bmQtPnZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRjaGFyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAnVyc7ICAgLyogTGV0IHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUgaXQuICAgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoIHRlbXBbMV0gPT0gJzonICkgeworICAgICAgICAgICAgaWYgKCB0ZW1wWzJdID09ICc6JyApIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbiB0aGF0IGFjY2VwdHMgYW4gYXJndW1lbnQgb3B0aW9uYWxseS4gICovCisgICAgICAgICAgICAgICAgaWYgKCAqbmV4dGNoYXIgIT0gJ1wwJyApIHsKKyAgICAgICAgICAgICAgICAgICAgZ251X29wdGFyZyA9IG5leHRjaGFyOworICAgICAgICAgICAgICAgICAgICBnbnVfb3B0aW5kKys7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdudV9vcHRhcmcgPSBOVUxMOworICAgICAgICAgICAgICAgIG5leHRjaGFyID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBvcHRpb24gdGhhdCByZXF1aXJlcyBhbiBhcmd1bWVudC4gICovCisgICAgICAgICAgICAgICAgaWYgKCAqbmV4dGNoYXIgIT0gJ1wwJyApIHsKKyAgICAgICAgICAgICAgICAgICAgZ251X29wdGFyZyA9IG5leHRjaGFyOworICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBlbmQgdGhpcyBBUkdWLWVsZW1lbnQgYnkgdGFraW5nIHRoZSByZXN0IGFzIGFuIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgd2UgbXVzdCBhZHZhbmNlIHRvIHRoZSBuZXh0IGVsZW1lbnQgbm93LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgZ251X29wdGluZCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGdudV9vcHRpbmQgPT0gYXJnYyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBnbnVfb3B0ZXJyICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwMy4yIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCIlczogb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IC0tICVjXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdudV9vcHRvcHQgPSBjOworICAgICAgICAgICAgICAgICAgICBpZiAoIG9wdHN0cmluZ1swXSA9PSAnOicgKQorICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICc6JzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICc/JzsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLyogV2UgYWxyZWFkeSBpbmNyZW1lbnRlZCBgZ251X29wdGluZCcgb25jZTsKKyAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQgaXQgYWdhaW4gd2hlbiB0YWtpbmcgbmV4dCBBUkdWLWVsdCBhcyBhcmd1bWVudC4gICovCisgICAgICAgICAgICAgICAgICAgIGdudV9vcHRhcmcgPSBhcmd2W2dudV9vcHRpbmQrK107CisgICAgICAgICAgICAgICAgbmV4dGNoYXIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjOworICAgIH0KK30KKworaW50CitnbnVfZ2V0b3B0ICggaW50IGFyZ2MsCisgICAgICAgICAgICAgY2hhciAqY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nICkgeworICAgIHJldHVybiBfZ251X2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBvcHRpb24gKikgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgKikgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCisMCisjaWZkZWYgVEVTVAorCisvKiBDb21waWxlIHdpdGggLURURVNUIHRvIG1ha2UgYW4gZXhlY3V0YWJsZSBmb3IgdXNlIGluIHRlc3RpbmcKKyAgIHRoZSBhYm92ZSBkZWZpbml0aW9uIG9mIGBnbnVfZ2V0b3B0Jy4gICovCisKK2ludAorbWFpbiAoYXJnYywgYXJndikKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7Cit7CitpbnQgYzsKK2ludCBkaWdpdF9vcHRpbmQgPSAwOworCit3aGlsZSAoIDEgKSB7CisgICAgaW50IHRoaXNfb3B0aW9uX29wdGluZCA9IGdudV9vcHRpbmQgPyBnbnVfb3B0aW5kIDogMTsKKworICAgIGMgPSBnbnVfZ2V0b3B0IChhcmdjLCBhcmd2LCAiYWJjOmQ6MDEyMzQ1Njc4OSIpOworICAgIGlmICggYyA9PSAtMSApCisgICAgICAgIGJyZWFrOworCisgICAgc3dpdGNoICggYyApIHsKKyAgICAgICAgY2FzZSAnMCc6CisgICAgICAgIGNhc2UgJzEnOgorICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgY2FzZSAnMyc6CisgICAgICAgIGNhc2UgJzQnOgorICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgY2FzZSAnNic6CisgICAgICAgIGNhc2UgJzcnOgorICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICBpZiAoIGRpZ2l0X29wdGluZCAhPSAwICYmIGRpZ2l0X29wdGluZCAhPSB0aGlzX29wdGlvbl9vcHRpbmQgKQorICAgICAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJkaWdpdHMgb2NjdXIgaW4gdHdvIGRpZmZlcmVudCBhcmd2LWVsZW1lbnRzLlxuIik7CisgICAgICAgICAgICBkaWdpdF9vcHRpbmQgPSB0aGlzX29wdGlvbl9vcHRpbmQ7CisgICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAib3B0aW9uICVjXG4iLCBjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIm9wdGlvbiBhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIm9wdGlvbiBiXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIm9wdGlvbiBjIHdpdGggdmFsdWUgYCVzJ1xuIiwgZ251X29wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiPz8gZ251X2dldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOworICAgIH0KK30KKworaWYgKCBnbnVfb3B0aW5kIDwgYXJnYyApIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJub24tb3B0aW9uIEFSR1YtZWxlbWVudHM6ICIpOworICAgIHdoaWxlICggZ251X29wdGluZCA8IGFyZ2MgKQorICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiJXMgIiwgYXJndltnbnVfb3B0aW5kKytdKTsKKyAgICBmcHJpbnRmICggc3RkZXJyLCAiXG4iKTsKK30KKworZXhpdCAoMCk7Cit9CisKKyNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9zcmMvZ251X2dldG9wdF9sb25nLmMgYi9pcGVyZi0yLjAuNS9zcmMvZ251X2dldG9wdF9sb25nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0OWZlYgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L3NyYy9nbnVfZ2V0b3B0X2xvbmcuYwpAQCAtMCwwICsxLDE2MiBAQAorLyogZ251X2dldG9wdF9sb25nIGFuZCBnZXRvcHRfbG9uZ19vbmx5IGVudHJ5IHBvaW50cyBmb3IgR05VIGdldG9wdC4KKyAgIENvcHlyaWdodCAoQykgMTk4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5Niw5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuICBJdHMgbWFzdGVyIHNvdXJjZSBpcyBOT1QgcGFydCBvZgorICAgdGhlIEMgbGlicmFyeSwgaG93ZXZlci4gIFRoZSBtYXN0ZXIgc291cmNlIGxpdmVzIGluIC9nZC9nbnUvbGliLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIG1vZGlmaWVkIEp1bHkgOSwgMTk5OSBieSBtYXJrIGdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogICAgICAgICAgRGVjIDE3LCAxOTk5CisgKgorICogcmVuYW1lZCBhbGwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYnkgcHJlcGVuZGluZyAiZ251XyIKKyAqIHJlbW92ZWQvcmVkaWQgYSBidW5jaCBvZiBzdHVmZiB1bmRlciB0aGUgYXNzdW1wdGlvbiB3ZSdyZQorICogICB1c2luZyBhIG1vZGVybiBzdGFuZGFyZCBDIGNvbXBpbGVyLgorICogcmVuYW1lZCBmaWxlIHRvIGdudV9nZXRvcHRfbG9uZy5jIChmcm9tIGdudV9nZXRvcHQxLmMpCisgKgorICogJElkOiBnbnVfZ2V0b3B0X2xvbmcuYyx2IDEuMS4xLjEgMjAwNC8wNS8xOCAwMTo1MDo0NCBrZ2liYnMgRXhwICQKKyAqLworCisMCisKKyNpbmNsdWRlICJnbnVfZ2V0b3B0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2ludAorZ251X2dldG9wdF9sb25nKCBpbnQgYXJnYywKKyAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgaW50ICpvcHRfaW5kZXggKSB7CisgICAgcmV0dXJuIF9nbnVfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCwgMCk7Cit9CisKKy8qIExpa2UgZ251X2dldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4KKyAgIElmIGFuIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoICctJyAobm90ICctLScpIGRvZXNuJ3QgbWF0Y2ggYSBsb25nIG9wdGlvbiwKKyAgIGJ1dCBkb2VzIG1hdGNoIGEgc2hvcnQgb3B0aW9uLCBpdCBpcyBwYXJzZWQgYXMgYSBzaG9ydCBvcHRpb24KKyAgIGluc3RlYWQuICAqLworCitpbnQKK2dudV9nZXRvcHRfbG9uZ19vbmx5KCBpbnQgYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCAqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKm9wdF9pbmRleCApIHsKKyAgICByZXR1cm4gX2dudV9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4LCAxKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKKworDAorI2lmZGVmIFRFU1QKKworICAgICNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCitpbnQgYXJnYzsKK2NoYXIgKiphcmd2OworeworaW50IGM7CitpbnQgZGlnaXRfb3B0aW5kID0gMDsKKword2hpbGUgKCAxICkgeworICAgIGludCB0aGlzX29wdGlvbl9vcHRpbmQgPSBnbnVfb3B0aW5kID8gZ251X29wdGluZCA6IDE7CisgICAgaW50IG9wdGlvbl9pbmRleCA9IDA7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQorICAgIHsKKyAgICAgICAgeyJhZGQiLCAxLCAwLCAwfSwKKyAgICAgICAgeyJhcHBlbmQiLCAwLCAwLCAwfSwKKyAgICAgICAgeyJkZWxldGUiLCAxLCAwLCAwfSwKKyAgICAgICAgeyJ2ZXJib3NlIiwgMCwgMCwgMH0sCisgICAgICAgIHsiY3JlYXRlIiwgMCwgMCwgMH0sCisgICAgICAgIHsiZmlsZSIsIDEsIDAsIDB9LAorICAgICAgICB7MCwgMCwgMCwgMH0KKyAgICB9OworCisgICAgYyA9IGdudV9nZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFiYzpkOjAxMjM0NTY3ODkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisgICAgaWYgKCBjID09IC0xICkKKyAgICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKCBjICkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAib3B0aW9uICVzIiwgbG9uZ19vcHRpb25zW29wdGlvbl9pbmRleF0ubmFtZSk7CisgICAgICAgICAgICBpZiAoIGdudV9vcHRhcmcgKQorICAgICAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgd2l0aCBhcmcgJXMiLCBnbnVfb3B0YXJnKTsKKyAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnMCc6CisgICAgICAgIGNhc2UgJzEnOgorICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgY2FzZSAnMyc6CisgICAgICAgIGNhc2UgJzQnOgorICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgY2FzZSAnNic6CisgICAgICAgIGNhc2UgJzcnOgorICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICBpZiAoIGRpZ2l0X29wdGluZCAhPSAwICYmIGRpZ2l0X29wdGluZCAhPSB0aGlzX29wdGlvbl9vcHRpbmQgKQorICAgICAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJkaWdpdHMgb2NjdXIgaW4gdHdvIGRpZmZlcmVudCBhcmd2LWVsZW1lbnRzLlxuIik7CisgICAgICAgICAgICBkaWdpdF9vcHRpbmQgPSB0aGlzX29wdGlvbl9vcHRpbmQ7CisgICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAib3B0aW9uICVjXG4iLCBjKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIm9wdGlvbiBhXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIm9wdGlvbiBiXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIm9wdGlvbiBjIHdpdGggdmFsdWUgYCVzJ1xuIiwgZ251X29wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJvcHRpb24gZCB3aXRoIHZhbHVlIGAlcydcbiIsIGdudV9vcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIj8/IGdudV9nZXRvcHQgcmV0dXJuZWQgY2hhcmFjdGVyIGNvZGUgMCVvID8/XG4iLCBjKTsKKyAgICB9Cit9CisKK2lmICggZ251X29wdGluZCA8IGFyZ2MgKSB7CisgICAgZnByaW50ZiAoIHN0ZGVyciwgIm5vbi1vcHRpb24gQVJHVi1lbGVtZW50czogIik7CisgICAgd2hpbGUgKCBnbnVfb3B0aW5kIDwgYXJnYyApCisgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIlcyAiLCBhcmd2W2dudV9vcHRpbmQrK10pOworICAgIGZwcmludGYgKCBzdGRlcnIsICJcbiIpOworfQorCitleGl0ICgwKTsKK30KKworI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9tYWluLmNwcCBiL2lwZXJmLTIuMC41L3NyYy9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzRmZTYwCi0tLSAvZGV2L251bGwKKysrIGIvaXBlcmYtMi4wLjUvc3JjL21haW4uY3BwCkBAIC0wLDAgKzEsMjk3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKiBtYWluLmNwcAorICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqICYgIEFqYXkgVGlydW1hbGEgPHRpcnVtYWxhQG5jc2EudWl1Yy5lZHU+CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtYWluIGRvZXMgaW5pdGlhbGl6YXRpb24gYW5kIGNyZWF0ZXMgdGhlIHZhcmlvdXMgb2JqZWN0cyB0aGF0IHdpbGwKKyAqIGFjdHVhbGx5IHJ1biB0aGUgaXBlcmYgcHJvZ3JhbSwgdGhlbiB3YWl0cyBpbiB0aGUgSm9pbmFsbCgpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaGVhZGVycworICogdXNlcworICogICA8c3RkbGliLmg+CisgKiAgIDxzdHJpbmcuaD4KKyAqCisgKiAgIDxzaWduYWwuaD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBIRUFERVJTKCkKKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKworI2luY2x1ZGUgIlNldHRpbmdzLmhwcCIKKyNpbmNsdWRlICJQZXJmU29ja2V0LmhwcCIKKyNpbmNsdWRlICJMb2NhbGUuaCIKKyNpbmNsdWRlICJDb25kaXRpb24uaCIKKyNpbmNsdWRlICJUaW1lc3RhbXAuaHBwIgorI2luY2x1ZGUgIkxpc3RlbmVyLmhwcCIKKyNpbmNsdWRlICJMaXN0LmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlICJzZXJ2aWNlLmgiCisjZW5kaWYgCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHByb3RvdHlwZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIEZ1bmN0aW9uIGNhbGxlZCBhdCBleGl0IHRvIGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUKK3ZvaWQgY2xlYW51cCggdm9pZCApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitleHRlcm4gIkMiIHsKKyAgICAvLyBHbG9iYWwgZmxhZyB0byBzaWduYWwgYSB1c2VyIGludGVycnVwdAorICAgIGludCBzSW50ZXJ1cHRlZCA9IDA7CisgICAgLy8gR2xvYmFsIElEIHRoYXQgd2UgaW5jcmVtZW50IHRvIGJlIHVzZWQgCisgICAgLy8gYXMgaWRlbnRpZmllciBmb3IgU1VNIHJlcG9ydHMKKyAgICBpbnQgZ3JvdXBJRCA9IDA7CisgICAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGFib3ZlIElECisgICAgTXV0ZXggZ3JvdXBDb25kOworICAgIC8vIENvbmRpdGlvbiB1c2VkIHRvIHNpZ25pZnkgYWR2YW5jZXMgb2YgdGhlIGN1cnJlbnQKKyAgICAvLyByZWNvcmRzIGJlaW5nIGFjY2Vzc2VkIGluIGEgcmVwb3J0IGFuZCBhbHNvIHRvCisgICAgLy8gc2VyaWFsaXplIG1vZGlmaWNhdGlvbiBvZiB0aGUgcmVwb3J0IGxpc3QKKyAgICBDb25kaXRpb24gUmVwb3J0Q29uZDsKKyAgICBDb25kaXRpb24gUmVwb3J0RG9uZUNvbmQ7Cit9CisKKy8vIGdsb2JhbCB2YXJpYWJsZXMgb25seSBhY2Nlc3NlZCB3aXRoaW4gdGhpcyBmaWxlCisKKy8vIFRocmVhZCB0aGF0IHJlY2VpdmVkIHRoZSBTSUdURVJNIG9yIFNJR0lOVCBzaWduYWwKKy8vIFVzZWQgdG8gZW5zdXJlIHRoYXQgaWYgbXVsdGlwbGUgdGhyZWFkcyByZWNlaXZlIHRoZQorLy8gc2lnbmFsIHdlIGRvIG5vdCBwcmVtYXR1cmVseSBleGl0CitudGhyZWFkX3Qgc1RocmVhZDsKKy8vIFRoZSBtYWluIHRocmVhZCB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gd2FpdCAKKy8vIGZvciBhbGwgb3RoZXIgdGhyZWFkcyB0byBjb21wbGV0ZQordm9pZCB3YWl0VW50aWxRdWl0KCB2b2lkICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1haW4oKQorICogICAgICBFbnRyeSBwb2ludCBpbnRvIElwZXJmCisgKgorICogc2V0cyB1cCBzaWduYWwgaGFuZGxlcnMKKyAqIGluaXRpYWxpemUgZ2xvYmFsIGxvY2tzIGFuZCBjb25kaXRpb25zCisgKiBwYXJzZXMgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCBhbmQgY29tbWFuZCBsaW5lCisgKiBzdGFydHMgdXAgc2VydmVyIG9yIGNsaWVudCB0aHJlYWQKKyAqIHdhaXRzIGZvciBhbGwgdGhyZWFkcyB0byBjb21wbGV0ZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IG1haW4oIGludCBhcmdjLCBjaGFyICoqYXJndiApIHsKKworICAgIC8vIFNldCBTSUdURVJNIGFuZCBTSUdJTlQgdG8gY2FsbCBvdXIgdXNlciBpbnRlcnJ1cHQgZnVuY3Rpb24KKyAgICBteV9zaWduYWwoIFNJR1RFUk0sIFNpZ19JbnRlcnVwdCApOworICAgIG15X3NpZ25hbCggU0lHSU5ULCAgU2lnX0ludGVydXB0ICk7CisgICAgbXlfc2lnbmFsKCBTSUdBTFJNLCAgU2lnX0ludGVydXB0ICk7CisKKyNpZm5kZWYgV0lOMzIKKyAgICAvLyBJZ25vcmUgYnJva2VuIHBpcGVzCisgICAgc2lnbmFsKFNJR1BJUEUsU0lHX0lHTik7CisjZWxzZQorICAgIC8vIFN0YXJ0IHdpbnNvY2sKKyAgICBXU0FEQVRBIHdzYURhdGE7CisgICAgaW50IHJjID0gV1NBU3RhcnR1cCggMHgyMDIsICZ3c2FEYXRhICk7CisgICAgV0FSTl9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAiV1NBU3RhcnR1cCIgKTsKKwlpZiAocmMgPT0gU09DS0VUX0VSUk9SKQorCQlyZXR1cm4gMDsKKworICAgIC8vIFRlbGwgd2luZG93cyB3ZSB3YW50IHRvIGhhbmRsZSBvdXIgb3duIHNpZ25hbHMKKyAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIoIHNpZ19kaXNwYXRjaGVyLCB0cnVlICk7CisjZW5kaWYKKworICAgIC8vIEluaXRpYWxpemUgZ2xvYmFsIG11dGV4ZXMgYW5kIGNvbmRpdGlvbnMKKyAgICBDb25kaXRpb25fSW5pdGlhbGl6ZSAoICZSZXBvcnRDb25kICk7CisgICAgQ29uZGl0aW9uX0luaXRpYWxpemUgKCAmUmVwb3J0RG9uZUNvbmQgKTsKKyAgICBNdXRleF9Jbml0aWFsaXplKCAmZ3JvdXBDb25kICk7CisgICAgTXV0ZXhfSW5pdGlhbGl6ZSggJmNsaWVudHNfbXV0ZXggKTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHRocmVhZCBzdWJzeXN0ZW0KKyAgICB0aHJlYWRfaW5pdCggKTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIGludGVycnVwdCBoYW5kbGluZyB0aHJlYWQgdG8gMAorICAgIHNUaHJlYWQgPSB0aHJlYWRfemVyb2lkKCk7CisKKyAgICAvLyBwZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gcXVpdHRpbmcgSXBlcmYKKyAgICBhdGV4aXQoIGNsZWFudXAgKTsKKworICAgIC8vIEFsbG9jYXRlIHRoZSAiZ2xvYmFsIiBzZXR0aW5ncworICAgIHRocmVhZF9TZXR0aW5ncyogZXh0X2dTZXR0aW5ncyA9IG5ldyB0aHJlYWRfU2V0dGluZ3M7CisKKyAgICAvLyBJbml0aWFsaXplIHNldHRpbmdzIHRvIGRlZmF1bHRzCisgICAgU2V0dGluZ3NfSW5pdGlhbGl6ZSggZXh0X2dTZXR0aW5ncyApOworICAgIC8vIHJlYWQgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICBTZXR0aW5nc19QYXJzZUVudmlyb25tZW50KCBleHRfZ1NldHRpbmdzICk7CisgICAgLy8gcmVhZCBzZXR0aW5ncyBmcm9tIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzCisgICAgU2V0dGluZ3NfUGFyc2VDb21tYW5kTGluZSggYXJnYywgYXJndiwgZXh0X2dTZXR0aW5ncyApOworCisgICAgLy8gQ2hlY2sgZm9yIGVpdGhlciBoYXZpbmcgc3BlY2lmaWVkIGNsaWVudCBvciBzZXJ2ZXIKKyAgICBpZiAoIGV4dF9nU2V0dGluZ3MtPm1UaHJlYWRNb2RlID09IGtNb2RlX0NsaWVudCAKKyAgICAgICAgIHx8IGV4dF9nU2V0dGluZ3MtPm1UaHJlYWRNb2RlID09IGtNb2RlX0xpc3RlbmVyICkgeworI2lmZGVmIFdJTjMyCisgICAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgYXMgYSBkYWVtb24KKyAgICAgICAgLy8gRGFlbW9uIG1vZGUgZm9yIG5vbi13aW5kb3dzIGluIGhhbmRsZWQKKyAgICAgICAgLy8gaW4gdGhlIGxpc3RlbmVyX3NwYXduIGZ1bmN0aW9uCisgICAgICAgIGlmICggaXNEYWVtb24oIGV4dF9nU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgIENtZEluc3RhbGxTZXJ2aWNlKGFyZ2MsIGFyZ3YpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIFdpbmRvd3Mgc2VydmljZSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKCBpc1JlbW92ZVNlcnZpY2UoIGV4dF9nU2V0dGluZ3MgKSApIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc2VydmljZQorICAgICAgICAgICAgaWYgKCBDbWRSZW1vdmVTZXJ2aWNlKCkgKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJUGVyZiBTZXJ2aWNlIGlzIHJlbW92ZWQuXG4iKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBjbGllbnQocykKKyAgICAgICAgaWYgKCBleHRfZ1NldHRpbmdzLT5tVGhyZWFkTW9kZSA9PSBrTW9kZV9DbGllbnQgKSB7CisgICAgICAgICAgICBjbGllbnRfaW5pdCggZXh0X2dTZXR0aW5ncyApOworICAgICAgICB9CisKKyNpZmRlZiBIQVZFX1RIUkVBRAorICAgICAgICAvLyBzdGFydCB1cCB0aGUgcmVwb3J0ZXIgYW5kIGNsaWVudChzKSBvciBsaXN0ZW5lcgorICAgICAgICB7CisgICAgICAgICAgICB0aHJlYWRfU2V0dGluZ3MgKmludG8gPSBOVUxMOworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZXR0aW5ncyBzdHJ1Y3R1cmUgZm9yIHRoZSByZXBvcnRlciB0aHJlYWQKKyAgICAgICAgICAgIFNldHRpbmdzX0NvcHkoIGV4dF9nU2V0dGluZ3MsICZpbnRvICk7CisgICAgICAgICAgICBpbnRvLT5tVGhyZWFkTW9kZSA9IGtNb2RlX1JlcG9ydGVyOworCisgICAgICAgICAgICAvLyBIYXZlIHRoZSByZXBvcnRlciBsYXVuY2ggdGhlIGNsaWVudCBvciBsaXN0ZW5lcgorICAgICAgICAgICAgaW50by0+cnVuTm93ID0gZXh0X2dTZXR0aW5nczsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU3RhcnQgYWxsIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHJlYWR5IHRvIGdvCisgICAgICAgICAgICB0aHJlYWRfc3RhcnQoIGludG8gKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLy8gTm8gbmVlZCB0byBtYWtlIGEgcmVwb3J0ZXIgdGhyZWFkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aHJlYWRzCisgICAgICAgIHRocmVhZF9zdGFydCggZXh0X2dTZXR0aW5ncyApOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbmVpdGhlciBzZXJ2ZXIgbm9yIGNsaWVudCBtb2RlIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgLy8gcHJpbnQgdXNhZ2UgYW5kIGV4aXQKKworI2lmZGVmIFdJTjMyCisgICAgICAgIC8vIEluIFdpbjMyIHdlIGFsc28gYXR0ZW1wdCB0byBzdGFydCBhIHByZXZpb3VzbHkgZGVmaW5lZCBzZXJ2aWNlCisgICAgICAgIC8vIFN0YXJ0aW5nIGluIDIuMCB0byByZXN0YXJ0IGEgcHJldmlvdXNseSBkZWZpbmVkIHNlcnZpY2UKKyAgICAgICAgLy8geW91IG11c3QgY2FsbCBpcGVyZiB3aXRoICJpcGVyZiAtRCIgb3IgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgIFNFUlZJQ0VfVEFCTEVfRU5UUlkgZGlzcGF0Y2hUYWJsZVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgeyBURVhUKFNaU0VSVklDRU5BTUUpLCAoTFBTRVJWSUNFX01BSU5fRlVOQ1RJT04pc2VydmljZV9tYWlufSwKKyAgICAgICAgICAgIHsgTlVMTCwgTlVMTH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBPbmx5IGF0dGVtcHQgdG8gc3RhcnQgdGhlIHNlcnZpY2UgaWYgIi1EIiB3YXMgc3BlY2lmaWVkCisgICAgICAgIGlmICggIWlzRGFlbW9uKGV4dF9nU2V0dGluZ3MpIHx8CisgICAgICAgICAgICAgLy8gc3RhcnRpbmcgdGhlIHNlcnZpY2UgYnkgU0NNLCB0aGVyZSBpcyBubyBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgaW4uCisgICAgICAgICAgICAgLy8gdGhlIGFyZ3VtZW50cyB3aWxsIHBhc3MgaW50byBTZXJ2aWNlX01haW4gZW50cnkuCisgICAgICAgICAgICAgIVN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyKGRpc3BhdGNoVGFibGUpICkKKyAgICAgICAgICAgIC8vIElmIHRoZSBzZXJ2aWNlIGZhaWxlZCB0byBzdGFydCB0aGVuIHByaW50IHVzYWdlCisjZW5kaWYKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCB1c2FnZV9zaG9ydCwgYXJndlswXSwgYXJndlswXSApOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHdhaXQgZm9yIG90aGVyIChjbGllbnQsIHNlcnZlcikgdGhyZWFkcyB0byBjb21wbGV0ZQorICAgIHRocmVhZF9qb2luYWxsKCk7CisgICAgCisgICAgLy8gYWxsIGRvbmUhCisgICAgcmV0dXJuIDA7Cit9IC8vIGVuZCBtYWluCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNpZ25hbCBoYW5kbGVyIHNldHMgdGhlIHNJbnRlcnVwdGVkIGZsYWcsIHNvIHRoZSBvYmplY3QgY2FuCisgKiByZXNwb25kIGFwcHJvcHJpYXRlbHkuLiBbc3RhdGljXQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIFNpZ19JbnRlcnVwdCggaW50IGluU2lnbm8gKSB7CisjaWZkZWYgSEFWRV9USFJFQUQKKyAgICAvLyBXZSB0cnkgdG8gbm90IGFsbG93IGEgc2luZ2xlIGludGVycnVwdCBoYW5kbGVkIGJ5IG11bHRpcGxlIHRocmVhZHMKKyAgICAvLyB0byBjb21wbGV0ZWx5IGtpbGwgdGhlIGFwcCBzbyB3ZSBzYXZlIG9mZiB0aGUgZmlyc3QgdGhyZWFkIElECisgICAgLy8gdGhlbiB0aGF0IGlzIHRoZSBvbmx5IHRocmVhZCB0aGF0IGNhbiBzdXBwbHkgdGhlIG5leHQgaW50ZXJydXB0CisgICAgaWYgKCB0aHJlYWRfZXF1YWxpZCggc1RocmVhZCwgdGhyZWFkX3plcm9pZCgpICkgKSB7CisgICAgICAgIHNUaHJlYWQgPSB0aHJlYWRfZ2V0aWQoKTsKKyAgICB9IGVsc2UgaWYgKCB0aHJlYWRfZXF1YWxpZCggc1RocmVhZCwgdGhyZWFkX2dldGlkKCkgKSApIHsKKyAgICAgICAgc2lnX2V4aXQoIGluU2lnbm8gKTsKKyAgICB9CisKKyAgICAvLyBnbG9iYWwgdmFyaWFibGUgdXNlZCBieSB0aHJlYWRzIHRvIHNlZSBpZiB0aGV5IHdlcmUgaW50ZXJydXB0ZWQKKyAgICBzSW50ZXJ1cHRlZCA9IDE7CisKKyAgICAvLyB3aXRoIHRocmVhZHMsIHN0b3Agd2FpdGluZyBmb3Igbm9uLXRlcm1pbmF0aW5nIHRocmVhZHMKKyAgICAvLyAoaWUgTGlzdGVuZXIgVGhyZWFkKQorICAgIHRocmVhZF9yZWxlYXNlX25vbnRlcm0oIDEgKTsKKworI2Vsc2UKKyAgICAvLyB3aXRob3V0IHRocmVhZHMsIGp1c3QgZXhpdCBxdWlldGx5LCBzYW1lIGFzIHNpZ19leGl0KCkKKyAgICBzaWdfZXhpdCggaW5TaWdubyApOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFueSBuZWNlc2FyeSBjbGVhbnVwIGJlZm9yZSBJcGVyZiBxdWl0cy4gQ2FsbGVkIGF0IHByb2dyYW0gZXhpdCwKKyAqIGVpdGhlciBieSBleGl0KCkgb3IgdGVybWluYXRpbmcgbWFpbigpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGNsZWFudXAoIHZvaWQgKSB7CisjaWZkZWYgV0lOMzIKKyAgICAvLyBTaHV0ZG93biBXaW5zb2NrCisgICAgV1NBQ2xlYW51cCgpOworI2VuZGlmCisgICAgLy8gY2xlYW4gdXAgdGhlIGxpc3Qgb2YgY2xpZW50cworICAgIElwZXJmX2Rlc3Ryb3kgKCAmY2xpZW50cyApOworCisgICAgLy8gc2h1dGRvd24gdGhlIHRocmVhZCBzdWJzeXN0ZW0KKyAgICB0aHJlYWRfZGVzdHJveSggKTsKK30gLy8gZW5kIGNsZWFudXAKKworCisKKworCisKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9zZXJ2aWNlLmMgYi9pcGVyZi0yLjAuNS9zcmMvc2VydmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWU4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi0yLjAuNS9zcmMvc2VydmljZS5jCkBAIC0wLDAgKzEsNjAxIEBACisvLyBUSElTIENPREUgQU5EIElORk9STUFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRgorLy8gQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTworLy8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EL09SIEZJVE5FU1MgRk9SIEEKKy8vIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NyAgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyAgTU9EVUxFOiAgIHNlcnZpY2UuYworLy8KKy8vICBQVVJQT1NFOiAgSW1wbGVtZW50cyBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgYWxsIHNlcnZpY2VzCisvLyAgICAgICAgICAgIHdpbmRvd3MuCisvLworLy8gIEZVTkNUSU9OUzoKKy8vICAgIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKy8vICAgIHNlcnZpY2VfY3RybChEV09SRCBkd0N0cmxDb2RlKTsKKy8vICAgIHNlcnZpY2VfbWFpbihEV09SRCBkd0FyZ2MsIExQVFNUUiAqbHBzekFyZ3YpOworLy8gICAgQ21kSW5zdGFsbFNlcnZpY2UoKTsKKy8vICAgIENtZFJlbW92ZVNlcnZpY2UoKTsKKy8vICAgIENvbnRyb2xIYW5kbGVyICggRFdPUkQgZHdDdHJsVHlwZSApOworLy8gICAgR2V0TGFzdEVycm9yVGV4dCggTFBUU1RSIGxwc3pCdWYsIERXT1JEIGR3U2l6ZSApOworLy8KKy8vICBDT01NRU5UUzoKKy8vCisvLyAgQVVUSE9SOiBDcmFpZyBMaW5rIC0gTWljcm9zb2Z0IERldmVsb3BlciBTdXBwb3J0CisvLworCisvKgorICogbW9kaWZpZWQgTWFyLjA3LCAyMDAyIGJ5IEZlbmcgUWluIDxmcWluQG5jc2EudWl1Yy5lZHU+CisgKiAgICAgICAgICBNYXIuMTUsIDIwMDIKKyAqCisgKiByZW1vdmVkIHNvbWUgZnVuY3Rpb25zIHdlIGRvbid0IHVzZSBhdCBhbGwKKyAqIGFkZCBjb2RlIHRvIHN0YXJ0IHRoZSBzZXJ2aWNlIGltbWVkaWF0ZWx5IGFmdGVyIHNlcnZpY2UgaXMgaW5zdGFsbGVkCisgKiAKKyAqICRJZDogc2VydmljZS5jLHYgMS4xLjEuMSAyMDA0LzA1LzE4IDAxOjUwOjQ0IGtnaWJicyBFeHAgJAorICovCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorCisjaW5jbHVkZSAic2VydmljZS5oIgorCisKKworLy8gaW50ZXJuYWwgdmFyaWFibGVzCitTRVJWSUNFX1NUQVRVUyAgICAgICAgICBzc1N0YXR1czsgICAgICAgLy8gY3VycmVudCBzdGF0dXMgb2YgdGhlIHNlcnZpY2UKK1NFUlZJQ0VfU1RBVFVTX0hBTkRMRSAgIHNzaFN0YXR1c0hhbmRsZTsKK0RXT1JEICAgICAgICAgICAgICAgICAgIGR3RXJyID0gMDsKK1RDSEFSICAgICAgICAgICAgICAgICAgIHN6RXJyWzI1Nl07CisKKy8vCisvLyAgRlVOQ1RJT046IHNlcnZpY2VfbWFpbgorLy8KKy8vICBQVVJQT1NFOiBUbyBwZXJmb3JtIGFjdHVhbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgc2VydmljZQorLy8KKy8vICBQQVJBTUVURVJTOgorLy8gICAgZHdBcmdjICAgLSBudW1iZXIgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworLy8gICAgbHBzekFyZ3YgLSBhcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisvLworLy8gIFJFVFVSTiBWQUxVRToKKy8vICAgIG5vbmUKKy8vCisvLyAgQ09NTUVOVFM6CisvLyAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdGhlIHNlcnZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIHRoZW4gY2FsbHMKKy8vICAgIHRoZSB1c2VyIGRlZmluZWQgU2VydmljZVN0YXJ0KCkgcm91dGluZSB0byBwZXJmb3JtIG1ham9yaXR5CisvLyAgICBvZiB0aGUgd29yay4KKy8vCit2b2lkIFdJTkFQSSBzZXJ2aWNlX21haW4oRFdPUkQgZHdBcmdjLCBMUFRTVFIgKmxwc3pBcmd2KSB7CisgICAgLy8gcmVnaXN0ZXIgb3VyIHNlcnZpY2UgY29udHJvbCBoYW5kbGVyOgorICAgIC8vCisgICAgc3NoU3RhdHVzSGFuZGxlID0gUmVnaXN0ZXJTZXJ2aWNlQ3RybEhhbmRsZXIoIFRFWFQoU1pTRVJWSUNFTkFNRSksIHNlcnZpY2VfY3RybCk7CisKKyAgICBpZiAoICFzc2hTdGF0dXNIYW5kbGUgKQorICAgICAgICBnb3RvIGNsZWFuOworCisgICAgLy8gU0VSVklDRV9TVEFUVVMgbWVtYmVycyB0aGF0IGRvbid0IGNoYW5nZSBpbiBleGFtcGxlCisgICAgLy8KKyAgICBzc1N0YXR1cy5kd1NlcnZpY2VUeXBlID0gU0VSVklDRV9XSU4zMl9PV05fUFJPQ0VTUzsKKyAgICBzc1N0YXR1cy5kd1NlcnZpY2VTcGVjaWZpY0V4aXRDb2RlID0gMDsKKworICAgIC8vIHJlcG9ydCB0aGUgc3RhdHVzIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlci4KKyAgICAvLworICAgIGlmICggIVJlcG9ydFN0YXR1c1RvU0NNZ3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfU1RBUlRfUEVORElORywgLy8gc2VydmljZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19FUlJPUiwgICAgICAgICAgICAgIC8vIGV4aXQgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAwKSApICAgICAgICAgICAgICAgICAvLyB3YWl0IGhpbnQKKyAgICAgICAgZ290byBjbGVhbjsKKworCisgICAgU2VydmljZVN0YXJ0KCBkd0FyZ2MsIGxwc3pBcmd2ICk7CisKKyAgICBjbGVhbjoKKworICAgIC8vIHRyeSB0byByZXBvcnQgdGhlIHN0b3BwZWQgc3RhdHVzIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlci4KKyAgICAvLworICAgIGlmICggc3NoU3RhdHVzSGFuZGxlICkKKyAgICAgICAgKFZPSUQpUmVwb3J0U3RhdHVzVG9TQ01ncigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfU1RPUFBFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICByZXR1cm47Cit9CisKKworCisvLworLy8gIEZVTkNUSU9OOiBzZXJ2aWNlX2N0cmwKKy8vCisvLyAgUFVSUE9TRTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFNDTSB3aGVuZXZlcgorLy8gICAgICAgICAgIENvbnRyb2xTZXJ2aWNlKCkgaXMgY2FsbGVkIG9uIHRoaXMgc2VydmljZS4KKy8vCisvLyAgUEFSQU1FVEVSUzoKKy8vICAgIGR3Q3RybENvZGUgLSB0eXBlIG9mIGNvbnRyb2wgcmVxdWVzdGVkCisvLworLy8gIFJFVFVSTiBWQUxVRToKKy8vICAgIG5vbmUKKy8vCisvLyAgQ09NTUVOVFM6CisvLworVk9JRCBXSU5BUEkgc2VydmljZV9jdHJsKERXT1JEIGR3Q3RybENvZGUpIHsKKyAgICAvLyBIYW5kbGUgdGhlIHJlcXVlc3RlZCBjb250cm9sIGNvZGUuCisgICAgLy8KKyAgICBzd2l0Y2ggKCBkd0N0cmxDb2RlICkgeworICAgICAgICAvLyBTdG9wIHRoZSBzZXJ2aWNlLgorICAgICAgICAvLworICAgICAgICAvLyBTRVJWSUNFX1NUT1BfUEVORElORyBzaG91bGQgYmUgcmVwb3J0ZWQgYmVmb3JlCisgICAgICAgIC8vIHNldHRpbmcgdGhlIFN0b3AgRXZlbnQgLSBoU2VydmVyU3RvcEV2ZW50IC0gaW4KKyAgICAgICAgLy8gU2VydmljZVN0b3AoKS4gIFRoaXMgYXZvaWRzIGEgcmFjZSBjb25kaXRpb24KKyAgICAgICAgLy8gd2hpY2ggbWF5IHJlc3VsdCBpbiBhIDEwNTMgLSBUaGUgU2VydmljZSBkaWQgbm90IHJlc3BvbmQuLi4KKyAgICAgICAgLy8gZXJyb3IuCisgICAgICAgIGNhc2UgU0VSVklDRV9DT05UUk9MX1NUT1A6CisgICAgICAgICAgICBSZXBvcnRTdGF0dXNUb1NDTWdyKFNFUlZJQ0VfU1RPUF9QRU5ESU5HLCBOT19FUlJPUiwgMCk7CisgICAgICAgICAgICBTZXJ2aWNlU3RvcCgpOworCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VydmljZSBzdGF0dXMuCisgICAgICAgICAgICAvLworICAgICAgICBjYXNlIFNFUlZJQ0VfQ09OVFJPTF9JTlRFUlJPR0FURToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBpbnZhbGlkIGNvbnRyb2wgY29kZQorICAgICAgICAgICAgLy8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorICAgIFJlcG9ydFN0YXR1c1RvU0NNZ3IoU0VSVklDRV9TVE9QUEVELCBOT19FUlJPUiwgMCk7CisvLyAgICBSZXBvcnRTdGF0dXNUb1NDTWdyKHNzU3RhdHVzLmR3Q3VycmVudFN0YXRlLCBOT19FUlJPUiwgMCk7Cit9CisKKworCisvLworLy8gIEZVTkNUSU9OOiBSZXBvcnRTdGF0dXNUb1NDTWdyKCkKKy8vCisvLyAgUFVSUE9TRTogU2V0cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHNlcnZpY2UgYW5kCisvLyAgICAgICAgICAgcmVwb3J0cyBpdCB0byB0aGUgU2VydmljZSBDb250cm9sIE1hbmFnZXIKKy8vCisvLyAgUEFSQU1FVEVSUzoKKy8vICAgIGR3Q3VycmVudFN0YXRlIC0gdGhlIHN0YXRlIG9mIHRoZSBzZXJ2aWNlCisvLyAgICBkd1dpbjMyRXhpdENvZGUgLSBlcnJvciBjb2RlIHRvIHJlcG9ydAorLy8gICAgZHdXYWl0SGludCAtIHdvcnN0IGNhc2UgZXN0aW1hdGUgdG8gbmV4dCBjaGVja3BvaW50CisvLworLy8gIFJFVFVSTiBWQUxVRToKKy8vICAgIFRSVUUgIC0gc3VjY2VzcworLy8gICAgRkFMU0UgLSBmYWlsdXJlCisvLworLy8gIENPTU1FTlRTOgorLy8KK0JPT0wgUmVwb3J0U3RhdHVzVG9TQ01ncihEV09SRCBkd0N1cnJlbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1dpbjMyRXhpdENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdXYWl0SGludCkgeworICAgIHN0YXRpYyBEV09SRCBkd0NoZWNrUG9pbnQgPSAxOworICAgIEJPT0wgZlJlc3VsdCA9IFRSVUU7CisKKworICAgIGlmICggZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVEFSVF9QRU5ESU5HICkKKyAgICAgICAgc3NTdGF0dXMuZHdDb250cm9sc0FjY2VwdGVkID0gMDsKKyAgICBlbHNlCisgICAgICAgIHNzU3RhdHVzLmR3Q29udHJvbHNBY2NlcHRlZCA9IFNFUlZJQ0VfQUNDRVBUX1NUT1A7CisKKyAgICBzc1N0YXR1cy5kd0N1cnJlbnRTdGF0ZSA9IGR3Q3VycmVudFN0YXRlOworICAgIHNzU3RhdHVzLmR3V2luMzJFeGl0Q29kZSA9IGR3V2luMzJFeGl0Q29kZTsKKyAgICBzc1N0YXR1cy5kd1dhaXRIaW50ID0gZHdXYWl0SGludDsKKworICAgIGlmICggKCBkd0N1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1JVTk5JTkcgKSB8fAorICAgICAgICAgKCBkd0N1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1NUT1BQRUQgKSApCisgICAgICAgIHNzU3RhdHVzLmR3Q2hlY2tQb2ludCA9IDA7CisgICAgZWxzZQorICAgICAgICBzc1N0YXR1cy5kd0NoZWNrUG9pbnQgPSBkd0NoZWNrUG9pbnQrKzsKKworCisgICAgLy8gUmVwb3J0IHRoZSBzdGF0dXMgb2YgdGhlIHNlcnZpY2UgdG8gdGhlIHNlcnZpY2UgY29udHJvbCBtYW5hZ2VyLgorICAgIC8vCisgICAgaWYgKCAhKGZSZXN1bHQgPSBTZXRTZXJ2aWNlU3RhdHVzKCBzc2hTdGF0dXNIYW5kbGUsICZzc1N0YXR1cykpICkgeworICAgICAgICBBZGRUb01lc3NhZ2VMb2coVEVYVCgiU2V0U2VydmljZVN0YXR1cyIpKTsKKyAgICB9CisgICAgcmV0dXJuIGZSZXN1bHQ7Cit9CisKKworCisvLworLy8gIEZVTkNUSU9OOiBBZGRUb01lc3NhZ2VMb2coTFBUU1RSIGxwc3pNc2cpCisvLworLy8gIFBVUlBPU0U6IEFsbG93cyBhbnkgdGhyZWFkIHRvIGxvZyBhbiBlcnJvciBtZXNzYWdlCisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBscHN6TXNnIC0gdGV4dCBmb3IgbWVzc2FnZQorLy8KKy8vICBSRVRVUk4gVkFMVUU6CisvLyAgICBub25lCisvLworLy8gIENPTU1FTlRTOgorLy8KK1ZPSUQgQWRkVG9NZXNzYWdlTG9nKExQVFNUUiBscHN6TXNnKSB7CisgICAgVENIQVIgICBzek1zZ1syNTZdOworICAgIEhBTkRMRSAgaEV2ZW50U291cmNlOworICAgIExQVFNUUiAgbHBzelN0cmluZ3NbMl07CisKKworICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisKKyAgICAvLyBVc2UgZXZlbnQgbG9nZ2luZyB0byBsb2cgdGhlIGVycm9yLgorICAgIC8vCisgICAgaEV2ZW50U291cmNlID0gUmVnaXN0ZXJFdmVudFNvdXJjZShOVUxMLCBURVhUKFNaU0VSVklDRU5BTUUpKTsKKworICAgIHByaW50ZihscHN6TXNnKTsKKworICAgIF9zdHByaW50Zihzek1zZywgVEVYVCgiJXMgZXJyb3I6ICVkIiksIFRFWFQoU1pTRVJWSUNFTkFNRSksIGR3RXJyKTsKKyAgICBscHN6U3RyaW5nc1swXSA9IHN6TXNnOworICAgIGxwc3pTdHJpbmdzWzFdID0gbHBzek1zZzsKKworICAgIGlmICggaEV2ZW50U291cmNlICE9IE5VTEwgKSB7CisgICAgICAgIFJlcG9ydEV2ZW50KGhFdmVudFNvdXJjZSwgLy8gaGFuZGxlIG9mIGV2ZW50IHNvdXJjZQorICAgICAgICAgICAgICAgICAgICBFVkVOVExPR19FUlJPUl9UWVBFLCAgLy8gZXZlbnQgdHlwZQorICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgY2F0ZWdvcnkKKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IElECisgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHVzZXIncyBTSUQKKyAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZ3MgaW4gbHBzelN0cmluZ3MKKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJ5dGVzIG9mIHJhdyBkYXRhCisgICAgICAgICAgICAgICAgICAgIGxwc3pTdHJpbmdzLCAgICAgICAgICAvLyBhcnJheSBvZiBlcnJvciBzdHJpbmdzCisgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAgICAgICAvLyBubyByYXcgZGF0YQorCisgICAgICAgIChWT0lEKSBEZXJlZ2lzdGVyRXZlbnRTb3VyY2UoaEV2ZW50U291cmNlKTsKKyAgICB9Cit9CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgc2VydmljZSBpbnN0YWxsYXRpb24gYW5kIHJlbW92YWwKKy8vCisvLworLy8gIEZVTkNUSU9OOiBDbWRJbnN0YWxsU2VydmljZSgpCisvLworLy8gIFBVUlBPU0U6IEluc3RhbGxzIHRoZSBzZXJ2aWNlIGFuZCBTdGFydHMgaXQKKy8vCisvLyAgUEFSQU1FVEVSUzoKKy8vICAgIGFyZ2M6IG51bWJlciBvZiBhcmd1bWVudHMKKy8vCWFyZ3Y6IGFsbCBvZiB0aGUgYXJndW1lbnRzIGluY2x1ZGluZyB0aGUgcHJvZ3JhbSdzIG5hbWUKKy8vCisvLyAgUkVUVVJOIFZBTFVFOgorLy8gICAgbm9uZQorLy8KKy8vICBDT01NRU5UUzoKKy8vCit2b2lkIENtZEluc3RhbGxTZXJ2aWNlKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIFNDX0hBTkRMRSAgIHNjaFNlcnZpY2U7CisgICAgU0NfSEFORExFICAgc2NoU0NNYW5hZ2VyOworCisgICAgVENIQVIgc3pQYXRoWzUxMl07CisKKyAgICBpZiAoIEdldE1vZHVsZUZpbGVOYW1lKCBOVUxMLCBzelBhdGgsIDUxMiApID09IDAgKSB7CisgICAgICAgIF90cHJpbnRmKFRFWFQoIlVuYWJsZSB0byBpbnN0YWxsICVzIC0gJXNcbiIpLCBURVhUKFNaU0VSVklDRURJU1BMQVlOQU1FKSwgR2V0TGFzdEVycm9yVGV4dChzekVyciwgMjU2KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzY2hTQ01hbmFnZXIgPSBPcGVuU0NNYW5hZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lIChOVUxMID09IGxvY2FsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZSAoTlVMTCA9PSBkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MgICAvLyBhY2Nlc3MgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBpZiAoIHNjaFNDTWFuYWdlciApIHsKKyAgICAgICAgc2NoU2VydmljZSA9IE9wZW5TZXJ2aWNlKHNjaFNDTWFuYWdlciwgVEVYVChTWlNFUlZJQ0VOQU1FKSwgU0VSVklDRV9BTExfQUNDRVNTKTsKKyAgICAgICAgaWYgKCAhc2NoU2VydmljZSApIHsKKyAgICAgICAgICAgIHNjaFNlcnZpY2UgPSBDcmVhdGVTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hTQ01hbmFnZXIsICAgICAgICAgICAgICAgLy8gU0NNYW5hZ2VyIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoU1pTRVJWSUNFTkFNRSksICAgICAgICAvLyBuYW1lIG9mIHNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVChTWlNFUlZJQ0VESVNQTEFZTkFNRSksIC8vIG5hbWUgdG8gZGlzcGxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0FMTF9BQ0NFU1MsICAgICAgICAgLy8gZGVzaXJlZCBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9XSU4zMl9PV05fUFJPQ0VTUywgIC8vIHNlcnZpY2UgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0RFTUFORF9TVEFSVCwgICAgICAgLy8gc3RhcnQgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0VSUk9SX05PUk1BTCwgICAgICAgLy8gZXJyb3IgY29udHJvbCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UGF0aCwgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2aWNlJ3MgYmluYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBsb2FkIG9yZGVyaW5nIGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyB0YWcgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKFNaREVQRU5ERU5DSUVTKSwgICAgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbFN5c3RlbSBhY2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwYXNzd29yZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX3RwcmludGYoVEVYVCgiJXMgYWxyZWFkeSBpbnN0YWxsZWQuXG4iKSwgVEVYVChTWlNFUlZJQ0VESVNQTEFZTkFNRSkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHNjaFNlcnZpY2UgKSB7CisgICAgICAgICAgICBpZiAoIFF1ZXJ5U2VydmljZVN0YXR1cyggc2NoU2VydmljZSwgJnNzU3RhdHVzICkgKSB7CisgICAgICAgICAgICAgICAgaW50IHJjOworICAgICAgICAgICAgICAgIGlmICggc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QUEVEICkgeworICAgICAgICAgICAgICAgICAgICByYyA9IFN0YXJ0U2VydmljZShzY2hTZXJ2aWNlLCBhcmdjLTEsIGFyZ3YrMSk7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiAoIHJjICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBfdHByaW50ZihURVhUKCIlcyBzdGFydGVkLlxuIiksIFRFWFQoU1pTRVJWSUNFRElTUExBWU5BTUUpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY2hTZXJ2aWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF90cHJpbnRmKFRFWFQoIkNyZWF0ZVNlcnZpY2UgZmFpbGVkIC0gJXNcbiIpLCBHZXRMYXN0RXJyb3JUZXh0KHN6RXJyLCAyNTYpKTsKKyAgICAgICAgfQorCisgICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY2hTQ01hbmFnZXIpOworICAgIH0gZWxzZQorICAgICAgICBfdHByaW50ZihURVhUKCJPcGVuU0NNYW5hZ2VyIGZhaWxlZCAtICVzXG4iKSwgR2V0TGFzdEVycm9yVGV4dChzekVyciwyNTYpKTsKKworCit9CisKKworCisvLworLy8gIEZVTkNUSU9OOiBDbWRSZW1vdmVTZXJ2aWNlKCkKKy8vCisvLyAgUFVSUE9TRTogU3RvcHMgYW5kIHJlbW92ZXMgdGhlIHNlcnZpY2UKKy8vCisvLyAgUEFSQU1FVEVSUzoKKy8vICAgIG5vbmUKKy8vCisvLyAgUkVUVVJOIFZBTFVFOgorLy8gICAgVFJVRTogc2VydmljZSBleGlzdHMgYW5kIGlzIHJlbW92ZWQKKy8vCUZBTFNFOiBzZXJ2aWNlIGRvZXNuJ3QgZXhpc3QKKy8vCisvLyAgQ09NTUVOVFM6CisvLworQk9PTCBDbWRSZW1vdmVTZXJ2aWNlKCkgeworICAgIEJPT0wgaXNFeGlzdCA9IEZBTFNFOworICAgIFNDX0hBTkRMRSAgIHNjaFNlcnZpY2U7CisgICAgU0NfSEFORExFICAgc2NoU0NNYW5hZ2VyOworCisgICAgc2NoU0NNYW5hZ2VyID0gT3BlblNDTWFuYWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gbWFjaGluZSAoTlVMTCA9PSBsb2NhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgKE5VTEwgPT0gZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NfTUFOQUdFUl9BTExfQUNDRVNTICAgLy8gYWNjZXNzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKCBzY2hTQ01hbmFnZXIgKSB7CisgICAgICAgIHNjaFNlcnZpY2UgPSBPcGVuU2VydmljZShzY2hTQ01hbmFnZXIsIFRFWFQoU1pTRVJWSUNFTkFNRSksIFNFUlZJQ0VfQUxMX0FDQ0VTUyk7CisKKyAgICAgICAgaWYgKCBzY2hTZXJ2aWNlICkgeworICAgICAgICAgICAgaXNFeGlzdCA9IFRSVUU7CisgICAgICAgICAgICAvLyB0cnkgdG8gc3RvcCB0aGUgc2VydmljZQorICAgICAgICAgICAgaWYgKCBDb250cm9sU2VydmljZSggc2NoU2VydmljZSwgU0VSVklDRV9DT05UUk9MX1NUT1AsICZzc1N0YXR1cyApICkgeworICAgICAgICAgICAgICAgIF90cHJpbnRmKFRFWFQoIlN0b3BwaW5nICVzLiIpLCBURVhUKFNaU0VSVklDRURJU1BMQVlOQU1FKSk7CisgICAgICAgICAgICAgICAgU2xlZXAoIDEwMDAgKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICggUXVlcnlTZXJ2aWNlU3RhdHVzKCBzY2hTZXJ2aWNlLCAmc3NTdGF0dXMgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzc1N0YXR1cy5kd0N1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1NUT1BfUEVORElORyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90cHJpbnRmKFRFWFQoIi4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbGVlcCggMTAwMCApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QUEVEICkKKyAgICAgICAgICAgICAgICAgICAgX3RwcmludGYoVEVYVCgiXG4lcyBzdG9wcGVkLlxuIiksIFRFWFQoU1pTRVJWSUNFRElTUExBWU5BTUUpICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfdHByaW50ZihURVhUKCJcbiVzIGZhaWxlZCB0byBzdG9wLlxuIiksIFRFWFQoU1pTRVJWSUNFRElTUExBWU5BTUUpICk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm93IHJlbW92ZSB0aGUgc2VydmljZQorICAgICAgICAgICAgaWYgKCBEZWxldGVTZXJ2aWNlKHNjaFNlcnZpY2UpICkKKyAgICAgICAgICAgICAgICBfdHByaW50ZihURVhUKCIlcyByZW1vdmVkLlxuIiksIFRFWFQoU1pTRVJWSUNFRElTUExBWU5BTUUpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX3RwcmludGYoVEVYVCgiRGVsZXRlU2VydmljZSBmYWlsZWQgLSAlc1xuIiksIEdldExhc3RFcnJvclRleHQoc3pFcnIsMjU2KSk7CisKKworICAgICAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNlcnZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNDTWFuYWdlcik7CisgICAgfSBlbHNlCisgICAgICAgIF90cHJpbnRmKFRFWFQoIk9wZW5TQ01hbmFnZXIgZmFpbGVkIC0gJXNcbiIpLCBHZXRMYXN0RXJyb3JUZXh0KHN6RXJyLDI1NikpOworCisgICAgcmV0dXJuIGlzRXhpc3Q7Cit9CisKKy8vCisvLyAgRlVOQ1RJT046IENtZFN0YXJ0U2VydmljZSgpCisvLworLy8gIFBVUlBPU0U6IFN0YXJ0IHNlcnZpY2UgaWYgaXQgZXhpc3RzCisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBhcmdjOiBudW1iZXIgb2YgYXJndW1lbnRzCisvLwlhcmd2OiBhcmd1bWVudHMgaW5jbHVkaW5nIHByb2dyYW0ncyBuYW1lCisvLworLy8gIFJFVFVSTiBWQUxVRToKKy8vICAgIFRSVUU6IHNlcnZpY2UgZXhpc3RzIGFuZCBpcyBzdGFydGVkCisvLwlGQUxTRTogc2VydmljZSBkb2Vzbid0IGV4aXN0CisvLworLy8gIENPTU1FTlRTOgorLy8KK0JPT0wgQ21kU3RhcnRTZXJ2aWNlKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIEJPT0wgaXNFeGlzdCA9IEZBTFNFOworICAgIFNDX0hBTkRMRSAgIHNjaFNlcnZpY2U7CisgICAgU0NfSEFORExFICAgc2NoU0NNYW5hZ2VyOworCisgICAgc2NoU0NNYW5hZ2VyID0gT3BlblNDTWFuYWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gbWFjaGluZSAoTlVMTCA9PSBsb2NhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgKE5VTEwgPT0gZGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NfTUFOQUdFUl9BTExfQUNDRVNTICAgLy8gYWNjZXNzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKCBzY2hTQ01hbmFnZXIgKSB7CisgICAgICAgIHNjaFNlcnZpY2UgPSBPcGVuU2VydmljZShzY2hTQ01hbmFnZXIsIFRFWFQoU1pTRVJWSUNFTkFNRSksIFNFUlZJQ0VfQUxMX0FDQ0VTUyk7CisKKyAgICAgICAgaWYgKCBzY2hTZXJ2aWNlICkgeworICAgICAgICAgICAgaXNFeGlzdCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoIFF1ZXJ5U2VydmljZVN0YXR1cyggc2NoU2VydmljZSwgJnNzU3RhdHVzICkgKSB7CisgICAgICAgICAgICAgICAgaW50IHJjOworICAgICAgICAgICAgICAgIGlmICggc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QUEVEICkgeworICAgICAgICAgICAgICAgICAgICByYyA9IFN0YXJ0U2VydmljZShzY2hTZXJ2aWNlLCBhcmdjLTEsIGFyZ3YrMSk7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiAoIHJjICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBfdHByaW50ZihURVhUKCIlcyBzdGFydGVkLlxuIiksIFRFWFQoU1pTRVJWSUNFRElTUExBWU5BTUUpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU2VydmljZSk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNDTWFuYWdlcik7CisgICAgfSBlbHNlCisgICAgICAgIF90cHJpbnRmKFRFWFQoIk9wZW5TQ01hbmFnZXIgZmFpbGVkIC0gJXNcbiIpLCBHZXRMYXN0RXJyb3JUZXh0KHN6RXJyLDI1NikpOworCisgICAgcmV0dXJuIGlzRXhpc3Q7Cit9CisKKworCisKKy8vCisvLyAgRlVOQ1RJT046IEdldExhc3RFcnJvclRleHQKKy8vCisvLyAgUFVSUE9TRTogY29waWVzIGVycm9yIG1lc3NhZ2UgdGV4dCB0byBzdHJpbmcKKy8vCisvLyAgUEFSQU1FVEVSUzoKKy8vICAgIGxwc3pCdWYgLSBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgIGR3U2l6ZSAtIHNpemUgb2YgYnVmZmVyCisvLworLy8gIFJFVFVSTiBWQUxVRToKKy8vICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8KKy8vICBDT01NRU5UUzoKKy8vCitMUFRTVFIgR2V0TGFzdEVycm9yVGV4dCggTFBUU1RSIGxwc3pCdWYsIERXT1JEIGR3U2l6ZSApIHsKKyAgICBEV09SRCBkd1JldDsKKyAgICBMUFRTVFIgbHBzelRlbXAgPSBOVUxMOworCisgICAgZHdSZXQgPSBGb3JtYXRNZXNzYWdlKCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Rk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMQU5HX05FVVRSQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBUU1RSKSZscHN6VGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7CisKKyAgICAvLyBzdXBwbGllZCBidWZmZXIgaXMgbm90IGxvbmcgZW5vdWdoCisgICAgaWYgKCAhZHdSZXQgfHwgKCAobG9uZylkd1NpemUgPCAobG9uZylkd1JldCsxNCApICkKKyAgICAgICAgbHBzekJ1ZlswXSA9IFRFWFQoJ1wwJyk7CisgICAgZWxzZSB7CisgICAgICAgIGxwc3pUZW1wW2xzdHJsZW4obHBzelRlbXApLTJdID0gVEVYVCgnXDAnKTsgIC8vcmVtb3ZlIGNyIGFuZCBuZXdsaW5lIGNoYXJhY3RlcgorICAgICAgICBfc3RwcmludGYoIGxwc3pCdWYsIFRFWFQoIiVzICgweCV4KSIpLCBscHN6VGVtcCwgR2V0TGFzdEVycm9yKCkgKTsKKyAgICB9CisKKyAgICBpZiAoIGxwc3pUZW1wICkKKyAgICAgICAgTG9jYWxGcmVlKChITE9DQUwpIGxwc3pUZW1wICk7CisKKyAgICByZXR1cm4gbHBzekJ1ZjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VydmljZVN0YXJ0CisgKgorICogZWFjaCB0aW1lIHN0YXJ0aW5nIHRoZSBzZXJ2aWNlLCB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgc2VydmljZS4KKyAqIFN0YXJ0IHRoZSBzZXJ2aWNlLCBjZXJ0YWlubHkgaXQgaXMgb24gc2VydmVyLW1vZGUKKyAqIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworVk9JRCBTZXJ2aWNlU3RhcnQgKERXT1JEIGR3QXJnYywgTFBUU1RSICpscHN6QXJndikgeworICAgIAorICAgIC8vIHJlcG9ydCB0aGUgc3RhdHVzIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlci4KKyAgICAvLworICAgIGlmICggIVJlcG9ydFN0YXR1c1RvU0NNZ3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfU1RBUlRfUEVORElORywgLy8gc2VydmljZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19FUlJPUiwgICAgICAgICAgICAgIC8vIGV4aXQgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAwKSApICAgICAgICAgICAgICAgICAvLyB3YWl0IGhpbnQKKyAgICAgICAgZ290byBjbGVhbjsKKworICAgIHRocmVhZF9TZXR0aW5ncyogZXh0X2dTZXR0aW5ncyA9IG5ldyB0aHJlYWRfU2V0dGluZ3M7CisKKyAgICAvLyBJbml0aWFsaXplIHNldHRpbmdzIHRvIGRlZmF1bHRzCisgICAgU2V0dGluZ3NfSW5pdGlhbGl6ZSggZXh0X2dTZXR0aW5ncyApOworICAgIC8vIHJlYWQgc2V0dGluZ3MgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICBTZXR0aW5nc19QYXJzZUVudmlyb25tZW50KCBleHRfZ1NldHRpbmdzICk7CisgICAgLy8gcmVhZCBzZXR0aW5ncyBmcm9tIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzCisgICAgU2V0dGluZ3NfUGFyc2VDb21tYW5kTGluZSggZHdBcmdjLCBscHN6QXJndiwgZXh0X2dTZXR0aW5ncyApOworCisgICAgLy8gcmVwb3J0IHRoZSBzdGF0dXMgdG8gdGhlIHNlcnZpY2UgY29udHJvbCBtYW5hZ2VyLgorICAgIC8vCisgICAgaWYgKCAhUmVwb3J0U3RhdHVzVG9TQ01ncigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9TVEFSVF9QRU5ESU5HLCAvLyBzZXJ2aWNlIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0VSUk9SLCAgICAgICAgICAgICAgLy8gZXhpdCBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMDApICkgICAgICAgICAgICAgICAgIC8vIHdhaXQgaGludAorICAgICAgICBnb3RvIGNsZWFuOworCisgICAgLy8gaWYgbmVlZGVkLCByZWRpcmVjdCB0aGUgb3V0cHV0IGludG8gYSBzcGVjaWZpZWQgZmlsZQorICAgIGlmICggIWlzU1RET1VUKCBleHRfZ1NldHRpbmdzICkgKSB7CisgICAgICAgIHJlZGlyZWN0KCBleHRfZ1NldHRpbmdzLT5tT3V0cHV0RmlsZU5hbWUgKTsKKyAgICB9CisKKyAgICAvLyByZXBvcnQgdGhlIHN0YXR1cyB0byB0aGUgc2VydmljZSBjb250cm9sIG1hbmFnZXIuCisgICAgLy8KKyAgICBpZiAoICFSZXBvcnRTdGF0dXNUb1NDTWdyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX1NUQVJUX1BFTkRJTkcsIC8vIHNlcnZpY2Ugc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fRVJST1IsICAgICAgICAgICAgICAvLyBleGl0IGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMCkgKSAgICAgICAgICAgICAgICAgLy8gd2FpdCBoaW50CisgICAgICAgIGdvdG8gY2xlYW47CisgICAgCisgICAgLy8gaW5pdGlhbGl6ZSBjbGllbnQocykKKyAgICBpZiAoIGV4dF9nU2V0dGluZ3MtPm1UaHJlYWRNb2RlID09IGtNb2RlX0NsaWVudCApIHsKKyAgICAgICAgY2xpZW50X2luaXQoIGV4dF9nU2V0dGluZ3MgKTsKKyAgICB9CisKKyAgICAvLyBzdGFydCB1cCB0aGUgcmVwb3J0ZXIgYW5kIGNsaWVudChzKSBvciBsaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdGhyZWFkX1NldHRpbmdzICppbnRvID0gTlVMTDsKKyNpZmRlZiBIQVZFX1RIUkVBRAorICAgICAgICBTZXR0aW5nc19Db3B5KCBleHRfZ1NldHRpbmdzLCAmaW50byApOworICAgICAgICBpbnRvLT5tVGhyZWFkTW9kZSA9IGtNb2RlX1JlcG9ydGVyOworICAgICAgICBpbnRvLT5ydW5Ob3cgPSBleHRfZ1NldHRpbmdzOworI2Vsc2UKKyAgICAgICAgaW50byA9IGV4dF9nU2V0dGluZ3M7CisjZW5kaWYKKyAgICAgICAgdGhyZWFkX3N0YXJ0KCBpbnRvICk7CisgICAgfQorICAgIAorICAgIC8vIHJlcG9ydCB0aGUgc3RhdHVzIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlci4KKyAgICAvLworICAgIGlmICggIVJlcG9ydFN0YXR1c1RvU0NNZ3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfUlVOTklORywgICAgICAgLy8gc2VydmljZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19FUlJPUiwgICAgICAgICAgICAgIC8vIGV4aXQgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSApICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGhpbnQKKyAgICAgICAgZ290byBjbGVhbjsKKworICAgIGNsZWFuOgorICAgIC8vIHdhaXQgZm9yIG90aGVyIChjbGllbnQsIHNlcnZlcikgdGhyZWFkcyB0byBjb21wbGV0ZQorICAgIHRocmVhZF9qb2luYWxsKCk7Cit9CisKKworLy8KKy8vICBGVU5DVElPTjogU2VydmljZVN0b3AKKy8vCisvLyAgUFVSUE9TRTogU3RvcHMgdGhlIHNlcnZpY2UKKy8vCisvLyAgUEFSQU1FVEVSUzoKKy8vICAgIG5vbmUKKy8vCisvLyAgUkVUVVJOIFZBTFVFOgorLy8gICAgbm9uZQorLy8KKy8vICBDT01NRU5UUzoKKy8vICAgIElmIGEgU2VydmljZVN0b3AgcHJvY2VkdXJlIGlzIGdvaW5nIHRvCisvLyAgICB0YWtlIGxvbmdlciB0aGFuIDMgc2Vjb25kcyB0byBleGVjdXRlLAorLy8gICAgaXQgc2hvdWxkIHNwYXduIGEgdGhyZWFkIHRvIGV4ZWN1dGUgdGhlCisvLyAgICBzdG9wIGNvZGUsIGFuZCByZXR1cm4uICBPdGhlcndpc2UsIHRoZQorLy8gICAgU2VydmljZUNvbnRyb2xNYW5hZ2VyIHdpbGwgYmVsaWV2ZSB0aGF0CisvLyAgICB0aGUgc2VydmljZSBoYXMgc3RvcHBlZCByZXNwb25kaW5nLgorLy8gICAgCitWT0lEIFNlcnZpY2VTdG9wKCkgeworI2lmZGVmIEhBVkVfVEhSRUFECisgICAgU2lnX0ludGVydXB0KCAxICk7CisjZWxzZQorICAgIHNpZ19leGl0KDEpOworI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaXBlcmYtMi4wLjUvc3JjL3NvY2tldHMuYyBiL2lwZXJmLTIuMC41L3NyYy9zb2NrZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlZGRkOAotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L3NyYy9zb2NrZXRzLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAgICAgICAgICAgIAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uICAgIAorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIChJcGVyZikgYW5kIGFzc29jaWF0ZWQgICAgICAgCisgKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlICAKKyAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlICAgICAgICAgIAorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgICAgICAgIAorICogc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCAgICAgCisgKiBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworICogc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIAorICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4gCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIAorICogZGlzY2xhaW1lcnMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAKKyAqICAgICAKKyAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBOQ1NBLCAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIAorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgCisgKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCAKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRJQlVUT1JTIE9SIENPUFlSSUdIVCAKKyAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCAKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBBcHBsaWVkIE5ldHdvcmsgUmVzZWFyY2ggCisgKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucyAKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbiAKKyAqIGh0dHA6Ly93d3cubmNzYS51aXVjLmVkdQorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAKKyAqCisgKiBzb2NrZXQuYworICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldC9nZXRzb2Nrb3B0IGFuZCByZWFkL3dyaXRlIHdyYXBwZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJoZWFkZXJzLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElmIGluTVNTID4gMCwgc2V0IHRoZSBUQ1AgbWF4aW11bSBzZWdtZW50IHNpemUgIGZvciBpblNvY2suCisgKiBPdGhlcndpc2UgbGVhdmUgaXQgYXMgdGhlIHN5c3RlbSBkZWZhdWx0LgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyIHdhcm5fbXNzX2ZhaWxbXSA9ICJcCitXQVJOSU5HOiBhdHRlbXB0IHRvIHNldCBUQ1AgbWF4bWltdW0gc2VnbWVudCBzaXplIHRvICVkIGZhaWxlZC5cblwKK1NldHRpbmcgdGhlIE1TUyBtYXkgbm90IGJlIGltcGxlbWVudGVkIG9uIHRoaXMgT1MuXG4iOworCitjb25zdCBjaGFyIHdhcm5fbXNzX25vdHNldFtdID0KKyJXQVJOSU5HOiBhdHRlbXB0IHRvIHNldCBUQ1AgbWF4aW11bSBzZWdtZW50IHNpemUgdG8gJWQsIGJ1dCBnb3QgJWRcbiI7CisKK3ZvaWQgc2V0c29ja190Y3BfbXNzKCBpbnQgaW5Tb2NrLCBpbnQgaW5NU1MgKSB7CisjaWZkZWYgVENQX01BWFNFRworICAgIGludCByYzsKKyAgICBpbnQgbmV3TVNTOworICAgIFNvY2tsZW5fdCBsZW47CisKKyAgICBhc3NlcnQoIGluU29jayAhPSBJTlZBTElEX1NPQ0tFVCApOworCisgICAgaWYgKCBpbk1TUyA+IDAgKSB7CisgICAgICAgIC8qIHNldCAqLworICAgICAgICBuZXdNU1MgPSBpbk1TUzsKKyAgICAgICAgbGVuID0gc2l6ZW9mKCBuZXdNU1MgKTsKKyAgICAgICAgcmMgPSBzZXRzb2Nrb3B0KCBpblNvY2ssIElQUFJPVE9fVENQLCBUQ1BfTUFYU0VHLCAoY2hhciopICZuZXdNU1MsICBsZW4gKTsKKyAgICAgICAgaWYgKCByYyA9PSBTT0NLRVRfRVJST1IgKSB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIHdhcm5fbXNzX2ZhaWwsIG5ld01TUyApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogdmVyaWZ5IHJlc3VsdHMgKi8KKyAgICAgICAgcmMgPSBnZXRzb2Nrb3B0KCBpblNvY2ssIElQUFJPVE9fVENQLCBUQ1BfTUFYU0VHLCAoY2hhciopICZuZXdNU1MsICZsZW4gKTsKKyAgICAgICAgV0FSTl9lcnJubyggcmMgPT0gU09DS0VUX0VSUk9SLCAiZ2V0c29ja29wdCBUQ1BfTUFYU0VHIiApOworICAgICAgICBpZiAoIG5ld01TUyAhPSBpbk1TUyApIHsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgd2Fybl9tc3Nfbm90c2V0LCBpbk1TUywgbmV3TVNTICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30gLyogZW5kIHNldHNvY2tfdGNwX21zcyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZXR1cm5zIHRoZSBUQ1AgbWF4aW11bSBzZWdtZW50IHNpemUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGdldHNvY2tfdGNwX21zcyggaW50IGluU29jayApIHsKKyAgICBpbnQgdGhlTVNTID0gMDsKKworI2lmZGVmIFRDUF9NQVhTRUcKKyAgICBpbnQgcmM7CisgICAgU29ja2xlbl90IGxlbjsKKyAgICBhc3NlcnQoIGluU29jayA+PSAwICk7CisKKyAgICAvKiBxdWVyeSBmb3IgTVNTICovCisgICAgbGVuID0gc2l6ZW9mKCB0aGVNU1MgKTsKKyAgICByYyA9IGdldHNvY2tvcHQoIGluU29jaywgSVBQUk9UT19UQ1AsIFRDUF9NQVhTRUcsIChjaGFyKikgJnRoZU1TUywgJmxlbiApOworICAgIFdBUk5fZXJybm8oIHJjID09IFNPQ0tFVF9FUlJPUiwgImdldHNvY2tvcHQgVENQX01BWFNFRyIgKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHRoZU1TUzsKK30gLyogZW5kIGdldHNvY2tfdGNwX21zcyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBBdHRlbXB0cyB0byByZWFkcyBuIGJ5dGVzIGZyb20gYSBzb2NrZXQuCisgKiBSZXR1cm5zIG51bWJlciBhY3R1YWxseSByZWFkLCBvciAtMSBvbiBlcnJvci4KKyAqIElmIG51bWJlciByZWFkIDwgaW5MZW4gdGhlbiB3ZSByZWFjaGVkIEVPRi4KKyAqCisgKiBmcm9tIFN0ZXZlbnMsIDE5OTgsIHNlY3Rpb24gMy45CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3NzaXplX3QgcmVhZG4oIGludCBpblNvY2ssIHZvaWQgKm91dEJ1Ziwgc2l6ZV90IGluTGVuICkgeworICAgIHNpemVfdCAgbmxlZnQ7CisgICAgc3NpemVfdCBucmVhZDsKKyAgICBjaGFyICpwdHI7CisKKyAgICBhc3NlcnQoIGluU29jayA+PSAwICk7CisgICAgYXNzZXJ0KCBvdXRCdWYgIT0gTlVMTCApOworICAgIGFzc2VydCggaW5MZW4gPiAwICk7CisKKyAgICBwdHIgICA9IChjaGFyKikgb3V0QnVmOworICAgIG5sZWZ0ID0gaW5MZW47CisKKyAgICB3aGlsZSAoIG5sZWZ0ID4gMCApIHsKKyAgICAgICAgbnJlYWQgPSByZWFkKCBpblNvY2ssIHB0ciwgbmxlZnQgKTsKKyAgICAgICAgaWYgKCBucmVhZCA8IDAgKSB7CisgICAgICAgICAgICBpZiAoIGVycm5vID09IEVJTlRSICkKKyAgICAgICAgICAgICAgICBucmVhZCA9IDA7ICAvKiBpbnRlcnVwdGVkLCBjYWxsIHJlYWQgYWdhaW4gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAvKiBlcnJvciAqLworICAgICAgICB9IGVsc2UgaWYgKCBucmVhZCA9PSAwICkKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgLyogRU9GICovCisKKyAgICAgICAgbmxlZnQgLT0gbnJlYWQ7CisgICAgICAgIHB0ciAgICs9IG5yZWFkOworICAgIH0KKworICAgIHJldHVybihpbkxlbiAtIG5sZWZ0KTsKK30gLyogZW5kIHJlYWRuICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEF0dGVtcHRzIHRvIHdyaXRlICBuIGJ5dGVzIHRvIGEgc29ja2V0LgorICogcmV0dXJucyBudW1iZXIgYWN0dWFsbHkgd3JpdHRlbiwgb3IgLTEgb24gZXJyb3IuCisgKiBudW1iZXIgd3JpdHRlbiBpcyBhbHdheXMgaW5MZW4gaWYgdGhlcmUgaXMgbm90IGFuIGVycm9yLgorICoKKyAqIGZyb20gU3RldmVucywgMTk5OCwgc2VjdGlvbiAzLjkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3NpemVfdCB3cml0ZW4oIGludCBpblNvY2ssIGNvbnN0IHZvaWQgKmluQnVmLCBzaXplX3QgaW5MZW4gKSB7CisgICAgc2l6ZV90ICBubGVmdDsKKyAgICBzc2l6ZV90IG53cml0dGVuOworICAgIGNvbnN0IGNoYXIgKnB0cjsKKworICAgIGFzc2VydCggaW5Tb2NrID49IDAgKTsKKyAgICBhc3NlcnQoIGluQnVmICE9IE5VTEwgKTsKKyAgICBhc3NlcnQoIGluTGVuID4gMCApOworCisgICAgcHRyICAgPSAoY2hhciopIGluQnVmOworICAgIG5sZWZ0ID0gaW5MZW47CisKKyAgICB3aGlsZSAoIG5sZWZ0ID4gMCApIHsKKyAgICAgICAgbndyaXR0ZW4gPSB3cml0ZSggaW5Tb2NrLCBwdHIsIG5sZWZ0ICk7CisgICAgICAgIGlmICggbndyaXR0ZW4gPD0gMCApIHsKKyAgICAgICAgICAgIGlmICggZXJybm8gPT0gRUlOVFIgKQorICAgICAgICAgICAgICAgIG53cml0dGVuID0gMDsgLyogaW50ZXJ1cHRlZCwgY2FsbCB3cml0ZSBhZ2FpbiAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgLyogZXJyb3IgKi8KKyAgICAgICAgfQorCisgICAgICAgIG5sZWZ0IC09IG53cml0dGVuOworICAgICAgICBwdHIgICArPSBud3JpdHRlbjsKKyAgICB9CisKKyAgICByZXR1cm4gaW5MZW47Cit9IC8qIGVuZCB3cml0ZW4gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwZXJmLTIuMC41L3NyYy9zdGRpby5jIGIvaXBlcmYtMi4wLjUvc3JjL3N0ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzOTRkMQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L3NyYy9zdGRpby5jCkBAIC0wLDAgKzEsMjgyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqIENvcHlyaWdodCAoYykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBUaGUgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgICAgICAgICAgICAKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiAgICAKKyAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSAoSXBlcmYpIGFuZCBhc3NvY2lhdGVkICAgICAgIAorICogZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSAgCisgKiB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSAgICAgICAgICAKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsICAgICAgICAKKyAqIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgICAgIAorICogcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KKyAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKgorICogICAgIAorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSAKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCAKKyAqIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuIAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyAKKyAqIGRpc2NsYWltZXJzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogCisgKiAgICAgCisgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgTkNTQSwgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSAKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIAorICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgCisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05USUJVVE9SUyBPUiBDT1BZUklHSFQgCisgKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgQXBwbGllZCBOZXR3b3JrIFJlc2VhcmNoIAorICogTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMgCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24gCisgKiBodHRwOi8vd3d3Lm5jc2EudWl1Yy5lZHUKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gCisgKgorICogc3RkaW8uYworICogYnkgTWFyayBHYXRlcyA8bWdhdGVzQG5sYW5yLm5ldD4KKyAqIGFuZCBBamF5IFRpcnVtYWxsYSA8dGlydW1hbGFAbmNzYS51aXVjLmVkdT4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlucHV0IGFuZCBvdXRwdXQgbnVtYmVycywgY29udmVydGluZyB3aXRoIGtpbG8sIG1lZ2EsIGdpZ2EKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworY29uc3QgbG9uZyBrS2lsb190b19Vbml0ID0gMTAyNDsKK2NvbnN0IGxvbmcga01lZ2FfdG9fVW5pdCA9IDEwMjQgKiAxMDI0OworY29uc3QgbG9uZyBrR2lnYV90b19Vbml0ID0gMTAyNCAqIDEwMjQgKiAxMDI0OworCitjb25zdCBsb25nIGtraWxvX3RvX1VuaXQgPSAxMDAwOworY29uc3QgbG9uZyBrbWVnYV90b19Vbml0ID0gMTAwMCAqIDEwMDA7Citjb25zdCBsb25nIGtnaWdhX3RvX1VuaXQgPSAxMDAwICogMTAwMCAqIDEwMDA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGJ5dGVfYXRvZgorICoKKyAqIEdpdmVuIGEgc3RyaW5nIG9mIGZvcm0gI3ggd2hlcmUgIyBpcyBhIG51bWJlciBhbmQgeCBpcyBhIGZvcm1hdAorICogY2hhcmFjdGVyIGxpc3RlZCBiZWxvdywgdGhpcyByZXR1cm5zIHRoZSBpbnRlcnByZXRlZCBpbnRlZ2VyLgorICogR2csIE1tLCBLayBhcmUgZ2lnYSwgbWVnYSwga2lsbyByZXNwZWN0aXZlbHkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZG91YmxlIGJ5dGVfYXRvZiggY29uc3QgY2hhciAqaW5TdHJpbmcgKSB7CisgICAgZG91YmxlIHRoZU51bTsKKyAgICBjaGFyIHN1ZmZpeCA9ICdcMCc7CisKKyAgICBhc3NlcnQoIGluU3RyaW5nICE9IE5VTEwgKTsKKworICAgIC8qIHNjYW4gdGhlIG51bWJlciBhbmQgYW55IHN1ZmZpY2VzICovCisgICAgc3NjYW5mKCBpblN0cmluZywgIiVsZiVjIiwgJnRoZU51bSwgJnN1ZmZpeCApOworCisgICAgLyogY29udmVydCBhY2NvcmRpbmcgdG8gW0dnIE1tIEtrXSAqLworICAgIHN3aXRjaCAoIHN1ZmZpeCApIHsKKyAgICAgICAgY2FzZSAnRyc6ICB0aGVOdW0gKj0ga0dpZ2FfdG9fVW5pdDsgIGJyZWFrOworICAgICAgICBjYXNlICdNJzogIHRoZU51bSAqPSBrTWVnYV90b19Vbml0OyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0snOiAgdGhlTnVtICo9IGtLaWxvX3RvX1VuaXQ7ICBicmVhazsKKyAgICAgICAgY2FzZSAnZyc6ICB0aGVOdW0gKj0ga2dpZ2FfdG9fVW5pdDsgIGJyZWFrOworICAgICAgICBjYXNlICdtJzogIHRoZU51bSAqPSBrbWVnYV90b19Vbml0OyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2snOiAgdGhlTnVtICo9IGtraWxvX3RvX1VuaXQ7ICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0aGVOdW07Cit9IC8qIGVuZCBieXRlX2F0b2YgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYnl0ZV9hdG9pCisgKgorICogR2l2ZW4gYSBzdHJpbmcgb2YgZm9ybSAjeCB3aGVyZSAjIGlzIGEgbnVtYmVyIGFuZCB4IGlzIGEgZm9ybWF0CisgKiBjaGFyYWN0ZXIgbGlzdGVkIGJlbG93LCB0aGlzIHJldHVybnMgdGhlIGludGVycHJldGVkIGludGVnZXIuCisgKiBHZywgTW0sIEtrIGFyZSBnaWdhLCBtZWdhLCBraWxvIHJlc3BlY3RpdmVseQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCittYXhfc2l6ZV90IGJ5dGVfYXRvaSggY29uc3QgY2hhciAqaW5TdHJpbmcgKSB7CisgICAgZG91YmxlIHRoZU51bTsKKyAgICBjaGFyIHN1ZmZpeCA9ICdcMCc7CisKKyAgICBhc3NlcnQoIGluU3RyaW5nICE9IE5VTEwgKTsKKworICAgIC8qIHNjYW4gdGhlIG51bWJlciBhbmQgYW55IHN1ZmZpY2VzICovCisgICAgc3NjYW5mKCBpblN0cmluZywgIiVsZiVjIiwgJnRoZU51bSwgJnN1ZmZpeCApOworCisgICAgLyogY29udmVydCBhY2NvcmRpbmcgdG8gW0dnIE1tIEtrXSAqLworICAgIHN3aXRjaCAoIHN1ZmZpeCApIHsKKyAgICAgICAgY2FzZSAnRyc6ICB0aGVOdW0gKj0ga0dpZ2FfdG9fVW5pdDsgIGJyZWFrOworICAgICAgICBjYXNlICdNJzogIHRoZU51bSAqPSBrTWVnYV90b19Vbml0OyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0snOiAgdGhlTnVtICo9IGtLaWxvX3RvX1VuaXQ7ICBicmVhazsKKyAgICAgICAgY2FzZSAnZyc6ICB0aGVOdW0gKj0ga2dpZ2FfdG9fVW5pdDsgIGJyZWFrOworICAgICAgICBjYXNlICdtJzogIHRoZU51bSAqPSBrbWVnYV90b19Vbml0OyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2snOiAgdGhlTnVtICo9IGtraWxvX3RvX1VuaXQ7ICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIHJldHVybiAobWF4X3NpemVfdCkgdGhlTnVtOworfSAvKiBlbmQgYnl0ZV9hdG9mICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNvbnN0YW50cyBmb3IgYnl0ZV9wcmludGYKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdXNlZCBhcyBpbmRpY2VzIGludG8ga0NvbnZlcnNpb25bXSwga0xhYmVsX0J5dGVbXSwgYW5kIGtMYWJlbF9iaXRbXSAqLworZW51bSB7CisgICAga0NvbnZfVW5pdCwKKyAgICBrQ29udl9LaWxvLAorICAgIGtDb252X01lZ2EsCisgICAga0NvbnZfR2lnYQorfTsKKworLyogZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBudW1iZXIgYnkgKi8KK2NvbnN0IGRvdWJsZSBrQ29udmVyc2lvbltdID0KK3sKKyAgICAxLjAsICAgICAgICAgICAgICAgICAgICAgICAvKiB1bml0ICovCisgICAgMS4wIC8gMTAyNCwgICAgICAgICAgICAgICAgLyoga2lsbyAqLworICAgIDEuMCAvIDEwMjQgLyAxMDI0LCAgICAgICAgIC8qIG1lZ2EgKi8KKyAgICAxLjAgLyAxMDI0IC8gMTAyNCAvIDEwMjQgICAvKiBnaWdhICovCit9OworCisvKiBmYWN0b3IgdG8gbXVsdGlwbHkgdGhlIG51bWJlciBieSBmb3IgYml0cyovCitjb25zdCBkb3VibGUga0NvbnZlcnNpb25Gb3JCaXRzW10gPQoreworICAgIDEuMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuaXQgKi8KKyAgICAxLjAgLyAxMDAwLCAgICAgICAgICAgICAgICAvKiBraWxvICovCisgICAgMS4wIC8gMTAwMCAvIDEwMDAsICAgICAgICAgLyogbWVnYSAqLworICAgIDEuMCAvIDEwMDAgLyAxMDAwIC8gMTAwMCAgIC8qIGdpZ2EgKi8KK307CisKKworLyogbGFiZWxzIGZvciBCeXRlIGZvcm1hdHMgW0tNR10gKi8KK2NvbnN0IGNoYXIqIGtMYWJlbF9CeXRlW10gPQoreworICAgICJCeXRlIiwKKyAgICAiS0J5dGUiLAorICAgICJNQnl0ZSIsCisgICAgIkdCeXRlIgorfTsKKworLyogbGFiZWxzIGZvciBiaXQgZm9ybWF0cyBba21nXSAqLworY29uc3QgY2hhcioga0xhYmVsX2JpdFtdICA9Cit7CisgICAgImJpdCIsIAorICAgICJLYml0IiwKKyAgICAiTWJpdCIsCisgICAgIkdiaXQiCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBieXRlX3NucHJpbnRmCisgKgorICogR2l2ZW4gYSBudW1iZXIgaW4gYnl0ZXMgYW5kIGEgZm9ybWF0LCBjb252ZXJ0cyB0aGUgbnVtYmVyIGFuZAorICogcHJpbnRzIGl0IG91dCB3aXRoIGEgYml0cyBvciBieXRlcyBsYWJlbC4KKyAqICAgQiwgSywgTSwgRywgQSBmb3IgQnl0ZSwgS2J5dGUsIE1ieXRlLCBHYnl0ZSwgYWRhcHRpdmUgYnl0ZQorICogICBiLCBrLCBtLCBnLCBhIGZvciBiaXQsICBLYml0LCAgTWJpdCwgIEdiaXQsICBhZGFwdGl2ZSBiaXQKKyAqIGFkYXB0aXZlIHBpY2tzIHRoZSAiYmVzdCIgb25lIGJhc2VkIG9uIHRoZSBudW1iZXIuCisgKiBvdXRTdHJpbmcgc2hvdWxkIGJlIGF0IGxlYXN0IDExIGNoYXJzIGxvbmcKKyAqICg0IGRpZ2l0cyArIHNwYWNlICsgNSBjaGFycyBtYXggKyBudWxsKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGJ5dGVfc25wcmludGYoIGNoYXIqIG91dFN0cmluZywgaW50IGluTGVuLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgaW5OdW0sIGNoYXIgaW5Gb3JtYXQgKSB7CisgICAgaW50IGNvbnY7CisgICAgY29uc3QgY2hhciogc3VmZml4OworICAgIGNvbnN0IGNoYXIqIGZvcm1hdDsKKworICAgIC8qIGNvbnZlcnQgdG8gYml0cyBmb3IgW2JrbWdhXSAqLworICAgIGlmICggISBpc3VwcGVyKCAoaW50KWluRm9ybWF0ICkgKSB7CisgICAgICAgIGluTnVtICo9IDg7CisgICAgfQorCisgICAgc3dpdGNoICggdG91cHBlcihpbkZvcm1hdCkgKSB7CisgICAgICAgIGNhc2UgJ0InOiBjb252ID0ga0NvbnZfVW5pdDsgYnJlYWs7CisgICAgICAgIGNhc2UgJ0snOiBjb252ID0ga0NvbnZfS2lsbzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ00nOiBjb252ID0ga0NvbnZfTWVnYTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ0cnOiBjb252ID0ga0NvbnZfR2lnYTsgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAnQSc6IHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdG1wTnVtID0gaW5OdW07CisgICAgICAgICAgICAgICAgY29udiA9IGtDb252X1VuaXQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIGlzdXBwZXIoKGludClpbkZvcm1hdCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICggdG1wTnVtID49IDEwMjQuMCAgJiYgIGNvbnYgPD0ga0NvbnZfR2lnYSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcE51bSAvPSAxMDI0LjA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIHRtcE51bSA+PSAxMDAwLjAgICYmICBjb252IDw9IGtDb252X0dpZ2EgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBOdW0gLz0gMTAwMC4wOworICAgICAgICAgICAgICAgICAgICAgICAgY29udisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISBpc3VwcGVyICgoaW50KWluRm9ybWF0KSApIHsKKyAgICAgICAgaW5OdW0gKj0ga0NvbnZlcnNpb25Gb3JCaXRzWyBjb252IF07CisgICAgICAgIHN1ZmZpeCA9IGtMYWJlbF9iaXRbY29udl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5OdW0gKj0ga0NvbnZlcnNpb24gW2NvbnZdOworICAgICAgICBzdWZmaXggPSBrTGFiZWxfQnl0ZVsgY29udiBdOworICAgIH0KKworICAgIC8qIHByaW50IHN1Y2ggdGhhdCB3ZSBhbHdheXMgZml0IGluIDQgcGxhY2VzICovCisgICAgaWYgKCBpbk51bSA8IDkuOTk1ICkgeyAgICAgICAgICAvKiA5Ljk5NSB3b3VsZCBiZSByb3VuZGVkIHRvIDEwLjAgKi8KKyAgICAgICAgZm9ybWF0ID0gIiU0LjJmICVzIjsgICAgICAgIC8qICMuIyMgKi8KKyAgICB9IGVsc2UgaWYgKCBpbk51bSA8IDk5Ljk1ICkgeyAgIC8qIDk5Ljk1IHdvdWxkIGJlIHJvdW5kZWQgdG8gMTAwICovCisgICAgICAgIGZvcm1hdCA9ICIlNC4xZiAlcyI7ICAgICAgICAvKiAjIy4jICovCisgICAgfSBlbHNlIGlmICggaW5OdW0gPCA5OTkuNSApIHsgICAvKiA5OTkuNSB3b3VsZCBiZSByb3VuZGVkIHRvIDEwMDAgKi8KKwlmb3JtYXQgPSAiJTQuMGYgJXMiOyAgICAgICAgLyogICMjIyAqLworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwMC0xMDI0IGZpdHMgaW4gNCBwbGFjZXMgCisJCQkJICAgICAqIElmIG5vdCB1c2luZyBBZGFwdGl2ZSBzaXplcyB0aGVuCisJCQkJICAgICAqIHRoaXMgY29kZSB3aWxsIG5vdCBjb250cm9sIHNwYWNlcyovCisgICAgICAgIGZvcm1hdCA9ICIlNC4wZiAlcyI7ICAgICAgICAvKiAjIyMjICovCisgICAgfQorICAgIHNucHJpbnRmKCBvdXRTdHJpbmcsIGluTGVuLCBmb3JtYXQsIGluTnVtLCBzdWZmaXggKTsKK30gLyogZW5kIGJ5dGVfc25wcmludGYgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVkaXJlY3QKKyAqCisgKiByZWRpcmVjdCB0aGUgc3Rkb3V0IGludG8gYSBzcGVjaWZpZWQgZmlsZQorICogcmV0dXJuOiBub25lCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgcmVkaXJlY3QoY29uc3QgY2hhciAqaW5PdXRwdXRGaWxlTmFtZSkgeworI2lmZGVmIFdJTjMyCisKKyAgICBGSUxFICpmcDsKKworICAgIGlmICggaW5PdXRwdXRGaWxlTmFtZSA9PSBOVUxMICkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNob3VsZCBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcCA9IGZyZW9wZW4oaW5PdXRwdXRGaWxlTmFtZSwgImErIiwgc3Rkb3V0KTsKKyAgICBpZiAoIGZwID09IE5VTEwgKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmVkaXJlY3Qgc3Rkb3V0IGZhaWxlZCFcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjZW5kaWYKKworICAgIHJldHVybjsKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLyogZW5kIGV4dGVybiAiQyIgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pcGVyZi0yLjAuNS9zcmMvdGNwX3dpbmRvd19zaXplLmMgYi9pcGVyZi0yLjAuNS9zcmMvdGNwX3dpbmRvd19zaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkMjhjNQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLTIuMC41L3NyYy90Y3Bfd2luZG93X3NpemUuYwpAQCAtMCwwICsxLDE3NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzICAgICAgICAgICAgCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gICAgCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgKElwZXJmKSBhbmQgYXNzb2NpYXRlZCAgICAgICAKKyAqIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgIAorICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgICAgICAgICAgCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCAgICAgICAgCisgKiBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0ICAgICAKKyAqIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCisgKiBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICoKKyAqICAgICAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgCisgKiB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLiAKKyAqCisgKiAgICAgCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIAorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgCisgKiBkaXNjbGFpbWVycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIAorICogICAgIAorICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIE5DU0EsIAorICogbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UgCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyAKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09OVElCVVRPUlMgT1IgQ09QWVJJR0hUIAorICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIEFwcGxpZWQgTmV0d29yayBSZXNlYXJjaCAKKyAqIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduIAorICogaHR0cDovL3d3dy5uY3NhLnVpdWMuZWR1CisgKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAorICoKKyAqIHRjcF93aW5kb3dfc2l6ZS5jCisgKiBieSBNYXJrIEdhdGVzIDxtZ2F0ZXNAbmxhbnIubmV0PgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc2V0L2dldHNvY2tvcHQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImhlYWRlcnMuaCIKKworI2luY2x1ZGUgInV0aWwuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJZiBpblRDUFdpbiA+IDAsIHNldCB0aGUgVENQIHdpbmRvdyBzaXplICh2aWEgdGhlIHNvY2tldCBidWZmZXIKKyAqIHNpemVzKSBmb3IgaW5Tb2NrLiBPdGhlcndpc2UgbGVhdmUgaXQgYXMgdGhlIHN5c3RlbSBkZWZhdWx0LgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBsaXN0ZW4oKSBvciBjb25uZWN0KCkgb24KKyAqIHRoZSBzb2NrZXQsIGZvciBUQ1Agd2luZG93IHNpemVzID4gNjQgS0IgdG8gYmUgZWZmZWN0aXZlLgorICoKKyAqIFRoaXMgbm93IHdvcmtzIG9uIFVOSUNPUyBhbHNvLCBieSBzZXR0aW5nIFRDUF9XSU5TSElGVC4KKyAqIFRoaXMgbm93IHdvcmtzIG9uIEFJWCwgYnkgZW5hYmxpbmcgUkZDMTMyMy4KKyAqIHJldHVybnMgLTEgb24gZXJyb3IsIDAgb24gbm8gZXJyb3IuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBzZXRzb2NrX3RjcF93aW5kb3dzaXplKCBpbnQgaW5Tb2NrLCBpbnQgaW5UQ1BXaW4sIGludCBpblNlbmQgKSB7CisjaWZkZWYgU09fU05EQlVGCisgICAgaW50IHJjOworICAgIGludCBuZXdUQ1BXaW47CisKKyAgICBhc3NlcnQoIGluU29jayA+PSAwICk7CisKKyAgICBpZiAoIGluVENQV2luID4gMCApIHsKKworI2lmZGVmIFRDUF9XSU5TSElGVAorCisgICAgICAgIC8qIFVOSUNPUyByZXF1aXJlcyBzZXR0aW5nIHRoZSB3aW5zaGlmdCBleHBsaWNpdGx5ICovCisgICAgICAgIGlmICggaW5UQ1BXaW4gPiA2NTUzNSApIHsKKyAgICAgICAgICAgIGludCB3aW5TaGlmdCA9IDA7CisgICAgICAgICAgICBpbnQgc2NhbGVkV2luID0gaW5UQ1BXaW4gPj4gMTY7CisgICAgICAgICAgICB3aGlsZSAoIHNjYWxlZFdpbiA+IDAgKSB7CisgICAgICAgICAgICAgICAgc2NhbGVkV2luID4+PSAxOworICAgICAgICAgICAgICAgIHdpblNoaWZ0Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNldCBUQ1Agd2luZG93IHNoaWZ0ICovCisgICAgICAgICAgICByYyA9IHNldHNvY2tvcHQoIGluU29jaywgSVBQUk9UT19UQ1AsIFRDUF9XSU5TSElGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAmd2luU2hpZnQsIHNpemVvZiggd2luU2hpZnQgKSk7CisgICAgICAgICAgICBpZiAoIHJjIDwgMCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5vdGU6IHlvdSBjYW5ub3QgdmVyaWZ5IFRDUCB3aW5kb3cgc2hpZnQsIHNpbmNlIGl0IHJldHVybnMKKyAgICAgICAgICAgICAqIGEgc3RydWN0dXJlIGFuZCBub3QgdGhlIHNhbWUgaW50ZWdlciB3ZSB1c2UgdG8gc2V0IGl0LiAodWdoKSAqLworICAgICAgICB9CisjZW5kaWYgLyogVENQX1dJTlNISUZUICAqLworCisjaWZkZWYgVENQX1JGQzEzMjMKKyAgICAgICAgLyogT24gQUlYLCBSRkMgMTMyMyBleHRlbnNpb25zIGNhbiBiZSBzZXQgc3lzdGVtLXdpZGUsCisgICAgICAgICAqIHVzaW5nIHRoZSAnbm8nIG5ldHdvcmsgb3B0aW9ucyBjb21tYW5kLiBCdXQgd2UgY2FuIGFsc28gc2V0IHRoZW0KKyAgICAgICAgICogcGVyLXNvY2tldCwgc28gbGV0J3MgdHJ5IGp1c3QgaW4gY2FzZS4gKi8KKyAgICAgICAgaWYgKCBpblRDUFdpbiA+IDY1NTM1ICkgeworICAgICAgICAgICAgLyogZW5hYmxlIFJGQyAxMzIzICovCisgICAgICAgICAgICBpbnQgb24gPSAxOworICAgICAgICAgICAgcmMgPSBzZXRzb2Nrb3B0KCBpblNvY2ssIElQUFJPVE9fVENQLCBUQ1BfUkZDMTMyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAmb24sIHNpemVvZiggb24gKSk7CisgICAgICAgICAgICBpZiAoIHJjIDwgMCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBUQ1BfUkZDMTMyMyAqLworCisgICAgICAgIGlmICggIWluU2VuZCApIHsKKyAgICAgICAgICAgIC8qIHJlY2VpdmUgYnVmZmVyIC0tIHNldAorICAgICAgICAgICAgICogbm90ZTogcmVzdWx0cyBhcmUgdmVyaWZpZWQgYWZ0ZXIgY29ubmVjdCgpIG9yIGxpc3RlbigpLAorICAgICAgICAgICAgICogc2luY2Ugc29tZSBPUydzIGRvbid0IHNob3cgdGhlIGNvcnJlY3RlZCB2YWx1ZSB1bnRpbCB0aGVuLiAqLworICAgICAgICAgICAgbmV3VENQV2luID0gaW5UQ1BXaW47CisgICAgICAgICAgICByYyA9IHNldHNvY2tvcHQoIGluU29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopICZuZXdUQ1BXaW4sIHNpemVvZiggbmV3VENQV2luICkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc2VuZCBidWZmZXIgLS0gc2V0CisgICAgICAgICAgICAgKiBub3RlOiByZXN1bHRzIGFyZSB2ZXJpZmllZCBhZnRlciBjb25uZWN0KCkgb3IgbGlzdGVuKCksCisgICAgICAgICAgICAgKiBzaW5jZSBzb21lIE9TJ3MgZG9uJ3Qgc2hvdyB0aGUgY29ycmVjdGVkIHZhbHVlIHVudGlsIHRoZW4uICovCisgICAgICAgICAgICBuZXdUQ1BXaW4gPSBpblRDUFdpbjsKKyAgICAgICAgICAgIHJjID0gc2V0c29ja29wdCggaW5Tb2NrLCBTT0xfU09DS0VULCBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgJm5ld1RDUFdpbiwgc2l6ZW9mKCBuZXdUQ1BXaW4gKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCByYyA8IDAgKSB7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogU09fU05EQlVGICovCisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIHNldHNvY2tfdGNwX3dpbmRvd3NpemUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmV0dXJucyB0aGUgVENQIHdpbmRvdyBzaXplIChvbiB0aGUgc2VuZGluZyBidWZmZXIsIFNPX1NOREJVRiksCisgKiBvciAtMSBvbiBlcnJvci4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGdldHNvY2tfdGNwX3dpbmRvd3NpemUoIGludCBpblNvY2ssIGludCBpblNlbmQgKSB7CisgICAgaW50IHRoZVRDUFdpbiA9IDA7CisKKyNpZmRlZiBTT19TTkRCVUYKKyAgICBpbnQgcmM7CisgICAgU29ja2xlbl90IGxlbjsKKworICAgIC8qIHNlbmQgYnVmZmVyIC0tIHF1ZXJ5IGZvciBidWZmZXIgc2l6ZSAqLworICAgIGxlbiA9IHNpemVvZiggdGhlVENQV2luICk7CisgICAgaWYgKCBpblNlbmQgKSB7CisgICAgICAgIHJjID0gZ2V0c29ja29wdCggaW5Tb2NrLCBTT0xfU09DS0VULCBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSAmdGhlVENQV2luLCAmbGVuICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSBnZXRzb2Nrb3B0KCBpblNvY2ssIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopICZ0aGVUQ1BXaW4sICZsZW4gKTsKKyAgICB9CisgICAgaWYgKCByYyA8IDAgKSB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyNlbmRpZgorCisgICAgcmV0dXJuIHRoZVRDUFdpbjsKK30gLyogZW5kIGdldHNvY2tfdGNwX3dpbmRvd3NpemUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGVuZCBleHRlcm4gIkMiICovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaXBlcmYucGF0Y2hlcy9pcGVyZi01MC5kZXNjcmlwdGlvbiBiL2lwZXJmLnBhdGNoZXMvaXBlcmYtNTAuZGVzY3JpcHRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MTQxYQotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLnBhdGNoZXMvaXBlcmYtNTAuZGVzY3JpcHRpb24KQEAgLTAsMCArMSBAQAorUGF0Y2ggZm9yIGJ1aWxkaW5nIGlwZXJmIHdpdGggbm9uLWNvbGxvYWN0ZWQgc291cmNlIGFuZCBvYmplY3QgdHJlZXMuIE5lZWRlZCBmb3IgY29tcGlsaW5nIGlwdjYgY29kZSBpbiBpcGVyZgpkaWZmIC0tZ2l0IGEvaXBlcmYucGF0Y2hlcy9pcGVyZi01MC5wYXRjaCBiL2lwZXJmLnBhdGNoZXMvaXBlcmYtNTAucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxZDA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2lwZXJmLnBhdGNoZXMvaXBlcmYtNTAucGF0Y2gKQEAgLTAsMCArMSwxMTUgQEAKK2RpZmYgLWFydU4gaXBlcmYtMi4wLjUvY29uZmlndXJlIGlwZXJmLTIuMC41Lk4vY29uZmlndXJlCistLS0gaXBlcmYtMi4wLjUvY29uZmlndXJlCTIwMTAtMDQtMTAgMTI6MjM6MDUuMDAwMDAwMDAwIC0wNzAwCisrKysgaXBlcmYtMi4wLjUuTi9jb25maWd1cmUJMjAxNS0wNC0wNyAxMjoyMTo0NS4wODc1MTc1NTMgLTA3MDAKK0BAIC03MjQ3LDcgKzcyNDcsNyBAQAorIAorIAorIGlmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiICE9IG5vOyB0aGVuCistICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3QgaXBfbXJlcSIgImFjX2N2X3R5cGVfc3RydWN0X2lwX21yZXEiICIjaW5jbHVkZSBcImNvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisrICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3QgaXBfbXJlcSIgImFjX2N2X3R5cGVfc3RydWN0X2lwX21yZXEiICIjaW5jbHVkZSBcIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmhcIgorICIKKyBpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X2lwX21yZXEiID0geCIieWVzOyB0aGVuIDoKKyAKK0BAIC03MjU4LDcgKzcyNTgsNyBAQAorIAorIGZpCisgCistICBhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJJUF9BRERfTUVNQkVSU0hJUCIgImFjX2N2X2hhdmVfZGVjbF9JUF9BRERfTUVNQkVSU0hJUCIgIiNpbmNsdWRlIFwiY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKysgIGFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIklQX0FERF9NRU1CRVJTSElQIiAiYWNfY3ZfaGF2ZV9kZWNsX0lQX0FERF9NRU1CRVJTSElQIiAiI2luY2x1ZGUgXCIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKyAiCisgaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfSVBfQUREX01FTUJFUlNISVAiID0geCIieWVzOyB0aGVuIDoKKyAgIGFjX2hhdmVfZGVjbD0xCitAQCAtNzI4OCw3ICs3Mjg4LDcgQEAKKyBmaQorIAorIGlmIHRlc3QgIiRhY19jdl9oYXZlX2lwdjYiICE9IG5vOyB0aGVuCistICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSIgImFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiICIjaW5jbHVkZSBcImNvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisrICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSIgImFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiICIjaW5jbHVkZSBcIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmhcIgorICIKKyBpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID0geCIieWVzOyB0aGVuIDoKKyAKK0BAIC03Mjk5LDcgKzcyOTksNyBAQAorIAorIGZpCisgCistICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3Qgc29ja2FkZHJfaW42IiAiYWNfY3ZfdHlwZV9zdHJ1Y3Rfc29ja2FkZHJfaW42IiAiI2luY2x1ZGUgXCJjb21wYXQvaGVhZGVyc19zbGltLmhcIgorKyAgYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3RydWN0IHNvY2thZGRyX2luNiIgImFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX2luNiIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisgIgorIGlmIHRlc3QgIngkYWNfY3ZfdHlwZV9zdHJ1Y3Rfc29ja2FkZHJfaW42IiA9IHgiInllczsgdGhlbiA6CisgCitAQCAtNzMxMCw3ICs3MzEwLDcgQEAKKyAKKyBmaQorIAorLSAgYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiQUZfSU5FVDYiICJhY19jdl9oYXZlX2RlY2xfQUZfSU5FVDYiICIjaW5jbHVkZSBcImNvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisrICBhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJBRl9JTkVUNiIgImFjX2N2X2hhdmVfZGVjbF9BRl9JTkVUNiIgIiNpbmNsdWRlIFwiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisgIgorIGlmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX0FGX0lORVQ2IiA9IHgiInllczsgdGhlbiA6CisgICBhY19oYXZlX2RlY2w9MQorQEAgLTczNDEsNyArNzM0MSw3IEBACisgCisgaWYgdGVzdCAiJGFjX2N2X2hhdmVfaXB2NiIgPSB5ZXM7IHRoZW4KKyAgIGlmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiID0geWVzOyB0aGVuCistICAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBpcHY2X21yZXEiICJhY19jdl90eXBlX3N0cnVjdF9pcHY2X21yZXEiICIjaW5jbHVkZSBcImNvbXBhdC9oZWFkZXJzX3NsaW0uaFwiCisrICAgIGFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInN0cnVjdCBpcHY2X21yZXEiICJhY19jdl90eXBlX3N0cnVjdF9pcHY2X21yZXEiICIjaW5jbHVkZSBcIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmhcIgorICIKKyBpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X2lwdjZfbXJlcSIgPSB4IiJ5ZXM7IHRoZW4gOgorIAorQEAgLTczNTIsNyArNzM1Miw3IEBACisgCisgZmkKKyAKKy0gICAgYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiSVBWNl9BRERfTUVNQkVSU0hJUCIgImFjX2N2X2hhdmVfZGVjbF9JUFY2X0FERF9NRU1CRVJTSElQIiAiI2luY2x1ZGUgXCJjb21wYXQvaGVhZGVyc19zbGltLmhcIgorKyAgICBhY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJJUFY2X0FERF9NRU1CRVJTSElQIiAiYWNfY3ZfaGF2ZV9kZWNsX0lQVjZfQUREX01FTUJFUlNISVAiICIjaW5jbHVkZSBcIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmhcIgorICIKKyBpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9JUFY2X0FERF9NRU1CRVJTSElQIiA9IHgiInllczsgdGhlbiA6CisgICBhY19oYXZlX2RlY2w9MQorQEAgLTczNjQsNyArNzM2NCw3IEBACisgI2RlZmluZSBIQVZFX0RFQ0xfSVBWNl9BRERfTUVNQkVSU0hJUCAkYWNfaGF2ZV9kZWNsCisgX0FDRU9GCisgCistICAgIGFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIklQVjZfTVVMVElDQVNUX0hPUFMiICJhY19jdl9oYXZlX2RlY2xfSVBWNl9NVUxUSUNBU1RfSE9QUyIgIiNpbmNsdWRlIFwiY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKysgICAgYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiSVBWNl9NVUxUSUNBU1RfSE9QUyIgImFjX2N2X2hhdmVfZGVjbF9JUFY2X01VTFRJQ0FTVF9IT1BTIiAiI2luY2x1ZGUgXCIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oXCIKKyAiCisgaWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfSVBWNl9NVUxUSUNBU1RfSE9QUyIgPSB4IiJ5ZXM7IHRoZW4gOgorICAgYWNfaGF2ZV9kZWNsPTEKK2RpZmYgLWFydU4gaXBlcmYtMi4wLjUvY29uZmlndXJlLmFjIGlwZXJmLTIuMC41Lk4vY29uZmlndXJlLmFjCistLS0gaXBlcmYtMi4wLjUvY29uZmlndXJlLmFjCTIwMTAtMDQtMTAgMTI6MjM6MDUuMDAwMDAwMDAwIC0wNzAwCisrKysgaXBlcmYtMi4wLjUuTi9jb25maWd1cmUuYWMJMjAxNS0wNC0wNyAxNTo0MzowNi40MjI1NjY5MzEgLTA3MDAKK0BAIC0xNzYsOCArMTc2LDggQEAKKyAKKyBkbmwgY2hlY2sgZm9yIG11bHRpY2FzdAorIGlmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiICE9IG5vOyB0aGVuCistICBBQ19DSEVDS19UWVBFUyhzdHJ1Y3QgaXBfbXJlcSwsLFsjaW5jbHVkZSAiY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCistICBBQ19DSEVDS19ERUNMUyhJUF9BRERfTUVNQkVSU0hJUCwsLFsjaW5jbHVkZSAiY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisrICBBQ19DSEVDS19UWVBFUyhzdHJ1Y3QgaXBfbXJlcSwsLFsjaW5jbHVkZSAiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaCJdKQorKyAgQUNfQ0hFQ0tfREVDTFMoSVBfQUREX01FTUJFUlNISVAsLCxbI2luY2x1ZGUgIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmgiXSkKKyAgIEFDX01TR19DSEVDS0lORyhmb3IgbXVsdGljYXN0IHN1cHBvcnQpCisgICBhY19jdl9tdWx0aWNhc3Q9bm8KKyAgIGlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfSVBfQUREX01FTUJFUlNISVAiID0geWVzOyB0aGVuCitAQCAtMTkzLDkgKzE5Myw5IEBACisgCisgZG5sIGNoZWNrIGZvciBJUHY2CisgaWYgdGVzdCAiJGFjX2N2X2hhdmVfaXB2NiIgIT0gbm87IHRoZW4KKy0gIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlLCwsWyNpbmNsdWRlICJjb21wYXQvaGVhZGVyc19zbGltLmgiXSkKKy0gIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBzb2NrYWRkcl9pbjYsLCxbI2luY2x1ZGUgImNvbXBhdC9oZWFkZXJzX3NsaW0uaCJdKQorLSAgQUNfQ0hFQ0tfREVDTFMoQUZfSU5FVDYsLCxbI2luY2x1ZGUgImNvbXBhdC9oZWFkZXJzX3NsaW0uaCJdKQorKyAgQUNfQ0hFQ0tfVFlQRVMoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UsLCxbI2luY2x1ZGUgIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmgiXSkKKysgIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBzb2NrYWRkcl9pbjYsLCxbI2luY2x1ZGUgIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmgiXSkKKysgIEFDX0NIRUNLX0RFQ0xTKEFGX0lORVQ2LCwsWyNpbmNsdWRlICIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIElQdjYgaGVhZGVycyBhbmQgc3RydWN0dXJlcykKKyAgIGFjX2N2X2hhdmVfaXB2Nj1ubworICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID0geWVzOyB0aGVuCitAQCAtMjExLDkgKzIxMSw5IEBACisgCisgaWYgdGVzdCAiJGFjX2N2X2hhdmVfaXB2NiIgPSB5ZXM7IHRoZW4KKyAgIGlmIHRlc3QgIiRhY19jdl9tdWx0aWNhc3QiID0geWVzOyB0aGVuCistICAgIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBpcHY2X21yZXEsLCxbI2luY2x1ZGUgImNvbXBhdC9oZWFkZXJzX3NsaW0uaCJdKQorLSAgICBBQ19DSEVDS19ERUNMUyhJUFY2X0FERF9NRU1CRVJTSElQLCwsWyNpbmNsdWRlICJjb21wYXQvaGVhZGVyc19zbGltLmgiXSkKKy0gICAgQUNfQ0hFQ0tfREVDTFMoSVBWNl9NVUxUSUNBU1RfSE9QUywsLFsjaW5jbHVkZSAiY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisrICAgIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBpcHY2X21yZXEsLCxbI2luY2x1ZGUgIiR7c3JjZGlyfS9jb21wYXQvaGVhZGVyc19zbGltLmgiXSkKKysgICAgQUNfQ0hFQ0tfREVDTFMoSVBWNl9BRERfTUVNQkVSU0hJUCwsLFsjaW5jbHVkZSAiJHtzcmNkaXJ9L2NvbXBhdC9oZWFkZXJzX3NsaW0uaCJdKQorKyAgICBBQ19DSEVDS19ERUNMUyhJUFY2X01VTFRJQ0FTVF9IT1BTLCwsWyNpbmNsdWRlICIke3NyY2Rpcn0vY29tcGF0L2hlYWRlcnNfc2xpbS5oIl0pCisgICAgIEFDX01TR19DSEVDS0lORyhmb3IgSVB2NiBtdWx0aWNhc3Qgc3VwcG9ydCkKKyAgICAgYWNfY3ZfaGF2ZV9pcHY2X211bHRpY2FzdD1ubworICAgICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zdHJ1Y3RfaXB2Nl9tcmVxIiA9IHllczsgdGhlbgpkaWZmIC0tZ2l0IGEvaXBlcmYudGFyLmd6IGIvaXBlcmYudGFyLmd6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4N2IxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi50YXIuZ3oKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvaXBlcmYudXJsIGIvaXBlcmYudXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTc1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi51cmwKQEAgLTAsMCArMSBAQAoraHR0cDovL2Rvd25sb2FkLnNvdXJjZWZvcmdlLm5ldC9pcGVyZi9pcGVyZi0yLjAuNS50YXIuZ3oKZGlmZiAtLWdpdCBhL2lwZXJmLnZlcnNpb24gYi9pcGVyZi52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTAyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9pcGVyZi52ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKzIuMC41Cg==