ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1YjliMgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTE4IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlZmlsZSBmb3IgdGhlIEV4cGF0IFhNTCBwYXJzZXIgbGlicmFyeS4KKyMKKworQnVpbGRDb25maWdTcGVjaWFsaXplZAk6PSBObworQnVpbGRQcm9kdWN0U3BlY2lhbGl6ZWQJOj0gTm8KKworaW5jbHVkZSBwcmUubWFrCisKK1BhY2thZ2VOYW1lCQk6PSBleHBhdAorCitQYWNrYWdlRXh0ZW5zaW9uCTo9IHRhci5negorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VQYXRjaEFyZ3MJOj0gLXAxCisKK1BhY2thZ2VBcmNoaXZlCQk6PSAkKFBhY2thZ2VOYW1lKS4kKFBhY2thZ2VFeHRlbnNpb24pCitQYWNrYWdlU291cmNlRGlyCTo9ICQoUGFja2FnZU5hbWUpJChQYWNrYWdlU2VwYXJhdG9yKSQoUGFja2FnZVZlcnNpb24pCisKK1BhY2thZ2VCdWlsZE1ha2VmaWxlCT0gJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxNYWtlZmlsZSkKKworQ2xlYW5QYXRocwkJKz0gJChQYWNrYWdlTGljZW5zZUZpbGUpCisKK2FsbDogJChQYWNrYWdlRGVmYXVsdEdvYWwpCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgbGljZW5zZSBjb250ZW50cy4KKworJChQYWNrYWdlU291cmNlRGlyKS9DT1BZSU5HOiBzb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL0NPUFlJTkcKKwkkKGNvcHktcmVzdWx0KQorCisjIEV4dHJhY3QgdGhlIHNvdXJjZSBmcm9tIHRoZSBhcmNoaXZlIGFuZCBhcHBseSBwYXRjaGVzLCBpZiBhbnkuCisKKyQoUGFja2FnZVNvdXJjZURpcik6ICQoUGFja2FnZUFyY2hpdmUpICQoUGFja2FnZVBhdGNoUGF0aHMpCisJJChleHBhbmQtYW5kLXBhdGNoLXBhY2thZ2UpCisKKyMgUHJlcGFyZSB0aGUgc291cmNlcy4KKworLlBIT05ZOiBzb3VyY2UKK3NvdXJjZTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpCisKKyMgUGF0Y2ggdGhlIHNvdXJjZXMsIGlmIG5lY2Vzc2FyeS4KKworLlBIT05ZOiBwYXRjaAorcGF0Y2g6IHNvdXJjZQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGJ1aWxkIG1ha2VmaWxlLgorCiskKFBhY2thZ2VCdWlsZE1ha2VmaWxlKTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSljZCAkKEJ1aWxkRGlyZWN0b3J5KSAmJiBcCisJJChDVVJESVIpLyQoUGFja2FnZVNvdXJjZURpcikvY29uZmlndXJlIFwKKwlDQz0iJChDQykiIEFSPSQoQVIpIFJBTkxJQj0kKFJBTkxJQikgU1RSSVA9JChTVFJJUCkgXAorCUlOU1RBTEw9IiQoSU5TVEFMTCkgJChJTlNUQUxMRkxBR1MpIiBcCisJLS1idWlsZD0kKEhvc3RUdXBsZSkgXAorCS0taG9zdD0kKFRhcmdldFR1cGxlKSBcCisJLS1wcmVmaXg9L3VzciBcCisJLS1zeXNjb25mZGlyPS9ldGMgXAorCS0tbG9jYWxzdGF0ZWRpcj0vdmFyIFwKKwktLWRpc2FibGUtc3RhdGljCisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCisuUEhPTlk6IGNvbmZpZ3VyZQorY29uZmlndXJlOiBzb3VyY2UgJChQYWNrYWdlQnVpbGRNYWtlZmlsZSkKKworIyBCdWlsZCB0aGUgc291cmNlLgorIworIyBXZSBoYXZlIHRvIHVuc2V0IE1BS0VGTEFHUyBzaW5jZSB0aGV5IGNvbmZ1c2UgdGhlIHBhY2thZ2UgYnVpbGQgb3RoZXJ3aXNlLgorCisuUEhPTlk6IGJ1aWxkCitidWlsZDogY29uZmlndXJlCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBhbGwKKworIyBTdGFnZSB0aGUgYnVpbGQgdG8gYSB0ZW1wb3JhcnkgaW5zdGFsbGF0aW9uIGFyZWEuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisjCisjIFdlIGV4cGxpY3RseSByZW1vdmUgJ2xpYmV4cGF0LmxhJyBiZWNhdXNlIHNvbWUgcGFja2FnZXMgdGhhdCBkZXBlbmQKKyMgb24gZXhwYXQgdXNlIGxpYnRvb2wuIElmIGxpYnRvb2wgZmluZHMgYSAnKi5sYScgZmlsZSBmb3IgYSBsaWJyYXJ5LAorIyBpdCB1c2VzIHRoZSB2YWx1ZSBvZiAnbGliZGlyPTxkaXI+JyBpdCBmaW5kcy4gSW4gb3VyIGNhc2UsIHNpbmNlCisjICctLXByZWZpeD0vdXNyJyB0aGlzIHZhbHVlIGlzICcvdXNyL2xpYicuIEl0IHRoZW4gcmVzb2x2ZXMgJy1sZXhwYXQnCisjIHRvICcvdXNyL2xpYi9saWJleHBhdC5zbycuIEluIGEgY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnQsIHRoaXMKKyMgaXMgbGlrZWx5IHRvIGJlIG5laXRoZXIgdGhlIHJpZ2h0IGFyY2hpdGVjdHVyZSBub3IgdGhlIHJpZ2h0CisjIHZlcnNpb24gdG8gbGluayBhZ2FpbnN0LiBJbiBzaG9ydCwgd2UgbG9zZS4KKyMKKyMgV2UgY291bGQgYWxzbyBoYW5kbGUgdGhpcyBieSByZW1vdmluZyBERVNURElSIGFuZCBzZXR0aW5nIHRoZSBwcmVmaXgKKyMgdG8gJChSZXN1bHREaXJlY3RvcnkpOyBob3dldmVyLCB0aGF0IHJlc3VsdHMgaW4gbGlidG9vbCBoYXJkLWNvZGluZworIyAkKFJlc3VsdERpcmVjdG9yeSkgYXMgdGhlIFJQQVRIIGluIHRoZSBsaW5rZWQgZXhlY3V0YWJsZXMgd2hpY2ggaXMKKyMgTk9UIHdoYXQgd2Ugd2FudCBlaXRoZXIuIFdlIGxvc2UgYWdhaW4uCisjCisjIEJ5IHJlbW92aW5nIHRoZSAnKi5sYScgZmlsZSwgd2Ugd2luIGJ5IGVuc3VyaW5nIG5laXRoZXIgYQorIyBtaXNkaXJlY3RlZCBsaW5rIG5vciBhbiBSUEFUSC4KKworLlBIT05ZOiBzdGFnZQorc3RhZ2U6IGJ1aWxkIHwgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBERVNURElSPSQoUmVzdWx0RGlyZWN0b3J5KSBpbnN0YWxsCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsLHVzci9saWIvbGliZXhwYXQubGEpCisKK2NsZWFuOgorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUGFja2FnZVNvdXJjZURpcikKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9DT1BZSU5HIGIvZXhwYXQtMi4wLjEvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kY2I0NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvQ09QWUlORwpAQCAtMCwwICsxLDIyIEBACitDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIENsYXJrIENvb3BlcgorQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEV4cGF0IG1haW50YWluZXJzLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKK2EgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZword2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCitwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KK3RoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKK0NMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9DaGFuZ2VzIGIvZXhwYXQtMi4wLjEvQ2hhbmdlcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZTg4NWFiCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvQ2hhbmdlcwpAQCAtMCwwICsxLDE2OSBAQAorUmVsZWFzZSAyLjAuMSBUdWUgSnVuZSA1IDIwMDcKKyAgICAgICAgLSBGaXhlZCBidWdzICMxNTE1MjY2LCAxNTE1NjAwOiBUaGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlcidzIGNhbGxpbmcKKyAgICAgICAgICBvZiBYTUxfU3RvcFBhcnNlcigpIHdhcyBub3QgaGFuZGxlZCBwcm9wZXJseTsgaWYgdGhlIHBhcnNlciB3YXMKKyAgICAgICAgICBzdG9wcGVkIGFuZCB0aGUgaGFuZGxlciBzZXQgdG8gTlVMTCwgdGhlIHBhcnNlciB3b3VsZCBzZWdmYXVsdC4KKyAgICAgICAgLSBGaXhlZCBidWcgIzE2OTA4ODM6IEV4cGF0IGZhaWxlZCBvbiBFQkNESUMgc3lzdGVtcyBhcyBpdCBhc3N1bWVkCisgICAgICAgICAgc29tZSBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvIGJlIEFTQ0lJIGVuY29kZWQuCisgICAgICAgIC0gTWlub3IgY2xlYW51cHMgb2YgdGhlIHRlc3QgaGFybmVzcy4KKyAgICAgICAgLSBGaXhlZCB4bWx3ZiBidWcgIzE1MTM1NjY6ICJvdXQgb2YgbWVtb3J5IiBlcnJvciBvbiBmaWxlIHNpemUgemVyby4KKyAgICAgICAgLSBGaXhlZCBvdXRsaW5lLmMgYnVnICMxNTQzMjMzOiBtaXNzaW5nIGEgZmluYWwgWE1MX1BhcnNlckZyZWUoKSBjYWxsLgorICAgICAgICAtIEZpeGVzIGFuZCBpbXByb3ZlbWVudHMgZm9yIFdpbmRvd3MgcGxhdGZvcm06CisgICAgICAgICAgYnVncyAjMTQwOTQ1MSwgIzE0NzYxNjAsIDE1NDgxODIsIDE2MDI3NjksIDE3MTczMjIuCisgICAgICAgIC0gQnVpbGQgZml4ZXMgZm9yIHZhcmlvdXMgcGxhdGZvcm1zOgorICAgICAgICAgIEhQLVVYLCBUcnU2NCwgU29sYXJpcyA5OiBwYXRjaCAjMTQzNzg0MCwgYnVnICMxMTk2MTgwLgorICAgICAgICAgIEFsbCBVbml4OiAjMTU1NDYxOCAocmVmcmVzaGVkIGNvbmZpZy5zdWIvY29uZmlnLmd1ZXNzKS4KKyAgICAgICAgICAgICAgICAgICAgIzE0OTAzNzEsICMxNjEzNDU3OiBzdXBwb3J0IGJvdGgsIERFU1RESVIgYW5kIElOU1RBTExfUk9PVCwKKyAgICAgICAgICAgICAgICAgICAgd2l0aG91dCByZWx5aW5nIG9uIEdOVS1NYWtlIHNwZWNpZmljIGZlYXR1cmVzLgorICAgICAgICAgICMxNjQ3ODA1OiBQYXRjaGVkIGNvbmZpZ3VyZS5pbiB0byB3b3JrIGJldHRlciB3aXRoIEludGVsIGNvbXBpbGVyLgorICAgICAgICAtIEZpeGVzIHRvIE1ha2VmaWxlLmluIHRvIGhhdmUgbWFrZSBjaGVjayB3b3JrIGNvcnJlY3RseToKKyAgICAgICAgICBidWdzICMxNDA4MTQzLCAjMTUzNTYwMywgIzE1MzY2ODQuCisgICAgICAgIC0gQWRkZWQgT3BlbiBXYXRjb20gc3VwcG9ydDogcGF0Y2ggIzE1MjMyNDIuCisKK1JlbGVhc2UgMi4wLjAgV2VkIEphbiAxMSAyMDA2CisgICAgICAgIC0gV2Ugbm8gbG9uZ2VyIHVzZSB0aGUgImNoZWNrIiBsaWJyYXJ5IGZvciBDIHVuaXQgdGVzdGluZzsgd2UKKyAgICAgICAgICBhbHdheXMgdXNlIHRoZSAocGFydGlhbCkgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKyAgICAgICAgLSBSZXBvcnQgWE1MX05TIHNldHRpbmcgdmlhIFhNTF9HZXRGZWF0dXJlTGlzdCgpLgorICAgICAgICAtIEZpeGVkIGhlYWRlcnMgZm9yIHVzZSBmcm9tIEMrKy4KKyAgICAgICAgLSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoKSBhbmQgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKCkKKyAgICAgICAgICBub3cgcmV0dXJuIHVuc2lnbmVkIGludGVnZXJzLgorICAgICAgICAtIEFkZGVkIFhNTF9MQVJHRV9TSVpFIHN3aXRjaCB0byBlbmFibGUgNjQtYml0IGludGVnZXJzIGZvcgorICAgICAgICAgIGJ5dGUgaW5kZXhlcyBhbmQgbGluZS9jb2x1bW4gbnVtYmVycy4KKyAgICAgICAgLSBVcGRhdGVkIHRvIHVzZSBsaWJ0b29sIDEuNS4yMiAodGhlIG1vc3QgcmVjZW50KS4KKyAgICAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBBbWlnYU9TLgorICAgICAgICAtIFNvbWUgbW9zdGx5IG1pbm9yIGJ1ZyBmaXhlcy4gU0YgaXNzdWVzIGluY2x1ZGU6IDEwMDY3MDgsCisgICAgICAgICAgMTAyMTc3NiwgMTAyMzY0NiwgMTExNDk2MCwgMTE1NjM5OCwgMTIyMTE2MCwgMTI3MTY0Mi4KKworUmVsZWFzZSAxLjk1LjggRnJpIEp1bCAyMyAyMDA0CisgICAgICAgIC0gTWFqb3IgbmV3IGZlYXR1cmU6IHN1c3BlbmQvcmVzdW1lLiAgSGFuZGxlcnMgY2FuIG5vdyByZXF1ZXN0CisgICAgICAgICAgdGhhdCBhIHBhcnNlIGJlIHN1c3BlbmRlZCBmb3IgbGF0ZXIgcmVzdW1wdGlvbiBvciBhYm9ydGVkCisgICAgICAgICAgYWx0b2dldGhlci4gIFNlZSAiVGVtcG9yYXJpbHkgU3RvcHBpbmcgUGFyc2luZyIgaW4gdGhlCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgICAtIFNvbWUgbW9zdGx5IG1pbm9yIGJ1ZyBmaXhlcywgYnV0IGNvbXBpbGF0aW9uIHNob3VsZCBubworICAgICAgICAgIGxvbmdlciBnZW5lcmF0ZSB3YXJuaW5ncyBvbiBtb3N0IHBsYXRmb3Jtcy4gIFNGIGlzc3VlcworICAgICAgICAgIGluY2x1ZGU6IDgyNzMxOSwgODQwMTczLCA4NDYzMDksIDg4ODMyOSwgODk2MTg4LCA5MjM5MTMsCisgICAgICAgICAgOTI4MTEzLCA5NjE2OTgsIDk4NTE5Mi4KKworUmVsZWFzZSAxLjk1LjcgTW9uIE9jdCAyMCAyMDAzCisgICAgICAgIC0gRml4ZWQgZW51bSBYTUxfU3RhdHVzIGlzc3VlIChyZXBvcnRlZCBvbiBTb3VyY2VGb3JnZSBtYW55CisgICAgICAgICAgdGltZXMpLCBzbyBjb21waWxlcnMgdGhhdCBhcmUgcHJvcGVybHkgcGlja3kgd2lsbCBiZSBoYXBweS4KKyAgICAgICAgLSBJbnRyb2R1Y2VkIGFuIFhNTENBTEwgbWFjcm8gdG8gY29udHJvbCB0aGUgY2FsbGluZworICAgICAgICAgIGNvbnZlbnRpb24gdXNlZCBieSB0aGUgRXhwYXQgQVBJOyB0aGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkCisgICAgICAgICAgdG8gYW5ub3RhdGUgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMgb2YgY2FsbGJhY2sKKyAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gY29kZSBjb21waWxlZCB3aXRoIGEgY2FsbGluZyBjb252ZW50aW9uCisgICAgICAgICAgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBjb252ZW50aW9uIGZvciB0aGUgaG9zdCBwbGF0Zm9ybS4KKyAgICAgICAgLSBJbXByb3ZlZCBhYmlsaXR5IHRvIGJ1aWxkIHdpdGhvdXQgdGhlIGNvbmZpZ3VyZS1nZW5lcmF0ZWQKKyAgICAgICAgICBleHBhdF9jb25maWcuaCBoZWFkZXIuICBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zCisgICAgICAgICAgd2hpY2ggZW1iZWQgRXhwYXQgcmF0aGVyIHRoYW4gbGlua2luZyBpbiB0aGUgbGlicmFyeS4KKyAgICAgICAgLSBGaXhlZCBhIHZhcmlldHkgb2YgYnVnczogc2VlIFNGIGlzc3VlcyA0NTg5MDcsIDYwOTYwMywKKyAgICAgICAgICA2NzY4NDQsIDY3OTc1NCwgNjkyODc4LCA2OTI5NjQsIDY5NTQwMSwgNjk5MzIzLCA2OTk0ODcsCisgICAgICAgICAgODIwOTQ2LgorICAgICAgICAtIEltcHJvdmVkIGhhc2ggdGFibGUgbG9va3Vwcy4KKyAgICAgICAgLSBBZGRlZCBtb3JlIHJlZ3Jlc3Npb24gdGVzdHMgYW5kIGltcHJvdmVkIGRvY3VtZW50YXRpb24uCisKK1JlbGVhc2UgMS45NS42IFR1ZSBKYW4gMjggMjAwMworICAgICAgICAtIEFkZGVkIFhNTF9GcmVlQ29udGVudE1vZGVsKCkuCisgICAgICAgIC0gQWRkZWQgWE1MX01lbU1hbGxvYygpLCBYTUxfTWVtUmVhbGxvYygpLCBYTUxfTWVtRnJlZSgpLgorICAgICAgICAtIEZpeGVkIGEgdmFyaWV0eSBvZiBidWdzOiBzZWUgU0YgaXNzdWVzIDYxNTYwNiwgNjE2ODYzLAorICAgICAgICAgIDYxODE5OSwgNjUzMTgwLCA2NzM3OTEuCisgICAgICAgIC0gRW5oYW5jZWQgdGhlIHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZS4KKyAgICAgICAgLSBNYW4gcGFnZSBpbXByb3ZlbWVudHM6IGluY2x1ZGVzIFNGIGlzc3VlIDYzMjE0Ni4KKworUmVsZWFzZSAxLjk1LjUgRnJpIFNlcCA2IDIwMDIKKyAgICAgICAgLSBBZGRlZCBYTUxfVXNlRm9yZWlnbkRURCgpIGZvciBpbXByb3ZlZCBTQVgyIHN1cHBvcnQuCisgICAgICAgIC0gQWRkZWQgWE1MX0dldEZlYXR1cmVMaXN0KCkuCisgICAgICAgIC0gRGVmaW5lZCBYTUxfQm9vbCB0eXBlIGFuZCB0aGUgdmFsdWVzIFhNTF9UUlVFIGFuZCBYTUxfRkFMU0UuCisgICAgICAgIC0gVXNlIGFuIGluY29tcGxldGUgc3RydWN0IGluc3RlYWQgb2YgYSB2b2lkKiBmb3IgdGhlIHBhcnNlcgorICAgICAgICAgIChtYXkgbm90IHJldGFpbikuCisgICAgICAgIC0gRml4ZWQgVVRGLTggZGVjb2RpbmcgYnVnIHRoYXQgY2F1c2VkIGxlZ2FsIFVURi04IHRvIGJlIHJlamVjdGVkLgorICAgICAgICAtIEZpbmFsbHkgZml4ZWQgYnVnIHdoZXJlIGRlZmF1bHQgaGFuZGxlciB3b3VsZCByZXBvcnQgRFRECisgICAgICAgICAgZXZlbnRzIHRoYXQgd2VyZSBhbHJlYWR5IGhhbmRsZWQgYnkgYW5vdGhlciBoYW5kbGVyLgorICAgICAgICAgIEluaXRpYWwgcGF0Y2ggY29udHJpYnV0ZWQgYnkgRGFycnlsIE1pbGVzLgorICAgICAgICAtIFJlbW92ZWQgdW5uZWNlc3NhcnkgRGxsTWFpbigpIGZ1bmN0aW9uIHRoYXQgY2F1c2VkIHN0YXRpYworICAgICAgICAgIGxpbmtpbmcgaW50byBhIERMTCB0byBiZSBkaWZmaWN1bHQuCisgICAgICAgIC0gQWRkZWQgVkMrKyBwcm9qZWN0cyBmb3IgYnVpbGRpbmcgc3RhdGljIGxpYnJhcmllcy4KKyAgICAgICAgLSBSZWR1Y2VkIGxpbmUtbGVuZ3RoIGZvciBhbGwgc291cmNlIGNvZGUgYW5kIGhlYWRlcnMgdG8gYmUKKyAgICAgICAgICBubyBsb25nZXIgdGhhbiA4MCBjaGFyYWN0ZXJzLCB0byBoZWxwIHdpdGggQVMvNDAwIHN1cHBvcnQuCisgICAgICAgIC0gUmVkdWNlZCBtZW1vcnkgY29weWluZyBkdXJpbmcgcGFyc2luZyAoU0YgcGF0Y2ggIzYwMDk2NCkuCisgICAgICAgIC0gRml4ZWQgYSB2YXJpZXR5IG9mIGJ1Z3M6IHNlZSBTRiBpc3N1ZXMgNTgwNzkzLCA0MzQ2NjQsCisgICAgICAgICAgNDgzNTE0LCA1ODA1MDMsIDU4MTA2OSwgNTg0MDQxLCA1ODQxODMsIDU4NDgzMiwgNTg1NTM3LAorICAgICAgICAgIDU5NjU1NSwgNTk2Njc4LCA1OTgzNTIsIDU5ODk0NCwgNTk5NzE1LCA2MDA0NzksIDYwMDk3MS4KKworUmVsZWFzZSAxLjk1LjQgRnJpIEp1bCAxMiAyMDAyCisgICAgICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgVk1TLCBjb250cmlidXRlZCBieSBDcmFpZyBCZXJyeS4gIFNlZQorICAgICAgICAgIHZtcy9SRUFETUUudm1zIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAtIEFkZGVkIE1hYyBPUyAoY2xhc3NpYykgc3VwcG9ydCwgd2l0aCBhIG1ha2VmaWxlIGZvciBNUFcsCisgICAgICAgICAgY29udHJpYnV0ZWQgYnkgVGhvbWFzIFdlZ25lciBhbmQgRGFyeWxlIFdhbGtlci4KKyAgICAgICAgLSBBZGRlZCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUgLyBCQ0MgNS41IHN1cHBvcnQsIGNvbnRyaWJ1dGVkCisgICAgICAgICAgYnkgUGF0cmljayBNY0Nvbm5lbGwgKFNGIHBhdGNoICM1MzgwMzIpLgorICAgICAgICAtIEZpeGVkIGEgdmFyaWV0eSBvZiBidWdzOiBzZWUgU0YgaXNzdWVzIDQ0MTQ0OSwgNTYzMTg0LAorICAgICAgICAgIDU2NDM0MiwgNTY2MzM0LCA1NjY5MDEsIDU2OTQ2MSwgNTcwMjYzLCA1NzUxNjgsIDU3OTE5Ni4KKyAgICAgICAgLSBNYWRlIHNraXBwZWRFbnRpdHlIYW5kbGVyIGNvbmZvcm0gdG8gU0FYMiAoc2VlIHNvdXJjZSBjb21tZW50KQorICAgICAgICAtIFJlLWltcGxlbWVudGVkIFdGQzogRW50aXR5IERlY2xhcmVkIGZyb20gWE1MIDEuMCBzcGVjIGFuZAorICAgICAgICAgIGFkZGVkIGEgbmV3IGVycm9yICJlbnRpdHkgZGVjbGFyZWQgaW4gcGFyYW1ldGVyIGVudGl0eSI6CisgICAgICAgICAgc2VlIFNGIGJ1ZyByZXBvcnQgNTY5NDYxIGFuZCBTRiBwYXRjaCA1NzgxNjEKKyAgICAgICAgLSBSZS1pbXBsZW1lbnRlZCBzZWN0aW9uIDUuMSBmcm9tIFhNTCAxLjAgc3BlYzoKKyAgICAgICAgICBzZWUgU0YgYnVnIHJlcG9ydCA1NzAyNjMgYW5kIFNGIHBhdGNoIDU3ODE2MQorCitSZWxlYXNlIDEuOTUuMyBNb24gSnVuIDMgMjAwMgorICAgICAgICAtIEFkZGVkIGEgcHJvamVjdCB0byB0aGUgTVNWQyB3b3Jrc3BhY2UgdG8gY3JlYXRlIGEgd2NoYXJfdAorICAgICAgICAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnk7IHRoZSBETExzIGFyZSBuYW1lZCBsaWJleHBhdHcuZGxsLgorICAgICAgICAtIENoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIFdpbmRvd3MgRExMcyBmcm9tIGV4cGF0LmRsbCB0bworICAgICAgICAgIGxpYmV4cGF0LmRsbDsgdGhpcyBmaXhlcyBTRiBidWcgIzQzMjQ1Ni4KKyAgICAgICAgLSBBZGRlZCB0aGUgWE1MX1BhcnNlclJlc2V0KCkgQVBJIGZ1bmN0aW9uLgorICAgICAgICAtIEZpeGVkIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQoKSB0byB3b3JrIGZvciBlbGVtZW50IG5hbWVzLgorICAgICAgICAtIE1hZGUgdGhlIFhNTF9VTklDT0RFIGJ1aWxkcyB1c2FibGUgKHRoYW5rcywgS2FybCEpLgorICAgICAgICAtIEFsbG93IHhtbHdmIHRvIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKyAgICAgICAgLSBJbnN0YWxsIGEgbWFuIHBhZ2UgZm9yIHhtbHdmIG9uIFVuaXggc3lzdGVtcy4KKyAgICAgICAgLSBGaXhlZCBtYW55IGJ1Z3M7IHNlZSBTRiBidWcgcmVwb3J0cyAyMzE4NjQsIDQ2MTM4MCwgNDY0ODM3LAorICAgICAgICAgIDQ2Njg4NSwgNDY5MjI2LCA0Nzc2NjcsIDQ4NDQxOSwgNDg3ODQwLCA0OTQ3NDksIDQ5NjUwNSwKKyAgICAgICAgICA1NDczNTAuICBPdGhlciBidWdzIHdoaWNoIHdlIGNhbid0IHRlc3QgYXMgZWFzaWx5IG1heSBhbHNvCisgICAgICAgICAgaGF2ZSBiZWVuIGZpeGVkLCBlc3BlY2lhbGx5IGluIHRoZSBhcmVhIG9mIGJ1aWxkIHN1cHBvcnQuCisKK1JlbGVhc2UgMS45NS4yIEZyaSBKdWwgMjcgMjAwMQorICAgICAgICAtIE1vcmUgY2hhbmdlcyB0byBtYWtlIE1TVkMgaGFwcHkgd2l0aCB0aGUgYnVpbGQ7IGFkZCBhIHNpbmdsZQorICAgICAgICAgIHdvcmtzcGFjZSB0byBzdXBwb3J0IGJvdGggdGhlIGxpYnJhcnkgYW5kIHhtbHdmIGFwcGxpY2F0aW9uLgorICAgICAgICAtIEFkZGVkIGEgV2luZG93cyBpbnN0YWxsZXIgZm9yIFdpbmRvd3MgdXNlcnM7IGluY2x1ZGVzCisgICAgICAgICAgeG1sd2YuZXhlLgorICAgICAgICAtIEFkZGVkIGNvbXBpbGUtdGltZSBjb25zdGFudHMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICAgRXhwYXQgdmVyc2lvbgorICAgICAgICAtIFJlbW92ZWQgYSBsb3Qgb2YgR05VLXNwZWNpZmljIGRlcGVuZGVuY2llcyB0byBhaWRlIHBvcnRhYmlsaXR5CisgICAgICAgICAgYW1vbmcgdGhlIHZhcmlvdXMgVW5peCBmbGF2b3JzLgorICAgICAgICAtIEZpeCB0aGUgVVRGLTggQk9NIGJ1Zy4KKyAgICAgICAgLSBDbGVhbmVkIHVwIHdhcm5pbmcgbWVzc2FnZXMgZm9yIHNldmVyYWwgY29tcGlsZXJzLgorICAgICAgICAtIEFkZGVkIHRoZSAtV2FsbCwgLVdzdHJpY3QtcHJvdG90eXBlcyBvcHRpb25zIGZvciBHQ0MuCisKK1JlbGVhc2UgMS45NS4xIFN1biBPY3QgMjIgMTU6MTE6MzYgRURUIDIwMDAKKyAgICAgICAgLSBDaGFuZ2VzIHRvIGdldCBleHBhdCB0byBidWlsZCB1bmRlciBNaWNyb3NvZnQgY29tcGlsZXIKKyAgICAgICAgLSBSZW1vdmVkIGFsbCBhYm9ydHMgYW5kIGluc3RlYWQgcmV0dXJuIGFuIFVORVhQRUNURURfU1RBVEUgZXJyb3IuCisgICAgICAgIC0gRml4ZWQgYSBidWcgd2hlcmUgYSBzdHJheSAnJScgaW4gYW4gZW50aXR5IHZhbHVlIHdvdWxkIGNhdXNlIGFuCisgICAgICAgICAgYWJvcnQuCisgICAgICAgIC0gRGVmaW5lZCBYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIuIFRoYW5rcyB0byBEYXJyeWwgTWlsZXMgZm9yCisgICAgICAgICAgZmluZGluZyB0aGlzIG92ZXJzaWdodC4KKyAgICAgICAgLSBDaGFuZ2VkIGRlZmF1bHQgcGF0dGVybnMgaW4gbGliL01ha2VmaWxlLmluIHRvIGZpdCBub24tR05VIG1ha2VzCisgICAgICAgICAgVGhhbmtzIHRvIHJvYmluQHVucmF0ZWQubmV0IGZvciByZXBvcnRpbmcgYW5kIHByb3ZpZGluZyBhbgorICAgICAgICAgIGFjY291bnQgdG8gdGVzdCBvbi4KKyAgICAgICAgLSBUaGUgcmVmZXJlbmNlIGhhZCB0aGUgd3JvbmcgbGFiZWwgZm9yIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2wuCisgICAgICAgICAgUmVwb3J0ZWQgYnkgYW4gYW5vbnltb3VzIHVzZXIuCisKK1JlbGVhc2UgMS45NS4wIEZyaSBTZXAgMjkgMjAwMAorICAgICAgICAtIFhNTF9QYXJzZXJDcmVhdGVfTU0KKyAgICAgICAgICAgICAgICBBbGxvd3MgeW91IHRvIHNldCBhIG1lbW9yeSBtYW5hZ2VtZW50IHN1aXRlIHRvIHJlcGxhY2UgdGhlCisgICAgICAgICAgICAgICAgc3RhbmRhcmQgbWFsbG9jLHJlYWxsb2MsIGFuZCBmcmVlLgorICAgICAgICAtIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQKKyAgICAgICAgICAgICAgICBJZiB5b3UgdHVybiB0aGlzIGZlYXR1cmUgb24gd2hlbiBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBpbgorICAgICAgICAgICAgICAgIGVmZmVjdCwgdGhlbiBxdWFsaWZpZWQsIHByZWZpeGVkIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcworICAgICAgICAgICAgICAgIGFyZSByZXR1cm5lZCBhcyAidXJpfG5hbWV8cHJlZml4IiB3aGVyZSAnfCcgaXMgd2hhdGV2ZXIKKyAgICAgICAgICAgICAgICBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIHVzZWQgaW4gbmFtZXNwYWNlIHByb2Nlc3NpbmcuCisgICAgICAgIC0gTWVyZ2VkIGluIGZlYXR1cmVzIGZyb20gcGVybC1leHBhdAorICAgICAgICAgICAgICAgIG8gWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcgorICAgICAgICAgICAgICAgIG8gWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcgorICAgICAgICAgICAgICAgIG8gWE1MX1NldFhtbERlY2xIYW5kbGVyCisgICAgICAgICAgICAgICAgbyBYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIKKyAgICAgICAgICAgICAgICBvIFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHRha2VzIDMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzaWQsIHB1YmlkLCBoYXNfaW50ZXJuYWxfc3Vic2V0CisgICAgICAgICAgICAgICAgbyBNYW55IHBhaXJlZCBoYW5kbGVyIHNldHRlcnMgKGxpa2UgWE1MX1NldEVsZW1lbnRIYW5kbGVyKQorICAgICAgICAgICAgICAgICAgbm93IGhhdmUgY29ycmVzcG9uZGluZyBpbmRpdmlkdWFsIGhhbmRsZXIgc2V0dGVycworICAgICAgICAgICAgICAgIG8gWE1MX0dldElucHV0Q29udGV4dCBmb3IgZ2V0dGluZyB0aGUgaW5wdXQgY29udGV4dCBvZgorICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGFyc2UgcG9zaXRpb24uCisgICAgICAgIC0gQWRkZWQgcmVmZXJlbmNlIG1hdGVyaWFsCisgICAgICAgIC0gUGFja2FnZWQgaW50byBhIGRpc3RyaWJ1dGlvbiB0aGF0IGJ1aWxkcyBhIHNoYXJhYmxlIGxpYnJhcnkKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL01BTklGRVNUIGIvZXhwYXQtMi4wLjEvTUFOSUZFU1QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWE4M2Q1YgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL01BTklGRVNUCkBAIC0wLDAgKzEsMTI4IEBACithbWlnYS9zdGRsaWIuYworYW1pZ2EvbGF1bmNoLmMKK2FtaWdhL2V4cGF0X3ZlY3RvcnMuYworYW1pZ2EvZXhwYXRfbGliLmMKK2FtaWdhL2V4cGF0LnhtbAorYW1pZ2EvUkVBRE1FLnR4dAorYW1pZ2EvTWFrZWZpbGUKK2FtaWdhL2luY2x1ZGUvcHJvdG8vZXhwYXQuaAorYW1pZ2EvaW5jbHVkZS9saWJyYXJpZXMvZXhwYXQuaAorYW1pZ2EvaW5jbHVkZS9pbnRlcmZhY2VzL2V4cGF0LmgKK2FtaWdhL2luY2x1ZGUvaW5saW5lNC9leHBhdC5oCitiY2I1L1JFQURNRS50eHQKK2JjYjUvYWxsX3Byb2plY3RzLmJwZworYmNiNS9lbGVtZW50cy5icGYKK2JjYjUvZWxlbWVudHMuYnByCitiY2I1L2VsZW1lbnRzLm1haworYmNiNS9leHBhdC5icGYKK2JjYjUvZXhwYXQuYnByCitiY2I1L2V4cGF0Lm1haworYmNiNS9leHBhdF9zdGF0aWMuYnBmCitiY2I1L2V4cGF0X3N0YXRpYy5icHIKK2JjYjUvZXhwYXRfc3RhdGljLm1haworYmNiNS9leHBhdHcuYnBmCitiY2I1L2V4cGF0dy5icHIKK2JjYjUvZXhwYXR3Lm1haworYmNiNS9leHBhdHdfc3RhdGljLmJwZgorYmNiNS9leHBhdHdfc3RhdGljLmJwcgorYmNiNS9leHBhdHdfc3RhdGljLm1haworYmNiNS9saWJleHBhdF9tdGQuZGVmCitiY2I1L2xpYmV4cGF0d19tdGQuZGVmCitiY2I1L21ha2VmaWxlLm1haworYmNiNS9vdXRsaW5lLmJwZgorYmNiNS9vdXRsaW5lLmJwcgorYmNiNS9vdXRsaW5lLm1haworYmNiNS9zZXR1cC5iYXQKK2JjYjUveG1sd2YuYnBmCitiY2I1L3htbHdmLmJwcgorYmNiNS94bWx3Zi5tYWsKK2RvYy9leHBhdC5wbmcKK2RvYy9yZWZlcmVuY2UuaHRtbAorZG9jL3N0eWxlLmNzcworZG9jL3ZhbGlkLXhodG1sMTAucG5nCitkb2MveG1sd2YuMQorZG9jL3htbHdmLnNnbWwKK0NPUFlJTkcKK0NoYW5nZXMKK01BTklGRVNUCitNYWtlZmlsZS5pbgorUkVBRE1FCitjb25maWd1cmUKK2NvbmZpZ3VyZS5pbgorZXhwYXRfY29uZmlnLmguaW4KK2V4cGF0LmRzdworY29uZnRvb2xzL1ByaW50UGF0aAorY29uZnRvb2xzL2FjX2NfYmlnZW5kaWFuX2Nyb3NzLm00Citjb25mdG9vbHMvY29uZmlnLmd1ZXNzCitjb25mdG9vbHMvY29uZmlnLnN1YgorY29uZnRvb2xzL2V4cGF0Lm00Citjb25mdG9vbHMvZ2V0LXZlcnNpb24uc2gKK2NvbmZ0b29scy9pbnN0YWxsLXNoCitjb25mdG9vbHMvbGlidG9vbC5tNAorY29uZnRvb2xzL2x0bWFpbi5zaAorY29uZnRvb2xzL21raW5zdGFsbGRpcnMKK2V4YW1wbGVzL2VsZW1lbnRzLmMKK2V4YW1wbGVzL2VsZW1lbnRzLmRzcAorZXhhbXBsZXMvb3V0bGluZS5jCitleGFtcGxlcy9vdXRsaW5lLmRzcAorbGliL01ha2VmaWxlLk1QVworbGliL2FtaWdhY29uZmlnLmgKK2xpYi9hc2NpaS5oCitsaWIvYXNjaWl0YWIuaAorbGliL2V4cGF0LmRzcAorbGliL2V4cGF0LmgKK2xpYi9leHBhdF9leHRlcm5hbC5oCitsaWIvZXhwYXRfc3RhdGljLmRzcAorbGliL2V4cGF0dy5kc3AKK2xpYi9leHBhdHdfc3RhdGljLmRzcAorbGliL2lhc2NpaXRhYi5oCitsaWIvaW50ZXJuYWwuaAorbGliL2xhdGluMXRhYi5oCitsaWIvbGliZXhwYXQuZGVmCitsaWIvbGliZXhwYXR3LmRlZgorbGliL21hY2NvbmZpZy5oCitsaWIvbmFtZXRhYi5oCitsaWIvdXRmOHRhYi5oCitsaWIvd2luY29uZmlnLmgKK2xpYi94bWxwYXJzZS5jCitsaWIveG1scm9sZS5jCitsaWIveG1scm9sZS5oCitsaWIveG1sdG9rLmMKK2xpYi94bWx0b2suaAorbGliL3htbHRva19pbXBsLmMKK2xpYi94bWx0b2tfaW1wbC5oCitsaWIveG1sdG9rX25zLmMKK3Rlc3RzL2JlbmNobWFyay9SRUFETUUudHh0Cit0ZXN0cy9iZW5jaG1hcmsvYmVuY2htYXJrLmMKK3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuZHNwCit0ZXN0cy9iZW5jaG1hcmsvYmVuY2htYXJrLmRzdwordGVzdHMvUkVBRE1FLnR4dAordGVzdHMvY2hhcmRhdGEuYwordGVzdHMvY2hhcmRhdGEuaAordGVzdHMvbWluaWNoZWNrLmMKK3Rlc3RzL21pbmljaGVjay5oCit0ZXN0cy9ydW50ZXN0cy5jCit0ZXN0cy9ydW50ZXN0c3BwLmNwcAordGVzdHMveG1sdGVzdC5zaAordm1zL1JFQURNRS52bXMKK3Ztcy9kZXNjcmlwLm1tcwordm1zL2V4cGF0X2NvbmZpZy5oCit3aW4zMi9NQU5JRkVTVC50eHQKK3dpbjMyL1JFQURNRS50eHQKK3dpbjMyL2V4cGF0LmlzcworeG1sd2YvY29kZXBhZ2UuYworeG1sd2YvY29kZXBhZ2UuaAoreG1sd2YvY3QuYworeG1sd2YvZmlsZW1hcC5oCit4bWx3Zi9yZWFkZmlsZW1hcC5jCit4bWx3Zi91bml4ZmlsZW1hcC5jCit4bWx3Zi93aW4zMmZpbGVtYXAuYworeG1sd2YveG1sZmlsZS5jCit4bWx3Zi94bWxmaWxlLmgKK3htbHdmL3htbG1pbWUuYworeG1sd2YveG1sbWltZS5oCit4bWx3Zi94bWx0Y2hhci5oCit4bWx3Zi94bWx1cmwuaAoreG1sd2YveG1sd2YuYworeG1sd2YveG1sd2YuZHNwCit4bWx3Zi94bWx3aW4zMnVybC5jeHgKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL01ha2VmaWxlLmluIGIvZXhwYXQtMi4wLjEvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGUyY2M5NQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTg3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggdG9wLWxldmVsIGNvbmZpZ3VyZSBzY3JpcHQgdG8gcHJvZHVjZSBNYWtlZmlsZQorIworIyBDb3B5cmlnaHQgMjAwMCBDbGFyayBDb29wZXIKKyMKKyMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVYUEFULgorIworIyAgRVhQQVQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIChiYXNlZCBvbiB0aGUgTUlUL1ggbGljZW5zZSkgY29udGFpbmVkCisjICBpbiB0aGUgZmlsZSBDT1BZSU5HIHRoYXQgY29tZXMgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbi4KKyMKKyMgRVhQQVQgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyMgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBFWFBBVC4KKyMKKworU0hFTEwgPSBAU0hFTExACisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYmluZGlyID0gQGJpbmRpckAKK2xpYmRpciA9IEBsaWJkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACittYW4xZGlyID0gQG1hbmRpckAvbWFuMQorCit0b3BfYnVpbGRkaXIgPSAuCisKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9jb25mdG9vbHMvbWtpbnN0YWxsZGlycworCitNQU5GSUxFID0gJChzcmNkaXIpL2RvYy94bWx3Zi4xCitBUElIRUFERVIgPSAkKHNyY2RpcikvbGliL2V4cGF0LmggJChzcmNkaXIpL2xpYi9leHBhdF9leHRlcm5hbC5oCitMSUJSQVJZID0gbGliZXhwYXQubGEKKworREVTVERJUiA9ICQoSU5TVEFMTF9ST09UKQorCitkZWZhdWx0OiAgYnVpbGRsaWIgeG1sd2YveG1sd2YKKworYnVpbGRsaWI6ICQoTElCUkFSWSkKKworYWxsOiAkKExJQlJBUlkpIHhtbHdmL3htbHdmIGV4YW1wbGVzL2VsZW1lbnRzIGV4YW1wbGVzL291dGxpbmUKKworY2xlYW46CisJY2QgbGliICYmIHJtIC1mICQoTElCUkFSWSkgKi5vICoubG8gJiYgcm0gLXJmIC5saWJzIF9saWJzCisJY2QgeG1sd2YgJiYgcm0gLWYgeG1sd2YgKi5vICoubG8gJiYgcm0gLXJmIC5saWJzIF9saWJzCisJY2QgZXhhbXBsZXMgJiYgcm0gLWYgZWxlbWVudHMgb3V0bGluZSAqLm8gKi5sbyAmJiBybSAtcmYgLmxpYnMgX2xpYnMKKwljZCB0ZXN0cyAmJiBybSAtcmYgLmxpYnMgcnVudGVzdHMgcnVudGVzdHMubyBydW50ZXN0c3BwIHJ1bnRlc3RzcHAubworCWNkIHRlc3RzICYmIHJtIC1mIGNoYXJkYXRhLm8gbWluaWNoZWNrLm8KKwlybSAtcmYgLmxpYnMgbGliZXhwYXQubGEKKwlybSAtZiBleGFtcGxlcy9jb3JlIHRlc3RzL2NvcmUgeG1sd2YvY29yZQorCitjbG9iYmVyOiBjbGVhbgorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgZXhwYXRfY29uZmlnLmggY29uZmlnLnN0YXR1cyBjb25maWcubG9nIGNvbmZpZy5jYWNoZSBsaWJ0b29sCisJcm0gLWYgTWFrZWZpbGUKKworZXh0cmFjbGVhbjogZGlzdGNsZWFuCisJcm0gLWYgZXhwYXRfY29uZmlnLmguaW4gY29uZmlndXJlCisJcm0gLWYgY29uZnRvb2xzL2x0Y29uZmlnIGNvbmZ0b29scy9sdG1haW4uc2ggY29uZnRvb2xzL2xpYnRvb2wubTQKKworY2hlY2s6IHRlc3RzL3J1bnRlc3RzIHRlc3RzL3J1bnRlc3RzcHAKKwl0ZXN0cy9ydW50ZXN0cworCXRlc3RzL3J1bnRlc3RzcHAKKworaW5zdGFsbDogeG1sd2YveG1sd2YgaW5zdGFsbGxpYgorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW4xZGlyKQorCSQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIHhtbHdmL3htbHdmICQoREVTVERJUikkKGJpbmRpcikveG1sd2YKKwkkKElOU1RBTExfREFUQSkgJChNQU5GSUxFKSAkKERFU1RESVIpJChtYW4xZGlyKQorCitpbnN0YWxsbGliOiAkKExJQlJBUlkpICQoQVBJSEVBREVSKQorCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKSAkKERFU1RESVIpJChpbmNsdWRlZGlyKQorCSQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkKExJQlJBUlkpICQoREVTVERJUikkKGxpYmRpcikvJChMSUJSQVJZKQorCWZvciBGTiBpbiAkKEFQSUhFQURFUikgOyBkbyAkKElOU1RBTExfREFUQSkgJCRGTiAkKERFU1RESVIpJChpbmNsdWRlZGlyKSA7IGRvbmUKKwordW5pbnN0YWxsOiB1bmluc3RhbGxsaWIKKwkkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJChERVNURElSKSQoYmluZGlyKS94bWx3ZgorCXJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpL3htbHdmLjEKKwordW5pbnN0YWxsbGliOgorCSQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpLyQoTElCUkFSWSkKKwlybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9leHBhdC5oCisJcm0gLWYgJChERVNURElSKSQoaW5jbHVkZWRpcikvZXhwYXRfZXh0ZXJuYWwuaAorCisjIGZvciBWUEFUSCBidWlsZHMgKGludm9rZWQgYnkgY29uZmlndXJlKQorbWtkaXItaW5pdDoKKwlAZm9yIGQgaW4gbGliIHhtbHdmIGV4YW1wbGVzIHRlc3RzIDsgZG8gXAorCQkobWtkaXIgJCRkIDI+IC9kZXYvbnVsbCB8fCB0ZXN0IDEpIDsgXAorCWRvbmUKKworQ0MgPSBAQ0NACitDWFggPSBAQ1hYQAorTElCVE9PTCA9IEBMSUJUT09MQAorCitJTkNMVURFUyA9IC1JJChzcmNkaXIpL2xpYiAtSS4KK0xERkxBR1MgPSBATERGTEFHU0AKK0NQUEZMQUdTID0gQENQUEZMQUdTQCAtREhBVkVfRVhQQVRfQ09ORklHX0gKK0NGTEFHUyA9IEBDRkxBR1NACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK1ZTTkZMQUcgPSAtdmVyc2lvbi1pbmZvIEBMSUJDVVJSRU5UQDpATElCUkVWSVNJT05AOkBMSUJBR0VACisKKyMjIyBhdXRvY29uZiB0aGlzPworTFRGTEFHUyA9IC0tc2lsZW50CisKK0NPTVBJTEUgPSAkKENDKSAkKElOQ0xVREVTKSAkKENGTEFHUykgJChERUZTKSAkKENQUEZMQUdTKQorQ1hYQ09NUElMRSA9ICQoQ1hYKSAkKElOQ0xVREVTKSAkKENYWEZMQUdTKSAkKERFRlMpICQoQ1BQRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpICQoTFRGTEFHUykgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKQorTElOS19MSUIgPSAkKExJQlRPT0wpICQoTFRGTEFHUykgLS1tb2RlPWxpbmsgJChDT01QSUxFKSAtbm8tdW5kZWZpbmVkICQoVlNORkxBRykgLXJwYXRoICQobGliZGlyKSAkKExERkxBR1MpIC1vICRACitMSU5LX0VYRSA9ICQoTElCVE9PTCkgJChMVEZMQUdTKSAtLW1vZGU9bGluayAkKENPTVBJTEUpICQoTERGTEFHUykgLW8gJEAKK0xJTktfQ1hYX0VYRSA9ICQoTElCVE9PTCkgJChMVEZMQUdTKSAtLW1vZGU9bGluayAkKENYWENPTVBJTEUpICQoTERGTEFHUykgLW8gJEAKKworTElCX09CSlMgPSBsaWIveG1scGFyc2UubG8gbGliL3htbHRvay5sbyBsaWIveG1scm9sZS5sbworJChMSUJSQVJZKTogJChMSUJfT0JKUykKKwkkKExJTktfTElCKSAkKExJQl9PQkpTKQorCitsaWIveG1scGFyc2UubG86IGxpYi94bWxwYXJzZS5jIGxpYi9leHBhdC5oIGxpYi94bWxyb2xlLmggbGliL3htbHRvay5oIFwKKwkkKHRvcF9idWlsZGRpcikvZXhwYXRfY29uZmlnLmggbGliL2V4cGF0X2V4dGVybmFsLmggbGliL2ludGVybmFsLmgKKworbGliL3htbHJvbGUubG86IGxpYi94bWxyb2xlLmMgbGliL2FzY2lpLmggbGliL3htbHJvbGUuaCBcCisJJCh0b3BfYnVpbGRkaXIpL2V4cGF0X2NvbmZpZy5oIGxpYi9leHBhdF9leHRlcm5hbC5oIGxpYi9pbnRlcm5hbC5oCisKK2xpYi94bWx0b2subG86IGxpYi94bWx0b2suYyBsaWIveG1sdG9rX2ltcGwuYyBsaWIveG1sdG9rX25zLmMgXAorCWxpYi9hc2NpaS5oIGxpYi9hc2NpaXRhYi5oIGxpYi9pYXNjaWl0YWIuaCBsaWIvbGF0aW4xdGFiLmggXAorCWxpYi9uYW1ldGFiLmggbGliL3V0Zjh0YWIuaCBsaWIveG1sdG9rLmggbGliL3htbHRva19pbXBsLmggXAorCSQodG9wX2J1aWxkZGlyKS9leHBhdF9jb25maWcuaCBsaWIvZXhwYXRfZXh0ZXJuYWwuaCBsaWIvaW50ZXJuYWwuaAorCisKK1hNTFdGX09CSlMgPSB4bWx3Zi94bWx3Zi5vIHhtbHdmL3htbGZpbGUubyB4bWx3Zi9jb2RlcGFnZS5vIHhtbHdmL0BGSUxFTUFQQC5vCit4bWx3Zi94bWx3Zi5vOiB4bWx3Zi94bWx3Zi5jCit4bWx3Zi94bWxmaWxlLm86IHhtbHdmL3htbGZpbGUuYworeG1sd2YvY29kZXBhZ2UubzogeG1sd2YvY29kZXBhZ2UuYworeG1sd2YvQEZJTEVNQVBALm86IHhtbHdmL0BGSUxFTUFQQC5jCit4bWx3Zi94bWx3ZjogJChYTUxXRl9PQkpTKSAkKExJQlJBUlkpCisJJChMSU5LX0VYRSkgJChYTUxXRl9PQkpTKSAkKExJQlJBUlkpCisKK2V4YW1wbGVzL2VsZW1lbnRzLm86IGV4YW1wbGVzL2VsZW1lbnRzLmMKK2V4YW1wbGVzL2VsZW1lbnRzOiBleGFtcGxlcy9lbGVtZW50cy5vICQoTElCUkFSWSkKKwkkKExJTktfRVhFKSAkPCAkKExJQlJBUlkpCisKK2V4YW1wbGVzL291dGxpbmUubzogZXhhbXBsZXMvb3V0bGluZS5jCitleGFtcGxlcy9vdXRsaW5lOiBleGFtcGxlcy9vdXRsaW5lLm8gJChMSUJSQVJZKQorCSQoTElOS19FWEUpICQ8ICQoTElCUkFSWSkKKwordGVzdHMvY2hhcmRhdGEubzogdGVzdHMvY2hhcmRhdGEuYyB0ZXN0cy9jaGFyZGF0YS5oCit0ZXN0cy9taW5pY2hlY2subzogdGVzdHMvbWluaWNoZWNrLmMgdGVzdHMvbWluaWNoZWNrLmgKK3Rlc3RzL3J1bnRlc3RzLm86IHRlc3RzL3J1bnRlc3RzLmMgdGVzdHMvY2hhcmRhdGEuaAordGVzdHMvcnVudGVzdHM6IHRlc3RzL3J1bnRlc3RzLm8gdGVzdHMvY2hhcmRhdGEubyB0ZXN0cy9taW5pY2hlY2subyAkKExJQlJBUlkpCisJJChMSU5LX0VYRSkgdGVzdHMvcnVudGVzdHMubyB0ZXN0cy9jaGFyZGF0YS5vIHRlc3RzL21pbmljaGVjay5vICQoTElCUkFSWSkKK3Rlc3RzL3J1bnRlc3RzcHAubzogdGVzdHMvcnVudGVzdHNwcC5jcHAgdGVzdHMvcnVudGVzdHMuYyB0ZXN0cy9jaGFyZGF0YS5oCit0ZXN0cy9ydW50ZXN0c3BwOiB0ZXN0cy9ydW50ZXN0c3BwLm8gdGVzdHMvY2hhcmRhdGEubyB0ZXN0cy9taW5pY2hlY2subyAkKExJQlJBUlkpCisJJChMSU5LX0NYWF9FWEUpIHRlc3RzL3J1bnRlc3RzcHAubyB0ZXN0cy9jaGFyZGF0YS5vIHRlc3RzL21pbmljaGVjay5vICQoTElCUkFSWSkKKwordGVzdHMveG1sdHMuemlwOgorCXdnZXQgLS1vdXRwdXQtZG9jdW1lbnQ9dGVzdHMveG1sdHMuemlwIFwKKwkJaHR0cDovL3d3dy53My5vcmcvWE1ML1Rlc3QveG1sdHMyMDAyMDYwNi56aXAKKwordGVzdHMvWE1MLVRlc3QtU3VpdGU6IHRlc3RzL3htbHRzLnppcAorCWNkIHRlc3RzICYmIHVuemlwIC1xIHhtbHRzLnppcAorCitydW4teG1sdGVzdDogeG1sd2YveG1sd2YgdGVzdHMvWE1MLVRlc3QtU3VpdGUKKwl0ZXN0cy94bWx0ZXN0LnNoCisKKy5TVUZGSVhFUzogLmMgLmNwcCAubG8gLm8KKworLmNwcC5vOgorCSQoQ1hYQ09NUElMRSkgLW8gJEAgLWMgJDwKKy5jLm86CisJJChDT01QSUxFKSAtbyAkQCAtYyAkPAorLmMubG86CisJJChMVENPTVBJTEUpIC1vICRAIC1jICQ8CisKKy5QSE9OWTogYnVpbGRsaWIgYWxsIFwKKwljbGVhbiBkaXN0Y2xlYW4gZXh0cmFjbGVhbiBtYWludGFpbmVyLWNsZWFuIFwKKwlkaXN0IGRpc3RkaXIgXAorCWluc3RhbGwgdW5pbnN0YWxsCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9SRUFETUUgYi9leHBhdC0yLjAuMS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmRhMjgyYQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL1JFQURNRQpAQCAtMCwwICsxLDEzNyBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICBFeHBhdCwgUmVsZWFzZSAyLjAuMQorCitUaGlzIGlzIEV4cGF0LCBhIEMgbGlicmFyeSBmb3IgcGFyc2luZyBYTUwsIHdyaXR0ZW4gYnkgSmFtZXMgQ2xhcmsuCitFeHBhdCBpcyBhIHN0cmVhbS1vcmllbnRlZCBYTUwgcGFyc2VyLiAgVGhpcyBtZWFucyB0aGF0IHlvdSByZWdpc3RlcgoraGFuZGxlcnMgd2l0aCB0aGUgcGFyc2VyIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2UuICBUaGVzZSBoYW5kbGVycworYXJlIGNhbGxlZCB3aGVuIHRoZSBwYXJzZXIgZGlzY292ZXJzIHRoZSBhc3NvY2lhdGVkIHN0cnVjdHVyZXMgaW4gdGhlCitkb2N1bWVudCBiZWluZyBwYXJzZWQuICBBIHN0YXJ0IHRhZyBpcyBhbiBleGFtcGxlIG9mIHRoZSBraW5kIG9mCitzdHJ1Y3R1cmVzIGZvciB3aGljaCB5b3UgbWF5IHJlZ2lzdGVyIGhhbmRsZXJzLgorCitXaW5kb3dzIHVzZXJzIHNob3VsZCB1c2UgdGhlIGV4cGF0X3dpbjMyYmluIHBhY2thZ2UsIHdoaWNoIGluY2x1ZGVzCitib3RoIHByZWNvbXBpbGVkIGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMsIGFuZCBzb3VyY2UgY29kZSBmb3IKK2RldmVsb3BlcnMuCisKK0V4cGF0IGlzIGZyZWUgc29mdHdhcmUuICBZb3UgbWF5IGNvcHksIGRpc3RyaWJ1dGUsIGFuZCBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSBjb250YWluZWQgaW4gdGhlIGZpbGUgQ09QWUlORyBkaXN0cmlidXRlZAord2l0aCB0aGlzIHBhY2thZ2UuICBUaGlzIGxpY2Vuc2UgaXMgdGhlIHNhbWUgYXMgdGhlIE1JVC9YIENvbnNvcnRpdW0KK2xpY2Vuc2UuCisKK1ZlcnNpb25zIG9mIEV4cGF0IHRoYXQgaGF2ZSBhbiBvZGQgbWlub3IgdmVyc2lvbiAodGhlIG1pZGRsZSBudW1iZXIgaW4KK3RoZSByZWxlYXNlIGFib3ZlKSwgYXJlIGRldmVsb3BtZW50IHJlbGVhc2VzIGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZAorYXMgYmV0YSBzb2Z0d2FyZS4gIFJlbGVhc2VzIHdpdGggZXZlbiBtaW5vciB2ZXJzaW9uIG51bWJlcnMgYXJlCitpbnRlbmRlZCB0byBiZSBwcm9kdWN0aW9uIGdyYWRlIHNvZnR3YXJlLgorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIEV4cGF0IGZyb20gYSBjaGVjay1vdXQgZnJvbSB0aGUgQ1ZTIHJlcG9zaXRvcnksCit5b3UgbmVlZCB0byBydW4gYSBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNpbmcgdGhlCitHTlUgYXV0b2NvbmYgYW5kIGxpYnRvb2wgdG9vbHMuICBUbyBkbyB0aGlzLCB5b3UgbmVlZCB0byBoYXZlCithdXRvY29uZiAyLjUyIG9yIG5ld2VyIGFuZCBsaWJ0b29sIDEuNCBvciBuZXdlciAoMS41IG9yIG5ld2VyIHByZWZlcnJlZCkuCitSdW4gdGhlIHNjcmlwdCBsaWtlIHRoaXM6CisKKyAgICAgICAgLi9idWlsZGNvbmYuc2gKKworT25jZSB0aGlzIGhhcyBiZWVuIGRvbmUsIGZvbGxvdyB0aGUgc2FtZSBpbnN0cnVjdGlvbnMgYXMgZm9yIGJ1aWxkaW5nCitmcm9tIGEgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworVG8gYnVpbGQgRXhwYXQgZnJvbSBhIHNvdXJjZSBkaXN0cmlidXRpb24sIHlvdSBmaXJzdCBydW4gdGhlCitjb25maWd1cmF0aW9uIHNoZWxsIHNjcmlwdCBpbiB0aGUgdG9wIGxldmVsIGRpc3RyaWJ1dGlvbiBkaXJlY3Rvcnk6CisKKyAgICAgICAgLi9jb25maWd1cmUKKworVGhlcmUgYXJlIG1hbnkgb3B0aW9ucyB3aGljaCB5b3UgbWF5IHByb3ZpZGUgdG8gY29uZmlndXJlICh3aGljaCB5b3UKK2NhbiBkaXNjb3ZlciBieSBydW5uaW5nIGNvbmZpZ3VyZSB3aXRoIHRoZSAtLWhlbHAgb3B0aW9uKS4gIEJ1dCB0aGUKK29uZSBvZiBtb3N0IGludGVyZXN0IGlzIHRoZSBvbmUgdGhhdCBzZXRzIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorQnkgZGVmYXVsdCwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBzZXQgdGhpbmdzIHVwIHRvIGluc3RhbGwKK2xpYmV4cGF0IGludG8gL3Vzci9sb2NhbC9saWIsIGV4cGF0LmggaW50byAvdXNyL2xvY2FsL2luY2x1ZGUsIGFuZAoreG1sd2YgaW50byAvdXNyL2xvY2FsL2Jpbi4gIElmLCBmb3IgZXhhbXBsZSwgeW91J2QgcHJlZmVyIHRvIGluc3RhbGwKK2ludG8gL2hvbWUvbWUvbXlzdHVmZi9saWIsIC9ob21lL21lL215c3R1ZmYvaW5jbHVkZSwgYW5kCisvaG9tZS9tZS9teXN0dWZmL2JpbiwgeW91IGNhbiB0ZWxsIGNvbmZpZ3VyZSBhYm91dCB0aGF0IHdpdGg6CisKKyAgICAgICAgLi9jb25maWd1cmUgLS1wcmVmaXg9L2hvbWUvbWUvbXlzdHVmZgorICAgICAgICAKK0Fub3RoZXIgaW50ZXJlc3Rpbmcgb3B0aW9uIGlzIHRvIGVuYWJsZSA2NC1iaXQgaW50ZWdlciBzdXBwb3J0IGZvcgorbGluZSBhbmQgY29sdW1uIG51bWJlcnMgYW5kIHRoZSBvdmVyLWFsbCBieXRlIGluZGV4OgorCisgICAgICAgIC4vY29uZmlndXJlIENQUEZMQUdTPS1EWE1MX0xBUkdFX1NJWkUKKyAgICAgICAgCitIb3dldmVyLCBzdWNoIGEgbW9kaWZpY2F0aW9uIHdvdWxkIGJlIGEgYnJlYWtpbmcgY2hhbmdlIHRvIHRoZSBBQkkKK2FuZCBpcyB0aGVyZWZvcmUgbm90IHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZSAtIGUuZy4gYXMgcGFydCBvZgorYSBMaW51eCBkaXN0cmlidXRpb24gLSBidXQgcmF0aGVyIGZvciBidWlsZHMgd2l0aCBzcGVjaWFsIHJlcXVpcmVtZW50cy4KKworQWZ0ZXIgcnVubmluZyB0aGUgY29uZmlndXJlIHNjcmlwdCwgdGhlICJtYWtlIiBjb21tYW5kIHdpbGwgYnVpbGQKK3RoaW5ncyBhbmQgIm1ha2UgaW5zdGFsbCIgd2lsbCBpbnN0YWxsIHRoaW5ncyBpbnRvIHRoZWlyIHByb3BlcgorbG9jYXRpb24uICBIYXZlIGEgbG9vayBhdCB0aGUgIk1ha2VmaWxlIiB0byBsZWFybiBhYm91dCBhZGRpdGlvbmFsCisibWFrZSIgb3B0aW9ucy4gIE5vdGUgdGhhdCB5b3UgbmVlZCB0byBoYXZlIHdyaXRlIHBlcm1pc3Npb24gaW50bwordGhlIGRpcmVjdG9yaWVzIGludG8gd2hpY2ggdGhpbmdzIHdpbGwgYmUgaW5zdGFsbGVkLgorCitJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYnVpbGRpbmcgRXhwYXQgdG8gcHJvdmlkZSBkb2N1bWVudAoraW5mb3JtYXRpb24gaW4gVVRGLTE2IHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IFVURi04LCBmb2xsb3cgdGhlc2UKK2luc3RydWN0aW9ucyAoYWZ0ZXIgaGF2aW5nIHJ1biAibWFrZSBkaXN0Y2xlYW4iKToKKworICAgICAgICAxLiBGb3IgVVRGLTE2IG91dHB1dCBhcyB1bnNpZ25lZCBzaG9ydCAoYW5kIHZlcnNpb24vZXJyb3IKKyAgICAgICAgICAgc3RyaW5ncyBhcyBjaGFyKSwgcnVuOgorCisgICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSBDUFBGTEFHUz0tRFhNTF9VTklDT0RFCisKKyAgICAgICAgICAgRm9yIFVURi0xNiBvdXRwdXQgYXMgd2NoYXJfdCAoaW5jbC4gdmVyc2lvbi9lcnJvciBzdHJpbmdzKSwKKyAgICAgICAgICAgcnVuOgorCisgICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSBDRkxBR1M9Ii1nIC1PMiAtZnNob3J0LXdjaGFyIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFBGTEFHUz0tRFhNTF9VTklDT0RFX1dDSEFSX1QKKworICAgICAgICAyLiBFZGl0IHRoZSBNYWtlRmlsZSwgY2hhbmdpbmc6CisKKyAgICAgICAgICAgICAgIExJQlJBUlkgPSBsaWJleHBhdC5sYQorCisgICAgICAgICAgIHRvOgorCisgICAgICAgICAgICAgICBMSUJSQVJZID0gbGliZXhwYXR3LmxhCisKKyAgICAgICAgICAgKE5vdGUgdGhlIGFkZGl0aW9uYWwgInciIGluIHRoZSBsaWJyYXJ5IG5hbWUuKQorCisgICAgICAgIDMuIFJ1biAibWFrZSBidWlsZGxpYiIgKHdoaWNoIGJ1aWxkcyB0aGUgbGlicmFyeSBvbmx5KS4KKyAgICAgICAgICAgT3IsIHRvIHNhdmUgc3RlcCAyLCBydW4gIm1ha2UgYnVpbGRsaWIgTElCUkFSWT1saWJleHBhdHcubGEiLgorCisgICAgICAgIDQuIFJ1biAibWFrZSBpbnN0YWxsbGliIiAod2hpY2ggaW5zdGFsbHMgdGhlIGxpYnJhcnkgb25seSkuCisgICAgICAgICAgIE9yLCBpZiBzdGVwIDIgd2FzIG9taXR0ZWQsIHJ1biAibWFrZSBpbnN0YWxsbGliIExJQlJBUlk9bGliZXhwYXR3LmxhIi4KKyAgICAgICAgICAgCitVc2luZyBERVNURElSIG9yIElOU1RBTExfUk9PVCBpcyBlbmFibGVkLCB3aXRoIElOU1RBTExfUk9PVCBiZWluZyB0aGUgZGVmYXVsdAordmFsdWUgZm9yIERFU1RESVIsIGFuZCB0aGUgcmVzdCBvZiB0aGUgbWFrZSBmaWxlIHVzaW5nIG9ubHkgREVTVERJUi4KK0l0IHdvcmtzIGFzIGZvbGxvd3M6CisgICAkIG1ha2UgaW5zdGFsbCBERVNURElSPS9wYXRoL3RvL2ltYWdlCitvdmVycmlkZXMgdGhlIGluLW1ha2VmaWxlIHNldCBERVNURElSLCB3aGlsZSBib3RoCisgICAkIElOU1RBTExfUk9PVD0vcGF0aC90by9pbWFnZSBtYWtlIGluc3RhbGwKKyAgICQgbWFrZSBpbnN0YWxsIElOU1RBTExfUk9PVD0vcGF0aC90by9pbWFnZQordXNlIERFU1RESVI9JChJTlNUQUxMX1JPT1QpLCBldmVuIGlmIERFU1RESVIgZXZlbnR1YWxseSBpcyBkZWZpbmVkIGluIHRoZQorZW52aXJvbm1lbnQsIGJlY2F1c2UgdmFyaWFibGUtc2V0dGluZyBwcmlvcml0eSBpcworMSkgY29tbWFuZGxpbmUKKzIpIGluLW1ha2VmaWxlCiszKSBlbnZpcm9ubWVudCAgICAgICAgICAgCisKK05vdGUgZm9yIFNvbGFyaXMgdXNlcnM6ICBUaGUgImFyIiBjb21tYW5kIGlzIHVzdWFsbHkgbG9jYXRlZCBpbgorIi91c3IvY2NzL2JpbiIsIHdoaWNoIGlzIG5vdCBpbiB0aGUgZGVmYXVsdCBQQVRILiAgWW91IHdpbGwgbmVlZCB0bworYWRkIHRoaXMgdG8geW91ciBwYXRoIGZvciB0aGUgIm1ha2UiIGNvbW1hbmQsIGFuZCBwcm9iYWJseSBhbHNvIHN3aXRjaAordG8gR05VIG1ha2UgKHRoZSAibWFrZSIgZm91bmQgaW4gL3Vzci9jY3MvYmluIGRvZXMgbm90IHNlZW0gdG8gd29yaworcHJvcGVybHkgLS0gYXBwZWFyYW50bHkgaXQgZG9lcyBub3QgdW5kZXJzdGFuZCAuUEhPTlkgZGlyZWN0aXZlcykuICBJZgoreW91J3JlIHVzaW5nIGtzaCBvciBiYXNoLCB1c2UgdGhpcyBjb21tYW5kIHRvIGJ1aWxkOgorCisgICAgICAgIFBBVEg9L3Vzci9jY3MvYmluOiRQQVRIIG1ha2UKKworV2hlbiB1c2luZyBFeHBhdCB3aXRoIGEgcHJvamVjdCB1c2luZyBhdXRvY29uZiBmb3IgY29uZmlndXJhdGlvbiwgeW91CitjYW4gdXNlIHRoZSBwcm9iaW5nIG1hY3JvIGluIGNvbmZ0b29scy9leHBhdC5tNCB0byBkZXRlcm1pbmUgaG93IHRvCitpbmNsdWRlIEV4cGF0LiAgU2VlIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mIHRoYXQgZmlsZSBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKK0EgcmVmZXJlbmNlIG1hbnVhbCBpcyBhdmFpbGFibGUgaW4gdGhlIGZpbGUgZG9jL3JlZmVyZW5jZS5odG1sIGluIHRoaXMKK2Rpc3RyaWJ1dGlvbi4KKworVGhlIGhvbWVwYWdlIGZvciB0aGlzIHByb2plY3QgaXMgaHR0cDovL3d3dy5saWJleHBhdC5vcmcvLiAgVGhlcmUKK2FyZSBsaW5rcyB0aGVyZSB0byBjb25uZWN0IHlvdSB0byB0aGUgYnVnIHJlcG9ydHMgcGFnZS4gIElmIHlvdSBuZWVkCit0byByZXBvcnQgYSBidWcgd2hlbiB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gYSBicm93c2VyLCB5b3UgbWF5IGFsc28KK3NlbmQgYSBidWcgcmVwb3J0IGJ5IGVtYWlsIHRvIGV4cGF0LWJ1Z3NAbWFpbC5saWJleHBhdC5vcmcuCisKK0Rpc2N1c3Npb24gcmVsYXRlZCB0byB0aGUgZGlyZWN0aW9uIG9mIGZ1dHVyZSBleHBhdCBkZXZlbG9wbWVudCB0YWtlcworcGxhY2Ugb24gZXhwYXQtZGlzY3Vzc0BtYWlsLmxpYmV4cGF0Lm9yZy4gIEFyY2hpdmVzIG9mIHRoaXMgbGlzdCBhbmQKK290aGVyIEV4cGF0LXJlbGF0ZWQgbGlzdHMgbWF5IGJlIGZvdW5kIGF0OgorCisgICAgICAgIGh0dHA6Ly9tYWlsLmxpYmV4cGF0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvTWFrZWZpbGUgYi9leHBhdC0yLjAuMS9hbWlnYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NDUwZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvTWFrZWZpbGUKQEAgLTAsMCArMSwxODcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFtaWdhT1MKKyMKKworLlBIT05ZOiBoZWxwIGFsbCBzdGF0aWNsaWIgc2hhcmVkbGliIGNoZWNrIGNsZWFuIGluc3RhbGwKKwordnBhdGggJS5jIC4uL2xpYiAuLi9leGFtcGxlcyAuLi94bWx3ZiAuLi90ZXN0cwordnBhdGggJS5oIC4uL2xpYiAuLi90ZXN0cworCisKKyMKKyMgU2V0IHRoZXNlIGZvciBTREsgaW5zdGFsbGF0aW9uLgorIwordG9vbGRpciA9IFNESzpMb2NhbC9DCitzdGF0aWNsaWJkaXIgPSBTREs6TG9jYWwvY2xpYjIvbGliCitzdGF0aWNpbmNsdWRlZGlyID0gU0RLOkxvY2FsL2NsaWIyL2luY2x1ZGUKK3NoYXJlZGxpYmRpciA9IFNESzpMb2NhbC9MaWJzCitzaGFyZWRpbmNsdWRlZGlyID0gU0RLOkxvY2FsL2NvbW1vbi9pbmNsdWRlCisKKworaWZlcSAoJChNQUtFQ01ER09BTFMpLCBzdGF0aWNsaWIpCisgREVTVERJUiA9IGxpYgorZWxzZQorIERFU1RESVIgPSBsaWJzCitlbmRpZgorCitTVEFUSUNMSUIgPSAkKERFU1RESVIpL2xpYmV4cGF0LmEKK1NIQVJFRExJQiA9ICQoREVTVERJUikvZXhwYXQubGlicmFyeQorCitYTUxXRiA9ICQoREVTVERJUikveG1sd2YKK0VMRU1FTlRTID0gJChERVNURElSKS9lbGVtZW50cworT1VUTElORSA9ICQoREVTVERJUikvb3V0bGluZQorUlVOVEVTVFMgPSAkKERFU1RESVIpL3J1bnRlc3RzCitCRU5DSE1BUksgPSAkKERFU1RESVIpL2JlbmNobWFyaworCisKK2hlbHA6CisJQGVjaG8gIlJlcXVpcmVzOiIKKwlAZWNobyAiIEFtaWdhT1MgNC4wIgorCUBlY2hvICIgU0RLIDUxLjIyIgorCUBlY2hvICIgY2xpYjIgMS4yMDIiCisJQGVjaG8gIiIKKwlAZWNobyAiVGFyZ2V0czoiCisJQGVjaG8gIiBhbGwgLSBtYWtlIGV4cGF0IGxpYnJhcmllcywgeG1sd2YsIGV4YW1wbGVzIGFuZCBydW4gdGVzdCBzdWl0ZSIKKwlAZWNobyAiIGluc3RhbGwgLSBpbnN0YWxsIGV4cGF0IGxpYnJhcmllcyBhbmQgdG9vbHMgaW50byBTREsiCisKK2FsbDoKKwktbWFrZWRpciBmb3JjZSBsaWIgbGlicworCSQoTUFLRSkgc3RhdGljbGliCisJJChNQUtFKSBzaGFyZWRsaWIKKworc3RhdGljbGliOiAkKFNUQVRJQ0xJQikgJChYTUxXRikgJChFTEVNRU5UUykgJChPVVRMSU5FKSAkKFJVTlRFU1RTKSAkKEJFTkNITUFSSykgY2hlY2sKKwlAZWNobyBkb25lCisKK3NoYXJlZGxpYjogJChTSEFSRURMSUIpICQoWE1MV0YpICQoRUxFTUVOVFMpICQoT1VUTElORSkgJChSVU5URVNUUykgJChCRU5DSE1BUkspIGNoZWNrCisJQGVjaG8gZG9uZQorCitjaGVjazoKKwkkKFJVTlRFU1RTKQorCitjbGVhbjoKKwktZGVsZXRlIGxpYi8jPy5vIHF1aWV0CisJLWRlbGV0ZSBsaWJzLyM/Lm8gcXVpZXQKKworaW5zdGFsbDoKKwljb3B5IGxpYnMveG1sd2YgJCh0b29sZGlyKSBxdWlldAorCWNvcHkgL2xpYi9leHBhdC5oIC9saWIvZXhwYXRfZXh0ZXJuYWwuaCAkKHN0YXRpY2luY2x1ZGVkaXIpIHF1aWV0CisJY29weSBsaWIvbGliZXhwYXQuYSAkKHN0YXRpY2xpYmRpcikgcXVpZXQKKwljb3B5IGxpYnMvZXhwYXQubGlicmFyeSAkKHNoYXJlZGxpYmRpcikgcXVpZXQKKwljb3B5IGluY2x1ZGUgJChzaGFyZWRpbmNsdWRlZGlyKSBxdWlldCBhbGwKKworCitDQyA9IGdjYworTElCVE9PTCA9IGFyCitTVFJJUCA9IHN0cmlwCisKK0xERkxBR1MgPQorTElCUyA9CitDRkxBR1MgPSAtRE5ERUJVRyAtTzIKK0xURkxBR1MgPSAtY3JzCitTVFJJUEZMQUdTID0gLVIuY29tbWVudAorTEFVTkNIID0KKworaWZlcSAoJChNQUtFQ01ER09BTFMpLCBzdGF0aWNsaWIpCisgQ0ZMQUdTICs9IC1tY3J0PWNsaWIyCisgTERGTEFHUyArPSAtbWNydD1jbGliMgorIExJQlMgKz0gJChTVEFUSUNMSUIpCisgSU5DTFVERVMgPSAtSS4uL2xpYgorZW5kaWYKKworaWZlcSAoJChNQUtFQ01ER09BTFMpLCBzaGFyZWRsaWIpCisgQ0ZMQUdTICs9IC1tY3J0PW5ld2xpYiAtRF9fVVNFX0lOTElORV9fCisgTERGTEFHUyArPSAtbWNydD1uZXdsaWIKKyBJTkNMVURFUyA9IC1JLiAtSWluY2x1ZGUgLUlpbmNsdWRlL2xpYnJhcmllcyAtSS4uL2xpYgorIExBVU5DSCA9ICQoREVTVERJUikvbGF1bmNoLm8KK2VuZGlmCisKKworQ09NUElMRSA9ICQoQ0MpICQoQ0ZMQUdTKSAkKElOQ0xVREVTKSAtYworCitMSU5LID0gJChDQykgJChMREZMQUdTKSAtbyAkQAorCisKKyQoU1RBVElDTElCKTogJChERVNURElSKS94bWxwYXJzZS5vICQoREVTVERJUikveG1sdG9rLm8gJChERVNURElSKS94bWxyb2xlLm8KKwkkKExJQlRPT0wpICQoTFRGTEFHUykgJEAgJF4KKworJChERVNURElSKS94bWxwYXJzZS5vOiB4bWxwYXJzZS5jIGV4cGF0LmggeG1scm9sZS5oIHhtbHRvay5oIFwKKwlleHBhdF9leHRlcm5hbC5oIGludGVybmFsLmggYW1pZ2Fjb25maWcuaAorCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChERVNURElSKS94bWxyb2xlLm86IHhtbHJvbGUuYyBhc2NpaS5oIHhtbHJvbGUuaCBleHBhdF9leHRlcm5hbC5oIFwKKwlpbnRlcm5hbC5oIGFtaWdhY29uZmlnLmgKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKyQoREVTVERJUikveG1sdG9rLm86IHhtbHRvay5jIHhtbHRva19pbXBsLmMgeG1sdG9rX25zLmMgYXNjaWkuaCBhc2NpaXRhYi5oIFwKKwlpYXNjaWl0YWIuaCBsYXRpbjF0YWIuaCBuYW1ldGFiLmggdXRmOHRhYi5oIHhtbHRvay5oIHhtbHRva19pbXBsLmggXAorCWV4cGF0X2V4dGVybmFsLmggaW50ZXJuYWwuaCBhbWlnYWNvbmZpZy5oCisJJChDT01QSUxFKSAkPCAtbyAkQAorCisKKyQoU0hBUkVETElCKTogJChERVNURElSKS9leHBhdF9saWIubyAkKERFU1RESVIpL2V4cGF0X3ZlY3RvcnMubyAkKERFU1RESVIpL3N0ZGxpYi5vIGxpYi9saWJleHBhdC5hCisJJChMSU5LKSAtbm9zdGFydGZpbGVzIC1ub3N0ZGxpYiAtbyAkQCAkXgorCiskKERFU1RESVIpL2V4cGF0X2xpYi5vOiBleHBhdF9saWIuYworCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChERVNURElSKS9leHBhdF92ZWN0b3JzLm86IGV4cGF0X3ZlY3RvcnMuYworCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChERVNURElSKS9zdGRsaWIubzogc3RkbGliLmMKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKyQoTEFVTkNIKTogbGF1bmNoLmMKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKworJChYTUxXRik6ICQoREVTVERJUikveG1sd2YubyAkKERFU1RESVIpL3htbGZpbGUubyAkKERFU1RESVIpL2NvZGVwYWdlLm8gJChERVNURElSKS9yZWFkZmlsZW1hcC5vICQoTEFVTkNIKQorCSQoTElOSykgJF4gJChMSUJTKQorCSQoU1RSSVApICQoU1RSSVBGTEFHUykgJEAKKworJChERVNURElSKS94bWx3Zi5vOiB4bWx3Zi5jCisJJChDT01QSUxFKSAkPCAtbyAkQAorCiskKERFU1RESVIpL3htbGZpbGUubzogeG1sZmlsZS5jCisJJChDT01QSUxFKSAkPCAtbyAkQAorCiskKERFU1RESVIpL2NvZGVwYWdlLm86IGNvZGVwYWdlLmMKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKyQoREVTVERJUikvcmVhZGZpbGVtYXAubzogcmVhZGZpbGVtYXAuYworCSQoQ09NUElMRSkgJDwgLW8gJEAKKworCiskKEVMRU1FTlRTKTogJChERVNURElSKS9lbGVtZW50cy5vICQoTEFVTkNIKQorCSQoTElOSykgJF4gJChMSUJTKQorCSQoU1RSSVApICQoU1RSSVBGTEFHUykgJEAKKworJChERVNURElSKS9lbGVtZW50cy5vOiBlbGVtZW50cy5jCisJJChDT01QSUxFKSAkPCAtbyAkQAorCisKKyQoT1VUTElORSk6ICQoREVTVERJUikvb3V0bGluZS5vICQoTEFVTkNIKQorCSQoTElOSykgJF4gJChMSUJTKQorCSQoU1RSSVApICQoU1RSSVBGTEFHUykgJEAKKworJChERVNURElSKS9vdXRsaW5lLm86IG91dGxpbmUuYworCSQoQ09NUElMRSkgJDwgLW8gJEAKKworCiskKFJVTlRFU1RTKTogJChERVNURElSKS9ydW50ZXN0cy5vICQoREVTVERJUikvY2hhcmRhdGEubyAkKERFU1RESVIpL21pbmljaGVjay5vICQoTEFVTkNIKQorCSQoTElOSykgJF4gJChMSUJTKQorCiskKERFU1RESVIpL2NoYXJkYXRhLm86IGNoYXJkYXRhLmMgY2hhcmRhdGEuaAorCSQoQ09NUElMRSkgJDwgLW8gJEAKKworJChERVNURElSKS9taW5pY2hlY2subzogbWluaWNoZWNrLmMgbWluaWNoZWNrLmgKKwkkKENPTVBJTEUpICQ8IC1vICRACisKKyQoREVTVERJUikvcnVudGVzdHMubzogcnVudGVzdHMuYyBjaGFyZGF0YS5oCisJJChDT01QSUxFKSAkPCAtbyAkQAorCisKKyQoQkVOQ0hNQVJLKTogJChERVNURElSKS9iZW5jaG1hcmsubyAkKExBVU5DSCkKKwkkKExJTkspICReICQoTElCUykgLWxtCisKKyQoREVTVERJUikvYmVuY2htYXJrLm86IGJlbmNobWFyay9iZW5jaG1hcmsuYworCSQoQ09NUElMRSkgJDwgLW8gJEAKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL1JFQURNRS50eHQgYi9leHBhdC0yLjAuMS9hbWlnYS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0OTUxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9hbWlnYS9SRUFETUUudHh0CkBAIC0wLDAgKzEsNjYgQEAKK1NVTU1BUlkKKz09PT09PT0KK1RoaXMgaXMgYSBwb3J0IG9mIGV4cGF0IGZvciBBbWlnYU9TIDQuMCB3aGljaCBpbmNsdWRlcyB0aGUKK1NESywgc29tZSBYTUwgdG9vbHMgYW5kIHRoZSBsaWJyYXJpZXMuCisKK0JvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyeSB2ZXJzaW9ucyBhcmUgc3VwcG9ydGVkLgorCitUaGUgc3RhdGljIGxpYnJhcnkgdmVyc2lvbiBpcyBsaW1pdGVkIHRvIGNsaWIyIGFsdGhvdWdoIGl0IHNob3VsZAorYmUgcG9zc2libGUgdG8gdXNlIG5ld2xpYiB3aXRoIHRoZSBhcHBvcHJpYXRlIGNvbXBpbGUgb3B0aW9ucy4KKworVGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gaXMgYmFzZWQgb24gdGhlIHdvcmsgb2YgRnJlZHJpayBXaWtzdHJvbQorYW5kIGlzIGN1cnJlbnRseSBsaW1pdGVkIHRvIFBQQyBvbmx5LgorCisKK0hJU1RPUlkKKz09PT09PT0KKzQuMiAgLSB1cGRhdGVkIHRvIGNvcnJlc3BvbmQgdG8gRXhwYXQgMi4wLjEgcmVsZWFzZQorICAgICAtIGJ1bXBlZCBjb3B5cmlnaHQgYmFubmVycyBhbmQgdmVyc2lvbnMKKyAgICAgLSBzaW1wbGlmaWVkIGFtaWdhY29uZmlnLmgKKyAgICAgLSB1cGRhdGVkIGluY2x1ZGUvbGlicmFyaWVzL2V4cGF0LmggZmlsZQorICAgICAtIG1vZGlmaWVkIGxhdW5jaC5jIHRvIHVzZSBjb250cnVjdG9yL2RlY29uc3RydWN0b3IKKyAgICAgLSByZW1vdmVkIG5lZWQgZm9yIGFtaWdhX21haW4oKSBmcm9tIGV4cGF0IHV0aWxpdGllcworCis0LjEgIC0gZml4ZWQgbWVtb3J5IGZyZWVpbmcgYnVnIGluIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24KKyAgICAgLSBub3cgYWxsb2NhdGVzIHNoYXJlZCBtZW1vcnkKKworNC4wICAtIHVwZGF0ZWQgZm9yIGNvcnJlc3BvbmRpbmcgRXhwYXQgMi4wIHJlbGVhc2UKKyAgICAgLSBzb21lIG1pbm9yIENWUyByZWxhdGVkIGNoYW5nZXMKKworMy4xICAtIHJlbW92ZWQgb2Jzb2xldGUgc2ZkIGZpbGUKKyAgICAgLSBhZGRlZCBsaWJyYXJ5IGRlc2NyaXB0aW9uIHhtbCBmaWxlCisgICAgIC0gcmVmYWN0b3JlZCBNYWtlZmlsZQorICAgICAtIHJlbW92ZWQgZXh0cmFuZW91cyBWQVJBUkdTNjhLIGtleXdvcmRzCisgICAgIC0gcmV3b3JrZWQgZGVmYXVsdCBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zIGluIHNoYXJlZCBsaWIKKyAgICAgLSB1cGRhdGVkIGFtaWdhY29uZmlnLmgKKworMy4wICAtIGluaXRpYWwgcmVsZWFzZQorICAgICAtIGJhc2VkIG9uIGV4cGF0IDEuOTUuOAorCisKK0JVSUxESU5HCis9PT09PT09PQorVG8gYnVpbGQgZXhwYXQubGlicmFyeSwgeG1sd2YgdG9vbCwgZXhhbXBsZXMgYW5kIHJ1biB0aGUgdGVzdCBzdWl0ZSwKK3NpbXBseSB0eXBlICdtYWtlIGFsbCcgaW4gdGhlIGFtaWdhIHN1YmRpcmVjdG9yeS4KKworVGhlIHRlc3Qgc3VpdGUgd2lsbCBjb21waWxlIGFuZCBydW4gZm9yIGJvdGggdGhlIHN0YXRpYyBhbmQgc2hhcmVkCitsaWJyYXJ5IHZlcnNpb25zLgorCisKK0lOU1RBTExBVElPTgorPT09PT09PT09PT09CitUbyBpbnN0YWxsIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgdmVyc2lvbnMgb2YgZXhwYXQgaW50byB0aGUKK0FtaWdhT1MgU0RLIHR5cGUgJ21ha2UgaW5zdGFsbCcgaW4gdGhlIGFtaWdhIHN1YmRpcmVjdG9yeS4KKworCitDT05GSUdVUkFUSU9OCis9PT09PT09PT09PT09CitZb3UgbWF5IHdhbnQgdG8gZWRpdCB0aGUgbGliL2FtaWdhY29uZmlnLmggZmlsZSB0byByZW1vdmUKK0RURCBhbmQvb3IgWE1MIG5hbWVzcGFjZSBzdXBwb3J0IGlmIHRoZXkgYXJlIG5vdCByZXF1aXJlZCBieSB5b3VyCitzcGVjaWZpYyBhcHBsaWNhdGlvbiBmb3IgYSBzbWFsbGVyIGFuZCBmYXN0ZXIgaW1wbGVtZW50YXRpb24uCisKKworVE8gRE8KKz09PT09CistIHdpZGUgY2hhcmFjdGVyIHN1cHBvcnQgKFVURi0xNikKKy0gcHJvdmlkZSA2OGsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL2V4cGF0LnhtbCBiL2V4cGF0LTIuMC4xL2FtaWdhL2V4cGF0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmFlYWUyCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvZXhwYXQueG1sCkBAIC0wLDAgKzEsMjY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Cis8IURPQ1RZUEUgbGlicmFyeSBTWVNURU0gImxpYnJhcnkuZHRkIj4KKzwhLS0gYXV0b2dlbmVyYXRlZCBieSBmZHRyYW5zIHY1MS4xNiAtLT4KKzxsaWJyYXJ5IG5hbWU9ImV4cGF0IiBiYXNlbmFtZT0iRXhwYXRCYXNlIiBiYXNldHlwZT0iTGlicmFyeSIgb3Blbm5hbWU9ImV4cGF0LmxpYnJhcnkiPgorCTxpbmNsdWRlPmxpYnJhcmllcy9leHBhdC5oPC9pbmNsdWRlPgorCTxpbnRlcmZhY2UgbmFtZT0ibWFpbiIgdmVyc2lvbj0iMS4wIiBzdHJ1Y3Q9IkV4cGF0SUZhY2UiIHByZWZpeD0iX0V4cGF0XyIgYXNtcHJlZml4PSJJRXhwYXQiIGdsb2JhbD0iSUV4cGF0Ij4KKwkJPG1ldGhvZCBuYW1lPSJPYnRhaW4iIHJlc3VsdD0idWludDMyIi8+CisJCTxtZXRob2QgbmFtZT0iUmVsZWFzZSIgcmVzdWx0PSJ1aW50MzIiLz4KKwkJPG1ldGhvZCBuYW1lPSJFeHB1bmdlIiByZXN1bHQ9InZvaWQiIHN0YXR1cz0idW5pbXBsZW1lbnRlZCIvPgorCQk8bWV0aG9kIG5hbWU9IkNsb25lIiByZXN1bHQ9InN0cnVjdCBJbnRlcmZhY2UgKiIgc3RhdHVzPSJ1bmltcGxlbWVudGVkIi8+CisJCTxtZXRob2QgbmFtZT0iWE1MX1BhcnNlckNyZWF0ZSIgcmVzdWx0PSJYTUxfUGFyc2VyIj4KKwkJCTxhcmcgbmFtZT0iZW5jb2RpbmdOYW1lIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9QYXJzZXJDcmVhdGVOUyIgcmVzdWx0PSJYTUxfUGFyc2VyIj4KKwkJCTxhcmcgbmFtZT0iZW5jb2RpbmdOYW1lIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCQk8YXJnIG5hbWU9Im5zU2VwIiB0eXBlPSJYTUxfQ2hhciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfUGFyc2VyQ3JlYXRlX01NIiByZXN1bHQ9IlhNTF9QYXJzZXIiPgorCQkJPGFyZyBuYW1lPSJlbmNvZGluZyIgdHlwZT0iY29uc3QgWE1MX0NoYXIgKiIvPgorCQkJPGFyZyBuYW1lPSJtZW1zdWl0ZSIgdHlwZT0iY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqIi8+CisJCQk8YXJnIG5hbWU9Im5hbWVzcGFjZVNlcGFyYXRvciIgdHlwZT0iY29uc3QgWE1MX0NoYXIgKiIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiIHJlc3VsdD0iWE1MX1BhcnNlciI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJjb250ZXh0IiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCQk8YXJnIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9QYXJzZXJGcmVlIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1BhcnNlIiByZXN1bHQ9ImVudW0gWE1MX1N0YXR1cyI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJzIiB0eXBlPSJjb25zdCBjaGFyICoiLz4KKwkJCTxhcmcgbmFtZT0ibGVuIiB0eXBlPSJpbnQiLz4KKwkJCTxhcmcgbmFtZT0iaXNGaW5hbCIgdHlwZT0iaW50Ii8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9QYXJzZUJ1ZmZlciIgcmVzdWx0PSJlbnVtIFhNTF9TdGF0dXMiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ibGVuIiB0eXBlPSJpbnQiLz4KKwkJCTxhcmcgbmFtZT0iaXNGaW5hbCIgdHlwZT0iaW50Ii8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRCdWZmZXIiIHJlc3VsdD0idm9pZCAqIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImxlbiIgdHlwZT0iaW50Ii8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic3RhcnQiIHR5cGU9IlhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRFbmRFbGVtZW50SGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImVuZCIgdHlwZT0iWE1MX0VuZEVsZW1lbnRIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRFbGVtZW50SGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InN0YXJ0IiB0eXBlPSJYTUxfU3RhcnRFbGVtZW50SGFuZGxlciIvPgorCQkJPGFyZyBuYW1lPSJlbmQiIHR5cGU9IlhNTF9FbmRFbGVtZW50SGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0Q29tbWVudEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfQ29tbWVudEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InN0YXJ0IiB0eXBlPSJYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iZW5kIiB0eXBlPSJYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InN0YXJ0IiB0eXBlPSJYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIi8+CisJCQk8YXJnIG5hbWU9ImVuZCIgdHlwZT0iWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldERlZmF1bHRIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iaGFuZGxlciIgdHlwZT0iWE1MX0RlZmF1bHRIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9EZWZhdWx0SGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iaGFuZGxlciIgdHlwZT0iWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iYXJnIiB0eXBlPSJ2b2lkICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlciIvPgorCQkJPGFyZyBuYW1lPSJkYXRhIiB0eXBlPSJ2b2lkICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJzdGFydCIgdHlwZT0iWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iZW5kIiB0eXBlPSJYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic3RhcnQiIHR5cGU9IlhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIi8+CisJCQk8YXJnIG5hbWU9ImVuZCIgdHlwZT0iWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRYbWxEZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImhhbmRsZXIiIHR5cGU9IlhNTF9YbWxEZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJzdGFydCIgdHlwZT0iWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJlbmQiIHR5cGU9IlhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InN0YXJ0IiB0eXBlPSJYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIiLz4KKwkJCTxhcmcgbmFtZT0iZW5kIiB0eXBlPSJYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJlbGRlY2wiIHR5cGU9IlhNTF9FbGVtZW50RGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlciIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImF0dGRlY2wiIHR5cGU9IlhNTF9BdHRsaXN0RGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVudGl0eURlY2xIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iaGFuZGxlciIgdHlwZT0iWE1MX0VudGl0eURlY2xIYW5kbGVyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0iaGFuZGxlciIgdHlwZT0iWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfTm90YXRpb25EZWNsSGFuZGxlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldEVycm9yQ29kZSIgcmVzdWx0PSJlbnVtIFhNTF9FcnJvciI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfRXJyb3JTdHJpbmciIHJlc3VsdD0iY29uc3QgWE1MX0xDaGFyICoiPgorCQkJPGFyZyBuYW1lPSJjb2RlIiB0eXBlPSJlbnVtIFhNTF9FcnJvciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfR2V0Q3VycmVudEJ5dGVJbmRleCIgcmVzdWx0PSJsb25nIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRDdXJyZW50TGluZU51bWJlciIgcmVzdWx0PSJpbnQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIiIHJlc3VsdD0iaW50Ij4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50IiByZXN1bHQ9ImludCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfR2V0SW5wdXRDb250ZXh0IiByZXN1bHQ9ImNvbnN0IGNoYXIgKiI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCAqIi8+CisJCQk8YXJnIG5hbWU9InNpemUiIHR5cGU9ImludCAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRVc2VyRGF0YSIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9InVzZXJEYXRhIiB0eXBlPSJ2b2lkICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0RlZmF1bHRDdXJyZW50IiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TZXRCYXNlIiByZXN1bHQ9ImVudW0gWE1MX1N0YXR1cyI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJiYXNlIiB0eXBlPSJjb25zdCBYTUxfQ2hhciAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRCYXNlIiByZXN1bHQ9ImNvbnN0IFhNTF9DaGFyICoiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50IiByZXN1bHQ9ImludCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCIgcmVzdWx0PSJpbnQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldEVuY29kaW5nIiByZXN1bHQ9ImVudW0gWE1MX1N0YXR1cyI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJlbmNvZGluZyIgdHlwZT0iY29uc3QgWE1MX0NoYXIgKiIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIiByZXN1bHQ9ImludCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJwYXJzaW5nIiB0eXBlPSJlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmciLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1NldFJldHVybk5TVHJpcGxldCIgcmVzdWx0PSJ2b2lkIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCQk8YXJnIG5hbWU9ImRvX25zdCIgdHlwZT0iaW50Ii8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9FeHBhdFZlcnNpb24iIHJlc3VsdD0iY29uc3QgWE1MX0xDaGFyICoiPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfRXhwYXRWZXJzaW9uSW5mbyIgcmVzdWx0PSJYTUxfRXhwYXRfVmVyc2lvbiI+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9QYXJzZXJSZXNldCIgcmVzdWx0PSJYTUxfQm9vbCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJlbmNvZGluZyIgdHlwZT0iY29uc3QgWE1MX0NoYXIgKiIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJoYW5kbGVyIiB0eXBlPSJYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX1VzZUZvcmVpZ25EVEQiIHJlc3VsdD0iZW51bSBYTUxfRXJyb3IiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0idXNlRFREIiB0eXBlPSJYTUxfQm9vbCIvPgorCQk8L21ldGhvZD4KKwkJPG1ldGhvZCBuYW1lPSJYTUxfR2V0RmVhdHVyZUxpc3QiIHJlc3VsdD0iY29uc3QgWE1MX0ZlYXR1cmUgKiI+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9TdG9wUGFyc2VyIiByZXN1bHQ9ImVudW0gWE1MX1N0YXR1cyI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJyZXN1bWFibGUiIHR5cGU9IlhNTF9Cb29sIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9SZXN1bWVQYXJzZXIiIHJlc3VsdD0iZW51bSBYTUxfU3RhdHVzIj4KKwkJCTxhcmcgbmFtZT0icGFyc2VyIiB0eXBlPSJYTUxfUGFyc2VyIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9HZXRQYXJzaW5nU3RhdHVzIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic3RhdHVzIiB0eXBlPSJYTUxfUGFyc2luZ1N0YXR1cyAqIi8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9GcmVlQ29udGVudE1vZGVsIiByZXN1bHQ9InZvaWQiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ibW9kZWwiIHR5cGU9IlhNTF9Db250ZW50ICoiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX01lbU1hbGxvYyIgcmVzdWx0PSJ2b2lkICoiPgorCQkJPGFyZyBuYW1lPSJwYXJzZXIiIHR5cGU9IlhNTF9QYXJzZXIiLz4KKwkJCTxhcmcgbmFtZT0ic2l6ZSIgdHlwZT0ic2l6ZV90Ii8+CisJCTwvbWV0aG9kPgorCQk8bWV0aG9kIG5hbWU9IlhNTF9NZW1SZWFsbG9jIiByZXN1bHQ9InZvaWQgKiI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJwdHIiIHR5cGU9InZvaWQgKiIvPgorCQkJPGFyZyBuYW1lPSJzaXplIiB0eXBlPSJzaXplX3QiLz4KKwkJPC9tZXRob2Q+CisJCTxtZXRob2QgbmFtZT0iWE1MX01lbUZyZWUiIHJlc3VsdD0idm9pZCI+CisJCQk8YXJnIG5hbWU9InBhcnNlciIgdHlwZT0iWE1MX1BhcnNlciIvPgorCQkJPGFyZyBuYW1lPSJwdHIiIHR5cGU9InZvaWQgKiIvPgorCQk8L21ldGhvZD4KKwk8L2ludGVyZmFjZT4KKzwvbGlicmFyeT4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL2V4cGF0X2xpYi5jIGIvZXhwYXQtMi4wLjEvYW1pZ2EvZXhwYXRfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDM5YzQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL2V4cGF0X2xpYi5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgRXhwYXQgbWFpbnRhaW5lcnMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisqKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKiAKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyoqIAorKiogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2luY2x1ZGUgPGRvcy9kb3MuaD4KKyNpbmNsdWRlIDxwcm90by9leGVjLmg+CisKKyNkZWZpbmUgTElCTkFNRQkJImV4cGF0LmxpYnJhcnkiCisjZGVmaW5lIExJQlBSSQkJMAorI2RlZmluZSBWRVJTSU9OCQk0CisjZGVmaW5lIFJFVklTSU9OCTIKKyNkZWZpbmUgVlNUUklORwkJImV4cGF0LmxpYnJhcnkgNC4yICgyLjYuMjAwNykiICAvKiBkZC5tbS55eXl5ICovCisKKworc3RhdGljIGNvbnN0IGNoYXIqIF9fYXR0cmlidXRlX18oKHVzZWQpKSB2ZXJzdGFnID0gIlwwJFZFUjogIiBWU1RSSU5HOworCisKK3N0cnVjdCBFeHBhdEJhc2UgeworCXN0cnVjdCBMaWJyYXJ5IGxpYk5vZGU7CisJdWludDE2IHBhZDsKKwlCUFRSIFNlZ0xpc3Q7Cit9OworCisKK3N0cnVjdCBFeHBhdEJhc2UgKiBsaWJJbml0KHN0cnVjdCBFeHBhdEJhc2UgKmxpYkJhc2UsIEJQVFIgc2VnbGlzdCwgc3RydWN0IEV4ZWNJRmFjZSAqSVN5cyk7Cit1aW50MzIgbGliT2J0YWluIChzdHJ1Y3QgTGlicmFyeU1hbmFnZXJJbnRlcmZhY2UgKlNlbGYpOwordWludDMyIGxpYlJlbGVhc2UgKHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZik7CitzdHJ1Y3QgRXhwYXRCYXNlICpsaWJPcGVuIChzdHJ1Y3QgTGlicmFyeU1hbmFnZXJJbnRlcmZhY2UgKlNlbGYsIHVpbnQzMiB2ZXJzaW9uKTsKK0JQVFIgbGliQ2xvc2UgKHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZik7CitCUFRSIGxpYkV4cHVuZ2UgKHN0cnVjdCBMaWJyYXJ5TWFuYWdlckludGVyZmFjZSAqU2VsZik7CisKKworc3RhdGljIEFQVFIgbGliX21hbmFnZXJfdmVjdG9yc1tdID0geworCWxpYk9idGFpbiwKKwlsaWJSZWxlYXNlLAorCU5VTEwsCisJTlVMTCwKKwlsaWJPcGVuLAorCWxpYkNsb3NlLAorCWxpYkV4cHVuZ2UsCisJTlVMTCwKKwkoQVBUUiktMSwKK307CisKKworc3RhdGljIHN0cnVjdCBUYWdJdGVtIGxpYl9tYW5hZ2VyVGFnc1tdID0geworCXsgTUlUX05hbWUsICh1aW50MzIpIl9fbGlicmFyeSIgfSwKKwl7IE1JVF9WZWN0b3JUYWJsZSwgKHVpbnQzMilsaWJfbWFuYWdlcl92ZWN0b3JzIH0sCisJeyBNSVRfVmVyc2lvbiwgMSB9LAorCXsgVEFHX0VORCwgMCB9Cit9OworCisKK2V4dGVybiB2b2lkICptYWluX3ZlY3RvcnNbXTsKKworc3RhdGljIHN0cnVjdCBUYWdJdGVtIGxpYl9tYWluVGFnc1tdID0geworCXsgTUlUX05hbWUsICh1aW50MzIpIm1haW4iIH0sCisJeyBNSVRfVmVjdG9yVGFibGUsICh1aW50MzIpbWFpbl92ZWN0b3JzIH0sCisJeyBNSVRfVmVyc2lvbiwgMSB9LAorCXsgVEFHX0VORCwgMCB9Cit9OworCisKK3N0YXRpYyBBUFRSIGxpYkludGVyZmFjZXNbXSA9IHsKKwlsaWJfbWFuYWdlclRhZ3MsCisJbGliX21haW5UYWdzLAorCU5VTEwKK307CisKKworc3RhdGljIHN0cnVjdCBUYWdJdGVtIGxpYkNyZWF0ZVRhZ3NbXSA9IHsKKwl7IENMVF9EYXRhU2l6ZSwgc2l6ZW9mKHN0cnVjdCBFeHBhdEJhc2UpIH0sCisJeyBDTFRfSW5pdEZ1bmMsICh1aW50MzIpbGliSW5pdCB9LAorCXsgQ0xUX0ludGVyZmFjZXMsICh1aW50MzIpbGliSW50ZXJmYWNlcyB9LAorCXsgVEFHX0VORCwgMCB9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgUmVzaWRlbnQgX19hdHRyaWJ1dGVfXygodXNlZCkpIGxpYl9yZXMgPSB7CisJUlRDX01BVENIV09SRCwJLy8gcnRfTWF0Y2hXb3JkCisJJmxpYl9yZXMsCQkvLyBydF9NYXRjaFRhZworCSZsaWJfcmVzKzEsCQkvLyBydF9FbmRTa2lwCisJUlRGX05BVElWRSB8IFJURl9BVVRPSU5JVCwJLy8gcnRfRmxhZ3MKKwlWRVJTSU9OLAkJLy8gcnRfVmVyc2lvbgorCU5UX0xJQlJBUlksCQkvLyBydF9UeXBlCisJTElCUFJJLAkJCS8vIHJ0X1ByaQorCUxJQk5BTUUsCQkvLyBydF9OYW1lCisJVlNUUklORywJCS8vIHJ0X0lkU3RyaW5nCisJbGliQ3JlYXRlVGFncwkvLyBydF9Jbml0Cit9OworCisKK3N0cnVjdCBMaWJyYXJ5ICpET1NMaWIgPSAwOworc3RydWN0IExpYnJhcnkgKlV0aWxpdHlCYXNlID0gMDsKKworc3RydWN0IEV4ZWNJRmFjZSAqSUV4ZWMgPSAwOworc3RydWN0IERPU0lGYWNlICpJRE9TID0gMDsKK3N0cnVjdCBVdGlsaXR5SUZhY2UgKklVdGlsaXR5ID0gMDsKKworCit2b2lkIF9zdGFydCgpCit7Cit9CisKKworc3RydWN0IEV4cGF0QmFzZSAqbGliSW5pdChzdHJ1Y3QgRXhwYXRCYXNlICpsaWJCYXNlLCBCUFRSIHNlZ2xpc3QsIHN0cnVjdCBFeGVjSUZhY2UgKklTeXMpCit7CisJbGliQmFzZS0+bGliTm9kZS5saWJfTm9kZS5sbl9UeXBlID0gTlRfTElCUkFSWTsKKwlsaWJCYXNlLT5saWJOb2RlLmxpYl9Ob2RlLmxuX1ByaSA9IExJQlBSSTsKKwlsaWJCYXNlLT5saWJOb2RlLmxpYl9Ob2RlLmxuX05hbWUgPSBMSUJOQU1FOworCWxpYkJhc2UtPmxpYk5vZGUubGliX0ZsYWdzID0gTElCRl9TVU1VU0VEfExJQkZfQ0hBTkdFRDsKKwlsaWJCYXNlLT5saWJOb2RlLmxpYl9WZXJzaW9uID0gVkVSU0lPTjsKKwlsaWJCYXNlLT5saWJOb2RlLmxpYl9SZXZpc2lvbiA9IFJFVklTSU9OOworCWxpYkJhc2UtPmxpYk5vZGUubGliX0lkU3RyaW5nID0gVlNUUklORzsKKwlsaWJCYXNlLT5TZWdMaXN0ID0gc2VnbGlzdDsKKworCUlFeGVjID0gSVN5czsKKworCURPU0xpYiA9IE9wZW5MaWJyYXJ5KCJkb3MubGlicmFyeSIsIDUxKTsKKwlpZiAoIERPU0xpYiAhPSAwICkgIHsKKwkJSURPUyA9IChzdHJ1Y3QgRE9TSUZhY2UgKilHZXRJbnRlcmZhY2UoRE9TTGliLCAibWFpbiIsIDEsIE5VTEwpOworCQlpZiAoIElET1MgIT0gMCApICB7CisJCQlVdGlsaXR5QmFzZSA9IE9wZW5MaWJyYXJ5KCJ1dGlsaXR5LmxpYnJhcnkiLCA1MSk7CisJCQlpZiAoIFV0aWxpdHlCYXNlICE9IDAgKSAgeworCQkJCUlVdGlsaXR5ID0gKHN0cnVjdCBVdGlsaXR5SUZhY2UqKUdldEludGVyZmFjZShVdGlsaXR5QmFzZSwgIm1haW4iLCAxLCBOVUxMKTsKKwkJCQlpZiAoIElVdGlsaXR5ICE9IDAgKSAgeworCQkJCQlyZXR1cm4gbGliQmFzZTsKKwkJCQl9CisKKwkJCQlDbG9zZUxpYnJhcnkoVXRpbGl0eUJhc2UpOworCQkJfQorCisJCQlEcm9wSW50ZXJmYWNlKChzdHJ1Y3QgSW50ZXJmYWNlICopSURPUyk7CisJCX0KKworCQlDbG9zZUxpYnJhcnkoRE9TTGliKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCit1aW50MzIgbGliT2J0YWluKCBzdHJ1Y3QgTGlicmFyeU1hbmFnZXJJbnRlcmZhY2UgKlNlbGYgKQoreworCSsrU2VsZi0+RGF0YS5SZWZDb3VudDsKKwlyZXR1cm4gU2VsZi0+RGF0YS5SZWZDb3VudDsKK30KKworCit1aW50MzIgbGliUmVsZWFzZSggc3RydWN0IExpYnJhcnlNYW5hZ2VySW50ZXJmYWNlICpTZWxmICkKK3sKKwktLVNlbGYtPkRhdGEuUmVmQ291bnQ7CisJcmV0dXJuIFNlbGYtPkRhdGEuUmVmQ291bnQ7Cit9CisKKworc3RydWN0IEV4cGF0QmFzZSAqbGliT3Blbiggc3RydWN0IExpYnJhcnlNYW5hZ2VySW50ZXJmYWNlICpTZWxmLCB1aW50MzIgdmVyc2lvbiApCit7CisJc3RydWN0IEV4cGF0QmFzZSAqbGliQmFzZTsKKworCWxpYkJhc2UgPSAoc3RydWN0IEV4cGF0QmFzZSAqKVNlbGYtPkRhdGEuTGliQmFzZTsKKworCSsrbGliQmFzZS0+bGliTm9kZS5saWJfT3BlbkNudDsKKwlsaWJCYXNlLT5saWJOb2RlLmxpYl9GbGFncyAmPSB+TElCRl9ERUxFWFA7CisKKwlyZXR1cm4gbGliQmFzZTsKK30KKworCitCUFRSIGxpYkNsb3NlKCBzdHJ1Y3QgTGlicmFyeU1hbmFnZXJJbnRlcmZhY2UgKlNlbGYgKQoreworCXN0cnVjdCBFeHBhdEJhc2UgKmxpYkJhc2U7CisKKwlsaWJCYXNlID0gKHN0cnVjdCBFeHBhdEJhc2UgKilTZWxmLT5EYXRhLkxpYkJhc2U7CisKKwktLWxpYkJhc2UtPmxpYk5vZGUubGliX09wZW5DbnQ7CisJaWYgKCBsaWJCYXNlLT5saWJOb2RlLmxpYl9PcGVuQ250ICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIGxpYkJhc2UtPmxpYk5vZGUubGliX0ZsYWdzICYgTElCRl9ERUxFWFAgKSB7CisJCXJldHVybiAoQlBUUilTZWxmLT5MaWJFeHB1bmdlKCk7CisJfQorCWVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworQlBUUiBsaWJFeHB1bmdlKCBzdHJ1Y3QgTGlicmFyeU1hbmFnZXJJbnRlcmZhY2UgKlNlbGYgKQoreworCXN0cnVjdCBFeHBhdEJhc2UgKmxpYkJhc2U7CisJQlBUUiByZXN1bHQgPSAwOworCisJbGliQmFzZSA9IChzdHJ1Y3QgRXhwYXRCYXNlICopU2VsZi0+RGF0YS5MaWJCYXNlOworCisJaWYgKGxpYkJhc2UtPmxpYk5vZGUubGliX09wZW5DbnQgPT0gMCkgeworCQlSZW1vdmUoJmxpYkJhc2UtPmxpYk5vZGUubGliX05vZGUpOworCisJCXJlc3VsdCA9IGxpYkJhc2UtPlNlZ0xpc3Q7CisKKwkJRHJvcEludGVyZmFjZSgoc3RydWN0IEludGVyZmFjZSAqKUlVdGlsaXR5KTsKKwkJQ2xvc2VMaWJyYXJ5KFV0aWxpdHlCYXNlKTsKKwkJRHJvcEludGVyZmFjZSgoc3RydWN0IEludGVyZmFjZSAqKUlET1MpOworCQlDbG9zZUxpYnJhcnkoRE9TTGliKTsKKworCQlEZWxldGVMaWJyYXJ5KCZsaWJCYXNlLT5saWJOb2RlKTsKKwl9CisJZWxzZSB7CisJCWxpYkJhc2UtPmxpYk5vZGUubGliX0ZsYWdzIHw9IExJQkZfREVMRVhQOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9hbWlnYS9leHBhdF92ZWN0b3JzLmMgYi9leHBhdC0yLjAuMS9hbWlnYS9leHBhdF92ZWN0b3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTRmYjNiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL2V4cGF0X3ZlY3RvcnMuYwpAQCAtMCwwICsxLDUwNSBAQAorLyoKKyoqIENvcHlyaWdodCAoYykgMjAwMS0yMDA3IEV4cGF0IG1haW50YWluZXJzLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworKiogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKiogCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisqKiAKKyoqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKyNpbmNsdWRlIDxleGVjL3R5cGVzLmg+CisjaW5jbHVkZSA8ZXhlYy9leGVjLmg+CisjaW5jbHVkZSA8ZXhlYy9pbnRlcmZhY2VzLmg+CisjaW5jbHVkZSA8aW50ZXJmYWNlcy9leHBhdC5oPgorCitleHRlcm4gdWludDMyICAgICAgICAgICAgICAgIF9FeHBhdF9PYnRhaW4oc3RydWN0IEV4cGF0SUZhY2UgKik7CitleHRlcm4gdWludDMyICAgICAgICAgICAgICAgIF9FeHBhdF9SZWxlYXNlKHN0cnVjdCBFeHBhdElGYWNlICopOworZXh0ZXJuIFhNTF9QYXJzZXIgICAgICAgICAgICBfRXhwYXRfWE1MX1BhcnNlckNyZWF0ZShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nTmFtZSk7CitleHRlcm4gWE1MX1BhcnNlciAgICAgICAgICAgIF9FeHBhdF9YTUxfUGFyc2VyQ3JlYXRlTlMoc3RydWN0IEV4cGF0SUZhY2UgKiwgY29uc3QgWE1MX0NoYXIgKiBlbmNvZGluZ05hbWUsIFhNTF9DaGFyIG5zU2VwKTsKK2V4dGVybiBYTUxfUGFyc2VyICAgICAgICAgICAgX0V4cGF0X1hNTF9QYXJzZXJDcmVhdGVfTU0oc3RydWN0IEV4cGF0SUZhY2UgKiwgY29uc3QgWE1MX0NoYXIgKiBlbmNvZGluZywgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqIG1lbXN1aXRlLCBjb25zdCBYTUxfQ2hhciAqIG5hbWVzcGFjZVNlcGFyYXRvcik7CitleHRlcm4gWE1MX1BhcnNlciAgICAgICAgICAgIF9FeHBhdF9YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogY29udGV4dCwgY29uc3QgWE1MX0NoYXIgKiBlbmNvZGluZyk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfUGFyc2VyRnJlZShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gZW51bSBYTUxfU3RhdHVzICAgICAgIF9FeHBhdF9YTUxfUGFyc2Uoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IGNoYXIgKiBzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CitleHRlcm4gZW51bSBYTUxfU3RhdHVzICAgICAgIF9FeHBhdF9YTUxfUGFyc2VCdWZmZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4sIGludCBpc0ZpbmFsKTsKK2V4dGVybiB2b2lkICogICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9HZXRCdWZmZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0RWxlbWVudEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldENvbW1lbnRIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29tbWVudEhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIHN0YXJ0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQsIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0RGVmYXVsdEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9EZWZhdWx0SGFuZGxlciBoYW5kbGVyKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZChzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlciBoYW5kbGVyKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiBhcmcpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGhhbmRsZXIsIHZvaWQgKiBkYXRhKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCwgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfU2V0WG1sRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9YbWxEZWNsSGFuZGxlciBoYW5kbGVyKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCwgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VsZW1lbnREZWNsSGFuZGxlciBlbGRlY2wpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0F0dGxpc3REZWNsSGFuZGxlciBhdHRkZWNsKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIgaGFuZGxlcik7CitleHRlcm4gZW51bSBYTUxfRXJyb3IgICAgICAgIF9FeHBhdF9YTUxfR2V0RXJyb3JDb2RlKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiBjb25zdCBYTUxfTENoYXIgKiAgICAgX0V4cGF0X1hNTF9FcnJvclN0cmluZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBlbnVtIFhNTF9FcnJvciBjb2RlKTsKK2V4dGVybiBsb25nICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9HZXRDdXJyZW50TGluZU51bWJlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfR2V0Q3VycmVudEJ5dGVDb3VudChzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gY29uc3QgY2hhciAqICAgICAgICAgIF9FeHBhdF9YTUxfR2V0SW5wdXRDb250ZXh0KHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgKiBvZmZzZXQsIGludCAqIHNpemUpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX1NldFVzZXJEYXRhKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogdXNlckRhdGEpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX0RlZmF1bHRDdXJyZW50KHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIpOworZXh0ZXJuIGVudW0gWE1MX1N0YXR1cyAgICAgICBfRXhwYXRfWE1MX1NldEJhc2Uoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogYmFzZSk7CitleHRlcm4gY29uc3QgWE1MX0NoYXIgKiAgICAgIF9FeHBhdF9YTUxfR2V0QmFzZShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlcik7CitleHRlcm4gaW50ICAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX0dldElkQXR0cmlidXRlSW5kZXgoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIpOworZXh0ZXJuIGVudW0gWE1MX1N0YXR1cyAgICAgICBfRXhwYXRfWE1MX1NldEVuY29kaW5nKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyBwYXJzaW5nKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRSZXR1cm5OU1RyaXBsZXQoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCBkb19uc3QpOworZXh0ZXJuIGNvbnN0IFhNTF9MQ2hhciAqICAgICBfRXhwYXRfWE1MX0V4cGF0VmVyc2lvbihzdHJ1Y3QgRXhwYXRJRmFjZSAqKTsKK2V4dGVybiBYTUxfRXhwYXRfVmVyc2lvbiAgICAgX0V4cGF0X1hNTF9FeHBhdFZlcnNpb25JbmZvKHN0cnVjdCBFeHBhdElGYWNlICopOworZXh0ZXJuIFhNTF9Cb29sICAgICAgICAgICAgICBfRXhwYXRfWE1MX1BhcnNlclJlc2V0KHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1NraXBwZWRFbnRpdHlIYW5kbGVyIGhhbmRsZXIpOworZXh0ZXJuIGVudW0gWE1MX0Vycm9yICAgICAgICBfRXhwYXRfWE1MX1VzZUZvcmVpZ25EVEQoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHVzZURURCk7CitleHRlcm4gY29uc3QgWE1MX0ZlYXR1cmUgKiAgIF9FeHBhdF9YTUxfR2V0RmVhdHVyZUxpc3Qoc3RydWN0IEV4cGF0SUZhY2UgKik7CitleHRlcm4gZW51bSBYTUxfU3RhdHVzICAgICAgIF9FeHBhdF9YTUxfU3RvcFBhcnNlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0Jvb2wgcmVzdW1hYmxlKTsKK2V4dGVybiBlbnVtIFhNTF9TdGF0dXMgICAgICAgX0V4cGF0X1hNTF9SZXN1bWVQYXJzZXIoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgICBfRXhwYXRfWE1MX0dldFBhcnNpbmdTdGF0dXMoc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9QYXJzaW5nU3RhdHVzICogc3RhdHVzKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9GcmVlQ29udGVudE1vZGVsKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29udGVudCAqIG1vZGVsKTsKK2V4dGVybiB2b2lkICogICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9NZW1NYWxsb2Moc3RydWN0IEV4cGF0SUZhY2UgKiwgWE1MX1BhcnNlciBwYXJzZXIsIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICogICAgICAgICAgICAgICAgX0V4cGF0X1hNTF9NZW1SZWFsbG9jKHN0cnVjdCBFeHBhdElGYWNlICosIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogcHRyLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICAgIF9FeHBhdF9YTUxfTWVtRnJlZShzdHJ1Y3QgRXhwYXRJRmFjZSAqLCBYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqIHB0cik7CisKKworQ09OU1QgQVBUUiBtYWluX3ZlY3RvcnNbXSA9Cit7CisgICAgX0V4cGF0X09idGFpbiwKKyAgICBfRXhwYXRfUmVsZWFzZSwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgX0V4cGF0X1hNTF9QYXJzZXJDcmVhdGUsCisgICAgX0V4cGF0X1hNTF9QYXJzZXJDcmVhdGVOUywKKyAgICBfRXhwYXRfWE1MX1BhcnNlckNyZWF0ZV9NTSwKKyAgICBfRXhwYXRfWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlLAorICAgIF9FeHBhdF9YTUxfUGFyc2VyRnJlZSwKKyAgICBfRXhwYXRfWE1MX1BhcnNlLAorICAgIF9FeHBhdF9YTUxfUGFyc2VCdWZmZXIsCisgICAgX0V4cGF0X1hNTF9HZXRCdWZmZXIsCisgICAgX0V4cGF0X1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRFbGVtZW50SGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldENvbW1lbnRIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXREZWZhdWx0SGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kLAorICAgIF9FeHBhdF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnLAorICAgIF9FeHBhdF9YTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0WG1sRGVjbEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldEVudGl0eURlY2xIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIsCisgICAgX0V4cGF0X1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciwKKyAgICBfRXhwYXRfWE1MX0dldEVycm9yQ29kZSwKKyAgICBfRXhwYXRfWE1MX0Vycm9yU3RyaW5nLAorICAgIF9FeHBhdF9YTUxfR2V0Q3VycmVudEJ5dGVJbmRleCwKKyAgICBfRXhwYXRfWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyLAorICAgIF9FeHBhdF9YTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciwKKyAgICBfRXhwYXRfWE1MX0dldEN1cnJlbnRCeXRlQ291bnQsCisgICAgX0V4cGF0X1hNTF9HZXRJbnB1dENvbnRleHQsCisgICAgX0V4cGF0X1hNTF9TZXRVc2VyRGF0YSwKKyAgICBfRXhwYXRfWE1MX0RlZmF1bHRDdXJyZW50LAorICAgIF9FeHBhdF9YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnLAorICAgIF9FeHBhdF9YTUxfU2V0QmFzZSwKKyAgICBfRXhwYXRfWE1MX0dldEJhc2UsCisgICAgX0V4cGF0X1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCwKKyAgICBfRXhwYXRfWE1MX0dldElkQXR0cmlidXRlSW5kZXgsCisgICAgX0V4cGF0X1hNTF9TZXRFbmNvZGluZywKKyAgICBfRXhwYXRfWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZywKKyAgICBfRXhwYXRfWE1MX1NldFJldHVybk5TVHJpcGxldCwKKyAgICBfRXhwYXRfWE1MX0V4cGF0VmVyc2lvbiwKKyAgICBfRXhwYXRfWE1MX0V4cGF0VmVyc2lvbkluZm8sCisgICAgX0V4cGF0X1hNTF9QYXJzZXJSZXNldCwKKyAgICBfRXhwYXRfWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyLAorICAgIF9FeHBhdF9YTUxfVXNlRm9yZWlnbkRURCwKKyAgICBfRXhwYXRfWE1MX0dldEZlYXR1cmVMaXN0LAorICAgIF9FeHBhdF9YTUxfU3RvcFBhcnNlciwKKyAgICBfRXhwYXRfWE1MX1Jlc3VtZVBhcnNlciwKKyAgICBfRXhwYXRfWE1MX0dldFBhcnNpbmdTdGF0dXMsCisgICAgX0V4cGF0X1hNTF9GcmVlQ29udGVudE1vZGVsLAorICAgIF9FeHBhdF9YTUxfTWVtTWFsbG9jLAorICAgIF9FeHBhdF9YTUxfTWVtUmVhbGxvYywKKyAgICBfRXhwYXRfWE1MX01lbUZyZWUsCisgICAgKEFQVFIpLTEKK307CisKK3VpbnQzMiBfRXhwYXRfT2J0YWluKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKQoreworCXJldHVybiArK1NlbGYtPkRhdGEuUmVmQ291bnQ7Cit9CisKK3VpbnQzMiBfRXhwYXRfUmVsZWFzZShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZikKK3sKKwlyZXR1cm4gLS1TZWxmLT5EYXRhLlJlZkNvdW50OworfQorCitYTUxfUGFyc2VyIF9FeHBhdF9YTUxfUGFyc2VyQ3JlYXRlKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKQoreworCXJldHVybiBYTUxfUGFyc2VyQ3JlYXRlKGVuY29kaW5nKTsKK30KKworWE1MX1BhcnNlciBfRXhwYXRfWE1MX1BhcnNlckNyZWF0ZU5TKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLCBYTUxfQ2hhciBuc1NlcCkKK3sKKwlyZXR1cm4gWE1MX1BhcnNlckNyZWF0ZU5TKGVuY29kaW5nLCBuc1NlcCk7Cit9CisKK1hNTF9QYXJzZXIgX0V4cGF0X1hNTF9QYXJzZXJDcmVhdGVfTU0oc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbXN1aXRlLCBjb25zdCBYTUxfQ2hhciAqbmFtZXNwYWNlU2VwYXJhdG9yKQoreworCXJldHVybiBYTUxfUGFyc2VyQ3JlYXRlX01NKGVuY29kaW5nLCBtZW1zdWl0ZSwgbmFtZXNwYWNlU2VwYXJhdG9yKTsKK30KKworWE1MX1BhcnNlciBfRXhwYXRfWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpCit7CisJcmV0dXJuIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIGVuY29kaW5nKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1BhcnNlckZyZWUoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCVhNTF9QYXJzZXJGcmVlKHBhcnNlcik7Cit9CisKK2VudW0gWE1MX1N0YXR1cyBfRXhwYXRfWE1MX1BhcnNlKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IGNoYXIgKiBzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCkKK3sKKwlyZXR1cm4gWE1MX1BhcnNlKHBhcnNlciwgcywgbGVuLCBpc0ZpbmFsKTsKK30KKworZW51bSBYTUxfU3RhdHVzIF9FeHBhdF9YTUxfUGFyc2VCdWZmZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbiwgaW50IGlzRmluYWwpCit7CisJcmV0dXJuIFhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGxlbiwgaXNGaW5hbCk7Cit9CisKK3ZvaWQgKiBfRXhwYXRfWE1MX0dldEJ1ZmZlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuKQoreworCXJldHVybiBYTUxfR2V0QnVmZmVyKHBhcnNlciwgbGVuKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQpCit7CisJWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBzdGFydCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKQoreworCVhNTF9TZXRFbmRFbGVtZW50SGFuZGxlcihwYXJzZXIsIGVuZCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRFbGVtZW50SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciBzdGFydCwgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCkKK3sKKwlYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBzdGFydCwgZW5kKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRDb21tZW50SGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29tbWVudEhhbmRsZXIgaGFuZGxlcikKK3sKKwlYTUxfU2V0Q29tbWVudEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIHN0YXJ0KQoreworCVhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIocGFyc2VyLCBzdGFydCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCkKK3sKKwlYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIGVuZCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQsIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCkKK3sKKwlYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0RGVmYXVsdEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldERlZmF1bHRIYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZChzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcikKK3sKKwlYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQocGFyc2VyLCBoYW5kbGVyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiBhcmcpCit7CisJWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyhwYXJzZXIsIGFyZyk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGhhbmRsZXIsIHZvaWQgKiBkYXRhKQoreworCVhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKHBhcnNlciwgaGFuZGxlciwgZGF0YSk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0KQoreworCVhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCkKK3sKKwlYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBlbmQpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQsIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpCit7CisJWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRYbWxEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfWG1sRGVjbEhhbmRsZXIgaGFuZGxlcikKK3sKKwlYTUxfU2V0WG1sRGVjbEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCkKK3sKKwlYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpCit7CisJWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIGVuZCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kRG9jdHlwZURlY2xIYW5kbGVyIGVuZCkKK3sKKwlYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VsZW1lbnREZWNsSGFuZGxlciBlbGRlY2wpCit7CisJWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihwYXJzZXIsIGVsZGVjbCk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0F0dGxpc3REZWNsSGFuZGxlciBhdHRkZWNsKQoreworCVhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIocGFyc2VyLCBhdHRkZWNsKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldEVudGl0eURlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbnRpdHlEZWNsSGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKQoreworCVhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpOworfQorCitlbnVtIFhNTF9FcnJvciBfRXhwYXRfWE1MX0dldEVycm9yQ29kZShzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCXJldHVybiBYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcik7Cit9CisKK2NvbnN0IFhNTF9MQ2hhciAqIF9FeHBhdF9YTUxfRXJyb3JTdHJpbmcoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBlbnVtIFhNTF9FcnJvciBjb2RlKQoreworCXJldHVybiBYTUxfRXJyb3JTdHJpbmcoY29kZSk7Cit9CisKK2xvbmcgX0V4cGF0X1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisJcmV0dXJuIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KHBhcnNlcik7Cit9CisKK2ludCBfRXhwYXRfWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisJcmV0dXJuIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpOworfQorCitpbnQgX0V4cGF0X1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisJcmV0dXJuIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHBhcnNlcik7Cit9CisKK2ludCBfRXhwYXRfWE1MX0dldEN1cnJlbnRCeXRlQ291bnQoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlyZXR1cm4gWE1MX0dldEN1cnJlbnRCeXRlQ291bnQocGFyc2VyKTsKK30KKworY29uc3QgY2hhciAqIF9FeHBhdF9YTUxfR2V0SW5wdXRDb250ZXh0KHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCAqIG9mZnNldCwgaW50ICogc2l6ZSkKK3sKKwlyZXR1cm4gWE1MX0dldElucHV0Q29udGV4dChwYXJzZXIsIG9mZnNldCwgc2l6ZSk7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9TZXRVc2VyRGF0YShzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogdXNlckRhdGEpCit7CisJWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdXNlckRhdGEpOworfQorCit2b2lkIF9FeHBhdF9YTUxfRGVmYXVsdEN1cnJlbnQoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlYTUxfRGVmYXVsdEN1cnJlbnQocGFyc2VyKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCVhNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcocGFyc2VyKTsKK30KKworZW51bSBYTUxfU3RhdHVzIF9FeHBhdF9YTUxfU2V0QmFzZShzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqcCkKK3sKKwlyZXR1cm4gWE1MX1NldEJhc2UocGFyc2VyLCBwKTsKK30KKworY29uc3QgWE1MX0NoYXIgKiBfRXhwYXRfWE1MX0dldEJhc2Uoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlyZXR1cm4gWE1MX0dldEJhc2UocGFyc2VyKTsKK30KKworaW50IF9FeHBhdF9YTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlyZXR1cm4gWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KHBhcnNlcik7Cit9CisKK2ludCBfRXhwYXRfWE1MX0dldElkQXR0cmlidXRlSW5kZXgoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcikKK3sKKwlyZXR1cm4gWE1MX0dldElkQXR0cmlidXRlSW5kZXgocGFyc2VyKTsKK30KKworZW51bSBYTUxfU3RhdHVzIF9FeHBhdF9YTUxfU2V0RW5jb2Rpbmcoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKQoreworCXJldHVybiBYTUxfU2V0RW5jb2RpbmcocGFyc2VyLCBlbmNvZGluZyk7Cit9CisKK2ludCBfRXhwYXRfWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgcGFyc2luZykKK3sKKwlyZXR1cm4gWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhwYXJzZXIsIHBhcnNpbmcpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0UmV0dXJuTlNUcmlwbGV0KHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCBkb19uc3QpCit7CisJWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIGRvX25zdCk7Cit9CisKK2NvbnN0IFhNTF9MQ2hhciAqIF9FeHBhdF9YTUxfRXhwYXRWZXJzaW9uKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZikKK3sKKwlyZXR1cm4gWE1MX0V4cGF0VmVyc2lvbigpOworfQorCitYTUxfRXhwYXRfVmVyc2lvbiBfRXhwYXRfWE1MX0V4cGF0VmVyc2lvbkluZm8oc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmKQoreworCXJldHVybiBYTUxfRXhwYXRWZXJzaW9uSW5mbygpOworfQorCitYTUxfQm9vbCBfRXhwYXRfWE1MX1BhcnNlclJlc2V0KHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZykKK3sKKwlyZXR1cm4gWE1MX1BhcnNlclJlc2V0KHBhcnNlciwgZW5jb2RpbmcpOworfQorCit2b2lkIF9FeHBhdF9YTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1NraXBwZWRFbnRpdHlIYW5kbGVyIGhhbmRsZXIpCit7CisJWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKHBhcnNlciwgaGFuZGxlcik7Cit9CisKK2VudW0gWE1MX0Vycm9yIF9FeHBhdF9YTUxfVXNlRm9yZWlnbkRURChzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCB1c2VEVEQpCit7CisJcmV0dXJuIFhNTF9Vc2VGb3JlaWduRFREKHBhcnNlciwgdXNlRFREKTsKK30KKworY29uc3QgWE1MX0ZlYXR1cmUgKiBfRXhwYXRfWE1MX0dldEZlYXR1cmVMaXN0KHN0cnVjdCBFeHBhdElGYWNlICogU2VsZikKK3sKKwlyZXR1cm4gWE1MX0dldEZlYXR1cmVMaXN0KCk7Cit9CisKK2VudW0gWE1MX1N0YXR1cyBfRXhwYXRfWE1MX1N0b3BQYXJzZXIoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0Jvb2wgcmVzdW1hYmxlKQoreworCXJldHVybiBYTUxfU3RvcFBhcnNlcihwYXJzZXIsIHJlc3VtYWJsZSk7Cit9CisKK2VudW0gWE1MX1N0YXR1cyBfRXhwYXRfWE1MX1Jlc3VtZVBhcnNlcihzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworCXJldHVybiBYTUxfUmVzdW1lUGFyc2VyKHBhcnNlcik7Cit9CisKK3ZvaWQgX0V4cGF0X1hNTF9HZXRQYXJzaW5nU3RhdHVzKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9QYXJzaW5nU3RhdHVzICogc3RhdHVzKQoreworCVhNTF9HZXRQYXJzaW5nU3RhdHVzKHBhcnNlciwgc3RhdHVzKTsKK30KKwordm9pZCBfRXhwYXRfWE1MX0ZyZWVDb250ZW50TW9kZWwoc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NvbnRlbnQgKiBtb2RlbCkKK3sKKwlYTUxfRnJlZUNvbnRlbnRNb2RlbChwYXJzZXIsIG1vZGVsKTsKK30KKwordm9pZCAqIF9FeHBhdF9YTUxfTWVtTWFsbG9jKHN0cnVjdCBFeHBhdElGYWNlICogU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBYTUxfTWVtTWFsbG9jKHBhcnNlciwgc2l6ZSk7Cit9CisKK3ZvaWQgKiBfRXhwYXRfWE1MX01lbVJlYWxsb2Moc3RydWN0IEV4cGF0SUZhY2UgKiBTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqIHB0ciwgc2l6ZV90IHNpemUpCit7CisJWE1MX01lbVJlYWxsb2MocGFyc2VyLCBwdHIsIHNpemUpOworfQorCit2b2lkIF9FeHBhdF9YTUxfTWVtRnJlZShzdHJ1Y3QgRXhwYXRJRmFjZSAqIFNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogcHRyKQoreworCVhNTF9NZW1GcmVlKHBhcnNlciwgcHRyKTsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvaW5saW5lNC9leHBhdC5oIGIvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9pbmxpbmU0L2V4cGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWUzMTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvaW5saW5lNC9leHBhdC5oCkBAIC0wLDAgKzEsOTQgQEAKKyNpZm5kZWYgSU5MSU5FNF9FWFBBVF9ICisjZGVmaW5lIElOTElORTRfRVhQQVRfSAorCisvKgorKiogVGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSBpZGx0b29sIDUxLjYuCisqKgorKiogSXQgcHJvdmlkZXMgY29tcGF0aWJpbGl0eSB0byBPUzMgc3R5bGUgbGlicmFyeQorKiogY2FsbHMgYnkgc3Vic3RpdHV0aW5nIGZ1bmN0aW9ucy4KKyoqCisqKiBEbyBub3QgZWRpdCBtYW51YWxseS4KKyovIAorCisjaWZuZGVmIEVYRUNfVFlQRVNfSAorI2luY2x1ZGUgPGV4ZWMvdHlwZXMuaD4KKyNlbmRpZgorI2lmbmRlZiBFWEVDX0VYRUNfSAorI2luY2x1ZGUgPGV4ZWMvZXhlYy5oPgorI2VuZGlmCisjaWZuZGVmIEVYRUNfSU5URVJGQUNFU19ICisjaW5jbHVkZSA8ZXhlYy9pbnRlcmZhY2VzLmg+CisjZW5kaWYKKworI2lmbmRlZiBMSUJSQVJJRVNfRVhQQVRfSAorI2luY2x1ZGUgPGxpYnJhcmllcy9leHBhdC5oPgorI2VuZGlmCisKKy8qIElubGluZSBtYWNyb3MgZm9yIEludGVyZmFjZSAibWFpbiIgKi8KKyNkZWZpbmUgWE1MX1BhcnNlckNyZWF0ZShlbmNvZGluZ05hbWUpIElFeHBhdC0+WE1MX1BhcnNlckNyZWF0ZShlbmNvZGluZ05hbWUpIAorI2RlZmluZSBYTUxfUGFyc2VyQ3JlYXRlTlMoZW5jb2RpbmdOYW1lLCBuc1NlcCkgSUV4cGF0LT5YTUxfUGFyc2VyQ3JlYXRlTlMoZW5jb2RpbmdOYW1lLCBuc1NlcCkgCisjZGVmaW5lIFhNTF9QYXJzZXJDcmVhdGVfTU0oZW5jb2RpbmcsIG1lbXN1aXRlLCBuYW1lc3BhY2VTZXBhcmF0b3IpIElFeHBhdC0+WE1MX1BhcnNlckNyZWF0ZV9NTShlbmNvZGluZywgbWVtc3VpdGUsIG5hbWVzcGFjZVNlcGFyYXRvcikgCisjZGVmaW5lIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIGVuY29kaW5nKSBJRXhwYXQtPlhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIGVuY29kaW5nKSAKKyNkZWZpbmUgWE1MX1BhcnNlckZyZWUocGFyc2VyKSBJRXhwYXQtPlhNTF9QYXJzZXJGcmVlKHBhcnNlcikgCisjZGVmaW5lIFhNTF9QYXJzZShwYXJzZXIsIHMsIGxlbiwgaXNGaW5hbCkgSUV4cGF0LT5YTUxfUGFyc2UocGFyc2VyLCBzLCBsZW4sIGlzRmluYWwpIAorI2RlZmluZSBYTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBsZW4sIGlzRmluYWwpIElFeHBhdC0+WE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgbGVuLCBpc0ZpbmFsKSAKKyNkZWZpbmUgWE1MX0dldEJ1ZmZlcihwYXJzZXIsIGxlbikgSUV4cGF0LT5YTUxfR2V0QnVmZmVyKHBhcnNlciwgbGVuKSAKKyNkZWZpbmUgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBzdGFydCkgSUV4cGF0LT5YTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0KSAKKyNkZWZpbmUgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZW5kKSBJRXhwYXQtPlhNTF9TZXRFbmRFbGVtZW50SGFuZGxlcihwYXJzZXIsIGVuZCkgCisjZGVmaW5lIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpIElFeHBhdC0+WE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCkgCisjZGVmaW5lIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIElFeHBhdC0+WE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfU2V0Q29tbWVudEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSBJRXhwYXQtPlhNTF9TZXRDb21tZW50SGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKHBhcnNlciwgc3RhcnQpIElFeHBhdC0+WE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIHN0YXJ0KSAKKyNkZWZpbmUgWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIocGFyc2VyLCBlbmQpIElFeHBhdC0+WE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIocGFyc2VyLCBlbmQpIAorI2RlZmluZSBYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpIElFeHBhdC0+WE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIocGFyc2VyLCBzdGFydCwgZW5kKSAKKyNkZWZpbmUgWE1MX1NldERlZmF1bHRIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0RGVmYXVsdEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSAKKyNkZWZpbmUgWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQocGFyc2VyLCBoYW5kbGVyKSAKKyNkZWZpbmUgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIElFeHBhdC0+WE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKHBhcnNlciwgYXJnKSBJRXhwYXQtPlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcocGFyc2VyLCBhcmcpIAorI2RlZmluZSBYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIsIGRhdGEpIElFeHBhdC0+WE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIocGFyc2VyLCBoYW5kbGVyLCBkYXRhKSAKKyNkZWZpbmUgWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydCkgSUV4cGF0LT5YTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0KSAKKyNkZWZpbmUgWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgZW5kKSBJRXhwYXQtPlhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcihwYXJzZXIsIGVuZCkgCisjZGVmaW5lIFhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpIElFeHBhdC0+WE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgc3RhcnQsIGVuZCkgCisjZGVmaW5lIFhNTF9TZXRYbWxEZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIElFeHBhdC0+WE1MX1NldFhtbERlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0KSBJRXhwYXQtPlhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0KSAKKyNkZWZpbmUgWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIGVuZCkgSUV4cGF0LT5YTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyKHBhcnNlciwgZW5kKSAKKyNkZWZpbmUgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpIElFeHBhdC0+WE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIHN0YXJ0LCBlbmQpIAorI2RlZmluZSBYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyKHBhcnNlciwgZWxkZWNsKSBJRXhwYXQtPlhNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIocGFyc2VyLCBlbGRlY2wpIAorI2RlZmluZSBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyKHBhcnNlciwgYXR0ZGVjbCkgSUV4cGF0LT5YTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyKHBhcnNlciwgYXR0ZGVjbCkgCisjZGVmaW5lIFhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIElFeHBhdC0+WE1MX1NldEVudGl0eURlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgCisjZGVmaW5lIFhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIElFeHBhdC0+WE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSAKKyNkZWZpbmUgWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKHBhcnNlciwgaGFuZGxlcikgSUV4cGF0LT5YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSAKKyNkZWZpbmUgWE1MX0dldEVycm9yQ29kZShwYXJzZXIpIElFeHBhdC0+WE1MX0dldEVycm9yQ29kZShwYXJzZXIpIAorI2RlZmluZSBYTUxfRXJyb3JTdHJpbmcoY29kZSkgSUV4cGF0LT5YTUxfRXJyb3JTdHJpbmcoY29kZSkgCisjZGVmaW5lIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KHBhcnNlcikgSUV4cGF0LT5YTUxfR2V0Q3VycmVudEJ5dGVJbmRleChwYXJzZXIpIAorI2RlZmluZSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKSBJRXhwYXQtPlhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpIAorI2RlZmluZSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihwYXJzZXIpIElFeHBhdC0+WE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKSAKKyNkZWZpbmUgWE1MX0dldEN1cnJlbnRCeXRlQ291bnQocGFyc2VyKSBJRXhwYXQtPlhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50KHBhcnNlcikgCisjZGVmaW5lIFhNTF9HZXRJbnB1dENvbnRleHQocGFyc2VyLCBvZmZzZXQsIHNpemUpIElFeHBhdC0+WE1MX0dldElucHV0Q29udGV4dChwYXJzZXIsIG9mZnNldCwgc2l6ZSkgCisjZGVmaW5lIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIHVzZXJEYXRhKSBJRXhwYXQtPlhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIHVzZXJEYXRhKSAKKyNkZWZpbmUgWE1MX0RlZmF1bHRDdXJyZW50KHBhcnNlcikgSUV4cGF0LT5YTUxfRGVmYXVsdEN1cnJlbnQocGFyc2VyKSAKKyNkZWZpbmUgWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhwYXJzZXIpIElFeHBhdC0+WE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhwYXJzZXIpIAorI2RlZmluZSBYTUxfU2V0QmFzZShwYXJzZXIsIGJhc2UpIElFeHBhdC0+WE1MX1NldEJhc2UocGFyc2VyLCBiYXNlKSAKKyNkZWZpbmUgWE1MX0dldEJhc2UocGFyc2VyKSBJRXhwYXQtPlhNTF9HZXRCYXNlKHBhcnNlcikgCisjZGVmaW5lIFhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudChwYXJzZXIpIElFeHBhdC0+WE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KHBhcnNlcikgCisjZGVmaW5lIFhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4KHBhcnNlcikgSUV4cGF0LT5YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleChwYXJzZXIpIAorI2RlZmluZSBYTUxfU2V0RW5jb2RpbmcocGFyc2VyLCBlbmNvZGluZykgSUV4cGF0LT5YTUxfU2V0RW5jb2RpbmcocGFyc2VyLCBlbmNvZGluZykgCisjZGVmaW5lIFhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcocGFyc2VyLCBwYXJzaW5nKSBJRXhwYXQtPlhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcocGFyc2VyLCBwYXJzaW5nKSAKKyNkZWZpbmUgWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIGRvX25zdCkgSUV4cGF0LT5YTUxfU2V0UmV0dXJuTlNUcmlwbGV0KHBhcnNlciwgZG9fbnN0KSAKKyNkZWZpbmUgWE1MX0V4cGF0VmVyc2lvbigpIElFeHBhdC0+WE1MX0V4cGF0VmVyc2lvbigpIAorI2RlZmluZSBYTUxfRXhwYXRWZXJzaW9uSW5mbygpIElFeHBhdC0+WE1MX0V4cGF0VmVyc2lvbkluZm8oKSAKKyNkZWZpbmUgWE1MX1BhcnNlclJlc2V0KHBhcnNlciwgZW5jb2RpbmcpIElFeHBhdC0+WE1MX1BhcnNlclJlc2V0KHBhcnNlciwgZW5jb2RpbmcpIAorI2RlZmluZSBYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIocGFyc2VyLCBoYW5kbGVyKSBJRXhwYXQtPlhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcihwYXJzZXIsIGhhbmRsZXIpIAorI2RlZmluZSBYTUxfVXNlRm9yZWlnbkRURChwYXJzZXIsIHVzZURURCkgSUV4cGF0LT5YTUxfVXNlRm9yZWlnbkRURChwYXJzZXIsIHVzZURURCkgCisjZGVmaW5lIFhNTF9HZXRGZWF0dXJlTGlzdCgpIElFeHBhdC0+WE1MX0dldEZlYXR1cmVMaXN0KCkgCisjZGVmaW5lIFhNTF9TdG9wUGFyc2VyKHBhcnNlciwgcmVzdW1hYmxlKSBJRXhwYXQtPlhNTF9TdG9wUGFyc2VyKHBhcnNlciwgcmVzdW1hYmxlKSAKKyNkZWZpbmUgWE1MX1Jlc3VtZVBhcnNlcihwYXJzZXIpIElFeHBhdC0+WE1MX1Jlc3VtZVBhcnNlcihwYXJzZXIpIAorI2RlZmluZSBYTUxfR2V0UGFyc2luZ1N0YXR1cyhwYXJzZXIsIHN0YXR1cykgSUV4cGF0LT5YTUxfR2V0UGFyc2luZ1N0YXR1cyhwYXJzZXIsIHN0YXR1cykgCisjZGVmaW5lIFhNTF9GcmVlQ29udGVudE1vZGVsKHBhcnNlciwgbW9kZWwpIElFeHBhdC0+WE1MX0ZyZWVDb250ZW50TW9kZWwocGFyc2VyLCBtb2RlbCkgCisjZGVmaW5lIFhNTF9NZW1NYWxsb2MocGFyc2VyLCBzaXplKSBJRXhwYXQtPlhNTF9NZW1NYWxsb2MocGFyc2VyLCBzaXplKSAKKyNkZWZpbmUgWE1MX01lbVJlYWxsb2MocGFyc2VyLCBwdHIsIHNpemUpIElFeHBhdC0+WE1MX01lbVJlYWxsb2MocGFyc2VyLCBwdHIsIHNpemUpIAorI2RlZmluZSBYTUxfTWVtRnJlZShwYXJzZXIsIHB0cikgSUV4cGF0LT5YTUxfTWVtRnJlZShwYXJzZXIsIHB0cikgCisKKyNlbmRpZiAvKiBJTkxJTkU0X0VYUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvaW50ZXJmYWNlcy9leHBhdC5oIGIvZXhwYXQtMi4wLjEvYW1pZ2EvaW5jbHVkZS9pbnRlcmZhY2VzL2V4cGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTliZGY0YQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvaW50ZXJmYWNlcy9leHBhdC5oCkBAIC0wLDAgKzEsOTggQEAKKyNpZm5kZWYgRVhQQVRfSU5URVJGQUNFX0RFRl9ICisjZGVmaW5lIEVYUEFUX0lOVEVSRkFDRV9ERUZfSAorCisvKgorKiogVGhpcyBmaWxlIHdhcyBtYWNoaW5lIGdlbmVyYXRlZCBieSBpZGx0b29sIDUxLjYuCisqKiBEbyBub3QgZWRpdAorKi8gCisKKyNpZm5kZWYgRVhFQ19UWVBFU19ICisjaW5jbHVkZSA8ZXhlYy90eXBlcy5oPgorI2VuZGlmCisjaWZuZGVmIEVYRUNfRVhFQ19ICisjaW5jbHVkZSA8ZXhlYy9leGVjLmg+CisjZW5kaWYKKyNpZm5kZWYgRVhFQ19JTlRFUkZBQ0VTX0gKKyNpbmNsdWRlIDxleGVjL2ludGVyZmFjZXMuaD4KKyNlbmRpZgorCisjaWZuZGVmIExJQlJBUklFU19FWFBBVF9ICisjaW5jbHVkZSA8bGlicmFyaWVzL2V4cGF0Lmg+CisjZW5kaWYKKworc3RydWN0IEV4cGF0SUZhY2UKK3sKKwlzdHJ1Y3QgSW50ZXJmYWNlRGF0YSBEYXRhOworCisJdWludDMyIEFQSUNBTEwgKCpPYnRhaW4pKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKTsKKwl1aW50MzIgQVBJQ0FMTCAoKlJlbGVhc2UpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKTsKKwl2b2lkIEFQSUNBTEwgKCpFeHB1bmdlKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZik7CisJc3RydWN0IEludGVyZmFjZSAqIEFQSUNBTEwgKCpDbG9uZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYpOworCVhNTF9QYXJzZXIgQVBJQ0FMTCAoKlhNTF9QYXJzZXJDcmVhdGUpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nTmFtZSk7CisJWE1MX1BhcnNlciBBUElDQUxMICgqWE1MX1BhcnNlckNyZWF0ZU5TKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgY29uc3QgWE1MX0NoYXIgKiBlbmNvZGluZ05hbWUsIFhNTF9DaGFyIG5zU2VwKTsKKwlYTUxfUGFyc2VyIEFQSUNBTEwgKCpYTUxfUGFyc2VyQ3JlYXRlX01NKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgY29uc3QgWE1MX0NoYXIgKiBlbmNvZGluZywgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqIG1lbXN1aXRlLCBjb25zdCBYTUxfQ2hhciAqIG5hbWVzcGFjZVNlcGFyYXRvcik7CisJWE1MX1BhcnNlciBBUElDQUxMICgqWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogY29udGV4dCwgY29uc3QgWE1MX0NoYXIgKiBlbmNvZGluZyk7CisJdm9pZCBBUElDQUxMICgqWE1MX1BhcnNlckZyZWUpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJZW51bSBYTUxfU3RhdHVzIEFQSUNBTEwgKCpYTUxfUGFyc2UpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqIHMsIGludCBsZW4sIGludCBpc0ZpbmFsKTsKKwllbnVtIFhNTF9TdGF0dXMgQVBJQ0FMTCAoKlhNTF9QYXJzZUJ1ZmZlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CisJdm9pZCAqIEFQSUNBTEwgKCpYTUxfR2V0QnVmZmVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0KTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldEVsZW1lbnRIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0LCBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRDb21tZW50SGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29tbWVudEhhbmRsZXIgaGFuZGxlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIHN0YXJ0KTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQsIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldERlZmF1bHRIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9EZWZhdWx0SGFuZGxlciBoYW5kbGVyKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlciBoYW5kbGVyKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiBhcmcpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGhhbmRsZXIsIHZvaWQgKiBkYXRhKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCwgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7CisJdm9pZCBBUElDQUxMICgqWE1MX1NldFhtbERlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9YbWxEZWNsSGFuZGxlciBoYW5kbGVyKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIHN0YXJ0KTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCwgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VsZW1lbnREZWNsSGFuZGxlciBlbGRlY2wpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0F0dGxpc3REZWNsSGFuZGxlciBhdHRkZWNsKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0VudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyIGhhbmRsZXIpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIgaGFuZGxlcik7CisJZW51bSBYTUxfRXJyb3IgQVBJQ0FMTCAoKlhNTF9HZXRFcnJvckNvZGUpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJY29uc3QgWE1MX0xDaGFyICogQVBJQ0FMTCAoKlhNTF9FcnJvclN0cmluZykoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIGVudW0gWE1MX0Vycm9yIGNvZGUpOworCWxvbmcgQVBJQ0FMTCAoKlhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpOworCWludCBBUElDQUxMICgqWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIpOworCWludCBBUElDQUxMICgqWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJaW50IEFQSUNBTEwgKCpYTUxfR2V0Q3VycmVudEJ5dGVDb3VudCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwljb25zdCBjaGFyICogQVBJQ0FMTCAoKlhNTF9HZXRJbnB1dENvbnRleHQpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50ICogb2Zmc2V0LCBpbnQgKiBzaXplKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfU2V0VXNlckRhdGEpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqIHVzZXJEYXRhKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfRGVmYXVsdEN1cnJlbnQpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJdm9pZCBBUElDQUxMICgqWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZykoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwllbnVtIFhNTF9TdGF0dXMgQVBJQ0FMTCAoKlhNTF9TZXRCYXNlKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogYmFzZSk7CisJY29uc3QgWE1MX0NoYXIgKiBBUElDQUxMICgqWE1MX0dldEJhc2UpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJaW50IEFQSUNBTEwgKCpYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlcik7CisJaW50IEFQSUNBTEwgKCpYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwllbnVtIFhNTF9TdGF0dXMgQVBJQ0FMTCAoKlhNTF9TZXRFbmNvZGluZykoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqIGVuY29kaW5nKTsKKwlpbnQgQVBJQ0FMTCAoKlhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIHBhcnNpbmcpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRSZXR1cm5OU1RyaXBsZXQpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCk7CisJY29uc3QgWE1MX0xDaGFyICogQVBJQ0FMTCAoKlhNTF9FeHBhdFZlcnNpb24pKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKTsKKwlYTUxfRXhwYXRfVmVyc2lvbiBBUElDQUxMICgqWE1MX0V4cGF0VmVyc2lvbkluZm8pKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmKTsKKwlYTUxfQm9vbCBBUElDQUxMICgqWE1MX1BhcnNlclJlc2V0KShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICogZW5jb2RpbmcpOworCXZvaWQgQVBJQ0FMTCAoKlhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIgaGFuZGxlcik7CisJZW51bSBYTUxfRXJyb3IgQVBJQ0FMTCAoKlhNTF9Vc2VGb3JlaWduRFREKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Cb29sIHVzZURURCk7CisJY29uc3QgWE1MX0ZlYXR1cmUgKiBBUElDQUxMICgqWE1MX0dldEZlYXR1cmVMaXN0KShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZik7CisJZW51bSBYTUxfU3RhdHVzIEFQSUNBTEwgKCpYTUxfU3RvcFBhcnNlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCByZXN1bWFibGUpOworCWVudW0gWE1MX1N0YXR1cyBBUElDQUxMICgqWE1MX1Jlc3VtZVBhcnNlcikoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfR2V0UGFyc2luZ1N0YXR1cykoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfUGFyc2luZ1N0YXR1cyAqIHN0YXR1cyk7CisJdm9pZCBBUElDQUxMICgqWE1MX0ZyZWVDb250ZW50TW9kZWwpKHN0cnVjdCBFeHBhdElGYWNlICpTZWxmLCBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NvbnRlbnQgKiBtb2RlbCk7CisJdm9pZCAqIEFQSUNBTEwgKCpYTUxfTWVtTWFsbG9jKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHNpemVfdCBzaXplKTsKKwl2b2lkICogQVBJQ0FMTCAoKlhNTF9NZW1SZWFsbG9jKShzdHJ1Y3QgRXhwYXRJRmFjZSAqU2VsZiwgWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKiBwdHIsIHNpemVfdCBzaXplKTsKKwl2b2lkIEFQSUNBTEwgKCpYTUxfTWVtRnJlZSkoc3RydWN0IEV4cGF0SUZhY2UgKlNlbGYsIFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICogcHRyKTsKK307CisKKyNlbmRpZiAvKiBFWFBBVF9JTlRFUkZBQ0VfREVGX0ggKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvbGlicmFyaWVzL2V4cGF0LmggYi9leHBhdC0yLjAuMS9hbWlnYS9pbmNsdWRlL2xpYnJhcmllcy9leHBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiNTczODcKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9hbWlnYS9pbmNsdWRlL2xpYnJhcmllcy9leHBhdC5oCkBAIC0wLDAgKzEsNTY2IEBACisjaWZuZGVmIExJQlJBUklFU19FWFBBVF9ICisjZGVmaW5lIExJQlJBUklFU19FWFBBVF9ICisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNyBFeHBhdCBtYWludGFpbmVycy4KKyoqCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyoqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqIAorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKiogCisqKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworICAgI2lmZGVmIF9fUFBDX18KKyAgICAjcHJhZ21hIHBhY2soMikKKyAgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfX1ZCQ0NfXykKKyAgICNwcmFnbWEgYW1pZ2EtYWxpZ24KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZm5kZWYgWE1MQ0FMTAorI2RlZmluZSBYTUxDQUxMCisjZW5kaWYKKwordHlwZWRlZiBjaGFyIFhNTF9DaGFyOwordHlwZWRlZiBjaGFyIFhNTF9MQ2hhcjsKK3R5cGVkZWYgbG9uZyBYTUxfSW5kZXg7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWE1MX1NpemU7CisKK3N0cnVjdCBYTUxfUGFyc2VyU3RydWN0OwordHlwZWRlZiBzdHJ1Y3QgWE1MX1BhcnNlclN0cnVjdCAqWE1MX1BhcnNlcjsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFhNTF9Cb29sOworI2RlZmluZSBYTUxfVFJVRSAgICgoWE1MX0Jvb2wpIDEpCisjZGVmaW5lIFhNTF9GQUxTRSAgKChYTUxfQm9vbCkgMCkKKworZW51bSBYTUxfU3RhdHVzIHsKKyAgWE1MX1NUQVRVU19FUlJPUiA9IDAsCisjZGVmaW5lIFhNTF9TVEFUVVNfRVJST1IgWE1MX1NUQVRVU19FUlJPUgorICBYTUxfU1RBVFVTX09LID0gMSwKKyNkZWZpbmUgWE1MX1NUQVRVU19PSyBYTUxfU1RBVFVTX09LCisgIFhNTF9TVEFUVVNfU1VTUEVOREVEID0gMiwKKyNkZWZpbmUgWE1MX1NUQVRVU19TVVNQRU5ERUQgWE1MX1NUQVRVU19TVVNQRU5ERUQKK307CisKK2VudW0gWE1MX0Vycm9yIHsKKyAgWE1MX0VSUk9SX05PTkUsCisgIFhNTF9FUlJPUl9OT19NRU1PUlksCisgIFhNTF9FUlJPUl9TWU5UQVgsCisgIFhNTF9FUlJPUl9OT19FTEVNRU5UUywKKyAgWE1MX0VSUk9SX0lOVkFMSURfVE9LRU4sCisgIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTiwKKyAgWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUiwKKyAgWE1MX0VSUk9SX1RBR19NSVNNQVRDSCwKKyAgWE1MX0VSUk9SX0RVUExJQ0FURV9BVFRSSUJVVEUsCisgIFhNTF9FUlJPUl9KVU5LX0FGVEVSX0RPQ19FTEVNRU5ULAorICBYTUxfRVJST1JfUEFSQU1fRU5USVRZX1JFRiwKKyAgWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFksCisgIFhNTF9FUlJPUl9SRUNVUlNJVkVfRU5USVRZX1JFRiwKKyAgWE1MX0VSUk9SX0FTWU5DX0VOVElUWSwKKyAgWE1MX0VSUk9SX0JBRF9DSEFSX1JFRiwKKyAgWE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGLAorICBYTUxfRVJST1JfQVRUUklCVVRFX0VYVEVSTkFMX0VOVElUWV9SRUYsCisgIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJLAorICBYTUxfRVJST1JfVU5LTk9XTl9FTkNPRElORywKKyAgWE1MX0VSUk9SX0lOQ09SUkVDVF9FTkNPRElORywKKyAgWE1MX0VSUk9SX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT04sCisgIFhNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkcsCisgIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORSwKKyAgWE1MX0VSUk9SX1VORVhQRUNURURfU1RBVEUsCisgIFhNTF9FUlJPUl9FTlRJVFlfREVDTEFSRURfSU5fUEUsCisgIFhNTF9FUlJPUl9GRUFUVVJFX1JFUVVJUkVTX1hNTF9EVEQsCisgIFhNTF9FUlJPUl9DQU5UX0NIQU5HRV9GRUFUVVJFX09OQ0VfUEFSU0lORywKKyAgWE1MX0VSUk9SX1VOQk9VTkRfUFJFRklYLAorICBYTUxfRVJST1JfVU5ERUNMQVJJTkdfUFJFRklYLAorICBYTUxfRVJST1JfSU5DT01QTEVURV9QRSwKKyAgWE1MX0VSUk9SX1hNTF9ERUNMLAorICBYTUxfRVJST1JfVEVYVF9ERUNMLAorICBYTUxfRVJST1JfUFVCTElDSUQsCisgIFhNTF9FUlJPUl9TVVNQRU5ERUQsCisgIFhNTF9FUlJPUl9OT1RfU1VTUEVOREVELAorICBYTUxfRVJST1JfQUJPUlRFRCwKKyAgWE1MX0VSUk9SX0ZJTklTSEVELAorICBYTUxfRVJST1JfU1VTUEVORF9QRSwKKyAgWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUwsCisgIFhNTF9FUlJPUl9SRVNFUlZFRF9QUkVGSVhfWE1MTlMsCisgIFhNTF9FUlJPUl9SRVNFUlZFRF9OQU1FU1BBQ0VfVVJJCit9OworCitlbnVtIFhNTF9Db250ZW50X1R5cGUgeworICBYTUxfQ1RZUEVfRU1QVFkgPSAxLAorICBYTUxfQ1RZUEVfQU5ZLAorICBYTUxfQ1RZUEVfTUlYRUQsCisgIFhNTF9DVFlQRV9OQU1FLAorICBYTUxfQ1RZUEVfQ0hPSUNFLAorICBYTUxfQ1RZUEVfU0VRCit9OworCitlbnVtIFhNTF9Db250ZW50X1F1YW50IHsKKyAgWE1MX0NRVUFOVF9OT05FLAorICBYTUxfQ1FVQU5UX09QVCwKKyAgWE1MX0NRVUFOVF9SRVAsCisgIFhNTF9DUVVBTlRfUExVUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgWE1MX2NwIFhNTF9Db250ZW50OworCitzdHJ1Y3QgWE1MX2NwIHsKKyAgZW51bSBYTUxfQ29udGVudF9UeXBlICAgICAgICAgdHlwZTsKKyAgZW51bSBYTUxfQ29udGVudF9RdWFudCAgICAgICAgcXVhbnQ7CisgIFhNTF9DaGFyICogICAgICAgICAgICAgICAgICAgIG5hbWU7CisgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgIG51bWNoaWxkcmVuOworICBYTUxfQ29udGVudCAqICAgICAgICAgICAgICAgICBjaGlsZHJlbjsKK307CisKKwordHlwZWRlZiB2b2lkICgqWE1MX0VsZW1lbnREZWNsSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Db250ZW50ICptb2RlbCk7CisKK3ZvaWQKK1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbGVtZW50RGVjbEhhbmRsZXIgZWxkZWNsKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX0F0dGxpc3REZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICAqZWxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICphdHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICphdHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICAqZGZsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgaXNyZXF1aXJlZCk7CisKK3ZvaWQKK1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9BdHRsaXN0RGVjbEhhbmRsZXIgYXR0ZGVjbCk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9YbWxEZWNsSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc3RhbmRhbG9uZSk7CisKK3ZvaWQKK1hNTF9TZXRYbWxEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfWG1sRGVjbEhhbmRsZXIgeG1sZGVjbCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkICooKm1hbGxvY19mY24pKHNpemVfdCBzaXplKTsKKyAgdm9pZCAqKCpyZWFsbG9jX2Zjbikodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgKCpmcmVlX2Zjbikodm9pZCAqcHRyKTsKK30gWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZTsKKworWE1MX1BhcnNlcgorWE1MX1BhcnNlckNyZWF0ZShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworCitYTUxfUGFyc2VyCitYTUxfUGFyc2VyQ3JlYXRlTlMoY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLCBYTUxfQ2hhciBuYW1lc3BhY2VTZXBhcmF0b3IpOworCisKK1hNTF9QYXJzZXIKK1hNTF9QYXJzZXJDcmVhdGVfTU0oY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptZW1zdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWVzcGFjZVNlcGFyYXRvcik7CisKK1hNTF9Cb29sCitYTUxfUGFyc2VyUmVzZXQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9TdGFydEVsZW1lbnRIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfRW5kRWxlbWVudEhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lKTsKKworCit0eXBlZGVmIHZvaWQgKCpYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZGF0YSk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9Db21tZW50SGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRhdGEpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKSAodm9pZCAqdXNlckRhdGEpOwordHlwZWRlZiB2b2lkICgqWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9EZWZhdWx0SGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX1N0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZG9jdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX2ludGVybmFsX3N1YnNldCk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX0VudGl0eURlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbnRpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3BhcmFtZXRlcl9lbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lKTsKKwordm9pZAorWE1MX1NldEVudGl0eURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbnRpdHlEZWNsSGFuZGxlciBoYW5kbGVyKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfTm90YXRpb25EZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpOworCit0eXBlZGVmIHZvaWQgKCpYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnVyaSk7CisKK3R5cGVkZWYgdm9pZCAoKlhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4KTsKKwordHlwZWRlZiBpbnQgKCpYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSk7CisKK3R5cGVkZWYgaW50ICgqWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKTsKKwordHlwZWRlZiB2b2lkICgqWE1MX1NraXBwZWRFbnRpdHlIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbnRpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3BhcmFtZXRlcl9lbnRpdHkpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBtYXBbMjU2XTsKKyAgdm9pZCAqZGF0YTsKKyAgaW50ICgqY29udmVydCkodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqcyk7CisgIHZvaWQgKCpyZWxlYXNlKSh2b2lkICpkYXRhKTsKK30gWE1MX0VuY29kaW5nOworCit0eXBlZGVmIGludCAoKlhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5jb2RpbmcgKmluZm8pOworCit2b2lkCitYTUxfU2V0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCk7CisKK3ZvaWQKK1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgaGFuZGxlcik7CisKK3ZvaWQKK1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgaGFuZGxlcik7Cit2b2lkCitYTUxfU2V0Q29tbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbW1lbnRIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpOworCit2b2lkCitYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIHN0YXJ0KTsKKwordm9pZAorWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpOworCit2b2lkCitYTUxfU2V0RGVmYXVsdEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKTsKKwordm9pZAorWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCk7CisKK3ZvaWQKK1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKTsKKwordm9pZAorWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciBoYW5kbGVyKTsKKwordm9pZAorWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfTm90YXRpb25EZWNsSGFuZGxlciBoYW5kbGVyKTsKKwordm9pZAorWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpOworCit2b2lkCitYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0KTsKKwordm9pZAorWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpOworCit2b2lkCitYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX05vdFN0YW5kYWxvbmVIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCit2b2lkCitYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1NraXBwZWRFbnRpdHlIYW5kbGVyIGhhbmRsZXIpOworCit2b2lkCitYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhKTsKKwordm9pZAorWE1MX0RlZmF1bHRDdXJyZW50KFhNTF9QYXJzZXIgcGFyc2VyKTsKKwordm9pZAorWE1MX1NldFJldHVybk5TVHJpcGxldChYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCk7CisKK3ZvaWQKK1hNTF9TZXRVc2VyRGF0YShYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqdXNlckRhdGEpOworCisjZGVmaW5lIFhNTF9HZXRVc2VyRGF0YShwYXJzZXIpICgqKHZvaWQgKiopKHBhcnNlcikpCisKK2VudW0gWE1MX1N0YXR1cworWE1MX1NldEVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworCit2b2lkCitYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcGFyc2VyKTsKKworZW51bSBYTUxfRXJyb3IKK1hNTF9Vc2VGb3JlaWduRFREKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCB1c2VEVEQpOworCisKK2VudW0gWE1MX1N0YXR1cworWE1MX1NldEJhc2UoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICpiYXNlKTsKKworY29uc3QgWE1MX0NoYXIgKgorWE1MX0dldEJhc2UoWE1MX1BhcnNlciBwYXJzZXIpOworCitpbnQKK1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudChYTUxfUGFyc2VyIHBhcnNlcik7CisKK2ludAorWE1MX0dldElkQXR0cmlidXRlSW5kZXgoWE1MX1BhcnNlciBwYXJzZXIpOworCitlbnVtIFhNTF9TdGF0dXMKK1hNTF9QYXJzZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGlzRmluYWwpOworCit2b2lkICoKK1hNTF9HZXRCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pOworCitlbnVtIFhNTF9TdGF0dXMKK1hNTF9QYXJzZUJ1ZmZlcihYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbiwgaW50IGlzRmluYWwpOworCitlbnVtIFhNTF9TdGF0dXMKK1hNTF9TdG9wUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCByZXN1bWFibGUpOworCitlbnVtIFhNTF9TdGF0dXMKK1hNTF9SZXN1bWVQYXJzZXIoWE1MX1BhcnNlciBwYXJzZXIpOworCitlbnVtIFhNTF9QYXJzaW5nIHsKKyAgWE1MX0lOSVRJQUxJWkVELAorICBYTUxfUEFSU0lORywKKyAgWE1MX0ZJTklTSEVELAorICBYTUxfU1VTUEVOREVECit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGVudW0gWE1MX1BhcnNpbmcgcGFyc2luZzsKKyAgWE1MX0Jvb2wgZmluYWxCdWZmZXI7Cit9IFhNTF9QYXJzaW5nU3RhdHVzOworCit2b2lkCitYTUxfR2V0UGFyc2luZ1N0YXR1cyhYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1BhcnNpbmdTdGF0dXMgKnN0YXR1cyk7CisKK1hNTF9QYXJzZXIKK1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworCitlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgeworICBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVIsCisgIFhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19VTkxFU1NfU1RBTkRBTE9ORSwKKyAgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUworfTsKKworaW50CitYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgcGFyc2luZyk7CisKK2VudW0gWE1MX0Vycm9yCitYTUxfR2V0RXJyb3JDb2RlKFhNTF9QYXJzZXIgcGFyc2VyKTsKKworaW50IFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7CitpbnQgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpOworbG9uZyBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcik7CisKK2ludAorWE1MX0dldEN1cnJlbnRCeXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpOworCitjb25zdCBjaGFyICoKK1hNTF9HZXRJbnB1dENvbnRleHQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpOworCisjZGVmaW5lIFhNTF9HZXRFcnJvckxpbmVOdW1iZXIgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIKKyNkZWZpbmUgWE1MX0dldEVycm9yQ29sdW1uTnVtYmVyIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyCisjZGVmaW5lIFhNTF9HZXRFcnJvckJ5dGVJbmRleCAgICBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleAorCit2b2lkCitYTUxfRnJlZUNvbnRlbnRNb2RlbChYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NvbnRlbnQgKm1vZGVsKTsKKwordm9pZCAqCitYTUxfTWVtTWFsbG9jKFhNTF9QYXJzZXIgcGFyc2VyLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgKgorWE1MX01lbVJlYWxsb2MoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworCit2b2lkCitYTUxfTWVtRnJlZShYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqcHRyKTsKKwordm9pZAorWE1MX1BhcnNlckZyZWUoWE1MX1BhcnNlciBwYXJzZXIpOworCitjb25zdCBYTUxfTENoYXIgKgorWE1MX0Vycm9yU3RyaW5nKGVudW0gWE1MX0Vycm9yIGNvZGUpOworCitjb25zdCBYTUxfTENoYXIgKgorWE1MX0V4cGF0VmVyc2lvbih2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbWFqb3I7CisgIGludCBtaW5vcjsKKyAgaW50IG1pY3JvOworfSBYTUxfRXhwYXRfVmVyc2lvbjsKKworWE1MX0V4cGF0X1ZlcnNpb24gCitYTUxfRXhwYXRWZXJzaW9uSW5mbyh2b2lkKTsKKworZW51bSBYTUxfRmVhdHVyZUVudW0geworICBYTUxfRkVBVFVSRV9FTkQgPSAwLAorICBYTUxfRkVBVFVSRV9VTklDT0RFLAorICBYTUxfRkVBVFVSRV9VTklDT0RFX1dDSEFSX1QsCisgIFhNTF9GRUFUVVJFX0RURCwKKyAgWE1MX0ZFQVRVUkVfQ09OVEVYVF9CWVRFUywKKyAgWE1MX0ZFQVRVUkVfTUlOX1NJWkUsCisgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUiwKKyAgWE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUiwKKyAgWE1MX0ZFQVRVUkVfTlMsCisgIFhNTF9GRUFUVVJFX0xBUkdFX1NJWkUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfRmVhdHVyZUVudW0gIGZlYXR1cmU7CisgIGNvbnN0IFhNTF9MQ2hhciAgICAgICAqbmFtZTsKKyAgbG9uZyBpbnQgICAgICAgICAgICAgIHZhbHVlOworfSBYTUxfRmVhdHVyZTsKKworY29uc3QgWE1MX0ZlYXR1cmUgKgorWE1MX0dldEZlYXR1cmVMaXN0KHZvaWQpOworCisKKyNkZWZpbmUgWE1MX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBYTUxfTUlOT1JfVkVSU0lPTiAwCisjZGVmaW5lIFhNTF9NSUNST19WRVJTSU9OIDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fR05VQ19fCisgICAjaWZkZWYgX19QUENfXworICAgICNwcmFnbWEgcGFjaygpCisgICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19WQkNDX18pCisgICAjcHJhZ21hIGRlZmF1bHQtYWxpZ24KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmICAvKiBFWFBBVF9FWFBBVF9IICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9hbWlnYS9pbmNsdWRlL3Byb3RvL2V4cGF0LmggYi9leHBhdC0yLjAuMS9hbWlnYS9pbmNsdWRlL3Byb3RvL2V4cGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTBiZjYyYwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2FtaWdhL2luY2x1ZGUvcHJvdG8vZXhwYXQuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIFBST1RPX0VYUEFUX0gKKyNkZWZpbmUgUFJPVE9fRVhQQVRfSAorCisjaWZuZGVmIExJQlJBUklFU19FWFBBVF9ICisjaW5jbHVkZSA8bGlicmFyaWVzL2V4cGF0Lmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19OT0xJQkJBU0VfXworICNpZm5kZWYgX19VU0VfQkFTRVRZUEVfXworICBleHRlcm4gc3RydWN0IExpYnJhcnkgKiBFeHBhdEJhc2U7CisgI2Vsc2UKKyAgZXh0ZXJuIHN0cnVjdCBMaWJyYXJ5ICogRXhwYXRCYXNlOworICNlbmRpZiAvKiBfX1VTRV9CQVNFVFlQRV9fICovCisjZW5kaWYgLyogX19OT0xJQkJBU0VfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fYW1pZ2FvczRfXworICNpbmNsdWRlIDxpbnRlcmZhY2VzL2V4cGF0Lmg+CisgI2lmZGVmIF9fVVNFX0lOTElORV9fCisgICNpbmNsdWRlIDxpbmxpbmU0L2V4cGF0Lmg+CisgI2VuZGlmIC8qIF9fVVNFX0lOTElORV9fICovCisgI2lmbmRlZiBDTElCX0VYUEFUX1BST1RPU19ICisgICNkZWZpbmUgQ0xJQl9FWFBBVF9QUk9UT1NfSCAxCisgI2VuZGlmIC8qIENMSUJfRVhQQVRfUFJPVE9TX0ggKi8KKyAjaWZuZGVmIF9fTk9HTE9CQUxJRkFDRV9fCisgIGV4dGVybiBzdHJ1Y3QgRXhwYXRJRmFjZSAqSUV4cGF0OworICNlbmRpZiAvKiBfX05PR0xPQkFMSUZBQ0VfXyAqLworI2Vsc2UgLyogX19hbWlnYW9zNF9fICovCisgI2lmbmRlZiBDTElCX0VYUEFUX1BST1RPU19ICisgICNpbmNsdWRlIDxjbGliL2V4cGF0X3Byb3Rvcy5oPgorICNlbmRpZiAvKiBDTElCX0VYUEFUX1BST1RPU19IICovCisgI2lmIGRlZmluZWQoX19HTlVDX18pCisgICNpZm5kZWYgX19QUENfXworICAgI2luY2x1ZGUgPGlubGluZS9leHBhdC5oPgorICAjZWxzZQorICAgI2luY2x1ZGUgPHBwY2lubGluZS9leHBhdC5oPgorICAjZW5kaWYgLyogX19QUENfXyAqLworICNlbGlmIGRlZmluZWQoX19WQkNDX18pCisgICNpZm5kZWYgX19QUENfXworICAgI2luY2x1ZGUgPGlubGluZS9leHBhdF9wcm90b3MuaD4KKyAgI2VuZGlmIC8qIF9fUFBDX18gKi8KKyAjZWxzZQorICAjaW5jbHVkZSA8cHJhZ21hcy9leHBhdF9wcmFnbWFzLmg+CisgI2VuZGlmIC8qIF9fR05VQ19fICovCisjZW5kaWYgLyogX19hbWlnYW9zNF9fICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogUFJPVE9fRVhQQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYW1pZ2EvbGF1bmNoLmMgYi9leHBhdC0yLjAuMS9hbWlnYS9sYXVuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43M2U1MjZlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYW1pZ2EvbGF1bmNoLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyoqIENvcHlyaWdodCAoYykgMjAwMS0yMDA3IEV4cGF0IG1haW50YWluZXJzLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworKiogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKiogCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisqKiAKKyoqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwcm90by9leGVjLmg+CisKK3N0cnVjdCBMaWJyYXJ5KiBFeHBhdEJhc2UgPSAwOworc3RydWN0IEV4cGF0SUZhY2UqIElFeHBhdCA9IDA7CisKKwordm9pZCBzZXR1cCgpIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSk7Cit2b2lkIGNsZWFudXAoKSBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKSk7CisKKwordm9pZCBzZXR1cCgpCit7CisJRXhwYXRCYXNlID0gT3BlbkxpYnJhcnkoImV4cGF0LmxpYnJhcnkiLCA0KTsKKwlJRXhwYXQgPSAoc3RydWN0IEV4cGF0SUZhY2UqKUdldEludGVyZmFjZShFeHBhdEJhc2UsICJtYWluIiwgMSwgTlVMTCk7CisJaWYgKCBJRXhwYXQgPT0gMCApICB7CisJCURlYnVnUHJpbnRGKCJDYW4ndCBvcGVuIGV4cGF0LmxpYnJhcnlcbiIpOworCX0KK30KKworCit2b2lkIGNsZWFudXAoKQoreworCWlmICggSUV4cGF0ICE9IDAgKSAgeworCQlEcm9wSW50ZXJmYWNlKChzdHJ1Y3QgSW50ZXJmYWNlKilJRXhwYXQpOworCQlJRXhwYXQgPSAwOworCX0KKworCWlmICggRXhwYXRCYXNlICE9IDAgKSAgeworCQlDbG9zZUxpYnJhcnkoRXhwYXRCYXNlKTsKKwkJRXhwYXRCYXNlID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9hbWlnYS9zdGRsaWIuYyBiL2V4cGF0LTIuMC4xL2FtaWdhL3N0ZGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjMzFmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9hbWlnYS9zdGRsaWIuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyoqIENvcHlyaWdodCAoYykgMjAwMS0yMDA3IEV4cGF0IG1haW50YWluZXJzLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworKiogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKiogCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisqKiAKKyoqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxleGVjL21lbW9yeS5oPgorI2luY2x1ZGUgPHByb3RvL2V4ZWMuaD4KKyNpbmNsdWRlIDxwcm90by91dGlsaXR5Lmg+CisKK3ZvaWQgKiBtYWxsb2MgKHNpemVfdCBsZW4pCit7CisJdWludDMyIHNpemUgPSBzaXplb2YodWludDMyKSArIGxlbjsKKworCXVpbnQzMiAqbWVtID0gQWxsb2NNZW0oc2l6ZSwgTUVNRl9TSEFSRUQpOworCWlmICggbWVtICE9IDAgKSAgeworCQkqbWVtID0gc2l6ZTsKKwkJKyttZW07CisJfQorCisJcmV0dXJuIG1lbTsKK30KKworCit2b2lkICogcmVhbGxvYyAodm9pZCAqIG1lbSwgc2l6ZV90IGxlbjIpCit7CisJaWYgKCBtZW0gPT0gMCApICB7CisJCXJldHVybiBtYWxsb2MobGVuMik7CisJfQorCisJaWYgKCBsZW4yID09IDAgKSAgeworCQlmcmVlKG1lbSk7CisJCXJldHVybiAwOworCX0KKworCXZvaWQgKiBuZXdfbWVtID0gbWFsbG9jKGxlbjIpOworCWlmICggbmV3X21lbSA9PSAwICkgIHsKKwkJcmV0dXJuIDA7CisJfQorCisJdWludDMyIG1lbV9zaXplID0gKigoKHVpbnQzMiopbWVtKSAtIDEpOworCUNvcHlNZW0obWVtLCBuZXdfbWVtLCBtZW1fc2l6ZSk7CisJZnJlZShtZW0pOworCisJcmV0dXJuIG5ld19tZW07Cit9CisKKwordm9pZCBmcmVlICh2b2lkICogbWVtKQoreworCWlmICggbWVtICE9IDAgKSAgeworCQl1aW50MzIgKiBzaXplX3B0ciA9ICgodWludDMyKiltZW0pIC0gMTsKKwkJRnJlZU1lbShzaXplX3B0ciwgKnNpemVfcHRyKTsKKwl9Cit9CisKKworaW50IG1lbWNtcCAoY29uc3Qgdm9pZCAqIGEsIGNvbnN0IHZvaWQgKiBiLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBpOworCWludCBkaWZmOworCisJZm9yICggaSA9IDA7IGkgPCBsZW47ICsraSApICB7CisJCWRpZmYgPSAqKCh1aW50OCAqKWErKykgLSAqKCh1aW50OCAqKWIrKyk7CisJCWlmICggZGlmZiApICB7CisJCQlyZXR1cm4gZGlmZjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgKiBtZW1jcHkgKHZvaWQgKiB0LCBjb25zdCB2b2lkICogYSwgc2l6ZV90IGxlbikKK3sKKwlDb3B5TWVtKChBUFRSKWEsIHQsIGxlbik7CisJcmV0dXJuIHQ7Cit9CisKKwordm9pZCAqIG1lbW1vdmUgKHZvaWQgKiB0MSwgY29uc3Qgdm9pZCAqIHQyLCBzaXplX3QgbGVuKQoreworCU1vdmVNZW0oKEFQVFIpdDIsIHQxLCBsZW4pOworCXJldHVybiB0MTsKK30KKworCit2b2lkICogbWVtc2V0ICh2b2lkICogdCwgaW50IGMsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIFNldE1lbSh0LCBjLCBsZW4pOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9SRUFETUUudHh0IGIvZXhwYXQtMi4wLjEvYmNiNS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4NmYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L1JFQURNRS50eHQKQEAgLTAsMCArMSw4NyBAQAorCisgICAgICAgICAgICAgICAgICAgVXNpbmcgYSBCb3JsYW5kIGNvbXBpbGVyIHByb2R1Y3QKKworVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHN1cHBvcnQgdXNpbmcgYm90aCB0aGUgZnJlZSBCb3JsYW5kIGNvbW1hbmQtbGluZQorY29tcGlsZXIgdG9vbHMgYW5kIHRoZSBCb3JsYW5kIEMrKyBCdWlsZGVyIElERS4gIFRoZSBwcm9qZWN0IGZpbGVzIGhhdmUgYmVlbgordGVzdGVkIHdpdGggYm90aCB2ZXJzaW9ucyA1IGFuZCA2IG9mIHRoZSBDKysgQnVpbGRlciBwcm9kdWN0LgorCisgICAgICAgICAgICAgVXNpbmcgdGhlIGZyZWUgQkNDMzIgY29tbWFuZCBsaW5lIGNvbXBpbGVyCisKK0FmdGVyIGRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBmcmVlIEMrKyBCdWlsZGVyIGNvbW1hbmRsaW5lIHZlcnNpb24sCitwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHMgKGFzc3VtaW5nIGl0IHdhcyBpbnN0YWxsZWQgdW5kZXIgQzpcQm9ybGFuZFxCQ0M1NSk6CisKKzEpIEFkZCAiQzpcQm9ybGFuZFxCQ0M1NVxCSU4iIHRvIHlvdXIgcGF0aAorMikgU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBCQ0IgdG8gIkM6XEJvcmxhbmRcQkNDNTUiLgorMykgZWRpdCBtYWtlZmlsZS5tYWs6IGVuYWJsZSBvciBjb21tZW50IG91dCB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZHMgdW5kZXIKKyAgIGNsZWFuICYgZGlzdGNsZWFuLCBkZXBlbmRpbmcgb24gd2hldGhlciB5b3VyIE9TIGNhbiB1c2UgZGVsdHJlZSAveSBvcgorICAgZGVsIC9zL2YvcS4KKworQWZ0ZXIgdGhhdCwgeW91IHNob3VsZCBzaW1wbHkgY2QgdG8gdGhlIGJjYjUgZGlyZWN0b3J5IGluIHlvdXIgRXhwYXQgZGlyZWN0b3J5Cit0cmVlIChzYW1lIHN0cnVjdHVyZSBhcyBDVlMpIGFuZCBydW4gIm1ha2UgYWxsIiBvciBqdXN0ICJtYWtlIi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWluZworCitUaGUgbGlicmFyaWVzIGhhdmUgdGhlIGJhc2UgbmFtZSAibGliZXhwYXQiIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYW4gInMiCisoc3RhdGljKSBvciBhICJ3IiAodW5pY29kZSB2ZXJzaW9uKSwgdGhlbiBhbiB1bmRlcnNjb3JlIGFuZCBvcHRpb25hbGx5CisibXQiIChtdWx0aS10aHJlYWRlZCkgYW5kICJkIiAoZHluYW1pYyBSVEwpLgorCitUbyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgYSBwcm9qZWN0IGZpbGUgcHJvZHVjZXMsIGVkaXQgdGhlIHByb2plY3QKK29wdGlvbiBzb3VyY2UgKHNlZSBzdGVwIDEgdW5kZXIgVW5pY29kZSBiZWxvdykgYW5kIGNoYW5nZSB0aGUgbmFtZSBjb250YWluZWQgaW4KK3RoZSBQUk9KRUNUIHRhZy4gSW4gYSBtYWtlIGZpbGUsIGNoYW5nZSB0aGUgdmFsdWUgYXNzaWduZWQgdG8gdGhlIFBST0pFQ1QKK3ZhcmlhYmxlLiBBbHNvLCB0aGUgTElCUkFSWSBlbnRyeSBpbiB0aGUgLmRlZiBmaWxlIGhhcyB0byBiZSBjaGFuZ2VkIHRvCitjb3JyZXNwb25kIHRvIHRoZSBuZXcgZXhlY3V0YWJsZSBuYW1lLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZSBDb25zaWRlcmF0aW9ucworCitUaGVyZSBhcmUgbm8gZmFjaWxpdGllcyBpbiB0aGUgQkNCIDUgR1VJIHRvIGNyZWF0ZSBhIHVuaWNvZGUtZW5hYmxlZAorYXBwbGljYXRpb24uIEZvcnR1bmF0ZWx5LCBpdCBpcyBub3QgaGFyZCB0byBkbyBieSBoYW5kLgorCisxLiBUaGUgc3RhcnR1cCAub2JqIHN5c3RlbSBmaWxlIG11c3QgYmUgY2hhbmdlZCB0byB0aGUgdW5pY29kZSB2ZXJzaW9uLgorICAgR28gdG8gUHJvamVjdHxFZGl0IE9wdGlvbiBTb3VyY2UsIGFuZCBzY3JvbGwgZG93biB0byB0aGUgQUxMT0JKIHRhZy4gQ2hhbmdlCisgICBjMHgzMi5vYmogdG8gYzB4MzJ3Lm9iai4gRWRpdGluZyB0aGlzIGZpbGUgY2FuIGJlIHF1aXJreSwgYnV0IHVzdWFsbHkgdGhlCisgICBmb2xsb3dpbmcga2x1ZGdlIHdpbGwgbWFrZSB0aGUgY2hhbmdlIHN0aWNrLiBDbG9zZSBhbmQgc2F2ZSB0aGUgZmlsZQorICAgKENUUkwtRjQpIHRoZW4gb3BlbiB0aGUgb3B0aW9ucyBkaWFsb2cgKENUUkwtU2hpZnQtRjExKSwgdGhlbiBjbGljayBPSyBvbgorICAgdGhlIGRpYWxvZyBpbW1lZGlhdGVseSB3aXRob3V0IGNoYW5naW5nIGFueXRoaW5nIGluIGl0LiBJZiB0aGlzIGRvZXNuJ3Qgd29yaywKKyAgIHlvdSB3aWxsIGhhdmUgdG8gY2xvc2UgdGhlIHByb2plY3QgY29tcGxldGVseSBhbmQgZWRpdCB0aGUgLmJwciBmaWxlIGJ5IGhhbmQuCisKKyAgIElmIHlvdSBhcmUgdXNpbmcgYSBtYWtlIGZpbGUsIGp1c3QgY2hhbmdlIHRoZSBzdGFydHVwIC5vYmogZmlsZSBhc3NpZ25lZAorICAgdG8gdGhlIEFMTE9CSiB2YXJpYWJsZS4KKworMi4gQWRkIHRoZSBtYWNybyBkZWZpbmUgWE1MX1VOSUNPREVfV0NIQVJfVC4gSW4gdGhlIEdVSSB0aGF0IGdvZXMgaW4gdGhlIG9wdGlvbnMKKyAgIGRpYWxvZywgRGlyZWN0b3JpZXMvQ29uZGl0aW9uYWxzIHRhYiwgaW4gdGhlIENvbmRpdGlvbmFsIGRlZmluZSBib3guIEluIGEKKyAgIG1ha2UgZmlsZSwgcHV0IGl0IGluIHRoZSBVU0VSREVGSU5FUyB2YXJpYWJsZS4KKworMy4gT2YgY291cnNlLCB5b3VyIGNvZGUgaGFzIHRvIGJlIHdyaXR0ZW4gZm9yIHVuaWNvZGUuIEFzIGEgc3RhcnQsIHRoZSAibWFpbiIKKyAgIGZ1bmN0aW9uIGlzIGNhbGxlZCAid21haW4iLiBUaGUgdGNoYXIgbWFjcm9zIGFyZSBhbiBpbnRlcmVzdGluZyB3YXkgdG8KKyAgIHdyaXRlIGNvZGUgdGhhdCBjYW4gZWFzaWx5IHN3aXRjaCBiZXR3ZWVuIHVuaWNvZGUgYW5kIHV0Zi04LiBJZiB0aGVzZSBtYWNyb3MKKyAgIGFyZSB1c2VkLCB0aGVuIHNpbXBseSBhZGRpbmcgdGhlIGNvbmRpdGlvbmFsIGRlZmluZSBfVU5JQ09ERSBhcyB3ZWxsIGFzCisgICBYTUxfVU5JQ09ERV9XQ0hBUl9UIHdpbGwgYnJpbmcgaW4gdGhlIHVuaWNvZGUgdmVyc2lvbnMgb2YgdGhlIHRjaGFyIG1hY3Jvcy4KKyAgIE90aGVyd2lzZSB0aGUgdXRmLTggdmVyc2lvbnMgYXJlIHVzZWQuIHhtbHdmIHVzZXMgaXRzIG93biB2ZXJzaW9ucyBvZiB0aGUKKyAgIHRjaGFyIG1hY3JvcyB3aGljaCBhcmUgc3dpdGNoZWQgb24gYW5kIG9mZiBieSB0aGUgWE1MX1VOSUNPREUgbWFjcm8sIHdoaWNoCisgICBpdHNlbGYgaXMgc2V0IGJ5IHRoZSBYTUxfVU5JQ09ERV9XQ0hBUl9UIGRlZmluZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkaW5nCisKK1RoZSBsaWJleHBhdCBsaWJyYXJpZXMgYXJlIGFsbCBidWlsdCB0byBsaW5rIHdpdGggdGhlIG11bHRpLXRocmVhZGVkIGR5bmFtaWMgUlRMJ3MuCitUaGF0IG1lYW5zIHRoZXkgcmVxdWlyZSBDQzMyeHhNVC5ETEwgcHJlc2VudCBvbiB0aGUgaW5zdGFsbGF0aW9uIHRhcmdldC4KK1RvIGNyZWF0ZSBzaW5nbGUtdGhyZWFkZWQgbGlicywgZG8gdGhlIGZvbGxvd2luZzoKKworMS4gVGhlIGNvbXBpbGVyIG9wdGlvbiBmb3IgbXVsdGktdGhyZWFkaW5nIG11c3QgYmUgdHVybmVkIG9mZi4gRm9sbG93aW5nIHRoZQorICAgaW5zdHJ1Y3Rpb25zIGFib3ZlIHRvIGVkaXQgdGhlIG9wdGlvbiBzb3VyY2UsIHJlbW92ZSB0aGUgLXRXTSBvcHRpb24gZnJvbQorICAgdGhlIENGTEFHMSB0YWcuIEluIGEgbWFrZSBmaWxlLCByZW1vdmUgaXQgZnJvbSB0aGUgQ0ZMQUcxIHZhcmlhYmxlLgorCisyLiBUaGUgc2luZ2xlIHRocmVhZGVkIFJUTCBtdXN0IGJlIGNhbGxlZC4gY2hhbmdlIHRoZSBSVEwgaW4gdGhlIEFMTExJQiB0YWcgb3IKKyAgIHZhcmlhYmxlIChHVUkgb3IgbWFrZWZpbGUgcmVwZWN0aXZlbHkpIHRvIHRoZSB2ZXJzaW9uIHdpdGhvdXQgdGhlICJtdCIgaW4gdGhlCisgICBuYW1lLiBGb3IgZXhhbXBsZSwgY2hhbmdlIGN3MzJtdGkubGliIHRvIGN3MzJpLmxpYi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljIFJUTCdzCisKK1RvIGJ1aWxkIHRoZSBsaWJzIHdpdGggc3RhdGljIFJUTCdzIGRvIHRoZSBmb2xsb3dpbmcsCisKKzEuIEZvciB0aGUgc3RhdGljIGV4cGF0bGlicywgaW4gdGhlIFRsaWIgdGFiIG9uIHRoZSBvcHRpb25zIGRpYWxvZywgdW5jaGVjayB0aGUKKyAgICJVc2UgZHluYW1pYyBSVEwiIGJveC4gRm9yIHRoZSBkeW5hbWljIGV4cGF0bGlicywgaW4gdGhlIExpbmtlciB0YWIgb24gdGhlCisgICBvcHRpb25zIGRpYWxvZywgdW5jaGVjayAiVXNlIGR5bmFtaWMgUlRMIi4gSWYgeW91IGFyZSB1c2luZyBhIG1ha2UgZmlsZSwKKyAgIHJlbW92ZSB0aGUgX1JUTERMTCBhc3NpZ25tZW50IHRvIHRoZSBTWVNERUZJTkVTIHZhcmlhYmxlLCBhbmQgY2hhbmdlIHRoZSBSVEwKKyAgIHRvIHRoZSB2ZXJzaW9uIHdpdGhvdXQgYW4gImkiIGluIHRoZSBBTExMSUIgdmFyaWFibGUuIEZvciBleGFtcGxlLAorICAgY3czMm10aS5saWIgd291bGQgYmVjb21lIGN3MzJtdC5saWIuCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2FsbF9wcm9qZWN0cy5icGcgYi9leHBhdC0yLjAuMS9iY2I1L2FsbF9wcm9qZWN0cy5icGcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjdjOWExYwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvYWxsX3Byb2plY3RzLmJwZwpAQCAtMCwwICsxLDQ5IEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitWRVJTSU9OID0gQldTLjAxCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWZuZGVmIFJPT1QKK1JPT1QgPSAkKE1BS0VESVIpXC4uCishZW5kaWYKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01BS0UgPSAkKFJPT1QpXGJpblxtYWtlLmV4ZSAtJChNQUtFRkxBR1MpIC1mJCoqCitEQ0MgPSAkKFJPT1QpXGJpblxkY2MzMi5leGUgJCoqCitCUkNDID0gJChST09UKVxiaW5cYnJjYzMyLmV4ZSAkKioKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0pFQ1RTID0gc2V0dXAgbGliZXhwYXRfbXRkLmRsbCBsaWJleHBhdHNfbXRkLmxpYiBsaWJleHBhdHdfbXRkLmRsbCBcCisgIGxpYmV4cGF0d3NfbXRkLmxpYiBlbGVtZW50cy5leGUgb3V0bGluZS5leGUgeG1sd2YuZXhlCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWZhdWx0OiAkKFBST0pFQ1RTKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitsaWJleHBhdF9tdGQuZGxsOiBleHBhdC5icHIKKyAgJChST09UKVxiaW5cYnByMm1hayAkKioKKyAgJChST09UKVxiaW5cbWFrZSAtJChNQUtFRkxBR1MpIC1mJCoubWFrCisKK2xpYmV4cGF0c19tdGQubGliOiBleHBhdF9zdGF0aWMuYnByCisgICQoUk9PVClcYmluXGJwcjJtYWsgLXQkKFJPT1QpXGJpblxkZWZsaWIuYm1rICQqKgorICAkKFJPT1QpXGJpblxtYWtlIC0kKE1BS0VGTEFHUykgLWYkKi5tYWsKKworbGliZXhwYXR3X210ZC5kbGw6IGV4cGF0dy5icHIKKyAgJChST09UKVxiaW5cYnByMm1hayAkKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgJChST09UKVxiaW5cbWFrZSAtJChNQUtFRkxBR1MpIC1mJCoubWFrCisKK2xpYmV4cGF0d3NfbXRkLmxpYjogZXhwYXR3X3N0YXRpYy5icHIKKyAgJChST09UKVxiaW5cYnByMm1hayAtdCQoUk9PVClcYmluXGRlZmxpYi5ibWsgJCoqCisgICQoUk9PVClcYmluXG1ha2UgLSQoTUFLRUZMQUdTKSAtZiQqLm1haworCitlbGVtZW50cy5leGU6IGVsZW1lbnRzLmJwcgorICAkKFJPT1QpXGJpblxicHIybWFrICQqKgorICAkKFJPT1QpXGJpblxtYWtlIC0kKE1BS0VGTEFHUykgLWYkKi5tYWsKKworb3V0bGluZS5leGU6IG91dGxpbmUuYnByCisgICQoUk9PVClcYmluXGJwcjJtYWsgJCoqCisgICQoUk9PVClcYmluXG1ha2UgLSQoTUFLRUZMQUdTKSAtZiQqLm1haworCit4bWx3Zi5leGU6IHhtbHdmLmJwcgorICAkKFJPT1QpXGJpblxicHIybWFrICQqKgorICAkKFJPT1QpXGJpblxtYWtlIC0kKE1BS0VGTEFHUykgLWYkKi5tYWsKKworc2V0dXA6IHNldHVwLmJhdAorICBjYWxsICQqKgorCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZWxlbWVudHMuYnBmIGIvZXhwYXQtMi4wLjEvYmNiNS9lbGVtZW50cy5icGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWMxZTg3OAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZWxlbWVudHMuYnBmCkBAIC0wLDAgKzEsNCBAQAorVVNFVU5JVCgiLi5cZXhhbXBsZXNcZWxlbWVudHMuYyIpOworVVNFTElCKCJSZWxlYXNlXGxpYmV4cGF0c19tdGQubGliIik7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFpbgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9lbGVtZW50cy5icHIgYi9leHBhdC0yLjAuMS9iY2I1L2VsZW1lbnRzLmJwcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMjFjMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9lbGVtZW50cy5icHIKQEAgLTAsMCArMSwxNDkgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgorPCEtLSBDKytCdWlsZGVyIFhNTCBQcm9qZWN0IC0tPgorPFBST0pFQ1Q+CisgIDxNQUNST1M+CisgICAgPFZFUlNJT04gdmFsdWU9IkJDQi4wNS4wMyIvPgorICAgIDxQUk9KRUNUIHZhbHVlPSJSZWxlYXNlXGVsZW1lbnRzLmV4ZSIvPgorICAgIDxPQkpGSUxFUyB2YWx1ZT0iUmVsZWFzZVxvYmpcZXhhbXBsZXNcZWxlbWVudHMub2JqIi8+CisgICAgPFJFU0ZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExHRU5GSUxFUyB2YWx1ZT0iIi8+CisgICAgPERFRkZJTEUgdmFsdWU9IiIvPgorICAgIDxSRVNERVBFTiB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8TElCRklMRVMgdmFsdWU9IlJlbGVhc2VcbGliZXhwYXRzX210ZC5saWIiLz4KKyAgICA8TElCUkFSSUVTIHZhbHVlPSIiLz4KKyAgICA8U1BBUkVMSUJTIHZhbHVlPSIiLz4KKyAgICA8UEFDS0FHRVMgdmFsdWU9IlZDTDUwLmJwaSBWQ0xYNTAuYnBpIGJjYnNtcDUwLmJwaSBRUlBUNTAuYnBpIFZDTERCNTAuYnBpIFZDTEJERTUwLmJwaSAKKyAgICAgIGlic21wNTAuYnBpIFZDTERCWDUwLmJwaSBURUVVSTUwLmJwaSBURUVEQjUwLmJwaSBURUU1MC5icGkgVEVFUVI1MC5icGkgCisgICAgICBWQ0xJQjUwLmJwaSBiY2JpZTUwLmJwaSBWQ0xJRTUwLmJwaSBJTkVUREI1MC5icGkgSU5FVDUwLmJwaSBOTUZBU1Q1MC5icGkgCisgICAgICBkY2xvY3g1MC5icGkgYmNiMmtheHNlcnZlcjUwLmJwaSBkY2x1c3I1MC5icGkiLz4KKyAgICA8UEFUSENQUCB2YWx1ZT0iLjsuLlxleGFtcGxlcyIvPgorICAgIDxQQVRIUEFTIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIUkMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhBU00gdmFsdWU9Ii47Ii8+CisgICAgPERFQlVHTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxkZWJ1ZyIvPgorICAgIDxSRUxFQVNFTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxyZWxlYXNlIi8+CisgICAgPExJTktFUiB2YWx1ZT0iaWxpbmszMiIvPgorICAgIDxVU0VSREVGSU5FUyB2YWx1ZT0iV0lOMzI7TkRFQlVHO19DT05TT0xFO1hNTF9TVEFUSUMiLz4KKyAgICA8U1lTREVGSU5FUyB2YWx1ZT0iX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTCIvPgorICAgIDxNQUlOU09VUkNFIHZhbHVlPSJlbGVtZW50cy5icGYiLz4KKyAgICA8SU5DTFVERVBBVEggdmFsdWU9Ii4uXGV4YW1wbGVzOyQoQkNCKVxpbmNsdWRlIi8+CisgICAgPExJQlBBVEggdmFsdWU9Ii4uXGV4YW1wbGVzOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkiLz4KKyAgICA8V0FSTklOR1MgdmFsdWU9Ii13LXBhciAtdy04MDI3IC13LTgwMjYiLz4KKyAgPC9NQUNST1M+CisgIDxPUFRJT05TPgorICAgIDxJRExDRkxBR1MgdmFsdWU9Ii1JJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8Q0ZMQUcxIHZhbHVlPSItTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC10V00gLUkuLlxsaWIgLWMiLz4KKyAgICA8UEZMQUdTIHZhbHVlPSItTjJSZWxlYXNlXG9ialxleGFtcGxlcyAtTjBSZWxlYXNlXG9ialxleGFtcGxlcyAtJFktIC0kTC0gLSRELSIvPgorICAgIDxSRkxBR1MgdmFsdWU9Ii9sIDB4NDA5IC9kICZxdW90O05ERUJVRyZxdW90OyAvaSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPEFGTEFHUyB2YWx1ZT0iL214IC93MiAvem4iLz4KKyAgICA8TEZMQUdTIHZhbHVlPSItSVJlbGVhc2Vcb2JqXGV4YW1wbGVzIC1EJnF1b3Q7JnF1b3Q7IC1hcCAtVHBlIC14IC1HbiAtcSAtTC4uXExJQlxSRUxFQVNFX1NUQVRJQyIvPgorICA8L09QVElPTlM+CisgIDxMSU5LRVI+CisgICAgPEFMTE9CSiB2YWx1ZT0iYzB4MzIub2JqICQoT0JKRklMRVMpIi8+CisgICAgPEFMTFJFUyB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8QUxMTElCIHZhbHVlPSIkKExJQkZJTEVTKSAkKExJQlJBUklFUykgaW1wb3J0MzIubGliIGN3MzJtdGkubGliIi8+CisgIDwvTElOS0VSPgorICA8SURFT1BUSU9OUz4KK1tWZXJzaW9uIEluZm9dCitJbmNsdWRlVmVySW5mbz0wCitBdXRvSW5jQnVpbGQ9MAorTWFqb3JWZXI9MQorTWlub3JWZXI9MAorUmVsZWFzZT0wCitCdWlsZD0wCitEZWJ1Zz0wCitQcmVSZWxlYXNlPTAKK1NwZWNpYWw9MAorUHJpdmF0ZT0wCitETEw9MAorTG9jYWxlPTEwMzMKK0NvZGVQYWdlPTEyNTIKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbSGlzdG9yeUxpc3RzXGhsSW5jbHVkZVBhdGhdCitDb3VudD00CitJdGVtMD0uLlxleGFtcGxlczskKEJDQilcaW5jbHVkZQorSXRlbTE9JChCQ0IpXGluY2x1ZGUKK0l0ZW0yPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGwKK0l0ZW0zPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGw7CisKK1tIaXN0b3J5TGlzdHNcaGxMaWJyYXJ5UGF0aF0KK0NvdW50PTgKK0l0ZW0wPS4uXGV4YW1wbGVzOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0xPS4uXGV4YW1wbGVzOyQoQkNCKVxsaWI7Li5cZXhhbXBsZXNcJChSRUxFQVNFTElCUEFUSCkKK0l0ZW0yPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0zPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7Li5cbGliXFJlbGVhc2Utd19zdGF0aWMKK0l0ZW00PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7Li5cbGliXFJlbGVhc2Vfc3RhdGljCitJdGVtNT0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpO0M6XHNyY1xleHBhdFxsaWJcUmVsZWFzZV9zdGF0aWMKK0l0ZW02PSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7JChCQ0IpXGxpYlxwc2RrCitJdGVtNz0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOzskKEJDQilcbGliXHBzZGs7CisKK1tIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCitDb3VudD0xCitJdGVtMD0kKEJDQilcc291cmNlXHZjbAorCitbSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQorQ291bnQ9MTcKK0l0ZW0wPVdJTjMyO05ERUJVRztfQ09OU09MRTtYTUxfU1RBVElDCitJdGVtMT1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X0RFQlVHO1hNTF9TVEFUSUMKK0l0ZW0yPVdJTjMyO05ERUJVRztfQ09OU09MRTtfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVDtfVU5JQ09ERTtYTUxfU1RBVElDCitJdGVtMz1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1Q7X1VOSUNPREUKK0l0ZW00PVdJTjMyO05ERUJVRztfQ09OU09MRTtfREVCVUcKK0l0ZW01PVdJTjMyO05ERUJVRztfQ09OU09MRTtYTUxfU1RBVElDO19ERUJVRworSXRlbTY9V0lOMzI7TkRFQlVHO19DT05TT0xFO1hNTF9TVEFUSUM7X0RFQlVHO19VTklDT0RFCitJdGVtNz1XSU4zMjtOREVCVUc7X0NPTlNPTEU7WE1MX1NUQVRJQztfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTg9V0lOMzI7TkRFQlVHO19DT05TT0xFO19NQkNTO1hNTF9TVEFUSUM7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW05PVdJTjMyO05ERUJVRztfQ09OU09MRTtfVU5JQ09ERTtYTUxfU1RBVElDO19ERUJVRztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMTA9V0lOMzI7TkRFQlVHO19DT05TT0xFO19VTklDT0RFO1hNTF9TVEFUSUM7X0RFQlVHO1hNTF9VTklDT0RFCitJdGVtMTE9V0lOMzI7TkRFQlVHO19DT05TT0xFO19NQkNTO1hNTF9TVEFUSUM7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1Q7X19XQ0hBUl9UCitJdGVtMTI9V0lOMzI7TkRFQlVHO19DT05TT0xFO19NQkNTO1hNTF9TVEFUSUM7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1Q7X1VOSUNPREUKK0l0ZW0xMz1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X01CQ1M7WE1MX1NUQVRJQztfREVCVUc7WE1MX1VOSUNPREU7X1VOSUNPREUKK0l0ZW0xND1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X01CQ1M7WE1MX1NUQVRJQztfREVCVUc7WE1MX1VOSUNPREUKK0l0ZW0xNT1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X01CQ1M7WE1MX1NUQVRJQztfREVCVUcKK0l0ZW0xNj1XSU4zMjtOREVCVUc7X0NPTlNPTEU7X01CQ1M7WE1MX1NUQVRJQworCitbSGlzdG9yeUxpc3RzXGhsSW50T3V0cHV0RGlyXQorQ291bnQ9NQorSXRlbTA9UmVsZWFzZVxvYmpcZXhhbXBsZXMKK0l0ZW0xPVJlbGVhc2Vcb2JqXGVsZW1lbnRzCitJdGVtMj1SZWxlYXNlXG9ialxtdHMKK0l0ZW0zPS4uXGV4YW1wbGVzXFJlbGVhc2UKK0l0ZW00PVJlbGVhc2UKKworW0hpc3RvcnlMaXN0c1xobEZpbmFsT3V0cHV0RGlyXQorQ291bnQ9MQorSXRlbTA9UmVsZWFzZVwKKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0KKworW1BhcmFtZXRlcnNdCitSdW5QYXJhbXM9CitIb3N0QXBwbGljYXRpb249CitSZW1vdGVIb3N0PQorUmVtb3RlUGF0aD0KK1JlbW90ZURlYnVnPTAKKworW0NvbXBpbGVyXQorU2hvd0luZm9Nc2dzPTAKK0xpbmtEZWJ1Z1ZjbD0wCitMaW5rQ0dMSUI9MAorCitbTGFuZ3VhZ2VdCitBY3RpdmVMYW5nPQorUHJvamVjdExhbmc9CitSb290RGlyPQorICA8L0lERU9QVElPTlM+Cis8L1BST0pFQ1Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9lbGVtZW50cy5tYWsgYi9leHBhdC0yLjAuMS9iY2I1L2VsZW1lbnRzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDQyN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9lbGVtZW50cy5tYWsKQEAgLTAsMCArMSwxODYgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgISRkKEJDQikKK0JDQiA9ICQoTUFLRURJUilcLi4KKyFlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJREUgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IG1ha2VmaWxlIGlzIG1hbmFnZWQgYnkgdGhlIEJDQiBJREUuCisjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgSURFIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGlzCisjIHNlY3Rpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWRVJTSU9OID0gQkNCLjA1LjAzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVCA9IFJlbGVhc2VcZWxlbWVudHMuZXhlCitPQkpGSUxFUyA9IFJlbGVhc2Vcb2JqXGV4YW1wbGVzXGVsZW1lbnRzLm9iagorUkVTRklMRVMgPSAKK01BSU5TT1VSQ0UgPSBlbGVtZW50cy5icGYKK1JFU0RFUEVOID0gJChSRVNGSUxFUykKK0xJQkZJTEVTID0gUmVsZWFzZVxsaWJleHBhdHNfbXRkLmxpYgorSURMRklMRVMgPSAKK0lETEdFTkZJTEVTID0gCitMSUJSQVJJRVMgPSAKK1BBQ0tBR0VTID0gVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIFwKKyAgICBpYnNtcDUwLmJwaSBWQ0xEQlg1MC5icGkgVEVFVUk1MC5icGkgVEVFREI1MC5icGkgVEVFNTAuYnBpIFRFRVFSNTAuYnBpIFwKKyAgICBWQ0xJQjUwLmJwaSBiY2JpZTUwLmJwaSBWQ0xJRTUwLmJwaSBJTkVUREI1MC5icGkgSU5FVDUwLmJwaSBOTUZBU1Q1MC5icGkgXAorICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaQorU1BBUkVMSUJTID0gCitERUZGSUxFID0gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUEFUSENQUCA9IC47Li5cZXhhbXBsZXMKK1BBVEhBU00gPSAuOworUEFUSFBBUyA9IC47CitQQVRIUkMgPSAuOworREVCVUdMSUJQQVRIID0gJChCQ0IpXGxpYlxkZWJ1ZworUkVMRUFTRUxJQlBBVEggPSAkKEJDQilcbGliXHJlbGVhc2UKK1VTRVJERUZJTkVTID0gV0lOMzI7TkRFQlVHO19DT05TT0xFO1hNTF9TVEFUSUMKK1NZU0RFRklORVMgPSBfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMCitJTkNMVURFUEFUSCA9IC4uXGV4YW1wbGVzOyQoQkNCKVxpbmNsdWRlCitMSUJQQVRIID0gLi5cZXhhbXBsZXM7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorV0FSTklOR1M9IC13LXBhciAtdy04MDI3IC13LTgwMjYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDRkxBRzEgPSAtTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC1JLi5cbGliIC1jCitJRExDRkxBR1MgPSAtSSQoQkNCKVxpbmNsdWRlCitQRkxBR1MgPSAtTjJSZWxlYXNlXG9ialxleGFtcGxlcyAtTjBSZWxlYXNlXG9ialxleGFtcGxlcyAtJFktIC0kTC0gLSRELQorUkZMQUdTID0gL2wgMHg0MDkgL2QgIk5ERUJVRyIgL2kkKEJDQilcaW5jbHVkZQorQUZMQUdTID0gL214IC93MiAvem4KK0xGTEFHUyA9IC1JUmVsZWFzZVxvYmpcZXhhbXBsZXMgLUQiIiAtYXAgLVRwZSAteCAtR24gLXEgLUwuLlxMSUJcUkVMRUFTRV9TVEFUSUMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTExPQkogPSBjMHgzMi5vYmogJChPQkpGSUxFUykKK0FMTFJFUyA9ICQoUkVTRklMRVMpCitBTExMSUIgPSAkKExJQkZJTEVTKSAkKExJQlJBUklFUykgaW1wb3J0MzIubGliIGN3MzJtdGkubGliCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmZGVmIElERU9QVElPTlMKKworW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0kKEJDQilcc291cmNlXHZjbAorCishZW5kaWYKKworCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNQUtFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBmaWxlIGlzIG5vdCB1c2VkIGJ5IHRoZSBCQ0IgSURFLiAgSXQgaXMgZm9yCisjIHRoZSBiZW5lZml0IG9mIGJ1aWxkaW5nIGZyb20gdGhlIGNvbW1hbmQtbGluZSB1c2luZyB0aGUgTUFLRSB1dGlsaXR5LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmF1dG9kZXBlbmQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgIiQoVVNFUkRFRklORVMpIiAhPSAiIgorQVVTRVJERUZJTkVTID0gLWQkKFVTRVJERUZJTkVTOjs9IC1kKQorIWVsc2UKK0FVU0VSREVGSU5FUyA9CishZW5kaWYKKworIWlmICEkZChCQ0MzMikKK0JDQzMyID0gYmNjMzIKKyFlbmRpZgorCishaWYgISRkKENQUDMyKQorQ1BQMzIgPSBjcHAzMgorIWVuZGlmCisKKyFpZiAhJGQoRENDMzIpCitEQ0MzMiA9IGRjYzMyCishZW5kaWYKKworIWlmICEkZChUQVNNMzIpCitUQVNNMzIgPSB0YXNtMzIKKyFlbmRpZgorCishaWYgISRkKExJTktFUikKK0xJTktFUiA9IGlsaW5rMzIKKyFlbmRpZgorCishaWYgISRkKEJSQ0MzMikKK0JSQ0MzMiA9IGJyY2MzMgorIWVuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAkZChQQVRIQ1BQKQorLlBBVEguQ1BQID0gJChQQVRIQ1BQKQorLlBBVEguQyAgID0gJChQQVRIQ1BQKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUEFTKQorLlBBVEguUEFTID0gJChQQVRIUEFTKQorIWVuZGlmCisKKyFpZiAkZChQQVRIQVNNKQorLlBBVEguQVNNID0gJChQQVRIQVNNKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUkMpCisuUEFUSC5SQyAgPSAkKFBBVEhSQykKKyFlbmRpZgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQoUFJPSkVDVCk6ICQoSURMR0VORklMRVMpICQoT0JKRklMRVMpICQoUkVTREVQRU4pICQoREVGRklMRSkKKyAgICAkKEJDQilcQklOXCQoTElOS0VSKSBAJiYhCisgICAgJChMRkxBR1MpIC1MJChMSUJQQVRIKSArCisgICAgJChBTExPQkopLCArCisgICAgJChQUk9KRUNUKSwsICsKKyAgICAkKEFMTExJQiksICsKKyAgICAkKERFRkZJTEUpLCArCisgICAgJChBTExSRVMpCishCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLnBhcy5ocHA6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisucGFzLm9iajoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5jcHAub2JqOgorICAgICQoQkNCKVxCSU5cJChCQ0MzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uJChARCkgeyQ8IH0KKworLmMub2JqOgorICAgICQoQkNCKVxCSU5cJChCQ0MzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uJChARCkgeyQ8IH0KKworLmMuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmNwcC5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuYXNtLm9iajoKKyAgICAkKEJDQilcQklOXCQoVEFTTTMyKSAkKEFGTEFHUykgLWkkKElOQ0xVREVQQVRIOjs9IC1pKSAkKEFVU0VSREVGSU5FUykgLWQkKFNZU0RFRklORVM6Oz0gLWQpICQ8LCAkQAorCisucmMucmVzOgorICAgICQoQkNCKVxCSU5cJChCUkNDMzIpICQoUkZMQUdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtZm8kQCAkPAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5icGYgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0LmJwZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzQyMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5icGYKQEAgLTAsMCArMSw2IEBACitVU0VVTklUKCIuLlxsaWJceG1scGFyc2UuYyIpOworVVNFVU5JVCgiLi5cbGliXHhtbHJvbGUuYyIpOworVVNFVU5JVCgiLi5cbGliXHhtbHRvay5jIik7CitVU0VERUYoImxpYmV4cGF0X210ZC5kZWYiKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIERsbEVudHJ5UG9pbnQKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXQuYnByIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5icHIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjkxYjhjYQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXQuYnByCkBAIC0wLDAgKzEsMTQwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCcgPz4KKzwhLS0gQysrQnVpbGRlciBYTUwgUHJvamVjdCAtLT4KKzxQUk9KRUNUPgorICA8TUFDUk9TPgorICAgIDxWRVJTSU9OIHZhbHVlPSJCQ0IuMDUuMDMiLz4KKyAgICA8UFJPSkVDVCB2YWx1ZT0iUmVsZWFzZVxsaWJleHBhdF9tdGQuZGxsIi8+CisgICAgPE9CSkZJTEVTIHZhbHVlPSJSZWxlYXNlXG9ialxsaWJleHBhdFx4bWxwYXJzZS5vYmogUmVsZWFzZVxvYmpcbGliZXhwYXRceG1scm9sZS5vYmogCisgICAgICBSZWxlYXNlXG9ialxsaWJleHBhdFx4bWx0b2sub2JqIi8+CisgICAgPFJFU0ZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExHRU5GSUxFUyB2YWx1ZT0iIi8+CisgICAgPERFRkZJTEUgdmFsdWU9ImxpYmV4cGF0X210ZC5kZWYiLz4KKyAgICA8UkVTREVQRU4gdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPExJQkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8TElCUkFSSUVTIHZhbHVlPSIiLz4KKyAgICA8U1BBUkVMSUJTIHZhbHVlPSIiLz4KKyAgICA8UEFDS0FHRVMgdmFsdWU9IlZDTDUwLmJwaSBWQ0xYNTAuYnBpIGJjYnNtcDUwLmJwaSBRUlBUNTAuYnBpIFZDTERCNTAuYnBpIFZDTEJERTUwLmJwaSAKKyAgICAgIGlic21wNTAuYnBpIFZDTERCWDUwLmJwaSBURUVVSTUwLmJwaSBURUVEQjUwLmJwaSBURUU1MC5icGkgVEVFUVI1MC5icGkgCisgICAgICBWQ0xJQjUwLmJwaSBiY2JpZTUwLmJwaSBWQ0xJRTUwLmJwaSBJTkVUREI1MC5icGkgSU5FVDUwLmJwaSBOTUZBU1Q1MC5icGkgCisgICAgICBkY2xvY3g1MC5icGkgYmNiMmtheHNlcnZlcjUwLmJwaSBkY2x1c3I1MC5icGkiLz4KKyAgICA8UEFUSENQUCB2YWx1ZT0iLjsuLlxsaWIiLz4KKyAgICA8UEFUSFBBUyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSFJDIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIQVNNIHZhbHVlPSIuOyIvPgorICAgIDxERUJVR0xJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJcZGVidWciLz4KKyAgICA8UkVMRUFTRUxJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJccmVsZWFzZSIvPgorICAgIDxMSU5LRVIgdmFsdWU9ImlsaW5rMzIiLz4KKyAgICA8VVNFUkRFRklORVMgdmFsdWU9Il9XSU5ET1dTO1dJTjMyO05ERUJVRztfVVNSRExMO0NPTVBJTEVEX0ZST01fRFNQO0VYUEFUX0VYUE9SVFMiLz4KKyAgICA8U1lTREVGSU5FUyB2YWx1ZT0iX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTCIvPgorICAgIDxNQUlOU09VUkNFIHZhbHVlPSJleHBhdC5icGYiLz4KKyAgICA8SU5DTFVERVBBVEggdmFsdWU9Ii4uXGxpYjskKEJDQilcaW5jbHVkZSIvPgorICAgIDxMSUJQQVRIIHZhbHVlPSIuLlxsaWI7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKSIvPgorICAgIDxXQVJOSU5HUyB2YWx1ZT0iLXctcmNoIC13LXBhciAtdy04MDI3IC13LTgwMjYgLXctY2NjIi8+CisgIDwvTUFDUk9TPgorICA8T1BUSU9OUz4KKyAgICA8SURMQ0ZMQUdTIHZhbHVlPSItSSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPENGTEFHMSB2YWx1ZT0iLVdEIC1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtYyAtdFdEIi8+CisgICAgPFBGTEFHUyB2YWx1ZT0iLU4yUmVsZWFzZVxvYmpcbGliZXhwYXQgLU4wUmVsZWFzZVxvYmpcbGliZXhwYXQgLSRZLSAtJEwtIC0kRC0iLz4KKyAgICA8UkZMQUdTIHZhbHVlPSIvbCAweDQwOSAvZCAmcXVvdDtOREVCVUcmcXVvdDsgL2kkKEJDQilcaW5jbHVkZSIvPgorICAgIDxBRkxBR1MgdmFsdWU9Ii9teCAvdzIgL3puIi8+CisgICAgPExGTEFHUyB2YWx1ZT0iLUlSZWxlYXNlXG9ialxsaWJleHBhdCAtRCZxdW90OyZxdW90OyAtYWEgLVRwZCAteCAtR24gLUdpIC1xIi8+CisgIDwvT1BUSU9OUz4KKyAgPExJTktFUj4KKyAgICA8QUxMT0JKIHZhbHVlPSJjMGQzMi5vYmogJChPQkpGSUxFUykiLz4KKyAgICA8QUxMUkVTIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxBTExMSUIgdmFsdWU9IiQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIiLz4KKyAgPC9MSU5LRVI+CisgIDxJREVPUFRJT05TPgorW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCitMb2NhbGU9MTAzMworQ29kZVBhZ2U9MTI1MgorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tIaXN0b3J5TGlzdHNcaGxJbmNsdWRlUGF0aF0KK0NvdW50PTQKK0l0ZW0wPS4uXGxpYjskKEJDQilcaW5jbHVkZQorSXRlbTE9JChCQ0IpXGluY2x1ZGUKK0l0ZW0yPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGwKK0l0ZW0zPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGw7CisKK1tIaXN0b3J5TGlzdHNcaGxMaWJyYXJ5UGF0aF0KK0NvdW50PTUKK0l0ZW0wPS4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMT0uLlxsaWI7JChCQ0IpXGxpYjsuLlxsaWJcJChSRUxFQVNFTElCUEFUSCkKK0l0ZW0yPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0zPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7JChCQ0IpXGxpYlxwc2RrCitJdGVtND0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOzskKEJDQilcbGliXHBzZGs7CisKK1tIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCitDb3VudD0xCitJdGVtMD0kKEJDQilcc291cmNlXHZjbAorCitbSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQorQ291bnQ9OAorSXRlbTA9X1dJTkRPV1M7V0lOMzI7TkRFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1A7RVhQQVRfRVhQT1JUUworSXRlbTE9X1dJTkRPV1M7V0lOMzI7TkRFQlVHO19ERUJVRztfVVNSRExMO0NPTVBJTEVEX0ZST01fRFNQO0VYUEFUX0VYUE9SVFMKK0l0ZW0yPVdJTjMyO19XSU5ET1dTO05ERUJVRztfREVCVUc7X1VTUkRMTDtDT01QSUxFRF9GUk9NX0RTUDtFWFBBVF9FWFBPUlRTCitJdGVtMz1XSU4zMjtfV0lORE9XUztOREVCVUc7X0RFQlVHO19VU1JETEw7RVhQQVRfRVhQT1JUUztDT01QSUxFRF9GUk9NX0RTUAorSXRlbTQ9TkRFQlVHO1dJTjMyO19XSU5ET1dTO19VU1JETEw7X0RFQlVHO0VYUEFUX0VYUE9SVFM7Q09NUElMRURfRlJPTV9EU1AKK0l0ZW01PU5ERUJVRztXSU4zMjtfV0lORE9XUztfVVNSRExMO0VYUEFUX0VYUE9SVFM7Q09NUElMRURfRlJPTV9EU1A7X0RFQlVHCitJdGVtNj1OREVCVUc7V0lOMzI7X1dJTkRPV1M7X01CQ1M7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO0NPTVBJTEVEX0ZST01fRFNQO19ERUJVRworSXRlbTc9TkRFQlVHO1dJTjMyO19XSU5ET1dTO19NQkNTO19VU1JETEw7RVhQQVRfRVhQT1JUUztDT01QSUxFRF9GUk9NX0RTUAorCitbSGlzdG9yeUxpc3RzXGhsSW50T3V0cHV0RGlyXQorQ291bnQ9NworSXRlbTA9UmVsZWFzZVxvYmpcbGliZXhwYXQKK0l0ZW0xPVJlbGVhc2Vcb2JqXGxpYmV4cGF0X3N0YXRpYworSXRlbTI9UmVsZWFzZVxvYmpcbXRkCitJdGVtMz1SZWxlYXNlXG9ialxtdAorSXRlbTQ9UmVsZWFzZVxvYmoKK0l0ZW01PVJlbGVhc2UKK0l0ZW02PS4uXGxpYlxSZWxlYXNlCisKK1tIaXN0b3J5TGlzdHNcaGxGaW5hbE91dHB1dERpcl0KK0NvdW50PTEKK0l0ZW0wPVJlbGVhc2VcCisKK1tEZWJ1Z2dpbmddCitEZWJ1Z1NvdXJjZURpcnM9CisKK1tQYXJhbWV0ZXJzXQorUnVuUGFyYW1zPQorSG9zdEFwcGxpY2F0aW9uPQorUmVtb3RlSG9zdD0KK1JlbW90ZVBhdGg9CitSZW1vdGVEZWJ1Zz0wCisKK1tDb21waWxlcl0KK1Nob3dJbmZvTXNncz0wCitMaW5rRGVidWdWY2w9MAorTGlua0NHTElCPTAKKworW0xhbmd1YWdlXQorQWN0aXZlTGFuZz0KK1Byb2plY3RMYW5nPQorUm9vdERpcj0KKyAgPC9JREVPUFRJT05TPgorPC9QUk9KRUNUPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXQubWFrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M5YzIzZgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXQubWFrCkBAIC0wLDAgKzEsMTg3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICEkZChCQ0IpCitCQ0IgPSAkKE1BS0VESVIpXC4uCishZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSURFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBtYWtlZmlsZSBpcyBtYW5hZ2VkIGJ5IHRoZSBCQ0IgSURFLgorIyBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIElERSB0byBjaGFuZ2UgYW55IG9mIHRoZSB2YWx1ZXMgaW4gdGhpcworIyBzZWN0aW9uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVkVSU0lPTiA9IEJDQi4wNS4wMworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0pFQ1QgPSBSZWxlYXNlXGxpYmV4cGF0X210ZC5kbGwKK09CSkZJTEVTID0gUmVsZWFzZVxvYmpcbGliZXhwYXRceG1scGFyc2Uub2JqIFJlbGVhc2Vcb2JqXGxpYmV4cGF0XHhtbHJvbGUub2JqIFwKKyAgICBSZWxlYXNlXG9ialxsaWJleHBhdFx4bWx0b2sub2JqCitSRVNGSUxFUyA9IAorTUFJTlNPVVJDRSA9IGV4cGF0LmJwZgorUkVTREVQRU4gPSAkKFJFU0ZJTEVTKQorTElCRklMRVMgPSAKK0lETEZJTEVTID0gCitJRExHRU5GSUxFUyA9IAorTElCUkFSSUVTID0gCitQQUNLQUdFUyA9IFZDTDUwLmJwaSBWQ0xYNTAuYnBpIGJjYnNtcDUwLmJwaSBRUlBUNTAuYnBpIFZDTERCNTAuYnBpIFZDTEJERTUwLmJwaSBcCisgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSBcCisgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgVkNMSUU1MC5icGkgSU5FVERCNTAuYnBpIElORVQ1MC5icGkgTk1GQVNUNTAuYnBpIFwKKyAgICBkY2xvY3g1MC5icGkgYmNiMmtheHNlcnZlcjUwLmJwaSBkY2x1c3I1MC5icGkKK1NQQVJFTElCUyA9IAorREVGRklMRSA9IGxpYmV4cGF0X210ZC5kZWYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQVRIQ1BQID0gLjsuLlxsaWIKK1BBVEhBU00gPSAuOworUEFUSFBBUyA9IC47CitQQVRIUkMgPSAuOworREVCVUdMSUJQQVRIID0gJChCQ0IpXGxpYlxkZWJ1ZworUkVMRUFTRUxJQlBBVEggPSAkKEJDQilcbGliXHJlbGVhc2UKK1VTRVJERUZJTkVTID0gX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1AKK1NZU0RFRklORVMgPSBfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMCitJTkNMVURFUEFUSCA9IC4uXGxpYjskKEJDQilcaW5jbHVkZQorTElCUEFUSCA9IC4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitXQVJOSU5HUz0gLXctcmNoIC13LXBhciAtdy04MDI3IC13LTgwMjYgLXctY2NjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0ZMQUcxID0gLVdEIC1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtYyAtdFdECitJRExDRkxBR1MgPSAtSSQoQkNCKVxpbmNsdWRlCitQRkxBR1MgPSAtTjJSZWxlYXNlXG9ialxsaWJleHBhdCAtTjBSZWxlYXNlXG9ialxsaWJleHBhdCAtJFktIC0kTC0gLSRELQorUkZMQUdTID0gL2wgMHg0MDkgL2QgIk5ERUJVRyIgL2kkKEJDQilcaW5jbHVkZQorQUZMQUdTID0gL214IC93MiAvem4KK0xGTEFHUyA9IC1JUmVsZWFzZVxvYmpcbGliZXhwYXQgLUQiIiAtYWEgLVRwZCAteCAtR24gLUdpIC1xCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxMT0JKID0gYzBkMzIub2JqICQoT0JKRklMRVMpCitBTExSRVMgPSAkKFJFU0ZJTEVTKQorQUxMTElCID0gJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZmRlZiBJREVPUFRJT05TCisKK1tWZXJzaW9uIEluZm9dCitJbmNsdWRlVmVySW5mbz0wCitBdXRvSW5jQnVpbGQ9MAorTWFqb3JWZXI9MQorTWlub3JWZXI9MAorUmVsZWFzZT0wCitCdWlsZD0wCitEZWJ1Zz0wCitQcmVSZWxlYXNlPTAKK1NwZWNpYWw9MAorUHJpdmF0ZT0wCitETEw9MAorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tEZWJ1Z2dpbmddCitEZWJ1Z1NvdXJjZURpcnM9JChCQ0IpXHNvdXJjZVx2Y2wKKworIWVuZGlmCisKKworCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTUFLRSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgZmlsZSBpcyBub3QgdXNlZCBieSB0aGUgQkNCIElERS4gIEl0IGlzIGZvcgorIyB0aGUgYmVuZWZpdCBvZiBidWlsZGluZyBmcm9tIHRoZSBjb21tYW5kLWxpbmUgdXNpbmcgdGhlIE1BS0UgdXRpbGl0eS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5hdXRvZGVwZW5kCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICIkKFVTRVJERUZJTkVTKSIgIT0gIiIKK0FVU0VSREVGSU5FUyA9IC1kJChVU0VSREVGSU5FUzo7PSAtZCkKKyFlbHNlCitBVVNFUkRFRklORVMgPQorIWVuZGlmCisKKyFpZiAhJGQoQkNDMzIpCitCQ0MzMiA9IGJjYzMyCishZW5kaWYKKworIWlmICEkZChDUFAzMikKK0NQUDMyID0gY3BwMzIKKyFlbmRpZgorCishaWYgISRkKERDQzMyKQorRENDMzIgPSBkY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoVEFTTTMyKQorVEFTTTMyID0gdGFzbTMyCishZW5kaWYKKworIWlmICEkZChMSU5LRVIpCitMSU5LRVIgPSBpbGluazMyCishZW5kaWYKKworIWlmICEkZChCUkNDMzIpCitCUkNDMzIgPSBicmNjMzIKKyFlbmRpZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgJGQoUEFUSENQUCkKKy5QQVRILkNQUCA9ICQoUEFUSENQUCkKKy5QQVRILkMgICA9ICQoUEFUSENQUCkKKyFlbmRpZgorCishaWYgJGQoUEFUSFBBUykKKy5QQVRILlBBUyA9ICQoUEFUSFBBUykKKyFlbmRpZgorCishaWYgJGQoUEFUSEFTTSkKKy5QQVRILkFTTSA9ICQoUEFUSEFTTSkKKyFlbmRpZgorCishaWYgJGQoUEFUSFJDKQorLlBBVEguUkMgID0gJChQQVRIUkMpCishZW5kaWYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskKFBST0pFQ1QpOiAkKElETEdFTkZJTEVTKSAkKE9CSkZJTEVTKSAkKFJFU0RFUEVOKSAkKERFRkZJTEUpCisgICAgJChCQ0IpXEJJTlwkKExJTktFUikgQCYmIQorICAgICQoTEZMQUdTKSAtTCQoTElCUEFUSCkgKworICAgICQoQUxMT0JKKSwgKworICAgICQoUFJPSkVDVCksLCArCisgICAgJChBTExMSUIpLCArCisgICAgJChERUZGSUxFKSwgKworICAgICQoQUxMUkVTKQorIQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5wYXMuaHBwOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLnBhcy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisuY3BwLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLm9iajoKKyAgICAkKEJDQilcQklOXCQoQkNDMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbiQoQEQpIHskPCB9CisKKy5jLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5jcHAuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmFzbS5vYmo6CisgICAgJChCQ0IpXEJJTlwkKFRBU00zMikgJChBRkxBR1MpIC1pJChJTkNMVURFUEFUSDo7PSAtaSkgJChBVVNFUkRFRklORVMpIC1kJChTWVNERUZJTkVTOjs9IC1kKSAkPCwgJEAKKworLnJjLnJlczoKKyAgICAkKEJDQilcQklOXCQoQlJDQzMyKSAkKFJGTEFHUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLWZvJEAgJDwKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXRfc3RhdGljLmJwZiBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXRfc3RhdGljLmJwZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Y2E0NThlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdF9zdGF0aWMuYnBmCkBAIC0wLDAgKzEsNSBAQAorVVNFVU5JVCgiLi5cbGliXHhtbHBhcnNlLmMiKTsKK1VTRVVOSVQoIi4uXGxpYlx4bWxyb2xlLmMiKTsKK1VTRVVOSVQoIi4uXGxpYlx4bWx0b2suYyIpOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTGlicmFyeQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdF9zdGF0aWMuYnByIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdF9zdGF0aWMuYnByCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmNmVjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0X3N0YXRpYy5icHIKQEAgLTAsMCArMSwxNDMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgorPCEtLSBDKytCdWlsZGVyIFhNTCBQcm9qZWN0IC0tPgorPFBST0pFQ1Q+CisgIDxNQUNST1M+CisgICAgPFZFUlNJT04gdmFsdWU9IkJDQi4wNS4wMyIvPgorICAgIDxQUk9KRUNUIHZhbHVlPSJSZWxlYXNlXGxpYmV4cGF0c19tdGQubGliIi8+CisgICAgPE9CSkZJTEVTIHZhbHVlPSJSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWNceG1scGFyc2Uub2JqIAorICAgICAgUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljXHhtbHJvbGUub2JqIAorICAgICAgUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljXHhtbHRvay5vYmoiLz4KKyAgICA8UkVTRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEdFTkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8REVGRklMRSB2YWx1ZT0iIi8+CisgICAgPFJFU0RFUEVOIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxMSUJGSUxFUyB2YWx1ZT0iIi8+CisgICAgPExJQlJBUklFUyB2YWx1ZT0iIi8+CisgICAgPFNQQVJFTElCUyB2YWx1ZT0iIi8+CisgICAgPFBBQ0tBR0VTIHZhbHVlPSIiLz4KKyAgICA8UEFUSENQUCB2YWx1ZT0iLjsuLlxsaWIiLz4KKyAgICA8UEFUSFBBUyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSFJDIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIQVNNIHZhbHVlPSIuOyIvPgorICAgIDxERUJVR0xJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJcZGVidWciLz4KKyAgICA8UkVMRUFTRUxJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJccmVsZWFzZSIvPgorICAgIDxMSU5LRVIgdmFsdWU9IlRMaWIiLz4KKyAgICA8VVNFUkRFRklORVMgdmFsdWU9Il9XSU5ET1dTO1dJTjMyO05ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9TVEFUSUMiLz4KKyAgICA8U1lTREVGSU5FUyB2YWx1ZT0iX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTCIvPgorICAgIDxNQUlOU09VUkNFIHZhbHVlPSJleHBhdF9zdGF0aWMuYnBmIi8+CisgICAgPElOQ0xVREVQQVRIIHZhbHVlPSIuLlxsaWI7JChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8TElCUEFUSCB2YWx1ZT0iLi5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkiLz4KKyAgICA8V0FSTklOR1MgdmFsdWU9Ii13LXJjaCAtdy1wYXIgLXctODAyNyAtdy04MDI2IC13LWNjYyIvPgorICAgIDxMSVNURklMRSB2YWx1ZT0iIi8+CisgIDwvTUFDUk9TPgorICA8T1BUSU9OUz4KKyAgICA8SURMQ0ZMQUdTIHZhbHVlPSItSSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPENGTEFHMSB2YWx1ZT0iLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1jIi8+CisgICAgPFBGTEFHUyB2YWx1ZT0iLU4yUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljIC1OMFJlbGVhc2Vcb2JqXGxpYmV4cGF0X3N0YXRpYyAtJFktIC0kTC0gLSRELSIvPgorICAgIDxSRkxBR1MgdmFsdWU9Ii9sIDB4NDA5IC9kICZxdW90O05ERUJVRyZxdW90OyAvaSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPEFGTEFHUyB2YWx1ZT0iL214IC93MiAvem4iLz4KKyAgICA8TEZMQUdTIHZhbHVlPSIiLz4KKyAgPC9PUFRJT05TPgorICA8TElOS0VSPgorICAgIDxBTExPQkogdmFsdWU9IiQoT0JKRklMRVMpIi8+CisgICAgPEFMTFJFUyB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8QUxMTElCIHZhbHVlPSIkKExJQkZJTEVTKSAkKExJQlJBUklFUykiLz4KKyAgPC9MSU5LRVI+CisgIDxJREVPUFRJT05TPgorW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCitMb2NhbGU9MTAzMworQ29kZVBhZ2U9MTI1MgorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tIaXN0b3J5TGlzdHNcaGxJbmNsdWRlUGF0aF0KK0NvdW50PTQKK0l0ZW0wPS4uXGxpYjskKEJDQilcaW5jbHVkZQorSXRlbTE9JChCQ0IpXGluY2x1ZGUKK0l0ZW0yPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGwKK0l0ZW0zPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGw7CisKK1tIaXN0b3J5TGlzdHNcaGxMaWJyYXJ5UGF0aF0KK0NvdW50PTUKK0l0ZW0wPS4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMT0uLlxsaWI7JChCQ0IpXGxpYjsuLlxsaWJcJChSRUxFQVNFTElCUEFUSCkKK0l0ZW0yPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0zPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7JChCQ0IpXGxpYlxwc2RrCitJdGVtND0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOzskKEJDQilcbGliXHBzZGs7CisKK1tIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCitDb3VudD0xCitJdGVtMD0kKEJDQilcc291cmNlXHZjbAorCitbSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQorQ291bnQ9NworSXRlbTA9X1dJTkRPV1M7V0lOMzI7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQworSXRlbTE9X1dJTkRPV1M7V0lOMzI7TkRFQlVHO19ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9TVEFUSUMKK0l0ZW0yPVdJTjMyO19XSU5ET1dTO05ERUJVRztfREVCVUc7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfU1RBVElDCitJdGVtMz1XSU4zMjtfV0lORE9XUztOREVCVUc7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtfREVCVUcKK0l0ZW00PVdJTjMyO19XSU5ET1dTO05ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQCitJdGVtNT1XSU4zMjtfV0lORE9XUztOREVCVUc7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtfTUJDUworSXRlbTY9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19NQkNTO19MSUI7Q09NUElMRURfRlJPTV9EU1AKKworW0hpc3RvcnlMaXN0c1xobEludE91dHB1dERpcl0KK0NvdW50PTYKK0l0ZW0wPVJlbGVhc2Vcb2JqXGxpYmV4cGF0X3N0YXRpYworSXRlbTE9UmVsZWFzZVxvYmpcbXRzCitJdGVtMj1SZWxlYXNlXG9ialxtdAorSXRlbTM9UmVsZWFzZQorSXRlbTQ9Li5cbGliXFJlbGVhc2Vfc3RhdGljCitJdGVtNT1SZWxlYXNlX3N0YXRpYworCitbSGlzdG9yeUxpc3RzXGhsRmluYWxPdXRwdXREaXJdCitDb3VudD0zCitJdGVtMD1SZWxlYXNlXAorSXRlbTE9UmVsZWFzZQorSXRlbTI9UmVsZWFzZV9zdGF0aWNcCisKK1tIaXN0b3J5TGlzdHNcaGxUbGliUGFnZVNpemVdCitDb3VudD0xCitJdGVtMD0weDAwMTAKKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0KKworW1BhcmFtZXRlcnNdCitSdW5QYXJhbXM9CitIb3N0QXBwbGljYXRpb249CitSZW1vdGVIb3N0PQorUmVtb3RlUGF0aD0KK1JlbW90ZURlYnVnPTAKKworW0NvbXBpbGVyXQorU2hvd0luZm9Nc2dzPTAKK0xpbmtEZWJ1Z1ZjbD0wCitMaW5rQ0dMSUI9MAorCitbTGFuZ3VhZ2VdCitBY3RpdmVMYW5nPQorUHJvamVjdExhbmc9CitSb290RGlyPQorICA8L0lERU9QVElPTlM+Cis8L1BST0pFQ1Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9leHBhdF9zdGF0aWMubWFrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdF9zdGF0aWMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxMzdkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0X3N0YXRpYy5tYWsKQEAgLTAsMCArMSwxODkgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgISRkKEJDQikKK0JDQiA9ICQoTUFLRURJUilcLi4KKyFlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJREUgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IG1ha2VmaWxlIGlzIG1hbmFnZWQgYnkgdGhlIEJDQiBJREUuCisjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgSURFIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGlzCisjIHNlY3Rpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWRVJTSU9OID0gQkNCLjA1LjAzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVCA9IFJlbGVhc2VcbGliZXhwYXRzX210ZC5saWIKK09CSkZJTEVTID0gUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljXHhtbHBhcnNlLm9iaiBcCisgICAgUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljXHhtbHJvbGUub2JqIFwKKyAgICBSZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWNceG1sdG9rLm9iagorUkVTRklMRVMgPSAKK01BSU5TT1VSQ0UgPSBleHBhdF9zdGF0aWMuYnBmCitSRVNERVBFTiA9ICQoUkVTRklMRVMpCitMSUJGSUxFUyA9IAorSURMRklMRVMgPSAKK0lETEdFTkZJTEVTID0gCitMSUJSQVJJRVMgPSAKK1BBQ0tBR0VTID0gCitTUEFSRUxJQlMgPSAKK0RFRkZJTEUgPSAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQVRIQ1BQID0gLjsuLlxsaWIKK1BBVEhBU00gPSAuOworUEFUSFBBUyA9IC47CitQQVRIUkMgPSAuOworTElOS0VSID0gVExpYgorREVCVUdMSUJQQVRIID0gJChCQ0IpXGxpYlxkZWJ1ZworUkVMRUFTRUxJQlBBVEggPSAkKEJDQilcbGliXHJlbGVhc2UKK1VTRVJERUZJTkVTID0gX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQworU1lTREVGSU5FUyA9IF9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwKK0lOQ0xVREVQQVRIID0gLi5cbGliOyQoQkNCKVxpbmNsdWRlCitMSUJQQVRIID0gLi5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK1dBUk5JTkdTID0gLXctcmNoIC13LXBhciAtdy04MDI3IC13LTgwMjYgLXctY2NjCitMSVNURklMRSA9IAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NGTEFHMSA9IC1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtYworSURMQ0ZMQUdTID0gLUkkKEJDQilcaW5jbHVkZQorUEZMQUdTID0gLU4yUmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljIC1OMFJlbGVhc2Vcb2JqXGxpYmV4cGF0X3N0YXRpYyAtJFktIC0kTC0gLSRELQorUkZMQUdTID0gL2wgMHg0MDkgL2QgIk5ERUJVRyIgL2kkKEJDQilcaW5jbHVkZQorQUZMQUdTID0gL214IC93MiAvem4KK0xGTEFHUyA9IAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMTE9CSiA9ICQoT0JKRklMRVMpCitBTExSRVMgPSAkKFJFU0ZJTEVTKQorQUxMTElCID0gJChMSUJGSUxFUykgJChMSUJSQVJJRVMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmZGVmIElERU9QVElPTlMKKworW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0kKEJDQilcc291cmNlXHZjbAorCishZW5kaWYKKworCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNQUtFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBmaWxlIGlzIG5vdCB1c2VkIGJ5IHRoZSBCQ0IgSURFLiAgSXQgaXMgZm9yCisjIHRoZSBiZW5lZml0IG9mIGJ1aWxkaW5nIGZyb20gdGhlIGNvbW1hbmQtbGluZSB1c2luZyB0aGUgTUFLRSB1dGlsaXR5LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmF1dG9kZXBlbmQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgIiQoVVNFUkRFRklORVMpIiAhPSAiIgorQVVTRVJERUZJTkVTID0gLWQkKFVTRVJERUZJTkVTOjs9IC1kKQorIWVsc2UKK0FVU0VSREVGSU5FUyA9CishZW5kaWYKKworIWlmICEkZChCQ0MzMikKK0JDQzMyID0gYmNjMzIKKyFlbmRpZgorCishaWYgISRkKENQUDMyKQorQ1BQMzIgPSBjcHAzMgorIWVuZGlmCisKKyFpZiAhJGQoRENDMzIpCitEQ0MzMiA9IGRjYzMyCishZW5kaWYKKworIWlmICEkZChUQVNNMzIpCitUQVNNMzIgPSB0YXNtMzIKKyFlbmRpZgorCishaWYgISRkKExJTktFUikKK0xJTktFUiA9IFRMaWIKKyFlbmRpZgorCishaWYgISRkKEJSQ0MzMikKK0JSQ0MzMiA9IGJyY2MzMgorIWVuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAkZChQQVRIQ1BQKQorLlBBVEguQ1BQID0gJChQQVRIQ1BQKQorLlBBVEguQyAgID0gJChQQVRIQ1BQKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUEFTKQorLlBBVEguUEFTID0gJChQQVRIUEFTKQorIWVuZGlmCisKKyFpZiAkZChQQVRIQVNNKQorLlBBVEguQVNNID0gJChQQVRIQVNNKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUkMpCisuUEFUSC5SQyAgPSAkKFBBVEhSQykKKyFlbmRpZgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChMSVNURklMRSkiID09ICAiIgorQ09NTUEgPQorIWVsc2UKK0NPTU1BID0gLAorIWVuZGlmCisKKyQoUFJPSkVDVCk6ICQoSURMR0VORklMRVMpICQoT0JKRklMRVMpICQoUkVTREVQRU4pICQoREVGRklMRSkKKyAgICAkKEJDQilcQklOXCQoTElOS0VSKSAvdSAkQCBAJiYhCisgICAgJChMRkxBR1MpICQ/ICQoQ09NTUEpICQoTElTVEZJTEUpCisKKyEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisucGFzLmhwcDoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5wYXMub2JqOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLmNwcC5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuY3BwLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5hc20ub2JqOgorICAgICQoQkNCKVxCSU5cJChUQVNNMzIpICQoQUZMQUdTKSAtaSQoSU5DTFVERVBBVEg6Oz0gLWkpICQoQVVTRVJERUZJTkVTKSAtZCQoU1lTREVGSU5FUzo7PSAtZCkgJDwsICRACisKKy5yYy5yZXM6CisgICAgJChCQ0IpXEJJTlwkKEJSQ0MzMikgJChSRkxBR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1mbyRAICQ8CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2V4cGF0dy5icGYgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0dy5icGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg4YTZkNQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3LmJwZgpAQCAtMCwwICsxLDYgQEAKK1VTRVVOSVQoIi4uXGxpYlx4bWxwYXJzZS5jIik7CitVU0VVTklUKCIuLlxsaWJceG1scm9sZS5jIik7CitVU0VVTklUKCIuLlxsaWJceG1sdG9rLmMiKTsKK1VTRURFRigibGliZXhwYXR3X210ZC5kZWYiKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIERsbEVudHJ5UG9pbnQKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3LmJwciBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3LmJwcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZWM1MDAxCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHcuYnByCkBAIC0wLDAgKzEsMTQ2IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCcgPz4KKzwhLS0gQysrQnVpbGRlciBYTUwgUHJvamVjdCAtLT4KKzxQUk9KRUNUPgorICA8TUFDUk9TPgorICAgIDxWRVJTSU9OIHZhbHVlPSJCQ0IuMDUuMDMiLz4KKyAgICA8UFJPSkVDVCB2YWx1ZT0iUmVsZWFzZVxsaWJleHBhdHdfbXRkLmRsbCIvPgorICAgIDxPQkpGSUxFUyB2YWx1ZT0iUmVsZWFzZVxvYmpcbGliZXhwYXR3XHhtbHBhcnNlLm9iaiBSZWxlYXNlXG9ialxsaWJleHBhdHdceG1scm9sZS5vYmogCisgICAgICBSZWxlYXNlXG9ialxsaWJleHBhdHdceG1sdG9rLm9iaiIvPgorICAgIDxSRVNGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMR0VORklMRVMgdmFsdWU9IiIvPgorICAgIDxERUZGSUxFIHZhbHVlPSJsaWJleHBhdHdfbXRkLmRlZiIvPgorICAgIDxSRVNERVBFTiB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8TElCRklMRVMgdmFsdWU9IiIvPgorICAgIDxMSUJSQVJJRVMgdmFsdWU9IiIvPgorICAgIDxTUEFSRUxJQlMgdmFsdWU9IiIvPgorICAgIDxQQUNLQUdFUyB2YWx1ZT0iVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIAorICAgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSAKKyAgICAgIFZDTElCNTAuYnBpIGJjYmllNTAuYnBpIFZDTElFNTAuYnBpIElORVREQjUwLmJwaSBJTkVUNTAuYnBpIE5NRkFTVDUwLmJwaSAKKyAgICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaSIvPgorICAgIDxQQVRIQ1BQIHZhbHVlPSIuOy4uXGxpYiIvPgorICAgIDxQQVRIUEFTIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIUkMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhBU00gdmFsdWU9Ii47Ii8+CisgICAgPERFQlVHTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxkZWJ1ZyIvPgorICAgIDxSRUxFQVNFTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxyZWxlYXNlIi8+CisgICAgPExJTktFUiB2YWx1ZT0iaWxpbmszMiIvPgorICAgIDxVU0VSREVGSU5FUyB2YWx1ZT0iX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1A7RVhQQVRfRVhQT1JUUztYTUxfVU5JQ09ERV9XQ0hBUl9UIi8+CisgICAgPFNZU0RFRklORVMgdmFsdWU9Il9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwiLz4KKyAgICA8TUFJTlNPVVJDRSB2YWx1ZT0iZXhwYXR3LmJwZiIvPgorICAgIDxJTkNMVURFUEFUSCB2YWx1ZT0iLi5cbGliOyQoQkNCKVxpbmNsdWRlIi8+CisgICAgPExJQlBBVEggdmFsdWU9Ii4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpIi8+CisgICAgPFdBUk5JTkdTIHZhbHVlPSItdy1yY2ggLXctcGFyIC13LTgwMjcgLXctODAyNiAtdy1jY2MiLz4KKyAgPC9NQUNST1M+CisgIDxPUFRJT05TPgorICAgIDxJRExDRkxBR1MgdmFsdWU9Ii1JJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8Q0ZMQUcxIHZhbHVlPSItV0QgLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1jIC10V0QiLz4KKyAgICA8UEZMQUdTIHZhbHVlPSItTjJSZWxlYXNlXG9ialxsaWJleHBhdHcgLU4wUmVsZWFzZVxvYmpcbGliZXhwYXR3IC0kWS0gLSRMLSAtJEQtIi8+CisgICAgPFJGTEFHUyB2YWx1ZT0iL2wgMHg0MDkgL2QgJnF1b3Q7TkRFQlVHJnF1b3Q7IC9pJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8QUZMQUdTIHZhbHVlPSIvbXggL3cyIC96biIvPgorICAgIDxMRkxBR1MgdmFsdWU9Ii1JUmVsZWFzZVxvYmpcbGliZXhwYXR3IC1EJnF1b3Q7JnF1b3Q7IC1hYSAtVHBkIC14IC1HbiAtR2kgLXcgLXEiLz4KKyAgPC9PUFRJT05TPgorICA8TElOS0VSPgorICAgIDxBTExPQkogdmFsdWU9ImMwZDMydy5vYmogJChPQkpGSUxFUykiLz4KKyAgICA8QUxMUkVTIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxBTExMSUIgdmFsdWU9IiQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIiLz4KKyAgPC9MSU5LRVI+CisgIDxJREVPUFRJT05TPgorW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCitMb2NhbGU9MTAzMworQ29kZVBhZ2U9MTI1MgorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tIaXN0b3J5TGlzdHNcaGxJbmNsdWRlUGF0aF0KK0NvdW50PTQKK0l0ZW0wPS4uXGxpYjskKEJDQilcaW5jbHVkZQorSXRlbTE9JChCQ0IpXGluY2x1ZGUKK0l0ZW0yPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGwKK0l0ZW0zPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGw7CisKK1tIaXN0b3J5TGlzdHNcaGxMaWJyYXJ5UGF0aF0KK0NvdW50PTUKK0l0ZW0wPS4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMT0uLlxsaWI7JChCQ0IpXGxpYjsuLlxsaWJcJChSRUxFQVNFTElCUEFUSCkKK0l0ZW0yPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0zPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7JChCQ0IpXGxpYlxwc2RrCitJdGVtND0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOzskKEJDQilcbGliXHBzZGs7CisKK1tIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCitDb3VudD0xCitJdGVtMD0kKEJDQilcc291cmNlXHZjbAorCitbSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQorQ291bnQ9OQorSXRlbTA9X1dJTkRPV1M7V0lOMzI7TkRFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1A7RVhQQVRfRVhQT1JUUztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMT1fV0lORE9XUztXSU4zMjtOREVCVUc7X0RFQlVHO19VU1JETEw7Q09NUElMRURfRlJPTV9EU1A7RVhQQVRfRVhQT1JUUztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMj1fV0lORE9XUztXSU4zMjtOREVCVUc7X0RFQlVHO19VU1JETEw7RVhQQVRfRVhQT1JUUztDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMz1OREVCVUc7Q09NUElMRURfRlJPTV9EU1A7V0lOMzI7X1dJTkRPV1M7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO19ERUJVRztYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtND1OREVCVUc7Q09NUElMRURfRlJPTV9EU1A7V0lOMzI7X1dJTkRPV1M7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO1hNTF9VTklDT0RFX1dDSEFSX1Q7X0RFQlVHCitJdGVtNT1OREVCVUc7Q09NUElMRURfRlJPTV9EU1A7V0lOMzI7X1dJTkRPV1M7X1VOSUNPREU7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO1hNTF9VTklDT0RFX1dDSEFSX1Q7X0RFQlVHCitJdGVtNj1OREVCVUc7Q09NUElMRURfRlJPTV9EU1A7V0lOMzI7X1dJTkRPV1M7X1VOSUNPREU7X1VTUkRMTDtFWFBBVF9FWFBPUlRTO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW03PU5ERUJVRztDT01QSUxFRF9GUk9NX0RTUDtXSU4zMjtfV0lORE9XUztfTUJDUztfVVNSRExMO0VYUEFUX0VYUE9SVFM7WE1MX1VOSUNPREVfV0NIQVJfVDtYTUxfVU5JQ09ERQorSXRlbTg9TkRFQlVHO0NPTVBJTEVEX0ZST01fRFNQO1dJTjMyO19XSU5ET1dTO19NQkNTO19VU1JETEw7RVhQQVRfRVhQT1JUUztYTUxfVU5JQ09ERV9XQ0hBUl9UCisKK1tIaXN0b3J5TGlzdHNcaGxJbnRPdXRwdXREaXJdCitDb3VudD04CitJdGVtMD1SZWxlYXNlXG9ialxsaWJleHBhdHcKK0l0ZW0xPVJlbGVhc2Vcb2JqXGxpYmV4cGF0CitJdGVtMj1SZWxlYXNlXG9ialxtdGQKK0l0ZW0zPVJlbGVhc2Vcb2JqXG10CitJdGVtND1SZWxlYXNlX3dcb2JqCitJdGVtNT1SZWxlYXNlLXdcb2JqCitJdGVtNj1SZWxlYXNlLXcKK0l0ZW03PS4uXGxpYlxSZWxlYXNlLXcKKworW0hpc3RvcnlMaXN0c1xobEZpbmFsT3V0cHV0RGlyXQorQ291bnQ9NQorSXRlbTA9UmVsZWFzZVwKK0l0ZW0xPVJlbGVhc2UKK0l0ZW0yPVJlbGVhc2Vfd1wKK0l0ZW0zPVJlbGVhc2Utd1wKK0l0ZW00PVJlbGVhc2UtdworCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPQorCitbUGFyYW1ldGVyc10KK1J1blBhcmFtcz0KK0hvc3RBcHBsaWNhdGlvbj0KK1JlbW90ZUhvc3Q9CitSZW1vdGVQYXRoPQorUmVtb3RlRGVidWc9MAorCitbQ29tcGlsZXJdCitTaG93SW5mb01zZ3M9MAorTGlua0RlYnVnVmNsPTAKK0xpbmtDR0xJQj0wCisKK1tMYW5ndWFnZV0KK0FjdGl2ZUxhbmc9CitQcm9qZWN0TGFuZz0KK1Jvb3REaXI9CisgIDwvSURFT1BUSU9OUz4KKzwvUFJPSkVDVD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2V4cGF0dy5tYWsgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0dy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDhlMTdkMAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3Lm1hawpAQCAtMCwwICsxLDE4NyBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAhJGQoQkNCKQorQkNCID0gJChNQUtFRElSKVwuLgorIWVuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElERSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgbWFrZWZpbGUgaXMgbWFuYWdlZCBieSB0aGUgQkNCIElERS4KKyMgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBJREUgdG8gY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoaXMKKyMgc2VjdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZFUlNJT04gPSBCQ0IuMDUuMDMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUID0gUmVsZWFzZVxsaWJleHBhdHdfbXRkLmRsbAorT0JKRklMRVMgPSBSZWxlYXNlXG9ialxsaWJleHBhdHdceG1scGFyc2Uub2JqIFJlbGVhc2Vcb2JqXGxpYmV4cGF0d1x4bWxyb2xlLm9iaiBcCisgICAgUmVsZWFzZVxvYmpcbGliZXhwYXR3XHhtbHRvay5vYmoKK1JFU0ZJTEVTID0gCitNQUlOU09VUkNFID0gZXhwYXR3LmJwZgorUkVTREVQRU4gPSAkKFJFU0ZJTEVTKQorTElCRklMRVMgPSAKK0lETEZJTEVTID0gCitJRExHRU5GSUxFUyA9IAorTElCUkFSSUVTID0gCitQQUNLQUdFUyA9IFZDTDUwLmJwaSBWQ0xYNTAuYnBpIGJjYnNtcDUwLmJwaSBRUlBUNTAuYnBpIFZDTERCNTAuYnBpIFZDTEJERTUwLmJwaSBcCisgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSBcCisgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgVkNMSUU1MC5icGkgSU5FVERCNTAuYnBpIElORVQ1MC5icGkgTk1GQVNUNTAuYnBpIFwKKyAgICBkY2xvY3g1MC5icGkgYmNiMmtheHNlcnZlcjUwLmJwaSBkY2x1c3I1MC5icGkKK1NQQVJFTElCUyA9IAorREVGRklMRSA9IGxpYmV4cGF0d19tdGQuZGVmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUEFUSENQUCA9IC47Li5cbGliCitQQVRIQVNNID0gLjsKK1BBVEhQQVMgPSAuOworUEFUSFJDID0gLjsKK0RFQlVHTElCUEFUSCA9ICQoQkNCKVxsaWJcZGVidWcKK1JFTEVBU0VMSUJQQVRIID0gJChCQ0IpXGxpYlxyZWxlYXNlCitVU0VSREVGSU5FUyA9IF9XSU5ET1dTO1dJTjMyO05ERUJVRztfVVNSRExMO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFX1dDSEFSX1QKK1NZU0RFRklORVMgPSBfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMCitJTkNMVURFUEFUSCA9IC4uXGxpYjskKEJDQilcaW5jbHVkZQorTElCUEFUSCA9IC4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitXQVJOSU5HUz0gLXctcmNoIC13LXBhciAtdy04MDI3IC13LTgwMjYgLXctY2NjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0ZMQUcxID0gLVdEIC1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtYyAtdFdECitJRExDRkxBR1MgPSAtSSQoQkNCKVxpbmNsdWRlCitQRkxBR1MgPSAtTjJSZWxlYXNlXG9ialxsaWJleHBhdHcgLU4wUmVsZWFzZVxvYmpcbGliZXhwYXR3IC0kWS0gLSRMLSAtJEQtCitSRkxBR1MgPSAvbCAweDQwOSAvZCAiTkRFQlVHIiAvaSQoQkNCKVxpbmNsdWRlCitBRkxBR1MgPSAvbXggL3cyIC96bgorTEZMQUdTID0gLUlSZWxlYXNlXG9ialxsaWJleHBhdHcgLUQiIiAtYWEgLVRwZCAteCAtR24gLUdpIC13IC1xCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUxMT0JKID0gYzBkMzJ3Lm9iaiAkKE9CSkZJTEVTKQorQUxMUkVTID0gJChSRVNGSUxFUykKK0FMTExJQiA9ICQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWZkZWYgSURFT1BUSU9OUworCitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPSQoQkNCKVxzb3VyY2VcdmNsCisKKyFlbmRpZgorCisKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1BS0UgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IGZpbGUgaXMgbm90IHVzZWQgYnkgdGhlIEJDQiBJREUuICBJdCBpcyBmb3IKKyMgdGhlIGJlbmVmaXQgb2YgYnVpbGRpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHVzaW5nIHRoZSBNQUtFIHV0aWxpdHkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuYXV0b2RlcGVuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChVU0VSREVGSU5FUykiICE9ICIiCitBVVNFUkRFRklORVMgPSAtZCQoVVNFUkRFRklORVM6Oz0gLWQpCishZWxzZQorQVVTRVJERUZJTkVTID0KKyFlbmRpZgorCishaWYgISRkKEJDQzMyKQorQkNDMzIgPSBiY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoQ1BQMzIpCitDUFAzMiA9IGNwcDMyCishZW5kaWYKKworIWlmICEkZChEQ0MzMikKK0RDQzMyID0gZGNjMzIKKyFlbmRpZgorCishaWYgISRkKFRBU00zMikKK1RBU00zMiA9IHRhc20zMgorIWVuZGlmCisKKyFpZiAhJGQoTElOS0VSKQorTElOS0VSID0gaWxpbmszMgorIWVuZGlmCisKKyFpZiAhJGQoQlJDQzMyKQorQlJDQzMyID0gYnJjYzMyCishZW5kaWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICRkKFBBVEhDUFApCisuUEFUSC5DUFAgPSAkKFBBVEhDUFApCisuUEFUSC5DICAgPSAkKFBBVEhDUFApCishZW5kaWYKKworIWlmICRkKFBBVEhQQVMpCisuUEFUSC5QQVMgPSAkKFBBVEhQQVMpCishZW5kaWYKKworIWlmICRkKFBBVEhBU00pCisuUEFUSC5BU00gPSAkKFBBVEhBU00pCishZW5kaWYKKworIWlmICRkKFBBVEhSQykKKy5QQVRILlJDICA9ICQoUEFUSFJDKQorIWVuZGlmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJChQUk9KRUNUKTogJChJRExHRU5GSUxFUykgJChPQkpGSUxFUykgJChSRVNERVBFTikgJChERUZGSUxFKQorICAgICQoQkNCKVxCSU5cJChMSU5LRVIpIEAmJiEKKyAgICAkKExGTEFHUykgLUwkKExJQlBBVEgpICsKKyAgICAkKEFMTE9CSiksICsKKyAgICAkKFBST0pFQ1QpLCwgKworICAgICQoQUxMTElCKSwgKworICAgICQoREVGRklMRSksICsKKyAgICAkKEFMTFJFUykKKyEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisucGFzLmhwcDoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5wYXMub2JqOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLmNwcC5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuY3BwLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5hc20ub2JqOgorICAgICQoQkNCKVxCSU5cJChUQVNNMzIpICQoQUZMQUdTKSAtaSQoSU5DTFVERVBBVEg6Oz0gLWkpICQoQVVTRVJERUZJTkVTKSAtZCQoU1lTREVGSU5FUzo7PSAtZCkgJDwsICRACisKKy5yYy5yZXM6CisgICAgJChCQ0IpXEJJTlwkKEJSQ0MzMikgJChSRkxBR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1mbyRAICQ8CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMuYnBmIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHdfc3RhdGljLmJwZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Y2E0NThlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHdfc3RhdGljLmJwZgpAQCAtMCwwICsxLDUgQEAKK1VTRVVOSVQoIi4uXGxpYlx4bWxwYXJzZS5jIik7CitVU0VVTklUKCIuLlxsaWJceG1scm9sZS5jIik7CitVU0VVTklUKCIuLlxsaWJceG1sdG9rLmMiKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIExpYnJhcnkKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvZXhwYXR3X3N0YXRpYy5icHIgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMuYnByCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmMTI2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMuYnByCkBAIC0wLDAgKzEsMTUyIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCcgPz4KKzwhLS0gQysrQnVpbGRlciBYTUwgUHJvamVjdCAtLT4KKzxQUk9KRUNUPgorICA8TUFDUk9TPgorICAgIDxWRVJTSU9OIHZhbHVlPSJCQ0IuMDUuMDMiLz4KKyAgICA8UFJPSkVDVCB2YWx1ZT0iUmVsZWFzZVxsaWJleHBhdHdzX210ZC5saWIiLz4KKyAgICA8T0JKRklMRVMgdmFsdWU9IlJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWNceG1scGFyc2Uub2JqIAorICAgICAgUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpY1x4bWxyb2xlLm9iaiAKKyAgICAgIFJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWNceG1sdG9rLm9iaiIvPgorICAgIDxSRVNGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMR0VORklMRVMgdmFsdWU9IiIvPgorICAgIDxERUZGSUxFIHZhbHVlPSIiLz4KKyAgICA8UkVTREVQRU4gdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPExJQkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8TElCUkFSSUVTIHZhbHVlPSIiLz4KKyAgICA8U1BBUkVMSUJTIHZhbHVlPSIiLz4KKyAgICA8UEFDS0FHRVMgdmFsdWU9IiIvPgorICAgIDxQQVRIQ1BQIHZhbHVlPSIuOy4uXGxpYiIvPgorICAgIDxQQVRIUEFTIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIUkMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhBU00gdmFsdWU9Ii47Ii8+CisgICAgPERFQlVHTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxkZWJ1ZyIvPgorICAgIDxSRUxFQVNFTElCUEFUSCB2YWx1ZT0iJChCQ0IpXGxpYlxyZWxlYXNlIi8+CisgICAgPExJTktFUiB2YWx1ZT0iVExpYiIvPgorICAgIDxVU0VSREVGSU5FUyB2YWx1ZT0iX1dJTkRPV1M7V0lOMzI7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1NUQVRJQztYTUxfVU5JQ09ERV9XQ0hBUl9UIi8+CisgICAgPFNZU0RFRklORVMgdmFsdWU9Il9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwiLz4KKyAgICA8TUFJTlNPVVJDRSB2YWx1ZT0iZXhwYXR3X3N0YXRpYy5icGYiLz4KKyAgICA8SU5DTFVERVBBVEggdmFsdWU9Ii4uXGxpYjskKEJDQilcaW5jbHVkZSIvPgorICAgIDxMSUJQQVRIIHZhbHVlPSIuLlxsaWI7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKSIvPgorICAgIDxXQVJOSU5HUyB2YWx1ZT0iLXctcmNoIC13LXBhciAtdy04MDI3IC13LTgwMjYgLXctY2NjIi8+CisgICAgPExJU1RGSUxFIHZhbHVlPSIiLz4KKyAgPC9NQUNST1M+CisgIDxPUFRJT05TPgorICAgIDxJRExDRkxBR1MgdmFsdWU9Ii1JJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8Q0ZMQUcxIHZhbHVlPSItTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC10V00gLWMiLz4KKyAgICA8UEZMQUdTIHZhbHVlPSItTjJSZWxlYXNlXG9ialxsaWJleHBhdHdfc3RhdGljIC1OMFJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWMgLSRZLSAtJEwtIAorICAgICAgLSRELSIvPgorICAgIDxSRkxBR1MgdmFsdWU9Ii9sIDB4NDA5IC9kICZxdW90O05ERUJVRyZxdW90OyAvaSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPEFGTEFHUyB2YWx1ZT0iL214IC93MiAvem4iLz4KKyAgICA8TEZMQUdTIHZhbHVlPSIiLz4KKyAgPC9PUFRJT05TPgorICA8TElOS0VSPgorICAgIDxBTExPQkogdmFsdWU9IiQoT0JKRklMRVMpIi8+CisgICAgPEFMTFJFUyB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8QUxMTElCIHZhbHVlPSIkKExJQkZJTEVTKSAkKExJQlJBUklFUykiLz4KKyAgPC9MSU5LRVI+CisgIDxJREVPUFRJT05TPgorW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCitMb2NhbGU9MTAzMworQ29kZVBhZ2U9MTI1MgorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tIaXN0b3J5TGlzdHNcaGxJbmNsdWRlUGF0aF0KK0NvdW50PTQKK0l0ZW0wPS4uXGxpYjskKEJDQilcaW5jbHVkZQorSXRlbTE9JChCQ0IpXGluY2x1ZGUKK0l0ZW0yPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGwKK0l0ZW0zPSQoQkNCKVxpbmNsdWRlOyQoQkNCKVxpbmNsdWRlXG1mYzskKEJDQilcaW5jbHVkZVxhdGw7CisKK1tIaXN0b3J5TGlzdHNcaGxMaWJyYXJ5UGF0aF0KK0NvdW50PTUKK0l0ZW0wPS4uXGxpYjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMT0uLlxsaWI7JChCQ0IpXGxpYjsuLlxsaWJcJChSRUxFQVNFTElCUEFUSCkKK0l0ZW0yPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK0l0ZW0zPSQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCk7JChCQ0IpXGxpYlxwc2RrCitJdGVtND0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOzskKEJDQilcbGliXHBzZGs7CisKK1tIaXN0b3J5TGlzdHNcaGxEZWJ1Z1NvdXJjZVBhdGhdCitDb3VudD0xCitJdGVtMD0kKEJDQilcc291cmNlXHZjbAorCitbSGlzdG9yeUxpc3RzXGhsQ29uZGl0aW9uYWxzXQorQ291bnQ9MTUKK0l0ZW0wPV9XSU5ET1dTO1dJTjMyO05ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9TVEFUSUM7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTE9X1dJTkRPV1M7V0lOMzI7TkRFQlVHO19ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9TVEFUSUM7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTI9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9TVEFUSUM7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTM9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19ERUJVRztfTElCO1hNTF9TVEFUSUM7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTQ9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19MSUI7Q09NUElMRURfRlJPTV9EU1A7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW01PVdJTjMyO19XSU5ET1dTO05ERUJVRztfVU5JQ09ERTtfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFX1dDSEFSX1Q7X0RFQlVHCitJdGVtNj1XSU4zMjtfV0lORE9XUztOREVCVUc7X1VOSUNPREU7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERV9XQ0hBUl9UO19ERUJVRztfX2NwbHVzcGx1cworSXRlbTc9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19VTklDT0RFO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREU7X0RFQlVHCitJdGVtOD1XSU4zMjtfV0lORE9XUztOREVCVUc7X01CQ1M7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERTtfREVCVUcKK0l0ZW05PVdJTjMyO19XSU5ET1dTO05ERUJVRztfTUJDUztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFX1dDSEFSX1Q7X0RFQlVHO19fV0NIQVJfVAorSXRlbTEwPVdJTjMyO19XSU5ET1dTO05ERUJVRztfTUJDUztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9VTklDT0RFX1dDSEFSX1Q7X0RFQlVHO19VTklDT0RFCitJdGVtMTE9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19NQkNTO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREU7X0RFQlVHO19VTklDT0RFCitJdGVtMTI9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19NQkNTO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREVfV0NIQVJfVDtfREVCVUcKK0l0ZW0xMz1XSU4zMjtfV0lORE9XUztOREVCVUc7X01CQ1M7X0xJQjtDT01QSUxFRF9GUk9NX0RTUDtYTUxfVU5JQ09ERV9XQ0hBUl9UCitJdGVtMTQ9V0lOMzI7X1dJTkRPV1M7TkRFQlVHO19NQkNTO19MSUI7Q09NUElMRURfRlJPTV9EU1A7WE1MX1VOSUNPREVfV0NIQVJfVDtYTUxfVU5JQ09ERQorCitbSGlzdG9yeUxpc3RzXGhsSW50T3V0cHV0RGlyXQorQ291bnQ9NgorSXRlbTA9UmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpYworSXRlbTE9UmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljCitJdGVtMj1SZWxlYXNlXG9ialxtdHMKK0l0ZW0zPVJlbGVhc2Vcb2JqXG10CitJdGVtND0uLlxsaWJcUmVsZWFzZS13X3N0YXRpYworSXRlbTU9UmVsZWFzZS13X3N0YXRpYworCitbSGlzdG9yeUxpc3RzXGhsRmluYWxPdXRwdXREaXJdCitDb3VudD0zCitJdGVtMD1SZWxlYXNlXAorSXRlbTE9UmVsZWFzZQorSXRlbTI9UmVsZWFzZS13X3N0YXRpY1wKKworW0hpc3RvcnlMaXN0c1xobFRsaWJQYWdlU2l6ZV0KK0NvdW50PTEKK0l0ZW0wPTB4MDAxMAorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPQorCitbUGFyYW1ldGVyc10KK1J1blBhcmFtcz0KK0hvc3RBcHBsaWNhdGlvbj0KK1JlbW90ZUhvc3Q9CitSZW1vdGVQYXRoPQorUmVtb3RlRGVidWc9MAorCitbQ29tcGlsZXJdCitTaG93SW5mb01zZ3M9MAorTGlua0RlYnVnVmNsPTAKK0xpbmtDR0xJQj0wCisKK1tMYW5ndWFnZV0KK0FjdGl2ZUxhbmc9CitQcm9qZWN0TGFuZz0KK1Jvb3REaXI9CisgIDwvSURFT1BUSU9OUz4KKzwvUFJPSkVDVD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2V4cGF0d19zdGF0aWMubWFrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHdfc3RhdGljLm1hawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNmI3ZTViCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9leHBhdHdfc3RhdGljLm1hawpAQCAtMCwwICsxLDE5MCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAhJGQoQkNCKQorQkNCID0gJChNQUtFRElSKVwuLgorIWVuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElERSBTRUNUSU9OCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgdGhlIHByb2plY3QgbWFrZWZpbGUgaXMgbWFuYWdlZCBieSB0aGUgQkNCIElERS4KKyMgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBJREUgdG8gY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoaXMKKyMgc2VjdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZFUlNJT04gPSBCQ0IuMDUuMDMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQUk9KRUNUID0gUmVsZWFzZVxsaWJleHBhdHdzX210ZC5saWIKK09CSkZJTEVTID0gUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpY1x4bWxwYXJzZS5vYmogXAorICAgIFJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWNceG1scm9sZS5vYmogXAorICAgIFJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWNceG1sdG9rLm9iagorUkVTRklMRVMgPSAKK01BSU5TT1VSQ0UgPSBleHBhdHdfc3RhdGljLmJwZgorUkVTREVQRU4gPSAkKFJFU0ZJTEVTKQorTElCRklMRVMgPSAKK0lETEZJTEVTID0gCitJRExHRU5GSUxFUyA9IAorTElCUkFSSUVTID0gCitQQUNLQUdFUyA9IAorU1BBUkVMSUJTID0gCitERUZGSUxFID0gCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUEFUSENQUCA9IC47Li5cbGliCitQQVRIQVNNID0gLjsKK1BBVEhQQVMgPSAuOworUEFUSFJDID0gLjsKK0xJTktFUiA9IFRMaWIKK0RFQlVHTElCUEFUSCA9ICQoQkNCKVxsaWJcZGVidWcKK1JFTEVBU0VMSUJQQVRIID0gJChCQ0IpXGxpYlxyZWxlYXNlCitVU0VSREVGSU5FUyA9IF9XSU5ET1dTO1dJTjMyO05ERUJVRztfTElCO0NPTVBJTEVEX0ZST01fRFNQO1hNTF9TVEFUSUM7WE1MX1VOSUNPREVfV0NIQVJfVAorU1lTREVGSU5FUyA9IF9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwKK0lOQ0xVREVQQVRIID0gLi5cbGliOyQoQkNCKVxpbmNsdWRlCitMSUJQQVRIID0gLi5cbGliOyQoQkNCKVxsaWI7JChSRUxFQVNFTElCUEFUSCkKK1dBUk5JTkdTID0gLXctcmNoIC13LXBhciAtdy04MDI3IC13LTgwMjYgLXctY2NjCitMSVNURklMRSA9IAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NGTEFHMSA9IC1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtYworSURMQ0ZMQUdTID0gLUkkKEJDQilcaW5jbHVkZQorUEZMQUdTID0gLU4yUmVsZWFzZVxvYmpcbGliZXhwYXR3X3N0YXRpYyAtTjBSZWxlYXNlXG9ialxsaWJleHBhdHdfc3RhdGljIC0kWS0gLSRMLSBcCisgICAgLSRELQorUkZMQUdTID0gL2wgMHg0MDkgL2QgIk5ERUJVRyIgL2kkKEJDQilcaW5jbHVkZQorQUZMQUdTID0gL214IC93MiAvem4KK0xGTEFHUyA9IAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMTE9CSiA9ICQoT0JKRklMRVMpCitBTExSRVMgPSAkKFJFU0ZJTEVTKQorQUxMTElCID0gJChMSUJGSUxFUykgJChMSUJSQVJJRVMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmZGVmIElERU9QVElPTlMKKworW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0kKEJDQilcc291cmNlXHZjbAorCishZW5kaWYKKworCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNQUtFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBmaWxlIGlzIG5vdCB1c2VkIGJ5IHRoZSBCQ0IgSURFLiAgSXQgaXMgZm9yCisjIHRoZSBiZW5lZml0IG9mIGJ1aWxkaW5nIGZyb20gdGhlIGNvbW1hbmQtbGluZSB1c2luZyB0aGUgTUFLRSB1dGlsaXR5LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmF1dG9kZXBlbmQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgIiQoVVNFUkRFRklORVMpIiAhPSAiIgorQVVTRVJERUZJTkVTID0gLWQkKFVTRVJERUZJTkVTOjs9IC1kKQorIWVsc2UKK0FVU0VSREVGSU5FUyA9CishZW5kaWYKKworIWlmICEkZChCQ0MzMikKK0JDQzMyID0gYmNjMzIKKyFlbmRpZgorCishaWYgISRkKENQUDMyKQorQ1BQMzIgPSBjcHAzMgorIWVuZGlmCisKKyFpZiAhJGQoRENDMzIpCitEQ0MzMiA9IGRjYzMyCishZW5kaWYKKworIWlmICEkZChUQVNNMzIpCitUQVNNMzIgPSB0YXNtMzIKKyFlbmRpZgorCishaWYgISRkKExJTktFUikKK0xJTktFUiA9IFRMaWIKKyFlbmRpZgorCishaWYgISRkKEJSQ0MzMikKK0JSQ0MzMiA9IGJyY2MzMgorIWVuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAkZChQQVRIQ1BQKQorLlBBVEguQ1BQID0gJChQQVRIQ1BQKQorLlBBVEguQyAgID0gJChQQVRIQ1BQKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUEFTKQorLlBBVEguUEFTID0gJChQQVRIUEFTKQorIWVuZGlmCisKKyFpZiAkZChQQVRIQVNNKQorLlBBVEguQVNNID0gJChQQVRIQVNNKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUkMpCisuUEFUSC5SQyAgPSAkKFBBVEhSQykKKyFlbmRpZgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChMSVNURklMRSkiID09ICAiIgorQ09NTUEgPQorIWVsc2UKK0NPTU1BID0gLAorIWVuZGlmCisKKyQoUFJPSkVDVCk6ICQoSURMR0VORklMRVMpICQoT0JKRklMRVMpICQoUkVTREVQRU4pICQoREVGRklMRSkKKyAgICAkKEJDQilcQklOXCQoTElOS0VSKSAvdSAkQCBAJiYhCisgICAgJChMRkxBR1MpICQ/ICQoQ09NTUEpICQoTElTVEZJTEUpCisKKyEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisucGFzLmhwcDoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5wYXMub2JqOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLmNwcC5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuY3BwLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5hc20ub2JqOgorICAgICQoQkNCKVxCSU5cJChUQVNNMzIpICQoQUZMQUdTKSAtaSQoSU5DTFVERVBBVEg6Oz0gLWkpICQoQVVTRVJERUZJTkVTKSAtZCQoU1lTREVGSU5FUzo7PSAtZCkgJDwsICRACisKKy5yYy5yZXM6CisgICAgJChCQ0IpXEJJTlwkKEJSQ0MzMikgJChSRkxBR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1mbyRAICQ8CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2xpYmV4cGF0X210ZC5kZWYgYi9leHBhdC0yLjAuMS9iY2I1L2xpYmV4cGF0X210ZC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmMxY2I5NQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvbGliZXhwYXRfbXRkLmRlZgpAQCAtMCwwICsxLDE0MSBAQAorOyBERUYgZmlsZSBmb3IgQkNCNQorTElCUkFSWSAgIExJQkVYUEFUX01URAorREVTQ1JJUFRJT04gIkltcGxlbWVudHMgYW4gWE1MIHBhcnNlci4iCitFWFBPUlRTCisgIF9YTUxfRGVmYXVsdEN1cnJlbnQgQDEKKyAgX1hNTF9FcnJvclN0cmluZyBAMgorICBfWE1MX0V4cGF0VmVyc2lvbiBAMworICBfWE1MX0V4cGF0VmVyc2lvbkluZm8gQDQKKyAgX1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSBANQorICBfWE1MX0dldEJhc2UgQDYKKyAgX1hNTF9HZXRCdWZmZXIgQDcKKyAgX1hNTF9HZXRDdXJyZW50Qnl0ZUNvdW50IEA4CisgIF9YTUxfR2V0Q3VycmVudEJ5dGVJbmRleCBAOQorICBfWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgQDEwCisgIF9YTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgQDExCisgIF9YTUxfR2V0RXJyb3JDb2RlIEAxMgorICBfWE1MX0dldElkQXR0cmlidXRlSW5kZXggQDEzCisgIF9YTUxfR2V0SW5wdXRDb250ZXh0IEAxNAorICBfWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50IEAxNQorICBfWE1MX1BhcnNlIEAxNgorICBfWE1MX1BhcnNlQnVmZmVyIEAxNworICBfWE1MX1BhcnNlckNyZWF0ZSBAMTgKKyAgX1hNTF9QYXJzZXJDcmVhdGVOUyBAMTkKKyAgX1hNTF9QYXJzZXJDcmVhdGVfTU0gQDIwCisgIF9YTUxfUGFyc2VyRnJlZSBAMjEKKyAgX1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIgQDIyCisgIF9YTUxfU2V0QmFzZSBAMjMKKyAgX1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyIEAyNAorICBfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIEAyNQorICBfWE1MX1NldENvbW1lbnRIYW5kbGVyIEAyNgorICBfWE1MX1NldERlZmF1bHRIYW5kbGVyIEAyNworICBfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kIEAyOAorICBfWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciBAMjkKKyAgX1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIgQDMwCisgIF9YTUxfU2V0RWxlbWVudEhhbmRsZXIgQDMxCisgIF9YTUxfU2V0RW5jb2RpbmcgQDMyCisgIF9YTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBAMzMKKyAgX1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIgQDM0CisgIF9YTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIgQDM1CisgIF9YTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgQDM2CisgIF9YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIgQDM3CisgIF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIEAzOAorICBfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyBAMzkKKyAgX1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciBANDAKKyAgX1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciBANDEKKyAgX1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyIEA0MgorICBfWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyBANDMKKyAgX1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIEA0NAorICBfWE1MX1NldFJldHVybk5TVHJpcGxldCBANDUKKyAgX1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgQDQ2CisgIF9YTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgQDQ3CisgIF9YTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlciBANDgKKyAgX1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIEA0OQorICBfWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIgQDUwCisgIF9YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciBANTEKKyAgX1hNTF9TZXRVc2VyRGF0YSBANTIKKyAgX1hNTF9TZXRYbWxEZWNsSGFuZGxlciBANTMKKyAgX1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcgQDU0Cis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjMKKyAgX1hNTF9QYXJzZXJSZXNldCBANTUKKyAgX1hNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlciBANTYKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuNQorICBfWE1MX0dldEZlYXR1cmVMaXN0IEA1NworICBfWE1MX1VzZUZvcmVpZ25EVEQgQDU4Cis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjYKKyAgX1hNTF9GcmVlQ29udGVudE1vZGVsIEA1OQorICBfWE1MX01lbU1hbGxvYyBANjAKKyAgX1hNTF9NZW1SZWFsbG9jIEA2MQorICBfWE1MX01lbUZyZWUgQDYyCis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjgKKyAgX1hNTF9TdG9wUGFyc2VyIEA2MworICBfWE1MX1Jlc3VtZVBhcnNlciBANjQKKyAgX1hNTF9HZXRQYXJzaW5nU3RhdHVzIEA2NQorCis7IEFsaWFzZXMgZm9yIE1TIGNvbXBhdGlibGUgbmFtZXMKKyAgWE1MX0RlZmF1bHRDdXJyZW50ID0gX1hNTF9EZWZhdWx0Q3VycmVudAorICBYTUxfRXJyb3JTdHJpbmcgPSBfWE1MX0Vycm9yU3RyaW5nCisgIFhNTF9FeHBhdFZlcnNpb24gPSBfWE1MX0V4cGF0VmVyc2lvbgorICBYTUxfRXhwYXRWZXJzaW9uSW5mbyA9IF9YTUxfRXhwYXRWZXJzaW9uSW5mbworICBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUgPSBfWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlCisgIFhNTF9HZXRCYXNlID0gX1hNTF9HZXRCYXNlCisgIFhNTF9HZXRCdWZmZXIgPSBfWE1MX0dldEJ1ZmZlcgorICBYTUxfR2V0Q3VycmVudEJ5dGVDb3VudCA9IF9YTUxfR2V0Q3VycmVudEJ5dGVDb3VudAorICBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleCA9IF9YTUxfR2V0Q3VycmVudEJ5dGVJbmRleAorICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciA9IF9YTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcgorICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgPSBfWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyCisgIFhNTF9HZXRFcnJvckNvZGUgPSBfWE1MX0dldEVycm9yQ29kZQorICBYTUxfR2V0SWRBdHRyaWJ1dGVJbmRleCA9IF9YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleAorICBYTUxfR2V0SW5wdXRDb250ZXh0ID0gX1hNTF9HZXRJbnB1dENvbnRleHQKKyAgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50ID0gX1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudAorICBYTUxfUGFyc2UgPSBfWE1MX1BhcnNlCisgIFhNTF9QYXJzZUJ1ZmZlciA9IF9YTUxfUGFyc2VCdWZmZXIKKyAgWE1MX1BhcnNlckNyZWF0ZSA9IF9YTUxfUGFyc2VyQ3JlYXRlCisgIFhNTF9QYXJzZXJDcmVhdGVOUyA9IF9YTUxfUGFyc2VyQ3JlYXRlTlMKKyAgWE1MX1BhcnNlckNyZWF0ZV9NTSA9IF9YTUxfUGFyc2VyQ3JlYXRlX01NCisgIFhNTF9QYXJzZXJGcmVlID0gX1hNTF9QYXJzZXJGcmVlCisgIFhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIgPSBfWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcgorICBYTUxfU2V0QmFzZSA9IF9YTUxfU2V0QmFzZQorICBYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciA9IF9YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcgorICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBfWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyCisgIFhNTF9TZXRDb21tZW50SGFuZGxlciA9IF9YTUxfU2V0Q29tbWVudEhhbmRsZXIKKyAgWE1MX1NldERlZmF1bHRIYW5kbGVyID0gX1hNTF9TZXREZWZhdWx0SGFuZGxlcgorICBYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQgPSBfWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kCisgIFhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIgPSBfWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcgorICBYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyID0gX1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyID0gX1hNTF9TZXRFbGVtZW50SGFuZGxlcgorICBYTUxfU2V0RW5jb2RpbmcgPSBfWE1MX1NldEVuY29kaW5nCisgIFhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gX1hNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyCisgIFhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBfWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcgorICBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIgPSBfWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyCisgIFhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IF9YTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIKKyAgWE1MX1NldEVudGl0eURlY2xIYW5kbGVyID0gX1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcgorICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gX1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIKKyAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyA9IF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnCisgIFhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciA9IF9YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIKKyAgWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyID0gX1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcgorICBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciA9IF9YTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcgorICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nID0gX1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcKKyAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBfWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIKKyAgWE1MX1NldFJldHVybk5TVHJpcGxldCA9IF9YTUxfU2V0UmV0dXJuTlNUcmlwbGV0CisgIFhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBfWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcgorICBYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgPSBfWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyCisgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyID0gX1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyCisgIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gX1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyCisgIFhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyID0gX1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyCisgIFhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gX1hNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyCisgIFhNTF9TZXRVc2VyRGF0YSA9IF9YTUxfU2V0VXNlckRhdGEKKyAgWE1MX1NldFhtbERlY2xIYW5kbGVyID0gX1hNTF9TZXRYbWxEZWNsSGFuZGxlcgorICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnID0gX1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcKKyAgWE1MX1BhcnNlclJlc2V0ID0gX1hNTF9QYXJzZXJSZXNldAorICBYTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIgPSBfWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyCisgIFhNTF9HZXRGZWF0dXJlTGlzdCA9IF9YTUxfR2V0RmVhdHVyZUxpc3QKKyAgWE1MX1VzZUZvcmVpZ25EVEQgPSBfWE1MX1VzZUZvcmVpZ25EVEQKKyAgWE1MX0ZyZWVDb250ZW50TW9kZWwgPSBfWE1MX0ZyZWVDb250ZW50TW9kZWwKKyAgWE1MX01lbU1hbGxvYyA9IF9YTUxfTWVtTWFsbG9jCisgIFhNTF9NZW1SZWFsbG9jID0gX1hNTF9NZW1SZWFsbG9jCisgIFhNTF9NZW1GcmVlID0gX1hNTF9NZW1GcmVlCisgIFhNTF9TdG9wUGFyc2VyID0gX1hNTF9TdG9wUGFyc2VyCisgIFhNTF9SZXN1bWVQYXJzZXIgPSBfWE1MX1Jlc3VtZVBhcnNlcgorICBYTUxfR2V0UGFyc2luZ1N0YXR1cyA9IF9YTUxfR2V0UGFyc2luZ1N0YXR1cworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L2xpYmV4cGF0d19tdGQuZGVmIGIvZXhwYXQtMi4wLjEvYmNiNS9saWJleHBhdHdfbXRkLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTg0NjJkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9saWJleHBhdHdfbXRkLmRlZgpAQCAtMCwwICsxLDE0MCBAQAorOyBERUYgZmlsZSBmb3IgQkNCNQorTElCUkFSWSAgIExJQkVYUEFUV19NVEQKK0RFU0NSSVBUSU9OICJJbXBsZW1lbnRzIGFuIFhNTCBwYXJzZXIuIgorRVhQT1JUUworICBfWE1MX0RlZmF1bHRDdXJyZW50IEAxCisgIF9YTUxfRXJyb3JTdHJpbmcgQDIKKyAgX1hNTF9FeHBhdFZlcnNpb24gQDMKKyAgX1hNTF9FeHBhdFZlcnNpb25JbmZvIEA0CisgIF9YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUgQDUKKyAgX1hNTF9HZXRCYXNlIEA2CisgIF9YTUxfR2V0QnVmZmVyIEA3CisgIF9YTUxfR2V0Q3VycmVudEJ5dGVDb3VudCBAOAorICBfWE1MX0dldEN1cnJlbnRCeXRlSW5kZXggQDkKKyAgX1hNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyIEAxMAorICBfWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIEAxMQorICBfWE1MX0dldEVycm9yQ29kZSBAMTIKKyAgX1hNTF9HZXRJZEF0dHJpYnV0ZUluZGV4IEAxMworICBfWE1MX0dldElucHV0Q29udGV4dCBAMTQKKyAgX1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCBAMTUKKyAgX1hNTF9QYXJzZSBAMTYKKyAgX1hNTF9QYXJzZUJ1ZmZlciBAMTcKKyAgX1hNTF9QYXJzZXJDcmVhdGUgQDE4CisgIF9YTUxfUGFyc2VyQ3JlYXRlTlMgQDE5CisgIF9YTUxfUGFyc2VyQ3JlYXRlX01NIEAyMAorICBfWE1MX1BhcnNlckZyZWUgQDIxCisgIF9YTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyIEAyMgorICBfWE1MX1NldEJhc2UgQDIzCisgIF9YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciBAMjQKKyAgX1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciBAMjUKKyAgX1hNTF9TZXRDb21tZW50SGFuZGxlciBAMjYKKyAgX1hNTF9TZXREZWZhdWx0SGFuZGxlciBAMjcKKyAgX1hNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCBAMjgKKyAgX1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIgQDI5CisgIF9YTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyIEAzMAorICBfWE1MX1NldEVsZW1lbnRIYW5kbGVyIEAzMQorICBfWE1MX1NldEVuY29kaW5nIEAzMgorICBfWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIgQDMzCisgIF9YTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyIEAzNAorICBfWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyIEAzNQorICBfWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyIEAzNgorICBfWE1MX1NldEVudGl0eURlY2xIYW5kbGVyIEAzNworICBfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciBAMzgKKyAgX1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgQDM5CisgIF9YTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIgQDQwCisgIF9YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIgQDQxCisgIF9YTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciBANDIKKyAgX1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcgQDQzCisgIF9YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBANDQKKyAgX1hNTF9TZXRSZXR1cm5OU1RyaXBsZXQgQDQ1CisgIF9YTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIEA0NgorICBfWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIEA0NworICBfWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIgQDQ4CisgIF9YTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBANDkKKyAgX1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyIEA1MAorICBfWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgQDUxCisgIF9YTUxfU2V0VXNlckRhdGEgQDUyCisgIF9YTUxfU2V0WG1sRGVjbEhhbmRsZXIgQDUzCisgIF9YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnIEA1NAorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS4zCisgIF9YTUxfUGFyc2VyUmVzZXQgQDU1CisgIF9YTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIgQDU2Cis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjUKKyAgX1hNTF9HZXRGZWF0dXJlTGlzdCBANTcKKyAgX1hNTF9Vc2VGb3JlaWduRFREIEA1OAorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS42CisgIF9YTUxfRnJlZUNvbnRlbnRNb2RlbCBANTkKKyAgX1hNTF9NZW1NYWxsb2MgQDYwCisgIF9YTUxfTWVtUmVhbGxvYyBANjEKKyAgX1hNTF9NZW1GcmVlIEA2MgorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS44CisgIF9YTUxfU3RvcFBhcnNlciBANjMKKyAgX1hNTF9SZXN1bWVQYXJzZXIgQDY0CisgIF9YTUxfR2V0UGFyc2luZ1N0YXR1cyBANjUKKworOyBBbGlhc2VzIGZvciBNUyBjb21wYXRpYmxlIG5hbWVzCisgIFhNTF9EZWZhdWx0Q3VycmVudCA9IF9YTUxfRGVmYXVsdEN1cnJlbnQKKyAgWE1MX0Vycm9yU3RyaW5nID0gX1hNTF9FcnJvclN0cmluZworICBYTUxfRXhwYXRWZXJzaW9uID0gX1hNTF9FeHBhdFZlcnNpb24KKyAgWE1MX0V4cGF0VmVyc2lvbkluZm8gPSBfWE1MX0V4cGF0VmVyc2lvbkluZm8KKyAgWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlID0gX1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZQorICBYTUxfR2V0QmFzZSA9IF9YTUxfR2V0QmFzZQorICBYTUxfR2V0QnVmZmVyID0gX1hNTF9HZXRCdWZmZXIKKyAgWE1MX0dldEN1cnJlbnRCeXRlQ291bnQgPSBfWE1MX0dldEN1cnJlbnRCeXRlQ291bnQKKyAgWE1MX0dldEN1cnJlbnRCeXRlSW5kZXggPSBfWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgKKyAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgPSBfWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIKKyAgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyID0gX1hNTF9HZXRDdXJyZW50TGluZU51bWJlcgorICBYTUxfR2V0RXJyb3JDb2RlID0gX1hNTF9HZXRFcnJvckNvZGUKKyAgWE1MX0dldElkQXR0cmlidXRlSW5kZXggPSBfWE1MX0dldElkQXR0cmlidXRlSW5kZXgKKyAgWE1MX0dldElucHV0Q29udGV4dCA9IF9YTUxfR2V0SW5wdXRDb250ZXh0CisgIFhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCA9IF9YTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQKKyAgWE1MX1BhcnNlID0gX1hNTF9QYXJzZQorICBYTUxfUGFyc2VCdWZmZXIgPSBfWE1MX1BhcnNlQnVmZmVyCisgIFhNTF9QYXJzZXJDcmVhdGUgPSBfWE1MX1BhcnNlckNyZWF0ZQorICBYTUxfUGFyc2VyQ3JlYXRlTlMgPSBfWE1MX1BhcnNlckNyZWF0ZU5TCisgIFhNTF9QYXJzZXJDcmVhdGVfTU0gPSBfWE1MX1BhcnNlckNyZWF0ZV9NTQorICBYTUxfUGFyc2VyRnJlZSA9IF9YTUxfUGFyc2VyRnJlZQorICBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyID0gX1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIKKyAgWE1MX1NldEJhc2UgPSBfWE1MX1NldEJhc2UKKyAgWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIgPSBfWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIKKyAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyID0gX1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcgorICBYTUxfU2V0Q29tbWVudEhhbmRsZXIgPSBfWE1MX1NldENvbW1lbnRIYW5kbGVyCisgIFhNTF9TZXREZWZhdWx0SGFuZGxlciA9IF9YTUxfU2V0RGVmYXVsdEhhbmRsZXIKKyAgWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kID0gX1hNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZAorICBYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyID0gX1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIKKyAgWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciA9IF9YTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyCisgIFhNTF9TZXRFbGVtZW50SGFuZGxlciA9IF9YTUxfU2V0RWxlbWVudEhhbmRsZXIKKyAgWE1MX1NldEVuY29kaW5nID0gX1hNTF9TZXRFbmNvZGluZworICBYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlciA9IF9YTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcgorICBYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyID0gX1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIKKyAgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyID0gX1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlcgorICBYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBfWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyCisgIFhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlciA9IF9YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIKKyAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IF9YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyCisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSBfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZworICBYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBfWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyCisgIFhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciA9IF9YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIKKyAgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIgPSBfWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIKKyAgWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyA9IF9YTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nCisgIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyID0gX1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyCisgIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQgPSBfWE1MX1NldFJldHVybk5TVHJpcGxldAorICBYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gX1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIKKyAgWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyID0gX1hNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcgorICBYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlciA9IF9YTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcgorICBYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciA9IF9YTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcgorICBYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciA9IF9YTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcgorICBYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciA9IF9YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcgorICBYTUxfU2V0VXNlckRhdGEgPSBfWE1MX1NldFVzZXJEYXRhCisgIFhNTF9TZXRYbWxEZWNsSGFuZGxlciA9IF9YTUxfU2V0WG1sRGVjbEhhbmRsZXIKKyAgWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyA9IF9YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnCisgIFhNTF9QYXJzZXJSZXNldCA9IF9YTUxfUGFyc2VyUmVzZXQKKyAgWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyID0gX1hNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlcgorICBYTUxfR2V0RmVhdHVyZUxpc3QgPSBfWE1MX0dldEZlYXR1cmVMaXN0CisgIFhNTF9Vc2VGb3JlaWduRFREID0gX1hNTF9Vc2VGb3JlaWduRFRECisgIFhNTF9GcmVlQ29udGVudE1vZGVsID0gX1hNTF9GcmVlQ29udGVudE1vZGVsCisgIFhNTF9NZW1NYWxsb2MgPSBfWE1MX01lbU1hbGxvYworICBYTUxfTWVtUmVhbGxvYyA9IF9YTUxfTWVtUmVhbGxvYworICBYTUxfTWVtRnJlZSA9IF9YTUxfTWVtRnJlZQorICBYTUxfU3RvcFBhcnNlciA9IF9YTUxfU3RvcFBhcnNlcgorICBYTUxfUmVzdW1lUGFyc2VyID0gX1hNTF9SZXN1bWVQYXJzZXIKKyAgWE1MX0dldFBhcnNpbmdTdGF0dXMgPSBfWE1MX0dldFBhcnNpbmdTdGF0dXMKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUvbWFrZWZpbGUubWFrIGIvZXhwYXQtMi4wLjEvYmNiNS9tYWtlZmlsZS5tYWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQ4ODE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvbWFrZWZpbGUubWFrCkBAIC0wLDAgKzEsMzcgQEAKK2FsbDogc2V0dXAgZXhwYXQgZXhwYXR3IGV4cGF0X3N0YXRpYyBleHBhdHdfc3RhdGljIGVsZW1lbnRzIG91dGxpbmUgeG1sd2YKKworc2V0dXA6Cisgc2V0dXAKKworZXhwYXQ6CisgbWFrZSAtbCAtZmV4cGF0Lm1haworCitleHBhdHc6CisgbWFrZSAtbCAtZmV4cGF0dy5tYWsKKworZXhwYXRfc3RhdGljOgorIG1ha2UgLWwgLWZleHBhdF9zdGF0aWMubWFrCisKK2V4cGF0d19zdGF0aWM6CisgbWFrZSAtbCAtZmV4cGF0d19zdGF0aWMubWFrCisKK2VsZW1lbnRzOgorIG1ha2UgLWwgLWZlbGVtZW50cy5tYWsKKworb3V0bGluZToKKyBtYWtlIC1sIC1mb3V0bGluZS5tYWsKKworeG1sd2Y6CisgbWFrZSAtbCAtZnhtbHdmLm1haworCitjbGVhbjoKKyMgd29ya3Mgb24gV2luOTgvTUUKKyMgZGVsdHJlZSAveSByZWxlYXNlXG9iagorIyB3b3JrcyBvbiBXaW5OVC8yMDAwCisgZGVsIC9zL2YvcSByZWxlYXNlXG9iagorCitkaXN0Y2xlYW46CisjIHdvcmtzIG9uIFdpbjk4L01FCisjIGRlbHRyZWUgL3kgcmVsZWFzZVwqLioKKyMgd29ya3Mgb24gV2luTlQvMjAwMAorIGRlbCAvcy9mL3EgcmVsZWFzZVwqCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L291dGxpbmUuYnBmIGIvZXhwYXQtMi4wLjEvYmNiNS9vdXRsaW5lLmJwZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MmRjZTgzCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9vdXRsaW5lLmJwZgpAQCAtMCwwICsxLDQgQEAKK1VTRVVOSVQoIi4uXGV4YW1wbGVzXG91dGxpbmUuYyIpOworVVNFTElCKCJSZWxlYXNlXGxpYmV4cGF0X210ZC5saWIiKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWluCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L291dGxpbmUuYnByIGIvZXhwYXQtMi4wLjEvYmNiNS9vdXRsaW5lLmJwcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMGFlNWNkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS9vdXRsaW5lLmJwcgpAQCAtMCwwICsxLDEzMiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnID8+Cis8IS0tIEMrK0J1aWxkZXIgWE1MIFByb2plY3QgLS0+Cis8UFJPSkVDVD4KKyAgPE1BQ1JPUz4KKyAgICA8VkVSU0lPTiB2YWx1ZT0iQkNCLjA1LjAzIi8+CisgICAgPFBST0pFQ1QgdmFsdWU9IlJlbGVhc2Vcb3V0bGluZS5leGUiLz4KKyAgICA8T0JKRklMRVMgdmFsdWU9IlJlbGVhc2Vcb2JqXGV4YW1wbGVzXG91dGxpbmUub2JqIi8+CisgICAgPFJFU0ZJTEVTIHZhbHVlPSIiLz4KKyAgICA8SURMRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExHRU5GSUxFUyB2YWx1ZT0iIi8+CisgICAgPERFRkZJTEUgdmFsdWU9IiIvPgorICAgIDxSRVNERVBFTiB2YWx1ZT0iJChSRVNGSUxFUykiLz4KKyAgICA8TElCRklMRVMgdmFsdWU9IlJlbGVhc2VcbGliZXhwYXRfbXRkLmxpYiIvPgorICAgIDxMSUJSQVJJRVMgdmFsdWU9IiIvPgorICAgIDxTUEFSRUxJQlMgdmFsdWU9IiIvPgorICAgIDxQQUNLQUdFUyB2YWx1ZT0iVkNMNTAuYnBpIFZDTFg1MC5icGkgYmNic21wNTAuYnBpIFFSUFQ1MC5icGkgVkNMREI1MC5icGkgVkNMQkRFNTAuYnBpIAorICAgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSAKKyAgICAgIFZDTElCNTAuYnBpIGJjYmllNTAuYnBpIFZDTElFNTAuYnBpIElORVREQjUwLmJwaSBJTkVUNTAuYnBpIE5NRkFTVDUwLmJwaSAKKyAgICAgIGRjbG9jeDUwLmJwaSBiY2Iya2F4c2VydmVyNTAuYnBpIGRjbHVzcjUwLmJwaSIvPgorICAgIDxQQVRIQ1BQIHZhbHVlPSIuOy4uXGV4YW1wbGVzIi8+CisgICAgPFBBVEhQQVMgdmFsdWU9Ii47Ii8+CisgICAgPFBBVEhSQyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSEFTTSB2YWx1ZT0iLjsiLz4KKyAgICA8REVCVUdMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXGRlYnVnIi8+CisgICAgPFJFTEVBU0VMSUJQQVRIIHZhbHVlPSIkKEJDQilcbGliXHJlbGVhc2UiLz4KKyAgICA8TElOS0VSIHZhbHVlPSJpbGluazMyIi8+CisgICAgPFVTRVJERUZJTkVTIHZhbHVlPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiLz4KKyAgICA8U1lTREVGSU5FUyB2YWx1ZT0iX05PX1ZDTDtfQVNTRVJURTtOT19TVFJJQ1Q7X1JUTERMTCIvPgorICAgIDxNQUlOU09VUkNFIHZhbHVlPSJvdXRsaW5lLmJwZiIvPgorICAgIDxJTkNMVURFUEFUSCB2YWx1ZT0iLi5cZXhhbXBsZXM7JChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8TElCUEFUSCB2YWx1ZT0iLi5cZXhhbXBsZXM7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKSIvPgorICAgIDxXQVJOSU5HUyB2YWx1ZT0iLXctcGFyIC13LTgwMjcgLXctODAyNiIvPgorICA8L01BQ1JPUz4KKyAgPE9QVElPTlM+CisgICAgPElETENGTEFHUyB2YWx1ZT0iLUkkKEJDQilcaW5jbHVkZSIvPgorICAgIDxDRkxBRzEgdmFsdWU9Ii1PMiAtWC0gLWE4IC1iIC1rLSAtdmkgLXEgLXRXTSAtSS4uXGxpYiAtYyIvPgorICAgIDxQRkxBR1MgdmFsdWU9Ii1OMlJlbGVhc2Vcb2JqXGV4YW1wbGVzIC1OMFJlbGVhc2Vcb2JqXGV4YW1wbGVzIC0kWS0gLSRMLSAtJEQtIi8+CisgICAgPFJGTEFHUyB2YWx1ZT0iL2wgMHg0MDkgL2QgJnF1b3Q7TkRFQlVHJnF1b3Q7IC9pJChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8QUZMQUdTIHZhbHVlPSIvbXggL3cyIC96biIvPgorICAgIDxMRkxBR1MgdmFsdWU9Ii1JUmVsZWFzZVxvYmpcZXhhbXBsZXMgLUQmcXVvdDsmcXVvdDsgLWFwIC1UcGUgLXggLUduIC1xIi8+CisgIDwvT1BUSU9OUz4KKyAgPExJTktFUj4KKyAgICA8QUxMT0JKIHZhbHVlPSJjMHgzMi5vYmogJChPQkpGSUxFUykiLz4KKyAgICA8QUxMUkVTIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxBTExMSUIgdmFsdWU9IiQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIiLz4KKyAgPC9MSU5LRVI+CisgIDxJREVPUFRJT05TPgorW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCitMb2NhbGU9MTAzMworQ29kZVBhZ2U9MTI1MgorCitbVmVyc2lvbiBJbmZvIEtleXNdCitDb21wYW55TmFtZT0KK0ZpbGVEZXNjcmlwdGlvbj0KK0ZpbGVWZXJzaW9uPTEuMC4wLjAKK0ludGVybmFsTmFtZT0KK0xlZ2FsQ29weXJpZ2h0PQorTGVnYWxUcmFkZW1hcmtzPQorT3JpZ2luYWxGaWxlbmFtZT0KK1Byb2R1Y3ROYW1lPQorUHJvZHVjdFZlcnNpb249MS4wLjAuMAorQ29tbWVudHM9CisKK1tIaXN0b3J5TGlzdHNcaGxJbmNsdWRlUGF0aF0KK0NvdW50PTMKK0l0ZW0wPS4uXGV4YW1wbGVzOyQoQkNCKVxpbmNsdWRlCitJdGVtMT0kKEJDQilcaW5jbHVkZQorSXRlbTI9JChCQ0IpXGluY2x1ZGU7JChCQ0IpXGluY2x1ZGVcbWZjOyQoQkNCKVxpbmNsdWRlXGF0bDsKKworW0hpc3RvcnlMaXN0c1xobExpYnJhcnlQYXRoXQorQ291bnQ9NAorSXRlbTA9Li5cZXhhbXBsZXM7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTE9Li5cZXhhbXBsZXM7JChCQ0IpXGxpYjsuLlxleGFtcGxlc1wkKFJFTEVBU0VMSUJQQVRIKQorSXRlbTI9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorSXRlbTM9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTs7JChCQ0IpXGxpYlxwc2RrOworCitbSGlzdG9yeUxpc3RzXGhsRGVidWdTb3VyY2VQYXRoXQorQ291bnQ9MQorSXRlbTA9JChCQ0IpXHNvdXJjZVx2Y2wKKworW0hpc3RvcnlMaXN0c1xobENvbmRpdGlvbmFsc10KK0NvdW50PTYKK0l0ZW0wPVdJTjMyO05ERUJVRztfQ09OU09MRQorSXRlbTE9V0lOMzI7TkRFQlVHO19DT05TT0xFO1hNTF9TVEFUSUMKK0l0ZW0yPVdJTjMyO05ERUJVRztfQ09OU09MRTtfREVCVUc7WE1MX1NUQVRJQworSXRlbTM9V0lOMzI7TkRFQlVHO19DT05TT0xFO19ERUJVRztYTUxfVU5JQ09ERV9XQ0hBUl9UO19VTklDT0RFO1hNTF9TVEFUSUMKK0l0ZW00PVdJTjMyO05ERUJVRztfQ09OU09MRTtfREVCVUc7WE1MX1VOSUNPREVfV0NIQVJfVDtfVU5JQ09ERQorSXRlbTU9V0lOMzI7TkRFQlVHO19DT05TT0xFO19ERUJVRworCitbSGlzdG9yeUxpc3RzXGhsSW50T3V0cHV0RGlyXQorQ291bnQ9NAorSXRlbTA9UmVsZWFzZVxvYmpcZXhhbXBsZXMKK0l0ZW0xPVJlbGVhc2Vcb2JqXG91dGxpbmUKK0l0ZW0yPS4uXGV4YW1wbGVzXFJlbGVhc2UKK0l0ZW0zPVJlbGVhc2UKKworW0hpc3RvcnlMaXN0c1xobEZpbmFsT3V0cHV0RGlyXQorQ291bnQ9MQorSXRlbTA9UmVsZWFzZVwKKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0KKworW1BhcmFtZXRlcnNdCitSdW5QYXJhbXM9CitIb3N0QXBwbGljYXRpb249CitSZW1vdGVIb3N0PQorUmVtb3RlUGF0aD0KK1JlbW90ZURlYnVnPTAKKworW0NvbXBpbGVyXQorU2hvd0luZm9Nc2dzPTAKK0xpbmtEZWJ1Z1ZjbD0wCitMaW5rQ0dMSUI9MAorCitbTGFuZ3VhZ2VdCitBY3RpdmVMYW5nPQorUHJvamVjdExhbmc9CitSb290RGlyPQorICA8L0lERU9QVElPTlM+Cis8L1BST0pFQ1Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS9vdXRsaW5lLm1hayBiL2V4cGF0LTIuMC4xL2JjYjUvb3V0bGluZS5tYWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTEwYjU0MQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUvb3V0bGluZS5tYWsKQEAgLTAsMCArMSwxODYgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgISRkKEJDQikKK0JDQiA9ICQoTUFLRURJUilcLi4KKyFlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJREUgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IG1ha2VmaWxlIGlzIG1hbmFnZWQgYnkgdGhlIEJDQiBJREUuCisjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgSURFIHRvIGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGlzCisjIHNlY3Rpb24uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWRVJTSU9OID0gQkNCLjA1LjAzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUFJPSkVDVCA9IFJlbGVhc2Vcb3V0bGluZS5leGUKK09CSkZJTEVTID0gUmVsZWFzZVxvYmpcZXhhbXBsZXNcb3V0bGluZS5vYmoKK1JFU0ZJTEVTID0gCitNQUlOU09VUkNFID0gb3V0bGluZS5icGYKK1JFU0RFUEVOID0gJChSRVNGSUxFUykKK0xJQkZJTEVTID0gUmVsZWFzZVxsaWJleHBhdF9tdGQubGliCitJRExGSUxFUyA9IAorSURMR0VORklMRVMgPSAKK0xJQlJBUklFUyA9IAorUEFDS0FHRVMgPSBWQ0w1MC5icGkgVkNMWDUwLmJwaSBiY2JzbXA1MC5icGkgUVJQVDUwLmJwaSBWQ0xEQjUwLmJwaSBWQ0xCREU1MC5icGkgXAorICAgIGlic21wNTAuYnBpIFZDTERCWDUwLmJwaSBURUVVSTUwLmJwaSBURUVEQjUwLmJwaSBURUU1MC5icGkgVEVFUVI1MC5icGkgXAorICAgIFZDTElCNTAuYnBpIGJjYmllNTAuYnBpIFZDTElFNTAuYnBpIElORVREQjUwLmJwaSBJTkVUNTAuYnBpIE5NRkFTVDUwLmJwaSBcCisgICAgZGNsb2N4NTAuYnBpIGJjYjJrYXhzZXJ2ZXI1MC5icGkgZGNsdXNyNTAuYnBpCitTUEFSRUxJQlMgPSAKK0RFRkZJTEUgPSAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQVRIQ1BQID0gLjsuLlxleGFtcGxlcworUEFUSEFTTSA9IC47CitQQVRIUEFTID0gLjsKK1BBVEhSQyA9IC47CitERUJVR0xJQlBBVEggPSAkKEJDQilcbGliXGRlYnVnCitSRUxFQVNFTElCUEFUSCA9ICQoQkNCKVxsaWJccmVsZWFzZQorVVNFUkRFRklORVMgPSBXSU4zMjtOREVCVUc7X0NPTlNPTEUKK1NZU0RFRklORVMgPSBfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMCitJTkNMVURFUEFUSCA9IC4uXGV4YW1wbGVzOyQoQkNCKVxpbmNsdWRlCitMSUJQQVRIID0gLi5cZXhhbXBsZXM7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKQorV0FSTklOR1M9IC13LXBhciAtdy04MDI3IC13LTgwMjYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDRkxBRzEgPSAtTzIgLVgtIC1hOCAtYiAtay0gLXZpIC1xIC10V00gLUkuLlxsaWIgLWMKK0lETENGTEFHUyA9IC1JJChCQ0IpXGluY2x1ZGUKK1BGTEFHUyA9IC1OMlJlbGVhc2Vcb2JqXGV4YW1wbGVzIC1OMFJlbGVhc2Vcb2JqXGV4YW1wbGVzIC0kWS0gLSRMLSAtJEQtCitSRkxBR1MgPSAvbCAweDQwOSAvZCAiTkRFQlVHIiAvaSQoQkNCKVxpbmNsdWRlCitBRkxBR1MgPSAvbXggL3cyIC96bgorTEZMQUdTID0gLUlSZWxlYXNlXG9ialxleGFtcGxlcyAtRCIiIC1hcCAtVHBlIC14IC1HbiAtcQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMTE9CSiA9IGMweDMyLm9iaiAkKE9CSkZJTEVTKQorQUxMUkVTID0gJChSRVNGSUxFUykKK0FMTExJQiA9ICQoTElCRklMRVMpICQoTElCUkFSSUVTKSBpbXBvcnQzMi5saWIgY3czMm10aS5saWIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWZkZWYgSURFT1BUSU9OUworCitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKKworW1ZlcnNpb24gSW5mbyBLZXlzXQorQ29tcGFueU5hbWU9CitGaWxlRGVzY3JpcHRpb249CitGaWxlVmVyc2lvbj0xLjAuMC4wCitJbnRlcm5hbE5hbWU9CitMZWdhbENvcHlyaWdodD0KK0xlZ2FsVHJhZGVtYXJrcz0KK09yaWdpbmFsRmlsZW5hbWU9CitQcm9kdWN0TmFtZT0KK1Byb2R1Y3RWZXJzaW9uPTEuMC4wLjAKK0NvbW1lbnRzPQorCitbRGVidWdnaW5nXQorRGVidWdTb3VyY2VEaXJzPSQoQkNCKVxzb3VyY2VcdmNsCisKKyFlbmRpZgorCisKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1BS0UgU0VDVElPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9qZWN0IGZpbGUgaXMgbm90IHVzZWQgYnkgdGhlIEJDQiBJREUuICBJdCBpcyBmb3IKKyMgdGhlIGJlbmVmaXQgb2YgYnVpbGRpbmcgZnJvbSB0aGUgY29tbWFuZC1saW5lIHVzaW5nIHRoZSBNQUtFIHV0aWxpdHkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuYXV0b2RlcGVuZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAiJChVU0VSREVGSU5FUykiICE9ICIiCitBVVNFUkRFRklORVMgPSAtZCQoVVNFUkRFRklORVM6Oz0gLWQpCishZWxzZQorQVVTRVJERUZJTkVTID0KKyFlbmRpZgorCishaWYgISRkKEJDQzMyKQorQkNDMzIgPSBiY2MzMgorIWVuZGlmCisKKyFpZiAhJGQoQ1BQMzIpCitDUFAzMiA9IGNwcDMyCishZW5kaWYKKworIWlmICEkZChEQ0MzMikKK0RDQzMyID0gZGNjMzIKKyFlbmRpZgorCishaWYgISRkKFRBU00zMikKK1RBU00zMiA9IHRhc20zMgorIWVuZGlmCisKKyFpZiAhJGQoTElOS0VSKQorTElOS0VSID0gaWxpbmszMgorIWVuZGlmCisKKyFpZiAhJGQoQlJDQzMyKQorQlJDQzMyID0gYnJjYzMyCishZW5kaWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICRkKFBBVEhDUFApCisuUEFUSC5DUFAgPSAkKFBBVEhDUFApCisuUEFUSC5DICAgPSAkKFBBVEhDUFApCishZW5kaWYKKworIWlmICRkKFBBVEhQQVMpCisuUEFUSC5QQVMgPSAkKFBBVEhQQVMpCishZW5kaWYKKworIWlmICRkKFBBVEhBU00pCisuUEFUSC5BU00gPSAkKFBBVEhBU00pCishZW5kaWYKKworIWlmICRkKFBBVEhSQykKKy5QQVRILlJDICA9ICQoUEFUSFJDKQorIWVuZGlmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJChQUk9KRUNUKTogJChJRExHRU5GSUxFUykgJChPQkpGSUxFUykgJChSRVNERVBFTikgJChERUZGSUxFKQorICAgICQoQkNCKVxCSU5cJChMSU5LRVIpIEAmJiEKKyAgICAkKExGTEFHUykgLUwkKExJQlBBVEgpICsKKyAgICAkKEFMTE9CSiksICsKKyAgICAkKFBST0pFQ1QpLCwgKworICAgICQoQUxMTElCKSwgKworICAgICQoREVGRklMRSksICsKKyAgICAkKEFMTFJFUykKKyEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisucGFzLmhwcDoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5wYXMub2JqOgorICAgICQoQkNCKVxCSU5cJChEQ0MzMikgJChQRkxBR1MpIC1VJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1PJChJTkNMVURFUEFUSCkgLS1CQ0IgeyQ8IH0KKworLmNwcC5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5vYmo6CisgICAgJChCQ0IpXEJJTlwkKEJDQzMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4kKEBEKSB7JDwgfQorCisuYy5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuY3BwLmk6CisgICAgJChCQ0IpXEJJTlwkKENQUDMyKSAkKENGTEFHMSkgJChXQVJOSU5HUykgLUkkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLW4uIHskPCB9CisKKy5hc20ub2JqOgorICAgICQoQkNCKVxCSU5cJChUQVNNMzIpICQoQUZMQUdTKSAtaSQoSU5DTFVERVBBVEg6Oz0gLWkpICQoQVVTRVJERUZJTkVTKSAtZCQoU1lTREVGSU5FUzo7PSAtZCkgJDwsICRACisKKy5yYy5yZXM6CisgICAgJChCQ0IpXEJJTlwkKEJSQ0MzMikgJChSRkxBR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1mbyRAICQ8CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L3NldHVwLmJhdCBiL2V4cGF0LTIuMC4xL2JjYjUvc2V0dXAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmNGI1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L3NldHVwLmJhdApAQCAtMCwwICsxLDkgQEAKK1JFTSBDb21tYW5kSW50ZXJwcmV0ZXI6ICQoQ09NU1BFQykKK2lmIG5vdCBleGlzdCAuXHJlbGVhc2VcbnVsIG1rZGlyIHJlbGVhc2UKK2lmIG5vdCBleGlzdCAuXHJlbGVhc2Vcb2JqXG51bCBta2RpciByZWxlYXNlXG9iagoraWYgbm90IGV4aXN0IC5ccmVsZWFzZVxvYmpcbGliZXhwYXRcbnVsIG1rZGlyIHJlbGVhc2Vcb2JqXGxpYmV4cGF0CitpZiBub3QgZXhpc3QgLlxyZWxlYXNlXG9ialxsaWJleHBhdHdcbnVsIG1rZGlyIHJlbGVhc2Vcb2JqXGxpYmV4cGF0dworaWYgbm90IGV4aXN0IC5ccmVsZWFzZVxvYmpcbGliZXhwYXRfc3RhdGljXG51bCBta2RpciByZWxlYXNlXG9ialxsaWJleHBhdF9zdGF0aWMKK2lmIG5vdCBleGlzdCAuXHJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWNcbnVsIG1rZGlyIHJlbGVhc2Vcb2JqXGxpYmV4cGF0d19zdGF0aWMKK2lmIG5vdCBleGlzdCAuXHJlbGVhc2Vcb2JqXGV4YW1wbGVzXG51bCBta2RpciByZWxlYXNlXG9ialxleGFtcGxlcworaWYgbm90IGV4aXN0IC5ccmVsZWFzZVxvYmpceG1sd2ZcbnVsIG1rZGlyIHJlbGVhc2Vcb2JqXHhtbHdmCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9iY2I1L3htbHdmLmJwZiBiL2V4cGF0LTIuMC4xL2JjYjUveG1sd2YuYnBmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwNjIwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9iY2I1L3htbHdmLmJwZgpAQCAtMCwwICsxLDcgQEAKK1VTRVVOSVQoIi4uXHhtbHdmXGNvZGVwYWdlLmMiKTsKK1VTRVVOSVQoIi4uXHhtbHdmXHdpbjMyZmlsZW1hcC5jIik7CitVU0VVTklUKCIuLlx4bWx3Zlx4bWxmaWxlLmMiKTsKK1VTRVVOSVQoIi4uXHhtbHdmXHhtbHdmLmMiKTsKK1VTRUxJQigiUmVsZWFzZVxsaWJleHBhdF9tdGQubGliIik7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFpbgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvYmNiNS94bWx3Zi5icHIgYi9leHBhdC0yLjAuMS9iY2I1L3htbHdmLmJwcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMzNhMTUzCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvYmNiNS94bWx3Zi5icHIKQEAgLTAsMCArMSwxMzYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgorPCEtLSBDKytCdWlsZGVyIFhNTCBQcm9qZWN0IC0tPgorPFBST0pFQ1Q+CisgIDxNQUNST1M+CisgICAgPFZFUlNJT04gdmFsdWU9IkJDQi4wNS4wMyIvPgorICAgIDxQUk9KRUNUIHZhbHVlPSJSZWxlYXNlXHhtbHdmLmV4ZSIvPgorICAgIDxPQkpGSUxFUyB2YWx1ZT0iUmVsZWFzZVxvYmpceG1sd2ZcY29kZXBhZ2Uub2JqIFJlbGVhc2Vcb2JqXHhtbHdmXHdpbjMyZmlsZW1hcC5vYmogCisgICAgICBSZWxlYXNlXG9ialx4bWx3Zlx4bWxmaWxlLm9iaiBSZWxlYXNlXG9ialx4bWx3Zlx4bWx3Zi5vYmoiLz4KKyAgICA8UkVTRklMRVMgdmFsdWU9IiIvPgorICAgIDxJRExGSUxFUyB2YWx1ZT0iIi8+CisgICAgPElETEdFTkZJTEVTIHZhbHVlPSIiLz4KKyAgICA8REVGRklMRSB2YWx1ZT0iIi8+CisgICAgPFJFU0RFUEVOIHZhbHVlPSIkKFJFU0ZJTEVTKSIvPgorICAgIDxMSUJGSUxFUyB2YWx1ZT0iUmVsZWFzZVxsaWJleHBhdF9tdGQubGliIi8+CisgICAgPExJQlJBUklFUyB2YWx1ZT0iIi8+CisgICAgPFNQQVJFTElCUyB2YWx1ZT0iIi8+CisgICAgPFBBQ0tBR0VTIHZhbHVlPSJWQ0w1MC5icGkgVkNMWDUwLmJwaSBiY2JzbXA1MC5icGkgUVJQVDUwLmJwaSBWQ0xEQjUwLmJwaSBWQ0xCREU1MC5icGkgCisgICAgICBpYnNtcDUwLmJwaSBWQ0xEQlg1MC5icGkgVEVFVUk1MC5icGkgVEVFREI1MC5icGkgVEVFNTAuYnBpIFRFRVFSNTAuYnBpIAorICAgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgVkNMSUU1MC5icGkgSU5FVERCNTAuYnBpIElORVQ1MC5icGkgTk1GQVNUNTAuYnBpIAorICAgICAgZGNsb2N4NTAuYnBpIGJjYjJrYXhzZXJ2ZXI1MC5icGkgZGNsdXNyNTAuYnBpIi8+CisgICAgPFBBVEhDUFAgdmFsdWU9Ii47Li5ceG1sd2YiLz4KKyAgICA8UEFUSFBBUyB2YWx1ZT0iLjsiLz4KKyAgICA8UEFUSFJDIHZhbHVlPSIuOyIvPgorICAgIDxQQVRIQVNNIHZhbHVlPSIuOyIvPgorICAgIDxERUJVR0xJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJcZGVidWciLz4KKyAgICA8UkVMRUFTRUxJQlBBVEggdmFsdWU9IiQoQkNCKVxsaWJccmVsZWFzZSIvPgorICAgIDxMSU5LRVIgdmFsdWU9ImlsaW5rMzIiLz4KKyAgICA8VVNFUkRFRklORVMgdmFsdWU9Ik5ERUJVRztXSU4zMjtfQ09OU09MRTtDT01QSUxFRF9GUk9NX0RTUCIvPgorICAgIDxTWVNERUZJTkVTIHZhbHVlPSJfTk9fVkNMO19BU1NFUlRFO05PX1NUUklDVDtfUlRMRExMIi8+CisgICAgPE1BSU5TT1VSQ0UgdmFsdWU9InhtbHdmLmJwZiIvPgorICAgIDxJTkNMVURFUEFUSCB2YWx1ZT0iLi5ceG1sd2Y7JChCQ0IpXGluY2x1ZGUiLz4KKyAgICA8TElCUEFUSCB2YWx1ZT0iLi5ceG1sd2Y7JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKSIvPgorICAgIDxXQVJOSU5HUyB2YWx1ZT0iLXctODA2NSAtdy1wYXIgLXctODAyNyAtdy04MDI2Ii8+CisgIDwvTUFDUk9TPgorICA8T1BUSU9OUz4KKyAgICA8SURMQ0ZMQUdTIHZhbHVlPSItSSQoQkNCKVxpbmNsdWRlIi8+CisgICAgPENGTEFHMSB2YWx1ZT0iLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1JLi5cbGliIC1jIi8+CisgICAgPFBGTEFHUyB2YWx1ZT0iLU4yUmVsZWFzZVxvYmpceG1sd2YgLU4wUmVsZWFzZVxvYmpceG1sd2YgLSRZLSAtJEwtIC0kRC0iLz4KKyAgICA8UkZMQUdTIHZhbHVlPSIvbCAweDQwOSAvZCAmcXVvdDtOREVCVUcmcXVvdDsgL2kkKEJDQilcaW5jbHVkZSIvPgorICAgIDxBRkxBR1MgdmFsdWU9Ii9teCAvdzIgL3puIi8+CisgICAgPExGTEFHUyB2YWx1ZT0iLUlSZWxlYXNlXG9ialx4bWx3ZiAtRCZxdW90OyZxdW90OyAtYXAgLVRwZSAteCAtR24gLXEiLz4KKyAgPC9PUFRJT05TPgorICA8TElOS0VSPgorICAgIDxBTExPQkogdmFsdWU9ImMweDMyLm9iaiAkKE9CSkZJTEVTKSIvPgorICAgIDxBTExSRVMgdmFsdWU9IiQoUkVTRklMRVMpIi8+CisgICAgPEFMTExJQiB2YWx1ZT0iJChMSUJGSUxFUykgJChMSUJSQVJJRVMpIGltcG9ydDMyLmxpYiBjdzMybXRpLmxpYiIvPgorICA8L0xJTktFUj4KKyAgPElERU9QVElPTlM+CitbVmVyc2lvbiBJbmZvXQorSW5jbHVkZVZlckluZm89MAorQXV0b0luY0J1aWxkPTAKK01ham9yVmVyPTEKK01pbm9yVmVyPTAKK1JlbGVhc2U9MAorQnVpbGQ9MAorRGVidWc9MAorUHJlUmVsZWFzZT0wCitTcGVjaWFsPTAKK1ByaXZhdGU9MAorRExMPTAKK0xvY2FsZT0xMDMzCitDb2RlUGFnZT0xMjUyCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0hpc3RvcnlMaXN0c1xobEluY2x1ZGVQYXRoXQorQ291bnQ9NAorSXRlbTA9Li5ceG1sd2Y7JChCQ0IpXGluY2x1ZGUKK0l0ZW0xPSQoQkNCKVxpbmNsdWRlCitJdGVtMj0kKEJDQilcaW5jbHVkZTskKEJDQilcaW5jbHVkZVxtZmM7JChCQ0IpXGluY2x1ZGVcYXRsCitJdGVtMz0kKEJDQilcaW5jbHVkZTskKEJDQilcaW5jbHVkZVxtZmM7JChCQ0IpXGluY2x1ZGVcYXRsOworCitbSGlzdG9yeUxpc3RzXGhsTGlicmFyeVBhdGhdCitDb3VudD01CitJdGVtMD0uLlx4bWx3ZjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMT0uLlx4bWx3ZjskKEJDQilcbGliOy4uXHhtbHdmXCQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMj0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitJdGVtMz0kKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpOyQoQkNCKVxsaWJccHNkaworSXRlbTQ9JChCQ0IpXGxpYjskKFJFTEVBU0VMSUJQQVRIKTs7JChCQ0IpXGxpYlxwc2RrOworCitbSGlzdG9yeUxpc3RzXGhsRGVidWdTb3VyY2VQYXRoXQorQ291bnQ9MQorSXRlbTA9JChCQ0IpXHNvdXJjZVx2Y2wKKworW0hpc3RvcnlMaXN0c1xobENvbmRpdGlvbmFsc10KK0NvdW50PTYKK0l0ZW0wPU5ERUJVRztXSU4zMjtfQ09OU09MRTtDT01QSUxFRF9GUk9NX0RTUAorSXRlbTE9TkRFQlVHO1dJTjMyO19DT05TT0xFO0NPTVBJTEVEX0ZST01fRFNQO19ERUJVRztYTUxfVU5JQ09ERV9XQ0hBUl9UO19VTklDT0RFCitJdGVtMj1OREVCVUc7V0lOMzI7X0NPTlNPTEU7Q09NUElMRURfRlJPTV9EU1A7X0RFQlVHO1hNTF9VTklDT0RFX1dDSEFSX1QKK0l0ZW0zPU5ERUJVRztXSU4zMjtfQ09OU09MRTtDT01QSUxFRF9GUk9NX0RTUDtfREVCVUcKK0l0ZW00PU5ERUJVRztXSU4zMjtfQ09OU09MRTtDT01QSUxFRF9GUk9NX0RTUDtfREVCVUc7X1VOSUNPREU7WE1MX1VOSUNPREVfV0NIQVJfVAorSXRlbTU9TkRFQlVHO1dJTjMyO19DT05TT0xFO0NPTVBJTEVEX0ZST01fRFNQO19ERUJVRztfVU5JQ09ERQorCitbSGlzdG9yeUxpc3RzXGhsSW50T3V0cHV0RGlyXQorQ291bnQ9MworSXRlbTA9UmVsZWFzZVxvYmpceG1sd2YKK0l0ZW0xPS4uXHhtbHdmXFJlbGVhc2UKK0l0ZW0yPVJlbGVhc2UKKworW0hpc3RvcnlMaXN0c1xobEZpbmFsT3V0cHV0RGlyXQorQ291bnQ9MworSXRlbTA9UmVsZWFzZVwKK0l0ZW0xPVJlbGVhc2UKK0l0ZW0yPS5cUmVsZWFzZVwKKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0KKworW1BhcmFtZXRlcnNdCitSdW5QYXJhbXM9c2FtcGxlLnhtbAorSG9zdEFwcGxpY2F0aW9uPQorUmVtb3RlSG9zdD0KK1JlbW90ZVBhdGg9CitSZW1vdGVEZWJ1Zz0wCisKK1tDb21waWxlcl0KK1Nob3dJbmZvTXNncz0wCitMaW5rRGVidWdWY2w9MAorTGlua0NHTElCPTAKKworW0xhbmd1YWdlXQorQWN0aXZlTGFuZz0KK1Byb2plY3RMYW5nPQorUm9vdERpcj0KKyAgPC9JREVPUFRJT05TPgorPC9QUk9KRUNUPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2JjYjUveG1sd2YubWFrIGIvZXhwYXQtMi4wLjEvYmNiNS94bWx3Zi5tYWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc0MTI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2JjYjUveG1sd2YubWFrCkBAIC0wLDAgKzEsMTg3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmICEkZChCQ0IpCitCQ0IgPSAkKE1BS0VESVIpXC4uCishZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSURFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBtYWtlZmlsZSBpcyBtYW5hZ2VkIGJ5IHRoZSBCQ0IgSURFLgorIyBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIElERSB0byBjaGFuZ2UgYW55IG9mIHRoZSB2YWx1ZXMgaW4gdGhpcworIyBzZWN0aW9uLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVkVSU0lPTiA9IEJDQi4wNS4wMworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BST0pFQ1QgPSBSZWxlYXNlXHhtbHdmLmV4ZQorT0JKRklMRVMgPSBSZWxlYXNlXG9ialx4bWx3Zlxjb2RlcGFnZS5vYmogUmVsZWFzZVxvYmpceG1sd2Zcd2luMzJmaWxlbWFwLm9iaiBcCisgICAgUmVsZWFzZVxvYmpceG1sd2ZceG1sZmlsZS5vYmogUmVsZWFzZVxvYmpceG1sd2ZceG1sd2Yub2JqCitSRVNGSUxFUyA9IAorTUFJTlNPVVJDRSA9IHhtbHdmLmJwZgorUkVTREVQRU4gPSAkKFJFU0ZJTEVTKQorTElCRklMRVMgPSBSZWxlYXNlXGxpYmV4cGF0X210ZC5saWIKK0lETEZJTEVTID0gCitJRExHRU5GSUxFUyA9IAorTElCUkFSSUVTID0gCitQQUNLQUdFUyA9IFZDTDUwLmJwaSBWQ0xYNTAuYnBpIGJjYnNtcDUwLmJwaSBRUlBUNTAuYnBpIFZDTERCNTAuYnBpIFZDTEJERTUwLmJwaSBcCisgICAgaWJzbXA1MC5icGkgVkNMREJYNTAuYnBpIFRFRVVJNTAuYnBpIFRFRURCNTAuYnBpIFRFRTUwLmJwaSBURUVRUjUwLmJwaSBcCisgICAgVkNMSUI1MC5icGkgYmNiaWU1MC5icGkgVkNMSUU1MC5icGkgSU5FVERCNTAuYnBpIElORVQ1MC5icGkgTk1GQVNUNTAuYnBpIFwKKyAgICBkY2xvY3g1MC5icGkgYmNiMmtheHNlcnZlcjUwLmJwaSBkY2x1c3I1MC5icGkKK1NQQVJFTElCUyA9IAorREVGRklMRSA9IAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BBVEhDUFAgPSAuOy4uXHhtbHdmCitQQVRIQVNNID0gLjsKK1BBVEhQQVMgPSAuOworUEFUSFJDID0gLjsKK0RFQlVHTElCUEFUSCA9ICQoQkNCKVxsaWJcZGVidWcKK1JFTEVBU0VMSUJQQVRIID0gJChCQ0IpXGxpYlxyZWxlYXNlCitVU0VSREVGSU5FUyA9IE5ERUJVRztXSU4zMjtfQ09OU09MRTtDT01QSUxFRF9GUk9NX0RTUAorU1lTREVGSU5FUyA9IF9OT19WQ0w7X0FTU0VSVEU7Tk9fU1RSSUNUO19SVExETEwKK0lOQ0xVREVQQVRIID0gLi5ceG1sd2Y7JChCQ0IpXGluY2x1ZGUKK0xJQlBBVEggPSAuLlx4bWx3ZjskKEJDQilcbGliOyQoUkVMRUFTRUxJQlBBVEgpCitXQVJOSU5HUz0gLXctODA2NSAtdy1wYXIgLXctODAyNyAtdy04MDI2CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0ZMQUcxID0gLU8yIC1YLSAtYTggLWIgLWstIC12aSAtcSAtdFdNIC1JLi5cbGliIC1jCitJRExDRkxBR1MgPSAtSSQoQkNCKVxpbmNsdWRlCitQRkxBR1MgPSAtTjJSZWxlYXNlXG9ialx4bWx3ZiAtTjBSZWxlYXNlXG9ialx4bWx3ZiAtJFktIC0kTC0gLSRELQorUkZMQUdTID0gL2wgMHg0MDkgL2QgIk5ERUJVRyIgL2kkKEJDQilcaW5jbHVkZQorQUZMQUdTID0gL214IC93MiAvem4KK0xGTEFHUyA9IC1JUmVsZWFzZVxvYmpceG1sd2YgLUQiIiAtYXAgLVRwZSAteCAtR24gLXEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTExPQkogPSBjMHgzMi5vYmogJChPQkpGSUxFUykKK0FMTFJFUyA9ICQoUkVTRklMRVMpCitBTExMSUIgPSAkKExJQkZJTEVTKSAkKExJQlJBUklFUykgaW1wb3J0MzIubGliIGN3MzJtdGkubGliCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIWlmZGVmIElERU9QVElPTlMKKworW1ZlcnNpb24gSW5mb10KK0luY2x1ZGVWZXJJbmZvPTAKK0F1dG9JbmNCdWlsZD0wCitNYWpvclZlcj0xCitNaW5vclZlcj0wCitSZWxlYXNlPTAKK0J1aWxkPTAKK0RlYnVnPTAKK1ByZVJlbGVhc2U9MAorU3BlY2lhbD0wCitQcml2YXRlPTAKK0RMTD0wCisKK1tWZXJzaW9uIEluZm8gS2V5c10KK0NvbXBhbnlOYW1lPQorRmlsZURlc2NyaXB0aW9uPQorRmlsZVZlcnNpb249MS4wLjAuMAorSW50ZXJuYWxOYW1lPQorTGVnYWxDb3B5cmlnaHQ9CitMZWdhbFRyYWRlbWFya3M9CitPcmlnaW5hbEZpbGVuYW1lPQorUHJvZHVjdE5hbWU9CitQcm9kdWN0VmVyc2lvbj0xLjAuMC4wCitDb21tZW50cz0KKworW0RlYnVnZ2luZ10KK0RlYnVnU291cmNlRGlycz0kKEJDQilcc291cmNlXHZjbAorCishZW5kaWYKKworCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNQUtFIFNFQ1RJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgc2VjdGlvbiBvZiB0aGUgcHJvamVjdCBmaWxlIGlzIG5vdCB1c2VkIGJ5IHRoZSBCQ0IgSURFLiAgSXQgaXMgZm9yCisjIHRoZSBiZW5lZml0IG9mIGJ1aWxkaW5nIGZyb20gdGhlIGNvbW1hbmQtbGluZSB1c2luZyB0aGUgTUFLRSB1dGlsaXR5LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLmF1dG9kZXBlbmQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishaWYgIiQoVVNFUkRFRklORVMpIiAhPSAiIgorQVVTRVJERUZJTkVTID0gLWQkKFVTRVJERUZJTkVTOjs9IC1kKQorIWVsc2UKK0FVU0VSREVGSU5FUyA9CishZW5kaWYKKworIWlmICEkZChCQ0MzMikKK0JDQzMyID0gYmNjMzIKKyFlbmRpZgorCishaWYgISRkKENQUDMyKQorQ1BQMzIgPSBjcHAzMgorIWVuZGlmCisKKyFpZiAhJGQoRENDMzIpCitEQ0MzMiA9IGRjYzMyCishZW5kaWYKKworIWlmICEkZChUQVNNMzIpCitUQVNNMzIgPSB0YXNtMzIKKyFlbmRpZgorCishaWYgISRkKExJTktFUikKK0xJTktFUiA9IGlsaW5rMzIKKyFlbmRpZgorCishaWYgISRkKEJSQ0MzMikKK0JSQ0MzMiA9IGJyY2MzMgorIWVuZGlmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyFpZiAkZChQQVRIQ1BQKQorLlBBVEguQ1BQID0gJChQQVRIQ1BQKQorLlBBVEguQyAgID0gJChQQVRIQ1BQKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUEFTKQorLlBBVEguUEFTID0gJChQQVRIUEFTKQorIWVuZGlmCisKKyFpZiAkZChQQVRIQVNNKQorLlBBVEguQVNNID0gJChQQVRIQVNNKQorIWVuZGlmCisKKyFpZiAkZChQQVRIUkMpCisuUEFUSC5SQyAgPSAkKFBBVEhSQykKKyFlbmRpZgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQoUFJPSkVDVCk6ICQoSURMR0VORklMRVMpICQoT0JKRklMRVMpICQoUkVTREVQRU4pICQoREVGRklMRSkKKyAgICAkKEJDQilcQklOXCQoTElOS0VSKSBAJiYhCisgICAgJChMRkxBR1MpIC1MJChMSUJQQVRIKSArCisgICAgJChBTExPQkopLCArCisgICAgJChQUk9KRUNUKSwsICsKKyAgICAkKEFMTExJQiksICsKKyAgICAkKERFRkZJTEUpLCArCisgICAgJChBTExSRVMpCishCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLnBhcy5ocHA6CisgICAgJChCQ0IpXEJJTlwkKERDQzMyKSAkKFBGTEFHUykgLVUkKElOQ0xVREVQQVRIKSAtRCQoVVNFUkRFRklORVMpOyQoU1lTREVGSU5FUykgLU8kKElOQ0xVREVQQVRIKSAtLUJDQiB7JDwgfQorCisucGFzLm9iajoKKyAgICAkKEJDQilcQklOXCQoRENDMzIpICQoUEZMQUdTKSAtVSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtTyQoSU5DTFVERVBBVEgpIC0tQkNCIHskPCB9CisKKy5jcHAub2JqOgorICAgICQoQkNCKVxCSU5cJChCQ0MzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uJChARCkgeyQ8IH0KKworLmMub2JqOgorICAgICQoQkNCKVxCSU5cJChCQ0MzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uJChARCkgeyQ8IH0KKworLmMuaToKKyAgICAkKEJDQilcQklOXCQoQ1BQMzIpICQoQ0ZMQUcxKSAkKFdBUk5JTkdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtbi4geyQ8IH0KKworLmNwcC5pOgorICAgICQoQkNCKVxCSU5cJChDUFAzMikgJChDRkxBRzEpICQoV0FSTklOR1MpIC1JJChJTkNMVURFUEFUSCkgLUQkKFVTRVJERUZJTkVTKTskKFNZU0RFRklORVMpIC1uLiB7JDwgfQorCisuYXNtLm9iajoKKyAgICAkKEJDQilcQklOXCQoVEFTTTMyKSAkKEFGTEFHUykgLWkkKElOQ0xVREVQQVRIOjs9IC1pKSAkKEFVU0VSREVGSU5FUykgLWQkKFNZU0RFRklORVM6Oz0gLWQpICQ8LCAkQAorCisucmMucmVzOgorICAgICQoQkNCKVxCSU5cJChCUkNDMzIpICQoUkZMQUdTKSAtSSQoSU5DTFVERVBBVEgpIC1EJChVU0VSREVGSU5FUyk7JChTWVNERUZJTkVTKSAtZm8kQCAkPAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZmlndXJlIGIvZXhwYXQtMi4wLjEvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxYmE3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25maWd1cmUKQEAgLTAsMCArMSwyMjAxNyBAQAorIyEgL2Jpbi9zaAorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkgZm9yIGV4cGF0IDIuMC4xLgorIworIyBSZXBvcnQgYnVncyB0byA8ZXhwYXQtYnVnc0BsaWJleHBhdC5vcmc+LgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCitlbGlmIHRlc3QgLW4gIiR7QkFTSF9WRVJTSU9OK3NldH0iICYmIChzZXQgLW8gcG9zaXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBzZXQgLW8gcG9zaXgKK2ZpCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgoraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Vuc2V0PXVuc2V0CitlbHNlCisgIGFzX3Vuc2V0PWZhbHNlCitmaQorCisKKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorJGFzX3Vuc2V0IEVOViBNQUlMIE1BSUxQQVRICitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQorZG8KKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgoraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YCRhc19iYXNlbmFtZSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCkkJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKworCisjIFBBVEggbmVlZHMgQ1IsIGFuZCBMSU5FTk8gbmVlZHMgQ1IgYW5kIFBBVEguCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4JGFzX2xpbmVub18zIiAgPSAieCRhc19saW5lbm9fMiIgIHx8IHsKKyAgIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gcGF0aCBhdCBhbGwKKyAgIyByZWxhdGl2ZSBvciBub3QuCisgIGNhc2UgJDAgaW4KKyAgICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworZG9uZQorCisgICAgICAgOzsKKyAgZXNhYworICAjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisgICMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorICBpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgICAgYXNfbXlzZWxmPSQwCisgIGZpCisgIGlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBwYXRoIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorICBjYXNlICRDT05GSUdfU0hFTEwgaW4KKyAgJycpCisgICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisJIGNhc2UgJGFzX2RpciBpbgorCSAvKikKKwkgICBpZiAoIiRhc19kaXIvJGFzX2Jhc2UiIC1jICcKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAnKSAyPi9kZXYvbnVsbDsgdGhlbgorCSAgICAgJGFzX3Vuc2V0IEJBU0hfRU5WIHx8IHRlc3QgIiR7QkFTSF9FTlYrc2V0fSIgIT0gc2V0IHx8IHsgQkFTSF9FTlY9OyBleHBvcnQgQkFTSF9FTlY7IH0KKwkgICAgICRhc191bnNldCBFTlYgfHwgdGVzdCAiJHtFTlYrc2V0fSIgIT0gc2V0IHx8IHsgRU5WPTsgZXhwb3J0IEVOVjsgfQorCSAgICAgQ09ORklHX1NIRUxMPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKwkgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgJHsxKyIkQCJ9CisJICAgZmk7OworCSBlc2FjCisgICAgICAgZG9uZQorZG9uZQorOzsKKyAgZXNhYworCisgICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KKyAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQorICAjIGxpbmUtbnVtYmVyIGxpbmUgYmVmb3JlIGVhY2ggbGluZTsgdGhlIHNlY29uZCAnc2VkJyBkb2VzIHRoZSByZWFsCisgICMgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaCBsaW5lLW51bWJlciBsaW5lCisgICMgd2l0aCB0aGUgbnVtYmVyZWQgbGluZSwgYW5kIGFwcGVuZHMgdHJhaWxpbmcgJy0nIGR1cmluZworICAjIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbCBjYXNlIGF0IGxpbmUgZW5kLgorICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKyAgIyBzZWNvbmQgJ3NlZCcgc2NyaXB0LiAgQmxhbWUgTGVlIEUuIE1jTWFob24gZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBzZWQgJz0nIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgTgorICAgICAgcywkLC0sCisgICAgICA6IGxvb3AKKyAgICAgIHMsXlwoWyckYXNfY3JfZGlnaXRzJ10qXClcKC4qXClbJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXVwpLFwxXDJcMVwzLAorICAgICAgdCBsb29wCisgICAgICBzLC0kLCwKKyAgICAgIHMsXlsnJGFzX2NyX2RpZ2l0cyddKlxuLCwKKyAgICAnID4kYXNfbWUubGluZW5vICYmCisgIGNobW9kICt4ICRhc19tZS5saW5lbm8gfHwKKyAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2libGUgdG8gdGhpcykuCisgIC4gLi8kYXNfbWUubGluZW5vCisgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorICBleGl0Cit9CisKKworY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KKyAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JworJyBFQ0hPX1Q9JwknIDs7CisgICpjKiwqICApIEVDSE9fTj0tbiBFQ0hPX0M9IEVDSE9fVD0gOzsKKyAgKikgICAgICAgRUNIT19OPSBFQ0hPX0M9J1xjJyBFQ0hPX1Q9IDs7Citlc2FjCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD06CitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRICisKKworCisjIENoZWNrIHRoYXQgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCitjYXNlIFgkRUNITyBpbgorWCotLWZhbGxiYWNrLWVjaG8pCisgICMgUmVtb3ZlIG9uZSBsZXZlbCBvZiBxdW90YXRpb24gKHdoaWNoIHdhcyByZXF1aXJlZCBmb3IgTWFrZSkuCisgIEVDSE89YGVjaG8gIiRFQ0hPIiB8IHNlZCAncyxcXFxcXCRcXCQwLCckMCcsJ2AKKyAgOzsKK2VzYWMKKworZWNobz0ke0VDSE8tZWNob30KK2lmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgOyB0aGVuCisgICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKKyAgOgorZWxzZQorICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCisgIGV4ZWMgJFNIRUxMICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9CitmaQorCitpZiB0ZXN0ICJYJDEiID0gWC0tZmFsbGJhY2stZWNobzsgdGhlbgorICAjIHVzZWQgYXMgZmFsbGJhY2sgZWNobworICBzaGlmdAorICBjYXQgPDxFT0YKKyQqCitFT0YKKyAgZXhpdCAwCitmaQorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitpZiB0ZXN0IC16ICIkRUNITyI7IHRoZW4KK2lmIHRlc3QgIlgke2VjaG9fdGVzdF9zdHJpbmcrc2V0fSIgIT0gWHNldDsgdGhlbgorIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgIGZvciBjbWQgaW4gJ3NlZCA1MHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAycSAiJDAiJyAnZWNobyB0ZXN0JzsgZG8KKyAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgorICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgKSAyPi9kZXYvbnVsbCAmJgorICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGAgJiYKKyAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgOgorZWxzZQorICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKKyAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZworICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJworICAjCisgICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KKworICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgorICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgZWNobz0iJGRpci9lY2hvIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorCisgIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgorICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgorICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCisgICAgICBlY2hvPSdwcmludCAtcicKKyAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgorCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCisgICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KKyAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAorICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCisgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICBleGVjICRDT05GSUdfU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KKyAgICBlbHNlCisgICAgICAjIFRyeSB1c2luZyBwcmludGYuCisgICAgICBlY2hvPSdwcmludGYgJXNcbicKKyAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorCSBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSMgQ29vbCwgcHJpbnRmIHdvcmtzCisJOgorICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwlDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAorCWV4cG9ydCBDT05GSUdfU0hFTEwKKwlTSEVMTD0iJENPTkZJR19TSEVMTCIKKwlleHBvcnQgU0hFTEwKKwllY2hvPSIkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyIKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIiQwIiAtLWZhbGxiYWNrLWVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJZWNobz0iJENPTkZJR19TSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbHNlCisJIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KKwlwcmV2PToKKworCWZvciBjbWQgaW4gJ2VjaG8gdGVzdCcgJ3NlZCAycSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDUwcSAiJDAiJzsgZG8KKwkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsCisJICB0aGVuCisJICAgIGJyZWFrCisJICBmaQorCSAgcHJldj0iJGNtZCIKKwlkb25lCisKKwlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIiQwIic7IHRoZW4KKwkgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCisJICBleHBvcnQgZWNob190ZXN0X3N0cmluZworCSAgZXhlYyAke09SSUdJTkFMX0NPTkZJR19TSEVMTC0ke0NPTkZJR19TSEVMTC0vYmluL3NofX0gIiQwIiAkezErIiRAIn0KKwllbHNlCisJICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgorCSAgZWNobz1lY2hvCisJZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2ZpCitmaQorCisjIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCisjIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KK0VDSE89JGVjaG8KK2lmIHRlc3QgIlgkRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorICAgRUNITz0iJENPTkZJR19TSEVMTCBcXFwkXCQwIC0tZmFsbGJhY2stZWNobyIKK2ZpCisKKworCisKK3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUNYWAorCit0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1GNzcKKworIyBOYW1lIG9mIHRoZSBob3N0LgorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKK2V4ZWMgNj4mMQorCisjCisjIEluaXRpYWxpemF0aW9ucy4KKyMKK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKK2FjX2NvbmZpZ19saWJvYmpfZGlyPS4KK2Nyb3NzX2NvbXBpbGluZz1ubworc3ViZGlycz0KK01GTEFHUz0KK01BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisKKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KKyMgVGhpcyB2YXJpYWJsZSBzZWVtcyBvYnNvbGV0ZS4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkLCBhbmQKKyMgb25seSBhY19tYXhfc2VkX2xpbmVzIHNob3VsZCBiZSB1c2VkLgorOiAke2FjX21heF9oZXJlX2xpbmVzPTM4fQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0nZXhwYXQnCitQQUNLQUdFX1RBUk5BTUU9J2V4cGF0JworUEFDS0FHRV9WRVJTSU9OPScyLjAuMScKK1BBQ0tBR0VfU1RSSU5HPSdleHBhdCAyLjAuMScKK1BBQ0tBR0VfQlVHUkVQT1JUPSdleHBhdC1idWdzQGxpYmV4cGF0Lm9yZycKKworYWNfdW5pcXVlX2ZpbGU9Ik1ha2VmaWxlLmluIgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhU1REQ19IRUFERVJTICYmIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1RSSU5HU19ICisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TVERJTlRfSAorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCithY19zdWJzdF92YXJzPSdTSEVMTCBQQVRIX1NFUEFSQVRPUiBQQUNLQUdFX05BTUUgUEFDS0FHRV9UQVJOQU1FIFBBQ0tBR0VfVkVSU0lPTiBQQUNLQUdFX1NUUklORyBQQUNLQUdFX0JVR1JFUE9SVCBleGVjX3ByZWZpeCBwcmVmaXggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIgYnVpbGRfYWxpYXMgaG9zdF9hbGlhcyB0YXJnZXRfYWxpYXMgREVGUyBFQ0hPX0MgRUNIT19OIEVDSE9fVCBMSUJTIGJ1aWxkIGJ1aWxkX2NwdSBidWlsZF92ZW5kb3IgYnVpbGRfb3MgaG9zdCBob3N0X2NwdSBob3N0X3ZlbmRvciBob3N0X29zIENDIENGTEFHUyBMREZMQUdTIENQUEZMQUdTIGFjX2N0X0NDIEVYRUVYVCBPQkpFWFQgRUdSRVAgTE5fUyBFQ0hPIEFSIGFjX2N0X0FSIFJBTkxJQiBhY19jdF9SQU5MSUIgU1RSSVAgYWNfY3RfU1RSSVAgRExMVE9PTCBhY19jdF9ETExUT09MIEFTIGFjX2N0X0FTIE9CSkRVTVAgYWNfY3RfT0JKRFVNUCBDUFAgQ1hYIENYWEZMQUdTIGFjX2N0X0NYWCBDWFhDUFAgRjc3IEZGTEFHUyBhY19jdF9GNzcgTElCVE9PTCBMSUJDVVJSRU5UIExJQlJFVklTSU9OIExJQkFHRSBJTlNUQUxMX1BST0dSQU0gSU5TVEFMTF9TQ1JJUFQgSU5TVEFMTF9EQVRBIEZJTEVNQVAgTElCT0JKUyBMVExJQk9CSlMnCithY19zdWJzdF9maWxlcz0nJworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgYWNfb3B0YXJnPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFtePV0qPVwoLipcKSdgCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19vcHRpb24gaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAkYWNfb3B0aW9uIGluCisgICAgICAqPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgCisgICAgZXZhbCAiJGFjX2VudnZhcj0nJGFjX29wdGFyZyciCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgorZm9yIGFjX3ZhciBpbiBleGVjX3ByZWZpeCBwcmVmaXgKK2RvCisgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogfCBOT05FIHwgJycgKSA7OworICAgICopICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBwYXRocy4KK2ZvciBhY192YXIgaW4gYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgXAorCSAgICAgIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19jb25mZGlyPWAoZGlybmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkMCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiQwIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkYWNfY29uZmRpciBvciAuLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZWxzZQorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorZmkKKyhjZCAkc3JjZGlyICYmIHRlc3QgLXIgLi8kYWNfdW5pcXVlX2ZpbGUpIDI+L2Rldi9udWxsIHx8CisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3NyY2Rpcj1gZWNobyAiJHNyY2RpciIgfCBzZWQgJ3MlXChbXlxcL11cKVtcXC9dKiQlXDElJ2AKK2FjX2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19jdl9lbnZfYnVpbGRfYWxpYXNfc2V0PSR7YnVpbGRfYWxpYXMrc2V0fQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPSRidWlsZF9hbGlhcworYWNfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfY3ZfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19jdl9lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfZW52X3RhcmdldF9hbGlhc19zZXQ9JHt0YXJnZXRfYWxpYXMrc2V0fQorYWNfZW52X3RhcmdldF9hbGlhc192YWx1ZT0kdGFyZ2V0X2FsaWFzCithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19lbnZfQ0NfdmFsdWU9JENDCithY19jdl9lbnZfQ0Nfc2V0PSR7Q0Mrc2V0fQorYWNfY3ZfZW52X0NDX3ZhbHVlPSRDQworYWNfZW52X0NGTEFHU19zZXQ9JHtDRkxBR1Mrc2V0fQorYWNfZW52X0NGTEFHU192YWx1ZT0kQ0ZMQUdTCithY19jdl9lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19jdl9lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2N2X2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfY3ZfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19jdl9lbnZfQ1BQRkxBR1Nfc2V0PSR7Q1BQRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NQUEZMQUdTX3ZhbHVlPSRDUFBGTEFHUworYWNfZW52X0NQUF9zZXQ9JHtDUFArc2V0fQorYWNfZW52X0NQUF92YWx1ZT0kQ1BQCithY19jdl9lbnZfQ1BQX3NldD0ke0NQUCtzZXR9CithY19jdl9lbnZfQ1BQX3ZhbHVlPSRDUFAKK2FjX2Vudl9DWFhfc2V0PSR7Q1hYK3NldH0KK2FjX2Vudl9DWFhfdmFsdWU9JENYWAorYWNfY3ZfZW52X0NYWF9zZXQ9JHtDWFgrc2V0fQorYWNfY3ZfZW52X0NYWF92YWx1ZT0kQ1hYCithY19lbnZfQ1hYRkxBR1Nfc2V0PSR7Q1hYRkxBR1Mrc2V0fQorYWNfZW52X0NYWEZMQUdTX3ZhbHVlPSRDWFhGTEFHUworYWNfY3ZfZW52X0NYWEZMQUdTX3NldD0ke0NYWEZMQUdTK3NldH0KK2FjX2N2X2Vudl9DWFhGTEFHU192YWx1ZT0kQ1hYRkxBR1MKK2FjX2Vudl9DWFhDUFBfc2V0PSR7Q1hYQ1BQK3NldH0KK2FjX2Vudl9DWFhDUFBfdmFsdWU9JENYWENQUAorYWNfY3ZfZW52X0NYWENQUF9zZXQ9JHtDWFhDUFArc2V0fQorYWNfY3ZfZW52X0NYWENQUF92YWx1ZT0kQ1hYQ1BQCithY19lbnZfRjc3X3NldD0ke0Y3NytzZXR9CithY19lbnZfRjc3X3ZhbHVlPSRGNzcKK2FjX2N2X2Vudl9GNzdfc2V0PSR7Rjc3K3NldH0KK2FjX2N2X2Vudl9GNzdfdmFsdWU9JEY3NworYWNfZW52X0ZGTEFHU19zZXQ9JHtGRkxBR1Mrc2V0fQorYWNfZW52X0ZGTEFHU192YWx1ZT0kRkZMQUdTCithY19jdl9lbnZfRkZMQUdTX3NldD0ke0ZGTEFHUytzZXR9CithY19jdl9lbnZfRkZMQUdTX3ZhbHVlPSRGRkxBR1MKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBleHBhdCAyLjAuMSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitfQUNFT0YKKworICBjYXQgPDxfQUNFT0YKK0luc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisJCQkgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisJCQkgIFtQUkVGSVhdCisKK0J5IGRlZmF1bHQsIFxgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgYWxsIHRoZSBmaWxlcyBpbgorXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCitmb3IgaW5zdGFuY2UgXGAtLXByZWZpeD1cJEhPTUUnLgorCitGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKworRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKyAgLS1iaW5kaXI9RElSICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtQUkVGSVgvbWFuXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorICBjYXNlICRhY19pbml0X2hlbHAgaW4KKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIGV4cGF0IDIuMC4xOiI7OworICAgZXNhYworICBjYXQgPDxcX0FDRU9GCisKK09wdGlvbmFsIEZlYXR1cmVzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KKyAgLS1lbmFibGUtc3RhdGljWz1QS0dTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10KKyAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXQorICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXQorICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBhdm9pZCBsb2NraW5nIChtaWdodCBicmVhayBwYXJhbGxlbCBidWlsZHMpCisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dCisgIC0td2l0aC1waWMgICAgICAgICAgICAgIHRyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIFtkZWZhdWx0PXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoXQorICAtLXdpdGgtdGFnc1s9VEFHU10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIFthdXRvbWF0aWNdCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCisgICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorICBDWFggICAgICAgICBDKysgY29tcGlsZXIgY29tbWFuZAorICBDWFhGTEFHUyAgICBDKysgY29tcGlsZXIgZmxhZ3MKKyAgQ1hYQ1BQICAgICAgQysrIHByZXByb2Nlc3NvcgorICBGNzcgICAgICAgICBGb3J0cmFuIDc3IGNvbXBpbGVyIGNvbW1hbmQKKyAgRkZMQUdTICAgICAgRm9ydHJhbiA3NyBjb21waWxlciBmbGFncworCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitSZXBvcnQgYnVncyB0byA8ZXhwYXQtYnVnc0BsaWJleHBhdC5vcmc+LgorX0FDRU9GCitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGFjX3BvcGRpcj1gcHdkYAorICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQorICAgIHRlc3QgLWQgJGFjX2RpciB8fCBjb250aW51ZQorICAgIGFjX2J1aWxkZGlyPS4KKworaWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCisgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC4uLyxnJ2AKK2Vsc2UKKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQorZmkKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCisgICAgICAgYWNfdG9wX3NyY2Rpcj0uCisgICAgZWxzZQorICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKKyAgICBmaSA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIHBhdGguCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OworZXNhYworCisjIERvIG5vdCB1c2UgYGNkIGZvbyAmJiBwd2RgIHRvIGNvbXB1dGUgYWJzb2x1dGUgcGF0aHMsIGJlY2F1c2UKKyMgdGhlIGRpcmVjdG9yaWVzIG1heSBub3QgZXhpc3QuCitjYXNlIGBwd2RgIGluCisuKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyopCisgIGNhc2UgIiRhY19kaXIiIGluCisgIC4pIGFjX2Fic19idWlsZGRpcj1gcHdkYDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisgICopIGFjX2Fic19idWlsZGRpcj1gcHdkYC8iJGFjX2RpciI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyopCisgIGNhc2UgJHthY190b3BfYnVpbGRkaXJ9LiBpbgorICAuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisgICopIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpci8ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY19zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworICAqKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY190b3Bfc3JjZGlyIGluCisgIC4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfdG9wX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworCisgICAgY2QgJGFjX2RpcgorICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlOyBvdGhlcndpc2UgZ2V0IEN5Z251cyBzdHlsZSBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnU7IHRoZW4KKyAgICAgIGVjaG8KKyAgICAgICRTSEVMTCAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUgIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbGlmIHRlc3QgLWYgJGFjX3NyY2Rpci9jb25maWd1cmU7IHRoZW4KKyAgICAgIGVjaG8KKyAgICAgICRTSEVMTCAkYWNfc3JjZGlyL2NvbmZpZ3VyZSAgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5hYyB8fAorCSAgIHRlc3QgLWYgJGFjX3NyY2Rpci9jb25maWd1cmUuaW47IHRoZW4KKyAgICAgIGVjaG8KKyAgICAgICRhY19jb25maWd1cmUgLS1oZWxwCisgICAgZWxzZQorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpCisgICAgY2QgJGFjX3BvcGRpcgorICBkb25lCitmaQorCit0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0IDAKK2lmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKyAgY2F0IDw8XF9BQ0VPRgorZXhwYXQgY29uZmlndXJlIDIuMC4xCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkKKworQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KK19BQ0VPRgorICBleGl0IDAKK2ZpCitleGVjIDU+Y29uZmlnLmxvZworY2F0ID4mNSA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IGV4cGF0ICRhc19tZSAyLjAuMSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgoreworY2F0IDw8X0FTVU5BTUUKKyMjIC0tLS0tLS0tLSAjIworIyMgUGxhdGZvcm0uICMjCisjIyAtLS0tLS0tLS0gIyMKKworaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAorCisvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGwgICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisKK19BU1VOQU1FCisKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZWNobyAiUEFUSDogJGFzX2RpciIKK2RvbmUKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfc2VwPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKKyAgICAgIGFjX2FyZz1gZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkYWNfcGFzcyBpbgorICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7CisgICAgMikKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzMT0iJGFjX2NvbmZpZ3VyZV9hcmdzMSAnJGFjX2FyZyciCisgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKwlhY19tdXN0X2tlZXBfbmV4dD1mYWxzZSAjIEdvdCB2YWx1ZSwgYmFjayB0byBub3JtYWwuCisgICAgICBlbHNlCisJY2FzZSAkYWNfYXJnIGluCisJICAqPSogfCAtLWNvbmZpZy1jYWNoZSB8IC1DIHwgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qIFwKKwkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKwkgIHwgLXdpdGgtKiB8IC0td2l0aC0qIHwgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qIHwgLS14KQorCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworCSAgICBlc2FjCisJICAgIDs7CisJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyRhY19zZXAnJGFjX2FyZyciCisgICAgICAjIEdldCByaWQgb2YgdGhlIGxlYWRpbmcgc3BhY2UuCisgICAgICBhY19zZXA9IiAiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorZG9uZQorJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMCB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMCtzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczA9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MwOyB9CiskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KKworIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKyMgd291bGQgY2F1c2UgcHJvYmxlbXMgb3IgbG9vayB1Z2x5LgorIyBXQVJOSU5HOiBCZSBzdXJlIG5vdCB0byB1c2Ugc2luZ2xlIHF1b3RlcyBpbiB0aGVyZSwgYXMgc29tZSBzaGVsbHMsCisjIHN1Y2ggYXMgb3VyIERVIDUuMCBmcmllbmQsIHdpbGwgdGhlbiBgY2xvc2UnIHRoZSB0cmFwLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisjIyBDYWNoZSB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKK3sKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSBgKGFjX3NwYWNlPSciJyInICciJyInOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAgICphY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLyciJyInLyciJyInXFxcXCciJyInJyInIicvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9JyInIidcXDInIiciJy9wIgorICAgICAgOzsKKyAgICAqKQorICAgICAgc2VkIC1uIFwKKwkicy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKKyAgICAgIDs7CisgICAgZXNhYzsKK30KKyAgICBlY2hvCisKKyAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICBlY2hvCisgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycworICAgIGRvCisgICAgICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgICAgIGVjaG8gIiRhY192YXI9JyInIickYWNfdmFsJyInIiciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgZmlsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorCWVjaG8gIiRhY192YXI9JyInIickYWNfdmFsJyInIiciCisgICAgICBkb25lIHwgc29ydAorICAgICAgZWNobworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1zIGNvbmZkZWZzLmg7IHRoZW4KKyAgICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBjb25mZGVmcy5oLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICAgZWNobworICAgICAgc2VkICIvXiQvZCIgY29uZmRlZnMuaCB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKyAgICAgIGVjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgorICAgIGVjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlICYmCisgIHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgeyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPmNvbmZkZWZzLmgKKworIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICIkUEFDS0FHRV9OQU1FIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiRQQUNLQUdFX1NUUklORyIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCisKKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQorICAgIHNlZCAncy9eL3wgLycgIiRhY19zaXRlX2ZpbGUiID4mNQorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbAorICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKyAgaWYgdGVzdCAtZiAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICRjYWNoZV9maWxlOzsKKyAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gLi8kY2FjaGVfZmlsZTs7CisgICAgZXNhYworICBmaQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICA+JGNhY2hlX2ZpbGUKK2ZpCisKKyMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKyMgdmFsdWUuCithY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKK2ZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfAorCSAgICAgICBzZWQgLW4gJ3MvXmFjX2Vudl9cKFthLXpBLVpfMC05XSpcKV9zZXQ9LiovXDEvcCdgOyBkbworICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorICBldmFsIGFjX29sZF92YWw9IlwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZSIKKyAgZXZhbCBhY19uZXdfdmFsPSJcJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KKyAgICBzZXQsKQorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsc2V0KQorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICwpOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1CitlY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1CitlY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9CisJYWNfY2FjaGVfY29ycnVwdGVkPToKKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKKyAgICAgIGFjX2FyZz0kYWNfdmFyPWBlY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworICAgIGVzYWMKKyAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorICAgICAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICAgZXNhYworICBmaQorZG9uZQoraWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBjb25mdG9vbHMgJHNyY2Rpci9jb25mdG9vbHM7IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9zaHRvb2w7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBjb25mdG9vbHMgJHNyY2Rpci9jb25mdG9vbHMiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGNvbmZ0b29scyAkc3JjZGlyL2NvbmZ0b29scyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIKK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworCisKK0xJQkNVUlJFTlQ9NgorTElCUkVWSVNJT049MgorTElCQUdFPTUKKworICAgICAgICAgIGFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgZXhwYXRfY29uZmlnLmgiCisKKworIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KKyMjIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1CisjIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjIworIyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQ4IEFDX1BST0dfTElCVE9PTAorCisKKyMgQUNfUFJPVklERV9JRkVMU0UoTUFDUk8tTkFNRSwgSUYtUFJPVklERUQsIElGLU5PVC1QUk9WSURFRCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWYgdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCBieSBBdXRvY29uZiwgZGVmaW5lIGl0IGhlcmUuCisKKworCisjIEFDX1BST0dfTElCVE9PTAorIyAtLS0tLS0tLS0tLS0tLS0KKyMgQUNfUFJPR19MSUJUT09MCisKKworIyBfQUNfUFJPR19MSUJUT09MCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgX0FDX1BST0dfTElCVE9PTAorCisKKyMgQUNfTElCVE9PTF9TRVRVUAorIyAtLS0tLS0tLS0tLS0tLS0tCisjIEFDX0xJQlRPT0xfU0VUVVAKKworCisjIF9MVF9BQ19TWVNfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfTFRfQUNfU1lTX0NPTVBJTEVSCisKKworIyBfTFRfQ0NfQkFTRU5BTUUoQ0MpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsY3VsYXRlIGNjX2Jhc2VuYW1lLiAgU2tpcCBrbm93biBjb21waWxlciB3cmFwcGVycyBhbmQgY3Jvc3MtcHJlZml4LgorCisKKworIyBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBjb21waWxlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGNvbXBpbGVyIHRlc3QgY29kZS4KKyMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KKyMgX0xUX0FDX1NZU19MSUJQQVRIX0FJWAorCisKKyMgX0xUX0FDX1NIRUxMX0lOSVQoQVJHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9MVF9BQ19TSEVMTF9JTklUCisKKworIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2gKKyMgd2lsbCBmaW5kIGFuIGVjaG8gY29tbWFuZCB3aGljaCBkb2Vzbid0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyMgX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKKworCisjIF9MVF9BQ19MT0NLCisjIC0tLS0tLS0tLS0tCisjIF9MVF9BQ19MT0NLCisKKworIyBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMJCVtPVVRQVVQtRklMRV0sIFtBQ1RJT04tU1VDQ0VTU10sIFtBQ1RJT04tRkFJTFVSRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCisjIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OCisKKworIyBBQ19MSUJUT09MX0xJTktFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29tcGlsZXIgb3B0aW9uIHdvcmtzCisjIEFDX0xJQlRPT0xfTElOS0VSX09QVElPTgorCisKKyMgQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU4KKworCisjIF9MVF9BQ19DSEVDS19ETEZDTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX0NIRUNLX0RMRkNOCisKKworIyBfTFRfQUNfVFJZX0RMT1BFTl9TRUxGIChBQ1RJT04tSUYtVFJVRSwgQUNUSU9OLUlGLVRSVUUtVy1VU0NPUkUsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OLUlGLUZBTFNFLCBBQ1RJT04tSUYtQ1JPU1MtQ09NUElMSU5HKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRgorCisKKyMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFDX0xJQlRPT0xfRExPUEVOX1NFTEYKKworCisjIEFDX0xJQlRPT0xfUFJPR19DQ19DX08oW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIG9wdGlvbnMgLWMgYW5kIC1vIGFyZSBzaW11bHRhbmVvdXNseSBzdXBwb3J0ZWQgYnkgY29tcGlsZXIKKyMgQUNfTElCVE9PTF9QUk9HX0NDX0NfTworCisKKyMgQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKKyMgQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTCisKKworIyBBQ19MSUJUT09MX09CSkRJUgorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBBQ19MSUJUT09MX09CSkRJUgorCisKKyMgQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KKyMgQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgKKworCisjIEFDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQUNfTElCVE9PTF9TWVNfTElCX1NUUklQCisKKworIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcworIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX0FDX1RBR0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tCisjIF9MVF9BQ19UQUdDT05GSUcKKworCisjIEFDX0xJQlRPT0xfRExPUEVOCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBjaGVja3MgZm9yIGRsb3BlbiBzdXBwb3J0CisjIEFDX0xJQlRPT0xfRExPUEVOCisKKworIyBBQ19MSUJUT09MX1dJTjMyX0RMTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBkZWNsYXJlIHBhY2thZ2Ugc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2luMzIgRExMcworIyBBQ19MSUJUT09MX1dJTjMyX0RMTAorCisKKyMgQUNfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KKyMgQUNfRU5BQkxFX1NIQVJFRAorCisKKyMgQUNfRElTQUJMRV9TSEFSRUQKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0IHRoZSBkZWZhdWx0IHNoYXJlZCBmbGFnIHRvIC0tZGlzYWJsZS1zaGFyZWQKKyMgQUNfRElTQUJMRV9TSEFSRUQKKworCisjIEFDX0VOQUJMRV9TVEFUSUMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZworIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCisjIEFDX0VOQUJMRV9TVEFUSUMKKworCisjIEFDX0RJU0FCTEVfU1RBVElDCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCisjIEFDX0RJU0FCTEVfU1RBVElDCisKKworIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMCisKKworIyBBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAorIyBBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTAorCisKKyMgQUNfTElCVE9PTF9QSUNNT0RFKFtNT0RFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLXdpdGgtcGljIGZsYWcKKyMgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBib3RoJy4KKyMgQUNfTElCVE9PTF9QSUNNT0RFCisKKworIyBBQ19QUk9HX0VHUkVQCisjIC0tLS0tLS0tLS0tLS0KKyMgVGhpcyBpcyBwcmVkZWZpbmVkIHN0YXJ0aW5nIHdpdGggQXV0b2NvbmYgMi41NCwgc28gdGhpcyBjb25kaXRpb25hbAorIyBkZWZpbml0aW9uIGNhbiBiZSByZW1vdmVkIG9uY2Ugd2UgcmVxdWlyZSBBdXRvY29uZiAyLjU0IG9yIGxhdGVyLgorCisKKworIyBBQ19QQVRIX1RPT0xfUFJFRklYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXNlIHNoYXJlZCBsaWJyYXJ5CisjIEFDX1BBVEhfVE9PTF9QUkVGSVgKKworCisjIEFDX1BBVEhfTUFHSUMKKyMgLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pc2UgYSBzaGFyZWQgbGlicmFyeQorIyBBQ19QQVRIX01BR0lDCisKKworIyBBQ19QUk9HX0xECisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorIyBBQ19QUk9HX0xECisKKworIyBBQ19QUk9HX0xEX0dOVQorIyAtLS0tLS0tLS0tLS0tLQorIyBBQ19QUk9HX0xEX0dOVQorCisKKyMgQUNfUFJPR19MRF9SRUxPQURfRkxBRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGZpbmQgcmVsb2FkIGZsYWcgZm9yIGxpbmtlcgorIyAgIC0tIFBPUlRNRSBTb21lIGxpbmtlcnMgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCisjIEFDX1BST0dfTERfUkVMT0FEX0ZMQUcKKworCisjIEFDX0RFUExJQlNfQ0hFQ0tfTUVUSE9ECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGhvdyB0byBjaGVjayBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0tIFBPUlRNRSBmaWxsIGluIHdpdGggdGhlIGR5bmFtaWMgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MKKyMgQUNfREVQTElCU19DSEVDS19NRVRIT0QKKworCisjIEFDX1BST0dfTk0KKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCisjIEFDX1BST0dfTk0KKworCisjIEFDX0NIRUNLX0xJQk0KKyMgLS0tLS0tLS0tLS0tLQorIyBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5CisjIEFDX0NIRUNLX0xJQk0KKworCisjIEFDX0xJQkxURExfQ09OVkVOSUVOQ0UoW0RJUkVDVE9SWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSBhbmQKKyMgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcworIyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCisjIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLiAgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGgKKyMgJyR7dG9wX2J1aWxkZGlyfS8nIGFuZCBMVERMSU5DTCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX3NyY2Rpcn0vJworIyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpLiAgSWYgeW91ciBwYWNrYWdlIGlzIG5vdCBmbGF0IGFuZCB5b3UncmUgbm90CisjIHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFuZCB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkgaW4KKyMgdGhlIE1ha2VmaWxlcy4KKyMgQUNfTElCTFRETF9DT05WRU5JRU5DRQorCisKKyMgQUNfTElCTFRETF9JTlNUQUxMQUJMRShbRElSRUNUT1JZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvciB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5IGFuZAorIyBMVERMSU5DTCB0byB0aGUgaW5jbHVkZSBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgaGVhZGVyIGFuZCBhZGRzCisjIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbCB0byB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdAorIyBBQ19DT05GSUdfU1VCRElSUyBpcyBub3QgY2FsbGVkIGhlcmUuICBJZiBESVJFQ1RPUlkgaXMgbm90IHByb3ZpZGVkLAorIyBhbmQgYW4gaW5zdGFsbGVkIGxpYmx0ZGwgaXMgbm90IGZvdW5kLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGBsaWJsdGRsJy4KKyMgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX2J1aWxkZGlyfS8nIyBhbmQgTFRETElOQ0wgd2l0aAorIyAnJHt0b3Bfc3JjZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkuICBJZiB5b3VyIHBhY2thZ2UgaXMgbm90CisjIGZsYXQgYW5kIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYW5kIHRvcF9zcmNkaXIKKyMgYXBwcm9wcmlhdGVseSBpbiB0aGUgTWFrZWZpbGVzLgorIyBJbiB0aGUgZnV0dXJlLCB0aGlzIG1hY3JvIG1heSBoYXZlIHRvIGJlIGNhbGxlZCBhZnRlciBBQ19QUk9HX0xJQlRPT0wuCisjIEFDX0xJQkxURExfSU5TVEFMTEFCTEUKKworCisjIEFDX0xJQlRPT0xfQ1hYCisjIC0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBzdXBwb3J0IGZvciBDKysgbGlicmFyaWVzCisjIEFDX0xJQlRPT0xfQ1hYCisKKworIyBfTFRfQUNfTEFOR19DWFgKKyMgLS0tLS0tLS0tLS0tLS0tCisjIF9MVF9BQ19MQU5HX0NYWAorCisjIF9MVF9BQ19QUk9HX0NYWENQUAorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX1BST0dfQ1hYQ1BQCisKKyMgQUNfTElCVE9PTF9GNzcKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIEZvcnRyYW4gNzcgbGlicmFyaWVzCisjIEFDX0xJQlRPT0xfRjc3CisKKworIyBfTFRfQUNfTEFOR19GNzcKKyMgLS0tLS0tLS0tLS0tLS0tCisjIF9MVF9BQ19MQU5HX0Y3NworCisKKyMgQUNfTElCVE9PTF9HQ0oKKyMgLS0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIEdDSiBsaWJyYXJpZXMKKyMgQUNfTElCVE9PTF9HQ0oKKworCisjIF9MVF9BQ19MQU5HX0dDSgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgX0xUX0FDX0xBTkdfR0NKCisKKworIyBBQ19MSUJUT09MX1JDCisjIC0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIFdpbmRvd3MgcmVzb3VyY2UgZmlsZXMKKyMgQUNfTElCVE9PTF9SQworCisKKyMgQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorCisjIEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KKworIyBBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJRworCisjIEFDX0xJQlRPT0xfUE9TVERFUF9QUkVERVAoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlndXJlIG91dCAiaGlkZGVuIiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmcm9tIHZlcmJvc2UKKyMgY29tcGlsZXIgb3V0cHV0IHdoZW4gbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorIyBBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQCisKKyMgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KKworIyBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KKworIyBBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQorIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCisKKyMgQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9DT05GSUcoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElmIFRBR05BTUUgaXMgbm90IHBhc3NlZCwgdGhlbiBjcmVhdGUgYW4gaW5pdGlhbCBsaWJ0b29sIHNjcmlwdAorIyB3aXRoIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIHVudGFnZ2VkIGNvbmZpZyB2YXJzLiAgT3RoZXJ3aXNlCisjIGFkZCBjb2RlIHRvIGNvbmZpZy5zdGF0dXMgZm9yIGFwcGVuZGluZyB0aGUgY29uZmlndXJhdGlvbiBuYW1lZCBieQorIyBUQUdOQU1FIGZyb20gdGhlIG1hdGNoaW5nIHRhZ2dlZCBjb25maWcgdmFycy4KKyMgQUNfTElCVE9PTF9DT05GSUcKKworCisjIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSQorCisKKyMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCisKKworIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisjIEFDX0xJQlRPT0xfUFJPR19MRF9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KKyMgQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUworCisKKyMgX0xUX0FDX0ZJTEVfTFRETExfQworIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJlIGNhcmVmdWwgdGhhdCB0aGUgc3RhcnQgbWFya2VyIGFsd2F5cyBmb2xsb3dzIGEgbmV3bGluZS4KKyMgX0xUX0FDX0ZJTEVfTFRETExfQworCisKKyMgX0xUX0FDX1RBR1ZBUihWQVJOQU1FLCBbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworIyBvbGQgbmFtZXMKKworCisKKworCisKKworCisjIFRoaXMgaXMganVzdCB0byBzaWxlbmNlIGFjbG9jYWwgYWJvdXQgdGhlIG1hY3JvIG5vdCBiZWluZyB1c2VkCisKKworCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9URTogVGhpcyBtYWNybyBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbnRvICAgIworIyAgR05VIEF1dG9jb25mIGFzIEFDX1BST0dfU0VELiAgV2hlbiBpdCBpcyBhdmFpbGFibGUgaW4gICAjCisjICBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXV0b2NvbmYgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzICAgICMKKyMgIG1hY3JvIGFuZCB1c2UgaXQgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExUX0FDX1BST0dfU0VECisjIC0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBhIGZ1bGx5LWZ1bmN0aW9uYWwgc2VkIHByb2dyYW0sIHRoYXQgdHJ1bmNhdGVzCisjIGFzIGZldyBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLiAgUHJlZmVyIEdOVSBzZWQgaWYgZm91bmQuCisKKworCisKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zaGFyZWQ9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9zaGFyZWQ9eWVzCitmaTsKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorICBwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhYworZWxzZQorICBlbmFibGVfc3RhdGljPXllcworZmk7CisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKKyAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCitmaTsKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9idWlsZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9idWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK3Rlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKKyAgYWNfY3ZfYnVpbGRfYWxpYXM9YCRhY19jb25maWdfZ3Vlc3NgCit0ZXN0IC16ICIkYWNfY3ZfYnVpbGRfYWxpYXMiICYmCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2FjX2N2X2J1aWxkPWAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfYnVpbGRfYWxpYXNgIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhcyBmYWlsZWQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2CitidWlsZD0kYWNfY3ZfYnVpbGQKK2J1aWxkX2NwdT1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYWNfY3ZfYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9ob3N0X2FsaWFzPSRob3N0X2FsaWFzCit0ZXN0IC16ICIkYWNfY3ZfaG9zdF9hbGlhcyIgJiYKKyAgYWNfY3ZfaG9zdF9hbGlhcz0kYWNfY3ZfYnVpbGRfYWxpYXMKK2FjX2N2X2hvc3Q9YCRhY19jb25maWdfc3ViICRhY19jdl9ob3N0X2FsaWFzYCB8fAorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXMgZmFpbGVkIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaG9zdCIgPiY2Citob3N0PSRhY19jdl9ob3N0Citob3N0X2NwdT1gZWNobyAkYWNfY3ZfaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkYWNfY3ZfaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIENDPSRhY19jdF9DQworZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgQ0M9JGFjX2N0X0NDCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorZWNobyAiJGFzX21lOiRMSU5FTk86IiBcCisgICAgICJjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCisjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCisjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCisjIG9mIGV4ZWV4dC4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2CithY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rX2RlZmF1bHRcIiIpID4mNQorICAoZXZhbCAkYWNfbGlua19kZWZhdWx0KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICMgRmluZCB0aGUgb3V0cHV0LCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4gIFRoaXMgc2NoZW1lIGlzCisjIG5vdCByb2J1c3QgdG8ganVuayBpbiBgLicsIGhlbmNlIGdvIHRvIHdpbGRjYXJkcyAoYS4qKSBvbmx5IGFzIGEgbGFzdAorIyByZXNvcnQuCisKKyMgQmUgY2FyZWZ1bCB0byBpbml0aWFsaXplIHRoaXMgdmFyaWFibGUsIHNpbmNlIGl0IHVzZWQgdG8gYmUgY2FjaGVkLgorIyBPdGhlcndpc2UgYW4gb2xkIGNhY2hlIHZhbHVlIG9mIGBubycgbGVkIHRvIGBFWEVFWFQgPSBubycgaW4gYSBNYWtlZmlsZS4KK2FjX2N2X2V4ZWV4dD0KKyMgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KK2ZvciBhY19maWxlIGluIGFfb3V0LmV4ZSBhLmV4ZSBjb25mdGVzdC5leGUgYS5vdXQgY29uZnRlc3QgYS4qIGNvbmZ0ZXN0LiogYi5vdXQKK2RvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBjb25mdGVzdC4kYWNfZXh0ICkKKwkjIFRoaXMgaXMgdGhlIHNvdXJjZSBmaWxlLgorCTs7CisgICAgW2FiXS5vdXQgKQorCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisJIyBjZXJ0YWlubHkgcmlnaHQuCisJYnJlYWs7OworICAgICouKiApCisJYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJIyBGSVhNRTogSSBiZWxpZXZlIHdlIGV4cG9ydCBhY19jdl9leGVleHQgZm9yIExpYnRvb2wsCisJIyBidXQgaXQgd291bGQgYmUgY29vbCB0byBmaW5kIG91dCBpZiBpdCdzIHRydWUuICBEb2VzIGFueWJvZHkKKwkjIG1haW50YWluIExpYnRvb2w/IC0tYWtpbS4KKwlleHBvcnQgYWNfY3ZfZXhlZXh0CisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorZmkKKworYWNfZXhlZXh0PSRhY19jdl9leGVleHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19maWxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19maWxlIiA+JjYKKworIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MuLi4gJEVDSE9fQyIgPiY2CisjIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCisjIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBmaQorICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorCitybSAtZiBhLm91dCBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisjIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRjcm9zc19jb21waWxpbmciID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCisjIGBybScuCitmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGV4cG9ydCBhY19jdl9leGVleHQKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCitybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9leGVleHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2V4ZWV4dCIgPiY2CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICBmb3IgYWNfZmlsZSBpbiBgKGxzIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqOyBscyBjb25mdGVzdC4qKSAyPi9kZXYvbnVsbGA7IGRvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vYmpleHQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29iamV4dCIgPiY2CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jb21waWxlcl9nbnU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2NvbXBpbGVyX2dudT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNgorR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCithY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CithY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCitDRkxBR1M9Ii1nIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19zdGRjPW5vCithY19zYXZlX0NDPSRDQworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KKworLyogT1NGIDQuMCBDb21wYXEgY2MgaXMgc29tZSBzb3J0IG9mIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQuICBJdCBoYXMKKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgIFRoZXNlIGRvbid0IHByb3Zva2UgYW4gZXJyb3IgdW5mb3J0dW5hdGVseSwgaW5zdGVhZCBhcmUgc2lsZW50bHkgdHJlYXRlZAorICAgYXMgJ3gnLiAgVGhlIGZvbGxvd2luZyBpbmR1Y2VzIGFuIGVycm9yLCB1bnRpbCAtc3RkMSBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQxLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgKGUsIGFyZ3YsIDApICE9IGFyZ3ZbMF0gIHx8ICBmIChlLCBhcmd2LCAxKSAhPSBhcmd2WzFdOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVggMTAuMjAgYW5kIGxhdGVyCS1BZQorIyBIUC1VWCBvbGRlciB2ZXJzaW9ucwktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxIC1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3N0ZGM9JGFjX2FyZworYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0Citkb25lCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19zdGRjIiBpbgorICB4fHhubykKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIG5lZWRlZCIgPiY2IDs7CisgICopCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19zdGRjIiA+JjYKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX3N0ZGMiIDs7Citlc2FjCisKKyMgU29tZSBwZW9wbGUgdXNlIGEgQysrIGNvbXBpbGVyIHRvIGNvbXBpbGUgQy4gIFNpbmNlIHdlIHVzZSBgZXhpdCcsCisjIGluIEMrKyB3ZSBuZWVkIHRvIGRlY2xhcmUgaXQuICBJbiBjYXNlIHNvbWVvbmUgdXNlcyB0aGUgc2FtZSBjb21waWxlcgorIyBmb3IgYm90aCBjb21waWxpbmcgQyBhbmQgQysrIHdlIG5lZWQgdG8gaGF2ZSB0aGUgQysrIGNvbXBpbGVyIGRlY2lkZQorIyB0aGUgZGVjbGFyYXRpb24gb2YgZXhpdCwgc2luY2UgaXQncyB0aGUgbW9zdCBkZW1hbmRpbmcgZW52aXJvbm1lbnQuCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyAgY2hva2UgbWUKKyNlbmRpZgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGZvciBhY19kZWNsYXJhdGlvbiBpbiBcCisgICAnJyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KSB0aHJvdyAoKTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KSB0aHJvdyAoKTsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsnIFwKKyAgICd2b2lkIGV4aXQgKGludCk7JworZG8KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfZGVjbGFyYXRpb24KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorcm0gLWYgY29uZnRlc3QqCitpZiB0ZXN0IC1uICIkYWNfZGVjbGFyYXRpb24iOyB0aGVuCisgIGVjaG8gJyNpZmRlZiBfX2NwbHVzcGx1cycgPj5jb25mZGVmcy5oCisgIGVjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCisgIGVjaG8gJyNlbmRpZicgICAgICAgICAgICAgPj5jb25mZGVmcy5oCitmaQorCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRwdXQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfU0VEK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3Igc2VkIGFuZCBnc2VkLgorIyBUaGVuIHVzZSB0aGF0IGxpc3Qgb2Ygc2VkJ3MgYXMgb25lcyB0byB0ZXN0IGZvciB0cnVuY2F0aW9uLgorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgbHRfYWNfcHJvZyBpbiBzZWQgZ3NlZDsgZG8KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiOyB0aGVuCisgICAgICAgIGx0X2FjX3NlZF9saXN0PSIkbHRfYWNfc2VkX2xpc3QgJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitsdF9hY19tYXg9MAorbHRfYWNfY291bnQ9MAorIyBBZGQgL3Vzci94cGc0L2Jpbi9zZWQgYXMgaXQgaXMgdHlwaWNhbGx5IGZvdW5kIG9uIFNvbGFyaXMKKyMgYWxvbmcgd2l0aCAvYmluL3NlZCB0aGF0IHRydW5jYXRlcyBvdXRwdXQuCitmb3IgbHRfYWNfc2VkIGluICRsdF9hY19zZWRfbGlzdCAvdXNyL3hwZzQvYmluL3NlZDsgZG8KKyAgdGVzdCAhIC1mICRsdF9hY19zZWQgJiYgY29udGludWUKKyAgY2F0IC9kZXYvbnVsbCA+IGNvbmZ0ZXN0LmluCisgIGx0X2FjX2NvdW50PTAKKyAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPmNvbmZ0ZXN0LmluCisgICMgQ2hlY2sgZm9yIEdOVSBzZWQgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgaWYgIiRsdF9hY19zZWQiIC0tdmVyc2lvbiAyPiYxIDwgL2Rldi9udWxsIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBicmVhaworICBmaQorICB3aGlsZSB0cnVlOyBkbworICAgIGNhdCBjb25mdGVzdC5pbiBjb25mdGVzdC5pbiA+Y29uZnRlc3QudG1wCisgICAgbXYgY29uZnRlc3QudG1wIGNvbmZ0ZXN0LmluCisgICAgY3AgY29uZnRlc3QuaW4gY29uZnRlc3QubmwKKyAgICBlY2hvID4+Y29uZnRlc3QubmwKKyAgICAkbHRfYWNfc2VkIC1lICdzL2EkLy8nIDwgY29uZnRlc3QubmwgPmNvbmZ0ZXN0Lm91dCB8fCBicmVhaworICAgIGNtcCAtcyBjb25mdGVzdC5vdXQgY29uZnRlc3QubmwgfHwgYnJlYWsKKyAgICAjIDEwMDAwIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgICBsdF9hY19jb3VudD1gZXhwciAkbHRfYWNfY291bnQgKyAxYAorICAgIGlmIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAkbHRfYWNfbWF4OyB0aGVuCisgICAgICBsdF9hY19tYXg9JGx0X2FjX2NvdW50CisgICAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgZmkKKyAgZG9uZQorZG9uZQorCitmaQorCitTRUQ9JGx0X2N2X3BhdGhfU0VECitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU0VEIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRTRUQiID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2VncmVwK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIGVjaG8gYSB8IChncmVwIC1FICcoYXxiKScpID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4gYWNfY3ZfcHJvZ19lZ3JlcD0nZ3JlcCAtRScKKyAgICBlbHNlIGFjX2N2X3Byb2dfZWdyZXA9J2VncmVwJworICAgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfZWdyZXAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfZWdyZXAiID4mNgorIEVHUkVQPSRhY19jdl9wcm9nX2VncmVwCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgorICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpOworYWNfcHJvZz1sZAoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSAkQ0MuLi4gJEVDSE9fQyIgPiY2CisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1xcL10qIHwgPzpbXFwvXSopCisgICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCisJYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgR05VIGxkLi4uICRFQ0hPX0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZC4uLiAkRUNIT19DIiA+JjYKK2ZpCitpZiB0ZXN0ICIke2x0X2N2X3BhdGhfTEQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKKyAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKKyAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSB2YXJpYW50cyBvZiBHTlUgbGQgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkbHRfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorICAgICAgKkdOVSogfCAqJ3dpdGggQkZEJyopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhaworCTs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorZWxzZQorICBsdF9jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorZmkKK2ZpCisKK0xEPSIkbHRfY3ZfcGF0aF9MRCIKK2lmIHRlc3QgLW4gIiRMRCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJExEIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRMRCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCit0ZXN0IC16ICIkTEQiICYmIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcHJvZ19nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfZ251X2xkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9wcm9nX2dudV9sZCIgPiY2Cit3aXRoX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGQKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkTEQgb3B0aW9uIHRvIHJlbG9hZCBvYmplY3QgZmlsZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2xkX3JlbG9hZF9mbGFnK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnPSctcicKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfbGRfcmVsb2FkX2ZsYWciID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2xkX3JlbG9hZF9mbGFnIiA+JjYKK3JlbG9hZF9mbGFnPSRsdF9jdl9sZF9yZWxvYWRfZmxhZworY2FzZSAkcmVsb2FkX2ZsYWcgaW4KKyIiIHwgIiAiKikgOzsKKyopIHJlbG9hZF9mbGFnPSIgJHJlbG9hZF9mbGFnIiA7OworZXNhYworcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworY2FzZSAkaG9zdF9vcyBpbgorICBkYXJ3aW4qKQorICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICByZWxvYWRfY21kcz0nJExUQ0MgJExUQ0ZMQUdTIC1ub3N0ZGxpYiAke3dsfS1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisgICAgZWxzZQorICAgICAgcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGZpCisgICAgOzsKK2VzYWMKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9OTStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuCisgICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKKyAgZmkKKyAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCisgICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisJIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKwkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisJIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisJY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQorCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwkgIGJyZWFrCisJICA7OworCSopCisJICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkgICovZGV2L251bGwqKQorCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgorCSAgICBicmVhaworCSAgICA7OworCSAgKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIGRvbmUKKyAgdGVzdCAteiAiJGx0X2N2X3BhdGhfTk0iICYmIGx0X2N2X3BhdGhfTk09bm0KK2ZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3BhdGhfTk0iID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3BhdGhfTk0iID4mNgorTk09IiRsdF9jdl9wYXRoX05NIgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJEVDSE9fQyIgPiY2CitMTl9TPSRhc19sbl9zCitpZiB0ZXN0ICIkTE5fUyIgPSAibG4gLXMiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubywgdXNpbmcgJExOX1MiID4mNQorZWNobyAiJHtFQ0hPX1R9bm8sIHVzaW5nICRMTl9TIiA+JjYKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcmVjb2duaXNlIGRlcGVuZGVudCBsaWJyYXJpZXMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDQqIHwgYWl4NSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpWzQ1XSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy91c3IvYmluL2ZpbGUgLUwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCisgIDs7CisKK2N5Z3dpbiopCisgICMgZnVuY193aW4zMl9saWJpZCBpcyBhIHNoZWxsIGZ1bmN0aW9uIGRlZmluZWQgaW4gbHRtYWluLnNoCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIF54ODYgYXJjaGl2ZSBpbXBvcnR8Xng4NiBETEwnCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSdmdW5jX3dpbjMyX2xpYmlkJworICA7OworCittaW5ndyogfCBwdzMyKikKKyAgIyBCYXNlIE1TWVMvTWluR1cgZG8gbm90IHByb3ZpZGUgdGhlICdmaWxlJyBjb21tYW5kIG5lZWRlZCBieQorICAjIGZ1bmNfd2luMzJfbGliaWQgc2hlbGwgZnVuY3Rpb24sIHNvIHVzZSBhIHdlYWtlciB0ZXN0IGJhc2VkIG9uICdvYmpkdW1wJy4KKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVszLTldODYgKGNvbXBhY3QgKT9kZW1hbmQgcGFnZWQgc2hhcmVkIGxpYnJhcnknCisgICAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgICAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvLipgCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIGZpCisgIDs7CisKK2dudSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2hwdXgxMC4yMCogfCBocHV4MTEqKQorICBsdF9jdl9maWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvcGEyMF82NC9saWJjLnNsCisgICAgOzsKKyAgKikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1swLTldWzAtOV1bMC05XXxQQS1SSVNDWzAtOV0uWzAtOV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXgzKikKKyAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xcLmEpJCcKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkTEQgaW4KKyAgKi0zMnwqIi0zMiAiKSBsaWJtYWdpYz0zMi1iaXQ7OworICAqLW4zMnwqIi1uMzIgIikgbGlibWFnaWM9TjMyOzsKKyAgKi02NHwqIi02NCAiKSBsaWJtYWdpYz02NC1iaXQ7OworICAqKSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgIGVzYWMKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW14vXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworbnRvLXFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbXi9dKyhcLnNvXC5bMC05XStcLlswLTldK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgIG1vdG9yb2xhKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW01MXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNWzAtOV1bMC05XSogVmVyc2lvbiBbMC05XScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKKyAgICA7OworICBuY3IpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBzZXF1ZW50KQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFswLTldWzAtOV0qLWJpdCBbTE1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgICA7OworICBzbmkpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiBkeW5hbWljIGxpYiIKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgICA7OworICBzaWVtZW5zKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgcGMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCIgPiY2CitmaWxlX21hZ2ljX2NtZD0kbHRfY3ZfZmlsZV9tYWdpY19jbWQKK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZAordGVzdCAteiAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiAmJiBkZXBsaWJzX2NoZWNrX21ldGhvZD11bmtub3duCisKKworCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisKK2ZpOwordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCisjIGxpYnRvb2wgc3VwcG9ydC4KK2Nhc2UgJGhvc3QgaW4KK2lhNjQtKi1ocHV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgKkVMRi0zMiopCisgICAgICBIUFVYX0lBNjRfTU9ERT0iMzIiCisgICAgICA7OworICAgICpFTEYtNjQqKQorICAgICAgSFBVWF9JQTY0X01PREU9IjY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnI2xpbmUgMzU2NCAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKyAgICAgIDs7CisgICAgZXNhYworICAgZWxzZQorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtMzIiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKKyAgICAgIDs7CisgICAgZXNhYworICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnxzMzkwKi0qbGludXgqfHNwYXJjKi0qbGludXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqMzItYml0KikKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorICAgICAgICAgIDs7CisgICAgICAgIHBwYzY0LSpsaW51eCp8cG93ZXJwYzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisgICAgICAgICAgOzsKKyAgICAgICAgczM5MHgtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmM2NC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgeDg2XzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjQiCisgICAgICAgICAgOzsKKyAgICAgICAgcHBjKi0qbGludXgqfHBvd2VycGMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0cHBjIgorICAgICAgICAgIDs7CisgICAgICAgIHMzOTAqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3MzOTAiCisgICAgICAgICAgOzsKKyAgICAgICAgc3BhcmMqLSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotc2NvMy4ydjUqKQorICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCisgIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfY2NfbmVlZHNfYmVsZitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKyAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgICAgIGFjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9jdl9jY19uZWVkc19iZWxmIiA+JjYKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKK3NwYXJjKi0qc29sYXJpcyopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkbHRfY3ZfcHJvZ19nbnVfbGQgaW4KKyAgICAgIHllcyopIExEPSIke0xELWxkfSAtbSBlbGY2NF9zcGFyYyIgOzsKKyAgICAgICopICAgIExEPSIke0xELWxkfSAtNjQiIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19ETExUT09MK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitETExUT09MPSRhY19jdl9wcm9nX0RMTFRPT0wKK2lmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRExMVE9PTCIgPiY1CitlY2hvICIke0VDSE9fVH0kRExMVE9PTCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgorICBhY19jdF9ETExUT09MPSRETExUT09MCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9ETExUT09MK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9ETExUT09MIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0RMTFRPT0w9IiRhY19jdF9ETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSJkbGx0b29sIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MPSJmYWxzZSIKK2ZpCitmaQorYWNfY3RfRExMVE9PTD0kYWNfY3ZfcHJvZ19hY19jdF9ETExUT09MCitpZiB0ZXN0IC1uICIkYWNfY3RfRExMVE9PTCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0RMTFRPT0wiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0RMTFRPT0wiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIERMTFRPT0w9JGFjX2N0X0RMTFRPT0wKK2Vsc2UKKyAgRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKK2ZpCisKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgorICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQVM9JGFjX2N2X3Byb2dfQVMKK2lmIHRlc3QgLW4gIiRBUyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFTIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRBUyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KKyAgYWNfY3RfQVM9JEFTCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0FTK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9BUyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9BUz0iJGFjX2N0X0FTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9BUz0iYXMiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9BUyIgJiYgYWNfY3ZfcHJvZ19hY19jdF9BUz0iZmFsc2UiCitmaQorZmkKK2FjX2N0X0FTPSRhY19jdl9wcm9nX2FjX2N0X0FTCitpZiB0ZXN0IC1uICIkYWNfY3RfQVMiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9BUyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQVMiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIEFTPSRhY19jdF9BUworZWxzZQorICBBUz0iJGFjX2N2X3Byb2dfQVMiCitmaQorCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqZHVtcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX09CSkRVTVA9IiRPQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIke2FjX3Rvb2xfcHJlZml4fW9iamR1bXAiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitPQkpEVU1QPSRhY19jdl9wcm9nX09CSkRVTVAKK2lmIHRlc3QgLW4gIiRPQkpEVU1QIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkT0JKRFVNUCIgPiY1CitlY2hvICIke0VDSE9fVH0kT0JKRFVNUCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19PQkpEVU1QIjsgdGhlbgorICBhY19jdF9PQkpEVU1QPSRPQkpEVU1QCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2JqZHVtcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2JqZHVtcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9IiRhY19jdF9PQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJvYmpkdW1wIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUCIgJiYgYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QPSJmYWxzZSIKK2ZpCitmaQorYWNfY3RfT0JKRFVNUD0kYWNfY3ZfcHJvZ19hY19jdF9PQkpEVU1QCitpZiB0ZXN0IC1uICIkYWNfY3RfT0JKRFVNUCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X09CSkRVTVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X09CSkRVTVAiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIE9CSkRVTVA9JGFjX2N0X09CSkRVTVAKK2Vsc2UKKyAgT0JKRFVNUD0iJGFjX2N2X3Byb2dfT0JKRFVNUCIKK2ZpCisKKyAgOzsKKworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAkRUNIT19DIiA+JjYKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2Nfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbi1leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2Nfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgYnJlYWsKK2ZpCisKKyAgICBkb25lCisgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorCitmaQorICBDUFA9JGFjX2N2X3Byb2dfQ1BQCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1BQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDUFAiID4mNgorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2Nfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbi1leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2Nfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgOgorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCisjIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZWxzZQorIyBkZWZpbmUgSVNMT1dFUihjKSBcCisJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKyNlbmRpZgorCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50CittYWluICgpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorICAgICAgZXhpdCgyKTsKKyAgZXhpdCAoMCk7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCithY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitfQUNFT0YKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KKworCisKKworCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKKworZm9yIGFjX2hlYWRlciBpbiBkbGZjbi5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjYKKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjYKKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCisgIHllczpubzogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorICAgICgKKyAgICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBSZXBvcnQgdGhpcyB0byBleHBhdC1idWdzQGxpYmV4cGF0Lm9yZyAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICkgfAorICAgICAgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworYWNfZXh0PWNjCithY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiAkQ0NDIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbCBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDWFg9JGFjX2N2X3Byb2dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRDWFgiOyB0aGVuCisgIGFjX2N0X0NYWD0kQ1hYCisgIGZvciBhY19wcm9nIGluICRDQ0MgZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQworZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ1hYK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DWFgiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DWFg9IiRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAoraWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ1hYIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICB0ZXN0IC1uICIkYWNfY3RfQ1hYIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJGFjX2N0X0NYWCIgfHwgYWNfY3RfQ1hYPSJnKysiCisKKyAgQ1hYPSRhY19jdF9DWFgKK2ZpCisKKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorZWNobyAiJGFzX21lOiRMSU5FTk86IiBcCisgICAgICJjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jeHhfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2CitHWFg9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKK2FjX3Rlc3RfQ1hYRkxBR1M9JHtDWFhGTEFHUytzZXR9CithY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUworQ1hYRkxBR1M9Ii1nIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY3h4X2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2N4eF9nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9wcm9nX2N4eF9nPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2N4eF9nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2N4eF9nIiA+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NYWEZMQUdTIiA9IHNldDsgdGhlbgorICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENYWEZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBDWFhGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ1hYRkxBR1M9CisgIGZpCitmaQorZm9yIGFjX2RlY2xhcmF0aW9uIGluIFwKKyAgICcnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpIHRocm93ICgpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpIHRocm93ICgpOycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOycgXAorICAgJ3ZvaWQgZXhpdCAoaW50KTsnCitkbworICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19kZWNsYXJhdGlvbgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19kZWNsYXJhdGlvbgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZG9uZQorcm0gLWYgY29uZnRlc3QqCitpZiB0ZXN0IC1uICIkYWNfZGVjbGFyYXRpb24iOyB0aGVuCisgIGVjaG8gJyNpZmRlZiBfX2NwbHVzcGx1cycgPj5jb25mZGVmcy5oCisgIGVjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCisgIGVjaG8gJyNlbmRpZicgICAgICAgICAgICAgPj5jb25mZGVmcy5oCitmaQorCithY19leHQ9Y2MKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworCitpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorICAgICggKHRlc3QgIlgkQ1hYIiA9ICJYZysrIiAmJiBgZysrIC12ID4vZGV2L251bGwgMj4mMWAgKSB8fAorICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorICBhY19leHQ9Y2MKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0IC16ICIkQ1hYQ1BQIjsgdGhlbgorICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1hYQ1BQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICBmb3IgQ1hYQ1BQIGluICIkQ1hYIC1FIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZworICAgIGFjX2NwcF9lcnI9JGFjX2NwcF9lcnIkYWNfY3h4X3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub24tZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2N4eF93ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KK2FjX3ByZXByb2Nfb2s9OgorYnJlYWsKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCisKK2ZpCisgIENYWENQUD0kYWNfY3ZfcHJvZ19DWFhDUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDWFhDUFAiID4mNQorZWNobyAiJHtFQ0hPX1R9JENYWENQUCIgPiY2CithY19wcmVwcm9jX29rPWZhbHNlCitmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2N4eF93ZXJyb3JfZmxhZworICBlbHNlCisgICAgYWNfY3BwX2Vycj0KKyAgZmkKK2Vsc2UKKyAgYWNfY3BwX2Vycj15ZXMKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3BwX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRcIiIpID4mNQorICAoZXZhbCAkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsOyB0aGVuCisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgYWNfY3BwX2Vycj0kYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jeHhfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgOgorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDKysgcHJlcHJvY2Vzc29yIFwiJENYWENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQysrIHByZXByb2Nlc3NvciBcIiRDWFhDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCithY19leHQ9Y2MKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKK2ZpCisKKworYWNfZXh0PWYKK2FjX2NvbXBpbGU9JyRGNzcgLWMgJEZGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRGNzcgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2Y3N19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZzc3IGY3NyB4bGYgZnJ0IHBnZjc3IGZvcnQ3NyBmbDMyIGFmNzcgZjkwIHhsZjkwIHBnZjkwIGVwY2Y5MCBmOTUgZm9ydCB4bGY5NSBpZmMgZWZjIHBnZjk1IGxmOTUgZ2ZvcnRyYW4KKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19GNzcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEY3NyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19GNzc9IiRGNzciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0Y3Nz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitGNzc9JGFjX2N2X3Byb2dfRjc3CitpZiB0ZXN0IC1uICIkRjc3IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRGNzciID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgdGVzdCAtbiAiJEY3NyIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRGNzciOyB0aGVuCisgIGFjX2N0X0Y3Nz0kRjc3CisgIGZvciBhY19wcm9nIGluIGc3NyBmNzcgeGxmIGZydCBwZ2Y3NyBmb3J0NzcgZmwzMiBhZjc3IGY5MCB4bGY5MCBwZ2Y5MCBlcGNmOTAgZjk1IGZvcnQgeGxmOTUgaWZjIGVmYyBwZ2Y5NSBsZjk1IGdmb3J0cmFuCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9GNzcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0Y3NyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9GNzc9IiRhY19jdF9GNzciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0Y3Nz0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9GNzc9JGFjX2N2X3Byb2dfYWNfY3RfRjc3CitpZiB0ZXN0IC1uICIkYWNfY3RfRjc3IjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9GNzciID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRhY19jdF9GNzciICYmIGJyZWFrCitkb25lCisKKyAgRjc3PSRhY19jdF9GNzcKK2ZpCisKKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorZWNobyAiJGFzX21lOjUyOTY6IiBcCisgICAgICJjaGVja2luZyBmb3IgRm9ydHJhbiA3NyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorcm0gLWYgYS5vdXQKKworIyBJZiB3ZSBkb24ndCB1c2UgYC5GJyBhcyBleHRlbnNpb24sIHRoZSBwcmVwcm9jZXNzb3IgaXMgbm90IHJ1biBvbiB0aGUKKyMgaW5wdXQgZmlsZS4gIChOb3RlIHRoYXQgdGhpcyBvbmx5IG5lZWRzIHRvIHdvcmsgZm9yIEdOVSBjb21waWxlcnMuKQorYWNfc2F2ZV9leHQ9JGFjX2V4dAorYWNfZXh0PUYKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEZvcnRyYW4gNzcgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2Y3N19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKyNpZm5kZWYgX19HTlVDX18KKyAgICAgICBjaG9rZSBtZQorI2VuZGlmCisKKyAgICAgIGVuZAorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Y3N193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9mNzdfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA+JjYKK2FjX2V4dD0kYWNfc2F2ZV9leHQKK2FjX3Rlc3RfRkZMQUdTPSR7RkZMQUdTK3NldH0KK2FjX3NhdmVfRkZMQUdTPSRGRkxBR1MKK0ZGTEFHUz0KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRGNzcgYWNjZXB0cyAtZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJEY3NyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2Y3N19nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIEZGTEFHUz0tZworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisgICAgICBwcm9ncmFtIG1haW4KKworICAgICAgZW5kCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2Y3N19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9wcm9nX2Y3N19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfZjc3X2ciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfZjc3X2ciID4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfRkZMQUdTIiA9IHNldDsgdGhlbgorICBGRkxBR1M9JGFjX3NhdmVfRkZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfZjc3X2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAieCRhY19jdl9mNzdfY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KKyAgICBGRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIEZGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIngkYWNfY3ZfZjc3X2NvbXBpbGVyX2dudSIgPSB4eWVzOyB0aGVuCisgICAgRkZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBGRkxBR1M9CisgIGZpCitmaQorCitHNzc9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKKyMgQXV0b2NvbmYgMi4xMydzIEFDX09CSkVYVCBhbmQgQUNfRVhFRVhUIG1hY3JvcyBvbmx5IHdvcmtzIGZvciBDIGNvbXBpbGVycyEKKworIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX21heF9jbWRfbGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgICAgaT0wCisgIHRlc3RzdHJpbmc9IkFCQ0QiCisKKyAgY2FzZSAkYnVpbGRfb3MgaW4KKyAgbXNkb3NkamdwcCopCisgICAgIyBPbiBESkdQUCwgdGhpcyB0ZXN0IGNhbiBibG93IHVwIHByZXR0eSBiYWRseSBkdWUgdG8gcHJvYmxlbXMgaW4gbGliYworICAgICMgKGFueSBzaW5nbGUgYXJndW1lbnQgZXhjZWVkaW5nIDIwMDAgYnl0ZXMgY2F1c2VzIGEgYnVmZmVyIG92ZXJydW4KKyAgICAjIGR1cmluZyBnbG9iIGV4cGFuc2lvbikuICBFdmVuIGlmIGl0IHdlcmUgZml4ZWQsIHRoZSByZXN1bHQgb2YgdGhpcworICAgICMgY2hlY2sgd291bGQgYmUgbGFyZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMjI4ODsgICAgIyAxMksgaXMgYWJvdXQgcmlnaHQKKyAgICA7OworCisgIGdudSopCisgICAgIyBVbmRlciBHTlUgSHVyZCwgdGhpcyB0ZXN0IGlzIG5vdCByZXF1aXJlZCBiZWNhdXNlIHRoZXJlIGlzCisgICAgIyBubyBsaW1pdCB0byB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgIyBMaWJ0b29sIHdpbGwgaW50ZXJwcmV0IC0xIGFzIG5vIGxpbWl0IHdoYXRzb2V2ZXIKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTE7CisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqKQorICAgICMgT24gV2luOXgvTUUsIHRoaXMgdGVzdCBibG93cyB1cCAtLSBpdCBzdWNjZWVkcywgYnV0IHRha2VzCisgICAgIyBhYm91dCA1IG1pbnV0ZXMgYXMgdGhlIHRlc3RzdHJpbmcgZ3Jvd3MgZXhwb25lbnRpYWxseS4KKyAgICAjIFdvcnNlLCBzaW5jZSA5eC9NRSBhcmUgbm90IHByZS1lbXB0aXZlbHkgbXVsdGl0YXNraW5nLAorICAgICMgeW91IGVuZCB1cCB3aXRoIGEgImZyb3plbiIgY29tcHV0ZXIsIGV2ZW4gdGhvdWdoIHdpdGggcGF0aWVuY2UKKyAgICAjIHRoZSB0ZXN0IGV2ZW50dWFsbHkgc3VjY2VlZHMgKHdpdGggYSBtYXggbGluZSBsZW5ndGggb2YgMjU2aykuCisgICAgIyBJbnN0ZWFkLCBsZXQncyBqdXN0IHB1bnQ6IHVzZSB0aGUgbWluaW11bSBsaW5lbGVuZ3RoIHJlcG9ydGVkIGJ5CisgICAgIyBhbGwgb2YgdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXM6IDgxOTIgKG9uIE5ULzJLL1hQKS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIGFtaWdhb3MqKQorICAgICMgT24gQW1pZ2FPUyB3aXRoIHBka3NoLCB0aGlzIHRlc3QgdGFrZXMgaG91cnMsIGxpdGVyYWxseS4KKyAgICAjIFNvIHdlIGp1c3QgcHVudCBhbmQgdXNlIGEgbWluaW11bSBsaW5lIGxlbmd0aCBvZiA4MTkyLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgbmV0YnNkKiB8IGZyZWVic2QqIHwgb3BlbmJzZCogfCBkYXJ3aW4qIHwgZHJhZ29uZmx5KikKKyAgICAjIFRoaXMgaGFzIGJlZW4gYXJvdW5kIHNpbmNlIDM4NkJTRCwgYXQgbGVhc3QuICBMaWtlbHkgZnVydGhlci4KKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxpZiB0ZXN0IC14IC91c3Ivc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3Vzci9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49NjU1MzYJIyB1c2FibGUgZGVmYXVsdCBmb3IgYWxsIEJTRHMKKyAgICBmaQorICAgICMgQW5kIGFkZCBhIHNhZmV0eSB6b25lCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gNGAKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcKiAzYAorICAgIDs7CisKKyAgaW50ZXJpeCopCisgICAgIyBXZSBrbm93IHRoZSB2YWx1ZSAyNjIxNDQgYW5kIGhhcmRjb2RlIGl0IHdpdGggYSBzYWZldHkgem9uZSAobGlrZSBCU0QpCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE5NjYwOAorICAgIDs7CisKKyAgb3NmKikKKyAgICAjIERyLiBIYW5zIEVra2VoYXJkIFBsZXNzZXIgcmVwb3J0cyBzZWVpbmcgYSBrZXJuZWwgcGFuaWMgcnVubmluZyBjb25maWd1cmUKKyAgICAjIGR1ZSB0byB0aGlzIHRlc3Qgd2hlbiBleGVjX2Rpc2FibGVfYXJnX2xpbWl0IGlzIDEgb24gVHJ1NjQuIEl0IGlzIG5vdAorICAgICMgbmljZSB0byBjYXVzZSBrZXJuZWwgcGFuaWNzIHNvIGxldHMgYXZvaWQgdGhlIGxvb3AgYmVsb3cuCisgICAgIyBGaXJzdCBzZXQgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTE2Mzg0CisgICAgIworICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY29uZmlnOyB0aGVuCisgICAgICBjYXNlIGAvc2Jpbi9zeXNjb25maWcgLXEgcHJvYyBleGVjX2Rpc2FibGVfYXJnX2xpbWl0YCBpbgorICAgICAgICAqMSopIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMSA7OworICAgICAgZXNhYworICAgIGZpCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xMDI0MDAKKyAgICA7OworICBzeXN2NSogfCBzY281djYqIHwgc3lzdjQuMnV3MiopCisgICAga2FyZ21heD1gZ3JlcCBBUkdfTUFYIC9ldGMvY29uZi9jZi5kL3N0dW5lIDI+L2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRrYXJnbWF4IjsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBlY2hvICRrYXJnbWF4IHwgc2VkICdzLy4qWyAJXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQorICAgIHdoaWxlICh0ZXN0ICJYImAkU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvICJYJHRlc3RzdHJpbmciIDI+L2Rldi9udWxsYCBcCisJICAgICAgID0gIlhYJHRlc3RzdHJpbmciKSA+L2Rldi9udWxsIDI+JjEgJiYKKwkgICAgbmV3X3Jlc3VsdD1gZXhwciAiWCR0ZXN0c3RyaW5nIiA6ICIuKiIgMj4mMWAgJiYKKwkgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPSRuZXdfcmVzdWx0ICYmCisJICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAorICAgIGRvCisgICAgICBpPWBleHByICRpICsgMWAKKyAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgIGRvbmUKKyAgICB0ZXN0c3RyaW5nPQorICAgICMgQWRkIGEgc2lnbmlmaWNhbnQgc2FmZXR5IGZhY3RvciBiZWNhdXNlIEMrKyBjb21waWxlcnMgY2FuIHRhY2sgb24gbWFzc2l2ZQorICAgICMgYW1vdW50cyBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBsaW5rZXIuCisgICAgIyBJdCBhcHBlYXJzIGFzIHRob3VnaCAxLzIgaXMgYSB1c2FibGUgdmFsdWUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKKyAgICA7OworICBlc2FjCisKK2ZpCisKK2lmIHRlc3QgLW4gJGx0X2N2X3N5c19tYXhfY21kX2xlbiA7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3N5c19tYXhfY21kX2xlbiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3Zfc3lzX21heF9jbWRfbGVuIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIiA+JjYKK2ZpCisKKworCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbQkNERUdSU1RdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gaW50IFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUgXChbXiBdKlwpIFwoW14gXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVF0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHN5bWNvZGU9J1tBQkNER0lTVFddJworICA7OworaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbQUJDREVHUlNUXScKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFteIF0qXCkgXChbXiBdKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKyAgOzsKK2xpbnV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbQUJDREdJUlNUV10nCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW14gXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW14gXSpcKSBcKFteIF0qXCkkLyAge1wiXDJcIiwgKGx0X3B0cikgXCZcMn0sL3AnIgorICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbQkNERUdSU1RdJworICA7Oworb3NmKikKKyAgc3ltY29kZT0nW0JDREVHUVJTVF0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW0JEUlRdJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbRFRdJworICA7Oworc3lzdjQuMnV3MiopCisgIHN5bWNvZGU9J1tEVF0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbQUJEVF0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW0RGTlNUVV0nCisgIDs7Citlc2FjCisKKyMgSGFuZGxlIENSTEYgaW4gbWluZ3cgdG9vbCBjaGFpbgorb3B0X2NyPQorY2FzZSAkYnVpbGRfb3MgaW4KK21pbmd3KikKKyAgb3B0X2NyPWBlY2hvICd4XHswLDFcfScgfCB0ciB4ICdcMDE1J2AgIyBvcHRpb24gY3IgaW4gcmVnZXhwCisgIDs7Citlc2FjCisKKyMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgorY2FzZSBgJE5NIC1WIDI+JjFgIGluCisqR05VKiB8ICond2l0aCBCRkQnKikKKyAgc3ltY29kZT0nW0FCQ0RHSVJTVFddJyA7OworZXNhYworCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJHN5bWNvZGUkc3ltY29kZSpcKVsgCV1bIAldKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorRU9GCisKKyAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCisgICAgbmxpc3Q9Y29uZnRlc3Qubm0KKyAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdFwiIikgPiY1CisgIChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRubGlzdCkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuJGFjX2V4dAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAobHRfcHRyX3QpIFwmXDJ9LC8iIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dAorCSAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAobHRfcHRyX3QpIDB9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorRU9GCisJICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgorCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdHN0bS4kYWNfb2JqZXh0CisJICBsdF9zYXZlX0xJQlM9IiRMSUJTIgorCSAgbHRfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJICBMSUJTPSJjb25mdHN0bS4kYWNfb2JqZXh0IgorCSAgQ0ZMQUdTPSIkQ0ZMQUdTJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIgorCSAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKwkgICAgcGlwZV93b3Jrcz15ZXMKKwkgIGZpCisJICBMSUJTPSIkbHRfc2F2ZV9MSUJTIgorCSAgQ0ZMQUdTPSIkbHRfc2F2ZV9DRkxBR1MiCisJZWxzZQorCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1CisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKKyAgICBmaQorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKKworZmkKKworaWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQorZmkKK2lmIHRlc3QgLXogIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBmYWlsZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9ZmFpbGVkIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogb2siID4mNQorZWNobyAiJHtFQ0hPX1R9b2siID4mNgorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvYmpkaXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb2JqZGlyLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9vYmpkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9vYmpkaXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X29iamRpciIgPiY2CitvYmpkaXI9JGx0X2N2X29iamRpcgorCisKKworCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtcXCJcXGBcXFxcXVwpL1xcXDEvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKKyMgQ29uc3RhbnRzOgorcm09InJtIC1mIgorCisjIEdsb2JhbCB2YXJpYWJsZXM6CitkZWZhdWx0X29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorb2ZpbGU9IiRkZWZhdWx0X29maWxlIgord2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBhY19jdl9wcm9nX0FSPSIkQVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQVI9JGFjX2N2X3Byb2dfQVIKK2lmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFSIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRBUiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUiI7IHRoZW4KKyAgYWNfY3RfQVI9JEFSCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGFyOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0FSK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9BUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iJGFjX2N0X0FSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9BUj0iYXIiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9BUiIgJiYgYWNfY3ZfcHJvZ19hY19jdF9BUj0iZmFsc2UiCitmaQorZmkKK2FjX2N0X0FSPSRhY19jdl9wcm9nX2FjX2N0X0FSCitpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9BUiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQVIiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIEFSPSRhY19jdF9BUgorZWxzZQorICBBUj0iJGFjX2N2X3Byb2dfQVIiCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK1JBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQorZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCisgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IjoiCitmaQorZmkKK2FjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1JBTkxJQiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgUkFOTElCPSRhY19jdF9SQU5MSUIKK2Vsc2UKKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1zdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1zdHJpcDsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfU1RSSVA9IiRTVFJJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfU1RSSVA9IiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitTVFJJUD0kYWNfY3ZfcHJvZ19TVFJJUAoraWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU1RSSVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JFNUUklQIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1NUUklQIjsgdGhlbgorICBhY19jdF9TVFJJUD0kU1RSSVAKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc3RyaXA7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSIkYWNfY3RfU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSJzdHJpcCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjX2N0X1NUUklQIiAmJiBhY19jdl9wcm9nX2FjX2N0X1NUUklQPSI6IgorZmkKK2ZpCithY19jdF9TVFJJUD0kYWNfY3ZfcHJvZ19hY19jdF9TVFJJUAoraWYgdGVzdCAtbiAiJGFjX2N0X1NUUklQIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfU1RSSVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1NUUklQIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBTVFJJUD0kYWNfY3RfU1RSSVAKK2Vsc2UKKyAgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorZmkKKworCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQVIiICYmIEFSPWFyCit0ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQordGVzdCAteiAiJEFTIiAmJiBBUz1hcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Cit0ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorZmkKKworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK2Nhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCitmaWxlX21hZ2ljKikKKyAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJHthY190b29sX3ByZWZpeH1maWxlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICR7YWNfdG9vbF9wcmVmaXh9ZmlsZS4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9NQUdJQ19DTUQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTUFHSUNfQ01EIGluCitbXFwvKl0gfCAgPzpbXFwvXSopCisgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyopCisgIGx0X3NhdmVfTUFHSUNfQ01EPSIkTUFHSUNfQ01EIgorICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgYWNfZHVtbXk9Ii91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyR7YWNfdG9vbF9wcmVmaXh9ZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvJHthY190b29sX3ByZWZpeH1maWxlIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgY29tbWFuZCBsaWJ0b29sIHVzZXMgdG8gZGV0ZWN0IHNoYXJlZCBsaWJyYXJpZXMsCisqKiogJGZpbGVfbWFnaWNfY21kLCBwcm9kdWNlcyBvdXRwdXQgdGhhdCBsaWJ0b29sIGNhbm5vdCByZWNvZ25pemUuCisqKiogVGhlIHJlc3VsdCBpcyB0aGF0IGxpYnRvb2wgbWF5IGZhaWwgdG8gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJpZXMKKyoqKiBhcyBzdWNoLiAgVGhpcyB3aWxsIGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMgdGhhdAorKioqIGRlcGVuZCBvbiBzaGFyZWQgbGlicmFyaWVzLCBidXQgcHJvZ3JhbXMgbGlua2VkIHdpdGggc3VjaCBsaWJ0b29sCisqKiogbGlicmFyaWVzIHdpbGwgd29yayByZWdhcmRsZXNzIG9mIHRoaXMgcHJvYmxlbS4gIE5ldmVydGhlbGVzcywgeW91CisqKiogbWF5IHdhbnQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHlvdXIgc3lzdGVtIG1hbmFnZXIgYW5kL29yIHRvCisqKiogYnVnLWxpYnRvb2xAZ251Lm9yZworCitFT0YKKwkgIGZpIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgTUFHSUNfQ01EPSIkbHRfc2F2ZV9NQUdJQ19DTUQiCisgIDs7Citlc2FjCitmaQorCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNQUdJQ19DTUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JE1BR0lDX0NNRCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRsdF9jdl9wYXRoX01BR0lDX0NNRCI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmlsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBmaWxlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wYXRoX01BR0lDX0NNRCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXNlICRNQUdJQ19DTUQgaW4KK1tcXC8qXSB8ICA/OltcXC9dKikKKyAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworKikKKyAgbHRfc2F2ZV9NQUdJQ19DTUQ9IiRNQUdJQ19DTUQiCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBhY19kdW1teT0iL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvZmlsZTsgdGhlbgorICAgICAgbHRfY3ZfcGF0aF9NQUdJQ19DTUQ9IiRhY19kaXIvZmlsZSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworRU9GCisJICBmaSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgorICA7OworZXNhYworZmkKKworTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTUFHSUNfQ01EIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRNQUdJQ19DTUQiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIGVsc2UKKyAgICBNQUdJQ19DTUQ9OgorICBmaQorZmkKKworICBmaQorICA7OworZXNhYworCitlbmFibGVfZGxvcGVuPW5vCitlbmFibGVfd2luMzJfZGxsPXllcworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCisKK2ZpOwordGVzdCAieCRlbmFibGVfbGlidG9vbF9sb2NrIiAhPSB4bm8gJiYgZW5hYmxlX2xpYnRvb2xfbG9jaz15ZXMKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXBpYyBvciAtLXdpdGhvdXQtcGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9waWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfcGljIgorICBwaWNfbW9kZT0iJHdpdGh2YWwiCitlbHNlCisgIHBpY19tb2RlPWRlZmF1bHQKK2ZpOwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0CisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0Cit0YWduYW1lPQorbHRfc2F2ZV9DQz0iJENDIgorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitvYmpleHQ9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKCl7cmV0dXJuKDApO31cbicKKworCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorCitsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4nCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCisgIGFjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW14gXSpjb25mdGVzdFwuOiAkbHRfY29tcGlsZXJfZmxhZyY6OyB0JyBcCisgICAtZSAnczokOiAkbHRfY29tcGlsZXJfZmxhZzonYAorICAgKGV2YWwgZWNobyAiXCJcJGFzX21lOjYzNjM6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6NjM2NzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNgorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA9IHh5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMiCitlbHNlCisgICAgOgorZmkKKworZmkKKworbHRfcHJvZ19jb21waWxlcl93bD0KK2x0X3Byb2dfY29tcGlsZXJfcGljPQorbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRFQ0hPX0MiID4mNgorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworCisgICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZuby1jb21tb24nCisgICAgICA7OworCisgICAgaW50ZXJpeDMqKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKworICAgIG1zZG9zZGpncHAqKQorICAgICAgIyBKdXN0IGJlY2F1c2Ugd2UgdXNlIEdDQyBkb2Vzbid0IG1lYW4gd2Ugc3VkZGVubHkgZ2V0IHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgICMgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgICopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZWxzZQorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKyAgICAgIGRhcndpbiopCisgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICB4bGMqKQorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1xbm9jb21tb24nCisgICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgICAgOzsKKyAgICAgICBlc2FjCisgICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpYz0nK1onCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICMgSXMgdGhlcmUgYSBiZXR0ZXIgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgbGludXgqKQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGljYyogfCBlY2MqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctc3RhdGljJworICAgICAgICA7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworCWx0X3Byb2dfY29tcGlsZXJfcGljPSctZnBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsPSctV2wsJworICAgICAgICAjIEFsbCBBbHBoYSBjb2RlIGlzIFBJQy4KKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisJbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJzs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfd2w9Jy1XbCwnOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVFvcHRpb24gbGQgJworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1QSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWM9Jy1LY29uZm9ybV9waWMnCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWM9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCB1bml4d2FyZSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgT3BlblVOSVgqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICB1bmljb3MqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bD0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWM9Jy1waWMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9waWMiID4mNgorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWMiOyB0aGVuCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpYyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3M9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljIC1EUElDIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTo2NjMxOiAkbHRfY29tcGlsZVwiIiA+JjUpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjY2MzU6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrcz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzIiA+JjYKKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcyIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWMgaW4KKyAgICAgIiIgfCAiICIqKSA7OworICAgICAqKSBsdF9wcm9nX2NvbXBpbGVyX3BpYz0iICRsdF9wcm9nX2NvbXBpbGVyX3BpYyIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgICBsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQ9bm8KK2ZpCisKK2ZpCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWM9IiRsdF9wcm9nX2NvbXBpbGVyX3BpYyAtRFBJQyIKKyAgICA7OworZXNhYworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgorICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3M9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzIiA+JjYKKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3JrcyIgPSB4eWVzOyB0aGVuCisgICAgOgorZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljPQorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vPW5vCisgICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6NjczNTogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjY3Mzk6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQKKyAgIHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gb3V0L2NvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgb3V0L2NvbmZ0ZXN0LmVyciA+b3V0L2NvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgb3V0L2NvbmZ0ZXN0LmVyMiB8fCBkaWZmIG91dC9jb25mdGVzdC5leHAgb3V0L2NvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX289eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJHJtIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgcm1kaXIgY29uZnRlc3QKKyAgICRybSBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jb21waWxlcl9jX28iID4mNgorCisKK2hhcmRfbGlua3M9Im5vdHRlc3RlZCIKK2lmIHRlc3QgIiRsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbyIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gJEVDSE9fQyIgPiY2CisgIGhhcmRfbGlua3M9eWVzCisgICRybSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkX2xpbmtzIiA+JjYKKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjYKKworICBydW5wYXRoX3Zhcj0KKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9bm8KKyAgYXJjaGl2ZV9jbWRzPQorICBhcmNoaXZlX2V4cHN5bV9jbWRzPQorICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPQorICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0KKyAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQorICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjPQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPQorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQorICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgaGFyZGNvZGVfbWludXNfTD1ubworICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCisgIGxpbmtfYWxsX2RlcGxpYnM9dW5rbm93bgorICBoYXJkY29kZV9hdXRvbWF0aWM9bm8KKyAgbW9kdWxlX2NtZHM9CisgIG1vZHVsZV9leHBzeW1fY21kcz0KKyAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzPW5vCisgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgIyBpbmNsdWRlX2V4cHN5bXMgc2hvdWxkIGJlIGEgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgc3ltYm9scyB0byBiZSAqYWx3YXlzKgorICAjIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAorICBpbmNsdWRlX2V4cHN5bXM9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgZXhjbHVkZV9leHBzeW1zPSJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICBleHRyYWN0X2V4cHN5bXNfY21kcz0KKyAgIyBKdXN0IGJlaW5nIHBhcmFub2lkIGFib3V0IGVuc3VyaW5nIHRoYXQgY2NfYmFzZW5hbWUgaXMgc2V0LgorICBmb3IgY2NfdGVtcCBpbiAkY29tcGlsZXIiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1xcL11jb21waWxlIHwgY2NhY2hlIHwgKltcXC9dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1xcL11kaXN0Y2MgfCBwdXJpZnkgfCAqW1xcL11wdXJpZnkgKSA7OworICAgIFwtKikgOzsKKyAgICAqKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2NjX2Jhc2VuYW1lPWAkZWNobyAiWCRjY190ZW1wIiB8ICRYc2VkIC1lICdzJS4qLyUlJyAtZSAicyVeJGhvc3RfYWxpYXMtJSUiYAorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKKyAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCisgICAgICB3aXRoX2dudV9sZD1ubworICAgIGZpCisgICAgOzsKKyAgaW50ZXJpeCopCisgICAgIyB3ZSBqdXN0IGhvcGUvYXNzdW1lIHRoaXMgaXMgZ2NjIGFuZCBub3QgYzg5ICg9IE1TVkMrKykKKyAgICB3aXRoX2dudV9sZD15ZXMKKyAgICA7OworICBvcGVuYnNkKikKKyAgICB3aXRoX2dudV9sZD1ubworICAgIDs7CisgIGVzYWMKKworICBsZF9zaGxpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKyAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKwl3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgIGVsc2UKKyAgCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgorICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlicz1ubworCWNhdCA8PEVPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiB0aGUgR05VIGxpbmtlciwgYXQgbGVhc3QgdXAgdG8gcmVsZWFzZSAyLjkuMSwgaXMgcmVwb3J0ZWQKKyoqKiB0byBiZSB1bmFibGUgdG8gcmVsaWFibHkgY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gQUlYLgorKioqIFRoZXJlZm9yZSwgbGlidG9vbCBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgSWYgeW91CisqKiogcmVhbGx5IGNhcmUgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgd2FudCB0byBtb2RpZnkgeW91ciBQQVRICisqKiogc28gdGhhdCBhIG5vbi1HTlUgbGlua2VyIGlzIGZvdW5kLCBhbmQgdGhlbiByZXN0YXJ0LgorCitFT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworCisgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAorICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZQorICAgICAgIyB0aGVtLgorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCApIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLAorICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KKyAgICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXM9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW0JDREdSU10gL3MvLiogXChbXiBdKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW0FJVFddIC9zLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnM9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgaW50ZXJpeDMqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCXRtcF9hZGRmbGFnPQorCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorCXBnY2MqKQkJCQkjIFBvcnRsYW5kIEdyb3VwIEMgY29tcGlsZXIKKwkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICB0bXBfYWRkZmxhZz0nICRwaWNfZmxhZycKKwkgIDs7CisJcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQkjIFBvcnRsYW5kIEdyb3VwIGY3NyBhbmQgZjkwIGNvbXBpbGVycworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWVzYWMKKwlhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkJyIkdG1wX2FkZGZsYWciJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKworCWlmIHRlc3QgJHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyA9IHllczsgdGhlbgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgJGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgJENDIC1zaGFyZWQnIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworCWZpCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogVGhlIHJlbGVhc2VzIDIuOC4qIG9mIHRoZSBHTlUgbGlua2VyIGNhbm5vdCByZWxpYWJseQorKioqIGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNvbGFyaXMgc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi45LjEgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCopCisgICAgICBjYXNlIGAkTEQgLXYgMj4mMWAgaW4KKyAgICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xWzAtNV0uKikKKwlsZF9zaGxpYnM9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCisJICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliJworCSAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBsZF9zaGxpYnM9bm8KKwkgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgd2xhcmM9CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9CisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCisgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXg0KiB8IGFpeDUqKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKyAgCSAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KKyAgCSAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworICAJICAgIGJyZWFrCisgIAkgIGZpCisJICBkb25lCisJICA7OworCWVzYWMKKworCWV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgZmkKKworICAgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICBhcmNoaXZlX2NtZHM9JycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisgIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisgIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorICAJICBoYXJkY29kZV9kaXJlY3Q9eWVzCisJICBlbHNlCisgIAkgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgCSAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgIAkgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKyAgCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKyAgCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisgIAkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KKwkgIGZpCisJICA7OworCWVzYWMKKwlzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCWZpCisgICAgICBlbHNlCisJIyBub3QgdXNpbmcgZ2NjCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisgIAkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydC4KKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9scz15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nLWJlcm9rJworICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iLXogbm9kZWZzIgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgIG5vX3VuZGVmaW5lZF9mbGFnPScgJHt3bH0tYmVybm90b2snCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWJlcm9rJworCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0nJGNvbnZlbmllbmNlJworCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgYXJjaGl2ZV9leHBzeW1fY21kcz0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKworICAgIGJzZGlbNDVdKikKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAubGliIGZpbGVzLCBub3QgLmEgZmlsZXMuCisgICAgICBsaWJleHQ9bGliCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmRsbCBmaWxlcywgbm90IC5zbyBmaWxlcy4KKyAgICAgIHNocmV4dF9jbWRzPSIuZGxsIgorICAgICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgorICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKyAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzPSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIG9sZF9hcmNoaXZlX2NtZHM9J2xpYiAvT1VUOiRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicycKKyAgICAgIGZpeF9zcmNmaWxlX3BhdGg9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcz15ZXMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQorICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgICAgMTAuWzAxMl0pCisgICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgIDEwLiopCisgICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgICAgICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgIGhhcmRjb2RlX2F1dG9tYXRpYz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9dW5zdXBwb3J0ZWQKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScnCisgICAgICBsaW5rX2FsbF9kZXBsaWJzPXllcworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorICAgIAlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKKyAgICAgIG1vZHVsZV9jbWRzPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgIG1vZHVsZV9leHBzeW1fY21kcz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGVsc2UKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIHhsYyopCisgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJworICAgICAgICAgbW9kdWxlX2NtZHM9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHM9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICA7OworICAgICAgICopCisgICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKKyAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kTEQgLWIgK2IgJGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKworCWhhcmRjb2RlX2RpcmVjdD15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCWhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgxMSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHM9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kcz0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPScrYiAkbGliZGlyJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJICA7OworCSopCisJICBoYXJkY29kZV9kaXJlY3Q9eWVzCisJICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgbGlua19hbGxfZGVwbGlicz15ZXMKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICBvcGVuYnNkKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tRScKKyAgICAgIGVsc2UKKyAgICAgICBjYXNlICRob3N0X29zIGluCisJIG9wZW5ic2RbMDFdLiogfCBvcGVuYnNkMi5bMC03XSB8IG9wZW5ic2QyLlswLTddLiopCisJICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKwkgICA7OworCSAqKQorCSAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgOzsKKyAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmEgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgOzsKKworICAgIG9zZjMqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHM9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisKKyAgICBvc2Y0KiB8IG9zZjUqKQkjIGFzIG9zZjMqIHdpdGggdGhlIGFkZGl0aW9uIG9mIC1tc3ltIGZsYWcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lOyBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWlucHV0ICRsaWIuZXhwICRsaW5rZXJfZmxhZ3MgJGxpYm9ianMgJGRlcGxpYnMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+JHJtICRsaWIuZXhwJworCisJIyBCb3RoIGMgYW5kIGN4eCBjb21waWxlciBzdXBwb3J0IC1ycGF0aCBkaXJlY3RseQorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyAteiB0ZXh0JworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBlbHNlCisJd2xhcmM9JycKKwlhcmNoaXZlX2NtZHM9JyRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNvbGFyaXMyLlswLTVdIHwgc29sYXJpczIuWzAtNV0uKikgOzsKKyAgICAgICopCisgCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKKyAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCisgCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KKyAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCisgCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisgCWNhc2UgJHdsYXJjIGluCisgCScnKQorIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OworIAkqKQorIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnIDs7CisgCWVzYWMgOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdD15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICByZWxvYWRfY21kcz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3Q9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwloYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosdGV4dCcKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kcz0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgICAjIGFzIC16IGRlZnMuCisgICAgICBub191bmRlZmluZWRfZmxhZz0nJHt3bH0teix0ZXh0JworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyR7d2x9LXosbm9kZWZzJworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGM9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnM9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxkX3NobGlicyIgPiY1CitlY2hvICIke0VDSE9fVH0kbGRfc2hsaWJzIiA+JjYKK3Rlc3QgIiRsZF9zaGxpYnMiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kcyBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wKKwlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWMKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9CisgICAgICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiKSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kcyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisgICAgICAgIHRoZW4KKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjPW5vCisgICAgICAgIGVsc2UKKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjPXllcworICAgICAgICBmaQorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgICAgZWxzZQorICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgIGZpCisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFyY2hpdmVfY21kc19uZWVkX2xjIiA+JjYKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRFQ0hPX0MiID4mNgorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICBmaQorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXg0KiB8IGFpeDUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgICAgIDs7CisgICAgbWluZ3cqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKyAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitrZnJlZWJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkKikgIyBmcm9tIDQuNiBvbgorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAgaHBwYSo2NCopCisgICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgICA7OworICAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpbnRlcml4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLztzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKwora25ldGJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitudG8tcW54KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKSBuZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRkeW5hbWljX2xpbmtlciIgPiY2Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkRUNIT19DIiA+JjYKK2hhcmRjb2RlX2FjdGlvbj0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8fCBcCisgICB0ZXN0IC1uICIkcnVucGF0aF92YXIiIHx8IFwKKyAgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICkiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgaGFyZGNvZGVfYWN0aW9uPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBoYXJkY29kZV9hY3Rpb249aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbj11bnN1cHBvcnRlZAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb24iID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRjb2RlX2FjdGlvbiIgPiY2CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCitzdHJpcGxpYj0KK29sZF9zdHJpcGxpYj0KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHN0cmlwcGluZyBsaWJyYXJpZXMgaXMgcG9zc2libGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgICBkYXJ3aW4qKQorICAgICAgIGlmIHRlc3QgLW4gIiRTVFJJUCIgOyB0aGVuCisgICAgICAgICBzdHJpcGxpYj0iJFNUUklQIC14IgorICAgICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgICAgICAgZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorICAgICAgIDs7CisgICAqKQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CisgICAgOzsKKyAgZXNhYworZmkKKworaWYgdGVzdCAieCRlbmFibGVfZGxvcGVuIiAhPSB4eWVzOyB0aGVuCisgIGVuYWJsZV9kbG9wZW49dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93bgorICBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPXVua25vd24KK2Vsc2UKKyAgbHRfY3ZfZGxvcGVuPW5vCisgIGx0X2N2X2Rsb3Blbl9saWJzPQorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYmVvcyopCisgICAgbHRfY3ZfZGxvcGVuPSJsb2FkX2FkZF9vbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICBsdF9jdl9kbG9wZW5fc2VsZj15ZXMKKyAgICA7OworCisgIG1pbmd3KiB8IHB3MzIqKQorICAgIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICA7OworCisgIGRhcndpbiopCisgICMgaWYgbGliZGwgaXMgaW5zdGFsbGVkIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IGl0CisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9kbF9kbG9wZW4gPSB5ZXM7IHRoZW4KKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgorZWxzZQorCisgICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworCitmaQorCisgICA7OworCisgICopCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaGxfbG9hZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaGxfbG9hZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19zaGxfbG9hZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSBzaGxfbG9hZCB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIHNobF9sb2FkLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lIHNobF9sb2FkIGlubm9jdW91c19zaGxfbG9hZAorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaGxfbG9hZCAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiBzaGxfbG9hZAorCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHNobF9sb2FkICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX3NobF9sb2FkKSB8fCBkZWZpbmVkIChfX3N0dWJfX19zaGxfbG9hZCkKK2Nob2tlIG1lCisjZWxzZQorY2hhciAoKmYpICgpID0gc2hsX2xvYWQ7CisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgIT0gc2hsX2xvYWQ7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfZnVuY19zaGxfbG9hZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfZnVuY19zaGxfbG9hZD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfc2hsX2xvYWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfc2hsX2xvYWQiID4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19zaGxfbG9hZCA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNobF9sb2FkIGluIC1sZGxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfZGxkX3NobF9sb2FkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxkICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHNobF9sb2FkICgpOworaW50CittYWluICgpCit7CitzaGxfbG9hZCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfZGxkX3NobF9sb2FkPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9saWJfZGxkX3NobF9sb2FkPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfZGxkX3NobF9sb2FkID0geWVzOyB0aGVuCisgIGx0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiIGx0X2N2X2Rsb3Blbl9saWJzPSItZGxkIgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4uLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lIGRsb3BlbiB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIGRsb3Blbi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSBkbG9wZW4gaW5ub2N1b3VzX2Rsb3BlbgorCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBkbG9wZW4gKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgZGxvcGVuCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZGxvcGVuICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX2Rsb3BlbikgfHwgZGVmaW5lZCAoX19zdHViX19fZGxvcGVuKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSBkbG9wZW47CisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGYgIT0gZGxvcGVuOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2Z1bmNfZGxvcGVuPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9mdW5jX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfZGxvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX2Rsb3BlbiIgPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGRsb3BlbiAoKTsKK2ludAorbWFpbiAoKQoreworZGxvcGVuICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9kbF9kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9kbF9kbG9wZW49bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZGxfZGxvcGVuIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9kbF9kbG9wZW4gPSB5ZXM7IHRoZW4KKyAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsIgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbHN2bGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sc3ZsZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3N2bGRfZGxvcGVuK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sc3ZsZCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbG9wZW4gKCk7CitpbnQKK21haW4gKCkKK3sKK2Rsb3BlbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9saWJfc3ZsZF9kbG9wZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9zdmxkX2Rsb3Blbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3N2bGRfZGxvcGVuIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9zdmxkX2Rsb3BlbiA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbGRfbGluayBpbiAtbGRsZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RsZF9kbGRfbGluaytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbGRsZCAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbGRfbGluayAoKTsKK2ludAorbWFpbiAoKQoreworZGxkX2xpbmsgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX2RsZF9kbGRfbGluaz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX2RsZF9kbGRfbGluaz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbGRfZGxkX2xpbmsiID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX2RsZF9kbGRfbGluayA9IHllczsgdGhlbgorICBsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCIKK2ZpCisKKworZmkKKworCitmaQorCisKK2ZpCisKKworZmkKKworCitmaQorCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9kbG9wZW5fc2VsZitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAJICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIGx0X2N2X2Rsb3Blbl9zZWxmPWNyb3NzCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTA4MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpIGx0X2N2X2Rsb3Blbl9zZWxmPXllcyA7OworICAgICAgeCRsdF9kbHVua25vd258eCopIGx0X2N2X2Rsb3Blbl9zZWxmPW5vIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfZGxvcGVuX3NlbGYiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X2Rsb3Blbl9zZWxmIiA+JjYKKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIAkgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCitlbHNlCisgIGx0X2RsdW5rbm93bj0wOyBsdF9kbG5vX3VzY29yZT0xOyBsdF9kbG5lZWRfdXNjb3JlPTIKKyAgbHRfc3RhdHVzPSRsdF9kbHVua25vd24KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTE4MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgZXhpdCAoaW50KTsKKyNlbmRpZgorCit2b2lkIGZub3JkKCkgeyBpbnQgaT00Mjt9CitpbnQgbWFpbiAoKQoreworICB2b2lkICpzZWxmID0gZGxvcGVuICgwLCBMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XKTsKKyAgaW50IHN0YXR1cyA9ICRsdF9kbHVua25vd247CisKKyAgaWYgKHNlbGYpCisgICAgeworICAgICAgaWYgKGRsc3ltIChzZWxmLCJmbm9yZCIpKSAgICAgICBzdGF0dXMgPSAkbHRfZGxub191c2NvcmU7CisgICAgICBlbHNlIGlmIChkbHN5bSggc2VsZiwiX2Zub3JkIikpIHN0YXR1cyA9ICRsdF9kbG5lZWRfdXNjb3JlOworICAgICAgLyogZGxjbG9zZSAoc2VsZik7ICovCisgICAgfQorICBlbHNlCisgICAgcHV0cyAoZGxlcnJvciAoKSk7CisKKyAgICBleGl0IChzdGF0dXMpOworfQorRU9GCisgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiY1IDI+L2Rldi9udWxsCisgICAgbHRfc3RhdHVzPSQ/CisgICAgY2FzZSB4JGx0X3N0YXR1cyBpbgorICAgICAgeCRsdF9kbG5vX3VzY29yZSkgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcyA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9eWVzIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubworICBmaQorZmkKK3JtIC1mciBjb25mdGVzdCoKKworCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIiA+JjYKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCisKKworIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGNhbl9idWlsZF9zaGFyZWQiID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgZmkKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGZpCisgICAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVfc2hhcmVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRlbmFibGVfc2hhcmVkIiA+JjYKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjYKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlX3N0YXRpYyIgPiY1CitlY2hvICIke0VDSE9fVH0kZW5hYmxlX3N0YXRpYyIgPiY2CisKKyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBjb21waWxlciBcCisgICAgQ0MgXAorICAgIExEIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpYyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnIFwKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAorICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlYyBcCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgXAorICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMgXAorICAgIG9sZF9hcmNoaXZlX2NtZHMgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgXAorICAgIHByZWRlcF9vYmplY3RzIFwKKyAgICBwb3N0ZGVwX29iamVjdHMgXAorICAgIHByZWRlcHMgXAorICAgIHBvc3RkZXBzIFwKKyAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGggXAorICAgIGFyY2hpdmVfY21kcyBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcyBcCisgICAgcG9zdGluc3RhbGxfY21kcyBcCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyBcCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgXAorICAgIG5vX3VuZGVmaW5lZF9mbGFnIFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIFwKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIFwKKyAgICBoYXJkY29kZV9hdXRvbWF0aWMgXAorICAgIG1vZHVsZV9jbWRzIFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHMgXAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vIFwKKyAgICBleGNsdWRlX2V4cHN5bXMgXAorICAgIGluY2x1ZGVfZXhwc3ltczsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIG9sZF9hcmNoaXZlX2NtZHMgfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKKyAgICBhcmNoaXZlX2NtZHMgfCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kcyB8IFwKKyAgICBtb2R1bGVfY21kcyB8IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHMgfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMgfCBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kcyB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXCQwIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2NmZ2ZpbGU9IiR7b2ZpbGV9VCIKKyAgdHJhcCAiJHJtIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKKyAgJHJtIC1mICIkY2ZnZmlsZSIKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJG9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJG9maWxlIiA+JjY7fQorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRlY2hvICIkY2ZnZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBQcm92aWRlIGdlbmVyYWxpemVkIGxpYnJhcnktYnVpbGRpbmcgc3VwcG9ydCBzZXJ2aWNlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCisjIE5PVEU6IENoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0OiBsb29rIGF0IGx0bWFpbi5zaC4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbDoKKyMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0LgorU0VEPSRsdF9TRUQKKworIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworIyBUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQuCithdmFpbGFibGVfdGFncz0KKworIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBUaGUgaG9zdCBzeXN0ZW0uCitob3N0X2FsaWFzPSRob3N0X2FsaWFzCitob3N0PSRob3N0Citob3N0X29zPSRob3N0X29zCisKKyMgVGhlIGJ1aWxkIHN5c3RlbS4KK2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworYnVpbGQ9JGJ1aWxkCitidWlsZF9vcz0kYnVpbGRfb3MKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgTFRDQyBjb21waWxlciBmbGFncy4KK0xUQ0ZMQUdTPSRsdF9MVENGTEFHUworCisjIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCitDQz0kbHRfY29tcGlsZXIKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQworCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRAorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRsdF9TVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSIkQVMiCisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2wKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2NfbworCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgordGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWMKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzCitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzCitwb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKK21vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kcworbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHMKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHMKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHMKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X3ByZWRlcHMKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzCisKKyMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyMgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZworCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWcKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYworCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3QKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0wKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXIKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpYworCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlicworCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKworIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KK2ZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoIgorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9scworCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzCisKKyMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltcworCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zCisKKyMgIyMjIEVORCBMSUJUT09MIENPTkZJRworCitfX0VPRl9fCisKKworICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIGNhdCA8PFxFT0YgPj4gIiRjZmdmaWxlIgorCisjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyMgcmVhc29uLCBpZiB3ZSBzZXQgdGhlIENPTExFQ1RfTkFNRVMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZSBwcm9ibGVtcworIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgoraWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgIENPTExFQ1RfTkFNRVM9CisgIGV4cG9ydCBDT0xMRUNUX05BTUVTCitmaQorRU9GCisgICAgOzsKKyAgZXNhYworCisgICMgV2UgdXNlIHNlZCBpbnN0ZWFkIG9mIGNhdCBiZWNhdXNlIGJhc2ggb24gREpHUFAgZ2V0cyBjb25mdXNlZCBpZgorICAjIGlmIGZpbmRzIG1peGVkIENSL0xGIGFuZCBMRi1vbmx5IGxpbmVzLiAgU2luY2Ugc2VkIG9wZXJhdGVzIGluCisgICMgdGV4dCBtb2RlLCBpdCBwcm9wZXJseSBjb252ZXJ0cyBsaW5lcyB0byBDUi9MRi4gIFRoaXMgYmFzaCBwcm9ibGVtCisgICMgaXMgcmVwb3J0ZWRseSBmaXhlZCwgYnV0IHdoeSBub3QgcnVuIG9uIG9sZCB2ZXJzaW9ucyB0b28/CisgIHNlZCAnJHEnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIHx8IChybSAtZiAiJGNmZ2ZpbGUiOyBleGl0IDEpCisKKyAgbXYgLWYgIiRjZmdmaWxlIiAiJG9maWxlIiB8fCBcCisgICAgKHJtIC1mICIkb2ZpbGUiICYmIGNwICIkY2ZnZmlsZSIgIiRvZmlsZSIgJiYgcm0gLWYgIiRjZmdmaWxlIikKKyAgY2htb2QgK3ggIiRvZmlsZSIKKworZWxzZQorICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCisgICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQorICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCisgIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAorICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgorICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKKyAgZmkKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitDQz0iJGx0X3NhdmVfQ0MiCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC10YWdzIG9yIC0td2l0aG91dC10YWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF90YWdzK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX3RhZ3MiCisgIHRhZ25hbWVzPSIkd2l0aHZhbCIKK2ZpOworCitpZiB0ZXN0IC1mICIkbHRtYWluIiAmJiB0ZXN0IC1uICIkdGFnbmFtZXMiOyB0aGVuCisgIGlmIHRlc3QgISAtZiAiJHtvZmlsZX0iOyB0aGVuCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogb3V0cHV0IGZpbGUgXGAkb2ZpbGUnIGRvZXMgbm90IGV4aXN0IiA+JjI7fQorICBmaQorCisgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgorICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDQz0nYCIKKyAgICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG91dHB1dCBmaWxlIFxgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdCIgPiYyO30KKyAgICBlbHNlCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBcYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBcYCRvZmlsZSciID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBcYExUQ0M9JExUQ0MnLCBleHRyYWN0ZWQgZnJvbSBcYCRvZmlsZSciID4mMjt9CisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAteiAiJExUQ0ZMQUdTIjsgdGhlbgorICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDRkxBR1M9J2AiCisgIGZpCisKKyAgIyBFeHRyYWN0IGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBpbiAkb2ZpbGUuCisgICMgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgZW50aXJlIGxpc3QgaXMgb24gb25lIGxpbmUuCisgIGF2YWlsYWJsZV90YWdzPWBncmVwICJeYXZhaWxhYmxlX3RhZ3M9IiAiJHtvZmlsZX0iIHwgJFNFRCAtZSAncy9hdmFpbGFibGVfdGFncz1cKC4qJFwpL1wxLycgLWUgJ3MvXCIvL2cnYAorCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICBmb3IgdGFnbmFtZSBpbiAkdGFnbmFtZXM7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgIyBDaGVjayB3aGV0aGVyIHRhZ25hbWUgY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzCisgICAgY2FzZSBgJGVjaG8gIlgkdGFnbmFtZSIgfCAkWHNlZCAtZSAnczpbLV9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MTIzNDU2Nzg5MCwvXTo6ZydgIGluCisgICAgIiIpIDs7CisgICAgKikgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJOzsKKyAgICBlc2FjCisKKyAgICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQiIDwgIiR7b2ZpbGV9IiA+IC9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHRhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0cyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB0YWcgbmFtZSBcIiR0YWduYW1lXCIgYWxyZWFkeSBleGlzdHMiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBmaQorCisgICAgIyBVcGRhdGUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgICAgaWYgdGVzdCAtbiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBlY2hvIGFwcGVuZGluZyBjb25maWd1cmF0aW9uIHRhZyBcIiR0YWduYW1lXCIgdG8gJG9maWxlCisKKyAgICAgIGNhc2UgJHRhZ25hbWUgaW4KKyAgICAgIENYWCkKKwlpZiB0ZXN0IC1uICIkQ1hYIiAmJiAoIHRlc3QgIlgkQ1hYIiAhPSAiWG5vIiAmJgorCSAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKKwkgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisJICBhY19leHQ9Y2MKK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisKKworCisKK2FyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPQorYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD1ubworYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9CitleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPQoraGFyZGNvZGVfZGlyZWN0X0NYWD1ubworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9CitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWD0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPQoraGFyZGNvZGVfbWludXNfTF9DWFg9bm8KK2hhcmRjb2RlX3NobGlicGF0aF92YXJfQ1hYPXVuc3VwcG9ydGVkCitoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPW5vCittb2R1bGVfY21kc19DWFg9Cittb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPQorbGlua19hbGxfZGVwbGlic19DWFg9dW5rbm93bgorb2xkX2FyY2hpdmVfY21kc19DWFg9JG9sZF9hcmNoaXZlX2NtZHMKK25vX3VuZGVmaW5lZF9mbGFnX0NYWD0KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0KK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfQ1hYPW5vCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitwcmVkZXBfb2JqZWN0c19DWFg9Citwb3N0ZGVwX29iamVjdHNfQ1hYPQorcHJlZGVwc19DWFg9Citwb3N0ZGVwc19DWFg9Citjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYPQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jcHAKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X0NYWD0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oaW50LCBjaGFyICpbXSkgeyByZXR1cm4oMCk7IH1cbicKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSRDQworbHRfc2F2ZV9MRD0kTEQKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0kR1hYCitsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECitpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorZWxzZQorICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKK2ZpCitpZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KKyAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAorZWxzZQorICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAorZmkKK3Rlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCitDQz0ke0NYWC0iYysrIn0KK2NvbXBpbGVyPSRDQworY29tcGlsZXJfQ1hYPSRDQworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2VuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQorIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQoraWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfQ1hYPScgLWZuby1idWlsdGluJworZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFg9CitmaQorCitpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCisgIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcworZWxzZQorICB3aXRoX2dudV9sZD1ubworZmk7CithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5ICRDQy4uLiAkRUNIT19DIiA+JjYKKyAgY2FzZSAkaG9zdCBpbgorICAqLSotbWluZ3cqKQorICAgICMgZ2NjIGxlYXZlcyBhIHRyYWlsaW5nIGNhcnJpYWdlIHJldHVybiB3aGljaCB1cHNldHMgbWluZ3cKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjUgfCB0ciAtZCAnXDAxNSdgIDs7CisgICopCisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YCA7OworICBlc2FjCisgIGNhc2UgJGFjX3Byb2cgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICBbXFwvXSogfCA/OltcXC9dKikKKyAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBHTlUgbGQuLi4gJEVDSE9fQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBub24tR05VIGxkLi4uICRFQ0hPX0MiID4mNgorZmkKK2lmIHRlc3QgIiR7bHRfY3ZfcGF0aF9MRCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaQorZmkKKworTEQ9IiRsdF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTEQiID4mNQorZWNobyAiJHtFQ0hPX1R9JExEIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKK3Rlc3QgLXogIiRMRCIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfY3ZfcHJvZ19nbnVfbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfZ251X2xkIiA+JjYKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorCisKKworICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKKyAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwgXAorCWdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19DWFg9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgZWxzZQorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPQorICAgIGZpCisgIGVsc2UKKyAgICB3aXRoX2dudV9sZD1ubworICAgIHdsYXJjPQorCisgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KKyAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQorICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCisgICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KKyAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgIGZpCisKKyAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCisKK2Vsc2UKKyAgR1hYPW5vCisgIHdpdGhfZ251X2xkPW5vCisgIHdsYXJjPQorZmkKKworIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjYKK2xkX3NobGlic19DWFg9eWVzCitjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICBhaXg0KiB8IGFpeDUqKQorICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisgICAgICBub19lbnRyeV9mbGFnPSIiCisgICAgZWxzZQorICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisgICAgICAjIFRlc3QgaWYgd2UgYXJlIHRyeWluZyB0byB1c2UgcnVuIHRpbWUgbGlua2luZyBvciBub3JtYWwKKyAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMjNdfGFpeDQuWzIzXS4qfGFpeDUqKQorCWZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgY2FzZSAkbGRfZmxhZyBpbgorCSAgKi1icnRsKikKKwkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICBmaQorCisgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgIGFyY2hpdmVfY21kc19DWFg9JycKKyAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPXllcworICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfQ1hYPSc6JworICAgIGxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKyAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCWNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwlpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorCXRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKwllbHNlCisJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisJICBoYXJkY29kZV9kaXJlY3RfQ1hYPXVuc3VwcG9ydGVkCisJICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorCSAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctTCRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD0KKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCXNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworICAgICAgZmkKKyAgICBlbHNlCisgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCXNoYXJlZF9mbGFnPSctRycKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCWVsc2UKKwkgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJZmkKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWD15ZXMKKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSctYmVyb2snCisgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2A7IGZpCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCisKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0iXCRDQyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyBgaWYgdGVzdCAieCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IiAhPSAieCI7IHRoZW4gZWNobyAiJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSI7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgZWxzZQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPSIteiBub2RlZnMiCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisgICAgICBlbHNlCisJIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCW5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm5vdG9rJworCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWJlcm9rJworCSMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJGNvbnZlbmllbmNlJworCWFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD15ZXMKKwkjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICBmaQorICAgIGZpCisgICAgOzsKKworICBiZW9zKikKKyAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorICAgICAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworICAgICAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgIGVsc2UKKyAgICAgIGxkX3NobGlic19DWFg9bm8KKyAgICBmaQorICAgIDs7CisKKyAgY2hvcnVzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIENYWCkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nLUwkbGliZGlyJworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD11bnN1cHBvcnRlZAorICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19DWFg9bm8KKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWD15ZXMKKworICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKyAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgIGVsc2UKKwllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwljYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgZml+CisgICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgZWxzZQorICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIGZpCisgIDs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuWzAxMl0pCisgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgZWxzZQorICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgICAgIDEwLlswMTJdKQorICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgMTAuKikKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9ZHluYW1pY19sb29rdXAnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICBlc2FjCisgICAgICAgICBmaQorICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCisgICAgICBoYXJkY29kZV9hdXRvbWF0aWNfQ1hYPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9dW5zdXBwb3J0ZWQKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJworICAgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyA7IHRoZW4KKyAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgIGlmICRDQyAtZHVtcHNwZWNzIDI+JjEgfCAkRUdSRVAgJ3NpbmdsZV9tb2R1bGUnID4vZGV2L251bGwgOyB0aGVuCisgICAgICAgbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2Q9eWVzCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgZWxzZQorICAgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmcnCisgICAgICAgIGZpCisgICAgICAgIG1vZHVsZV9jbWRzX0NYWD0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICAgICAgaWYgdGVzdCAiWCRsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSBYeWVzIDsgdGhlbgorICAgICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliIC1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtciAta2VlcF9wcml2YXRlX2V4dGVybnMgLW5vc3RkbGliIC1vICR7bGlifS1tYXN0ZXIubyAkbGlib2Jqc34kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJHtsaWJ9LW1hc3Rlci5vICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIGZpCisgICAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICBlbHNlCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICB4bGMqKQorICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1xbWtzaHJvYmogJHt3bH0tc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taW5zdGFsbF9uYW1lICR7d2x9YGVjaG8gJHJwYXRoLyRzb25hbWVgICR2ZXJzdHJpbmcnCisgICAgICAgICAgbW9kdWxlX2NtZHNfQ1hYPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kc19DWFg9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICA7OworICAgICAgICopCisgICAgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICAgIDs7CisKKyAgZGd1eCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGVjKysqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgZ2hjeCopCisJIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIGZyZWVic2RbMTJdKikKKyAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlIHN3aXRjaCB0byBFTEYKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgZnJlZWJzZC1lbGYqKQorICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWD1ubworICAgIDs7CisgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCisgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAjIGNvbnZlbnRpb25zCisgICAgbGRfc2hsaWJzX0NYWD15ZXMKKyAgICA7OworICBnbnUqKQorICAgIDs7CisgIGhwdXg5KikKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCisgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MX0NYWD15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCSMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgQ0MqKQorICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgICA7OworICAgIGFDQyopCisgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICAjCisgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisgICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorICAgICAgIyBkZXBlbmRlbmNpZXMuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiWy1dTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgbGRfc2hsaWJzX0NYWD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisgIGhwdXgxMCp8aHB1eDExKikKKyAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWD0nK2IgJGxpYmRpcicKKyAgICAgICAgOzsKKyAgICAgICopCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICBoYXJkY29kZV9kaXJlY3RfQ1hYPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgICAgOzsKKyAgICAqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0NYWD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfQ1hYPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJCSAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJCSAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICBhQ0MqKQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqKQorCSAgICAgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICA7OworCSAgICBpYTY0KikKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgbGRfc2hsaWJzX0NYWD1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgaW50ZXJpeDMqKQorICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9bm8KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCwkbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19DWFg9JyR7d2x9LUUnCisgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKyAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKyAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgIDs7CisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCSMgU0dJIEMrKworCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgIkNDIC1hciIsIHdoZXJlICJDQyIgaXMgdGhlIElSSVggQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSMgaW4gdGhlIGFyY2hpdmUuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAtYXIgLVdSLC11IC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgZWxzZQorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJworCSAgZmkKKwlmaQorCWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCTs7CisgICAgZXNhYworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorICAgIDs7CisgIGxpbnV4KikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgS0NDKikKKwkjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJYXJjaGl2ZV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbXigpMC05QS1aYS16e31dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgZ3JlcCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoLCRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgaWNwYyopCisJIyBJbnRlbCBDKysKKwl3aXRoX2dudV9sZD15ZXMKKwkjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scworCSMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KKwljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkqIlZlcnNpb24gNy4iKikKKyAgCSAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgIAkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIDs7CisJKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKKwkgIHRtcF9pZHluPQorCSAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OworCSAgZXNhYworICAJICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgOzsKKwllc2FjCisJYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJOzsKKyAgICAgIHBnQ0MqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgorCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworICAJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIDs7CisgICAgICBjeHgqKQorCSMgQ29tcGFxIEMrKworCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCisKKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctcnBhdGggJGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgZXNhYworICAgIDs7CisgIGx5bnhvcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIG04OGsqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIGxkX3NobGlic19DWFg9bm8KKyAgICA7OworICBtdnMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjeHgqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbmV0YnNkKikKKyAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHNfQ1hYPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWD1ubworICAgIGZpCisgICAgIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworICAgIDs7CisgIG9wZW5ic2QyKikKKyAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIGhhcmRjb2RlX2RpcmVjdF9DWFg9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tRScKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWD0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBmaQorICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgIDs7CisgIG9zZjMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBLQ0MqKQorCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKworCTs7CisgICAgICBSQ0MqKQorCSMgUmF0aW9uYWwgQysrIDIuNC4xCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICBjeHgqKQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgIGFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJcLUwiJworCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBsZF9zaGxpYnNfQ1hYPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBvc2Y0KiB8IG9zZjUqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBLQ0MqKQorCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwlhcmNoaXZlX2NtZHNfQ1hYPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFteKCkwLTlBLVphLXp7fV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICRsaWIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwlvbGRfYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1vICRvbGRsaWIgJG9sZG9ianMnCisJOzsKKyAgICAgIFJDQyopCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgIGN4eCopCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmV+CisJICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAtV2wsLWlucHV0IC1XbCwkbGliLmV4cCAgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uCSR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4KKwkgICRybSAkbGliLmV4cCcKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctcnBhdGggJGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0NYWD06CisKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiIHwgZ3JlcCAtdiAibGQ6ImA7IHRlbXBsaXN0PWBlY2hvICR0ZW1wbGlzdCB8ICRTRUQgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgICAqKQorCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9OgorCisJICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAiXC1MIicKKworCWVsc2UKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgbGRfc2hsaWJzX0NYWD1ubworCWZpCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgcHNvcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgbGRfc2hsaWJzX0NYWD1ubworICAgIDs7CisgIHN1bm9zNCopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIFN1biBDKysgNC54CisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICBsY2MqKQorCSMgTHVjaWQKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlsZF9zaGxpYnNfQ1hYPW5vCisJOzsKKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgZXNhYworICAgIDs7CisgIHNvbGFyaXMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworICAgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9eWVzCisJbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScgLXpkZWZzJworCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYPSctUiRsaWJkaXInCisJaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKwljYXNlICRob3N0X29zIGluCisJICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisJICAqKQorCSAgICAjIFRoZSBDKysgY29tcGlsZXIgaXMgdXNlZCBhcyBsaW5rZXIgc28gd2UgbXVzdCB1c2UgJHdsCisJICAgICMgZmxhZyB0byBwYXNzIHRoZSBjb21tYW5kcyB0byB0aGUgdW5kZXJseWluZyBzeXN0ZW0KKwkgICAgIyBsaW5rZXIuIFdlIG11c3QgYWxzbyBwYXNzIGVhY2ggY29udmllbmNlIGxpYnJhcnkgdGhyb3VnaAorCSAgICAjIHRvIHRoZSBzeXN0ZW0gbGlua2VyIGJldHdlZW4gYWxsZXh0cmFjdC9kZWZhdWx0ZXh0cmFjdC4KKwkgICAgIyBUaGUgQysrIGNvbXBpbGVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQorCSAgICAjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKKwkgICAgIyB3aXRob3V0ICR3bC4KKwkgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwkgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJICAgIDs7CisJZXNhYworCWxpbmtfYWxsX2RlcGxpYnNfQ1hYPXllcworCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAteGFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgU3VuIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkjIGluIHRoZSBhcmNoaXZlLgorCW9sZF9hcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXhhciAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBnY3gqKQorCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCisJb2xkX2FyY2hpdmVfY21kc19DWFg9JyRDQyAkTERGTEFHUyAtYXJjaGl2ZSAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICAqKQorCSMgR05VIEMrKyBjb21waWxlciB3aXRoIFNvbGFyaXMgbGlua2VyCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBub191bmRlZmluZWRfZmxhZ19DWFg9JyAke3dsfS16ICR7d2x9ZGVmcycKKwkgIGlmICRDQyAtLXZlcnNpb24gfCBncmVwIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHt3bH0tTSAkd2wkbGliLmV4cCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSIkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKKwkgIGVsc2UKKwkgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcworCSAgICAjIHBsYXRmb3JtLgorCSAgICBhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1HICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCBcIlwtTFwiIgorCSAgZmkKKworCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFg9JyR7d2x9LVIgJHdsJGxpYmRpcicKKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bMDI0XSopCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYPScke3dsfS16LHRleHQnCisgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19DWFg9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICAgICopCisJYXJjaGl2ZV9jbWRzX0NYWD0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgIyBhcyAteiBkZWZzLgorICAgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMKKyAgICAjIHVzZSBhYnNvbHV0ZSBwYXRocyBmb3IgbmFtaW5nIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBleGNsdWRlIHRoZQorICAgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisgICAgIyByZXF1aXJlcyB0aGF0IHlvdSBjb21waWxlIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEgcGFpbi4KKyAgICAjIFNvIHRoYXQgYmVoYXZpb3VyIGlzIG9ubHkgZW5hYmxlZCBpZiBTQ09BQlNQQVRIIGlzIHNldCB0byBhCisgICAgIyBub24tZW1wdHkgdmFsdWUgaW4gdGhlIGVudmlyb25tZW50LiAgTW9zdCBsaWtlbHkgb25seSB1c2VmdWwgZm9yCisgICAgIyBjcmVhdGluZyBvZmZpY2lhbCBkaXN0cmlidXRpb25zIG9mIHBhY2thZ2VzLgorICAgICMgVGhpcyBpcyBhIGhhY2sgdW50aWwgbGlidG9vbCBvZmZpY2lhbGx5IHN1cHBvcnRzIGFic29sdXRlIHBhdGgKKyAgICAjIG5hbWVzIGZvciBzaGFyZWQgbGlicmFyaWVzLgorICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teix0ZXh0JworICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0nJHt3bH0teixub2RlZnMnCisgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPW5vCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9DWFg9bm8KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWD0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LVIsJGxpYmRpcmAnCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFg9JzonCisgICAgbGlua19hbGxfZGVwbGlic19DWFg9eWVzCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWD0nJHt3bH0tQmV4cG9ydCcKKyAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCWFyY2hpdmVfY21kc19DWFg9JyRDQyAtRyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwk7OworICAgICAgKikKKwlhcmNoaXZlX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgZXNhYworICAgIDs7CisgIHRhbmRlbSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIE5DQyopCisJIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJbGRfc2hsaWJzX0NYWD1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCWxkX3NobGlic19DWFg9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICB2eHdvcmtzKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKKyAgKikKKyAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICBsZF9zaGxpYnNfQ1hYPW5vCisgICAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnNfQ1hYIiA+JjYKK3Rlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworR0NDX0NYWD0iJEdYWCIKK0xEX0NYWD0iJExEIgorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorY2xhc3MgRm9vCit7CitwdWJsaWM6CisgIEZvbyAodm9pZCkgeyBhID0gMDsgfQorcHJpdmF0ZToKKyAgaW50IGE7Cit9OworRU9GCisKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgIyBUaGUgYConIGluIHRoZSBjYXNlIG1hdGNoZXMgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgYGNhc2UnIGluCisgICMgJG91dHB1dF92ZXJib3NlX2NtZCBjYW4gdHJpZ2dlciBnbG9iIGV4cGFuc2lvbiBkdXJpbmcgdGhlIGxvb3AKKyAgIyBldmFsIHdpdGhvdXQgdGhpcyBzdWJzdGl0dXRpb24uCisgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPWAkZWNobyAiWCRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCIgfCAkWHNlZCAtZSAiJG5vX2dsb2Jfc3Vic3QiYAorCisgIGZvciBwIGluIGBldmFsICRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZGA7IGRvCisgICAgY2FzZSAkcCBpbgorCisgICAgLUwqIHwgLVIqIHwgLWwqKQorICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCisgICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgorICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIFwKKwkgIHx8IHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBlbHNlCisJIHByZXY9CisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGNhc2UgJHAgaW4KKwkgLUwqIHwgLVIqKQorCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQorCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQorCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgorCSAgIGlmIHRlc3QgLXogIiRjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYIjsgdGhlbgorCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtwcmV2fSR7cH0iCisJICAgZWxzZQorCSAgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0NYWD0iJHtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfQ1hYfSAke3ByZXZ9JHtwfSIKKwkgICBmaQorCSAgIDs7CisJICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCisJICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgorCSBlc2FjCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkcG9zdGRlcHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBzX0NYWD0iJHtwcmV2fSR7cH0iCisJIGVsc2UKKwkgICBwb3N0ZGVwc19DWFg9IiR7cG9zdGRlcHNfQ1hYfSAke3ByZXZ9JHtwfSIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRwcmVkZXBfb2JqZWN0c19DWFgiOyB0aGVuCisJICAgcHJlZGVwX29iamVjdHNfQ1hYPSIkcCIKKwkgZWxzZQorCSAgIHByZWRlcF9vYmplY3RzX0NYWD0iJHByZWRlcF9vYmplY3RzX0NYWCAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRwb3N0ZGVwX29iamVjdHNfQ1hYIjsgdGhlbgorCSAgIHBvc3RkZXBfb2JqZWN0c19DWFg9IiRwIgorCSBlbHNlCisJICAgcG9zdGRlcF9vYmplY3RzX0NYWD0iJHBvc3RkZXBfb2JqZWN0c19DWFggJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgQ1hYIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRybSAtZiBjb25mZXN0LiRvYmpleHQKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXgzKikKKyAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgorICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgorICBwcmVkZXBfb2JqZWN0c19DWFg9CisgIHBvc3RkZXBfb2JqZWN0c19DWFg9CisgIHBvc3RkZXBzX0NYWD0KKyAgOzsKKworc29sYXJpcyopCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIENDKikKKyAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgorICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKKyAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgorICAgIHBvc3RkZXBzX0NYWD0nLWxDc3RkIC1sQ3J1bicKKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCisKKworY2FzZSAiICRwb3N0ZGVwc19DWFggIiBpbgorKiIgLWxjICIqKSBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8gOzsKK2VzYWMKKworbHRfcHJvZ19jb21waWxlcl93bF9DWFg9CitsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CitsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRFQ0hPX0MiID4mNgorCisgICMgQysrIHNwZWNpZmljIGNhc2VzIGZvciBwaWMsIHN0YXRpYywgd2wsIGV0Yy4KKyAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworICAgICAgZmkKKyAgICAgIDs7CisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisgICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKyAgICBtaW5ndyogfCBvczIqIHwgcHczMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctRERMTF9FWFBPUlQnCisgICAgICA7OworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKyAgICAqZGpncHAqKQorICAgICAgIyBESkdQUCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisgICAgICA7OworICAgIGludGVyaXgzKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQqIHwgYWl4NSopCisJIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCSAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwllbHNlCisJICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKwlmaQorCTs7CisgICAgICBjaG9ydXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJY3hjaDY4KikKKwkgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAjIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsIENYWCk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICAgZGFyd2luKikKKyAgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgIHhsYyopCisgICAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLXFub2NvbW1vbicKKyAgICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisgICAgICAgICAgIDs7CisgICAgICAgICBlc2FjCisgICAgICAgOzsKKyAgICAgIGRndXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBlYysrKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgOzsKKwkgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251IHwgZHJhZ29uZmx5KikKKwkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCisJOzsKKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfQ1hYPSctV2wsJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwkgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9JytaJworCSAgICBmaQorCSAgICA7OworCSAgYUNDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGludGVyaXgqKQorCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQorCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgICMgS0FJIEMrKyBDb21waWxlcgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLS1iYWNrZW5kIC1XbCwnCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLWZQSUMnCisJICAgIDs7CisJICBpY3BjKiB8IGVjcGMqKQorCSAgICAjIEludGVsIEMrKworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctc3RhdGljJworCSAgICA7OworCSAgcGdDQyopCisJICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctZnBpYycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGx5bnhvcyopCisJOzsKKyAgICAgIG04OGsqKQorCTs7CisgICAgICBtdnMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBjeHgqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1XIGMsZXhwb3J0YWxsJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIG5ldGJzZCopCisJOzsKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgS0NDKikKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy0tYmFja2VuZCAtV2wsJworCSAgICA7OworCSAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJworCSAgICA7OworCSAgY3h4KikKKwkgICAgIyBEaWdpdGFsL0NvbXBhcSBDKysKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1XbCwnCisJICAgICMgTWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBpcyBlbXB0eS4gIEl0IGFwcGVhcnMgdGhhdCBhbGwgQWxwaGEKKwkgICAgIyBMaW51eCBhbmQgQ29tcGFxIFRydTY0IFVuaXggb2JqZWN0cyBhcmUgUElDLgorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisJICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0nLW5vbl9zaGFyZWQnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgcHNvcyopCisJOzsKKyAgICAgIHNvbGFyaXMqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwkgICAgbHRfcHJvZ19jb21waWxlcl93bF9DWFg9Jy1Rb3B0aW9uIGxkICcKKwkgICAgOzsKKwkgIGdjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLVBJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBzdW5vczQqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctcGljJworCSAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFg9Jy1Cc3RhdGljJworCSAgICA7OworCSAgbGNjKikKKwkgICAgIyBMdWNpZAorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9Jy1waWMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgdGFuZGVtKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgTkNDKikKKwkgICAgIyBOb25TdG9wLVVYIE5DQyAzLjIwCisJICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0nLUtQSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWD0nLVdsLCcKKwkgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYPSctS1BJQycKKwkgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYPSctQnN0YXRpYycKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHZ4d29ya3MqKQorCTs7CisgICAgICAqKQorCWx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KKwk7OworICAgIGVzYWMKKyAgZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIiA+JjYKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIworaWYgdGVzdCAtbiAiJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCI7IHRoZW4KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFggd29ya3MuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9bm8KKyAgYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTE1MjQ6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgICBlY2hvICIkYXNfbWU6MTE1Mjg6IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAgaWYgKGV4aXQgJGFjX3N0YXR1cykgJiYgdGVzdCAtcyAiJGFjX291dGZpbGUiOyB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncyBvdGhlciB0aGFuIHRoZSB1c3VhbCBvdXRwdXQuCisgICAgICRlY2hvICJYJF9sdF9jb21waWxlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID5jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5lcjIgfHwgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfQ1hYIiA+JjYKKworaWYgdGVzdCB4IiRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19DWFgiID0geHllczsgdGhlbgorICAgIGNhc2UgJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iICRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgiIDs7CisgICAgIGVzYWMKK2Vsc2UKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFg9CisgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9DWFg9bm8KK2ZpCisKK2ZpCitjYXNlICRob3N0X29zIGluCisgICMgRm9yIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBQSUMsIC1EUElDIGlzIG1lYW5pbmdsZXNzOgorICAqZGpncHAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0KKyAgICA7OworICAqKQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWD0iJGx0X3Byb2dfY29tcGlsZXJfcGljX0NYWCAtRFBJQyIKKyAgICA7OworZXNhYworCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCit3bD0kbHRfcHJvZ19jb21waWxlcl93bF9DWFggZXZhbCBsdF90bXBfc3RhdGljX2ZsYWc9XCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfQ1hYXCIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3JrcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJGx0X3RtcF9zdGF0aWNfZmxhZyIKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBpZiAoZXZhbCAkYWNfbGluayAyPmNvbmZ0ZXN0LmVycikgJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgICAgIyBUaGUgbGlua2VyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCisgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICAgJGVjaG8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWD15ZXMKKyAgICAgICBmaQorICAgICBlbHNlCisgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19DWFgiID4mNgorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0NYWCIgPSB4eWVzOyB0aGVuCisgICAgOgorZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0NYWD0KK2ZpCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS4kYWNfb2JqZXh0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYPW5vCisgICAkcm0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICBsdF9jb21waWxlcl9mbGFnPSItbyBvdXQvY29uZnRlc3QyLiRhY19vYmpleHQiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbXiBdKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6MTE2Mjg6ICRsdF9jb21waWxlXCIiID4mNSkKKyAgIChldmFsICIkbHRfY29tcGlsZSIgMj5vdXQvY29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgb3V0L2NvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxMTYzMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zIG91dC9jb25mdGVzdDIuJGFjX29iamV4dAorICAgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBvdXQvY29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBvdXQvY29uZnRlc3QuZXJyID5vdXQvY29uZnRlc3QuZXIyCisgICAgIGlmIHRlc3QgISAtcyBvdXQvY29uZnRlc3QuZXIyIHx8IGRpZmYgb3V0L2NvbmZ0ZXN0LmV4cCBvdXQvY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFg9eWVzCisgICAgIGZpCisgICBmaQorICAgY2htb2QgdSt3IC4gMj4mNQorICAgJHJtIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgcm1kaXIgY29uZnRlc3QKKyAgICRybSBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19DWFgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPiY2CisKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWCIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiB3ZSBjYW4gbG9jayB3aXRoIGhhcmQgbGlua3MuLi4gJEVDSE9fQyIgPiY2CisgIGhhcmRfbGlua3M9eWVzCisgICRybSBjb25mdGVzdCoKKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgdG91Y2ggY29uZnRlc3QuYQorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkX2xpbmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkX2xpbmtzIiA+JjYKKyAgaWYgdGVzdCAiJGhhcmRfbGlua3MiID0gbm87IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogXGAkQ0MnIGRvZXMgbm90IHN1cHBvcnQgXGAtYyAtbycsIHNvIFxgbWFrZSAtaicgbWF5IGJlIHVuc2FmZSIgPiYyO30KKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGhlICRjb21waWxlciBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkRUNIT19DIiA+JjYKKworICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBjYXNlICRob3N0X29zIGluCisgIGFpeDQqIHwgYWl4NSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgIGlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfQ1hYPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkMiA9PSAiVCIpIHx8IChcJDIgPT0gIkQiKSB8fCAoXCQyID09ICJCIikpICYmIChzdWJzdHIoXCQzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJDMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZmkKKyAgICA7OworICBwdzMyKikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0iJGx0ZGxsX2NtZHMiCisgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyopCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFg9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bQkNER1JTXSAvcy8uKiBcKFteIF0qXCkvXDEgREFUQS87L14uKiBfX25tX18vcy9eLiogX19ubV9fXChbXiBdKlwpIFteIF0qL1wxIERBVEEvOy9eSSAvZDsvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgOzsKKyAgKikKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0NYWD0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICA7OworICBlc2FjCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsZF9zaGxpYnNfQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsZF9zaGxpYnNfQ1hYIiA+JjYKK3Rlc3QgIiRsZF9zaGxpYnNfQ1hYIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFgiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJGFyY2hpdmVfY21kc19DWFggaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluLi4uICRFQ0hPX0MiID4mNgorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9IDI+Y29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIHNvbmFtZT1jb25mdGVzdAorICAgICAgICBsaWI9Y29uZnRlc3QKKyAgICAgICAgbGlib2Jqcz1jb25mdGVzdC4kYWNfb2JqZXh0CisgICAgICAgIGRlcGxpYnM9CisgICAgICAgIHdsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWAorCXBpY19mbGFnPSRsdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9LXYKKyAgICAgICAgbGlua2VyX2ZsYWdzPS12CisgICAgICAgIHZlcnN0cmluZz0KKyAgICAgICAgb3V0cHV0X29iamRpcj0uCisgICAgICAgIGxpYm5hbWU9Y29uZnRlc3QKKyAgICAgICAgbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWdfQ1hYCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0NYWD0KKyAgICAgICAgaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYXJjaGl2ZV9jbWRzX0NYWCAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxXCIiKSA+JjUKKyAgKGV2YWwgJGFyY2hpdmVfY21kc19DWFggMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorICAgICAgICB0aGVuCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19DWFg9bm8KKyAgICAgICAgZWxzZQorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYPXllcworICAgICAgICBmaQorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFg9JGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWcKKyAgICAgIGVsc2UKKyAgICAgICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1CisgICAgICBmaQorICAgICAgJHJtIGNvbmZ0ZXN0KgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfQ1hYIiA+JjYKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzLi4uICRFQ0hPX0MiID4mNgorbGlicmFyeV9uYW1lc19zcGVjPQorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK3NvbmFtZV9zcGVjPQorc2hyZXh0X2NtZHM9Ii5zbyIKK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCit2ZXJzaW9uX3R5cGU9bm9uZQorZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnOycgPi9kZXYvbnVsbCA7IHRoZW4KKyAgICAjIGlmIHRoZSBwYXRoIGNvbnRhaW5zICI7IiB0aGVuIHdlIGFzc3VtZSBpdCB0byBiZSB0aGUgc2VwYXJhdG9yCisgICAgIyBvdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgcGF0aCBzZXBhcmF0b3IgKGkuZS4gIjoiKSAtIGl0IGlzCisgICAgIyBhc3N1bWVkIHRoYXQgbm8gcGFydCBvZiBhIG5vcm1hbCBwYXRobmFtZSBjb250YWlucyAiOyIgYnV0IHRoYXQgc2hvdWxkCisgICAgIyBva2F5IGluIHRoZSByZWFsIHdvcmxkIHdoZXJlICI7IiBpbiBkaXJwYXRocyBpcyBpdHNlbGYgcHJvYmxlbWF0aWMuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICBmaQorZWxzZQorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCitmaQorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXg0KiB8IGFpeDUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgIyBBSVggNSBzdXBwb3J0cyBJQTY0CisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZWxzZQorICAgICMgV2l0aCBHQ0MgdXAgdG8gMi45NS54LCBjb2xsZWN0MiB3b3VsZCBjcmVhdGUgYW4gaW1wb3J0IGZpbGUKKyAgICAjIGZvciBkZXBlbmRlbmNlIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgZmlsZSB3b3VsZCBzdGFydCB3aXRoCisgICAgIyB0aGUgbGluZSBgIyEgLicuICBUaGlzIHdvdWxkIGNhdXNlIHRoZSBnZW5lcmF0ZWQgbGlicmFyeSB0bworICAgICMgZGVwZW5kIG9uIGAuJywgYWx3YXlzIGFuIGludmFsaWQgbGlicmFyeS4gIFRoaXMgd2FzIGZpeGVkIGluCisgICAgIyBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YgR0NDIHByaW9yIHRvIDMuMC4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXg0IHwgYWl4NC5bMDFdIHwgYWl4NC5bMDFdLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2Jlb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisgIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICisgIDs7CisKK2JzZGlbNDVdKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLmRsbC5hJworICAgICMgRExMIGlzIGluc3RhbGxlZCB0byAkKGxpYmRpcikvLi4vYmluIGJ5IHBvc3RpbnN0YWxsX2NtZHMKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSdiYXNlX2ZpbGU9YGJhc2VuYW1lIFwke2ZpbGV9YH4KKyAgICAgIGRscGF0aD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGRpci8nXCcnXCR7YmFzZV9maWxlfSdcJydpO2VjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRsZGlyPSRkZXN0ZGlyL2BkaXJuYW1lIFwkZGxwYXRoYH4KKyAgICAgIHRlc3QgLWQgXCRkbGRpciB8fCBta2RpciAtcCBcJGRsZGlyfgorICAgICAgJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgXCRkbGRpci8kZGxuYW1lfgorICAgICAgY2htb2QgYSt4IFwkZGxkaXIvJGRsbmFtZScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkcm0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgICAgIDs7CisgICAgbWluZ3cqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgICAgIGlmIGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgICAgICBlbHNlCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgICAgIGZpCisgICAgICA7OworICAgIHB3MzIqKQorICAgICAgIyBwdzMyIERMTHMgdXNlICdwdycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9wdy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7dmVyc3VmZml4fSRzaGFyZWRfZXh0ICR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQnCisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgc2hsaWJwYXRoX3Zhcj1EWUxEX0xJQlJBUllfUEFUSAorICBzaHJleHRfY21kcz0nYHRlc3QgLiRtb2R1bGUgPSAueWVzICYmIGVjaG8gLnNvIHx8IGVjaG8gLmR5bGliYCcKKyAgIyBBcHBsZSdzIGdjYyBwcmludHMgJ2djYyAtcHJpbnQtc2VhcmNoLWRpcnMnIGRvZXNuJ3Qgb3BlcmF0ZSB0aGUgc2FtZS4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCB0ciAiXG4iICIkUEFUSF9TRVBBUkFUT1IiIHwgc2VkIC1lICdzL2xpYnJhcmllczovQGxpYnJhcmllczovJyB8IHRyICJAIiAiXG4iIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgc2VkIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyIgLWUgInMsJFBBVEhfU0VQQVJBVE9SLCAsZyIgLWUgInMsLiosJiAvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliLGciYAorICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliJworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitrZnJlZWJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFsxMjNdKikgb2JqZm9ybWF0PWFvdXQgOzsKKyAgICAqKSBvYmpmb3JtYXQ9ZWxmIDs7CisgICAgZXNhYworICBmaQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC0kb2JqZm9ybWF0CisgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorICAgIGZyZWVic2QtZWxmKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgZnJlZWJzZC0qKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgICBuZWVkX3ZlcnNpb249eWVzCisgICAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgZnJlZWJzZDIqKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMDFdKiB8IGZyZWVic2RlbGYzLlswMV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzItOV0qIHwgZnJlZWJzZGVsZjMuWzItOV0qIHwgXAorICBmcmVlYnNkNC5bMC01XSB8IGZyZWVic2RlbGY0LlswLTVdIHwgZnJlZWJzZDQuMS4xIHwgZnJlZWJzZGVsZjQuMS4xKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkKikgIyBmcm9tIDQuNiBvbgorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZXNhYworICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHttYWpvcn0gJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICMgR2l2ZSBhIHNvbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWpvciB2ZXJzaW9uIHNvIHRoYXQgZGxkLnNsIHJlZnVzZXMgdG8KKyAgIyBsaW5rIGFnYWluc3Qgb3RoZXIgdmVyc2lvbnMuCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGNhc2UgJGhvc3RfY3B1IGluCisgIGlhNjQqKQorICAgIHNocmV4dF9jbWRzPScuc28nCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc28iCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBpZiB0ZXN0ICJYJEhQVVhfSUE2NF9NT0RFIiA9IFgzMjsgdGhlbgorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliIgorICAgIGVsc2UKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDY0IC91c3IvbG9jYWwvbGliL2hwdXg2NCIKKyAgICBmaQorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICA7OworICAgaHBwYSo2NCopCisgICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEggIyBIb3cgc2hvdWxkIHdlIGhhbmRsZSBTSExJQl9QQVRICisgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvcGEyMF82NCAvdXNyL2Njcy9saWIvcGEyMF82NCIKKyAgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgICA7OworICAgKikKKyAgICBzaHJleHRfY21kcz0nLnNsJworICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vICMgK3MgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFNITElCX1BBVEgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIDs7CisgIGVzYWMKKyAgIyBIUC1VWCBydW5zICpyZWFsbHkqIHNsb3dseSB1bmxlc3Mgc2hhcmVkIGxpYnJhcmllcyBhcmUgbW9kZSA1NTUuCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDU1NSAkbGliJworICA7OworCitpbnRlcml4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGR5bmFtaWNfbGlua2VyPSdJbnRlcml4IDMueCBsZC5zby4xIChQRSwgbGlrZSBFTEYpJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRob3N0X29zIGluCisgICAgbm9uc3RvcHV4KikgdmVyc2lvbl90eXBlPW5vbnN0b3B1eCA7OworICAgICopCisJaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorCQl2ZXJzaW9uX3R5cGU9bGludXgKKwllbHNlCisJCXZlcnNpb25fdHlwZT1pcml4CisJZmkgOzsKKyAgZXNhYworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBpcml4NSogfCBub25zdG9wdXgqKQorICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICA7OworICAqKQorICAgIGNhc2UgJExEIGluICMgbGlidG9vbC5tNCB3aWxsIGFkZCBvbmUgb2YgdGhlc2Ugc3dpdGNoZXMgdG8gTEQKKyAgICAqLTMyfCoiLTMyICJ8Ki1tZWxmMzJic21pcHwqIi1tZWxmMzJic21pcCAiKQorICAgICAgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz0zMi1iaXQ7OworICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpCisgICAgICBsaWJzdWZmPTMyIHNobGlic3VmZj1OMzIgbGlibWFnaWM9TjMyOzsKKyAgICAqLTY0fCoiLTY0ICJ8Ki1tZWxmNjRibWlwfCoiLW1lbGY2NGJtaXAgIikKKyAgICAgIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7CisgICAgKikgbGlic3VmZj0gc2hsaWJzdWZmPSBsaWJtYWdpYz1uZXZlci1tYXRjaDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZJHtzaGxpYnN1ZmZ9X1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IC91c3IvbG9jYWwvbGliJHtsaWJzdWZmfSIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSIKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgIyBUaGlzIGltcGxpZXMgbm8gZmFzdF9pbnN0YWxsLCB3aGljaCBpcyB1bmFjY2VwdGFibGUuCisgICMgU29tZSByZXdvcmsgd2lsbCBiZSBuZWVkZWQgdG8gYWxsb3cgZm9yIGZhc3RfaW5zdGFsbAorICAjIGJlZm9yZSB0aGlzIGNhbiBiZSBlbmFibGVkLgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisKKyAgIyBBcHBlbmQgbGQuc28uY29uZiBjb250ZW50cyB0byB0aGUgc2VhcmNoIHBhdGgKKyAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICBsdF9sZF9leHRyYT1gYXdrICcvXmluY2x1ZGUgLyB7IHN5c3RlbShzcHJpbnRmKCJjZCAvZXRjOyBjYXQgJXMiLCBcJDIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFwkMDsgc2tpcCA9IDA7IH0nIDwgL2V0Yy9sZC5zby5jb25mIHwgJFNFRCAtZSAncy8jLiovLztzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAkbHRfbGRfZXh0cmEiCisgIGZpCisKKyAgIyBXZSB1c2VkIHRvIHRlc3QgZm9yIC9saWIvbGQuc28uMSBhbmQgZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIG9uCisgICMgcG93ZXJwYywgYmVjYXVzZSBNa0xpbnV4IG9ubHkgc3VwcG9ydGVkIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB0aGUKKyAgIyBHTlUgZHluYW1pYyBsaW5rZXIuICBTaW5jZSB0aGlzIHdhcyBicm9rZW4gd2l0aCBjcm9zcyBjb21waWxlcnMsCisgICMgbW9zdCBwb3dlcnBjLWxpbnV4IGJveGVzIHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHRoZXNlIGRheXMgYW5kCisgICMgcGVvcGxlIGNhbiBhbHdheXMgLS1kaXNhYmxlLXNoYXJlZCwgdGhlIHRlc3Qgd2FzIHJlbW92ZWQsIGFuZCB3ZQorICAjIGFzc3VtZSB0aGUgR05VL0xpbnV4IGR5bmFtaWMgbGlua2VyIGlzIGluIHVzZS4KKyAgZHluYW1pY19saW5rZXI9J0dOVS9MaW51eCBsZC5zbycKKyAgOzsKKwora25ldGJzZCotZ251KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgKGEub3V0KSBsZC5zbycKKyAgZWxzZQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKKyAgZmkKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK25ld3NvczYpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitudG8tcW54KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworb3BlbmJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICAjIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgT3BlbkJTRCAoMy4zIGF0IGxlYXN0KSAqZG8qIG5lZWQgdmVyc2lvbmVkIGxpYnMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBvcGVuYnNkMy4zIHwgb3BlbmJzZDMuMy4qKSBuZWVkX3ZlcnNpb249eWVzIDs7CisgICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF92ZXJzaW9uPW5vICA7OworICBlc2FjCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIG9wZW5ic2QyLls4OV0gfCBvcGVuYnNkMi5bODldLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGR5bmFtaWNfbGlua2VyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRkeW5hbWljX2xpbmtlciIgPiY2Cit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iUEFUSCAkc2hsaWJwYXRoX3ZhciAkcnVucGF0aF92YXIiCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICB2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIEdDQ19FWEVDX1BSRUZJWCBDT01QSUxFUl9QQVRIIExJQlJBUllfUEFUSCIKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkRUNIT19DIiA+JjYKK2hhcmRjb2RlX2FjdGlvbl9DWFg9CitpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19DWFgiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3Zhcl9DWFgiIHx8IFwKKyAgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljX0NYWCIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0YW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X0NYWCIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgQ1hYKSIgIT0gbm8gJiYKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0xfQ1hYIiAhPSBubzsgdGhlbgorICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCisgICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uX0NYWD1pbW1lZGlhdGUKKyAgZmkKK2Vsc2UKKyAgIyBXZSBjYW5ub3QgaGFyZGNvZGUgYW55dGhpbmcsIG9yIGVsc2Ugd2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcKKyAgIyBkaXJlY3Rvcmllcy4KKyAgaGFyZGNvZGVfYWN0aW9uX0NYWD11bnN1cHBvcnRlZAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXJkY29kZV9hY3Rpb25fQ1hYIiA+JjYKKworaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbl9DWFgiID0gcmVsaW5rOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCitlbGlmIHRlc3QgIiRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgiID0geWVzIHx8CisgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vOyB0aGVuCisgICMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IG5lY2Vzc2FyeQorICBlbmFibGVfZmFzdF9pbnN0YWxsPW5lZWRsZXNzCitmaQorCisKKyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBjb21waWxlcl9DWFggXAorICAgIENDX0NYWCBcCisgICAgTERfQ1hYIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0NYWCBcCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfQ1hYIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFggXAorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0NYWCBcCisgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0NYWCBcCisgICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0NYWCBcCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfQ1hYIFwKKyAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0NYWCBcCisgICAgb2xkX2FyY2hpdmVfY21kc19DWFggXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfQ1hYIFwKKyAgICBwcmVkZXBfb2JqZWN0c19DWFggXAorICAgIHBvc3RkZXBfb2JqZWN0c19DWFggXAorICAgIHByZWRlcHNfQ1hYIFwKKyAgICBwb3N0ZGVwc19DWFggXAorICAgIGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFggXAorICAgIGFyY2hpdmVfY21kc19DWFggXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfQ1hYIFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzX0NYWCBcCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzX0NYWCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYIFwKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZ19DWFggXAorICAgIG5vX3VuZGVmaW5lZF9mbGFnX0NYWCBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFggXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfQ1hYIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWCBcCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFggXAorICAgIGhhcmRjb2RlX2F1dG9tYXRpY19DWFggXAorICAgIG1vZHVsZV9jbWRzX0NYWCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWCBcCisgICAgbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fQ1hYIFwKKyAgICBleGNsdWRlX2V4cHN5bXNfQ1hYIFwKKyAgICBpbmNsdWRlX2V4cHN5bXNfQ1hYOyBkbworCisgICAgY2FzZSAkdmFyIGluCisgICAgb2xkX2FyY2hpdmVfY21kc19DWFggfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFggfCBcCisgICAgYXJjaGl2ZV9jbWRzX0NYWCB8IFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0NYWCB8IFwKKyAgICBtb2R1bGVfY21kc19DWFggfCBcCisgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0NYWCB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19DWFggfCBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19DWFggfCBcCisgICAgZXh0cmFjdF9leHBzeW1zX2NtZHMgfCByZWxvYWRfY21kcyB8IGZpbmlzaF9jbWRzIHwgXAorICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyB8IHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjKQorICAgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIiAtZSBcIlwkZGVsYXlfdmFyaWFibGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgY2FzZSAkbHRfZWNobyBpbgorICAqJ1wkMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitjZmdmaWxlPSIkb2ZpbGUiCisKKyAgY2F0IDw8X19FT0ZfXyA+PiAiJGNmZ2ZpbGUiCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKKyMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKworIyBTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzLgorU0hFTEw9JGx0X1NIRUxMCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbGlicz0kZW5hYmxlX3NoYXJlZAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMuCitidWlsZF9vbGRfbGlicz0kZW5hYmxlX3N0YXRpYworCisjIFdoZXRoZXIgb3Igbm90IHRvIGFkZCAtbGMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX25lZWRfbGM9JGFyY2hpdmVfY21kc19uZWVkX2xjX0NYWAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGRpc2FsbG93IHNoYXJlZCBsaWJzIHdoZW4gcnVudGltZSBsaWJzIGFyZSBzdGF0aWMKK2FsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcz0kZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19DWFgKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBUaGUgaG9zdCBzeXN0ZW0uCitob3N0X2FsaWFzPSRob3N0X2FsaWFzCitob3N0PSRob3N0Citob3N0X29zPSRob3N0X29zCisKKyMgVGhlIGJ1aWxkIHN5c3RlbS4KK2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworYnVpbGQ9JGJ1aWxkCitidWlsZF9vcz0kYnVpbGRfb3MKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgTFRDQyBjb21waWxlciBmbGFncy4KK0xUQ0ZMQUdTPSRsdF9MVENGTEFHUworCisjIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCitDQz0kbHRfY29tcGlsZXJfQ1hYCisKKyMgSXMgdGhlIGNvbXBpbGVyIHRoZSBHTlUgQyBjb21waWxlcj8KK3dpdGhfZ2NjPSRHQ0NfQ1hYCisKKyMgQW4gRVJFIG1hdGNoZXIuCitFR1JFUD0kbHRfRUdSRVAKKworIyBUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzLgorTEQ9JGx0X0xEX0NYWAorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRsdF9TVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSIkQVMiCisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfQ1hYCisKKyMgT2JqZWN0IGZpbGUgc3VmZml4IChub3JtYWxseSAibyIpLgorb2JqZXh0PSIkYWNfb2JqZXh0IgorCisjIE9sZCBhcmNoaXZlIHN1ZmZpeCAobm9ybWFsbHkgImEiKS4KK2xpYmV4dD0iJGxpYmV4dCIKKworIyBTaGFyZWQgbGlicmFyeSBzdWZmaXggKG5vcm1hbGx5ICIuc28iKS4KK3NocmV4dF9jbWRzPSckc2hyZXh0X2NtZHMnCisKKyMgRXhlY3V0YWJsZSBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIiIpLgorZXhlZXh0PSIkZXhlZXh0IgorCisjIEFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYnJhcnkgb2JqZWN0cy4KK3BpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3BpY19DWFgKK3BpY19tb2RlPSRwaWNfbW9kZQorCisjIFdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD8KK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KKworIyBEb2VzIGNvbXBpbGVyIHNpbXVsdGFuZW91c2x5IHN1cHBvcnQgLWMgYW5kIC1vIG9wdGlvbnM/Citjb21waWxlcl9jX289JGx0X2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0NYWAorCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIHR1cm4gb2ZmIGJ1aWx0aW4gZnVuY3Rpb25zLgorbm9fYnVpbHRpbl9mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19DWFgKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSRsdF9leHBvcnRfZHluYW1pY19mbGFnX3NwZWNfQ1hYCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0NYWAorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KK3RocmVhZF9zYWZlX2ZsYWdfc3BlYz0kbHRfdGhyZWFkX3NhZmVfZmxhZ19zcGVjX0NYWAorCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0kbHRfbGlibmFtZV9zcGVjCisKKyMgTGlzdCBvZiBhcmNoaXZlIG5hbWVzLiAgRmlyc3QgbmFtZSBpcyB0aGUgcmVhbCBvbmUsIHRoZSByZXN0IGFyZSBsaW5rcy4KKyMgVGhlIGxhc3QgbmFtZSBpcyB0aGUgb25lIHRoYXQgdGhlIGxpbmtlciBmaW5kcyB3aXRoIC1sTkFNRS4KK2xpYnJhcnlfbmFtZXNfc3BlYz0kbHRfbGlicmFyeV9uYW1lc19zcGVjCisKKyMgVGhlIGNvZGVkIG5hbWUgb2YgdGhlIGxpYnJhcnksIGlmIGRpZmZlcmVudCBmcm9tIHRoZSByZWFsIG5hbWUuCitzb25hbWVfc3BlYz0kbHRfc29uYW1lX3NwZWMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSRsdF9SQU5MSUIKK29sZF9hcmNoaXZlX2NtZHM9JGx0X29sZF9hcmNoaXZlX2NtZHNfQ1hYCitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19DWFgKKworIyBDcmVhdGUgYSB0ZW1wb3Jhcnkgb2xkLXN0eWxlIGFyY2hpdmUgdG8gbGluayBpbnN0ZWFkIG9mIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhIHNoYXJlZCBhcmNoaXZlLgorYXJjaGl2ZV9jbWRzPSRsdF9hcmNoaXZlX2NtZHNfQ1hYCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX0NYWAorcG9zdGluc3RhbGxfY21kcz0kbHRfcG9zdGluc3RhbGxfY21kcworcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIChhc3N1bWVkIHNhbWUgYXMgYWJvdmUgaWYgZW1wdHkpCittb2R1bGVfY21kcz0kbHRfbW9kdWxlX2NtZHNfQ1hYCittb2R1bGVfZXhwc3ltX2NtZHM9JGx0X21vZHVsZV9leHBzeW1fY21kc19DWFgKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfQ1hYCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBfb2JqZWN0cz0kbHRfcG9zdGRlcF9vYmplY3RzX0NYWAorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwcz0kbHRfcHJlZGVwc19DWFgKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX0NYWAorCisjIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisjIGEgc2hhcmVkIGxpYnJhcnkuCitjb21waWxlcl9saWJfc2VhcmNoX3BhdGg9JGx0X2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aF9DWFgKKworIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KK2RlcGxpYnNfY2hlY2tfbWV0aG9kPSRsdF9kZXBsaWJzX2NoZWNrX21ldGhvZAorCisjIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYy4KK2ZpbGVfbWFnaWNfY21kPSRsdF9maWxlX21hZ2ljX2NtZAorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGx0X2FsbG93X3VuZGVmaW5lZF9mbGFnX0NYWAorCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfQ1hYCisKKyMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgorZmluaXNoX2NtZHM9JGx0X2ZpbmlzaF9jbWRzCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KK2ZpbmlzaF9ldmFsPSRsdF9maW5pc2hfZXZhbAorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uCitnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbAorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcgorZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCitydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKKworIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgorc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgorCisjIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KK3NobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCisKKyMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCitoYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbl9DWFgKKworIyBXaGV0aGVyIHdlIHNob3VsZCBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gbGlicmFyaWVzLgoraGFyZGNvZGVfaW50b19saWJzPSRoYXJkY29kZV9pbnRvX2xpYnMKKworIyBGbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisjIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0NYWAorCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0NYWAorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9DWFgKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FJHtzaGFyZWRfZXh0fSBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9kaXJlY3Q9JGhhcmRjb2RlX2RpcmVjdF9DWFgKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfQ1hYCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0NYWAorCisjIFNldCB0byB5ZXMgaWYgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGhhcmRjb2RlcyBESVIgaW50byB0aGUgbGlicmFyeQorIyBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQgYWdhaW5zdCBpdC4KK2hhcmRjb2RlX2F1dG9tYXRpYz0kaGFyZGNvZGVfYXV0b21hdGljX0NYWAorCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19DWFgKKworIyBDb21waWxlLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisKKyMgUnVuLXRpbWUgc3lzdGVtIHNlYXJjaCBwYXRoIGZvciBsaWJyYXJpZXMKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYworCisjIEZpeCB0aGUgc2hlbGwgdmFyaWFibGUgXCRzcmNmaWxlIGZvciB0aGUgY29tcGlsZXIuCitmaXhfc3JjZmlsZV9wYXRoPSIkZml4X3NyY2ZpbGVfcGF0aF9DWFgiCisKKyMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZC4KK2Fsd2F5c19leHBvcnRfc3ltYm9scz0kYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0NYWAorCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX0NYWAorCisjIFRoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitleHRyYWN0X2V4cHN5bXNfY21kcz0kbHRfZXh0cmFjdF9leHBzeW1zX2NtZHMKKworIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzLgorZXhjbHVkZV9leHBzeW1zPSRsdF9leGNsdWRlX2V4cHN5bXNfQ1hYCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9pbmNsdWRlX2V4cHN5bXNfQ1hYCisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKK19fRU9GX18KKworCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSRsdF9zYXZlX0NDCitMRENYWD0kTEQKK0xEPSRsdF9zYXZlX0xECitHQ0M9JGx0X3NhdmVfR0NDCit3aXRoX2dudV9sZGN4eD0kd2l0aF9nbnVfbGQKK3dpdGhfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECitsdF9jdl9wYXRoX0xEPSRsdF9zYXZlX3BhdGhfTEQKK2x0X2N2X3Byb2dfZ251X2xkY3h4PSRsdF9jdl9wcm9nX2dudV9sZAorbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKKworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIEY3NykKKwlpZiB0ZXN0IC1uICIkRjc3IiAmJiB0ZXN0ICJYJEY3NyIgIT0gIlhubyI7IHRoZW4KKworYWNfZXh0PWYKK2FjX2NvbXBpbGU9JyRGNzcgLWMgJEZGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRGNzcgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2Y3N19jb21waWxlcl9nbnUKKworCithcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9bm8KK2FsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0KK2Fsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9bm8KK2FyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PQorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0KK2hhcmRjb2RlX2RpcmVjdF9GNzc9bm8KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0KK2hhcmRjb2RlX21pbnVzX0xfRjc3PW5vCitoYXJkY29kZV9hdXRvbWF0aWNfRjc3PW5vCittb2R1bGVfY21kc19GNzc9Cittb2R1bGVfZXhwc3ltX2NtZHNfRjc3PQorbGlua19hbGxfZGVwbGlic19GNzc9dW5rbm93bgorb2xkX2FyY2hpdmVfY21kc19GNzc9JG9sZF9hcmNoaXZlX2NtZHMKK25vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0KK2VuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworb2JqZXh0X0Y3Nz0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IiAgICAgIHN1YnJvdXRpbmUgdFxuICAgICAgcmV0dXJuXG4gICAgICBlbmRcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iICAgICAgcHJvZ3JhbSB0XG4gICAgICBlbmRcbiIKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0Y3Ny0iZjc3In0KK2NvbXBpbGVyPSRDQworY29tcGlsZXJfRjc3PSRDQworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNhbl9idWlsZF9zaGFyZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGNhbl9idWlsZF9zaGFyZWQiID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgZmkKKyAgOzsKK2FpeDQqIHwgYWl4NSopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBmaQorICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGVuYWJsZV9zaGFyZWQiID4mNgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVfc3RhdGljIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRlbmFibGVfc3RhdGljIiA+JjYKKworR0NDX0Y3Nz0iJEc3NyIKK0xEX0Y3Nz0iJExEIgorCitsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0KK2x0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJEVDSE9fQyIgPiY2CisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworCisgICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBpbnRlcml4MyopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKyAgICAgIGRhcndpbiopCisgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICB4bGMqKQorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctcW5vY29tbW9uJworICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICAgICA7OworICAgICAgIGVzYWMKKyAgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBpY2MqIHwgZWNjKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctZnBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQorCWx0X3Byb2dfY29tcGlsZXJfd2xfRjc3PSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLVBJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9GNzc9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzc9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSctS2NvbmZvcm1fcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzc9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3Nz0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0nLXBpYycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3Nz0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9GNzc9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzciID4mNgorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IjsgdGhlbgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3Nz1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxMzE5ODogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxMzIwMjogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3Nz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19GNzciID4mNgorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0Y3NyIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NyIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3Nz0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0Y3Nz1ubworZmkKKworZmkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfRjc3PSIkbHRfcHJvZ19jb21waWxlcl9waWNfRjc3IgorICAgIDs7Citlc2FjCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0Y3NyBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19GNzdcIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgorICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3PXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzc9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0Y3NyIgPiY2CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfRjc3IiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfRjc3PQorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzc9bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxMzMwMjogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjEzMzA2OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3Nz15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkcm0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICBybWRpciBjb25mdGVzdAorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0Y3NyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA+JjYKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3IiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkRUNIT19DIiA+JjYKKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRfbGlua3MiID4mNgorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorCisgIHJ1bnBhdGhfdmFyPQorICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9CisgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3PW5vCisgIGFyY2hpdmVfY21kc19GNzc9CisgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PQorICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0KKyAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfRjc3PQorICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PQorICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9CisgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19GNzc9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0Y3Nz0KKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9CisgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKyAgaGFyZGNvZGVfbWludXNfTF9GNzc9bm8KKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKKyAgbGlua19hbGxfZGVwbGlic19GNzc9dW5rbm93bgorICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PW5vCisgIG1vZHVsZV9jbWRzX0Y3Nz0KKyAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0KKyAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubworICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIGluY2x1ZGVfZXhwc3ltc19GNzc9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgZXhjbHVkZV9leHBzeW1zX0Y3Nz0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisgICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KKyAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBlc2FjCisKKyAgbGRfc2hsaWJzX0Y3Nz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgorICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlic19GNzc9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKworICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19GNzc9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEY3NykgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz1ubworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfRjc3PW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGludGVyaXgzKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIDs7CisKKyAgICBsaW51eCopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwl0bXBfYWRkZmxhZz0KKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKwlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWVzYWMKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKwlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfRjc3PW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlsZF9zaGxpYnNfRjc3PW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCisJbGRfc2hsaWJzX0Y3Nz1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCisJICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIGxkX3NobGlic19GNzc9bm8KKwkgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfRjc3PW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzX0Y3NyIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9CisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzc9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19GNzc9eWVzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJaGFyZGNvZGVfZGlyZWN0X0Y3Nz11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXg0KiB8IGFpeDUqKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfRjc3PSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3Nz0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKKwkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisgIAkgICAgYnJlYWsKKyAgCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfRjc3PXllcworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisgIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisgIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorICAJICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworCSAgZWxzZQorICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9dW5zdXBwb3J0ZWQKKyAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKyAgCSAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0Y3Nz15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Jy1iZXJvaycKKyAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgICAgIHByb2dyYW0gbWFpbgorCisgICAgICBlbmQKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfZjc3X3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKK2FpeF9saWJwYXRoPWBkdW1wIC1IIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisjIENoZWNrIGZvciBhIDY0LWJpdCBvYmplY3QgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcuCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPWBkdW1wIC1IWDY0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAyPi9kZXYvbnVsbCB8ICRTRUQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgOyBmaQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorCisgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9Ii16IG5vZGVmcyIKKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorICAgICAgcHJvZ3JhbSBtYWluCisKKyAgICAgIGVuZAorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19mNzdfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2A7IGZpCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiI7IGZpCisKKwkgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3PScgJHt3bH0tYmVybm90b2snCisJICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1iZXJvaycKKwkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PSckY29udmVuaWVuY2UnCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCisgICAgICBsZF9zaGxpYnNfRjc3PW5vCisgICAgICA7OworCisgICAgYnNkaVs0NV0qKQorICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0tcmR5bmFtaWMKKyAgICAgIDs7CisKKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgICAjIFdoZW4gbm90IHVzaW5nIGdjYywgd2UgY3VycmVudGx5IGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZworICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICAgICMgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywgYXMgdGhlcmUgaXMKKyAgICAgICMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nICcKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz11bnN1cHBvcnRlZAorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KKyAgICAgIGxpYmV4dD1saWIKKyAgICAgICMgVGVsbCBsdG1haW4gdG8gbWFrZSAuZGxsIGZpbGVzLCBub3QgLnNvIGZpbGVzLgorICAgICAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgICAgICAjIEZJWE1FOiBTZXR0aW5nIGxpbmtuYW1lcyBoZXJlIGlzIGEgYmFkIGhhY2suCisgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLW8gJGxpYiAkbGlib2JqcyAkY29tcGlsZXJfZmxhZ3MgYGVjaG8gIiRkZXBsaWJzIiB8ICRTRUQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKKyAgICAgICMgVGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgYSAubGliIGZpbGUgaWYgd2UgYnVpbGQgYSBETEwuCisgICAgICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0Y3Nz0ndHJ1ZScKKyAgICAgICMgRklYTUU6IFNob3VsZCBsZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGliIHByb2dyYW0uCisgICAgICBvbGRfYXJjaGl2ZV9jbWRzX0Y3Nz0nbGliIC9PVVQ6JG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworICAgICAgZml4X3NyY2ZpbGVfcGF0aF9GNzc9J2BjeWdwYXRoIC13ICIkc3JjZmlsZSJgJworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19GNzc9eWVzCisgICAgICA7OworCisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgcmhhcHNvZHkqIHwgZGFyd2luMS5bMDEyXSkKKyAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICA7OworICAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgICAgMTAuWzAxMl0pCisgICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgIGVzYWMKKyAgICAgICAgIGZpCisgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCisgICAgICBoYXJkY29kZV9hdXRvbWF0aWNfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9dW5zdXBwb3J0ZWQKKyAgICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJworICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisgICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKKyAgICAgIG1vZHVsZV9jbWRzX0Y3Nz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgbW9kdWxlX2V4cHN5bV9jbWRzX0Y3Nz0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGVsc2UKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIHhsYyopCisgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKKyAgICAgICAgIG1vZHVsZV9jbWRzX0Y3Nz0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3PSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgOzsKKyAgICAgICAqKQorICAgICAgICAgbGRfc2hsaWJzX0Y3Nz1ubworICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlic19GNzc9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLVIkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorCisJaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJworCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwloYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9GNzc9JytiICRsaWJkaXInCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCisJICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworCSAgOzsKKwkqKQorCSAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKwkgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzc9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIGhhcmRjb2RlX21pbnVzX0xfRjc3PXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3PSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfRjc3PXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3Nz06CisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwlleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1FJworICAgICAgZWxzZQorICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKKwkgICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisJICAgOzsKKwkgKikKKwkgICBhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgOzsKKyAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTF9GNzc9eWVzCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9dW5zdXBwb3J0ZWQKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfRjc3PSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9GNzc9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZ19GNzc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3PSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PToKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nIC16IHRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCXdsYXJjPScke3dsfScKKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZWxzZQorCXdsYXJjPScnCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuWzAtNV0gfCBzb2xhcmlzMi5bMC01XS4qKSA7OworICAgICAgKikKKyAJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBsaW5rZXIgb3B0aW9ucyBzbyB3ZQorIAkjIGNhbm5vdCBqdXN0IHBhc3MgdGhlIGNvbnZpZW5jZSBsaWJyYXJ5IG5hbWVzIHRocm91Z2gKKyAJIyB3aXRob3V0ICR3bCwgaWZmIHdlIGRvIG5vdCBsaW5rIHdpdGggJExELgorIAkjIEx1Y2tpbHksIGdjYyBzdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggd2UgbmVlZCBmb3IgU3VuIFN0dWRpby4KKyAJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKyAJY2FzZSAkd2xhcmMgaW4KKyAJJycpCisgCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3PScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JyA7OworIAkqKQorIAkgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0Y3Nz0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JyA7OworIAllc2FjIDs7CisgICAgICBlc2FjCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0Y3Nz15ZXMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgaWYgdGVzdCAieCRob3N0X3ZlbmRvciIgPSB4c2VxdWVudDsgdGhlbgorCSMgVXNlICRDQyB0byBsaW5rIHVuZGVyIHNlcXVlbnQsIGJlY2F1c2UgaXQgdGhyb3dzIGluIHNvbWUgZXh0cmEgLm8KKwkjIGZpbGVzIHRoYXQgbWFrZSAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd29yay4KKwlhcmNoaXZlX2NtZHNfRjc3PSckQ0MgLUcgJHt3bH0taCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzc9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0Y3Nz15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICA7OworCisgICAgc3lzdjQpCisgICAgICBjYXNlICRob3N0X3ZlbmRvciBpbgorCXNuaSkKKwkgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdF9GNzc9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworCTs7CisJc2llbWVucykKKwkgICMjIExEIGlzIGxkIGl0IG1ha2VzIGEgUExBTUxJQgorCSAgIyMgQ0MganVzdCBtYWtlcyBhIEdyb3NzTW9kdWxlLgorCSAgYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIHJlbG9hZF9jbWRzX0Y3Nz0nJENDIC1yIC1vICRvdXRwdXQkcmVsb2FkX29ianMnCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vCisgICAgICAgIDs7CisJbW90b3JvbGEpCisJICBhcmNoaXZlX2NtZHNfRjc3PSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBoYXJkY29kZV9kaXJlY3RfRjc3PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKwk7OworICAgICAgZXNhYworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NC4zKikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PSctQmV4cG9ydCcKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCWhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3PW5vCisJcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKwloYXJkY29kZV9ydW5wYXRoX3Zhcj15ZXMKKwlsZF9zaGxpYnNfRjc3PXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgdW5peHdhcmU3KikKKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teix0ZXh0JworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3PW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0Y3Nz0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtRyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgICAjIE5vdGU6IFdlIGNhbiBOT1QgdXNlIC16IGRlZnMgYXMgd2UgbWlnaHQgZGVzaXJlLCBiZWNhdXNlIHdlIGRvIG5vdAorICAgICAgIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworICAgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgICAjIGV2ZXIgbGluayBjb3JyZWN0bHkuICBJZiB3ZSdyZSBub3QgdXNpbmcgR05VIGxkIHdlIHVzZSAteiB0ZXh0CisgICAgICAjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKyAgICAgICMgYXMgLXogZGVmcy4KKyAgICAgIG5vX3VuZGVmaW5lZF9mbGFnX0Y3Nz0nJHt3bH0teix0ZXh0JworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PScke3dsfS16LG5vZGVmcycKKyAgICAgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9GNzc9bm8KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tUiwkbGliZGlyYCcKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfRjc3PSc6JworICAgICAgbGlua19hbGxfZGVwbGlic19GNzc9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3PScke3dsfS1CZXhwb3J0JworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0Y3Nz0nJENDIC1HICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJYXJjaGl2ZV9leHBzeW1fY21kc19GNzc9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGFyY2hpdmVfY21kc19GNzc9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3PSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0Y3Nz1ubworICAgICAgOzsKKworICAgICopCisgICAgICBsZF9zaGxpYnNfRjc3PW5vCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGxkX3NobGlic19GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGxkX3NobGlic19GNzciID4mNgordGVzdCAiJGxkX3NobGlic19GNzciID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3NyIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkYXJjaGl2ZV9jbWRzX0Y3NyBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1sYyBzaG91bGQgYmUgZXhwbGljaXRseSBsaW5rZWQgaW4uLi4gJEVDSE9fQyIgPiY2CisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gMj5jb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgc29uYW1lPWNvbmZ0ZXN0CisgICAgICAgIGxpYj1jb25mdGVzdAorICAgICAgICBsaWJvYmpzPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgICAgICAgZGVwbGlicz0KKyAgICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3CisJcGljX2ZsYWc9JGx0X3Byb2dfY29tcGlsZXJfcGljX0Y3NworICAgICAgICBjb21waWxlcl9mbGFncz0tdgorICAgICAgICBsaW5rZXJfZmxhZ3M9LXYKKyAgICAgICAgdmVyc3RyaW5nPQorICAgICAgICBvdXRwdXRfb2JqZGlyPS4KKyAgICAgICAgbGlibmFtZT1jb25mdGVzdAorICAgICAgICBsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnPSRhbGxvd191bmRlZmluZWRfZmxhZ19GNzcKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3PQorICAgICAgICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhcmNoaXZlX2NtZHNfRjc3IDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjFcIiIpID4mNQorICAoZXZhbCAkYXJjaGl2ZV9jbWRzX0Y3NyAyXD5cJjEgXHwgZ3JlcCBcIiAtbGMgXCIgXD4vZGV2L251bGwgMlw+XCYxKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisgICAgICAgIHRoZW4KKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0Y3Nz1ubworICAgICAgICBlbHNlCisJICBhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzc9eWVzCisgICAgICAgIGZpCisgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3Nz0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgICAgZWxzZQorICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgIGZpCisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhcmNoaXZlX2NtZHNfbmVlZF9sY19GNzciID4mNgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkeW5hbWljIGxpbmtlciBjaGFyYWN0ZXJpc3RpY3MuLi4gJEVDSE9fQyIgPiY2CitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LlswMV0gfCBhaXg0LlswMV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCBncmVwIHllcyA+IC9kZXYvbnVsbDsgdGhlbgorCToKKyAgICAgIGVsc2UKKwljYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgIyBBSVggKG9uIFBvd2VyKikgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gY3VycmVudGx5IHdlIGNhbiBub3QgaGFyZGNvZGUgY29ycmVjdAorICAgICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KKyAgICAjIGNvbGxlY3QyLCBzbyBhZGRpdGlvbmFsIGxpbmtzIGNhbiBiZSB1c2VmdWwgaW4gZnV0dXJlLgorICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgIyBJZiB1c2luZyBydW4gdGltZSBsaW5raW5nIChvbiBBSVggNC4yIG9yIGxhdGVyKSB1c2UgbGliPG5hbWU+LnNvCisgICAgICAjIGluc3RlYWQgb2YgbGliPG5hbWU+LmEgdG8gbGV0IHBlb3BsZSBrbm93IHRoYXQgdGhlc2UgYXJlIG5vdAorICAgICAgIyB0eXBpY2FsIEFJWCBzaGFyZWQgbGlicmFyaWVzLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgZWxzZQorICAgICAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhyb3VnaCBBSVg0LjIKKyAgICAgICMgYW5kIGxhdGVyIHdoZW4gd2UgYXJlIG5vdCBkb2luZyBydW4gdGltZSBsaW5raW5nLgorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5hICRsaWJuYW1lLmEnCisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGZpCisgICAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIGZpCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVs0NV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL1gxMS9saWIgL3Vzci9jb250cmliL2xpYiAvbGliIC91c3IvbG9jYWwvbGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorICAjIHRoZSBkZWZhdWx0IGxkLnNvLmNvbmYgYWxzbyBjb250YWlucyAvdXNyL2NvbnRyaWIvbGliIGFuZAorICAjIC91c3IvWDExUjYvbGliICgvdXNyL1gxMSBpcyBhIGxpbmsgdG8gL3Vzci9YMTFSNiksIGJ1dCBsZXQgdXMgYWxsb3cKKyAgIyBsaWJ0b29sIHRvIGhhcmQtY29kZSB0aGVzZSBpbnRvIHByb2dyYW1zCisgIDs7CisKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgdmVyc2lvbl90eXBlPXdpbmRvd3MKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfdmVyc2lvbj1ubworICBuZWVkX2xpYl9wcmVmaXg9bm8KKworICBjYXNlICRHQ0MsJGhvc3Rfb3MgaW4KKyAgeWVzLGN5Z3dpbiogfCB5ZXMsbWluZ3cqIHwgeWVzLHB3MzIqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsLmEnCisgICAgIyBETEwgaXMgaW5zdGFsbGVkIHRvICQobGliZGlyKS8uLi9iaW4gYnkgcG9zdGluc3RhbGxfY21kcworICAgIHBvc3RpbnN0YWxsX2NtZHM9J2Jhc2VfZmlsZT1gYmFzZW5hbWUgXCR7ZmlsZX1gfgorICAgICAgZGxwYXRoPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZGlyLydcJydcJHtiYXNlX2ZpbGV9J1wnJ2k7ZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lJworICAgIHBvc3R1bmluc3RhbGxfY21kcz0nZGxkbGw9YCRTSEVMTCAyPiYxIC1jICdcJycuICRmaWxlOyBlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbHBhdGg9JGRpci9cJGRsZGxsfgorICAgICAgICRybSBcJGRscGF0aCcKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKikKKyAgICAgICMgQ3lnd2luIERMTHMgdXNlICdjeWcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgc29uYW1lX3NwZWM9J2BlY2hvICR7bGlibmFtZX0gfCBzZWQgLWUgJ3MvXmxpYi9jeWcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7W2MtekMtWl06LycgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAjIEl0IGlzIG1vc3QgcHJvYmFibHkgYSBXaW5kb3dzIGZvcm1hdCBQQVRIIHByaW50ZWQgYnkKKyAgICAgICAgIyBtaW5ndyBnY2MsIGJ1dCB3ZSBhcmUgcnVubmluZyBvbiBDeWd3aW4uIEdjYyBwcmludHMgaXRzIHNlYXJjaAorICAgICAgICAjIHBhdGggd2l0aCA7IHNlcGFyYXRvcnMsIGFuZCB3aXRoIGRyaXZlIGxldHRlcnMuIFdlIGNhbiBoYW5kbGUgdGhlCisgICAgICAgICMgZHJpdmUgbGV0dGVycyAoY3lnd2luIGZpbGV1dGlscyB1bmRlcnN0YW5kcyB0aGVtKSwgc28gbGVhdmUgdGhlbSwKKyAgICAgICAgIyBlc3BlY2lhbGx5IGFzIHdlIG1pZ2h0IHBhc3MgZmlsZXMgZm91bmQgdGhlcmUgdG8gYSBtaW5ndyBvYmpkdW1wLAorICAgICAgICAjIHdoaWNoIHdvdWxkbid0IHVuZGVyc3RhbmQgYSBjeWd3aW5pZmllZCBwYXRoLiBBaGguCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgICAgIGVsc2UKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgKikKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2tmcmVlYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkWzEyM10qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLlswMV0qIHwgZnJlZWJzZGVsZjMuWzAxXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bMi05XSogfCBmcmVlYnNkZWxmMy5bMi05XSogfCBcCisgIGZyZWVic2Q0LlswLTVdIHwgZnJlZWJzZGVsZjQuWzAtNV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QqKSAjIGZyb20gNC42IG9uCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBlc2FjCisgIDs7CisKK2dudSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0ke21ham9yfSAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCitocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bworICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbycKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbyIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMgIyBVbmxlc3MgK25vZW52dmFyIGlzIHNwZWNpZmllZC4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGlmIHRlc3QgIlgkSFBVWF9JQTY0X01PREUiID0gWDMyOyB0aGVuCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYi9ocHV4MzIgL3Vzci9sb2NhbC9saWIiCisgICAgZWxzZQorICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9ocHV4NjQgL3Vzci9sb2NhbC9saWIvaHB1eDY0IgorICAgIGZpCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICBocHBhKjY0KikKKyAgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYi9wYTIwXzY0IC91c3IvY2NzL2xpYi9wYTIwXzY0IgorICAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgIDs7CisgICAqKQorICAgIHNocmV4dF9jbWRzPScuc2wnCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPVNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8gIyArcyBpcyByZXF1aXJlZCB0byBlbmFibGUgU0hMSUJfUEFUSAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgOzsKKyAgZXNhYworICAjIEhQLVVYIHJ1bnMgKnJlYWxseSogc2xvd2x5IHVubGVzcyBzaGFyZWQgbGlicmFyaWVzIGFyZSBtb2RlIDU1NS4KKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgNTU1ICRsaWInCisgIDs7CisKK2ludGVyaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZHluYW1pY19saW5rZXI9J0ludGVyaXggMy54IGxkLnNvLjEgKFBFLCBsaWtlIEVMRiknCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBub25zdG9wdXgqKSB2ZXJzaW9uX3R5cGU9bm9uc3RvcHV4IDs7CisgICAgKikKKwlpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19nbnVfbGQiID0geWVzOyB0aGVuCisJCXZlcnNpb25fdHlwZT1saW51eAorCWVsc2UKKwkJdmVyc2lvbl90eXBlPWlyaXgKKwlmaSA7OworICBlc2FjCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBjYXNlICRob3N0X29zIGluCisgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgbGlic3VmZj0gc2hsaWJzdWZmPQorICAgIDs7CisgICopCisgICAgY2FzZSAkTEQgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAorICAgICotMzJ8KiItMzIgInwqLW1lbGYzMmJzbWlwfCoiLW1lbGYzMmJzbWlwICIpCisgICAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPTMyLWJpdDs7CisgICAgKi1uMzJ8KiItbjMyICJ8Ki1tZWxmMzJibWlwbjMyfCoiLW1lbGYzMmJtaXBuMzIgIikKKyAgICAgIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OworICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKQorICAgICAgbGlic3VmZj02NCBzaGxpYnN1ZmY9NjQgbGlibWFnaWM9NjQtYml0OzsKKyAgICAqKSBsaWJzdWZmPSBzaGxpYnN1ZmY9IGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUlkke3NobGlic3VmZn1fUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIke2xpYnN1ZmZ9IC9saWIke2xpYnN1ZmZ9IgorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKKyMgTm8gc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBMaW51eCBvbGRsZCwgYW91dCwgb3IgY29mZi4KK2xpbnV4Km9sZGxkKiB8IGxpbnV4KmFvdXQqIHwgbGludXgqY29mZiopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFwcGVuZCBsZC5zby5jb25mIGNvbnRlbnRzIHRvIHRoZSBzZWFyY2ggcGF0aAorICBpZiB0ZXN0IC1mIC9ldGMvbGQuc28uY29uZjsgdGhlbgorICAgIGx0X2xkX2V4dHJhPWBhd2sgJy9eaW5jbHVkZSAvIHsgc3lzdGVtKHNwcmludGYoImNkIC9ldGM7IGNhdCAlcyIsIFwkMikpOyBza2lwID0gMTsgfSB7IGlmICghc2tpcCkgcHJpbnQgXCQwOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCitrbmV0YnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuWzg5XSB8IG9wZW5ic2QyLls4OV0uKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKwk7OworICAgICAgKikKKwlzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisJOzsKKyAgICAgIGVzYWMKKyAgZWxzZQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgZmkKKyAgOzsKKworb3MyKikKKyAgbGlibmFtZV9zcGVjPSckbmFtZScKKyAgc2hyZXh0X2NtZHM9Ii5kbGwiCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fSAkbGlibmFtZS5hJworICBkeW5hbWljX2xpbmtlcj0nT1MvMiBsZC5leGUnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCisgIDs7CisKK3NvbGFyaXMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICMgbGRkIGNvbXBsYWlucyB1bmxlc3MgbGlicmFyaWVzIGFyZSBleGVjdXRhYmxlCisgIHBvc3RpbnN0YWxsX2NtZHM9J2NobW9kICt4ICRsaWInCisgIDs7CisKK3N1bm9zNCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi91c3IvZXRjIiBsZGNvbmZpZyAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgZmkKKyAgbmVlZF92ZXJzaW9uPXllcworICA7OworCitzeXN2NCB8IHN5c3Y0LjMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgc25pKQorICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tQmxhcmdlZHluc3ltJworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC91c3IvZ251L2xpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIgL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9jY3MvbGliIC91c3IvbGliJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzY28zLjJ2NSopCisgICAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvbGliIgorCTs7CisgICAgZXNhYworICBmaQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9saWInCisgIDs7CisKK3V0czQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKKyopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7Citlc2FjCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZHluYW1pY19saW5rZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGR5bmFtaWNfbGlua2VyIiA+JjYKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRFQ0hPX0MiID4mNgoraGFyZGNvZGVfYWN0aW9uX0Y3Nz0KK2lmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0Y3NyIgfHwgXAorICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyX0Y3NyIgfHwgXAorICAgdGVzdCAiWCRoYXJkY29kZV9hdXRvbWF0aWNfRjc3IiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfRjc3IiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCBGNzcpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTF9GNzciICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBoYXJkY29kZV9hY3Rpb25fRjc3PXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBoYXJkY29kZV9hY3Rpb25fRjc3PWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBoYXJkY29kZV9hY3Rpb25fRjc3PXVuc3VwcG9ydGVkCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRjb2RlX2FjdGlvbl9GNzciID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRjb2RlX2FjdGlvbl9GNzciID4mNgorCitpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uX0Y3NyIgPSByZWxpbms7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCisKKworIyBUaGUgZWxzZSBjbGF1c2Ugc2hvdWxkIG9ubHkgZmlyZSB3aGVuIGJvb3RzdHJhcHBpbmcgdGhlCisjIGxpYnRvb2wgZGlzdHJpYnV0aW9uLCBvdGhlcndpc2UgeW91IGZvcmdvdCB0byBzaGlwIGx0bWFpbi5zaAorIyB3aXRoIHlvdXIgcGFja2FnZSwgYW5kIHlvdSB3aWxsIGdldCBjb21wbGFpbnRzIHRoYXQgdGhlcmUgYXJlCisjIG5vIHJ1bGVzIHRvIGdlbmVyYXRlIGx0bWFpbi5zaC4KK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuCisgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIgY29tbWFuZHMgdGhyb3VnaAorICAjIHdpdGhvdXQgcmVtb3ZhbCBvZiBcIGVzY2FwZXMuCisgIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgZmkKKyAgIyBOb3cgcXVvdGUgYWxsIHRoZSB0aGluZ3MgdGhhdCBtYXkgY29udGFpbiBtZXRhY2hhcmFjdGVycyB3aGlsZSBiZWluZworICAjIGNhcmVmdWwgbm90IHRvIG92ZXJxdW90ZSB0aGUgQUNfU1VCU1RlZCB2YWx1ZXMuICBXZSB0YWtlIGNvcGllcyBvZiB0aGUKKyAgIyB2YXJpYWJsZXMgYW5kIHF1b3RlIHRoZSBjb3BpZXMgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGxpYnRvb2wgc2NyaXB0LgorICBmb3IgdmFyIGluIGVjaG8gb2xkX0NDIG9sZF9DRkxBR1MgQVIgQVJfRkxBR1MgRUdSRVAgUkFOTElCIExOX1MgTFRDQyBMVENGTEFHUyBOTSBcCisgICAgU0VEIFNIRUxMIFNUUklQIFwKKyAgICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIGV4dHJhY3RfZXhwc3ltc19jbWRzIFwKKyAgICBvbGRfc3RyaXBsaWIgc3RyaXBsaWIgZmlsZV9tYWdpY19jbWQgZmluaXNoX2NtZHMgZmluaXNoX2V2YWwgXAorICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kIHJlbG9hZF9mbGFnIHJlbG9hZF9jbWRzIG5lZWRfbG9ja3MgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wgXAorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgXAorICAgIGNvbXBpbGVyX0Y3NyBcCisgICAgQ0NfRjc3IFwKKyAgICBMRF9GNzcgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfRjc3IFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19GNzcgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3NyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfRjc3IFwKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfRjc3IFwKKyAgICB0aHJlYWRfc2FmZV9mbGFnX3NwZWNfRjc3IFwKKyAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19GNzcgXAorICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfRjc3IFwKKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0Y3NyBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19GNzcgXAorICAgIHByZWRlcF9vYmplY3RzX0Y3NyBcCisgICAgcG9zdGRlcF9vYmplY3RzX0Y3NyBcCisgICAgcHJlZGVwc19GNzcgXAorICAgIHBvc3RkZXBzX0Y3NyBcCisgICAgY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0Y3NyBcCisgICAgYXJjaGl2ZV9jbWRzX0Y3NyBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19GNzcgXAorICAgIHBvc3RpbnN0YWxsX2NtZHNfRjc3IFwKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHNfRjc3IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19GNzcgXAorICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0Y3NyBcCisgICAgbm9fdW5kZWZpbmVkX2ZsYWdfRjc3IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3NyBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19GNzcgXAorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3IFwKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3NyBcCisgICAgaGFyZGNvZGVfYXV0b21hdGljX0Y3NyBcCisgICAgbW9kdWxlX2NtZHNfRjc3IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3IFwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19GNzcgXAorICAgIGV4Y2x1ZGVfZXhwc3ltc19GNzcgXAorICAgIGluY2x1ZGVfZXhwc3ltc19GNzc7IGRvCisKKyAgICBjYXNlICR2YXIgaW4KKyAgICBvbGRfYXJjaGl2ZV9jbWRzX0Y3NyB8IFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0Y3NyB8IFwKKyAgICBhcmNoaXZlX2NtZHNfRjc3IHwgXAorICAgIGFyY2hpdmVfZXhwc3ltX2NtZHNfRjc3IHwgXAorICAgIG1vZHVsZV9jbWRzX0Y3NyB8IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfRjc3IHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0Y3NyB8IFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX0Y3NyB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXCQwIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2NmZ2ZpbGU9IiRvZmlsZSIKKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfRjc3CisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0Y3NworCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEEgQyBjb21waWxlci4KK0xUQ0M9JGx0X0xUQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9jb21waWxlcl9GNzcKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19GNzcKKworIyBBbiBFUkUgbWF0Y2hlci4KK0VHUkVQPSRsdF9FR1JFUAorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0kbHRfTERfRjc3CisKKyMgV2hldGhlciB3ZSBuZWVkIGhhcmQgb3Igc29mdCBsaW5rcy4KK0xOX1M9JGx0X0xOX1MKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0kbHRfTk0KKworIyBBIHN5bWJvbCBzdHJpcHBpbmcgcHJvZ3JhbQorU1RSSVA9JGx0X1NUUklQCisKKyMgVXNlZCB0byBleGFtaW5lIGxpYnJhcmllcyB3aGVuIGZpbGVfbWFnaWNfY21kIGJlZ2lucyAiZmlsZSIKK01BR0lDX0NNRD0kTUFHSUNfQ01ECisKKyMgVXNlZCBvbiBjeWd3aW46IERMTCBjcmVhdGlvbiBwcm9ncmFtLgorRExMVE9PTD0iJERMTFRPT0wiCisKKyMgVXNlZCBvbiBjeWd3aW46IG9iamVjdCBkdW1wZXIuCitPQkpEVU1QPSIkT0JKRFVNUCIKKworIyBVc2VkIG9uIGN5Z3dpbjogYXNzZW1ibGVyLgorQVM9IiRBUyIKKworIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGVtcG9yYXJ5IGxpYnRvb2wgZmlsZXMuCitvYmpkaXI9JG9iamRpcgorCisjIEhvdyB0byBjcmVhdGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuCityZWxvYWRfZmxhZz0kbHRfcmVsb2FkX2ZsYWcKK3JlbG9hZF9jbWRzPSRsdF9yZWxvYWRfY21kcworCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0kbHRfbHRfcHJvZ19jb21waWxlcl93bF9GNzcKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX0Y3NworcGljX21vZGU9JHBpY19tb2RlCisKKyMgV2hhdCBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBjb21tYW5kPworbWF4X2NtZF9sZW49JGx0X2N2X3N5c19tYXhfY21kX2xlbgorCisjIERvZXMgY29tcGlsZXIgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydCAtYyBhbmQgLW8gb3B0aW9ucz8KK2NvbXBpbGVyX2Nfbz0kbHRfbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fRjc3CisKKyMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24/CituZWVkX2xvY2tzPSRsdF9uZWVkX2xvY2tzCisKKyMgRG8gd2UgbmVlZCB0aGUgbGliIHByZWZpeCBmb3IgbW9kdWxlcz8KK25lZWRfbGliX3ByZWZpeD0kbmVlZF9saWJfcHJlZml4CisKKyMgRG8gd2UgbmVlZCBhIHZlcnNpb24gZm9yIGxpYnJhcmllcz8KK25lZWRfdmVyc2lvbj0kbmVlZF92ZXJzaW9uCisKKyMgV2hldGhlciBkbG9wZW4gaXMgc3VwcG9ydGVkLgorZGxvcGVuX3N1cHBvcnQ9JGVuYWJsZV9kbG9wZW4KKworIyBXaGV0aGVyIGRsb3BlbiBvZiBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZj0kZW5hYmxlX2Rsb3Blbl9zZWxmCisKKyMgV2hldGhlciBkbG9wZW4gb2Ygc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGZfc3RhdGljPSRlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljCisKKyMgQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZy4KK2xpbmtfc3RhdGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0Y3NworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0Y3NworCisjIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCitleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGx0X2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19GNzcKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHNoYXJlZCBvYmplY3RzIGRpcmVjdGx5IGZyb20gYXJjaGl2ZXMuCit3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0kbHRfd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfRjc3CisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgordGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWNfRjc3CisKKyMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCit2ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQorCisjIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgorbGlibmFtZV9zcGVjPSRsdF9saWJuYW1lX3NwZWMKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSRsdF9saWJyYXJ5X25hbWVzX3NwZWMKKworIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KK3NvbmFtZV9zcGVjPSRsdF9zb25hbWVfc3BlYworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCitSQU5MSUI9JGx0X1JBTkxJQgorb2xkX2FyY2hpdmVfY21kcz0kbHRfb2xkX2FyY2hpdmVfY21kc19GNzcKK29sZF9wb3N0aW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdGluc3RhbGxfY21kcworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3R1bmluc3RhbGxfY21kcworCisjIENyZWF0ZSBhbiBvbGQtc3R5bGUgYXJjaGl2ZSBmcm9tIGEgc2hhcmVkIGFyY2hpdmUuCitvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0Y3NworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19GNzcKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCithcmNoaXZlX2NtZHM9JGx0X2FyY2hpdmVfY21kc19GNzcKK2FyY2hpdmVfZXhwc3ltX2NtZHM9JGx0X2FyY2hpdmVfZXhwc3ltX2NtZHNfRjc3Citwb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKK21vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19GNzcKK21vZHVsZV9leHBzeW1fY21kcz0kbHRfbW9kdWxlX2V4cHN5bV9jbWRzX0Y3NworCisjIENvbW1hbmRzIHRvIHN0cmlwIGxpYnJhcmllcy4KK29sZF9zdHJpcGxpYj0kbHRfb2xkX3N0cmlwbGliCitzdHJpcGxpYj0kbHRfc3RyaXBsaWIKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcF9vYmplY3RzPSRsdF9wcmVkZXBfb2JqZWN0c19GNzcKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfRjc3CisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBzPSRsdF9wcmVkZXBzX0Y3NworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwcz0kbHRfcG9zdGRlcHNfRjc3CisKKyMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyMgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX0Y3NworCisjIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGRlcGVuZGVudCBsaWJyYXJpZXMgYXJlIHNoYXJlZCBvYmplY3RzLgorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2RlcGxpYnNfY2hlY2tfbWV0aG9kCisKKyMgQ29tbWFuZCB0byB1c2Ugd2hlbiBkZXBsaWJzX2NoZWNrX21ldGhvZCA9PSBmaWxlX21hZ2ljLgorZmlsZV9tYWdpY19jbWQ9JGx0X2ZpbGVfbWFnaWNfY21kCisKKyMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCithbGxvd191bmRlZmluZWRfZmxhZz0kbHRfYWxsb3dfdW5kZWZpbmVkX2ZsYWdfRjc3CisKKyMgRmxhZyB0aGF0IGZvcmNlcyBubyB1bmRlZmluZWQgc3ltYm9scy4KK25vX3VuZGVmaW5lZF9mbGFnPSRsdF9ub191bmRlZmluZWRfZmxhZ19GNzcKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX0Y3NworCisjIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCitoYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicworCisjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfRjc3CisKKyMgSWYgbGQgaXMgdXNlZCB3aGVuIGxpbmtpbmcsIGZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50bworIyBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4gVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzCisjIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQ9JGx0X2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRfRjc3CisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0Y3NworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0X0Y3NworCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kaGFyZGNvZGVfbWludXNfTF9GNzcKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfRjc3CisKKyMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5CisjIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRoYXJkY29kZV9hdXRvbWF0aWNfRjc3CisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRsaW5rX2FsbF9kZXBsaWJzX0Y3NworCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKworIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KK2ZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoX0Y3NyIKKworIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHNfRjc3CisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X2V4cG9ydF9zeW1ib2xzX2NtZHNfRjc3CisKKyMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19GNzcKKworIyBTeW1ib2xzIHRoYXQgbXVzdCBhbHdheXMgYmUgZXhwb3J0ZWQuCitpbmNsdWRlX2V4cHN5bXM9JGx0X2luY2x1ZGVfZXhwc3ltc19GNzcKKworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworX19FT0ZfXworCisKK2Vsc2UKKyAgIyBJZiB0aGVyZSBpcyBubyBNYWtlZmlsZSB5ZXQsIHdlIHJlbHkgb24gYSBtYWtlIHJ1bGUgdG8gZXhlY3V0ZQorICAjIGBjb25maWcuc3RhdHVzIC0tcmVjaGVjaycgdG8gcmVydW4gdGhlc2UgdGVzdHMgYW5kIGNyZWF0ZSB0aGUKKyAgIyBsaWJ0b29sIHNjcmlwdCB0aGVuLgorICBsdG1haW5faW49YGVjaG8gJGx0bWFpbiB8IHNlZCAtZSAncy9cLnNoJC8uaW4vJ2AKKyAgaWYgdGVzdCAtZiAiJGx0bWFpbl9pbiI7IHRoZW4KKyAgICB0ZXN0IC1mIE1ha2VmaWxlICYmIG1ha2UgIiRsdG1haW4iCisgIGZpCitmaQorCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworQ0M9IiRsdF9zYXZlX0NDIgorCisJZWxzZQorCSAgdGFnbmFtZT0iIgorCWZpCisJOzsKKworICAgICAgR0NKKQorCWlmIHRlc3QgLW4gIiRHQ0oiICYmIHRlc3QgIlgkR0NKIiAhPSAiWG5vIjsgdGhlbgorCisKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWphdmEKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK29iamV4dF9HQ0o9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge31cbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikge307IH1cbicKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCisKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskcm0gY29uZnRlc3QqCisKK2FjX291dGZpbGU9Y29uZnRlc3QuJGFjX29iamV4dAorcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2xpbmsiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfbGlua2VyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitDQz0ke0dDSi0iZ2NqIn0KK2NvbXBpbGVyPSRDQworY29tcGlsZXJfR0NKPSRDQworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworCisjIEdDSiBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lIEdDQyBkaWRuJ3QgaW1wbGljaXRseSBsaW5rIGxpYmMgaW4uCithcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKworb2xkX2FyY2hpdmVfY21kc19HQ0o9JG9sZF9hcmNoaXZlX2NtZHMKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisKK2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX0dDSj0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKPScgLWZuby1idWlsdGluJworCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSItZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNTUwOTogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxNTUxMzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucyIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID4mNgorCitpZiB0ZXN0IHgiJGx0X2N2X3Byb2dfY29tcGlsZXJfcnR0aV9leGNlcHRpb25zIiA9IHh5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0o9IiRsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0ogLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyIKK2Vsc2UKKyAgICA6CitmaQorCitmaQorCitsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0KK2x0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KK2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUMuLi4gJEVDSE9fQyIgPiY2CisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1zdGF0aWMnCisKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICA7OworCisgICAgYmVvcyogfCBjeWd3aW4qIHwgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KiB8IG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgorICAgICAgOzsKKworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZm5vLWNvbW1vbicKKyAgICAgIDs7CisKKyAgICBpbnRlcml4MyopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1mUElDJworCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgICMgUE9SVE1FIENoZWNrIGZvciBmbGFnIHRvIHBhc3MgbGlua2VyIGZsYWdzIHRocm91Z2ggdGhlIHN5c3RlbSBjb21waWxlci4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICBlbHNlCisJbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisgICAgICBmaQorICAgICAgOzsKKyAgICAgIGRhcndpbiopCisgICAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgIyBDb21tb24gc3ltYm9scyBub3QgYWxsb3dlZCBpbiBNSF9EWUxJQiBmaWxlcworICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICB4bGMqKQorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctcW5vY29tbW9uJworICAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICAgICA7OworICAgICAgIGVzYWMKKyAgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgSUE2NCBIUC1VWCBhbmQgNjQtYml0IEhQLVVYLCBidXQKKyAgICAgICMgbm90IGZvciBQQSBIUC1VWC4KKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBocHBhKjY0KnxpYTY0KikKKwkjICtaIHRoZSBkZWZhdWx0CisJOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPScrWicKKwk7OworICAgICAgZXNhYworICAgICAgIyBJcyB0aGVyZSBhIGJldHRlciBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyB0aGF0IHdvcmtzIHdpdGggdGhlIGJ1bmRsZWQgQ0M/CisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgICMgUElDICh3aXRoIC1LUElDKSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIGxpbnV4KikKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBpY2MqIHwgZWNjKikKKwlsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKwlsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgIHBnY2MqIHwgcGdmNzcqIHwgcGdmOTAqIHwgcGdmOTUqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVycyAoKm5vdCogdGhlIFBlbnRpdW0gZ2NjIGNvbXBpbGVyLAorCSMgd2hpY2ggbG9va3MgdG8gYmUgYSBkZWFkIHByb2plY3QpCisJbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisJbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctZnBpYycKKwlsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgICA7OworICAgICAgY2NjKikKKyAgICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICAgICMgQWxsIEFscGhhIGNvZGUgaXMgUElDLgorICAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ub25fc2hhcmVkJworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctV2wsJworICAgICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1ub25fc2hhcmVkJworICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS1BJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgZjc3KiB8IGY5MCogfCBmOTUqKQorCWx0X3Byb2dfY29tcGlsZXJfd2xfR0NKPSctUW9wdGlvbiBsZCAnOzsKKyAgICAgICopCisJbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLVBJQycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqKQorICAgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0o9Jy1XbCwnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0o9Jy1LUElDJworICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisJbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSctS2NvbmZvcm1fcGljJworCWx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLUtQSUMnCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0o9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHVuaWNvcyopCisgICAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSj0nLVdsLCcKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICB1dHM0KikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0nLXBpYycKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX0dDSj0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgKikKKyAgICAgIGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZF9HQ0o9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0oiID4mNgorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgYWN0dWFsbHkgd29ya3MuCisjCitpZiB0ZXN0IC1uICIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIjsgdGhlbgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIFBJQyBmbGFnICRsdF9wcm9nX2NvbXBpbGVyX3BpY19HQ0ogd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7bHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSj1ubworICBhY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgIyBUaGUgb3B0aW9uIGlzIHJlZmVyZW5jZWQgdmlhIGEgdmFyaWFibGUgdG8gYXZvaWQgY29uZnVzaW5nIHNlZC4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNTc3NzogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgIGVjaG8gIiRhc19tZToxNTc4MTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkcm0gY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbHRfcHJvZ19jb21waWxlcl9waWNfd29ya3NfR0NKIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsdF9wcm9nX2NvbXBpbGVyX3BpY193b3Jrc19HQ0oiID4mNgorCitpZiB0ZXN0IHgiJGx0X3Byb2dfY29tcGlsZXJfcGljX3dvcmtzX0dDSiIgPSB4eWVzOyB0aGVuCisgICAgY2FzZSAkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIGluCisgICAgICIiIHwgIiAiKikgOzsKKyAgICAgKikgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIgJGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiIgOzsKKyAgICAgZXNhYworZWxzZQorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSj0KKyAgICAgbHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkX0dDSj1ubworZmkKKworZmkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPQorICAgIDs7CisgICopCisgICAgbHRfcHJvZ19jb21waWxlcl9waWNfR0NKPSIkbHRfcHJvZ19jb21waWxlcl9waWNfR0NKIgorICAgIDs7Citlc2FjCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRsdF9wcm9nX2NvbXBpbGVyX3dsX0dDSiBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19HQ0pcIgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmICRjb21waWxlciBzdGF0aWMgZmxhZyAkbHRfdG1wX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3MuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9bm8KKyAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICBMREZMQUdTPSIkTERGTEFHUyAkbHRfdG1wX3N0YXRpY19mbGFnIgorICAgcHJpbnRmICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICBsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0o9eWVzCisgICAgIGZpCisgICBmaQorICAgJHJtIGNvbmZ0ZXN0KgorICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY193b3Jrc19HQ0oiID4mNQorZWNobyAiJHtFQ0hPX1R9JGx0X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzX0dDSiIgPiY2CisKK2lmIHRlc3QgeCIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3NfR0NKIiA9IHh5ZXM7IHRoZW4KKyAgICA6CitlbHNlCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKPQorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2x0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0o9bm8KKyAgICRybSAtciBjb25mdGVzdCAyPi9kZXYvbnVsbAorICAgbWtkaXIgY29uZnRlc3QKKyAgIGNkIGNvbmZ0ZXN0CisgICBta2RpciBvdXQKKyAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgIGx0X2NvbXBpbGVyX2ZsYWc9Ii1vIG91dC9jb25mdGVzdDIuJGFjX29iamV4dCIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgIGx0X2NvbXBpbGU9YGVjaG8gIiRhY19jb21waWxlIiB8ICRTRUQgXAorICAgLWUgJ3M6LipGTEFHU31cezAsMVx9IDomJGx0X2NvbXBpbGVyX2ZsYWcgOjsgdCcgXAorICAgLWUgJ3M6IFteIF0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZToxNTg4MTogJGx0X2NvbXBpbGVcIiIgPiY1KQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mNQorICAgZWNobyAiJGFzX21lOjE1ODg1OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiY1CisgICAkcm0gY29uZnRlc3QqCisgICAjIFNHSSBDKysgY29tcGlsZXIgd2lsbCBjcmVhdGUgZGlyZWN0b3J5IG91dC9paV9maWxlcy8gZm9yCisgICAjIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKyAgIHRlc3QgLWQgb3V0L2lpX2ZpbGVzICYmICRybSBvdXQvaWlfZmlsZXMvKiAmJiBybWRpciBvdXQvaWlfZmlsZXMKKyAgICRybSBvdXQvKiAmJiBybWRpciBvdXQKKyAgIGNkIC4uCisgICBybWRpciBjb25mdGVzdAorICAgJHJtIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiIgPiY1CitlY2hvICIke0VDSE9fVH0kbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA+JjYKKworCitoYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCitpZiB0ZXN0ICIkbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fR0NKIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgorICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHdlIGNhbiBsb2NrIHdpdGggaGFyZCBsaW5rcy4uLiAkRUNIT19DIiA+JjYKKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhcmRfbGlua3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGhhcmRfbGlua3MiID4mNgorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IFxgJENDJyBkb2VzIG5vdCBzdXBwb3J0IFxgLWMgLW8nLCBzbyBcYG1ha2UgLWonIG1heSBiZSB1bnNhZmUiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjI7fQorICAgIG5lZWRfbG9ja3M9d2FybgorICBmaQorZWxzZQorICBuZWVkX2xvY2tzPW5vCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRFQ0hPX0MiID4mNgorCisgIHJ1bnBhdGhfdmFyPQorICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9CisgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKPW5vCisgIGFyY2hpdmVfY21kc19HQ0o9CisgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPQorICBvbGRfYXJjaGl2ZV9Gcm9tX25ld19jbWRzX0dDSj0KKyAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKPQorICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPQorICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9CisgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19HQ0o9CisgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPQorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSj0KKyAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9CisgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKyAgaGFyZGNvZGVfbWludXNfTF9HQ0o9bm8KKyAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9dW5zdXBwb3J0ZWQKKyAgbGlua19hbGxfZGVwbGlic19HQ0o9dW5rbm93bgorICBoYXJkY29kZV9hdXRvbWF0aWNfR0NKPW5vCisgIG1vZHVsZV9jbWRzX0dDSj0KKyAgbW9kdWxlX2V4cHN5bV9jbWRzX0dDSj0KKyAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj1ubworICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSj0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIGluY2x1ZGVfZXhwc3ltc19HQ0o9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgZXhjbHVkZV9leHBzeW1zX0dDSj0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisgICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KKyAgZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBlc2FjCisKKyAgbGRfc2hsaWJzX0dDSj15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorICAJd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgorICAgICAgKlwgWzAxXS4qIHwgKlwgMi5bMC05XS4qIHwgKlwgMi4xMC4qKSA7OyAjIGNhdGNoIHZlcnNpb25zIDwgMi4xMQorICAgICAgKlwgMi4xMS45My4wLjJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBSSDcuMyAuLi4KKyAgICAgICpcIDIuMTEuOTIuMC4xMlwgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OyAjIE1hbmRyYWtlIDguMiAuLi4KKyAgICAgICpcIDIuMTEuKikgOzsgIyBvdGhlciAyLjExIHZlcnNpb25zCisgICAgICAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgR05VIGxkIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqIHwgYWl4NCogfCBhaXg1KikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCWxkX3NobGlic19HQ0o9bm8KKwljYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIEdOVSBsaW5rZXIsIGF0IGxlYXN0IHVwIHRvIHJlbGVhc2UgMi45LjEsIGlzIHJlcG9ydGVkCisqKiogdG8gYmUgdW5hYmxlIHRvIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIEFJWC4KKyoqKiBUaGVyZWZvcmUsIGxpYnRvb2wgaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIElmIHlvdQorKioqIHJlYWxseSBjYXJlIGZvciBzaGFyZWQgbGlicmFyaWVzLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHlvdXIgUEFUSAorKioqIHNvIHRoYXQgYSBub24tR05VIGxpbmtlciBpcyBmb3VuZCwgYW5kIHRoZW4gcmVzdGFydC4KKworRU9GCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKworICAgICAgIyBTYW11ZWwgQS4gRmFsdm8gSUkgPGtjNXRqYUBkb2xwaGluLm9wZW5wcm9qZWN0cy5uZXQ+IHJlcG9ydHMKKyAgICAgICMgdGhhdCB0aGUgc2VtYW50aWNzIG9mIGR5bmFtaWMgbGlicmFyaWVzIG9uIEFtaWdhT1MsIGF0IGxlYXN0IHVwCisgICAgICAjIHRvIHZlcnNpb24gNCwgaXMgdG8gc2hhcmUgZGF0YSBhbW9uZyBtdWx0aXBsZSBwcm9ncmFtcyBsaW5rZWQKKyAgICAgICMgd2l0aCB0aGUgc2FtZSBkeW5hbWljIGxpYnJhcnkuICBTaW5jZSB0aGlzIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICAjIGJlaGF2aW9yIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBjYW4ndCB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCWxkX3NobGlic19HQ0o9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIEdDSikgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj1ubworICAgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0o9eWVzCisgICAgICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSj0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltCQ0RHUlNdIC9zLy4qIFwoW14gXSpcKS9cMSBEQVRBLydcJycgfCAkU0VEIC1lICdcJycvXltBSVRXXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGludGVyaXgzKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIDs7CisKKyAgICBsaW51eCopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwl0bXBfYWRkZmxhZz0KKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKwlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWVzYWMKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKwlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KKwkgIGFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlsZF9zaGxpYnNfR0NKPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJbGRfc2hsaWJzX0dDSj1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFswMV0uKiB8ICpcIDIuWzAtOV0uKiB8ICpcIDIuMVswLTVdLiopCisJbGRfc2hsaWJzX0dDSj1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSdgdGVzdCAteiAiJFNDT0FCU1BBVEgiICYmIGVjaG8gJHt3bH0tcnBhdGgsJGxpYmRpcmAnCisJICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYicKKwkgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUsLXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICBlbHNlCisJICAgIGxkX3NobGlic19HQ0o9bm8KKwkgIGZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBzdW5vczQqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlsZF9zaGxpYnNfR0NKPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubzsgdGhlbgorICAgICAgcnVucGF0aF92YXI9CisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9CisgICAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9CisgICAgZmkKKyAgZWxzZQorICAgICMgUE9SVE1FIGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIGxpbmtlciAobm90IEdOVSBsZCkKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgYWl4MyopCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9dW5zdXBwb3J0ZWQKKyAgICAgIGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0o9eWVzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJExEIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtYkU6JGV4cG9ydF9zeW1ib2xzIC1UNTEyIC1INTEyIC1iTTpTUkV+JEFSICRBUl9GTEFHUyAkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAmJiB0ZXN0IC16ICIkbHRfcHJvZ19jb21waWxlcl9zdGF0aWMiOyB0aGVuCisJIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCisJIyBicm9rZW4gY29sbGVjdDIuCisJaGFyZGNvZGVfZGlyZWN0X0dDSj11bnN1cHBvcnRlZAorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhaXg0KiB8IGFpeDUqKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKwkgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKPSckTk0gLUJwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXCQyID09ICJUIikgfHwgKFwkMiA9PSAiRCIpIHx8IChcJDIgPT0gIkIiKSkgJiYgKHN1YnN0cihcJDMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFwkMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwllbHNlCisJICBleHBvcnRfc3ltYm9sc19jbWRzX0dDSj0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJDIgPT0gIlQiKSB8fCAoXCQyID09ICJEIikgfHwgKFwkMiA9PSAiQiIpKSAmJiAoc3Vic3RyKFwkMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuWzIzXXxhaXg0LlsyM10uKnxhaXg1KikKKwkgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworICAJICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorICAJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisgIAkgICAgYnJlYWsKKyAgCSAgZmkKKwkgIGRvbmUKKwkgIDs7CisJZXNhYworCisJZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKwlub19lbnRyeV9mbGFnPSctYm5vZW50cnknCisgICAgICBmaQorCisgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAjIGhhdmUgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzLiAgSWYgbGlua2luZyBhIGxpYnJhcnkKKyAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgIyBlbm91Z2ggdG8gZml4IHRoZSBwcm9ibGVtLCBhZGQgLVdsLC1iYmlndG9jIHRvIExERkxBR1MuCisKKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj0nOicKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcworCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bMDEyXXxhaXg0LlswMTJdLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisgIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisgIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorICAJICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworCSAgZWxzZQorICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgIAkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9dW5zdXBwb3J0ZWQKKyAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKyAgCSAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgIAkgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgYWx3YXlzX2V4cG9ydF9zeW1ib2xzX0dDSj15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9Jy1iZXJvaycKKyAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSJcJENDIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiBlY2hvICIke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IjsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgIGVsc2UKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSIteiBub2RlZnMiCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyIKKwllbHNlCisJICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYAorIyBDaGVjayBmb3IgYSA2NC1iaXQgb2JqZWN0IGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLgoraWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbiBhaXhfbGlicGF0aD1gZHVtcCAtSFg2NCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICcvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7IC9eMC8geyBzL14wICAqXCguKlwpJC9cMS87IHA7IH0KK30nYDsgZmkKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKKworCSBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAjIC1iZXJvayB3aWxsIGxpbmsgd2l0aG91dCBlcnJvciwgYnV0IG1heSBwcm9kdWNlIGEgYnJva2VuIGxpYnJhcnkuCisJICBub191bmRlZmluZWRfZmxhZ19HQ0o9JyAke3dsfS1iZXJub3RvaycKKwkgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWJlcm9rJworCSAgIyBFeHBvcnRlZCBzeW1ib2xzIGNhbiBiZSBwdWxsZWQgaW50byBzaGFyZWQgb2JqZWN0cyBmcm9tIGFyY2hpdmVzCisJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9JyRjb252ZW5pZW5jZScKKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKKwkgICMgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBBSVggdHJhZGl0aW9uYWxseSBidWlsZHMgaXRzIHNoYXJlZCBsaWJyYXJpZXMuCisJICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFtaWdhb3MqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBWRVJTSU9OICRtYWpvciIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSICRBUl9GTEFHUyAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG91dHB1dF9vYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGUgR05VIGxkIHNlY3Rpb24KKyAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBic2RpWzQ1XSopCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScgJworICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPXVuc3VwcG9ydGVkCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgICAgbGliZXh0PWxpYgorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisgICAgICBzaHJleHRfY21kcz0iLmRsbCIKKyAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHNfR0NKPSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIG9sZF9hcmNoaXZlX2NtZHNfR0NKPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgICBmaXhfc3JjZmlsZV9wYXRoX0dDSj0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgICBlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzX0dDSj15ZXMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLlswMTJdKQorICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIDs7CisgICAgICAgKikgIyBEYXJ3aW4gMS4zIG9uCisgICAgICAgICBpZiB0ZXN0IC16ICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSA7IHRoZW4KKyAgICAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gaW4KKyAgICAgICAgICAgICAxMC5bMDEyXSkKKyAgICAgICAgICAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgIDEwLiopCisgICAgICAgICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgZXNhYworICAgICAgICAgZmkKKyAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX2F1dG9tYXRpY19HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj11bnN1cHBvcnRlZAorICAgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScnCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKyAgICAJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtZHluYW1pY2xpYiAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgbW9kdWxlX2NtZHNfR0NKPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICMgRG9uJ3QgZml4IHRoaXMgYnkgdXNpbmcgdGhlIGxkIC1leHBvcnRlZF9zeW1ib2xzX2xpc3QgZmxhZywgaXQgZG9lc24ndCBleGlzdCBpbiBvbGRlciBkYXJ3aW4gbGRzCisgICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZ35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICBtb2R1bGVfZXhwc3ltX2NtZHNfR0NKPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgZWxzZQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgeGxjKikKKyAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJworICAgICAgICAgbW9kdWxlX2NtZHNfR0NKPSckQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFncycKKyAgICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1xbWtzaHJvYmogJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfSRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0o9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDICRhbGxvd191bmRlZmluZWRfZmxhZyAgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICA7OworICAgICAgICopCisgICAgICAgICBsZF9zaGxpYnNfR0NKPW5vCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgICAgOzsKKworICAgIGRndXgqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgZnJlZWJzZDEqKQorICAgICAgbGRfc2hsaWJzX0dDSj1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAgICMgc3VwcG9ydC4gIEZ1dHVyZSB2ZXJzaW9ucyBkbyB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dCBhbiBleHBsaWNpdCBjKytydDAubworICAgICMgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcsIGFuZCBoZWxwcyBzaWduaWZpY2FudGx5IChhdCB0aGUgY29zdCBvZiBhIGxpdHRsZQorICAgICMgZXh0cmEgc3BhY2UpLgorICAgIGZyZWVic2QyLjIqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAvdXNyL2xpYi9jKytydDAubycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICAjIFVuZm9ydHVuYXRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEZyZWVCU0QgMiBkbyBub3QgaGF2ZSB0aGlzIGZlYXR1cmUuCisgICAgZnJlZWJzZDIqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDMgYW5kIGdyZWF0ZXIgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBocHV4OSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JExEIC1iICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKworICAgICAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKyAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfR0NKPScke3dsfS1FJworICAgICAgOzsKKworICAgIGhwdXgxMCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLWIgK2ggJHNvbmFtZSArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfStiICR7d2x9JGxpYmRpcicKKwloYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisKKwloYXJkY29kZV9kaXJlY3RfR0NKPXllcworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCisKKwkjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorCSMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCWhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBocHV4MTEqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJKikKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKworCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCp8aWE2NCopCisJICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX0dDSj0nK2IgJGxpYmRpcicKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKwkgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisJICA7OworCSopCisJICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworCSAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSj0nJHt3bH0tRScKKworCSAgIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkgICMgYnV0IGFzIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCSAgaGFyZGNvZGVfbWludXNfTF9HQ0o9eWVzCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZWxzZQorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0o9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAjIGEub3V0CisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgICAgICMgRUxGCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9eWVzCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKPToKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgb3BlbmJzZCopCisgICAgICBoYXJkY29kZV9kaXJlY3RfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCwkbGliZGlyJworCWV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUUnCisgICAgICBlbHNlCisgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorCSBvcGVuYnNkWzAxXS4qIHwgb3BlbmJzZDIuWzAtN10gfCBvcGVuYnNkMi5bMC03XS4qKQorCSAgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKKwkgICA7OworCSAqKQorCSAgIGFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICA7OworICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgb3MyKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MX0dDSj15ZXMKKyAgICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj11bnN1cHBvcnRlZAorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyAiREVTQ1JJUFRJT04gXCIkbGlibmFtZVwiIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gREFUQSA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gRVhQT1JUUyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+ZW14ZXhwICRsaWJvYmpzID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmJworICAgICAgb2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kc19HQ0o9J2VteGltcCAtbyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5hICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIDs7CisKKyAgICBvc2YzKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX0dDSj06CisgICAgICA7OworCisgICAgb3NmNCogfCBvc2Y1KikJIyBhcyBvc2YzKiB3aXRoIHRoZSBhZGRpdGlvbiBvZiAtbXN5bSBmbGFnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgZWxzZQorCWFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSj0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJYXJjaGl2ZV9leHBzeW1fY21kc19HQ0o9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkkTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1pbnB1dCAkbGliLmV4cCAkbGlua2VyX2ZsYWdzICRsaWJvYmpzICRkZXBsaWJzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifiRybSAkbGliLmV4cCcKKworCSMgQm90aCBjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKwloYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9OgorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScgLXogdGV4dCcKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJd2xhcmM9JyR7d2x9JworCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtc2hhcmVkICR7d2x9LWggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBlbHNlCisJd2xhcmM9JycKKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisgIAkkTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFnc34kcm0gJGxpYi5leHAnCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICBzb2xhcmlzMi5bMC01XSB8IHNvbGFyaXMyLlswLTVdLiopIDs7CisgICAgICAqKQorIAkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGxpbmtlciBvcHRpb25zIHNvIHdlCisgCSMgY2Fubm90IGp1c3QgcGFzcyB0aGUgY29udmllbmNlIGxpYnJhcnkgbmFtZXMgdGhyb3VnaAorIAkjIHdpdGhvdXQgJHdsLCBpZmYgd2UgZG8gbm90IGxpbmsgd2l0aCAkTEQuCisgCSMgTHVja2lseSwgZ2NjIHN1cHBvcnRzIHRoZSBzYW1lIHN5bnRheCB3ZSBuZWVkIGZvciBTdW4gU3R1ZGlvLgorIAkjIFN1cHBvcnRlZCBzaW5jZSBTb2xhcmlzIDIuNiAobWF5YmUgMi41LjE/KQorIAljYXNlICR3bGFyYyBpbgorIAknJykKKyAJICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0o9Jy16IGFsbGV4dHJhY3QkY29udmVuaWVuY2UgLXogZGVmYXVsdGV4dHJhY3QnIDs7CisgCSopCisgCSAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfR0NKPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdGBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnIDs7CisgCWVzYWMgOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpbmtfYWxsX2RlcGxpYnNfR0NKPXllcworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCisJIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubworCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgorCWFyY2hpdmVfY21kc19HQ0o9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSj0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0xfR0NKPXllcworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCkKKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisJc25pKQorCSAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgaGFyZGNvZGVfZGlyZWN0X0dDSj15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgcmVsb2FkX2NtZHNfR0NKPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIGFyY2hpdmVfY21kc19HQ0o9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIGhhcmRjb2RlX2RpcmVjdF9HQ0o9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlhcmNoaXZlX2NtZHNfR0NKPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0o9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCWxkX3NobGlic19HQ0o9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCB1bml4d2FyZTcqKQorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS16LHRleHQnCisgICAgICBhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0o9bm8KKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCWFyY2hpdmVfZXhwc3ltX2NtZHNfR0NKPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgbm9fdW5kZWZpbmVkX2ZsYWdfR0NKPScke3dsfS16LHRleHQnCisgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9JyR7d2x9LXosbm9kZWZzJworICAgICAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCisgICAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyX0dDSj1ubworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcl9HQ0o9JzonCisgICAgICBsaW5rX2FsbF9kZXBsaWJzX0dDSj15ZXMKKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0o9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJYXJjaGl2ZV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlhcmNoaXZlX2NtZHNfR0NKPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSj0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgYXJjaGl2ZV9jbWRzX0dDSj0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0o9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXJfR0NKPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIGxkX3NobGlic19HQ0o9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkbGRfc2hsaWJzX0dDSiIgPiY1CitlY2hvICIke0VDSE9fVH0kbGRfc2hsaWJzX0dDSiIgPiY2Cit0ZXN0ICIkbGRfc2hsaWJzX0dDSiIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyMKKyMgRG8gd2UgbmVlZCB0byBleHBsaWNpdGx5IGxpbmsgbGliYz8KKyMKK2Nhc2UgIngkYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKIiBpbgoreHx4eWVzKQorICAjIEFzc3VtZSAtbGMgc2hvdWxkIGJlIGFkZGVkCisgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKKworICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBjYXNlICRhcmNoaXZlX2NtZHNfR0NKIGluCisgICAgKid+JyopCisgICAgICAjIEZJWE1FOiB3ZSBtYXkgaGF2ZSB0byBkZWFsIHdpdGggbXVsdGktY29tbWFuZCBzZXF1ZW5jZXMuCisgICAgICA7OworICAgICckQ0MgJyopCisgICAgICAjIFRlc3Qgd2hldGhlciB0aGUgY29tcGlsZXIgaW1wbGljaXRseSBsaW5rcyB3aXRoIC1sYyBzaW5jZSBvbiBzb21lCisgICAgICAjIHN5c3RlbXMsIC1sZ2NjIGhhcyB0byBjb21lIGJlZm9yZSAtbGMuIElmIGdjYyBhbHJlYWR5IHBhc3NlcyAtbGMKKyAgICAgICMgdG8gbGQsIGRvbid0IGFkZCAtbGMgYmVmb3JlIC1sZ2NjLgorICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbi4uLiAkRUNIT19DIiA+JjYKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIHByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisKKyAgICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgICBkZXBsaWJzPQorICAgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bF9HQ0oKKwlwaWNfZmxhZz0kbHRfcHJvZ19jb21waWxlcl9waWNfR0NKCisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JGFsbG93X3VuZGVmaW5lZF9mbGFnX0dDSgorICAgICAgICBhbGxvd191bmRlZmluZWRfZmxhZ19HQ0o9CisgICAgICAgIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFyY2hpdmVfY21kc19HQ0ogMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMVwiIikgPiY1CisgIChldmFsICRhcmNoaXZlX2NtZHNfR0NKIDJcPlwmMSBcfCBncmVwIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKyAgICAgICAgdGhlbgorCSAgYXJjaGl2ZV9jbWRzX25lZWRfbGNfR0NKPW5vCisgICAgICAgIGVsc2UKKwkgIGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSj15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgICBlbHNlCisgICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgZmkKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFyY2hpdmVfY21kc19uZWVkX2xjX0dDSiIgPiY2CisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKK2VzYWMKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkRUNIT19DIiA+JjYKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJzsnID4vZGV2L251bGwgOyB0aGVuCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgZmkKK2Vsc2UKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliIgorZmkKK25lZWRfbGliX3ByZWZpeD11bmtub3duCitoYXJkY29kZV9pbnRvX2xpYnM9bm8KKworIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCisjIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKK25lZWRfdmVyc2lvbj11bmtub3duCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIDMgaGFzIG5vIHZlcnNpb25pbmcgc3VwcG9ydCwgc28gd2UgYXBwZW5kIGEgbWFqb3IgdmVyc2lvbiB0byB0aGUgbmFtZS4KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgOzsKKworYWl4NCogfCBhaXg1KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuWzAxXSB8IGFpeDQuWzAxXS4qKQorICAgICAgaWYgeyBlY2hvICcjaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk3KScKKwkgICBlY2hvICcgeWVzICcKKwkgICBlY2hvICcjZW5kaWYnOyB9IHwgJHtDQ30gLUUgLSB8IGdyZXAgeWVzID4gL2Rldi9udWxsOyB0aGVuCisJOgorICAgICAgZWxzZQorCWNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgICAjIEFJWCAob24gUG93ZXIqKSBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0CisgICAgIyBzb25hbWUgaW50byBleGVjdXRhYmxlLiBQcm9iYWJseSB3ZSBjYW4gYWRkIHZlcnNpb25pbmcgc3VwcG9ydCB0bworICAgICMgY29sbGVjdDIsIHNvIGFkZGl0aW9uYWwgbGlua3MgY2FuIGJlIHVzZWZ1bCBpbiBmdXR1cmUuCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIElmIHVzaW5nIHJ1biB0aW1lIGxpbmtpbmcgKG9uIEFJWCA0LjIgb3IgbGF0ZXIpIHVzZSBsaWI8bmFtZT4uc28KKyAgICAgICMgaW5zdGVhZCBvZiBsaWI8bmFtZT4uYSB0byBsZXQgcGVvcGxlIGtub3cgdGhhdCB0aGVzZSBhcmUgbm90CisgICAgICAjIHR5cGljYWwgQUlYIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBlbHNlCisgICAgICAjIFdlIHByZXNlcnZlIC5hIGFzIGV4dGVuc2lvbiBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aHJvdWdoIEFJWDQuMgorICAgICAgIyBhbmQgbGF0ZXIgd2hlbiB3ZSBhcmUgbm90IGRvaW5nIHJ1biB0aW1lIGxpbmtpbmcuCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LmEgJGxpYm5hbWUuYScKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZmkKKyAgICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgZmkKKyAgOzsKKworYW1pZ2FvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuaXhsaWJyYXJ5ICRsaWJuYW1lLmEnCisgICMgQ3JlYXRlICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgZW50cmllcyBpbiAvc3lzL2xpYnMuCisgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFteL10qXClcLml4bGlicmFyeSQlXDElJ1wnJ2A7IHRlc3QgJHJtIC9zeXMvbGlicy8ke2xpYm5hbWV9X2l4bGlicmFyeS5hOyAkc2hvdyAiY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSI7IGNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEgfHwgZXhpdCAxOyBkb25lJworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpWzQ1XSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkaG9zdF9vcyBpbgorICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJHJtIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIC9saWIvdzMyYXBpIC9saWIgL3Vzci9sb2NhbC9saWIiCisgICAgICA7OworICAgIG1pbmd3KikKKyAgICAgICMgTWluR1cgRExMcyB1c2UgdHJhZGl0aW9uYWwgJ2xpYicgcHJlZml4CisgICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCBncmVwICJebGlicmFyaWVzOiIgfCAkU0VEIC1lICJzL15saWJyYXJpZXM6Ly8iIC1lICJzLD0vLC8sZyJgCisgICAgICBpZiBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8IGdyZXAgJztbYy16Qy1aXTovJyA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQorICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCisgICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKKyAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAorICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCisgICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKworICAqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1suXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUubGliJworICAgIDs7CisgIGVzYWMKKyAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKKyAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCisgIHNobGlicGF0aF92YXI9UEFUSAorICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZHlsZCIKKyAgdmVyc2lvbl90eXBlPWRhcndpbgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3ZlcnN1ZmZpeH0kc2hhcmVkX2V4dCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCisgICMgQXBwbGUncyBnY2MgcHJpbnRzICdnY2MgLXByaW50LXNlYXJjaC1kaXJzJyBkb2Vzbid0IG9wZXJhdGUgdGhlIHNhbWUuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgdHIgIlxuIiAiJFBBVEhfU0VQQVJBVE9SIiB8IHNlZCAtZSAncy9saWJyYXJpZXM6L0BsaWJyYXJpZXM6LycgfCB0ciAiQCIgIlxuIiB8IGdyZXAgIl5saWJyYXJpZXM6IiB8IHNlZCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciIC1lICJzLCRQQVRIX1NFUEFSQVRPUiwgLGciIC1lICJzLC4qLCYgL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYixnImAKKyAgZWxzZQorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYicKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbG9jYWwvbGliIC9saWIgL3Vzci9saWInCisgIDs7CisKK2RndXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHNoYXJlZF9leHQnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK2ZyZWVic2QxKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKwora2ZyZWVic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAjIERyYWdvbkZseSBkb2VzIG5vdCBoYXZlIGFvdXQuICBXaGVuL2lmIHRoZXkgaW1wbGVtZW50IGEgbmV3CisgICMgdmVyc2lvbmluZyBtZWNoYW5pc20sIGFkanVzdCB0aGlzLgorICBpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgorICAgIG9iamZvcm1hdD1gL3Vzci9iaW4vb2JqZm9ybWF0YAorICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGZyZWVic2RbMTIzXSopIG9iamZvcm1hdD1hb3V0IDs7CisgICAgKikgb2JqZm9ybWF0PWVsZiA7OworICAgIGVzYWMKKyAgZmkKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuWzAxXSogfCBmcmVlYnNkZWxmMy5bMDFdKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGZyZWVic2QzLlsyLTldKiB8IGZyZWVic2RlbGYzLlsyLTldKiB8IFwKKyAgZnJlZWJzZDQuWzAtNV0gfCBmcmVlYnNkZWxmNC5bMC01XSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4CisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXCQyKSk7IHNraXAgPSAxOyB9IHsgaWYgKCFza2lwKSBwcmludCBcJDA7IHNraXAgPSAwOyB9JyA8IC9ldGMvbGQuc28uY29uZiB8ICRTRUQgLWUgJ3MvIy4qLy87cy9bOiwJXS8gL2c7cy89W149XSokLy87cy89W149IF0qIC8gL2c7L14kL2QnIHwgdHIgJ1xuJyAnICdgCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgJGx0X2xkX2V4dHJhIgorICBmaQorCisgICMgV2UgdXNlZCB0byB0ZXN0IGZvciAvbGliL2xkLnNvLjEgYW5kIGRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyBvbgorICAjIHBvd2VycGMsIGJlY2F1c2UgTWtMaW51eCBvbmx5IHN1cHBvcnRlZCBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlCisgICMgR05VIGR5bmFtaWMgbGlua2VyLiAgU2luY2UgdGhpcyB3YXMgYnJva2VuIHdpdGggY3Jvc3MgY29tcGlsZXJzLAorICAjIG1vc3QgcG93ZXJwYy1saW51eCBib3hlcyBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyB0aGVzZSBkYXlzIGFuZAorICAjIHBlb3BsZSBjYW4gYWx3YXlzIC0tZGlzYWJsZS1zaGFyZWQsIHRoZSB0ZXN0IHdhcyByZW1vdmVkLCBhbmQgd2UKKyAgIyBhc3N1bWUgdGhlIEdOVS9MaW51eCBkeW5hbWljIGxpbmtlciBpcyBpbiB1c2UuCisgIGR5bmFtaWNfbGlua2VyPSdHTlUvTGludXggbGQuc28nCisgIDs7CisKK2tuZXRic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgOzsKKworbmV0YnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworbnRvLXFueCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikgbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBvcGVuYnNkMi5bODldIHwgb3BlbmJzZDIuWzg5XS4qKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworCTs7CisgICAgICAqKQorCXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKwk7OworICAgICAgZXNhYworICBlbHNlCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBmaQorICA7OworCitvczIqKQorICBsaWJuYW1lX3NwZWM9JyRuYW1lJworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9ICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3Ivc2hsaWIgL3Vzci9jY3MvbGliIC91c3IvbGliL2NtcGxycy9jYyAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiAvdmFyL3NobGliIgorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIKKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1CbGFyZ2VkeW5zeW0nCisgICAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorICAgICAgOzsKKyAgICBzaWVtZW5zKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIG1vdG9yb2xhKQorICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvbGliIC91c3IvbGliIC91c3IvY2NzL2xpYicKKyAgICAgIDs7CisgIGVzYWMKKyAgOzsKKworc3lzdjQqTVAqKQorICBpZiB0ZXN0IC1kIC91c3IvbmVjIDt0aGVuCisgICAgdmVyc2lvbl90eXBlPWxpbnV4CisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvcicKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBmaQorICA7OworCitzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqIHwgc3lzdjQqdXcyKikKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtZWxmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIHNjbzMuMnY1KikKKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIC9saWIiCisJOzsKKyAgICBlc2FjCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xpYicKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRkeW5hbWljX2xpbmtlciIgPiY1CitlY2hvICIke0VDSE9fVH0kZHluYW1pY19saW5rZXIiID4mNgordGVzdCAiJGR5bmFtaWNfbGlua2VyIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKwordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IlBBVEggJHNobGlicGF0aF92YXIgJHJ1bnBhdGhfdmFyIgoraWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayBHQ0NfRVhFQ19QUkVGSVggQ09NUElMRVJfUEFUSCBMSUJSQVJZX1BBVEgiCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXMuLi4gJEVDSE9fQyIgPiY2CitoYXJkY29kZV9hY3Rpb25fR0NKPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfR0NKIiB8fCBcCisgICB0ZXN0IC1uICIkcnVucGF0aF92YXJfR0NKIiB8fCBcCisgICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oiID0gIlh5ZXMiIDsgdGhlbgorCisgICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KKyAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdF9HQ0oiICE9IG5vICYmCisgICAgICMgSWYgdGhlIG9ubHkgbWVjaGFuaXNtIHRvIGF2b2lkIGhhcmRjb2RpbmcgaXMgc2hsaWJwYXRoX3Zhciwgd2UKKyAgICAgIyBoYXZlIHRvIHJlbGluaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGxpbmsgd2l0aCBhbiBpbnN0YWxsZWQgbGlicmFyeQorICAgICAjIHdoZW4gd2Ugc2hvdWxkIGJlIGxpbmtpbmcgd2l0aCBhIHlldC10by1iZS1pbnN0YWxsZWQgb25lCisgICAgICMjIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsIEdDSikiICE9IG5vICYmCisgICAgIHRlc3QgIiRoYXJkY29kZV9taW51c19MX0dDSiIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbl9HQ0o9dW5zdXBwb3J0ZWQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGFyZGNvZGVfYWN0aW9uX0dDSiIgPiY1CitlY2hvICIke0VDSE9fVH0kaGFyZGNvZGVfYWN0aW9uX0dDSiIgPiY2CisKK2lmIHRlc3QgIiRoYXJkY29kZV9hY3Rpb25fR0NKIiA9IHJlbGluazsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAorICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcworZmkKKworCisjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgY29tcGlsZXJfR0NKIFwKKyAgICBDQ19HQ0ogXAorICAgIExEX0dDSiBcCisgICAgbHRfcHJvZ19jb21waWxlcl93bF9HQ0ogXAorICAgIGx0X3Byb2dfY29tcGlsZXJfcGljX0dDSiBcCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZ19HQ0ogXAorICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY19HQ0ogXAorICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19HQ0ogXAorICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjX0dDSiBcCisgICAgZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lc19HQ0ogXAorICAgIG9sZF9hcmNoaXZlX2NtZHNfR0NKIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzX0dDSiBcCisgICAgcHJlZGVwX29iamVjdHNfR0NKIFwKKyAgICBwb3N0ZGVwX29iamVjdHNfR0NKIFwKKyAgICBwcmVkZXBzX0dDSiBcCisgICAgcG9zdGRlcHNfR0NKIFwKKyAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfR0NKIFwKKyAgICBhcmNoaXZlX2NtZHNfR0NKIFwKKyAgICBhcmNoaXZlX2V4cHN5bV9jbWRzX0dDSiBcCisgICAgcG9zdGluc3RhbGxfY21kc19HQ0ogXAorICAgIHBvc3R1bmluc3RhbGxfY21kc19HQ0ogXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSiBcCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfR0NKIFwKKyAgICBub191bmRlZmluZWRfZmxhZ19HQ0ogXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX0dDSiBcCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0ogXAorICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKIFwKKyAgICBoYXJkY29kZV9hdXRvbWF0aWNfR0NKIFwKKyAgICBtb2R1bGVfY21kc19HQ0ogXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0ogXAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX0dDSiBcCisgICAgZXhjbHVkZV9leHBzeW1zX0dDSiBcCisgICAgaW5jbHVkZV9leHBzeW1zX0dDSjsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIG9sZF9hcmNoaXZlX2NtZHNfR0NKIHwgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKIHwgXAorICAgIGFyY2hpdmVfY21kc19HQ0ogfCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19HQ0ogfCBcCisgICAgbW9kdWxlX2NtZHNfR0NKIHwgXAorICAgIG1vZHVsZV9leHBzeW1fY21kc19HQ0ogfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfR0NKIHwgXAorICAgIGV4cG9ydF9zeW1ib2xzX2NtZHNfR0NKIHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcJDAgLS1mYWxsYmFjay1lY2hvIicpCisgICAgbHRfZWNobz1gJGVjaG8gIlgkbHRfZWNobyIgfCAkWHNlZCAtZSAncy9cXFxcXFxcJDAgLS1mYWxsYmFjay1lY2hvIiQvJDAgLS1mYWxsYmFjay1lY2hvIi8nYAorICAgIDs7CisgIGVzYWMKKworY2ZnZmlsZT0iJG9maWxlIgorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCisjIExpYnRvb2wgd2FzIGNvbmZpZ3VyZWQgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisKKyMgU2hlbGwgdG8gdXNlIHdoZW4gaW52b2tpbmcgc2hlbGwgc2NyaXB0cy4KK1NIRUxMPSRsdF9TSEVMTAorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCitidWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgorYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9uZWVkX2xjPSRhcmNoaXZlX2NtZHNfbmVlZF9sY19HQ0oKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfR0NKCisKKyMgV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uLgorZmFzdF9pbnN0YWxsPSRlbmFibGVfZmFzdF9pbnN0YWxsCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0kaG9zdF9hbGlhcworaG9zdD0kaG9zdAoraG9zdF9vcz0kaG9zdF9vcworCisjIFRoZSBidWlsZCBzeXN0ZW0uCitidWlsZF9hbGlhcz0kYnVpbGRfYWxpYXMKK2J1aWxkPSRidWlsZAorYnVpbGRfb3M9JGJ1aWxkX29zCisKKyMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorZWNobz0kbHRfZWNobworCisjIFRoZSBhcmNoaXZlci4KK0FSPSRsdF9BUgorQVJfRkxBR1M9JGx0X0FSX0ZMQUdTCisKKyMgQSBDIGNvbXBpbGVyLgorTFRDQz0kbHRfTFRDQworCisjIExUQ0MgY29tcGlsZXIgZmxhZ3MuCitMVENGTEFHUz0kbHRfTFRDRkxBR1MKKworIyBBIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBpbGVyLgorQ0M9JGx0X2NvbXBpbGVyX0dDSgorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kR0NDX0dDSgorCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRF9HQ0oKKworIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgorTE5fUz0kbHRfTE5fUworCisjIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KK05NPSRsdF9OTQorCisjIEEgc3ltYm9sIHN0cmlwcGluZyBwcm9ncmFtCitTVFJJUD0kbHRfU1RSSVAKKworIyBVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zICJmaWxlIgorTUFHSUNfQ01EPSRNQUdJQ19DTUQKKworIyBVc2VkIG9uIGN5Z3dpbjogRExMIGNyZWF0aW9uIHByb2dyYW0uCitETExUT09MPSIkRExMVE9PTCIKKworIyBVc2VkIG9uIGN5Z3dpbjogb2JqZWN0IGR1bXBlci4KK09CSkRVTVA9IiRPQkpEVU1QIgorCisjIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCitBUz0iJEFTIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0kb2JqZGlyCisKKyMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KK3JlbG9hZF9mbGFnPSRsdF9yZWxvYWRfZmxhZworcmVsb2FkX2NtZHM9JGx0X3JlbG9hZF9jbWRzCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3dsX0dDSgorCisjIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KK29iamV4dD0iJGFjX29iamV4dCIKKworIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCitsaWJleHQ9IiRsaWJleHQiCisKKyMgU2hhcmVkIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiLnNvIikuCitzaHJleHRfY21kcz0nJHNocmV4dF9jbWRzJworCisjIEV4ZWN1dGFibGUgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICIiKS4KK2V4ZWV4dD0iJGV4ZWV4dCIKKworIyBBZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIGZvciBidWlsZGluZyBsaWJyYXJ5IG9iamVjdHMuCitwaWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9waWNfR0NKCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19HQ0oKKworIyBNdXN0IHdlIGxvY2sgZmlsZXMgd2hlbiBkb2luZyBjb21waWxhdGlvbj8KK25lZWRfbG9ja3M9JGx0X25lZWRfbG9ja3MKKworIyBEbyB3ZSBuZWVkIHRoZSBsaWIgcHJlZml4IGZvciBtb2R1bGVzPworbmVlZF9saWJfcHJlZml4PSRuZWVkX2xpYl9wcmVmaXgKKworIyBEbyB3ZSBuZWVkIGEgdmVyc2lvbiBmb3IgbGlicmFyaWVzPworbmVlZF92ZXJzaW9uPSRuZWVkX3ZlcnNpb24KKworIyBXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc3VwcG9ydD0kZW5hYmxlX2Rsb3BlbgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKKworIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCitkbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfR0NKCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0kbHRfbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWdfR0NKCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX0dDSgorCisjIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KK3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSRsdF93aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY19HQ0oKKworIyBDb21waWxlciBmbGFnIHRvIGdlbmVyYXRlIHRocmVhZC1zYWZlIG9iamVjdHMuCit0aHJlYWRfc2FmZV9mbGFnX3NwZWM9JGx0X3RocmVhZF9zYWZlX2ZsYWdfc3BlY19HQ0oKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX0dDSgorb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0aW5zdGFsbF9jbWRzCitvbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRsdF9vbGRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfR0NKCisKKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IG9sZC1zdHlsZSBhcmNoaXZlIHRvIGxpbmsgaW5zdGVhZCBvZiBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHM9JGx0X29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzX0dDSgorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX0dDSgorYXJjaGl2ZV9leHBzeW1fY21kcz0kbHRfYXJjaGl2ZV9leHBzeW1fY21kc19HQ0oKK3Bvc3RpbnN0YWxsX2NtZHM9JGx0X3Bvc3RpbnN0YWxsX2NtZHMKK3Bvc3R1bmluc3RhbGxfY21kcz0kbHRfcG9zdHVuaW5zdGFsbF9jbWRzCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhIGxvYWRhYmxlIG1vZHVsZSAoYXNzdW1lZCBzYW1lIGFzIGFib3ZlIGlmIGVtcHR5KQorbW9kdWxlX2NtZHM9JGx0X21vZHVsZV9jbWRzX0dDSgorbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfR0NKCisKKyMgQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzLgorb2xkX3N0cmlwbGliPSRsdF9vbGRfc3RyaXBsaWIKK3N0cmlwbGliPSRsdF9zdHJpcGxpYgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcHJlZGVwX29iamVjdHM9JGx0X3ByZWRlcF9vYmplY3RzX0dDSgorCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBhZnRlciB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwb3N0ZGVwX29iamVjdHM9JGx0X3Bvc3RkZXBfb2JqZWN0c19HQ0oKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X3ByZWRlcHNfR0NKCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3Bvc3RkZXBzPSRsdF9wb3N0ZGVwc19HQ0oKKworIyBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworIyBhIHNoYXJlZCBsaWJyYXJ5LgorY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoPSRsdF9jb21waWxlcl9saWJfc2VhcmNoX3BhdGhfR0NKCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19HQ0oKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9JGx0X25vX3VuZGVmaW5lZF9mbGFnX0dDSgorCisjIENvbW1hbmRzIHVzZWQgdG8gZmluaXNoIGEgbGlidG9vbCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBpbiBhIGRpcmVjdG9yeS4KK2ZpbmlzaF9jbWRzPSRsdF9maW5pc2hfY21kcworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0kbHRfZmluaXNoX2V2YWwKKworIyBUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzLgorZ2xvYmFsX3N5bWJvbF9waXBlPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgorZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wKKworIyBUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIEMgbmFtZSBhZGRyZXNzIHBhaXIKK2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9JHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aAorCisjIEhvdyB0byBoYXJkY29kZSBhIHNoYXJlZCBsaWJyYXJ5IHBhdGggaW50byBhbiBleGVjdXRhYmxlLgoraGFyZGNvZGVfYWN0aW9uPSRoYXJkY29kZV9hY3Rpb25fR0NKCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19HQ0oKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF9HQ0oKKworIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGx0X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JfR0NKCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfR0NKCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MX0dDSgorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgU0hMSUJQQVRIX1ZBUj1ESVIgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvCisjIHRoZSByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj0kaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcl9HQ0oKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19HQ0oKKworIyBWYXJpYWJsZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0cyBhbmQKKyMgcmVzdG9yZWQgYXQgcmVsaW5rIHRpbWUuCit2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluaz0iJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rIgorCisjIFdoZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllcy4KK2xpbmtfYWxsX2RlcGxpYnM9JGxpbmtfYWxsX2RlcGxpYnNfR0NKCisKKyMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfc2VhcmNoX3BhdGhfc3BlYworCisjIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kbHRfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKKworIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgorZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGhfR0NKIgorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19HQ0oKKworIyBUaGUgY29tbWFuZHMgdG8gbGlzdCBleHBvcnRlZCBzeW1ib2xzLgorZXhwb3J0X3N5bWJvbHNfY21kcz0kbHRfZXhwb3J0X3N5bWJvbHNfY21kc19HQ0oKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfZXhjbHVkZV9leHBzeW1zX0dDSgorCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX0dDSgorCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZQorCitfX0VPRl9fCisKKworZWxzZQorICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCisgICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQorICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCisgIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAorICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgorICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKKyAgZmkKK2ZpCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCitDQz0iJGx0X3NhdmVfQ0MiCisKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBSQykKKworCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9cmMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitvYmpleHRfUkM9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9XG4nCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKworIyBJZiBubyBDIGNvbXBpbGVyIHdhcyBzcGVjaWZpZWQsIHVzZSBDQy4KK0xUQ0M9JHtMVENDLSIkQ0MifQorCisjIElmIG5vIEMgY29tcGlsZXIgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIHVzZSBDRkxBR1MuCitMVENGTEFHUz0ke0xUQ0ZMQUdTLSIkQ0ZMQUdTIn0KKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2NvbXBpbGVyPSRDQworCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK3ByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK3ByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKKworCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorQ0M9JHtSQy0id2luZHJlcyJ9Citjb21waWxlcj0kQ0MKK2NvbXBpbGVyX1JDPSRDQworZm9yIGNjX3RlbXAgaW4gJGNvbXBpbGVyIiI7IGRvCisgIGNhc2UgJGNjX3RlbXAgaW4KKyAgICBjb21waWxlIHwgKltcXC9dY29tcGlsZSB8IGNjYWNoZSB8ICpbXFwvXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltcXC9dZGlzdGNjIHwgcHVyaWZ5IHwgKltcXC9dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJGVjaG8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKKworbHRfY3ZfcHJvZ19jb21waWxlcl9jX29fUkM9eWVzCisKKyMgVGhlIGVsc2UgY2xhdXNlIHNob3VsZCBvbmx5IGZpcmUgd2hlbiBib290c3RyYXBwaW5nIHRoZQorIyBsaWJ0b29sIGRpc3RyaWJ1dGlvbiwgb3RoZXJ3aXNlIHlvdSBmb3Jnb3QgdG8gc2hpcCBsdG1haW4uc2gKKyMgd2l0aCB5b3VyIHBhY2thZ2UsIGFuZCB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cyB0aGF0IHRoZXJlIGFyZQorIyBubyBydWxlcyB0byBnZW5lcmF0ZSBsdG1haW4uc2guCitpZiB0ZXN0IC1mICIkbHRtYWluIjsgdGhlbgorICAjIFNlZSBpZiB3ZSBhcmUgcnVubmluZyBvbiB6c2gsIGFuZCBzZXQgdGhlIG9wdGlvbnMgd2hpY2ggYWxsb3cgb3VyIGNvbW1hbmRzIHRocm91Z2gKKyAgIyB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgorICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgIHNldG9wdCBOT19HTE9CX1NVQlNUCisgIGZpCisgICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMgd2hpbGUgYmVpbmcKKyAgIyBjYXJlZnVsIG5vdCB0byBvdmVycXVvdGUgdGhlIEFDX1NVQlNUZWQgdmFsdWVzLiAgV2UgdGFrZSBjb3BpZXMgb2YgdGhlCisgICMgdmFyaWFibGVzIGFuZCBxdW90ZSB0aGUgY29waWVzIGZvciBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdC4KKyAgZm9yIHZhciBpbiBlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIEFSIEFSX0ZMQUdTIEVHUkVQIFJBTkxJQiBMTl9TIExUQ0MgTFRDRkxBR1MgTk0gXAorICAgIFNFRCBTSEVMTCBTVFJJUCBcCisgICAgbGlibmFtZV9zcGVjIGxpYnJhcnlfbmFtZXNfc3BlYyBzb25hbWVfc3BlYyBleHRyYWN0X2V4cHN5bXNfY21kcyBcCisgICAgb2xkX3N0cmlwbGliIHN0cmlwbGliIGZpbGVfbWFnaWNfY21kIGZpbmlzaF9jbWRzIGZpbmlzaF9ldmFsIFwKKyAgICBkZXBsaWJzX2NoZWNrX21ldGhvZCByZWxvYWRfZmxhZyByZWxvYWRfY21kcyBuZWVkX2xvY2tzIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIFwKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcyBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgICBjb21waWxlcl9SQyBcCisgICAgQ0NfUkMgXAorICAgIExEX1JDIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3dsX1JDIFwKKyAgICBsdF9wcm9nX2NvbXBpbGVyX3BpY19SQyBcCisgICAgbHRfcHJvZ19jb21waWxlcl9zdGF0aWNfUkMgXAorICAgIGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX1JDIFwKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWNfUkMgXAorICAgIHRocmVhZF9zYWZlX2ZsYWdfc3BlY19SQyBcCisgICAgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNfUkMgXAorICAgIGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfUkMgXAorICAgIG9sZF9hcmNoaXZlX2NtZHNfUkMgXAorICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNfUkMgXAorICAgIHByZWRlcF9vYmplY3RzX1JDIFwKKyAgICBwb3N0ZGVwX29iamVjdHNfUkMgXAorICAgIHByZWRlcHNfUkMgXAorICAgIHBvc3RkZXBzX1JDIFwKKyAgICBjb21waWxlcl9saWJfc2VhcmNoX3BhdGhfUkMgXAorICAgIGFyY2hpdmVfY21kc19SQyBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19SQyBcCisgICAgcG9zdGluc3RhbGxfY21kc19SQyBcCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzX1JDIFwKKyAgICBvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQyBcCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWdfUkMgXAorICAgIG5vX3VuZGVmaW5lZF9mbGFnX1JDIFwKKyAgICBleHBvcnRfc3ltYm9sc19jbWRzX1JDIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX1JDIFwKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX1JDIFwKKyAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX1JDIFwKKyAgICBoYXJkY29kZV9hdXRvbWF0aWNfUkMgXAorICAgIG1vZHVsZV9jbWRzX1JDIFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfUkMgXAorICAgIGx0X2N2X3Byb2dfY29tcGlsZXJfY19vX1JDIFwKKyAgICBleGNsdWRlX2V4cHN5bXNfUkMgXAorICAgIGluY2x1ZGVfZXhwc3ltc19SQzsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIG9sZF9hcmNoaXZlX2NtZHNfUkMgfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQyB8IFwKKyAgICBhcmNoaXZlX2NtZHNfUkMgfCBcCisgICAgYXJjaGl2ZV9leHBzeW1fY21kc19SQyB8IFwKKyAgICBtb2R1bGVfY21kc19SQyB8IFwKKyAgICBtb2R1bGVfZXhwc3ltX2NtZHNfUkMgfCBcCisgICAgb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNfUkMgfCBcCisgICAgZXhwb3J0X3N5bWJvbHNfY21kc19SQyB8IFwKKyAgICBleHRyYWN0X2V4cHN5bXNfY21kcyB8IHJlbG9hZF9jbWRzIHwgZmluaXNoX2NtZHMgfCBcCisgICAgcG9zdGluc3RhbGxfY21kcyB8IHBvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcyB8IG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgfCBcCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHwgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMpCisgICAgICAjIERvdWJsZS1xdW90ZSBkb3VibGUtZXZhbGVkIHN0cmluZ3MuCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkZG91YmxlX3F1b3RlX3N1YnN0XCIgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiIC1lIFwiXCRkZWxheV92YXJpYWJsZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICAqKQorICAgICAgZXZhbCAibHRfJHZhcj1cXFwiXGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJHNlZF9xdW90ZV9zdWJzdFwiXGBcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBjYXNlICRsdF9lY2hvIGluCisgIConXCQwIC0tZmFsbGJhY2stZWNobyInKQorICAgIGx0X2VjaG89YCRlY2hvICJYJGx0X2VjaG8iIHwgJFhzZWQgLWUgJ3MvXFxcXFxcXCQwIC0tZmFsbGJhY2stZWNobyIkLyQwIC0tZmFsbGJhY2stZWNobyIvJ2AKKyAgICA7OworICBlc2FjCisKK2NmZ2ZpbGU9IiRvZmlsZSIKKworICBjYXQgPDxfX0VPRl9fID4+ICIkY2ZnZmlsZSIKKyMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kYXJjaGl2ZV9jbWRzX25lZWRfbGNfUkMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljCithbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXM9JGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXNfUkMKKworIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCitmYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKKworIyBUaGUgaG9zdCBzeXN0ZW0uCitob3N0X2FsaWFzPSRob3N0X2FsaWFzCitob3N0PSRob3N0Citob3N0X29zPSRob3N0X29zCisKKyMgVGhlIGJ1aWxkIHN5c3RlbS4KK2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworYnVpbGQ9JGJ1aWxkCitidWlsZF9vcz0kYnVpbGRfb3MKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSRsdF9lY2hvCisKKyMgVGhlIGFyY2hpdmVyLgorQVI9JGx0X0FSCitBUl9GTEFHUz0kbHRfQVJfRkxBR1MKKworIyBBIEMgY29tcGlsZXIuCitMVENDPSRsdF9MVENDCisKKyMgTFRDQyBjb21waWxlciBmbGFncy4KK0xUQ0ZMQUdTPSRsdF9MVENGTEFHUworCisjIEEgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGlsZXIuCitDQz0kbHRfY29tcGlsZXJfUkMKKworIyBJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBDIGNvbXBpbGVyPword2l0aF9nY2M9JEdDQ19SQworCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9MRF9SQworCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRsdF9TVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSIkQVMiCisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X2x0X3Byb2dfY29tcGlsZXJfd2xfUkMKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfcGljX1JDCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9sdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb19SQworCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9sdF9wcm9nX2NvbXBpbGVyX3N0YXRpY19SQworCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X2x0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnX1JDCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjX1JDCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X3dob2xlX2FyY2hpdmVfZmxhZ19zcGVjX1JDCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgordGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF90aHJlYWRfc2FmZV9mbGFnX3NwZWNfUkMKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9vbGRfYXJjaGl2ZV9jbWRzX1JDCitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc19SQworCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9vbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kc19SQworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfYXJjaGl2ZV9jbWRzX1JDCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9hcmNoaXZlX2V4cHN5bV9jbWRzX1JDCitwb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKK21vZHVsZV9jbWRzPSRsdF9tb2R1bGVfY21kc19SQworbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9tb2R1bGVfZXhwc3ltX2NtZHNfUkMKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfcHJlZGVwX29iamVjdHNfUkMKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcF9vYmplY3RzPSRsdF9wb3N0ZGVwX29iamVjdHNfUkMKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X3ByZWRlcHNfUkMKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X3Bvc3RkZXBzX1JDCisKKyMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyMgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoX1JDCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9hbGxvd191bmRlZmluZWRfZmxhZ19SQworCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfbm9fdW5kZWZpbmVkX2ZsYWdfUkMKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uX1JDCisKKyMgV2hldGhlciB3ZSBzaG91bGQgaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIGxpYnJhcmllcy4KK2hhcmRjb2RlX2ludG9fbGlicz0kaGFyZGNvZGVfaW50b19saWJzCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0kbHRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19SQworCisjIElmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlIFwkbGliZGlyIGludG8KKyMgYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuIFRoaXMgbXVzdCB3b3JrIGV2ZW4gaWYgXCRsaWJkaXIgZG9lcworIyBub3QgZXhpc3QuCitoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkPSRsdF9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkX1JDCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSRsdF9oYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yX1JDCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfZGlyZWN0PSRoYXJkY29kZV9kaXJlY3RfUkMKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9JGhhcmRjb2RlX21pbnVzX0xfUkMKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JGhhcmRjb2RlX3NobGlicGF0aF92YXJfUkMKKworIyBTZXQgdG8geWVzIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSIGludG8gdGhlIGxpYnJhcnkKKyMgYW5kIGFsbCBzdWJzZXF1ZW50IGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMgbGlua2VkIGFnYWluc3QgaXQuCitoYXJkY29kZV9hdXRvbWF0aWM9JGhhcmRjb2RlX2F1dG9tYXRpY19SQworCisjIFZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorIyByZXN0b3JlZCBhdCByZWxpbmsgdGltZS4KK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsiCisKKyMgV2hldGhlciBsaWJ0b29sIG11c3QgbGluayBhIHByb2dyYW0gYWdhaW5zdCBhbGwgaXRzIGRlcGVuZGVuY3kgbGlicmFyaWVzLgorbGlua19hbGxfZGVwbGlicz0kbGlua19hbGxfZGVwbGlic19SQworCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKworIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KK2ZpeF9zcmNmaWxlX3BhdGg9IiRmaXhfc3JjZmlsZV9wYXRoX1JDIgorCisjIFNldCB0byB5ZXMgaWYgZXhwb3J0ZWQgc3ltYm9scyBhcmUgcmVxdWlyZWQuCithbHdheXNfZXhwb3J0X3N5bWJvbHM9JGFsd2F5c19leHBvcnRfc3ltYm9sc19SQworCisjIFRoZSBjb21tYW5kcyB0byBsaXN0IGV4cG9ydGVkIHN5bWJvbHMuCitleHBvcnRfc3ltYm9sc19jbWRzPSRsdF9leHBvcnRfc3ltYm9sc19jbWRzX1JDCisKKyMgVGhlIGNvbW1hbmRzIHRvIGV4dHJhY3QgdGhlIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK2V4dHJhY3RfZXhwc3ltc19jbWRzPSRsdF9leHRyYWN0X2V4cHN5bXNfY21kcworCisjIFN5bWJvbHMgdGhhdCBzaG91bGQgbm90IGJlIGxpc3RlZCBpbiB0aGUgcHJlbG9hZGVkIHN5bWJvbHMuCitleGNsdWRlX2V4cHN5bXM9JGx0X2V4Y2x1ZGVfZXhwc3ltc19SQworCisjIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZC4KK2luY2x1ZGVfZXhwc3ltcz0kbHRfaW5jbHVkZV9leHBzeW1zX1JDCisKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lCisKK19fRU9GX18KKworCitlbHNlCisgICMgSWYgdGhlcmUgaXMgbm8gTWFrZWZpbGUgeWV0LCB3ZSByZWx5IG9uIGEgbWFrZSBydWxlIHRvIGV4ZWN1dGUKKyAgIyBgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2snIHRvIHJlcnVuIHRoZXNlIHRlc3RzIGFuZCBjcmVhdGUgdGhlCisgICMgbGlidG9vbCBzY3JpcHQgdGhlbi4KKyAgbHRtYWluX2luPWBlY2hvICRsdG1haW4gfCBzZWQgLWUgJ3MvXC5zaCQvLmluLydgCisgIGlmIHRlc3QgLWYgIiRsdG1haW5faW4iOyB0aGVuCisgICAgdGVzdCAtZiBNYWtlZmlsZSAmJiBtYWtlICIkbHRtYWluIgorICBmaQorZmkKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKK0NDPSIkbHRfc2F2ZV9DQyIKKworCTs7CisKKyAgICAgICopCisJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogVW5zdXBwb3J0ZWQgdGFnIG5hbWU6ICR0YWduYW1lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFVuc3VwcG9ydGVkIHRhZyBuYW1lOiAkdGFnbmFtZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQXBwZW5kIHRoZSBuZXcgdGFnIG5hbWUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgICAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSIgOyB0aGVuCisgICAgICBhdmFpbGFibGVfdGFncz0iJGF2YWlsYWJsZV90YWdzICR0YWduYW1lIgorICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKworICAjIE5vdyBzdWJzdGl0dXRlIHRoZSB1cGRhdGVkIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgIGlmIGV2YWwgInNlZCAtZSAncy9eYXZhaWxhYmxlX3RhZ3M9LipcJC9hdmFpbGFibGVfdGFncz1cIiRhdmFpbGFibGVfdGFnc1wiLycgXCIkb2ZpbGVcIiA+IFwiJHtvZmlsZX1UXCIiOyB0aGVuCisgICAgbXYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIKKyAgICBjaG1vZCAreCAiJG9maWxlIgorICBlbHNlCisgICAgcm0gLWYgIiR7b2ZpbGV9VCIKKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1bmFibGUgdG8gdXBkYXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ2dlZCBjb25maWd1cmF0aW9ucy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogdW5hYmxlIHRvIHVwZGF0ZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCitmaQorCisKKworIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAorTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdG1haW4uc2giCisKKyMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCitMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKKworIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Z2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIENDPSRhY19jdF9DQworZWxzZQorICBDQz0iJGFjX2N2X3Byb2dfQ0MiCitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1jYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworICBkb25lCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgZm9yIGFjX3Byb2cgaW4gY2wKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgQ0M9JGFjX2N0X0NDCitmaQorCitmaQorCisKK3Rlc3QgLXogIiRDQyIgJiYgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorZWNobyAiJGFzX21lOiRMSU5FTk86IiBcCisgICAgICJjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK2FjX2NvbXBpbGVyPWBzZXQgWCAkYWNfY29tcGlsZTsgZWNobyAkMmAKK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CithY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjYKK0dDQz1gdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzICYmIGVjaG8geWVzYAorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworQ0ZMQUdTPSItZyIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2NfZyIgPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19zdGRjK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz1ubworYWNfc2F2ZV9DQz0kQ0MKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZDEgaXMgYWRkZWQgdG8gZ2V0CisgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCisgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkMS4gICovCitpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorIyBEb24ndCB0cnkgZ2NjIC1hbnNpOyB0aGF0IHR1cm5zIG9mZiB1c2VmdWwgZXh0ZW5zaW9ucyBhbmQKKyMgYnJlYWtzIHNvbWUgc3lzdGVtcycgaGVhZGVyIGZpbGVzLgorIyBBSVgJCQktcWxhbmdsdmw9YW5zaQorIyBVbHRyaXggYW5kIE9TRi8xCS1zdGQxCisjIEhQLVVYIDEwLjIwIGFuZCBsYXRlcgktQWUKKyMgSFAtVVggb2xkZXIgdmVyc2lvbnMJLUFhIC1EX0hQVVhfU09VUkNFCisjIFNWUjQJCQktWGMgLURfX0VYVEVOU0lPTlNfXworZm9yIGFjX2FyZyBpbiAiIiAtcWxhbmdsdmw9YW5zaSAtc3RkMSAtQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorZG8KKyAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19zdGRjPSRhY19hcmcKK2JyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdC4kYWNfb2JqZXh0CitDQz0kYWNfc2F2ZV9DQworCitmaQorCitjYXNlICJ4JGFjX2N2X3Byb2dfY2Nfc3RkYyIgaW4KKyAgeHx4bm8pCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNiA7OworICAqKQorICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Byb2dfY2Nfc3RkYyIgPiY2CisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19zdGRjIiA7OworZXNhYworCisjIFNvbWUgcGVvcGxlIHVzZSBhIEMrKyBjb21waWxlciB0byBjb21waWxlIEMuICBTaW5jZSB3ZSB1c2UgYGV4aXQnLAorIyBpbiBDKysgd2UgbmVlZCB0byBkZWNsYXJlIGl0LiAgSW4gY2FzZSBzb21lb25lIHVzZXMgdGhlIHNhbWUgY29tcGlsZXIKKyMgZm9yIGJvdGggY29tcGlsaW5nIEMgYW5kIEMrKyB3ZSBuZWVkIHRvIGhhdmUgdGhlIEMrKyBjb21waWxlciBkZWNpZGUKKyMgdGhlIGRlY2xhcmF0aW9uIG9mIGV4aXQsIHNpbmNlIGl0J3MgdGhlIG1vc3QgZGVtYW5kaW5nIGVudmlyb25tZW50LgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisjaWZuZGVmIF9fY3BsdXNwbHVzCisgIGNob2tlIG1lCisjZW5kaWYKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBmb3IgYWNfZGVjbGFyYXRpb24gaW4gXAorICAgJycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCkgdGhyb3cgKCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCkgdGhyb3cgKCk7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7JyBcCisgICAndm9pZCBleGl0IChpbnQpOycKK2RvCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2RlY2xhcmF0aW9uCisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKK2V4aXQgKDQyKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2NvbnRpbnVlCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19kZWNsYXJhdGlvbgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0KgoraWYgdGVzdCAtbiAiJGFjX2RlY2xhcmF0aW9uIjsgdGhlbgorICBlY2hvICcjaWZkZWYgX19jcGx1c3BsdXMnID4+Y29uZmRlZnMuaAorICBlY2hvICRhY19kZWNsYXJhdGlvbiAgICAgID4+Y29uZmRlZnMuaAorICBlY2hvICcjZW5kaWYnICAgICAgICAgICAgID4+Y29uZmRlZnMuaAorZmkKKworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFtaWdhT1MgL0MvaW5zdGFsbCwgd2hpY2ggaW5zdGFsbHMgYm9vdGJsb2NrcyBvbiBmbG9wcHkgZGlzY3MKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYworIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCitjYXNlICRhc19kaXIvIGluCisgIC4vIHwgLi8vIHwgL2NDLyogfCBcCisgIC9ldGMvKiB8IC91c3Ivc2Jpbi8qIHwgL3Vzci9ldGMvKiB8IC9zYmluLyogfCAvdXNyL2Fmc3dzL2Jpbi8qIHwgXAorICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKKyAgL3Vzci91Y2IvKiApIDs7CisgICopCisgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAjIGJ5IGRlZmF1bHQuCisgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisJaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICBicmVhayAzCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIDs7Citlc2FjCitkb25lCisKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAorICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCitpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9MRENGTEFHUz0iJENGTEFHUyAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIgorICAgIENGTEFHUz0iJE9MRENGTEFHUyAtZmV4Y2VwdGlvbnMiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWZleGNlcHRpb25zIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZmV4Y2VwdGlvbnMuLi4gJEVDSE9fQyIgPiY2CisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IENGTEFHUz0iJE9MRENGTEFHUyIKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorICAgIENYWEZMQUdTPWBlY2hvICIkQ0ZMQUdTIiB8IHNlZCAncy8gLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdzdHJpY3QtcHJvdG90eXBlcy8vJ2AKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICBleGl0KDIpOworICBleGl0ICgwKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK19BQ0VPRgorCitmaQorCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9jX2JpZ2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CitpbnQKK21haW4gKCkKK3sKKworI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCisgYm9ndXMgZW5kaWFuIG1hY3JvcworI2VuZGlmCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50CittYWluICgpCit7CisKKyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KKyBub3QgYmlnIGVuZGlhbgorI2VuZGlmCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2NfYmlnZW5kaWFuPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgZWNobyAkYWNfbiAiY3Jvc3MtY29tcGlsaW5nLi4uICIgMj4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KK21haW4gKCkgeworICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisgIHVuaW9uCisgIHsKKyAgICBsb25nIGw7CisgICAgY2hhciBjW3NpemVvZiAobG9uZyldOworICB9IHU7CisgIHUubCA9IDE7CisgIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorYWNfY3ZfY19iaWdlbmRpYW49eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19iaWdlbmRpYW4iID4mNgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgdG8gcHJvYmUgZm9yIGJ5dGUgb3JkZXJpbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB0byBwcm9iZSBmb3IgYnl0ZSBvcmRlcmluZy4uLiAkRUNIT19DIiA+JjYKKworY2F0ID5jb25mdGVzdC5jIDw8RU9GCitzaG9ydCBhc2NpaV9tbVtdID0geyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CitzaG9ydCBhc2NpaV9paVtdID0geyAweDY5NEMsIDB4NTQ1NCwgMHg2NTZDLCAweDZFNDUsIDB4Njk0NCwgMHg2RTYxLCAwIH07Cit2b2lkIF9hc2NpaSgpIHsgY2hhciogcyA9IChjaGFyKikgYXNjaWlfbW07IHMgPSAoY2hhciopIGFzY2lpX2lpOyB9CitzaG9ydCBlYmNkaWNfaWlbXSA9IHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9Oworc2hvcnQgZWJjZGljX21tW10gPSB7IDB4QzJDOSwgMHhDNzg1LCAweDk1QzQsIDB4ODk4MSwgMHg5NUUyLCAweEE4RTIsIDAgfTsKK3ZvaWQgX2ViY2RpYygpIHsgY2hhciogcyA9IChjaGFyKikgZWJjZGljX21tOyBzID0gKGNoYXIqKSBlYmNkaWNfaWk7IH0KK2ludCBtYWluKCkgeyBfYXNjaWkgKCk7IF9lYmNkaWMgKCk7IHJldHVybiAwOyB9CitFT0YKKyBpZiB0ZXN0IC1mIGNvbmZ0ZXN0LmMgOyB0aGVuCisgICAgIGlmICR7Q0MtY2N9IC1jIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QubyAmJiB0ZXN0IC1mIGNvbmZ0ZXN0Lm8gOyB0aGVuCisgICAgICAgIGlmIHRlc3QgYGdyZXAgLWwgQklHZW5EaWFuU3lTIGNvbmZ0ZXN0Lm9gIDsgdGhlbgorICAgICAgICAgICBlY2hvICRhY19uICcgYmlnIGVuZGlhbiBwcm9iZSBPSywgJyAxPiY2CisgICAgICAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworICAgICAgICBmaQorICAgICAgICBpZiB0ZXN0IGBncmVwIC1sIExpVFRsZUVuRGlhbiBjb25mdGVzdC5vYCA7IHRoZW4KKyAgICAgICAgICAgZWNobyAkYWNfbiAnIGxpdHRsZSBlbmRpYW4gcHJvYmUgT0ssICcgMT4mNgorICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllcyA7IHRoZW4KKyAgICAgICAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd247CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCisgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIGVjaG8gJGFjX24gJ2d1ZXNzaW5nIGJpZ2VuZGlhbiAuLi4gICcgPiY2CisgICAgIGZpCisgIGZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19iaWdlbmRpYW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfYmlnZW5kaWFuIiA+JjYKK2ZpCitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorX0FDRU9GCisKKyAgQllURU9SREVSPTQzMjEKK2Vsc2UKKyAgQllURU9SREVSPTEyMzQKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgQllURU9SREVSICRCWVRFT1JERVIKK19BQ0VPRgorCitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdW5rbm93biBlbmRpYW5lc3MgLSBzb3JyeSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bmtub3duIGVuZGlhbmVzcyAtIHNvcnJ5IiA+JjI7fQorICAgeyAoZXhpdCBwbGVhc2UgcHJlLXNldCBhY19jdl9jX2JpZ2VuZGlhbik7IGV4aXQgcGxlYXNlIHByZS1zZXQgYWNfY3ZfY19iaWdlbmRpYW47IH07IH0KK2ZpCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhbiBBTlNJIEMtY29uZm9ybWluZyBjb25zdC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfY19jb25zdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisvKiBGSVhNRTogSW5jbHVkZSB0aGUgY29tbWVudHMgc3VnZ2VzdGVkIGJ5IFBhdWwuICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisgIC8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCisgIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07CisgIGNvbnN0IGNoYXJzZXQgeDsKKyAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciBjb25zdCAqY29uc3QgKmNjcDsKKyAgY2hhciAqKnA7CisgIC8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCisgIHN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKKyAgc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisgIC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4KKyAgICAgYW4gYXJtIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudAorICAgICBleHByZXNzaW9uICovCisgIGNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKKyAgY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworICArK2NjcDsKKyAgcCA9IChjaGFyKiopIGNjcDsKKyAgY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7CisgIHsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgICAgY2hhciAqdDsKKyAgICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICAgKnQrKyA9IDA7CisgIH0KKyAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgICBpbnQgeFtdID0gezI1LCAxN307CisgICAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgICArK2ZvbzsKKyAgfQorICB7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgICBpcHRyIHAgPSAwOworICAgICsrcDsKKyAgfQorICB7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7CisgIH0KKyAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgICBjb25zdCBpbnQgZm9vID0gMTA7CisgIH0KKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb25zdCIgPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgY29uc3QKK19BQ0VPRgorCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaXplX3QuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfc2l6ZV90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworaWYgKChzaXplX3QgKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChzaXplX3QpKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2l6ZV90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NpemVfdCIgPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IHllczsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitfQUNFT0YKKworZmkKKworCisKK2ZvciBhY19mdW5jIGluIG1lbW1vdmUgYmNvcHkKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKK2NoYXIgKCpmKSAoKSA9ICRhY19mdW5jOworI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmICE9ICRhY19mdW5jOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKKworCitmb3IgYWNfaGVhZGVyIGluIGZjbnRsLmggdW5pc3RkLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2Nfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNgorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisgICAgKAorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIGV4cGF0LWJ1Z3NAbGliZXhwYXQub3JnICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgKSB8CisgICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CisKK2ZpCitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG9mZl90Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl90eXBlX29mZl90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK2ludAorbWFpbiAoKQoreworaWYgKChvZmZfdCAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKG9mZl90KSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9vZmZfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9vZmZfdCIgPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBvZmZfdCBsb25nCitfQUNFT0YKKworZmkKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3RkbGliLmggdW5pc3RkLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0KSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbDsgdGhlbgorICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGFjX2NwcF9lcnI9JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcKKyAgICBhY19jcHBfZXJyPSRhY19jcHBfZXJyJGFjX2Nfd2Vycm9yX2ZsYWcKKyAgZWxzZQorICAgIGFjX2NwcF9lcnI9CisgIGZpCitlbHNlCisgIGFjX2NwcF9lcnI9eWVzCitmaQoraWYgdGVzdCAteiAiJGFjX2NwcF9lcnIiOyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNgorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisgICAgKAorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIGV4cGF0LWJ1Z3NAbGliZXhwYXQub3JnICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgKSB8CisgICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICA7OworZXNhYworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1CitlY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CisKK2ZpCitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCitjaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gZiAhPSAkYWNfZnVuYzsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorLyogbWFsbG9jIG1pZ2h0IGhhdmUgYmVlbiByZW5hbWVkIGFzIHJwbF9tYWxsb2MuICovCisjdW5kZWYgbWFsbG9jCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcGFnYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmICFTVERDX0hFQURFUlMgJiYgIUhBVkVfU1RETElCX0gKK2NoYXIgKm1hbGxvYyAoKTsKKyNlbmRpZgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWYgIUhBVkVfR0VUUEFHRVNJWkUKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmICFIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCitpbnQKK21haW4gKCkKK3sKKyAgY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisgIGludCBpLCBwYWdlc2l6ZTsKKyAgaW50IGZkOworCisgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7CisKKyAgLyogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LiAqLworICBkYXRhID0gKGNoYXIgKikgbWFsbG9jIChwYWdlc2l6ZSk7CisgIGlmICghZGF0YSkKKyAgICBleGl0ICgxKTsKKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisgICAgKihkYXRhICsgaSkgPSByYW5kICgpOworICB1bWFzayAoMCk7CisgIGZkID0gY3JlYXQgKCJjb25mdGVzdC5tbWFwIiwgMDYwMCk7CisgIGlmIChmZCA8IDApCisgICAgZXhpdCAoMSk7CisgIGlmICh3cml0ZSAoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKyAgICBleGl0ICgxKTsKKyAgY2xvc2UgKGZkKTsKKworICAvKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2ggYWxyZWFkeSBoYXMKKyAgICAgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLCBhbHNvIG1ha2Ugc3VyZSB0aGF0CisgICAgIHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLiAgKi8KKyAgZmQgPSBvcGVuICgiY29uZnRlc3QubW1hcCIsIE9fUkRXUik7CisgIGlmIChmZCA8IDApCisgICAgZXhpdCAoMSk7CisgIGRhdGEyID0gKGNoYXIgKikgbWFsbG9jICgyICogcGFnZXNpemUpOworICBpZiAoIWRhdGEyKQorICAgIGV4aXQgKDEpOworICBkYXRhMiArPSAocGFnZXNpemUgLSAoKGxvbmcpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworICBpZiAoZGF0YTIgIT0gbW1hcCAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorICAgIGV4aXQgKDEpOworICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKyAgICBpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorICAgICAgZXhpdCAoMSk7CisKKyAgLyogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEgZG8gbm90CisgICAgIHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLiAgKFRoaXMgaXMgYSBidWcgb24KKyAgICAgc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pICAqLworICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKyAgICAqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworICBkYXRhMyA9IChjaGFyICopIG1hbGxvYyAocGFnZXNpemUpOworICBpZiAoIWRhdGEzKQorICAgIGV4aXQgKDEpOworICBpZiAocmVhZCAoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisgICAgZXhpdCAoMSk7CisgIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorICAgIGlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisgICAgICBleGl0ICgxKTsKKyAgY2xvc2UgKGZkKTsKKyAgZXhpdCAoMCk7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK19BQ0VPRgorCitmaQorcm0gLWYgY29uZnRlc3QubW1hcAorCisKK2lmIHRlc3QgIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiA9ICJ5ZXMiOyB0aGVuCisgICAgRklMRU1BUD11bml4ZmlsZW1hcAorZWxzZQorICAgIEZJTEVNQVA9cmVhZGZpbGVtYXAKK2ZpCisKKworCisjIEFDX0NQUF9GVU5DCisjIC0tLS0tLS0tLS0tLS0tLS0tLSAjCisjIENoZWNrcyB0byBzZWUgaWYgQU5TSSBDOTkgQ1BQIHZhcmlhYmxlIF9fZnVuY19fIHdvcmtzLgorIyBJZiBub3QsIHBlcmhhcHMgX19GVU5DVElPTl9fIHdvcmtzIGluc3RlYWQuCisjIElmIG5vdCwgd2UnbGwganVzdCBkZWZpbmUgX19mdW5jX18gdG8gIiIuCisjIEFDX0NQUF9GVU5DCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhbiBBTlNJIEM5OS1jb25mb3JtaW5nIF9fZnVuY19fIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQzk5LWNvbmZvcm1pbmcgX19mdW5jX18uLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2NwcF9mdW5jK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK2NoYXIgKmZvbyA9IF9fZnVuY19fOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2NwcF9mdW5jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CitjaGFyICpmb28gPSBfX0ZVTkNUSU9OX187CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfY3BwX2Z1bmM9X19GVU5DVElPTl9fCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2NwcF9mdW5jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY3BwX2Z1bmMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NwcF9mdW5jIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2NwcF9mdW5jID0gX19GVU5DVElPTl9fOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIF9fZnVuY19fIF9fRlVOQ1RJT05fXworX0FDRU9GCisKK2VsaWYgdGVzdCAkYWNfY3ZfY3BwX2Z1bmMgPSBubzsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBfX2Z1bmNfXyAiIgorX0FDRU9GCisKK2ZpCisKKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFhNTF9OUyAxCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBYTUxfRFREIDEKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKK19BQ0VPRgorCisKKyAgICAgICAgICBhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUiCisKK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMsIHNlZSBjb25maWd1cmUncyBvcHRpb24gLS1jb25maWctY2FjaGUuCisjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisjIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzLgorCitfQUNFT0YKKworIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCit7CisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICAgKmFjX3NwYWNlPVwgKikKKyAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKKyAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgICAgc2VkIC1uIFwKKwkicy8nLydcXFxcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gXAorCSJzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPVxcMi9wIgorICAgICAgOzsKKyAgICBlc2FjOworfSB8CisgIHNlZCAnCisgICAgIHQgY2xlYXIKKyAgICAgOiBjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIC9eYWNfY3ZfZW52LyFzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKyAgICAgOiBlbmQnID4+Y29uZmNhY2hlCitpZiBkaWZmICRjYWNoZV9maWxlIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCIgJiYgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+JGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworcy86KlwkKHNyY2Rpcik6Ki86LzsKK3MvOipcJHtzcmNkaXJ9OiovOi87CitzLzoqQHNyY2RpckA6Ki86LzsKK3MvXlwoW149XSo9WwkgXSpcKToqL1wxLzsKK3MvOiokLy87CitzL15bXj1dKj1bCSBdKiQvLzsKK30nCitmaQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCithY19saWJvYmpzPQorYWNfbHRsaWJvYmpzPQorZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgYWNfaT1gZWNobyAiJGFjX2kiIHwKKwkgc2VkICdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nYAorICAjIDIuIEFkZCB0aGVtLgorICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyAkYWNfaVwkVS4kYWNfb2JqZXh0IgorICBhY19sdGxpYm9ianM9IiRhY19sdGxpYm9ianMgJGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKKworOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQorY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK2FjX2NzX3JlY2hlY2s9ZmFsc2UKK2FjX2NzX3NpbGVudD1mYWxzZQorU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCitlbGlmIHRlc3QgLW4gIiR7QkFTSF9WRVJTSU9OK3NldH0iICYmIChzZXQgLW8gcG9zaXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBzZXQgLW8gcG9zaXgKK2ZpCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgoraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Vuc2V0PXVuc2V0CitlbHNlCisgIGFzX3Vuc2V0PWZhbHNlCitmaQorCisKKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorJGFzX3Vuc2V0IEVOViBNQUlMIE1BSUxQQVRICitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQorZG8KKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgoraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YCRhc19iYXNlbmFtZSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCkkJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKworCisjIFBBVEggbmVlZHMgQ1IsIGFuZCBMSU5FTk8gbmVlZHMgQ1IgYW5kIFBBVEguCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4JGFzX2xpbmVub18zIiAgPSAieCRhc19saW5lbm9fMiIgIHx8IHsKKyAgIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gcGF0aCBhdCBhbGwKKyAgIyByZWxhdGl2ZSBvciBub3QuCisgIGNhc2UgJDAgaW4KKyAgICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworZG9uZQorCisgICAgICAgOzsKKyAgZXNhYworICAjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisgICMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorICBpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgICAgYXNfbXlzZWxmPSQwCisgIGZpCisgIGlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgcGF0aCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgcGF0aCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorICBjYXNlICRDT05GSUdfU0hFTEwgaW4KKyAgJycpCisgICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisJIGNhc2UgJGFzX2RpciBpbgorCSAvKikKKwkgICBpZiAoIiRhc19kaXIvJGFzX2Jhc2UiIC1jICcKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAnKSAyPi9kZXYvbnVsbDsgdGhlbgorCSAgICAgJGFzX3Vuc2V0IEJBU0hfRU5WIHx8IHRlc3QgIiR7QkFTSF9FTlYrc2V0fSIgIT0gc2V0IHx8IHsgQkFTSF9FTlY9OyBleHBvcnQgQkFTSF9FTlY7IH0KKwkgICAgICRhc191bnNldCBFTlYgfHwgdGVzdCAiJHtFTlYrc2V0fSIgIT0gc2V0IHx8IHsgRU5WPTsgZXhwb3J0IEVOVjsgfQorCSAgICAgQ09ORklHX1NIRUxMPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKwkgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgJHsxKyIkQCJ9CisJICAgZmk7OworCSBlc2FjCisgICAgICAgZG9uZQorZG9uZQorOzsKKyAgZXNhYworCisgICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KKyAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQorICAjIGxpbmUtbnVtYmVyIGxpbmUgYmVmb3JlIGVhY2ggbGluZTsgdGhlIHNlY29uZCAnc2VkJyBkb2VzIHRoZSByZWFsCisgICMgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaCBsaW5lLW51bWJlciBsaW5lCisgICMgd2l0aCB0aGUgbnVtYmVyZWQgbGluZSwgYW5kIGFwcGVuZHMgdHJhaWxpbmcgJy0nIGR1cmluZworICAjIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbCBjYXNlIGF0IGxpbmUgZW5kLgorICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKyAgIyBzZWNvbmQgJ3NlZCcgc2NyaXB0LiAgQmxhbWUgTGVlIEUuIE1jTWFob24gZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBzZWQgJz0nIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgTgorICAgICAgcywkLC0sCisgICAgICA6IGxvb3AKKyAgICAgIHMsXlwoWyckYXNfY3JfZGlnaXRzJ10qXClcKC4qXClbJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXVwpLFwxXDJcMVwzLAorICAgICAgdCBsb29wCisgICAgICBzLC0kLCwKKyAgICAgIHMsXlsnJGFzX2NyX2RpZ2l0cyddKlxuLCwKKyAgICAnID4kYXNfbWUubGluZW5vICYmCisgIGNobW9kICt4ICRhc19tZS5saW5lbm8gfHwKKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2libGUgdG8gdGhpcykuCisgIC4gLi8kYXNfbWUubGluZW5vCisgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorICBleGl0Cit9CisKKworY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KKyAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JworJyBFQ0hPX1Q9JwknIDs7CisgICpjKiwqICApIEVDSE9fTj0tbiBFQ0hPX0M9IEVDSE9fVD0gOzsKKyAgKikgICAgICAgRUNIT19OPSBFQ0hPX0M9J1xjJyBFQ0hPX1Q9IDs7Citlc2FjCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD06CitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRICisKK2V4ZWMgNj4mMQorCisjIE9wZW4gdGhlIGxvZyByZWFsIHNvb24sIHRvIGtlZXAgXCRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLiAgTG9nZ2luZyAtLXZlcnNpb24gZXRjLiBpcyBPSy4KK2V4ZWMgNT4+Y29uZmlnLmxvZworeworICBlY2hvCisgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisjIyBSdW5uaW5nICRhc19tZS4gIyMKK19BU0JPWAorfSA+JjUKK2NhdCA+JjUgPDxfQ1NFT0YKKworVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBleHBhdCAkYXNfbWUgMi4wLjEsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworX0NTRU9GCitlY2hvICJvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAiID4mNQorZWNobyA+JjUKK19BQ0VPRgorCisjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2ZpbGVzIjsgdGhlbgorICBlY2hvICJjb25maWdfZmlsZXM9XCIkYWNfY29uZmlnX2ZpbGVzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfaGVhZGVycyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2hlYWRlcnM9XCIkYWNfY29uZmlnX2hlYWRlcnNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19saW5rcyI7IHRoZW4KKyAgZWNobyAiY29uZmlnX2xpbmtzPVwiJGFjX2NvbmZpZ19saW5rc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2NvbW1hbmRzIjsgdGhlbgorICBlY2hvICJjb25maWdfY29tbWFuZHM9XCIkYWNfY29uZmlnX2NvbW1hbmRzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCitjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisKK1VzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCisKK0NvbmZpZ3VyYXRpb24gZmlsZXM6CiskY29uZmlnX2ZpbGVzCisKK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKKyRjb25maWdfaGVhZGVycworCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorYWNfY3NfdmVyc2lvbj0iXFwKK2V4cGF0IGNvbmZpZy5zdGF0dXMgMi4wLjEKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OSwKKyAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCisKK0NvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKK3NyY2Rpcj0kc3JjZGlyCitJTlNUQUxMPSIkSU5TVEFMTCIKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJ4JDEiIDogJ3hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIngkMSIgOiAneFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgIC0qKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAorICAgICAjIGFyZ3VtZW50cy4KKyAgICAgYWNfb3B0aW9uPSQxCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzKiB8IC1WICkKKyAgICBlY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgMCA7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIiA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgoraWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCisgIGVjaG8gInJ1bm5pbmcgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIGV4ZWMgJFNIRUxMICQwICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCitmaQorCitfQUNFT0YKKworCisKKworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cworZG8KKyAgY2FzZSAiJGFjX2NvbmZpZ190YXJnZXQiIGluCisgICMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorICAiTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworICAiZXhwYXRfY29uZmlnLmgiICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBleHBhdF9jb25maWcuaCIgOzsKKyAgKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHB1dCBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorJGRlYnVnIHx8Cit7CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorCisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKworeworICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIuL2NvbmZzdGF0WFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mc3RhdCQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKQorfSB8fAoreworICAgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorfQorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKworIworIyBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMKKworIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKK2lmIHRlc3QgLW4gIlwkQ09ORklHX0ZJTEVTIjsgdGhlbgorICAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorICBzZWQgJ3MvLEAvQEAvOyBzL0AsL0BALzsgcy8sO3QgdFwkL0A7dCB0LzsgL0A7dCB0XCQvcy9bXFxcXCYsXS9cXFxcJi9nOworICAgcy9AQC8sQC87IHMvQEAvQCwvOyBzL0A7dCB0XCQvLDt0IHQvJyA+XCR0bXAvc3Vicy5zZWQgPDxcXENFT0YKK3MsQFNIRUxMQCwkU0hFTEwsO3QgdAorcyxAUEFUSF9TRVBBUkFUT1JALCRQQVRIX1NFUEFSQVRPUiw7dCB0CitzLEBQQUNLQUdFX05BTUVALCRQQUNLQUdFX05BTUUsO3QgdAorcyxAUEFDS0FHRV9UQVJOQU1FQCwkUEFDS0FHRV9UQVJOQU1FLDt0IHQKK3MsQFBBQ0tBR0VfVkVSU0lPTkAsJFBBQ0tBR0VfVkVSU0lPTiw7dCB0CitzLEBQQUNLQUdFX1NUUklOR0AsJFBBQ0tBR0VfU1RSSU5HLDt0IHQKK3MsQFBBQ0tBR0VfQlVHUkVQT1JUQCwkUEFDS0FHRV9CVUdSRVBPUlQsO3QgdAorcyxAZXhlY19wcmVmaXhALCRleGVjX3ByZWZpeCw7dCB0CitzLEBwcmVmaXhALCRwcmVmaXgsO3QgdAorcyxAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAsJHByb2dyYW1fdHJhbnNmb3JtX25hbWUsO3QgdAorcyxAYmluZGlyQCwkYmluZGlyLDt0IHQKK3MsQHNiaW5kaXJALCRzYmluZGlyLDt0IHQKK3MsQGxpYmV4ZWNkaXJALCRsaWJleGVjZGlyLDt0IHQKK3MsQGRhdGFkaXJALCRkYXRhZGlyLDt0IHQKK3MsQHN5c2NvbmZkaXJALCRzeXNjb25mZGlyLDt0IHQKK3MsQHNoYXJlZHN0YXRlZGlyQCwkc2hhcmVkc3RhdGVkaXIsO3QgdAorcyxAbG9jYWxzdGF0ZWRpckAsJGxvY2Fsc3RhdGVkaXIsO3QgdAorcyxAbGliZGlyQCwkbGliZGlyLDt0IHQKK3MsQGluY2x1ZGVkaXJALCRpbmNsdWRlZGlyLDt0IHQKK3MsQG9sZGluY2x1ZGVkaXJALCRvbGRpbmNsdWRlZGlyLDt0IHQKK3MsQGluZm9kaXJALCRpbmZvZGlyLDt0IHQKK3MsQG1hbmRpckAsJG1hbmRpciw7dCB0CitzLEBidWlsZF9hbGlhc0AsJGJ1aWxkX2FsaWFzLDt0IHQKK3MsQGhvc3RfYWxpYXNALCRob3N0X2FsaWFzLDt0IHQKK3MsQHRhcmdldF9hbGlhc0AsJHRhcmdldF9hbGlhcyw7dCB0CitzLEBERUZTQCwkREVGUyw7dCB0CitzLEBFQ0hPX0NALCRFQ0hPX0MsO3QgdAorcyxARUNIT19OQCwkRUNIT19OLDt0IHQKK3MsQEVDSE9fVEAsJEVDSE9fVCw7dCB0CitzLEBMSUJTQCwkTElCUyw7dCB0CitzLEBidWlsZEAsJGJ1aWxkLDt0IHQKK3MsQGJ1aWxkX2NwdUAsJGJ1aWxkX2NwdSw7dCB0CitzLEBidWlsZF92ZW5kb3JALCRidWlsZF92ZW5kb3IsO3QgdAorcyxAYnVpbGRfb3NALCRidWlsZF9vcyw7dCB0CitzLEBob3N0QCwkaG9zdCw7dCB0CitzLEBob3N0X2NwdUAsJGhvc3RfY3B1LDt0IHQKK3MsQGhvc3RfdmVuZG9yQCwkaG9zdF92ZW5kb3IsO3QgdAorcyxAaG9zdF9vc0AsJGhvc3Rfb3MsO3QgdAorcyxAQ0NALCRDQyw7dCB0CitzLEBDRkxBR1NALCRDRkxBR1MsO3QgdAorcyxATERGTEFHU0AsJExERkxBR1MsO3QgdAorcyxAQ1BQRkxBR1NALCRDUFBGTEFHUyw7dCB0CitzLEBhY19jdF9DQ0AsJGFjX2N0X0NDLDt0IHQKK3MsQEVYRUVYVEAsJEVYRUVYVCw7dCB0CitzLEBPQkpFWFRALCRPQkpFWFQsO3QgdAorcyxARUdSRVBALCRFR1JFUCw7dCB0CitzLEBMTl9TQCwkTE5fUyw7dCB0CitzLEBFQ0hPQCwkRUNITyw7dCB0CitzLEBBUkAsJEFSLDt0IHQKK3MsQGFjX2N0X0FSQCwkYWNfY3RfQVIsO3QgdAorcyxAUkFOTElCQCwkUkFOTElCLDt0IHQKK3MsQGFjX2N0X1JBTkxJQkAsJGFjX2N0X1JBTkxJQiw7dCB0CitzLEBTVFJJUEAsJFNUUklQLDt0IHQKK3MsQGFjX2N0X1NUUklQQCwkYWNfY3RfU1RSSVAsO3QgdAorcyxARExMVE9PTEAsJERMTFRPT0wsO3QgdAorcyxAYWNfY3RfRExMVE9PTEAsJGFjX2N0X0RMTFRPT0wsO3QgdAorcyxAQVNALCRBUyw7dCB0CitzLEBhY19jdF9BU0AsJGFjX2N0X0FTLDt0IHQKK3MsQE9CSkRVTVBALCRPQkpEVU1QLDt0IHQKK3MsQGFjX2N0X09CSkRVTVBALCRhY19jdF9PQkpEVU1QLDt0IHQKK3MsQENQUEAsJENQUCw7dCB0CitzLEBDWFhALCRDWFgsO3QgdAorcyxAQ1hYRkxBR1NALCRDWFhGTEFHUyw7dCB0CitzLEBhY19jdF9DWFhALCRhY19jdF9DWFgsO3QgdAorcyxAQ1hYQ1BQQCwkQ1hYQ1BQLDt0IHQKK3MsQEY3N0AsJEY3Nyw7dCB0CitzLEBGRkxBR1NALCRGRkxBR1MsO3QgdAorcyxAYWNfY3RfRjc3QCwkYWNfY3RfRjc3LDt0IHQKK3MsQExJQlRPT0xALCRMSUJUT09MLDt0IHQKK3MsQExJQkNVUlJFTlRALCRMSUJDVVJSRU5ULDt0IHQKK3MsQExJQlJFVklTSU9OQCwkTElCUkVWSVNJT04sO3QgdAorcyxATElCQUdFQCwkTElCQUdFLDt0IHQKK3MsQElOU1RBTExfUFJPR1JBTUAsJElOU1RBTExfUFJPR1JBTSw7dCB0CitzLEBJTlNUQUxMX1NDUklQVEAsJElOU1RBTExfU0NSSVBULDt0IHQKK3MsQElOU1RBTExfREFUQUAsJElOU1RBTExfREFUQSw7dCB0CitzLEBGSUxFTUFQQCwkRklMRU1BUCw7dCB0CitzLEBMSUJPQkpTQCwkTElCT0JKUyw7dCB0CitzLEBMVExJQk9CSlNALCRMVExJQk9CSlMsO3QgdAorQ0VPRgorCitfQUNFT0YKKworICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyAgIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyAgIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCisgIGFjX21heF9zZWRfbGluZXM9NDgKKyAgYWNfc2VkX2ZyYWc9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCisgIGFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19lbmQ9JGFjX21heF9zZWRfbGluZXMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorICBhY19tb3JlX2xpbmVzPToKKyAgYWNfc2VkX2NtZHM9CisgIHdoaWxlICRhY19tb3JlX2xpbmVzOyBkbworICAgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZWxzZQorICAgICAgc2VkICIke2FjX2VuZH1xIiAkdG1wL3N1YnMuc2VkID4kdG1wL3N1YnMuZnJhZworICAgIGZpCisgICAgaWYgdGVzdCAhIC1zICR0bXAvc3Vicy5mcmFnOyB0aGVuCisgICAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgZWxzZQorICAgICAgIyBUaGUgcHVycG9zZSBvZiB0aGUgbGFiZWwgYW5kIG9mIHRoZSBicmFuY2hpbmcgY29uZGl0aW9uIGlzIHRvCisgICAgICAjIHNwZWVkIHVwIHRoZSBzZWQgcHJvY2Vzc2luZyAoaWYgdGhlcmUgYXJlIG5vIGBAJyBhdCBhbGwsIHRoZXJlCisgICAgICAjIGlzIG5vIG5lZWQgdG8gYnJvd3NlIGFueSBvZiB0aGUgc3Vic3RpdHV0aW9ucykuCisgICAgICAjIFRoZXNlIGFyZSB0aGUgdHdvIGV4dHJhIHNlZCBjb21tYW5kcyBtZW50aW9uZWQgYWJvdmUuCisgICAgICAoZWNobyAnOnQKKyAgL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYicgJiYgY2F0ICR0bXAvc3Vicy5mcmFnKSA+JHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQKKyAgICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKwlhY19zZWRfY21kcz0ic2VkIC1mICR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkIgorICAgICAgZWxzZQorCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBmaQorICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKKyAgICAgIGFjX2JlZz0kYWNfZW5kCisgICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAorICAgIGZpCisgIGRvbmUKKyAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgIGFjX3NlZF9jbWRzPWNhdAorICBmaQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0ZJTEVTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorCWNhdCA+JHRtcC9zdGRpbgorCWFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqICkgICBhY19maWxlX2luPSRhY19maWxlLmluIDs7CisgIGVzYWMKKworICAjIENvbXB1dGUgQHNyY2RpckAsIEB0b3Bfc3JjZGlyQCwgYW5kIEBJTlNUQUxMQCBmb3Igc3ViZGlyZWN0b3JpZXMuCisgIGFjX2Rpcj1gKGRpcm5hbWUgIiRhY19maWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgIHsgaWYgJGFzX21rZGlyX3A7IHRoZW4KKyAgICBta2RpciAtcCAiJGFjX2RpciIKKyAgZWxzZQorICAgIGFzX2Rpcj0iJGFjX2RpciIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICBhY19idWlsZGRpcj0uCisKK2lmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCitlbHNlCisgIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KK2ZpCisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBpZiB0ZXN0IC16ICIkYWNfdG9wX2J1aWxkZGlyIjsgdGhlbgorICAgICAgIGFjX3RvcF9zcmNkaXI9LgorICAgIGVsc2UKKyAgICAgICBhY190b3Bfc3JjZGlyPWBlY2hvICRhY190b3BfYnVpbGRkaXIgfCBzZWQgJ3MsLyQsLCdgCisgICAgZmkgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpciRzcmNkaXIgOzsKK2VzYWMKKworIyBEbyBub3QgdXNlIGBjZCBmb28gJiYgcHdkYCB0byBjb21wdXRlIGFic29sdXRlIHBhdGhzLCBiZWNhdXNlCisjIHRoZSBkaXJlY3RvcmllcyBtYXkgbm90IGV4aXN0LgorY2FzZSBgcHdkYCBpbgorLikgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisqKQorICBjYXNlICIkYWNfZGlyIiBpbgorICAuKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGA7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworICAqKSBhY19hYnNfYnVpbGRkaXI9YHB3ZGAvIiRhY19kaXIiOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisqKQorICBjYXNlICR7YWNfdG9wX2J1aWxkZGlyfS4gaW4KKyAgLikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworICAqKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXIvJHthY190b3BfYnVpbGRkaXJ9Ljs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfc3JjZGlyIGluCisgIC4pIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY19zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworKikKKyAgY2FzZSAkYWNfdG9wX3NyY2RpciBpbgorICAuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisgICopIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3RvcF9zcmNkaXI7OworICBlc2FjOzsKK2VzYWMKKworCisgIGNhc2UgJElOU1RBTEwgaW4KKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworICAqKSBhY19JTlNUQUxMPSRhY190b3BfYnVpbGRkaXIkSU5TVEFMTCA7OworICBlc2FjCisKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgcm0gLWYgIiRhY19maWxlIgorICBmaQorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgorICAgIGNvbmZpZ3VyZV9pbnB1dD0KKyAgZWxzZQorICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAiCisgIGZpCisgIGNvbmZpZ3VyZV9pbnB1dD0kY29uZmlndXJlX2lucHV0IkdlbmVyYXRlZCBmcm9tIGBlY2hvICRhY19maWxlX2luIHwKKwkJCQkgICAgIHNlZCAncywuKi8sLCdgIGJ5IGNvbmZpZ3VyZS4iCisKKyAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKKyAgIyBzcmMgdHJlZS4KKyAgYWNfZmlsZV9pbnB1dHM9YElGUz06CisgICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKKyAgICAgIFtcXC8kXSopCisJICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCisJIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBlY2hvICIkZiI7OworICAgICAgKikgIyBSZWxhdGl2ZQorCSBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKwkgICAjIEJ1aWxkIHRyZWUKKwkgICBlY2hvICIkZiIKKwkgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgorCSAgICMgU291cmNlIHRyZWUKKwkgICBlY2hvICIkc3JjZGlyLyRmIgorCSBlbHNlCisJICAgIyAvZGV2L251bGwgdHJlZQorCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJIGZpOzsKKyAgICAgIGVzYWMKKyAgICBkb25lYCB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyAgc2VkICIkYWNfdnBzdWIKKyRleHRyYXN1YgorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzLEBjb25maWd1cmVfaW5wdXRALCRjb25maWd1cmVfaW5wdXQsO3QgdAorcyxAc3JjZGlyQCwkYWNfc3JjZGlyLDt0IHQKK3MsQGFic19zcmNkaXJALCRhY19hYnNfc3JjZGlyLDt0IHQKK3MsQHRvcF9zcmNkaXJALCRhY190b3Bfc3JjZGlyLDt0IHQKK3MsQGFic190b3Bfc3JjZGlyQCwkYWNfYWJzX3RvcF9zcmNkaXIsO3QgdAorcyxAYnVpbGRkaXJALCRhY19idWlsZGRpciw7dCB0CitzLEBhYnNfYnVpbGRkaXJALCRhY19hYnNfYnVpbGRkaXIsO3QgdAorcyxAdG9wX2J1aWxkZGlyQCwkYWNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQGFic190b3BfYnVpbGRkaXJALCRhY19hYnNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQElOU1RBTExALCRhY19JTlNUQUxMLDt0IHQKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4kdG1wL291dAorICBybSAtZiAkdG1wL3N0ZGluCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBtdiAkdG1wL291dCAkYWNfZmlsZQorICBlbHNlCisgICAgY2F0ICR0bXAvb3V0CisgICAgcm0gLWYgJHRtcC9vdXQKKyAgZmkKKworZG9uZQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKworIworIyBDT05GSUdfSEVBREVSIHNlY3Rpb24uCisjCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyxeXChbCSBdKlwpI1woWwkgXSpkZWZpbmVbCSBdWwkgXSpcKScKK2FjX2RCPSdbCSBdLiokLFwxI1wyJworYWNfZEM9JyAnCithY19kRD0nLDt0JworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzLF5cKFsJIF0qXCkjXChbCSBdKlwpdW5kZWZcKFsJIF1bCSBdKlwpJworYWNfdUI9JyQsXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9Jyw7dCcKKworZm9yIGFjX2ZpbGUgaW4gOiAkQ09ORklHX0hFQURFUlM7IGRvIHRlc3QgIngkYWNfZmlsZSIgPSB4OiAmJiBjb250aW51ZQorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgLSB8ICo6LSB8ICo6LToqICkgIyBpbnB1dCBmcm9tIHN0ZGluCisJY2F0ID4kdG1wL3N0ZGluCisJYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqOiogKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICogKSAgIGFjX2ZpbGVfaW49JGFjX2ZpbGUuaW4gOzsKKyAgZXNhYworCisgIHRlc3QgeCIkYWNfZmlsZSIgIT0geC0gJiYgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKworICAjIEZpcnN0IGxvb2sgZm9yIHRoZSBpbnB1dCBmaWxlcyBpbiB0aGUgYnVpbGQgdHJlZSwgb3RoZXJ3aXNlIGluIHRoZQorICAjIHNyYyB0cmVlLgorICBhY19maWxlX2lucHV0cz1gSUZTPToKKyAgICBmb3IgZiBpbiAkYWNfZmlsZV9pbjsgZG8KKyAgICAgIGNhc2UgJGYgaW4KKyAgICAgIC0pIGVjaG8gJHRtcC9zdGRpbiA7OworICAgICAgW1xcLyRdKikKKwkgIyBBYnNvbHV0ZSAoY2FuJ3QgYmUgRE9TLXN0eWxlLCBhcyBJRlM9OikKKwkgdGVzdCAtZiAiJGYiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJICMgRG8gcXVvdGUgJGYsIHRvIHByZXZlbnQgRE9TIHBhdGhzIGZyb20gYmVpbmcgSUZTJ2QuCisJIGVjaG8gIiRmIjs7CisgICAgICAqKSAjIFJlbGF0aXZlCisJIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorCSAgICMgQnVpbGQgdHJlZQorCSAgIGVjaG8gIiRmIgorCSBlbGlmIHRlc3QgLWYgIiRzcmNkaXIvJGYiOyB0aGVuCisJICAgIyBTb3VyY2UgdHJlZQorCSAgIGVjaG8gIiRzcmNkaXIvJGYiCisJIGVsc2UKKwkgICAjIC9kZXYvbnVsbCB0cmVlCisJICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgZmk7OworICAgICAgZXNhYworICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2VzLgorICBzZWQgJ3MvWwkgXSokLy8nICRhY19maWxlX2lucHV0cyA+JHRtcC9pbgorCitfQUNFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIHR3byBzZWQgc2NyaXB0cywgYGNvbmZ0ZXN0LmRlZmluZXMnIGFuZAorIyBgY29uZnRlc3QudW5kZWZzJywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCisjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBUaGUgZmlyc3QgaGFuZGxlcyBgI2RlZmluZScKKyMgdGVtcGxhdGVzLCBhbmQgdGhlIHNlY29uZCBgI3VuZGVmJyB0ZW1wbGF0ZXMuCisjIEFuZCBmaXJzdDogUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluCisjIGNvbmZpZy5zdGF0dXMuICBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudAorIyBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC51bmRlZnMKKyMgVXNpbmcgYSBoZXJlIGRvY3VtZW50IGluc3RlYWQgb2YgYSBzdHJpbmcgcmVkdWNlcyB0aGUgcXVvdGluZyBuaWdodG1hcmUuCisjIFB1dHRpbmcgY29tbWVudHMgaW4gc2VkIHNjcmlwdHMgaXMgbm90IHBvcnRhYmxlLgorIworIyBgZW5kJyBpcyB1c2VkIHRvIGF2b2lkIHRoYXQgdGhlIHNlY29uZCBtYWluIHNlZCBjb21tYW5kIChtZWFudCBmb3IKKyMgMC1hcnkgQ1BQIG1hY3JvcykgYXBwbGllcyB0byBuLWFyeSBtYWNybyBkZWZpbml0aW9ucy4KKyMgU2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBgY2xlYXInLgorY2F0ID5jb25mZGVmMnNlZC5zZWQgPDxcX0FDRU9GCitzL1tcXCYsXS9cXCYvZworcyxbXFwkYF0sXFwmLGcKK3QgY2xlYXIKKzogY2xlYXIKK3MsXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgKF1bXgkgKF0qXClcKChbXildKilcKVsJIF0qXCguKlwpJCwke2FjX2RBfVwxJHthY19kQn1cMVwyJHthY19kQ31cMyR7YWNfZER9LGdwCit0IGVuZAorcyxeWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSpcKFteCSBdW14JIF0qXClbCSBdKlwoLipcKSQsJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0sZ3AKKzogZW5kCitfQUNFT0YKKyMgSWYgc29tZSBtYWNyb3Mgd2VyZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB0aGVyZSBtaWdodCBiZSBzZXZlcmFsIHRpbWVzCisjIHRoZSBzYW1lICNkZWZpbmVzLCB3aGljaCBpcyB1c2VsZXNzLiAgTmV2ZXJ0aGVsZXNzLCB3ZSBtYXkgbm90IHdhbnQgdG8KKyMgc29ydCB0aGVtLCBzaW5jZSB3ZSB3YW50IHRoZSAqbGFzdCogQUMtREVGSU5FIHRvIGJlIGhvbm9yZWQuCit1bmlxIGNvbmZkZWZzLmggfCBzZWQgLW4gLWYgY29uZmRlZjJzZWQuc2VkID5jb25mdGVzdC5kZWZpbmVzCitzZWQgJ3MvYWNfZC9hY191L2cnIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnVuZGVmcworcm0gLWYgY29uZmRlZjJzZWQuc2VkCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+Y29uZnRlc3QudW5kZWZzIDw8XF9BQ0VPRgorcyxeWwkgXSojWwkgXSp1bmRlZlsJIF1bCSBdKlthLXpBLVpfXVthLXpBLVpfMC05XSosLyogJiAqLywKK19BQ0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24gdGhlIHNpemUKKyMgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28gKDEwMCBjbWRzKS4KK2VjaG8gJyAgIyBIYW5kbGUgYWxsIHRoZSAjZGVmaW5lIHRlbXBsYXRlcyBvbmx5IGlmIG5lY2Vzc2FyeS4nID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgaWYgZ3JlcCAiXlsJIF0qI1sJIF0qZGVmaW5lIiAkdG1wL2luID4vZGV2L251bGw7IHRoZW4nID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgIyBJZiB0aGVyZSBhcmUgbm8gZGVmaW5lcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgaWYvZmknID4+JENPTkZJR19TVEFUVVMKK2VjaG8gJyAgOicgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LmRlZmluZXMgPi9kZXYvbnVsbAorZG8KKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvICR0bXAvZGVmaW5lcy5zZWQuCisgIGVjaG8gJyAgY2F0ID4kdG1wL2RlZmluZXMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjZGVmaW5lJyBsaW5lcy4KKyAgZWNobyAnL15bCSBdKiNbCSBdKmRlZmluZS8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiAkdG1wL2RlZmluZXMuc2VkICR0bXAvaW4gPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvaW4KKyAgbXYgJHRtcC9vdXQgJHRtcC9pbgorJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCitkb25lCitybSAtZiBjb25mdGVzdC5kZWZpbmVzCitlY2hvICcgIGZpICMgZ3JlcCcgPj4kQ09ORklHX1NUQVRVUworZWNobyA+PiRDT05GSUdfU1RBVFVTCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudW5kZWZzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI3VuZGVmIHRlbXBsYXRlcycgPj4kQ09ORklHX1NUQVRVUworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LnVuZGVmcyA+L2Rldi9udWxsCitkbworICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gJHRtcC91bmRlZnMuc2VkLgorICBlY2hvICcgIGNhdCA+JHRtcC91bmRlZnMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUworICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjdW5kZWYnCisgIGVjaG8gJy9eWwkgXSojWwkgXSp1bmRlZi8hYicgPj4kQ09ORklHX1NUQVRVUworICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgorICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnVuZGVmcyA+PiRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mICR0bXAvdW5kZWZzLnNlZCAkdG1wL2luID4kdG1wL291dAorICBybSAtZiAkdG1wL2luCisgIG12ICR0bXAvb3V0ICR0bXAvaW4KKycgPj4kQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudW5kZWZzID5jb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnVuZGVmcworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnVuZGVmcworZG9uZQorcm0gLWYgY29uZnRlc3QudW5kZWZzCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgorICAgIGVjaG8gIi8qIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLyIgPiR0bXAvY29uZmlnLmgKKyAgZWxzZQorICAgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAorICBmaQorICBjYXQgJHRtcC9pbiA+PiR0bXAvY29uZmlnLmgKKyAgcm0gLWYgJHRtcC9pbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgaWYgZGlmZiAkYWNfZmlsZSAkdG1wL2NvbmZpZy5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKK2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIGFjX2Rpcj1gKGRpcm5hbWUgIiRhY19maWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgICB7IGlmICRhc19ta2Rpcl9wOyB0aGVuCisgICAgbWtkaXIgLXAgIiRhY19kaXIiCisgIGVsc2UKKyAgICBhc19kaXI9IiRhY19kaXIiCisgICAgYXNfZGlycz0KKyAgICB3aGlsZSB0ZXN0ICEgLWQgIiRhc19kaXIiOyBkbworICAgICAgYXNfZGlycz0iJGFzX2RpciAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gKGRpcm5hbWUgIiRhc19kaXIiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgZG9uZQorICAgIHRlc3QgISAtbiAiJGFzX2RpcnMiIHx8IG1rZGlyICRhc19kaXJzCisgIGZpIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisKKyAgICAgIHJtIC1mICRhY19maWxlCisgICAgICBtdiAkdG1wL2NvbmZpZy5oICRhY19maWxlCisgICAgZmkKKyAgZWxzZQorICAgIGNhdCAkdG1wL2NvbmZpZy5oCisgICAgcm0gLWYgJHRtcC9jb25maWcuaAorICBmaQorZG9uZQorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorCit7IChleGl0IDApOyBleGl0IDA7IH0KK19BQ0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCisjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCisjIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAorIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCisjIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGFjX2NzX3N1Y2Nlc3M9OgorICBhY19jb25maWdfc3RhdHVzX2FyZ3M9CisgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisgICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCisgIGV4ZWMgNT4vZGV2L251bGwKKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorICBleGVjIDU+PmNvbmZpZy5sb2cKKyAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorZmkKKworCithYnNfc3JjZGlyPSJgY2QgJHNyY2RpciAmJiBwd2RgIgorYWJzX2J1aWxkZGlyPSJgcHdkYCIKK2lmIHRlc3QgIiRhYnNfc3JjZGlyIiAhPSAiJGFic19idWlsZGRpciI7IHRoZW4KKyAgbWFrZSBta2Rpci1pbml0CitmaQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZmlndXJlLmluIGIvZXhwYXQtMi4wLjEvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0YmNiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxNTQgQEAKK2RubCAgIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGZvciBleHBhdAorZG5sICAgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK2RubAorZG5sICAgQ29weXJpZ2h0IDIwMDAgQ2xhcmsgQ29vcGVyCitkbmwKK2RubCAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVYUEFULgorZG5sCitkbmwgICBFWFBBVCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CitkbmwgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgKGJhc2VkIG9uIHRoZSBNSVQvWCBsaWNlbnNlKSBjb250YWluZWQKK2RubCAgIGluIHRoZSBmaWxlIENPUFlJTkcgdGhhdCBjb21lcyB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uLgorZG5sCisKK2RubCBFbnN1cmUgdGhhdCBFeHBhdCBpcyBjb25maWd1cmVkIHdpdGggYXV0b2NvbmYgMi41MiBvciBuZXdlcgorQUNfUFJFUkVRKDIuNTIpCisKK2RubCBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEV4cGF0LCB1c2luZyBtNCdzIGVzeXNjbWQoKSBjb21tYW5kIHRvIHJ1bgorZG5sIHRoZSBjb21tYW5kIGF0IG00LWdlbmVyYXRpb24gdGltZS4gVGhpcyBhbGxvd3MgdXMgdG8gY3JlYXRlIGFuIG00Citkbmwgc3ltYm9sIGhvbGRpbmcgdGhlIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIuIEFDX0lOSVQoKSByZXF1aXJlcyB0aGUKK2RubCB2ZXJzaW9uIG51bWJlciBhdCBtNC10aW1lLCByYXRoZXIgdGhhbiB3aGVuIC4vY29uZmlndXJlIGlzIHJ1biwgc28KK2RubCBhbGwgdGhpcyBtdXN0IGhhcHBlbiBhcyBwYXJ0IG9mIG00LCBub3QgYXMgcGFydCBvZiB0aGUgc2hlbGwgY29kZQorZG5sIGNvbnRhaW5lZCBpbiAuL2NvbmZpZ3VyZS4KK2RubAorZG5sIE5PVEU6IGVzeXNjbWQoKSBpcyBhIEdOVSBNNCBleHRlbnNpb24uIFRodXMsIHdlIHdyYXAgaXQgaW4gYW4gYXBwcm9wcmlhdGUKK2RubCB0ZXN0LiBJIGJlbGlldmUgdGhpcyB0ZXN0IHdpbGwgd29yaywgYnV0IEkgZG9uJ3QgaGF2ZSBhIHBsYWNlIHdpdGggbm9uLQorZG5sIEdOVSBNNCB0byB0ZXN0IGl0IHJpZ2h0IG5vdy4KK2RlZmluZShbZXhwYXRfdmVyc2lvbl0sIGlmZGVmKFtfX2dudV9fXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlc3lzY21kKGNvbmZ0b29scy9nZXQtdmVyc2lvbi5zaCBsaWIvZXhwYXQuaCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzIuMC54XSkpCitBQ19JTklUKGV4cGF0LCBleHBhdF92ZXJzaW9uLCBleHBhdC1idWdzQGxpYmV4cGF0Lm9yZykKK3VuZGVmaW5lKFtleHBhdF92ZXJzaW9uXSkKKworQUNfQ09ORklHX1NSQ0RJUihNYWtlZmlsZS5pbikKK0FDX0NPTkZJR19BVVhfRElSKGNvbmZ0b29scykKKworCitkbmwKK2RubCBJbmNyZW1lbnQgTElCUkVWSVNJT04gaWYgc291cmNlIGNvZGUgaGFzIGNoYW5nZWQgYXQgYWxsCitkbmwKK2RubCBJZiB0aGUgQVBJIGhhcyBjaGFuZ2VkLCBpbmNyZW1lbnQgTElCQ1VSUkVOVCBhbmQgc2V0IExJQlJFVklTSU9OIHRvIDAKK2RubAorZG5sIElmIHRoZSBBUEkgY2hhbmdlcyBjb21wYXRpYmx5IChpLmUuIHNpbXBseSBhZGRpbmcgYSBuZXcgZnVuY3Rpb24KK2RubCB3aXRob3V0IGNoYW5naW5nIG9yIHJlbW92aW5nIGVhcmxpZXIgaW50ZXJmYWNlcyksIHRoZW4gaW5jcmVtZW50IExJQkFHRS4KK2RubCAKK2RubCBJZiB0aGUgQVBJIGNoYW5nZXMgaW5jb21wYXRpYmx5IHNldCBMSUJBR0UgYmFjayB0byAwCitkbmwKKworTElCQ1VSUkVOVD02CitMSUJSRVZJU0lPTj0yCitMSUJBR0U9NQorCitBQ19DT05GSUdfSEVBREVSKGV4cGF0X2NvbmZpZy5oKQorCitzaW5jbHVkZShjb25mdG9vbHMvbGlidG9vbC5tNCkKK3NpbmNsdWRlKGNvbmZ0b29scy9hY19jX2JpZ2VuZGlhbl9jcm9zcy5tNCkKKworQUNfTElCVE9PTF9XSU4zMl9ETEwKK0FDX1BST0dfTElCVE9PTAorCitBQ19TVUJTVChMSUJDVVJSRU5UKQorQUNfU1VCU1QoTElCUkVWSVNJT04pCitBQ19TVUJTVChMSUJBR0UpCisKK2RubCBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfUFJPR19DQworQUNfUFJPR19JTlNUQUxMCisKK2lmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorICAgIGRubAorICAgIGRubCBCZSBjYXJlZnVsIGFib3V0IGFkZGluZyB0aGUgLWZleGNlcHRpb25zIG9wdGlvbjsgc29tZSB2ZXJzaW9ucyBvZgorICAgIGRubCBHQ0MgZG9uJ3Qgc3VwcG9ydCBpdCBhbmQgaXQgY2F1c2VzIGV4dHJhIHdhcm5pbmdzIHRoYXQgYXJlIG9ubHkKKyAgICBkbmwgZGlzdHJhY3Rpbmc7IGF2b2lkLgorICAgIGRubAorICAgIE9MRENGTEFHUz0iJENGTEFHUyAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIgorICAgIENGTEFHUz0iJE9MRENGTEFHUyAtZmV4Y2VwdGlvbnMiCisgICAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgJENDIGFjY2VwdHMgLWZleGNlcHRpb25zKQorICAgIEFDX1RSWV9MSU5LKCAsICwKKyAgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcyksCisgICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubyk7IENGTEFHUz0iJE9MRENGTEFHUyIpCisgICAgQ1hYRkxBR1M9YGVjaG8gIiRDRkxBR1MiIHwgc2VkICdzLyAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzLy8nYAorZmkKKworZG5sIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgorQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCisKK2RubCBOb3RlOiBBdm9pZCB1c2luZyBBQ19DX0JJR0VORElBTiBiZWNhdXNlIGl0IGRvZXMgbm90Citkbmwgd29yayBpbiBhIGNyb3NzIGNvbXBpbGUuCitBQ19DX0JJR0VORElBTl9DUk9TUworCitBQ19DX0NPTlNUCitBQ19UWVBFX1NJWkVfVAorQUNfQ0hFQ0tfRlVOQ1MobWVtbW92ZSBiY29weSkKKworZG5sIE9ubHkgbmVlZGVkIGZvciB4bWx3ZjoKK0FDX0NIRUNLX0hFQURFUlMoZmNudGwuaCB1bmlzdGQuaCkKK0FDX1RZUEVfT0ZGX1QKK0FDX0ZVTkNfTU1BUAorCitpZiB0ZXN0ICIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgPSAieWVzIjsgdGhlbgorICAgIEZJTEVNQVA9dW5peGZpbGVtYXAKK2Vsc2UKKyAgICBGSUxFTUFQPXJlYWRmaWxlbWFwCitmaQorQUNfU1VCU1QoRklMRU1BUCkKKworZG5sIE5lZWRlZCBmb3IgdGhlIHRlc3Qgc3VwcG9ydCBjb2RlOyB0aGlzIHdhcyBmb3VuZCBhdAorZG5sIGh0dHA6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9idWctYXV0b2NvbmYvMjAwMi0wNy9tc2cwMDAyOC5odG1sCisKKyMgQUNfQ1BQX0ZVTkMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIHRvIHNlZSBpZiBBTlNJIEM5OSBDUFAgdmFyaWFibGUgX19mdW5jX18gd29ya3MuCisjIElmIG5vdCwgcGVyaGFwcyBfX0ZVTkNUSU9OX18gd29ya3MgaW5zdGVhZC4gCisjIElmIG5vdCwgd2UnbGwganVzdCBkZWZpbmUgX19mdW5jX18gdG8gIiIuIAorQUNfREVGVU4oW0FDX0NQUF9GVU5DXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDX1NURENdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2ZvciBhbiBBTlNJIEM5OS1jb25mb3JtaW5nIF9fZnVuY19fXSwgYWNfY3ZfY3BwX2Z1bmMsCitbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwKK1tbY2hhciAqZm9vID0gX19mdW5jX187XV0pXSwKKyAgW2FjX2N2X2NwcF9mdW5jPXllc10sIAorICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwKK1tbY2hhciAqZm9vID0gX19GVU5DVElPTl9fO11dKV0sCisgIFthY19jdl9jcHBfZnVuYz1fX0ZVTkNUSU9OX19dLCAKKyAgW2FjX2N2X2NwcF9mdW5jPW5vXSldKV0pCitpZiB0ZXN0ICRhY19jdl9jcHBfZnVuYyA9IF9fRlVOQ1RJT05fXzsgdGhlbgorICBBQ19ERUZJTkUoX19mdW5jX18sX19GVU5DVElPTl9fLAorICAgICAgICAgICAgW0RlZmluZSB0byBfX0ZVTkNUSU9OX18gb3IgIiIgaWYgYF9fZnVuY19fJyBkb2VzIG5vdCBjb25mb3JtIHRvIAorQU5TSSBDLl0pCitlbGlmIHRlc3QgJGFjX2N2X2NwcF9mdW5jID0gbm87IHRoZW4KKyAgQUNfREVGSU5FKF9fZnVuY19fLCIiLAorICAgICAgICAgICAgW0RlZmluZSB0byBfX0ZVTkNUSU9OX18gb3IgIiIgaWYgYF9fZnVuY19fJyBkb2VzIG5vdCBjb25mb3JtIHRvIAorQU5TSSBDLl0pCitmaQorXSkjIEFDX0NQUF9GVU5DCisKK0FDX0NQUF9GVU5DCisKKworZG5sIFNvbWUgYmFzaWMgY29uZmlndXJhdGlvbjoKK0FDX0RFRklORShbWE1MX05TXSwgMSwKKyAgICAgICAgICBbRGVmaW5lIHRvIG1ha2UgWE1MIE5hbWVzcGFjZXMgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUuXSkKK0FDX0RFRklORShbWE1MX0RURF0sIDEsCisgICAgICAgICAgW0RlZmluZSB0byBtYWtlIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS5dKQorQUNfREVGSU5FKFtYTUxfQ09OVEVYVF9CWVRFU10sIDEwMjQsCisgICAgICAgICAgW0RlZmluZSB0byBzcGVjaWZ5IGhvdyBtdWNoIGNvbnRleHQgdG8gcmV0YWluIGFyb3VuZCB0aGUgY3VycmVudCBwYXJzZSBwb2ludC5dKQorCitBQ19DT05GSUdfRklMRVMoTWFrZWZpbGUpCitBQ19PVVRQVVQKKworYWJzX3NyY2Rpcj0iYGNkICRzcmNkaXIgJiYgcHdkYCIKK2Fic19idWlsZGRpcj0iYHB3ZGAiCitpZiB0ZXN0ICIkYWJzX3NyY2RpciIgIT0gIiRhYnNfYnVpbGRkaXIiOyB0aGVuCisgIG1ha2UgbWtkaXItaW5pdAorZmkKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9QcmludFBhdGggYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvUHJpbnRQYXRoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4NTU5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvUHJpbnRQYXRoCkBAIC0wLDAgKzEsMTE2IEBACisjIS9iaW4vc2gKKyMgTG9vayBmb3IgcHJvZ3JhbVtzXSBzb21ld2hlcmUgaW4gJFBBVEguCisjCisjIE9wdGlvbnM6CisjICAtcworIyAgICBEbyBub3QgcHJpbnQgb3V0IGZ1bGwgcGF0aG5hbWUuIChzaWxlbnQpCisjICAtcFBBVEhOQU1FCisjICAgIExvb2sgaW4gUEFUSE5BTUUgaW5zdGVhZCBvZiAkUEFUSAorIworIyBVc2FnZToKKyMgIFByaW50UGF0aCBbLXNdIFstcFBBVEhOQU1FXSBwcm9ncmFtIFtwcm9ncmFtIC4uLl0KKyMKKyMgSW5pdGlhbGx5IHdyaXR0ZW4gYnkgSmltIEphZ2llbHNraSBmb3IgdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIG1lY2hhbmlzbQorIyAgKHdpdGgga3Vkb3MgdG8gS2VybmlnaGFuL1Bpa2UpCisjCisjIFRoaXMgc2NyaXB0IGZhbGxzIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZS4KKyMgU2VlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFCisKKyMjCisjIFNvbWUgImNvbnN0YW50cyIKKyMjCitwYXRobmFtZT0kUEFUSAorZWNobz0ieWVzIgorCisjIworIyBGaW5kIG91dCB3aGF0IE9TIHdlIGFyZSBydW5uaW5nIGZvciBsYXRlciBvbgorIyMKK29zPWAodW5hbWUpIDI+L2Rldi9udWxsYAorCisjIworIyBQYXJzZSBjb21tYW5kIGxpbmUKKyMjCitmb3IgYXJncyBpbiAkKgorZG8KKyAgICBjYXNlICRhcmdzIGluCisJLXMgICkgZWNobz0ibm8iIDs7CisJLXAqICkgcGF0aG5hbWU9ImBlY2hvICRhcmdzIHwgc2VkICdzL14uLi8vJ2AiIDs7CisJKiAgICkgcHJvZ3JhbXM9IiRwcm9ncmFtcyAkYXJncyIgOzsKKyAgICBlc2FjCitkb25lCisKKyMjCisjIE5vdyB3ZSBtYWtlIHRoZSBhZGp1c3RtZW50cyByZXF1aXJlZCBmb3IgT1MvMiBhbmQgZXZlcnlvbmUKKyMgZWxzZSA6KQorIworIyBGaXJzdCBvZiBhbGwsIGFsbCBPUy8yIHByb2dyYW1zIGhhdmUgdGhlICcuZXhlJyBleHRlbnNpb24uCisjIE5leHQsIHdlIGFkanVzdCBQQVRIIChvciB3aGF0IHdhcyBnaXZlbiB0byB1cyBhcyBQQVRIKSB0bworIyBiZSB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBkaXJlY3Rvcmllcy4KKyMgRmluYWxseSwgd2UgdHJ5IHRvIGRldGVybWluZSB0aGUgYmVzdCBmbGFnIHRvIHVzZSBmb3IKKyMgdGVzdC9bXSB0byBsb29rIGZvciBhbiBleGVjdXRhYmxlIGZpbGUuIE9TLzIganVzdCBoYXMgJy1yJworIyBidXQgd2l0aCBvdGhlciBPU3MsIHdlIGRvIHNvbWUgZnVubnkgc3R1ZmYgdG8gY2hlY2sgdG8gc2VlCisjIGlmIHRlc3QvW10ga25vd3MgYWJvdXQgLXgsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgZmxhZy4KKyMjCisKK2lmIFsgIngkb3MiID0gInhPUy8yIiBdCit0aGVuCisgICAgZXh0PSIuZXhlIgorICAgIHBhdGhuYW1lPWBlY2hvIC1FICRwYXRobmFtZSB8CisgICAgIHNlZCAncy9eOy8uOy8KKwkgIHMvOzsvOy47L2cKKwkgIHMvOyQvOy4vCisJICBzLzsvIC9nCisJICBzL1xcXFwvXFwvL2cnIGAKKyAgICB0ZXN0X2V4ZWNfZmxhZz0iLXIiCitlbHNlCisgICAgZXh0PSIiCSMgTm8gZGVmYXVsdCBleHRlbnNpb25zCisgICAgcGF0aG5hbWU9YGVjaG8gJHBhdGhuYW1lIHwKKyAgICAgc2VkICdzL146Ly46LworCSAgcy86Oi86LjovZworCSAgcy86JC86Li8KKwkgIHMvOi8gL2cnIGAKKyAgICAjIEhlcmUgaXMgaG93IHdlIHRlc3QgdG8gc2VlIGlmIHRlc3QvW10gY2FuIGhhbmRsZSAteAorICAgIHRlc3RmaWxlPSJwcC50LiQkIgorCisgICAgY2F0ID4gJHRlc3RmaWxlIDw8RU5EVEVTVAorIyEvYmluL3NoCitpZiBbIC14IC8gXSB8fCBbIC14IC9iaW4gXSB8fCBbIC14IC9iaW4vbHMgXTsgdGhlbgorICAgIGV4aXQgMAorZmkKK2V4aXQgMQorRU5EVEVTVAorCisgICAgaWYgYC9iaW4vc2ggJHRlc3RmaWxlIDI+L2Rldi9udWxsYDsgdGhlbgorCXRlc3RfZXhlY19mbGFnPSIteCIKKyAgICBlbHNlCisJdGVzdF9leGVjX2ZsYWc9Ii1yIgorICAgIGZpCisgICAgcm0gLWYgJHRlc3RmaWxlCitmaQorCitmb3IgcHJvZ3JhbSBpbiAkcHJvZ3JhbXMKK2RvCisgICAgZm9yIHBhdGggaW4gJHBhdGhuYW1lCisgICAgZG8KKwlpZiBbICR0ZXN0X2V4ZWNfZmxhZyAkcGF0aC8ke3Byb2dyYW19JHtleHR9IF0gJiYgXAorCSAgIFsgISAtZCAkcGF0aC8ke3Byb2dyYW19JHtleHR9IF07IHRoZW4KKwkgICAgaWYgWyAieCRlY2hvIiA9ICJ4eWVzIiBdOyB0aGVuCisJCWVjaG8gJHBhdGgvJHtwcm9ncmFtfSR7ZXh0fQorCSAgICBmaQorCSAgICBleGl0IDAKKwlmaQorCisjIE5leHQgdHJ5IHdpdGhvdXQgZXh0ZW5zaW9uIChpZiBvbmUgd2FzIHVzZWQgYWJvdmUpCisJaWYgWyAieCRleHQiICE9ICJ4IiBdOyB0aGVuCisgICAgICAgICAgICBpZiBbICR0ZXN0X2V4ZWNfZmxhZyAkcGF0aC8ke3Byb2dyYW19IF0gJiYgXAorICAgICAgICAgICAgICAgWyAhIC1kICRwYXRoLyR7cHJvZ3JhbX0gXTsgdGhlbgorICAgICAgICAgICAgICAgIGlmIFsgIngkZWNobyIgPSAieHllcyIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBlY2hvICRwYXRoLyR7cHJvZ3JhbX0KKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGV4aXQgMAorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBkb25lCitkb25lCitleGl0IDEKKwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2FjX2NfYmlnZW5kaWFuX2Nyb3NzLm00IGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2FjX2NfYmlnZW5kaWFuX2Nyb3NzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlZDNlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvYWNfY19iaWdlbmRpYW5fY3Jvc3MubTQKQEAgLTAsMCArMSw4MSBAQAorZG5sIEBzeW5vcHNpcyBBQ19DX0JJR0VORElBTl9DUk9TUworZG5sCitkbmwgQ2hlY2sgZW5kaWFuZXNzIGV2ZW4gd2hlbiBjcm9zc2NvbXBpbGluZworZG5sIChwYXJ0aWFsbHkgYmFzZWQgb24gdGhlIG9yaWdpbmFsIEFDX0NfQklHRU5ESUFOKS4KK2RubAorZG5sIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGNyZWF0ZSBhIGJpbmFyeSwgYW5kIGluc3RlYWQgb2YgcnVubmluZworZG5sIHRoZSBiaW5hcnkgaXQgd2lsbCBiZSBncmVwJ2VkIGZvciBzb21lIHN5bWJvbHMgdGhhdCB3aWxsIGxvb2sKK2RubCBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBlbmRpYW5lc3Mgb2YgdGhlIGJpbmFyeS4KK2RubAorZG5sIEB2ZXJzaW9uICRJZDogYWNfY19iaWdlbmRpYW5fY3Jvc3MubTQsdiAxLjIgMjAwMS8xMC8wMSAyMDowMzoxMyBmZHJha2UgRXhwICQKK2RubCBAYXV0aG9yIEd1aWRvIERyYWhlaW0gPGd1aWRvZEBnbXguZGU+CitkbmwKK0FDX0RFRlVOKFtBQ19DX0JJR0VORElBTl9DUk9TU10sCitbQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiwgYWNfY3ZfY19iaWdlbmRpYW4sCitbYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KK0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+XSwgWworI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCisgYm9ndXMgZW5kaWFuIG1hY3JvcworI2VuZGlmXSwgWyMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCitBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPl0sIFsKKyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KKyBub3QgYmlnIGVuZGlhbgorI2VuZGlmXSwgYWNfY3ZfY19iaWdlbmRpYW49eWVzLCBhY19jdl9jX2JpZ2VuZGlhbj1ubyldKQoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCitBQ19UUllfUlVOKFttYWluICgpIHsKKyAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworICB1bmlvbgorICB7CisgICAgbG9uZyBsOworICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKKyAgfSB1OworICB1LmwgPSAxOworICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOworfV0sIGFjX2N2X2NfYmlnZW5kaWFuPW5vLCBhY19jdl9jX2JpZ2VuZGlhbj15ZXMsCitbIGVjaG8gJGFjX24gImNyb3NzLWNvbXBpbGluZy4uLiAiIDI+JkFDX0ZEX01TRyBdKQorZmldKQoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCitBQ19NU0dfQ0hFQ0tJTkcodG8gcHJvYmUgZm9yIGJ5dGUgb3JkZXJpbmcpCitbCitjYXQgPmNvbmZ0ZXN0LmMgPDxFT0YKK3Nob3J0IGFzY2lpX21tW10gPSB7IDB4NDI0OSwgMHg0NzY1LCAweDZFNDQsIDB4Njk2MSwgMHg2RTUzLCAweDc5NTMsIDAgfTsKK3Nob3J0IGFzY2lpX2lpW10gPSB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKK3ZvaWQgX2FzY2lpKCkgeyBjaGFyKiBzID0gKGNoYXIqKSBhc2NpaV9tbTsgcyA9IChjaGFyKikgYXNjaWlfaWk7IH0KK3Nob3J0IGViY2RpY19paVtdID0geyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07CitzaG9ydCBlYmNkaWNfbW1bXSA9IHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9Owordm9pZCBfZWJjZGljKCkgeyBjaGFyKiBzID0gKGNoYXIqKSBlYmNkaWNfbW07IHMgPSAoY2hhciopIGViY2RpY19paTsgfQoraW50IG1haW4oKSB7IF9hc2NpaSAoKTsgX2ViY2RpYyAoKTsgcmV0dXJuIDA7IH0KK0VPRgorXSBpZiB0ZXN0IC1mIGNvbmZ0ZXN0LmMgOyB0aGVuCisgICAgIGlmICR7Q0MtY2N9IC1jIGNvbmZ0ZXN0LmMgLW8gY29uZnRlc3QubyAmJiB0ZXN0IC1mIGNvbmZ0ZXN0Lm8gOyB0aGVuCisgICAgICAgIGlmIHRlc3QgYGdyZXAgLWwgQklHZW5EaWFuU3lTIGNvbmZ0ZXN0Lm9gIDsgdGhlbgorICAgICAgICAgICBlY2hvICRhY19uICcgYmlnIGVuZGlhbiBwcm9iZSBPSywgJyAxPiZBQ19GRF9NU0cKKyAgICAgICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgYGdyZXAgLWwgTGlUVGxlRW5EaWFuIGNvbmZ0ZXN0Lm9gIDsgdGhlbgorICAgICAgICAgICBlY2hvICRhY19uICcgbGl0dGxlIGVuZGlhbiBwcm9iZSBPSywgJyAxPiZBQ19GRF9NU0cKKyAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXMgOyB0aGVuCisgICAgICAgICAgICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhY19jdl9jX2JpZ2VuZGlhbj1ubworICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICBlY2hvICRhY19uICdndWVzc2luZyBiaWdlbmRpYW4gLi4uICAnID4mQUNfRkRfTVNHCisgICAgIGZpCisgIGZpCitBQ19NU0dfUkVTVUxUKCRhY19jdl9jX2JpZ2VuZGlhbikKK2ZpCitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoV09SRFNfQklHRU5ESUFOLCAxLCBbd2hldGhlciBieXRlb3JkZXIgaXMgYmlnZW5kaWFuXSkKKyAgQllURU9SREVSPTQzMjEKK2Vsc2UKKyAgQllURU9SREVSPTEyMzQKK2ZpCitBQ19ERUZJTkVfVU5RVU9URUQoQllURU9SREVSLCAkQllURU9SREVSLCBbMTIzNCA9IExJTF9FTkRJQU4sIDQzMjEgPSBCSUdFTkRJQU5dKQoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCisgIEFDX01TR19FUlJPUih1bmtub3duIGVuZGlhbmVzcyAtIHNvcnJ5LCBwbGVhc2UgcHJlLXNldCBhY19jdl9jX2JpZ2VuZGlhbikKK2ZpCitdKQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2NvbmZpZy5ndWVzcyBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzk2NDgyZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNTAwIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyAgIEluYy4KKwordGltZXN0YW1wPScyMDA2LTA3LTAyJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyIDxwZXJAYm90aG5lci5jb20+LgorIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91CisjIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgYnVpbGQgc3lzdGVtIHR5cGUuCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCWV4aXQgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQorCWVjaG8gYXJtLXVua25vd24tcmlzY29zCisJZXhpdCA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCisJY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCisJICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KikKKwllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqZmFsY29uKjoqTWlOVDoqOiogfCAqZmFsY29uKjoqbWludDoqOiogfCAqZmFsY29uKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgKjoqTWlOVDoqOiogfCAqOiptaW50Oio6KiB8ICo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay11bmtub3duLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAJZXhpdCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCA7OworICAgICo6QUlYOio6WzQ1XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgX19MUDY0X18gPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKKwkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqU1YxOio6KjoqKQorCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgICo6VU5JQ09TL21wOio6KikKKwllY2hvIGNyYXludi1jcmF5LXVuaWNvc21wJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKyAgICAgICAgZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHBjOTgpCisJCWVjaG8gaTM4Ni11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJICAgIGFtZDY0KQorCQllY2hvIHg4Nl82NC11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJICAgICopCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBpKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisgICAgCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCA7OworICAgIHg4NjpJbnRlcml4KjpbMzQ1Nl0qKQorCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBFTTY0VDpJbnRlcml4KjpbMzQ1Nl0qKQorCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQorCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCisJZXhpdCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCA7OworICAgIGFtZDY0OkNZR1dJTio6KjoqIHwgeDg2XzY0OkNZR1dJTio6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCA7OworICAgICo6R05VLyo6KjoqKQorCSMgb3RoZXIgc3lzdGVtcyB3aXRoIEdOVSBsaWJjIGFuZCB1c2VybGFuZAorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWBlY2hvICR7VU5BTUVfU1lTVEVNfSB8IHNlZCAncyxeW14vXSovLCwnIHwgdHIgJ1tBLVpdJyAnW2Etel0nYGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AtZ251CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzCisJI3VuZGVmIG1pcHNlbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPW1pcHNlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwcworCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkNQVS97CisJCXM6IDo6ZworCQlwCisJICAgIH0nYCIKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgbWlwczY0OkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHM2NAorCSN1bmRlZiBtaXBzNjRlbAorCSNpZiBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19NSVBTRUwpIHx8IGRlZmluZWQoX01JUFNFTCkgfHwgZGVmaW5lZChNSVBTRUwpCisJQ1BVPW1pcHM2NGVsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzNjQKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgImAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgc2VkIC1uICcKKwkgICAgL15DUFUveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG9yMzI6TGludXg6KjoqKQorCWVjaG8gb3IzMi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgYWxwaGE6TGludXg6KjoqKQorCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCisJICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OworCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7CisJICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OworCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7CisJICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKKyAgICAgICAgZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgbGQuc28uMSA+L2Rldi9udWxsCisJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0ibGliYzEiIDsgZWxzZSBMSUJDPSIiIDsgZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgKKwlleGl0IDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHZheDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeDg2XzY0OkxpbnV4Oio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKKwkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCisJIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KKwlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAorCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAorCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKKwkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KKwkJCQkgICAgcy8gLiovLworCQkJCSAgICBwJ2AKKyAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgorCSAgZWxmMzItaTM4NikKKwkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKKwkJOzsKKwkgIGEub3V0LWkzODYtbGludXgpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKKwkJZXhpdCA7OworCSAgY29mZi1pMzg2KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCisJCWV4aXQgOzsKKwkgICIiKQorCQkjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkgb3IKKwkJIyBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251b2xkbGQiCisJCWV4aXQgOzsKKwllc2FjCisJIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwkjaWZkZWYgX19FTEZfXworCSMgaWZkZWYgX19HTElCQ19fCisJIyAgaWYgX19HTElCQ19fID49IDIKKwlMSUJDPWdudQorCSMgIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyAgZW5kaWYKKwkjIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyBlbmRpZgorCSNlbHNlCisJI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgfHwgZGVmaW5lZChfX1BHSSkgfHwgZGVmaW5lZChfX1NVTlBST19DKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKQorCUxJQkM9Z251CisJI2Vsc2UKKwlMSUJDPWdudWFvdXQKKwkjZW5kaWYKKwkjZW5kaWYKKwkjaWZkZWYgX19kaWV0bGliY19fCisJTElCQz1kaWV0bGliYworCSNlbmRpZgorRU9GCisJZXZhbCAiYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBzZWQgLW4gJworCSAgICAvXkxJQkMveworCQlzOiA6OmcKKwkJcAorCSAgICB9J2AiCisJdGVzdCB4IiR7TElCQ30iICE9IHggJiYgeworCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iCisJCWV4aXQKKwl9CisJdGVzdCB4IiR7VEVOVEFUSVZFfSIgIT0geCAmJiB7IGVjaG8gIiR7VEVOVEFUSVZFfSI7IGV4aXQ7IH0KKwk7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjpPUy8yOio6KikKKwkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQorCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14CisJZXhpdCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgOzsKKyAgICBpKjg2OmF0aGVvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCisJZXhpdCA7OworICAgIGkqODY6c3lsbGFibGU6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeWxsYWJsZQorCWV4aXQgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDs7CisgICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKKwlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKKwlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQorCWZpCisJZXhpdCA7OworICAgIGkqODY6Kjo1Ols2NzhdKikKKyAgICAJIyBVbml4V2FyZSA3LngsIE9wZW5VTklYIGFuZCBPcGVuU2VydmVyIDYuCisJY2FzZSBgL2Jpbi91bmFtZSAtWCB8IGdyZXAgIl5NYWNoaW5lImAgaW4KKwkgICAgKjQ4NiopCSAgICAgVU5BTUVfTUFDSElORT1pNDg2IDs7CisJICAgICpQZW50aXVtKQkgICAgIFVOQU1FX01BQ0hJTkU9aTU4NiA7OworCSAgICAqUGVudCp8KkNlbGVyb24pIFVOQU1FX01BQ0hJTkU9aTY4NiA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisgICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0CisgICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCisJZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgIFJNKjpTSU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgOzsKKyAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKKwkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCisJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCisJZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbmV3cyo6TkVXUy1PUzo2KjoqKQorCWVjaG8gbWlwcy1zb255LW5ld3NvczYKKwlleGl0IDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCA7OworICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYXBwbGUtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlJoYXBzb2R5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RGFyd2luOio6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgorCWNhc2UgJFVOQU1FX1BST0NFU1NPUiBpbgorCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6Tm9uU3RvcC1VWDoqOiopCisJZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKKwlleGl0IDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UGxhbjk6KjoqKQorCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgorCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2CisJIyBvcGVyYXRpbmcgc3lzdGVtcy4KKwlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgorCSAgICBVTkFNRV9NQUNISU5FPWkzODYKKwllbHNlCisJICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKKwlleGl0IDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgOzsKKyAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAorCWV4aXQgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDs7CisgICAgKjpJVFM6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKKwlleGl0IDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKyAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworZXNhYworCisjZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKKyNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKKworZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorY2F0ID4kZHVtbXkuYyA8PEVPRgorI2lmZGVmIF9TRVFVRU5UXworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorbWFpbiAoKQoreworI2lmIGRlZmluZWQgKHNvbnkpCisjaWYgZGVmaW5lZCAoTUlQU0VCKQorICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAorICAgICBJIGRvbid0IGtub3cuLi4uICAqLworICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCisjaWZkZWYgTkVXU09TNAorICAgICAgICAgICI0IgorI2Vsc2UKKwkgICIiCisjZW5kaWYKKyAgICAgICAgICk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvY2dpLWJpbi92aWV3Y3ZzLypjaGVja291dCovY29uZmlnL2NvbmZpZy9jb25maWcuZ3Vlc3MKK2FuZAorICBodHRwOi8vc2F2YW5uYWguZ251Lm9yZy9jZ2ktYmluL3ZpZXdjdnMvKmNoZWNrb3V0Ki9jb25maWcvY29uZmlnL2NvbmZpZy5zdWIKKworSWYgdGhlIHZlcnNpb24geW91IHJ1biAoJDApIGlzIGFscmVhZHkgdXAgdG8gZGF0ZSwgcGxlYXNlCitzZW5kIHRoZSBmb2xsb3dpbmcgZGF0YSBhbmQgYW55IGluZm9ybWF0aW9uIHlvdSB0aGluayBtaWdodCBiZQorcGVydGluZW50IHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBuZWVkZWQKK2luZm9ybWF0aW9uIHRvIGhhbmRsZSB5b3VyIHN5c3RlbS4KKworY29uZmlnLmd1ZXNzIHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAKKwordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGxgCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGxgCisKK2hvc3RpbmZvICAgICAgICAgICAgICAgPSBgKGhvc3RpbmZvKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGxgCisvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGxgCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbGAKKworVU5BTUVfTUFDSElORSA9ICR7VU5BTUVfTUFDSElORX0KK1VOQU1FX1JFTEVBU0UgPSAke1VOQU1FX1JFTEVBU0V9CitVTkFNRV9TWVNURU0gID0gJHtVTkFNRV9TWVNURU19CitVTkFNRV9WRVJTSU9OID0gJHtVTkFNRV9WRVJTSU9OfQorRU9GCisKK2V4aXQgMQorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvY29uZmlnLnN1YiBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9jb25maWcuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhYjBhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvY29uZmlnLnN1YgpAQCAtMCwwICsxLDE2MTYgQEAKKyMhIC9iaW4vc2gKKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgICBJbmMuCisKK3RpbWVzdGFtcD0nMjAwNi0wOS0yMCcKKworIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCisjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKKyMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCA7OworCisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitjYXNlICQjIGluCisgMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgorICAgIGV4aXQgMTs7CisgMSkgOzsKKyAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBsaW51eC11Y2xpYmMqIHwgXAorICB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworIAktY2hvcnVzcmRiKQorIAkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisgCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCTE3NTBhIHwgNTgwIFwKKwl8IGEyOWsgXAorCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKKwl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAorCXwgYW0zM18yLjAgXAorCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgXAorCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCisJfCBtaXBzMTYgXAorCXwgbWlwczY0IHwgbWlwczY0ZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5pb3MgfCBuaW9zMiBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKKwl8IHB5cmFtaWQgXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSB8IHN0cm9uZ2FybSBcCisJfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAorCXwgdjg1MCB8IHY4NTBlIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhjMTZ4IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKwltczEpCisJCWJhc2ljX21hY2hpbmU9bXQtdW5rbm93bgorCQk7OworCisJIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKKwkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKKwkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCisJaSo4NiB8IHg4Nl82NCkKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJNTgwLSogXAorCXwgYTI5ay0qIFwKKwl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAorCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKKwl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCisJfCBhdnItKiB8IGF2cjMyLSogXAorCXwgYmZpbi0qIHwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAorCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCisJfCBoODMwMC0qIHwgaDg1MDAtKiBcCisJfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdHJvbi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EtKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworICAgIAlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwljOTApCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwljcjE2YykKKwkJYmFzaWNfbWFjaGluZT1jcjE2Yy11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRqZ3BwKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJb3M9LW1zZG9zZGpncHAKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW1zMS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcGVucmlzYyB8IG9wZW5yaXNjLSopCisJCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCisJCTs7CisJb3M0MDApCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LW9zNDAwCisJCTs7CisJT1NFNjgwMDAgfCBvc2U2ODAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCW9zNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQorCQlvcz0tb3M2OGsKKwkJOzsKKwlwYS1oaXRhY2hpKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCXBhcmFnb24pCisJCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAorCQlvcz0tb3NmCisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNjQpCisJCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCisJCTs7CisJc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWM1NHggfCBjNTR4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzU1eCB8IGM1NXgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNnggfCBjNngqKQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCisJICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKKwkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC1uZXdsaWIqIHwgLWxpbnV4LXVjbGliYyogXAorCSAgICAgIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKKwkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAorCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAorCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAorCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKKwkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKKwkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSogXAorCSAgICAgIHwgLXNreW9zKiB8IC1oYWlrdSogfCAtcmRvcyogfCAtdG9wcGVycyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKyAgICAgICAgLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworICAgICAgICAtdHBmKikKKwkJb3M9LXRwZgorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCisJCW9zPS1vc2UKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCW9zPS1taW50CisJCTs7CisJLWFyb3MqKQorCQlvcz0tYXJvcworCQk7OworCS1rYW9zKikKKwkJb3M9LWthb3MKKwkJOzsKKwktenZtb2UpCisJCW9zPS16dm1vZQorCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisgICAgICAgIHNjb3JlLSopCisJCW9zPS1lbGYKKwkJOzsKKyAgICAgICAgc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBjNHgtKiB8IHRpYzR4LSopCisgICAgICAgIAlvcz0tY29mZgorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaGFpa3UpCisJCW9zPS1oYWlrdQorCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisgICAgCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0CisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9leHBhdC5tNCBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9leHBhdC5tNApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNWQ0ODcxCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2V4cGF0Lm00CkBAIC0wLDAgKzEsNDMgQEAKK2RubCBDaGVjayBpZiAtLXdpdGgtZXhwYXRbPVBSRUZJWF0gaXMgc3BlY2lmaWVkIGFuZAorZG5sIEV4cGF0ID49IDEuOTUuMCBpcyBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4KK2RubCBJZiB5ZXMsIHN1YnN0aXR1dGUgRVhQQVRfQ0ZMQUdTLCBFWFBBVF9MSUJTIHdpdGggcmVnYXJkIHRvCitkbmwgdGhlIHNwZWNpZmllZCBQUkVGSVggYW5kIHNldCB3aXRoX2V4cGF0IHRvIFBSRUZJWCwgb3IgJ3llcycgaWYgUFJFRklYCitkbmwgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4gQWxzbyBIQVZFX0xJQkVYUEFULCBIQVZFX0VYUEFUX0ggYXJlIGRlZmluZWQuCitkbmwgSWYgLS13aXRoLWV4cGF0IGhhcyBub3QgYmVlbiBzcGVjaWZpZWQsIHNldCB3aXRoX2V4cGF0IHRvICdubycuCitkbmwgSW4gYWRkaXRpb24sIGFuIEF1dG9tYWtlIGNvbmRpdGlvbmFsIEVYUEFUX0lOU1RBTExFRCBpcyBzZXQgYWNjb3JkaW5nbHkuCitkbmwgVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWRhcHQgYSB3aG9sZSBsb3Qgb2YgcGFja2FnZXMgdGhhdCBoYXZlIGV4cGF0CitkbmwgYnVuZGxlZCBhcyBhIHN0YXRpYyBsaWJyYXJ5LgorQUNfREVGVU4oQU1fV0lUSF9FWFBBVCwKK1sgQUNfQVJHX1dJVEgoZXhwYXQsCisJICAgICAgWyAgLS13aXRoLWV4cGF0PVBSRUZJWCAgICAgVXNlIHN5c3RlbSBFeHBhdCBsaWJyYXJ5XSwKKwkgICAgICAsIHdpdGhfZXhwYXQ9bm8pCisKKyAgQU1fQ09ORElUSU9OQUwoRVhQQVRfSU5TVEFMTEVELCB0ZXN0ICR3aXRoX2V4cGF0ICE9IG5vKQorCisgIEVYUEFUX0NGTEFHUz0KKyAgRVhQQVRfTElCUz0KKyAgaWYgdGVzdCAkd2l0aF9leHBhdCAhPSBubzsgdGhlbgorCWlmIHRlc3QgJHdpdGhfZXhwYXQgIT0geWVzOyB0aGVuCisJCUVYUEFUX0NGTEFHUz0iLUkkd2l0aF9leHBhdC9pbmNsdWRlIgorCQlFWFBBVF9MSUJTPSItTCR3aXRoX2V4cGF0L2xpYiIKKwlmaQorCUFDX0NIRUNLX0xJQihleHBhdCwgWE1MX1BhcnNlckNyZWF0ZSwKKwkJICAgICBbIEVYUEFUX0xJQlM9IiRFWFBBVF9MSUJTIC1sZXhwYXQiCisJCSAgICAgICBleHBhdF9mb3VuZD15ZXMgXSwKKwkJICAgICBbIGV4cGF0X2ZvdW5kPW5vIF0sCisJCSAgICAgIiRFWFBBVF9MSUJTIikKKwlpZiB0ZXN0ICRleHBhdF9mb3VuZCA9IG5vOyB0aGVuCisJCUFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgdGhlIEV4cGF0IGxpYnJhcnldKQorCWZpCisJZXhwYXRfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisJQ0ZMQUdTPSIkQ0ZMQUdTICRFWFBBVF9DRkxBR1MiCisJQUNfQ0hFQ0tfSEVBREVSUyhleHBhdC5oLCAsIGV4cGF0X2ZvdW5kPW5vKQorCWlmIHRlc3QgJGV4cGF0X2ZvdW5kID0gbm87IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCBleHBhdC5oXSkKKwlmaQorCUNGTEFHUz0iJGV4cGF0X3NhdmVfQ0ZMQUdTIgorICBmaQorCisgIEFDX1NVQlNUKEVYUEFUX0NGTEFHUykKKyAgQUNfU1VCU1QoRVhQQVRfTElCUykKK10pCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvZ2V0LXZlcnNpb24uc2ggYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvZ2V0LXZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTcwZTBmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2NvbmZ0b29scy9nZXQtdmVyc2lvbi5zaApAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vc2gKKyMKKyMgVVNBR0U6IGdldC12ZXJzaW9uLnNoIHBhdGgvdG8vZXhwYXQuaAorIworIyBUaGlzIHNjcmlwdCB3aWxsIHByaW50IEV4cGF0J3MgdmVyc2lvbiBudW1iZXIgb24gc3Rkb3V0LiBGb3IgZXhhbXBsZToKKyMKKyMgICAkIC4vY29uZnRvb2xzL2dldC12ZXJzaW9uLnNoIC4vbGliL2V4cGF0LmgKKyMgICAxLjk1LjMKKyMgICAkCisjCisKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgIGVjaG8gIkVSUk9SOiBwYXRobmFtZSBmb3IgZXhwYXQuaCB3YXMgbm90IHByb3ZpZGVkLiIKKyAgZWNobyAiIgorICBlY2hvICJVU0FHRTogJDAgcGF0aC90by9leHBhdC5oIgorICBleGl0IDEKK2ZpCitpZiB0ZXN0ICQjICE9IDE7IHRoZW4KKyAgZWNobyAiRVJST1I6IHRvbyBtYW55IGFyZ3VtZW50cyB3ZXJlIHByb3ZpZGVkLiIKKyAgZWNobyAiIgorICBlY2hvICJVU0FHRTogJDAgcGF0aC90by9leHBhdC5oIgorICBleGl0IDEKK2ZpCisKK2hkcj0iJDEiCitpZiB0ZXN0ICEgLXIgIiRoZHIiOyB0aGVuCisgIGVjaG8gIkVSUk9SOiAnJGhkcicgZG9lcyBub3QgZXhpc3QsIG9yIGlzIG5vdCByZWFkYWJsZS4iCisgIGV4aXQgMQorZmkKKworTUFKT1JfVkVSU0lPTj0iYHNlZCAtbiAtZSAnL01BSk9SX1ZFUlNJT04vcy9bXjAtOV0qLy9ncCcgJGhkcmAiCitNSU5PUl9WRVJTSU9OPSJgc2VkIC1uIC1lICcvTUlOT1JfVkVSU0lPTi9zL1teMC05XSovL2dwJyAkaGRyYCIKK01JQ1JPX1ZFUlNJT049ImBzZWQgLW4gLWUgJy9NSUNST19WRVJTSU9OL3MvW14wLTldKi8vZ3AnICRoZHJgIgorCisjIERldGVybWluZSBob3cgdG8gdGVsbCBlY2hvIG5vdCB0byBwcmludCB0aGUgdHJhaWxpbmcgXG4uIFRoaXMgaXMKKyMgc2ltaWxhciB0byBBdXRvY29uZidzIEBFQ0hPX0NAIGFuZCBARUNIT19OQDsgaG93ZXZlciwgd2UgZG9uJ3QKKyMgIGdlbmVyYXRlIHRoaXMgZmlsZSB2aWEgYXV0b2NvbmYgKGluIGZhY3QsIGdldC12ZXJzaW9uLnNoIGlzIHVzZWQKKyMgdG8gKmNyZWF0ZSogLi9jb25maWd1cmUpLCBzbyB3ZSBqdXN0IGRvIHNvbWV0aGluZyBzaW1pbGFyIGlubGluZS4KK2Nhc2UgYGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDNgLGBlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDNgIGluCisgICpjKiwtbiopIEVDSE9fTj0gRUNIT19DPScKKycgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gOzsKKyAgKikgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIDs7Citlc2FjCisKK2VjaG8gJEVDSE9fTiAiJE1BSk9SX1ZFUlNJT04uJE1JTk9SX1ZFUlNJT04uJE1JQ1JPX1ZFUlNJT04kRUNIT19DIgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2luc3RhbGwtc2ggYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOWRlMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2luc3RhbGwtc2gKQEAgLTAsMCArMSwyNTEgQEAKKyMhL2Jpbi9zaAorIworIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKyMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgorIworIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisjIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisjIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisjIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCisjIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgorCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSIke0RPSVRQUk9HLX0iCisKKworIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK3RyYW5zZm9ybWJhc2VuYW1lPSIiCit0cmFuc2Zvcm1fYXJnPSIiCitpbnN0Y21kPSIkbXZwcm9nIgorY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKK2Nob3duY21kPSIiCitjaGdycGNtZD0iIgorc3RyaXBjbWQ9IiIKK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9IiIKK2RzdD0iIgorZGlyX2FyZz0iIgorCit3aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KKyAgICBjYXNlICQxIGluCisJLWMpIGluc3RjbWQ9IiRjcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1kKSBkaXJfYXJnPXRydWUKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KKwkgICAgdGhlbgorCQlzcmM9JDEKKwkgICAgZWxzZQorCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKKwkJOgorCQlkc3Q9JDEKKwkgICAgZmkKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworICAgIGVzYWMKK2RvbmUKKworaWYgWyB4IiRzcmMiID0geCBdCit0aGVuCisJZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCisJZXhpdCAxCitlbHNlCisJdHJ1ZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KKwlkc3Q9JHNyYworCXNyYz0iIgorCQorCWlmIFsgLWQgJGRzdCBdOyB0aGVuCisJCWluc3RjbWQ9OgorCQljaG1vZGNtZD0iIgorCWVsc2UKKwkJaW5zdGNtZD1ta2RpcgorCWZpCitlbHNlCisKKyMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAorIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKKyMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorCisJaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQorCXRoZW4KKwkJdHJ1ZQorCWVsc2UKKwkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCisJCWV4aXQgMQorCWZpCisJCisJaWYgWyB4IiRkc3QiID0geCBdCisJdGhlbgorCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCisJCWV4aXQgMQorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCisjIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKKworCWlmIFsgLWQgJGRzdCBdCisJdGhlbgorCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAorCWVsc2UKKwkJdHJ1ZQorCWZpCitmaQorCisjIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKK2RzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKKworIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KKyMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAorCisjIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgoraWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCitkZWZhdWx0SUZTPScJCisnCitJRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgorCitvSUZTPSIke0lGU30iCisjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgorSUZTPSclJworc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCitJRlM9IiR7b0lGU30iCisKK3BhdGhjb21wPScnCisKK3doaWxlIFsgJCMgLW5lIDAgXSA7IGRvCisJcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKKwlzaGlmdAorCisJaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7CisgICAgICAgIHRoZW4KKwkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCisJZWxzZQorCQl0cnVlCisJZmkKKworCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCitkb25lCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXQordGhlbgorCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKK2Vsc2UKKworIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCisKKwlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKKwkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQorCWZpCisKKyMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQorCisJaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQl0cnVlCisJZmkKKworIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCisKKwlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKKworIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCisKKwkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKKworCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgorCisjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKKworIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCisjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgorCisJaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKworIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCisJJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKKwkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAorCitmaSAmJgorCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2xpYnRvb2wubTQgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvbGlidG9vbC5tNApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjUzY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2xpYnRvb2wubTQKQEAgLTAsMCArMSw2Mzk3IEBACisjIGxpYnRvb2wubTQgLSBDb25maWd1cmUgbGlidG9vbCBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAtKi1BdXRvY29uZi0qLQorIyMgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUKKyMjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyMgT3JpZ2luYWxseSBieSBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMjCisjIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNDggQUNfUFJPR19MSUJUT09MCisKKworIyBBQ19QUk9WSURFX0lGRUxTRShNQUNSTy1OQU1FLCBJRi1QUk9WSURFRCwgSUYtTk9ULVBST1ZJREVEKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJZiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkIGJ5IEF1dG9jb25mLCBkZWZpbmUgaXQgaGVyZS4KK200X2lmZGVmKFtBQ19QUk9WSURFX0lGRUxTRV0sCisgICAgICAgICBbXSwKKyAgICAgICAgIFttNF9kZWZpbmUoW0FDX1BST1ZJREVfSUZFTFNFXSwKKwkgICAgICAgICBbbTRfaWZkZWYoW0FDX1BST1ZJREVfJDFdLAorCQkgICAgICAgICAgIFskMl0sIFskM10pXSldKQorCisKKyMgQUNfUFJPR19MSUJUT09MCisjIC0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sCitbQUNfUkVRVUlSRShbX0FDX1BST0dfTElCVE9PTF0pZG5sCitkbmwgSWYgQUNfUFJPR19DWFggaGFzIGFscmVhZHkgYmVlbiBleHBhbmRlZCwgcnVuIEFDX0xJQlRPT0xfQ1hYCitkbmwgaW1tZWRpYXRlbHksIG90aGVyd2lzZSwgaG9vayBpdCBpbiBhdCB0aGUgZW5kIG9mIEFDX1BST0dfQ1hYLgorICBBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DWFhdLAorICAgIFtBQ19MSUJUT09MX0NYWF0sCisgICAgW2RlZmluZShbQUNfUFJPR19DWFhdLCBkZWZuKFtBQ19QUk9HX0NYWF0pW0FDX0xJQlRPT0xfQ1hYCisgIF0pXSkKK2RubCBBbmQgYSBzaW1pbGFyIHNldHVwIGZvciBGb3J0cmFuIDc3IHN1cHBvcnQKKyAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRjc3XSwKKyAgICBbQUNfTElCVE9PTF9GNzddLAorICAgIFtkZWZpbmUoW0FDX1BST0dfRjc3XSwgZGVmbihbQUNfUFJPR19GNzddKVtBQ19MSUJUT09MX0Y3NworXSldKQorCitkbmwgUXVvdGUgQV1bTV9QUk9HX0dDSiBzbyB0aGF0IGFjbG9jYWwgZG9lc24ndCBicmluZyBpdCBpbiBuZWVkbGVzc2x5LgorZG5sIElmIGVpdGhlciBBQ19QUk9HX0dDSiBvciBBXVtNX1BST0dfR0NKIGhhdmUgYWxyZWFkeSBiZWVuIGV4cGFuZGVkLCBydW4KK2RubCBBQ19MSUJUT09MX0dDSiBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlLCBob29rIGl0IGluIGF0IHRoZSBlbmQgb2YgYm90aC4KKyAgQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfR0NKXSwKKyAgICBbQUNfTElCVE9PTF9HQ0pdLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sCisgICAgICBbQUNfTElCVE9PTF9HQ0pdLAorICAgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9BQ19QUk9HX0dDSl0sCisJW0FDX0xJQlRPT0xfR0NKXSwKKyAgICAgIFtpZmRlZihbQUNfUFJPR19HQ0pdLAorCSAgICAgW2RlZmluZShbQUNfUFJPR19HQ0pdLCBkZWZuKFtBQ19QUk9HX0dDSl0pW0FDX0xJQlRPT0xfR0NKXSldKQorICAgICAgIGlmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwkgICAgIFtkZWZpbmUoW0FdW01fUFJPR19HQ0pdLCBkZWZuKFtBXVtNX1BST0dfR0NKXSlbQUNfTElCVE9PTF9HQ0pdKV0pCisgICAgICAgaWZkZWYoW0xUX0FDX1BST0dfR0NKXSwKKwkgICAgIFtkZWZpbmUoW0xUX0FDX1BST0dfR0NKXSwKKwkJZGVmbihbTFRfQUNfUFJPR19HQ0pdKVtBQ19MSUJUT09MX0dDSl0pXSldKV0pCitdKV0pIyBBQ19QUk9HX0xJQlRPT0wKKworCisjIF9BQ19QUk9HX0xJQlRPT0wKKyMgLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdLAorW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfQ1hYXSlkbmwKK0FDX0JFRk9SRShbJDBdLFtBQ19MSUJUT09MX0Y3N10pZG5sCitBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9HQ0pdKWRubAorCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCitMSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKKworIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KK0xJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJworQUNfU1VCU1QoTElCVE9PTClkbmwKKworIyBQcmV2ZW50IG11bHRpcGxlIGV4cGFuc2lvbgorZGVmaW5lKFtBQ19QUk9HX0xJQlRPT0xdLCBbXSkKK10pIyBfQUNfUFJPR19MSUJUT09MCisKKworIyBBQ19MSUJUT09MX1NFVFVQCisjIC0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSwKK1tBQ19QUkVSRVEoMi41MClkbmwKK0FDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAorQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKKworQUNfUkVRVUlSRShbQUNfUFJPR19MTl9TXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSlkbmwKKyMgQXV0b2NvbmYgMi4xMydzIEFDX09CSkVYVCBhbmQgQUNfRVhFRVhUIG1hY3JvcyBvbmx5IHdvcmtzIGZvciBDIGNvbXBpbGVycyEKK0FDX1JFUVVJUkUoW0FDX09CSkVYVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19FWEVFWFRdKWRubAorZG5sCisKK0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOCitBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEUKK0FDX0xJQlRPT0xfT0JKRElSCisKK0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAorX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICJYJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IFhzZXQ7IHRoZW4KKyAgICBDT0xMRUNUX05BTUVTPQorICAgIGV4cG9ydCBDT0xMRUNUX05BTUVTCisgIGZpCisgIDs7Citlc2FjCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgMXMvXlgvLycKK1tzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgJFxcXFxdXCkvXFxcMS9nJ10KKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitbZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYFxcXFxdXCkvXFxcMS9nJ10KKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNoZWxsIHZhcmlhYmxlIGluIGEKKyMgZG91YmxlX3F1b3RlX3N1YnN0J2VkIHN0cmluZy4KK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSdzL1xcXFxcXFxcXFxcJC9cXFxcXFwkL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKKyMgQ29uc3RhbnRzOgorcm09InJtIC1mIgorCisjIEdsb2JhbCB2YXJpYWJsZXM6CitkZWZhdWx0X29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKK2x0bWFpbj0iJGFjX2F1eF9kaXIvbHRtYWluLnNoIgorb2ZpbGU9IiRkZWZhdWx0X29maWxlIgord2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworQUNfQ0hFQ0tfVE9PTChBUiwgYXIsIGZhbHNlKQorQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKK0FDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQorCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCisKKyMgU2V0IHNhbmUgZGVmYXVsdHMgZm9yIHZhcmlvdXMgdmFyaWFibGVzCit0ZXN0IC16ICIkQVIiICYmIEFSPWFyCit0ZXN0IC16ICIkQVJfRkxBR1MiICYmIEFSX0ZMQUdTPWNydQordGVzdCAteiAiJEFTIiAmJiBBUz1hcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRMTl9TIiAmJiBMTl9TPSJsbiAtcyIKK3Rlc3QgLXogIiRNQUdJQ19DTUQiICYmIE1BR0lDX0NNRD1maWxlCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCit0ZXN0IC16ICIkU0VEIiAmJiBTRUQ9c2VkCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCit0ZXN0IC16ICIkUkFOTElCIiAmJiBSQU5MSUI9OgordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06Cit0ZXN0IC16ICIkYWNfb2JqZXh0IiAmJiBhY19vYmpleHQ9bworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJG9sZF9kZXBsaWJzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorZmkKKworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIE9ubHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIGZpbGUsIGlmIHRoZSBjaGVjayBtZXRob2QgcmVxdWlyZXMgaXQKK2Nhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCitmaWxlX21hZ2ljKikKKyAgaWYgdGVzdCAiJGZpbGVfbWFnaWNfY21kIiA9ICckTUFHSUNfQ01EJzsgdGhlbgorICAgIEFDX1BBVEhfTUFHSUMKKyAgZmkKKyAgOzsKK2VzYWMKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX0xJQlRPT0xfRExPUEVOXSwgZW5hYmxlX2Rsb3Blbj15ZXMsIGVuYWJsZV9kbG9wZW49bm8pCitBQ19QUk9WSURFX0lGRUxTRShbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorZW5hYmxlX3dpbjMyX2RsbD15ZXMsIGVuYWJsZV93aW4zMl9kbGw9bm8pCisKK0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKKwlbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKK0FDX0FSR19XSVRIKFtwaWNdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLXBpY10sCisJW3RyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIEA8OkBkZWZhdWx0PXVzZSBib3RoQDo+QF0pXSwKKyAgICBbcGljX21vZGU9IiR3aXRodmFsIl0sCisgICAgW3BpY19tb2RlPWRlZmF1bHRdKQordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1kZWZhdWx0CisKKyMgVXNlIEMgZm9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gdGhlIGxpYnRvb2wgc2NyaXB0Cit0YWduYW1lPQorQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCitfTFRfQUNfVEFHQ09ORklHCitdKSMgQUNfTElCVE9PTF9TRVRVUAorCisKKyMgX0xUX0FDX1NZU19DT01QSUxFUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1NZU19DT01QSUxFUl0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisKKyMgSWYgbm8gQyBjb21waWxlciB3YXMgc3BlY2lmaWVkLCB1c2UgQ0MuCitMVENDPSR7TFRDQy0iJENDIn0KKworIyBJZiBubyBDIGNvbXBpbGVyIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCB1c2UgQ0ZMQUdTLgorTFRDRkxBR1M9JHtMVENGTEFHUy0iJENGTEFHUyJ9CisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitjb21waWxlcj0kQ0MKK10pIyBfTFRfQUNfU1lTX0NPTVBJTEVSCisKKworIyBfTFRfQ0NfQkFTRU5BTUUoQ0MpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2FsY3VsYXRlIGNjX2Jhc2VuYW1lLiAgU2tpcCBrbm93biBjb21waWxlciB3cmFwcGVycyBhbmQgY3Jvc3MtcHJlZml4LgorQUNfREVGVU4oW19MVF9DQ19CQVNFTkFNRV0sCitbZm9yIGNjX3RlbXAgaW4gJDEiIjsgZG8KKyAgY2FzZSAkY2NfdGVtcCBpbgorICAgIGNvbXBpbGUgfCAqW1tcXC9dXWNvbXBpbGUgfCBjY2FjaGUgfCAqW1tcXC9dXWNjYWNoZSApIDs7CisgICAgZGlzdGNjIHwgKltbXFwvXV1kaXN0Y2MgfCBwdXJpZnkgfCAqW1tcXC9dXXB1cmlmeSApIDs7CisgICAgXC0qKSA7OworICAgICopIGJyZWFrOzsKKyAgZXNhYworZG9uZQorY2NfYmFzZW5hbWU9YCRlY2hvICJYJGNjX3RlbXAiIHwgJFhzZWQgLWUgJ3MlLiovJSUnIC1lICJzJV4kaG9zdF9hbGlhcy0lJSJgCitdKQorCisKKyMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCitBQ19ERUZVTihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKK1thY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK3ByaW50ZiAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19jb21waWxlIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlPWBjYXQgY29uZnRlc3QuZXJyYAorJHJtIGNvbmZ0ZXN0KgorXSkjIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorCisKKyMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBsaW5rZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBsaW5rIHRlc3QgY29kZS4KK0FDX0RFRlVOKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwKK1thY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK3ByaW50ZiAiJGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZSIgPmNvbmZ0ZXN0LiRhY19leHQKK2V2YWwgIiRhY19saW5rIiAyPiYxID4vZGV2L251bGwgfCAkU0VEICcvXiQvZDsgL14gKisvZCcgPmNvbmZ0ZXN0LmVycgorX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZT1gY2F0IGNvbmZ0ZXN0LmVycmAKKyRybSBjb25mdGVzdCoKK10pIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGlua3MgYSBtaW5pbWFsIHByb2dyYW0gYW5kIGNoZWNrcyB0aGUgZXhlY3V0YWJsZQorIyBmb3IgdGhlIHN5c3RlbSBkZWZhdWx0IGhhcmRjb2RlZCBsaWJyYXJ5IHBhdGguIEluIG1vc3QgY2FzZXMsCisjIHRoaXMgaXMgL3Vzci9saWI6L2xpYiwgYnV0IHdoZW4gdGhlIE1QSSBjb21waWxlcnMgYXJlIHVzZWQKKyMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tdW5pY2F0aW9uIGFuZCBNUEkgbGlicyBhcmUgaW5jbHVkZWQgdG9vLgorIyBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCB1c2UgdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIGFjY29yZGluZworIyB0byB0aGUgYWl4IGxkIG1hbnVhbC4KK0FDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwKK1tBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWworYWl4X2xpYnBhdGg9YGR1bXAgLUggY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2A7IGZpXSxbXSkKK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4gYWl4X2xpYnBhdGg9Ii91c3IvbGliOi9saWIiOyBmaQorXSkjIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKworCisjIF9MVF9BQ19TSEVMTF9JTklUKEFSRykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSwKK1tpZmRlZihbQUNfRElWRVJTSU9OX05PVElDRV0sCisJICAgICBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAorCSBbQUNfRElWRVJUX1BVU0goTk9USUNFKV0pCiskMQorQUNfRElWRVJUX1BPUAorXSkjIF9MVF9BQ19TSEVMTF9JTklUCisKKworIyBfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2gKKyMgd2lsbCBmaW5kIGFuIGVjaG8gY29tbWFuZCB3aGljaCBkb2Vzbid0IGludGVycHJldCBiYWNrc2xhc2hlcy4KK0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCitbX0xUX0FDX1NIRUxMX0lOSVQoWworIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworY2FzZSBYJEVDSE8gaW4KK1gqLS1mYWxsYmFjay1lY2hvKQorICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgorICBFQ0hPPWBlY2hvICIkRUNITyIgfCBzZWQgJ3MsXFxcXFxbJF1cXFskXTAsJ1skXTAnLCdgCisgIDs7Citlc2FjCisKK2VjaG89JHtFQ0hPLWVjaG99CitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KKyAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KKyAgZXhlYyAkU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9CitmaQorCitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PEVPRgorWyRdKgorRU9GCisgIGV4aXQgMAorZmkKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworaWYgdGVzdCAteiAiJEVDSE8iOyB0aGVuCitpZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9IFhzZXQ7IHRoZW4KKyMgZmluZCBhIHN0cmluZyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgYXMgbG9uZyBhcyB0aGUgc2hlbGwgY2FuIGNvcGUgd2l0aCBpdAorICBmb3IgY21kIGluICdzZWQgNTBxICJbJF0wIicgJ3NlZCAyMHEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMnEgIlskXTAiJyAnZWNobyB0ZXN0JzsgZG8KKyAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgorICAgIGlmIChlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgKSAyPi9kZXYvbnVsbCAmJgorICAgICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJGNtZGAgJiYKKyAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbAorICAgIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKworaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGVjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgOgorZWxzZQorICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKKyAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBxdW90ZSBiYWNrc2xhc2hlcyB1c2luZworICAjICAgZWNobyAiJHNvbWV0aGluZyIgfCBzZWQgJ3MvXFwvXFxcXC9nJworICAjCisgICMgU28sIGZpcnN0IHdlIGxvb2sgZm9yIGEgd29ya2luZyBlY2hvIGluIHRoZSB1c2VyJ3MgUEFUSC4KKworICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0kUEFUSF9TRVBBUkFUT1IKKyAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KKyAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICBpZiAodGVzdCAtZiAkZGlyL2VjaG8gfHwgdGVzdCAtZiAkZGlyL2VjaG8kYWNfZXhlZXh0KSAmJgorICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJGRpci9lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorICAgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorICAgICAgZWNobz0iJGRpci9lY2hvIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorCisgIGlmIHRlc3QgIlgkZWNobyIgPSBYZWNobzsgdGhlbgorICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgorICAgIGlmIHRlc3QgIlhgKHByaW50IC1yICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgorICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKyAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCisgICAgICBlY2hvPSdwcmludCAtcicKKyAgICBlbGlmICh0ZXN0IC1mIC9iaW4va3NoIHx8IHRlc3QgLWYgL2Jpbi9rc2gkYWNfZXhlZXh0KSAmJgorCSB0ZXN0ICJYJENPTkZJR19TSEVMTCIgIT0gWC9iaW4va3NoOyB0aGVuCisgICAgICAjIElmIHdlIGhhdmUga3NoLCB0cnkgcnVubmluZyBjb25maWd1cmUgYWdhaW4gd2l0aCBpdC4KKyAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorICAgICAgZXhwb3J0IE9SSUdJTkFMX0NPTkZJR19TSEVMTAorICAgICAgQ09ORklHX1NIRUxMPS9iaW4va3NoCisgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICBleGVjICRDT05GSUdfU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9CisgICAgZWxzZQorICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgorICAgICAgZWNobz0ncHJpbnRmICVzXG4nCisgICAgICBpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKwkgZWNob190ZXN0aW5nX3N0cmluZz1gKCRlY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwkjIENvb2wsIHByaW50ZiB3b3JrcworCToKKyAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRPUklHSU5BTF9DT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gJ1hcdCcgJiYKKwkgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCUNPTkZJR19TSEVMTD0kT1JJR0lOQUxfQ09ORklHX1NIRUxMCisJZXhwb3J0IENPTkZJR19TSEVMTAorCVNIRUxMPSIkQ09ORklHX1NIRUxMIgorCWV4cG9ydCBTSEVMTAorCWVjaG89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICBlbGlmIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkQ09ORklHX1NIRUxMICJbJF0wIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgICYmCisJICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKwllY2hvPSIkQ09ORklHX1NIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvIgorICAgICAgZWxzZQorCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCisJcHJldj06CisKKwlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCA1MHEgIlskXTAiJzsgZG8KKwkgIGlmICh0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCIpIDI+L2Rldi9udWxsCisJICB0aGVuCisJICAgIGJyZWFrCisJICBmaQorCSAgcHJldj0iJGNtZCIKKwlkb25lCisKKwlpZiB0ZXN0ICIkcHJldiIgIT0gJ3NlZCA1MHEgIlskXTAiJzsgdGhlbgorCSAgZWNob190ZXN0X3N0cmluZz1gZXZhbCAkcHJldmAKKwkgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCisJICBleGVjICR7T1JJR0lOQUxfQ09ORklHX1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fSAiWyRdMCIgJHsxKyJbJF1AIn0KKwllbHNlCisJICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgorCSAgZWNobz1lY2hvCisJZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK2ZpCitmaQorCisjIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCisjIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KK0VDSE89JGVjaG8KK2lmIHRlc3QgIlgkRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisgICBFQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcWyRdMCAtLWZhbGxiYWNrLWVjaG8iCitmaQorCitBQ19TVUJTVChFQ0hPKQorXSldKSMgX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0gKKworCisjIF9MVF9BQ19MT0NLCisjIC0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX0xPQ0tdLAorW0FDX0FSR19FTkFCTEUoW2xpYnRvb2wtbG9ja10sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKKwlbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgKkVMRi0zMiopCisgICAgICBIUFVYX0lBNjRfTU9ERT0iMzIiCisgICAgICA7OworICAgICpFTEYtNjQqKQorICAgICAgSFBVWF9JQTY0X01PREU9IjY0IgorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgOzsKKyotKi1pcml4NiopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnWyNdbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtbWVsZjMyYnNtaXAiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJibWlwbjMyIgorICAgICAgOzsKKyAgICAqNjQtYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtbWVsZjY0Ym1pcCIKKyAgICAgIDs7CisgICAgZXNhYworICAgZWxzZQorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3QuJGFjX29iamV4dGAgaW4KKyAgICAqMzItYml0KikKKyAgICAgIExEPSIke0xELWxkfSAtMzIiCisgICAgICA7OworICAgICpOMzIqKQorICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKKyAgICAgIDs7CisgICAgZXNhYworICAgZmkKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworCit4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnxzMzkwKi0qbGludXgqfHNwYXJjKi0qbGludXgqKQorICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCisgIGVjaG8gJ2ludCBpOycgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCBpbgorICAgICozMi1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX2kzODYiCisgICAgICAgICAgOzsKKyAgICAgICAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmMzJwcGNsaW51eCIKKyAgICAgICAgICA7OworICAgICAgICBzMzkweC0qbGludXgqKQorICAgICAgICAgIExEPSIke0xELWxkfSAtbSBlbGZfczM5MCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYzY0LSpsaW51eCopCisgICAgICAgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMyX3NwYXJjIgorICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworICAgICo2NC1iaXQqKQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICB4ODZfNjQtKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKyAgICAgICAgICA7OworICAgICAgICBwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisgICAgICAgICAgOzsKKyAgICAgICAgczM5MCotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKyAgICAgICAgICA7OworICAgICAgICBzcGFyYyotKmxpbnV4KikKKyAgICAgICAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAorICAgIFtBQ19MQU5HX1BVU0goQykKKyAgICAgQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pCisgICAgIEFDX0xBTkdfUE9QXSkKKyAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KKyAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKKyAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKKyAgZmkKKyAgOzsKK3NwYXJjKi0qc29sYXJpcyopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIGluCisgICAgKjY0LWJpdCopCisgICAgICBjYXNlICRsdF9jdl9wcm9nX2dudV9sZCBpbgorICAgICAgeWVzKikgTEQ9IiR7TEQtbGR9IC1tIGVsZjY0X3NwYXJjIiA7OworICAgICAgKikgICAgTEQ9IiR7TEQtbGR9IC02NCIgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sCitbKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqKQorICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCisgIDs7CisgIF0pCitlc2FjCisKK25lZWRfbG9ja3M9IiRlbmFibGVfbGlidG9vbF9sb2NrIgorCitdKSMgX0xUX0FDX0xPQ0sKKworCisjIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAorIwkJW09VVFBVVC1GSUxFXSwgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb21waWxlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTl0sCitbQUNfUkVRVUlSRShbTFRfQUNfUFJPR19TRURdKQorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgIGlmZWxzZShbJDRdLCAsIFthY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHRdLCBbYWNfb3V0ZmlsZT0kNF0pCisgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgbHRfY29tcGlsZXJfZmxhZz0iJDMiCisgICAjIEluc2VydCB0aGUgb3B0aW9uIGVpdGhlciAoMSkgYWZ0ZXIgdGhlIGxhc3QgKkZMQUdTIHZhcmlhYmxlLCBvcgorICAgIyAoMikgYmVmb3JlIGEgd29yZCBjb250YWluaW5nICJjb25mdGVzdC4iLCBvciAoMykgYXQgdGhlIGVuZC4KKyAgICMgTm90ZSB0aGF0ICRhY19jb21waWxlIGl0c2VsZiBkb2VzIG5vdCBjb250YWluIGJhY2tzbGFzaGVzIGFuZCBiZWdpbnMKKyAgICMgd2l0aCBhIGRvbGxhciBzaWduIChub3QgYSBoeXBoZW4pLCBzbyB0aGUgZWNobyBzaG91bGQgd29yayBjb3JyZWN0bHkuCisgICAjIFRoZSBvcHRpb24gaXMgcmVmZXJlbmNlZCB2aWEgYSB2YXJpYWJsZSB0byBhdm9pZCBjb25mdXNpbmcgc2VkLgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgIGFjX3N0YXR1cz0kPworICAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBlY2hvICIkYXNfbWU6X19vbGluZV9fOiBcJD8gPSAkYWNfc3RhdHVzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICBpZiAoZXhpdCAkYWNfc3RhdHVzKSAmJiB0ZXN0IC1zICIkYWNfb3V0ZmlsZSI7IHRoZW4KKyAgICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzIG90aGVyIHRoYW4gdGhlIHVzdWFsIG91dHB1dC4KKyAgICAgJGVjaG8gIlgkX2x0X2NvbXBpbGVyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPmNvbmZ0ZXN0LmV4cAorICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyMiB8fCBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICQyPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKK10pCisKK2lmIHRlc3QgeCJbJF0kMiIgPSB4eWVzOyB0aGVuCisgICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKK2Vsc2UKKyAgICBpZmVsc2UoWyQ2XSwgLCA6LCBbJDZdKQorZmkKK10pIyBBQ19MSUJUT09MX0NPTVBJTEVSX09QVElPTgorCisKKyMgQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OKE1FU1NBR0UsIFZBUklBQkxFLU5BTUUsIEZMQUdTLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgW0FDVElPTi1TVUNDRVNTXSwgW0FDVElPTi1GQUlMVVJFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sCitbQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJDMiCisgICBwcmludGYgIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorICAgaWYgKGV2YWwgJGFjX2xpbmsgMj5jb25mdGVzdC5lcnIpICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgICAgICMgVGhlIGxpbmtlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKKyAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgorICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAkZWNobyAiWCRfbHRfbGlua2VyX2JvaWxlcnBsYXRlIiB8ICRYc2VkIC1lICcvXiQvZCcgPiBjb25mdGVzdC5leHAKKyAgICAgICAkU0VEICcvXiQvZDsgL14gKisvZCcgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjIKKyAgICAgICBpZiBkaWZmIGNvbmZ0ZXN0LmV4cCBjb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgJDI9eWVzCisgICAgICAgZmkKKyAgICAgZWxzZQorICAgICAgICQyPXllcworICAgICBmaQorICAgZmkKKyAgICRybSBjb25mdGVzdCoKKyAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCitdKQorCitpZiB0ZXN0IHgiWyRdJDIiID0geHllczsgdGhlbgorICAgIGlmZWxzZShbJDRdLCAsIDosIFskNF0pCitlbHNlCisgICAgaWZlbHNlKFskNV0sICwgOiwgWyQ1XSkKK2ZpCitdKSMgQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OCisKKworIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX01BWF9DTURfTEVOXSwKK1sjIGZpbmQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK0FDX01TR19DSEVDS0lORyhbdGhlIG1heGltdW0gbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHNdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfbWF4X2NtZF9sZW5dLCBbZG5sCisgIGk9MAorICB0ZXN0c3RyaW5nPSJBQkNEIgorCisgIGNhc2UgJGJ1aWxkX29zIGluCisgIG1zZG9zZGpncHAqKQorICAgICMgT24gREpHUFAsIHRoaXMgdGVzdCBjYW4gYmxvdyB1cCBwcmV0dHkgYmFkbHkgZHVlIHRvIHByb2JsZW1zIGluIGxpYmMKKyAgICAjIChhbnkgc2luZ2xlIGFyZ3VtZW50IGV4Y2VlZGluZyAyMDAwIGJ5dGVzIGNhdXNlcyBhIGJ1ZmZlciBvdmVycnVuCisgICAgIyBkdXJpbmcgZ2xvYiBleHBhbnNpb24pLiAgRXZlbiBpZiBpdCB3ZXJlIGZpeGVkLCB0aGUgcmVzdWx0IG9mIHRoaXMKKyAgICAjIGNoZWNrIHdvdWxkIGJlIGxhcmdlciB0aGFuIGl0IHNob3VsZCBiZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTIyODg7ICAgICMgMTJLIGlzIGFib3V0IHJpZ2h0CisgICAgOzsKKworICBnbnUqKQorICAgICMgVW5kZXIgR05VIEh1cmQsIHRoaXMgdGVzdCBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGVyZSBpcworICAgICMgbm8gbGltaXQgdG8gdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICMgTGlidG9vbCB3aWxsIGludGVycHJldCAtMSBhcyBubyBsaW1pdCB3aGF0c29ldmVyCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xOworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KikKKyAgICAjIE9uIFdpbjl4L01FLCB0aGlzIHRlc3QgYmxvd3MgdXAgLS0gaXQgc3VjY2VlZHMsIGJ1dCB0YWtlcworICAgICMgYWJvdXQgNSBtaW51dGVzIGFzIHRoZSB0ZXN0c3RyaW5nIGdyb3dzIGV4cG9uZW50aWFsbHkuCisgICAgIyBXb3JzZSwgc2luY2UgOXgvTUUgYXJlIG5vdCBwcmUtZW1wdGl2ZWx5IG11bHRpdGFza2luZywKKyAgICAjIHlvdSBlbmQgdXAgd2l0aCBhICJmcm96ZW4iIGNvbXB1dGVyLCBldmVuIHRob3VnaCB3aXRoIHBhdGllbmNlCisgICAgIyB0aGUgdGVzdCBldmVudHVhbGx5IHN1Y2NlZWRzICh3aXRoIGEgbWF4IGxpbmUgbGVuZ3RoIG9mIDI1NmspLgorICAgICMgSW5zdGVhZCwgbGV0J3MganVzdCBwdW50OiB1c2UgdGhlIG1pbmltdW0gbGluZWxlbmd0aCByZXBvcnRlZCBieQorICAgICMgYWxsIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zOiA4MTkyIChvbiBOVC8ySy9YUCkuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICAjIE9uIEFtaWdhT1Mgd2l0aCBwZGtzaCwgdGhpcyB0ZXN0IHRha2VzIGhvdXJzLCBsaXRlcmFsbHkuCisgICAgIyBTbyB3ZSBqdXN0IHB1bnQgYW5kIHVzZSBhIG1pbmltdW0gbGluZSBsZW5ndGggb2YgODE5Mi4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49ODE5MjsKKyAgICA7OworCisgIG5ldGJzZCogfCBmcmVlYnNkKiB8IG9wZW5ic2QqIHwgZGFyd2luKiB8IGRyYWdvbmZseSopCisgICAgIyBUaGlzIGhhcyBiZWVuIGFyb3VuZCBzaW5jZSAzODZCU0QsIGF0IGxlYXN0LiAgTGlrZWx5IGZ1cnRoZXIuCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjdGw7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsaWYgdGVzdCAteCAvdXNyL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC91c3Ivc2Jpbi9zeXNjdGwgLW4ga2Vybi5hcmdtYXhgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTY1NTM2CSMgdXNhYmxlIGRlZmF1bHQgZm9yIGFsbCBCU0RzCisgICAgZmkKKyAgICAjIEFuZCBhZGQgYSBzYWZldHkgem9uZQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwvIDRgCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICA7OworCisgIGludGVyaXgqKQorICAgICMgV2Uga25vdyB0aGUgdmFsdWUgMjYyMTQ0IGFuZCBoYXJkY29kZSBpdCB3aXRoIGEgc2FmZXR5IHpvbmUgKGxpa2UgQlNEKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xOTY2MDgKKyAgICA7OworCisgIG9zZiopCisgICAgIyBEci4gSGFucyBFa2tlaGFyZCBQbGVzc2VyIHJlcG9ydHMgc2VlaW5nIGEga2VybmVsIHBhbmljIHJ1bm5pbmcgY29uZmlndXJlCisgICAgIyBkdWUgdG8gdGhpcyB0ZXN0IHdoZW4gZXhlY19kaXNhYmxlX2FyZ19saW1pdCBpcyAxIG9uIFRydTY0LiBJdCBpcyBub3QKKyAgICAjIG5pY2UgdG8gY2F1c2Uga2VybmVsIHBhbmljcyBzbyBsZXRzIGF2b2lkIHRoZSBsb29wIGJlbG93LgorICAgICMgRmlyc3Qgc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0LgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0xNjM4NAorICAgICMKKyAgICBpZiB0ZXN0IC14IC9zYmluL3N5c2NvbmZpZzsgdGhlbgorICAgICAgY2FzZSBgL3NiaW4vc3lzY29uZmlnIC1xIHByb2MgZXhlY19kaXNhYmxlX2FyZ19saW1pdGAgaW4KKyAgICAgICAgKjEqKSBsdF9jdl9zeXNfbWF4X2NtZF9sZW49LTEgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgIHNjbzMuMnY1KikKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTAyNDAwCisgICAgOzsKKyAgc3lzdjUqIHwgc2NvNXY2KiB8IHN5c3Y0LjJ1dzIqKQorICAgIGthcmdtYXg9YGdyZXAgQVJHX01BWCAvZXRjL2NvbmYvY2YuZC9zdHVuZSAyPi9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0IC1uICIka2FyZ21heCI7IHRoZW4KKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZWNobyAka2FyZ21heCB8IHNlZCAncy8uKltbIAldXS8vJ2AKKyAgICBlbHNlCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MzI3NjgKKyAgICBmaQorICAgIDs7CisgICopCisgICAgIyBJZiB0ZXN0IGlzIG5vdCBhIHNoZWxsIGJ1aWx0LWluLCB3ZSdsbCBwcm9iYWJseSBlbmQgdXAgY29tcHV0aW5nIGEKKyAgICAjIG1heGltdW0gbGVuZ3RoIHRoYXQgaXMgb25seSBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4aW11bSBsZW5ndGgsIGJ1dAorICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICBTSEVMTD0ke1NIRUxMLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9fQorICAgIHdoaWxlICh0ZXN0ICJYImAkU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8gIlgkdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgPSAiWFgkdGVzdHN0cmluZyIpID4vZGV2L251bGwgMj4mMSAmJgorCSAgICBuZXdfcmVzdWx0PWBleHByICJYJHRlc3RzdHJpbmciIDogIi4qIiAyPiYxYCAmJgorCSAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49JG5ld19yZXN1bHQgJiYKKwkgICAgdGVzdCAkaSAhPSAxNyAjIDEvMiBNQiBzaG91bGQgYmUgZW5vdWdoCisgICAgZG8KKyAgICAgIGk9YGV4cHIgJGkgKyAxYAorICAgICAgdGVzdHN0cmluZz0kdGVzdHN0cmluZyR0ZXN0c3RyaW5nCisgICAgZG9uZQorICAgIHRlc3RzdHJpbmc9CisgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbiBtYXNzaXZlCisgICAgIyBhbW91bnRzIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGxpbmtlci4KKyAgICAjIEl0IGFwcGVhcnMgYXMgdGhvdWdoIDEvMiBpcyBhIHVzYWJsZSB2YWx1ZS4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyAyYAorICAgIDs7CisgIGVzYWMKK10pCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJGx0X2N2X3N5c19tYXhfY21kX2xlbikKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK10pIyBBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTgorCisKKyMgX0xUX0FDX0NIRUNLX0RMRkNOCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0sCitbQUNfQ0hFQ0tfSEVBREVSUyhkbGZjbi5oKWRubAorXSkjIF9MVF9BQ19DSEVDS19ETEZDTgorCisKKyMgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRiAoQUNUSU9OLUlGLVRSVUUsIEFDVElPTi1JRi1UUlVFLVctVVNDT1JFLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTi1JRi1GQUxTRSwgQUNUSU9OLUlGLUNST1NTLUNPTVBJTElORykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCitbQUNfUkVRVUlSRShbX0xUX0FDX0NIRUNLX0RMRkNOXSlkbmwKK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuIDoKKyAgWyQ0XQorZWxzZQorICBsdF9kbHVua25vd249MDsgbHRfZGxub191c2NvcmU9MTsgbHRfZGxuZWVkX3VzY29yZT0yCisgIGx0X3N0YXR1cz0kbHRfZGx1bmtub3duCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK1sjbGluZSBfX29saW5lX18gImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWYgSEFWRV9ETEZDTl9ICisjaW5jbHVkZSA8ZGxmY24uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFJUTERfR0xPQkFMCisjICBkZWZpbmUgTFRfRExHTE9CQUwJCVJUTERfR0xPQkFMCisjZWxzZQorIyAgaWZkZWYgRExfR0xPQkFMCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJRExfR0xPQkFMCisjICBlbHNlCisjICAgIGRlZmluZSBMVF9ETEdMT0JBTAkJMAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBXZSBtYXkgaGF2ZSB0byBkZWZpbmUgTFRfRExMQVpZX09SX05PVyBpbiB0aGUgY29tbWFuZCBsaW5lIGlmIHdlCisgICBmaW5kIG91dCBpdCBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0uICovCisjaWZuZGVmIExUX0RMTEFaWV9PUl9OT1cKKyMgIGlmZGVmIFJUTERfTEFaWQorIyAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJUlRMRF9MQVpZCisjICBlbHNlCisjICAgIGlmZGVmIERMX0xBWlkKKyMgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkJRExfTEFaWQorIyAgICBlbHNlCisjICAgICAgaWZkZWYgUlRMRF9OT1cKKyMgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCVJUTERfTk9XCisjICAgICAgZWxzZQorIyAgICAgICAgaWZkZWYgRExfTk9XCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCURMX05PVworIyAgICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgTFRfRExMQVpZX09SX05PVwkwCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCk7CisjZW5kaWYKKwordm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgICAgZXhpdCAoc3RhdHVzKTsKK31dCitFT0YKKyAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICguL2NvbmZ0ZXN0OyBleGl0OyApID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4vZGV2L251bGwKKyAgICBsdF9zdGF0dXM9JD8KKyAgICBjYXNlIHgkbHRfc3RhdHVzIGluCisgICAgICB4JGx0X2Rsbm9fdXNjb3JlKSAkMSA7OworICAgICAgeCRsdF9kbG5lZWRfdXNjb3JlKSAkMiA7OworICAgICAgeCRsdF9kbHVua25vd258eCopICQzIDs7CisgICAgZXNhYworICBlbHNlIDoKKyAgICAjIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgICQzCisgIGZpCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorXSkjIF9MVF9BQ19UUllfRExPUEVOX1NFTEYKKworCisjIEFDX0xJQlRPT0xfRExPUEVOX1NFTEYKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19DSEVDS19ETEZDTl0pZG5sCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgY3lnd2luKikKKyAgICBsdF9jdl9kbG9wZW49ImRsb3BlbiIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgIDs7CisKKyAgZGFyd2luKikKKyAgIyBpZiBsaWJkbCBpcyBpbnN0YWxsZWQgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgaXQKKyAgICBBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSxbCisgICAgbHRfY3ZfZGxvcGVuPSJkeWxkIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIF0pCisgICA7OworCisgICopCisgICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKKyAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdLAorCVtBQ19DSEVDS19GVU5DKFtkbG9wZW5dLAorCSAgICAgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiJdLAorCSAgW0FDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLAorCSAgICBbQUNfQ0hFQ0tfTElCKFtzdmxkXSwgW2Rsb3Blbl0sCisJCSAgW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxzdmxkIl0sCisJICAgICAgW0FDX0NIRUNLX0xJQihbZGxkXSwgW2RsZF9saW5rXSwKKwkJICAgIFtsdF9jdl9kbG9wZW49ImRsZF9saW5rIiBsdF9jdl9kbG9wZW5fbGlicz0iLWRsZCJdKQorCSAgICAgIF0pCisJICAgIF0pCisJICBdKQorCV0pCisgICAgICBdKQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0ICJ4JGx0X2N2X2Rsb3BlbiIgIT0geG5vOyB0aGVuCisgICAgZW5hYmxlX2Rsb3Blbj15ZXMKKyAgZWxzZQorICAgIGVuYWJsZV9kbG9wZW49bm8KKyAgZmkKKworICBjYXNlICRsdF9jdl9kbG9wZW4gaW4KKyAgZGxvcGVuKQorICAgIHNhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXMgJiYgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtREhBVkVfRExGQ05fSCIKKworICAgIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCisgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgorCisgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICBMSUJTPSIkbHRfY3ZfZGxvcGVuX2xpYnMgJExJQlMiCisKKyAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorCSAgbHRfY3ZfZGxvcGVuX3NlbGYsIFtkbmwKKwkgIF9MVF9BQ19UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcywgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLAorCSAgICBsdF9jdl9kbG9wZW5fc2VsZj1ubywgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MpCisgICAgXSkKKworICAgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuX3NlbGYiID0geHllczsgdGhlbgorICAgICAgd2w9JGx0X3Byb2dfY29tcGlsZXJfd2wgZXZhbCBMREZMQUdTPVwiXCRMREZMQUdTICRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY1wiCisgICAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGZdLAorICAgIAkgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYywgW2RubAorCSAgX0xUX0FDX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcywKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPW5vLCAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzKQorICAgICAgXSkKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRzYXZlX0NQUEZMQUdTIgorICAgIExERkxBR1M9IiRzYXZlX0xERkxBR1MiCisgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGYgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGY9JGx0X2N2X2Rsb3Blbl9zZWxmIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duIDs7CisgIGVzYWMKKworICBjYXNlICRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgaW4KKyAgeWVzfG5vKSBlbmFibGVfZGxvcGVuX3NlbGZfc3RhdGljPSRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMgOzsKKyAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duIDs7CisgIGVzYWMKK2ZpCitdKSMgQUNfTElCVE9PTF9ETE9QRU5fU0VMRgorCisKKyMgQUNfTElCVE9PTF9QUk9HX0NDX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgorQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAorW0FDX1JFUVVJUkUoW19MVF9BQ19TWVNfQ09NUElMRVJdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2lmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLiRhY19vYmpleHRdLAorICBbX0xUX0FDX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpXSwKKyAgW19MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT1ubworICAgJHJtIC1yIGNvbmZ0ZXN0IDI+L2Rldi9udWxsCisgICBta2RpciBjb25mdGVzdAorICAgY2QgY29uZnRlc3QKKyAgIG1rZGlyIG91dAorICAgcHJpbnRmICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkZWNobyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgJHJtIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkcm0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkcm0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgcm1kaXIgY29uZnRlc3QKKyAgICRybSBjb25mdGVzdCoKK10pCitdKSMgQUNfTElCVE9PTF9QUk9HX0NDX0NfTworCisKKyMgQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBoYXJkIGxpbmtzIHRvIGxvY2sgc29tZSBmaWxlcyBpZiBuZWVkZWQKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19MT0NLXSlkbmwKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKKyAgaGFyZF9saW5rcz15ZXMKKyAgJHJtIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKK10pIyBBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MKKworCisjIEFDX0xJQlRPT0xfT0JKRElSCisjIC0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9PQkpESVJdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCitbcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCitvYmpkaXI9JGx0X2N2X29iamRpcgorXSkjIEFDX0xJQlRPT0xfT0JKRElSCisKKworIyBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBoYXJkY29kZSBsaWJyYXJ5IHBhdGhzIGludG8gcHJvZ3JhbXNdKQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKT0KK2lmIHRlc3QgLW4gIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSIgfHwgXAorICAgdGVzdCAtbiAiJF9MVF9BQ19UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwgXAorICAgdGVzdCAiWCRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIiA9ICJYeWVzIiA7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpIiAhPSBubyAmJgorICAgICAjIElmIHRoZSBvbmx5IG1lY2hhbmlzbSB0byBhdm9pZCBoYXJkY29kaW5nIGlzIHNobGlicGF0aF92YXIsIHdlCisgICAgICMgaGF2ZSB0byByZWxpbmssIG90aGVyd2lzZSB3ZSBtaWdodCBsaW5rIHdpdGggYW4gaW5zdGFsbGVkIGxpYnJhcnkKKyAgICAgIyB3aGVuIHdlIHNob3VsZCBiZSBsaW5raW5nIHdpdGggYSB5ZXQtdG8tYmUtaW5zdGFsbGVkIG9uZQorICAgICAjIyB0ZXN0ICIkX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSkiICE9IG5vICYmCisgICAgIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKSIgIT0gbm87IHRoZW4KKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9cmVsaW5rCisgIGVsc2UKKyAgICAjIFdlIGNhbiBsaW5rIHdpdGhvdXQgaGFyZGNvZGluZywgYW5kIHdlIGNhbiBoYXJkY29kZSBub25leGlzdGluZyBkaXJzLgorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9aW1tZWRpYXRlCisgIGZpCitlbHNlCisgICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCisgICMgZGlyZWN0b3JpZXMuCisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSk9dW5zdXBwb3J0ZWQKK2ZpCitBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKV0pCisKK2lmIHRlc3QgIiRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpIiA9IHJlbGluazsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAorICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgorICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKKyAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcworZmkKK10pIyBBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSAorCisKKyMgQUNfTElCVE9PTF9TWVNfTElCX1NUUklQCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sCitbc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgZ3JlcCAiR05VIHN0cmlwIiA+L2Rldi9udWxsOyB0aGVuCisgIHRlc3QgLXogIiRvbGRfc3RyaXBsaWIiICYmIG9sZF9zdHJpcGxpYj0iJFNUUklQIC0tc3RyaXAtZGVidWciCisgIHRlc3QgLXogIiRzdHJpcGxpYiIgJiYgc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLXVubmVlZGVkIgorICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorZWxzZQorIyBGSVhNRSAtIGluc2VydCBzb21lIHJlYWwgdGVzdHMsIGhvc3Rfb3MgaXNuJ3QgcmVhbGx5IGdvb2QgZW5vdWdoCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgIGRhcndpbiopCisgICAgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgIGVsc2UKKyAgQUNfTVNHX1JFU1VMVChbbm9dKQorZmkKKyAgICAgICA7OworICAgKikKKyAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIDs7CisgIGVzYWMKK2ZpCitdKSMgQUNfTElCVE9PTF9TWVNfTElCX1NUUklQCisKKworIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQT1JUTUUgRmlsbCBpbiB5b3VyIGxkLnNvIGNoYXJhY3RlcmlzdGljcworQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2R5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljc10pCitsaWJyYXJ5X25hbWVzX3NwZWM9CitsaWJuYW1lX3NwZWM9J2xpYiRuYW1lJworc29uYW1lX3NwZWM9CitzaHJleHRfY21kcz0iLnNvIgorcG9zdGluc3RhbGxfY21kcz0KK3Bvc3R1bmluc3RhbGxfY21kcz0KK2ZpbmlzaF9jbWRzPQorZmluaXNoX2V2YWw9CitzaGxpYnBhdGhfdmFyPQorc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXVua25vd24KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCitzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IGdyZXAgIl5saWJyYXJpZXM6IiB8ICRTRUQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnImAKKyAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBncmVwICc7JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICMgaWYgdGhlIHBhdGggY29udGFpbnMgIjsiIHRoZW4gd2UgYXNzdW1lIGl0IHRvIGJlIHRoZSBzZXBhcmF0b3IKKyAgICAjIG90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBwYXRoIHNlcGFyYXRvciAoaS5lLiAiOiIpIC0gaXQgaXMKKyAgICAjIGFzc3VtZWQgdGhhdCBubyBwYXJ0IG9mIGEgbm9ybWFsIHBhdGhuYW1lIGNvbnRhaW5zICI7IiBidXQgdGhhdCBzaG91bGQKKyAgICAjIG9rYXkgaW4gdGhlIHJlYWwgd29ybGQgd2hlcmUgIjsiIGluIGRpcnBhdGhzIGlzIGl0c2VsZiBwcm9ibGVtYXRpYy4KKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAtZSAncy87LyAvZydgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgIGZpCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpCituZWVkX2xpYl9wcmVmaXg9dW5rbm93bgoraGFyZGNvZGVfaW50b19saWJzPW5vCisKKyMgd2hlbiB5b3Ugc2V0IG5lZWRfdmVyc2lvbiB0byBubywgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIC1zZXRfdmVyc2lvbgorIyBmbGFncyB0byBiZSBsZWZ0IHdpdGhvdXQgYXJndW1lbnRzCituZWVkX3ZlcnNpb249dW5rbm93bgorCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZS5hJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKworICAjIEFJWCAzIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAjIEFJWCA1IHN1cHBvcnRzIElBNjQKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBlbHNlCisgICAgIyBXaXRoIEdDQyB1cCB0byAyLjk1LngsIGNvbGxlY3QyIHdvdWxkIGNyZWF0ZSBhbiBpbXBvcnQgZmlsZQorICAgICMgZm9yIGRlcGVuZGVuY2UgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBmaWxlIHdvdWxkIHN0YXJ0IHdpdGgKKyAgICAjIHRoZSBsaW5lIGAjISAuJy4gIFRoaXMgd291bGQgY2F1c2UgdGhlIGdlbmVyYXRlZCBsaWJyYXJ5IHRvCisgICAgIyBkZXBlbmQgb24gYC4nLCBhbHdheXMgYW4gaW52YWxpZCBsaWJyYXJ5LiAgVGhpcyB3YXMgZml4ZWQgaW4KKyAgICAjIGRldmVsb3BtZW50IHNuYXBzaG90cyBvZiBHQ0MgcHJpb3IgdG8gMy4wLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDQgfCBhaXg0LltbMDFdXSB8IGFpeDQuW1swMV1dLiopCisgICAgICBpZiB7IGVjaG8gJyNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOTcpJworCSAgIGVjaG8gJyB5ZXMgJworCSAgIGVjaG8gJyNlbmRpZic7IH0gfCAke0NDfSAtRSAtIHwgZ3JlcCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KKyAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW1teL11dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgImNkIC9zeXMvbGlicyAmJiAkTE5fUyAkbGliICR7bGlibmFtZX1faXhsaWJyYXJ5LmEiOyBjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIHx8IGV4aXQgMTsgZG9uZScKKyAgOzsKKworYmVvcyopCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKKyAgc2hsaWJwYXRoX3Zhcj1MSUJSQVJZX1BBVEgKKyAgOzsKKworYnNkaVtbNDVdXSopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCisgICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCisgICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdworICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKKyAgOzsKKworY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICB2ZXJzaW9uX3R5cGU9d2luZG93cworICBzaHJleHRfY21kcz0iLmRsbCIKKyAgbmVlZF92ZXJzaW9uPW5vCisgIG5lZWRfbGliX3ByZWZpeD1ubworCisgIGNhc2UgJEdDQywkaG9zdF9vcyBpbgorICB5ZXMsY3lnd2luKiB8IHllcyxtaW5ndyogfCB5ZXMscHczMiopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTtlY2hvIFwkZGxuYW1lJ1wnJ2B+CisgICAgICBkbGRpcj0kZGVzdGRpci9gZGlybmFtZSBcJGRscGF0aGB+CisgICAgICB0ZXN0IC1kIFwkZGxkaXIgfHwgbWtkaXIgLXAgXCRkbGRpcn4KKyAgICAgICRpbnN0YWxsX3Byb2cgJGRpci8kZGxuYW1lIFwkZGxkaXIvJGRsbmFtZX4KKyAgICAgIGNobW9kIGEreCBcJGRsZGlyLyRkbG5hbWUnCisgICAgcG9zdHVuaW5zdGFsbF9jbWRzPSdkbGRsbD1gJFNIRUxMIDI+JjEgLWMgJ1wnJy4gJGZpbGU7IGVjaG8gXCRkbG5hbWUnXCcnYH4KKyAgICAgIGRscGF0aD0kZGlyL1wkZGxkbGx+CisgICAgICAgJHJtIFwkZGxwYXRoJworICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qKQorICAgICAgIyBDeWd3aW4gRExMcyB1c2UgJ2N5ZycgcHJlZml4IHJhdGhlciB0aGFuICdsaWInCisgICAgICBzb25hbWVfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL2N5Zy8nYGBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fScKKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIgL2xpYi93MzJhcGkgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgICAgIDs7CisgICAgbWluZ3cqKQorICAgICAgIyBNaW5HVyBETExzIHVzZSB0cmFkaXRpb25hbCAnbGliJyBwcmVmaXgKKyAgICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgZ3JlcCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgZWNobyAiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyIgfCBbZ3JlcCAnO1tjLXpDLVpdOi8nID4vZGV2L251bGxdOyB0aGVuCisgICAgICAgICMgSXQgaXMgbW9zdCBwcm9iYWJseSBhIFdpbmRvd3MgZm9ybWF0IFBBVEggcHJpbnRlZCBieQorICAgICAgICAjIG1pbmd3IGdjYywgYnV0IHdlIGFyZSBydW5uaW5nIG9uIEN5Z3dpbi4gR2NjIHByaW50cyBpdHMgc2VhcmNoCisgICAgICAgICMgcGF0aCB3aXRoIDsgc2VwYXJhdG9ycywgYW5kIHdpdGggZHJpdmUgbGV0dGVycy4gV2UgY2FuIGhhbmRsZSB0aGUKKyAgICAgICAgIyBkcml2ZSBsZXR0ZXJzIChjeWd3aW4gZmlsZXV0aWxzIHVuZGVyc3RhbmRzIHRoZW0pLCBzbyBsZWF2ZSB0aGVtLAorICAgICAgICAjIGVzcGVjaWFsbHkgYXMgd2UgbWlnaHQgcGFzcyBmaWxlcyBmb3VuZCB0aGVyZSB0byBhIG1pbmd3IG9iamR1bXAsCisgICAgICAgICMgd2hpY2ggd291bGRuJ3QgdW5kZXJzdGFuZCBhIGN5Z3dpbmlmaWVkIHBhdGguIEFoaC4KKyAgICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPWBlY2hvICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YGVjaG8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgJFNFRCAgLWUgInMvJFBBVEhfU0VQQVJBVE9SLyAvZyJgCisgICAgICBmaQorICAgICAgOzsKKyAgICBwdzMyKikKKyAgICAgICMgcHczMiBETExzIHVzZSAncHcnIHByZWZpeCByYXRoZXIgdGhhbiAnbGliJworICAgICAgbGlicmFyeV9uYW1lc19zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvcHcvJ2BgZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICA7OworICAgIGVzYWMKKyAgICA7OworCisgICopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9ICRsaWJuYW1lLmxpYicKKyAgICA7OworICBlc2FjCisgIGR5bmFtaWNfbGlua2VyPSdXaW4zMiBsZC5leGUnCisgICMgRklYTUU6IGZpcnN0IHdlIHNob3VsZCBzZWFyY2ggLiBhbmQgdGhlIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBpcyBpbgorICBzaGxpYnBhdGhfdmFyPVBBVEgKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGR5bGQiCisgIHZlcnNpb25fdHlwZT1kYXJ3aW4KKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHt2ZXJzdWZmaXh9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0ICR7bGlibmFtZX0kc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHttYWpvcn0kc2hhcmVkX2V4dCcKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBzaGxpYnBhdGhfdmFyPURZTERfTElCUkFSWV9QQVRICisgIHNocmV4dF9jbWRzPSdgdGVzdCAuJG1vZHVsZSA9IC55ZXMgJiYgZWNobyAuc28gfHwgZWNobyAuZHlsaWJgJworICAjIEFwcGxlJ3MgZ2NjIHByaW50cyAnZ2NjIC1wcmludC1zZWFyY2gtZGlycycgZG9lc24ndCBvcGVyYXRlIHRoZSBzYW1lLgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJENDIC1wcmludC1zZWFyY2gtZGlycyB8IHRyICJcbiIgIiRQQVRIX1NFUEFSQVRPUiIgfCBzZWQgLWUgJ3MvbGlicmFyaWVzOi9AbGlicmFyaWVzOi8nIHwgdHIgIkAiICJcbiIgfCBncmVwICJebGlicmFyaWVzOiIgfCBzZWQgLWUgInMvXmxpYnJhcmllczovLyIgLWUgInMsPS8sLyxnIiAtZSAicywkUEFUSF9TRVBBUkFUT1IsICxnIiAtZSAicywuKiwmIC9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIsZyJgCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWInCisgIGZpCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvbGliIC91c3IvbGliJworICA7OworCitkZ3V4KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitmcmVlYnNkMSopCisgIGR5bmFtaWNfbGlua2VyPW5vCisgIDs7CisKK2tmcmVlYnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK2ZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgIyBEcmFnb25GbHkgZG9lcyBub3QgaGF2ZSBhb3V0LiAgV2hlbi9pZiB0aGV5IGltcGxlbWVudCBhIG5ldworICAjIHZlcnNpb25pbmcgbWVjaGFuaXNtLCBhZGp1c3QgdGhpcy4KKyAgaWYgdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQ7IHRoZW4KKyAgICBvYmpmb3JtYXQ9YC91c3IvYmluL29iamZvcm1hdGAKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBmcmVlYnNkW1sxMjNdXSopIG9iamZvcm1hdD1hb3V0IDs7CisgICAgKikgb2JqZm9ybWF0PWVsZiA7OworICAgIGVzYWMKKyAgZmkKKyAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAorICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKyAgICBmcmVlYnNkLWVsZiopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICA7OworICAgIGZyZWVic2QtKikKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAkbGlibmFtZSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgICAgbmVlZF92ZXJzaW9uPXllcworICAgICAgOzsKKyAgZXNhYworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X29zIGluCisgIGZyZWVic2QyKikKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1swMV1dKiB8IGZyZWVic2RlbGYzLltbMDFdXSopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICA7OworICBmcmVlYnNkMy5bWzItOV1dKiB8IGZyZWVic2RlbGYzLltbMi05XV0qIHwgXAorICBmcmVlYnNkNC5bWzAtNV1dIHwgZnJlZWJzZGVsZjQuW1swLTVdXSB8IGZyZWVic2Q0LjEuMSB8IGZyZWVic2RlbGY0LjEuMSkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZCopICMgZnJvbSA0LjYgb24KKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgIGhwcGEqNjQqKQorICAgICBzaHJleHRfY21kcz0nLnNsJworICAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkbGQuc2wiCisgICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRIICMgSG93IHNob3VsZCB3ZSBoYW5kbGUgU0hMSUJfUEFUSAorICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKyAgICAgOzsKKyAgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeDMqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4CisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW4gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICMgVGhpcyBpbXBsaWVzIG5vIGZhc3RfaW5zdGFsbCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlLgorICAjIFNvbWUgcmV3b3JrIHdpbGwgYmUgbmVlZGVkIHRvIGFsbG93IGZvciBmYXN0X2luc3RhbGwKKyAgIyBiZWZvcmUgdGhpcyBjYW4gYmUgZW5hYmxlZC4KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vO3MvWzosCV0vIC9nO3MvPVtePV0qJC8vO3MvPVtePSBdKiAvIC9nOy9eJC9kJyB8IHRyICdcbicgJyAnYAorICAgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCitrbmV0YnNkKi1nbnUpCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIGR5bmFtaWNfbGlua2VyPSdHTlUgbGQuc28nCisgIDs7CisKK25ldGJzZCopCisgIHZlcnNpb25fdHlwZT1zdW5vcworICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICAgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCAoYS5vdXQpIGxkLnNvJworICBlbHNlCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICAgIGR5bmFtaWNfbGlua2VyPSdOZXRCU0QgbGQuZWxmX3NvJworICBmaQorICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworbmV3c29zNikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIDs7CisKK250by1xbngqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICA7OworCitvcGVuYnNkKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiIKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgICMgU29tZSBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuQlNEICgzLjMgYXQgbGVhc3QpICpkbyogbmVlZCB2ZXJzaW9uZWQgbGlicy4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG9wZW5ic2QzLjMgfCBvcGVuYnNkMy4zLiopIG5lZWRfdmVyc2lvbj15ZXMgOzsKKyAgICAqKSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3ZlcnNpb249bm8gIDs7CisgIGVzYWMKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuW1s4OV1dIHwgb3BlbmJzZDIuW1s4OV1dLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCitzb2xhcmlzKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJworICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovdXNyL2V0YyIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgbmVlZF9saWJfcHJlZml4PW5vCisgIGZpCisgIG5lZWRfdmVyc2lvbj15ZXMKKyAgOzsKKworc3lzdjQgfCBzeXN2NC4zKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBjYXNlICRob3N0X3ZlbmRvciBpbgorICAgIHNuaSkKKyAgICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAgICAgbmVlZF9saWJfcHJlZml4PW5vCisgICAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUJsYXJnZWR5bnN5bScKKyAgICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgICA7OworICAgIHNpZW1lbnMpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIDs7CisgICAgbW90b3JvbGEpCisgICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgICAgIG5lZWRfdmVyc2lvbj1ubworICAgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy9saWIgL3Vzci9saWIgL3Vzci9jY3MvbGliJworICAgICAgOzsKKyAgZXNhYworICA7OworCitzeXN2NCpNUCopCisgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKyAgICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kdmVyc3VmZml4ICRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0uJG1ham9yJworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGZpCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICB2ZXJzaW9uX3R5cGU9ZnJlZWJzZC1lbGYKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9ICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2xvY2FsL2xpYiAvdXNyL2dudS9saWIgL3Vzci9jY3MvbGliIC91c3IvbGliIC9saWInCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGVsc2UKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Jy91c3IvY2NzL2xpYiAvdXNyL2xpYicKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKK10pIyBBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX0FDX1RBR0NPTkZJRworIyAtLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10sCitbQUNfQVJHX1dJVEgoW3RhZ3NdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLXRhZ3NAPDpAPVRBR1NAOj5AXSwKKyAgICAgICAgW2luY2x1ZGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyBAPDpAYXV0b21hdGljQDo+QF0pXSwKKyAgICBbdGFnbmFtZXM9IiR3aXRodmFsIl0pCisKK2lmIHRlc3QgLWYgIiRsdG1haW4iICYmIHRlc3QgLW4gIiR0YWduYW1lcyI7IHRoZW4KKyAgaWYgdGVzdCAhIC1mICIke29maWxlfSI7IHRoZW4KKyAgICBBQ19NU0dfV0FSTihbb3V0cHV0IGZpbGUgYCRvZmlsZScgZG9lcyBub3QgZXhpc3RdKQorICBmaQorCisgIGlmIHRlc3QgLXogIiRMVENDIjsgdGhlbgorICAgIGV2YWwgImAkU0hFTEwgJHtvZmlsZX0gLS1jb25maWcgfCBncmVwICdeTFRDQz0nYCIKKyAgICBpZiB0ZXN0IC16ICIkTFRDQyI7IHRoZW4KKyAgICAgIEFDX01TR19XQVJOKFtvdXRwdXQgZmlsZSBgJG9maWxlJyBkb2VzIG5vdCBsb29rIGxpa2UgYSBsaWJ0b29sIHNjcmlwdF0pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1dBUk4oW3VzaW5nIGBMVENDPSRMVENDJywgZXh0cmFjdGVkIGZyb20gYCRvZmlsZSddKQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgLXogIiRMVENGTEFHUyI7IHRoZW4KKyAgICBldmFsICJgJFNIRUxMICR7b2ZpbGV9IC0tY29uZmlnIHwgZ3JlcCAnXkxUQ0ZMQUdTPSdgIgorICBmaQorCisgICMgRXh0cmFjdCBsaXN0IG9mIGF2YWlsYWJsZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgaW4gJG9maWxlLgorICAjIE5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgdGhlIGVudGlyZSBsaXN0IGlzIG9uIG9uZSBsaW5lLgorICBhdmFpbGFibGVfdGFncz1gZ3JlcCAiXmF2YWlsYWJsZV90YWdzPSIgIiR7b2ZpbGV9IiB8ICRTRUQgLWUgJ3MvYXZhaWxhYmxlX3RhZ3M9XCguKiRcKS9cMS8nIC1lICdzL1wiLy9nJ2AKKworICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgZm9yIHRhZ25hbWUgaW4gJHRhZ25hbWVzOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICMgQ2hlY2sgd2hldGhlciB0YWduYW1lIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycworICAgIGNhc2UgYCRlY2hvICJYJHRhZ25hbWUiIHwgJFhzZWQgLWUgJ3M6W1stX0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwLC9dXTo6ZydgIGluCisgICAgIiIpIDs7CisgICAgKikgIEFDX01TR19FUlJPUihbaW52YWxpZCB0YWcgbmFtZTogJHRhZ25hbWVdKQorCTs7CisgICAgZXNhYworCisgICAgaWYgZ3JlcCAiXiMgIyMjIEJFR0lOIExJQlRPT0wgVEFHIENPTkZJRzogJHRhZ25hbWUkIiA8ICIke29maWxlfSIgPiAvZGV2L251bGwKKyAgICB0aGVuCisgICAgICBBQ19NU0dfRVJST1IoW3RhZyBuYW1lIFwiJHRhZ25hbWVcIiBhbHJlYWR5IGV4aXN0c10pCisgICAgZmkKKworICAgICMgVXBkYXRlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0YWdzLgorICAgIGlmIHRlc3QgLW4gIiR0YWduYW1lIjsgdGhlbgorICAgICAgZWNobyBhcHBlbmRpbmcgY29uZmlndXJhdGlvbiB0YWcgXCIkdGFnbmFtZVwiIHRvICRvZmlsZQorCisgICAgICBjYXNlICR0YWduYW1lIGluCisgICAgICBDWFgpCisJaWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKKwkgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisJICAgICh0ZXN0ICJYJENYWCIgIT0gIlhnKysiKSkpIDsgdGhlbgorCSAgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKKwllbHNlCisJICB0YWduYW1lPSIiCisJZmkKKwk7OworCisgICAgICBGNzcpCisJaWYgdGVzdCAtbiAiJEY3NyIgJiYgdGVzdCAiWCRGNzciICE9ICJYbm8iOyB0aGVuCisJICBBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJRworCWVsc2UKKwkgIHRhZ25hbWU9IiIKKwlmaQorCTs7CisKKyAgICAgIEdDSikKKwlpZiB0ZXN0IC1uICIkR0NKIiAmJiB0ZXN0ICJYJEdDSiIgIT0gIlhubyI7IHRoZW4KKwkgIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCisJZWxzZQorCSAgdGFnbmFtZT0iIgorCWZpCisJOzsKKworICAgICAgUkMpCisJQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJRworCTs7CisKKyAgICAgICopCisJQUNfTVNHX0VSUk9SKFtVbnN1cHBvcnRlZCB0YWcgbmFtZTogJHRhZ25hbWVdKQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQXBwZW5kIHRoZSBuZXcgdGFnIG5hbWUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgICAgICBpZiB0ZXN0IC1uICIkdGFnbmFtZSIgOyB0aGVuCisgICAgICBhdmFpbGFibGVfdGFncz0iJGF2YWlsYWJsZV90YWdzICR0YWduYW1lIgorICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRsdF9zYXZlX2lmcyIKKworICAjIE5vdyBzdWJzdGl0dXRlIHRoZSB1cGRhdGVkIGxpc3Qgb2YgYXZhaWxhYmxlIHRhZ3MuCisgIGlmIGV2YWwgInNlZCAtZSAncy9eYXZhaWxhYmxlX3RhZ3M9LipcJC9hdmFpbGFibGVfdGFncz1cIiRhdmFpbGFibGVfdGFnc1wiLycgXCIkb2ZpbGVcIiA+IFwiJHtvZmlsZX1UXCIiOyB0aGVuCisgICAgbXYgIiR7b2ZpbGV9VCIgIiRvZmlsZSIKKyAgICBjaG1vZCAreCAiJG9maWxlIgorICBlbHNlCisgICAgcm0gLWYgIiR7b2ZpbGV9VCIKKyAgICBBQ19NU0dfRVJST1IoW3VuYWJsZSB0byB1cGRhdGUgbGlzdCBvZiBhdmFpbGFibGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zLl0pCisgIGZpCitmaQorXSkjIF9MVF9BQ19UQUdDT05GSUcKKworCisjIEFDX0xJQlRPT0xfRExPUEVOCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBjaGVja3MgZm9yIGRsb3BlbiBzdXBwb3J0CitBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAorIFtBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pCitdKSMgQUNfTElCVE9PTF9ETE9QRU4KKworCisjIEFDX0xJQlRPT0xfV0lOMzJfRExMCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGRlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBETExzCitBQ19ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorW0FDX0JFRk9SRShbJDBdLCBbQUNfTElCVE9PTF9TRVRVUF0pCitdKSMgQUNfTElCVE9PTF9XSU4zMl9ETEwKKworCisjIEFDX0VOQUJMRV9TSEFSRUQoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZworIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCitBQ19ERUZVTihbQUNfRU5BQkxFX1NIQVJFRF0sCitbZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKK0FDX0FSR19FTkFCTEUoW3NoYXJlZF0sCisgICAgW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dQUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc2hhcmVkPXllcyA7OworICAgIG5vKSBlbmFibGVfc2hhcmVkPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9zaGFyZWQ9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc2hhcmVkPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zaGFyZWQ9XUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVCkKK10pIyBBQ19FTkFCTEVfU0hBUkVECisKKworIyBBQ19ESVNBQkxFX1NIQVJFRAorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAorQUNfREVGVU4oW0FDX0RJU0FCTEVfU0hBUkVEXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfU0hBUkVEKG5vKQorXSkjIEFDX0RJU0FCTEVfU0hBUkVECisKKworIyBBQ19FTkFCTEVfU1RBVElDKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAorW2RlZmluZShbQUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKFtzdGF0aWNdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHN0YXRpYyBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zdGF0aWM9XUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKK10pIyBBQ19FTkFCTEVfU1RBVElDCisKKworIyBBQ19ESVNBQkxFX1NUQVRJQworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYworQUNfREVGVU4oW0FDX0RJU0FCTEVfU1RBVElDXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfU1RBVElDKG5vKQorXSkjIEFDX0RJU0FCTEVfU1RBVElDCisKKworIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKFtERUZBVUxUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCitBQ19BUkdfRU5BQkxFKFtmYXN0LWluc3RhbGxdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZmFzdC1pbnN0YWxsQDw6QD1QS0dTQDo+QF0sCisgICAgW29wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBAPDpAZGVmYXVsdD1dQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9mYXN0X2luc3RhbGw9XUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKK10pIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMCisKKworIyBBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAorQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCitBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKQorXSkjIEFDX0RJU0FCTEVfRkFTVF9JTlNUQUxMCisKKworIyBBQ19MSUJUT09MX1BJQ01PREUoW01PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZworIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfUElDTU9ERV0sCitbQUNfQkVGT1JFKFskMF0sW0FDX0xJQlRPT0xfU0VUVVBdKWRubAorcGljX21vZGU9aWZlbHNlKCQjLDEsJDEsZGVmYXVsdCkKK10pIyBBQ19MSUJUT09MX1BJQ01PREUKKworCisjIEFDX1BST0dfRUdSRVAKKyMgLS0tLS0tLS0tLS0tLQorIyBUaGlzIGlzIHByZWRlZmluZWQgc3RhcnRpbmcgd2l0aCBBdXRvY29uZiAyLjU0LCBzbyB0aGlzIGNvbmRpdGlvbmFsCisjIGRlZmluaXRpb24gY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSByZXF1aXJlIEF1dG9jb25mIDIuNTQgb3IgbGF0ZXIuCittNF9pZm5kZWYoW0FDX1BST0dfRUdSRVBdLCBbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3IgZWdyZXBdLCBbYWNfY3ZfcHJvZ19lZ3JlcF0sCisgICBbaWYgZWNobyBhIHwgKGdyZXAgLUUgJyhhfGIpJykgPi9kZXYvbnVsbCAyPiYxCisgICAgdGhlbiBhY19jdl9wcm9nX2VncmVwPSdncmVwIC1FJworICAgIGVsc2UgYWNfY3ZfcHJvZ19lZ3JlcD0nZWdyZXAnCisgICAgZmldKQorIEVHUkVQPSRhY19jdl9wcm9nX2VncmVwCisgQUNfU1VCU1QoW0VHUkVQXSkKK10pXSkKKworCisjIEFDX1BBVEhfVE9PTF9QUkVGSVgKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pc2Ugc2hhcmVkIGxpYnJhcnkKK0FDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KK1tbXFwvKl0gfCAgPzpbXFwvXSpdKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitkbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KK2RubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKK2RubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCisgIGFjX2R1bW15PSJpZmVsc2UoWyQyXSwgLCAkUEFUSCwgWyQyXSkiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyQxOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJGFjX2Rpci8kMSIKKyAgICAgIGlmIHRlc3QgLW4gIiRmaWxlX21hZ2ljX3Rlc3RfZmlsZSI7IHRoZW4KKwljYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSJmaWxlX21hZ2ljICIqKQorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICJmaWxlX21hZ2ljIFwoLipcKSJgCisJICBNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKKwkgIGlmIGV2YWwgJGZpbGVfbWFnaWNfY21kIFwkZmlsZV9tYWdpY190ZXN0X2ZpbGUgMj4gL2Rldi9udWxsIHwKKwkgICAgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICBjYXQgPDxFT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworRU9GCisJICBmaSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIE1BR0lDX0NNRD0iJGx0X3NhdmVfTUFHSUNfQ01EIgorICA7OworZXNhY10pCitNQUdJQ19DTUQ9IiRsdF9jdl9wYXRoX01BR0lDX0NNRCIKK2lmIHRlc3QgLW4gIiRNQUdJQ19DTUQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJE1BR0lDX0NNRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitdKSMgQUNfUEFUSF9UT09MX1BSRUZJWAorCisKKyMgQUNfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tCisjIGZpbmQgYSBmaWxlIHByb2dyYW0gd2hpY2ggY2FuIHJlY29nbmlzZSBhIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10sCitbQUNfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCitpZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBBQ19QQVRIX1RPT0xfUFJFRklYKGZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCisgIGVsc2UKKyAgICBNQUdJQ19DTUQ9OgorICBmaQorZmkKK10pIyBBQ19QQVRIX01BR0lDCisKKworIyBBQ19QUk9HX0xECisjIC0tLS0tLS0tLS0KKyMgZmluZCB0aGUgcGF0aG5hbWUgdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgorQUNfREVGVU4oW0FDX1BST0dfTERdLAorW0FDX0FSR19XSVRIKFtnbnUtbGRdLAorICAgIFtBQ19IRUxQX1NUUklORyhbLS13aXRoLWdudS1sZF0sCisJW2Fzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBAPDpAZGVmYXVsdD1ub0A6PkBdKV0sCisgICAgW3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllc10sCisgICAgW3dpdGhfZ251X2xkPW5vXSkKK0FDX1JFUVVJUkUoW0xUX0FDX1BST0dfU0VEXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK2FjX3Byb2c9bGQKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5ICRDQ10pCisgIGNhc2UgJGhvc3QgaW4KKyAgKi0qLW1pbmd3KikKKyAgICAjIGdjYyBsZWF2ZXMgYSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4gd2hpY2ggdXBzZXRzIG1pbmd3CisgICAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1IHwgdHIgLWQgJ1wwMTUnYCA7OworICAqKQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAgOzsKKyAgZXNhYworICBjYXNlICRhY19wcm9nIGluCisgICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCisgICAgW1tcXC9dXSogfCA/OltbXFwvXV0qKQorICAgICAgcmVfZGlyZWx0PScvW1teL11dW1teL11dKi9cLlwuLycKKyAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRobmFtZSBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgJFNFRCAncyVcXFxcJS8lZydgCisgICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KKwlhY19wcm9nPWBlY2hvICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitBQ19QUk9HX0xEX0dOVQorXSkjIEFDX1BST0dfTEQKKworCisjIEFDX1BST0dfTERfR05VCisjIC0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfUFJPR19MRF9HTlVdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfRUdSRVBdKWRubAorQUNfQ0FDSEVfQ0hFQ0soW2lmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkXSwgbHRfY3ZfcHJvZ19nbnVfbGQsCitbIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGRzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBsdF9jdl9wcm9nX2dudV9sZD15ZXMKKyAgOzsKKyopCisgIGx0X2N2X3Byb2dfZ251X2xkPW5vCisgIDs7Citlc2FjXSkKK3dpdGhfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZAorXSkjIEFDX1BST0dfTERfR05VCisKKworIyBBQ19QUk9HX0xEX1JFTE9BRF9GTEFHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCByZWxvYWQgZmxhZyBmb3IgbGlua2VyCisjICAgLS0gUE9SVE1FIFNvbWUgbGlua2VycyBtYXkgbmVlZCBhIGRpZmZlcmVudCByZWxvYWQgZmxhZy4KK0FDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGVsc2UKKyAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBmaQorICAgIDs7Citlc2FjCitdKSMgQUNfUFJPR19MRF9SRUxPQURfRkxBRworCisKKyMgQUNfREVQTElCU19DSEVDS19NRVRIT0QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGNoZWNrIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSwKK1tBQ19DQUNIRV9DSEVDSyhbaG93IHRvIHJlY29nbmlzZSBkZXBlbmRlbnQgbGlicmFyaWVzXSwKK2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kLAorW2x0X2N2X2ZpbGVfbWFnaWNfY21kPSckTUFHSUNfQ01EJworbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9CitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0ndW5rbm93bicKKyMgTmVlZCB0byBzZXQgdGhlIHByZWNlZGluZyB2YXJpYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydAorIyBpbnRlcmxpYnJhcnkgZGVwZW5kZW5jaWVzLgorIyAnbm9uZScgLS0gZGVwZW5kZW5jaWVzIG5vdCBzdXBwb3J0ZWQuCisjIGB1bmtub3duJyAtLSBzYW1lIGFzIG5vbmUsIGJ1dCBkb2N1bWVudHMgdGhhdCB3ZSByZWFsbHkgZG9uJ3Qga25vdy4KKyMgJ3Bhc3NfYWxsJyAtLSBhbGwgZGVwZW5kZW5jaWVzIHBhc3NlZCB3aXRoIG5vIGNoZWNrcy4KKyMgJ3Rlc3RfY29tcGlsZScgLS0gY2hlY2sgYnkgbWFraW5nIHRlc3QgcHJvZ3JhbS4KKyMgJ2ZpbGVfbWFnaWMgW1tyZWdleF1dJyAtLSBjaGVjayBieSBsb29raW5nIGZvciBmaWxlcyBpbiBsaWJyYXJ5IHBhdGgKKyMgd2hpY2ggcmVzcG9uZHMgdG8gdGhlICRmaWxlX21hZ2ljX2NtZCB3aXRoIGEgZ2l2ZW4gZXh0ZW5kZWQgcmVnZXguCisjIElmIHlvdSBoYXZlIGBmaWxlJyBvciBlcXVpdmFsZW50IG9uIHlvdXIgc3lzdGVtIGFuZCB5b3UncmUgbm90IHN1cmUKKyMgd2hldGhlciBgcGFzc19hbGwnIHdpbGwgKmFsd2F5cyogd29yaywgeW91IHByb2JhYmx5IHdhbnQgdGhpcyBvbmUuCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDQqIHwgYWl4NSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2Jlb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitic2RpW1s0NV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tNTF1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIpJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nL3Vzci9iaW4vZmlsZSAtTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KKyAgOzsKKworY3lnd2luKikKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIGlzIGEgc2hlbGwgZnVuY3Rpb24gZGVmaW5lZCBpbiBsdG1haW4uc2gKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9J2Z1bmNfd2luMzJfbGliaWQnCisgIDs7CisKK21pbmd3KiB8IHB3MzIqKQorICAjIEJhc2UgTVNZUy9NaW5HVyBkbyBub3QgcHJvdmlkZSB0aGUgJ2ZpbGUnIGNvbW1hbmQgbmVlZGVkIGJ5CisgICMgZnVuY193aW4zMl9saWJpZCBzaGVsbCBmdW5jdGlvbiwgc28gdXNlIGEgd2Vha2VyIHRlc3QgYmFzZWQgb24gJ29iamR1bXAnLgorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBmaWxlIGZvcm1hdCBwZWkqLWkzODYoLiphcmNoaXRlY3R1cmU6IGkzODYpPycKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9JyRPQkpEVU1QIC1mJworICA7OworCitkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgaSo4NiApCisgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIE9wZW5CU0QgaGVyZSB3YXMgYSBtaXN0YWtlLgorICAgICAgIyBMZXQncyBhY2NlcHQgYm90aCBvZiB0aGVtIHVudGlsIHRoaXMgaXMgY2xlYXJlZCB1cC4KKyAgICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChGcmVlQlNEfE9wZW5CU0R8RHJhZ29uRmx5KS9pW1szLTldXTg2IChjb21wYWN0ICk/ZGVtYW5kIHBhZ2VkIHNoYXJlZCBsaWJyYXJ5JworICAgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICAgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9YGVjaG8gL3Vzci9saWIvbGliYy5zby4qYAorICAgICAgOzsKKyAgICBlc2FjCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICBmaQorICA7OworCitnbnUqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitocHV4MTAuMjAqIHwgaHB1eDExKikKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoc1tbMC05XV1bWzAtOV1dW1swLTldXXxFTEYtW1swLTldXVtbMC05XV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIElBNjQnCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvaHB1eDMyL2xpYmMuc28KKyAgICA7OworICBocHBhKjY0KikKKyAgICBbbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbMC05XVswLTldWzAtOV18RUxGLVswLTldWzAtOV0pIHNoYXJlZCBvYmplY3QgZmlsZSAtIFBBLVJJU0MgWzAtOV0uWzAtOV0nXQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL3BhMjBfNjQvbGliYy5zbAorICAgIDs7CisgICopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18UEEtUklTQ1tbMC05XV0uW1swLTldXSkgc2hhcmVkIGxpYnJhcnknCisgICAgbHRfY3ZfZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3Vzci9saWIvbGliYy5zbAorICAgIDs7CisgIGVzYWMKKyAgOzsKKworaW50ZXJpeDMqKQorICAjIFBJQyBjb2RlIGlzIGJyb2tlbiBvbiBJbnRlcml4IDMueCwgdGhhdCdzIHdoeSB8XC5hIG5vdCB8X3BpY1wuYSBoZXJlCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc298XC5hKSQnCisgIDs7CisKK2lyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgIGNhc2UgJExEIGluCisgICotMzJ8KiItMzIgIikgbGlibWFnaWM9MzItYml0OzsKKyAgKi1uMzJ8KiItbjMyICIpIGxpYm1hZ2ljPU4zMjs7CisgICotNjR8KiItNjQgIikgbGlibWFnaWM9NjQtYml0OzsKKyAgKikgbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICBlc2FjCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKKyMgVGhpcyBtdXN0IGJlIExpbnV4IEVMRi4KK2xpbnV4KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworbmV0YnNkKikKKyAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworbnRvLXFueCopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xcLnNvfF9waWNcLmEpJCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdtYXRjaF9wYXR0ZXJuIC9saWJbW14vXV0rKFwuc29cLltbMC05XV0rXC5bWzAtOV1dK3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK29zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc29sYXJpcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgIG1vdG9yb2xhKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNW1swLTldXVtbMC05XV0qIFZlcnNpb24gW1swLTldXScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKKyAgICA7OworICBuY3IpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBzZXF1ZW50KQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgICA7OworICBzbmkpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiBkeW5hbWljIGxpYiIKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgICA7OworICBzaWVtZW5zKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgcGMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCB1bml4d2FyZSogfCBPcGVuVU5JWCogfCBzeXN2NCp1dzIqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworZXNhYworXSkKK2ZpbGVfbWFnaWNfY21kPSRsdF9jdl9maWxlX21hZ2ljX2NtZAorZGVwbGlic19jaGVja19tZXRob2Q9JGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kCit0ZXN0IC16ICIkZGVwbGlic19jaGVja19tZXRob2QiICYmIGRlcGxpYnNfY2hlY2tfbWV0aG9kPXVua25vd24KK10pIyBBQ19ERVBMSUJTX0NIRUNLX01FVEhPRAorCisKKyMgQUNfUFJPR19OTQorIyAtLS0tLS0tLS0tCisjIGZpbmQgdGhlIHBhdGhuYW1lIHRvIGEgQlNELWNvbXBhdGlibGUgbmFtZSBsaXN0ZXIKK0FDX0RFRlVOKFtBQ19QUk9HX05NXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSwgbHRfY3ZfcGF0aF9OTSwKK1tpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuIAorICAgIGx0X25tX3RvX2NoZWNrPSIkbHRfbm1fdG9fY2hlY2sgbm0iCisgIGZpCisgIGZvciBsdF90bXBfbm0gaW4gJGx0X25tX3RvX2NoZWNrOyBkbworICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICAgIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluL2VsZiAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICAgIHRtcF9ubT0iJGFjX2Rpci8kbHRfdG1wX25tIgorICAgICAgaWYgdGVzdCAtZiAiJHRtcF9ubSIgfHwgdGVzdCAtZiAiJHRtcF9ubSRhY19leGVleHQiIDsgdGhlbgorCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgorCSMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisJIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAorCSMgVHJ1NjQncyBubSBjb21wbGFpbnMgdGhhdCAvZGV2L251bGwgaXMgYW4gaW52YWxpZCBvYmplY3QgZmlsZQorCWNhc2UgYCIkdG1wX25tIiAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnYCBpbgorCSovZGV2L251bGwqIHwgKidJbnZhbGlkIGZpbGUgb3Igb2JqZWN0IHR5cGUnKikKKwkgIGx0X2N2X3BhdGhfTk09IiR0bXBfbm0gLUIiCisJICBicmVhaworCSAgOzsKKwkqKQorCSAgY2FzZSBgIiR0bXBfbm0iIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJICAqL2Rldi9udWxsKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtcCIKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgICopCisJICAgIGx0X2N2X3BhdGhfTk09JHtsdF9jdl9wYXRoX05NPSIkdG1wX25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0CisJICAgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgZG9uZQorICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICBkb25lCisgIHRlc3QgLXogIiRsdF9jdl9wYXRoX05NIiAmJiBsdF9jdl9wYXRoX05NPW5tCitmaV0pCitOTT0iJGx0X2N2X3BhdGhfTk0iCitdKSMgQUNfUFJPR19OTQorCisKKyMgQUNfQ0hFQ0tfTElCTQorIyAtLS0tLS0tLS0tLS0tCisjIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKK0FDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitMSUJNPQorY2FzZSAkaG9zdCBpbgorKi0qLWJlb3MqIHwgKi0qLWN5Z3dpbiogfCAqLSotcHczMiogfCAqLSotZGFyd2luKikKKyAgIyBUaGVzZSBzeXN0ZW0gZG9uJ3QgaGF2ZSBsaWJtLCBvciBkb24ndCBuZWVkIGl0CisgIDs7CisqLW5jci1zeXN2NC4zKikKKyAgQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCwgTElCTT0iLWxtdyIpCisgIEFDX0NIRUNLX0xJQihtLCBjb3MsIExJQk09IiRMSUJNIC1sbSIpCisgIDs7CisqKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSItbG0iKQorICA7OworZXNhYworXSkjIEFDX0NIRUNLX0xJQk0KKworCisjIEFDX0xJQkxURExfQ09OVkVOSUVOQ0UoW0RJUkVDVE9SWV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IgdGhlIGxpYmx0ZGwgY29udmVuaWVuY2UgbGlicmFyeSBhbmQKKyMgTFRETElOQ0wgdG8gdGhlIGluY2x1ZGUgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGhlYWRlciBhbmQgYWRkcworIyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCisjIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLiAgTElCTFRETCB3aWxsIGJlIHByZWZpeGVkIHdpdGgKKyMgJyR7dG9wX2J1aWxkZGlyfS8nIGFuZCBMVERMSU5DTCB3aWxsIGJlIHByZWZpeGVkIHdpdGggJyR7dG9wX3NyY2Rpcn0vJworIyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpLiAgSWYgeW91ciBwYWNrYWdlIGlzIG5vdCBmbGF0IGFuZCB5b3UncmUgbm90CisjIHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFuZCB0b3Bfc3JjZGlyIGFwcHJvcHJpYXRlbHkgaW4KKyMgdGhlIE1ha2VmaWxlcy4KK0FDX0RFRlVOKFtBQ19MSUJMVERMX0NPTlZFTklFTkNFXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCisgIGNhc2UgJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIGluCisgIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OworICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCisgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7CisgIGVzYWMKKyAgTElCTFRETD0nJHt0b3BfYnVpbGRkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKS9saWJsdGRsYy5sYQorICBMVERMSU5DTD0nLUkke3RvcF9zcmNkaXJ9LydpZmVsc2UoJCMsMSxbJDFdLFsnbGlibHRkbCddKQorICAjIEZvciBiYWNrd2FyZHMgbm9uLWdldHRleHQgY29uc2lzdGVudCBjb21wYXRpYmlsaXR5Li4uCisgIElOQ0xUREw9IiRMVERMSU5DTCIKK10pIyBBQ19MSUJMVERMX0NPTlZFTklFTkNFCisKKworIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFKFtESVJFQ1RPUlldKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yIHRoZSBsaWJsdGRsIGluc3RhbGxhYmxlIGxpYnJhcnkgYW5kCisjIExURExJTkNMIHRvIHRoZSBpbmNsdWRlIGZsYWdzIGZvciB0aGUgbGlibHRkbCBoZWFkZXIgYW5kIGFkZHMKKyMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0CisjIEFDX0NPTkZJR19TVUJESVJTIGlzIG5vdCBjYWxsZWQgaGVyZS4gIElmIERJUkVDVE9SWSBpcyBub3QgcHJvdmlkZWQsCisjIGFuZCBhbiBpbnN0YWxsZWQgbGlibHRkbCBpcyBub3QgZm91bmQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYGxpYmx0ZGwnLgorIyBMSUJMVERMIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnJHt0b3BfYnVpbGRkaXJ9LycjIGFuZCBMVERMSU5DTCB3aXRoCisjICcke3RvcF9zcmNkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKS4gIElmIHlvdXIgcGFja2FnZSBpcyBub3QKKyMgZmxhdCBhbmQgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhbmQgdG9wX3NyY2RpcgorIyBhcHByb3ByaWF0ZWx5IGluIHRoZSBNYWtlZmlsZXMuCisjIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KK0FDX0RFRlVOKFtBQ19MSUJMVERMX0lOU1RBTExBQkxFXSwKK1tBQ19CRUZPUkUoWyQwXSxbQUNfTElCVE9PTF9TRVRVUF0pZG5sCisgIEFDX0NIRUNLX0xJQihsdGRsLCBsdF9kbGluaXQsCisgIFt0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHh5ZXMgJiYgZW5hYmxlX2x0ZGxfaW5zdGFsbD1ub10sCisgIFtpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiID0geG5vOyB0aGVuCisgICAgIEFDX01TR19XQVJOKFtsaWJsdGRsIG5vdCBpbnN0YWxsZWQsIGJ1dCBpbnN0YWxsYXRpb24gZGlzYWJsZWRdKQorICAgZWxzZQorICAgICBlbmFibGVfbHRkbF9pbnN0YWxsPXllcworICAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiA9IHgieWVzIjsgdGhlbgorICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIgorICAgIExJQkxUREw9JyR7dG9wX2J1aWxkZGlyfS8naWZlbHNlKCQjLDEsWyQxXSxbJ2xpYmx0ZGwnXSkvbGlibHRkbC5sYQorICAgIExURExJTkNMPSctSSR7dG9wX3NyY2Rpcn0vJ2lmZWxzZSgkIywxLFskMV0sWydsaWJsdGRsJ10pCisgIGVsc2UKKyAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtaW5zdGFsbD1ubyIKKyAgICBMSUJMVERMPSItbGx0ZGwiCisgICAgTFRETElOQ0w9CisgIGZpCisgICMgRm9yIGJhY2t3YXJkcyBub24tZ2V0dGV4dCBjb25zaXN0ZW50IGNvbXBhdGliaWxpdHkuLi4KKyAgSU5DTFRETD0iJExURExJTkNMIgorXSkjIEFDX0xJQkxURExfSU5TVEFMTEFCTEUKKworCisjIEFDX0xJQlRPT0xfQ1hYCisjIC0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBzdXBwb3J0IGZvciBDKysgbGlicmFyaWVzCitBQ19ERUZVTihbQUNfTElCVE9PTF9DWFhdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0NYWF0pCitdKSMgQUNfTElCVE9PTF9DWFgKKworCisjIF9MVF9BQ19MQU5HX0NYWAorIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKK0FDX1JFUVVJUkUoW19MVF9BQ19QUk9HX0NYWENQUF0pCitfTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Q1hYXSkKK10pIyBfTFRfQUNfTEFOR19DWFgKKworIyBfTFRfQUNfUFJPR19DWFhDUFAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1BST0dfQ1hYQ1BQXSwKK1sKK0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKK2lmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIEFDX1BST0dfQ1hYQ1BQCitmaQorXSkjIF9MVF9BQ19QUk9HX0NYWENQUAorCisjIEFDX0xJQlRPT0xfRjc3CisjIC0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBzdXBwb3J0IGZvciBGb3J0cmFuIDc3IGxpYnJhcmllcworQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfTEFOR19GNzddKQorXSkjIEFDX0xJQlRPT0xfRjc3CisKKworIyBfTFRfQUNfTEFOR19GNzcKKyMgLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfRjc3XSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pCitfTFRfQUNfU0hFTExfSU5JVChbdGFnbmFtZXM9JHt0YWduYW1lcyske3RhZ25hbWVzfSx9Rjc3XSkKK10pIyBfTFRfQUNfTEFOR19GNzcKKworCisjIEFDX0xJQlRPT0xfR0NKCisjIC0tLS0tLS0tLS0tLS0tCisjIGVuYWJsZSBzdXBwb3J0IGZvciBHQ0ogbGlicmFyaWVzCitBQ19ERUZVTihbQUNfTElCVE9PTF9HQ0pdLAorW0FDX1JFUVVJUkUoW19MVF9BQ19MQU5HX0dDSl0pCitdKSMgQUNfTElCVE9PTF9HQ0oKKworCisjIF9MVF9BQ19MQU5HX0dDSgorIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pdLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sW10sCisgIFtBQ19QUk9WSURFX0lGRUxTRShbQV1bTV9QUk9HX0dDSl0sW10sCisgICAgW0FDX1BST1ZJREVfSUZFTFNFKFtMVF9BQ19QUk9HX0dDSl0sW10sCisgICAgICBbaWZkZWYoW0FDX1BST0dfR0NKXSxbQUNfUkVRVUlSRShbQUNfUFJPR19HQ0pdKV0sCisJIFtpZmRlZihbQV1bTV9QUk9HX0dDSl0sW0FDX1JFUVVJUkUoW0FdW01fUFJPR19HQ0pdKV0sCisJICAgW0FDX1JFUVVJUkUoW0FdW0NfUFJPR19HQ0pfT1JfQV1bTV9QUk9HX0dDSl0pXSldKV0pXSldKQorX0xUX0FDX1NIRUxMX0lOSVQoW3RhZ25hbWVzPSR7dGFnbmFtZXMrJHt0YWduYW1lc30sfUdDSl0pCitdKSMgX0xUX0FDX0xBTkdfR0NKCisKKworIyBBQ19MSUJUT09MX1JDCisjIC0tLS0tLS0tLS0tLS0KKyMgZW5hYmxlIHN1cHBvcnQgZm9yIFdpbmRvd3MgcmVzb3VyY2UgZmlsZXMKK0FDX0RFRlVOKFtBQ19MSUJUT09MX1JDXSwKK1tBQ19SRVFVSVJFKFtMVF9BQ19QUk9HX1JDXSkKK19MVF9BQ19TSEVMTF9JTklUKFt0YWduYW1lcz0ke3RhZ25hbWVzKyR7dGFnbmFtZXN9LH1SQ10pCitdKSMgQUNfTElCVE9PTF9SQworCisKKyMgQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJzIGZvciB0aGUgQyBjb21waWxlciBhcmUKKyMgc3VpdGFibHkgZGVmaW5lZC4gIFRob3NlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkKKyMgQUNfTElCVE9PTF9DT05GSUcgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DX0NPTkZJR10pCitBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddLAorW2x0X3NhdmVfQ0M9IiRDQyIKK0FDX0xBTkdfUFVTSChDKQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9YworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX0FDX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDtcbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oKXtyZXR1cm4oMCk7fVxuJworCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSSgkMSkKK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUMoJDEpCitBQ19MSUJUT09MX1BST0dfQ0NfQ19PKCQxKQorQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUygkMSkKK0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEgoJDEpCitBQ19MSUJUT09MX1NZU19MSUJfU1RSSVAKK0FDX0xJQlRPT0xfRExPUEVOX1NFTEYKKworIyBSZXBvcnQgd2hpY2ggbGlicmFyeSB0eXBlcyB3aWxsIGFjdHVhbGx5IGJlIGJ1aWx0CitBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCitBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK3Rlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7CisKK2FpeDQqIHwgYWl4NSopCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBmaQorICAgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1BPUAorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIEFDX0xJQlRPT0xfTEFOR19DX0NPTkZJRworCisKKyMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIEMgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10sIFtfTFRfQUNfTEFOR19DWFhfQ09ORklHKENYWCldKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX0NYWF9DT05GSUddLAorW0FDX0xBTkdfUFVTSChDKyspCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCitBQ19SRVFVSVJFKFtfTFRfQUNfUFJPR19DWFhDUFBdKQorCitfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIERlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3QgYmVpbmcgbGlua2VkOgorX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPQorX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0KK19MVF9BQ19UQUdWQVIocHJlZGVwcywgJDEpPQorX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPQorX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMrKyB0ZXN0IHNvdXJjZXMuCithY19leHQ9Y3BwCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBDKysgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7XG4iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9J2ludCBtYWluKGludCwgY2hhciAqW1tdXSkgeyByZXR1cm4oMCk7IH1cbicKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX0FDX1NZU19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSRDQworbHRfc2F2ZV9MRD0kTEQKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0kR1hYCitsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECitpZiB0ZXN0IC1uICIke2x0X2N2X3Byb2dfZ251X2xkY3h4K3NldH0iOyB0aGVuCisgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorZWxzZQorICAkYXNfdW5zZXQgbHRfY3ZfcHJvZ19nbnVfbGQKK2ZpCitpZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KKyAgbHRfY3ZfcGF0aF9MRD0kbHRfY3ZfcGF0aF9MRENYWAorZWxzZQorICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAorZmkKK3Rlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCitDQz0ke0NYWC0iYysrIn0KK2NvbXBpbGVyPSRDQworX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2VuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQorIyBub19idWlsdGluX2ZsYWcgc2VwYXJhdGVseQoraWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworZWxzZQorICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CitmaQorCitpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisgIEFDX1BST0dfTEQKKworICAjIENoZWNrIGlmIEdOVSBDKysgdXNlcyBHTlUgbGQgYXMgdGhlIHVuZGVybHlpbmcgbGlua2VyLCBzaW5jZSB0aGUKKyAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwgXAorCWdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgIGZpCisgIGVsc2UKKyAgICB3aXRoX2dudV9sZD1ubworICAgIHdsYXJjPQorCisgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KKyAgICAjIGNvbW1hbmQgZm9yIEdOVSBDKysgZm9yIHRoZSBjYXNlIHdoZXJlIGl0IHVzZXMgdGhlIG5hdGl2ZQorICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCisgICAgIyB0aGUgcGxhdGZvcm0gaXQgaXMgYmVpbmcgdXNlZCBvbi4KKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgIGZpCisKKyAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCisKK2Vsc2UKKyAgR1hYPW5vCisgIHdpdGhfZ251X2xkPW5vCisgIHdsYXJjPQorZmkKKworIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIGFpeDQqIHwgYWl4NSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICMgT24gSUE2NCwgdGhlIGxpbmtlciBkb2VzIHJ1biB0aW1lIGxpbmtpbmcgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QKKyAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgZXhwX3N5bV9mbGFnPSctQmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICBlbHNlCisgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisKKyAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisgICAgICAjIG5lZWQgdG8gZG8gcnVudGltZSBsaW5raW5nLgorICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeDUqKQorCWZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgY2FzZSAkbGRfZmxhZyBpbgorCSAgKi1icnRsKikKKwkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgYnJlYWsKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgZXhwX3N5bV9mbGFnPSctYmV4cG9ydCcKKyAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICBmaQorCisgICAgIyBXaGVuIGxhcmdlIGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBvYmplY3RzIGFyZSBidWlsdCwgQUlYIGxkIGNhbgorICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgIyBDWFhGTEFHUy9DRkxBR1MgZm9yIGcrKy9nY2MuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhhdCBpcyBub3QKKyAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQorICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisgICAgICAjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwljb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAorCSAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwl0aGVuCisJICAjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisgICAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwlzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgIyBub3QgdXNpbmcgZ2NjCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgVmlzdWFsQWdlIEMrKywgVmVyc2lvbiA1LjUgZm9yIEFJWCA1TCBmb3IgSUEtNjQsIEJldGEgMyBSZWxlYXNlCisJIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwlzaGFyZWRfZmxhZz0nLUcnCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwllbHNlCisJICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCWZpCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW50aW1lIGxvYWRpbmcgZmxhZ3MgKC1icnRsKSwKKyAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisgICAgICBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0iLXogbm9kZWZzIgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorICAgICAgZWxzZQorCSMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eSBleGVjdXRhYmxlLgorCV9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwlfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkIGxpYnJhcmllcy4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgZmkKKyAgICBmaQorICAgIDs7CisKKyAgYmVvcyopCisgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgICMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKyAgICAgICMgc3VwcG9ydCAtLXVuZGVmaW5lZC4gIFRoaXMgZGVzZXJ2ZXMgc29tZSBpbnZlc3RpZ2F0aW9uLiAgRklYTUUKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICBlbHNlCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgZmkKKyAgICA7OworCisgIGNob3J1cyopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICopCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgZXNhYworICAgIDs7CisKKyAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgIF9MVF9BQ19UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKworICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCWNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgIGVsc2UKKwllY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwljYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgZml+CisgICAgICAkQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgZWxzZQorICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIGZpCisgIDs7CisgICAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgIHJoYXBzb2R5KiB8IGRhcndpbjEuW1swMTJdXSkKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICA7OworICAgICAgICopICMgRGFyd2luIDEuMyBvbgorICAgICAgICAgaWYgdGVzdCAteiAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVH0gOyB0aGVuCisgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGNhc2UgJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IGluCisgICAgICAgICAgICAgMTAuW1swMTJdXSkKKyAgICAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0tZmxhdF9uYW1lc3BhY2UgJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnCisgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgIDEwLiopCisgICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgZXNhYworICAgICAgICAgZmkKKyAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JycKKyAgICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgOyB0aGVuCisgICAgICBsdF9pbnRfYXBwbGVfY2Nfc2luZ2xlX21vZD1ubworICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisgICAgICBpZiAkQ0MgLWR1bXBzcGVjcyAyPiYxIHwgJEVHUkVQICdzaW5nbGVfbW9kdWxlJyA+L2Rldi9udWxsIDsgdGhlbgorICAgICAgIGx0X2ludF9hcHBsZV9jY19zaW5nbGVfbW9kPXllcworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KKyAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWR5bmFtaWNsaWIgLXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKKyAgICAgIGVsc2UKKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nJworICAgICAgICBmaQorICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9JyRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAtYnVuZGxlICRsaWJvYmpzICRkZXBsaWJzJGNvbXBpbGVyX2ZsYWdzJworICAgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgICAgIGlmIHRlc3QgIlgkbHRfaW50X2FwcGxlX2NjX3NpbmdsZV9tb2QiID0gWHllcyA7IHRoZW4KKyAgICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtZHluYW1pY2xpYiAtc2luZ2xlX21vZHVsZSAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyAke2xpYn0tbWFzdGVyLm8gJGxpYm9ianN+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICR7bGlifS1tYXN0ZXIubyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSAkcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICBmaQorICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgZWxzZQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgeGxjKikKKyAgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICR7d2x9LXNpbmdsZV9tb2R1bGUgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWluc3RhbGxfbmFtZSAke3dsfWBlY2hvICRycGF0aC8kc29uYW1lYCAkdmVyc3RyaW5nJworICAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgLXFta3Nocm9iaiAke3dsfS1zaW5nbGVfbW9kdWxlICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgOzsKKyAgICAgICAqKQorICAgICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICBmaQorICAgICAgICA7OworCisgIGRndXgqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBlYysrKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgIGdoY3gqKQorCSMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICBmcmVlYnNkW1sxMl1dKikKKyAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIHJlcG9ydGVkIHRvIGJlIGZhaXJseSBicm9rZW4gYmVmb3JlIHN3aXRjaCB0byBFTEYKKyAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgOzsKKyAgZnJlZWJzZC1lbGYqKQorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgIDs7CisgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCisgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAjIGNvbnZlbnRpb25zCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICA7OworICBnbnUqKQorICAgIDs7CisgIGhwdXg5KikKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCSMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgQ0MqKQorICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworICAgIGFDQyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICAjCisgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisgICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorICAgICAgIyBkZXBlbmRlbmNpZXMuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgZ3JlcCAiW1stXV1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJHJtICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICBlbHNlCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgaHB1eDEwKnxocHV4MTEqKQorICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPScrYiAkbGliZGlyJworICAgICAgICA7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgICA7OworICAgICAgZXNhYworICAgIGZpCisgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworICAgICopCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkJICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkJICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgIGFDQyopCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gKCRDQyAtYiAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSkgfCBncmVwICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaHBwYSo2NCopCisJICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGlhNjQqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStub2RlZmF1bHRycGF0aCAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGZpCisJZWxzZQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBpbnRlcml4MyopCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICMgZGVmYXVsdCkgYW5kIHJlbG9jYXRlZCBpZiB0aGV5IGNvbmZsaWN0LCB3aGljaCBpcyBhIHNsb3cgdmVyeSBtZW1vcnkKKyAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICMgdGltZS4gIE1vdmluZyB1cCBmcm9tIDB4MTAwMDAwMDAgYWxzbyBhbGxvd3MgbW9yZSBzYnJrKDIpIHNwYWNlLgorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgOzsKKyAgaXJpeDUqIHwgaXJpeDYqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBTR0kgQysrCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJIyBpbiB0aGUgYXJjaGl2ZS4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICBlbHNlCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgIC1vICRsaWInCisJICBmaQorCWZpCisJX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisJOzsKKyAgICBlc2FjCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgOzsKKyAgbGludXgqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBLQ0MqKQorCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgZ3JlcCAibGQiYDsgcm0gLWYgbGliY29uZnRlc3Qkc2hhcmVkX2V4dDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoLCRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLUJzdGF0aWMiLCB3aGVyZSAiQ0MiIGlzIHRoZSBLQUkgQysrIGNvbXBpbGVyLgorCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgaWNwYyopCisJIyBJbnRlbCBDKysKKwl3aXRoX2dudV9sZD15ZXMKKwkjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scworCSMgaWYgd2UgYWRkICRwcmVkZXBfb2JqZWN0cyBhbmQgJHBvc3RkZXBfb2JqZWN0cywgaG93ZXZlciA3LjEgYW5kCisJIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KKwljYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkqIlZlcnNpb24gNy4iKikKKyAgCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgIAkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgIDs7CisJKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKKwkgIHRtcF9pZHluPQorCSAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OworCSAgZXNhYworICAJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQnIiR0bXBfaWR5biInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgOzsKKwllc2FjCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCV9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJOzsKKyAgICAgIHBnQ0MqKQorICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworICAJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIDs7CisgICAgICBjeHgqKQorCSMgQ29tcGFxIEMrKworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgIC1vICRsaWIgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMnCisKKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJIworCSMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkjIGRlcGVuZGVuY2llcy4KKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgZ3JlcCAibGQiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQgLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyBlY2hvICRsaXN0JworCTs7CisgICAgZXNhYworICAgIDs7CisgIGx5bnhvcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIG04OGsqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworICBtdnMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBjeHgqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgbmV0YnNkKikKKyAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGxpbmtlcl9mbGFncycKKyAgICAgIHdsYXJjPQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgIGZpCisgICAgIyBXb3JrYXJvdW5kIHNvbWUgYnJva2VuIHByZS0xLjUgdG9vbGNoYWlucworICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworICAgIDs7CisgIG9wZW5ic2QyKikKKyAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICBmaQorICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgIDs7CisgIG9zZjMqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBLQ0MqKQorCSMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCisJOzsKKyAgICAgIFJDQyopCisJIyBSYXRpb25hbCBDKysgMi40LjEKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICAgIGN4eCopCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkjCisJIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSMgZGVwZW5kZW5jaWVzLgorCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwICJsZCIgfCBncmVwIC12ICJsZDoiYDsgdGVtcGxpc3Q9YGVjaG8gJHRlbXBsaXN0IHwgJFNFRCAicy9cKF4uKmxkLipcKVwoIC4qbGQuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7IGVjaG8gJGxpc3QnCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCisKKwllbHNlCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIG9zZjQqIHwgb3NmNSopCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIEtDQyopCisJIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJworCTs7CisgICAgICBSQ0MqKQorCSMgUmF0aW9uYWwgQysrIDIuNC4xCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICBjeHgqKQorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgorCSAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkJGFsbG93X3VuZGVmaW5lZF9mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbXN5bSAtc29uYW1lICRzb25hbWUgLVdsLC1pbnB1dCAtV2wsJGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbgkkdmVyc3RyaW5nYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+CisJICAkcm0gJGxpYi5leHAnCisKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSMKKwkjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJIyBkZXBlbmRlbmNpZXMuCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgImxkIiB8IGdyZXAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gZWNobyAkdGVtcGxpc3QgfCAkU0VEICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgZWNobyAkbGlzdCcKKwk7OworICAgICAgKikKKwlpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgIlwtTCInCisKKwllbHNlCisJICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisgICAgZXNhYworICAgIDs7CisgIHBzb3MqKQorICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICA7OworICBzdW5vczQqKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBDQyopCisJIyBTdW4gQysrIDQueAorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgbGNjKikKKwkjIEx1Y2lkCisJIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisgICAgICAqKQorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgIGVzYWMKKyAgICA7OworICBzb2xhcmlzKikKKyAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgQ0MqKQorCSMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCisJX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwljYXNlICRob3N0X29zIGluCisJICBzb2xhcmlzMi5bWzAtNV1dIHwgc29sYXJpczIuW1swLTVdXS4qKSA7OworCSAgKikKKwkgICAgIyBUaGUgQysrIGNvbXBpbGVyIGlzIHVzZWQgYXMgbGlua2VyIHNvIHdlIG11c3QgdXNlICR3bAorCSAgICAjIGZsYWcgdG8gcGFzcyB0aGUgY29tbWFuZHMgdG8gdGhlIHVuZGVybHlpbmcgc3lzdGVtCisJICAgICMgbGlua2VyLiBXZSBtdXN0IGFsc28gcGFzcyBlYWNoIGNvbnZpZW5jZSBsaWJyYXJ5IHRocm91Z2gKKwkgICAgIyB0byB0aGUgc3lzdGVtIGxpbmtlciBiZXR3ZWVuIGFsbGV4dHJhY3QvZGVmYXVsdGV4dHJhY3QuCisJICAgICMgVGhlIEMrKyBjb21waWxlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKKwkgICAgIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCisJICAgICMgd2l0aG91dCAkd2wuCisJICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0teiAke3dsfWFsbGV4dHJhY3RgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkZWNobyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0teiAke3dsfWRlZmF1bHRleHRyYWN0JworCSAgICA7OworCWVzYWMKKwlfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKworCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworCisJIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJIyBpbiB0aGUgYXJjaGl2ZS4KKwlfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgZ2N4KikKKwkjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKworCSMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwk7OworICAgICAgKikKKwkjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgorCWlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCisJICBpZiAkQ0MgLS12ZXJzaW9uIHwgZ3JlcCAtdiAnXjJcLjcnID4gL2Rldi9udWxsOyB0aGVuCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0iJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCBncmVwIFwiXC1MXCIiCisJICBlbHNlCisJICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgIyBwbGF0Zm9ybS4KKwkgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH4kZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRybSAkbGliLmV4cCcKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9IiRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8IGdyZXAgXCJcLUxcIiIKKwkgIGZpCisKKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICR3bCRsaWJkaXInCisJZmkKKwk7OworICAgIGVzYWMKKyAgICA7OworICBzeXN2NCp1dzIqIHwgc3lzdjVPcGVuVU5JWCogfCBzeXN2NVVuaXhXYXJlNy5bWzAxXV0uW1sxMF1dKiB8IHVuaXh3YXJlNyogfCBzY28zLjJ2NS4wLltbMDI0XV0qKQorICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCTs7CisgICAgZXNhYworICAgIDs7CisgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICMgYXMgLXogZGVmcy4KKyAgICAjIEZvciBzZWN1cml0eSByZWFzb25zLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzCisgICAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKKyAgICAjIERUX1JVTlBBVEggdGFnIGZyb20gZXhlY3V0YWJsZXMgYW5kIGxpYnJhcmllcy4gIEJ1dCBkb2luZyBzbworICAgICMgcmVxdWlyZXMgdGhhdCB5b3UgY29tcGlsZSBldmVyeXRoaW5nIHR3aWNlLCB3aGljaCBpcyBhIHBhaW4uCisgICAgIyBTbyB0aGF0IGJlaGF2aW91ciBpcyBvbmx5IGVuYWJsZWQgaWYgU0NPQUJTUEFUSCBpcyBzZXQgdG8gYQorICAgICMgbm9uLWVtcHR5IHZhbHVlIGluIHRoZSBlbnZpcm9ubWVudC4gIE1vc3QgbGlrZWx5IG9ubHkgdXNlZnVsIGZvcgorICAgICMgY3JlYXRpbmcgb2ZmaWNpYWwgZGlzdHJpYnV0aW9ucyBvZiBwYWNrYWdlcy4KKyAgICAjIFRoaXMgaXMgYSBoYWNrIHVudGlsIGxpYnRvb2wgb2ZmaWNpYWxseSBzdXBwb3J0cyBhYnNvbHV0ZSBwYXRoCisgICAgIyBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcmllcy4KKyAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgIF9MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIENDKikKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwk7OworICAgIGVzYWMKKyAgICA7OworICB0YW5kZW0qKQorICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBOQ0MqKQorCSMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworICAgICAgKikKKwkjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgICAgOzsKKyAgdnh3b3JrcyopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7CisgICopCisgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCit0ZXN0ICIkX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK19MVF9BQ19UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCitfTFRfQUNfVEFHVkFSKExELCAkMSk9IiRMRCIKKworIyMgQ0FWRUFUIEVNUFRPUjoKKyMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCitBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQKCQxKQorQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKK0FDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCitBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCitBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQorQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCitBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKKworQUNfTElCVE9PTF9DT05GSUcoJDEpCisKK0FDX0xBTkdfUE9QCitDQz0kbHRfc2F2ZV9DQworTERDWFg9JExECitMRD0kbHRfc2F2ZV9MRAorR0NDPSRsdF9zYXZlX0dDQword2l0aF9nbnVfbGRjeHg9JHdpdGhfZ251X2xkCit3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorbHRfY3ZfcGF0aF9MRENYWD0kbHRfY3ZfcGF0aF9MRAorbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECitsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKK2x0X2N2X3Byb2dfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCitdKSMgQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUcKKworIyBBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpZ3VyZSBvdXQgImhpZGRlbiIgbGlicmFyeSBkZXBlbmRlbmNpZXMgZnJvbSB2ZXJib3NlCisjIGNvbXBpbGVyIG91dHB1dCB3aGVuIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSxbCitkbmwgd2UgY2FuJ3QgdXNlIHRoZSBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUgaGVyZSwKK2RubCBiZWNhdXNlIGl0IGNvbnRhaW5zIGNvZGUgaW50ZW5kZWQgZm9yIGFuIGV4ZWN1dGFibGUsCitkbmwgbm90IGEgbGlicmFyeS4gIEl0J3MgcG9zc2libGUgd2Ugc2hvdWxkIGxldCBlYWNoCitkbmwgdGFnIGRlZmluZSBhIG5ldyBsdF8/Pz8/X2xpbmtfdGVzdF9jb2RlIHZhcmlhYmxlLAorZG5sIGJ1dCBpdCdzIG9ubHkgdXNlZCBoZXJlLi4uCitpZmVsc2UoWyQxXSxbXSxbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgoraW50IGE7Cit2b2lkIGZvbyAodm9pZCkgeyBhID0gMDsgfQorRU9GCitdLFskMV0sW0NYWF0sW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK0VPRgorXSxbJDFdLFtGNzddLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlcio0IGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK0VPRgorXSxbJDFdLFtHQ0pdLFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCitwdWJsaWMgY2xhc3MgZm9vIHsKKyAgcHJpdmF0ZSBpbnQgYTsKKyAgcHVibGljIHZvaWQgYmFyICh2b2lkKSB7CisgICAgYSA9IDA7CisgIH0KK307CitFT0YKK10pCitkbmwgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5Citkbmwgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgoraWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyAgIyBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCisKKyAgIyBTZW50aW5lbCB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgYXJlIGJlZm9yZQorICAjIHRoZSBjb25mdGVzdCBvYmplY3QgZmlsZS4KKyAgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT1ubworCisgICMgVGhlIGAqJyBpbiB0aGUgY2FzZSBtYXRjaGVzIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGBjYXNlJyBpbgorICAjICRvdXRwdXRfdmVyYm9zZV9jbWQgY2FuIHRyaWdnZXIgZ2xvYiBleHBhbnNpb24gZHVyaW5nIHRoZSBsb29wCisgICMgZXZhbCB3aXRob3V0IHRoaXMgc3Vic3RpdHV0aW9uLgorICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1gJGVjaG8gIlgkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQiIHwgJFhzZWQgLWUgIiRub19nbG9iX3N1YnN0ImAKKworICBmb3IgcCBpbiBgZXZhbCAkb3V0cHV0X3ZlcmJvc2VfbGlua19jbWRgOyBkbworICAgIGNhc2UgJHAgaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiBcCisJICB8fCB0ZXN0ICRwID0gIi1SIjsgdGhlbgorCSBwcmV2PSRwCisJIGNvbnRpbnVlCisgICAgICAgZWxzZQorCSBwcmV2PQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBjYXNlICRwIGluCisJIC1MKiB8IC1SKikKKwkgICAjIEludGVybmFsIGNvbXBpbGVyIGxpYnJhcnkgcGF0aHMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhvc2UKKwkgICAjIHByb3ZpZGVkIHRoZSB1c2VyLiAgVGhlIHBvc3RkZXBzIGFscmVhZHkgY29tZSBhZnRlciB0aGUKKwkgICAjIHVzZXIgc3VwcGxpZWQgbGlicyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb2Nlc3MgdGhlbS4KKwkgICBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKSI7IHRoZW4KKwkgICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7cHJldn0ke3B9IgorCSAgIGVsc2UKKwkgICAgIF9MVF9BQ19UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9IiR7X0xUX0FDX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0gJHtwcmV2fSR7cH0iCisJICAgZmkKKwkgICA7OworCSAjIFRoZSAiLWwiIGNhc2Ugd291bGQgbmV2ZXIgY29tZSBiZWZvcmUgdGhlIG9iamVjdCBiZWluZworCSAjIGxpbmtlZCwgc28gZG9uJ3QgYm90aGVyIGhhbmRsaW5nIHRoaXMgY2FzZS4KKwkgZXNhYworICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKSI7IHRoZW4KKwkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7cHJldn0ke3B9IgorCSBlbHNlCisJICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke19MVF9BQ19UQUdWQVIocG9zdGRlcHMsICQxKX0gJHtwcmV2fSR7cH0iCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKi4kb2JqZXh0KQorICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHRlc3Qgb2JqZWN0IGZpbGUgb25seSBzaG93cyB1cAorICAgICAgICMgb25jZSBpbiB0aGUgY29tcGlsZXIgb3V0cHV0LgorICAgICAgIGlmIHRlc3QgIiRwIiA9ICJjb25mdGVzdC4kb2JqZXh0IjsgdGhlbgorCSBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPXllcworCSBjb250aW51ZQorICAgICAgIGZpCisKKyAgICAgICBpZiB0ZXN0ICIkcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZSIgPSBubzsgdGhlbgorCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9BQ19UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICopIDs7ICMgSWdub3JlIHRoZSByZXN0LgorCisgICAgZXNhYworICBkb25lCisKKyAgIyBDbGVhbiB1cC4KKyAgcm0gLWYgYS5vdXQgYS5leGUKK2Vsc2UKKyAgZWNobyAibGlidG9vbC5tNDogZXJyb3I6IHByb2JsZW0gY29tcGlsaW5nICQxIHRlc3QgcHJvZ3JhbSIKK2ZpCisKKyRybSAtZiBjb25mZXN0LiRvYmpleHQKKworIyBQT1JUTUU6IG92ZXJyaWRlIGFib3ZlIHRlc3Qgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBicm9rZW4KK2lmZWxzZShbJDFdLFtDWFhdLAorW2Nhc2UgJGhvc3Rfb3MgaW4KK2ludGVyaXgzKikKKyAgIyBJbnRlcml4IDMuNSBpbnN0YWxscyBjb21wbGV0ZWx5IGhvc2VkIC5sYSBmaWxlcyBmb3IgQysrLCBzbyByYXRoZXIgdGhhbgorICAjIGhhY2sgYWxsIGFyb3VuZCBpdCwgbGV0J3MganVzdCB0cnVzdCAiZysrIiB0byBEVFJULgorICBfTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCQxKT0KKyAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsJDEpPQorICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBzLCQxKT0KKyAgOzsKKworc29sYXJpcyopCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIENDKikKKyAgICAjIEFkZGluZyB0aGlzIHJlcXVpcmVzIGEga25vd24tZ29vZCBzZXR1cCBvZiBzaGFyZWQgbGlicmFyaWVzIGZvcgorICAgICMgU3VuIGNvbXBpbGVyIHZlcnNpb25zIGJlZm9yZSA1LjYsIGVsc2UgUElDIG9iamVjdHMgZnJvbSBhbiBvbGQKKyAgICAjIGFyY2hpdmUgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgb3V0cHV0LCBsZWFkaW5nIHRvIHN1YnRsZSBidWdzLgorICAgIF9MVF9BQ19UQUdWQVIocG9zdGRlcHMsJDEpPSctbENzdGQgLWxDcnVuJworICAgIDs7CisgIGVzYWMKKyAgOzsKK2VzYWMKK10pCisKK2Nhc2UgIiAkX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpICIgaW4KKyoiIC1sYyAiKikgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vIDs7Citlc2FjCitdKSMgQUNfTElCVE9PTF9QT1NUREVQX1BSRURFUAorCisjIEFDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBDIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQorIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCitBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLCBbX0xUX0FDX0xBTkdfRjc3X0NPTkZJRyhGNzcpXSkKK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pCitBQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKKworX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCitfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCitfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KK19MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9BQ19UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZjc3IHRlc3Qgc291cmNlcy4KK2FjX2V4dD1mCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmNzcgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSIgICAgICBzdWJyb3V0aW5lIHRcbiAgICAgIHJldHVyblxuICAgICAgZW5kXG4iCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiAgICAgIHByb2dyYW0gdFxuICAgICAgZW5kXG4iCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9BQ19TWVNfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorQ0M9JHtGNzctImY3NyJ9Citjb21waWxlcj0kQ0MKK19MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCit0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCitjYXNlICRob3N0X29zIGluCithaXgzKikKKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICBmaQorICA7OworYWl4NCogfCBhaXg1KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgIGZpCisgIDs7Citlc2FjCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgordGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCitBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKK19MVF9BQ19UQUdWQVIoR0NDLCAkMSk9IiRHNzciCitfTFRfQUNfVEFHVkFSKExELCAkMSk9IiRMRCIKKworQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKK0FDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCitBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCitBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQorQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCitBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKKworQUNfTElCVE9PTF9DT05GSUcoJDEpCisKK0FDX0xBTkdfUE9QCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUcKKworCisjIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcnMgZm9yIHRoZSBDIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhvc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieQorIyBBQ19MSUJUT09MX0NPTkZJRyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCitBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddLCBbX0xUX0FDX0xBTkdfR0NKX0NPTkZJRyhHQ0opXSkKK0FDX0RFRlVOKFtfTFRfQUNfTEFOR19HQ0pfQ09ORklHXSwKK1tBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEphdmEgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWphdmEKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEphdmEgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9BQ19UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJjbGFzcyBmb28ge31cbiIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfVxuJworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7R0NKLSJnY2oifQorY29tcGlsZXI9JENDCitfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK19MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCitfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKCQxKQorQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQygkMSkKK0FDX0xJQlRPT0xfUFJPR19DQ19DX08oJDEpCitBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1MoJDEpCitBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKCQxKQorQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCitBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSCgkMSkKKworQUNfTElCVE9PTF9DT05GSUcoJDEpCisKK0FDX0xBTkdfUkVTVE9SRQorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIEFDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFycyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaG9zZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5CisjIEFDX0xJQlRPT0xfQ09ORklHIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHXSwgW19MVF9BQ19MQU5HX1JDX0NPTkZJRyhSQyldKQorQUNfREVGVU4oW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCitbQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBSQyB0ZXN0IHNvdXJjZXMuCithY19leHQ9cmMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIFJDIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfQUNfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0nc2FtcGxlIE1FTlUgeyBNRU5VSVRFTSAiJlNvdXAiLCAxMDAsIENIRUNLRUQgfVxuJworCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfQUNfU1lTX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK0NDPSR7UkMtIndpbmRyZXMifQorY29tcGlsZXI9JENDCitfTFRfQUNfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCitfTFRfQUNfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisKK0FDX0xJQlRPT0xfQ09ORklHKCQxKQorCitBQ19MQU5HX1JFU1RPUkUKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBBQ19MSUJUT09MX0xBTkdfUkNfQ09ORklHCisKKworIyBBQ19MSUJUT09MX0NPTkZJRyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWYgVEFHTkFNRSBpcyBub3QgcGFzc2VkLCB0aGVuIGNyZWF0ZSBhbiBpbml0aWFsIGxpYnRvb2wgc2NyaXB0CisjIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdW50YWdnZWQgY29uZmlnIHZhcnMuICBPdGhlcndpc2UKKyMgYWRkIGNvZGUgdG8gY29uZmlnLnN0YXR1cyBmb3IgYXBwZW5kaW5nIHRoZSBjb25maWd1cmF0aW9uIG5hbWVkIGJ5CisjIFRBR05BTUUgZnJvbSB0aGUgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgorQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSwKK1sjIFRoZSBlbHNlIGNsYXVzZSBzaG91bGQgb25seSBmaXJlIHdoZW4gYm9vdHN0cmFwcGluZyB0aGUKKyMgbGlidG9vbCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZm9yZ290IHRvIHNoaXAgbHRtYWluLnNoCisjIHdpdGggeW91ciBwYWNrYWdlLCBhbmQgeW91IHdpbGwgZ2V0IGNvbXBsYWludHMgdGhhdCB0aGVyZSBhcmUKKyMgbm8gcnVsZXMgdG8gZ2VuZXJhdGUgbHRtYWluLnNoLgoraWYgdGVzdCAtZiAiJGx0bWFpbiI7IHRoZW4KKyAgIyBTZWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24genNoLCBhbmQgc2V0IHRoZSBvcHRpb25zIHdoaWNoIGFsbG93IG91ciBjb21tYW5kcyB0aHJvdWdoCisgICMgd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorICBmaQorICAjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzIHdoaWxlIGJlaW5nCisgICMgY2FyZWZ1bCBub3QgdG8gb3ZlcnF1b3RlIHRoZSBBQ19TVUJTVGVkIHZhbHVlcy4gIFdlIHRha2UgY29waWVzIG9mIHRoZQorICAjIHZhcmlhYmxlcyBhbmQgcXVvdGUgdGhlIGNvcGllcyBmb3IgZ2VuZXJhdGlvbiBvZiB0aGUgbGlidG9vbCBzY3JpcHQuCisgIGZvciB2YXIgaW4gZWNobyBvbGRfQ0Mgb2xkX0NGTEFHUyBBUiBBUl9GTEFHUyBFR1JFUCBSQU5MSUIgTE5fUyBMVENDIExUQ0ZMQUdTIE5NIFwKKyAgICBTRUQgU0hFTEwgU1RSSVAgXAorICAgIGxpYm5hbWVfc3BlYyBsaWJyYXJ5X25hbWVzX3NwZWMgc29uYW1lX3NwZWMgZXh0cmFjdF9leHBzeW1zX2NtZHMgXAorICAgIG9sZF9zdHJpcGxpYiBzdHJpcGxpYiBmaWxlX21hZ2ljX2NtZCBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBcCisgICAgZGVwbGlic19jaGVja19tZXRob2QgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgbmVlZF9sb2NrcyBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MgXAorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyBcCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyBcCisgICAgX0xUX0FDX1RBR1ZBUihjb21waWxlciwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKENDLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoTEQsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKHByZWRlcHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihwb3N0aW5zdGFsbF9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIocG9zdHVuaW5zdGFsbF9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpIFwKKyAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgXAorICAgIF9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKSBcCisgICAgX0xUX0FDX1RBR1ZBUihpbmNsdWRlX2V4cHN5bXMsICQxKTsgZG8KKworICAgIGNhc2UgJHZhciBpbgorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkgfCBcCisgICAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpIHwgXAorICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpIHwgXAorICAgIGV4dHJhY3RfZXhwc3ltc19jbWRzIHwgcmVsb2FkX2NtZHMgfCBmaW5pc2hfY21kcyB8IFwKKyAgICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAorICAgIG9sZF9wb3N0aW5zdGFsbF9jbWRzIHwgb2xkX3Bvc3R1bmluc3RhbGxfY21kcyB8IFwKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKKyAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KKyAgICAgIGV2YWwgImx0XyR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF8kdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGNhc2UgJGx0X2VjaG8gaW4KKyAgKidcWyRdMCAtLWZhbGxiYWNrLWVjaG8iJykKKyAgICBsdF9lY2hvPWAkZWNobyAiWCRsdF9lY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFxbJF0wIC0tZmFsbGJhY2stZWNobyJbJF0vWyRdMCAtLWZhbGxiYWNrLWVjaG8iLydgCisgICAgOzsKKyAgZXNhYworCitpZmVsc2UoWyQxXSwgW10sCisgIFtjZmdmaWxlPSIke29maWxlfVQiCisgIHRyYXAgIiRybSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICRybSAtZiAiJGNmZ2ZpbGUiCisgIEFDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRvZmlsZV0pXSwKKyAgW2NmZ2ZpbGU9IiRvZmlsZSJdKQorCisgIGNhdCA8PF9fRU9GX18gPj4gIiRjZmdmaWxlIgoraWZlbHNlKFskMV0sIFtdLAorWyMhICRTSEVMTAorCisjIGAkZWNobyAiJGNmZ2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIExpYnRvb2w6CisjIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4KK1NFRD0kbHRfU0VECisKKyMgU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW4uCitYc2VkPSIkU0VEIC1lIDFzL15YLy8iCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKyMgVGhlIG5hbWVzIG9mIHRoZSB0YWdnZWQgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorYXZhaWxhYmxlX3RhZ3M9CisKKyMgIyMjIEJFR0lOIExJQlRPT0wgQ09ORklHXSwKK1sjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXSkKKworIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0kbHRfU0hFTEwKKworIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgV2hldGhlciBvciBub3QgdG8gYWRkIC1sYyBmb3IgYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KK2J1aWxkX2xpYnRvb2xfbmVlZF9sYz0kX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpCisKKyMgV2hldGhlciBvciBub3QgdG8gZGlzYWxsb3cgc2hhcmVkIGxpYnMgd2hlbiBydW50aW1lIGxpYnMgYXJlIHN0YXRpYworYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzPSRfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKQorCisjIFdoZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbi4KK2Zhc3RfaW5zdGFsbD0kZW5hYmxlX2Zhc3RfaW5zdGFsbAorCisjIFRoZSBob3N0IHN5c3RlbS4KK2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK2hvc3Q9JGhvc3QKK2hvc3Rfb3M9JGhvc3Rfb3MKKworIyBUaGUgYnVpbGQgc3lzdGVtLgorYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCitidWlsZD0kYnVpbGQKK2J1aWxkX29zPSRidWlsZF9vcworCisjIEFuIGVjaG8gcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGludGVycHJldCBiYWNrc2xhc2hlcy4KK2VjaG89JGx0X2VjaG8KKworIyBUaGUgYXJjaGl2ZXIuCitBUj0kbHRfQVIKK0FSX0ZMQUdTPSRsdF9BUl9GTEFHUworCisjIEEgQyBjb21waWxlci4KK0xUQ0M9JGx0X0xUQ0MKKworIyBMVENDIGNvbXBpbGVyIGZsYWdzLgorTFRDRkxBR1M9JGx0X0xUQ0ZMQUdTCisKKyMgQSBsYW5ndWFnZS1zcGVjaWZpYyBjb21waWxlci4KK0NDPSRsdF9bXV9MVF9BQ19UQUdWQVIoY29tcGlsZXIsICQxKQorCisjIElzIHRoZSBjb21waWxlciB0aGUgR05VIEMgY29tcGlsZXI/Cit3aXRoX2djYz0kX0xUX0FDX1RBR1ZBUihHQ0MsICQxKQorCisjIEFuIEVSRSBtYXRjaGVyLgorRUdSRVA9JGx0X0VHUkVQCisKKyMgVGhlIGxpbmtlciB1c2VkIHRvIGJ1aWxkIGxpYnJhcmllcy4KK0xEPSRsdF9bXV9MVF9BQ19UQUdWQVIoTEQsICQxKQorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSRsdF9MTl9TCisKKyMgQSBCU0QtY29tcGF0aWJsZSBubSBwcm9ncmFtLgorTk09JGx0X05NCisKKyMgQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW0KK1NUUklQPSRsdF9TVFJJUAorCisjIFVzZWQgdG8gZXhhbWluZSBsaWJyYXJpZXMgd2hlbiBmaWxlX21hZ2ljX2NtZCBiZWdpbnMgImZpbGUiCitNQUdJQ19DTUQ9JE1BR0lDX0NNRAorCisjIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KK0RMTFRPT0w9IiRETExUT09MIgorCisjIFVzZWQgb24gY3lnd2luOiBvYmplY3QgZHVtcGVyLgorT0JKRFVNUD0iJE9CSkRVTVAiCisKKyMgVXNlZCBvbiBjeWd3aW46IGFzc2VtYmxlci4KK0FTPSIkQVMiCisKKyMgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzLgorb2JqZGlyPSRvYmpkaXIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9JGx0X3JlbG9hZF9mbGFnCityZWxvYWRfY21kcz0kbHRfcmVsb2FkX2NtZHMKKworIyBIb3cgdG8gcGFzcyBhIGxpbmtlciBmbGFnIHRocm91Z2ggdGhlIGNvbXBpbGVyLgord2w9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKworIyBPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIikuCitvYmpleHQ9IiRhY19vYmpleHQiCisKKyMgT2xkIGFyY2hpdmUgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpLgorc2hyZXh0X2NtZHM9JyRzaHJleHRfY21kcycKKworIyBFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIikuCitleGVleHQ9IiRleGVleHQiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCitwaWNfbW9kZT0kcGljX21vZGUKKworIyBXaGF0IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGNvbW1hbmQ/CittYXhfY21kX2xlbj0kbHRfY3Zfc3lzX21heF9jbWRfbGVuCisKKyMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zPworY29tcGlsZXJfY19vPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKQorCisjIE11c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uPworbmVlZF9sb2Nrcz0kbHRfbmVlZF9sb2NrcworCisjIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/CituZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAorCisjIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/CituZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgorCisjIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zdXBwb3J0PSRlbmFibGVfZGxvcGVuCisKKyMgV2hldGhlciBkbG9wZW4gb2YgcHJvZ3JhbXMgaXMgc3VwcG9ydGVkLgorZGxvcGVuX3NlbGY9JGVuYWJsZV9kbG9wZW5fc2VsZgorCisjIFdoZXRoZXIgZGxvcGVuIG9mIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KK2Rsb3Blbl9zZWxmX3N0YXRpYz0kZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYworCisjIENvbXBpbGVyIGZsYWcgdG8gcHJldmVudCBkeW5hbWljIGxpbmtpbmcuCitsaW5rX3N0YXRpY19mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKQorCisjIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCitub19idWlsdGluX2ZsYWc9JGx0X1tdX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpCisKKyMgQ29tcGlsZXIgZmxhZyB0byBhbGxvdyByZWZsZXhpdmUgZGxvcGVucy4KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSBzaGFyZWQgb2JqZWN0cyBkaXJlY3RseSBmcm9tIGFyY2hpdmVzLgord2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpCisKKyMgQ29tcGlsZXIgZmxhZyB0byBnZW5lcmF0ZSB0aHJlYWQtc2FmZSBvYmplY3RzLgordGhyZWFkX3NhZmVfZmxhZ19zcGVjPSRsdF9bXV9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSkKKworIyBMaWJyYXJ5IHZlcnNpb25pbmcgdHlwZS4KK3ZlcnNpb25fdHlwZT0kdmVyc2lvbl90eXBlCisKKyMgRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXguCitsaWJuYW1lX3NwZWM9JGx0X2xpYm5hbWVfc3BlYworCisjIExpc3Qgb2YgYXJjaGl2ZSBuYW1lcy4gIEZpcnN0IG5hbWUgaXMgdGhlIHJlYWwgb25lLCB0aGUgcmVzdCBhcmUgbGlua3MuCisjIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUUuCitsaWJyYXJ5X25hbWVzX3NwZWM9JGx0X2xpYnJhcnlfbmFtZXNfc3BlYworCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9JGx0X3NvbmFtZV9zcGVjCisKKyMgQ29tbWFuZHMgdXNlZCB0byBidWlsZCBhbmQgaW5zdGFsbCBhbiBvbGQtc3R5bGUgYXJjaGl2ZS4KK1JBTkxJQj0kbHRfUkFOTElCCitvbGRfYXJjaGl2ZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpCitvbGRfcG9zdGluc3RhbGxfY21kcz0kbHRfb2xkX3Bvc3RpbnN0YWxsX2NtZHMKK29sZF9wb3N0dW5pbnN0YWxsX2NtZHM9JGx0X29sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKworIyBDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMsICQxKQorCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKQorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0kbHRfW11fTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpCithcmNoaXZlX2V4cHN5bV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpCitwb3N0aW5zdGFsbF9jbWRzPSRsdF9wb3N0aW5zdGFsbF9jbWRzCitwb3N0dW5pbnN0YWxsX2NtZHM9JGx0X3Bvc3R1bmluc3RhbGxfY21kcworCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBsb2FkYWJsZSBtb2R1bGUgKGFzc3VtZWQgc2FtZSBhcyBhYm92ZSBpZiBlbXB0eSkKK21vZHVsZV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKQorbW9kdWxlX2V4cHN5bV9jbWRzPSRsdF9bXV9MVF9BQ19UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSkKKworIyBDb21tYW5kcyB0byBzdHJpcCBsaWJyYXJpZXMuCitvbGRfc3RyaXBsaWI9JGx0X29sZF9zdHJpcGxpYgorc3RyaXBsaWI9JGx0X3N0cmlwbGliCisKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSB0aGUgb2JqZWN0cyBiZWluZyBsaW5rZWQgdG8gY3JlYXRlIGEKKyMgc2hhcmVkIGxpYnJhcnkuCitwcmVkZXBfb2JqZWN0cz0kbHRfW11fTFRfQUNfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcF9vYmplY3RzPSRsdF9bXV9MVF9BQ19UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0byBjcmVhdGUgYQorIyBzaGFyZWQgbGlicmFyeS4KK3ByZWRlcHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwcmVkZXBzLCAkMSkKKworIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvIGNyZWF0ZSBhCisjIHNoYXJlZCBsaWJyYXJ5LgorcG9zdGRlcHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihwb3N0ZGVwcywgJDEpCisKKyMgVGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21waWxlciB3aGVuIGxpbmtpbmcKKyMgYSBzaGFyZWQgbGlicmFyeS4KK2NvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aD0kbHRfW11fTFRfQUNfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpCisKKyMgTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgZGVwZW5kZW50IGxpYnJhcmllcyBhcmUgc2hhcmVkIG9iamVjdHMuCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfZGVwbGlic19jaGVja19tZXRob2QKKworIyBDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09IGZpbGVfbWFnaWMuCitmaWxlX21hZ2ljX2NtZD0kbHRfZmlsZV9tYWdpY19jbWQKKworIyBGbGFnIHRoYXQgYWxsb3dzIHNoYXJlZCBsaWJyYXJpZXMgd2l0aCB1bmRlZmluZWQgc3ltYm9scyB0byBiZSBidWlsdC4KK2FsbG93X3VuZGVmaW5lZF9mbGFnPSRsdF9bXV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQorCisjIEZsYWcgdGhhdCBmb3JjZXMgbm8gdW5kZWZpbmVkIHN5bWJvbHMuCitub191bmRlZmluZWRfZmxhZz0kbHRfW11fTFRfQUNfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSkKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0kbHRfZmluaXNoX2NtZHMKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgYSBzaW5nbGUgc2NyaXB0IGZyYWdtZW50IHRvIGJlIGV2YWxlZCBidXQgbm90IHNob3duLgorZmluaXNoX2V2YWw9JGx0X2ZpbmlzaF9ldmFsCisKKyMgVGFrZSB0aGUgb3V0cHV0IG9mIG5tIGFuZCBwcm9kdWNlIGEgbGlzdGluZyBvZiByYXcgc3ltYm9scyBhbmQgQyBuYW1lcy4KK2dsb2JhbF9zeW1ib2xfcGlwZT0kbHRfbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZQorCisjIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGx0X2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsCisKKyMgVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyCitnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSRsdF9sdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcworCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHJ1bnRpbWUgcGF0aCB2YXJpYWJsZS4KK3J1bnBhdGhfdmFyPSRydW5wYXRoX3ZhcgorCisjIFRoaXMgaXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHBhdGggdmFyaWFibGUuCitzaGxpYnBhdGhfdmFyPSRzaGxpYnBhdGhfdmFyCisKKyMgSXMgc2hsaWJwYXRoIHNlYXJjaGVkIGJlZm9yZSB0aGUgaGFyZC1jb2RlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoPworc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPSRzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGgKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKQorCisjIFdoZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXMuCitoYXJkY29kZV9pbnRvX2xpYnM9JGhhcmRjb2RlX2ludG9fbGlicworCisjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGx0X1tdX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkKKworIyBJZiBsZCBpcyB1c2VkIHdoZW4gbGlua2luZywgZmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvCisjIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLiBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMKKyMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZD0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKQorCisjIFdoZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAtcnBhdGggZmxhZyB3aXRoIGEgc2VwYXJhdGVkIGFyZ3VtZW50LgoraGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0kbHRfW11fTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKQorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgRElSL2xpYk5BTUUke3NoYXJlZF9leHR9IGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKQorCisjIFNldCB0byB5ZXMgaWYgdXNpbmcgdGhlIC1MRElSIGZsYWcgZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorIyByZXN1bHRpbmcgYmluYXJ5LgoraGFyZGNvZGVfbWludXNfTD0kX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIFNITElCUEFUSF9WQVI9RElSIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50bworIyB0aGUgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX3NobGlicGF0aF92YXI9JF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpCisKKyMgU2V0IHRvIHllcyBpZiBidWlsZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaGFyZGNvZGVzIERJUiBpbnRvIHRoZSBsaWJyYXJ5CisjIGFuZCBhbGwgc3Vic2VxdWVudCBsaWJyYXJpZXMgYW5kIGV4ZWN1dGFibGVzIGxpbmtlZCBhZ2FpbnN0IGl0LgoraGFyZGNvZGVfYXV0b21hdGljPSRfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpCisKKyMgVmFyaWFibGVzIHdob3NlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gbGlidG9vbCB3cmFwcGVyIHNjcmlwdHMgYW5kCisjIHJlc3RvcmVkIGF0IHJlbGluayB0aW1lLgordmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms9IiR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluayIKKworIyBXaGV0aGVyIGxpYnRvb2wgbXVzdCBsaW5rIGEgcHJvZ3JhbSBhZ2FpbnN0IGFsbCBpdHMgZGVwZW5kZW5jeSBsaWJyYXJpZXMuCitsaW5rX2FsbF9kZXBsaWJzPSRfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKQorCisjIENvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSRsdF9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMKKworIyBSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllcworc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JGx0X3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjCisKKyMgRml4IHRoZSBzaGVsbCB2YXJpYWJsZSBcJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlci4KK2ZpeF9zcmNmaWxlX3BhdGg9IiRfTFRfQUNfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKSIKKworIyBTZXQgdG8geWVzIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgorYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpCisKKyMgVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9scy4KK2V4cG9ydF9zeW1ib2xzX2NtZHM9JGx0X1tdX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSkKKworIyBUaGUgY29tbWFuZHMgdG8gZXh0cmFjdCB0aGUgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBhIHNoYXJlZCBhcmNoaXZlLgorZXh0cmFjdF9leHBzeW1zX2NtZHM9JGx0X2V4dHJhY3RfZXhwc3ltc19jbWRzCisKKyMgU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9scy4KK2V4Y2x1ZGVfZXhwc3ltcz0kbHRfW11fTFRfQUNfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpCisKKyMgU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkLgoraW5jbHVkZV9leHBzeW1zPSRsdF9bXV9MVF9BQ19UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSkKKworaWZlbHNlKFskMV0sW10sCitbIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHXSwKK1sjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZV0pCisKK19fRU9GX18KKworaWZlbHNlKFskMV0sW10sIFsKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXgzKikKKyAgICBjYXQgPDxcRU9GID4+ICIkY2ZnZmlsZSIKKworIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK0VPRgorICAgIDs7CisgIGVzYWMKKworICAjIFdlIHVzZSBzZWQgaW5zdGVhZCBvZiBjYXQgYmVjYXVzZSBiYXNoIG9uIERKR1BQIGdldHMgY29uZnVzZWQgaWYKKyAgIyBpZiBmaW5kcyBtaXhlZCBDUi9MRiBhbmQgTEYtb25seSBsaW5lcy4gIFNpbmNlIHNlZCBvcGVyYXRlcyBpbgorICAjIHRleHQgbW9kZSwgaXQgcHJvcGVybHkgY29udmVydHMgbGluZXMgdG8gQ1IvTEYuICBUaGlzIGJhc2ggcHJvYmxlbQorICAjIGlzIHJlcG9ydGVkbHkgZml4ZWQsIGJ1dCB3aHkgbm90IHJ1biBvbiBvbGQgdmVyc2lvbnMgdG9vPworICBzZWQgJyRxJyAiJGx0bWFpbiIgPj4gIiRjZmdmaWxlIiB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorCisgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwgXAorICAgIChybSAtZiAiJG9maWxlIiAmJiBjcCAiJGNmZ2ZpbGUiICIkb2ZpbGUiICYmIHJtIC1mICIkY2ZnZmlsZSIpCisgIGNobW9kICt4ICIkb2ZpbGUiCitdKQorZWxzZQorICAjIElmIHRoZXJlIGlzIG5vIE1ha2VmaWxlIHlldCwgd2UgcmVseSBvbiBhIG1ha2UgcnVsZSB0byBleGVjdXRlCisgICMgYGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrJyB0byByZXJ1biB0aGVzZSB0ZXN0cyBhbmQgY3JlYXRlIHRoZQorICAjIGxpYnRvb2wgc2NyaXB0IHRoZW4uCisgIGx0bWFpbl9pbj1gZWNobyAkbHRtYWluIHwgc2VkIC1lICdzL1wuc2gkLy5pbi8nYAorICBpZiB0ZXN0IC1mICIkbHRtYWluX2luIjsgdGhlbgorICAgIHRlc3QgLWYgTWFrZWZpbGUgJiYgbWFrZSAiJGx0bWFpbiIKKyAgZmkKK2ZpCitdKSMgQUNfTElCVE9PTF9DT05GSUcKKworCisjIEFDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSwKK1tBQ19SRVFVSVJFKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSlkbmwKKworX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPQorCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9JyAtZm5vLWJ1aWx0aW4nCisKKyAgQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucywKKyAgICBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLAorICAgIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9IiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQorZmkKK10pIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSQorCisKKyMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pCitBQ19SRVFVSVJFKFtBQ19PQkpFWFRdKQorIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK0FDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IGZyb20gJGNvbXBpbGVyIG9iamVjdF0pCitBQ19DQUNIRV9WQUwoW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGVdLAorWworIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCisjIFtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspXQorCisjIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCitzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisKKyMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgorc3ltcGF0PSdcKFtbX0EtWmEtel1dW1tfQS1aYS16MC05XV0qXCknCisKKyMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KK2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gaW50IFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKGx0X3B0cikgMH0sL3AnIC1lICdzL14kc3ltY29kZSBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisKKyMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCitjYXNlICRob3N0X29zIGluCithaXgqKQorICBzeW1jb2RlPSdbW0JDRFRdXScKKyAgOzsKK2N5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgc3ltY29kZT0nW1tBQkNER0lTVFddXScKKyAgOzsKK2hwdXgqKSAjIEl0cyBsaW5rZXIgZGlzdGluZ3Vpc2hlcyBkYXRhIGZyb20gY29kZSBzeW1ib2xzCisgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgc3ltY29kZT0nW1tBQkNERUdSU1RdXScKKyAgZmkKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3M9InNlZCAtbiAtZSAncy9eOiBcKFtbXiBdXSpcKSAkLyAge1xcXCJcMVxcXCIsIChsdF9wdHIpIDB9LC9wJyAtZSAncy9eJHN5bWNvZGUqIFwoW1teIF1dKlwpIFwoW1teIF1dKlwpJC8gIHtcIlwyXCIsIChsdF9wdHIpIFwmXDJ9LC9wJyIKKyAgOzsKK2xpbnV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScKKyAgICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGludCBcMSgpOy9wJyAtZSAncy9eJHN5bWNvZGUqIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgorICAgIGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzPSJzZWQgLW4gLWUgJ3MvXjogXChbW14gXV0qXCkgJC8gIHtcXFwiXDFcXFwiLCAobHRfcHRyKSAwfSwvcCcgLWUgJ3MvXiRzeW1jb2RlKiBcKFtbXiBdXSpcKSBcKFtbXiBdXSpcKSQvICB7XCJcMlwiLCAobHRfcHRyKSBcJlwyfSwvcCciCisgIGZpCisgIDs7Citpcml4KiB8IG5vbnN0b3B1eCopCisgIHN5bWNvZGU9J1tbQkNERUdSU1RdXScKKyAgOzsKK29zZiopCisgIHN5bWNvZGU9J1tbQkNERUdRUlNUXV0nCisgIDs7Citzb2xhcmlzKikKKyAgc3ltY29kZT0nW1tCRFJUXV0nCisgIDs7CitzY28zLjJ2NSopCisgIHN5bWNvZGU9J1tbRFRdXScKKyAgOzsKK3N5c3Y0LjJ1dzIqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICBzeW1jb2RlPSdbW0FCRFRdXScKKyAgOzsKK3N5c3Y0KQorICBzeW1jb2RlPSdbW0RGTlNUVV1dJworICA7OworZXNhYworCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gZWNobyAneFx7MCwxXH0nIHwgdHIgeCAnXDAxNSdgICMgb3B0aW9uIGNyIGluIHJlZ2V4cAorICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2Nhc2UgYCROTSAtViAyPiYxYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIHN5bWNvZGU9J1tbQUJDREdJUlNUV11dJyA7OworZXNhYworCisjIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgorZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbworCisgICMgVHJhbnNmb3JtIHN5bWNvZGUsIHN5bXBhdCwgYW5kIHN5bXByZnggaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCisgIHN5bXhmcm09IlxcMSAkYWNfc3ltcHJmeFxcMiBcXDIiCisKKyAgIyBXcml0ZSB0aGUgcmF3IGFuZCBDIGlkZW50aWZpZXJzLgorICBsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qW1sgCV1dXCgkc3ltY29kZSRzeW1jb2RlKlwpW1sgCV1dW1sgCV1dKiRhY19zeW1wcmZ4JHN5bXBhdCRvcHRfY3IkLyRzeW14ZnJtL3AnIgorCisgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorICBwaXBlX3dvcmtzPW5vCisKKyAgcm0gLWYgY29uZnRlc3QqCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2NoYXIgbm1fdGVzdF92YXI7Cit2b2lkIG5tX3Rlc3RfZnVuYygpe30KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitpbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmMoKTtyZXR1cm4oMCk7fQorRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmIGdyZXAgJyBubV90ZXN0X3ZhciQnICIkbmxpc3QiID4vZGV2L251bGw7IHRoZW4KKwlpZiBncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuJGFjX2V4dAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKwkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KKwkgIGV2YWwgIiRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCIgfCBncmVwIC12IG1haW4gPj4gY29uZnRlc3QuJGFjX2V4dCcKKworCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgorIyBkZWZpbmUgY29uc3QKKyNlbmRpZgorCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK2NvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0cl90IGFkZHJlc3M7Cit9CitsdF9wcmVsb2FkZWRfc3ltYm9sc1tbXV0gPQoreworRU9GCisJICAkU0VEICJzL14kc3ltY29kZSRzeW1jb2RlKiBcKC4qXCkgXCguKlwpJC8gIHtcIlwyXCIsIChsdF9wdHJfdCkgXCZcMn0sLyIgPCAiJG5saXN0IiB8IGdyZXAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKyAgezAsIChsdF9wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKwkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCisJICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0c3RtLiRhY19vYmpleHQKKwkgIGx0X3NhdmVfTElCUz0iJExJQlMiCisJICBsdF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKKwkgIExJQlM9ImNvbmZ0c3RtLiRhY19vYmpleHQiCisJICBDRkxBR1M9IiRDRkxBR1MkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpIgorCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorCSAgICBwaXBlX3dvcmtzPXllcworCSAgZmkKKwkgIExJQlM9IiRsdF9zYXZlX0xJQlMiCisJICBDRkxBR1M9IiRsdF9zYXZlX0NGTEFHUyIKKwllbHNlCisJICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJG5saXN0IiA+JkFTX01FU1NBR0VfTE9HX0ZECisJZmkKKyAgICAgIGVsc2UKKwllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZWNobyAiY2Fubm90IHJ1biAkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoZmFpbGVkKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG9rKQorZmkKK10pICMgQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFCisKKworIyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX1BJQ10sCitbX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9CitfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CitfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9CisKK0FDX01TR19DSEVDS0lORyhbZm9yICRjb21waWxlciBvcHRpb24gdG8gcHJvZHVjZSBQSUNdKQorIGlmZWxzZShbJDFdLFtDWFhdLFsKKyAgIyBDKysgc3BlY2lmaWMgY2FzZXMgZm9yIHBpYywgc3RhdGljLCB3bCwgZXRjLgorICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgIyBBbGwgQUlYIGNvZGUgaXMgUElDLgorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIEFJWCA1IG5vdyBzdXBwb3J0cyBJQTY0IHByb2Nlc3NvcgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICBmaQorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAorICAgICAgIyBsaWtlIGAtbTY4MDQwJy4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLW02ODAyMCAtcmVzaWRlbnQzMiAtbWFsd2F5cy1yZXN0b3JlLWE0JworICAgICAgOzsKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IG9zMiogfCBwdzMyKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCcKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgIDs7CisgICAgaW50ZXJpeDMqKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJOzsKKyAgICAgICopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCogfCBhaXg1KikKKwkjIEFsbCBBSVggY29kZSBpcyBQSUMuCisJaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCWVsc2UKKwkgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworCWZpCisJOzsKKyAgICAgIGNob3J1cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwljeGNoNjgqKQorCSAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICMgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSItLW5vX2F1dG9faW5zdGFudGlhdGlvbiAtdSBfX21haW4gLXUgX19wcmVtYWluIC11IF9hYm9ydCAtciAkQ09PTF9ESVIvbGliL2xpYk9yYi5hICRNVk1FX0RJUi9saWIvQ0MvbGliQy5hICRNVk1FX0RJUi9saWIvY2xhc3NpeC9saWJjeC5zLmEiCisJICA7OworCWVzYWMKKwk7OworICAgICAgIGRhcndpbiopCisgICAgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgICB4bGMqKQorICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xbm9jb21tb24nCisgICAgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgICAgICA7OworICAgICAgICAgZXNhYworICAgICAgIDs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKyopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSB8IGRyYWdvbmZseSopCisJIyBGcmVlQlNEIHVzZXMgR05VIEMrKworCTs7CisgICAgICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPScke3dsfS1hICR7d2x9YXJjaGl2ZScKKwkgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0OyB0aGVuCisJICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPScrWicKKwkgICAgZmkKKwkgICAgOzsKKwkgIGFDQyopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICBocHBhKjY0KnxpYTY0KikKKwkgICAgICAjICtaIHRoZSBkZWZhdWx0CisJICAgICAgOzsKKwkgICAgKikKKwkgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBpbnRlcml4KikKKwkjIFRoaXMgaXMgYzg5LCB3aGljaCBpcyBNUyBWaXN1YWwgQysrIChubyBzaGFyZWQgbGlicykKKwkjIEFueW9uZSB3YW50cyB0byBkbyBhIHBvcnQ/CisJOzsKKyAgICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisJICAgICMgQ0MgcGljIGZsYWcgLUtQSUMgaXMgdGhlIGRlZmF1bHQuCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbGludXgqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICA7OworCSAgaWNwYyogfCBlY3BjKikKKwkgICAgIyBJbnRlbCBDKysKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKwkgICAgOzsKKwkgIHBnQ0MqKQorCSAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlci4KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBseW54b3MqKQorCTs7CisgICAgICBtODhrKikKKwk7OworICAgICAgbXZzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgY3h4KikKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctVyBjLGV4cG9ydGFsbCcKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBuZXRic2QqKQorCTs7CisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgOzsKKwkgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgRGlnaXRhbC9Db21wYXEgQysrCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHBzb3MqKQorCTs7CisgICAgICBzb2xhcmlzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgIDs7CisJICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3Vub3M0KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHRhbmRlbSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB2eHdvcmtzKikKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgIGZpCitdLAorWworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICAjIEZJWE1FOiB3ZSBuZWVkIGF0IGxlYXN0IDY4MDIwIGNvZGUgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcywgYnV0CisgICAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAgICMgbGlrZSBgLW02ODA0MCcuCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKKyAgICAgIDs7CisKKyAgICBiZW9zKiB8IGN5Z3dpbiogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgcHczMiogfCBvczIqKQorICAgICAgIyBUaGlzIGhhY2sgaXMgc28gdGhhdCB0aGUgc291cmNlIGZpbGUgY2FuIHRlbGwgd2hldGhlciBpdCBpcyBiZWluZworICAgICAgIyBidWlsdCBmb3IgaW5jbHVzaW9uIGluIGEgZGxsIChhbmQgc2hvdWxkIGV4cG9ydCBzeW1ib2xzIGZvciBleGFtcGxlKS4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJworICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGludGVyaXgzKikKKyAgICAgICMgSW50ZXJpeCAzLnggZ2NjIC1mcGljLy1mUElDIG9wdGlvbnMgZ2VuZXJhdGUgYnJva2VuIGNvZGUuCisgICAgICAjIEluc3RlYWQsIHdlIHJlbG9jYXRlIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgIDs7CisKKyAgICBtc2Rvc2RqZ3BwKikKKyAgICAgICMgSnVzdCBiZWNhdXNlIHdlIHVzZSBHQ0MgZG9lc24ndCBtZWFuIHdlIHN1ZGRlbmx5IGdldCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAjIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0tS2NvbmZvcm1fcGljCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIElBNjQgSFAtVVggYW5kIDY0LWJpdCBIUC1VWCwgYnV0CisgICAgICAjIG5vdCBmb3IgUEEgSFAtVVguCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCp8aWE2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworICAgICAgZGFyd2luKikKKyAgICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgIHhsYyopCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xbm9jb21tb24nCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICAgIDs7CisgICAgICAgZXNhYworICAgICAgIDs7CisKKyAgICBtaW5ndyogfCBwdzMyKiB8IG9zMiopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgbGludXgqKQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgIGljYyogfCBlY2MqKQorCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCV9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCisJX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitdKQorQUNfTVNHX1JFU1VMVChbJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKV0pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgIEFDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgUElDIGZsYWcgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSB3b3Jrc10sCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgJDEpLAorICAgIFskX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpaWZlbHNlKFskMV0sW10sWyAtRFBJQ10sW2lmZWxzZShbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pXSwgW10sCisgICAgW2Nhc2UgJF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iICRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiIDs7CisgICAgIGVzYWNdLAorICAgIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm9dKQorZmkKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgIyBGb3IgcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFBJQywgLURQSUMgaXMgbWVhbmluZ2xlc3M6CisgICpkamdwcCopCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorICAgIDs7CisgICopCisgICAgX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSIkX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpaWZlbHNlKFskMV0sW10sWyAtRFBJQ10sW2lmZWxzZShbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pIgorICAgIDs7Citlc2FjCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK3dsPSRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKSBldmFsIGx0X3RtcF9zdGF0aWNfZmxhZz1cIiRfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSlcIgorQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OKFtpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGx0X3RtcF9zdGF0aWNfZmxhZyB3b3Jrc10sCisgIF9MVF9BQ19UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWNfd29ya3MsICQxKSwKKyAgJGx0X3RtcF9zdGF0aWNfZmxhZywKKyAgW10sCisgIFtfTFRfQUNfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9XSkKK10pCisKKworIyBBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX1NITElCU10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQoraWZlbHNlKFskMV0sW0NYWF0sWworICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBjYXNlICRob3N0X29zIGluCisgIGFpeDQqIHwgYWl4NSopCisgICAgIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgIi1DIiBvcHRpb24uCisgICAgIyAtQyBtZWFucyBkZW1hbmdsZSB0byBBSVggbm0sIGJ1dCBtZWFucyBkb24ndCBkZW1hbmdsZSB3aXRoIEdOVSBubQorICAgIGlmICROTSAtViAyPiYxIHwgZ3JlcCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcWyRdMiA9PSAiVCIpIHx8IChcWyRdMiA9PSAiRCIpIHx8IChcWyRdMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXFskXTMsMSwxKSAhPSAiLiIpKSB7IHByaW50IFxbJF0zIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworICAgIGVsc2UKKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisgICAgZmkKKyAgICA7OworICBwdzMyKikKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0iJGx0ZGxsX2NtZHMiCisgIDs7CisgIGN5Z3dpbiogfCBtaW5ndyopCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAtZSAnXCcnL15bW0JDREdSU11dIC9zLy4qIFwoW1teIF1dKlwpL1wxIERBVEEvOy9eLiogX19ubV9fL3MvXi4qIF9fbm1fX1woW1teIF1dKlwpIFtbXiBdXSovXDEgREFUQS87L15JIC9kOy9eW1tBSVRXXV0gL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgICopCisgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgOzsKKyAgZXNhYworXSxbCisgIHJ1bnBhdGhfdmFyPQorICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKG9sZF9hcmNoaXZlX0Zyb21fbmV3X2NtZHMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcywgJDEpPQorICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIodGhyZWFkX3NhZmVfZmxhZ19zcGVjLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KKyAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCisgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIF9MVF9BQ19UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSk9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgX0xUX0FDX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT0iX0dMT0JBTF9PRkZTRVRfVEFCTEVfIgorICAjIEFsdGhvdWdoIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhIHZhbGlkIHN5bWJvbCBDIG5hbWUsIG1vc3QgYS5vdXQKKyAgIyBwbGF0Zm9ybXMgKGFiKXVzZSBpdCBpbiBQSUMgY29kZSwgYnV0IHRoZWlyIGxpbmtlcnMgZ2V0IGNvbmZ1c2VkIGlmCisgICMgdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IHJlZmVyZW5jZWQuICBTaW5jZSBwb3J0YWJsZSBjb2RlIGNhbm5vdAorICAjIHJlbHkgb24gdGhpcyBzeW1ib2wgbmFtZSwgaXQncyBwcm9iYWJseSBmaW5lIHRvIG5ldmVyIGluY2x1ZGUgaXQgaW4KKyAgIyBwcmVsb2FkZWQgc3ltYm9sIHRhYmxlcy4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisgICMgSnVzdCBiZWluZyBwYXJhbm9pZCBhYm91dCBlbnN1cmluZyB0aGF0IGNjX2Jhc2VuYW1lIGlzIHNldC4KKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorICBjYXNlICRob3N0X29zIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIGludGVyaXgqKQorICAgICMgd2UganVzdCBob3BlL2Fzc3VtZSB0aGlzIGlzIGdjYyBhbmQgbm90IGM4OSAoPSBNU1ZDKyspCisgICAgd2l0aF9nbnVfbGQ9eWVzCisgICAgOzsKKyAgb3BlbmJzZCopCisgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICA7OworICBlc2FjCisKKyAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5CisgICAgd2xhcmM9JyR7d2x9JworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgR05VIGxkIHdpdGggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gVGhlc2UKKyAgICAjIGFyZSByZXNldCBsYXRlciBpZiBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQdXR0aW5nIHRoZW0KKyAgICAjIGhlcmUgYWxsb3dzIHRoZW0gdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWNlc3NhcnkuCisgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ25vLXdob2xlLWFyY2hpdmUnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgICAgZWxzZQorICAJX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgIGZpCisgICAgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPW5vCisgICAgY2FzZSBgJExEIC12IDI+L2Rldi9udWxsYCBpbgorICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKKyoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisKKyAgICAgICMgU2FtdWVsIEEuIEZhbHZvIElJIDxrYzV0amFAZG9scGhpbi5vcGVucHJvamVjdHMubmV0PiByZXBvcnRzCisgICAgICAjIHRoYXQgdGhlIHNlbWFudGljcyBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiBBbWlnYU9TLCBhdCBsZWFzdCB1cAorICAgICAgIyB0byB2ZXJzaW9uIDQsIGlzIHRvIHNoYXJlIGRhdGEgYW1vbmcgbXVsdGlwbGUgcHJvZ3JhbXMgbGlua2VkCisgICAgICAjIHdpdGggdGhlIHNhbWUgZHluYW1pYyBsaWJyYXJ5LiAgU2luY2UgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZQorICAgICAgIyBiZWhhdmlvciBvZiBzaGFyZWQgbGlicmFyaWVzIG9uIG90aGVyIHBsYXRmb3Jtcywgd2UgY2FuJ3QgdXNlCisgICAgICAjIHRoZW0uCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworCisgICAgYmVvcyopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKwkjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAjIGFzIHRoZXJlIGlzIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV0gL3MvLiogXChbW14gXV0qXCkvXDEgREFUQS8nXCcnIHwgJFNFRCAtZSAnXCcnL15bW0FJVFddXSAvcy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnYXV0by1pbXBvcnQnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworCSMgSWYgdGhlIGV4cG9ydC1zeW1ib2xzIGZpbGUgYWxyZWFkeSBpcyBhIC5kZWYgZmlsZSAoMXN0IGxpbmUKKwkjIGlzIEVYUE9SVFMpLCB1c2UgaXQgYXMgaXM7IG90aGVyd2lzZSwgcHJlcGVuZC4uLgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgPSB4RVhQT1JUUzsgdGhlbgorCSAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCWVsc2UKKwkgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgY2F0ICRleHBvcnRfc3ltYm9scyA+PiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwlmaX4KKwkkQ0MgLXNoYXJlZCAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIGludGVyaXgzKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisgICAgICAjIEhhY2s6IE9uIEludGVyaXggMy54LCB3ZSBjYW5ub3QgY29tcGlsZSBQSUMgYmVjYXVzZSBvZiBhIGJyb2tlbiBnY2MuCisgICAgICAjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisgICAgICAjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisgICAgICAjIGNvbnN1bWluZyBhbmQgZnJhZ21lbnRpbmcgcHJvY2Vzcy4gIFRvIGF2b2lkIHRoaXMsIHdlIHBpY2sgYSByYW5kb20sCisgICAgICAjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisgICAgICAjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKyAgICAgIDs7CisKKyAgICBsaW51eCopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwl0bXBfYWRkZmxhZz0KKwljYXNlICRjY19iYXNlbmFtZSwkaG9zdF9jcHUgaW4KKwlwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRlY2hvIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkJIyBJbnRlbCBDIGNvbXBpbGVyIG9uIGlhNjQKKwkgIHRtcF9hZGRmbGFnPScgLWlfZHluYW1pYycgOzsKKwllZmMqLGlhNjQqIHwgaWZvcnQqLGlhNjQqKQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljIC1ub2Zvcl9tYWluJyA7OworCWlmYyogfCBpZm9ydCopCQkJIyBJbnRlbCBGb3J0cmFuIGNvbXBpbGVyCisJICB0bXBfYWRkZmxhZz0nIC1ub2Zvcl9tYWluJyA7OworCWVzYWMKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKwlpZiB0ZXN0ICRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmcgPSB5ZXM7IHRoZW4KKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKyAgY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorICAkZWNobyAibG9jYWw6ICo7IH07IiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAkQ0MgLXNoYXJlZCciJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG5ldGJzZCopCisgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLW8gJGxpYicKKwl3bGFyYz0KKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBmaQorICAgICAgOzsKKworICAgIHNvbGFyaXMqKQorICAgICAgaWYgJExEIC12IDI+JjEgfCBncmVwICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8RU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFRoZSByZWxlYXNlcyAyLjguKiBvZiB0aGUgR05VIGxpbmtlciBjYW5ub3QgcmVsaWFibHkKKyoqKiBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzIHN5c3RlbXMuICBUaGVyZWZvcmUsIGxpYnRvb2wKKyoqKiBpcyBkaXNhYmxpbmcgc2hhcmVkIGxpYnJhcmllcyBzdXBwb3J0LiAgV2UgdXJnZSB5b3UgdG8gdXBncmFkZSBHTlUKKyoqKiBiaW51dGlscyB0byByZWxlYXNlIDIuOS4xIG9yIG5ld2VyLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gbW9kaWZ5CisqKiogeW91ciBQQVRIIG9yIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gc28gdGhhdCB0aGUgbmF0aXZlIGxpbmtlciBpcworKioqIHVzZWQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK0VPRgorICAgICAgZWxpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjFbWzAtNV1dLiopIAorCV9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IFJlbGVhc2VzIG9mIHRoZSBHTlUgbGlua2VyIHByaW9yIHRvIDIuMTYuOTEuMC4zIGNhbiBub3QKKyoqKiByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBTQ08gc3lzdGVtcy4gIFRoZXJlZm9yZSwgbGlidG9vbAorKioqIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBXZSB1cmdlIHlvdSB0byB1cGdyYWRlIEdOVQorKioqIGJpbnV0aWxzIHRvIHJlbGVhc2UgMi4xNi45MS4wLjMgb3IgbmV3ZXIuICBBbm90aGVyIG9wdGlvbiBpcyB0byBtb2RpZnkKKyoqKiB5b3VyIFBBVEggb3IgY29tcGlsZXIgY29uZmlndXJhdGlvbiBzbyB0aGF0IHRoZSBuYXRpdmUgbGlua2VyIGlzCisqKiogdXNlZCwgYW5kIHRoZW4gcmVzdGFydC4KKworX0xUX0VPRgorCTs7CisJKikKKwkgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nYHRlc3QgLXogIiRTQ09BQlNQQVRIIiAmJiBlY2hvICR7d2x9LXJwYXRoLCRsaWJkaXJgJworCSAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lIC1vICRsaWInCisJICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lLFwke1NDT0FCU1BBVEg6KyR7aW5zdGFsbF9saWJkaXJ9L30kc29uYW1lLC1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICBmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSkiID0gbm87IHRoZW4KKyAgICAgIHJ1bnBhdGhfdmFyPQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAgIGZpCisgIGVsc2UKKyAgICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeDMqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfQUNfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRMRCAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiAkQVJfRkxBR1MgJGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKKyAgICAgICMgYXJlIG5vIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSAtTC4KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgJiYgdGVzdCAteiAiJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIjsgdGhlbgorCSMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorCSMgYnJva2VuIGNvbGxlY3QyLgorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYWl4NCogfCBhaXg1KikKKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorCSMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKwlleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgIGVsc2UKKwkjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKwkjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisJaWYgJE5NIC1WIDI+JjEgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFxbJF0yID09ICJUIikgfHwgKFxbJF0yID09ICJEIikgfHwgKFxbJF0yID09ICJCIikpICYmIChbc3Vic3RyXShcWyRdMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXFskXTMgfSB9J1wnJyB8IHNvcnQgLXUgPiAkZXhwb3J0X3N5bWJvbHMnCisJZWxzZQorCSAgX0xUX0FDX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQkNwZyAkbGlib2JqcyAkY29udmVuaWVuY2UgfCBhd2sgJ1wnJ3sgaWYgKCgoXFskXTIgPT0gIlQiKSB8fCAoXFskXTIgPT0gIkQiKSB8fCAoXFskXTIgPT0gIkIiKSkgJiYgKFtzdWJzdHJdKFxbJF0zLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcWyRdMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKwlmaQorCWFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworCSMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorCSMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorCSMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeDUqKQorCSAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisgIAkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisgIAkgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKyAgCSAgICBicmVhaworICAJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisJIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisJIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJiBcCisgIAkgICBzdHJpbmdzICIkY29sbGVjdDJuYW1lIiB8IGdyZXAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisgIAkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorICAJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgZWxzZQorICAJICAjIFdlIGhhdmUgb2xkIGNvbGxlY3QyCisgIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9dW5zdXBwb3J0ZWQKKyAgCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorICAJICAjIHBhdGggaXMgbm90IGxpc3RlZCBpbiB0aGUgbGlicGF0aC4gIFNldHRpbmcgaGFyZGNvZGVfbWludXNfTAorICAJICAjIHRvIHVuc3VwcG9ydGVkIGZvcmNlcyByZWxpbmtpbmcKKyAgCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgIAkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorCSAgZmkKKwkgIDs7CisJZXNhYworCXNoYXJlZF9mbGFnPSctc2hhcmVkJworCWlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgc2hhcmVkX2ZsYWc9IiRzaGFyZWRfZmxhZyAiJyR7d2x9LUcnCisJZmkKKyAgICAgIGVsc2UKKwkjIG5vdCB1c2luZyBnY2MKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKyAgCSMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisJZWxzZQorCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgZWxzZQorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tYk06U1JFJworCSAgZmkKKwlmaQorICAgICAgZmkKKworICAgICAgIyBJdCBzZWVtcyB0aGF0IC1iZXhwYWxsIGRvZXMgbm90IGV4cG9ydCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoCisgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8gZXhwb3J0LgorICAgICAgX0xUX0FDX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorCSMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkgZXhlY3V0YWJsZS4KKyAgICAgICBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYCisgICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MiJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuIGVjaG8gIiR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iOyBlbHNlIDo7IGZpYCAnIlwke3dsfSRleHBfc3ltX2ZsYWc6XCRleHBvcnRfc3ltYm9scyAkc2hhcmVkX2ZsYWciCisgICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuIGVtcHR5IGV4ZWN1dGFibGUuCisJIF9MVF9BQ19TWVNfTElCUEFUSF9BSVgKKwkgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgX0xUX0FDX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAjIHNlZSBjb21tZW50IGFib3V0IGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlIEdOVSBsZCBzZWN0aW9uCisgICAgICBfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworCisgICAgYnNkaVtbNDVdXSopCisgICAgICBfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgICAgbGliZXh0PWxpYgorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisgICAgICBzaHJleHRfY21kcz0iLmRsbCIKKyAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgZWNobyAiJGRlcGxpYnMiIHwgJFNFRCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgICBfTFRfQUNfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKT0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgICBfTFRfQUNfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCisgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgOzsKKyAgICAgICAqKSAjIERhcndpbiAxLjMgb24KKyAgICAgICAgIGlmIHRlc3QgLXogJHtNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVR9IDsgdGhlbgorICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgZWxzZQorICAgICAgICAgICBjYXNlICR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUfSBpbgorICAgICAgICAgICAgIDEwLltbMDEyXV0pCisgICAgICAgICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJworICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAxMC4qKQorICAgICAgICAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcKKyAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgIGVzYWMKKyAgICAgICAgIGZpCisgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisgICAgCW91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworICAgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWR5bmFtaWNsaWIgJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgJHJwYXRoLyRzb25hbWUgJHZlcnN0cmluZycKKyAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAjIERvbid0IGZpeCB0aGlzIGJ5IHVzaW5nIHRoZSBsZCAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGZsYWcsIGl0IGRvZXNuJ3QgZXhpc3QgaW4gb2xkZXIgZGFyd2luIGxkcworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAtZSAicywjLiosLCIgLWUgInMsXlsgICAgXSosLCIgLWUgInMsXlwoLi4qXCksXyYsIiA8ICRleHBvcnRfc3ltYm9scyA+ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+JENDIC1keW5hbWljbGliICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lICRycGF0aC8kc29uYW1lICR2ZXJzdHJpbmd+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgICAgX0xUX0FDX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0nc2VkIC1lICJzLCMuKiwsIiAtZSAicyxeWyAgICBdKiwsIiAtZSAicyxeXCguLipcKSxfJiwiIDwgJGV4cG9ydF9zeW1ib2xzID4gJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX4kQ0MgJGFsbG93X3VuZGVmaW5lZF9mbGFnICAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3N+bm1lZGl0IC1zICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0tc3ltYm9scy5leHBzeW0gJHtsaWJ9JworICAgIGVsc2UKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgIHhsYyopCisgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH1gZWNobyAkcnBhdGgvJHNvbmFtZWAgJHZlcnN0cmluZycKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0nJENDICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliIC1idW5kbGUgJGxpYm9ianMgJGRlcGxpYnMkY29tcGlsZXJfZmxhZ3MnCisgICAgICAgICAgIyBEb24ndCBmaXggdGhpcyBieSB1c2luZyB0aGUgbGQgLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBmbGFnLCBpdCBkb2Vzbid0IGV4aXN0IGluIG9sZGVyIGRhcndpbiBsZHMKKyAgICAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAtcW1rc2hyb2JqICRhbGxvd191bmRlZmluZWRfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1pbnN0YWxsX25hbWUgJHt3bH0kcnBhdGgvJHNvbmFtZSAkdmVyc3RyaW5nfm5tZWRpdCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICAgICAgICBfTFRfQUNfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPSdzZWQgLWUgInMsIy4qLCwiIC1lICJzLF5bICAgIF0qLCwiIC1lICJzLF5cKC4uKlwpLF8mLCIgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltfiRDQyAkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgIC1vICRsaWIgLWJ1bmRsZSAkbGlib2JqcyAkZGVwbGlicyRjb21waWxlcl9mbGFnc35ubWVkaXQgLXMgJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bSAke2xpYn0nCisgICAgICAgICAgOzsKKyAgICAgICAqKQorICAgICAgICAgX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICAgIDs7CisKKyAgICBkZ3V4KikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIGZyZWVic2QxKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMi4yLlswMTJdIGFsbG93cyB1cyB0byBpbmNsdWRlIGMrK3J0MC5vIHRvIGdldCBDKysgY29uc3RydWN0b3IKKyAgICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgICAjIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nLCBhbmQgaGVscHMgc2lnbmlmaWNhbnRseSAoYXQgdGhlIGNvc3Qgb2YgYSBsaXR0bGUKKyAgICAjIGV4dHJhIHNwYWNlKS4KKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MgL3Vzci9saWIvYysrcnQwLm8nCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBvbGRlciB2ZXJzaW9ucyBvZiBGcmVlQlNEIDIgZG8gbm90IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgIGZyZWVic2QyKikKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KKyAgICBmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUgfCBkcmFnb25mbHkqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckcm0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRybSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCisJIyBoYXJkY29kZV9taW51c19MOiBOb3QgcmVhbGx5IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIC1hICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwllc2FjCisgICAgICBlbHNlCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJaWE2NCopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwljYXNlICRob3N0X2NwdSBpbgorCWhwcGEqNjQqfGlhNjQqKQorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9JytiICRsaWJkaXInCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgOzsKKwkqKQorCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPSctcnBhdGggJGxpYmRpcicKKyAgICAgIGZpCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJyAgIyBhLm91dAorICAgICAgZWxzZQorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICAgICAjIEVMRgorICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBuZXdzb3M2KQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scycKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwlfTFRfQUNfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgZWxzZQorICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgb3BlbmJzZFtbMDFdXS4qIHwgb3BlbmJzZDIuW1swLTddXSB8IG9wZW5ic2QyLltbMC03XV0uKikKKwkgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgOzsKKwkgKikKKwkgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgOzsKKyAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRlY2hvICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIF9MVF9BQ19UQUdWQVIob2xkX2FyY2hpdmVfRnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmdgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdmb3IgaSBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvIHByaW50ZiAiJXMgJXNcXG4iIC1leHBvcnRlZF9zeW1ib2wgIlwkaSIgPj4gJGxpYi5leHA7IGRvbmU7IGVjaG8gIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaW5wdXQgJGxpYi5leHAgJGxpbmtlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gLXNldF92ZXJzaW9uICR2ZXJzdHJpbmdgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kcm0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIDs7CisKKyAgICBzb2xhcmlzKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16IHRleHQnCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCXdsYXJjPScke3dsfScKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJGVjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLXNoYXJlZCAke3dsfS1NICR7d2x9JGxpYi5leHAgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZWxzZQorCXdsYXJjPScnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfiRlY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorICAJJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JHJtICRsaWIuZXhwJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKyAgICAgICopCisgCSMgVGhlIGNvbXBpbGVyIGRyaXZlciB3aWxsIGNvbWJpbmUgbGlua2VyIG9wdGlvbnMgc28gd2UKKyAJIyBjYW5ub3QganVzdCBwYXNzIHRoZSBjb252aWVuY2UgbGlicmFyeSBuYW1lcyB0aHJvdWdoCisgCSMgd2l0aG91dCAkd2wsIGlmZiB3ZSBkbyBub3QgbGluayB3aXRoICRMRC4KKyAJIyBMdWNraWx5LCBnY2Mgc3VwcG9ydHMgdGhlIHNhbWUgc3ludGF4IHdlIG5lZWQgZm9yIFN1biBTdHVkaW8uCisgCSMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisgCWNhc2UgJHdsYXJjIGluCisgCScnKQorIAkgIF9MVF9BQ19UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcgOzsKKyAJKikKKyAJICBfTFRfQUNfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0YGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJGVjaG8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcgOzsKKyAJZXNhYyA7OworICAgICAgZXNhYworICAgICAgX0xUX0FDX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIGlmIHRlc3QgIngkaG9zdF92ZW5kb3IiID0geHNlcXVlbnQ7IHRoZW4KKwkjIFVzZSAkQ0MgdG8gbGluayB1bmRlciBzZXF1ZW50LCBiZWNhdXNlIGl0IHRocm93cyBpbiBzb21lIGV4dHJhIC5vCisJIyBmaWxlcyB0aGF0IG1ha2UgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zIHdvcmsuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0KQorICAgICAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKwlzbmkpCisJICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcyAjIGlzIHRoaXMgcmVhbGx5IHRydWU/Pz8KKwk7OworCXNpZW1lbnMpCisJICAjIyBMRCBpcyBsZCBpdCBtYWtlcyBhIFBMQU1MSUIKKwkgICMjIENDIGp1c3QgbWFrZXMgYSBHcm9zc01vZHVsZS4KKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfQUNfVEFHVkFSKHJlbG9hZF9jbWRzLCAkMSk9JyRDQyAtciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworICAgICAgICA7OworCW1vdG9yb2xhKQorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubyAjTW90b3JvbGEgbWFudWFsIHNheXMgeWVzLCBidXQgbXkgdGVzdHMgc2F5IHRoZXkgbGllCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgc3lzdjQuMyopCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nLUJleHBvcnQnCisgICAgICA7OworCisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCXJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJaGFyZGNvZGVfcnVucGF0aF92YXI9eWVzCisJX0xUX0FDX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqKQorICAgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KikKKyAgICAgICMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisgICAgICAjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisgICAgICAjIGFsd2F5cyBiZSB1bnJlc29sdmVkLCB3aGljaCBtZWFucyBqdXN0IGFib3V0IG5vIGxpYnJhcnkgd291bGQKKyAgICAgICMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKyAgICAgICMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorICAgICAgIyBhcyAteiBkZWZzLgorICAgICAgX0xUX0FDX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfQUNfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9J2B0ZXN0IC16ICIkU0NPQUJTUEFUSCIgJiYgZWNobyAke3dsfS1SLCRsaWJkaXJgJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfQUNfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIF9MVF9BQ19UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCxcJHtTQ09BQlNQQVRIOiske2luc3RhbGxfbGliZGlyfS99JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfQUNfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsXCR7U0NPQUJTUEFUSDorJHtpbnN0YWxsX2xpYmRpcn0vfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBmaQorICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX0FDX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgIF9MVF9BQ19UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgKikKKyAgICAgIF9MVF9BQ19UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIDs7CisgICAgZXNhYworICBmaQorXSkKK0FDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKK3Rlc3QgIiRfTFRfQUNfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworIworIyBEbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGluayBsaWJjPworIworY2FzZSAieCRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSkiIGluCit4fHh5ZXMpCisgICMgQXNzdW1lIC1sYyBzaG91bGQgYmUgYWRkZWQKKyAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCisgIGlmIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIGNhc2UgJF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgaW4KKyAgICAqJ34nKikKKyAgICAgICMgRklYTUU6IHdlIG1heSBoYXZlIHRvIGRlYWwgd2l0aCBtdWx0aS1jb21tYW5kIHNlcXVlbmNlcy4KKyAgICAgIDs7CisgICAgJyRDQyAnKikKKyAgICAgICMgVGVzdCB3aGV0aGVyIHRoZSBjb21waWxlciBpbXBsaWNpdGx5IGxpbmtzIHdpdGggLWxjIHNpbmNlIG9uIHNvbWUKKyAgICAgICMgc3lzdGVtcywgLWxnY2MgaGFzIHRvIGNvbWUgYmVmb3JlIC1sYy4gSWYgZ2NjIGFscmVhZHkgcGFzc2VzIC1sYworICAgICAgIyB0byBsZCwgZG9uJ3QgYWRkIC1sYyBiZWZvcmUgLWxnY2MuCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgLWxjIHNob3VsZCBiZSBleHBsaWNpdGx5IGxpbmtlZCBpbl0pCisgICAgICAkcm0gY29uZnRlc3QqCisgICAgICBwcmludGYgIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgICBkZXBsaWJzPQorICAgICAgICB3bD0kX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKwlwaWNfZmxhZz0kX0xUX0FDX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JF9MVF9BQ19UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQorICAgICAgICBfTFRfQUNfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisgICAgICAgIGlmIEFDX1RSWV9FVkFMKF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgMlw+XCYxIFx8IGdyZXAgXCIgLWxjIFwiIFw+L2Rldi9udWxsIDJcPlwmMSkKKyAgICAgICAgdGhlbgorCSAgX0xUX0FDX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICAgIGVsc2UKKwkgIF9MVF9BQ19UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKyAgICAgICAgZmkKKyAgICAgICAgX0xUX0FDX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSRsdF9zYXZlX2FsbG93X3VuZGVmaW5lZF9mbGFnCisgICAgICBlbHNlCisgICAgICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorICAgICAgZmkKKyAgICAgICRybSBjb25mdGVzdCoKKyAgICAgIEFDX01TR19SRVNVTFQoWyRfTFRfQUNfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSldKQorICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisgIDs7Citlc2FjCitdKSMgQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUworCisKKyMgX0xUX0FDX0ZJTEVfTFRETExfQworIyAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJlIGNhcmVmdWwgdGhhdCB0aGUgc3RhcnQgbWFya2VyIGFsd2F5cyBmb2xsb3dzIGEgbmV3bGluZS4KK0FDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSwgWworIyAvKiBsdGRsbC5jIHN0YXJ0cyBoZXJlICovCisjICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAjaW5jbHVkZSA8d2luZG93cy5oPgorIyAjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAjaW5jbHVkZSA8c3RkaW8uaD4KKyMKKyMgI2lmbmRlZiBfX0NZR1dJTl9fCisjICMgIGlmZGVmIF9fQ1lHV0lOMzJfXworIyAjICAgIGRlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXworIyAjICBlbmRpZgorIyAjZW5kaWYKKyMKKyMgI2lmZGVmIF9fY3BsdXNwbHVzCisjIGV4dGVybiAiQyIgeworIyAjZW5kaWYKKyMgQk9PTCBBUElFTlRSWSBEbGxNYWluIChISU5TVEFOQ0UgaEluc3QsIERXT1JEIHJlYXNvbiwgTFBWT0lEIHJlc2VydmVkKTsKKyMgI2lmZGVmIF9fY3BsdXNwbHVzCisjIH0KKyMgI2VuZGlmCisjCisjICNpZmRlZiBfX0NZR1dJTl9fCisjICNpbmNsdWRlIDxjeWd3aW4vY3lnd2luX2RsbC5oPgorIyBERUNMQVJFX0NZR1dJTl9ETEwoIERsbE1haW4gKTsKKyMgI2VuZGlmCisjIEhJTlNUQU5DRSBfX2hEbGxJbnN0YW5jZV9iYXNlOworIworIyBCT09MIEFQSUVOVFJZCisjIERsbE1haW4gKEhJTlNUQU5DRSBoSW5zdCwgRFdPUkQgcmVhc29uLCBMUFZPSUQgcmVzZXJ2ZWQpCisjIHsKKyMgICBfX2hEbGxJbnN0YW5jZV9iYXNlID0gaEluc3Q7CisjICAgcmV0dXJuIFRSVUU7CisjIH0KKyMgLyogbHRkbGwuYyBlbmRzIGhlcmUgKi8KK10pIyBfTFRfQUNfRklMRV9MVERMTF9DCisKKworIyBfTFRfQUNfVEFHVkFSKFZBUk5BTUUsIFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0sIFtpZmVsc2UoWyQyXSwgW10sIFskMV0sIFskMV8kMl0pXSkKKworCisjIG9sZCBuYW1lcworQUNfREVGVU4oW0FNX1BST0dfTElCVE9PTF0sICAgW0FDX1BST0dfTElCVE9PTF0pCitBQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sICBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQorQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCAgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKK0FDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQorQUNfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCitBQ19ERUZVTihbQU1fUFJPR19MRF0sICAgICAgICBbQUNfUFJPR19MRF0pCitBQ19ERUZVTihbQU1fUFJPR19OTV0sICAgICAgICBbQUNfUFJPR19OTV0pCisKKyMgVGhpcyBpcyBqdXN0IHRvIHNpbGVuY2UgYWNsb2NhbCBhYm91dCB0aGUgbWFjcm8gbm90IGJlaW5nIHVzZWQKK2lmZWxzZShbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdKQorCitBQ19ERUZVTihbTFRfQUNfUFJPR19HQ0pdLAorW0FDX0NIRUNLX1RPT0woR0NKLCBnY2osIG5vKQorICB0ZXN0ICJ4JHtHQ0pGTEFHUytzZXR9IiA9IHhzZXQgfHwgR0NKRkxBR1M9Ii1nIC1PMiIKKyAgQUNfU1VCU1QoR0NKRkxBR1MpCitdKQorCitBQ19ERUZVTihbTFRfQUNfUFJPR19SQ10sCitbQUNfQ0hFQ0tfVE9PTChSQywgd2luZHJlcywgbm8pCitdKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9URTogVGhpcyBtYWNybyBoYXMgYmVlbiBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbnRvICAgIworIyAgR05VIEF1dG9jb25mIGFzIEFDX1BST0dfU0VELiAgV2hlbiBpdCBpcyBhdmFpbGFibGUgaW4gICAjCisjICBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXV0b2NvbmYgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzICAgICMKKyMgIG1hY3JvIGFuZCB1c2UgaXQgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExUX0FDX1BST0dfU0VECisjIC0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBhIGZ1bGx5LWZ1bmN0aW9uYWwgc2VkIHByb2dyYW0sIHRoYXQgdHJ1bmNhdGVzCisjIGFzIGZldyBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLiAgUHJlZmVyIEdOVSBzZWQgaWYgZm91bmQuCitBQ19ERUZVTihbTFRfQUNfUFJPR19TRURdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX1NFRCwKK1sjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KKyMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBmaQorICAgIGRvbmUKKyAgZG9uZQorZG9uZQorbHRfYWNfbWF4PTAKK2x0X2FjX2NvdW50PTAKKyMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCisjIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgorZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCisgIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCisgIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgorICBsdF9hY19jb3VudD0wCisgIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgorICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgYnJlYWsKKyAgZmkKKyAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAorICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgorICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCisgICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCisgICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKKyAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCisgICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKKyAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgorICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAorICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGZpCisgIGRvbmUKK2RvbmUKK10pCitTRUQ9JGx0X2N2X3BhdGhfU0VECitBQ19NU0dfUkVTVUxUKFskU0VEXSkKK10pCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9jb25mdG9vbHMvbHRtYWluLnNoIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjgyM2UwCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL2x0bWFpbi5zaApAQCAtMCwwICsxLDY4NjMgQEAKKyMgbHRtYWluLnNoIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIE5PVEU6IENoYW5naW5nIHRoaXMgZmlsZSB3aWxsIG5vdCBhZmZlY3QgYW55dGhpbmcgdW50aWwgeW91IHJlcnVuIGNvbmZpZ3VyZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBPcmlnaW5hbGx5IGJ5IEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitiYXNlbmFtZT0icyxeLiovLCxnIgorCisjIFdvcmsgYXJvdW5kIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaXNzdWUgb24gSVJJWCA2LjUuIE9uIElSSVggNi40Kywgc2gKKyMgaXMga3NoIGJ1dCB3aGVuIHRoZSBzaGVsbCBpcyBpbnZva2VkIGFzICJzaCIgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mCisjIHRoZSBfWFBHIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBlcXVhbCB0byAxIChvbmUpLCB0aGUgc3BlY2lhbAorIyBwb3NpdGlvbmFsIHBhcmFtZXRlciAkMCwgd2l0aGluIGEgZnVuY3Rpb24gY2FsbCwgaXMgdGhlIG5hbWUgb2YgdGhlCisjIGZ1bmN0aW9uLgorcHJvZ3BhdGg9IiQwIgorCisjIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbToKK3Byb2duYW1lPWBlY2hvICIkcHJvZ3BhdGgiIHwgJFNFRCAkYmFzZW5hbWVgCittb2RlbmFtZT0iJHByb2duYW1lIgorCisjIEdsb2JhbCB2YXJpYWJsZXM6CitFWElUX1NVQ0NFU1M9MAorRVhJVF9GQUlMVVJFPTEKKworUFJPR1JBTT1sdG1haW4uc2gKK1BBQ0tBR0U9bGlidG9vbAorVkVSU0lPTj0xLjUuMjIKK1RJTUVTVEFNUD0iICgxLjEyMjAuMi4zNjUgMjAwNS8xMi8xOCAyMjoxNDowNikiCisKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzLgoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2ZpCisKKyMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkZWNoby4KK2lmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgQXZvaWQgaW5saW5lIGRvY3VtZW50IGhlcmUsIGl0IG1heSBiZSBsZWZ0IG92ZXIKKyAgOgorZWxpZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCc7IHRoZW4KKyAgIyBZaXBwZWUsICRlY2hvIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgJGVjaG8gd2lsbCB3b3JrLgorICBleGVjICRTSEVMTCAiJHByb2dwYXRoIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KK2ZpCisKK2lmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PEVPRgorJCoKK0VPRgorICBleGl0ICRFWElUX1NVQ0NFU1MKK2ZpCisKK2RlZmF1bHRfbW9kZT0KK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKK21hZ2ljPSIlJSVNQUdJQyB2YXJpYWJsZSUlJSIKK21rZGlyPSJta2RpciIKK212PSJtdiAtZiIKK3JtPSJybSAtZiIKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRoYXQgaGVscHMgdXMgZG8gcm9idXN0IHF1b3RpbmcuICBJdCBiYWNrc2xhc2hpZmllcworIyBtZXRhY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUgd2l0aGluIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KK1hzZWQ9IiR7U0VEfSInIC1lIDFzL15YLy8nCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBTUDJOTD0ndHIgXDA0MCBcMDEyJworICBOTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIFNQMk5MPSd0ciBcMTAwIFxuJworICBOTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KKyMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCisjIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc2F2ZV9MQ19BTEw9IiRMQ19BTEwiOyBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTAorZmkKK2lmIHRlc3QgIiR7TEFORytzZXR9IiA9IHNldDsgdGhlbgorICBzYXZlX0xBTkc9IiRMQU5HIjsgTEFORz1DOyBleHBvcnQgTEFORworZmkKKworIyBNYWtlIHN1cmUgSUZTIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQKK2x0X25sPScKKycKK0lGUz0iIAkkbHRfbmwiCisKK2lmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllcyAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiICE9IHllczsgdGhlbgorICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCisgICRlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKKyMgR2xvYmFsIHZhcmlhYmxlcy4KK21vZGU9JGRlZmF1bHRfbW9kZQorbm9ub3B0PQorcHJldj0KK3ByZXZvcHQ9CitydW49CitzaG93PSIkZWNobyIKK3Nob3dfaGVscD0KK2V4ZWN1dGVfZGxmaWxlcz0KK2R1cGxpY2F0ZV9kZXBzPW5vCitwcmVzZXJ2ZV9hcmdzPQorbG8ybz0icy9cXC5sb1wkLy4ke29iamV4dH0vIgorbzJsbz0icy9cXC4ke29iamV4dH1cJC8ubG8vIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNoZWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zOgorIyBUaGlzIHNlZW1zIHRvIGJlIHRoZSBiZXN0IHBsYWNlIGZvciB0aGVtCisKKyMgZnVuY19ta3RlbXBkaXIgW3N0cmluZ10KKyMgTWFrZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3b24ndCBjbGFzaCB3aXRoIG90aGVyIHJ1bm5pbmcKKyMgbGlidG9vbCBwcm9jZXNzZXMsIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGlmIHBvc3NpYmxlLiAgSWYKKyMgZ2l2ZW4sIFNUUklORyBpcyB0aGUgYmFzZW5hbWUgZm9yIHRoYXQgZGlyZWN0b3J5LgorZnVuY19ta3RlbXBkaXIgKCkKK3sKKyAgICBteV90ZW1wbGF0ZT0iJHtUTVBESVItL3RtcH0vJHsxLSRwcm9nbmFtZX0iCisKKyAgICBpZiB0ZXN0ICIkcnVuIiA9ICI6IjsgdGhlbgorICAgICAgIyBSZXR1cm4gYSBkaXJlY3RvcnkgbmFtZSwgYnV0IGRvbid0IGNyZWF0ZSBpdCBpbiBkcnktcnVuIG1vZGUKKyAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJCQiCisgICAgZWxzZQorCisgICAgICAjIElmIG1rdGVtcCB3b3JrcywgdXNlIHRoYXQgZmlyc3QgYW5kIGZvcmVtb3N0CisgICAgICBteV90bXBkaXI9YG1rdGVtcCAtZCAiJHtteV90ZW1wbGF0ZX0tWFhYWFhYWFgiIDI+L2Rldi9udWxsYAorCisgICAgICBpZiB0ZXN0ICEgLWQgIiRteV90bXBkaXIiOyB0aGVuCisJIyBGYWlsaW5nIHRoYXQsIGF0IGxlYXN0IHRyeSBhbmQgdXNlICRSQU5ET00gdG8gYXZvaWQgYSByYWNlCisJbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0ke1JBTkRPTS0wfSQkIgorCisJc2F2ZV9ta3RlbXBkaXJfdW1hc2s9YHVtYXNrYAorCXVtYXNrIDAwNzcKKwkkbWtkaXIgIiRteV90bXBkaXIiCisJdW1hc2sgJHNhdmVfbWt0ZW1wZGlyX3VtYXNrCisgICAgICBmaQorCisgICAgICAjIElmIHdlJ3JlIG5vdCBpbiBkcnktcnVuIG1vZGUsIGJvbWIgb3V0IG9uIGZhaWx1cmUKKyAgICAgIHRlc3QgLWQgIiRteV90bXBkaXIiIHx8IHsKKyAgICAgICAgJGVjaG8gImNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBcYCRteV90bXBkaXInIiAxPiYyCisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICB9CisgICAgZmkKKworICAgICRlY2hvICJYJG15X3RtcGRpciIgfCAkWHNlZAorfQorCisKKyMgZnVuY193aW4zMl9saWJpZCBhcmcKKyMgcmV0dXJuIHRoZSBsaWJyYXJ5IHR5cGUgb2YgZmlsZSAnYXJnJworIworIyBOZWVkIGEgbG90IG9mIGdvbyB0byBoYW5kbGUgKmJvdGgqIERMTHMgYW5kIGltcG9ydCBsaWJzCisjIEhhcyB0byBiZSBhIHNoZWxsIGZ1bmN0aW9uIGluIG9yZGVyIHRvICdlYXQnIHRoZSBhcmd1bWVudAorIyB0aGF0IGlzIHN1cHBsaWVkIHdoZW4gJGZpbGVfbWFnaWNfY29tbWFuZCBpcyBjYWxsZWQuCitmdW5jX3dpbjMyX2xpYmlkICgpCit7CisgIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCisgIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCisgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KKyAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0CisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgorICAgIDs7CisgICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKKyAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8IFwKKyAgICAgICRFR1JFUCAtZSAnZmlsZSBmb3JtYXQgcGUtaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JyA+L2Rldi9udWxsIDsgdGhlbgorICAgICAgd2luMzJfbm1yZXM9YGV2YWwgJE5NIC1mIHBvc2l4IC1BICQxIHwgXAorCSRTRUQgLW4gLWUgJzEsMTAwey8gSSAve3MsLiosaW1wb3J0LDtwO3E7fTt9J2AKKyAgICAgIGNhc2UgJHdpbjMyX25tcmVzIGluCisgICAgICBpbXBvcnQqKSAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0Ijs7CisgICAgICAqKSAgICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgc3RhdGljIjs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworICAqRExMKikKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgorICAgIDs7CisgICpleGVjdXRhYmxlKikgIyBidXQgc2hlbGwgc2NyaXB0cyBhcmUgImV4ZWN1dGFibGUiIHRvby4uLgorICAgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KKyAgICAqTVNcIFdpbmRvd3NcIFBFXCBJbnRlbCopCisgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAkZWNobyAkd2luMzJfbGliaWRfdHlwZQorfQorCisKKyMgZnVuY19pbmZlcl90YWcgYXJnCisjIEluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiBhbnkgYXJlIGF2YWlsYWJsZSBhbmQKKyMgaWYgb25lIHdhc24ndCBjaG9zZW4gdmlhIHRoZSAiLS10YWciIGNvbW1hbmQgbGluZSBvcHRpb24uCisjIE9ubHkgYXR0ZW1wdCB0aGlzIGlmIHRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlCisjIGNvbW1hbmQgZG9lc24ndCBtYXRjaCB0aGUgZGVmYXVsdCBjb21waWxlci4KKyMgYXJnIGlzIHVzdWFsbHkgb2YgdGhlIGZvcm0gJ2djYyAuLi4nCitmdW5jX2luZmVyX3RhZyAoKQoreworICAgIGlmIHRlc3QgLW4gIiRhdmFpbGFibGVfdGFncyIgJiYgdGVzdCAteiAiJHRhZ25hbWUiOyB0aGVuCisgICAgICBDQ19xdW90ZWQ9CisgICAgICBmb3IgYXJnIGluICRDQzsgZG8KKwljYXNlICRhcmcgaW4KKwkgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworCUNDX3F1b3RlZD0iJENDX3F1b3RlZCAkYXJnIgorICAgICAgZG9uZQorICAgICAgY2FzZSAkQCBpbgorICAgICAgIyBCbGFua3MgaW4gdGhlIGNvbW1hbmQgbWF5IGhhdmUgYmVlbiBzdHJpcHBlZCBieSB0aGUgY2FsbGluZyBzaGVsbCwKKyAgICAgICMgYnV0IG5vdCBmcm9tIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIGNvbmZpZ3VyZSB3YXMgcnVuLgorICAgICAgIiAkQ0MgIiogfCAiJENDICIqIHwgIiBgJGVjaG8gJENDYCAiKiB8ICJgJGVjaG8gJENDYCAiKiB8ICIgJENDX3F1b3RlZCIqIHwgIiRDQ19xdW90ZWQgIiogfCAiIGAkZWNobyAkQ0NfcXVvdGVkYCAiKiB8ICJgJGVjaG8gJENDX3F1b3RlZGAgIiopIDs7CisgICAgICAjIEJsYW5rcyBhdCB0aGUgc3RhcnQgb2YgJGJhc2VfY29tcGlsZSB3aWxsIGNhdXNlIHRoaXMgdG8gZmFpbAorICAgICAgIyBpZiB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbSBhcyB3ZWxsLgorICAgICAgKikKKwlmb3IgeiBpbiAkYXZhaWxhYmxlX3RhZ3M7IGRvCisJICBpZiBncmVwICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkeiQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KKwkgICAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckeickLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckeickL3AnIDwgJHByb2dwYXRoYCIKKwkgICAgQ0NfcXVvdGVkPQorCSAgICBmb3IgYXJnIGluICRDQzsgZG8KKwkgICAgIyBEb3VibGUtcXVvdGUgYXJncyBjb250YWluaW5nIG90aGVyIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorCSAgICBjYXNlICRhcmcgaW4KKwkgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgICAgICBhcmc9IlwiJGFyZ1wiIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgQ0NfcXVvdGVkPSIkQ0NfcXVvdGVkICRhcmciCisJICBkb25lCisJICAgIGNhc2UgIiRAICIgaW4KKwkgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkZWNobyAkQ0NgICIqIHwgImAkZWNobyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRlY2hvICRDQ19xdW90ZWRgICIqIHwgImAkZWNobyAkQ0NfcXVvdGVkYCAiKikKKwkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcworCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCisJICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KKwkgICAgICB0YWduYW1lPSR6CisJICAgICAgYnJlYWsKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCWRvbmUKKwkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgorCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKKwkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KKwlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHVuYWJsZSB0byBpbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwkgICRlY2hvICIkbW9kZW5hbWU6IHNwZWNpZnkgYSB0YWcgd2l0aCBcYC0tdGFnJyIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisjICAgICAgICBlbHNlCisjICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHVzaW5nICR0YWduYW1lIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICBmaQorfQorCisKKyMgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgZGlyIG9sZGxpYgorZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgKCkKK3sKKyAgICBmX2V4X2FuX2FyX2Rpcj0iJDEiOyBzaGlmdAorICAgIGZfZXhfYW5fYXJfb2xkbGliPSIkMSIKKworICAgICRzaG93ICIoY2QgJGZfZXhfYW5fYXJfZGlyICYmICRBUiB4ICRmX2V4X2FuX2FyX29sZGxpYikiCisgICAgJHJ1biBldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcJGZfZXhfYW5fYXJfb2xkbGliKSIgfHwgZXhpdCAkPworICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgIDoKKyAgICBlbHNlCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiBFUlJPUjogb2JqZWN0IG5hbWUgY29uZmxpY3RzOiAkZl9leF9hbl9hcl9kaXIvJGZfZXhfYW5fYXJfb2xkbGliIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorfQorCisjIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyBnZW50b3Agb2xkbGliIC4uLgorZnVuY19leHRyYWN0X2FyY2hpdmVzICgpCit7CisgICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0CisgICAgbXlfb2xkbGlicz0kezErIiRAIn0KKyAgICBteV9vbGRvYmpzPSIiCisgICAgbXlfeGxpYj0iIgorICAgIG15X3hhYnM9IiIKKyAgICBteV94ZGlyPSIiCisgICAgbXlfc3RhdHVzPSIiCisKKyAgICAkc2hvdyAiJHtybX1yICRteV9nZW50b3AiCisgICAgJHJ1biAke3JtfXIgIiRteV9nZW50b3AiCisgICAgJHNob3cgIiRta2RpciAkbXlfZ2VudG9wIgorICAgICRydW4gJG1rZGlyICIkbXlfZ2VudG9wIgorICAgIG15X3N0YXR1cz0kPworICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG15X2dlbnRvcCI7IHRoZW4KKyAgICAgIGV4aXQgJG15X3N0YXR1cworICAgIGZpCisKKyAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KKyAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKyAgICAgIGNhc2UgJG15X3hsaWIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OworCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OworICAgICAgZXNhYworICAgICAgbXlfeGxpYj1gJGVjaG8gIlgkbXlfeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgICAgbXlfeGRpcj0iJG15X2dlbnRvcC8kbXlfeGxpYiIKKworICAgICAgJHNob3cgIiR7cm19ciAkbXlfeGRpciIKKyAgICAgICRydW4gJHtybX1yICIkbXlfeGRpciIKKyAgICAgICRzaG93ICIkbWtkaXIgJG15X3hkaXIiCisgICAgICAkcnVuICRta2RpciAiJG15X3hkaXIiCisgICAgICBleGl0X3N0YXR1cz0kPworICAgICAgaWYgdGVzdCAiJGV4aXRfc3RhdHVzIiAtbmUgMCAmJiB0ZXN0ICEgLWQgIiRteV94ZGlyIjsgdGhlbgorCWV4aXQgJGV4aXRfc3RhdHVzCisgICAgICBmaQorICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi1kYXJ3aW4qKQorCSRzaG93ICJFeHRyYWN0aW5nICRteV94YWJzIgorCSMgRG8gbm90IGJvdGhlciBkb2luZyBhbnl0aGluZyBpZiBqdXN0IGEgZHJ5IHJ1bgorCWlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICBkYXJ3aW5fb3JpZ19kaXI9YHB3ZGAKKwkgIGNkICRteV94ZGlyIHx8IGV4aXQgJD8KKwkgIGRhcndpbl9hcmNoaXZlPSRteV94YWJzCisJICBkYXJ3aW5fY3VyZGlyPWBwd2RgCisJICBkYXJ3aW5fYmFzZV9hcmNoaXZlPWAkZWNobyAiWCRkYXJ3aW5fYXJjaGl2ZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgZGFyd2luX2FyY2hlcz1gbGlwbyAtaW5mbyAiJGRhcndpbl9hcmNoaXZlIiAyPi9kZXYvbnVsbCB8ICRFR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsYAorCSAgaWYgdGVzdCAtbiAiJGRhcndpbl9hcmNoZXMiOyB0aGVuIAorCSAgICBkYXJ3aW5fYXJjaGVzPWBlY2hvICIkZGFyd2luX2FyY2hlcyIgfCAkU0VEIC1lICdzLy4qYXJlOi8vJ2AKKwkgICAgZGFyd2luX2FyY2g9CisJICAgICRzaG93ICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKKwkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCisJICAgICAgbWtkaXIgLXAgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCisJICAgICAgbGlwbyAtdGhpbiAkZGFyd2luX2FyY2ggLW91dHB1dCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofS8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9IiAiJHtkYXJ3aW5fYXJjaGl2ZX0iCisJICAgICAgY2QgInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0iCisJICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgImBwd2RgIiAiJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKKwkgICAgICBjZCAiJGRhcndpbl9jdXJkaXIiCisJICAgICAgJHJtICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iCisJICAgIGRvbmUgIyAkZGFyd2luX2FyY2hlcworICAgICAgIyMgT2theSBub3cgd2UgaGF2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKKwkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50fCB4YXJncyBiYXNlbmFtZSB8IHNvcnQgLXUgfCAkTkwyU1BgCisJICAgIGRhcndpbl9maWxlPQorCSAgICBkYXJ3aW5fZmlsZXM9CisJICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbworCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgJE5MMlNQYAorCSAgICAgIGxpcG8gLWNyZWF0ZSAtb3V0cHV0ICIkZGFyd2luX2ZpbGUiICRkYXJ3aW5fZmlsZXMKKwkgICAgZG9uZSAjICRkYXJ3aW5fZmlsZWxpc3QKKwkgICAgJHtybX1yIHVuZmF0LSQkCisJICAgIGNkICIkZGFyd2luX29yaWdfZGlyIgorCSAgZWxzZQorCSAgICBjZCAiJGRhcndpbl9vcmlnX2RpciIKKyAJICAgIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICIkbXlfeGRpciIgIiRteV94YWJzIgorCSAgZmkgIyAkZGFyd2luX2FyY2hlcworCWZpICMgJHJ1bgorCTs7CisgICAgICAqKQorICAgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiJG15X3hkaXIiICIkbXlfeGFicyIKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCisgICAgZG9uZQorICAgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQ9IiRteV9vbGRvYmpzIgorfQorIyBFbmQgb2YgU2hlbGwgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEYXJ3aW4gc3Vja3MKK2V2YWwgc3RkX3NocmV4dD1cIiRzaHJleHRfY21kc1wiCisKK2Rpc2FibGVfbGlicz1ubworCisjIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgord2hpbGUgdGVzdCAiJCMiIC1ndCAwCitkbworICBhcmc9IiQxIgorICBzaGlmdAorCisgIGNhc2UgJGFyZyBpbgorICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIG9wdGFyZz0gOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICBjYXNlICRwcmV2IGluCisgICAgZXhlY3V0ZV9kbGZpbGVzKQorICAgICAgZXhlY3V0ZV9kbGZpbGVzPSIkZXhlY3V0ZV9kbGZpbGVzICRhcmciCisgICAgICA7OworICAgIHRhZykKKyAgICAgIHRhZ25hbWU9IiRhcmciCisgICAgICBwcmVzZXJ2ZV9hcmdzPSIke3ByZXNlcnZlX2FyZ3N9PSRhcmciCisKKyAgICAgICMgQ2hlY2sgd2hldGhlciB0YWduYW1lIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycworICAgICAgY2FzZSAkdGFnbmFtZSBpbgorICAgICAgKlshLV9BLVphLXowLTksL10qKQorCSRlY2hvICIkcHJvZ25hbWU6IGludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIiAxPiYyCisJZXhpdCAkRVhJVF9GQUlMVVJFCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkdGFnbmFtZSBpbgorICAgICAgQ0MpCisJIyBEb24ndCB0ZXN0IGZvciB0aGUgImRlZmF1bHQiIEMgdGFnLCBhcyB3ZSBrbm93LCBpdCdzIHRoZXJlLCBidXQKKwkjIG5vdCBzcGVjaWFsbHkgbWFya2VkLgorCTs7CisgICAgICAqKQorCWlmIGdyZXAgIl4jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJCIgPCAiJHByb2dwYXRoIiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCisJICAjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLgorCSAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckdGFnbmFtZSckLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckdGFnbmFtZSckL3AnIDwgJHByb2dwYXRoYCIKKwllbHNlCisJICAkZWNobyAiJHByb2duYW1lOiBpZ25vcmluZyB1bmtub3duIHRhZyAkdGFnbmFtZSIgMT4mMgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBwcmV2PQorICAgIHByZXZvcHQ9CisgICAgY29udGludWUKKyAgZmkKKworICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/CisgIGNhc2UgJGFyZyBpbgorICAtLWhlbHApCisgICAgc2hvd19oZWxwPXllcworICAgIDs7CisKKyAgLS12ZXJzaW9uKQorICAgICRlY2hvICIkUFJPR1JBTSAoR05VICRQQUNLQUdFKSAkVkVSU0lPTiRUSU1FU1RBTVAiCisgICAgJGVjaG8KKyAgICAkZWNobyAiQ29weXJpZ2h0IChDKSAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4iCisgICAgJGVjaG8gIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PIgorICAgICRlY2hvICJ3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLS1jb25maWcpCisgICAgJHtTRUR9IC1lICcxLC9eIyAjIyMgQkVHSU4gTElCVE9PTCBDT05GSUcvZCcgLWUgJy9eIyAjIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJHByb2dwYXRoCisgICAgIyBOb3cgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgdGFncy4KKyAgICBmb3IgdGFnbmFtZSBpbiAkdGFnbGlzdDsgZG8KKyAgICAgICR7U0VEfSAtbiAtZSAiL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lJC8sL14jICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZSQvcCIgPCAiJHByb2dwYXRoIgorICAgIGRvbmUKKyAgICBleGl0ICQ/CisgICAgOzsKKworICAtLWRlYnVnKQorICAgICRlY2hvICIkcHJvZ25hbWU6IGVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCisgICAgc2V0IC14CisgICAgcHJlc2VydmVfYXJncz0iJHByZXNlcnZlX2FyZ3MgJGFyZyIKKyAgICA7OworCisgIC0tZHJ5LXJ1biB8IC1uKQorICAgIHJ1bj06CisgICAgOzsKKworICAtLWZlYXR1cmVzKQorICAgICRlY2hvICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgJGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgICRlY2hvICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAkZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgJGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorICAgIGV4aXQgJD8KKyAgICA7OworCisgIC0tZmluaXNoKSBtb2RlPSJmaW5pc2giIDs7CisKKyAgLS1tb2RlKSBwcmV2b3B0PSItLW1vZGUiIHByZXY9bW9kZSA7OworICAtLW1vZGU9KikgbW9kZT0iJG9wdGFyZyIgOzsKKworICAtLXByZXNlcnZlLWR1cC1kZXBzKSBkdXBsaWNhdGVfZGVwcz0ieWVzIiA7OworCisgIC0tcXVpZXQgfCAtLXNpbGVudCkKKyAgICBzaG93PToKKyAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkYXJnIgorICAgIDs7CisKKyAgLS10YWcpCisgICAgcHJldm9wdD0iLS10YWciCisgICAgcHJldj10YWcKKyAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAtLXRhZyIKKyAgICA7OworICAtLXRhZz0qKQorICAgIHNldCB0YWcgIiRvcHRhcmciICR7MSsiJEAifQorICAgIHNoaWZ0CisgICAgcHJldj10YWcKKyAgICBwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAtLXRhZyIKKyAgICA7OworCisgIC1kbG9wZW4pCisgICAgcHJldm9wdD0iLWRsb3BlbiIKKyAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcworICAgIDs7CisKKyAgLSopCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgOzsKKworICAqKQorICAgIG5vbm9wdD0iJGFyZyIKKyAgICBicmVhaworICAgIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCisgICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCitmaQorCitjYXNlICRkaXNhYmxlX2xpYnMgaW4KK25vKSAKKyAgOzsKK3NoYXJlZCkKKyAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisgIGJ1aWxkX29sZF9saWJzPXllcworICA7Oworc3RhdGljKQorICBidWlsZF9vbGRfbGlicz1gY2FzZSAkYnVpbGRfbGlidG9vbF9saWJzIGluIHllcykgZWNobyBubzs7ICopIGVjaG8geWVzOzsgZXNhY2AKKyAgOzsKK2VzYWMKKworIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0CisjIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKKyMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KK2V4ZWNfY21kPQorCitpZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgorCisgICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgorICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKyAgICAkZWNobyAiKioqIFdhcm5pbmc6IGluZmVycmluZyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gaXMgZGVwcmVjYXRlZC4iIDE+JjIKKyAgICAkZWNobyAiKioqIEZ1dHVyZSB2ZXJzaW9ucyBvZiBMaWJ0b29sIHdpbGwgcmVxdWlyZSAtLW1vZGU9TU9ERSBiZSBzcGVjaWZpZWQuIiAxPiYyCisgICAgY2FzZSAkbm9ub3B0IGluCisgICAgKmNjIHwgY2MqIHwgKisrIHwgZ2NjKiB8ICotZ2NjKiB8IGcrKyogfCB4bGMqKQorICAgICAgbW9kZT1saW5rCisgICAgICBmb3IgYXJnCisgICAgICBkbworCWNhc2UgJGFyZyBpbgorCS1jKQorCSAgIG1vZGU9Y29tcGlsZQorCSAgIGJyZWFrCisJICAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgICpkYiB8ICpkYnggfCAqc3RyYWNlIHwgKnRydXNzKQorICAgICAgbW9kZT1leGVjdXRlCisgICAgICA7OworICAgICppbnN0YWxsKnxjcHxtdikKKyAgICAgIG1vZGU9aW5zdGFsbAorICAgICAgOzsKKyAgICAqcm0pCisgICAgICBtb2RlPXVuaW5zdGFsbAorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBJZiB3ZSBoYXZlIG5vIG1vZGUsIGJ1dCBkbGZpbGVzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGRvIGV4ZWN1dGUgbW9kZS4KKyAgICAgIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIG1vZGU9ZXhlY3V0ZQorCisgICAgICAjIEp1c3QgdXNlIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtb2RlLgorICAgICAgaWYgdGVzdCAteiAiJG1vZGUiOyB0aGVuCisJaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBpbmZlciBvcGVyYXRpb24gbW9kZSBmcm9tIFxgJG5vbm9wdCciIDE+JjIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorCisgICMgT25seSBleGVjdXRlIG1vZGUgaXMgYWxsb3dlZCB0byBoYXZlIC1kbG9wZW4gZmxhZ3MuCisgIGlmIHRlc3QgLW4gIiRleGVjdXRlX2RsZmlsZXMiICYmIHRlc3QgIiRtb2RlIiAhPSBleGVjdXRlOyB0aGVuCisgICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYC1kbG9wZW4nIiAxPiYyCisgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIGZpCisKKyAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgorICBnZW5lcmljX2hlbHA9IiRoZWxwIgorICBoZWxwPSJUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisgICMgVGhlc2UgbW9kZXMgYXJlIGluIG9yZGVyIG9mIGV4ZWN1dGlvbiBmcmVxdWVuY3kgc28gdGhhdCB0aGV5IHJ1biBxdWlja2x5LgorICBjYXNlICRtb2RlIGluCisgICMgbGlidG9vbCBjb21waWxlIG1vZGUKKyAgY29tcGlsZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgorICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKKyAgICBzdXBwcmVzc19vcHQ9eWVzCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorICAgIGFyZ19tb2RlPW5vcm1hbAorICAgIGxpYm9iaj0KKyAgICBsYXRlcj0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnX21vZGUgaW4KKyAgICAgIGFyZyAgKQorCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKKwlsYXN0YXJnPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCTs7CisKKyAgICAgIHRhcmdldCApCisJbGlib2JqPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCWNvbnRpbnVlCisJOzsKKworICAgICAgbm9ybWFsICkKKwkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisJY2FzZSAkYXJnIGluCisJLW8pCisJICBpZiB0ZXN0IC1uICIkbGlib2JqIiA7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgIGFyZ19tb2RlPXRhcmdldAorCSAgY29udGludWUKKwkgIDs7CisKKwktc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCisJICBsYXRlcj0iJGxhdGVyICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1uby1zdXBwcmVzcykKKwkgIHN1cHByZXNzX29wdD1ubworCSAgY29udGludWUKKwkgIDs7CisKKwktWGNvbXBpbGVyKQorCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAorCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKKwkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCisKKwktV2MsKikKKwkgIGFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eLVdjLC8vImAKKwkgIGxhc3Rhcmc9CisJICBzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKyAJICBmb3IgYXJnIGluICRhcmdzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKworCSAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisJICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisJICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisJICAgIGNhc2UgJGFyZyBpbgorCSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICAgIGFyZz0iXCIkYXJnXCIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBsYXN0YXJnPSIkbGFzdGFyZyAkYXJnIgorCSAgZG9uZQorCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBsYXN0YXJnPWAkZWNobyAiWCRsYXN0YXJnIiB8ICRYc2VkIC1lICJzL14gLy8iYAorCisJICAjIEFkZCB0aGUgYXJndW1lbnRzIHRvIGJhc2VfY29tcGlsZS4KKwkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJKiApCisJICAjIEFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCBhcyB0aGUgc291cmNlIGZpbGUuCisJICAjIFRoZSBwcmV2aW91cyAic3JjZmlsZSIgYmVjb21lcyB0aGUgY3VycmVudCBhcmd1bWVudC4KKwkgICMKKwkgIGxhc3Rhcmc9IiRzcmNmaWxlIgorCSAgc3JjZmlsZT0iJGFyZyIKKwkgIDs7CisJZXNhYyAgIyAgY2FzZSAkYXJnCisJOzsKKyAgICAgIGVzYWMgICAgIyAgY2FzZSAkYXJnX21vZGUKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKyAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisgICAgICBjYXNlICRsYXN0YXJnIGluCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseQorICAgICAgIyBpbiBzY2FuIHNldHMsIGFuZCBzb21lIFN1bk9TIGtzaCBtaXN0cmVhdCBiYWNrc2xhc2gtZXNjYXBpbmcKKyAgICAgICMgaW4gc2NhbiBzZXRzICh3b3JrZWQgYXJvdW5kIHdpdGggdmFyaWFibGUgZXhwYW5zaW9uKSwKKyAgICAgICMgYW5kIGZ1cnRoZXJtb3JlIGNhbm5vdCBoYW5kbGUgJ3wnICcmJyAnKCcgJyknIGluIHNjYW4gc2V0cyAKKyAgICAgICMgYXQgYWxsLCBzbyB3ZSBzcGVjaWZ5IHRoZW0gc2VwYXJhdGVseS4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCWxhc3Rhcmc9IlwiJGxhc3RhcmdcIiIKKwk7OworICAgICAgZXNhYworCisgICAgICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCisgICAgZG9uZSAjIGZvciBhcmcKKworICAgIGNhc2UgJGFyZ19tb2RlIGluCisgICAgYXJnKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBhcmd1bWVudCBmb3IgLVhjb21waWxlIgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICA7OworICAgIHRhcmdldCkKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2l0aCBcYC1vJyIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICA7OworICAgICopCisgICAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgICBbIC16ICIkbGlib2JqIiBdICYmIGxpYm9iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgeGZvcm09J1tjQ0ZTaWZtc29dJworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICouYWRhKSB4Zm9ybT1hZGEgOzsKKyAgICAqLmFkYikgeGZvcm09YWRiIDs7CisgICAgKi5hZHMpIHhmb3JtPWFkcyA7OworICAgICouYXNtKSB4Zm9ybT1hc20gOzsKKyAgICAqLmMrKykgeGZvcm09YysrIDs7CisgICAgKi5jYykgeGZvcm09Y2MgOzsKKyAgICAqLmlpKSB4Zm9ybT1paSA7OworICAgICouY2xhc3MpIHhmb3JtPWNsYXNzIDs7CisgICAgKi5jcHApIHhmb3JtPWNwcCA7OworICAgICouY3h4KSB4Zm9ybT1jeHggOzsKKyAgICAqLmY5MCkgeGZvcm09ZjkwIDs7CisgICAgKi5mb3IpIHhmb3JtPWZvciA7OworICAgICouamF2YSkgeGZvcm09amF2YSA7OworICAgIGVzYWMKKworICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKKworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICoubG8pIG9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgIDs7CisgICAgKikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgbmFtZSBvZiBsaWJyYXJ5IG9iamVjdCBmcm9tIFxgJGxpYm9iaiciIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLXN0YXRpYykKKwlidWlsZF9vbGRfbGlicz15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItcGljKQorCXBpY19tb2RlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXByZWZlci1ub24tcGljKQorCXBpY19tb2RlPW5vCisJY29udGludWUKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgIHFsaWJvYmo9YCRlY2hvICJYJGxpYm9iaiIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgY2FzZSAkcWxpYm9iaiBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJcWxpYm9iaj0iXCIkcWxpYm9ialwiIiA7OworICAgIGVzYWMKKyAgICB0ZXN0ICJYJGxpYm9iaiIgIT0gIlgkcWxpYm9iaiIgXAorCSYmICRlY2hvICJYJGxpYm9iaiIgfCBncmVwICdbXX4jXip7fTs8Pj8iJyInIicgCSYoKXxgJFtdJyBcCisJJiYgJGVjaG8gIiRtb2RlbmFtZTogbGlib2JqIG5hbWUgXGAkbGlib2JqJyBtYXkgbm90IGNvbnRhaW4gc2hlbGwgc3BlY2lhbCBjaGFyYWN0ZXJzLiIKKyAgICBvYmpuYW1lPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICB4ZGlyPWAkZWNobyAiWCRvYmoiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkb2JqIjsgdGhlbgorICAgICAgeGRpcj0KKyAgICBlbHNlCisgICAgICB4ZGlyPSR4ZGlyLworICAgIGZpCisgICAgbG9iaj0ke3hkaXJ9JG9iamRpci8kb2JqbmFtZQorCisgICAgaWYgdGVzdCAteiAiJGJhc2VfY29tcGlsZSI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBjb21waWxhdGlvbiBjb21tYW5kIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGVsc2UKKyAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBmaQorCisgICAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKyAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworICAgICMgT24gQ3lnd2luIHRoZXJlJ3Mgbm8gInJlYWwiIFBJQyBmbGFnIHNvIHdlIG11c3QgYnVpbGQgYm90aCBvYmplY3QgdHlwZXMKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICAgIDs7CisgICAgZXNhYworICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgPSBubyAmJiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisgICAgICAjIG5vbi1QSUMgY29kZSBpbiBzaGFyZWQgbGlicmFyaWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgIHBpY19tb2RlPWRlZmF1bHQKKyAgICBmaQorCisgICAgIyBDYWxjdWxhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgb2JqZWN0IGlmIGNvbXBpbGVyIGRvZXMKKyAgICAjIG5vdCBzdXBwb3J0IC1vIHdpdGggLWMKKyAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vOyB0aGVuCisgICAgICBvdXRwdXRfb2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MlXC5bXi5dKiQlJSdgLiR7b2JqZXh0fQorICAgICAgbG9ja2ZpbGU9IiRvdXRwdXRfb2JqLmxvY2siCisgICAgICByZW1vdmVsaXN0PSIkcmVtb3ZlbGlzdCAkb3V0cHV0X29iaiAkbG9ja2ZpbGUiCisgICAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKyAgICBlbHNlCisgICAgICBvdXRwdXRfb2JqPQorICAgICAgbmVlZF9sb2Nrcz1ubworICAgICAgbG9ja2ZpbGU9CisgICAgZmkKKworICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCisgICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQorICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgorICAgICAgdW50aWwgJHJ1biBsbiAiJHByb2dwYXRoIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KKwkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgorCSRlY2hvICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkcnVuICRybSAkcmVtb3ZlbGlzdAorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKyAgICAgICRlY2hvICIkc3JjZmlsZSIgPiAiJGxvY2tmaWxlIgorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkZml4X3NyY2ZpbGVfcGF0aCI7IHRoZW4KKyAgICAgIGV2YWwgc3JjZmlsZT1cIiRmaXhfc3JjZmlsZV9wYXRoXCIKKyAgICBmaQorICAgIHFzcmNmaWxlPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICBjYXNlICRxc3JjZmlsZSBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisgICAgICBxc3JjZmlsZT0iXCIkcXNyY2ZpbGVcIiIgOzsKKyAgICBlc2FjCisKKyAgICAkcnVuICRybSAiJGxpYm9iaiIgIiR7bGlib2JqfVQiCisKKyAgICAjIENyZWF0ZSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUgKGFuYWxvZ291cyB0byBhICIubGEiIGZpbGUpLAorICAgICMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCisgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4gJHtsaWJvYmp9VCA8PEVPRgorIyAkbGlib2JqIC0gYSBsaWJ0b29sIG9iamVjdCBmaWxlCisjIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAKKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgTmFtZSBvZiB0aGUgUElDIG9iamVjdC4KK0VPRgorCisgICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCisgICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKKworICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSBubzsgdGhlbgorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKKyAgICAgIGVsc2UKKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICEgLWQgIiR7eGRpcn0kb2JqZGlyIjsgdGhlbgorCSRzaG93ICIkbWtkaXIgJHt4ZGlyfSRvYmpkaXIiCisJJHJ1biAkbWtkaXIgJHt4ZGlyfSRvYmpkaXIKKwlleGl0X3N0YXR1cz0kPworCWlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIke3hkaXJ9JG9iamRpciI7IHRoZW4KKwkgIGV4aXQgJGV4aXRfc3RhdHVzCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgorCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgorCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRsb2JqIgorICAgICAgZmkKKworICAgICAgJHJ1biAkcm0gIiRsb2JqIiAiJG91dHB1dF9vYmoiCisKKyAgICAgICRzaG93ICIkY29tbWFuZCIKKyAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKKyAgICAgIGVsc2UKKwl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkZWNobyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZCwgdGhlbiBnbyBvbiB0byBjb21waWxlIHRoZSBuZXh0IG9uZQorICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkbG9iaiI7IHRoZW4KKwkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsb2JqIgorCWlmICRydW4gJG12ICRvdXRwdXRfb2JqICRsb2JqOyB0aGVuIDoKKwllbHNlCisJICBlcnJvcj0kPworCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwkgIGV4aXQgJGVycm9yCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBQSUMgb2JqZWN0IHRvIHRoZSBsaWJ0b29sIG9iamVjdCBmaWxlLgorICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKK3BpY19vYmplY3Q9JyRvYmpkaXIvJG9iam5hbWUnCisKK0VPRgorCisgICAgICAjIEFsbG93IGVycm9yIG1lc3NhZ2VzIG9ubHkgZnJvbSB0aGUgZmlyc3QgY29tcGlsYXRpb24uCisgICAgICBpZiB0ZXN0ICIkc3VwcHJlc3Nfb3B0IiA9IHllczsgdGhlbgorICAgICAgICBzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgICMgTm8gUElDIG9iamVjdCBzbyBpbmRpY2F0ZSBpdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBsaWJ0b29sCisgICAgICAjIG9iamVjdCBmaWxlLgorICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKK3BpY19vYmplY3Q9bm9uZQorCitFT0YKKyAgICBmaQorCisgICAgIyBPbmx5IGJ1aWxkIGEgcG9zaXRpb24tZGVwZW5kZW50IG9iamVjdCBpZiB3ZSBidWlsZCBvbGQgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0geWVzOyB0aGVuCisJIyBEb24ndCBidWlsZCBQSUMgY29kZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgorICAgICAgZWxzZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlICRwaWNfZmxhZyIKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IHllczsgdGhlbgorCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRvYmoiCisgICAgICBmaQorCisgICAgICAjIFN1cHByZXNzIGNvbXBpbGVyIG91dHB1dCBpZiB3ZSBhbHJlYWR5IGRpZCBhIFBJQyBjb21waWxhdGlvbi4KKyAgICAgIGNvbW1hbmQ9IiRjb21tYW5kJHN1cHByZXNzX291dHB1dCIKKyAgICAgICRydW4gJHJtICIkb2JqIiAiJG91dHB1dF9vYmoiCisgICAgICAkc2hvdyAiJGNvbW1hbmQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6CisgICAgICBlbHNlCisJJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkZWNobyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRydW4gJHJtICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAorICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkb2JqIjsgdGhlbgorCSRzaG93ICIkbXYgJG91dHB1dF9vYmogJG9iaiIKKwlpZiAkcnVuICRtdiAkb3V0cHV0X29iaiAkb2JqOyB0aGVuIDoKKwllbHNlCisJICBlcnJvcj0kPworCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKKwkgIGV4aXQgJGVycm9yCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBub24tUElDIG9iamVjdCB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KKyAgICAgICMgT25seSBhcHBlbmQgaWYgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUgZXhpc3RzLgorICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKKyMgTmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QuCitub25fcGljX29iamVjdD0nJG9iam5hbWUnCisKK0VPRgorICAgIGVsc2UKKyAgICAgICMgQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBub24tUElDIG9iamVjdCB0aGUgbGlidG9vbCBvYmplY3QgZmlsZS4KKyAgICAgICMgT25seSBhcHBlbmQgaWYgdGhlIGxpYnRvb2wgb2JqZWN0IGZpbGUgZXhpc3RzLgorICAgICAgdGVzdCAteiAiJHJ1biIgJiYgY2F0ID4+ICR7bGlib2JqfVQgPDxFT0YKKyMgTmFtZSBvZiB0aGUgbm9uLVBJQyBvYmplY3QuCitub25fcGljX29iamVjdD1ub25lCisKK0VPRgorICAgIGZpCisKKyAgICAkcnVuICRtdiAiJHtsaWJvYmp9VCIgIiR7bGlib2JqfSIKKworICAgICMgVW5sb2NrIHRoZSBjcml0aWNhbCBzZWN0aW9uIGlmIGl0IHdhcyBsb2NrZWQKKyAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgICAgICRydW4gJHJtICIkbG9ja2ZpbGUiCisgICAgZmkKKworICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIDs7CisKKyAgIyBsaWJ0b29sIGxpbmsgbW9kZQorICBsaW5rIHwgcmVsaW5rKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGxpbmsiCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAorICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAorICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQorICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9jYXRpb24uCisgICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubworCisgICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKKyAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90CisgICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQorICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCisgICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcworICAgICAgOzsKKyAgICBlc2FjCisgICAgbGlidG9vbF9hcmdzPSIkbm9ub3B0IgorICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKKyAgICBjb21waWxlX2NvbW1hbmQ9IiRub25vcHQiCisgICAgZmluYWxpemVfY29tbWFuZD0iJG5vbm9wdCIKKworICAgIGNvbXBpbGVfcnBhdGg9CisgICAgZmluYWxpemVfcnBhdGg9CisgICAgY29tcGlsZV9zaGxpYnBhdGg9CisgICAgZmluYWxpemVfc2hsaWJwYXRoPQorICAgIGNvbnZlbmllbmNlPQorICAgIG9sZF9jb252ZW5pZW5jZT0KKyAgICBkZXBsaWJzPQorICAgIG9sZF9kZXBsaWJzPQorICAgIGNvbXBpbGVyX2ZsYWdzPQorICAgIGxpbmtlcl9mbGFncz0KKyAgICBkbGxzZWFyY2hwYXRoPQorICAgIGxpYl9zZWFyY2hfcGF0aD1gcHdkYAorICAgIGluc3RfcHJlZml4X2Rpcj0KKworICAgIGF2b2lkX3ZlcnNpb249bm8KKyAgICBkbGZpbGVzPQorICAgIGRscHJlZmlsZXM9CisgICAgZGxzZWxmPW5vCisgICAgZXhwb3J0X2R5bmFtaWM9bm8KKyAgICBleHBvcnRfc3ltYm9scz0KKyAgICBleHBvcnRfc3ltYm9sc19yZWdleD0KKyAgICBnZW5lcmF0ZWQ9CisgICAgbGlib2Jqcz0KKyAgICBsdGxpYnM9CisgICAgbW9kdWxlPW5vCisgICAgbm9faW5zdGFsbD1ubworICAgIG9ianM9CisgICAgbm9uX3BpY19vYmplY3RzPQorICAgIG5vdGluc3RfcGF0aD0gIyBwYXRocyB0aGF0IGNvbnRhaW4gbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PQorICAgIHByZWZlcl9zdGF0aWNfbGlicz1ubworICAgIHByZWxvYWQ9bm8KKyAgICBwcmV2PQorICAgIHByZXZhcmc9CisgICAgcmVsZWFzZT0KKyAgICBycGF0aD0KKyAgICB4cnBhdGg9CisgICAgcGVybV9ycGF0aD0KKyAgICB0ZW1wX3JwYXRoPQorICAgIHRocmVhZF9zYWZlPW5vCisgICAgdmluZm89CisgICAgdmluZm9fbnVtYmVyPW5vCisKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1hbGwtc3RhdGljIHwgLXN0YXRpYykKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIjsgdGhlbgorCSAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz1idWlsdAorCWZpCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KKyAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCisKKyAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KKyAgICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJcWFyZz1cImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYFwiICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCTs7CisgICAgICAqKSBxYXJnPSRhcmcgOzsKKyAgICAgIGVzYWMKKyAgICAgIGxpYnRvb2xfYXJncz0iJGxpYnRvb2xfYXJncyAkcWFyZyIKKworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwljYXNlICRwcmV2IGluCisJb3V0cHV0KQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBPVVRQVVRAIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCisJICA7OworCWVzYWMKKworCWNhc2UgJHByZXYgaW4KKwlkbGZpbGVzfGRscHJlZmlsZXMpCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSBubzsgdGhlbgorCSAgICAjIEFkZCB0aGUgc3ltYm9sIG9iamVjdCBpbnRvIHRoZSBsaW5raW5nIGNvbW1hbmRzLgorCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgorCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAU1lNRklMRUAiCisJICAgIHByZWxvYWQ9eWVzCisJICBmaQorCSAgY2FzZSAkYXJnIGluCisJICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgorCSAgZm9yY2UpCisJICAgIGlmIHRlc3QgIiRkbHNlbGYiID0gbm87IHRoZW4KKwkgICAgICBkbHNlbGY9bmVlZGxlc3MKKwkgICAgICBleHBvcnRfZHluYW1pYz15ZXMKKwkgICAgZmkKKwkgICAgcHJldj0KKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIHNlbGYpCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICAgICBkbHNlbGY9eWVzCisJICAgIGVsaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiICE9IHllczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxzZQorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgorCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICAgIGVsc2UKKwkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgorCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlleHBzeW1zKQorCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCisJICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlleHBzeW1zX3JlZ2V4KQorCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJaW5zdF9wcmVmaXgpCisJICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJcHJlY2lvdXNfcmVnZXgpCisJICBwcmVjaW91c19maWxlc19yZWdleD0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlyZWxlYXNlKQorCSAgcmVsZWFzZT0iLSRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJb2JqZWN0bGlzdCkKKwkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCisJICAgIHNhdmVfYXJnPSRhcmcKKwkgICAgbW9yZWFyZ3M9CisJICAgIGZvciBmaWwgaW4gYGNhdCAkc2F2ZV9hcmdgCisJICAgIGRvCisjCSAgICAgIG1vcmVhcmdzPSIkbW9yZWFyZ3MgJGZpbCIKKwkgICAgICBhcmc9JGZpbAorCSAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgorCisJICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgorCSAgICAgIGlmICgke1NFRH0gLWUgJzJxJyAkYXJnIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJcGljX29iamVjdD0KKwkJbm9uX3BpY19vYmplY3Q9CisKKwkJIyBSZWFkIHRoZSAubG8gZmlsZQorCQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwkJY2FzZSAkYXJnIGluCisJCSovKiB8ICpcXCopIC4gJGFyZyA7OworCQkqKSAuIC4vJGFyZyA7OworCQllc2FjCisKKwkJaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IFwKKwkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmIFwKKwkJICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIG9iamVjdCBmb3IgXGAkYXJnJyIgMT4mMgorCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCQlmaQorCisJCSMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJCXhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCQlpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgorCQkgIHhkaXI9CisJCWVsc2UKKwkJICB4ZGlyPSIkeGRpci8iCisJCWZpCisKKwkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCisKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQkgICAgICBwcmV2PQorCQkgICAgICBjb250aW51ZQorCQkgICAgZWxzZQorCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQkgICAgICBwcmV2PWRscHJlZmlsZXMKKwkJICAgIGZpCisJCSAgZmkKKworCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCisJCSAgICBwcmV2PQorCQkgIGZpCisKKwkJICAjIEEgUElDIG9iamVjdC4KKwkJICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKKwkJICBhcmc9IiRwaWNfb2JqZWN0IgorCQlmaQorCisJCSMgTm9uLVBJQyBvYmplY3QuCisJCWlmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCQkgICMgUHJlcGVuZCB0aGUgc3ViZGlyZWN0b3J5IHRoZSBvYmplY3QgaXMgZm91bmQgaW4uCisJCSAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJCSAgIyBBIHN0YW5kYXJkIG5vbi1QSUMgb2JqZWN0CisJCSAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KKwkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCQkgIGZpCisJCWVsc2UKKwkJICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJCSAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKKwkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCQlmaQorCSAgICAgIGVsc2UKKwkJIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJCWlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIgMT4mMgorCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCQllbHNlCisJCSAgIyBEcnktcnVuIGNhc2UuCisKKwkJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCQkgIHhkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCQkgIGlmIHRlc3QgIlgkeGRpciIgPSAiWCRhcmciOyB0aGVuCisJCSAgICB4ZGlyPQorCQkgIGVsc2UKKwkJICAgIHhkaXI9IiR4ZGlyLyIKKwkJICBmaQorCisJCSAgcGljX29iamVjdD1gJGVjaG8gIlgke3hkaXJ9JHtvYmpkaXJ9LyR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCQkgIG5vbl9waWNfb2JqZWN0PWAkZWNobyAiWCR7eGRpcn0ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkJICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKKwkJICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCQlmaQorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogbGluayBpbnB1dCBmaWxlIFxgJHNhdmVfYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgYXJnPSRzYXZlX2FyZworCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJwYXRoIHwgeHJwYXRoKQorCSAgIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJICBjYXNlICRhcmcgaW4KKwkgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkgICopCisJICAgICRlY2hvICIkbW9kZW5hbWU6IG9ubHkgYWJzb2x1dGUgcnVuLXBhdGhzIGFyZSBhbGxvd2VkIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAiJHByZXYiID0gcnBhdGg7IHRoZW4KKwkgICAgY2FzZSAiJHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgcnBhdGg9IiRycGF0aCAkYXJnIiA7OworCSAgICBlc2FjCisJICBlbHNlCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkYXJnICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwl4Y29tcGlsZXIpCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgorCSAgcHJldj0KKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGxpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCisJICBwcmV2PQorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR3bCRxYXJnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4Y2NsaW5rZXIpCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJHFhcmciCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgorCSAgcHJldj0KKwkgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkcWFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJc2hyZXh0KQorICAJICBzaHJleHRfY21kcz0iJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlkYXJ3aW5fZnJhbWV3b3JrfGRhcndpbl9mcmFtZXdvcmtfc2tpcCkKKwkgIHRlc3QgIiRwcmV2IiA9ICJkYXJ3aW5fZnJhbWV3b3JrIiAmJiBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJKikKKwkgIGV2YWwgIiRwcmV2PVwiXCRhcmdcIiIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwllc2FjCisgICAgICBmaSAjIHRlc3QgLW4gIiRwcmV2IgorCisgICAgICBwcmV2YXJnPSIkYXJnIgorCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1hbGwtc3RhdGljKQorCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1hbGxvdy11bmRlZmluZWQpCisJIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgorCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCisJY29udGludWUKKwk7OworCisgICAgICAtYXZvaWQtdmVyc2lvbikKKwlhdm9pZF92ZXJzaW9uPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWRsb3BlbikKKwlwcmV2PWRsZmlsZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbHByZW9wZW4pCisJcHJldj1kbHByZWZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZXhwb3J0LWR5bmFtaWMpCisJZXhwb3J0X2R5bmFtaWM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtZXhwb3J0LXN5bWJvbHMgfCAtZXhwb3J0LXN5bWJvbHMtcmVnZXgpCisJaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBtb3JlIHRoYW4gb25lIC1leHBvcnRlZC1zeW1ib2xzIGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZmkKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1leHBvcnQtc3ltYm9scyI7IHRoZW4KKwkgIHByZXY9ZXhwc3ltcworCWVsc2UKKwkgIHByZXY9ZXhwc3ltc19yZWdleAorCWZpCisJY29udGludWUKKwk7OworCisgICAgICAtZnJhbWV3b3JrfC1hcmNofC1pc3lzcm9vdCkKKwljYXNlICIgJENDICIgaW4KKwkgICoiICR7YXJnfSAkezF9ICIqIHwgKiIgJHthcmd9CSR7MX0gIiopIAorCQlwcmV2PWRhcndpbl9mcmFtZXdvcmtfc2tpcCA7OworCSAgKikgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCSAgICAgcHJldj1kYXJ3aW5fZnJhbWV3b3JrIDs7CisJZXNhYworCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisJY29udGludWUKKwk7OworCisgICAgICAtaW5zdC1wcmVmaXgtZGlyKQorCXByZXY9aW5zdF9wcmVmaXgKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgVGhlIG5hdGl2ZSBJUklYIGxpbmtlciB1bmRlcnN0YW5kcyAtTEFORzoqLCAtTElTVDoqIGFuZCAtTE5POioKKyAgICAgICMgc28sIGlmIHdlIHNlZSB0aGVzZSBmbGFncyBiZSBjYXJlZnVsIG5vdCB0byB0cmVhdCB0aGVtIGxpa2UgLUwKKyAgICAgIC1MW0EtWl1bQS1aXSo6KikKKwljYXNlICR3aXRoX2djYy8kaG9zdCBpbgorCW5vLyotKi1pcml4KiB8IC8qLSotaXJpeCopCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1MKikKKwlkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9eLUwvLydgCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciIDE+JjIKKwkgICAgYWJzZGlyPSIkZGlyIgorCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGRpciIKKwkgIGZpCisJICBkaXI9IiRhYnNkaXIiCisJICA7OworCWVzYWMKKwljYXNlICIkZGVwbGlicyAiIGluCisJKiIgLUwkZGlyICIqKSA7OworCSopCisJICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCisJICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKKwkgIDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKwkgIHRlc3RiaW5kaXI9YCRlY2hvICJYJGRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRkaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWwqKQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiB8fCB0ZXN0ICJYJGFyZyIgPSAiWC1sbSI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1iZW9zKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vczIqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXN5c3Y0LjJ1dzIqIHwgKi0qLXN5c3Y1KiB8ICotKi11bml4d2FyZSogfCAqLSotT3BlblVOSVgqKQorCSAgICAjIENvbXBpbGVyIGluc2VydHMgbGliYyBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgdGhyZWFkcyB0byB3b3JrCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgZXNhYworCWVsaWYgdGVzdCAiWCRhcmciID0gIlgtbGNfciI7IHRoZW4KKwkgY2FzZSAkaG9zdCBpbgorCSAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAjIERvIG5vdCBpbmNsdWRlIGxpYmNfciBkaXJlY3RseSwgdXNlIC1wdGhyZWFkIGZsYWcuCisJICAgY29udGludWUKKwkgICA7OworCSBlc2FjCisJZmkKKwlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKworICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgLW1vZGVsKQorCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCWNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGFyZyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmUpCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisJY29udGludWUKKwk7OworCisgICAgICAtbW9kdWxlKQorCW1vZHVsZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgLTY0LCAtbWlwc1swLTldIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC1yWzAtOV1bMC05XSogc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igb24gdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFN1biBjb21waWxlcgorICAgICAgIyArREEqLCArREQqIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgSFAgY29tcGlsZXIKKyAgICAgICMgLXEqIHBhc3MgdGhyb3VnaCBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCisgICAgICAjIC1tKiBwYXNzIHRocm91Z2ggYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvbXBpbGVyIGFyZ3MgZm9yIEdDQworICAgICAgIyAtbSosIC10WzQ1XSosIC10eHNjYWxlKiBwYXNzIHRocm91Z2ggYXJjaGl0ZWN0dXJlLXNwZWNpZmljCisgICAgICAjIGNvbXBpbGVyIGFyZ3MgZm9yIEdDQworICAgICAgIyAtcGcgcGFzcyB0aHJvdWdoIHByb2ZpbGluZyBmbGFnIGZvciBHQ0MKKyAgICAgICMgQGZpbGUgR0NDIHJlc3BvbnNlIGZpbGVzCisgICAgICAtNjR8LW1pcHNbMC05XXwtclswLTldWzAtOV0qfC14YXJjaD0qfC14dGFyZ2V0PSp8K0RBKnwrREQqfC1xKnwtbSp8LXBnfCBcCisgICAgICAtdFs0NV0qfC10eHNjYWxlKnxAKikKKworCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgJGFyZyBpbgorCSpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgYXJnPSJcIiRhcmdcIiIKKwkgIDs7CisJZXNhYworICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICAgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorICAgICAgICBjb250aW51ZQorICAgICAgICA7OworCisgICAgICAtc2hyZXh0KQorCXByZXY9c2hyZXh0CisJY29udGludWUKKwk7OworCisgICAgICAtbm8tZmFzdC1pbnN0YWxsKQorCWZhc3RfaW5zdGFsbD1ubworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW5vLWluc3RhbGwpCisJY2FzZSAkaG9zdCBpbgorCSotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqKQorCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCisJICAjIGluIG9yZGVyIGZvciB0aGUgbG9hZGVyIHRvIGZpbmQgYW55IGRsbHMgaXQgbmVlZHMuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1uby1pbnN0YWxsJyBpcyBpZ25vcmVkIGZvciAkaG9zdCIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogYXNzdW1pbmcgXGAtbm8tZmFzdC1pbnN0YWxsJyBpbnN0ZWFkIiAxPiYyCisJICBmYXN0X2luc3RhbGw9bm8KKwkgIDs7CisJKikgbm9faW5zdGFsbD15ZXMgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbm8tdW5kZWZpbmVkKQorCWFsbG93X3VuZGVmaW5lZD1ubworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW9iamVjdGxpc3QpCisJcHJldj1vYmplY3RsaXN0CisJY29udGludWUKKwk7OworCisgICAgICAtbykgcHJldj1vdXRwdXQgOzsKKworICAgICAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4KQorCXByZXY9cHJlY2lvdXNfcmVnZXgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1yZWxlYXNlKQorCXByZXY9cmVsZWFzZQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJwYXRoKQorCXByZXY9cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKQorCXByZXY9eHJwYXRoCisJY29udGludWUKKwk7OworCisgICAgICAtUiopCisJZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogb25seSBhYnNvbHV0ZSBydW4tcGF0aHMgYXJlIGFsbG93ZWQiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgOzsKKwllc2FjCisJY2FzZSAiJHhycGF0aCAiIGluCisJKiIgJGRpciAiKikgOzsKKwkqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtc3RhdGljKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisgICAgICAtdmVyc2lvbi1udW1iZXIpCisJcHJldj12aW5mbworCXZpbmZvX251bWJlcj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1XYywqKQorCWFyZ3M9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCIgLWUgJ3MvXi1XYywvLydgCisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBjYXNlICRmbGFnIGluCisJICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCSAgICBmbGFnPSJcIiRmbGFnXCIiCisJICAgIDs7CisJICBlc2FjCisJICBhcmc9IiRhcmcgJHdsJGZsYWciCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRmbGFnIgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAicy9eIC8vImAKKwk7OworCisgICAgICAtV2wsKikKKwlhcmdzPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiIC1lICdzL14tV2wsLy8nYAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgY2FzZSAkZmxhZyBpbgorCSAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKwkgICAgZmxhZz0iXCIkZmxhZ1wiIgorCSAgICA7OworCSAgZXNhYworCSAgYXJnPSIkYXJnICR3bCRmbGFnIgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZmxhZyIKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgInMvXiAvLyJgCisJOzsKKworICAgICAgLVhjb21waWxlcikKKwlwcmV2PXhjb21waWxlcgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVhsaW5rZXIpCisJcHJldj14bGlua2VyCisJY29udGludWUKKwk7OworCisgICAgICAtWENDbGlua2VyKQorCXByZXY9eGNjbGlua2VyCisJY29udGludWUKKwk7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgZmxhZy4KKyAgICAgIC0qIHwgKyopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJY2FzZSAkYXJnIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisJOzsKKworICAgICAgKi4kb2JqZXh0KQorCSMgQSBzdGFuZGFyZCBvYmplY3QuCisJb2Jqcz0iJG9ianMgJGFyZyIKKwk7OworCisgICAgICAqLmxvKQorCSMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgb2JqZWN0LgorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgb2JqZWN0LgorCWlmICgke1NFRH0gLWUgJzJxJyAkYXJnIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICRhcmcgaW4KKwkgICovKiB8ICpcXCopIC4gJGFyZyA7OworCSAgKikgLiAuLyRhcmcgOzsKKwkgIGVzYWMKKworCSAgaWYgdGVzdCAteiAiJHBpY19vYmplY3QiIHx8IFwKKwkgICAgIHRlc3QgLXogIiRub25fcGljX29iamVjdCIgfHwKKwkgICAgIHRlc3QgIiRwaWNfb2JqZWN0IiA9IG5vbmUgJiYgXAorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgeGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJICBpZiB0ZXN0ICJYJHhkaXIiID0gIlgkYXJnIjsgdGhlbgorCSAgICB4ZGlyPQorIAkgIGVsc2UKKwkgICAgeGRpcj0iJHhkaXIvIgorCSAgZmkKKworCSAgaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgcGljX29iamVjdD0iJHhkaXIkcGljX29iamVjdCIKKworCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiA9IHllczsgdGhlbgorCQlkbGZpbGVzPSIkZGxmaWxlcyAkcGljX29iamVjdCIKKwkJcHJldj0KKwkJY29udGludWUKKwkgICAgICBlbHNlCisJCSMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCisJCXByZXY9ZGxwcmVmaWxlcworCSAgICAgIGZpCisJICAgIGZpCisKKwkgICAgIyBDSEVDSyBNRTogIEkgdGhpbmsgSSBidXN0ZWQgdGhpcy4gIC1Pc3NhbWEKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkcGljX29iamVjdCIKKwkgICAgICBwcmV2PQorCSAgICBmaQorCisJICAgICMgQSBQSUMgb2JqZWN0LgorCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBub25fcGljX29iamVjdHM9IiRub25fcGljX29iamVjdHMgJG5vbl9waWNfb2JqZWN0IgorCSAgICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KKwkgICAgICBhcmc9IiRub25fcGljX29iamVjdCIKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgIyBJZiB0aGUgUElDIG9iamVjdCBleGlzdHMsIHVzZSBpdCBpbnN0ZWFkLgorCSAgICAjICR4ZGlyIHdhcyBwcmVwZW5kZWQgdG8gJHBpY19vYmplY3QgYWJvdmUuCisJICAgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKKwkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkgIGZpCisJZWxzZQorCSAgIyBPbmx5IGFuIGVycm9yIGlmIG5vdCBkb2luZyBhIGRyeS1ydW4uCisJICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRhcmcnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgb2JqZWN0IiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZWxzZQorCSAgICAjIERyeS1ydW4gY2FzZS4KKworCSAgICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgICB4ZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwkgICAgaWYgdGVzdCAiWCR4ZGlyIiA9ICJYJGFyZyI7IHRoZW4KKwkgICAgICB4ZGlyPQorCSAgICBlbHNlCisJICAgICAgeGRpcj0iJHhkaXIvIgorCSAgICBmaQorCisJICAgIHBpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7b2JqZGlyfS8ke2FyZ30iIHwgJFhzZWQgLWUgIiRsbzJvImAKKwkgICAgbm9uX3BpY19vYmplY3Q9YCRlY2hvICJYJHt4ZGlyfSR7YXJnfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCSAgICBsaWJvYmpzPSIkbGlib2JqcyAkcGljX29iamVjdCIKKwkgICAgbm9uX3BpY19vYmplY3RzPSIkbm9uX3BpY19vYmplY3RzICRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBwcmV2PQorCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICBwcmV2PQorCWVsc2UKKwkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJY2FzZSAkYXJnIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgIGVzYWMgIyBhcmcKKworICAgICAgIyBOb3cgYWN0dWFsbHkgc3Vic3RpdHV0ZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZHMuCisgICAgICBpZiB0ZXN0IC1uICIkYXJnIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRhcmciCisgICAgICBmaQorICAgIGRvbmUgIyBhcmd1bWVudCBwYXJzaW5nIGxvb3AKKworICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXZhcmcnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkYXJnIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgb3V0cHV0bmFtZT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkZWNobyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAorICAgIGVsc2UKKyAgICAgIHNobGliX3NlYXJjaF9wYXRoPQorICAgIGZpCisgICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCisgICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgorCisgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgaWYgdGVzdCAiWCRvdXRwdXRfb2JqZGlyIiA9ICJYJG91dHB1dCI7IHRoZW4KKyAgICAgIG91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCisgICAgZWxzZQorICAgICAgb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKKyAgICBmaQorICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZGlyZWN0b3J5LgorICAgIGlmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCisgICAgICAkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgorICAgICAgJHJ1biAkbWtkaXIgJG91dHB1dF9vYmpkaXIKKyAgICAgIGV4aXRfc3RhdHVzPSQ/CisgICAgICBpZiB0ZXN0ICIkZXhpdF9zdGF0dXMiIC1uZSAwICYmIHRlc3QgISAtZCAiJG91dHB1dF9vYmpkaXIiOyB0aGVuCisJZXhpdCAkZXhpdF9zdGF0dXMKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQgZmlsZSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIDs7CisgICAgKi4kbGliZXh0KSBsaW5rbW9kZT1vbGRsaWIgOzsKKyAgICAqLmxvIHwgKi4kb2JqZXh0KSBsaW5rbW9kZT1vYmogOzsKKyAgICAqLmxhKSBsaW5rbW9kZT1saWIgOzsKKyAgICAqKSBsaW5rbW9kZT1wcm9nIDs7ICMgQW55dGhpbmcgZWxzZSBzaG91bGQgYmUgYSBwcm9ncmFtLgorICAgIGVzYWMKKworICAgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiopCisgICAgICAjIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGlvbnMgaW4gJHBvc3RkZXBzIGFuZCAkcHJlZGVwcworICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgZHVwbGljYXRlX2NvbXBpbGVyX2dlbmVyYXRlZF9kZXBzPSRkdXBsaWNhdGVfZGVwcworICAgICAgOzsKKyAgICBlc2FjCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KKwljYXNlICIkbGlicyAiIGluCisJKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBsaWJzPSIkbGlicyAkZGVwbGliIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGxpYnM9IiRwcmVkZXBzICRsaWJzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggJHBvc3RkZXBzIgorCisgICAgICAjIENvbXB1dGUgbGlicmFyaWVzIHRoYXQgYXJlIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiAkcHJlZGVwcworICAgICAgIyAkcG9zdGRlcHMgYW5kIG1hcmsgdGhlbSBhcyBzcGVjaWFsIChpLmUuLCB3aG9zZSBkdXBsaWNhdGVzIGFyZQorICAgICAgIyBub3QgdG8gYmUgZWxpbWluYXRlZCkuCisgICAgICBwcmVfcG9zdF9kZXBzPQorICAgICAgaWYgdGVzdCAiWCRkdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCisJZG9uZQorICAgICAgZmkKKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgZmkKKworICAgIGRlcGxpYnM9CisgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKyAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIGNhc2UgJGxpbmttb2RlIGluCisgICAgbGliKQorCXBhc3Nlcz0iY29udiBsaW5rIgorCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbworCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5sYSkgOzsKKwkgICopCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGxpYnJhcmllcyBjYW4gXGAtZGxvcGVuJyBvbmx5IGxpYnRvb2wgbGlicmFyaWVzOiAkZmlsZSIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJOzsKKyAgICBwcm9nKQorCWNvbXBpbGVfZGVwbGlicz0KKwlmaW5hbGl6ZV9kZXBsaWJzPQorCWFsbGRlcGxpYnM9bm8KKwluZXdkbGZpbGVzPQorCW5ld2RscHJlZmlsZXM9CisJcGFzc2VzPSJjb252IHNjYW4gZGxvcGVuIGRscHJlb3BlbiBsaW5rIgorCTs7CisgICAgKikgIHBhc3Nlcz0iY29udiIKKwk7OworICAgIGVzYWMKKyAgICBmb3IgcGFzcyBpbiAkcGFzc2VzOyBkbworICAgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJsaWIsbGluayIgfHwKKwkgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iOyB0aGVuCisJbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCWNhc2UgJHBhc3MgaW4KKwlkbG9wZW4pIGxpYnM9IiRkbGZpbGVzIiA7OworCWRscHJlb3BlbikgbGlicz0iJGRscHJlZmlsZXMiIDs7CisJbGluaykgbGlicz0iJGRlcGxpYnMgJURFUExJQlMlICRkZXBlbmRlbmN5X2xpYnMiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRsb3BlbjsgdGhlbgorCSMgQ29sbGVjdCBkbHByZW9wZW5lZCBsaWJyYXJpZXMKKwlzYXZlX2RlcGxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorICAgICAgZm9yIGRlcGxpYiBpbiAkbGliczsgZG8KKwlsaWI9CisJZm91bmQ9bm8KKwljYXNlICRkZXBsaWIgaW4KKwktbXR8LW10aHJlYWRzfC1rdGhyZWFkfC1LdGhyZWFkfC1wdGhyZWFkfC1wdGhyZWFkc3wtLXRocmVhZC1zYWZlKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRlcGxpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRkZXBsaWIiCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJLWwqKQorCSAgaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWIgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzL29iamVjdHMiIDE+JjIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBuYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1sLy8nYAorCSAgZm9yIHNlYXJjaGRpciBpbiAkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCSAgICBmb3Igc2VhcmNoX2V4dCBpbiAubGEgJHN0ZF9zaHJleHQgLnNvIC5hOyBkbworCSAgICAgICMgU2VhcmNoIHRoZSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgICBsaWI9IiRzZWFyY2hkaXIvbGliJHtuYW1lfSR7c2VhcmNoX2V4dH0iCisJICAgICAgaWYgdGVzdCAtZiAiJGxpYiI7IHRoZW4KKwkJaWYgdGVzdCAiJHNlYXJjaF9leHQiID0gIi5sYSI7IHRoZW4KKwkJICBmb3VuZD15ZXMKKwkJZWxzZQorCQkgIGZvdW5kPW5vCisJCWZpCisJCWJyZWFrIDIKKwkgICAgICBmaQorCSAgICBkb25lCisJICBkb25lCisJICBpZiB0ZXN0ICIkZm91bmQiICE9IHllczsgdGhlbgorCSAgICAjIGRlcGxpYiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgIGVsc2UgIyBkZXBsaWIgaXMgYSBsaWJ0b29sIGxpYnJhcnkKKwkgICAgIyBJZiAkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzICYmICRkZXBsaWIgaXMgYSBzdGRsaWIsCisJICAgICMgV2UgbmVlZCB0byBkbyBzb21lIHNwZWNpYWwgdGhpbmdzIGhlcmUsIGFuZCBub3QgbGF0ZXIuCisJICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkgICAgICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKQorCQlpZiAoJHtTRUR9IC1lICcycScgJGxpYiB8CisgICAgICAgICAgICAgICAgICAgIGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCSAgbGlicmFyeV9uYW1lcz0KKwkJICBvbGRfbGlicmFyeT0KKwkJICBjYXNlICRsaWIgaW4KKwkJICAqLyogfCAqXFwqKSAuICRsaWIgOzsKKwkJICAqKSAuIC4vJGxpYiA7OworCQkgIGVzYWMKKwkJICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisJCSAgICBsbD0iJGwiCisJCSAgZG9uZQorCQkgIGlmIHRlc3QgIlgkbGwiID0gIlgkb2xkX2xpYnJhcnkiIDsgdGhlbiAjIG9ubHkgc3RhdGljIHZlcnNpb24gYXZhaWxhYmxlCisJCSAgICBmb3VuZD1ubworCQkgICAgbGFkaXI9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCQkgICAgdGVzdCAiWCRsYWRpciIgPSAiWCRsaWIiICYmIGxhZGlyPSIuIgorCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKKwkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkJICAgIGVsc2UKKwkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkJICAgIGZpCisJCSAgICBjb250aW51ZQorCQkgIGZpCisJCWZpCisJICAgICAgICA7OworCSAgICAgICopIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZmkKKwkgIDs7ICMgLWwKKwktTCopCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICB0ZXN0ICIkcGFzcyIgPSBjb252ICYmIGNvbnRpbnVlCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYAorCSAgICA7OworCSAgKikKKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIgMT4mMgorCSAgICA7OworCSAgZXNhYyAjIGxpbmttb2RlCisJICBjb250aW51ZQorCSAgOzsgIyAtTAorCS1SKikKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGxpbms7IHRoZW4KKwkgICAgZGlyPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAorCSAgICAjIE1ha2Ugc3VyZSB0aGUgeHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGRpciAiKikgOzsKKwkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgY29udGludWUKKwkgIDs7CisJKi5sYSkgbGliPSIkZGVwbGliIiA7OworCSouJGxpYmV4dCkKKwkgIGlmIHRlc3QgIiRwYXNzIiA9IGNvbnY7IHRoZW4KKwkgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgY29udGludWUKKwkgIGZpCisJICBjYXNlICRsaW5rbW9kZSBpbgorCSAgbGliKQorCSAgICB2YWxpZF9hX2xpYj1ubworCSAgICBjYXNlICRkZXBsaWJzX2NoZWNrX21ldGhvZCBpbgorCSAgICAgIG1hdGNoX3BhdHRlcm4qKQorCQlzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCisJICAgICAgICBtYXRjaF9wYXR0ZXJuX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQyIFwoLipcKSJgCisJCWlmIGV2YWwgJGVjaG8gXCIkZGVwbGliXCIgMj4vZGV2L251bGwgXAorCQkgICAgfCAkU0VEIDEwcSBcCisJCSAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgdmFsaWRfYV9saWI9eWVzCisJCWZpCisJCTs7CisJICAgICAgcGFzc19hbGwpCisJCXZhbGlkX2FfbGliPXllcworCQk7OworICAgICAgICAgICAgZXNhYworCSAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBUcnlpbmcgdG8gbGluayB3aXRoIHN0YXRpYyBsaWIgYXJjaGl2ZSAkZGVwbGliLiIKKwkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkgICAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKKwkgICAgICAkZWNobyAiKioqIHRoYXQgaXQgaXMganVzdCBhIHN0YXRpYyBhcmNoaXZlIHRoYXQgSSBzaG91bGQgbm90IHVzZWQgaGVyZS4iCisJICAgIGVsc2UKKwkgICAgICAkZWNobworCSAgICAgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSIKKwkgICAgICAkZWNobyAiKioqIHN0YXRpYyBsaWJyYXJ5ICRkZXBsaWIgaXMgbm90IHBvcnRhYmxlISIKKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgOzsgIyAqLiRsaWJleHQKKwkqLmxvIHwgKi4kb2JqZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAorCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRkZXBsaWIiCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJJURFUExJQlMlKQorCSAgYWxsZGVwbGlicz15ZXMKKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMgIyBjYXNlICRkZXBsaWIKKwlpZiB0ZXN0ICIkZm91bmQiID0geWVzIHx8IHRlc3QgLWYgIiRsaWIiOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCB0aGUgbGlicmFyeSBcYCRsaWInIG9yIHVuaGFuZGxlZCBhcmd1bWVudCBcYCRkZXBsaWInIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKwlpZiAoJHtTRUR9IC1lICcycScgJGxpYiB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZmkKKworCWxhZGlyPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGxhZGlyIiA9ICJYJGxpYiIgJiYgbGFkaXI9Ii4iCisKKwlkbG5hbWU9CisJZGxvcGVuPQorCWRscHJlb3Blbj0KKwlsaWJkaXI9CisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAorCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGVzIGluc3RhbGxlZCwgb3Igc2hvdWxkbm90bGluaworCWluc3RhbGxlZD15ZXMKKwlzaG91bGRub3RsaW5rPW5vCisJYXZvaWR0ZW1wcnBhdGg9CisKKworCSMgUmVhZCB0aGUgLmxhIGZpbGUKKwljYXNlICRsaWIgaW4KKwkqLyogfCAqXFwqKSAuICRsaWIgOzsKKwkqKSAuIC4vJGxpYiA7OworCWVzYWMKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJICAgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLHNjYW4iIHx8CisJICAgeyB0ZXN0ICIkbGlua21vZGUiICE9IHByb2cgJiYgdGVzdCAiJGxpbmttb2RlIiAhPSBsaWI7IH07IHRoZW4KKwkgIHRlc3QgLW4gIiRkbG9wZW4iICYmIGRsZmlsZXM9IiRkbGZpbGVzICRkbG9wZW4iCisJICB0ZXN0IC1uICIkZGxwcmVvcGVuIiAmJiBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGxwcmVvcGVuIgorCWZpCisKKwlpZiB0ZXN0ICIkcGFzcyIgPSBjb252OyB0aGVuCisJICAjIE9ubHkgY2hlY2sgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcworCSAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIKKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkbGliJyIgMT4mMgorCSAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgICBmaQorCSAgICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCisJICAgIGNvbnZlbmllbmNlPSIkY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICBvbGRfY29udmVuaWVuY2U9IiRvbGRfY29udmVuaWVuY2UgJGxhZGlyLyRvYmpkaXIvJG9sZF9saWJyYXJ5IgorCSAgICB0bXBfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgZmkKKwkgICAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICAgIGRvbmUKKwkgIGVsaWYgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGxpYicgaXMgbm90IGEgY29udmVuaWVuY2UgbGlicmFyeSIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBjb252CisKKworCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KKwlsaW5rbGliPQorCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkgIGxpbmtsaWI9IiRsIgorCWRvbmUKKwlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgLWRsb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciIDE+JjIKKwkgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICBmaQorCSAgaWYgdGVzdCAteiAiJGRsbmFtZSIgfHwKKwkgICAgIHRlc3QgIiRkbG9wZW5fc3VwcG9ydCIgIT0geWVzIHx8CisJICAgICB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IG5vOyB0aGVuCisJICAgICMgSWYgdGhlcmUgaXMgbm8gZGxuYW1lLCBubyBkbG9wZW4gc3VwcG9ydCBvciB3ZSdyZSBsaW5raW5nCisJICAgICMgc3RhdGljYWxseSwgd2UgbmVlZCB0byBwcmVsb2FkLiAgV2UgYWxzbyBuZWVkIHRvIHByZWxvYWQgYW55CisJICAgICMgZGVwZW5kZW50IGxpYnJhcmllcyBzbyBsaWJsdGRsJ3MgZGVwbGliIHByZWxvYWRlciBkb2Vzbid0CisJICAgICMgYm9tYiBvdXQgaW4gdGhlIGxvYWQgZGVwbGlicyBwaGFzZS4KKwkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGxpYiAkZGVwZW5kZW5jeV9saWJzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliIgorCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkgIyAkcGFzcyA9IGRsb3BlbgorCisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkbGFkaXIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic19sYWRpcj0iJGxhZGlyIiA7OworCSopCisJICBhYnNfbGFkaXI9YGNkICIkbGFkaXIiICYmIHB3ZGAKKwkgIGlmIHRlc3QgLXogIiRhYnNfbGFkaXIiOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkbGFkaXInIiAxPiYyCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHBhc3NpbmcgaXQgbGl0ZXJhbGx5IHRvIHRoZSBsaW5rZXIsIGFsdGhvdWdoIGl0IG1pZ2h0IGZhaWwiIDE+JjIKKwkgICAgYWJzX2xhZGlyPSIkbGFkaXIiCisJICBmaQorCSAgOzsKKwllc2FjCisJbGFuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworCSMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgorCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KKwkgIGlmIHRlc3QgISAtZiAiJGxpYmRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogbGlicmFyeSBcYCRsaWInIHdhcyBtb3ZlZC4iIDE+JjIKKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgbGliZGlyPSIkYWJzX2xhZGlyIgorCSAgZWxzZQorCSAgICBkaXI9IiRsaWJkaXIiCisJICAgIGFic2Rpcj0iJGxpYmRpciIKKwkgIGZpCisJICB0ZXN0ICJYJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSBYeWVzICYmIGF2b2lkdGVtcHJwYXRoPXllcworCWVsc2UKKwkgIGlmIHRlc3QgISAtZiAiJGxhZGlyLyRvYmpkaXIvJGxpbmtsaWIiICYmIHRlc3QgLWYgIiRhYnNfbGFkaXIvJGxpbmtsaWIiOyB0aGVuCisJICAgIGRpcj0iJGxhZGlyIgorCSAgICBhYnNkaXI9IiRhYnNfbGFkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxhZGlyLyRvYmpkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpci8kb2JqZGlyIgorCSAgICAjIFJlbW92ZSB0aGlzIHNlYXJjaCBwYXRoIGxhdGVyCisJICAgIG5vdGluc3RfcGF0aD0iJG5vdGluc3RfcGF0aCAkYWJzX2xhZGlyIgorCSAgZmkKKwlmaSAjICRpbnN0YWxsZWQgPSB5ZXMKKwluYW1lPWAkZWNobyAiWCRsYW5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKKworCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxwcmVvcGVuLgorCWlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IC1kbHByZW9wZW4gYSBjb252ZW5pZW5jZSBsaWJyYXJ5OiBcYCRsaWInIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKwkgICMgUHJlZmVyIHVzaW5nIGEgc3RhdGljIGxpYnJhcnkgKHNvIHRoYXQgbm8gc2lsbHkgX0RZTkFNSUMgc3ltYm9scworCSAgIyBhcmUgcmVxdWlyZWQgdG8gbGluaykuCisJICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgorCSAgZWxzZQorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgorCSAgZmkKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcworCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkKKworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCisJICBsaW5rYWxsZGVwbGlicz1ubworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKKwkgIGZpCisKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggImAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1MLy8nYDs7ICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCSAgICBlc2FjCisJICAgICMgTmVlZCB0byBsaW5rIGFnYWluc3QgYWxsIGRlcGVuZGVuY3lfbGlicz8KKwkgICAgaWYgdGVzdCAiJGxpbmthbGxkZXBsaWJzIiA9IHllczsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICAjIE5lZWQgdG8gaGFyZGNvZGUgc2hhcmVkIGxpYnJhcnkgcGF0aHMKKwkgICAgICAjIG9yL2FuZCBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcworCSAgICAgIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJGR1cGxpY2F0ZV9kZXBzIiA9ICJYeWVzIiA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUgIyBmb3IgZGVwbGliCisJICBjb250aW51ZQorCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICAgIHsgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicyIgPSBubyB8fCB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB9OyB0aGVuCisJICAgICMgV2UgbmVlZCB0byBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoCisJICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC16ICIkYXZvaWR0ZW1wcnBhdGgiIDsgdGhlbgorCSAgICAgICMgTWFrZSBzdXJlIHRoZSBycGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgICAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCisJICAgICAgKiIgJGRpciAiKikgOzsKKwkgICAgICAqIiAkYWJzZGlyICIqKSA7OworCSAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRhYnNkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkgIyAkbGlua21vZGUsJHBhc3MgPSBwcm9nLGxpbmsuLi4KKworCSAgaWYgdGVzdCAiJGFsbGRlcGxpYnMiID0geWVzICYmCisJICAgICB7IHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSBwYXNzX2FsbCB8fAorCSAgICAgICB7IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmCisJCSB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IH07IH07IHRoZW4KKwkgICAgIyBXZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGZvciBzdGF0aWMgbGlicmFyaWVzCisJICAgIGNvbnRpbnVlCisJICBmaQorCWZpCisKKwlsaW5rX3N0YXRpYz1ubyAjIFdoZXRoZXIgdGhlIGRlcGxpYiB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisJdXNlX3N0YXRpY19saWJzPSRwcmVmZXJfc3RhdGljX2xpYnMKKwlpZiB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IGJ1aWx0ICYmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzIDsgdGhlbgorCSAgdXNlX3N0YXRpY19saWJzPW5vCisJZmkKKwlpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICB7IHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gbm8gfHwgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgfTsgdGhlbgorCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSBubzsgdGhlbgorCSAgICBub3RpbnN0X2RlcGxpYnM9IiRub3RpbnN0X2RlcGxpYnMgJGxpYiIKKwkgICAgbmVlZF9yZWxpbms9eWVzCisJICBmaQorCSAgIyBUaGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkKKworCSAgIyBXYXJuIGFib3V0IHBvcnRhYmlsaXR5LCBjYW4ndCBsaW5rIGFnYWluc3QgLW1vZHVsZSdzIG9uCisJICAjIHNvbWUgc3lzdGVtcyAoZGFyd2luKQorCSAgaWYgdGVzdCAiJHNob3VsZG5vdGxpbmsiID0geWVzICYmIHRlc3QgIiRwYXNzIiA9IGxpbmsgOyB0aGVuCisJICAgICRlY2hvCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJGVjaG8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgorCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQorCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwkgICAgcmVhbG5hbWU9IiQyIgorCSAgICBzaGlmdDsgc2hpZnQKKwkgICAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCSAgICAjIHVzZSBkbG5hbWUgaWYgd2UgZ290IGl0LiBpdCdzIHBlcmZlY3RseSBnb29kLCBubz8KKwkgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgICBzb25hbWU9IiRkbG5hbWUiCisJICAgIGVsaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorCSAgICAgICMgYmxlaCB3aW5kb3dzCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICpjeWd3aW4qIHwgbWluZ3cqKQorCQltYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisJCXZlcnN1ZmZpeD0iLSRtYWpvciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgZXZhbCBzb25hbWU9XCIkc29uYW1lX3NwZWNcIgorCSAgICBlbHNlCisJICAgICAgc29uYW1lPSIkcmVhbG5hbWUiCisJICAgIGZpCisKKwkgICAgIyBNYWtlIGEgbmV3IG5hbWUgZm9yIHRoZSBleHRyYWN0X2V4cHN5bXNfY21kcyB0byB1c2UKKwkgICAgc29yb290PSIkc29uYW1lIgorCSAgICBzb25hbWU9YCRlY2hvICRzb3Jvb3QgfCAke1NFRH0gLWUgJ3MvXi4qXC8vLydgCisJICAgIG5ld2xpYj0ibGliaW1wLWAkZWNobyAkc29uYW1lIHwgJHtTRUR9ICdzL15saWIvLztzL1wuZGxsJC8vJ2AuYSIKKworCSAgICAjIElmIHRoZSBsaWJyYXJ5IGhhcyBubyBleHBvcnQgbGlzdCwgdGhlbiBjcmVhdGUgb25lIG5vdworCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kc29uYW1lLWRlZiI7IHRoZW4gOgorCSAgICBlbHNlCisJICAgICAgJHNob3cgImV4dHJhY3RpbmcgZXhwb3J0ZWQgc3ltYm9sIGxpc3QgZnJvbSBcYCRzb25hbWUnIgorCSAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCSAgICAgIGNtZHM9JGV4dHJhY3RfZXhwc3ltc19jbWRzCisJICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkJSUZTPSIkc2F2ZV9pZnMiCisJCWV2YWwgY21kPVwiJGNtZFwiCisJCSRzaG93ICIkY21kIgorCQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgICAgICBkb25lCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZpCisKKwkgICAgIyBDcmVhdGUgJG5ld2xpYgorCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCisJICAgICAgJHNob3cgImdlbmVyYXRpbmcgaW1wb3J0IGxpYnJhcnkgZm9yIFxgJHNvbmFtZSciCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJZXZhbCBjbWQ9XCIkY21kXCIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKwkgICAgIyBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgdmFyaWFibGVzIGFyZSBwb2ludGluZyB0byB0aGUgbmV3IGxpYnJhcnkKKwkgICAgZGlyPSRvdXRwdXRfb2JqZGlyCisJICAgIGxpbmtsaWI9JG5ld2xpYgorCSAgZmkgIyB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiCisKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRtb2RlIiAhPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICBsaWJfbGlua2VkPXllcworCSAgICBjYXNlICRoYXJkY29kZV9hY3Rpb24gaW4KKwkgICAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCisJICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSBubzsgdGhlbgorCQlhZGQ9IiRkaXIvJGxpbmtsaWIiCisJCWNhc2UgJGhvc3QgaW4KKwkJICAqLSotc2NvMy4ydjUuMC5bMDI0XSopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotc3lzdjQqdXcyKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NU9wZW5VTklYKiB8ICotKi1zeXN2NVVuaXhXYXJlNy5bMDFdLlsxMF0qIHwgXAorCQkgICAgKi0qLXVuaXh3YXJlNyopIGFkZF9kaXI9Ii1MJGRpciIgOzsKKwkJICAqLSotZGFyd2luKiApCisJCSAgICAjIGlmIHRoZSBsaWIgaXMgYSBtb2R1bGUgdGhlbiB3ZSBjYW4gbm90IGxpbmsgYWdhaW5zdAorCQkgICAgIyBpdCwgc29tZW9uZSBpcyBpZ25vcmluZyB0aGUgbmV3IHdhcm5pbmdzIEkgYWRkZWQKKwkJICAgIGlmIC91c3IvYmluL2ZpbGUgLUwgJGFkZCAyPiAvZGV2L251bGwgfAorICAgICAgICAgICAgICAgICAgICAgICRFR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCisJCSAgICAgICRlY2hvICIqKiBXYXJuaW5nLCBsaWIgJGxpbmtsaWIgaXMgYSBtb2R1bGUsIG5vdCBhIHNoYXJlZCBsaWJyYXJ5IgorCQkgICAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgorCQkgICAgICAgICRlY2hvCisJCSAgICAgICAgJGVjaG8gIioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCSAgICAgICAgJGVjaG8gIioqIFRoZSBsaW5rIHdpbGwgcHJvYmFibHkgZmFpbCwgc29ycnkiCisJCSAgICAgIGVsc2UKKwkJICAgICAgICBhZGQ9IiRkaXIvJG9sZF9saWJyYXJ5IgorCQkgICAgICBmaQorCQkgICAgZmkKKwkJZXNhYworCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotc3Vub3MqKSBhZGRfc2hsaWJwYXRoPSIkZGlyIiA7OworCQllc2FjCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KKwkJYWRkX3NobGlicGF0aD0iJGRpciIKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsc2UKKwkJbGliX2xpbmtlZD1ubworCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgcmVsaW5rKQorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCQlhZGRfZGlyPSItTCRkaXIiCisJCSMgVHJ5IGxvb2tpbmcgZmlyc3QgaW4gdGhlIGxvY2F0aW9uIHdlJ3JlIGJlaW5nIGluc3RhbGxlZCB0by4KKwkJaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJICBjYXNlICRsaWJkaXIgaW4KKwkJICAgIFtcXC9dKikKKwkJICAgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgICAgOzsKKwkJICBlc2FjCisJCWZpCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQlhZGRfc2hsaWJwYXRoPSIkZGlyIgorCQlhZGQ9Ii1sJG5hbWUiCisJICAgICAgZWxzZQorCQlsaWJfbGlua2VkPW5vCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKSBsaWJfbGlua2VkPW5vIDs7CisJICAgIGVzYWMKKworCSAgICBpZiB0ZXN0ICIkbGliX2xpbmtlZCIgIT0geWVzOyB0aGVuCisJICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKKwkgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkYWRkX3NobGlicGF0aCI7IHRoZW4KKwkgICAgICBjYXNlIDokY29tcGlsZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGFkZF9zaGxpYnBhdGg6IiopIDs7CisJICAgICAgKikgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRhZGRfc2hsaWJwYXRoOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGNvbXBpbGVfZGVwbGlicz0iJGFkZF9kaXIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGQgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBkZXBsaWJzPSIkYWRkX2RpciAkZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBkZXBsaWJzPSIkYWRkICRkZXBsaWJzIgorCSAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IHllcyAmJiBcCisJCSB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmIFwKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllczsgdGhlbgorCSAgICAgIGFkZD0iJGxpYmRpci8kbGlua2xpYiIKKwkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKwkgICAgICBhZGRfZGlyPSItTCRsaWJkaXIiCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCSAgICAgIGNhc2UgOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IGluCisJICAgICAgKiI6JGxpYmRpcjoiKikgOzsKKwkgICAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgYWRkPSItbCRuYW1lIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciIgJiYKKwkJIHRlc3QgLWYgIiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIiA7IHRoZW4KKwkgICAgICAgIGFkZD0iJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiCisJICAgICAgZWxzZQorCSAgICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJY2FzZSAkbGliZGlyIGluCisJCSAgW1xcL10qKQorCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICAkZWNobworCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCisJICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgJGVjaG8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKKwkgICAgICAkZWNobyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgJGVjaG8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKKwkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCQkkZWNobworCQkkZWNobyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCSRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCQkkZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCQkkZWNobyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgdGVtcF94cnBhdGg9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncy9eLVIvLydgCisJCSAgIGNhc2UgIiAkeHJwYXRoICIgaW4KKwkJICAgKiIgJHRlbXBfeHJwYXRoICIqKSA7OworCQkgICAqKSB4cnBhdGg9IiR4cnBhdGggJHRlbXBfeHJwYXRoIjs7CisJCSAgIGVzYWM7OworCSAgICAgICopIHRlbXBfZGVwbGlicz0iJHRlbXBfZGVwbGlicyAkbGliZGlyIjs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfZGVwbGlicyIKKwkgIGZpCisKKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkYWJzZGlyIgorCSAgIyBMaW5rIGFnYWluc3QgdGhpcyBsaWJyYXJ5CisJICB0ZXN0ICIkbGlua19zdGF0aWMiID0gbm8gJiYgbmV3ZGVwZW5kZW5jeV9saWJzPSIkYWJzX2xhZGlyLyRsYW5hbWUgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICMgLi4uIGFuZCBpdHMgZGVwZW5kZW5jeV9saWJzCisJICB0bXBfbGlicz0KKwkgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGlmIHRlc3QgIlgkZHVwbGljYXRlX2RlcHMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiR0bXBfbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkZGVwbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIgorCSAgZG9uZQorCisJICBpZiB0ZXN0ICIkbGlua19hbGxfZGVwbGlicyIgIT0gbm87IHRoZW4KKwkgICAgIyBBZGQgdGhlIHNlYXJjaCBwYXRocyBvZiBhbGwgZGVwZW5kZW5jeSBsaWJyYXJpZXMKKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgIC1MKikgcGF0aD0iJGRlcGxpYiIgOzsKKwkgICAgICAqLmxhKQorCQlkaXI9YCRlY2hvICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCQl0ZXN0ICJYJGRpciIgPSAiWCRkZXBsaWIiICYmIGRpcj0iLiIKKwkJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJCWNhc2UgJGRpciBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFic2Rpcj0iJGRpciIgOzsKKwkJKikKKwkJICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisJCSAgaWYgdGVzdCAteiAiJGFic2RpciI7IHRoZW4KKwkJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgorCQkgICAgYWJzZGlyPSIkZGlyIgorCQkgIGZpCisJCSAgOzsKKwkJZXNhYworCQlpZiBncmVwICJeaW5zdGFsbGVkPW5vIiAkZGVwbGliID4gL2Rldi9udWxsOyB0aGVuCisJCSAgcGF0aD0iJGFic2Rpci8kb2JqZGlyIgorCQllbHNlCisJCSAgZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCQkgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVwbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCQkgIGZpCisJCSAgaWYgdGVzdCAiJGFic2RpciIgIT0gIiRsaWJkaXIiOyB0aGVuCisJCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRkZXBsaWInIHNlZW1zIHRvIGJlIG1vdmVkIiAxPiYyCisJCSAgZmkKKwkJICBwYXRoPSIkYWJzZGlyIgorCQlmaQorCQlkZXBkZXBsPQorCQljYXNlICRob3N0IGluCisJCSotKi1kYXJ3aW4qKQorCQkgICMgd2UgZG8gbm90IHdhbnQgdG8gbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJzLAorCQkgICMgYnV0IG5lZWQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZAorCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCisJCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KKwkJICAgICAgZGVwZGVwbD0kdG1wCisJCSAgICBkb25lCisJCSAgICBpZiB0ZXN0IC1mICIkcGF0aC8kZGVwZGVwbCIgOyB0aGVuCisJCSAgICAgIGRlcGRlcGw9IiRwYXRoLyRkZXBkZXBsIgorCQkgICAgZmkKKwkJICAgICMgZG8gbm90IGFkZCBwYXRocyB3aGljaCBhcmUgYWxyZWFkeSB0aGVyZQorCQkgICAgY2FzZSAiICRuZXdsaWJfc2VhcmNoX3BhdGggIiBpbgorCQkgICAgKiIgJHBhdGggIiopIDs7CisJCSAgICAqKSBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJHBhdGgiOzsKKwkJICAgIGVzYWMKKwkJICBmaQorCQkgIHBhdGg9IiIKKwkJICA7OworCQkqKQorCQkgIHBhdGg9Ii1MJHBhdGgiCisJCSAgOzsKKwkJZXNhYworCQk7OworCSAgICAgIC1sKikKKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotZGFyd2luKikKKwkJICAjIEFnYWluLCB3ZSBvbmx5IHdhbnQgdG8gbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMKKwkJICBldmFsIHRtcF9saWJzPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgInMsXlwtbCwsImAKKwkJICBmb3IgdG1wIGluICRuZXdsaWJfc2VhcmNoX3BhdGggOyBkbworCQkgICAgaWYgdGVzdCAtZiAiJHRtcC9saWIkdG1wX2xpYnMuZHlsaWIiIDsgdGhlbgorCQkgICAgICBldmFsIGRlcGRlcGw9IiR0bXAvbGliJHRtcF9saWJzLmR5bGliIgorCQkgICAgICBicmVhaworCQkgICAgZmkKKwkJICBkb25lCisJCSAgcGF0aD0iIgorCQkgIDs7CisJCSopIGNvbnRpbnVlIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICAqKSBjb250aW51ZSA7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRwYXRoICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRwYXRoICRkZXBsaWJzIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBjYXNlICIgJGRlcGxpYnMgIiBpbgorCSAgICAgICoiICRkZXBkZXBsICIqKSA7OworCSAgICAgICopIGRlcGxpYnM9IiRkZXBkZXBsICRkZXBsaWJzIiA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZmkgIyBsaW5rX2FsbF9kZXBsaWJzICE9IG5vCisJZmkgIyBsaW5rbW9kZSA9IGxpYgorICAgICAgZG9uZSAjIGZvciBkZXBsaWIgaW4gJGxpYnMKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCisJaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KKwkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgIGxpYl9zZWFyY2hfcGF0aD0KKwkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KKwkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBuZXdsaWJfc2VhcmNoX3BhdGg9CisJZmkKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KKwkgIHZhcnM9ImRlcGxpYnMiCisJZWxzZQorCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCisJZmkKKwlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKKwkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgorCSAgbmV3X2xpYnM9CisJICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KKwkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KKwkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKKwkgICAgIyAgICAgICAgYnJva2VuOgorCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgorCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KKwkgICAgIyBwcmFjdGljZToKKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAtUiopIDs7CisJICAgICopCisJICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKKwkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKKwkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQorCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCisJICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcworCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQorCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKKwkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAorCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKKwkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKKwkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5CisJICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQorCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0CisJICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCisJICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAgICopCisJCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSA7OworCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikKKwkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgorCWRvbmUgIyBmb3IgdmFyCisgICAgICBmaQorICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKyAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQorICAgICAgdG1wX2xpYnM9CisgICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KKwljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgorCSoiICRpICIqKQorCSAgaT0iIgorCSAgOzsKKwllc2FjCisJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKKwlmaQorICAgICAgZG9uZQorICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicworICAgIGRvbmUgIyBmb3IgcGFzcworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisgICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKyAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorICAgIGZpCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIG9sZGxpYikKKyAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgb2xkbGlicz0iJG91dHB1dCIKKyAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJOzsKKyAgICAgICopCisJaWYgdGVzdCAiJG1vZHVsZSIgPSBubzsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbXVzdCBiZWdpbiB3aXRoIFxgbGliJyIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCWlmIHRlc3QgIiRuZWVkX2xpYl9wcmVmaXgiICE9IG5vOyB0aGVuCisJICAjIEFkZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzIGlmIHJlcXVpcmVkCisJICBuYW1lPWAkZWNobyAiWCRvdXRwdXRuYW1lIiB8ICRYc2VkIC1lICdzL1wubGEkLy8nYAorCSAgZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgorCWVsc2UKKwkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIgMj4mMQorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJZWxzZQorCSAgJGVjaG8KKwkgICRlY2hvICIqKiogV2FybmluZzogTGlua2luZyB0aGUgc2hhcmVkIGxpYnJhcnkgJG91dHB1dCBhZ2FpbnN0IHRoZSBub24tbGlidG9vbCIKKwkgICRlY2hvICIqKiogb2JqZWN0cyAkb2JqcyBpcyBub3QgcG9ydGFibGUhIgorCSAgbGlib2Jqcz0iJGxpYm9ianMgJG9ianMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCisgICAgICBmaQorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgorICAgICAgZmkKKyAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKKworICAgICAgb2xkbGlicz0KKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKwlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KKwkgICMgU29tZSBjb21waWxlcnMgaGF2ZSBwcm9ibGVtcyB3aXRoIGEgYC5hbCcgZXh0ZW5zaW9uIHNvCisJICAjIGNvbnZlbmllbmNlIGxpYnJhcmllcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBleHRlbnNpb24gYW4KKwkgICMgYXJjaGl2ZSBub3JtYWxseSB3b3VsZC4KKwkgIG9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQgJG9sZGxpYnMiCisJICBidWlsZF9saWJ0b29sX2xpYnM9Y29udmVuaWVuY2UKKwkgIGJ1aWxkX29sZF9saWJzPXllcworCWZpCisKKwlpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8vLXZlcnNpb24tbnVtYmVyJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorCisJaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKKwlmaQorICAgICAgZWxzZQorCisJIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKwlzZXQgZHVtbXkgJHZpbmZvIDAgMCAwCisJSUZTPSIkc2F2ZV9pZnMiCisKKwlpZiB0ZXN0IC1uICIkOCI7IHRoZW4KKwkgICRlY2hvICIkbW9kZW5hbWU6IHRvbyBtYW55IHBhcmFtZXRlcnMgdG8gXGAtdmVyc2lvbi1pbmZvJyIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBjb252ZXJ0IGFic29sdXRlIHZlcnNpb24gbnVtYmVycyB0byBsaWJ0b29sIGFnZXMKKwkjIHRoaXMgcmV0YWlucyBjb21wYXRpYmlsaXR5IHdpdGggLmxhIGZpbGVzIGFuZCBhdHRlbXB0cworCSMgdG8gbWFrZSB0aGUgY29kZSBiZWxvdyBhIGJpdCBtb3JlIGNvbXByZWhlbnNpYmxlCisKKwljYXNlICR2aW5mb19udW1iZXIgaW4KKwl5ZXMpCisJICBudW1iZXJfbWFqb3I9IiQyIgorCSAgbnVtYmVyX21pbm9yPSIkMyIKKwkgIG51bWJlcl9yZXZpc2lvbj0iJDQiCisJICAjCisJICAjIFRoZXJlIGFyZSByZWFsbHkgb25seSB0d28ga2luZHMgLS0gdGhvc2UgdGhhdAorCSAgIyB1c2UgdGhlIGN1cnJlbnQgcmV2aXNpb24gYXMgdGhlIG1ham9yIHZlcnNpb24KKwkgICMgYW5kIHRob3NlIHRoYXQgc3VidHJhY3QgYWdlIGFuZCB1c2UgYWdlIGFzCisJICAjIGEgbWlub3IgdmVyc2lvbi4gIEJ1dCwgdGhlbiB0aGVyZSBpcyBpcml4CisJICAjIHdoaWNoIGhhcyBhbiBleHRyYSAxIGFkZGVkIGp1c3QgZm9yIGZ1bgorCSAgIworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICBkYXJ3aW58bGludXh8b3NmfHdpbmRvd3MpCisJICAgIGN1cnJlbnQ9YGV4cHIgJG51bWJlcl9tYWpvciArICRudW1iZXJfbWlub3JgCisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCisJICAgIDs7CisJICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCisJICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBhZ2U9IjAiCisJICAgIDs7CisJICBpcml4fG5vbnN0b3B1eCkKKwkgICAgY3VycmVudD1gZXhwciAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vciAtIDFgCisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfbWlub3IiCisJICAgIDs7CisJICBlc2FjCisJICA7OworCW5vKQorCSAgY3VycmVudD0iJDIiCisJICByZXZpc2lvbj0iJDMiCisJICBhZ2U9IiQ0IgorCSAgOzsKKwllc2FjCisKKwkjIENoZWNrIHRoYXQgZWFjaCBvZiB0aGUgdGhpbmdzIGFyZSB2YWxpZCBudW1iZXJzLgorCWNhc2UgJGN1cnJlbnQgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCWNhc2UgJHJldmlzaW9uIGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCWNhc2UgJGFnZSBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCWlmIHRlc3QgIiRhZ2UiIC1ndCAiJGN1cnJlbnQiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBBR0UgXGAkYWdlJyBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW50ZXJmYWNlIG51bWJlciBcYCRjdXJyZW50JyIgMT4mMgorCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgorCW1ham9yPQorCXZlcnN1ZmZpeD0KKwl2ZXJzdHJpbmc9CisJY2FzZSAkdmVyc2lvbl90eXBlIGluCisJbm9uZSkgOzsKKworCWRhcndpbikKKwkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBhdmFpbGFibGUgaW4KKwkgICMgdmVyc3RyaW5nIGZvciBjb2RpbmcgaXQgaW50byB0aGUgbGlicmFyeSBoZWFkZXIKKwkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgICMgRGFyd2luIGxkIGRvZXNuJ3QgbGlrZSAwIGZvciB0aGVzZSBvcHRpb25zLi4uCisJICBtaW5vcl9jdXJyZW50PWBleHByICRjdXJyZW50ICsgMWAKKwkgIHZlcnN0cmluZz0iJHt3bH0tY29tcGF0aWJpbGl0eV92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQgJHt3bH0tY3VycmVudF92ZXJzaW9uICR7d2x9JG1pbm9yX2N1cnJlbnQuJHJldmlzaW9uIgorCSAgOzsKKworCWZyZWVic2QtYW91dCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iOworCSAgOzsKKworCWZyZWVic2QtZWxmKQorCSAgbWFqb3I9Ii4kY3VycmVudCIKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50IjsKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgbWFqb3I9YGV4cHIgJGN1cnJlbnQgLSAkYWdlICsgMWAKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBpZmFjZT1gZXhwciAkcmV2aXNpb24gLSAkbG9vcGAKKwkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZ19wcmVmaXgkbWFqb3IuJGlmYWNlOiR2ZXJzdHJpbmciCisJICBkb25lCisKKwkgICMgQmVmb3JlIHRoaXMgcG9pbnQsICRtYWpvciBtdXN0IG5vdCBjb250YWluIGAuJy4KKwkgIG1ham9yPS4kbWFqb3IKKwkgIHZlcnN1ZmZpeD0iJG1ham9yLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlsaW51eCkKKwkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKKwkgIDs7CisKKwlvc2YpCisJICBtYWpvcj0uYGV4cHIgJGN1cnJlbnQgLSAkYWdlYAorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCisJICB2ZXJzdHJpbmc9IiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCisJICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgorCSAgbG9vcD0kYWdlCisJICB3aGlsZSB0ZXN0ICIkbG9vcCIgLW5lIDA7IGRvCisJICAgIGlmYWNlPWBleHByICRjdXJyZW50IC0gJGxvb3BgCisJICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKKwkgIGRvbmUKKworCSAgIyBNYWtlIGV4ZWN1dGFibGVzIGRlcGVuZCBvbiBvdXIgY3VycmVudCB2ZXJzaW9uLgorCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKKwkgIDs7CisKKwlzdW5vcykKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJd2luZG93cykKKwkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKKwkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCisJICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCisJICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJICA7OworCisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgorCSAgJGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIDs7CisJZXNhYworCisJIyBDbGVhciB0aGUgdmVyc2lvbiBpbmZvIGlmIHdlIGRlZmF1bHRlZCwgYW5kIHRoZXkgc3BlY2lmaWVkIGEgcmVsZWFzZS4KKwlpZiB0ZXN0IC16ICIkdmluZm8iICYmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSAgbWFqb3I9CisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbikKKwkgICAgIyB3ZSBjYW4ndCBjaGVjayBmb3IgIjAuMCIgaW4gYXJjaGl2ZV9jbWRzIGR1ZSB0byBxdW90aW5nCisJICAgICMgcHJvYmxlbXMsIHNvIHdlIHJlc2V0IGl0IGNvbXBsZXRlbHkKKwkgICAgdmVyc3RyaW5nPQorCSAgICA7OworCSAgKikKKwkgICAgdmVyc3RyaW5nPSIwLjAiCisJICAgIDs7CisJICBlc2FjCisJICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCisJICAgIHZlcnN1ZmZpeD0KKwkgIGVsc2UKKwkgICAgdmVyc3VmZml4PSIuMC4wIgorCSAgZmkKKwlmaQorCisJIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCisJaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgIG1ham9yPQorCSAgdmVyc3VmZml4PQorCSAgdmVyc3RyaW5nPSIiCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBhcmNoaXZlIHdpbGwgaGF2ZSB1bmRlZmluZWQgc3ltYm9scy4KKwlpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgorCSAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZF9mbGFnIiA9IHVuc3VwcG9ydGVkOyB0aGVuCisJICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVuZGVmaW5lZCBzeW1ib2xzIG5vdCBhbGxvd2VkIGluICRob3N0IHNoYXJlZCBsaWJyYXJpZXMiIDE+JjIKKwkgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICAgIGJ1aWxkX29sZF9saWJzPXllcworCSAgZmkKKwllbHNlCisJICAjIERvbid0IGFsbG93IHVuZGVmaW5lZCBzeW1ib2xzLgorCSAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKwlmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSMgUmVtb3ZlIG91ciBvdXRwdXRzLCBidXQgZG9uJ3QgcmVtb3ZlIG9iamVjdCBmaWxlcyBzaW5jZSB0aGV5CisJIyBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2hlbiBjb21waWxpbmcgUElDIG9iamVjdHMuCisJcmVtb3ZlbGlzdD0KKwl0ZW1wcmVtb3ZlbGlzdD1gJGVjaG8gIiRvdXRwdXRfb2JqZGlyLyoiYAorCWZvciBwIGluICR0ZW1wcmVtb3ZlbGlzdDsgZG8KKwkgIGNhc2UgJHAgaW4KKwkgICAgKi4kb2JqZXh0KQorCSAgICAgICA7OworCSAgICAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSB8ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogfCAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qKQorCSAgICAgICBpZiB0ZXN0ICJYJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiAhPSAiWCI7IHRoZW4KKwkgICAgICAgICBpZiBlY2hvICRwIHwgJEVHUkVQIC1lICIkcHJlY2lvdXNfZmlsZXNfcmVnZXgiID4vZGV2L251bGwgMj4mMQorCSAgICAgICAgIHRoZW4KKwkJICAgY29udGludWUKKwkJIGZpCisJICAgICAgIGZpCisJICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgorCSAgICAgICA7OworCSAgICAqKSA7OworCSAgZXNhYworCWRvbmUKKwlpZiB0ZXN0IC1uICIkcmVtb3ZlbGlzdCI7IHRoZW4KKwkgICRzaG93ICIke3JtfXIgJHJlbW92ZWxpc3QiCisJICAkcnVuICR7cm19ciAkcmVtb3ZlbGlzdAorCWZpCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgIGZvciBwYXRoIGluICRub3RpbnN0X3BhdGg7IGRvCisJbGliX3NlYXJjaF9wYXRoPWAkZWNobyAiJGxpYl9zZWFyY2hfcGF0aCAiIHwgJHtTRUR9IC1lICJzJSAkcGF0aCAlICVnImAKKwlkZXBsaWJzPWAkZWNobyAiJGRlcGxpYnMgIiB8ICR7U0VEfSAtZSAicyUgLUwkcGF0aCAlICVnImAKKwlkZXBlbmRlbmN5X2xpYnM9YCRlY2hvICIkZGVwZW5kZW5jeV9saWJzICIgfCAke1NFRH0gLWUgInMlIC1MJHBhdGggJSAlZyJgCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgLW4gIiR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCXRlbXBfeHJwYXRoPQorCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KKwkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgorCSAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiIDs7CisJICBlc2FjCisJZG9uZQorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fCB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgorCWZpCisgICAgICBmaQorCisgICAgICAjIE1ha2Ugc3VyZSBkbGZpbGVzIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGZpbGVzIHRoYXQgd29uJ3QgYmUgZGxwcmVvcGVuZWQKKyAgICAgIG9sZF9kbGZpbGVzPSIkZGxmaWxlcyIKKyAgICAgIGRsZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxmaWxlczsgZG8KKwljYXNlICIgJGRscHJlZmlsZXMgJGRsZmlsZXMgIiBpbgorCSoiICRsaWIgIiopIDs7CisJKikgZGxmaWxlcz0iJGRsZmlsZXMgJGxpYiIgOzsKKwllc2FjCisgICAgICBkb25lCisKKyAgICAgICMgTWFrZSBzdXJlIGRscHJlZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMKKyAgICAgIG9sZF9kbHByZWZpbGVzPSIkZGxwcmVmaWxlcyIKKyAgICAgIGRscHJlZmlsZXM9CisgICAgICBmb3IgbGliIGluICRvbGRfZGxwcmVmaWxlczsgZG8KKwljYXNlICIkZGxwcmVmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotKi1iZW9zKikKKwkgICAgIyB0aGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBjIGxpYnJhcnkgKGFzIHN1Y2gpIQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgbGlicmFyeSBpcyBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBkZXBsaWJzPSIkZGVwbGlicyAtZnJhbWV3b3JrIFN5c3RlbSIKKwkgICAgOzsKKwkgICotKi1uZXRic2QqKQorCSAgICAjIERvbid0IGxpbmsgd2l0aCBsaWJjIHVudGlsIHRoZSBhLm91dCBsZC5zbyBpcyBmaXhlZC4KKwkgICAgOzsKKwkgICotKi1vcGVuYnNkKiB8ICotKi1mcmVlYnNkKiB8ICotKi1kcmFnb25mbHkqKQorCSAgICAjIERvIG5vdCBpbmNsdWRlIGxpYmMgZHVlIHRvIHVzIGhhdmluZyBsaWJjL2xpYmNfci4KKwkgICAgOzsKKwkgICotKi1zY28zLjJ2NSogfCAqLSotc2NvNXY2KikKKwkgICAgIyBDYXVzZXMgcHJvYmxlbXMgd2l0aCBfX2N0eXBlCisJICAgIDs7CisJICAqLSotc3lzdjQuMnV3MiogfCAqLSotc3lzdjUqIHwgKi0qLXVuaXh3YXJlKiB8ICotKi1PcGVuVU5JWCopCisJICAgICMgQ29tcGlsZXIgaW5zZXJ0cyBsaWJjIGluIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aHJlYWRzIHRvIHdvcmsKKwkgICAgOzsKKyAJICAqKQorCSAgICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMgaWYgbmVjZXNzYXJ5LgorCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9uZWVkX2xjIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLWxjIgorCSAgICBmaQorCSAgICA7OworCSAgZXNhYworCWZpCisKKwkjIFRyYW5zZm9ybSBkZXBsaWJzIGludG8gb25seSBkZXBsaWJzIHRoYXQgY2FuIGJlIGxpbmtlZCBpbiBzaGFyZWQuCisJbmFtZV9zYXZlPSRuYW1lCisJbGlibmFtZV9zYXZlPSRsaWJuYW1lCisJcmVsZWFzZV9zYXZlPSRyZWxlYXNlCisJdmVyc3VmZml4X3NhdmU9JHZlcnN1ZmZpeAorCW1ham9yX3NhdmU9JG1ham9yCisJIyBJJ20gbm90IHN1cmUgaWYgSSdtIHRyZWF0aW5nIHRoZSByZWxlYXNlIGNvcnJlY3RseS4gIEkgdGhpbmsKKwkjIHJlbGVhc2Ugc2hvdWxkIHNob3cgdXAgaW4gdGhlIC1sIChpZSAtbGdtcDUpIHNvIHdlIGRvbid0IHdhbnQgdG8KKwkjIGFkZCBpdCBpbiB0d2ljZS4gIElzIHRoYXQgY29ycmVjdD8KKwlyZWxlYXNlPSIiCisJdmVyc3VmZml4PSIiCisJbWFqb3I9IiIKKwluZXdkZXBsaWJzPQorCWRyb3BwZWRkZXBzPW5vCisJY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KKwlwYXNzX2FsbCkKKwkgICMgRG9uJ3QgY2hlY2sgZm9yIHNoYXJlZC9zdGF0aWMuICBFdmVyeXRoaW5nIHdvcmtzLgorCSAgIyBUaGlzIG1pZ2h0IGJlIGEgbGl0dGxlIG5haXZlLiAgV2UgbWlnaHQgd2FudCB0byBjaGVjaworCSAgIyB3aGV0aGVyIHRoZSBsaWJyYXJ5IGV4aXN0cyBvciBub3QuICBCdXQgdGhpcyBpcyBvbgorCSAgIyBvc2YzICYgb3NmNCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZS4uLiBKdXN0CisJICAjIGltcGxlbWVudGluZyB3aGF0IHdhcyBhbHJlYWR5IHRoZSBiZWhhdmlvci4KKwkgIG5ld2RlcGxpYnM9JGRlcGxpYnMKKwkgIDs7CisJdGVzdF9jb21waWxlKQorCSAgIyBUaGlzIGNvZGUgc3RyZXNzZXMgdGhlICJsaWJyYXJpZXMgYXJlIHByb2dyYW1zIiBwYXJhZGlnbSB0byBpdHMKKwkgICMgbGltaXRzLiBNYXliZSBldmVuIGJyZWFrcyBpdC4gIFdlIGNvbXBpbGUgYSBwcm9ncmFtLCBsaW5raW5nIGl0CisJICAjIGFnYWluc3QgdGhlIGRlcGxpYnMgYXMgYSBwcm94eSBmb3IgdGhlIGxpYnJhcnkuICBUaGVuIHdlIGNhbiBjaGVjaworCSAgIyB3aGV0aGVyIHRoZXkgbGlua2VkIGluIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBsZGQuCisJICAkcm0gY29uZnRlc3QuYworCSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorCSAgaW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKKwkgICRybSBjb25mdGVzdAorCSAgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKKwkgIGlmIHRlc3QgIiQ/IiAtZXEgMCA7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBuYW1lPWBleHByICRpIDogJy1sXCguKlwpJ2AKKwkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgIiRuYW1lIiAtbmUgIjAiOyB0aGVuCisJCWlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICBjYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJICAqIiAkaSAiKikKKwkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgaT0iIgorCQkgICAgOzsKKwkJICBlc2FjCisJICAgICAgICBmaQorCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgbGlibmFtZT1gZXZhbCBcXCRlY2hvIFwiJGxpYm5hbWVfc3BlY1wiYAorCQkgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCisJCSAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcworCQkgIGRlcGxpYl9tYXRjaD0kMgorCQkgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgIGVsc2UKKwkJICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgJGVjaG8KKwkJICAgICRlY2hvICIqKiogV2FybmluZzogZHluYW1pYyBsaW5rZXIgZG9lcyBub3QgYWNjZXB0IG5lZWRlZCBsaWJyYXJ5ICRpLiIKKwkJICAgICRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAkZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBJIGJlbGlldmUgeW91IGRvIG5vdCBoYXZlIgorCQkgICAgJGVjaG8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIGl0IGZvciIKKwkJICAgICRlY2hvICIqKiogaXRzIGR5bmFtaWMgZGVwZW5kZW5jeSBsaXN0IHRoYXQgcHJvZ3JhbXMgZ2V0IHJlc29sdmVkIHdpdGggYXQgcnVudGltZS4iCisJCSAgZmkKKwkJZmkKKwkgICAgICBlbHNlCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGVsc2UKKwkgICAgIyBFcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlyc3QgY29tcGlsZS4gIExldCdzIHRyeSB0byBzYWx2YWdlCisJICAgICMgdGhlIHNpdHVhdGlvbjogQ29tcGlsZSBhIHNlcGFyYXRlIHByb2dyYW0gZm9yIGVhY2ggbGlicmFyeS4KKwkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCisJICAgICAgbmFtZT1gZXhwciAkaSA6ICctbFwoLipcKSdgCisJICAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCisgICAgICAgICAgICAgIGlmIHRlc3QgIiRuYW1lIiAhPSAiIiAmJiB0ZXN0ICIkbmFtZSIgIT0gIjAiOyB0aGVuCisJCSRybSBjb25mdGVzdAorCQkkTFRDQyAkTFRDRkxBR1MgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQorCQkjIERpZCBpdCB3b3JrPworCQlpZiB0ZXN0ICIkPyIgLWVxIDAgOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCSAgICBkZXBsaWJfbWF0Y2hlcz1gZXZhbCBcXCRlY2hvIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiYAorCQkgICAgc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcworCQkgICAgZGVwbGliX21hdGNoPSQyCisJCSAgICBpZiB0ZXN0IGBleHByICIkbGRkX291dHB1dCIgOiAiLiokZGVwbGliX21hdGNoImAgLW5lIDAgOyB0aGVuCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgZWxzZQorCQkgICAgICBkcm9wcGVkZGVwcz15ZXMKKwkJICAgICAgJGVjaG8KKwkJICAgICAgJGVjaG8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgICAkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJICAgICAgJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSAgICAgICRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSAgICAgICRlY2hvICIqKiogYmVjYXVzZSBhIHRlc3RfY29tcGlsZSBkaWQgcmV2ZWFsIHRoYXQgdGhlIGxpbmtlciBkaWQgbm90IHVzZSB0aGlzIG9uZSIKKwkJICAgICAgJGVjaG8gIioqKiBhcyBhIGR5bmFtaWMgZGVwZW5kZW5jeSB0aGF0IHByb2dyYW1zIGNhbiBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICAgIGZpCisJCSAgZmkKKwkJZWxzZQorCQkgIGRyb3BwZWRkZXBzPXllcworCQkgICRlY2hvCisJCSAgJGVjaG8gIioqKiBXYXJuaW5nISAgTGlicmFyeSAkaSBpcyBuZWVkZWQgYnkgdGhpcyBsaWJyYXJ5IGJ1dCBJIHdhcyBub3QgYWJsZSB0byIKKwkJICAkZWNobyAiKioqICBtYWtlIGl0IGxpbmsgaW4hICBZb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluc3RhbGwgaXQgb3Igc29tZSIKKwkJICAkZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKKwkJICAkZWNobyAiKioqIGZ1bmN0aW9uYWwuICBJbnN0YWxsaW5nIGl0IGJlZm9yZSBjb250aW51aW5nIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLiIKKwkJZmkKKwkgICAgICBlbHNlCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGZpCisJICA7OworCWZpbGVfbWFnaWMqKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAorCSAgZmlsZV9tYWdpY19yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCisJICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorICAgICAgICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiICYmIHRlc3QgICIkbmFtZSIgIT0gIjAiOyB0aGVuCisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgXAorCQkJIHwgZ3JlcCAiIC0+ICIgPi9kZXYvbnVsbDsgdGhlbgorCQkJY29udGludWUKKwkJICAgICAgZmkKKwkJICAgICAgIyBUaGUgc3RhdGVtZW50IGFib3ZlIHRyaWVzIHRvIGF2b2lkIGVudGVyaW5nIGFuCisJCSAgICAgICMgZW5kbGVzcyBsb29wIGJlbG93LCBpbiBjYXNlIG9mIGN5Y2xpYyBsaW5rcy4KKwkJICAgICAgIyBXZSBtaWdodCBzdGlsbCBlbnRlciBhbiBlbmRsZXNzIGxvb3AsIHNpbmNlIGEgbGluaworCQkgICAgICAjIGxvb3AgY2FuIGJlIGNsb3NlZCB3aGlsZSB3ZSBmb2xsb3cgbGlua3MsCisJCSAgICAgICMgYnV0IHNvIHdoYXQ/CisJCSAgICAgIHBvdGxpYj0iJHBvdGVudF9saWIiCisJCSAgICAgIHdoaWxlIHRlc3QgLWggIiRwb3RsaWIiIDI+L2Rldi9udWxsOyBkbworCQkJcG90bGlibGluaz1gbHMgLWxkICRwb3RsaWIgfCAke1NFRH0gJ3MvLiogLT4gLy8nYAorCQkJY2FzZSAkcG90bGlibGluayBpbgorCQkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7CisJCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7CisJCQllc2FjCisJCSAgICAgIGRvbmUKKwkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIDI+L2Rldi9udWxsIFwKKwkJCSB8ICR7U0VEfSAxMHEgXAorCQkJIHwgJEVHUkVQICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJCWFfZGVwbGliPSIiCisJCQlicmVhayAyCisJCSAgICAgIGZpCisJCSAgZG9uZQorCQlkb25lCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlkcm9wcGVkZGVwcz15ZXMKKwkJJGVjaG8KKwkJJGVjaG8gIioqKiBXYXJuaW5nOiBsaW5rZXIgcGF0aCBkb2VzIG5vdCBoYXZlIHJlYWwgZmlsZSBmb3IgbGlicmFyeSAkYV9kZXBsaWIuIgorCQkkZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJJGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSRlY2hvICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSRlY2hvICIqKiogYmVjYXVzZSBJIGRpZCBjaGVjayB0aGUgbGlua2VyIHBhdGggbG9va2luZyBmb3IgYSBmaWxlIHN0YXJ0aW5nIgorCQlpZiB0ZXN0IC16ICIkcG90bGliIiA7IHRoZW4KKwkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYnV0IG5vIGNhbmRpZGF0ZXMgd2VyZSBmb3VuZC4gKC4uLmZvciBmaWxlIG1hZ2ljIHRlc3QpIgorCQllbHNlCisJCSAgJGVjaG8gIioqKiB3aXRoICRsaWJuYW1lIGFuZCBub25lIG9mIHRoZSBjYW5kaWRhdGVzIHBhc3NlZCBhIGZpbGUgZm9ybWF0IHRlc3QiCisJCSAgJGVjaG8gIioqKiB1c2luZyBhIGZpbGUgbWFnaWMuIExhc3QgZmlsZSBjaGVja2VkOiAkcG90bGliIgorCQlmaQorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIEFkZCBhIC1MIGFyZ3VtZW50LgorCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkgICAgZmkKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW1hdGNoX3BhdHRlcm4qKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZAorCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMiBcKC4qXCkiYAorCSAgZm9yIGFfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgICBuYW1lPWBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgCisJICAgICMgSWYgJG5hbWUgaXMgZW1wdHkgd2UgYXJlIG9wZXJhdGluZyBvbiBhIC1MIGFyZ3VtZW50LgorCSAgICBpZiB0ZXN0IC1uICIkbmFtZSIgJiYgdGVzdCAiJG5hbWUiICE9ICIwIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsIFxcJGVjaG8gXCIkbGlibmFtZV9zcGVjXCJgCisJCWZvciBpIGluICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoOyBkbworCQkgIHBvdGVudGlhbF9saWJzPWBscyAkaS8kbGlibmFtZVsuLV0qIDI+L2Rldi9udWxsYAorCQkgIGZvciBwb3RlbnRfbGliIGluICRwb3RlbnRpYWxfbGliczsgZG8KKwkJICAgIHBvdGxpYj0iJHBvdGVudF9saWIiICMgc2VlIHN5bWxpbmstY2hlY2sgYWJvdmUgaW4gZmlsZV9tYWdpYyB0ZXN0CisJCSAgICBpZiBldmFsICRlY2hvIFwiJHBvdGVudF9saWJcIiAyPi9kZXYvbnVsbCBcCisJCSAgICAgICAgfCAke1NFRH0gMTBxIFwKKwkJICAgICAgICB8ICRFR1JFUCAiJG1hdGNoX3BhdHRlcm5fcmVnZXgiID4gL2Rldi9udWxsOyB0aGVuCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICAgICAgYV9kZXBsaWI9IiIKKwkJICAgICAgYnJlYWsgMgorCQkgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQkkZWNobworCQkkZWNobyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCSRlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkkZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJJGVjaG8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJJGVjaG8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRlY2hvICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIHJlZ2V4IHBhdHRlcm4gdGVzdCkiCisJCWVsc2UKKwkJICAkZWNobyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkZWNobyAiKioqIHVzaW5nIGEgcmVnZXggcGF0dGVybi4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgZWxzZQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICBmaQorCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgdG1wX2RlcGxpYnM9YCRlY2hvICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMkLy8nIFwKKwkgICAgLWUgJ3MvIC1bTFJdW14gXSovL2cnYAorCSAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICBmb3IgaSBpbiAkcHJlZGVwcyAkcG9zdGRlcHMgOyBkbworCSAgICAgICMgY2FuJ3QgdXNlIFhzZWQgYmVsb3csIGJlY2F1c2UgJGkgbWlnaHQgY29udGFpbiAnLycKKwkgICAgICB0bXBfZGVwbGlicz1gJGVjaG8gIlggJHRtcF9kZXBsaWJzIiB8ICR7U0VEfSAtZSAiMXMsXlgsLCIgLWUgInMsJGksLCJgCisJICAgIGRvbmUKKwkgIGZpCisJICBpZiAkZWNobyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvWyAJXS8vZycgXAorCSAgICB8IGdyZXAgLiA+L2Rldi9udWxsOyB0aGVuCisJICAgICRlY2hvCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgICRlY2hvICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICAkZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgJGVjaG8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgIGZpCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgbmV3ZGVwbGlicz1gJGVjaG8gIlggJG5ld2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvIC1sYyAvIC1mcmFtZXdvcmsgU3lzdGVtIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICAkZWNobworCSAgICAkZWNobyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCisJICAgICRlY2hvICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgJGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICAkZWNobyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgICRlY2hvICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCSAgICAgICRlY2hvICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgJGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICAkZWNobyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgJGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgICRlY2hvICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgorCSAgICAgICRlY2hvCisJICAgICAgJGVjaG8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCisJICAgICAgJGVjaG8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgICRlY2hvICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgJGVjaG8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKwlmaQorCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorCWRlcGxpYnM9JG5ld2RlcGxpYnMKKyAgICAgIGZpCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRkZXBsaWJzICIgaW4KKwkgICoiIC1MJHBhdGgvJG9iamRpciAiKikKKwkgICAgbmV3X2xpYnM9IiRuZXdfbGlicyAtTCRwYXRoLyRvYmpkaXIiIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJY2FzZSAkZGVwbGliIGluCisJLUwqKQorCSAgY2FzZSAiICRuZXdfbGlicyAiIGluCisJICAqIiAkZGVwbGliICIqKSA7OworCSAgKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCSAgZXNhYworCSAgOzsKKwkqKSBuZXdfbGlicz0iJG5ld19saWJzICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgICMgQWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIHZhcmlhYmxlcyAoaW5zdGFsbF9saWJkaXIgaXMgc2V0IGFib3ZlKS4KKyAgICAgIGxpYnJhcnlfbmFtZXM9CisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIGRsbmFtZT0KKworICAgICAgIyBUZXN0IGFnYWluLCB3ZSBtYXkgaGF2ZSBkZWNpZGVkIG5vdCB0byBidWlsZCBpdCBhbnkgbW9yZQorICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICIkaGFyZGNvZGVfaW50b19saWJzIiA9IHllczsgdGhlbgorCSAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworCSAgaGFyZGNvZGVfbGliZGlycz0KKwkgIGRlcF9ycGF0aD0KKwkgIHJwYXRoPSIkZmluYWxpemVfcnBhdGgiCisJICB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHJwYXRoPSIkY29tcGlsZV9ycGF0aCRycGF0aCIKKwkgIGZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkJaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJCSAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkJZWxzZQorCQkgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkJICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCQkgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICAgIDs7CisJCSAgKikKKwkJICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgICAgOzsKKwkJICBlc2FjCisJCWZpCisJICAgICAgZWxzZQorCQlldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJCWRlcF9ycGF0aD0iJGRlcF9ycGF0aCAkZmxhZyIKKwkgICAgICBmaQorCSAgICBlbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKwkgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgICAqKSBwZXJtX3JwYXRoPSIkcGVybV9ycGF0aCAkbGliZGlyIiA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgIGRvbmUKKwkgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKKwkgICAgIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorCSAgICBsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCSAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCI7IHRoZW4KKwkgICAgICBldmFsIGRlcF9ycGF0aD1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkXCIKKwkgICAgZWxzZQorCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCSAgICBmaQorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICAgIHJwYXRoPQorCSAgICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgZG9uZQorCSAgICBldmFsICIkcnVucGF0aF92YXI9JyRycGF0aFwkJHJ1bnBhdGhfdmFyJzsgZXhwb3J0ICRydW5wYXRoX3ZhciIKKwkgIGZpCisJICB0ZXN0IC1uICIkZGVwX3JwYXRoIiAmJiBkZXBsaWJzPSIkZGVwX3JwYXRoICRkZXBsaWJzIgorCWZpCisKKwlzaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgiCisJdGVzdCAiJG1vZGUiICE9IHJlbGluayAmJiBzaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRzaGxpYnBhdGgiCisJaWYgdGVzdCAtbiAiJHNobGlicGF0aCI7IHRoZW4KKwkgIGV2YWwgIiRzaGxpYnBhdGhfdmFyPSckc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3Zhcic7IGV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKwlmaQorCisJIyBHZXQgdGhlIHJlYWwgYW5kIGxpbmsgbmFtZXMgb2YgdGhlIGxpYnJhcnkuCisJZXZhbCBzaGFyZWRfZXh0PVwiJHNocmV4dF9jbWRzXCIKKwlldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKKwlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwlyZWFsbmFtZT0iJDIiCisJc2hpZnQ7IHNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCisJIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwlpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICBpZiB0ZXN0ICIkYWx3YXlzX2V4cG9ydF9zeW1ib2xzIiA9IHllcyB8fCB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCisJICAgIGNtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisJICAgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICAgICBpZiBsZW49YGV4cHIgIlgkY21kIiA6ICIuKiJgICYmCisJICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCSAgICAgICAgJHNob3cgIiRjbWQiCisJICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgICAgICAgIHNraXBwZWRfZXhwb3J0PWZhbHNlCisJICAgICAgZWxzZQorCSAgICAgICAgIyBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nIHRvIGV4ZWN1dGUgaW4gb25lIHN0ZXAuCisJICAgICAgICAkc2hvdyAidXNpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZSBmb3IgZXhwb3J0IGxpc3QuLi4iCisJICAgICAgICBza2lwcGVkX2V4cG9ydD06CisJCSMgQnJlYWsgb3V0IGVhcmx5LCBvdGhlcndpc2Ugc2tpcHBlZF9leHBvcnQgbWF5IGJlCisJCSMgc2V0IHRvIGZhbHNlIGJ5IGEgbGF0ZXIgYnV0IHNob3J0ZXIgY21kLgorCQlicmVhaworCSAgICAgIGZpCisJICAgIGRvbmUKKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgICAkc2hvdyAiJEVHUkVQIC1lIFwiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4XCIgXCIkZXhwb3J0X3N5bWJvbHNcIiA+IFwiJHtleHBvcnRfc3ltYm9sc31UXCIiCisJICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRleHBvcnRfc3ltYm9scyIgPiAiJHtleHBvcnRfc3ltYm9sc31UIicKKwkgICAgICAkc2hvdyAiJG12IFwiJHtleHBvcnRfc3ltYm9sc31UXCIgXCIkZXhwb3J0X3N5bWJvbHNcIiIKKwkgICAgICAkcnVuIGV2YWwgJyRtdiAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICRydW4gZXZhbCAnJGVjaG8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRTUDJOTCA+PiAiJGV4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJdG1wX2RlcGxpYnM9CisJZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbworCQljYXNlICIgJGNvbnZlbmllbmNlICIgaW4KKwkJKiIgJHRlc3RfZGVwbGliICIqKSA7OworCQkqKQorCQkJdG1wX2RlcGxpYnM9IiR0bXBfZGVwbGlicyAkdGVzdF9kZXBsaWIiCisJCQk7OworCQllc2FjCisJZG9uZQorCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKKworCWlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgZWxzZQorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICBmaQorCWZpCisJCisJaWYgdGVzdCAiJHRocmVhZF9zYWZlIiA9IHllcyAmJiB0ZXN0IC1uICIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCBmbGFnPVwiJHRocmVhZF9zYWZlX2ZsYWdfc3BlY1wiCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZsYWciCisJZmkKKworCSMgTWFrZSBhIGJhY2t1cCBvZiB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSB3aGVuIHJlbGlua2luZworCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VSAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VSknIHx8IGV4aXQgJD8KKwlmaQorCisJIyBEbyBlYWNoIG9mIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG1vZHVsZV9leHBzeW1fY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfY21kc1wiCisJICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICBmaQorCWVsc2UKKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9leHBzeW1fY21kc1wiCisJICBjbWRzPSRhcmNoaXZlX2V4cHN5bV9jbWRzCisJZWxzZQorCSAgZXZhbCB0ZXN0X2NtZHM9XCIkYXJjaGl2ZV9jbWRzXCIKKwkgIGNtZHM9JGFyY2hpdmVfY21kcworCSAgZmkKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJgorCSAgIGxlbj1gZXhwciAiWCR0ZXN0X2NtZHMiIDogIi4qIiAyPi9kZXYvbnVsbGAgJiYKKwkgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIDoKKwllbHNlCisJICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UuCisJICAkZWNobyAiY3JlYXRpbmcgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMuLi4iCisKKwkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCisJICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKKwkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKKwkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0CisJICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgorCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQorCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZworCSAgIyB0aGUgc3BlYy4KKwkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgIGZpCisJICBzYXZlX291dHB1dD0kb3V0cHV0CisJICBvdXRwdXRfbGE9YCRlY2hvICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKworCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKKwkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KKwkgIHRlc3RfY21kcz0KKwkgIGNvbmNhdF9jbWRzPQorCSAgb2JqbGlzdD0KKwkgIGRlbGZpbGVzPQorCSAgbGFzdF9yb2JqPQorCSAgaz0xCisJICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkgICMgTG9vcCBvdmVyIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbGlua2VkLgorCSAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICBkbworCSAgICBldmFsIHRlc3RfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKwkgICAgaWYgdGVzdCAiWCRvYmpsaXN0IiA9IFggfHwKKwkgICAgICAgeyBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCisJCSB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiI7IH07IHRoZW4KKwkgICAgICBvYmpsaXN0PSIkb2JqbGlzdCAkb2JqIgorCSAgICBlbHNlCisJICAgICAgIyBUaGUgY29tbWFuZCAkdGVzdF9jbWRzIGlzIGFsbW9zdCB0b28gbG9uZywgYWRkIGEKKwkgICAgICAjIGNvbW1hbmQgdG8gdGhlIHF1ZXVlLgorCSAgICAgIGlmIHRlc3QgIiRrIiAtZXEgMSA7IHRoZW4KKwkJIyBUaGUgZmlyc3QgZmlsZSBkb2Vzbid0IGhhdmUgYSBwcmV2aW91cyBjb21tYW5kIHRvIGFkZC4KKwkJZXZhbCBjb25jYXRfY21kcz1cIiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKwkgICAgICBlbHNlCisJCSMgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMgd2lsbCBsaW5rIGluCisJCSMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCWV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKwkgICAgICBmaQorCSAgICAgIGxhc3Rfcm9iaj0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCSAgICAgIGs9YGV4cHIgJGsgKyAxYAorCSAgICAgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCSAgICAgIG9iamxpc3Q9JG9iagorCSAgICAgIGxlbj0xCisJICAgIGZpCisJICBkb25lCisJICAjIEhhbmRsZSB0aGUgcmVtYWluaW5nIG9iamVjdHMgYnkgY3JlYXRpbmcgb25lIGxhc3QKKwkgICMgcmVsb2FkYWJsZSBvYmplY3QgZmlsZS4gIEFsbCBzdWJzZXF1ZW50IHJlbG9hZGFibGUgb2JqZWN0CisJICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgZXZhbCBjb25jYXRfY21kcz1cIlwke2NvbmNhdF9jbWRzfSRyZWxvYWRfY21kcyAkb2JqbGlzdCAkbGFzdF9yb2JqXCIKKworCSAgaWYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgorCSAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZXhwIgorCSAgICAkcnVuICRybSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgbGlib2Jqcz0kb3V0cHV0CisJICAgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZXhwb3J0IGZpbGUuCisJICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJGNvbmNhdF9jbWRzfiRleHBvcnRfc3ltYm9sc19jbWRzXCIKKyAgICAgICAgICBmaQorCisJICAjIFNldCB1cCBhIGNvbW1hbmQgdG8gcmVtb3ZlIHRoZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcworCSAgIyBhZnRlciB0aGV5IGFyZSB1c2VkLgorCSAgaT0wCisJICB3aGlsZSB0ZXN0ICIkaSIgLWx0ICIkayIKKwkgIGRvCisJICAgIGk9YGV4cHIgJGkgKyAxYAorCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtpfS4kb2JqZXh0IgorCSAgZG9uZQorCisJICAkZWNobyAiY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcmVsb2FkYWJsZSBvYmplY3QgZmlsZTogJG91dHB1dCIKKworCSAgIyBMb29wIHRocm91Z2ggdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBhYm92ZSBhbmQgZXhlY3V0ZSB0aGVtLgorCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjb25jYXRfY21kczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgICRzaG93ICIkY21kIgorCSAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCisJICBsaWJvYmpzPSRvdXRwdXQKKwkgICMgUmVzdG9yZSB0aGUgdmFsdWUgb2Ygb3V0cHV0LgorCSAgb3V0cHV0PSRzYXZlX291dHB1dAorCisJICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiICYmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgZXZhbCBsaWJvYmpzPVwiXCRsaWJvYmpzICR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICBmaQorCSAgIyBFeHBhbmQgdGhlIGxpYnJhcnkgbGlua2luZyBjb21tYW5kcyBhZ2FpbiB0byByZXNldCB0aGUKKwkgICMgdmFsdWUgb2YgJGxpYm9ianMgZm9yIHBpZWNld2lzZSBsaW5raW5nLgorCisJICAjIERvIGVhY2ggb2YgdGhlIGFyY2hpdmUgY29tbWFuZHMuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRtb2R1bGVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgICAgY21kcz0kbW9kdWxlX2V4cHN5bV9jbWRzCisJICAgIGVsc2UKKwkgICAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgICBmaQorCSAgZWxzZQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkYXJjaGl2ZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgICAgZmkKKwkgIGZpCisKKwkgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIHJlbW92ZSB0aGUgcmVsb2FkYWJsZSBvYmplY3QgZmlsZXMKKwkgICMgdG8gdGhlIGp1c3QtcmVzZXQgJGNtZHMuCisJICBldmFsIGNtZHM9XCJcJGNtZHN+XCRybSAkZGVsZmlsZXNcIgorCWZpCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICRzaG93ICIkY21kIgorCSAgJHJ1biBldmFsICIkY21kIiB8fCB7CisJICAgIGx0X2V4aXQ9JD8KKworCSAgICAjIFJlc3RvcmUgdGhlIHVuaW5zdGFsbGVkIGxpYnJhcnkgYW5kIGV4aXQKKwkgICAgaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHtyZWFsbmFtZX1VICRyZWFsbmFtZSknCisJICAgIGZpCisKKwkgICAgZXhpdCAkbHRfZXhpdAorCSAgfQorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKworCSMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCSAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICR7cmVhbG5hbWV9VCAmJiAkbXYgJHJlYWxuYW1lICR7cmVhbG5hbWV9VCAmJiAkbXYgIiRyZWFsbmFtZSJVICRyZWFsbmFtZSknIHx8IGV4aXQgJD8KKworCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMiOyB0aGVuCisJICAgICAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgICAgICRydW4gJHtybX1yICIkZ2VudG9wIgorCSAgICBmaQorCSAgZmkKKworCSAgZXhpdCAkRVhJVF9TVUNDRVNTCisJZmkKKworCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCisJZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisJICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCisJICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKKwkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPworCSAgZmkKKwlkb25lCisKKwkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgorCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KKwkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgorCSAgZGxuYW1lPSIkc29uYW1lIgorCWZpCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9iaikKKyAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBjYXNlICRvdXRwdXQgaW4KKyAgICAgICoubG8pCisJaWYgdGVzdCAtbiAiJG9ianMkb2xkX2RlcGxpYnMiOyB0aGVuCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlicmFyeSBvYmplY3QgXGAkb3V0cHV0JyBmcm9tIG5vbi1saWJ0b29sIG9iamVjdHMiIDE+JjIKKwkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCWZpCisJbGlib2JqPSIkb3V0cHV0IgorCW9iaj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICIkbG8ybyJgCisJOzsKKyAgICAgICopCisJbGlib2JqPQorCW9iaj0iJG91dHB1dCIKKwk7OworICAgICAgZXNhYworCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCisgICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKKworICAgICAgIyBPYmplY3RzIGZyb20gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgVGhpcyBhc3N1bWVzCisgICAgICAjIHNpbmdsZS12ZXJzaW9uIGNvbnZlbmllbmNlIGxpYnJhcmllcy4gIFdoZW5ldmVyIHdlIGNyZWF0ZQorICAgICAgIyBkaWZmZXJlbnQgb25lcyBmb3IgUElDL25vbi1QSUMsIHRoaXMgd2UnbGwgaGF2ZSB0byBkdXBsaWNhdGUKKyAgICAgICMgdGhlIGV4dHJhY3Rpb24uCisgICAgICByZWxvYWRfY29udl9vYmpzPQorICAgICAgZ2VudG9wPQorICAgICAgIyByZWxvYWRfY21kcyBydW5zICRMRCBkaXJlY3RseSwgc28gbGV0IHVzIGdldCByaWQgb2YKKyAgICAgICMgLVdsIGZyb20gd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMKKyAgICAgIHdsPQorCisgICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCByZWxvYWRfY29udl9vYmpzPVwiXCRyZWxvYWRfb2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCWVsc2UKKwkgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvYmp9eCIKKwkgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgIHJlbG9hZF9jb252X29ianM9IiRyZWxvYWRfb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisgICAgICByZWxvYWRfb2Jqcz0iJG9ianMkb2xkX2RlcGxpYnMgImAkZWNobyAiWCRsaWJvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICcvXC4nJHtsaWJleHR9JCcvZCcgLWUgJy9cLmxpYiQvZCcgLWUgIiRsbzJvIiB8ICROTDJTUGAiICRyZWxvYWRfY29udl9vYmpzIiAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKworICAgICAgb3V0cHV0PSIkb2JqIgorICAgICAgY21kcz0kcmVsb2FkX2NtZHMKKyAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwlJRlM9IiRzYXZlX2lmcyIKKwlldmFsIGNtZD1cIiRjbWRcIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgorICAgICAgaWYgdGVzdCAteiAiJGxpYm9iaiI7IHRoZW4KKwlpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSAgJHNob3cgIiR7cm19ciAkZ2VudG9wIgorCSAgJHJ1biAke3JtfXIgJGdlbnRvcAorCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICAkc2hvdyAiJHtybX1yICRnZW50b3AiCisJICAkcnVuICR7cm19ciAkZ2VudG9wCisJZmkKKworCSMgQ3JlYXRlIGFuIGludmFsaWQgbGlidG9vbCBvYmplY3QgaWYgbm8gUElDLCBzbyB0aGF0IHdlIGRvbid0CisJIyBhY2NpZGVudGFsbHkgbGluayBpdCBpbnRvIGEgcHJvZ3JhbS4KKwkjICRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCisJIyAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPworCWV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiB8fCB0ZXN0ICIkcGljX21vZGUiICE9IGRlZmF1bHQ7IHRoZW4KKwkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgorCXJlbG9hZF9vYmpzPSIkbGlib2JqcyAkcmVsb2FkX2NvbnZfb2JqcyIKKwlvdXRwdXQ9IiRsaWJvYmoiCisJY21kcz0kcmVsb2FkX2NtZHMKKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwlmb3IgY21kIGluICRjbWRzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisJICBldmFsIGNtZD1cIiRjbWRcIgorCSAgJHNob3cgIiRjbWQiCisJICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKwlkb25lCisJSUZTPSIkc2F2ZV9pZnMiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZ2VudG9wIjsgdGhlbgorCSRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkkcnVuICR7cm19ciAkZ2VudG9wCisgICAgICBmaQorCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisKKyAgICBwcm9nKQorICAgICAgY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qKSBvdXRwdXQ9YCRlY2hvICRvdXRwdXQgfCAke1NFRH0gLWUgJ3MsLmV4ZSQsLDtzLCQsLmV4ZSwnYCA7OworICAgICAgZXNhYworICAgICAgaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3IgcHJvZ3JhbXMiIDE+JjIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRyZWxlYXNlIjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXM7IHRoZW4KKwlpZiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biAmJiB0ZXN0ICIkZGxvcGVuX3NlbGYiID0gdW5rbm93biAmJgorCSAgIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93bjsgdGhlbgorCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGBBQ19MSUJUT09MX0RMT1BFTicgbm90IHVzZWQuIEFzc3VtaW5nIG5vIGRsb3BlbiBzdXBwb3J0LiIKKwlmaQorICAgICAgZmkKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSMgT24gUmhhcHNvZHkgcmVwbGFjZSB0aGUgQyBsaWJyYXJ5IGlzIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJY29tcGlsZV9kZXBsaWJzPWAkZWNobyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyAtZnJhbWV3b3JrIFN5c3RlbSAvJ2AKKwlmaW5hbGl6ZV9kZXBsaWJzPWAkZWNobyAiWCAkZmluYWxpemVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gLWZyYW1ld29yayBTeXN0ZW0gLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmRhcndpbiopCisgICAgICAgICMgRG9uJ3QgYWxsb3cgbGF6eSBsaW5raW5nLCBpdCBicmVha3MgQysrIGdsb2JhbCBjb25zdHJ1Y3RvcnMKKyAgICAgICAgaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJHt3bH0tYmluZF9hdF9sb2FkIgorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCisJICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKikKKwkgIHRlc3RiaW5kaXI9YCRlY2hvICJYJGxpYmRpciIgfCAkWHNlZCAtZSAncyovbGliJCovYmluKidgCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiRsaWJkaXI6IiopIDs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZGxzeW1zPQorICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKwlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisJICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCisJY2FzZSAkZGxzeW1zIGluCisJIiIpIDs7CisJKi5jKQorCSAgIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKwkgIG5saXN0PSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Lm5tIgorCisJICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVMgJHtubGlzdH1UIgorCSAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKworCSAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KKwkgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCisJICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyA+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIFwiQ1wiIHsKKyNlbmRpZgorCisvKiBQcmV2ZW50IHRoZSBvbmx5IGtpbmQgb2YgZGVjbGFyYXRpb24gY29uZmxpY3RzIHdlIGNhbiBtYWtlLiAqLworI2RlZmluZSBsdF9wcmVsb2FkZWRfc3ltYm9scyBzb21lX290aGVyX3N5bWJvbAorCisvKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAorIgorCisJICBpZiB0ZXN0ICIkZGxzZWxmIiA9IHllczsgdGhlbgorCSAgICAkc2hvdyAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKKworCSAgICB0ZXN0IC16ICIkcnVuIiAmJiAkZWNobyAnOiBAUFJPR1JBTUAgJyA+ICIkbmxpc3QiCisKKwkgICAgIyBBZGQgb3VyIG93biBwcm9ncmFtIG9iamVjdHMgdG8gdGhlIHN5bWJvbCBsaXN0LgorCSAgICBwcm9nZmlsZXM9YCRlY2hvICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwkgICAgZm9yIGFyZyBpbiAkcHJvZ2ZpbGVzOyBkbworCSAgICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgorCSAgICAgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgICBkb25lCisKKwkgICAgaWYgdGVzdCAtbiAiJGV4Y2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgICAgICAkcnVuIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICAgJHJ1biBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgJHJ1biBldmFsICckbXYgIiRubGlzdCJUICIkbmxpc3QiJworCSAgICBmaQorCisJICAgICMgUHJlcGFyZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzCisJICAgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIgorCSAgICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scworCSAgICAgICRydW4gZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCisgICAgICAgICAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgICAgICRydW4gZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkJJHJ1biBldmFsICdjYXQgIiRleHBvcnRfc3ltYm9scyIgPj4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgZXNhYworCSAgICBlbHNlCisJICAgICAgJHJ1biBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKKwkgICAgICAkcnVuIGV2YWwgJ2dyZXAgLWYgIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKKwkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKKyAgICAgICAgICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgICAgICAgICAqY3lnd2luKiB8ICptaW5ndyogKQorCSAgICAgICAgJHJ1biBldmFsICJlY2hvIEVYUE9SVFMgIic+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCQkkcnVuIGV2YWwgJ2NhdCAiJG5saXN0IiA+PiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCisJICBmb3IgYXJnIGluICRkbHByZWZpbGVzOyBkbworCSAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICAgbmFtZT1gJGVjaG8gIiRhcmciIHwgJHtTRUR9IC1lICdzJV4uKi8lJSdgCisJICAgICRydW4gZXZhbCAnJGVjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKKwkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICBkb25lCisKKwkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisJICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KKwkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKKworCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAgICRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCisJICAgICAgJG12ICIkbmxpc3QiVCAiJG5saXN0IgorCSAgICBmaQorCisJICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICAgIGlmIGdyZXAgLXYgIl46ICIgPCAiJG5saXN0IiB8CisJCWlmIHNvcnQgLWsgMyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQkgIHNvcnQgLWsgMworCQllbHNlCisJCSAgc29ydCArMgorCQlmaSB8CisJCXVuaXEgPiAiJG5saXN0IlM7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgorCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJworCSAgICBlbHNlCisJICAgICAgJGVjaG8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorCisjdW5kZWYgbHRfcHJlbG9hZGVkX3N5bWJvbHMKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgbHRfcHRyIHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIGx0X3B0ciBjaGFyICoKKyMgZGVmaW5lIGNvbnN0CisjZW5kaWYKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCisiCisKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAqY3lnd2luKiB8ICptaW5ndyogKQorCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisvKiBEQVRBIGltcG9ydHMgZnJvbSBETExzIG9uIFdJTjMyIGNhbid0IGJlIGNvbnN0LCBiZWNhdXNlCisgICBydW50aW1lIHJlbG9jYXRpb25zIGFyZSBwZXJmb3JtZWQgLS0gc2VlIGxkJ3MgZG9jdW1lbnRhdGlvbgorICAgb24gcHNldWRvLXJlbG9jcyAqLworc3RydWN0IHsKKyIKKwkgICAgICA7OworCSAgICAqICkKKwkgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorY29uc3Qgc3RydWN0IHsKKyIKKwkgICAgICA7OworCSAgICBlc2FjCisKKworCSAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGx0X3B0ciBhZGRyZXNzOworfQorbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7XAorIgorCisJICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzIiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIgorCisJICAgICRlY2hvID4+ICIkb3V0cHV0X29iamRpci8kZGxzeW1zIiAiXAorICB7MCwgKGx0X3B0cikgMH0KK307CisKKy8qIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSBpbiBGcmVlQlNEIGxpbmtlciAqLworI2lmZGVmIEZSRUVCU0RfV09SS0FST1VORAorc3RhdGljIGNvbnN0IHZvaWQgKmx0X3ByZWxvYWRlZF9zZXR1cCgpIHsKKyAgcmV0dXJuIGx0X3ByZWxvYWRlZF9zeW1ib2xzOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCSAgZmkKKworCSAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQorCSAgY2FzZSAkaG9zdCBpbgorCSAgIyBjb21waWxpbmcgdGhlIHN5bWJvbCB0YWJsZSBmaWxlIHdpdGggcGljX2ZsYWcgd29ya3MgYXJvdW5kCisJICAjIGEgRnJlZUJTRCBidWcgdGhhdCBjYXVzZXMgcHJvZ3JhbXMgdG8gY3Jhc2ggd2hlbiAtbG0gaXMKKwkgICMgbGlua2VkIGJlZm9yZSBhbnkgb3RoZXIgUElDIG9iamVjdC4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UKKwkgICMgcGljX2ZsYWcgd2hlbiBsaW5raW5nIHdpdGggLXN0YXRpYy4gIFRoZSBwcm9ibGVtIGV4aXN0cyBpbgorCSAgIyBGcmVlQlNEIDIuMi42IGFuZCBpcyBmaXhlZCBpbiBGcmVlQlNEIDMuMS4KKwkgICotKi1mcmVlYnNkMip8Ki0qLWZyZWVic2QzLjAqfCotKi1mcmVlYnNkZWxmMy4wKikKKwkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICoiIC1zdGF0aWMgIiopIDs7CisJICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCI7OworCSAgICBlc2FjOzsKKwkgICotKi1ocHV4KikKKwkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCisJICAgICoiIC1zdGF0aWMgIiopIDs7CisJICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyI7OworCSAgICBlc2FjCisJICBlc2FjCisKKwkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCisJICAkc2hvdyAiKGNkICRvdXRwdXRfb2JqZGlyICYmICRMVENDICAkTFRDRkxBR1MgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCisJICAkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkTFRDQyAgJExUQ0ZMQUdTIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPworCisJICAjIENsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMuCisJICAkc2hvdyAiJHJtICRvdXRwdXRfb2JqZGlyLyRkbHN5bXMgJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisJICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJGRsc3ltcyIgIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKKworCSAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgICBjYXNlICRob3N0IGluCisgICAgICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmIiA7IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX0uZGVmICRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9LmRlZiAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKKyAgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAqICkKKyAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0lImAKKyAgICAgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX1TLiR7b2JqZXh0fSUiYAorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisJICA7OworCSopCisJICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKwkjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bworCSMgbHRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKwkjIHJlYWxseSB3YXMgcmVxdWlyZWQuCisKKwkjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisJZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5lZWRfcmVsaW5rIiA9IG5vIHx8IHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwljb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCSRzaG93ICIkbGlua19jb21tYW5kIgorCSRydW4gZXZhbCAiJGxpbmtfY29tbWFuZCIKKwlleGl0X3N0YXR1cz0kPworCisJIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgorCSAgJHNob3cgIiRybSAkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iCisJICAkcnVuICRybSAiJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfVMuJHtvYmpleHR9IgorCWZpCisKKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCisJcnBhdGg9CisJZm9yIGRpciBpbiAkdGVtcF9ycGF0aDsgZG8KKwkgIGNhc2UgJGRpciBpbgorCSAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKQorCSAgICAjIEFic29sdXRlIHBhdGguCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgICAgOzsKKwkgICopCisJICAgICMgUmVsYXRpdmUgcGF0aDogYWRkIGEgdGhpc2RpciBlbnRyeS4KKwkgICAgcnBhdGg9IiRycGF0aFwkdGhpc2Rpci8kZGlyOiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJdGVtcF9ycGF0aD0iJHJwYXRoIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY29tcGlsZV92YXI9CisgICAgICBmaW5hbGl6ZV92YXI9CisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgorCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkcnVuICRybSAkb3V0cHV0CisJIyBMaW5rIHRoZSBleGVjdXRhYmxlIGFuZCBleGl0CisJJHNob3cgIiRsaW5rX2NvbW1hbmQiCisJJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/CisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGxpa2UgdW5pbnN0YWxsZWQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgorCSRlY2hvICIkbW9kZW5hbWU6IFxgJG91dHB1dCcgd2lsbCBiZSByZWxpbmtlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIiAxPiYyCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJGVjaG8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCisgICAgICAkcnVuICRybSAkb3V0cHV0ICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyL2x0LSRvdXRwdXRuYW1lCisKKyAgICAgICRzaG93ICIkbGlua19jb21tYW5kIgorICAgICAgJHJ1biBldmFsICIkbGlua19jb21tYW5kIiB8fCBleGl0ICQ/CisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBRdW90ZSB0aGUgcmVsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgaWYgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIjsgdGhlbgorCSMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKwlmb3IgdmFyIGluICR2YXJpYWJsZXNfc2F2ZWRfZm9yX3JlbGluazsgZG8KKwkgIGlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICB2YXJfdmFsdWU9YCRlY2hvICJYJHZhcl92YWx1ZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisJICAgIHJlbGlua19jb21tYW5kPSIkdmFyPVwiJHZhcl92YWx1ZVwiOyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZmkKKwlkb25lCisJcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJHJlbGlua19jb21tYW5kKSIKKwlyZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZmkKKworICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0ICJYJGVjaG8iID0gIlgkU0hFTEwgJHByb2dwYXRoIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KKwljYXNlICRwcm9ncGF0aCBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgcWVjaG89IiRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7CisJKikgcWVjaG89IiRTSEVMTCBgcHdkYC8kcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjs7CisJZXNhYworCXFlY2hvPWAkZWNobyAiWCRxZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBlbHNlCisJcWVjaG89YCRlY2hvICJYJGVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgZmkKKworICAgICAgIyBPbmx5IGFjdHVhbGx5IGRvIHRoaW5ncyBpZiBvdXIgcnVuIGNvbW1hbmQgaXMgbm9uLW51bGwuCisgICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgb3V0cHV0PWAkZWNobyAkb3V0cHV0fCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKKwllc2FjCisJIyB0ZXN0IGZvciBjeWd3aW4gYmVjYXVzZSBtdiBmYWlscyB3L28gLmV4ZSBleHRlbnNpb25zCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiopCisJICAgIGV4ZWV4dD0uZXhlCisJICAgIG91dHB1dG5hbWU9YCRlY2hvICRvdXRwdXRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgICAgIG91dHB1dF9uYW1lPWBiYXNlbmFtZSAkb3V0cHV0YAorICAgICAgICAgICAgb3V0cHV0X3BhdGg9YGRpcm5hbWUgJG91dHB1dGAKKyAgICAgICAgICAgIGN3cmFwcGVyc291cmNlPSIkb3V0cHV0X3BhdGgvJG9iamRpci9sdC0kb3V0cHV0X25hbWUuYyIKKyAgICAgICAgICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKyAgICAgICAgICAgICRybSAkY3dyYXBwZXJzb3VyY2UgJGN3cmFwcGVyCisgICAgICAgICAgICB0cmFwICIkcm0gJGN3cmFwcGVyc291cmNlICRjd3JhcHBlcjsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBjYXQgPiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKKworLyogJGN3cmFwcGVyc291cmNlIC0gdGVtcG9yYXJ5IHdyYXBwZXIgZXhlY3V0YWJsZSBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorICAgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIC0gR05VICRQQUNLQUdFICRWRVJTSU9OJFRJTUVTVEFNUAorCisgICBUaGUgJG91dHB1dCBwcm9ncmFtIGNhbm5vdCBiZSBkaXJlY3RseSBleGVjdXRlZCB1bnRpbCBhbGwgdGhlIGxpYnRvb2wKKyAgIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKworICAgVGhpcyB3cmFwcGVyIGV4ZWN1dGFibGUgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICAgSWYgaXQgaXMsIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5LgorCisgICBDdXJyZW50bHksIGl0IHNpbXBseSBleGVjcyB0aGUgd3JhcHBlciAqc2NyaXB0KiAiL2Jpbi9zaCAkb3V0cHV0IiwKKyAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKKyAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KKyovCitFT0YKKwkgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZTw8IkVPRiIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmIGRlZmluZWQoUEFUSF9NQVgpCisjIGRlZmluZSBMVF9QQVRITUFYIFBBVEhfTUFYCisjZWxpZiBkZWZpbmVkKE1BWFBBVEhMRU4pCisjIGRlZmluZSBMVF9QQVRITUFYIE1BWFBBVEhMRU4KKyNlbHNlCisjIGRlZmluZSBMVF9QQVRITUFYIDEwMjQKKyNlbmRpZgorCisjaWZuZGVmIERJUl9TRVBBUkFUT1IKKyMgZGVmaW5lIERJUl9TRVBBUkFUT1IgJy8nCisjIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX01TRE9TX18pIHx8IGRlZmluZWQgKF9fREpHUFBfXykgfHwgXAorICBkZWZpbmVkIChfX09TMl9fKQorIyBkZWZpbmUgSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0KKyMgaWZuZGVmIERJUl9TRVBBUkFUT1JfMgorIyAgZGVmaW5lIERJUl9TRVBBUkFUT1JfMiAnXFwnCisjIGVuZGlmCisjIGlmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgUEFUSF9TRVBBUkFUT1JfMiAnOycKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERJUl9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gRElSX1NFUEFSQVRPUikKKyNlbHNlIC8qIERJUl9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfRElSX1NFUEFSQVRPUihjaCkgXAorICAgICAgICAoKChjaCkgPT0gRElSX1NFUEFSQVRPUikgfHwgKChjaCkgPT0gRElSX1NFUEFSQVRPUl8yKSkKKyNlbmRpZiAvKiBESVJfU0VQQVJBVE9SXzIgKi8KKworI2lmbmRlZiBQQVRIX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1IpCisjZWxzZSAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19QQVRIX1NFUEFSQVRPUihjaCkgKChjaCkgPT0gUEFUSF9TRVBBUkFUT1JfMikKKyNlbmRpZiAvKiBQQVRIX1NFUEFSQVRPUl8yICovCisKKyNkZWZpbmUgWE1BTExPQyh0eXBlLCBudW0pICAgICAgKCh0eXBlICopIHhtYWxsb2MgKChudW0pICogc2l6ZW9mKHR5cGUpKSkKKyNkZWZpbmUgWEZSRUUoc3RhbGUpIGRvIHsgXAorICBpZiAoc3RhbGUpIHsgZnJlZSAoKHZvaWQgKikgc3RhbGUpOyBzdGFsZSA9IDA7IH0gXAorfSB3aGlsZSAoMCkKKworLyogLURERUJVRyBpcyBmYWlybHkgY29tbW9uIGluIENGTEFHUy4gICovCisjdW5kZWYgREVCVUcKKyNpZiBkZWZpbmVkIERFQlVHV1JBUFBFUgorIyBkZWZpbmUgREVCVUcoZm9ybWF0LCAuLi4pIGZwcmludGYoc3RkZXJyLCBmb3JtYXQsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHKGZvcm1hdCwgLi4uKQorI2VuZGlmCisKK2NvbnN0IGNoYXIgKnByb2dyYW1fbmFtZSA9IE5VTEw7CisKK3ZvaWQgKiB4bWFsbG9jIChzaXplX3QgbnVtKTsKK2NoYXIgKiB4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpOworY29uc3QgY2hhciAqIGJhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSk7CitjaGFyICogZmluZF9leGVjdXRhYmxlKGNvbnN0IGNoYXIgKndyYXBwZXIpOworaW50ICAgIGNoZWNrX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqcGF0aCk7CitjaGFyICogc3RyZW5kemFwKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcGF0KTsKK3ZvaWQgbHRfZmF0YWwgKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCBpOworCisgIHByb2dyYW1fbmFtZSA9IChjaGFyICopIHhzdHJkdXAgKGJhc2VfbmFtZSAoYXJndlswXSkpOworICBERUJVRygiKG1haW4pIGFyZ3ZbMF0gICAgICA6ICVzXG4iLGFyZ3ZbMF0pOworICBERUJVRygiKG1haW4pIHByb2dyYW1fbmFtZSA6ICVzXG4iLHByb2dyYW1fbmFtZSk7CisgIG5ld2FyZ3ogPSBYTUFMTE9DKGNoYXIgKiwgYXJnYysyKTsKK0VPRgorCisgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8RU9GCisgIG5ld2FyZ3pbMF0gPSAoY2hhciAqKSB4c3RyZHVwKCIkU0hFTEwiKTsKK0VPRgorCisgICAgICAgICAgICBjYXQgPj4gJGN3cmFwcGVyc291cmNlIDw8IkVPRiIKKyAgbmV3YXJnelsxXSA9IGZpbmRfZXhlY3V0YWJsZShhcmd2WzBdKTsKKyAgaWYgKG5ld2FyZ3pbMV0gPT0gTlVMTCkKKyAgICBsdF9mYXRhbCgiQ291bGRuJ3QgZmluZCAlcyIsIGFyZ3ZbMF0pOworICBERUJVRygiKG1haW4pIGZvdW5kIGV4ZSBhdCA6ICVzXG4iLG5ld2FyZ3pbMV0pOworICAvKiB3ZSBrbm93IHRoZSBzY3JpcHQgaGFzIHRoZSBzYW1lIG5hbWUsIHdpdGhvdXQgdGhlIC5leGUgKi8KKyAgLyogc28gbWFrZSBzdXJlIG5ld2FyZ3pbMV0gZG9lc24ndCBlbmQgaW4gLmV4ZSAqLworICBzdHJlbmR6YXAobmV3YXJnelsxXSwiLmV4ZSIpOworICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIG5ld2FyZ3pbaSsxXSA9IHhzdHJkdXAoYXJndltpXSk7CisgIG5ld2FyZ3pbYXJnYysxXSA9IE5VTEw7CisKKyAgZm9yIChpPTA7IGk8YXJnYysxOyBpKyspCisgIHsKKyAgICBERUJVRygiKG1haW4pIG5ld2FyZ3pbJWRdICAgOiAlc1xuIixpLG5ld2FyZ3pbaV0pOworICAgIDsKKyAgfQorCitFT0YKKworICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICBtaW5ndyopCisgICAgICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PEVPRgorICBleGVjdigiJFNIRUxMIiwoY2hhciBjb25zdCAqKiluZXdhcmd6KTsKK0VPRgorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIGNhdCA+PiAkY3dyYXBwZXJzb3VyY2UgPDxFT0YKKyAgZXhlY3YoIiRTSEVMTCIsbmV3YXJneik7CitFT0YKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKworICAgICAgICAgICAgY2F0ID4+ICRjd3JhcHBlcnNvdXJjZSA8PCJFT0YiCisgIHJldHVybiAxMjc7Cit9CisKK3ZvaWQgKgoreG1hbGxvYyAoc2l6ZV90IG51bSkKK3sKKyAgdm9pZCAqIHAgPSAodm9pZCAqKSBtYWxsb2MgKG51bSk7CisgIGlmICghcCkKKyAgICBsdF9mYXRhbCAoIk1lbW9yeSBleGhhdXN0ZWQiKTsKKworICByZXR1cm4gcDsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIHJldHVybiBzdHJpbmcgPyBzdHJjcHkgKChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc3RyaW5nKSArIDEpLCBzdHJpbmcpIDogTlVMTAorOworfQorCitjb25zdCBjaGFyICoKK2Jhc2VfbmFtZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqYmFzZTsKKworI2lmIGRlZmluZWQgKEhBVkVfRE9TX0JBU0VEX0ZJTEVfU1lTVEVNKQorICAvKiBTa2lwIG92ZXIgdGhlIGRpc2sgbmFtZSBpbiBNU0RPUyBwYXRobmFtZXMuICovCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhciluYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqIHBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIERFQlVHKCIoY2hlY2tfZXhlY3V0YWJsZSkgIDogJXNcbiIsIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIik7CisgIGlmICgoIXBhdGgpIHx8ICghKnBhdGgpKQorICAgIHJldHVybiAwOworCisgIGlmICgoc3RhdCAocGF0aCwgJnN0KSA+PSAwKSAmJgorICAgICAgKAorICAgICAgICAvKiBNaW5HVyAmIG5hdGl2ZSBXSU4zMiBkbyBub3Qgc3VwcG9ydCBTX0lYT1RIIG9yIFNfSVhHUlAgKi8KKyNpZiBkZWZpbmVkIChTX0lYT1RIKQorICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhPVEgpID09IFNfSVhPVEgpIHx8CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTX0lYR1JQKQorICAgICAgICgoc3Quc3RfbW9kZSAmIFNfSVhHUlApID09IFNfSVhHUlApIHx8CisjZW5kaWYKKyAgICAgICAoKHN0LnN0X21vZGUgJiBTX0lYVVNSKSA9PSBTX0lYVVNSKSkKKyAgICAgICkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBTZWFyY2hlcyBmb3IgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgd3JhcHBlci4gIFJldHVybnMKKyAgIG5ld2x5IGFsbG9jYXRlZCBmdWxsIHBhdGggbmFtZSBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UgKi8KK2NoYXIgKgorZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyKiB3cmFwcGVyKQoreworICBpbnQgaGFzX3NsYXNoID0gMDsKKyAgY29uc3QgY2hhciogcDsKKyAgY29uc3QgY2hhciogcF9uZXh0OworICAvKiBzdGF0aWMgYnVmZmVyIGZvciBnZXRjd2QgKi8KKyAgY2hhciB0bXBbTFRfUEFUSE1BWCArIDFdOworICBpbnQgdG1wX2xlbjsKKyAgY2hhciogY29uY2F0X25hbWU7CisKKyAgREVCVUcoIihmaW5kX2V4ZWN1dGFibGUpICA6ICVzXG4iLCB3cmFwcGVyID8gKCp3cmFwcGVyID8gd3JhcHBlciA6ICJFTVBUWSEiKSA6ICJOVUxMISIpOworCisgIGlmICgod3JhcHBlciA9PSBOVUxMKSB8fCAoKndyYXBwZXIgPT0gJ1wwJykpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogQWJzb2x1dGUgcGF0aD8gKi8KKyNpZiBkZWZpbmVkIChIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTSkKKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKXdyYXBwZXJbMF0pICYmIHdyYXBwZXJbMV0gPT0gJzonKQorICB7CisgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCisgICAgICByZXR1cm4gY29uY2F0X25hbWU7CisgICAgWEZSRUUoY29uY2F0X25hbWUpOworICB9CisgIGVsc2UKKyAgeworI2VuZGlmCisgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IgKHdyYXBwZXJbMF0pKQorICAgIHsKKyAgICAgIGNvbmNhdF9uYW1lID0geHN0cmR1cCAod3JhcHBlcik7CisgICAgICBpZiAoY2hlY2tfZXhlY3V0YWJsZShjb25jYXRfbmFtZSkpCisgICAgICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgICAgIFhGUkVFKGNvbmNhdF9uYW1lKTsKKyAgICB9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIH0KKyNlbmRpZgorCisgIGZvciAocCA9IHdyYXBwZXI7ICpwOyBwKyspCisgICAgaWYgKCpwID09ICcvJykKKyAgICB7CisgICAgICBoYXNfc2xhc2ggPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICBpZiAoIWhhc19zbGFzaCkKKyAgeworICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgY29uc3QgY2hhciogcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKKyAgICBpZiAocGF0aCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAocCA9IHBhdGg7ICpwOyBwID0gcF9uZXh0KQorICAgICAgeworICAgICAgICBjb25zdCBjaGFyKiBxOworICAgICAgICBzaXplX3QgcF9sZW47CisgICAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisgICAgICAgICAgaWYgKElTX1BBVEhfU0VQQVJBVE9SKCpxKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwX2xlbiA9IHEgLSBwOworICAgICAgICBwX25leHQgPSAoKnEgPT0gJ1wwJyA/IHEgOiBxICsgMSk7CisgICAgICAgIGlmIChwX2xlbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKyAgICAgICAgICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgICAgICAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKKyAgICAgICAgICB0bXBfbGVuID0gc3RybGVuKHRtcCk7CisgICAgICAgICAgY29uY2F0X25hbWUgPSBYTUFMTE9DKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuKHdyYXBwZXIpICsgMSk7CisgICAgICAgICAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKKyAgICAgICAgICBjb25jYXRfbmFtZVt0bXBfbGVuXSA9ICcvJzsKKyAgICAgICAgICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbmNhdF9uYW1lID0gWE1BTExPQyhjaGFyLCBwX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKKyAgICAgICAgICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisgICAgICAgICAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworICAgICAgICAgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChjaGVja19leGVjdXRhYmxlKGNvbmNhdF9uYW1lKSkKKyAgICAgICAgICByZXR1cm4gY29uY2F0X25hbWU7CisgICAgICAgIFhGUkVFKGNvbmNhdF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogbm90IGZvdW5kIGluIFBBVEg7IGFzc3VtZSBjdXJkaXIgKi8KKyAgfQorICAvKiBSZWxhdGl2ZSBwYXRoIHwgbm90IGZvdW5kIGluIHBhdGg6IHByZXBlbmQgY3dkICovCisgIGlmIChnZXRjd2QgKHRtcCwgTFRfUEFUSE1BWCkgPT0gTlVMTCkKKyAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKKyAgdG1wX2xlbiA9IHN0cmxlbih0bXApOworICBjb25jYXRfbmFtZSA9IFhNQUxMT0MoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4od3JhcHBlcikgKyAxKTsKKyAgbWVtY3B5IChjb25jYXRfbmFtZSwgdG1wLCB0bXBfbGVuKTsKKyAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisgIHN0cmNweSAoY29uY2F0X25hbWUgKyB0bXBfbGVuICsgMSwgd3JhcHBlcik7CisKKyAgaWYgKGNoZWNrX2V4ZWN1dGFibGUoY29uY2F0X25hbWUpKQorICAgIHJldHVybiBjb25jYXRfbmFtZTsKKyAgWEZSRUUoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitzdHJlbmR6YXAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpCit7CisgIHNpemVfdCBsZW4sIHBhdGxlbjsKKworICBhc3NlcnQoc3RyICE9IE5VTEwpOworICBhc3NlcnQocGF0ICE9IE5VTEwpOworCisgIGxlbiA9IHN0cmxlbihzdHIpOworICBwYXRsZW4gPSBzdHJsZW4ocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgeworICAgIHN0ciArPSBsZW4gLSBwYXRsZW47CisgICAgaWYgKHN0cmNtcChzdHIsIHBhdCkgPT0gMCkKKyAgICAgICpzdHIgPSAnXDAnOworICB9CisgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyB2b2lkCitsdF9lcnJvcl9jb3JlIChpbnQgZXhpdF9zdGF0dXMsIGNvbnN0IGNoYXIgKiBtb2RlLAorICAgICAgICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICIsIHByb2dyYW1fbmFtZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CitFT0YKKyAgICAgICAgICAjIHdlIHNob3VsZCByZWFsbHkgdXNlIGEgYnVpbGQtcGxhdGZvcm0gc3BlY2lmaWMgY29tcGlsZXIKKyAgICAgICAgICAjIGhlcmUsIGJ1dCBPVE9ILCB0aGUgd3JhcHBlcnMgKHNoZWxsIHNjcmlwdCBhbmQgdGhpcyBDIG9uZSkKKyAgICAgICAgICAjIGFyZSBvbmx5IHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBleGVjdXRlIHRoZSAicmVhbCIgYmluYXJ5LgorICAgICAgICAgICMgU2luY2UgdGhlICJyZWFsIiBiaW5hcnkgaXMgYnVpbHQgZm9yICRob3N0LCB0aGVuIHRoaXMKKyAgICAgICAgICAjIHdyYXBwZXIgbWlnaHQgYXMgd2VsbCBiZSBidWlsdCBmb3IgJGhvc3QsIHRvby4KKyAgICAgICAgICAkcnVuICRMVENDICRMVENGTEFHUyAtcyAtbyAkY3dyYXBwZXIgJGN3cmFwcGVyc291cmNlCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICAkcm0gJG91dHB1dAorICAgICAgICB0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSRlY2hvID4gJG91dHB1dCAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPScke1NFRH0gLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKKyMgaWYgQ0RQQVRIIGlzIHNldC4KKyh1bnNldCBDRFBBVEgpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBDRFBBVEgKKworcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIgorCisjIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgZGV0ZXJtaW5lcyBvdXIgb3BlcmF0aW9uIG1vZGUuCitpZiB0ZXN0IFwiXCRsaWJ0b29sX2luc3RhbGxfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgIyBpbnN0YWxsIG1vZGUgbmVlZHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZToKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBlY2hvPVwiJHFlY2hvXCIKKyAgICBmaWxlPVwiXCQwXCIKKyAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgorICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICAgICAgc2hpZnQKKyAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCisgICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQorICAgICAgOgorICAgIGVsc2UKKyAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KKyAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQorICAgIGZpCisgIGZpXAorIgorCSRlY2hvID4+ICRvdXRwdXQgIlwKKworICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgorICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAorICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCisKKyAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCisgIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAorICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCisgICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCisKKyAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCisgICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgorICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCisgICAgICBbXFxcXC9dKiB8IFtBLVphLXpdOltcXFxcL10qKSB0aGlzZGlyPVwiXCRkZXN0ZGlyXCIgOzsKKyAgICAgICopIHRoaXNkaXI9XCJcJHRoaXNkaXIvXCRkZXN0ZGlyXCIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorCisgICAgZmlsZT1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyVeLiovJSUnXGAKKyAgICBmaWxlPVxgbHMgLWxkIFwiXCR0aGlzZGlyL1wkZmlsZVwiIHwgJHtTRUR9IC1uICdzLy4qLT4gLy9wJ1xgCisgIGRvbmUKKworICAjIFRyeSB0byBnZXQgdGhlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLgorICBhYnNkaXI9XGBjZCBcIlwkdGhpc2RpclwiICYmIHB3ZFxgCisgIHRlc3QgLW4gXCJcJGFic2RpclwiICYmIHRoaXNkaXI9XCJcJGFic2RpclwiCisiCisKKwlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZSckZXhlZXh0CisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisKKyAgaWYgdGVzdCAhIC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIHx8IFxcCisgICAgIHsgZmlsZT1cYGxzIC0xZHQgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgXCJcJHByb2dkaXIvLi4vXCRwcm9ncmFtXCIgMj4vZGV2L251bGwgfCAke1NFRH0gMXFcYDsgXFwKKyAgICAgICB0ZXN0IFwiWFwkZmlsZVwiICE9IFwiWFwkcHJvZ2Rpci9cJHByb2dyYW1cIjsgfTsgdGhlbgorCisgICAgZmlsZT1cIlwkXCQtXCRwcm9ncmFtXCIKKworICAgIGlmIHRlc3QgISAtZCBcIlwkcHJvZ2RpclwiOyB0aGVuCisgICAgICAkbWtkaXIgXCJcJHByb2dkaXJcIgorICAgIGVsc2UKKyAgICAgICRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgorICAgIGZpIgorCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRlY2hvIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgZmkKKworICAgICRtdiBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJHJtIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJHJtIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgICRlY2hvID4+ICRvdXRwdXQgIlwKKyAgcHJvZ3JhbT0nJG91dHB1dG5hbWUnCisgIHByb2dkaXI9XCJcJHRoaXNkaXIvJG9iamRpclwiCisiCisJZmkKKworCSRlY2hvID4+ICRvdXRwdXQgIlwKKworICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgorCisJIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisJaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKKyAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAorIgorCWZpCisKKwkkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKyIKKwljYXNlICRob3N0IGluCisJIyBCYWNrc2xhc2hlcyBzZXBhcmF0ZSBkaXJlY3RvcmllcyBvbiBwbGFpbiB3aW5kb3dzCisJKi0qLW1pbmd3IHwgKi0qLW9zMiopCisJICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBleGVjIFwiXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbVwiIFwkezErXCJcJEBcIn0KKyIKKwkgIDs7CisKKwkqKQorCSAgJGVjaG8gPj4gJG91dHB1dCAiXAorICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCWVzYWMKKwkkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgICBcJGVjaG8gXCJcJDA6IGNhbm5vdCBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9XCIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisgIGVsc2UKKyAgICAjIFRoZSBwcm9ncmFtIGRvZXNuJ3QgZXhpc3QuCisgICAgXCRlY2hvIFwiXCQwOiBlcnJvcjogXFxcYFwkcHJvZ2Rpci9cJHByb2dyYW0nIGRvZXMgbm90IGV4aXN0XCIgMT4mMgorICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgorICAgICRlY2hvIFwiU2VlIHRoZSAkUEFDS0FHRSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiIDE+JjIKKyAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgZmkKK2ZpXAorIgorCWNobW9kICt4ICRvdXRwdXQKKyAgICAgIGZpCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJZmkKKwlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGFkZGxpYnMiOyB0aGVuCisJZ2VudG9wPSIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9eCIKKwlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCWZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRhZGRsaWJzCisJb2xkb2Jqcz0iJG9sZG9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisgICAgICBmaQorCisgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIGNtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKKyAgICAgIGVsc2UKKwkjIFBPU0lYIGRlbWFuZHMgbm8gcGF0aHMgdG8gYmUgZW5jb2RlZCBpbiBhcmNoaXZlcy4gIFdlIGhhdmUKKwkjIHRvIGF2b2lkIGNyZWF0aW5nIGFyY2hpdmVzIHdpdGggZHVwbGljYXRlIGJhc2VuYW1lcyBpZiB3ZQorCSMgbWlnaHQgaGF2ZSB0byBleHRyYWN0IHRoZW0gYWZ0ZXJ3YXJkcywgZS5nLiwgd2hlbiBjcmVhdGluZyBhCisJIyBzdGF0aWMgYXJjaGl2ZSBvdXQgb2YgYSBjb252ZW5pZW5jZSBsaWJyYXJ5LCBvciB3aGVuIGxpbmtpbmcKKwkjIHRoZSBlbnRpcmV0eSBvZiBhIGxpYnRvb2wgYXJjaGl2ZSBpbnRvIGFub3RoZXIgKGN1cnJlbnRseQorCSMgbm90IHN1cHBvcnRlZCBieSBsaWJ0b29sKS4KKwlpZiAoZm9yIG9iaiBpbiAkb2xkb2JqcworCSAgICBkbworCSAgICAgICRlY2hvICJYJG9iaiIgfCAkWHNlZCAtZSAncyVeLiovJSUnCisJICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICRlY2hvICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisKKwkgIGlmIHRlc3QgLXogIiRnZW50b3AiOyB0aGVuCisJICAgIGdlbnRvcD0iJG91dHB1dF9vYmpkaXIvJHtvdXRwdXRuYW1lfXgiCisJICAgIGdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJICAgICRzaG93ICIke3JtfXIgJGdlbnRvcCIKKwkgICAgJHJ1biAke3JtfXIgIiRnZW50b3AiCisJICAgICRzaG93ICIkbWtkaXIgJGdlbnRvcCIKKwkgICAgJHJ1biAkbWtkaXIgIiRnZW50b3AiCisJICAgIGV4aXRfc3RhdHVzPSQ/CisJICAgIGlmIHRlc3QgIiRleGl0X3N0YXR1cyIgLW5lIDAgJiYgdGVzdCAhIC1kICIkZ2VudG9wIjsgdGhlbgorCSAgICAgIGV4aXQgJGV4aXRfc3RhdHVzCisJICAgIGZpCisJICBmaQorCisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICBjb3VudGVyPTEKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgb2JqYmFzZT1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgIGNhc2UgIiAkb2xkb2JqcyAiIGluCisJICAgICIgIikgb2xkb2Jqcz0kb2JqIDs7CisJICAgICpbXCAvXSIkb2JqYmFzZSAiKikKKwkgICAgICB3aGlsZSA6OyBkbworCQkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBwaWNrIGFuIGFsdGVybmF0ZSBuYW1lIHRoYXQgYWxzbworCQkjIG92ZXJsYXBzLgorCQluZXdvYmo9bHQkY291bnRlci0kb2JqYmFzZQorCQljb3VudGVyPWBleHByICRjb3VudGVyICsgMWAKKwkJY2FzZSAiICRvbGRvYmpzICIgaW4KKwkJKltcIC9dIiRuZXdvYmogIiopIDs7CisJCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKKwkJZXNhYworCSAgICAgIGRvbmUKKwkgICAgICAkc2hvdyAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgJHJ1biBsbiAiJG9iaiIgIiRnZW50b3AvJG5ld29iaiIgfHwKKwkgICAgICAkcnVuIGNwICIkb2JqIiAiJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIG9sZG9ianM9IiRvbGRvYmpzICRnZW50b3AvJG5ld29iaiIKKwkgICAgICA7OworCSAgICAqKSBvbGRvYmpzPSIkb2xkb2JqcyAkb2JqIiA7OworCSAgICBlc2FjCisJICBkb25lCisJZmkKKworCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKworCWlmIGxlbj1gZXhwciAiWCRjbWRzIiA6ICIuKiJgICYmCisJICAgICB0ZXN0ICIkbGVuIiAtbGUgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbHNlCisJICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cworCSAgJGVjaG8gInVzaW5nIHBpZWNld2lzZSBhcmNoaXZlIGxpbmtpbmcuLi4iCisJICBzYXZlX1JBTkxJQj0kUkFOTElCCisJICBSQU5MSUI9OgorCSAgb2JqbGlzdD0KKwkgIGNvbmNhdF9jbWRzPQorCSAgc2F2ZV9vbGRvYmpzPSRvbGRvYmpzCisKKwkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PworCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBsYXN0X29sZG9iaj0kb2JqCisJICBkb25lCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIG9sZG9ianM9IiRvYmpsaXN0ICRvYmoiCisJICAgIG9iamxpc3Q9IiRvYmpsaXN0ICRvYmoiCisJICAgIGV2YWwgdGVzdF9jbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgorCSAgICBpZiBsZW49YGV4cHIgIlgkdGVzdF9jbWRzIiA6ICIuKiIgMj4vZGV2L251bGxgICYmCisJICAgICAgIHRlc3QgIiRsZW4iIC1sZSAiJG1heF9jbWRfbGVuIjsgdGhlbgorCSAgICAgIDoKKwkgICAgZWxzZQorCSAgICAgICMgdGhlIGFib3ZlIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIGl0IGdldHMgdG9vIGxvbmcKKwkgICAgICBvbGRvYmpzPSRvYmpsaXN0CisJICAgICAgaWYgdGVzdCAiJG9iaiIgPSAiJGxhc3Rfb2xkb2JqIiA7IHRoZW4KKwkgICAgICAgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgICAgICBmaQorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCisJICAgICAgb2JqbGlzdD0KKwkgICAgZmkKKwkgIGRvbmUKKwkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgIG9sZG9ianM9JG9iamxpc3QKKwkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgorCSAgZWxzZQorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmaQorCWZpCisgICAgICBmaQorICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICBldmFsIGNtZD1cIiRjbWRcIgorCUlGUz0iJHNhdmVfaWZzIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KKyAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgorICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCisgICAgZmkKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorICAgICAgZm9yIHZhciBpbiAkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbms7IGRvCisJaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSJ7IHRlc3QgLXogXCJcJHskdmFyK3NldH1cIiB8fCB1bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJZWxpZiBldmFsIHZhcl92YWx1ZT1cJCR2YXI7IHRlc3QgLXogIiR2YXJfdmFsdWUiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0iJHZhcj07IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZWxzZQorCSAgdmFyX3ZhbHVlPWAkZWNobyAiWCR2YXJfdmFsdWUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9XCIkdmFyX3ZhbHVlXCI7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJZmkKKyAgICAgIGRvbmUKKyAgICAgICMgUXVvdGUgdGhlIGxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICByZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tbW9kZT1yZWxpbmsgJGxpYnRvb2xfYXJncyBAaW5zdF9wcmVmaXhfZGlyQCkiCisgICAgICByZWxpbmtfY29tbWFuZD1gJGVjaG8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXMgOyB0aGVuCisJcmVsaW5rX2NvbW1hbmQ9CisgICAgICBmaQorCisKKyAgICAgICMgT25seSBjcmVhdGUgdGhlIG91dHB1dCBpZiBub3QgYSBkcnkgcnVuLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwlmb3IgaW5zdGFsbGVkIGluIG5vIHllczsgZG8KKwkgIGlmIHRlc3QgIiRpbnN0YWxsZWQiID0geWVzOyB0aGVuCisJICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX2xpYmRpciI7IHRoZW4KKwkgICAgICBicmVhaworCSAgICBmaQorCSAgICBvdXRwdXQ9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKKwkgICAgIyBSZXBsYWNlIGFsbCB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcyB3aXRoIHRoZSBpbnN0YWxsZWQgb25lcworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9CisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAqLmxhKQorCQluYW1lPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXBsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCQkgIGV4aXQgJEVYSVRfRkFJTFVSRQorCQlmaQorCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgICAgZmkKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIG5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgICAgIGV2YWwgbGliZGlyPWAke1NFRH0gLW4gLWUgJ3MvXmxpYmRpcj1cKC4qXCkkL1wxL3AnICRsaWJgCisJICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKwkJJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKwkJZXhpdCAkRVhJVF9GQUlMVVJFCisJICAgICAgZmkKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkbGliZGlyLyRuYW1lIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZmkKKwkgICRybSAkb3V0cHV0CisJICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCkgdGRsbmFtZT0uLi9iaW4vJGRsbmFtZSA7OworCSAgZXNhYworCSAgJGVjaG8gPiAkb3V0cHV0ICJcCisjICRvdXRwdXRuYW1lIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KK2RsbmFtZT0nJHRkbG5hbWUnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nJGxpYnJhcnlfbmFtZXMnCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9JyRvbGRfbGlicmFyeScKKworIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCitkZXBlbmRlbmN5X2xpYnM9JyRkZXBlbmRlbmN5X2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9JG1vZHVsZQorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KKwkgICAgJGVjaG8gPj4gJG91dHB1dCAiXAorcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKKwkgIGZpCisJZG9uZQorICAgICAgZmkKKworICAgICAgIyBEbyBhIHN5bWJvbGljIGxpbmsgc28gdGhhdCB0aGUgbGlidG9vbCBhcmNoaXZlIGNhbiBiZSBmb3VuZCBpbgorICAgICAgIyBMRF9MSUJSQVJZX1BBVEggYmVmb3JlIHRoZSBwcm9ncmFtIGlzIGluc3RhbGxlZC4KKyAgICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIKKyAgICAgICRydW4gZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRybSAkb3V0cHV0bmFtZSAmJiAkTE5fUyAuLi8kb3V0cHV0bmFtZSAkb3V0cHV0bmFtZSknIHx8IGV4aXQgJD8KKyAgICAgIDs7CisgICAgZXNhYworICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIDs7CisKKyAgIyBsaWJ0b29sIGluc3RhbGwgbW9kZQorICBpbnN0YWxsKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGluc3RhbGwiCisKKyAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCisgICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKKyAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KKyAgICAgICAkZWNobyAiWCRub25vcHQiIHwgZ3JlcCBzaHRvb2wgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisJYXJnPSJcIiRhcmdcIiIKKwk7OworICAgICAgZXNhYworICAgICAgaW5zdGFsbF9wcm9nPSIkYXJnICIKKyAgICAgIGFyZz0iJDEiCisgICAgICBzaGlmdAorICAgIGVsc2UKKyAgICAgIGluc3RhbGxfcHJvZz0KKyAgICAgIGFyZz0kbm9ub3B0CisgICAgZmkKKworICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KKyAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCisgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorICAgIGNhc2UgJGFyZyBpbgorICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorICAgICAgYXJnPSJcIiRhcmdcIiIKKyAgICAgIDs7CisgICAgZXNhYworICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCisKKyAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCisgICAgZGVzdD0KKyAgICBmaWxlcz0KKyAgICBvcHRzPQorICAgIHByZXY9CisgICAgaW5zdGFsbF90eXBlPQorICAgIGlzZGlyPW5vCisgICAgc3RyaXBtZT0KKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgIGlmIHRlc3QgLW4gIiRkZXN0IjsgdGhlbgorCWZpbGVzPSIkZmlsZXMgJGRlc3QiCisJZGVzdD0kYXJnCisJY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWQpIGlzZGlyPXllcyA7OworICAgICAgLWYpIAorICAgICAgCWNhc2UgIiAkaW5zdGFsbF9wcm9nICIgaW4KKwkqW1xcXCAvXWNwXCAqKSA7OworCSopIHByZXY9JGFyZyA7OworCWVzYWMKKwk7OworICAgICAgLWcgfCAtbSB8IC1vKSBwcmV2PSRhcmcgOzsKKyAgICAgIC1zKQorCXN0cmlwbWU9IiAtcyIKKwljb250aW51ZQorCTs7CisgICAgICAtKikKKwk7OworICAgICAgKikKKwkjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZGVkIGFuIGFyZ3VtZW50LCB0aGVuIHNraXAgaXQuCisJaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisJICBwcmV2PQorCWVsc2UKKwkgIGRlc3Q9JGFyZworCSAgY29udGludWUKKwlmaQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSB0aGUgYXJndW1lbnQuCisgICAgICBhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qfCIiKQorCWFyZz0iXCIkYXJnXCIiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0ICRFWElUX0ZBSUxVUkUKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgorICAgICAgZWxzZQorCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgorICAgICAgZmkKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCisgICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCisgICAgICBzZXQgZHVtbXkgJGZpbGVzCisgICAgICBpZiB0ZXN0ICIkIyIgLWd0IDI7IHRoZW4KKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0JyBpcyBub3QgYSBkaXJlY3RvcnkiIDE+JjIKKwkkZWNobyAiJGhlbHAiIDE+JjIKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisgICAgZmkKKyAgICBjYXNlICRkZXN0ZGlyIGluCisgICAgW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworICAgICopCisgICAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisJY2FzZSAkZmlsZSBpbgorCSoubG8pIDs7CisJKikKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLiRsaWJleHQpCisJIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKwlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKKwk7OworCisgICAgICAqLmxhKQorCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCWVsc2UKKwkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlyZWxpbmtfY29tbWFuZD0KKwkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwljYXNlICRmaWxlIGluCisJKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSopIC4gLi8kZmlsZSA7OworCWVzYWMKKworCSMgQWRkIHRoZSBsaWJkaXIgdG8gY3VycmVudF9saWJkaXJzIGlmIGl0IGlzIHRoZSBkZXN0aW5hdGlvbi4KKwlpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorCSAgY2FzZSAiJGN1cnJlbnRfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZWxzZQorCSAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorCSAgY2FzZSAiJGZ1dHVyZV9saWJkaXJzICIgaW4KKwkgICoiICRsaWJkaXIgIiopIDs7CisJICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7CisJICBlc2FjCisJZmkKKworCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8KKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQorCWRpcj0iJGRpciRvYmpkaXIiCisKKwlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAjIERldGVybWluZSB0aGUgcHJlZml4IHRoZSB1c2VyIGhhcyBhcHBsaWVkIHRvIG91ciBmdXR1cmUgZGlyLgorCSAgaW5zdF9wcmVmaXhfZGlyPWAkZWNobyAiJGRlc3RkaXIiIHwgJFNFRCAicyUkbGliZGlyXCQlJSJgCisKKwkgICMgRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gcGxhY2UgdXMgb3V0c2lkZSBvZiBvdXIgZXhwZWN0ZWQKKwkgICMgbG9jYXRpb24gYi9jIHRoaXMgcHJldmVudHMgZmluZGluZyBkZXBlbmRlbnQgbGlicmFyaWVzIHRoYXQKKwkgICMgYXJlIGluc3RhbGxlZCB0byB0aGUgc2FtZSBwcmVmaXguCisJICAjIEF0IHByZXNlbnQsIHRoaXMgY2hlY2sgZG9lc24ndCBhZmZlY3Qgd2luZG93cyAuZGxsJ3MgdGhhdAorCSAgIyBhcmUgaW5zdGFsbGVkIGludG8gJGxpYmRpci8uLi9iaW4gKGN1cnJlbnRseSwgdGhhdCB3b3JrcyBmaW5lKQorCSAgIyBidXQgaXQncyBzb21ldGhpbmcgdG8ga2VlcCBhbiBleWUgb24uCisJICBpZiB0ZXN0ICIkaW5zdF9wcmVmaXhfZGlyIiA9ICIkZGVzdGRpciI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogZXJyb3I6IGNhbm5vdCBpbnN0YWxsIFxgJGZpbGUnIHRvIGEgZGlyZWN0b3J5IG5vdCBlbmRpbmcgaW4gJGxpYmRpciIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUtaW5zdC1wcmVmaXgtZGlyICRpbnN0X3ByZWZpeF9kaXIlImAKKwkgIGVsc2UKKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICIkcmVsaW5rX2NvbW1hbmQiIHwgJFNFRCAicyVAaW5zdF9wcmVmaXhfZGlyQCUlImAKKwkgIGZpCisKKwkgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbGlua2luZyBcYCRmaWxlJyIgMT4mMgorCSAgJHNob3cgIiRyZWxpbmtfY29tbWFuZCIKKwkgIGlmICRydW4gZXZhbCAiJHJlbGlua19jb21tYW5kIjsgdGhlbiA6CisJICBlbHNlCisJICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgorCSAgICBleGl0ICRFWElUX0ZBSUxVUkUKKwkgIGZpCisJZmkKKworCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisJc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisJaWYgdGVzdCAtbiAiJDIiOyB0aGVuCisJICByZWFsbmFtZT0iJDIiCisJICBzaGlmdAorCSAgc2hpZnQKKworCSAgc3JjbmFtZT0iJHJlYWxuYW1lIgorCSAgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIiAmJiBzcmNuYW1lPSIkcmVhbG5hbWUiVAorCisJICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPworCSAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRzdHJpcGxpYiI7IHRoZW4KKwkgICAgJHNob3cgIiRzdHJpcGxpYiAkZGVzdGRpci8kcmVhbG5hbWUiCisJICAgICRydW4gZXZhbCAiJHN0cmlwbGliICRkZXN0ZGlyLyRyZWFsbmFtZSIgfHwgZXhpdCAkPworCSAgZmkKKworCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCisJICAgICMgVHJ5IGBsbiAtc2YnIGZpcnN0LCBiZWNhdXNlIHRoZSBgbG4nIGJpbmFyeSBtaWdodCBkZXBlbmQgb24KKwkgICAgIyB0aGUgc3ltbGluayB3ZSByZXBsYWNlISAgU29sYXJpcyAvYmluL2xuIGRvZXMgbm90IHVuZGVyc3RhbmQgLWYsCisJICAgICMgc28gd2UgYWxzbyBuZWVkIHRvIHRyeSBybSAmJiBsbiAtcy4KKwkgICAgZm9yIGxpbmtuYW1lCisJICAgIGRvCisJICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgorICAgICAgICAgICAgICAgICRzaG93ICIoY2QgJGRlc3RkaXIgJiYgeyAkTE5fUyAtZiAkcmVhbG5hbWUgJGxpbmtuYW1lIHx8IHsgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lOyB9OyB9KSIKKyAgICAgICAgICAgICAgICAkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiB7ICRMTl9TIC1mICRyZWFsbmFtZSAkbGlua25hbWUgfHwgeyAkcm0gJGxpbmtuYW1lICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWU7IH07IH0pIgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGZpCisKKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKwkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgY21kcz0kcG9zdGluc3RhbGxfY21kcworCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgeworCSAgICAgIGx0X2V4aXQ9JD8KKworCSAgICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCQkkcnVuIGV2YWwgJyhjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJHtyZWFsbmFtZX1UICYmICRtdiAke3JlYWxuYW1lfVUgJHJlYWxuYW1lKScKKwkgICAgICBmaQorCisJICAgICAgZXhpdCAkbHRfZXhpdAorCSAgICB9CisJICBkb25lCisJICBJRlM9IiRzYXZlX2lmcyIKKwlmaQorCisJIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCisJbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKKwkkc2hvdyAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiCisJJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIgfHwgZXhpdCAkPworCisJIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCisJOzsKKworICAgICAgKi5sbykKKwkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGRlc3RmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorCWZpCisKKwkjIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gb2xkLXN0eWxlIG9iamVjdCBmaWxlLgorCWNhc2UgJGRlc3RmaWxlIGluCisJKi5sbykKKwkgIHN0YXRpY2Rlc3Q9YCRlY2hvICJYJGRlc3RmaWxlIiB8ICRYc2VkIC1lICIkbG8ybyJgCisJICA7OworCSouJG9iamV4dCkKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKKwkgICRlY2hvICIkaGVscCIgMT4mMgorCSAgZXhpdCAkRVhJVF9GQUlMVVJFCisJICA7OworCWVzYWMKKworCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgorCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KKwkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKKwkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KKwlmaQorCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorCisJICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgorCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPworCWZpCisJZXhpdCAkRVhJVF9TVUNDRVNTCisJOzsKKworICAgICAgKikKKwkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisJaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKKwllbHNlCisJICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKKwlmaQorCisJIyBJZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCBhbmQgdGhlcmUgaXMgYSAuZXhlIG9uIHRoZSBlbmQsIHN0cmlwIGl0CisJIyBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IGEgbGlidG9vbCBzY3JpcHQgd2UgYWN0dWFsbHkgd2FudCB0bworCSMgaW5zdGFsbAorCXN0cmlwcGVkX2V4dD0iIgorCWNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZpbGU9YCRlY2hvICRmaWxlfCR7U0VEfSAncywuZXhlJCwsJ2AKKwkgICAgICBzdHJpcHBlZF9leHQ9Ii5leGUiCisJICAgIGZpCisJICAgIDs7CisJZXNhYworCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWNhc2UgJGhvc3QgaW4KKwkqY3lnd2luKnwqbWluZ3cqKQorCSAgICB3cmFwcGVyPWAkZWNobyAkZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKKwkgICAgOzsKKwkqKQorCSAgICB3cmFwcGVyPSRmaWxlCisJICAgIDs7CisJZXNhYworCWlmICgke1NFRH0gLWUgJzRxJyAkd3JhcHBlciB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIik+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgIG5vdGluc3RfZGVwbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICAjIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG9uIGN5Z3dpbi9taW5ndyB0byBhcHBlbmQgYSBkb3QgdG8KKwkgICMgZm9vIGV2ZW4gaWYgYm90aCBmb28gYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKwkgICMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworCSAgIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorCSAgIworCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICR3cmFwcGVyIGluCisJICAqLyogfCAqXFwqKSAuICR7d3JhcHBlcn0gOzsKKwkgICopIC4gLi8ke3dyYXBwZXJ9IDs7CisJICBlc2FjCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgaWYgdGVzdCAteiAiJG5vdGluc3RfZGVwbGlicyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIiAxPiYyCisJICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorCSAgZmkKKworCSAgZmluYWxpemU9eWVzCisJICBmb3IgbGliIGluICRub3RpbnN0X2RlcGxpYnM7IGRvCisJICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgZWFjaCBsaWJyYXJ5IGlzIGluc3RhbGxlZC4KKwkgICAgbGliZGlyPQorCSAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICovKiB8ICpcXCopIC4gJGxpYiA7OworCSAgICAgICopIC4gLi8kbGliIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBsaWJmaWxlPSIkbGliZGlyLyJgJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCAjIyMgdGVzdHN1aXRlOiBza2lwIG5lc3RlZCBxdW90aW5nIHRlc3QKKwkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KKwkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgorCSAgICAgIGZpbmFsaXplPW5vCisJICAgIGZpCisJICBkb25lCisKKwkgIHJlbGlua19jb21tYW5kPQorCSAgIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisJICAjIGZvbyBldmVuIGlmIGJvdGggZm9vIGFuZCBGSUxFLmV4ZSBleGlzdDogYXV0b21hdGljLWFwcGVuZC0uZXhlCisJICAjIGJlaGF2aW9yIGhhcHBlbnMgb25seSBmb3IgZXhlYygzKSwgbm90IGZvciBvcGVuKDIpISAgQWxzbywgc291cmNpbmcKKwkgICMgYEZJTEUuJyBkb2VzIG5vdCB3b3JrIG9uIGN5Z3dpbiBtYW5hZ2VkIG1vdW50cy4KKwkgICMKKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAkd3JhcHBlciBpbgorCSAgKi8qIHwgKlxcKikgLiAke3dyYXBwZXJ9IDs7CisJICAqKSAuIC4vJHt3cmFwcGVyfSA7OworCSAgZXNhYworCisJICBvdXRwdXRuYW1lPQorCSAgaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSBubyAmJiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXMgJiYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgICAgICB0bXBkaXI9YGZ1bmNfbWt0ZW1wZGlyYAorCSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisJICAgICAgb3V0cHV0bmFtZT0iJHRtcGRpci8kZmlsZSIKKwkgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dG5hbWUiJyVnJ2AKKworCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCisJICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKKwkgICAgICBlbHNlCisJCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgorCQkke3JtfXIgIiR0bXBkaXIiCisJCWNvbnRpbnVlCisJICAgICAgZmkKKwkgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKKwkgICAgZWxzZQorCSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNhbm5vdCByZWxpbmsgXGAkZmlsZSciIDE+JjIKKwkgICAgZmkKKwkgIGVsc2UKKwkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgorCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlJHN0cmlwcGVkX2V4dCIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKKwkgIGZpCisJZmkKKworCSMgcmVtb3ZlIC5leGUgc2luY2UgY3lnd2luIC91c3IvYmluL2luc3RhbGwgd2lsbCBhcHBlbmQgYW5vdGhlcgorCSMgb25lIGFueXdheSAKKwljYXNlICRpbnN0YWxsX3Byb2csJGhvc3QgaW4KKwkqL3Vzci9iaW4vaW5zdGFsbCosKmN5Z3dpbiopCisJICBjYXNlICRmaWxlOiRkZXN0ZmlsZSBpbgorCSAgKi5leGU6Ki5leGUpCisJICAgICMgdGhpcyBpcyBvaworCSAgICA7OworCSAgKi5leGU6KikKKwkgICAgZGVzdGZpbGU9JGRlc3RmaWxlLmV4ZQorCSAgICA7OworCSAgKjoqLmV4ZSkKKwkgICAgZGVzdGZpbGU9YCRlY2hvICRkZXN0ZmlsZSB8ICR7U0VEfSAtZSAncywuZXhlJCwsJ2AKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCSRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3RmaWxlIgorCSRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgfHwgZXhpdCAkPworCXRlc3QgLW4gIiRvdXRwdXRuYW1lIiAmJiAke3JtfXIgIiR0bXBkaXIiCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KKyAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworICAgICAgIyBTZXQgdXAgdGhlIHJhbmxpYiBwYXJhbWV0ZXJzLgorICAgICAgb2xkbGliPSIkZGVzdGRpci8kbmFtZSIKKworICAgICAgJHNob3cgIiRpbnN0YWxsX3Byb2cgJGZpbGUgJG9sZGxpYiIKKyAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiIHx8IGV4aXQgJD8KKworICAgICAgaWYgdGVzdCAtbiAiJHN0cmlwbWUiICYmIHRlc3QgLW4gIiRvbGRfc3RyaXBsaWIiOyB0aGVuCisJJHNob3cgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIKKwkkcnVuIGV2YWwgIiRvbGRfc3RyaXBsaWIgJG9sZGxpYiIgfHwgZXhpdCAkPworICAgICAgZmkKKworICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3RpbnN0YWxsIGNvbW1hbmRzLgorICAgICAgY21kcz0kb2xkX3Bvc3RpbnN0YWxsX2NtZHMKKyAgICAgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwlJRlM9IiRzYXZlX2lmcyIKKwlldmFsIGNtZD1cIiRjbWRcIgorCSRzaG93ICIkY21kIgorCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAtbiAiJGZ1dHVyZV9saWJkaXJzIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVtZW1iZXIgdG8gcnVuIFxgJHByb2duYW1lIC0tZmluaXNoJGZ1dHVyZV9saWJkaXJzJyIgMT4mMgorICAgIGZpCisKKyAgICBpZiB0ZXN0IC1uICIkY3VycmVudF9saWJkaXJzIjsgdGhlbgorICAgICAgIyBNYXliZSBqdXN0IGRvIGEgZHJ5IHJ1bi4KKyAgICAgIHRlc3QgLW4gIiRydW4iICYmIGN1cnJlbnRfbGliZGlycz0iIC1uJGN1cnJlbnRfbGliZGlycyIKKyAgICAgIGV4ZWNfY21kPSckU0hFTEwgJHByb2dwYXRoICRwcmVzZXJ2ZV9hcmdzIC0tZmluaXNoJGN1cnJlbnRfbGliZGlycycKKyAgICBlbHNlCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorICAgIDs7CisKKyAgIyBsaWJ0b29sIGZpbmlzaCBtb2RlCisgIGZpbmlzaCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBmaW5pc2giCisgICAgbGliZGlycz0iJG5vbm9wdCIKKyAgICBhZG1pbmNtZHM9CisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGRpcgorICAgICAgZG8KKwlsaWJkaXJzPSIkbGliZGlycyAkZGlyIgorICAgICAgZG9uZQorCisgICAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbworCWlmIHRlc3QgLW4gIiRmaW5pc2hfY21kcyI7IHRoZW4KKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBmaW5pc2ggY29tbWFuZHMuCisJICBjbWRzPSRmaW5pc2hfY21kcworCSAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZXZhbCBjbWQ9XCIkY21kXCIKKwkgICAgJHNob3cgIiRjbWQiCisJICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisgICAgICAgJGNtZCIKKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCWZpCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgorCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKKwkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcworICAgICAgICRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgorICAgIHRlc3QgIiRzaG93IiA9IDogJiYgZXhpdCAkRVhJVF9TVUNDRVNTCisKKyAgICAkZWNobyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKKyAgICAkZWNobyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgorICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisgICAgICAkZWNobyAiICAgJGxpYmRpciIKKyAgICBkb25lCisgICAgJGVjaG8KKyAgICAkZWNobyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCisgICAgJGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgorICAgICRlY2hvICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgorICAgICRlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgICRlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICAkZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICAkZWNobyAiICAgICBkdXJpbmcgbGlua2luZyIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgbGliZGlyPUxJQkRJUgorICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisgICAgICAkZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KKyAgICAgICRlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgICAkZWNobyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCisgICAgZmkKKyAgICAkZWNobworICAgICRlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKKyAgICAkZWNobyAibW9yZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgbGQoMSkgYW5kIGxkLnNvKDgpIG1hbnVhbCBwYWdlcy4iCisgICAgJGVjaG8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgOzsKKworICAjIGxpYnRvb2wgZXhlY3V0ZSBtb2RlCisgIGV4ZWN1dGUpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZXhlY3V0ZSIKKworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIGlmIHRlc3QgLXogIiRjbWQiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgQ09NTUFORCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgICMgSGFuZGxlIC1kbG9wZW4gZmxhZ3MgaW1tZWRpYXRlbHkuCisgICAgZm9yIGZpbGUgaW4gJGV4ZWN1dGVfZGxmaWxlczsgZG8KKyAgICAgIGlmIHRlc3QgISAtZiAiJGZpbGUiOyB0aGVuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAkZmlsZScgaXMgbm90IGEgZmlsZSIgMT4mMgorCSRlY2hvICIkaGVscCIgMT4mMgorCWV4aXQgJEVYSVRfRkFJTFVSRQorICAgICAgZmkKKworICAgICAgZGlyPQorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5sYSkKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorCSAgJGVjaG8gIiRoZWxwIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCisJIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCisJZGxuYW1lPQorCWxpYnJhcnlfbmFtZXM9CisKKwkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKwljYXNlICRmaWxlIGluCisJKi8qIHwgKlxcKikgLiAkZmlsZSA7OworCSopIC4gLi8kZmlsZSA7OworCWVzYWMKKworCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgorCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisJICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCisJICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCisJICBjb250aW51ZQorCWZpCisKKwlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgorCisJaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCisJICBkaXI9IiRkaXIvJG9iamRpciIKKwllbHNlCisJICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCisJICBleGl0ICRFWElUX0ZBSUxVUkUKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgorCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisJOzsKKworICAgICAgKikKKwkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCisJY29udGludWUKKwk7OworICAgICAgZXNhYworCisgICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCisgICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCisgICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCisKKyAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCisgICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKKyAgICAgIGVsc2UKKwlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCisgICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgorCisgICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgorICAgIGFyZ3M9CisgICAgZm9yIGZpbGUKKyAgICBkbworICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgLSopIDs7CisgICAgICAqKQorCSMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKwlpZiAoJHtTRUR9IC1lICc0cScgJGZpbGUgfCBncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJICBjYXNlICRmaWxlIGluCisJICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJICAqKSAuIC4vJGZpbGUgOzsKKwkgIGVzYWMKKworCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgICMgUXVvdGUgYXJndW1lbnRzICh0byBwcmVzZXJ2ZSBzaGVsbCBtZXRhY2hhcmFjdGVycykuCisgICAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGFyZ3M9IiRhcmdzIFwiJGZpbGVcIiIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJIyBFeHBvcnQgdGhlIHNobGlicGF0aF92YXIuCisJZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKworICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgICAgaWYgdGVzdCAiJHtzYXZlX0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbgorCUxDX0FMTD0iJHNhdmVfTENfQUxMIjsgZXhwb3J0IExDX0FMTAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiR7c2F2ZV9MQU5HK3NldH0iID0gc2V0OyB0aGVuCisJTEFORz0iJHNhdmVfTEFORyI7IGV4cG9ydCBMQU5HCisgICAgICBmaQorCisgICAgICAjIE5vdyBwcmVwYXJlIHRvIGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCisgICAgICBleGVjX2NtZD0iXCRjbWQkYXJncyIKKyAgICBlbHNlCisgICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgorICAgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisJZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKKwkkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgZmkKKyAgICAgICRlY2hvICIkY21kJGFyZ3MiCisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICBmaQorICAgIDs7CisKKyAgIyBsaWJ0b29sIGNsZWFuIGFuZCB1bmluc3RhbGwgbW9kZQorICBjbGVhbiB8IHVuaW5zdGFsbCkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiAkbW9kZSIKKyAgICBybT0iJG5vbm9wdCIKKyAgICBmaWxlcz0KKyAgICBybWZvcmNlPQorICAgIGV4aXRfc3RhdHVzPTAKKworICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgorICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgorICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgorCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1mKSBybT0iJHJtICRhcmciOyBybWZvcmNlPXllcyA7OworICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKKyAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgZmkKKworICAgIHJtZGlycz0KKworICAgIG9yaWdvYmpkaXI9IiRvYmpkaXIiCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIjsgdGhlbgorCWRpcj0uCisJb2JqZGlyPSIkb3JpZ29iamRpciIKKyAgICAgIGVsc2UKKwlvYmpkaXI9IiRkaXIvJG9yaWdvYmpkaXIiCisgICAgICBmaQorICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgICAgdGVzdCAiJG1vZGUiID0gdW5pbnN0YWxsICYmIG9iamRpcj0iJGRpciIKKworICAgICAgIyBSZW1lbWJlciBvYmpkaXIgZm9yIHJlbW92YWwgbGF0ZXIsIGJlaW5nIGNhcmVmdWwgdG8gYXZvaWQgZHVwbGljYXRlcworICAgICAgaWYgdGVzdCAiJG1vZGUiID0gY2xlYW47IHRoZW4KKwljYXNlICIgJHJtZGlycyAiIGluCisJICAqIiAkb2JqZGlyICIqKSA7OworCSAgKikgcm1kaXJzPSIkcm1kaXJzICRvYmpkaXIiIDs7CisJZXNhYworICAgICAgZmkKKworICAgICAgIyBEb24ndCBlcnJvciBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCBybSAtZiB3YXMgdXNlZC4KKyAgICAgIGlmICh0ZXN0IC1MICIkZmlsZSIpID4vZGV2L251bGwgMj4mMSBcCisJfHwgKHRlc3QgLWggIiRmaWxlIikgPi9kZXYvbnVsbCAyPiYxIFwKKwl8fCB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwk6CisgICAgICBlbGlmIHRlc3QgLWQgIiRmaWxlIjsgdGhlbgorCWV4aXRfc3RhdHVzPTEKKwljb250aW51ZQorICAgICAgZWxpZiB0ZXN0ICIkcm1mb3JjZSIgPSB5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZmkKKworICAgICAgcm1maWxlcz0iJGZpbGUiCisKKyAgICAgIGNhc2UgJG5hbWUgaW4KKyAgICAgICoubGEpCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgYXJjaGl2ZSwgc28gdmVyaWZ5IGl0LgorCWlmICgke1NFRH0gLWUgJzJxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAuICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuIgorCSAgZG9uZQorCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRvbGRfbGlicmFyeSIKKworCSAgY2FzZSAiJG1vZGUiIGluCisJICBjbGVhbikKKwkgICAgY2FzZSAiICAkbGlicmFyeV9uYW1lcyAiIGluCisJICAgICMgIiAgIiBpbiB0aGUgYmVnaW5uaW5nIGNhdGNoZXMgZW1wdHkgJGRsbmFtZQorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRkbG5hbWUiIDs7CisJICAgIGVzYWMKKwkgICAgIHRlc3QgLW4gIiRsaWJkaXIiICYmIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9aSIKKwkgICAgOzsKKwkgIHVuaW5zdGFsbCkKKwkgICAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgY21kcz0kcG9zdHVuaW5zdGFsbF9jbWRzCisJICAgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkJSUZTPSIkc2F2ZV9pZnMiCisJCWV2YWwgY21kPVwiJGNtZFwiCisJCSRzaG93ICIkY21kIgorCQkkcnVuIGV2YWwgIiRjbWQiCisJCWlmIHRlc3QgIiQ/IiAtbmUgMCAmJiB0ZXN0ICIkcm1mb3JjZSIgIT0geWVzOyB0aGVuCisJCSAgZXhpdF9zdGF0dXM9MQorCQlmaQorCSAgICAgIGRvbmUKKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIG9sZF9wb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgorCSAgICAgIGNtZHM9JG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMKKwkgICAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworCQlJRlM9IiRzYXZlX2lmcyIKKwkJZXZhbCBjbWQ9XCIkY21kXCIKKwkJJHNob3cgIiRjbWQiCisJCSRydW4gZXZhbCAiJGNtZCIKKwkJaWYgdGVzdCAiJD8iIC1uZSAwICYmIHRlc3QgIiRybWZvcmNlIiAhPSB5ZXM7IHRoZW4KKwkJICBleGl0X3N0YXR1cz0xCisJCWZpCisJICAgICAgZG9uZQorCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBmaQorCSAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCTs7CisKKyAgICAgICoubG8pCisJIyBQb3NzaWJseSBhIGxpYnRvb2wgb2JqZWN0LCBzbyB2ZXJpZnkgaXQuCisJaWYgKCR7U0VEfSAtZSAnMnEnICRmaWxlIHwgZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgLiAkZGlyLyRuYW1lCisKKwkgICMgQWRkIFBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJHBpY19vYmplY3QiIFwKKwkgICAgICYmIHRlc3QgIiRwaWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJHBpY19vYmplY3QiCisJICBmaQorCisJICAjIEFkZCBub24tUElDIG9iamVjdCB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byByZW1vdmUuCisJICBpZiB0ZXN0IC1uICIkbm9uX3BpY19vYmplY3QiIFwKKwkgICAgICYmIHRlc3QgIiRub25fcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRub25fcGljX29iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqKQorCWlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuIDsgdGhlbgorCSAgbm9leGVuYW1lPSRuYW1lCisJICBjYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgZmlsZT1gJGVjaG8gJGZpbGV8JHtTRUR9ICdzLC5leGUkLCwnYAorCSAgICBub2V4ZW5hbWU9YCRlY2hvICRuYW1lfCR7U0VEfSAncywuZXhlJCwsJ2AKKwkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAorCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmICgke1NFRH0gLWUgJzRxJyAkZmlsZSB8IGdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgICAuICRkaXIvJG5vZXhlbmFtZQorCisJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CisJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0ke25vZXhlbmFtZX0uYyIKKwkgICAgZmkKKwkgIGZpCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgJHNob3cgIiRybSAkcm1maWxlcyIKKyAgICAgICRydW4gJHJtICRybWZpbGVzIHx8IGV4aXRfc3RhdHVzPTEKKyAgICBkb25lCisgICAgb2JqZGlyPSIkb3JpZ29iamRpciIKKworICAgICMgVHJ5IHRvIHJlbW92ZSB0aGUgJHtvYmpkaXJ9cyBpbiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgd2UgZGVsZXRlZCBmaWxlcworICAgIGZvciBkaXIgaW4gJHJtZGlyczsgZG8KKyAgICAgIGlmIHRlc3QgLWQgIiRkaXIiOyB0aGVuCisJJHNob3cgInJtZGlyICRkaXIiCisJJHJ1biBybWRpciAkZGlyID4vZGV2L251bGwgMj4mMQorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBleGl0ICRleGl0X3N0YXR1cworICAgIDs7CisKKyAgIiIpCisgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIE1PREUiIDE+JjIKKyAgICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICAgIGV4aXQgJEVYSVRfRkFJTFVSRQorICAgIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC16ICIkZXhlY19jbWQiOyB0aGVuCisgICAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAgICRlY2hvICIkZ2VuZXJpY19oZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIGZpCitmaSAjIHRlc3QgLXogIiRzaG93X2hlbHAiCisKK2lmIHRlc3QgLW4gIiRleGVjX2NtZCI7IHRoZW4KKyAgZXZhbCBleGVjICRleGVjX2NtZAorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKKyMgV2UgbmVlZCB0byBkaXNwbGF5IGhlbHAgZm9yIGVhY2ggb2YgdGhlIG1vZGVzLgorY2FzZSAkbW9kZSBpbgorIiIpICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIFtNT0RFLUFSR10uLi4KKworUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisKKyAgICAtLWNvbmZpZyAgICAgICAgICBzaG93IGFsbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcworICAgIC0tZGVidWcgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKKy1uLCAtLWRyeS1ydW4gICAgICAgICBkaXNwbGF5IGNvbW1hbmRzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueSBmaWxlcworICAgIC0tZmVhdHVyZXMgICAgICAgIGRpc3BsYXkgYmFzaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAgIC0tZmluaXNoICAgICAgICAgIHNhbWUgYXMgXGAtLW1vZGU9ZmluaXNoJworICAgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAtLW1vZGU9TU9ERSAgICAgICB1c2Ugb3BlcmF0aW9uIG1vZGUgTU9ERSBbZGVmYXVsdD1pbmZlcnJlZCBmcm9tIE1PREUtQVJHU10KKyAgICAtLXF1aWV0ICAgICAgICAgICBzYW1lIGFzIFxgLS1zaWxlbnQnCisgICAgLS1zaWxlbnQgICAgICAgICAgZG9uJ3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworICAgIC0tdGFnPVRBRyAgICAgICAgIHVzZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tIHRhZyBUQUcKKyAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisKK01PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgY2xlYW4gICAgICAgICAgIHJlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkKKyAgICAgIGNvbXBpbGUgICAgICAgICBjb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgb2JqZWN0CisgICAgICBleGVjdXRlICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KKyAgICAgIGZpbmlzaCAgICAgICAgICBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzCisgICAgICBpbnN0YWxsICAgICAgICAgaW5zdGFsbCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMKKyAgICAgIGxpbmsgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKKyAgICAgIHVuaW5zdGFsbCAgICAgICByZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGVkIGRpcmVjdG9yeQorCitNT0RFLUFSR1MgdmFyeSBkZXBlbmRpbmcgb24gdGhlIE1PREUuICBUcnkgXGAkbW9kZW5hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IKK2EgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBNT0RFLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWxpYnRvb2xAZ251Lm9yZz4uIgorICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgOzsKKworY2xlYW4pCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1jbGVhbiBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBmaWxlcyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnkuCisKK1JNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQorKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAordG8gUk0uCisKK0lmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIG9iamVjdCBvciBwcm9ncmFtLCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQKK3dpdGggaXQgYXJlIGRlbGV0ZWQuIE90aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgOzsKKworY29tcGlsZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKKworQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgorCitUaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKKyAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKKyAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1zdGF0aWMgICAgICAgICAgIGFsd2F5cyBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisKK0NPTVBJTEUtQ09NTUFORCBpcyBhIGNvbW1hbmQgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyBhIFxgc3RhbmRhcmQnIG9iamVjdCBmaWxlCitmcm9tIHRoZSBnaXZlbiBTT1VSQ0VGSUxFLgorCitUaGUgb3V0cHV0IGZpbGUgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IGZyb20KK1NPVVJDRUZJTEUsIHRoZW4gc3Vic3RpdHV0aW5nIHRoZSBDIHNvdXJjZSBjb2RlIHN1ZmZpeCBcYC5jJyB3aXRoIHRoZQorbGlicmFyeSBvYmplY3Qgc3VmZml4LCBcYC5sbycuIgorICA7OworCitleGVjdXRlKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZXhlY3V0ZSBDT01NQU5EIFtBUkdTXS4uLgorCitBdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbS4KKworVGhpcyBtb2RlIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKKyAgLWRsb3BlbiBGSUxFICAgICAgYWRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIHRvIHRoZSBsaWJyYXJ5IHBhdGgKKworVGhpcyBtb2RlIHNldHMgdGhlIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhY2NvcmRpbmcgdG8gXGAtZGxvcGVuJworZmxhZ3MuCisKK0lmIGFueSBvZiB0aGUgQVJHUyBhcmUgbGlidG9vbCBleGVjdXRhYmxlIHdyYXBwZXJzLCB0aGVuIHRoZXkgYXJlIHRyYW5zbGF0ZWQKK2ludG8gdGhlaXIgY29ycmVzcG9uZGluZyB1bmluc3RhbGxlZCBiaW5hcnksIGFuZCBhbnkgb2YgdGhlaXIgcmVxdWlyZWQgbGlicmFyeQorZGlyZWN0b3JpZXMgYXJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IHBhdGguCisKK1RoZW4sIENPTU1BTkQgaXMgZXhlY3V0ZWQsIHdpdGggQVJHUyBhcyBhcmd1bWVudHMuIgorICA7OworCitmaW5pc2gpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1maW5pc2ggW0xJQkRJUl0uLi4KKworQ29tcGxldGUgdGhlIGluc3RhbGxhdGlvbiBvZiBsaWJ0b29sIGxpYnJhcmllcy4KKworRWFjaCBMSUJESVIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBsaWJ0b29sIGxpYnJhcmllcy4KKworVGhlIGNvbW1hbmRzIHRoYXQgdGhpcyBtb2RlIGV4ZWN1dGVzIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLiAgVXNlCit0aGUgXGAtLWRyeS1ydW4nIG9wdGlvbiBpZiB5b3UganVzdCB3YW50IHRvIHNlZSB3aGF0IHdvdWxkIGJlIGV4ZWN1dGVkLiIKKyAgOzsKKworaW5zdGFsbCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWluc3RhbGwgSU5TVEFMTC1DT01NQU5ELi4uCisKK0luc3RhbGwgZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzLgorCitJTlNUQUxMLUNPTU1BTkQgaXMgdGhlIGluc3RhbGxhdGlvbiBjb21tYW5kLiAgVGhlIGZpcnN0IGNvbXBvbmVudCBzaG91bGQgYmUKK2VpdGhlciB0aGUgXGBpbnN0YWxsJyBvciBcYGNwJyBwcm9ncmFtLgorCitUaGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgYXJndW1lbnRzIHRvIHRoYXQgY29tbWFuZCAob25seQorQlNELWNvbXBhdGlibGUgaW5zdGFsbCBvcHRpb25zIGFyZSByZWNvZ25pemVkKS4iCisgIDs7CisKK2xpbmspCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1saW5rIExJTkstQ09NTUFORC4uLgorCitMaW5rIG9iamVjdCBmaWxlcyBvciBsaWJyYXJpZXMgdG9nZXRoZXIgdG8gZm9ybSBhbm90aGVyIGxpYnJhcnksIG9yIHRvCitjcmVhdGUgYW4gZXhlY3V0YWJsZSBwcm9ncmFtLgorCitMSU5LLUNPTU1BTkQgaXMgYSBjb21tYW5kIHVzaW5nIHRoZSBDIGNvbXBpbGVyIHRoYXQgeW91IHdvdWxkIHVzZSB0byBjcmVhdGUKK2EgcHJvZ3JhbSBmcm9tIHNldmVyYWwgb2JqZWN0IGZpbGVzLgorCitUaGUgZm9sbG93aW5nIGNvbXBvbmVudHMgb2YgTElOSy1DT01NQU5EIGFyZSB0cmVhdGVkIHNwZWNpYWxseToKKworICAtYWxsLXN0YXRpYyAgICAgICBkbyBub3QgZG8gYW55IGR5bmFtaWMgbGlua2luZyBhdCBhbGwKKyAgLWF2b2lkLXZlcnNpb24gICAgZG8gbm90IGFkZCBhIHZlcnNpb24gc3VmZml4IGlmIHBvc3NpYmxlCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBsdF9wcmVsb2FkZWRfc3ltYm9scworICAtZXhwb3J0LWR5bmFtaWMgICBhbGxvdyBzeW1ib2xzIGZyb20gT1VUUFVULUZJTEUgdG8gYmUgcmVzb2x2ZWQgd2l0aCBkbHN5bSgzKQorICAtZXhwb3J0LXN5bWJvbHMgU1lNRklMRQorCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCisgIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAorCQkgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIG1hdGNoaW5nIFJFR0VYCisgIC1MTElCRElSICAgICAgICAgIHNlYXJjaCBMSUJESVIgZm9yIHJlcXVpcmVkIGluc3RhbGxlZCBsaWJyYXJpZXMKKyAgLWxOQU1FICAgICAgICAgICAgT1VUUFVULUZJTEUgcmVxdWlyZXMgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGxpYk5BTUUKKyAgLW1vZHVsZSAgICAgICAgICAgYnVpbGQgYSBsaWJyYXJ5IHRoYXQgY2FuIGRsb3BlbmVkCisgIC1uby1mYXN0LWluc3RhbGwgIGRpc2FibGUgdGhlIGZhc3QtaW5zdGFsbCBtb2RlCisgIC1uby1pbnN0YWxsICAgICAgIGxpbmsgYSBub3QtaW5zdGFsbGFibGUgZXhlY3V0YWJsZQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1vYmplY3RsaXN0IEZJTEUgIFVzZSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIGZvdW5kIGluIEZJTEUgdG8gc3BlY2lmeSBvYmplY3RzCisgIC1wcmVjaW91cy1maWxlcy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICBkb24ndCByZW1vdmUgb3V0cHV0IGZpbGVzIG1hdGNoaW5nIFJFR0VYCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLVJbIF1MSUJESVIgICAgICAgYWRkIExJQkRJUiB0byB0aGUgcnVudGltZSBwYXRoIG9mIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKKyAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KKwkJICAgIHNwZWNpZnkgbGlicmFyeSB2ZXJzaW9uIGluZm8gW2VhY2ggdmFyaWFibGUgZGVmYXVsdHMgdG8gMF0KKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAorb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcworcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCit1c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKK2lzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgIDs7CisKK3VuaW5zdGFsbCkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KK090aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgOzsKKworKikKKyAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIDs7Citlc2FjCisKKyRlY2hvCiskZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgorCitleGl0ICQ/CisKKyMgVGhlIFRBR3MgYmVsb3cgYXJlIGRlZmluZWQgc3VjaCB0aGF0IHdlIG5ldmVyIGdldCBpbnRvIGEgc2l0dWF0aW9uCisjIGluIHdoaWNoIHdlIGRpc2FibGUgYm90aCBraW5kcyBvZiBsaWJyYXJpZXMuICBHaXZlbiBjb25mbGljdGluZworIyBjaG9pY2VzLCB3ZSBnbyBmb3IgYSBzdGF0aWMgbGlicmFyeSwgdGhhdCBpcyB0aGUgbW9zdCBwb3J0YWJsZSwKKyMgc2luY2Ugd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHNoYXJlZCBsaWJyYXJpZXMgd2VyZSBkaXNhYmxlZCBiZWNhdXNlCisjIHRoZSB1c2VyIGFza2VkIGZvciB0aGF0IG9yIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydAorIyB0aGVtLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIEFJWCwgYmVjYXVzZSB3ZSBkb24ndAorIyBzdXBwb3J0IGhhdmluZyBib3RoIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBlbmFibGVkIGF0IHRoZSBzYW1lCisjIHRpbWUgb24gdGhhdCBwbGF0Zm9ybSwgc28gd2UgZGVmYXVsdCB0byBhIHNoYXJlZC1vbmx5IGNvbmZpZ3VyYXRpb24uCisjIElmIGEgZGlzYWJsZS1zaGFyZWQgdGFnIGlzIGdpdmVuLCB3ZSdsbCBmYWxsYmFjayB0byBhIHN0YXRpYy1vbmx5CisjIGNvbmZpZ3VyYXRpb24uICBCdXQgd2UnbGwgbmV2ZXIgZ28gZnJvbSBzdGF0aWMtb25seSB0byBzaGFyZWQtb25seS4KKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXNoYXJlZAorZGlzYWJsZV9saWJzPXNoYXJlZAorIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworZGlzYWJsZV9saWJzPXN0YXRpYworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zdGF0aWMKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvY29uZnRvb2xzL21raW5zdGFsbGRpcnMgYi9leHBhdC0yLjAuMS9jb25mdG9vbHMvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTI5MWRiCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvY29uZnRvb2xzL21raW5zdGFsbGRpcnMKQEAgLTAsMCArMSw0MCBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKyMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbgorCisjICRJZDogbWtpbnN0YWxsZGlycyx2IDEuMSAyMDAwLzA5LzE4IDE2OjI2OjIxIGNvb3BlcmNjIEV4cCAkCisKK2VycnN0YXR1cz0wCisKK2ZvciBmaWxlCitkbworICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKKyAgIHNoaWZ0CisKKyAgIHBhdGhjb21wPQorICAgZm9yIGQKKyAgIGRvCisgICAgIHBhdGhjb21wPSIkcGF0aGNvbXAkZCIKKyAgICAgY2FzZSAiJHBhdGhjb21wIiBpbgorICAgICAgIC0qICkgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKyAgICAgZXNhYworCisgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiCisKKyAgICAgICAgbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisgICAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAJICBlcnJzdGF0dXM9JGxhc3RlcnIKKyAgICAgICAgZmkKKyAgICAgZmkKKworICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKKyAgIGRvbmUKK2RvbmUKKworZXhpdCAkZXJyc3RhdHVzCisKKyMgbWtpbnN0YWxsZGlycyBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2RvYy9leHBhdC5wbmcgYi9leHBhdC0yLjAuMS9kb2MvZXhwYXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViYzA3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9kb2MvZXhwYXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2RvYy9yZWZlcmVuY2UuaHRtbCBiL2V4cGF0LTIuMC4xL2RvYy9yZWZlcmVuY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMzE1ODcwCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvZG9jL3JlZmVyZW5jZS5odG1sCkBAIC0wLDAgKzEsMjM0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPCEtLSBDb3B5cmlnaHQgMTk5OSwyMDAwIENsYXJrIENvb3BlciA8Y29vcGVyY2NAbmV0aGVhdmVuLmNvbT4KKyAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiBZb3UgbWF5IGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IGFjY29yZGluZyB0bworICAgICB0aGUgdGVybXMgb2YgdGhlIE1JVC9YIExpY2Vuc2UgLS0+CisgIDx0aXRsZT5FeHBhdCBYTUwgUGFyc2VyPC90aXRsZT4KKyAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJDbGFyayBDb29wZXIsIGNvb3BlcmNjQG5ldGhlYXZlbi5jb20iIC8+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CisgIDxsaW5rIGhyZWY9InN0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKzwvaGVhZD4KKzxib2R5PgorICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkIGNsYXNzPSJjb3JuZXIiPjxpbWcgc3JjPSJleHBhdC5wbmciIGFsdD0iKEV4cGF0IGxvZ28pIiAvPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImJhbm5lciI+PGgxPlRoZSBFeHBhdCBYTUwgUGFyc2VyPC9oMT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIGNsYXNzPSJyZWxlYXNlbm8iPlJlbGVhc2UgMi4wLjE8L3RkPgorICAgICAgPHRkPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPgorCis8cD5FeHBhdCBpcyBhIGxpYnJhcnksIHdyaXR0ZW4gaW4gQywgZm9yIHBhcnNpbmcgWE1MIGRvY3VtZW50cy4gSXQncwordGhlIHVuZGVybHlpbmcgWE1MIHBhcnNlciBmb3IgdGhlIG9wZW4gc291cmNlIE1vemlsbGEgcHJvamVjdCwgUGVybCdzCis8Y29kZT5YTUw6OlBhcnNlcjwvY29kZT4sIFB5dGhvbidzIDxjb2RlPnhtbC5wYXJzZXJzLmV4cGF0PC9jb2RlPiwgYW5kCitvdGhlciBvcGVuLXNvdXJjZSBYTUwgcGFyc2Vycy48L3A+CisKKzxwPlRoaXMgbGlicmFyeSBpcyB0aGUgY3JlYXRpb24gb2YgSmFtZXMgQ2xhcmssIHdobydzIGFsc28gZ2l2ZW4gdXMKK2dyb2ZmIChhbiBucm9mZiBsb29rLWFsaWtlKSwgSmFkZSAoYW4gaW1wbGVtZW50aW9uIG9mIElTTydzIERTU1NMCitzdHlsZXNoZWV0IGxhbmd1YWdlIGZvciBTR01MKSwgWFAgKGEgSmF2YSBYTUwgcGFyc2VyIHBhY2thZ2UpLCBYVCAoYQorSmF2YSBYU0wgZW5naW5lKS4gIEphbWVzIHdhcyBhbHNvIHRoZSB0ZWNobmljYWwgbGVhZCBvbiB0aGUgWE1MCitXb3JraW5nIEdyb3VwIGF0IFczQyB0aGF0IHByb2R1Y2VkIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi48L3A+CisKKzxwPlRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgbGljZW5zZWQgdW5kZXIgdGhlIDxhCitocmVmPSIuLi9DT1BZSU5HIj5NSVQvWCBDb25zb3J0aXVtIGxpY2Vuc2U8L2E+LiBZb3UgbWF5IGRvd25sb2FkIGl0Citmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cubGliZXhwYXQub3JnLyI+dGhlIEV4cGF0IGhvbWUgcGFnZTwvYT4uCis8L3A+CisKKzxwPlRoZSBidWxrIG9mIHRoaXMgZG9jdW1lbnQgd2FzIG9yaWdpbmFsbHkgY29tbWlzc2lvbmVkIGFzIGFuIGFydGljbGUKK2J5IDxhIGhyZWY9Imh0dHA6Ly93d3cueG1sLmNvbS8iPlhNTC5jb208L2E+LiBUaGV5IGdyYWNpb3VzbHkgYWxsb3dlZAorQ2xhcmsgQ29vcGVyIHRvIHJldGFpbiBjb3B5cmlnaHQgYW5kIHRvIGRpc3RyaWJ1dGUgaXQgd2l0aCBFeHBhdC4KK1RoaXMgdmVyc2lvbiBoYXMgYmVlbiBzdWJzdGFudGlhbGx5IGV4dGVuZGVkIHRvIGluY2x1ZGUgZG9jdW1lbnRhdGlvbgorb24gZmVhdHVyZXMgd2hpY2ggaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIHRoZSBvcmlnaW5hbCBhcnRpY2xlIHdhcworcHVibGlzaGVkLCBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgb3JpZ2luYWwKK2ludGVyZmFjZS48L3A+CisKKzxociAvPgorPGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9IiNvdmVydmlldyI+T3ZlcnZpZXc8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNidWlsZGluZyI+QnVpbGRpbmcgYW5kIEluc3RhbGxpbmc8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiN1c2luZyI+VXNpbmcgRXhwYXQ8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNyZWZlcmVuY2UiPlJlZmVyZW5jZTwvYT4KKyAgPHVsPgorICAgIDxsaT48YSBocmVmPSIjY3JlYXRpb24iPlBhcnNlciBDcmVhdGlvbiBGdW5jdGlvbnM8L2E+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfUGFyc2VyQ3JlYXRlIj5YTUxfUGFyc2VyQ3JlYXRlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9QYXJzZXJDcmVhdGVOUyI+WE1MX1BhcnNlckNyZWF0ZU5TPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9QYXJzZXJDcmVhdGVfTU0iPlhNTF9QYXJzZXJDcmVhdGVfTU08L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlIj5YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGU8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1BhcnNlckZyZWUiPlhNTF9QYXJzZXJGcmVlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9QYXJzZXJSZXNldCI+WE1MX1BhcnNlclJlc2V0PC9hPjwvbGk+CisgICAgPC91bD4KKyAgICA8L2xpPgorICAgIDxsaT48YSBocmVmPSIjcGFyc2luZyI+UGFyc2luZyBGdW5jdGlvbnM8L2E+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfUGFyc2UiPlhNTF9QYXJzZTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfUGFyc2VCdWZmZXIiPlhNTF9QYXJzZUJ1ZmZlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0QnVmZmVyIj5YTUxfR2V0QnVmZmVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TdG9wUGFyc2VyIj5YTUxfU3RvcFBhcnNlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfUmVzdW1lUGFyc2VyIj5YTUxfUmVzdW1lUGFyc2VyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9HZXRQYXJzaW5nU3RhdHVzIj5YTUxfR2V0UGFyc2luZ1N0YXR1czwvYT48L2xpPgorICAgIDwvdWw+CisgICAgPC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI3NldHRpbmciPkhhbmRsZXIgU2V0dGluZyBGdW5jdGlvbnM8L2E+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlciI+WE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyIj5YTUxfU2V0RW5kRWxlbWVudEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEVsZW1lbnRIYW5kbGVyIj5YTUxfU2V0RWxlbWVudEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIj5YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIiPlhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRDb21tZW50SGFuZGxlciI+WE1MX1NldENvbW1lbnRIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIiPlhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIiPlhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyIj5YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RGVmYXVsdEhhbmRsZXIiPlhNTF9TZXREZWZhdWx0SGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQiPlhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIj5YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmciPlhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmc8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyIj5YTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIiPlhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIj5YTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIiPlhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIiPlhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0WG1sRGVjbEhhbmRsZXIiPlhNTF9TZXRYbWxEZWNsSGFuZGxlcjwvYT48L2xpPgkJICAKKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIj5YTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlciI+WE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyIj5YTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIiPlhNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlciI+WE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIiPlhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciI+WE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIiPlhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciI+WE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyPC9hPjwvbGk+CisgICAgPC91bD4KKyAgICA8L2xpPgorICAgIDxsaT48YSBocmVmPSIjcG9zaXRpb24iPlBhcnNlIFBvc2l0aW9uIGFuZCBFcnJvciBSZXBvcnRpbmcgRnVuY3Rpb25zPC9hPgorICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldEVycm9yQ29kZSI+WE1MX0dldEVycm9yQ29kZTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfRXJyb3JTdHJpbmciPlhNTF9FcnJvclN0cmluZzwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0Q3VycmVudEJ5dGVJbmRleCI+WE1MX0dldEN1cnJlbnRCeXRlSW5kZXg8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIj5YTUxfR2V0Q3VycmVudExpbmVOdW1iZXI8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIiPlhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9HZXRDdXJyZW50Qnl0ZUNvdW50Ij5YTUxfR2V0Q3VycmVudEJ5dGVDb3VudDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0SW5wdXRDb250ZXh0Ij5YTUxfR2V0SW5wdXRDb250ZXh0PC9hPjwvbGk+CisgICAgPC91bD4KKyAgICA8L2xpPgorICAgIDxsaT48YSBocmVmPSIjbWlzY2VsbGFuZW91cyI+TWlzY2VsbGFuZW91cyBGdW5jdGlvbnM8L2E+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfU2V0VXNlckRhdGEiPlhNTF9TZXRVc2VyRGF0YTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0VXNlckRhdGEiPlhNTF9HZXRVc2VyRGF0YTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnIj5YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRCYXNlIj5YTUxfU2V0QmFzZTwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfR2V0QmFzZSI+WE1MX0dldEJhc2U8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50Ij5YTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQ8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldElkQXR0cmlidXRlSW5kZXgiPlhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4PC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRFbmNvZGluZyI+WE1MX1NldEVuY29kaW5nPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmciPlhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmc8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX1VzZUZvcmVpZ25EVEQiPlhNTF9Vc2VGb3JlaWduRFREPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9TZXRSZXR1cm5OU1RyaXBsZXQiPlhNTF9TZXRSZXR1cm5OU1RyaXBsZXQ8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0RlZmF1bHRDdXJyZW50Ij5YTUxfRGVmYXVsdEN1cnJlbnQ8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0V4cGF0VmVyc2lvbiI+WE1MX0V4cGF0VmVyc2lvbjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNYTUxfRXhwYXRWZXJzaW9uSW5mbyI+WE1MX0V4cGF0VmVyc2lvbkluZm88L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0dldEZlYXR1cmVMaXN0Ij5YTUxfR2V0RmVhdHVyZUxpc3Q8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX0ZyZWVDb250ZW50TW9kZWwiPlhNTF9GcmVlQ29udGVudE1vZGVsPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9NZW1NYWxsb2MiPlhNTF9NZW1NYWxsb2M8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjWE1MX01lbVJlYWxsb2MiPlhNTF9NZW1SZWFsbG9jPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1hNTF9NZW1GcmVlIj5YTUxfTWVtRnJlZTwvYT48L2xpPgorICAgIDwvdWw+CisgICAgPC9saT4KKyAgPC91bD4gIAorICA8L2xpPgorPC91bD4KKworPGhyIC8+Cis8aDI+PGEgbmFtZT0ib3ZlcnZpZXciPk92ZXJ2aWV3PC9hPjwvaDI+CisKKzxwPkV4cGF0IGlzIGEgc3RyZWFtLW9yaWVudGVkIHBhcnNlci4gWW91IHJlZ2lzdGVyIGNhbGxiYWNrIChvcgoraGFuZGxlcikgZnVuY3Rpb25zIHdpdGggdGhlIHBhcnNlciBhbmQgdGhlbiBzdGFydCBmZWVkaW5nIGl0IHRoZQorZG9jdW1lbnQuICBBcyB0aGUgcGFyc2VyIHJlY29nbml6ZXMgcGFydHMgb2YgdGhlIGRvY3VtZW50LCBpdCB3aWxsCitjYWxsIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGZvciB0aGF0IHBhcnQgKGlmIHlvdSd2ZSByZWdpc3RlcmVkIG9uZS4pIAorVGhlIGRvY3VtZW50IGlzIGZlZCB0byB0aGUgcGFyc2VyIGluIHBpZWNlcywgc28geW91IGNhbiBzdGFydCBwYXJzaW5nCitiZWZvcmUgeW91IGhhdmUgYWxsIHRoZSBkb2N1bWVudC4gVGhpcyBhbHNvIGFsbG93cyB5b3UgdG8gcGFyc2UgcmVhbGx5CitodWdlIGRvY3VtZW50cyB0aGF0IHdvbid0IGZpdCBpbnRvIG1lbW9yeS48L3A+CisKKzxwPkV4cGF0IGNhbiBiZSBpbnRpbWlkYXRpbmcgZHVlIHRvIHRoZSBtYW55IGtpbmRzIG9mIGhhbmRsZXJzIGFuZAorb3B0aW9ucyB5b3UgY2FuIHNldC4gQnV0IHlvdSBvbmx5IG5lZWQgdG8gbGVhcm4gZm91ciBmdW5jdGlvbnMgaW4KK29yZGVyIHRvIGRvIDkwJSBvZiB3aGF0IHlvdSdsbCB3YW50IHRvIGRvIHdpdGggaXQ6PC9wPgorCis8ZGw+CisKKzxkdD48Y29kZT48YSBocmVmPSAiI1hNTF9QYXJzZXJDcmVhdGUiCisgICAgICAgICAgICAgPlhNTF9QYXJzZXJDcmVhdGU8L2E+PC9jb2RlPjwvZHQ+CisgIDxkZD5DcmVhdGUgYSBuZXcgcGFyc2VyIG9iamVjdC48L2RkPgorCis8ZHQ+PGNvZGU+PGEgaHJlZj0gIiNYTUxfU2V0RWxlbWVudEhhbmRsZXIiCisgICAgICAgICAgICAgPlhNTF9TZXRFbGVtZW50SGFuZGxlcjwvYT48L2NvZGU+PC9kdD4KKyAgPGRkPlNldCBoYW5kbGVycyBmb3Igc3RhcnQgYW5kIGVuZCB0YWdzLjwvZGQ+CisKKzxkdD48Y29kZT48YSBocmVmPSAiI1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciIKKyAgICAgICAgICAgICA+WE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyPC9hPjwvY29kZT48L2R0PgorICA8ZGQ+U2V0IGhhbmRsZXIgZm9yIHRleHQuPC9kZD4KKworPGR0Pjxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlIgorICAgICAgICAgICAgID5YTUxfUGFyc2U8L2E+PC9jb2RlPjwvZHQ+CisgIDxkZD5QYXNzIGEgYnVmZmVyIGZ1bGwgb2YgZG9jdW1lbnQgdG8gdGhlIHBhcnNlcjwvZGQ+Cis8L2RsPgorCis8cD5UaGVzZSBmdW5jdGlvbnMgYW5kIG90aGVycyBhcmUgZGVzY3JpYmVkIGluIHRoZSA8YQoraHJlZj0iI3JlZmVyZW5jZSI+cmVmZXJlbmNlPC9hPiBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQuIFRoZSByZWZlcmVuY2UKK3NlY3Rpb24gYWxzbyBkZXNjcmliZXMgaW4gZGV0YWlsIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUKK2RpZmZlcmVudCB0eXBlcyBvZiBoYW5kbGVycy48L3A+CisKKzxwPkxldCdzIGxvb2sgYXQgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIHByb2dyYW0gdGhhdCBvbmx5IHVzZXMgMyBvZiB0aGUKK2Fib3ZlIGZ1bmN0aW9ucyAoaXQgZG9lc24ndCBuZWVkIHRvIHNldCBhIGNoYXJhY3RlciBoYW5kbGVyLikgVGhlCitwcm9ncmFtIDxhIGhyZWY9Ii4uL2V4YW1wbGVzL291dGxpbmUuYyI+b3V0bGluZS5jPC9hPiBwcmludHMgYW4KK2VsZW1lbnQgb3V0bGluZSwgaW5kZW50aW5nIGNoaWxkIGVsZW1lbnRzIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSB0aGUKK3BhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlbS4gVGhlIHN0YXJ0IGhhbmRsZXIgZG9lcyBhbGwgdGhlCit3b3JrLiAgSXQgcHJpbnRzIHR3byBpbmRlbnRpbmcgc3BhY2VzIGZvciBldmVyeSBsZXZlbCBvZiBhbmNlc3RvcgorZWxlbWVudHMsIHRoZW4gaXQgcHJpbnRzIHRoZSBlbGVtZW50IGFuZCBhdHRyaWJ1dGUKK2luZm9ybWF0aW9uLiBGaW5hbGx5IGl0IGluY3JlbWVudHMgdGhlIGdsb2JhbCA8Y29kZT5EZXB0aDwvY29kZT4KK3ZhcmlhYmxlLjwvcD4KKworPHByZSBjbGFzcz0iZWciPgoraW50IERlcHRoOworCit2b2lkIFhNTENBTEwKK3N0YXJ0KHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmVsLCBjb25zdCBjaGFyICoqYXR0cikgeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpICZsdDsgRGVwdGg7IGkrKykKKyAgICBwcmludGYoIiAgIik7CisKKyAgcHJpbnRmKCIlcyIsIGVsKTsKKworICBmb3IgKGkgPSAwOyBhdHRyW2ldOyBpICs9IDIpIHsKKyAgICBwcmludGYoIiAlcz0nJXMnIiwgYXR0cltpXSwgYXR0cltpICsgMV0pOworICB9CisKKyAgcHJpbnRmKCJcbiIpOworICBEZXB0aCsrOworfSAgLyogRW5kIG9mIHN0YXJ0IGhhbmRsZXIgKi8KKzwvcHJlPgorCis8cD5UaGUgZW5kIHRhZyBzaW1wbHkgZG9lcyB0aGUgYm9va2tlZXBpbmcgd29yayBvZiBkZWNyZW1lbnRpbmcKKzxjb2RlPkRlcHRoPC9jb2RlPi48L3A+Cis8cHJlIGNsYXNzPSJlZyI+Cit2b2lkIFhNTENBTEwKK2VuZCh2b2lkICpkYXRhLCBjb25zdCBjaGFyICplbCkgeworICBEZXB0aC0tOworfSAgLyogRW5kIG9mIGVuZCBoYW5kbGVyICovCis8L3ByZT4KKworPHA+Tm90ZSB0aGUgPGNvZGU+WE1MQ0FMTDwvY29kZT4gYW5ub3RhdGlvbiB1c2VkIGZvciB0aGUgY2FsbGJhY2tzLgorVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBFeHBhdCBhbmQgdGhlIGNhbGxiYWNrcyBhcmUgdXNpbmcgdGhlCitzYW1lIGNhbGxpbmcgY29udmVudGlvbiBpbiBjYXNlIHRoZSBjb21waWxlciBvcHRpb25zIHVzZWQgZm9yIEV4cGF0CitpdHNlbGYgYW5kIHRoZSBjbGllbnQgY29kZSBhcmUgZGlmZmVyZW50LiAgRXhwYXQgdHJpZXMgbm90IHRvIGNhcmUKK3doYXQgdGhlIGRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9uIGlzLCB0aG91Z2ggaXQgbWF5IHJlcXVpcmUgdGhhdCBpdAorYmUgY29tcGlsZWQgd2l0aCBhIGRlZmF1bHQgY29udmVudGlvbiBvZiAiY2RlY2wiIG9uIHNvbWUgcGxhdGZvcm1zLgorRm9yIGNvZGUgd2hpY2ggdXNlcyBFeHBhdCwgaG93ZXZlciwgdGhlIGNhbGxpbmcgY29udmVudGlvbiBpcworc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5YTUxDQUxMPC9jb2RlPiBhbm5vdGF0aW9uIG9uIG1vc3QgcGxhdGZvcm1zOworY2FsbGJhY2tzIHNob3VsZCBiZSBkZWZpbmVkIHVzaW5nIHRoaXMgYW5ub3RhdGlvbi48L3A+CisKKzxwPlRoZSA8Y29kZT5YTUxDQUxMPC9jb2RlPiBhbm5vdGF0aW9uIHdhcyBhZGRlZCBpbiBFeHBhdCAxLjk1LjcsIGJ1dAorZXhpc3Rpbmcgd29ya2luZyBFeHBhdCBhcHBsaWNhdGlvbnMgZG9uJ3QgbmVlZCB0byBhZGQgaXQgKHNpbmNlIHRoZXkKK2FyZSBhbHJlYWR5IHVzaW5nIHRoZSAiY2RlY2wiIGNhbGxpbmcgY29udmVudGlvbiwgb3IgdGhleSB3b3VsZG4ndCBiZQord29ya2luZykuICBUaGUgYW5ub3RhdGlvbiBpcyBvbmx5IG5lZWRlZCBpZiB0aGUgZGVmYXVsdCBjYWxsaW5nCitjb252ZW50aW9uIG1heSBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiY2RlY2wiLiAgVG8gdXNlIHRoZSBhbm5vdGF0aW9uCitzYWZlbHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBFeHBhdCwgeW91IGNhbiBjb25kaXRpb25hbGx5IGRlZmluZSBpdAorPGVtPmFmdGVyPC9lbT4gaW5jbHVkaW5nIEV4cGF0J3MgaGVhZGVyIGZpbGU6PC9wPgorCis8cHJlIGNsYXNzPSJlZyI+CisjaW5jbHVkZSAmbHQ7ZXhwYXQuaCZndDsKKworI2lmbmRlZiBYTUxDQUxMCisjaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpICZhbXA7JmFtcDsgIWRlZmluZWQoX19CRU9TX18pICZhbXA7JmFtcDsgIWRlZmluZWQoX19DWUdXSU5fXykKKyNkZWZpbmUgWE1MQ0FMTCBfX2NkZWNsCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBYTUxDQUxMIF9fYXR0cmlidXRlX18oKGNkZWNsKSkKKyNlbHNlCisjZGVmaW5lIFhNTENBTEwKKyNlbmRpZgorI2VuZGlmCis8L3ByZT4KKworPHA+QWZ0ZXIgY3JlYXRpbmcgdGhlIHBhcnNlciwgdGhlIG1haW4gcHJvZ3JhbSBqdXN0IGhhcyB0aGUgam9iIG9mCitzaG92ZWxpbmcgdGhlIGRvY3VtZW50IHRvIHRoZSBwYXJzZXIgc28gdGhhdCBpdCBjYW4gZG8gaXRzIHdvcmsuPC9wPgorCis8aHIgLz4KKzxoMj48YSBuYW1lPSJidWlsZGluZyI+QnVpbGRpbmcgYW5kIEluc3RhbGxpbmcgRXhwYXQ8L2E+PC9oMj4KKworPHA+VGhlIEV4cGF0IGRpc3RyaWJ1dGlvbiBjb21lcyBhcyBhIGNvbXByZXNzZWQgKHdpdGggR05VIGd6aXApIHRhcgorZmlsZS4gIFlvdSBtYXkgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0KKyJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2V4cGF0LyIgPlNvdXJjZSBGb3JnZTwvYT4uICBBZnRlcgordW5wYWNraW5nIHRoaXMsIGNkIGludG8gdGhlIGRpcmVjdG9yeS4gVGhlbiBmb2xsb3cgZWl0aGVyIHRoZSBXaW4zMgorZGlyZWN0aW9ucyBvciBVbml4IGRpcmVjdGlvbnMgYmVsb3cuPC9wPgorCis8aDM+QnVpbGRpbmcgdW5kZXIgV2luMzI8L2gzPgorCis8cD5JZiB5b3UncmUgdXNpbmcgdGhlIEdOVSBjb21waWxlciB1bmRlciBjeWd3aW4sIGZvbGxvdyB0aGUgVW5peAorZGlyZWN0aW9ucyBpbiB0aGUgbmV4dCBzZWN0aW9uLiBPdGhlcndpc2UgaWYgeW91IGhhdmUgTWljcm9zb2Z0J3MKK0RldmVsb3BlciBTdHVkaW8gaW5zdGFsbGVkLCB0aGVuIGZyb20gV2luZG93cyBFeHBsb3JlciBkb3VibGUtY2xpY2sgb24KKyJleHBhdC5kc3AiIGluIHRoZSBsaWIgZGlyZWN0b3J5IGFuZCBidWlsZCBhbmQgaW5zdGFsbCBpbiB0aGUgdXN1YWwKK21hbm5lci48L3A+CisKKzxwPkFsdGVybmF0aXZlbHksIHlvdSBtYXkgZG93bmxvYWQgdGhlIFdpbjMyIGJpbmFyeSBwYWNrYWdlIHRoYXQKK2NvbnRhaW5zIHRoZSAiZXhwYXQuaCIgaW5jbHVkZSBmaWxlIGFuZCBhIHByZS1idWlsdCBETEwuPC9wPgorCis8aDM+QnVpbGRpbmcgdW5kZXIgVW5peCAob3IgR05VKTwvaDM+CisKKzxwPkZpcnN0IHlvdSdsbCBuZWVkIHRvIHJ1biB0aGUgY29uZmlndXJlIHNoZWxsIHNjcmlwdCBpbiBvcmRlciB0bworY29uZmlndXJlIHRoZSBNYWtlZmlsZXMgYW5kIGhlYWRlcnMgZm9yIHlvdXIgc3lzdGVtLjwvcD4KKworPHA+SWYgeW91J3JlIGhhcHB5IHdpdGggYWxsIHRoZSBkZWZhdWx0cyB0aGF0IGNvbmZpZ3VyZSBwaWNrcyBmb3IgeW91LAorYW5kIHlvdSBoYXZlIHBlcm1pc3Npb24gb24geW91ciBzeXN0ZW0gdG8gaW5zdGFsbCBpbnRvIC91c3IvbG9jYWwsIHlvdQorY2FuIGluc3RhbGwgRXhwYXQgd2l0aCB0aGlzIHNlcXVlbmNlIG9mIGNvbW1hbmRzOjwvcD4KKworPHByZSBjbGFzcz0iZWciPgorLi9jb25maWd1cmUKK21ha2UKK21ha2UgaW5zdGFsbAorPC9wcmU+CisKKzxwPlRoZXJlIGFyZSBzb21lIG9wdGlvbnMgdGhhdCB5b3UgY2FuIHByb3ZpZGUgdG8gdGhpcyBzY3JpcHQsIGJ1dCB0aGUKK29ubHkgb25lIHdlJ2xsIG1lbnRpb24gaGVyZSBpcyB0aGUgPGNvZGU+LS1wcmVmaXg8L2NvZGU+IG9wdGlvbi4gWW91CitjYW4gZmluZCBvdXQgYWxsIHRoZSBvcHRpb25zIGF2YWlsYWJsZSBieSBydW5uaW5nIGNvbmZpZ3VyZSB3aXRoIGp1c3QKK3RoZSA8Y29kZT4tLWhlbHA8L2NvZGU+IG9wdGlvbi48L3A+CisKKzxwPkJ5IGRlZmF1bHQsIHRoZSBjb25maWd1cmUgc2NyaXB0IHNldHMgdGhpbmdzIHVwIHNvIHRoYXQgdGhlIGxpYnJhcnkKK2dldHMgaW5zdGFsbGVkIGluIDxjb2RlPi91c3IvbG9jYWwvbGliPC9jb2RlPiBhbmQgdGhlIGFzc29jaWF0ZWQKK2hlYWRlciBmaWxlIGluIDxjb2RlPi91c3IvbG9jYWwvaW5jbHVkZTwvY29kZT4uICBCdXQgaWYgeW91IHdlcmUgdG8KK2dpdmUgdGhlIG9wdGlvbiwgPGNvZGU+LS1wcmVmaXg9L2hvbWUvbWUvbXlzdHVmZjwvY29kZT4sIHRoZW4gdGhlCitsaWJyYXJ5IGFuZCBoZWFkZXIgd291bGQgZ2V0IGluc3RhbGxlZCBpbgorPGNvZGU+L2hvbWUvbWUvbXlzdHVmZi9saWI8L2NvZGU+IGFuZAorPGNvZGU+L2hvbWUvbWUvbXlzdHVmZi9pbmNsdWRlPC9jb2RlPiByZXNwZWN0aXZlbHkuPC9wPgorCis8aDM+Q29uZmlndXJpbmcgRXhwYXQgVXNpbmcgdGhlIFByZS1Qcm9jZXNzb3I8L2gzPgorCis8cD5FeHBhdCdzIGZlYXR1cmUgc2V0IGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIGEgc21hbGwgbnVtYmVyIG9mCitwcmUtcHJvY2Vzc29yIGRlZmluaXRpb25zLiAgVGhlIGRlZmluaXRpb24gb2YgdGhpcyBzeW1ib2xzIGRvZXMgbm90CithZmZlY3QgdGhlIHNldCBvZiBlbnRyeSBwb2ludHMgZm9yIEV4cGF0LCBvbmx5IHRoZSBiZWhhdmlvciBvZiB0aGUgQVBJCithbmQgdGhlIGRlZmluaXRpb24gb2YgY2hhcmFjdGVyIHR5cGVzIGluIHRoZSBjYXNlIG9mCis8Y29kZT5YTUxfVU5JQ09ERV9XQ0hBUl9UPC9jb2RlPi4gIFRoZSBzeW1ib2xzIGFyZTo8L3A+CisKKzxkbCBjbGFzcz0iY3BwLXN5bWJvbHMiPgorPGR0PlhNTF9EVEQ8L2R0PgorPGRkPkluY2x1ZGUgc3VwcG9ydCBmb3IgdXNpbmcgYW5kIHJlcG9ydGluZyBEVEQtYmFzZWQgY29udGVudC4gIElmCit0aGlzIGlzIGRlZmluZWQsIGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGFuIGV4dGVybmFsIERURCBzdWJzZXQKK2FyZSByZXBvcnRlZCBhbmQgYXR0cmlidXRlIHZhbHVlIG5vcm1hbGl6YXRpb24gb2NjdXJzIGJhc2VkIG9uIHRoZQordHlwZSBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlIGV4dGVybmFsIHN1YnNldC4gIFdpdGhvdXQKK3RoaXMsIEV4cGF0IGhhcyBhIHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludCBhbmQgY2FuIGJlIGZhc3RlciwgYnV0IHdpbGwKK25vdCBsb2FkIGV4dGVybmFsIGVudGl0aWVzIG9yIHByb2Nlc3MgY29uZGl0aW9uYWwgc2VjdGlvbnMuICBUaGlzIGRvZXMKK25vdCBhZmZlY3QgdGhlIHNldCBvZiBmdW5jdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBBUEkuPC9kZD4KKworPGR0PlhNTF9OUzwvZHQ+Cis8ZGQ+V2hlbiBkZWZpbmVkLCBzdXBwb3J0IGZvciB0aGUgPGNpdGU+PGEgaHJlZj0KKyJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyIgPk5hbWVzcGFjZXMgaW4gWE1MPC9hPjwvY2l0ZT4KK3NwZWNpZmljYXRpb24gaXMgaW5jbHVkZWQuPC9kZD4KKworPGR0PlhNTF9VTklDT0RFPC9kdD4KKzxkZD5XaGVuIGRlZmluZWQsIGNoYXJhY3RlciBkYXRhIHJlcG9ydGVkIHRvIHRoZSBhcHBsaWNhdGlvbiBpcworZW5jb2RlZCBpbiBVVEYtMTYgdXNpbmcgd2lkZSBjaGFyYWN0ZXJzIG9mIHRoZSB0eXBlCis8Y29kZT5YTUxfQ2hhcjwvY29kZT4uICBUaGlzIGlzIGltcGxpZWQgaWYKKzxjb2RlPlhNTF9VTklDT0RFX1dDSEFSX1Q8L2NvZGU+IGlzIGRlZmluZWQuPC9kZD4KKworPGR0PlhNTF9VTklDT0RFX1dDSEFSX1Q8L2R0PgorPGRkPklmIGRlZmluZWQsIGNhdXNlcyB0aGUgPGNvZGU+WE1MX0NoYXI8L2NvZGU+IGNoYXJhY3RlciB0eXBlIHRvIGJlCitkZWZpbmVkIHVzaW5nIHRoZSA8Y29kZT53Y2hhcl90PC9jb2RlPiB0eXBlOyBvdGhlcndpc2UsIDxjb2RlPnVuc2lnbmVkCitzaG9ydDwvY29kZT4gaXMgdXNlZC4gIERlZmluaW5nIHRoaXMgaW1wbGllcworPGNvZGU+WE1MX1VOSUNPREU8L2NvZGU+LjwvZGQ+CisKKzxkdD5YTUxfTEFSR0VfU0laRTwvZHQ+Cis8ZGQ+SWYgZGVmaW5lZCwgY2F1c2VzIHRoZSA8Y29kZT5YTUxfU2l6ZTwvY29kZT4gYW5kIDxjb2RlPlhNTF9JbmRleDwvY29kZT4KK2ludGVnZXIgdHlwZXMgdG8gYmUgYXQgbGVhc3QgNjQgYml0cyBpbiBzaXplLiBUaGlzIGlzIGludGVuZGVkIHRvIHN1cHBvcnQKK3Byb2Nlc3Npbmcgb2YgdmVyeSBsYXJnZSBpbnB1dCBzdHJlYW1zLCB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlcyBvZgorPGNvZGU+PGEgaHJlZj0iI1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4IiA+WE1MX0dldEN1cnJlbnRCeXRlSW5kZXg8L2E+PC9jb2RlPiwKKzxjb2RlPjxhIGhyZWY9IiNYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIiID5YTUxfR2V0Q3VycmVudExpbmVOdW1iZXI8L2E+PC9jb2RlPiBhbmQKKzxjb2RlPjxhIGhyZWY9IiNYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciIgPlhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyPC9hPjwvY29kZT4KK2NvdWxkIG92ZXJmbG93LiBJdCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSBhbGwgY29tcGlsZXJzLCBhbmQgaXMgdHVybmVkCitvZmYgYnkgZGVmYXVsdC48L2RkPgorCis8ZHQ+WE1MX0NPTlRFWFRfQllURVM8L2R0PgorPGRkPlRoZSBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgb2YgbWFya3VwIGNvbnRleHQgd2hpY2ggdGhlIHBhcnNlciB3aWxsCitlbnN1cmUgYXJlIGF2YWlsYWJsZSBmb3IgcmVwb3J0aW5nIHZpYSA8Y29kZT48YSBocmVmPQorIiNYTUxfR2V0SW5wdXRDb250ZXh0IiA+WE1MX0dldElucHV0Q29udGV4dDwvYT48L2NvZGU+LiAgVGhpcyBpcworbm9ybWFsbHkgc2V0IHRvIDEwMjQsIGFuZCBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIGludGVyZ2VyLiAgSWYgdGhpcworaXMgbm90IGRlZmluZWQsIHRoZSBpbnB1dCBjb250ZXh0IHdpbGwgbm90IGJlIGF2YWlsYWJsZSBhbmQgPGNvZGU+PGEKK2hyZWY9ICIjWE1MX0dldElucHV0Q29udGV4dCIgPlhNTF9HZXRJbnB1dENvbnRleHQ8L2E+PC9jb2RlPiB3aWxsCithbHdheXMgcmVwb3J0IE5VTEwuICBXaXRob3V0IHRoaXMsIEV4cGF0IGhhcyBhIHNtYWxsZXIgbWVtb3J5Citmb290cHJpbnQgYW5kIGNhbiBiZSBmYXN0ZXIuPC9kZD4KKworPGR0PlhNTF9TVEFUSUM8L2R0PgorPGRkPk9uIFdpbmRvd3MsIHRoaXMgc2hvdWxkIGJlIHNldCBpZiBFeHBhdCBpcyBnb2luZyB0byBiZSBsaW5rZWQKK3N0YXRpY2FsbHkgd2l0aCB0aGUgY29kZSB0aGF0IGNhbGxzIGl0OyB0aGlzIGlzIHJlcXVpcmVkIHRvIGdldCBhbGwKK3RoZSByaWdodCBNU1ZDIG1hZ2ljIGFubm90YXRpb25zIGNvcnJlY3QuICBUaGlzIGlzIGlnbm9yZWQgb24gb3RoZXIKK3BsYXRmb3Jtcy48L2RkPgorPC9kbD4KKworPGhyIC8+Cis8aDI+PGEgbmFtZT0idXNpbmciPlVzaW5nIEV4cGF0PC9hPjwvaDI+CisKKzxoMz5Db21waWxpbmcgYW5kIExpbmtpbmcgQWdhaW5zdCBFeHBhdDwvaDM+CisKKzxwPlVubGVzcyB5b3UgaW5zdGFsbGVkIEV4cGF0IGluIGEgbG9jYXRpb24gbm90IGV4cGVjdGVkIGJ5IHlvdXIKK2NvbXBpbGVyIGFuZCBsaW5rZXIsIGFsbCB5b3UgaGF2ZSB0byBkbyB0byB1c2UgRXhwYXQgaW4geW91ciBwcm9ncmFtcworaXMgdG8gaW5jbHVkZSB0aGUgRXhwYXQgaGVhZGVyICg8Y29kZT4jaW5jbHVkZSAmbHQ7ZXhwYXQuaCZndDs8L2NvZGU+KQoraW4geW91ciBmaWxlcyB0aGF0IG1ha2UgY2FsbHMgdG8gaXQgYW5kIHRvIHRlbGwgdGhlIGxpbmtlciB0aGF0IGl0CituZWVkcyB0byBsaW5rIGFnYWluc3QgdGhlIEV4cGF0IGxpYnJhcnkuICBPbiBVbml4IHN5c3RlbXMsIHRoaXMgd291bGQKK3VzdWFsbHkgYmUgZG9uZSB3aXRoIHRoZSA8Y29kZT4tbGV4cGF0PC9jb2RlPiBhcmd1bWVudC4gIE90aGVyd2lzZSwKK3lvdSdsbCBuZWVkIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBFeHBhdCBoZWFkZXIKK2FuZCB0aGUgbGlua2VyIHdoZXJlIHRvIGZpbmQgdGhlIEV4cGF0IGxpYnJhcnkuICBZb3UgbWF5IGFsc28gbmVlZCB0bwordGFrZSBzdGVwcyB0byB0ZWxsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdoZXJlIHRvIGZpbmQgdGhpcyBsaWJyYXJ5IGF0CitydW4gdGltZS48L3A+CisKKzxwPk9uIGEgVW5peC1iYXNlZCBzeXN0ZW0sIGhlcmUncyB3aGF0IGEgTWFrZWZpbGUgbWlnaHQgbG9vayBsaWtlIHdoZW4KK0V4cGF0IGlzIGluc3RhbGxlZCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uOjwvcD4KKworPHByZSBjbGFzcz0iZWciPgorQ0M9Y2MKK0xERkxBR1M9CitMSUJTPSAtbGV4cGF0Cit4bWxhcHA6IHhtbGFwcC5vCisgICAgICAgICQoQ0MpICQoTERGTEFHUykgLW8geG1sYXBwIHhtbGFwcC5vICQoTElCUykKKzwvcHJlPgorCis8cD5JZiB5b3UgaW5zdGFsbGVkIEV4cGF0IGluLCBzYXksIDxjb2RlPi9ob21lL21lL215c3R1ZmY8L2NvZGU+LCB0aGVuCit0aGUgTWFrZWZpbGUgd291bGQgbG9vayBsaWtlIHRoaXM6PC9wPgorCis8cHJlIGNsYXNzPSJlZyI+CitDQz1jYworQ0ZMQUdTPSAtSS9ob21lL21lL215c3R1ZmYvaW5jbHVkZQorTERGTEFHUz0KK0xJQlM9IC1ML2hvbWUvbWUvbXlzdHVmZi9saWIgLWxleHBhdAoreG1sYXBwOiB4bWxhcHAubworICAgICAgICAkKENDKSAkKExERkxBR1MpIC1vIHhtbGFwcCB4bWxhcHAubyAkKExJQlMpCis8L3ByZT4KKworPHA+WW91J2QgYWxzbyBoYXZlIHRvIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKzxjb2RlPkxEX0xJQlJBUllfUEFUSDwvY29kZT4gdG8gPGNvZGU+L2hvbWUvbWUvbXlzdHVmZi9saWI8L2NvZGU+IChvcgordG8gPGNvZGU+JHtMRF9MSUJSQVJZX1BBVEh9Oi9ob21lL21lL215c3R1ZmYvbGliPC9jb2RlPiBpZgorTERfTElCUkFSWV9QQVRIIGFscmVhZHkgaGFzIHNvbWUgZGlyZWN0b3JpZXMgaW4gaXQpIGluIG9yZGVyIHRvIHJ1bgoreW91ciBhcHBsaWNhdGlvbi48L3A+CisKKzxoMz5FeHBhdCBCYXNpY3M8L2gzPgorCis8cD5BcyB3ZSBzYXcgaW4gdGhlIGV4YW1wbGUgaW4gdGhlIG92ZXJ2aWV3LCB0aGUgZmlyc3Qgc3RlcCBpbiBwYXJzaW5nCithbiBYTUwgZG9jdW1lbnQgd2l0aCBFeHBhdCBpcyB0byBjcmVhdGUgYSBwYXJzZXIgb2JqZWN0LiBUaGVyZSBhcmUgPGEKK2hyZWY9IiNjcmVhdGlvbiI+dGhyZWUgZnVuY3Rpb25zPC9hPiBpbiB0aGUgRXhwYXQgQVBJIGZvciBjcmVhdGluZyBhCitwYXJzZXIgb2JqZWN0LiAgSG93ZXZlciwgb25seSB0d28gb2YgdGhlc2UgKDxjb2RlPjxhIGhyZWY9CisiI1hNTF9QYXJzZXJDcmVhdGUiID5YTUxfUGFyc2VyQ3JlYXRlPC9hPjwvY29kZT4gYW5kIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9QYXJzZXJDcmVhdGVOUyIgPlhNTF9QYXJzZXJDcmVhdGVOUzwvYT48L2NvZGU+KSBjYW4gYmUgdXNlZCBmb3IKK2NvbnN0cnVjdGluZyBhIHBhcnNlciBmb3IgYSB0b3AtbGV2ZWwgZG9jdW1lbnQuICBUaGUgb2JqZWN0IHJldHVybmVkCitieSB0aGVzZSBmdW5jdGlvbnMgaXMgYW4gb3BhcXVlIHBvaW50ZXIgKGkuZS4gImV4cGF0LmgiIGRlY2xhcmVzIGl0IGFzCit2b2lkICopIHRvIGRhdGEgd2l0aCBmdXJ0aGVyIGludGVybmFsIHN0cnVjdHVyZS4gSW4gb3JkZXIgdG8gZnJlZSB0aGUKK21lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgeW91IG11c3QgY2FsbCA8Y29kZT48YSBocmVmPQorIiNYTUxfUGFyc2VyRnJlZSIgPlhNTF9QYXJzZXJGcmVlPC9hPjwvY29kZT4uIE5vdGUgdGhhdCBpZiB5b3UgaGF2ZQorcHJvdmlkZWQgYW55IDxhIGhyZWY9IiN1c2VyZGF0YSI+dXNlciBkYXRhPC9hPiB0aGF0IGdldHMgc3RvcmVkIGluIHRoZQorcGFyc2VyLCB0aGVuIHlvdXIgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgaXQgcHJpb3IgdG8KK2NhbGxpbmcgPGNvZGU+WE1MX1BhcnNlckZyZWU8L2NvZGU+LjwvcD4KKworPHA+VGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIHBhcnNlciBjcmVhdGlvbiBmdW5jdGlvbnMgYXJlIGdvb2QgZm9yCitwYXJzaW5nIG9ubHkgb25lIFhNTCBkb2N1bWVudCBvciBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBJZiB5b3VyCithcHBsaWNhdGlvbiBuZWVkcyB0byBwYXJzZSBtYW55IFhNTCBkb2N1bWVudHMsIHRoZW4gaXQgbmVlZHMgdG8gY3JlYXRlCithIHBhcnNlciBvYmplY3QgZm9yIGVhY2ggb25lLiBUaGUgYmVzdCB3YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgdG8KK2NyZWF0ZSBhIGhpZ2hlciBsZXZlbCBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgdGhlIGRlZmF1bHQKK2luaXRpYWxpemF0aW9uIHlvdSB3YW50IGZvciB5b3VyIHBhcnNlciBvYmplY3RzLjwvcD4KKworPHA+V2Fsa2luZyB0aHJvdWdoIGEgZG9jdW1lbnQgaGllcmFyY2h5IHdpdGggYSBzdHJlYW0gb3JpZW50ZWQgcGFyc2VyCit3aWxsIHJlcXVpcmUgYSBnb29kIHN0YWNrIG1lY2hhbmlzbSBpbiBvcmRlciB0byBrZWVwIHRyYWNrIG9mIGN1cnJlbnQKK2NvbnRleHQuICBGb3IgaW5zdGFuY2UsIHRvIGFuc3dlciB0aGUgc2ltcGxlIHF1ZXN0aW9uLCAiV2hhdCBlbGVtZW50Citkb2VzIHRoaXMgdGV4dCBiZWxvbmcgdG8/IiByZXF1aXJlcyBhIHN0YWNrLCBzaW5jZSB0aGUgcGFyc2VyIG1heSBoYXZlCitkZXNjZW5kZWQgaW50byBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBvbmUgYW5kCitoYXMgZW5jb3VudGVyZWQgdGhpcyB0ZXh0IG9uIHRoZSB3YXkgb3V0LjwvcD4KKworPHA+VGhlIHRoaW5ncyB5b3UncmUgbGlrZWx5IHRvIHdhbnQgdG8ga2VlcCBvbiBhIHN0YWNrIGFyZSB0aGUKK2N1cnJlbnRseSBvcGVuZWQgZWxlbWVudCBhbmQgaXQncyBhdHRyaWJ1dGVzLiBZb3UgcHVzaCB0aGlzCitpbmZvcm1hdGlvbiBvbnRvIHRoZSBzdGFjayBpbiB0aGUgc3RhcnQgaGFuZGxlciBhbmQgeW91IHBvcCBpdCBvZmYgaW4KK3RoZSBlbmQgaGFuZGxlci48L3A+CisKKzxwPkZvciBzb21lIHRhc2tzLCBpdCBpcyBzdWZmaWNpZW50IHRvIGp1c3Qga2VlcCBpbmZvcm1hdGlvbiBvbiB3aGF0Cit0aGUgZGVwdGggb2YgdGhlIHN0YWNrIGlzIChvciB3b3VsZCBiZSBpZiB5b3UgaGFkIG9uZS4pIFRoZSBvdXRsaW5lCitwcm9ncmFtIHNob3duIGFib3ZlIHByZXNlbnRzIG9uZSBleGFtcGxlLiBBbm90aGVyIHN1Y2ggdGFzayB3b3VsZCBiZQorc2tpcHBpbmcgb3ZlciBhIGNvbXBsZXRlIGVsZW1lbnQuIFdoZW4geW91IHNlZSB0aGUgc3RhcnQgdGFnIGZvciB0aGUKK2VsZW1lbnQgeW91IHdhbnQgdG8gc2tpcCwgeW91IHNldCBhIHNraXAgZmxhZyBhbmQgcmVjb3JkIHRoZSBkZXB0aCBhdAord2hpY2ggdGhlIGVsZW1lbnQgc3RhcnRlZC4gIFdoZW4gdGhlIGVuZCB0YWcgaGFuZGxlciBlbmNvdW50ZXJzIHRoZQorc2FtZSBkZXB0aCwgdGhlIHNraXBwZWQgZWxlbWVudCBoYXMgZW5kZWQgYW5kIHRoZSBmbGFnIG1heSBiZQorY2xlYXJlZC4gSWYgeW91IGZvbGxvdyB0aGUgY29udmVudGlvbiB0aGF0IHRoZSByb290IGVsZW1lbnQgc3RhcnRzIGF0CisxLCB0aGVuIHlvdSBjYW4gdXNlIHRoZSBzYW1lIHZhcmlhYmxlIGZvciBza2lwIGZsYWcgYW5kIHNraXAKK2RlcHRoLjwvcD4KKworPHByZSBjbGFzcz0iZWciPgordm9pZAoraW5pdF9pbmZvKFBhcnNlaW5mbyAqaW5mbykgeworICBpbmZvLT5za2lwID0gMDsKKyAgaW5mby0+ZGVwdGggPSAxOworICAvKiBPdGhlciBpbml0aWFsaXphdGlvbnMgaGVyZSAqLworfSAgLyogRW5kIG9mIGluaXRfaW5mbyAqLworCit2b2lkIFhNTENBTEwKK3Jhd3N0YXJ0KHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmVsLCBjb25zdCBjaGFyICoqYXR0cikgeworICBQYXJzZWluZm8gKmluZiA9IChQYXJzZWluZm8gKikgZGF0YTsKKworICBpZiAoISBpbmYtPnNraXApIHsKKyAgICBpZiAoc2hvdWxkX3NraXAoaW5mLCBlbCwgYXR0cikpIHsKKyAgICAgIGluZi0+c2tpcCA9IGluZi0+ZGVwdGg7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHN0YXJ0KGluZiwgZWwsIGF0dHIpOyAgICAgLyogVGhpcyBkb2VzIHJlc3Qgb2Ygc3RhcnQgaGFuZGxpbmcgKi8KKyAgfQorCisgIGluZi0+ZGVwdGgrKzsKK30gIC8qIEVuZCBvZiByYXdzdGFydCAqLworCit2b2lkIFhNTENBTEwKK3Jhd2VuZCh2b2lkICpkYXRhLCBjb25zdCBjaGFyICplbCkgeworICBQYXJzZWluZm8gKmluZiA9IChQYXJzZWluZm8gKikgZGF0YTsKKworICBpbmYtPmRlcHRoLS07CisKKyAgaWYgKCEgaW5mLT5za2lwKQorICAgIGVuZChpbmYsIGVsKTsgICAgICAgICAgICAgIC8qIFRoaXMgZG9lcyByZXN0IG9mIGVuZCBoYW5kbGluZyAqLworCisgIGlmIChpbmYtPnNraXAgPT0gaW5mLT5kZXB0aCkKKyAgICBpbmYtPnNraXAgPSAwOworfSAgLyogRW5kIHJhd2VuZCAqLworPC9wcmU+CisKKzxwPk5vdGljZSBpbiB0aGUgYWJvdmUgZXhhbXBsZSB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGVwdGggaXMKK21hbmlwdWxhdGVkIGluIHRoZSBzdGFydCBhbmQgZW5kIGhhbmRsZXJzLiBUaGUgZW5kIHRhZyBoYW5kbGVyIHNob3VsZAorYmUgdGhlIG1pcnJvciBpbWFnZSBvZiB0aGUgc3RhcnQgdGFnIGhhbmRsZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvCitwcm9wZXJseSBtb2RlbCBjb250YWlubWVudC4gU2luY2UsIGluIHRoZSBzdGFydCB0YWcgaGFuZGxlciwgd2UKK2luY3JlbWVudGVkIGRlcHRoIDxlbT5hZnRlcjwvZW0+IHRoZSBtYWluIGJvZHkgb2Ygc3RhcnQgdGFnIGNvZGUsIHRoZW4KK2luIHRoZSBlbmQgaGFuZGxlciwgd2UgbmVlZCB0byBtYW5pcHVsYXRlIGl0IDxlbT5iZWZvcmU8L2VtPiB0aGUgbWFpbgorYm9keS4gIElmIHdlJ2QgZGVjaWRlZCB0byBpbmNyZW1lbnQgaXQgZmlyc3QgdGhpbmcgaW4gdGhlIHN0YXJ0CitoYW5kbGVyLCB0aGVuIHdlJ2QgaGF2ZSBoYWQgdG8gZGVjcmVtZW50IGl0IGxhc3QgdGhpbmcgaW4gdGhlIGVuZAoraGFuZGxlci48L3A+CisKKzxoMyBpZD0idXNlcmRhdGEiPkNvbW11bmljYXRpbmcgYmV0d2VlbiBoYW5kbGVyczwvaDM+CisKKzxwPkluIG9yZGVyIHRvIGJlIGFibGUgdG8gcGFzcyBpbmZvcm1hdGlvbiBiZXR3ZWVuIGRpZmZlcmVudCBoYW5kbGVycword2l0aG91dCB1c2luZyBnbG9iYWxzLCB5b3UnbGwgbmVlZCB0byBkZWZpbmUgYSBkYXRhIHN0cnVjdHVyZSB0byBob2xkCit0aGUgc2hhcmVkIHZhcmlhYmxlcy4gWW91IGNhbiB0aGVuIHRlbGwgRXhwYXQgKHdpdGggdGhlIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9TZXRVc2VyRGF0YSIgPlhNTF9TZXRVc2VyRGF0YTwvYT48L2NvZGU+IGZ1bmN0aW9uKSB0byBwYXNzIGEKK3BvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIGhhbmRsZXJzLiAgVGhpcyBpcyB0aGUgZmlyc3QKK2FyZ3VtZW50IHJlY2VpdmVkIGJ5IG1vc3QgaGFuZGxlcnMuICBJbiB0aGUgPGEgaHJlZj0iI3JlZmVyZW5jZSIKKz5yZWZlcmVuY2Ugc2VjdGlvbjwvYT4sIGFuIGFyZ3VtZW50IHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gaXMgbmFtZWQKKzxjb2RlPnVzZXJEYXRhPC9jb2RlPiBhbmQgaGF2ZSB0eXBlIDxjb2RlPnZvaWQgKjwvY29kZT4gaWYgdGhlIHVzZXIKK2RhdGEgaXMgcGFzc2VkOyBpdCB3aWxsIGhhdmUgdGhlIHR5cGUgPGNvZGU+WE1MX1BhcnNlcjwvY29kZT4gaWYgdGhlCitwYXJzZXIgaXRzZWxmIGlzIHBhc3NlZC4gIFdoZW4gdGhlIHBhcnNlciBpcyBwYXNzZWQsIHRoZSB1c2VyIGRhdGEgbWF5CitiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+PGEgaHJlZj0iI1hNTF9HZXRVc2VyRGF0YSIKKz5YTUxfR2V0VXNlckRhdGE8L2E+PC9jb2RlPi48L3A+CisKKzxwPk9uZSBjb21tb24gY2FzZSB3aGVyZSBtdWx0aXBsZSBjYWxscyB0byBhIHNpbmdsZSBoYW5kbGVyIG1heSBuZWVkCit0byBjb21tdW5pY2F0ZSB1c2luZyBhbiBhcHBsaWNhdGlvbiBkYXRhIHN0cnVjdHVyZSBpcyB0aGUgY2FzZSB3aGVuCitjb250ZW50IHBhc3NlZCB0byB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciAoc2V0IGJ5IDxjb2RlPjxhIGhyZWY9CisiI1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciIKKz5YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXI8L2E+PC9jb2RlPikgbmVlZHMgdG8gYmUgYWNjdW11bGF0ZWQuICBBCitjb21tb24gZmlyc3QtdGltZSBtaXN0YWtlIHdpdGggYW55IG9mIHRoZSBldmVudC1vcmllbnRlZCBpbnRlcmZhY2VzIHRvCithbiBYTUwgcGFyc2VyIGlzIHRvIGV4cGVjdCBhbGwgdGhlIHRleHQgY29udGFpbmVkIGluIGFuIGVsZW1lbnQgdG8gYmUKK3JlcG9ydGVkIGJ5IGEgc2luZ2xlIGNhbGwgdG8gdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIuICBFeHBhdCwgbGlrZQorbWFueSBvdGhlciBYTUwgcGFyc2VycywgcmVwb3J0cyBzdWNoIGRhdGEgYXMgYSBzZXF1ZW5jZSBvZiBjYWxsczsKK3RoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgd2hlbiB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBpcyByZWFjaGVkIHVudGlsIGEKK2RpZmZlcmVudCBjYWxsYmFjayBpcyBtYWRlLiAgQSBidWZmZXIgcmVmZXJlbmNlZCBieSB0aGUgdXNlciBkYXRhCitzdHJ1Y3R1cmUgcHJvdmVzIGJvdGggYW4gZWZmZWN0aXZlIGFuZCBjb252ZW5pZW50IHBsYWNlIHRvIGFjY3VtdWxhdGUKK2NoYXJhY3RlciBkYXRhLjwvcD4KKworPCEtLSBYWFggZXhhbXBsZSBuZWVkZWQgaGVyZSAtLT4KKworCis8aDM+WE1MIFZlcnNpb248L2gzPgorCis8cD5FeHBhdCBpcyBhbiBYTUwgMS4wIHBhcnNlciwgYW5kIGFzIHN1Y2ggbmV2ZXIgY29tcGxhaW5zIGJhc2VkIG9uCit0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnZlcnNpb248L2NvZGU+IHBzZXVkby1hdHRyaWJ1dGUgaW4gdGhlIFhNTAorZGVjbGFyYXRpb24sIGlmIHByZXNlbnQuPC9wPgorCis8cD5JZiBhbiBhcHBsaWNhdGlvbiBuZWVkcyB0byBjaGVjayB0aGUgdmVyc2lvbiBudW1iZXIgKHRvIHN1cHBvcnQKK2FsdGVybmF0ZSBwcm9jZXNzaW5nKSwgaXQgc2hvdWxkIHVzZSB0aGUgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1NldFhtbERlY2xIYW5kbGVyIiA+WE1MX1NldFhtbERlY2xIYW5kbGVyPC9hPjwvY29kZT4gZnVuY3Rpb24gdG8KK3NldCBhIGhhbmRsZXIgdGhhdCB1c2VzIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uIHRvCitkZXRlcm1pbmUgd2hhdCB0byBkby4gIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gY2hlY2sgdGhhdCBvbmx5IGEKK3ZlcnNpb24gbnVtYmVyIG9mIDxjb2RlPiIxLjAiPC9jb2RlPiBpcyBhY2NlcHRlZDo8L3A+CisKKzxwcmUgY2xhc3M9ImVnIj4KK3N0YXRpYyBpbnQgd3JvbmdfdmVyc2lvbjsKK3N0YXRpYyBYTUxfUGFyc2VyIHBhcnNlcjsKKworc3RhdGljIHZvaWQgWE1MQ0FMTAoreG1sZGVjbF9oYW5kbGVyKHZvaWQgICAgICAgICAgICAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBzdGFuZGFsb25lKQoreworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgVmVyc2lvbl8xXzBbXSA9IHsnMScsICcuJywgJzAnLCAwfTsKKworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpICZsdDsgKHNpemVvZihWZXJzaW9uXzFfMCkgLyBzaXplb2YoVmVyc2lvbl8xXzBbMF0pKTsgKytpKSB7CisgICAgaWYgKHZlcnNpb25baV0gIT0gVmVyc2lvbl8xXzBbaV0pIHsKKyAgICAgIHdyb25nX3ZlcnNpb24gPSAxOworICAgICAgLyogYWxzbyBjbGVhciBhbGwgb3RoZXIgaGFuZGxlcnM6ICovCisgICAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBOVUxMKTsKKyAgICAgIC4uLgorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAuLi4KK30KKzwvcHJlPgorCis8aDM+TmFtZXNwYWNlIFByb2Nlc3Npbmc8L2gzPgorCis8cD5XaGVuIHRoZSBwYXJzZXIgaXMgY3JlYXRlZCB1c2luZyB0aGUgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1BhcnNlckNyZWF0ZU5TIiA+WE1MX1BhcnNlckNyZWF0ZU5TPC9hPjwvY29kZT4sIGZ1bmN0aW9uLCBFeHBhdAorcGVyZm9ybXMgbmFtZXNwYWNlIHByb2Nlc3NpbmcuIFVuZGVyIG5hbWVzcGFjZSBwcm9jZXNzaW5nLCBFeHBhdAorY29uc3VtZXMgPGNvZGU+eG1sbnM8L2NvZGU+IGFuZCA8Y29kZT54bWxuczouLi48L2NvZGU+IGF0dHJpYnV0ZXMsCit3aGljaCBkZWNsYXJlIG5hbWVzcGFjZXMgZm9yIHRoZSBzY29wZSBvZiB0aGUgZWxlbWVudCBpbiB3aGljaCB0aGV5CitvY2N1ci4gVGhpcyBtZWFucyB0aGF0IHlvdXIgc3RhcnQgaGFuZGxlciB3aWxsIG5vdCBzZWUgdGhlc2UKK2F0dHJpYnV0ZXMuICBZb3VyIGFwcGxpY2F0aW9uIGNhbiBzdGlsbCBiZSBpbmZvcm1lZCBvZiB0aGVzZQorZGVjbGFyYXRpb25zIGJ5IHNldHRpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGhhbmRsZXJzIHdpdGggPGEgaHJlZj0KKyIjWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyIgorPjxjb2RlPlhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcjwvY29kZT48L2E+LjwvcD4KKworPHA+RWxlbWVudCB0eXBlIGFuZCBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBiZWxvbmcgdG8gYSBnaXZlbiBuYW1lc3BhY2UKK2FyZSBwYXNzZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgaW4gZXhwYW5kZWQgZm9ybS4gQnkgZGVmYXVsdAordGhpcyBleHBhbmRlZCBmb3JtIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgbmFtZXNwYWNlIFVSSSwgdGhlCitzZXBhcmF0b3IgY2hhcmFjdGVyICh3aGljaCBpcyB0aGUgMm5kIGFyZ3VtZW50IHRvIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9QYXJzZXJDcmVhdGVOUyIgPlhNTF9QYXJzZXJDcmVhdGVOUzwvYT48L2NvZGU+KSwgYW5kIHRoZSBsb2NhbAorbmFtZSAoaS5lLiB0aGUgcGFydCBhZnRlciB0aGUgY29sb24pLiBOYW1lcyB3aXRoIHVuZGVjbGFyZWQgcHJlZml4ZXMKK2FyZSBub3Qgd2VsbC1mb3JtZWQgd2hlbiBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBlbmFibGVkLCBhbmQgd2lsbAordHJpZ2dlciBhbiBlcnJvci4gVW5wcmVmaXhlZCBhdHRyaWJ1dGUgbmFtZXMgYXJlIG5ldmVyIGV4cGFuZGVkLAorYW5kIHVucHJlZml4ZWQgZWxlbWVudCBuYW1lcyBhcmUgb25seSBleHBhbmRlZCB3aGVuIHRoZXkgYXJlIGluIHRoZQorc2NvcGUgb2YgYSBkZWZhdWx0IG5hbWVzcGFjZS48L3A+CisKKzxwPkhvd2V2ZXIgaWYgPGNvZGU+PGEgaHJlZj0gIiNYTUxfU2V0UmV0dXJuTlNUcmlwbGV0IgorPlhNTF9TZXRSZXR1cm5OU1RyaXBsZXQ8L2E+PC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQgd2l0aCBhIG5vbi16ZXJvCis8Y29kZT5kb19uc3Q8L2NvZGU+IHBhcmFtZXRlciwgdGhlbiB0aGUgZXhwYW5kZWQgZm9ybSBmb3IgbmFtZXMgd2l0aAorYW4gZXhwbGljaXQgcHJlZml4IGlzIGEgY29uY2F0ZW5hdGlvbiBvZjogVVJJLCBzZXBhcmF0b3IsIGxvY2FsIG5hbWUsCitzZXBhcmF0b3IsIHByZWZpeC48L3A+CisKKzxwPllvdSBjYW4gc2V0IGhhbmRsZXJzIGZvciB0aGUgc3RhcnQgb2YgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYW5kCitmb3IgdGhlIGVuZCBvZiBhIHNjb3BlIG9mIGEgZGVjbGFyYXRpb24gd2l0aCB0aGUgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyIiA+WE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyPC9hPjwvY29kZT4KK2Z1bmN0aW9uLiAgVGhlIFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgaXMgY2FsbGVkIHByaW9yIHRvIHRoZSBzdGFydAordGFnIGhhbmRsZXIgYW5kIHRoZSBFbmROYW1lc3BhY2VEZWNsSGFuZGxlciBpcyBjYWxsZWQgYWZ0ZXIgdGhlCitjb3JyZXNwb25kaW5nIGVuZCB0YWcgdGhhdCBlbmRzIHRoZSBuYW1lc3BhY2UncyBzY29wZS4gIFRoZSBuYW1lc3BhY2UKK3N0YXJ0IGhhbmRsZXIgZ2V0cyBwYXNzZWQgdGhlIHByZWZpeCBhbmQgVVJJIGZvciB0aGUgbmFtZXNwYWNlLiAgRm9yIGEKK2RlZmF1bHQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uICh4bWxucz0nLi4uJyksIHRoZSBwcmVmaXggd2lsbCBiZSBudWxsLgorVGhlIFVSSSB3aWxsIGJlIG51bGwgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBpcyBiZWluZwordW5zZXQuICBUaGUgbmFtZXNwYWNlIGVuZCBoYW5kbGVyIGp1c3QgZ2V0cyB0aGUgcHJlZml4IGZvciB0aGUgY2xvc2luZworc2NvcGUuPC9wPgorCis8cD5UaGVzZSBoYW5kbGVycyBhcmUgY2FsbGVkIGZvciBlYWNoIGRlY2xhcmF0aW9uLiBTbyBpZiwgZm9yCitpbnN0YW5jZSwgYSBzdGFydCB0YWcgaGFkIHRocmVlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIHRoZW4gdGhlCitTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHdvdWxkIGJlIGNhbGxlZCB0aHJlZSB0aW1lcyBiZWZvcmUgdGhlIHN0YXJ0Cit0YWcgaGFuZGxlciBpcyBjYWxsZWQsIG9uY2UgZm9yIGVhY2ggZGVjbGFyYXRpb24uPC9wPgorCis8aDM+Q2hhcmFjdGVyIEVuY29kaW5nczwvaDM+CisKKzxwPldoaWxlIFhNTCBpcyBiYXNlZCBvbiBVbmljb2RlLCBhbmQgZXZlcnkgWE1MIHByb2Nlc3NvciBpcyByZXF1aXJlZAordG8gcmVjb2duaXplZCBVVEYtOCBhbmQgVVRGLTE2ICgxIGFuZCAyIGJ5dGUgZW5jb2RpbmdzIG9mIFVuaWNvZGUpLAorb3RoZXIgZW5jb2RpbmdzIG1heSBiZSBkZWNsYXJlZCBpbiBYTUwgZG9jdW1lbnRzIG9yIGVudGl0aWVzLiBGb3IgdGhlCittYWluIGRvY3VtZW50LCBhbiBYTUwgZGVjbGFyYXRpb24gbWF5IGNvbnRhaW4gYW4gZW5jb2RpbmcKK2RlY2xhcmF0aW9uOjwvcD4KKzxwcmU+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0yIj8mZ3Q7Cis8L3ByZT4KKworPHA+RXh0ZXJuYWwgcGFyc2VkIGVudGl0aWVzIG1heSBiZWdpbiB3aXRoIGEgdGV4dCBkZWNsYXJhdGlvbiwgd2hpY2gKK2xvb2tzIGxpa2UgYW4gWE1MIGRlY2xhcmF0aW9uIHdpdGgganVzdCBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbjo8L3A+Cis8cHJlPgorJmx0Oz94bWwgZW5jb2Rpbmc9IkJpZzUiPyZndDsKKzwvcHJlPgorCis8cD5XaXRoIEV4cGF0LCB5b3UgbWF5IGFsc28gc3BlY2lmeSBhbiBlbmNvZGluZyBhdCB0aGUgdGltZSBvZgorY3JlYXRpbmcgYSBwYXJzZXIuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIGVuY29kaW5nIGluZm9ybWF0aW9uIG1heQorY29tZSBmcm9tIGEgc291cmNlIG91dHNpZGUgdGhlIGRvY3VtZW50IGl0c2VsZiAobGlrZSBhIGhpZ2hlciBsZXZlbAorcHJvdG9jb2wuKTwvcD4KKworPHA+PGEgbmFtZT0iYnVpbHRpbl9lbmNvZGluZ3MiPjwvYT5UaGVyZSBhcmUgZm91ciBidWlsdC1pbiBlbmNvZGluZ3MKK2luIEV4cGF0OjwvcD4KKzx1bD4KKzxsaT5VVEYtODwvbGk+Cis8bGk+VVRGLTE2PC9saT4KKzxsaT5JU08tODg1OS0xPC9saT4KKzxsaT5VUy1BU0NJSTwvbGk+Cis8L3VsPgorCis8cD5Bbnl0aGluZyBlbHNlIGRpc2NvdmVyZWQgaW4gYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24gb3IgaW4gdGhlCitwcm90b2NvbCBlbmNvZGluZyBzcGVjaWZpZWQgaW4gdGhlIHBhcnNlciBjb25zdHJ1Y3RvciwgdHJpZ2dlcnMgYSBjYWxsCit0byB0aGUgPGNvZGU+VW5rbm93bkVuY29kaW5nSGFuZGxlcjwvY29kZT4uIFRoaXMgaGFuZGxlciBnZXRzIHBhc3NlZAordGhlIGVuY29kaW5nIG5hbWUgYW5kIGEgcG9pbnRlciB0byBhbiA8Y29kZT5YTUxfRW5jb2Rpbmc8L2NvZGU+IGRhdGEKK3N0cnVjdHVyZS4gWW91ciBoYW5kbGVyIG11c3QgZmlsbCBpbiB0aGlzIHN0cnVjdHVyZSBhbmQgcmV0dXJuCis8Y29kZT5YTUxfU1RBVFVTX09LPC9jb2RlPiBpZiBpdCBrbm93cyBob3cgdG8gZGVhbCB3aXRoIHRoZQorZW5jb2RpbmcuIE90aGVyd2lzZSB0aGUgaGFuZGxlciBzaG91bGQgcmV0dXJuCis8Y29kZT5YTUxfU1RBVFVTX0VSUk9SPC9jb2RlPi4gIFRoZSBoYW5kbGVyIGFsc28gZ2V0cyBwYXNzZWQgYSBwb2ludGVyCit0byBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbiBkYXRhIHN0cnVjdHVyZSB0aGF0IHlvdSBtYXkgaW5kaWNhdGUgd2hlbgoreW91IHNldCB0aGUgaGFuZGxlci48L3A+CisKKzxwPkV4cGF0IHBsYWNlcyByZXN0cmljdGlvbnMgb24gY2hhcmFjdGVyIGVuY29kaW5ncyB0aGF0IGl0IGNhbgorc3VwcG9ydCBieSBmaWxsaW5nIGluIHRoZSA8Y29kZT5YTUxfRW5jb2Rpbmc8L2NvZGU+IHN0cnVjdHVyZS4KK2luY2x1ZGUgZmlsZTo8L3A+Cis8b2w+Cis8bGk+RXZlcnkgQVNDSUkgY2hhcmFjdGVyIHRoYXQgY2FuIGFwcGVhciBpbiBhIHdlbGwtZm9ybWVkIFhNTCBkb2N1bWVudAorbXVzdCBiZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBieXRlLCBhbmQgdGhhdCBieXRlIG11c3QgY29ycmVzcG9uZCB0bworaXQncyBBU0NJSSBlbmNvZGluZyAoZXhjZXB0IGZvciB0aGUgY2hhcmFjdGVycyAkQFxeJ3t9fik8L2xpPgorPGxpPkNoYXJhY3RlcnMgbXVzdCBiZSBlbmNvZGVkIGluIDQgYnl0ZXMgb3IgbGVzcy48L2xpPgorPGxpPkFsbCBjaGFyYWN0ZXJzIGVuY29kZWQgbXVzdCBoYXZlIFVuaWNvZGUgc2NhbGFyIHZhbHVlcyBsZXNzIHRoYW4gb3IKK2VxdWFsIHRvIDY1NTM1ICgweEZGRkYpPGVtPlRoaXMgZG9lcyBub3QgYXBwbHkgdG8gdGhlIGJ1aWx0LWluIHN1cHBvcnQKK2ZvciBVVEYtMTYgYW5kIFVURi04PC9lbT48L2xpPgorPGxpPk5vIGNoYXJhY3RlciBtYXkgYmUgZW5jb2RlZCBieSBtb3JlIHRoYXQgb25lIGRpc3RpbmN0IHNlcXVlbmNlIG9mCitieXRlczwvbGk+Cis8L29sPgorCis8cD48Y29kZT5YTUxfRW5jb2Rpbmc8L2NvZGU+IGNvbnRhaW5zIGFuIGFycmF5IG9mIGludGVnZXJzIHRoYXQKK2NvcnJlc3BvbmQgdG8gdGhlIDFzdCBieXRlIG9mIGFuIGVuY29kaW5nIHNlcXVlbmNlLiBJZiB0aGUgdmFsdWUgaW4KK3RoZSBhcnJheSBmb3IgYSBieXRlIGlzIHplcm8gb3IgcG9zaXRpdmUsIHRoZW4gdGhlIGJ5dGUgaXMgYSBzaW5nbGUKK2J5dGUgZW5jb2RpbmcgdGhhdCBlbmNvZGVzIHRoZSBVbmljb2RlIHNjYWxhciB2YWx1ZSBjb250YWluZWQgaW4gdGhlCithcnJheS4gQSAtMSBpbiB0aGlzIGFycmF5IGluZGljYXRlcyBhIG1hbGZvcm1lZCBieXRlLiBJZiB0aGUgdmFsdWUgaXMKKy0yLCAtMywgb3IgLTQsIHRoZW4gdGhlIGJ5dGUgaXMgdGhlIGJlZ2lubmluZyBvZiBhIDIsIDMsIG9yIDQgYnl0ZQorc2VxdWVuY2UgcmVzcGVjdGl2ZWx5LiBNdWx0aS1ieXRlIHNlcXVlbmNlcyBhcmUgc2VudCB0byB0aGUgY29udmVydAorZnVuY3Rpb24gcG9pbnRlZCBhdCBpbiB0aGUgPGNvZGU+WE1MX0VuY29kaW5nPC9jb2RlPiBzdHJ1Y3R1cmUuIFRoaXMKK2Z1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIFVuaWNvZGUgc2NhbGFyIHZhbHVlIGZvciB0aGUgc2VxdWVuY2Ugb3IgLTEKK2lmIHRoZSBzZXF1ZW5jZSBpcyBtYWxmb3JtZWQuPC9wPgorCis8cD5PbmUgcGl0ZmFsbCB0aGF0IG5vdmljZSBFeHBhdCB1c2VycyBhcmUgbGlrZWx5IHRvIGZhbGwgaW50byBpcyB0aGF0CithbHRob3VnaCBFeHBhdCBtYXkgYWNjZXB0IGlucHV0IGluIHZhcmlvdXMgZW5jb2RpbmdzLCB0aGUgc3RyaW5ncyB0aGF0CitpdCBwYXNzZXMgdG8gdGhlIGhhbmRsZXJzIGFyZSBhbHdheXMgZW5jb2RlZCBpbiBVVEYtOCBvciBVVEYtMTYKKyhkZXBlbmRpbmcgb24gaG93IEV4cGF0IHdhcyBjb21waWxlZCkuIFlvdXIgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUKK2ZvciBhbnkgdHJhbnNsYXRpb24gb2YgdGhlc2Ugc3RyaW5ncyBpbnRvIG90aGVyIGVuY29kaW5ncy48L3A+CisKKzxoMz5IYW5kbGluZyBFeHRlcm5hbCBFbnRpdHkgUmVmZXJlbmNlczwvaDM+CisKKzxwPkV4cGF0IGRvZXMgbm90IHJlYWQgb3IgcGFyc2UgZXh0ZXJuYWwgZW50aXRpZXMgZGlyZWN0bHkuIE5vdGUgdGhhdAorYW55IGV4dGVybmFsIERURCBpcyBhIHNwZWNpYWwgY2FzZSBvZiBhbiBleHRlcm5hbCBlbnRpdHkuICBJZiB5b3UndmUKK3NldCBubyA8Y29kZT5FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI8L2NvZGU+LCB0aGVuIGV4dGVybmFsIGVudGl0eQorcmVmZXJlbmNlcyBhcmUgc2lsZW50bHkgaWdub3JlZC4gT3RoZXJ3aXNlLCBpdCBjYWxscyB5b3VyIGhhbmRsZXIgd2l0aAordGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byByZWFkIGFuZCBwYXJzZSB0aGUgZXh0ZXJuYWwgZW50aXR5LjwvcD4KKworPHA+WW91ciBoYW5kbGVyIGlzbid0IGFjdHVhbGx5IHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSBlbnRpdHksIGJ1dAoraXQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgc3Vic2lkaWFyeSBwYXJzZXIgd2l0aCA8Y29kZT48YSBocmVmPQorIiNYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiCis+WE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlPC9hPjwvY29kZT4gdGhhdCB3aWxsIGRvIHRoZSBqb2IuIFRoaXMKK3JldHVybnMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+WE1MX1BhcnNlcjwvY29kZT4gdGhhdCBoYXMgaGFuZGxlcnMgYW5kCitvdGhlciBkYXRhIHN0cnVjdHVyZXMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgcGFyZW50IHBhcnNlci4gWW91IG1heSB0aGVuCit1c2UgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2UiID5YTUxfUGFyc2U8L2E+PC9jb2RlPiBvciA8Y29kZT48YQoraHJlZj0gIiNYTUxfUGFyc2VCdWZmZXIiPlhNTF9QYXJzZUJ1ZmZlcjwvYT48L2NvZGU+IGNhbGxzIGFnYWluc3QgdGhpcworcGFyc2VyLiAgU2luY2UgZXh0ZXJuYWwgZW50aXRpZXMgbXkgcmVmZXIgdG8gb3RoZXIgZXh0ZXJuYWwgZW50aXRpZXMsCit5b3VyIGhhbmRsZXIgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseS48L3A+CisKKzxoMz5QYXJzaW5nIERURHM8L2gzPgorCis8cD5JbiBvcmRlciB0byBwYXJzZSBwYXJhbWV0ZXIgZW50aXRpZXMsIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2UsCit5b3UgbXVzdCBjYWxsIDxjb2RlPjxhIGhyZWY9ICIjWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyIKKz5YTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nPC9hPjwvY29kZT4gd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZworYXJndW1lbnRzOjwvcD4KKzxkbD4KKzxkdD48Y29kZT5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVI8L2NvZGU+PC9kdD4KKzxkZD5Eb24ndCBwYXJzZSBwYXJhbWV0ZXIgZW50aXRpZXMgb3IgdGhlIGV4dGVybmFsIHN1YnNldDwvZGQ+Cis8ZHQ+PGNvZGU+WE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX1VOTEVTU19TVEFOREFMT05FPC9jb2RlPjwvZHQ+Cis8ZGQ+UGFyc2UgcGFyYW1ldGVyIGVudGl0ZXMgYW5kIHRoZSBleHRlcm5hbCBzdWJzZXQgdW5sZXNzCis8Y29kZT5zdGFuZGFsb25lPC9jb2RlPiB3YXMgc2V0IHRvICJ5ZXMiIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uPC9kZD4KKzxkdD48Y29kZT5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTPC9jb2RlPjwvZHQ+Cis8ZGQ+QWx3YXlzIHBhcnNlIHBhcmFtZXRlciBlbnRpdGllcyBhbmQgdGhlIGV4dGVybmFsIHN1YnNldDwvZGQ+Cis8L2RsPgorCis8cD5JbiBvcmRlciB0byByZWFkIGFuIGV4dGVybmFsIERURCwgeW91IGFsc28gaGF2ZSB0byBzZXQgYW4gZXh0ZXJuYWwKK2VudGl0eSByZWZlcmVuY2UgaGFuZGxlciBhcyBkZXNjcmliZWQgYWJvdmUuPC9wPgorCis8aDMgaWQ9InN0b3AtcmVzdW1lIj5UZW1wb3JhcmlseSBTdG9wcGluZyBQYXJzaW5nPC9oMz4KKworPHA+RXhwYXQgMS45NS44IGludHJvZHVjZXMgYSBuZXcgZmVhdHVyZTogaXRzIG5vdyBwb3NzaWJsZSB0byBzdG9wCitwYXJzaW5nIHRlbXBvcmFyaWx5IGZyb20gd2l0aGluIGEgaGFuZGxlciBmdW5jdGlvbiwgZXZlbiBpZiBtb3JlIGRhdGEKK2hhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIGludG8gdGhlIHBhcnNlci4gIEFwcGxpY2F0aW9ucyBmb3IgdGhpcworaW5jbHVkZTwvcD4KKworPHVsPgorICA8bGk+U3VwcG9ydGluZyB0aGUgPGEgaHJlZj0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hpbmNsdWRlLyIKKyAgPlhJbmNsdWRlPC9hPiBzcGVjaWZpY2F0aW9uLjwvbGk+CisKKyAgPGxpPkRlbGF5aW5nIGZ1cnRoZXIgcHJvY2Vzc2luZyB1bnRpbCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzCisgIGF2YWlsYWJsZSBmcm9tIHNvbWUgb3RoZXIgc291cmNlLjwvbGk+CisKKyAgPGxpPkFkanVzdGluZyBwcm9jZXNzb3IgbG9hZCBhcyB0YXNrIHByaW9yaXRpZXMgc2hpZnQgd2l0aGluIGFuCisgIGFwcGxpY2F0aW9uLjwvbGk+CisKKyAgPGxpPlN0b3BwaW5nIHBhcnNpbmcgY29tcGxldGVseSAoc2ltcGx5IGZyZWUgb3IgcmVzZXQgdGhlIHBhcnNlcgorICBpbnN0ZWFkIG9mIHJlc3VtaW5nIGluIHRoZSBvdXRlciBwYXJzaW5nIGxvb3ApLiAgVGhpcyBjYW4gYmUgdXNlZnVsCisgIGlmIGEgYXBwbGljYXRpb24tZG9tYWluIGVycm9yIGlzIGZvdW5kIGluIHRoZSBYTUwgYmVpbmcgcGFyc2VkIG9yIGlmCisgIHRoZSByZXN1bHQgb2YgdGhlIHBhcnNlIGlzIGRldGVybWluZWQgbm90IHRvIGJlIHVzZWZ1bCBhZnRlcgorICBhbGwuPC9saT4KKzwvdWw+CisKKzxwPlRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgZmVhdHVyZSwgdGhlIG1haW4gcGFyc2luZyBsb29wIG9mIGFuCithcHBsaWNhdGlvbiBuZWVkcyB0byBzdXBwb3J0IHRoaXMgc3BlY2lmaWNhbGx5LiAgSXQgY2Fubm90IGJlCitzdXBwb3J0ZWQgd2l0aCBhIHBhcnNpbmcgbG9vcCBjb21wYXRpYmxlIHdpdGggRXhwYXQgMS45NS43IG9yCitlYXJsaWVyICh0aG91Z2ggZXhpc3RpbmcgbG9vcHMgd2lsbCBjb250aW51ZSB0byB3b3JrIHdpdGhvdXQKK3N1cHBvcnRpbmcgdGhlIHN0b3AvcmVzdW1lIGZlYXR1cmUpLjwvcD4KKworPHA+QW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoaXMgZmVhdHVyZSBmb3IgYSBzaW5nbGUgcGFyc2VyIHdpbGwgaGF2ZQordGhlIHJvdWdoIHN0cnVjdHVyZSAoaW4gcHNldWRvLWNvZGUpOjwvcD4KKworPHByZSBjbGFzcz0icHNldWRvY29kZSI+CitmZCA9IG9wZW5faW5wdXQoKQorcCA9IGNyZWF0ZV9wYXJzZXIoKQorCitpZiBwYXJzZV94bWwocCwgZmQpIHsKKyAgLyogc3VzcGVuZGVkICovCisKKyAgaW50IHN1c3BlbmRlZCA9IDE7CisKKyAgd2hpbGUgKHN1c3BlbmRlZCkgeworICAgIGRvX3NvbWV0aGluZ19lbHNlKCkKKyAgICBpZiByZWFkeV90b19yZXN1bWUoKSB7CisgICAgICBzdXNwZW5kZWQgPSBjb250aW51ZV9wYXJzaW5nKHAsIGZkKTsKKyAgICB9CisgIH0KK30KKzwvcHJlPgorCis8cD5BbiBhcHBsaWNhdGlvbiB0aGF0IG1heSByZXN1bWUgYW55IG9mIHNldmVyYWwgcGFyc2VycyBiYXNlZCBvbgoraW5wdXQgKGVpdGhlciBmcm9tIHRoZSBYTUwgYmVpbmcgcGFyc2VkIG9yIHNvbWUgb3RoZXIgc291cmNlKSB3aWxsCitjZXJ0YWlubHkgaGF2ZSBtb3JlIGludGVyZXN0aW5nIGNvbnRyb2wgc3RydWN0dXJlcy48L3A+CisKKzxwPlRoaXMgQyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIGZvciB0aGUgPGNvZGU+cGFyc2VfeG1sPC9jb2RlPgorZnVuY3Rpb24gbWVudGlvbmVkIGluIHRoZSBwc2V1ZG8tY29kZSBhYm92ZTo8L3A+CisKKzxwcmUgY2xhc3M9ImVnIj4KKyNkZWZpbmUgQlVGRl9TSVpFIDEwMjQwCisKKy8qIFBhcnNlIGEgZG9jdW1lbnQgZnJvbSB0aGUgb3BlbiBmaWxlIGRlc2NyaXB0b3IgJ2ZkJyB1bnRpbCB0aGUgcGFyc2UKKyAgIGlzIGNvbXBsZXRlICh0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY29tcGxldGVseSBwYXJzZWQsIG9yIHRoZXJlJ3MKKyAgIGJlZW4gYW4gZXJyb3IpLCBvciB0aGUgcGFyc2UgaXMgc3RvcHBlZC4gIFJldHVybiBub24temVybyB3aGVuCisgICB0aGUgcGFyc2UgaXMgbWVyZWx5IHN1c3BlbmRlZC4KKyovCitpbnQKK3BhcnNlX3htbChYTUxfUGFyc2VyIHAsIGludCBmZCkKK3sKKyAgZm9yICg7OykgeworICAgIGludCBsYXN0X2NodW5rOworICAgIGludCBieXRlc19yZWFkOworICAgIGVudW0gWE1MX1N0YXR1cyBzdGF0dXM7CisKKyAgICB2b2lkICpidWZmID0gWE1MX0dldEJ1ZmZlcihwLCBCVUZGX1NJWkUpOworICAgIGlmIChidWZmID09IE5VTEwpIHsKKyAgICAgIC8qIGhhbmRsZSBlcnJvci4uLiAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGJ5dGVzX3JlYWQgPSByZWFkKGZkLCBidWZmLCBCVUZGX1NJWkUpOworICAgIGlmIChieXRlc19yZWFkICZsdDsgMCkgeworICAgICAgLyogaGFuZGxlIGVycm9yLi4uICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3RhdHVzID0gWE1MX1BhcnNlQnVmZmVyKHAsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgIGNhc2UgWE1MX1NUQVRVU19FUlJPUjoKKyAgICAgICAgLyogaGFuZGxlIGVycm9yLi4uICovCisgICAgICAgIHJldHVybiAwOworICAgICAgY2FzZSBYTUxfU1RBVFVTX1NVU1BFTkRFRDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChieXRlc19yZWFkID09IDApCisgICAgICByZXR1cm4gMDsKKyAgfQorfQorPC9wcmU+CisKKzxwPlRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPmNvbnRpbnVlX3BhcnNpbmc8L2NvZGU+IGZ1bmN0aW9uIGlzCitzb21ld2hhdCBzaW1wbGVyLCBzaW5jZSBpdCBvbmx5IG5lZWQgZGVhbCB3aXRoIHRoZSByZXR1cm4gY29kZSBmcm9tCis8Y29kZT48YSBocmVmPSAiI1hNTF9SZXN1bWVQYXJzZXIiPlhNTF9SZXN1bWVQYXJzZXI8L2E+PC9jb2RlPjsgaXQgY2FuCitkZWxlZ2F0ZSB0aGUgaW5wdXQgaGFuZGxpbmcgdG8gdGhlIDxjb2RlPnBhcnNlX3htbDwvY29kZT4KK2Z1bmN0aW9uOjwvcD4KKworPHByZSBjbGFzcz0iZWciPgorLyogQ29udGludWUgcGFyc2luZyBhIGRvY3VtZW50IHdoaWNoIGhhZCBiZWVuIHN1c3BlbmRlZC4gIFRoZSAncCcgYW5kCisgICAnZmQnIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgcGFzc2VkIHRvIHBhcnNlX3htbCgpLiAgUmV0dXJuCisgICBub24temVybyB3aGVuIHRoZSBwYXJzZSBpcyBzdXNwZW5kZWQuCisqLworaW50Citjb250aW51ZV9wYXJzaW5nKFhNTF9QYXJzZXIgcCwgaW50IGZkKQoreworICBlbnVtIFhNTF9TdGF0dXMgc3RhdHVzID0gWE1MX1Jlc3VtZVBhcnNlcihwKTsKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFhNTF9TVEFUVVNfRVJST1I6CisgICAgICAvKiBoYW5kbGUgZXJyb3IuLi4gKi8KKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgWE1MX0VSUk9SX05PVF9TVVNQRU5ERUQ6CisgICAgICAvKiBoYW5kbGUgZXJyb3IuLi4gKi8KKyAgICAgIHJldHVybiAwOy4KKyAgICBjYXNlIFhNTF9TVEFUVVNfU1VTUEVOREVEOgorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIHBhcnNlX3htbChwLCBmZCk7Cit9Cis8L3ByZT4KKworPHA+Tm93IHRoYXQgd2UndmUgc2VlbiB3aGF0IGEgbWVzcyB0aGUgdG9wLWxldmVsIHBhcnNpbmcgbG9vcCBjYW4KK2JlY29tZSwgd2hhdCBoYXZlIHdlIGdhaW5lZD8gIFZlcnkgc2ltcGx5LCB3ZSBjYW4gbm93IHVzZSB0aGUgPGNvZGU+PGEKK2hyZWY9ICIjWE1MX1N0b3BQYXJzZXIiID5YTUxfU3RvcFBhcnNlcjwvYT48L2NvZGU+IGZ1bmN0aW9uIHRvIHN0b3AKK3BhcnNpbmcsIHdpdGhvdXQgaGF2aW5nIHRvIGdvIHRvIGdyZWF0IGxlbmd0aHMgdG8gYXZvaWQgYWRkaXRpb25hbAorcHJvY2Vzc2luZyB0aGF0IHdlJ3JlIGV4cGVjdGluZyB0byBpZ25vcmUuICBBcyBhIGJvbnVzLCB3ZSBnZXQgdG8gc3RvcAorcGFyc2luZyA8ZW0+dGVtcG9yYXJpbHk8L2VtPiwgYW5kIGNvbWUgYmFjayB0byBpdCB3aGVuIHdlJ3JlCityZWFkeS48L3A+CisKKzxwPlRvIHN0b3AgcGFyc2luZyBmcm9tIGEgaGFuZGxlciBmdW5jdGlvbiwgdXNlIHRoZSA8Y29kZT48YSBocmVmPQorIiNYTUxfU3RvcFBhcnNlciIgPlhNTF9TdG9wUGFyc2VyPC9hPjwvY29kZT4gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uCit0YWtlcyB0d28gYXJndW1lbnRzOyB0aGUgcGFyc2VyIGJlaW5nIHN0b3BwZWQgYW5kIGEgZmxhZyBpbmRpY2F0aW5nCit3aGV0aGVyIHRoZSBwYXJzZSBjYW4gYmUgcmVzdW1lZCBpbiB0aGUgZnV0dXJlLjwvcD4KKworPCEtLSBYWFggcmVhbGx5IG5lZWQgbW9yZSBoZXJlIC0tPgorCisKKzxociAvPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8aDI+PGEgbmFtZT0icmVmZXJlbmNlIj5FeHBhdCBSZWZlcmVuY2U8L2E+PC9oMj4KKworPGgzPjxhIG5hbWU9ImNyZWF0aW9uIj5QYXJzZXIgQ3JlYXRpb248L2E+PC9oMz4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1BhcnNlckNyZWF0ZSI+CitYTUxfUGFyc2VyIFhNTENBTEwKK1hNTF9QYXJzZXJDcmVhdGUoY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK0NvbnN0cnVjdCBhIG5ldyBwYXJzZXIuIElmIGVuY29kaW5nIGlzIG5vbi1udWxsLCBpdCBzcGVjaWZpZXMgYQorY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50LiBUaGlzIG92ZXJyaWRlcyB0aGUgZG9jdW1lbnQKK2VuY29kaW5nIGRlY2xhcmF0aW9uLiBUaGVyZSBhcmUgZm91ciBidWlsdC1pbiBlbmNvZGluZ3M6Cis8dWw+Cis8bGk+VVMtQVNDSUk8L2xpPgorPGxpPlVURi04PC9saT4KKzxsaT5VVEYtMTY8L2xpPgorPGxpPklTTy04ODU5LTE8L2xpPgorPC91bD4KK0FueSBvdGhlciB2YWx1ZSB3aWxsIGludm9rZSBhIGNhbGwgdG8gdGhlIFVua25vd25FbmNvZGluZ0hhbmRsZXIuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1BhcnNlckNyZWF0ZU5TIj4KK1hNTF9QYXJzZXIgWE1MQ0FMTAorWE1MX1BhcnNlckNyZWF0ZU5TKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICBYTUxfQ2hhciBzZXApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorQ29uc3RydWN0cyBhIG5ldyBwYXJzZXIgdGhhdCBoYXMgbmFtZXNwYWNlIHByb2Nlc3NpbmcgaW4gZWZmZWN0LiBOYW1lc3BhY2UKK2V4cGFuZGVkIGVsZW1lbnQgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBhcmUgcmV0dXJuZWQgYXMgYSBjb25jYXRlbmF0aW9uCitvZiB0aGUgbmFtZXNwYWNlIFVSSSwgPGVtPnNlcDwvZW0+LCBhbmQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIG5hbWUuIFRoaXMKK21lYW5zIHRoYXQgeW91IHNob3VsZCBwaWNrIGEgY2hhcmFjdGVyIGZvciA8ZW0+c2VwPC9lbT4gdGhhdCBjYW4ndCBiZQorcGFydCBvZiBhIGxlZ2FsIFVSSS4gVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlbiA8ZW0+c2VwPC9lbT4gaXMgdGhlIG51bGwKK2NoYXJhY3RlciA8Y29kZT4nXDAnPC9jb2RlPjogdGhlIG5hbWVzcGFjZSBVUkkgYW5kIHRoZSBsb2NhbCBwYXJ0IHdpbGwgYmUKK2NvbmNhdGVuYXRlZCB3aXRob3V0IGFueSBzZXBhcmF0b3IgLSB0aGlzIGlzIGludGVuZGVkIHRvIHN1cHBvcnQgUkRGIHByb2Nlc3NvcnMuCitJdCBpcyBhIHByb2dyYW1taW5nIGVycm9yIHRvIHVzZSB0aGUgbnVsbCBzZXBhcmF0b3Igd2l0aCAKKzxhIGhyZWY9ICIjWE1MX1NldFJldHVybk5TVHJpcGxldCI+bmFtZXNwYWNlIHRyaXBsZXRzPC9hPi48L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1BhcnNlckNyZWF0ZV9NTSI+CitYTUxfUGFyc2VyIFhNTENBTEwKK1hNTF9QYXJzZXJDcmVhdGVfTU0oY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcywKKwkJICAgIGNvbnN0IFhNTF9DaGFyICpzZXApOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkICooWE1MQ0FMTCAqbWFsbG9jX2Zjbikoc2l6ZV90IHNpemUpOworICB2b2lkICooWE1MQ0FMTCAqcmVhbGxvY19mY24pKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworICB2b2lkIChYTUxDQUxMICpmcmVlX2Zjbikodm9pZCAqcHRyKTsKK30gWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KKzxwPkNvbnN0cnVjdCBhIG5ldyBwYXJzZXIgdXNpbmcgdGhlIHN1aXRlIG9mIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMKK3NwZWNpZmllZCBpbiA8Y29kZT5tczwvY29kZT4uIElmIDxjb2RlPm1zPC9jb2RlPiBpcyBOVUxMLCB0aGVuIHVzZSB0aGUKK3N0YW5kYXJkIHNldCBvZiBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuIElmIDxjb2RlPnNlcDwvY29kZT4gaXMKK25vbiBOVUxMLCB0aGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQgaW4gdGhlIGNyZWF0ZWQgcGFyc2VyCithbmQgdGhlIGNoYXJhY3RlciBwb2ludGVkIGF0IGJ5IHNlcCBpcyB1c2VkIGFzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbgordGhlIG5hbWVzcGFjZSBVUkkgYW5kIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBuYW1lLjwvcD4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiPgorWE1MX1BhcnNlciBYTUxDQUxMCitYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+WE1MX1BhcnNlcjwvY29kZT4gb2JqZWN0IGZvciBwYXJzaW5nIGFuIGV4dGVybmFsCitnZW5lcmFsIGVudGl0eS4gQ29udGV4dCBpcyB0aGUgY29udGV4dCBhcmd1bWVudCBwYXNzZWQgaW4gYSBjYWxsIHRvIGEKK0V4dGVybmFsRW50aXR5UmVmSGFuZGxlci4gT3RoZXIgc3RhdGUgaW5mb3JtYXRpb24gc3VjaCBhcyBoYW5kbGVycywKK3VzZXIgZGF0YSwgbmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHBhcnNlciBwYXNzZWQgYXMKK3RoZSAxc3QgYXJndW1lbnQuIFNvIHlvdSBzaG91bGRuJ3QgbmVlZCB0byBjYWxsIGFueSBvZiB0aGUgYmVoYXZpb3IKK2NoYW5naW5nIGZ1bmN0aW9ucyBvbiB0aGlzIHBhcnNlciAodW5sZXNzIHlvdSB3YW50IGl0IHRvIGFjdAorZGlmZmVyZW50bHkgdGhhbiB0aGUgcGFyZW50IHBhcnNlcikuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1BhcnNlckZyZWUiPgordm9pZCBYTUxDQUxMCitYTUxfUGFyc2VyRnJlZShYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorRnJlZSBtZW1vcnkgdXNlZCBieSB0aGUgcGFyc2VyLiBZb3VyIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgorZnJlZWluZyBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCA8YSBocmVmPSIjdXNlcmRhdGEiPnVzZXIgZGF0YTwvYT4uCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1BhcnNlclJlc2V0Ij4KK1hNTF9Cb29sIFhNTENBTEwKK1hNTF9QYXJzZXJSZXNldChYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK0NsZWFuIHVwIHRoZSBtZW1vcnkgc3RydWN0dXJlcyBtYWludGFpbmVkIGJ5IHRoZSBwYXJzZXIgc28gdGhhdCBpdCBtYXkKK2JlIHVzZWQgYWdhaW4uICBBZnRlciB0aGlzIGhhcyBiZWVuIGNhbGxlZCwgPGNvZGU+cGFyc2VyPC9jb2RlPiBpcworcmVhZHkgdG8gc3RhcnQgcGFyc2luZyBhIG5ldyBkb2N1bWVudC4gIEFsbCBoYW5kbGVycyBhcmUgY2xlYXJlZCBmcm9tCit0aGUgcGFyc2VyLCBleGNlcHQgZm9yIHRoZSB1bmtub3duRW5jb2RpbmdIYW5kbGVyLiAgVGhlIHBhcnNlcidzIGV4dGVybmFsCitzdGF0ZSBpcyByZS1pbml0aWFsaXplZCBleGNlcHQgZm9yIHRoZSB2YWx1ZXMgb2YgbnMgYW5kIG5zX3RyaXBsZXRzLgorVGhpcyBmdW5jdGlvbiBtYXkgbm90IGJlIHVzZWQgb24gYSBwYXJzZXIgY3JlYXRlZCB1c2luZyA8Y29kZT48YSBocmVmPQorIiNYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiID5YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGU8L2EKKz48L2NvZGU+OyBpdCB3aWxsIHJldHVybiA8Y29kZT5YTUxfRkFMU0U8L2NvZGU+IGluIHRoYXQgY2FzZS4gIFJldHVybnMKKzxjb2RlPlhNTF9UUlVFPC9jb2RlPiBvbiBzdWNjZXNzLiAgWW91ciBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IKK2RlYWxpbmcgd2l0aCBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCA8YSBocmVmPSIjdXNlcmRhdGEiPnVzZXIgZGF0YTwvYT4uCis8L2Rpdj4KKworPGgzPjxhIG5hbWU9InBhcnNpbmciPlBhcnNpbmc8L2E+PC9oMz4KKworPHA+VG8gc3RhdGUgdGhlIG9idmlvdXM6IHRoZSB0aHJlZSBwYXJzaW5nIGZ1bmN0aW9ucyA8Y29kZT48YSBocmVmPQorIiNYTUxfUGFyc2UiID5YTUxfUGFyc2U8L2E+PC9jb2RlPiwgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2VCdWZmZXIiPgorWE1MX1BhcnNlQnVmZmVyPC9hPjwvY29kZT4gYW5kIDxjb2RlPjxhIGhyZWY9ICIjWE1MX0dldEJ1ZmZlciI+CitYTUxfR2V0QnVmZmVyPC9hPjwvY29kZT4gbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgaGFuZGxlcgordW5sZXNzIHRoZXkgb3BlcmF0ZSBvbiBhIHNlcGFyYXRlIHBhcnNlciBpbnN0YW5jZSwgdGhhdCBpcywgb25lIHRoYXQKK2RpZCBub3QgY2FsbCB0aGUgaGFuZGxlci4gRm9yIGV4YW1wbGUsIGl0IGlzIE9LIHRvIGNhbGwgdGhlIHBhcnNpbmcKK2Z1bmN0aW9ucyBmcm9tIHdpdGhpbiBhbiA8Y29kZT5YTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyPC9jb2RlPiwKK2lmIHRoZXkgYXBwbHkgdG8gdGhlIHBhcnNlciBjcmVhdGVkIGJ5Cis8Y29kZT48YSBocmVmPSAiI1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIKKz5YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGU8L2E+PC9jb2RlPi48L3A+CisKKzxwPk5vdGU6IHRoZSA8Y29kZT5sZW48L2NvZGU+IGFyZ3VtZW50IHBhc3NlZCB0byB0aGVzZSBmdW5jdGlvbnMKK3Nob3VsZCBiZSBjb25zaWRlcmFibHkgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBhbiBpbnRlZ2VyLAorYXMgaXQgY291bGQgY3JlYXRlIGFuIGludGVnZXIgb3ZlcmZsb3cgc2l0dWF0aW9uIGlmIHRoZSBhZGRlZAorbGVuZ3RocyBvZiBhIGJ1ZmZlciBhbmQgdGhlIHVucHJvY2Vzc2VkIHBvcnRpb24gb2YgdGhlIHByZXZpb3VzIGJ1ZmZlcgorZXhjZWVkIHRoZSBtYXhpbXVtIGludGVnZXIgdmFsdWUuIElucHV0IGRhdGEgYXQgdGhlIGVuZCBvZiBhIGJ1ZmZlcgord2lsbCByZW1haW4gdW5wcm9jZXNzZWQgaWYgaXQgaXMgcGFydCBvZiBhbiBYTUwgdG9rZW4gZm9yIHdoaWNoIHRoZQorZW5kIGlzIG5vdCBwYXJ0IG9mIHRoYXQgYnVmZmVyLjwvcD4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1BhcnNlIj4KK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfUGFyc2UoWE1MX1BhcnNlciBwLAorICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgaW50IGxlbiwKKyAgICAgICAgICBpbnQgaXNGaW5hbCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+CitlbnVtIFhNTF9TdGF0dXMgeworICBYTUxfU1RBVFVTX0VSUk9SID0gMCwKKyAgWE1MX1NUQVRVU19PSyA9IDEKK307Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitQYXJzZSBzb21lIG1vcmUgb2YgdGhlIGRvY3VtZW50LiBUaGUgc3RyaW5nIDxjb2RlPnM8L2NvZGU+IGlzIGEgYnVmZmVyCitjb250YWluaW5nIHBhcnQgKG9yIHBlcmhhcHMgYWxsKSBvZiB0aGUgZG9jdW1lbnQuIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcwordGhhdCBhcmUgcGFydCBvZiB0aGUgZG9jdW1lbnQgaXMgaW5kaWNhdGVkIGJ5IDxjb2RlPmxlbjwvY29kZT4uIFRoaXMgbWVhbnMKK3RoYXQgPGNvZGU+czwvY29kZT4gZG9lc24ndCBoYXZlIHRvIGJlIG51bGwgdGVybWluYXRlZC4gSXQgYWxzbyBtZWFucyB0aGF0CitpZiA8Y29kZT5sZW48L2NvZGU+IGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJsb2NrIG9mCittZW1vcnkgdGhhdCA8Y29kZT5zPC9jb2RlPiBwb2ludHMgYXQsIHRoZW4gYSBtZW1vcnkgZmF1bHQgaXMgbGlrZWx5LiBUaGUKKzxjb2RlPmlzRmluYWw8L2NvZGU+IHBhcmFtZXRlciBpbmZvcm1zIHRoZSBwYXJzZXIgdGhhdCB0aGlzIGlzIHRoZSBsYXN0CitwaWVjZSBvZiB0aGUgZG9jdW1lbnQuIEZyZXF1ZW50bHksIHRoZSBsYXN0IHBpZWNlIGlzIGVtcHR5IChpLmUuCis8Y29kZT5sZW48L2NvZGU+IGlzIHplcm8uKQorSWYgYSBwYXJzZSBlcnJvciBvY2N1cnJlZCwgaXQgcmV0dXJucyA8Y29kZT5YTUxfU1RBVFVTX0VSUk9SPC9jb2RlPi4KK090aGVyd2lzZSBpdCByZXR1cm5zIDxjb2RlPlhNTF9TVEFUVVNfT0s8L2NvZGU+IHZhbHVlLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9QYXJzZUJ1ZmZlciI+CitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1BhcnNlQnVmZmVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICBpbnQgbGVuLAorICAgICAgICAgICAgICAgIGludCBpc0ZpbmFsKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1RoaXMgaXMganVzdCBsaWtlIDxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlIiA+WE1MX1BhcnNlPC9hPjwvY29kZT4sCitleGNlcHQgaW4gdGhpcyBjYXNlIEV4cGF0IHByb3ZpZGVzIHRoZSBidWZmZXIuICBCeSBvYnRhaW5pbmcgdGhlCitidWZmZXIgZnJvbSBFeHBhdCB3aXRoIHRoZSA8Y29kZT48YSBocmVmPSAiI1hNTF9HZXRCdWZmZXIiCis+WE1MX0dldEJ1ZmZlcjwvYT48L2NvZGU+IGZ1bmN0aW9uLCB0aGUgYXBwbGljYXRpb24gY2FuIGF2b2lkIGRvdWJsZQorY29weWluZyBvZiB0aGUgaW5wdXQuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldEJ1ZmZlciI+Cit2b2lkICogWE1MQ0FMTAorWE1MX0dldEJ1ZmZlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgIGludCBsZW4pOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorT2J0YWluIGEgYnVmZmVyIG9mIHNpemUgPGNvZGU+bGVuPC9jb2RlPiB0byByZWFkIGEgcGllY2Ugb2YgdGhlIGRvY3VtZW50CitpbnRvLiBBIE5VTEwgdmFsdWUgaXMgcmV0dXJuZWQgaWYgRXhwYXQgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IKK3RoaXMgYnVmZmVyLiBUaGlzIGhhcyB0byBiZSBjYWxsZWQgcHJpb3IgdG8gZXZlcnkgY2FsbCB0bworPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2VCdWZmZXIiID5YTUxfUGFyc2VCdWZmZXI8L2E+PC9jb2RlPi4gQQordHlwaWNhbCB1c2Ugd291bGQgbG9vayBsaWtlIHRoaXM6CisKKzxwcmUgY2xhc3M9ImVnIj4KK2ZvciAoOzspIHsKKyAgaW50IGJ5dGVzX3JlYWQ7CisgIHZvaWQgKmJ1ZmYgPSBYTUxfR2V0QnVmZmVyKHAsIEJVRkZfU0laRSk7CisgIGlmIChidWZmID09IE5VTEwpIHsKKyAgICAvKiBoYW5kbGUgZXJyb3IgKi8KKyAgfQorCisgIGJ5dGVzX3JlYWQgPSByZWFkKGRvY2ZkLCBidWZmLCBCVUZGX1NJWkUpOworICBpZiAoYnl0ZXNfcmVhZCAmbHQ7IDApIHsKKyAgICAvKiBoYW5kbGUgZXJyb3IgKi8KKyAgfQorCisgIGlmICghIFhNTF9QYXJzZUJ1ZmZlcihwLCBieXRlc19yZWFkLCBieXRlc19yZWFkID09IDApKSB7CisgICAgLyogaGFuZGxlIHBhcnNlIGVycm9yICovCisgIH0KKworICBpZiAoYnl0ZXNfcmVhZCA9PSAwKQorICAgIGJyZWFrOworfQorPC9wcmU+Cis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1N0b3BQYXJzZXIiPgorZW51bSBYTUxfU3RhdHVzIFhNTENBTEwKK1hNTF9TdG9wUGFyc2VyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgIFhNTF9Cb29sIHJlc3VtYWJsZSk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CisKKzxwPlN0b3BzIHBhcnNpbmcsIGNhdXNpbmcgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2UiCis+WE1MX1BhcnNlPC9hPjwvY29kZT4gb3IgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2VCdWZmZXIiCis+WE1MX1BhcnNlQnVmZmVyPC9hPjwvY29kZT4gdG8gcmV0dXJuLiAgTXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorY2FsbC1iYWNrIGhhbmRsZXIsIGV4Y2VwdCB3aGVuIGFib3J0aW5nICh3aGVuIDxjb2RlPnJlc3VtYWJsZTwvY29kZT4KK2lzIDxjb2RlPlhNTF9GQUxTRTwvY29kZT4pIGFuIGFscmVhZHkgc3VzcGVuZGVkIHBhcnNlci4gIFNvbWUKK2NhbGwtYmFja3MgbWF5IHN0aWxsIGZvbGxvdyBiZWNhdXNlIHRoZXkgd291bGQgb3RoZXJ3aXNlIGdldAorbG9zdCwgaW5jbHVkaW5nCis8dWw+CisgIDxsaT4gdGhlIGVuZCBlbGVtZW50IGhhbmRsZXIgZm9yIGVtcHR5IGVsZW1lbnRzIHdoZW4gc3RvcHBlZCBpbiB0aGUKKyAgICAgICBzdGFydCBlbGVtZW50IGhhbmRsZXIsPC9saT4KKyAgPGxpPiB0aGUgZW5kIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBoYW5kbGVyIHdoZW4gc3RvcHBlZCBpbiB0aGUgZW5kCisgICAgICAgZWxlbWVudCBoYW5kbGVyLDwvbGk+CisgIDxsaT4gdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIgd2hlbiBzdG9wcGVkIGluIHRoZSBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyCisgICAgICAgd2hpbGUgbWFraW5nIG11bHRpcGxlIGNhbGwtYmFja3Mgb24gYSBjb250aWd1b3VzIGNodW5rIG9mIGNoYXJhY3RlcnMsPC9saT4KKzwvdWw+CithbmQgcG9zc2libHkgb3RoZXJzLjwvcD4KKworPHA+VGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gbW9zdCBoYW5kbGVycywgaW5jbHVkaW5nIERURCByZWxhdGVkCitjYWxsLWJhY2tzLCBleGNlcHQgd2hlbiBwYXJzaW5nIGFuIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkgYW5kCis8Y29kZT5yZXN1bWFibGU8L2NvZGU+IGlzIDxjb2RlPlhNTF9UUlVFPC9jb2RlPi4gIFJldHVybnMKKzxjb2RlPlhNTF9TVEFUVVNfT0s8L2NvZGU+IHdoZW4gc3VjY2Vzc2Z1bCwKKzxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+IG90aGVyd2lzZS4gIFRoZSBwb3NzaWJsZSBlcnJvciBjb2RlcworYXJlOjwvcD4KKzxkbD4KKyAgPGR0Pjxjb2RlPlhNTF9FUlJPUl9TVVNQRU5ERUQ8L2NvZGU+PC9kdD4KKyAgPGRkPndoZW4gc3VzcGVuZGluZyBhbiBhbHJlYWR5IHN1c3BlbmRlZCBwYXJzZXIuPC9kZD4KKyAgPGR0Pjxjb2RlPlhNTF9FUlJPUl9GSU5JU0hFRDwvY29kZT48L2R0PgorICA8ZGQ+d2hlbiB0aGUgcGFyc2VyIGhhcyBhbHJlYWR5IGZpbmlzaGVkLjwvZGQ+CisgIDxkdD48Y29kZT5YTUxfRVJST1JfU1VTUEVORF9QRTwvY29kZT48L2R0PgorICA8ZGQ+d2hlbiBzdXNwZW5kaW5nIHdoaWxlIHBhcnNpbmcgYW4gZXh0ZXJuYWwgUEUuPC9kZD4KKzwvZGw+CisKKzxwPlNpbmNlIHRoZSBzdG9wL3Jlc3VtZSBmZWF0dXJlIHJlcXVpcmVzIGFwcGxpY2F0aW9uIHN1cHBvcnQgaW4gdGhlCitvdXRlciBwYXJzaW5nIGxvb3AsIGl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYSBwYXJzZXIKK25vdCBiZWluZyBoYW5kbGVkIGFwcHJvcHJpYXRlbHk7IHNlZSA8YSBocmVmPSAiI3N0b3AtcmVzdW1lIgorPlRlbXBvcmFyaWx5IFN0b3BwaW5nIFBhcnNpbmc8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKworPHA+V2hlbiA8Y29kZT5yZXN1bWFibGU8L2NvZGU+IGlzIDxjb2RlPlhNTF9UUlVFPC9jb2RlPiB0aGVuIHBhcnNpbmcKK2lzIDxlbT5zdXNwZW5kZWQ8L2VtPiwgdGhhdCBpcywgPGNvZGU+PGEgaHJlZj0gIiNYTUxfUGFyc2UiCis+WE1MX1BhcnNlPC9hPjwvY29kZT4gYW5kIDxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlQnVmZmVyIgorPlhNTF9QYXJzZUJ1ZmZlcjwvYT48L2NvZGU+IHJldHVybiA8Y29kZT5YTUxfU1RBVFVTX1NVU1BFTkRFRDwvY29kZT4uCitPdGhlcndpc2UsIHBhcnNpbmcgaXMgPGVtPmFib3J0ZWQ8L2VtPiwgdGhhdCBpcywgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1BhcnNlIiA+WE1MX1BhcnNlPC9hPjwvY29kZT4gYW5kIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9QYXJzZUJ1ZmZlciIgPlhNTF9QYXJzZUJ1ZmZlcjwvYT48L2NvZGU+IHJldHVybgorPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4gd2l0aCBlcnJvciBjb2RlCis8Y29kZT5YTUxfRVJST1JfQUJPUlRFRDwvY29kZT4uPC9wPgorCis8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CitUaGlzIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgY3VycmVudCBwYXJzZXIgaW5zdGFuY2Ugb25seSwgdGhhdCBpcywgaWYKK3RoZXJlIGlzIGEgcGFyZW50IHBhcnNlciB0aGVuIGl0IHdpbGwgY29udGludWUgcGFyc2luZyB3aGVuIHRoZQorZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZSBoYW5kbGVyIHJldHVybnMuICBJdCBpcyB1cCB0byB0aGUKK2ltcGxlbWVudGF0aW9uIG9mIHRoYXQgaGFuZGxlciB0byBjYWxsIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9TdG9wUGFyc2VyIiA+WE1MX1N0b3BQYXJzZXI8L2E+PC9jb2RlPiBvbiB0aGUgcGFyZW50IHBhcnNlcgorKHJlY3Vyc2l2ZWx5KSwgaWYgb25lIHdhbnRzIHRvIHN0b3AgcGFyc2luZyBhbHRvZ2V0aGVyLjwvcD4KKworPHA+V2hlbiBzdXNwZW5kZWQsIHBhcnNpbmcgY2FuIGJlIHJlc3VtZWQgYnkgY2FsbGluZyA8Y29kZT48YSBocmVmPQorIiNYTUxfUmVzdW1lUGFyc2VyIiA+WE1MX1Jlc3VtZVBhcnNlcjwvYT48L2NvZGU+LjwvcD4KKworPHA+TmV3IGluIEV4cGF0IDEuOTUuOC48L3A+Cis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1Jlc3VtZVBhcnNlciI+CitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1Jlc3VtZVBhcnNlcihYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorPHA+UmVzdW1lcyBwYXJzaW5nIGFmdGVyIGl0IGhhcyBiZWVuIHN1c3BlbmRlZCB3aXRoIDxjb2RlPjxhIGhyZWY9CisiI1hNTF9TdG9wUGFyc2VyIiA+WE1MX1N0b3BQYXJzZXI8L2E+PC9jb2RlPi4gIE11c3Qgbm90IGJlIGNhbGxlZCBmcm9tCit3aXRoaW4gYSBoYW5kbGVyIGNhbGwtYmFjay4gIFJldHVybnMgc2FtZSBzdGF0dXMgY29kZXMgYXMgPGNvZGU+PGEKK2hyZWY9ICIjWE1MX1BhcnNlIj5YTUxfUGFyc2U8L2E+PC9jb2RlPiBvciA8Y29kZT48YSBocmVmPQorIiNYTUxfUGFyc2VCdWZmZXIiID5YTUxfUGFyc2VCdWZmZXI8L2E+PC9jb2RlPi4gIEFuIGFkZGl0aW9uYWwgZXJyb3IKK2NvZGUsIDxjb2RlPlhNTF9FUlJPUl9OT1RfU1VTUEVOREVEPC9jb2RlPiwgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUKK3BhcnNlciB3YXMgbm90IGN1cnJlbnRseSBzdXNwZW5kZWQuPC9wPgorCis8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CitUaGlzIG11c3QgYmUgY2FsbGVkIG9uIHRoZSBtb3N0IGRlZXBseSBuZXN0ZWQgY2hpbGQgcGFyc2VyIGluc3RhbmNlCitmaXJzdCwgYW5kIG9uIGl0cyBwYXJlbnQgcGFyc2VyIG9ubHkgYWZ0ZXIgdGhlIGNoaWxkIHBhcnNlciBoYXMKK2ZpbmlzaGVkLCB0byBiZSBhcHBsaWVkIHJlY3Vyc2l2ZWx5IHVudGlsIHRoZSBkb2N1bWVudCBlbnRpdHkncyBwYXJzZXIKK2lzIHJlc3RhcnRlZC4gIFRoYXQgaXMsIHRoZSBwYXJlbnQgcGFyc2VyIHdpbGwgbm90IHJlc3VtZSBieSBpdHNlbGYKK2FuZCBpdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8gY2FsbCA8Y29kZT48YSBocmVmPQorIiNYTUxfUmVzdW1lUGFyc2VyIiA+WE1MX1Jlc3VtZVBhcnNlcjwvYT48L2NvZGU+IG9uIGl0IGF0IHRoZQorYXBwcm9wcmlhdGUgbW9tZW50LjwvcD4KKworPHA+TmV3IGluIEV4cGF0IDEuOTUuOC48L3A+Cis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldFBhcnNpbmdTdGF0dXMiPgordm9pZCBYTUxDQUxMCitYTUxfR2V0UGFyc2luZ1N0YXR1cyhYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICBYTUxfUGFyc2luZ1N0YXR1cyAqc3RhdHVzKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK2VudW0gWE1MX1BhcnNpbmcgeworICBYTUxfSU5JVElBTElaRUQsCisgIFhNTF9QQVJTSU5HLAorICBYTUxfRklOSVNIRUQsCisgIFhNTF9TVVNQRU5ERUQKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfUGFyc2luZyBwYXJzaW5nOworICBYTUxfQm9vbCBmaW5hbEJ1ZmZlcjsKK30gWE1MX1BhcnNpbmdTdGF0dXM7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+Cis8cD5SZXR1cm5zIHN0YXR1cyBvZiBwYXJzZXIgd2l0aCByZXNwZWN0IHRvIGJlaW5nIGluaXRpYWxpemVkLAorcGFyc2luZywgZmluaXNoZWQsIG9yIHN1c3BlbmRlZCwgYW5kIHdoZXRoZXIgdGhlIGZpbmFsIGJ1ZmZlciBpcyBiZWluZworcHJvY2Vzc2VkLiAgVGhlIDxjb2RlPnN0YXR1czwvY29kZT4gcGFyYW1ldGVyIDxlbT5tdXN0IG5vdDwvZW0+IGJlCitOVUxMLjwvcD4KKworPHA+TmV3IGluIEV4cGF0IDEuOTUuOC48L3A+Cis8L2Rpdj4KKworCis8aDM+PGEgbmFtZT0ic2V0dGluZyI+SGFuZGxlciBTZXR0aW5nPC9hPjwvaDM+CisKKzxwPkFsdGhvdWdoIGhhbmRsZXJzIGFyZSB0eXBpY2FsbHkgc2V0IHByaW9yIHRvIHBhcnNpbmcgYW5kIGxlZnQgYWxvbmUsIGFuCithcHBsaWNhdGlvbiBtYXkgY2hvb3NlIHRvIHNldCBvciBjaGFuZ2UgdGhlIGhhbmRsZXIgZm9yIGEgcGFyc2luZyBldmVudAord2hpbGUgdGhlIHBhcnNlIGlzIGluIHByb2dyZXNzLiBGb3IgaW5zdGFuY2UsIHlvdXIgYXBwbGljYXRpb24gbWF5IGNob29zZQordG8gaWdub3JlIGFsbCB0ZXh0IG5vdCBkZXNjZW5kZWQgZnJvbSBhIDxjb2RlPnBhcmE8L2NvZGU+IGVsZW1lbnQuIE9uZQord2F5IGl0IGNvdWxkIGRvIHRoaXMgaXMgdG8gc2V0IHRoZSBjaGFyYWN0ZXIgaGFuZGxlciB3aGVuIGEgcGFyYSBzdGFydCB0YWcKK2lzIHNlZW4sIGFuZCB1bnNldCBpdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZW5kIHRhZy48L3A+CisKKzxwPkEgaGFuZGxlciBtYXkgYmUgPGVtPnVuc2V0PC9lbT4gYnkgcHJvdmlkaW5nIGEgTlVMTCBwb2ludGVyIHRvIHRoZQorYXBwcm9wcmlhdGUgaGFuZGxlciBzZXR0ZXIuIE5vbmUgb2YgdGhlIGhhbmRsZXIgc2V0dGluZyBmdW5jdGlvbnMgaGF2ZQorYSByZXR1cm4gdmFsdWUuPC9wPgorCis8cD5Zb3VyIGhhbmRsZXJzIHdpbGwgYmUgcmVjZWl2aW5nIHN0cmluZ3MgaW4gYXJyYXlzIG9mIHR5cGUKKzxjb2RlPlhNTF9DaGFyPC9jb2RlPi4gVGhpcyB0eXBlIGlzIGNvbmRpdGlvbmFsbHkgZGVmaW5lZCBpbiBleHBhdC5oIGFzCitlaXRoZXIgPGNvZGU+Y2hhcjwvY29kZT4sIDxjb2RlPndjaGFyX3Q8L2NvZGU+IG9yIDxjb2RlPnVuc2lnbmVkIHNob3J0PC9jb2RlPi4KK1RoZSBmb3JtZXIgaW1wbGllcyBVVEYtOCBlbmNvZGluZywgdGhlIGxhdHRlciB0d28gaW1wbHkgVVRGLTE2IGVuY29kaW5nLgorTm90ZSB0aGF0IHlvdSdsbCByZWNlaXZlIHRoZW0gaW4gdGhpcyBmb3JtIGluZGVwZW5kZW50IG9mIHRoZSBvcmlnaW5hbAorZW5jb2Rpbmcgb2YgdGhlIGRvY3VtZW50LjwvcD4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0KTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9TdGFydEVsZW1lbnRIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICoqYXR0cyk7Cis8L3ByZT4KKzxwPlNldCBoYW5kbGVyIGZvciBzdGFydCAoYW5kIGVtcHR5KSB0YWdzLiBBdHRyaWJ1dGVzIGFyZSBwYXNzZWQgdG8gdGhlIHN0YXJ0CitoYW5kbGVyIGFzIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBjaGFyIHBvaW50ZXJzLiBFYWNoIGF0dHJpYnV0ZSBzZWVuIGluCithIHN0YXJ0IChvciBlbXB0eSkgdGFnIG9jY3VwaWVzIDIgY29uc2VjdXRpdmUgcGxhY2VzIGluIHRoaXMgdmVjdG9yOiB0aGUKK2F0dHJpYnV0ZSBuYW1lIGZvbGxvd2VkIGJ5IHRoZSBhdHRyaWJ1dGUgdmFsdWUuIFRoZXNlIHBhaXJzIGFyZSB0ZXJtaW5hdGVkCitieSBhIG51bGwgcG9pbnRlci48L3A+Cis8cD5Ob3RlIHRoYXQgYW4gZW1wdHkgdGFnIGdlbmVyYXRlcyBhIGNhbGwgdG8gYm90aCBzdGFydCBhbmQgZW5kIGhhbmRsZXJzCisoaW4gdGhhdCBvcmRlcikuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kRWxlbWVudEhhbmRsZXIpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX0VuZEVsZW1lbnRIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lKTsKKzwvcHJlPgorPHA+U2V0IGhhbmRsZXIgZm9yIGVuZCAoYW5kIGVtcHR5KSB0YWdzLiBBcyBub3RlZCBhYm92ZSwgYW4gZW1wdHkgdGFnCitnZW5lcmF0ZXMgYSBjYWxsIHRvIGJvdGggc3RhcnQgYW5kIGVuZCBoYW5kbGVycy48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RWxlbWVudEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRFbGVtZW50SGFuZGxlciBlbmQpOworPC9wcmU+Cis8cD5TZXQgaGFuZGxlcnMgZm9yIHN0YXJ0IGFuZCBlbmQgdGFncyB3aXRoIG9uZSBjYWxsLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGNoYXJobmRsKQorPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7Cis8L3ByZT4KKzxwPlNldCBhIHRleHQgaGFuZGxlci4gVGhlIHN0cmluZyB5b3VyIGhhbmRsZXIgcmVjZWl2ZXMKK2lzIDxlbT5OT1QgbnVsLXRlcm1pbmF0ZWQ8L2VtPi4gWW91IGhhdmUgdG8gdXNlIHRoZSBsZW5ndGggYXJndW1lbnQKK3RvIGRlYWwgd2l0aCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIEEgc2luZ2xlIGJsb2NrIG9mIGNvbnRpZ3VvdXMgdGV4dAorZnJlZSBvZiBtYXJrdXAgbWF5IHN0aWxsIHJlc3VsdCBpbiBhIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoaXMgaGFuZGxlci4KK0luIG90aGVyIHdvcmRzLCBpZiB5b3UncmUgc2VhcmNoaW5nIGZvciBhIHBhdHRlcm4gaW4gdGhlIHRleHQsIGl0IG1heQorYmUgc3BsaXQgYWNyb3NzIGNhbGxzIHRvIHRoaXMgaGFuZGxlci4gTm90ZTogU2V0dGluZyB0aGlzIGhhbmRsZXIgdG8gTlVMTAorbWF5IDxlbT5OT1QgaW1tZWRpYXRlbHk8L2VtPiB0ZXJtaW5hdGUgY2FsbC1iYWNrcyBpZiB0aGUgcGFyc2VyIGlzIGN1cnJlbnRseQorcHJvY2Vzc2luZyBzdWNoIGEgc2luZ2xlIGJsb2NrIG9mIGNvbnRpZ3VvdXMgbWFya3VwLWZyZWUgdGV4dCwgYXMgdGhlIHBhcnNlcgord2lsbCBjb250aW51ZSBjYWxsaW5nIGJhY2sgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2sgaXMgcmVhY2hlZC48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIHByb2MpCis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcikodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKTsKKworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4gVGhlIHRhcmdldCBpcyB0aGUgZmlyc3Qgd29yZAoraW4gdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIFRoZSBkYXRhIGlzIHRoZSByZXN0IG9mIHRoZSBjaGFyYWN0ZXJzIGluCitpdCBhZnRlciBza2lwcGluZyBhbGwgd2hpdGVzcGFjZSBhZnRlciB0aGUgaW5pdGlhbCB3b3JkLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRDb21tZW50SGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRDb21tZW50SGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbW1lbnRIYW5kbGVyIGNtbnQpCis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfQ29tbWVudEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRhdGEpOworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIGZvciBjb21tZW50cy4gVGhlIGRhdGEgaXMgYWxsIHRleHQgaW5zaWRlIHRoZSBjb21tZW50CitkZWxpbWl0ZXJzLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKSh2b2lkICp1c2VyRGF0YSk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdGhhdCBnZXRzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgQ0RBVEEgc2VjdGlvbi48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlcikodm9pZCAqdXNlckRhdGEpOworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIHRoYXQgZ2V0cyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhIENEQVRBIHNlY3Rpb24uPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKQorPC9wcmU+Cis8cD5TZXRzIGJvdGggQ0RBVEEgc2VjdGlvbiBoYW5kbGVycyB3aXRoIG9uZSBjYWxsLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXREZWZhdWx0SGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXREZWZhdWx0SGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0RlZmF1bHRIYW5kbGVyIGhuZGwpCis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfRGVmYXVsdEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKzwvcHJlPgorCis8cD5TZXRzIGEgaGFuZGxlciBmb3IgYW55IGNoYXJhY3RlcnMgaW4gdGhlIGRvY3VtZW50IHdoaWNoIHdvdWxkbid0CitvdGhlcndpc2UgYmUgaGFuZGxlZC4gVGhpcyBpbmNsdWRlcyBib3RoIGRhdGEgZm9yIHdoaWNoIG5vIGhhbmRsZXJzCitjYW4gYmUgc2V0IChsaWtlIHNvbWUga2luZHMgb2YgRFREIGRlY2xhcmF0aW9ucykgYW5kIGRhdGEgd2hpY2ggY291bGQKK2JlIHJlcG9ydGVkIGJ1dCB3aGljaCBjdXJyZW50bHkgaGFzIG5vIGhhbmRsZXIgc2V0LiAgVGhlIGNoYXJhY3RlcnMKK2FyZSBwYXNzZWQgZXhhY3RseSBhcyB0aGV5IHdlcmUgcHJlc2VudCBpbiB0aGUgWE1MIGRvY3VtZW50IGV4Y2VwdAordGhhdCB0aGV5IHdpbGwgYmUgZW5jb2RlZCBpbiBVVEYtOCBvciBVVEYtMTYuIExpbmUgYm91bmRhcmllcyBhcmUgbm90Citub3JtYWxpemVkLiBOb3RlIHRoYXQgYSBieXRlIG9yZGVyIG1hcmsgY2hhcmFjdGVyIGlzIG5vdCBwYXNzZWQgdG8gdGhlCitkZWZhdWx0IGhhbmRsZXIuIFRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGFib3V0IGhvdyBjaGFyYWN0ZXJzIGFyZQorZGl2aWRlZCBiZXR3ZWVuIGNhbGxzIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXI6IGZvciBleGFtcGxlLCBhIGNvbW1lbnQKK21pZ2h0IGJlIHNwbGl0IGJldHdlZW4gbXVsdGlwbGUgY2FsbHMuICBTZXR0aW5nIHRoZSBoYW5kbGVyIHdpdGgKK3RoaXMgY2FsbCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIHR1cm5pbmcgb2ZmIGV4cGFuc2lvbiBvZiByZWZlcmVuY2VzCit0byBpbnRlcm5hbGx5IGRlZmluZWQgZ2VuZXJhbCBlbnRpdGllcy4gSW5zdGVhZCB0aGVzZSByZWZlcmVuY2VzIGFyZQorcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIuPC9wPgorCis8cD5TZWUgYWxzbyA8Y29kZT48YQoraHJlZj0iI1hNTF9EZWZhdWx0Q3VycmVudCI+WE1MX0RlZmF1bHRDdXJyZW50PC9hPjwvY29kZT4uPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaG5kbCkKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9EZWZhdWx0SGFuZGxlcikodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworPC9wcmU+Cis8cD5UaGlzIHNldHMgYSBkZWZhdWx0IGhhbmRsZXIsIGJ1dCBkb2Vzbid0IGluaGliaXQgdGhlIGV4cGFuc2lvbiBvZgoraW50ZXJuYWwgZW50aXR5IHJlZmVyZW5jZXMuICBUaGUgZW50aXR5IHJlZmVyZW5jZSB3aWxsIG5vdCBiZSBwYXNzZWQKK3RvIHRoZSBkZWZhdWx0IGhhbmRsZXIuPC9wPgorCis8cD5TZWUgYWxzbyA8Y29kZT48YQoraHJlZj0iI1hNTF9EZWZhdWx0Q3VycmVudCI+WE1MX0RlZmF1bHRDdXJyZW50PC9hPjwvY29kZT4uPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGhuZGwpCis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIGludAorKFhNTENBTEwgKlhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIpKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKTsKKzwvcHJlPgorPHA+U2V0IGFuIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2UgaGFuZGxlci4gVGhpcyBoYW5kbGVyIGlzIGFsc28KK2NhbGxlZCBmb3IgcHJvY2Vzc2luZyBhbiBleHRlcm5hbCBEVEQgc3Vic2V0IGlmIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZworaXMgaW4gZWZmZWN0LiAoU2VlIDxhIGhyZWY9IiNYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIj4KKzxjb2RlPlhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmc8L2NvZGU+PC9hPi4pPC9wPgorCis8cD5UaGUgPGNvZGU+Y29udGV4dDwvY29kZT4gcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcGFyc2luZyBjb250ZXh0IGluCit0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSA8Y29kZT5jb250ZXh0PC9jb2RlPiBhcmd1bWVudCB0byA8Y29kZT48YQoraHJlZj0iI1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIKKz5YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGU8L2E+PC9jb2RlPi4gIDxjb2RlPmNvZGU8L2NvZGU+IGlzCit2YWxpZCBvbmx5IHVudGlsIHRoZSBoYW5kbGVyIHJldHVybnMsIHNvIGlmIHRoZSByZWZlcmVuY2VkIGVudGl0eSBpcwordG8gYmUgcGFyc2VkIGxhdGVyLCBpdCBtdXN0IGJlIGNvcGllZC4gIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGlzIE5VTEwKK29ubHkgd2hlbiB0aGUgZW50aXR5IGlzIGEgcGFyYW1ldGVyIGVudGl0eSwgd2hpY2ggaXMgaG93IG9uZSBjYW4KK2RpZmZlcmVudGlhdGUgYmV0d2VlbiBnZW5lcmFsIGFuZCBwYXJhbWV0ZXIgZW50aXRpZXMuPC9wPgorCis8cD5UaGUgPGNvZGU+YmFzZTwvY29kZT4gcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHRvIHVzZSBmb3IgcmVsYXRpdmUKK3N5c3RlbSBpZGVudGlmaWVycy4gIEl0IGlzIHNldCBieSA8Y29kZT48YQoraHJlZj0iI1hNTF9TZXRCYXNlIj5YTUxfU2V0QmFzZTwvYT48L2NvZGU+IGFuZCBtYXkgYmUgTlVMTC4gVGhlCis8Y29kZT5wdWJsaWNJZDwvY29kZT4gcGFyYW1ldGVyIGlzIHRoZSBwdWJsaWMgaWQgZ2l2ZW4gaW4gdGhlIGVudGl0eQorZGVjbGFyYXRpb24gYW5kIG1heSBiZSBOVUxMLiAgPGNvZGU+c3lzdGVtSWQ8L2NvZGU+IGlzIHRoZSBzeXN0ZW0KK2lkZW50aWZpZXIgc3BlY2lmaWVkIGluIHRoZSBlbnRpdHkgZGVjbGFyYXRpb24gYW5kIGlzIG5ldmVyIE5VTEwuPC9wPgorCis8cD5UaGVyZSBhcmUgYSBjb3VwbGUgb2Ygd2F5cyBpbiB3aGljaCB0aGlzIGhhbmRsZXIgZGlmZmVycyBmcm9tCitvdGhlcnMuICBGaXJzdCwgdGhpcyBoYW5kbGVyIHJldHVybnMgYSBzdGF0dXMgaW5kaWNhdG9yIChhbgoraW50ZWdlcikuIDxjb2RlPlhNTF9TVEFUVVNfT0s8L2NvZGU+IHNob3VsZCBiZSByZXR1cm5lZCBmb3Igc3VjY2Vzc2Z1bAoraGFuZGxpbmcgb2YgdGhlIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2UuICBSZXR1cm5pbmcKKzxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+IGluZGljYXRlcyBmYWlsdXJlLCBhbmQgY2F1c2VzIHRoZQorY2FsbGluZyBwYXJzZXIgdG8gcmV0dXJuIGFuCis8Y29kZT5YTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HPC9jb2RlPiBlcnJvci48L3A+CisKKzxwPlNlY29uZCwgaW5zdGVhZCBvZiBoYXZpbmcgdGhlIHVzZXIgZGF0YSBhcyBpdHMgZmlyc3QgYXJndW1lbnQsIGl0CityZWNlaXZlcyB0aGUgcGFyc2VyIHRoYXQgZW5jb3VudGVyZWQgdGhlIGVudGl0eSByZWZlcmVuY2UuIFRoaXMsIGFsb25nCit3aXRoIHRoZSBjb250ZXh0IHBhcmFtZXRlciwgbWF5IGJlIHVzZWQgYXMgYXJndW1lbnRzIHRvIGEgY2FsbCB0bworPGNvZGU+PGEgaHJlZj0gIiNYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUiCis+WE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlPC9hPjwvY29kZT4uICBVc2luZyB0aGUgcmV0dXJuZWQKK3BhcnNlciwgdGhlIGJvZHkgb2YgdGhlIGV4dGVybmFsIGVudGl0eSBjYW4gYmUgcmVjdXJzaXZlbHkgcGFyc2VkLjwvcD4KKworPHA+U2luY2UgdGhpcyBoYW5kbGVyIG1heSBiZSBjYWxsZWQgcmVjdXJzaXZlbHksIGl0IHNob3VsZCBub3QgYmUgc2F2aW5nCitpbmZvcm1hdGlvbiBpbnRvIGdsb2JhbCBvciBzdGF0aWMgdmFyaWFibGVzLjwvcD4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyhYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KKzxwPlNldCB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIuICBJZgorPGNvZGU+YXJnPC9jb2RlPiBpcyBub3QgTlVMTCwgaXQgaXMgdGhlIG5ldyB2YWx1ZSBwYXNzZWQgdG8gdGhlCitoYW5kbGVyIHNldCB1c2luZyA8Y29kZT48YSBocmVmPSIjWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciIKKz5YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyPC9hPjwvY29kZT47IGlmIDxjb2RlPmFyZzwvY29kZT4gaXMKK05VTEwsIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gd2lsbCBiZSB0aGUgcGFyc2VyCitvYmplY3QgaXRzZWxmLjwvcD4KKworPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorVGhlIHR5cGUgb2YgPGNvZGU+YXJnPC9jb2RlPiBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZQorRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGRvIG5vdCBtYXRjaC4gIFRoaXMgZnVuY3Rpb24gdGFrZXMgYQorPGNvZGU+dm9pZCAqPC9jb2RlPiB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIsIHdoaWxlIHRoZSBoYW5kbGVyCithY2NlcHRzIGFuIDxjb2RlPlhNTF9QYXJzZXI8L2NvZGU+LiAgVGhpcyBpcyBhIGhpc3RvcmljYWwgYWNjaWRlbnQsCitidXQgd2lsbCBub3QgYmUgY29ycmVjdGVkIGJlZm9yZSBFeHBhdCAyLjAgKGF0IHRoZSBlYXJsaWVzdCkgdG8gYXZvaWQKK2NhdXNpbmcgY29tcGlsZXIgd2FybmluZ3MgZm9yIGNvZGUgdGhhdCdzIGtub3duIHRvIHdvcmsgd2l0aCB0aGlzCitBUEkuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIGNvZGUgdG8ga25vdyB0aGUKK2FjdHVhbCB0eXBlIG9mIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgYW5kIHRvIG1hbmFnZSBpdAorcHJvcGVybHkuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIgaGFuZGxlcikKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlcikodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19wYXJhbWV0ZXJfZW50aXR5KTsKKzwvcHJlPgorPHA+U2V0IGEgc2tpcHBlZCBlbnRpdHkgaGFuZGxlci4gVGhpcyBpcyBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnM6PC9wPgorPG9sPgorICAgPGxpPkFuIGVudGl0eSByZWZlcmVuY2UgaXMgZW5jb3VudGVyZWQgZm9yIHdoaWNoIG5vIGRlY2xhcmF0aW9uCisgICAgICAgaGFzIGJlZW4gcmVhZCA8ZW0+YW5kPC9lbT4gdGhpcyBpcyBub3QgYW4gZXJyb3IuPC9saT4KKyAgIDxsaT5BbiBpbnRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlIGlzIHJlYWQsIGJ1dCBub3QgZXhwYW5kZWQsIGJlY2F1c2UKKyAgICAgICA8YSBocmVmPSIjWE1MX1NldERlZmF1bHRIYW5kbGVyIj48Y29kZT5YTUxfU2V0RGVmYXVsdEhhbmRsZXI8L2NvZGU+PC9hPgorCSAgIGhhcyBiZWVuIGNhbGxlZC48L2xpPgorPC9vbD4KKzxwPlRoZSA8Y29kZT5pc19wYXJhbWV0ZXJfZW50aXR5PC9jb2RlPiBhcmd1bWVudCB3aWxsIGJlIG5vbi16ZXJvIGZvcgorYSBwYXJhbWV0ZXIgZW50aXR5IGFuZCB6ZXJvIGZvciBhIGdlbmVyYWwgZW50aXR5LjwvcD4gPHA+Tm90ZTogc2tpcHBlZAorcGFyYW1ldGVyIGVudGl0aWVzIGluIGRlY2xhcmF0aW9ucyBhbmQgc2tpcHBlZCBnZW5lcmFsIGVudGl0aWVzIGluCithdHRyaWJ1dGUgdmFsdWVzIGNhbm5vdCBiZSByZXBvcnRlZCwgYmVjYXVzZSB0aGUgZXZlbnQgd291bGQgYmUgb3V0IG9mCitzeW5jIHdpdGggdGhlIHJlcG9ydGluZyBvZiB0aGUgZGVjbGFyYXRpb25zIG9yIGF0dHJpYnV0ZSB2YWx1ZXM8L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGVuY2hhbmRsZXIsCisJCQkgICAgICB2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhKQorPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiBpbnQKKyhYTUxDQUxMICpYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlcikodm9pZCAqZW5jb2RpbmdIYW5kbGVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmNvZGluZyAqaW5mbyk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IG1hcFsyNTZdOworICB2b2lkICpkYXRhOworICBpbnQgKFhNTENBTEwgKmNvbnZlcnQpKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKnMpOworICB2b2lkIChYTUxDQUxMICpyZWxlYXNlKSh2b2lkICpkYXRhKTsKK30gWE1MX0VuY29kaW5nOworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIHRvIGRlYWwgd2l0aCBlbmNvZGluZ3Mgb3RoZXIgdGhhbiB0aGUgPGEKK2hyZWY9IiNidWlsdGluX2VuY29kaW5ncyI+YnVpbHQgaW4gc2V0PC9hPi4gVGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUKKzxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlIiA+WE1MX1BhcnNlPC9hPjwvY29kZT4gb3IgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1BhcnNlQnVmZmVyIiA+WE1MX1BhcnNlQnVmZmVyPC9hPjwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCBvbiB0aGUKK2dpdmVuIHBhcnNlci48L3A+IDxwPklmIHRoZSBoYW5kbGVyIGtub3dzIGhvdyB0byBkZWFsIHdpdGggYW4gZW5jb2RpbmcKK3dpdGggdGhlIGdpdmVuIG5hbWUsIGl0IHNob3VsZCBmaWxsIGluIHRoZSA8Y29kZT5pbmZvPC9jb2RlPiBkYXRhCitzdHJ1Y3R1cmUgYW5kIHJldHVybiA8Y29kZT5YTUxfU1RBVFVTX09LPC9jb2RlPi4gT3RoZXJ3aXNlIGl0CitzaG91bGQgcmV0dXJuIDxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+LiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAorYXQgbW9zdCBvbmNlIHBlciBwYXJzZWQgKGV4dGVybmFsKSBlbnRpdHkuIFRoZSBvcHRpb25hbCBhcHBsaWNhdGlvbgorZGF0YSBwb2ludGVyIDxjb2RlPmVuY29kaW5nSGFuZGxlckRhdGE8L2NvZGU+IHdpbGwgYmUgcGFzc2VkIGJhY2sgdG8KK3RoZSBoYW5kbGVyLjwvcD4KKworPHA+VGhlIG1hcCBhcnJheSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgZXZlcnkgcG9zc2libGUgcG9zc2libGUgbGVhZGluZworYnl0ZSBpbiBhIGJ5dGUgc2VxdWVuY2UuIElmIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzICZndDs9IDAsIHRoZW4gaXQncworYSBzaW5nbGUgYnl0ZSBzZXF1ZW5jZSBhbmQgdGhlIGJ5dGUgZW5jb2RlcyB0aGF0IFVuaWNvZGUgdmFsdWUuIElmIHRoZQordmFsdWUgaXMgLTEsIHRoZW4gdGhhdCBieXRlIGlzIGludmFsaWQgYXMgdGhlIGluaXRpYWwgYnl0ZSBpbiBhIHNlcXVlbmNlLgorSWYgdGhlIHZhbHVlIGlzIC1uLCB3aGVyZSBuIGlzIGFuIGludGVnZXIgJmd0OyAxLCB0aGVuIG4gaXMgdGhlIG51bWJlciBvZgorYnl0ZXMgaW4gdGhlIHNlcXVlbmNlIGFuZCB0aGUgYWN0dWFsIGNvbnZlcnNpb24gaXMgYWNjb21wbGlzaGVkIGJ5IGEKK2NhbGwgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZWQgYXQgYnkgY29udmVydC4gVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIC0xCitpZiB0aGUgc2VxdWVuY2UgaXRzZWxmIGlzIGludmFsaWQuIFRoZSBjb252ZXJ0IHBvaW50ZXIgbWF5IGJlIG51bGwgaWYKK3RoZXJlIGFyZSBvbmx5IHNpbmdsZSBieXRlIGNvZGVzLiBUaGUgZGF0YSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjb252ZXJ0CitmdW5jdGlvbiBpcyB0aGUgZGF0YSBwb2ludGVyIGZyb20gPGNvZGU+WE1MX0VuY29kaW5nPC9jb2RlPi4gVGhlCitzdHJpbmcgcyBpcyA8ZW0+Tk9UPC9lbT4gbnVsLXRlcm1pbmF0ZWQgYW5kIHBvaW50cyBhdCB0aGUgc2VxdWVuY2Ugb2YKK2J5dGVzIHRvIGJlIGNvbnZlcnRlZC48L3A+CisKKzxwPlRoZSBmdW5jdGlvbiBwb2ludGVkIGF0IGJ5IDxjb2RlPnJlbGVhc2U8L2NvZGU+IGlzIGNhbGxlZCBieSB0aGUKK3BhcnNlciB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggdGhlIGVuY29kaW5nLiBJdCBtYXkgYmUgTlVMTC48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKwkJCSAgICAgICAgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0KTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnVyaSk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gYSBuYW1lc3BhY2UgaXMgZGVjbGFyZWQuIE5hbWVzcGFjZQorZGVjbGFyYXRpb25zIG9jY3VyIGluc2lkZSBzdGFydCB0YWdzLiBCdXQgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBzdGFydAoraGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzdGFydCB0YWcgaGFuZGxlciBmb3IgZWFjaCBuYW1lc3BhY2UgZGVjbGFyZWQKK2luIHRoYXQgc3RhcnQgdGFnLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisJCQkgICAgICAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gbGVhdmluZyB0aGUgc2NvcGUgb2YgYSBuYW1lc3BhY2UKK2RlY2xhcmF0aW9uLiBUaGlzIHdpbGwgYmUgY2FsbGVkLCBmb3IgZWFjaCBuYW1lc3BhY2UgZGVjbGFyYXRpb24sCithZnRlciB0aGUgaGFuZGxlciBmb3IgdGhlIGVuZCB0YWcgb2YgdGhlIGVsZW1lbnQgaW4gd2hpY2ggdGhlCituYW1lc3BhY2Ugd2FzIGRlY2xhcmVkLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCkKKzwvcHJlPgorPHA+U2V0cyBib3RoIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBoYW5kbGVycyB3aXRoIGEgc2luZ2xlIGNhbGwuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldFhtbERlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFhtbERlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKwkJICAgICAgWE1MX1htbERlY2xIYW5kbGVyIHhtbGRlY2wpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiB2b2lkCisoWE1MQ0FMTCAqWE1MX1htbERlY2xIYW5kbGVyKSh2b2lkICAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzdGFuZGFsb25lKTsKKzwvcHJlPgorPHA+U2V0cyBhIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgZm9yIFhNTCBkZWNsYXJhdGlvbnMgYW5kIGFsc28gZm9yCit0ZXh0IGRlY2xhcmF0aW9ucyBkaXNjb3ZlcmVkIGluIGV4dGVybmFsIGVudGl0aWVzLiBUaGUgd2F5IHRvCitkaXN0aW5ndWlzaCBpcyB0aGF0IHRoZSA8Y29kZT52ZXJzaW9uPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBiZSBOVUxMCitmb3IgdGV4dCBkZWNsYXJhdGlvbnMuIFRoZSA8Y29kZT5lbmNvZGluZzwvY29kZT4gcGFyYW1ldGVyIG1heSBiZSBOVUxMCitmb3IgYW4gWE1MIGRlY2xhcmF0aW9uLiBUaGUgPGNvZGU+c3RhbmRhbG9uZTwvY29kZT4gYXJndW1lbnQgd2lsbAorY29udGFpbiAtMSwgMCwgb3IgMSBpbmRpY2F0aW5nIHJlc3BlY3RpdmVseSB0aGF0IHRoZXJlIHdhcyBubworc3RhbmRhbG9uZSBwYXJhbWV0ZXIgaW4gdGhlIGRlY2xhcmF0aW9uLCB0aGF0IGl0IHdhcyBnaXZlbiBhcyBubywgb3IKK3RoYXQgaXQgd2FzIGdpdmVuIGFzIHllcy48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIiPgordm9pZCBYTUxDQUxMCitYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwLAorCQkJICAgICAgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIpKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkb2N0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc19pbnRlcm5hbF9zdWJzZXQpOworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhIERPQ1RZUEUgZGVjbGFyYXRpb24sCitiZWZvcmUgYW55IGV4dGVybmFsIG9yIGludGVybmFsIHN1YnNldCBpcyBwYXJzZWQuIEJvdGggPGNvZGU+c3lzaWQ8L2NvZGU+CithbmQgPGNvZGU+cHViaWQ8L2NvZGU+IG1heSBiZSBOVUxMLiBUaGUgPGNvZGU+aGFzX2ludGVybmFsX3N1YnNldDwvY29kZT4KK3dpbGwgYmUgbm9uLXplcm8gaWYgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaGFzIGFuIGludGVybmFsIHN1YnNldC48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisJCQkgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhKTsKKzwvcHJlPgorPHA+U2V0IGEgaGFuZGxlciB0aGF0IGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiwKK2FmdGVyIHBhcnNpbmcgYW55IGV4dGVybmFsIHN1YnNldC48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisJCQkgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCwKKwkJCSAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworPC9wcmU+Cis8cD5TZXQgYm90aCBkb2N0eXBlIGhhbmRsZXJzIHdpdGggb25lIGNhbGwuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwLAorCQkJICBYTUxfRWxlbWVudERlY2xIYW5kbGVyIGVsZGVjbCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfRWxlbWVudERlY2xIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQ29udGVudCAqbW9kZWwpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgorZW51bSBYTUxfQ29udGVudF9UeXBlIHsKKyAgWE1MX0NUWVBFX0VNUFRZID0gMSwKKyAgWE1MX0NUWVBFX0FOWSwKKyAgWE1MX0NUWVBFX01JWEVELAorICBYTUxfQ1RZUEVfTkFNRSwKKyAgWE1MX0NUWVBFX0NIT0lDRSwKKyAgWE1MX0NUWVBFX1NFUQorfTsKKworZW51bSBYTUxfQ29udGVudF9RdWFudCB7CisgIFhNTF9DUVVBTlRfTk9ORSwKKyAgWE1MX0NRVUFOVF9PUFQsCisgIFhNTF9DUVVBTlRfUkVQLAorICBYTUxfQ1FVQU5UX1BMVVMKK307CisKK3R5cGVkZWYgc3RydWN0IFhNTF9jcCBYTUxfQ29udGVudDsKKworc3RydWN0IFhNTF9jcCB7CisgIGVudW0gWE1MX0NvbnRlbnRfVHlwZQkJdHlwZTsKKyAgZW51bSBYTUxfQ29udGVudF9RdWFudAlxdWFudDsKKyAgY29uc3QgWE1MX0NoYXIgKgkJbmFtZTsKKyAgdW5zaWduZWQgaW50CQkJbnVtY2hpbGRyZW47CisgIFhNTF9Db250ZW50ICoJCQljaGlsZHJlbjsKK307Cis8L3ByZT4KKzxwPlNldHMgYSBoYW5kbGVyIGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucyBpbiBhIERURC4gVGhlIGhhbmRsZXIgZ2V0cworY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGRlY2xhcmF0aW9uIGFuZCBhIHBvaW50ZXIKK3RvIGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQgbW9kZWwuIEl0IGlzIHRoZQorYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgdXNpbmcKKzxjb2RlPjxhIGhyZWY9IiNYTUxfRnJlZUNvbnRlbnRNb2RlbCIKKz5YTUxfRnJlZUNvbnRlbnRNb2RlbDwvYT48L2NvZGU+LjwvcD4KKworPHA+VGhlIDxjb2RlPm1vZGVsPC9jb2RlPiBhcmd1bWVudCBpcyB0aGUgcm9vdCBvZiBhIHRyZWUgb2YKKzxjb2RlPlhNTF9Db250ZW50PC9jb2RlPiBub2Rlcy4gSWYgPGNvZGU+dHlwZTwvY29kZT4gZXF1YWxzCis8Y29kZT5YTUxfQ1RZUEVfRU1QVFk8L2NvZGU+IG9yIDxjb2RlPlhNTF9DVFlQRV9BTlk8L2NvZGU+LCB0aGVuCis8Y29kZT5xdWFudDwvY29kZT4gd2lsbCBiZSA8Y29kZT5YTUxfQ1FVQU5UX05PTkU8L2NvZGU+LCBhbmQgdGhlIG90aGVyCitmaWVsZHMgd2lsbCBiZSB6ZXJvIG9yIE5VTEwuICBJZiA8Y29kZT50eXBlPC9jb2RlPiBpcworPGNvZGU+WE1MX0NUWVBFX01JWEVEPC9jb2RlPiwgdGhlbiA8Y29kZT5xdWFudDwvY29kZT4gd2lsbCBiZQorPGNvZGU+WE1MX0NRVUFOVF9OT05FPC9jb2RlPiBvciA8Y29kZT5YTUxfQ1FVQU5UX1JFUDwvY29kZT4gYW5kCis8Y29kZT5udW1jaGlsZHJlbjwvY29kZT4gd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUKK2FsbG93ZWQgdG8gYmUgbWl4ZWQgaW4gYW5kIDxjb2RlPmNoaWxkcmVuPC9jb2RlPiBwb2ludHMgdG8gYW4gYXJyYXkgb2YKKzxjb2RlPlhNTF9Db250ZW50PC9jb2RlPiBzdHJ1Y3R1cmVzIHRoYXQgd2lsbCBhbGwgaGF2ZSB0eXBlCitYTUxfQ1RZUEVfTkFNRSB3aXRoIG5vIHF1YW50aWZpY2F0aW9uLiAgT25seSB0aGUgcm9vdCBub2RlIGNhbiBiZSB0eXBlCis8Y29kZT5YTUxfQ1RZUEVfRU1QVFk8L2NvZGU+LCA8Y29kZT5YTUxfQ1RZUEVfQU5ZPC9jb2RlPiwgb3IKKzxjb2RlPlhNTF9DVFlQRV9NSVhFRDwvY29kZT4uPC9wPgorCis8cD5Gb3IgdHlwZSA8Y29kZT5YTUxfQ1RZUEVfTkFNRTwvY29kZT4sIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBmaWVsZAorcG9pbnRzIHRvIHRoZSBuYW1lIGFuZCB0aGUgPGNvZGU+bnVtY2hpbGRyZW48L2NvZGU+IGFuZAorPGNvZGU+Y2hpbGRyZW48L2NvZGU+IGZpZWxkcyB3aWxsIGJlIHplcm8gYW5kIE5VTEwuIFRoZQorPGNvZGU+cXVhbnQ8L2NvZGU+IGZpZWxkIHdpbGwgaW5kaWNhdGUgYW55IHF1YW50aWZpZXJzIHBsYWNlZCBvbiB0aGUKK25hbWUuPC9wPgorCis8cD5UeXBlcyA8Y29kZT5YTUxfQ1RZUEVfQ0hPSUNFPC9jb2RlPiBhbmQgPGNvZGU+WE1MX0NUWVBFX1NFUTwvY29kZT4KK2luZGljYXRlIGEgY2hvaWNlIG9yIHNlcXVlbmNlIHJlc3BlY3RpdmVseS4gVGhlCis8Y29kZT5udW1jaGlsZHJlbjwvY29kZT4gZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IG5vZGVzIGluIHRoZSBjaG9pY2UKK29yIHNlcXVlbmNlIGFuZCA8Y29kZT5jaGlsZHJlbjwvY29kZT4gcG9pbnRzIHRvIHRoZSBub2Rlcy48L3A+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0iaGFuZGxlciI+Cis8cHJlIGNsYXNzPSJzZXR0ZXIiIGlkPSJYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcihYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9BdHRsaXN0RGVjbEhhbmRsZXIgYXR0ZGVjbCk7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfQXR0bGlzdERlY2xIYW5kbGVyKSh2b2lkICAgICAgICAgICAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVsbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYXR0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYXR0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRmbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaXNyZXF1aXJlZCk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgZm9yIGF0dGxpc3QgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQuIFRoaXMgaGFuZGxlciBpcworY2FsbGVkIGZvciA8ZW0+ZWFjaDwvZW0+IGF0dHJpYnV0ZS4gU28gYSBzaW5nbGUgYXR0bGlzdCBkZWNsYXJhdGlvbgord2l0aCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGRlY2xhcmVkIHdpbGwgZ2VuZXJhdGUgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcworaGFuZGxlci4gVGhlIDxjb2RlPmVsbmFtZTwvY29kZT4gcGFyYW1ldGVyIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlCitlbGVtZW50IGZvciB3aGljaCB0aGUgYXR0cmlidXRlIGlzIGJlaW5nIGRlY2xhcmVkLiBUaGUgYXR0cmlidXRlIG5hbWUKK2lzIGluIHRoZSA8Y29kZT5hdHRuYW1lPC9jb2RlPiBwYXJhbWV0ZXIuIFRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBpbiB0aGUKKzxjb2RlPmF0dF90eXBlPC9jb2RlPiBwYXJhbWV0ZXIuICBJdCBpcyB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKK3R5cGUgaW4gdGhlIGRlY2xhcmF0aW9uIHdpdGggd2hpdGVzcGFjZSByZW1vdmVkLjwvcD4KKworPHA+VGhlIDxjb2RlPmRmbHQ8L2NvZGU+IHBhcmFtZXRlciBob2xkcyB0aGUgZGVmYXVsdCB2YWx1ZS4gSXQgd2lsbCBiZQorTlVMTCBpbiB0aGUgY2FzZSBvZiAiI0lNUExJRUQiIG9yICIjUkVRVUlSRUQiIGF0dHJpYnV0ZXMuIFlvdSBjYW4KK2Rpc3Rpbmd1aXNoIHRoZXNlIHR3byBjYXNlcyBieSBjaGVja2luZyB0aGUgPGNvZGU+aXNyZXF1aXJlZDwvY29kZT4KK3BhcmFtZXRlciwgd2hpY2ggd2lsbCBiZSB0cnVlIGluIHRoZSBjYXNlIG9mICIjUkVRVUlSRUQiIGF0dHJpYnV0ZXMuCitBdHRyaWJ1dGVzIHdoaWNoIGFyZSAiI0ZJWEVEIiB3aWxsIGhhdmUgYWxzbyBoYXZlIGEgdHJ1ZQorPGNvZGU+aXNyZXF1aXJlZDwvY29kZT4sIGJ1dCB0aGV5IHdpbGwgaGF2ZSB0aGUgbm9uLU5VTEwgZml4ZWQgdmFsdWUKK2luIHRoZSA8Y29kZT5kZmx0PC9jb2RlPiBwYXJhbWV0ZXIuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldEVudGl0eURlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVudGl0eURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKwkJCSBYTUxfRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcik7Cis8L3ByZT4KKzxwcmUgY2xhc3M9InNpZ25hdHVyZSI+Cit0eXBlZGVmIHZvaWQKKyhYTUxDQUxMICpYTUxfRW50aXR5RGVjbEhhbmRsZXIpKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbnRpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaXNfcGFyYW1ldGVyX2VudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIHZhbHVlX2xlbmd0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUpOworPC9wcmU+Cis8cD5TZXRzIGEgaGFuZGxlciB0aGF0IHdpbGwgYmUgY2FsbGVkIGZvciBhbGwgZW50aXR5IGRlY2xhcmF0aW9ucy4KK1RoZSA8Y29kZT5pc19wYXJhbWV0ZXJfZW50aXR5PC9jb2RlPiBhcmd1bWVudCB3aWxsIGJlIG5vbi16ZXJvIGluIHRoZQorY2FzZSBvZiBwYXJhbWV0ZXIgZW50aXRpZXMgYW5kIHplcm8gb3RoZXJ3aXNlLjwvcD4KKworPHA+Rm9yIGludGVybmFsIGVudGl0aWVzICg8Y29kZT4mbHQ7IUVOVElUWSBmb28gImJhciImZ3Q7PC9jb2RlPiksCis8Y29kZT52YWx1ZTwvY29kZT4gd2lsbCBiZSBub24tTlVMTCBhbmQgPGNvZGU+c3lzdGVtSWQ8L2NvZGU+LAorPGNvZGU+cHVibGljSWQ8L2NvZGU+LCBhbmQgPGNvZGU+bm90YXRpb25OYW1lPC9jb2RlPiB3aWxsIGFsbCBiZSBOVUxMLgorVGhlIHZhbHVlIHN0cmluZyBpcyA8ZW0+bm90PC9lbT4gTlVMTCB0ZXJtaW5hdGVkOyB0aGUgbGVuZ3RoIGlzCitwcm92aWRlZCBpbiB0aGUgPGNvZGU+dmFsdWVfbGVuZ3RoPC9jb2RlPiBwYXJhbWV0ZXIuIERvIG5vdCB1c2UKKzxjb2RlPnZhbHVlX2xlbmd0aDwvY29kZT4gdG8gdGVzdCBmb3IgaW50ZXJuYWwgZW50aXRpZXMsIHNpbmNlIGl0IGlzCitsZWdhbCB0byBoYXZlIHplcm8tbGVuZ3RoIHZhbHVlcy4gSW5zdGVhZCBjaGVjayBmb3Igd2hldGhlciBvciBub3QKKzxjb2RlPnZhbHVlPC9jb2RlPiBpcyBOVUxMLjwvcD4gPHA+VGhlIDxjb2RlPm5vdGF0aW9uTmFtZTwvY29kZT4KK2FyZ3VtZW50IHdpbGwgaGF2ZSBhIG5vbi1OVUxMIHZhbHVlIG9ubHkgZm9yIHVucGFyc2VkIGVudGl0eQorZGVjbGFyYXRpb25zLjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgaCkKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUpOworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIHRoYXQgcmVjZWl2ZXMgZGVjbGFyYXRpb25zIG9mIHVucGFyc2VkIGVudGl0aWVzLiBUaGVzZQorYXJlIGVudGl0eSBkZWNsYXJhdGlvbnMgdGhhdCBoYXZlIGEgbm90YXRpb24gKE5EQVRBKSBmaWVsZDo8L3A+CisKKzxkaXYgaWQ9ImVnIj48cHJlPgorJmx0OyFFTlRJVFkgbG9nbyBTWVNURU0gImltYWdlcy9sb2dvLmdpZiIgTkRBVEEgZ2lmJmd0OworPC9wcmU+PC9kaXY+Cis8cD5UaGlzIGhhbmRsZXIgaXMgb2Jzb2xldGUgYW5kIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMKK2NvbXBhdGliaWxpdHkuICBVc2UgaW5zdGVhZCA8YSBocmVmPSAiI1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlciIKKz5YTUxfU2V0RW50aXR5RGVjbEhhbmRsZXI8L2E+LjwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJoYW5kbGVyIj4KKzxwcmUgY2xhc3M9InNldHRlciIgaWQ9IlhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaCkKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgdm9pZAorKFhNTENBTEwgKlhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCk7Cis8L3ByZT4KKzxwPlNldCBhIGhhbmRsZXIgdGhhdCByZWNlaXZlcyBub3RhdGlvbiBkZWNsYXJhdGlvbnMuPC9wPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImhhbmRsZXIiPgorPHByZSBjbGFzcz0ic2V0dGVyIiBpZD0iWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIgaCkKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK3R5cGVkZWYgaW50IAorKFhNTENBTEwgKlhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlcikodm9pZCAqdXNlckRhdGEpOworPC9wcmU+Cis8cD5TZXQgYSBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgInN0YW5kYWxvbmUiLgorVGhpcyBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgc3Vic2V0IG9yIGEgcmVmZXJlbmNlIHRvIGEKK3BhcmFtZXRlciBlbnRpdHksIGJ1dCBkb2VzIG5vdCBoYXZlIHN0YW5kYWxvbmUgc2V0IHRvICJ5ZXMiIGluIGFuIFhNTAorZGVjbGFyYXRpb24uICBJZiB0aGlzIGhhbmRsZXIgcmV0dXJucyA8Y29kZT5YTUxfU1RBVFVTX0VSUk9SPC9jb2RlPiwKK3RoZW4gdGhlIHBhcnNlciB3aWxsIHRocm93IGFuIDxjb2RlPlhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTwvY29kZT4KK2Vycm9yLjwvcD4KKzwvZGl2PgorCis8aDM+PGEgbmFtZT0icG9zaXRpb24iPlBhcnNlIHBvc2l0aW9uIGFuZCBlcnJvciByZXBvcnRpbmcgZnVuY3Rpb25zPC9hPjwvaDM+CisKKzxwPlRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHlvdSdsbCB3YW50IHRvIGNhbGwgd2hlbiB0aGUgcGFyc2UKK2Z1bmN0aW9ucyByZXR1cm4gPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4gKGEgcGFyc2UgZXJyb3IgaGFzCitvY2N1cnJlZCksIGFsdGhvdWdoIHRoZSBwb3NpdGlvbiByZXBvcnRpbmcgZnVuY3Rpb25zIGFyZSB1c2VmdWwgb3V0c2lkZQorb2YgZXJyb3JzLiBUaGUgcG9zaXRpb24gcmVwb3J0ZWQgaXMgdGhlIGJ5dGUgcG9zaXRpb24gKGluIHRoZSBvcmlnaW5hbAorZG9jdW1lbnQgb3IgZW50aXR5IGVuY29kaW5nKSBvZiB0aGUgZmlyc3Qgb2YgdGhlIHNlcXVlbmNlIG9mCitjaGFyYWN0ZXJzIHRoYXQgZ2VuZXJhdGVkIHRoZSBjdXJyZW50IGV2ZW50IChvciB0aGUgZXJyb3IgdGhhdCBjYXVzZWQKK3RoZSBwYXJzZSBmdW5jdGlvbnMgdG8gcmV0dXJuIDxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+LikgIFRoZQorZXhjZXB0aW9ucyBhcmUgY2FsbGJhY2tzIHRyaWdnZWQgYnkgZGVjbGFyYXRpb25zIGluIHRoZSBkb2N1bWVudAorcHJvbG9ndWUsIGluIHdoaWNoIGNhc2UgdGhleSBleGFjdCBwb3NpdGlvbiByZXBvcnRlZCBpcyBzb21ld2hlcmUgaW4gdGhlCityZWxldmFudCBtYXJrdXAsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYXMgbWVhbmluZ2Z1bCBhcyBmb3Igb3RoZXIKK2V2ZW50cy48L3A+CisKKzxwPlRoZSBwb3NpdGlvbiByZXBvcnRpbmcgZnVuY3Rpb25zIGFyZSBhY2N1cmF0ZSBvbmx5IG91dHNpZGUgb2YgdGhlCitEVEQuICBJbiBvdGhlciB3b3JkcywgdGhleSB1c3VhbGx5IHJldHVybiBib2d1cyBpbmZvcm1hdGlvbiB3aGVuCitjYWxsZWQgZnJvbSB3aXRoaW4gYSBEVEQgZGVjbGFyYXRpb24gaGFuZGxlci48L3A+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9HZXRFcnJvckNvZGUiPgorZW51bSBYTUxfRXJyb3IgWE1MQ0FMTAorWE1MX0dldEVycm9yQ29kZShYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorUmV0dXJuIHdoYXQgdHlwZSBvZiBlcnJvciBoYXMgb2NjdXJyZWQuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0Vycm9yU3RyaW5nIj4KK2NvbnN0IFhNTF9MQ2hhciAqIFhNTENBTEwKK1hNTF9FcnJvclN0cmluZyhlbnVtIFhNTF9FcnJvciBjb2RlKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1JldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvciBjb3JyZXNwb25kaW5nIHRvIGNvZGUuCitUaGUgY29kZSBzaG91bGQgYmUgb25lIG9mIHRoZSBlbnVtcyB0aGF0IGNhbiBiZSByZXR1cm5lZCBmcm9tCis8Y29kZT48YSBocmVmPSAiI1hNTF9HZXRFcnJvckNvZGUiID5YTUxfR2V0RXJyb3JDb2RlPC9hPjwvY29kZT4uCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgiPgorWE1MX0luZGV4IFhNTENBTEwKK1hNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitSZXR1cm4gdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBwb3NpdGlvbi4gIFRoaXMgYWx3YXlzIGNvcnJlc3BvbmRzIHRvCit0aGUgdmFsdWVzIHJldHVybmVkIGJ5IDxjb2RlPjxhIGhyZWY9ICIjWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIgorPlhNTF9HZXRDdXJyZW50TGluZU51bWJlcjwvYT48L2NvZGU+IGFuZCA8Y29kZT48YSBocmVmPQorIiNYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciIgPlhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyPC9hPjwvY29kZT4uCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIj4KK1hNTF9TaXplIFhNTENBTEwKK1hNTF9HZXRDdXJyZW50TGluZU51bWJlcihYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorUmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgcG9zaXRpb24uICBUaGUgZmlyc3QgbGluZSBpcyByZXBvcnRlZCBhcworPGNvZGU+MTwvY29kZT4uCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIiPgorWE1MX1NpemUgWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoWE1MX1BhcnNlciBwKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1JldHVybiB0aGUgb2Zmc2V0LCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgbGluZSwgb2YKK3RoZSBwb3NpdGlvbi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0Q3VycmVudEJ5dGVDb3VudCI+CitpbnQgWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRCeXRlQ291bnQoWE1MX1BhcnNlciBwKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1JldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IGV2ZW50LiBSZXR1cm5zCis8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZXZlbnQgaXMgaW5zaWRlIGEgcmVmZXJlbmNlIHRvIGFuIGludGVybmFsCitlbnRpdHkgYW5kIGZvciB0aGUgZW5kLXRhZyBldmVudCBmb3IgZW1wdHkgZWxlbWVudCB0YWdzICh0aGUgbGF0ZXIgY2FuCitiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGVtcHR5LWVsZW1lbnQgdGFncyBmcm9tIGVtcHR5IGVsZW1lbnRzIHVzaW5nCitzZXBhcmF0ZSBzdGFydCBhbmQgZW5kIHRhZ3MpLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9HZXRJbnB1dENvbnRleHQiPgorY29uc3QgY2hhciAqIFhNTENBTEwKK1hNTF9HZXRJbnB1dENvbnRleHQoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgICAgICBpbnQgKm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KKworPHA+UmV0dXJucyB0aGUgcGFyc2VyJ3MgaW5wdXQgYnVmZmVyLCBzZXRzIHRoZSBpbnRlZ2VyIHBvaW50ZWQgYXQgYnkKKzxjb2RlPm9mZnNldDwvY29kZT4gdG8gdGhlIG9mZnNldCB3aXRoaW4gdGhpcyBidWZmZXIgb2YgdGhlIGN1cnJlbnQKK3BhcnNlIHBvc2l0aW9uLCBhbmQgc2V0IHRoZSBpbnRlZ2VyIHBvaW50ZWQgYXQgYnkgPGNvZGU+c2l6ZTwvY29kZT4gdG8KK3RoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBidWZmZXIuPC9wPgorCis8cD5UaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGhhbmRsZXIgZHVyaW5nIGFuIGFjdGl2ZQorcGFyc2UgYW5kIHRoZSByZXR1cm5lZCBidWZmZXIgc2hvdWxkIG9ubHkgYmUgcmVmZXJyZWQgdG8gZnJvbSB3aXRoaW4KK3RoZSBoYW5kbGVyIHRoYXQgbWFkZSB0aGUgY2FsbC4gVGhpcyBpbnB1dCBidWZmZXIgY29udGFpbnMgdGhlCit1bnRyYW5zbGF0ZWQgYnl0ZXMgb2YgdGhlIGlucHV0LjwvcD4KKworPHA+T25seSBhIGxpbWl0ZWQgYW1vdW50IG9mIGNvbnRleHQgaXMga2VwdCwgc28gaWYgdGhlIGV2ZW50Cit0cmlnZ2VyaW5nIGEgY2FsbCBzcGFucyBvdmVyIGEgdmVyeSBsYXJnZSBhbW91bnQgb2YgaW5wdXQsIHRoZSBhY3R1YWwKK3BhcnNlIHBvc2l0aW9uIG1heSBiZSBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLjwvcD4KKworPHA+SWYgPGNvZGU+WE1MX0NPTlRFWFRfQllURVM8L2NvZGU+IGlzIG5vdCBkZWZpbmVkLCB0aGlzIHdpbGwgYWx3YXlzCityZXR1cm4gTlVMTC48L3A+Cis8L2Rpdj4KKworPGgzPjxhIG5hbWU9Im1pc2NlbGxhbmVvdXMiPk1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zPC9hPjwvaDM+CisKKzxwPlRoZSBmdW5jdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGVpdGhlciBvYnRhaW4gc3RhdGUgaW5mb3JtYXRpb24gZnJvbQordGhlIHBhcnNlciBvciBjYW4gYmUgdXNlZCB0byBkeW5hbWljbHkgc2V0IHBhcnNlciBvcHRpb25zLjwvcD4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1NldFVzZXJEYXRhIj4KK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFVzZXJEYXRhKFhNTF9QYXJzZXIgcCwKKyAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitUaGlzIHNldHMgdGhlIHVzZXIgZGF0YSBwb2ludGVyIHRoYXQgZ2V0cyBwYXNzZWQgdG8gaGFuZGxlcnMuICBJdAorb3ZlcndyaXRlcyBhbnkgcHJldmlvdXMgdmFsdWUgZm9yIHRoaXMgcG9pbnRlci4gTm90ZSB0aGF0IHRoZQorYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGgKKzxjb2RlPnVzZXJEYXRhPC9jb2RlPiB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggdGhlIHBhcnNlci4gU28gaWYgeW91CitjYWxsIHRoaXMgd2hlbiB0aGVyZSdzIGFscmVhZHkgYSBwb2ludGVyIHRoZXJlLCBhbmQgeW91IGhhdmVuJ3QgZnJlZWQKK3RoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIHlvdSd2ZSBwcm9iYWJseSBqdXN0IGxlYWtlZAorbWVtb3J5LgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9HZXRVc2VyRGF0YSI+Cit2b2lkICogWE1MQ0FMTAorWE1MX0dldFVzZXJEYXRhKFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitUaGlzIHJldHVybnMgdGhlIHVzZXIgZGF0YSBwb2ludGVyIHRoYXQgZ2V0cyBwYXNzZWQgdG8gaGFuZGxlcnMuCitJdCBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmciPgordm9pZCBYTUxDQUxMCitYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitBZnRlciB0aGlzIGlzIGNhbGxlZCwgaGFuZGxlcnMgcmVjZWl2ZSB0aGUgcGFyc2VyIGluIHRoZWlyCis8Y29kZT51c2VyRGF0YTwvY29kZT4gYXJndW1lbnRzLiAgVGhlIHVzZXIgZGF0YSBjYW4gc3RpbGwgYmUgb2J0YWluZWQKK3VzaW5nIHRoZSA8Y29kZT48YSBocmVmPSAiI1hNTF9HZXRVc2VyRGF0YSIKKz5YTUxfR2V0VXNlckRhdGE8L2E+PC9jb2RlPiBmdW5jdGlvbi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfU2V0QmFzZSI+CitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1NldEJhc2UoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorU2V0IHRoZSBiYXNlIHRvIGJlIHVzZWQgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBVUklzIGluIHN5c3RlbQoraWRlbnRpZmllcnMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIDxjb2RlPlhNTF9TVEFUVVNfRVJST1I8L2NvZGU+IGlmCit0aGVyZSdzIG5vIG1lbW9yeSB0byBzdG9yZSBiYXNlLCBvdGhlcndpc2UgaXQncworPGNvZGU+WE1MX1NUQVRVU19PSzwvY29kZT4uCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldEJhc2UiPgorY29uc3QgWE1MX0NoYXIgKiBYTUxDQUxMCitYTUxfR2V0QmFzZShYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorUmV0dXJuIHRoZSBiYXNlIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJJcy4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQiPgoraW50IFhNTENBTEwKK1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudChYTUxfUGFyc2VyIHApOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorV2hlbiBhdHRyaWJ1dGVzIGFyZSByZXBvcnRlZCB0byB0aGUgc3RhcnQgaGFuZGxlciBpbiB0aGUgYXR0cyB2ZWN0b3IsCithdHRyaWJ1dGVzIHRoYXQgd2VyZSBleHBsaWNpdGx5IHNldCBpbiB0aGUgZWxlbWVudCBvY2N1ciBiZWZvcmUgYW55CithdHRyaWJ1dGVzIHRoYXQgcmVjZWl2ZSB0aGVpciB2YWx1ZSBmcm9tIGRlZmF1bHQgaW5mb3JtYXRpb24gaW4gYW4KK0FUVExJU1QgZGVjbGFyYXRpb24uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKK3RoYXQgd2VyZSBleHBsaWNpdGx5IHNldCB0aW1lcyB0d28sIHRodXMgZ2l2aW5nIHRoZSBvZmZzZXQgaW4gdGhlCis8Y29kZT5hdHRzPC9jb2RlPiBhcnJheSBwYXNzZWQgdG8gdGhlIHN0YXJ0IHRhZyBoYW5kbGVyIG9mIHRoZSBmaXJzdAorYXR0cmlidXRlIHNldCBkdWUgdG8gZGVmYXVsdHMuIEl0IHN1cHBsaWVzIGluZm9ybWF0aW9uIGZvciB0aGUgbGFzdAorY2FsbCB0byBhIHN0YXJ0IGhhbmRsZXIuIElmIGNhbGxlZCBpbnNpZGUgYSBzdGFydCBoYW5kbGVyLCB0aGVuIHRoYXQKK21lYW5zIHRoZSBjdXJyZW50IGNhbGwuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0dldElkQXR0cmlidXRlSW5kZXgiPgoraW50IFhNTENBTEwKK1hNTF9HZXRJZEF0dHJpYnV0ZUluZGV4KFhNTF9QYXJzZXIgcCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgSUQgYXR0cmlidXRlIHBhc3NlZCBpbiB0aGUgYXR0cyBhcnJheSBpbiB0aGUKK2xhc3QgY2FsbCB0byA8Y29kZT48YSBocmVmPSAiI1hNTF9TdGFydEVsZW1lbnRIYW5kbGVyIgorPlhNTF9TdGFydEVsZW1lbnRIYW5kbGVyPC9hPjwvY29kZT4sIG9yIC0xIGlmIHRoZXJlIGlzIG5vIElECithdHRyaWJ1dGUuIElmIGNhbGxlZCBpbnNpZGUgYSBzdGFydCBoYW5kbGVyLCB0aGVuIHRoYXQgbWVhbnMgdGhlCitjdXJyZW50IGNhbGwuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1NldEVuY29kaW5nIj4KK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfU2V0RW5jb2RpbmcoWE1MX1BhcnNlciBwLAorICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitTZXQgdGhlIGVuY29kaW5nIHRvIGJlIHVzZWQgYnkgdGhlIHBhcnNlci4gSXQgaXMgZXF1aXZhbGVudCB0bworcGFzc2luZyBhIG5vbi1udWxsIGVuY29kaW5nIGFyZ3VtZW50IHRvIHRoZSBwYXJzZXIgY3JlYXRpb24gZnVuY3Rpb25zLgorSXQgbXVzdCBub3QgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlIgorPlhNTF9QYXJzZTwvYT48L2NvZGU+IG9yIDxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlQnVmZmVyIgorPlhNTF9QYXJzZUJ1ZmZlcjwvYT48L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQgb24gdGhlIGdpdmVuIHBhcnNlci4KK1JldHVybnMgPGNvZGU+WE1MX1NUQVRVU19PSzwvY29kZT4gb24gc3VjY2VzcyBvcgorPGNvZGU+WE1MX1NUQVRVU19FUlJPUjwvY29kZT4gb24gZXJyb3IuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyI+CitpbnQgWE1MQ0FMTAorWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhYTUxfUGFyc2VyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyBjb2RlKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1RoaXMgZW5hYmxlcyBwYXJzaW5nIG9mIHBhcmFtZXRlciBlbnRpdGllcywgaW5jbHVkaW5nIHRoZSBleHRlcm5hbAorcGFyYW1ldGVyIGVudGl0eSB0aGF0IGlzIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0LCBhY2NvcmRpbmcgdG8KKzxjb2RlPmNvZGU8L2NvZGU+LgorVGhlIGNob2ljZXMgZm9yIDxjb2RlPmNvZGU8L2NvZGU+IGFyZToKKzx1bD4KKzxsaT48Y29kZT5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVI8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfVU5MRVNTX1NUQU5EQUxPTkU8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTPC9jb2RlPjwvbGk+Cis8L3VsPgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9Vc2VGb3JlaWduRFREIj4KK2VudW0gWE1MX0Vycm9yIFhNTENBTEwKK1hNTF9Vc2VGb3JlaWduRFREKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCB1c2VEVEQpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorPHA+VGhpcyBmdW5jdGlvbiBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcHJvdmlkZSBhbiBleHRlcm5hbCBzdWJzZXQKK2ZvciB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBmb3IgZG9jdW1lbnRzIHdoaWNoIGRvIG5vdCBzcGVjaWZ5CithbiBleHRlcm5hbCBzdWJzZXQgb2YgdGhlaXIgb3duLiAgRm9yIGRvY3VtZW50cyB3aGljaCBzcGVjaWZ5IGFuCitleHRlcm5hbCBzdWJzZXQgaW4gdGhlaXIgRE9DVFlQRSBkZWNsYXJhdGlvbiwgdGhlIGFwcGxpY2F0aW9uLXByb3ZpZGVkCitzdWJzZXQgd2lsbCBiZSBpZ25vcmVkLiAgSWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYSBET0NUWVBFCitkZWNsYXJhdGlvbiBhdCBhbGwgYW5kIDxjb2RlPnVzZURURDwvY29kZT4gaXMgdHJ1ZSwgdGhlCithcHBsaWNhdGlvbi1wcm92aWRlZCBzdWJzZXQgd2lsbCBiZSBwYXJzZWQsIGJ1dCB0aGUKKzxjb2RlPnN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyPC9jb2RlPiBhbmQKKzxjb2RlPmVuZERvY3R5cGVEZWNsSGFuZGxlcjwvY29kZT4gZnVuY3Rpb25zLCBpZiBzZXQsIHdpbGwgbm90IGJlCitjYWxsZWQuICBUaGUgc2V0dGluZyBvZiBwYXJhbWV0ZXIgZW50aXR5IHBhcnNpbmcsIGNvbnRyb2xsZWQgdXNpbmcKKzxjb2RlPjxhIGhyZWY9ICIjWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyIKKz5YTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nPC9hPjwvY29kZT4sIHdpbGwgYmUgaG9ub3JlZC48L3A+CisKKzxwPlRoZSBhcHBsaWNhdGlvbi1wcm92aWRlZCBleHRlcm5hbCBzdWJzZXQgaXMgcmVhZCBieSBjYWxsaW5nIHRoZQorZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZSBoYW5kbGVyIHNldCB2aWEgPGNvZGU+PGEgaHJlZj0KKyIjWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciIKKz5YTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyPC9hPjwvY29kZT4gd2l0aCBib3RoCis8Y29kZT5wdWJsaWNJZDwvY29kZT4gYW5kIDxjb2RlPnN5c3RlbUlkPC9jb2RlPiBzZXQgdG8gTlVMTC48L3A+CisKKzxwPklmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHBhcnNpbmcgaGFzIGJlZ3VuLCBpdCByZXR1cm5zCis8Y29kZT5YTUxfRVJST1JfQ0FOVF9DSEFOR0VfRkVBVFVSRV9PTkNFX1BBUlNJTkc8L2NvZGU+IGFuZCBpZ25vcmVzCis8Y29kZT51c2VEVEQ8L2NvZGU+LiAgSWYgY2FsbGVkIHdoZW4gRXhwYXQgaGFzIGJlZW4gY29tcGlsZWQgd2l0aG91dAorRFREIHN1cHBvcnQsIGl0IHJldHVybnMKKzxjb2RlPlhNTF9FUlJPUl9GRUFUVVJFX1JFUVVJUkVTX1hNTF9EVEQ8L2NvZGU+LiAgT3RoZXJ3aXNlLCBpdAorcmV0dXJucyA8Y29kZT5YTUxfRVJST1JfTk9ORTwvY29kZT4uPC9wPgorCis8cD48Yj5Ob3RlOjwvYj4gRm9yIHRoZSBwdXJwb3NlIG9mIGNoZWNraW5nIFdGQzogRW50aXR5IERlY2xhcmVkLCBwYXNzaW5nCis8Y29kZT51c2VEVEQgPT0gWE1MX1RSVUU8L2NvZGU+IHdpbGwgbWFrZSB0aGUgcGFyc2VyIGJlaGF2ZSBhcyBpZgordGhlIGRvY3VtZW50IGhhZCBhIERURCB3aXRoIGFuIGV4dGVybmFsIHN1YnNldC4gVGhpcyBob2xkcyB0cnVlIGV2ZW4gaWYKK3RoZSBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlIGhhbmRsZXIgcmV0dXJucyB3aXRob3V0IGFjdGlvbi48L3A+Cis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX1NldFJldHVybk5TVHJpcGxldCI+Cit2b2lkIFhNTENBTEwKK1hNTF9TZXRSZXR1cm5OU1RyaXBsZXQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgZG9fbnN0KTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KKzxwPgorVGhpcyBmdW5jdGlvbiBvbmx5IGhhcyBhbiBlZmZlY3Qgd2hlbiB1c2luZyBhIHBhcnNlciBjcmVhdGVkIHdpdGgKKzxjb2RlPjxhIGhyZWY9ICIjWE1MX1BhcnNlckNyZWF0ZU5TIiA+WE1MX1BhcnNlckNyZWF0ZU5TPC9hPjwvY29kZT4sCitpLmUuIHdoZW4gbmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgaW4gZWZmZWN0LiBUaGUgPGNvZGU+ZG9fbnN0PC9jb2RlPgorc2V0cyB3aGV0aGVyIG9yIG5vdCBwcmVmaXhlcyBhcmUgcmV0dXJuZWQgd2l0aCBuYW1lcyBxdWFsaWZpZWQgd2l0aCBhCituYW1lc3BhY2UgcHJlZml4LiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIDxjb2RlPmRvX25zdDwvY29kZT4KK25vbi16ZXJvLCB0aGVuIGFmdGVyd2FyZHMgbmFtZXNwYWNlIHF1YWxpZmllZCBuYW1lcyAodGhhdCBpcyBxdWFsaWZpZWQKK3dpdGggYSBwcmVmaXggYXMgb3Bwb3NlZCB0byBiZWxvbmdpbmcgdG8gYSBkZWZhdWx0IG5hbWVzcGFjZSkgYXJlCityZXR1cm5lZCBhcyBhIHRyaXBsZXQgd2l0aCB0aGUgdGhyZWUgcGFydHMgc2VwYXJhdGVkIGJ5IHRoZSBuYW1lc3BhY2UKK3NlcGFyYXRvciBzcGVjaWZpZWQgd2hlbiB0aGUgcGFyc2VyIHdhcyBjcmVhdGVkLiAgVGhlIG9yZGVyIG9mCityZXR1cm5lZCBwYXJ0cyBpcyBVUkksIGxvY2FsIG5hbWUsIGFuZCBwcmVmaXguPC9wPiA8cD5JZgorPGNvZGU+ZG9fbnN0PC9jb2RlPiBpcyB6ZXJvLCB0aGVuIG5hbWVzcGFjZXMgYXJlIHJlcG9ydGVkIGluIHRoZQorZGVmYXVsdCBtYW5uZXIsIFVSSSB0aGVuIGxvY2FsX25hbWUgc2VwYXJhdGVkIGJ5IHRoZSBuYW1lc3BhY2UKK3NlcGFyYXRvci48L3A+Cis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0RlZmF1bHRDdXJyZW50Ij4KK3ZvaWQgWE1MQ0FMTAorWE1MX0RlZmF1bHRDdXJyZW50KFhNTF9QYXJzZXIgcGFyc2VyKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1RoaXMgY2FuIGJlIGNhbGxlZCB3aXRoaW4gYSBoYW5kbGVyIGZvciBhIHN0YXJ0IGVsZW1lbnQsIGVuZCBlbGVtZW50LAorcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciBjaGFyYWN0ZXIgZGF0YS4gIEl0IGNhdXNlcyB0aGUgY29ycmVzcG9uZGluZworbWFya3VwIHRvIGJlIHBhc3NlZCB0byB0aGUgZGVmYXVsdCBoYW5kbGVyIHNldCBieSA8Y29kZT48YQoraHJlZj0iI1hNTF9TZXREZWZhdWx0SGFuZGxlciIgPlhNTF9TZXREZWZhdWx0SGFuZGxlcjwvYT48L2NvZGU+IG9yCis8Y29kZT48YSBocmVmPSIjWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kIgorPlhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZDwvYT48L2NvZGU+LiAgSXQgZG9lcyBub3RoaW5nIGlmIHRoZXJlIGlzCitub3QgYSBkZWZhdWx0IGhhbmRsZXIuCis8L2Rpdj4KKworPHByZSBjbGFzcz0iZmNuZGVjIiBpZD0iWE1MX0V4cGF0VmVyc2lvbiI+CitYTUxfTENoYXIgKiBYTUxDQUxMCitYTUxfRXhwYXRWZXJzaW9uKCk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitSZXR1cm4gdGhlIGxpYnJhcnkgdmVyc2lvbiBhcyBhIHN0cmluZyAoZS5nLiA8Y29kZT4iZXhwYXRfMS45NS4xIjwvY29kZT4pLgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9FeHBhdFZlcnNpb25JbmZvIj4KK3N0cnVjdCBYTUxfRXhwYXRfVmVyc2lvbiBYTUxDQUxMCitYTUxfRXhwYXRWZXJzaW9uSW5mbygpOworPC9wcmU+Cis8cHJlIGNsYXNzPSJzaWduYXR1cmUiPgordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbWFqb3I7CisgIGludCBtaW5vcjsKKyAgaW50IG1pY3JvOworfSBYTUxfRXhwYXRfVmVyc2lvbjsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK1JldHVybiB0aGUgbGlicmFyeSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFzIGEgc3RydWN0dXJlLgorU29tZSBtYWNyb3MgYXJlIGFsc28gZGVmaW5lZCB0aGF0IHN1cHBvcnQgY29tcGlsZS10aW1lIHRlc3RzIG9mIHRoZQorbGlicmFyeSB2ZXJzaW9uOgorPHVsPgorPGxpPjxjb2RlPlhNTF9NQUpPUl9WRVJTSU9OPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+WE1MX01JTk9SX1ZFUlNJT048L2NvZGU+PC9saT4KKzxsaT48Y29kZT5YTUxfTUlDUk9fVkVSU0lPTjwvY29kZT48L2xpPgorPC91bD4KK1Rlc3RpbmcgdGhlc2UgY29uc3RhbnRzIGlzIGN1cnJlbnRseSB0aGUgYmVzdCB3YXkgdG8gZGV0ZXJtaW5lIGlmCitwYXJ0aWN1bGFyIHBhcnRzIG9mIHRoZSBFeHBhdCBBUEkgYXJlIGF2YWlsYWJsZS4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfR2V0RmVhdHVyZUxpc3QiPgorY29uc3QgWE1MX0ZlYXR1cmUgKiBYTUxDQUxMCitYTUxfR2V0RmVhdHVyZUxpc3QoKTsKKzwvcHJlPgorPHByZSBjbGFzcz0ic2lnbmF0dXJlIj4KK2VudW0gWE1MX0ZlYXR1cmVFbnVtIHsKKyAgWE1MX0ZFQVRVUkVfRU5EID0gMCwKKyAgWE1MX0ZFQVRVUkVfVU5JQ09ERSwKKyAgWE1MX0ZFQVRVUkVfVU5JQ09ERV9XQ0hBUl9ULAorICBYTUxfRkVBVFVSRV9EVEQsCisgIFhNTF9GRUFUVVJFX0NPTlRFWFRfQllURVMsCisgIFhNTF9GRUFUVVJFX01JTl9TSVpFLAorICBYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0NIQVIsCisgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfTENIQVIsCisgIFhNTF9GRUFUVVJFX05TLAorICBYTUxfRkVBVFVSRV9MQVJHRV9TSVpFCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGVudW0gWE1MX0ZlYXR1cmVFbnVtICBmZWF0dXJlOworICBYTUxfTENoYXIgICAgICAgICAgICAqbmFtZTsKKyAgbG9uZyBpbnQgICAgICAgICAgICAgIHZhbHVlOworfSBYTUxfRmVhdHVyZTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KKzxwPlJldHVybnMgYSBsaXN0IG9mICJmZWF0dXJlIiByZWNvcmRzLCBwcm92aWRpbmcgZGV0YWlscyBvbiBob3cKK0V4cGF0IHdhcyBjb25maWd1cmVkIGF0IGNvbXBpbGUgdGltZS4gIE1vc3QgYXBwbGljYXRpb25zIHNob3VsZCBub3QKK25lZWQgdG8gd29ycnkgYWJvdXQgdGhpcywgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgb3RoZXJ3aXNlIG5vdAorYXZhaWxhYmxlIGZyb20gRXhwYXQuICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjb2RlIHRoYXQgZG9lcyBuZWVkIHRvCitjaGVjayB0aGVzZSBmZWF0dXJlcyB0byBkbyBzbyBhdCBydW50aW1lLjwvcD4KKworPHA+VGhlIHJldHVybiB2YWx1ZSBpcyBhbiBhcnJheSBvZiA8Y29kZT5YTUxfRmVhdHVyZTwvY29kZT4sCit0ZXJtaW5hdGVkIGJ5IGEgcmVjb3JkIHdpdGggYSA8Y29kZT5mZWF0dXJlPC9jb2RlPiBvZgorPGNvZGU+WE1MX0ZFQVRVUkVfRU5EPC9jb2RlPiBhbmQgPGNvZGU+bmFtZTwvY29kZT4gb2YgTlVMTCwKK2lkZW50aWZ5aW5nIHRoZSBmZWF0dXJlLXRlc3QgbWFjcm9zIEV4cGF0IHdhcyBjb21waWxlZCB3aXRoLiAgU2luY2UgYW4KK2FwcGxpY2F0aW9uIHRoYXQgcmVxdWlyZXMgdGhpcyBraW5kIG9mIGluZm9ybWF0aW9uIG5lZWRzIHRvIGRldGVybWluZQordGhlIHR5cGUgb2YgY2hhcmFjdGVyIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBwb2ludHMgdG8sIHJlY29yZHMgZm9yIHRoZQorPGNvZGU+WE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9DSEFSPC9jb2RlPiBhbmQKKzxjb2RlPlhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfTENIQVI8L2NvZGU+IHdpbGwgYmUgbG9jYXRlZCBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgbGlzdCwgZm9sbG93ZWQgYnkgPGNvZGU+WE1MX0ZFQVRVUkVfVU5JQ09ERTwvY29kZT4KK2FuZCA8Y29kZT5YTUxfRkVBVFVSRV9VTklDT0RFX1dDSEFSX1Q8L2NvZGU+LCBpZiB0aGV5IGFyZSBwcmVzZW50IGF0CithbGwuPC9wPgorCis8cD5Tb21lIGZlYXR1cmVzIGhhdmUgYW4gYXNzb2NpYXRlZCB2YWx1ZS4gIElmIHRoZXJlIGlzbid0IGFuCithc3NvY2lhdGVkIHZhbHVlLCB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGZpZWxkIGlzIHNldCB0byAwLiAgQXQgdGhpcwordGltZSwgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBoYXZlIGJlZW4gZGVmaW5lZCB0byBoYXZlIHZhbHVlczo8L3A+CisKKzxkbD4KKyAgPGR0Pjxjb2RlPlhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUjwvY29kZT48L2R0PgorICA8ZGQ+VGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBvbmUgPGNvZGU+WE1MX0NoYXI8L2NvZGU+CisgIGNoYXJhY3Rlci48L2RkPgorICA8ZHQ+PGNvZGU+WE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUjwvY29kZT48L2R0PgorICA8ZGQ+VGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBvbmUgPGNvZGU+WE1MX0xDaGFyPC9jb2RlPgorICBjaGFyYWN0ZXIuPC9kZD4KKyAgPGR0Pjxjb2RlPlhNTF9GRUFUVVJFX0NPTlRFWFRfQllURVM8L2NvZGU+PC9kdD4KKyAgPGRkPlRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIGNvbnRleHQgd2hpY2ggY2FuIGJlCisgIHJlcG9ydGVkIGJ5IDxjb2RlPjxhIGhyZWY9ICIjWE1MX0dldElucHV0Q29udGV4dCIKKyAgPlhNTF9HZXRJbnB1dENvbnRleHQ8L2E+PC9jb2RlPi48L2RkPgorPC9kbD4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfRnJlZUNvbnRlbnRNb2RlbCI+Cit2b2lkIFhNTENBTEwKK1hNTF9GcmVlQ29udGVudE1vZGVsKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ29udGVudCAqbW9kZWwpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorRnVuY3Rpb24gdG8gZGVhbGxvY2F0ZSB0aGUgPGNvZGU+bW9kZWw8L2NvZGU+IGFyZ3VtZW50IHBhc3NlZCB0byB0aGUKKzxjb2RlPlhNTF9FbGVtZW50RGVjbEhhbmRsZXI8L2NvZGU+IGNhbGxiYWNrIHNldCB1c2luZyA8Y29kZT48YQoraHJlZj0iI1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIiID5YTUxfRWxlbWVudERlY2xIYW5kbGVyPC9hPjwvY29kZT4uCitUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYW55IG90aGVyIHB1cnBvc2UuCis8L2Rpdj4KKworPHA+VGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYWxsb3cgZXh0ZXJuYWwgY29kZSB0byBzaGFyZSB0aGUgbWVtb3J5CithbGxvY2F0b3IgYW4gPGNvZGU+WE1MX1BhcnNlcjwvY29kZT4gaGFzIGJlZW4gY29uZmlndXJlZCB0byB1c2UuICBUaGlzCitpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgdGhpcmQtcGFydHkgbGlicmFyaWVzIHRoYXQgaW50ZXJhY3Qgd2l0aCBhCitwYXJzZXIgb2JqZWN0IGNyZWF0ZWQgYnkgYXBwbGljYXRpb24gY29kZSwgb3IgaGVhdmlseSBsYXllcmVkCithcHBsaWNhdGlvbnMuICBUaGlzIGNhbiBiZSBlc3NlbnRpYWwgd2hlbiB1c2luZyBkeW5hbWljYWxseSBsb2FkZWQKK2xpYnJhcmllcyB3aGljaCB1c2UgZGlmZmVyZW50IEMgc3RhbmRhcmQgbGlicmFyaWVzICh0aGlzIGNhbiBoYXBwZW4gb24KK1dpbmRvd3MsIGF0IGxlYXN0KS48L3A+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9NZW1NYWxsb2MiPgordm9pZCAqIFhNTENBTEwKK1hNTF9NZW1NYWxsb2MoWE1MX1BhcnNlciBwYXJzZXIsIHNpemVfdCBzaXplKTsKKzwvcHJlPgorPGRpdiBjbGFzcz0iZmNuZGVmIj4KK0FsbG9jYXRlIDxjb2RlPnNpemU8L2NvZGU+IGJ5dGVzIG9mIG1lbW9yeSB1c2luZyB0aGUgYWxsb2NhdG9yIHRoZQorPGNvZGU+cGFyc2VyPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4gY29uZmlndXJlZCB0byB1c2UuICBSZXR1cm5zIGEKK3BvaW50ZXIgdG8gdGhlIG1lbW9yeSBvciBOVUxMIG9uIGZhaWx1cmUuICBNZW1vcnkgYWxsb2NhdGVkIGluIHRoaXMKK3dheSBtdXN0IGJlIGZyZWVkIHVzaW5nIDxjb2RlPjxhIGhyZWY9IiNYTUxfTWVtRnJlZSIKKz5YTUxfTWVtRnJlZTwvYT48L2NvZGU+LgorPC9kaXY+CisKKzxwcmUgY2xhc3M9ImZjbmRlYyIgaWQ9IlhNTF9NZW1SZWFsbG9jIj4KK3ZvaWQgKiBYTUxDQUxMCitYTUxfTWVtUmVhbGxvYyhYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7Cis8L3ByZT4KKzxkaXYgY2xhc3M9ImZjbmRlZiI+CitBbGxvY2F0ZSA8Y29kZT5zaXplPC9jb2RlPiBieXRlcyBvZiBtZW1vcnkgdXNpbmcgdGhlIGFsbG9jYXRvciB0aGUKKzxjb2RlPnBhcnNlcjwvY29kZT4gb2JqZWN0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gdXNlLgorPGNvZGU+cHRyPC9jb2RlPiBtdXN0IHBvaW50IHRvIGEgYmxvY2sgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSA8Y29kZT48YQoraHJlZj0iI1hNTF9NZW1NYWxsb2MiID5YTUxfTWVtTWFsbG9jPC9hPjwvY29kZT4gb3IKKzxjb2RlPlhNTF9NZW1SZWFsbG9jPC9jb2RlPiwgb3IgYmUgTlVMTC4gIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8KK2V4cGFuZCB0aGUgYmxvY2sgcG9pbnRlZCB0byBieSA8Y29kZT5wdHI8L2NvZGU+IGlmIHBvc3NpYmxlLiAgUmV0dXJucworYSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb3IgTlVMTCBvbiBmYWlsdXJlLiAgT24gc3VjY2VzcywgdGhlIG9yaWdpbmFsCitibG9jayBoYXMgZWl0aGVyIGJlZW4gZXhwYW5kZWQgb3IgZnJlZWQuICBPbiBmYWlsdXJlLCB0aGUgb3JpZ2luYWwKK2Jsb2NrIGhhcyBub3QgYmVlbiBmcmVlZDsgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUKK29yaWdpbmFsIGJsb2NrLiAgTWVtb3J5IGFsbG9jYXRlZCBpbiB0aGlzIHdheSBtdXN0IGJlIGZyZWVkIHVzaW5nCis8Y29kZT48YSBocmVmPSIjWE1MX01lbUZyZWUiCis+WE1MX01lbUZyZWU8L2E+PC9jb2RlPi4KKzwvZGl2PgorCis8cHJlIGNsYXNzPSJmY25kZWMiIGlkPSJYTUxfTWVtRnJlZSI+Cit2b2lkIFhNTENBTEwKK1hNTF9NZW1GcmVlKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwdHIpOworPC9wcmU+Cis8ZGl2IGNsYXNzPSJmY25kZWYiPgorRnJlZSBhIGJsb2NrIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IDxjb2RlPnB0cjwvY29kZT4uICBUaGUgYmxvY2sgbXVzdAoraGF2ZSBiZWVuIGFsbG9jYXRlZCBieSA8Y29kZT48YSBocmVmPSIjWE1MX01lbU1hbGxvYyIKKz5YTUxfTWVtTWFsbG9jPC9hPjwvY29kZT4gb3IgPGNvZGU+WE1MX01lbVJlYWxsb2M8L2NvZGU+LCBvciBiZSBOVUxMLgorPC9kaXY+CisKKzxociAvPgorPHA+PGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICBzcmM9InZhbGlkLXhodG1sMTAucG5nIiBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiCisgICAgICAgIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgY2xhc3M9Im5vYm9yZGVyIiAvPjwvYT48L3A+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2RvYy9zdHlsZS5jc3MgYi9leHBhdC0yLjAuMS9kb2Mvc3R5bGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5ZGYzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9kb2Mvc3R5bGUuY3NzCkBAIC0wLDAgKzEsMTAxIEBACitib2R5IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisgIGJvcmRlcjogMHB4OworICBtYXJnaW46IDBweDsKKyAgcGFkZGluZzogMHB4OworfQorCisuY29ybmVyIHsKKyAgd2lkdGg6IDIwMHB4OworICBoZWlnaHQ6IDgwcHg7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLmJhbm5lciB7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTAsMTM5LDYxKTsKKyAgY29sb3I6IHJnYigyNTUsMjM2LDE3Nik7CisgIHBhZGRpbmctbGVmdDogMmVtOworfQorCisuYmFubmVyIGgxIHsKKyAgZm9udC1zaXplOiAyMDAlOworfQorCisuY29udGVudCB7CisgIHBhZGRpbmc6IDBlbSAyZW0gMWVtIDJlbTsKK30KKworLnJlbGVhc2VubyB7CisgIGJhY2tncm91bmQtY29sb3I6IHJnYigxMTAsMTM5LDYxKTsKKyAgY29sb3I6IHJnYigyNTUsMjM2LDE3Nik7CisgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsKKyAgcGFkZGluZy10b3A6IDAuNWVtOworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisubm9ib3JkZXIgeworICBib3JkZXItd2lkdGg6IDBweDsKK30KKworLmVnIHsKKyAgcGFkZGluZy1sZWZ0OiAxZW07CisgIHBhZGRpbmctdG9wOiAuNWVtOworICBwYWRkaW5nLWJvdHRvbTogLjVlbTsKKyAgYm9yZGVyOiBzb2xpZCB0aGluOworICBtYXJnaW46IDFlbSAwOworICBiYWNrZ3JvdW5kLWNvbG9yOiB0YW47CisgIG1hcmdpbi1sZWZ0OiAyZW07CisgIG1hcmdpbi1yaWdodDogMTAlOworfQorCisucHNldWRvY29kZSB7CisgIHBhZGRpbmctbGVmdDogMWVtOworICBwYWRkaW5nLXRvcDogLjVlbTsKKyAgcGFkZGluZy1ib3R0b206IC41ZW07CisgIGJvcmRlcjogc29saWQgdGhpbjsKKyAgbWFyZ2luOiAxZW0gMDsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwyMjAsMTgwKTsKKyAgbWFyZ2luLWxlZnQ6IDJlbTsKKyAgbWFyZ2luLXJpZ2h0OiAxMCU7Cit9CisKKy5oYW5kbGVyIHsKKyAgd2lkdGg6IDEwMCU7CisgIGJvcmRlci10b3Atd2lkdGg6IHRoaW47ICAKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisuaGFuZGxlciBwIHsKKyAgbWFyZ2luLWxlZnQ6IDJlbTsKK30KKworLnNldHRlciB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisuc2lnbmF0dXJlIHsKKyAgY29sb3I6IG5hdnk7Cit9CisKKy5mY25kZWMgeworICB3aWR0aDogMTAwJTsKKyAgYm9yZGVyLXRvcC13aWR0aDogdGhpbjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5mY25kZWYgeworICBtYXJnaW4tbGVmdDogMmVtOworICBtYXJnaW4tYm90dG9tOiAyZW07Cit9CisKK2RkIHsKKyAgbWFyZ2luLWJvdHRvbTogMmVtOworfQorCisuY3BwLXN5bWJvbHMgZHQgeworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworfQorLmNwcC1zeW1ib2xzIGRkIHsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZG9jL3ZhbGlkLXhodG1sMTAucG5nIGIvZXhwYXQtMi4wLjEvZG9jL3ZhbGlkLXhodG1sMTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjMjNmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9kb2MvdmFsaWQteGh0bWwxMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZG9jL3htbHdmLjEgYi9leHBhdC0yLjAuMS9kb2MveG1sd2YuMQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNzQ3MTlhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvZG9jL3htbHdmLjEKQEAgLTAsMCArMSwyNTEgQEAKKy5cIiBUaGlzIG1hbnBhZ2UgaGFzIGJlZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgZG9jYm9vazJtYW4gCisuXCIgZnJvbSBhIERvY0Jvb2sgZG9jdW1lbnQuICBUaGlzIHRvb2wgY2FuIGJlIGZvdW5kIGF0OgorLlwiIDxodHRwOi8vc2hlbGwuaXBvbGluZS5jb20vfmVsbWVydC9jb21wL2RvY2Jvb2syWC8+IAorLlwiIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cywgaW1wcm92ZW1lbnRzLCBjb21tZW50cywgcGF0Y2hlcywgCisuXCIgZXRjLiB0byBTdGV2ZSBDaGVuZyA8c3RldmVAZ2dpLXByb2plY3Qub3JnPi4KKy5USCAiWE1MV0YiICIxIiAiMjQgSmFudWFyeSAyMDAzIiAiIiAiIgorLlNIIE5BTUUKK3htbHdmIFwtIERldGVybWluZXMgaWYgYW4gWE1MIGRvY3VtZW50IGlzIHdlbGwtZm9ybWVkCisuU0ggU1lOT1BTSVMKKworXGZCeG1sd2ZcZlIgWyBcZkItc1xmUl0gIFsgXGZCLW5cZlJdICBbIFxmQi1wXGZSXSAgWyBcZkIteFxmUl0gIFsgXGZCLWUgXGZJZW5jb2RpbmdcZkJcZlJdICBbIFxmQi13XGZSXSAgWyBcZkItZCBcZklvdXRwdXQtZGlyXGZCXGZSXSAgWyBcZkItY1xmUl0gIFsgXGZCLW1cZlJdICBbIFxmQi1yXGZSXSAgWyBcZkItdFxmUl0gIFsgXGZCLXZcZlJdICBbIFxmQmZpbGUgLi4uXGZSXSAKKworLlNIICJERVNDUklQVElPTiIKKy5QUAorXGZCeG1sd2ZcZlIgdXNlcyB0aGUgRXhwYXQgbGlicmFyeSB0bworZGV0ZXJtaW5lIGlmIGFuIFhNTCBkb2N1bWVudCBpcyB3ZWxsLWZvcm1lZC4gIEl0IGlzCitub24tdmFsaWRhdGluZy4KKy5QUAorSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBmaWxlcyBvbiB0aGUgY29tbWFuZC1saW5lLCBhbmQgeW91CitoYXZlIGEgcmVjZW50IHZlcnNpb24gb2YgXGZCeG1sd2ZcZlIsIHRoZQoraW5wdXQgZmlsZSB3aWxsIGJlIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKy5TSCAiV0VMTC1GT1JNRUQgRE9DVU1FTlRTIgorLlBQCitBIHdlbGwtZm9ybWVkIGRvY3VtZW50IG11c3QgYWRoZXJlIHRvIHRoZQorZm9sbG93aW5nIHJ1bGVzOgorLlRQIDAuMmkKK1woYnUKK1RoZSBmaWxlIGJlZ2lucyB3aXRoIGFuIFhNTCBkZWNsYXJhdGlvbi4gIEZvciBpbnN0YW5jZSwKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ieWVzIj8+LgorXGZCTk9URTpcZlIKK1xmQnhtbHdmXGZSIGRvZXMgbm90IGN1cnJlbnRseQorY2hlY2sgZm9yIGEgdmFsaWQgWE1MIGRlY2xhcmF0aW9uLgorLlRQIDAuMmkKK1woYnUKK0V2ZXJ5IHN0YXJ0IHRhZyBpcyBlaXRoZXIgZW1wdHkgKDx0YWcvPikKK29yIGhhcyBhIGNvcnJlc3BvbmRpbmcgZW5kIHRhZy4KKy5UUCAwLjJpCitcKGJ1CitUaGVyZSBpcyBleGFjdGx5IG9uZSByb290IGVsZW1lbnQuICBUaGlzIGVsZW1lbnQgbXVzdCBjb250YWluCithbGwgb3RoZXIgZWxlbWVudHMgaW4gdGhlIGRvY3VtZW50LiAgT25seSBjb21tZW50cywgd2hpdGUKK3NwYWNlLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgbWF5IGNvbWUgYWZ0ZXIgdGhlIGNsb3NlCitvZiB0aGUgcm9vdCBlbGVtZW50LgorLlRQIDAuMmkKK1woYnUKK0FsbCBlbGVtZW50cyBuZXN0IHByb3Blcmx5LgorLlRQIDAuMmkKK1woYnUKK0FsbCBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBlbmNsb3NlZCBpbiBxdW90ZXMgKGVpdGhlciBzaW5nbGUKK29yIGRvdWJsZSkuCisuUFAKK0lmIHRoZSBkb2N1bWVudCBoYXMgYSBEVEQsIGFuZCBpdCBzdHJpY3RseSBjb21wbGllcyB3aXRoIHRoYXQKK0RURCwgdGhlbiB0aGUgZG9jdW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIFxmQnZhbGlkXGZSLgorXGZCeG1sd2ZcZlIgaXMgYSBub24tdmFsaWRhdGluZyBwYXJzZXIgLS0KK2l0IGRvZXMgbm90IGNoZWNrIHRoZSBEVEQuICBIb3dldmVyLCBpdCBkb2VzIHN1cHBvcnQKK2V4dGVybmFsIGVudGl0aWVzIChzZWUgdGhlIFxmQi14XGZSIG9wdGlvbikuCisuU0ggIk9QVElPTlMiCisuUFAKK1doZW4gYW4gb3B0aW9uIGluY2x1ZGVzIGFuIGFyZ3VtZW50LCB5b3UgbWF5IHNwZWNpZnkgdGhlIGFyZ3VtZW50IGVpdGhlcgorc2VwYXJhdGVseSAoIlxmQi1kXGZSIG91dHB1dCIpIG9yIGNvbmNhdGVuYXRlZCB3aXRoIHRoZQorb3B0aW9uICgiXGZCLWRcZlJvdXRwdXQiKS4gIFxmQnhtbHdmXGZSCitzdXBwb3J0cyBib3RoLgorLlRQCitcZkItY1xmUgorSWYgdGhlIGlucHV0IGZpbGUgaXMgd2VsbC1mb3JtZWQgYW5kIFxmQnhtbHdmXGZSCitkb2Vzbid0IGVuY291bnRlciBhbnkgZXJyb3JzLCB0aGUgaW5wdXQgZmlsZSBpcyBzaW1wbHkgY29waWVkIHRvCit0aGUgb3V0cHV0IGRpcmVjdG9yeSB1bmNoYW5nZWQuCitUaGlzIGltcGxpZXMgbm8gbmFtZXNwYWNlcyAodHVybnMgb2ZmIFxmQi1uXGZSKSBhbmQKK3JlcXVpcmVzIFxmQi1kXGZSIHRvIHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUuCisuVFAKK1xmQi1kIG91dHB1dC1kaXJcZlIKK1NwZWNpZmllcyBhIGRpcmVjdG9yeSB0byBjb250YWluIHRyYW5zZm9ybWVkCityZXByZXNlbnRhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGVzLgorQnkgZGVmYXVsdCwgXGZCLWRcZlIgb3V0cHV0cyBhIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbgorKGRlc2NyaWJlZCBiZWxvdykuCitZb3UgY2FuIHNlbGVjdCBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMgdXNpbmcgXGZCLWNcZlIKK2FuZCBcZkItbVxmUi4KKworVGhlIG91dHB1dCBmaWxlbmFtZXMgd2lsbAorYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgZmlsZW5hbWVzIG9yICJTVERJTiIgaWYgdGhlIGlucHV0IGlzCitjb21pbmcgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIFRoZXJlZm9yZSwgeW91IG11c3QgYmUgY2FyZWZ1bCB0aGF0IHRoZQorb3V0cHV0IGZpbGUgZG9lcyBub3QgZ28gaW50byB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGlucHV0CitmaWxlLiAgT3RoZXJ3aXNlLCBcZkJ4bWx3ZlxmUiB3aWxsIGRlbGV0ZSB0aGUKK2lucHV0IGZpbGUgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgb3V0cHV0IGZpbGUgKGp1c3QgbGlrZSBydW5uaW5nCitjYXQgPCBmaWxlID4gZmlsZSBpbiBtb3N0IHNoZWxscykuCisKK1R3byBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCBYTUwgZG9jdW1lbnRzIGhhdmUgYSBieXRlLWZvci1ieXRlCitpZGVudGljYWwgY2Fub25pY2FsIFhNTCByZXByZXNlbnRhdGlvbi4KK05vdGUgdGhhdCBpZ25vcmFibGUgd2hpdGUgc3BhY2UgaXMgY29uc2lkZXJlZCBzaWduaWZpY2FudCBhbmQKK2lzIHRyZWF0ZWQgZXF1aXZhbGVudGx5IHRvIGRhdGEuCitNb3JlIG9uIGNhbm9uaWNhbCBYTUwgY2FuIGJlIGZvdW5kIGF0CitodHRwOi8vd3d3LmpjbGFyay5jb20veG1sL2Nhbm9ueG1sLmh0bWwgLgorLlRQCitcZkItZSBlbmNvZGluZ1xmUgorU3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHRoZSBkb2N1bWVudCwgb3ZlcnJpZGluZworYW55IGRvY3VtZW50IGVuY29kaW5nIGRlY2xhcmF0aW9uLiAgXGZCeG1sd2ZcZlIKK3N1cHBvcnRzIGZvdXIgYnVpbHQtaW4gZW5jb2RpbmdzOgorVVMtQVNDSUksCitVVEYtOCwKK1VURi0xNiwgYW5kCitJU08tODg1OS0xLgorQWxzbyBzZWUgdGhlIFxmQi13XGZSIG9wdGlvbi4KKy5UUAorXGZCLW1cZlIKK091dHB1dHMgc29tZSBzdHJhbmdlIHNvcnQgb2YgWE1MIGZpbGUgdGhhdCBjb21wbGV0ZWx5CitkZXNjcmliZXMgdGhlIGlucHV0IGZpbGUsIGluY2x1ZGluZyBjaGFyYWN0ZXIgcG9zaXRpb25zLgorUmVxdWlyZXMgXGZCLWRcZlIgdG8gc3BlY2lmeSBhbiBvdXRwdXQgZmlsZS4KKy5UUAorXGZCLW5cZlIKK1R1cm5zIG9uIG5hbWVzcGFjZSBwcm9jZXNzaW5nLiAgKGRlc2NyaWJlIG5hbWVzcGFjZXMpCitcZkItY1xmUiBkaXNhYmxlcyBuYW1lc3BhY2VzLgorLlRQCitcZkItcFxmUgorVGVsbHMgeG1sd2YgdG8gcHJvY2VzcyBleHRlcm5hbCBEVERzIGFuZCBwYXJhbWV0ZXIKK2VudGl0aWVzLgorCitOb3JtYWxseSBcZkJ4bWx3ZlxmUiBuZXZlciBwYXJzZXMgcGFyYW1ldGVyCitlbnRpdGllcy4gIFxmQi1wXGZSIHRlbGxzIGl0IHRvIGFsd2F5cyBwYXJzZSB0aGVtLgorXGZCLXBcZlIgaW1wbGllcyBcZkIteFxmUi4KKy5UUAorXGZCLXJcZlIKK05vcm1hbGx5IFxmQnhtbHdmXGZSIG1lbW9yeS1tYXBzIHRoZSBYTUwgZmlsZQorYmVmb3JlIHBhcnNpbmc7IHRoaXMgY2FuIHJlc3VsdCBpbiBmYXN0ZXIgcGFyc2luZyBvbiBtYW55CitwbGF0Zm9ybXMuCitcZkItclxmUiB0dXJucyBvZmYgbWVtb3J5LW1hcHBpbmcgYW5kIHVzZXMgbm9ybWFsIGZpbGUKK0lPIGNhbGxzIGluc3RlYWQuCitPZiBjb3Vyc2UsIG1lbW9yeS1tYXBwaW5nIGlzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9mZgord2hlbiByZWFkaW5nIGZyb20gc3RhbmRhcmQgaW5wdXQuCisKK1VzZSBvZiBtZW1vcnktbWFwcGluZyBjYW4gY2F1c2Ugc29tZSBwbGF0Zm9ybXMgdG8gcmVwb3J0CitzdWJzdGFudGlhbGx5IGhpZ2hlciBtZW1vcnkgdXNhZ2UgZm9yCitcZkJ4bWx3ZlxmUiwgYnV0IHRoaXMgYXBwZWFycyB0byBiZSBhIG1hdHRlciBvZgordGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVwb3J0aW5nIG1lbW9yeSBpbiBhIHN0cmFuZ2Ugd2F5OyB0aGVyZSBpcworbm90IGEgbGVhayBpbiBcZkJ4bWx3ZlxmUi4KKy5UUAorXGZCLXNcZlIKK1ByaW50cyBhbiBlcnJvciBpZiB0aGUgZG9jdW1lbnQgaXMgbm90IHN0YW5kYWxvbmUuIAorQSBkb2N1bWVudCBpcyBzdGFuZGFsb25lIGlmIGl0IGhhcyBubyBleHRlcm5hbCBzdWJzZXQgYW5kIG5vCityZWZlcmVuY2VzIHRvIHBhcmFtZXRlciBlbnRpdGllcy4KKy5UUAorXGZCLXRcZlIKK1R1cm5zIG9uIHRpbWluZ3MuICBUaGlzIHRlbGxzIEV4cGF0IHRvIHBhcnNlIHRoZSBlbnRpcmUgZmlsZSwKK2J1dCBub3QgcGVyZm9ybSBhbnkgcHJvY2Vzc2luZy4KK1RoaXMgZ2l2ZXMgYSBmYWlybHkgYWNjdXJhdGUgaWRlYSBvZiB0aGUgcmF3IHNwZWVkIG9mIEV4cGF0IGl0c2VsZgord2l0aG91dCBjbGllbnQgb3ZlcmhlYWQuCitcZkItdFxmUiB0dXJucyBvZmYgbW9zdCBvZiB0aGUgb3V0cHV0IG9wdGlvbnMKKyhcZkItZFxmUiwgXGZCLW1cZlIsIFxmQi1jXGZSLAorXCYuLi4pLgorLlRQCitcZkItdlxmUgorUHJpbnRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBFeHBhdCBsaWJyYXJ5IGJlaW5nIHVzZWQsIGluY2x1ZGluZyBzb21lCitpbmZvcm1hdGlvbiBvbiB0aGUgY29tcGlsZS10aW1lIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpYnJhcnksIGFuZAordGhlbiBleGl0cy4KKy5UUAorXGZCLXdcZlIKK0VuYWJsZXMgc3VwcG9ydCBmb3IgV2luZG93cyBjb2RlIHBhZ2VzLgorTm9ybWFsbHksIFxmQnhtbHdmXGZSIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgaXQKK3J1bnMgYWNyb3NzIGFuIGVuY29kaW5nIHRoYXQgaXQgaXMgbm90IGVxdWlwcGVkIHRvIGhhbmRsZSBpdHNlbGYuICBXaXRoCitcZkItd1xmUiwgeG1sd2Ygd2lsbCB0cnkgdG8gdXNlIGEgV2luZG93cyBjb2RlCitwYWdlLiAgU2VlIGFsc28gXGZCLWVcZlIuCisuVFAKK1xmQi14XGZSCitUdXJucyBvbiBwYXJzaW5nIGV4dGVybmFsIGVudGl0aWVzLgorCitOb24tdmFsaWRhdGluZyBwYXJzZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gcmVzb2x2ZSBleHRlcm5hbAorZW50aXRpZXMsIG9yIGV2ZW4gZXhwYW5kIGVudGl0aWVzIGF0IGFsbC4KK0V4cGF0IGFsd2F5cyBleHBhbmRzIGludGVybmFsIGVudGl0aWVzICg/KSwKK2J1dCBleHRlcm5hbCBlbnRpdHkgcGFyc2luZyBtdXN0IGJlIGVuYWJsZWQgZXhwbGljaXRseS4KKworRXh0ZXJuYWwgZW50aXRpZXMgYXJlIHNpbXBseSBlbnRpdGllcyB0aGF0IG9idGFpbiB0aGVpcgorZGF0YSBmcm9tIG91dHNpZGUgdGhlIFhNTCBmaWxlIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuCisKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbnRlcm5hbCBlbnRpdHk6CisKKy5uZgorPCFFTlRJVFkgdmVycyAnMS4wLjInPgorLmZpCisKK0FuZCBoZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGV4dGVybmFsIGVudGl0aWVzOgorCisubmYKKzwhRU5USVRZIGhlYWRlciBTWVNURU0gImhlYWRlci0mdmVyczsueG1sIj4gIChwYXJzZWQpCis8IUVOVElUWSBsb2dvIFNZU1RFTSAibG9nby5wbmciIFBORz4gICAgICAgICAodW5wYXJzZWQpCisuZmkKKy5UUAorXGZCLS1cZlIKKyhUd28gaHlwaGVucy4pCitUZXJtaW5hdGVzIHRoZSBsaXN0IG9mIG9wdGlvbnMuICBUaGlzIGlzIG9ubHkgbmVlZGVkIGlmIGEgZmlsZW5hbWUKK3N0YXJ0cyB3aXRoIGEgaHlwaGVuLiAgRm9yIGV4YW1wbGU6CisKKy5uZgoreG1sd2YgLS0gLW15ZmlsZS54bWwKKy5maQorCit3aWxsIHJ1biBcZkJ4bWx3ZlxmUiBvbiB0aGUgZmlsZQorXGZJLW15ZmlsZS54bWxcZlIuCisuUFAKK09sZGVyIHZlcnNpb25zIG9mIFxmQnhtbHdmXGZSIGRvIG5vdCBzdXBwb3J0CityZWFkaW5nIGZyb20gc3RhbmRhcmQgaW5wdXQuCisuU0ggIk9VVFBVVCIKKy5QUAorSWYgYW4gaW5wdXQgZmlsZSBpcyBub3Qgd2VsbC1mb3JtZWQsCitcZkJ4bWx3ZlxmUiBwcmludHMgYSBzaW5nbGUgbGluZSBkZXNjcmliaW5nCit0aGUgcHJvYmxlbSB0byBzdGFuZGFyZCBvdXRwdXQuICBJZiBhIGZpbGUgaXMgd2VsbCBmb3JtZWQsCitcZkJ4bWx3ZlxmUiBvdXRwdXRzIG5vdGhpbmcuCitOb3RlIHRoYXQgdGhlIHJlc3VsdCBjb2RlIGlzIFxmQm5vdFxmUiBzZXQuCisuU0ggIkJVR1MiCisuUFAKK0FjY29yZGluZyB0byB0aGUgVzNDIHN0YW5kYXJkLCBhbiBYTUwgZmlsZSB3aXRob3V0IGEKK2RlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgaXMgbm90IGNvbnNpZGVyZWQgd2VsbC1mb3JtZWQuCitIb3dldmVyLCBcZkJ4bWx3ZlxmUiBhbGxvd3MgdGhpcyB0byBwYXNzLgorLlBQCitcZkJ4bWx3ZlxmUiByZXR1cm5zIGEgMCAtIG5vZXJyIHJlc3VsdCwKK2V2ZW4gaWYgdGhlIGZpbGUgaXMgbm90IHdlbGwtZm9ybWVkLiAgVGhlcmUgaXMgbm8gZ29vZCB3YXkgZm9yCithIHByb2dyYW0gdG8gdXNlIFxmQnhtbHdmXGZSIHRvIHF1aWNrbHkKK2NoZWNrIGEgZmlsZSAtLSBpdCBtdXN0IHBhcnNlIFxmQnhtbHdmXGZSJ3MKK3N0YW5kYXJkIG91dHB1dC4KKy5QUAorVGhlIGVycm9ycyBzaG91bGQgZ28gdG8gc3RhbmRhcmQgZXJyb3IsIG5vdCBzdGFuZGFyZCBvdXRwdXQuCisuUFAKK1RoZXJlIHNob3VsZCBiZSBhIHdheSB0byBnZXQgXGZCLWRcZlIgdG8gc2VuZCBpdHMKK291dHB1dCB0byBzdGFuZGFyZCBvdXRwdXQgcmF0aGVyIHRoYW4gZm9yY2luZyB0aGUgdXNlciB0byBzZW5kCitpdCB0byBhIGZpbGUuCisuUFAKK0kgaGF2ZSBubyBpZGVhIHdoeSBhbnlvbmUgd291bGQgd2FudCB0byB1c2UgdGhlCitcZkItZFxmUiwgXGZCLWNcZlIsIGFuZAorXGZCLW1cZlIgb3B0aW9ucy4gIElmIHNvbWVvbmUgY291bGQgZXhwbGFpbiBpdCB0bworbWUsIEknZCBsaWtlIHRvIGFkZCB0aGlzIGluZm9ybWF0aW9uIHRvIHRoaXMgbWFucGFnZS4KKy5TSCAiQUxURVJOQVRJVkVTIgorLlBQCitIZXJlIGFyZSBzb21lIFhNTCB2YWxpZGF0b3JzIG9uIHRoZSB3ZWI6CisKKy5uZgoraHR0cDovL3d3dy5oY3JjLmVkLmFjLnVrL35yaWNoYXJkL3htbC1jaGVjay5odG1sCitodHRwOi8vd3d3LnN0Zy5icm93bi5lZHUvc2VydmljZS94bWx2YWxpZC8KK2h0dHA6Ly93d3cuc2NyaXB0aW5nLmNvbS9mcm9udGllcjUveG1sL2NvZGUveG1sVmFsaWRhdG9yLmh0bWwKK2h0dHA6Ly93d3cueG1sLmNvbS9wdWIvYS90b29scy9ydXdmL2NoZWNrLmh0bWwKKy5maQorLlNIICJTRUUgQUxTTyIKKy5QUAorCisubmYKK1RoZSBFeHBhdCBob21lIHBhZ2U6ICAgICAgICBodHRwOi8vd3d3LmxpYmV4cGF0Lm9yZy8KK1RoZSBXMyBYTUwgc3BlY2lmaWNhdGlvbjogICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sCisuZmkKKy5TSCAiQVVUSE9SIgorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IFNjb3R0IEJyb25zb24gPGJyb25zb25Acmluc3Bpbi5jb20+IGZvcgordGhlIERlYmlhbiBHTlUvTGludXggc3lzdGVtIChidXQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4gIFBlcm1pc3Npb24gaXMKK2dyYW50ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgZG9jdW1lbnQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEZyZWUgRG9jdW1lbnRhdGlvbgorTGljZW5zZSwgVmVyc2lvbiAxLjEuCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9kb2MveG1sd2Yuc2dtbCBiL2V4cGF0LTIuMC4xL2RvYy94bWx3Zi5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzOWM5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9kb2MveG1sd2Yuc2dtbApAQCAtMCwwICsxLDQ3MyBAQAorPCFkb2N0eXBlIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFY0LjEvL0VOIiBbCisKKzwhLS0gUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBkb2Nib29rLXRvLW1hbiB0byBnZW5lcmF0ZSBhbiBucm9mZiBtYW51YWwKKyAgICAgcGFnZTogYGRvY2Jvb2stdG8tbWFuIG1hbnBhZ2Uuc2dtbCA+IG1hbnBhZ2UuMScuICBZb3UgbWF5IHZpZXcKKyAgICAgdGhlIG1hbnVhbCBwYWdlIHdpdGg6IGBkb2Nib29rLXRvLW1hbiBtYW5wYWdlLnNnbWwgfCBucm9mZiAtbWFuIHwKKyAgICAgbGVzcycuICBBIHR5cGljYWwgZW50cnkgaW4gYSBNYWtlZmlsZSBvciBNYWtlZmlsZS5hbSBpczoKKworbWFucGFnZS4xOiBtYW5wYWdlLnNnbWwKKwlkb2Nib29rLXRvLW1hbiAkPCA+ICRACisgIC0tPgorCisgIDwhLS0gRmlsbCBpbiB5b3VyIG5hbWUgZm9yIEZJUlNUTkFNRSBhbmQgU1VSTkFNRS4gLS0+CisgIDwhRU5USVRZIGRoZmlyc3RuYW1lICI8Zmlyc3RuYW1lPlNjb3R0PC9maXJzdG5hbWU+Ij4KKyAgPCFFTlRJVFkgZGhzdXJuYW1lICAgIjxzdXJuYW1lPkJyb25zb248L3N1cm5hbWU+Ij4KKyAgPCEtLSBQbGVhc2UgYWRqdXN0IHRoZSBkYXRlIHdoZW5ldmVyIHJldmlzaW5nIHRoZSBtYW5wYWdlLiAtLT4KKyAgPCFFTlRJVFkgZGhkYXRlICAgICAgIjxkYXRlPkRlY2VtYmVyICA1LCAyMDAxPC9kYXRlPiI+CisgIDwhLS0gU0VDVElPTiBzaG91bGQgYmUgMS04LCBtYXliZSB3LyBzdWJzZWN0aW9uIG90aGVyIHBhcmFtZXRlcnMgYXJlCisgICAgICAgYWxsb3dlZDogc2VlIG1hbig3KSwgbWFuKDEpLiAtLT4KKyAgPCFFTlRJVFkgZGhzZWN0aW9uICAgIjxtYW52b2xudW0+MTwvbWFudm9sbnVtPiI+CisgIDwhRU5USVRZIGRoZW1haWwgICAgICI8ZW1haWw+YnJvbnNvbkByaW5zcGluLmNvbTwvZW1haWw+Ij4KKyAgPCFFTlRJVFkgZGh1c2VybmFtZSAgIlNjb3R0IEJyb25zb24iPgorICA8IUVOVElUWSBkaHVjcGFja2FnZSAiPHJlZmVudHJ5dGl0bGU+WE1MV0Y8L3JlZmVudHJ5dGl0bGU+Ij4KKyAgPCFFTlRJVFkgZGhwYWNrYWdlICAgInhtbHdmIj4KKworICA8IUVOVElUWSBkZWJpYW4gICAgICAiPHByb2R1Y3RuYW1lPkRlYmlhbiBHTlUvTGludXg8L3Byb2R1Y3RuYW1lPiI+CisgIDwhRU5USVRZIGdudSAgICAgICAgICI8YWNyb255bT5HTlU8L2Fjcm9ueW0+Ij4KK10+CisKKzxyZWZlbnRyeT4KKyAgPHJlZmVudHJ5aW5mbz4KKyAgICA8YWRkcmVzcz4KKyAgICAgICZkaGVtYWlsOworICAgIDwvYWRkcmVzcz4KKyAgICA8YXV0aG9yPgorICAgICAgJmRoZmlyc3RuYW1lOworICAgICAgJmRoc3VybmFtZTsKKyAgICA8L2F1dGhvcj4KKyAgICA8Y29weXJpZ2h0PgorICAgICAgPHllYXI+MjAwMTwveWVhcj4KKyAgICAgIDxob2xkZXI+JmRodXNlcm5hbWU7PC9ob2xkZXI+CisgICAgPC9jb3B5cmlnaHQ+CisgICAgJmRoZGF0ZTsKKyAgPC9yZWZlbnRyeWluZm8+CisgIDxyZWZtZXRhPgorICAgICZkaHVjcGFja2FnZTsKKworICAgICZkaHNlY3Rpb247CisgIDwvcmVmbWV0YT4KKyAgPHJlZm5hbWVkaXY+CisgICAgPHJlZm5hbWU+JmRocGFja2FnZTs8L3JlZm5hbWU+CisKKyAgICA8cmVmcHVycG9zZT5EZXRlcm1pbmVzIGlmIGFuIFhNTCBkb2N1bWVudCBpcyB3ZWxsLWZvcm1lZDwvcmVmcHVycG9zZT4KKyAgPC9yZWZuYW1lZGl2PgorICA8cmVmc3lub3BzaXNkaXY+CisgICAgPGNtZHN5bm9wc2lzPgorICAgICAgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+CisJICA8YXJnPjxvcHRpb24+LXM8L29wdGlvbj48L2FyZz4KKwkgIDxhcmc+PG9wdGlvbj4tbjwvb3B0aW9uPjwvYXJnPgorCSAgPGFyZz48b3B0aW9uPi1wPC9vcHRpb24+PC9hcmc+CisJICA8YXJnPjxvcHRpb24+LXg8L29wdGlvbj48L2FyZz4KKworCSAgPGFyZz48b3B0aW9uPi1lIDxyZXBsYWNlYWJsZT5lbmNvZGluZzwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC9hcmc+CisJICA8YXJnPjxvcHRpb24+LXc8L29wdGlvbj48L2FyZz4KKworCSAgPGFyZz48b3B0aW9uPi1kIDxyZXBsYWNlYWJsZT5vdXRwdXQtZGlyPC9yZXBsYWNlYWJsZT48L29wdGlvbj48L2FyZz4KKwkgIDxhcmc+PG9wdGlvbj4tYzwvb3B0aW9uPjwvYXJnPgorCSAgPGFyZz48b3B0aW9uPi1tPC9vcHRpb24+PC9hcmc+CisKKwkgIDxhcmc+PG9wdGlvbj4tcjwvb3B0aW9uPjwvYXJnPgorCSAgPGFyZz48b3B0aW9uPi10PC9vcHRpb24+PC9hcmc+CisKKwkgIDxhcmc+PG9wdGlvbj4tdjwvb3B0aW9uPjwvYXJnPgorCisJICA8YXJnPmZpbGUgLi4uPC9hcmc+CisgICAgPC9jbWRzeW5vcHNpcz4KKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKyAKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5ERVNDUklQVElPTjwvdGl0bGU+CisKKyAgICA8cGFyYT4KKwk8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gdXNlcyB0aGUgRXhwYXQgbGlicmFyeSB0bworCWRldGVybWluZSBpZiBhbiBYTUwgZG9jdW1lbnQgaXMgd2VsbC1mb3JtZWQuICBJdCBpcworCW5vbi12YWxpZGF0aW5nLgorCTwvcGFyYT4KKworCTxwYXJhPgorCUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgZmlsZXMgb24gdGhlIGNvbW1hbmQtbGluZSwgYW5kIHlvdQorCWhhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4sIHRoZQorCWlucHV0IGZpbGUgd2lsbCBiZSByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuCisJPC9wYXJhPgorCisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5XRUxMLUZPUk1FRCBET0NVTUVOVFM8L3RpdGxlPgorCisJPHBhcmE+CisJICBBIHdlbGwtZm9ybWVkIGRvY3VtZW50IG11c3QgYWRoZXJlIHRvIHRoZQorCSAgZm9sbG93aW5nIHJ1bGVzOgorCTwvcGFyYT4KKworCTxpdGVtaXplZGxpc3Q+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisJICAgIFRoZSBmaWxlIGJlZ2lucyB3aXRoIGFuIFhNTCBkZWNsYXJhdGlvbi4gIEZvciBpbnN0YW5jZSwKKwkJPGxpdGVyYWw+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJ5ZXMiPyZndDs8L2xpdGVyYWw+LgorCQk8ZW1waGFzaXM+Tk9URTo8L2VtcGhhc2lzPgorCQk8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gZG9lcyBub3QgY3VycmVudGx5CisJCWNoZWNrIGZvciBhIHZhbGlkIFhNTCBkZWNsYXJhdGlvbi4KKyAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgPGxpc3RpdGVtPjxwYXJhPgorCQlFdmVyeSBzdGFydCB0YWcgaXMgZWl0aGVyIGVtcHR5ICgmbHQ7dGFnLyZndDspCisJCW9yIGhhcyBhIGNvcnJlc3BvbmRpbmcgZW5kIHRhZy4KKyAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgPGxpc3RpdGVtPjxwYXJhPgorCSAgICBUaGVyZSBpcyBleGFjdGx5IG9uZSByb290IGVsZW1lbnQuICBUaGlzIGVsZW1lbnQgbXVzdCBjb250YWluCisJCWFsbCBvdGhlciBlbGVtZW50cyBpbiB0aGUgZG9jdW1lbnQuICBPbmx5IGNvbW1lbnRzLCB3aGl0ZQorCQlzcGFjZSwgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIG1heSBjb21lIGFmdGVyIHRoZSBjbG9zZQorCQlvZiB0aGUgcm9vdCBlbGVtZW50LgorICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisJCUFsbCBlbGVtZW50cyBuZXN0IHByb3Blcmx5LgorICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisJCUFsbCBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBlbmNsb3NlZCBpbiBxdW90ZXMgKGVpdGhlciBzaW5nbGUKKwkJb3IgZG91YmxlKS4KKyAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorCisJPHBhcmE+CisJICBJZiB0aGUgZG9jdW1lbnQgaGFzIGEgRFRELCBhbmQgaXQgc3RyaWN0bHkgY29tcGxpZXMgd2l0aCB0aGF0CisJICBEVEQsIHRoZW4gdGhlIGRvY3VtZW50IGlzIGFsc28gY29uc2lkZXJlZCA8ZW1waGFzaXM+dmFsaWQ8L2VtcGhhc2lzPi4KKwkgIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiBpcyBhIG5vbi12YWxpZGF0aW5nIHBhcnNlciAtLQorCSAgaXQgZG9lcyBub3QgY2hlY2sgdGhlIERURC4gIEhvd2V2ZXIsIGl0IGRvZXMgc3VwcG9ydAorCSAgZXh0ZXJuYWwgZW50aXRpZXMgKHNlZSB0aGUgPG9wdGlvbj4teDwvb3B0aW9uPiBvcHRpb24pLgorCTwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPk9QVElPTlM8L3RpdGxlPgorCis8cGFyYT4KK1doZW4gYW4gb3B0aW9uIGluY2x1ZGVzIGFuIGFyZ3VtZW50LCB5b3UgbWF5IHNwZWNpZnkgdGhlIGFyZ3VtZW50IGVpdGhlcgorc2VwYXJhdGVseSAoIjxvcHRpb24+LWQ8L29wdGlvbj4gb3V0cHV0Iikgb3IgY29uY2F0ZW5hdGVkIHdpdGggdGhlCitvcHRpb24gKCI8b3B0aW9uPi1kPC9vcHRpb24+b3V0cHV0IikuICA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4KK3N1cHBvcnRzIGJvdGguCis8L3BhcmE+CisKKyAgICA8dmFyaWFibGVsaXN0PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1jPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICBJZiB0aGUgaW5wdXQgZmlsZSBpcyB3ZWxsLWZvcm1lZCBhbmQgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+CisgIGRvZXNuJ3QgZW5jb3VudGVyIGFueSBlcnJvcnMsIHRoZSBpbnB1dCBmaWxlIGlzIHNpbXBseSBjb3BpZWQgdG8KKyAgdGhlIG91dHB1dCBkaXJlY3RvcnkgdW5jaGFuZ2VkLgorICBUaGlzIGltcGxpZXMgbm8gbmFtZXNwYWNlcyAodHVybnMgb2ZmIDxvcHRpb24+LW48L29wdGlvbj4pIGFuZAorICByZXF1aXJlcyA8b3B0aW9uPi1kPC9vcHRpb24+IHRvIHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUuCisgIAkJPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LWQgb3V0cHV0LWRpcjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHRvIGNvbnRhaW4gdHJhbnNmb3JtZWQKKyAgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBpbnB1dCBmaWxlcy4KKyAgQnkgZGVmYXVsdCwgPG9wdGlvbj4tZDwvb3B0aW9uPiBvdXRwdXRzIGEgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uCisgIChkZXNjcmliZWQgYmVsb3cpLgorICBZb3UgY2FuIHNlbGVjdCBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMgdXNpbmcgPG9wdGlvbj4tYzwvb3B0aW9uPgorICBhbmQgPG9wdGlvbj4tbTwvb3B0aW9uPi4KKwkgIDwvcGFyYT4KKwkgIDxwYXJhPgorICBUaGUgb3V0cHV0IGZpbGVuYW1lcyB3aWxsCisgIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGlucHV0IGZpbGVuYW1lcyBvciAiU1RESU4iIGlmIHRoZSBpbnB1dCBpcworICBjb21pbmcgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIFRoZXJlZm9yZSwgeW91IG11c3QgYmUgY2FyZWZ1bCB0aGF0IHRoZQorICBvdXRwdXQgZmlsZSBkb2VzIG5vdCBnbyBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgaW5wdXQKKyAgZmlsZS4gIE90aGVyd2lzZSwgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IHdpbGwgZGVsZXRlIHRoZQorICBpbnB1dCBmaWxlIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIG91dHB1dCBmaWxlIChqdXN0IGxpa2UgcnVubmluZworICA8bGl0ZXJhbD5jYXQgJmx0OyBmaWxlICZndDsgZmlsZTwvbGl0ZXJhbD4gaW4gbW9zdCBzaGVsbHMpLgorCSAgPC9wYXJhPgorCSAgPHBhcmE+IAorICBUd28gc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgWE1MIGRvY3VtZW50cyBoYXZlIGEgYnl0ZS1mb3ItYnl0ZQorICBpZGVudGljYWwgY2Fub25pY2FsIFhNTCByZXByZXNlbnRhdGlvbi4KKyAgTm90ZSB0aGF0IGlnbm9yYWJsZSB3aGl0ZSBzcGFjZSBpcyBjb25zaWRlcmVkIHNpZ25pZmljYW50IGFuZAorICBpcyB0cmVhdGVkIGVxdWl2YWxlbnRseSB0byBkYXRhLgorICBNb3JlIG9uIGNhbm9uaWNhbCBYTUwgY2FuIGJlIGZvdW5kIGF0CisgIGh0dHA6Ly93d3cuamNsYXJrLmNvbS94bWwvY2Fub254bWwuaHRtbCAuCisJICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tZSBlbmNvZGluZzwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgIFNwZWNpZmllcyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciB0aGUgZG9jdW1lbnQsIG92ZXJyaWRpbmcKKyAgIGFueSBkb2N1bWVudCBlbmNvZGluZyBkZWNsYXJhdGlvbi4gIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPgorICAgc3VwcG9ydHMgZm91ciBidWlsdC1pbiBlbmNvZGluZ3M6CisgICAJPGxpdGVyYWw+VVMtQVNDSUk8L2xpdGVyYWw+LAorCTxsaXRlcmFsPlVURi04PC9saXRlcmFsPiwKKwk8bGl0ZXJhbD5VVEYtMTY8L2xpdGVyYWw+LCBhbmQKKwk8bGl0ZXJhbD5JU08tODg1OS0xPC9saXRlcmFsPi4KKyAgIEFsc28gc2VlIHRoZSA8b3B0aW9uPi13PC9vcHRpb24+IG9wdGlvbi4KKwkgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tbTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgT3V0cHV0cyBzb21lIHN0cmFuZ2Ugc29ydCBvZiBYTUwgZmlsZSB0aGF0IGNvbXBsZXRlbHkKKyAgZGVzY3JpYmVzIHRoZSB0aGUgaW5wdXQgZmlsZSwgaW5jbHVkaW5nIGNoYXJhY3RlciBwb3N0aXRpb25zLgorICBSZXF1aXJlcyA8b3B0aW9uPi1kPC9vcHRpb24+IHRvIHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUuCisJICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LW48L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkJPHBhcmE+CisgIFR1cm5zIG9uIG5hbWVzcGFjZSBwcm9jZXNzaW5nLiAgKGRlc2NyaWJlIG5hbWVzcGFjZXMpCisgIDxvcHRpb24+LWM8L29wdGlvbj4gZGlzYWJsZXMgbmFtZXNwYWNlcy4KKwkgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tcDwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgICBUZWxscyB4bWx3ZiB0byBwcm9jZXNzIGV4dGVybmFsIERURHMgYW5kIHBhcmFtZXRlcgorICAgIGVudGl0aWVzLgorCSA8L3BhcmE+CisJIDxwYXJhPgorICAgTm9ybWFsbHkgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IG5ldmVyIHBhcnNlcyBwYXJhbWV0ZXIKKyAgIGVudGl0aWVzLiAgPG9wdGlvbj4tcDwvb3B0aW9uPiB0ZWxscyBpdCB0byBhbHdheXMgcGFyc2UgdGhlbS4KKyAgIDxvcHRpb24+LXA8L29wdGlvbj4gaW1wbGllcyA8b3B0aW9uPi14PC9vcHRpb24+LgorCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1yPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICAgTm9ybWFsbHkgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IG1lbW9yeS1tYXBzIHRoZSBYTUwgZmlsZQorICAgYmVmb3JlIHBhcnNpbmc7IHRoaXMgY2FuIHJlc3VsdCBpbiBmYXN0ZXIgcGFyc2luZyBvbiBtYW55CisgICBwbGF0Zm9ybXMuCisgICA8b3B0aW9uPi1yPC9vcHRpb24+IHR1cm5zIG9mZiBtZW1vcnktbWFwcGluZyBhbmQgdXNlcyBub3JtYWwgZmlsZQorICAgSU8gY2FsbHMgaW5zdGVhZC4KKyAgIE9mIGNvdXJzZSwgbWVtb3J5LW1hcHBpbmcgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb2ZmCisgICB3aGVuIHJlYWRpbmcgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKwkgICA8L3BhcmE+CisJCTxwYXJhPgorICAgVXNlIG9mIG1lbW9yeS1tYXBwaW5nIGNhbiBjYXVzZSBzb21lIHBsYXRmb3JtcyB0byByZXBvcnQKKyAgIHN1YnN0YW50aWFsbHkgaGlnaGVyIG1lbW9yeSB1c2FnZSBmb3IKKyAgIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiwgYnV0IHRoaXMgYXBwZWFycyB0byBiZSBhIG1hdHRlciBvZgorICAgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVwb3J0aW5nIG1lbW9yeSBpbiBhIHN0cmFuZ2Ugd2F5OyB0aGVyZSBpcworICAgbm90IGEgbGVhayBpbiA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4uCisgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi1zPC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICBQcmludHMgYW4gZXJyb3IgaWYgdGhlIGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lLiAKKyAgQSBkb2N1bWVudCBpcyBzdGFuZGFsb25lIGlmIGl0IGhhcyBubyBleHRlcm5hbCBzdWJzZXQgYW5kIG5vCisgIHJlZmVyZW5jZXMgdG8gcGFyYW1ldGVyIGVudGl0aWVzLgorCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi10PC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICBUdXJucyBvbiB0aW1pbmdzLiAgVGhpcyB0ZWxscyBFeHBhdCB0byBwYXJzZSB0aGUgZW50aXJlIGZpbGUsCisgIGJ1dCBub3QgcGVyZm9ybSBhbnkgcHJvY2Vzc2luZy4KKyAgVGhpcyBnaXZlcyBhIGZhaXJseSBhY2N1cmF0ZSBpZGVhIG9mIHRoZSByYXcgc3BlZWQgb2YgRXhwYXQgaXRzZWxmCisgIHdpdGhvdXQgY2xpZW50IG92ZXJoZWFkLgorICA8b3B0aW9uPi10PC9vcHRpb24+IHR1cm5zIG9mZiBtb3N0IG9mIHRoZSBvdXRwdXQgb3B0aW9ucworICAoPG9wdGlvbj4tZDwvb3B0aW9uPiwgPG9wdGlvbj4tbTwvb3B0aW9uPiwgPG9wdGlvbj4tYzwvb3B0aW9uPiwKKyAgLi4uKS4KKwkgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tdjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgUHJpbnRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBFeHBhdCBsaWJyYXJ5IGJlaW5nIHVzZWQsIGluY2x1ZGluZyBzb21lCisgIGluZm9ybWF0aW9uIG9uIHRoZSBjb21waWxlLXRpbWUgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeSwgYW5kCisgIHRoZW4gZXhpdHMuCisJICAgPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgIDx0ZXJtPjxvcHRpb24+LXc8L29wdGlvbj48L3Rlcm0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkJPHBhcmE+CisgIEVuYWJsZXMgc3VwcG9ydCBmb3IgV2luZG93cyBjb2RlIHBhZ2VzLgorICBOb3JtYWxseSwgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+IHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgaXQKKyAgcnVucyBhY3Jvc3MgYW4gZW5jb2RpbmcgdGhhdCBpdCBpcyBub3QgZXF1aXBwZWQgdG8gaGFuZGxlIGl0c2VsZi4gIFdpdGgKKyAgPG9wdGlvbj4tdzwvb3B0aW9uPiwgJmRocGFja2FnZTsgd2lsbCB0cnkgdG8gdXNlIGEgV2luZG93cyBjb2RlCisgIHBhZ2UuICBTZWUgYWxzbyA8b3B0aW9uPi1lPC9vcHRpb24+LgorCSAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICA8dGVybT48b3B0aW9uPi14PC9vcHRpb24+PC90ZXJtPgorICAgICAgICA8bGlzdGl0ZW0+CisJCTxwYXJhPgorICBUdXJucyBvbiBwYXJzaW5nIGV4dGVybmFsIGVudGl0aWVzLgorICA8L3BhcmE+Cis8cGFyYT4KKyAgTm9uLXZhbGlkYXRpbmcgcGFyc2VycyBhcmUgbm90IHJlcXVpcmVkIHRvIHJlc29sdmUgZXh0ZXJuYWwKKyAgZW50aXRpZXMsIG9yIGV2ZW4gZXhwYW5kIGVudGl0aWVzIGF0IGFsbC4KKyAgRXhwYXQgYWx3YXlzIGV4cGFuZHMgaW50ZXJuYWwgZW50aXRpZXMgKD8pLAorICBidXQgZXh0ZXJuYWwgZW50aXR5IHBhcnNpbmcgbXVzdCBiZSBlbmFibGVkIGV4cGxpY2l0bHkuCisgIDwvcGFyYT4KKyAgPHBhcmE+CisgIEV4dGVybmFsIGVudGl0aWVzIGFyZSBzaW1wbHkgZW50aXRpZXMgdGhhdCBvYnRhaW4gdGhlaXIKKyAgZGF0YSBmcm9tIG91dHNpZGUgdGhlIFhNTCBmaWxlIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuCisgIDwvcGFyYT4KKyAgPHBhcmE+CisgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbnRlcm5hbCBlbnRpdHk6Cis8bGl0ZXJhbGxheW91dD4KKyZsdDshRU5USVRZIHZlcnMgJzEuMC4yJyZndDsKKzwvbGl0ZXJhbGxheW91dD4KKyAgPC9wYXJhPgorICA8cGFyYT4KKyAgQW5kIGhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgZXh0ZXJuYWwgZW50aXRpZXM6CisKKzxsaXRlcmFsbGF5b3V0PgorJmx0OyFFTlRJVFkgaGVhZGVyIFNZU1RFTSAiaGVhZGVyLSZhbXA7dmVyczsueG1sIiZndDsgIChwYXJzZWQpCismbHQ7IUVOVElUWSBsb2dvIFNZU1RFTSAibG9nby5wbmciIFBORyZndDsgICAgICAgICAodW5wYXJzZWQpCis8L2xpdGVyYWxsYXlvdXQ+CisKKwkgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgPHRlcm0+PG9wdGlvbj4tLTwvb3B0aW9uPjwvdGVybT4KKyAgICAgICAgPGxpc3RpdGVtPgorCQk8cGFyYT4KKyAgICAoVHdvIGh5cGhlbnMuKQorICAgIFRlcm1pbmF0ZXMgdGhlIGxpc3Qgb2Ygb3B0aW9ucy4gIFRoaXMgaXMgb25seSBuZWVkZWQgaWYgYSBmaWxlbmFtZQorICAgIHN0YXJ0cyB3aXRoIGEgaHlwaGVuLiAgRm9yIGV4YW1wbGU6CisJICAgPC9wYXJhPgorPGxpdGVyYWxsYXlvdXQ+CismZGhwYWNrYWdlOyAtLSAtbXlmaWxlLnhtbAorPC9saXRlcmFsbGF5b3V0PgorCQk8cGFyYT4KKyAgICB3aWxsIHJ1biA8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gb24gdGhlIGZpbGUKKyAgICA8ZmlsZW5hbWU+LW15ZmlsZS54bWw8L2ZpbGVuYW1lPi4KKwkgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKworCTxwYXJhPgorICAgIE9sZGVyIHZlcnNpb25zIG9mIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiBkbyBub3Qgc3VwcG9ydAorICAgIHJlYWRpbmcgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKwk8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICA8dGl0bGU+T1VUUFVUPC90aXRsZT4KKyAgICA8cGFyYT4KKwlJZiBhbiBpbnB1dCBmaWxlIGlzIG5vdCB3ZWxsLWZvcm1lZCwKKwk8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gcHJpbnRzIGEgc2luZ2xlIGxpbmUgZGVzY3JpYmluZworCXRoZSBwcm9ibGVtIHRvIHN0YW5kYXJkIG91dHB1dC4gIElmIGEgZmlsZSBpcyB3ZWxsIGZvcm1lZCwKKwk8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gb3V0cHV0cyBub3RoaW5nLgorCU5vdGUgdGhhdCB0aGUgcmVzdWx0IGNvZGUgaXMgPGVtcGhhc2lzPm5vdDwvZW1waGFzaXM+IHNldC4KKwk8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisgIAorICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkJVR1M8L3RpdGxlPgorCTxwYXJhPgorCUFjY29yZGluZyB0byB0aGUgVzNDIHN0YW5kYXJkLCBhbiBYTUwgZmlsZSB3aXRob3V0IGEKKwlkZWNsYXJhdGlvbiBhdCB0aGUgYmVnaW5uaW5nIGlzIG5vdCBjb25zaWRlcmVkIHdlbGwtZm9ybWVkLgorCUhvd2V2ZXIsIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiBhbGxvd3MgdGhpcyB0byBwYXNzLgorCTwvcGFyYT4KKwk8cGFyYT4KKwk8Y29tbWFuZD4mZGhwYWNrYWdlOzwvY29tbWFuZD4gcmV0dXJucyBhIDAgLSBub2VyciByZXN1bHQsCisJZXZlbiBpZiB0aGUgZmlsZSBpcyBub3Qgd2VsbC1mb3JtZWQuICBUaGVyZSBpcyBubyBnb29kIHdheSBmb3IKKwlhIHByb2dyYW0gdG8gdXNlIDxjb21tYW5kPiZkaHBhY2thZ2U7PC9jb21tYW5kPiB0byBxdWlja2x5CisJY2hlY2sgYSBmaWxlIC0tIGl0IG11c3QgcGFyc2UgPGNvbW1hbmQ+JmRocGFja2FnZTs8L2NvbW1hbmQ+J3MKKwlzdGFuZGFyZCBvdXRwdXQuCisJPC9wYXJhPgorCTxwYXJhPgorCVRoZSBlcnJvcnMgc2hvdWxkIGdvIHRvIHN0YW5kYXJkIGVycm9yLCBub3Qgc3RhbmRhcmQgb3V0cHV0LgorCTwvcGFyYT4KKwk8cGFyYT4KKwlUaGVyZSBzaG91bGQgYmUgYSB3YXkgdG8gZ2V0IDxvcHRpb24+LWQ8L29wdGlvbj4gdG8gc2VuZCBpdHMKKwlvdXRwdXQgdG8gc3RhbmRhcmQgb3V0cHV0IHJhdGhlciB0aGFuIGZvcmNpbmcgdGhlIHVzZXIgdG8gc2VuZAorCWl0IHRvIGEgZmlsZS4KKwk8L3BhcmE+CisJPHBhcmE+CisJSSBoYXZlIG5vIGlkZWEgd2h5IGFueW9uZSB3b3VsZCB3YW50IHRvIHVzZSB0aGUKKwk8b3B0aW9uPi1kPC9vcHRpb24+LCA8b3B0aW9uPi1jPC9vcHRpb24+LCBhbmQKKwk8b3B0aW9uPi1tPC9vcHRpb24+IG9wdGlvbnMuICBJZiBzb21lb25lIGNvdWxkIGV4cGxhaW4gaXQgdG8KKwltZSwgSSdkIGxpa2UgdG8gYWRkIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhpcyBtYW5wYWdlLgorCTwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkFMVEVSTkFUSVZFUzwvdGl0bGU+CisJPHBhcmE+CisJICBIZXJlIGFyZSBzb21lIFhNTCB2YWxpZGF0b3JzIG9uIHRoZSB3ZWI6CisKKzxsaXRlcmFsbGF5b3V0PgoraHR0cDovL3d3dy5oY3JjLmVkLmFjLnVrL35yaWNoYXJkL3htbC1jaGVjay5odG1sCitodHRwOi8vd3d3LnN0Zy5icm93bi5lZHUvc2VydmljZS94bWx2YWxpZC8KK2h0dHA6Ly93d3cuc2NyaXB0aW5nLmNvbS9mcm9udGllcjUveG1sL2NvZGUveG1sVmFsaWRhdG9yLmh0bWwKK2h0dHA6Ly93d3cueG1sLmNvbS9wdWIvYS90b29scy9ydXdmL2NoZWNrLmh0bWwKKzwvbGl0ZXJhbGxheW91dD4KKworCQkgPC9wYXJhPgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+U0VFIEFMU088L3RpdGxlPgorCTxwYXJhPgorCis8bGl0ZXJhbGxheW91dD4KK1RoZSBFeHBhdCBob21lIHBhZ2U6ICAgICAgICBodHRwOi8vd3d3LmxpYmV4cGF0Lm9yZy8KK1RoZSBXMyBYTUwgc3BlY2lmaWNhdGlvbjogICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sCis8L2xpdGVyYWxsYXlvdXQ+CisKKwk8L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5BVVRIT1I8L3RpdGxlPgorICAgIDxwYXJhPgorCSAgVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSAmZGh1c2VybmFtZTsgJmRoZW1haWw7IGZvcgorICAgICAgdGhlICZkZWJpYW47IHN5c3RlbSAoYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVycykuICBQZXJtaXNzaW9uIGlzCisgICAgICBncmFudGVkIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIGRvY3VtZW50IHVuZGVyCisgICAgICB0aGUgdGVybXMgb2YgdGhlIDxhY3JvbnltPkdOVTwvYWNyb255bT4gRnJlZSBEb2N1bWVudGF0aW9uCisgICAgICBMaWNlbnNlLCBWZXJzaW9uIDEuMS4KKwk8L3BhcmE+CisgIDwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgorCis8IS0tIEtlZXAgdGhpcyBjb21tZW50IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKK0xvY2FsIHZhcmlhYmxlczoKK21vZGU6IHNnbWwKK3NnbWwtb21pdHRhZzp0CitzZ21sLXNob3J0dGFnOnQKK3NnbWwtbWluaW1pemUtYXR0cmlidXRlczpuaWwKK3NnbWwtYWx3YXlzLXF1b3RlLWF0dHJpYnV0ZXM6dAorc2dtbC1pbmRlbnQtc3RlcDoyCitzZ21sLWluZGVudC1kYXRhOnQKK3NnbWwtcGFyZW50LWRvY3VtZW50Om5pbAorc2dtbC1kZWZhdWx0LWR0ZC1maWxlOm5pbAorc2dtbC1leHBvc2VkLXRhZ3M6bmlsCitzZ21sLWxvY2FsLWNhdGFsb2dzOm5pbAorc2dtbC1sb2NhbC1lY2F0LWZpbGVzOm5pbAorRW5kOgorLS0+CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9leGFtcGxlcy9lbGVtZW50cy5jIGIvZXhwYXQtMi4wLjEvZXhhbXBsZXMvZWxlbWVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjhmODU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvZXhhbXBsZXMvZWxlbWVudHMuYwpAQCAtMCwwICsxLDY1IEBACisvKiBUaGlzIGlzIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIGhvdyB0byB1c2UgZXhwYXQuIFRoaXMgcHJvZ3JhbQorICAgcmVhZHMgYW4gWE1MIGRvY3VtZW50IGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyBhIGxpbmUgd2l0aAorICAgdGhlIG5hbWUgb2YgZWFjaCBlbGVtZW50IHRvIHN0YW5kYXJkIG91dHB1dCBpbmRlbnRpbmcgY2hpbGQKKyAgIGVsZW1lbnRzIGJ5IG9uZSB0YWIgc3RvcCBtb3JlIHRoYW4gdGhlaXIgcGFyZW50IGVsZW1lbnQuCisgICBJdCBtdXN0IGJlIHVzZWQgd2l0aCBFeHBhdCBjb21waWxlZCBmb3IgVVRGLTggb3V0cHV0LgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZXhwYXQuaCIKKworI2lmIGRlZmluZWQoX19hbWlnYW9zX18pICYmIGRlZmluZWQoX19VU0VfSU5MSU5FX18pCisjaW5jbHVkZSA8cHJvdG8vZXhwYXQuaD4KKyNlbmRpZgorCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUKKyNpZiBkZWZpbmVkKFhNTF9VU0VfTVNDX0VYVEVOU0lPTlMpICYmIF9NU0NfVkVSIDwgMTQwMAorI2RlZmluZSBYTUxfRk1UX0lOVF9NT0QgIkk2NCIKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibGwiCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibCIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRzKQoreworICBpbnQgaTsKKyAgaW50ICpkZXB0aFB0ciA9IChpbnQgKil1c2VyRGF0YTsKKyAgZm9yIChpID0gMDsgaSA8ICpkZXB0aFB0cjsgaSsrKQorICAgIHB1dGNoYXIoJ1x0Jyk7CisgIHB1dHMobmFtZSk7CisgICpkZXB0aFB0ciArPSAxOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitlbmRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lKQoreworICBpbnQgKmRlcHRoUHRyID0gKGludCAqKXVzZXJEYXRhOworICAqZGVwdGhQdHIgLT0gMTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgYnVmW0JVRlNJWl07CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKyAgaW50IGRvbmU7CisgIGludCBkZXB0aCA9IDA7CisgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZkZXB0aCk7CisgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0RWxlbWVudCwgZW5kRWxlbWVudCk7CisgIGRvIHsKKyAgICBpbnQgbGVuID0gKGludClmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBzdGRpbik7CisgICAgZG9uZSA9IGxlbiA8IHNpemVvZihidWYpOworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCBidWYsIGxlbiwgZG9uZSkgPT0gWE1MX1NUQVRVU19FUlJPUikgeworICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICIlcyBhdCBsaW5lICUiIFhNTF9GTVRfSU5UX01PRCAidVxuIiwKKyAgICAgICAgICAgICAgWE1MX0Vycm9yU3RyaW5nKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSksCisgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfSB3aGlsZSAoIWRvbmUpOworICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2V4YW1wbGVzL2VsZW1lbnRzLmRzcCBiL2V4cGF0LTIuMC4xL2V4YW1wbGVzL2VsZW1lbnRzLmRzcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzMwMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvZXhhbXBsZXMvZWxlbWVudHMuZHNwCkBAIC0wLDAgKzEsMTAzIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImVsZW1lbnRzIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9ZWxlbWVudHMgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiZWxlbWVudHMubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImVsZW1lbnRzLm1hayIgQ0ZHPSJlbGVtZW50cyAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJlbGVtZW50cyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgImVsZW1lbnRzIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImVsZW1lbnRzIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcUmVsZWFzZS1lbGVtZW50cyINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLlxsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJYTUxfU1RBVElDIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWCAvWVgNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIgb2RiY2NwMzIubGliIGxpYmV4cGF0TVQubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL3BkYjpub25lIC9tYWNoaW5lOkkzODYgL2xpYnBhdGg6Ii4uXHdpbjMyXGJpblxSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJlbGVtZW50cyAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxEZWJ1Zy1lbGVtZW50cyINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dYIC9aSSAvT2QgL0kgIi4uXGxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIlhNTF9TVEFUSUMiIC9GUiAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIG9kYmNjcDMyLmxpYiBsaWJleHBhdE1ULmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9wZGI6bm9uZSAvZGVidWcgL21hY2hpbmU6STM4NiAvbGlicGF0aDoiLi5cd2luMzJcYmluXERlYnVnIg0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiZWxlbWVudHMgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiZWxlbWVudHMgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxlbGVtZW50cy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9leGFtcGxlcy9vdXRsaW5lLmMgYi9leHBhdC0yLjAuMS9leGFtcGxlcy9vdXRsaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2EzYzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2V4YW1wbGVzL291dGxpbmUuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvdXRsaW5lLmMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OSwgQ2xhcmsgQ29vcGVyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkIGluIHRoZQorICogQ09QWUlORyBmaWxlIHRoYXQgY29tZXMgd2l0aCB0aGUgZXhwYXQgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBSZWFkIGFuIFhNTCBkb2N1bWVudCBmcm9tIHN0YW5kYXJkIGlucHV0IGFuZCBwcmludCBhbiBlbGVtZW50CisgKiBvdXRsaW5lIG9uIHN0YW5kYXJkIG91dHB1dC4KKyAqIE11c3QgYmUgdXNlZCB3aXRoIEV4cGF0IGNvbXBpbGVkIGZvciBVVEYtOCBvdXRwdXQuCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxleHBhdC5oPgorCisjaWYgZGVmaW5lZChfX2FtaWdhb3NfXykgJiYgZGVmaW5lZChfX1VTRV9JTkxJTkVfXykKKyNpbmNsdWRlIDxwcm90by9leHBhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBYTUxfTEFSR0VfU0laRQorI2lmIGRlZmluZWQoWE1MX1VTRV9NU0NfRVhURU5TSU9OUykgJiYgX01TQ19WRVIgPCAxNDAwCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAiSTY0IgorI2Vsc2UKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsbCIKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsIgorI2VuZGlmCisKKyNkZWZpbmUgQlVGRlNJWkUgICAgICAgIDgxOTIKKworY2hhciBCdWZmW0JVRkZTSVpFXTsKKworaW50IERlcHRoOworCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydCh2b2lkICpkYXRhLCBjb25zdCBjaGFyICplbCwgY29uc3QgY2hhciAqKmF0dHIpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBEZXB0aDsgaSsrKQorICAgIHByaW50ZigiICAiKTsKKworICBwcmludGYoIiVzIiwgZWwpOworCisgIGZvciAoaSA9IDA7IGF0dHJbaV07IGkgKz0gMikgeworICAgIHByaW50ZigiICVzPSclcyciLCBhdHRyW2ldLCBhdHRyW2kgKyAxXSk7CisgIH0KKworICBwcmludGYoIlxuIik7CisgIERlcHRoKys7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2VuZCh2b2lkICpkYXRhLCBjb25zdCBjaGFyICplbCkKK3sKKyAgRGVwdGgtLTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIFhNTF9QYXJzZXIgcCA9IFhNTF9QYXJzZXJDcmVhdGUoTlVMTCk7CisgIGlmICghIHApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFyc2VyXG4iKTsKKyAgICBleGl0KC0xKTsKKyAgfQorCisgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwLCBzdGFydCwgZW5kKTsKKworICBmb3IgKDs7KSB7CisgICAgaW50IGRvbmU7CisgICAgaW50IGxlbjsKKworICAgIGxlbiA9IChpbnQpZnJlYWQoQnVmZiwgMSwgQlVGRlNJWkUsIHN0ZGluKTsKKyAgICBpZiAoZmVycm9yKHN0ZGluKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSZWFkIGVycm9yXG4iKTsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICBkb25lID0gZmVvZihzdGRpbik7CisKKyAgICBpZiAoWE1MX1BhcnNlKHAsIEJ1ZmYsIGxlbiwgZG9uZSkgPT0gWE1MX1NUQVRVU19FUlJPUikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJzZSBlcnJvciBhdCBsaW5lICUiIFhNTF9GTVRfSU5UX01PRCAidTpcbiVzXG4iLAorICAgICAgICAgICAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocCksCisgICAgICAgICAgICAgIFhNTF9FcnJvclN0cmluZyhYTUxfR2V0RXJyb3JDb2RlKHApKSk7CisgICAgICBleGl0KC0xKTsKKyAgICB9CisKKyAgICBpZiAoZG9uZSkKKyAgICAgIGJyZWFrOworICB9CisgIFhNTF9QYXJzZXJGcmVlKHApOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2V4YW1wbGVzL291dGxpbmUuZHNwIGIvZXhwYXQtMi4wLjEvZXhhbXBsZXMvb3V0bGluZS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjJkMTkzMgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2V4YW1wbGVzL291dGxpbmUuZHNwCkBAIC0wLDAgKzEsMTAzIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Im91dGxpbmUiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1vdXRsaW5lIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIm91dGxpbmUubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIm91dGxpbmUubWFrIiBDRkc9Im91dGxpbmUgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAib3V0bGluZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgIm91dGxpbmUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAib3V0bGluZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXFJlbGVhc2Utb3V0bGluZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLlxsaWIiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9YIC9ZWA0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvcGRiOm5vbmUgL21hY2hpbmU6STM4Ng0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJvdXRsaW5lIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXERlYnVnLW91dGxpbmUiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvSSAiLi5cbGliIiAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9wZGI6bm9uZSAvZGVidWcgL21hY2hpbmU6STM4Ng0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAib3V0bGluZSAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJvdXRsaW5lIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cb3V0bGluZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisjIEVuZCBHcm91cA0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9leHBhdC5kc3cgYi9leHBhdC0yLjAuMS9leHBhdC5kc3cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTI4MmRhNQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2V4cGF0LmRzdwpAQCAtMCwwICsxLDExMCBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiZWxlbWVudHMiPS5cZXhhbXBsZXNcZWxlbWVudHMuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGV4cGF0X3N0YXRpYw0KKyAgICBFbmQgUHJvamVjdCBEZXBlbmRlbmN5DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJleHBhdCI9LlxsaWJcZXhwYXQuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJleHBhdF9zdGF0aWMiPS5cbGliXGV4cGF0X3N0YXRpYy5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogImV4cGF0dyI9LlxsaWJcZXhwYXR3LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiZXhwYXR3X3N0YXRpYyI9LlxsaWJcZXhwYXR3X3N0YXRpYy5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIm91dGxpbmUiPS5cZXhhbXBsZXNcb3V0bGluZS5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgZXhwYXQNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAieG1sd2YiPS5ceG1sd2ZceG1sd2YuZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorICAgIEJlZ2luIFByb2plY3QgRGVwZW5kZW5jeQ0KKyAgICBQcm9qZWN0X0RlcF9OYW1lIGV4cGF0DQorICAgIEVuZCBQcm9qZWN0IERlcGVuZGVuY3kNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvZXhwYXRfY29uZmlnLmguaW4gYi9leHBhdC0yLjAuMS9leHBhdF9jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YzM2OThhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvZXhwYXRfY29uZmlnLmguaW4KQEAgLTAsMCArMSw5MiBAQAorLyogZXhwYXRfY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIDEyMzQgPSBMSUxfRU5ESUFOLCA0MzIxID0gQklHRU5ESUFOICovCisjdW5kZWYgQllURU9SREVSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmNvcHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQkNPUFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0RMRkNOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwYWdlc2l6ZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTUVNTU9WRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogd2hldGhlciBieXRlb3JkZXIgaXMgYmlnZW5kaWFuICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byBzcGVjaWZ5IGhvdyBtdWNoIGNvbnRleHQgdG8gcmV0YWluIGFyb3VuZCB0aGUgY3VycmVudCBwYXJzZQorICAgcG9pbnQuICovCisjdW5kZWYgWE1MX0NPTlRFWFRfQllURVMKKworLyogRGVmaW5lIHRvIG1ha2UgcGFyYW1ldGVyIGVudGl0eSBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLiAqLworI3VuZGVmIFhNTF9EVEQKKworLyogRGVmaW5lIHRvIG1ha2UgWE1MIE5hbWVzcGFjZXMgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUuICovCisjdW5kZWYgWE1MX05TCisKKy8qIERlZmluZSB0byBfX0ZVTkNUSU9OX18gb3IgIiIgaWYgYF9fZnVuY19fJyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKyN1bmRlZiBfX2Z1bmNfXworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNpemVfdApkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL01ha2VmaWxlLk1QVyBiL2V4cGF0LTIuMC4xL2xpYi9NYWtlZmlsZS5NUFcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ2YWYwMAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi9NYWtlZmlsZS5NUFcKQEAgLTAsMCArMSwyMDYgQEAKKyMgICBGaWxlOiAgICAgICBNYWtlZmlsZS5NUFcKKyMgICBUYXJnZXRzOiAgICBBbGwsIER5bmFtaWMsIFN0YXRpYyAoYW5kIENsZWFuLCBDbGVhbi1BbGwpCisjICAgQ3JlYXRlZDogICAgVHVlc2RheSwgSnVseSAwMiwgMjAwMgorIworIyAgIE1QVyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgZXhwYXQgdW5kZXIgdGhlICJjbGFzc2ljIiAoaS5lLiBwcmUtWCkgTWFjIE9TCisjICAgQ29weXJpZ2h0IKkgMjAwMiBEYXJ5bGUgV2Fsa2VyCisjICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAwMiBUaG9tYXMgV2VnbmVyCisjICAgU2VlIHRoZSBDT1BZSU5HIGZpbGUgZm9yIGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbgorIworIyAgIERlc2NyaXB0aW9uOiAKKyMgICBUaGlzIE1ha2VmaWxlIGxldHMgeW91IGJ1aWxkIHN0YXRpYywgZHluYW1pYyAoaS5lLiBzaGFyZWQpIGFuZCBzdHViIAorIyAgIHZlcnNpb25zIG9mIHRoZSBleHBhdCBsaWJyYXJ5IGFzIHdlbGwgYXMgdGhlIGVsZW1lbnRzLmMgYW5kIG91dGxpbmUuYyAKKyMgICBleGFtcGxlcyAoYnVpbHQgYXMgdG9vbHMgZm9yIE1QVykuIFRoaXMgaXMgZm9yIFBQQyBvbmx5OyBpdCBzaG91bGQgYmUgCisjICAgbm8gcHJvYmxlbSB0byBidWlsZCBhIDY4SyB2ZXJzaW9uIG9mIHRoZSBleHBhdCBsaWJyYXJ5LCB0aG91Z2guCisjCisjIAlVc2FnZTogCisjCQkJICAgICAgIEJ1aWxkcHJvZ3JhbSBBbGwKKyMJCQkgb3IgICAgQnVpbGRwcm9ncmFtIER5bmFtaWMKKyMJCQkgb3IgICAgQnVpbGRwcm9ncmFtIFN0YXRpYworIworIyAgIE5vdGU6IFlvdSBmaXJzdCBoYXZlIHRvIHJlbmFtZSB0aGlzIGZpbGUgdG8gIk1ha2VmaWxlIiwgb3IgdGhlIEJ1aWxkcHJvZ3JhbSAKKyMgICAgICAgICBjb21tYW5kbyB3aWxsIG5vdCByZWNvZ25pemUgaXQuCisjCisKK01BS0VGSUxFICAgICAgICA9IE1ha2VmaWxlCiulTW9uZG9CdWlsZKUgICAgPSB7TUFLRUZJTEV9ICAjIE1ha2UgYmxhbmsgdG8gYXZvaWQgcmVidWlsZHMgd2hlbiBtYWtlZmlsZSBpcyBtb2RpZmllZAorCitPYmpEaXIgICAgICAgICAgPSA6CitTcmNEaXIgICAgICAgICAgPSA6CitIZHJEaXIgICAgICAgICAgPSA6CisKK1Rvb2xEaXIgICAgICAgICA9IDo6ZXhhbXBsZXM6CisKK0luY2x1ZGVzICAgICAgICA9IC1pIHtIZHJEaXJ9CisKK1N5bS1QUEMgICAgICAgICA9IC1zeW0gb2ZmCisKK0RlZmluZXMgICAgICAgICA9IC1kIE1BQ09TX0NMQVNTSUMKKworUFBDQ09wdGlvbnMgICAgID0ge0luY2x1ZGVzfSB7U3ltLVBQQ30gLXcgMzUge0RlZmluZXN9CisKK0ZyYWdOYW1lICAgICAgICA9IGxpYmV4cGF0CisKKworIyMjIFNvdXJjZSBGaWxlcyAjIyMKKworU3JjRmlsZXMgICAgICAgID0gILYKKwkJCQkgICJ7U3JjRGlyfXhtbHBhcnNlLmMiILYKKwkJCQkgICJ7U3JjRGlyfXhtbHJvbGUuYyIgtgorCQkJCSAgIntTcmNEaXJ9eG1sdG9rLmMiCisKK1Rvb2xTcmNGaWxlcyAgICA9ICC2CisJCQkJICAie1Rvb2xEaXJ9ZWxlbWVudHMuYyIgtgorCQkJCSAgIntUb29sRGlyfW91dGxpbmUuYyIKKworCisjIyMgT2JqZWN0IEZpbGVzICMjIworCitPYmpGaWxlcy1QUEMgICAgPSAgtgorCQkJCSAgIntPYmpEaXJ9eG1scGFyc2UuYy5vIiC2CisJCQkJICAie09iakRpcn14bWxyb2xlLmMubyIgtgorCQkJCSAgIntPYmpEaXJ9eG1sdG9rLmMubyIKKworRWxlbWVudFRvb2xPYmpGaWxlICAgPSAgIntPYmpEaXJ9ZWxlbWVudHMuYy5vIgorCitPdXRsaW5lVG9vbE9iakZpbGUgICA9ICAie09iakRpcn1vdXRsaW5lLmMubyIKKworCisjIyMgTGlicmFyaWVzICMjIworCitTdExpYkZpbGVzLVBQQyAgICA9ICC2CisJCQkJICAie1BQQ0xpYnJhcmllc31TdGRDUnVudGltZS5vIiC2CisJCQkJICAie1BQQ0xpYnJhcmllc31QUENDUnVudGltZS5vIiC2CisJCQkJICAie1BQQ0xpYnJhcmllc31QUENUb29sTGlicy5vIgorCitTaExpYkZpbGVzLVBQQyAgICA9ICC2CisJCQkJICAie1NoYXJlZExpYnJhcmllc31JbnRlcmZhY2VMaWIiILYKKwkJCQkgICJ7U2hhcmVkTGlicmFyaWVzfVN0ZENMaWIiILYKKwkJCQkgICJ7U2hhcmVkTGlicmFyaWVzfU1hdGhMaWIiCisKK0xpYkZpbGVzLVBQQyAgICA9ICC2CisJCQkJICB7U3RMaWJGaWxlcy1QUEN9ILYKKwkJCQkgIHtTaExpYkZpbGVzLVBQQ30KKworCisjIyMgU3BlY2lhbCBGaWxlcyAjIyMKKworRXhwb3J0RmlsZSAgICAgID0gIntPYmpEaXJ9e0ZyYWdOYW1lfS5leHAiCisKK1N0TGliRmlsZSAgICAgICA9ICJ7T2JqRGlyfXtGcmFnTmFtZX0uTXJDLm8iCisKK1NoTGliRmlsZSAgICAgICA9ICJ7T2JqRGlyfXtGcmFnTmFtZX0iCisKK1N0dWJGaWxlICAgICAgICA9ICJ7T2JqRGlyfXtGcmFnTmFtZX0uc3R1YiIKKworRWxlbWVudHNUb29sICAgID0gIntUb29sRGlyfWVsZW1lbnRzIgorCitPdXRsaW5lVG9vbCAgICAgPSAie1Rvb2xEaXJ9b3V0bGluZSIKKworCisjIyMgRGVmYXVsdCBSdWxlcyAjIyMKKworLmMubyAgxCAgLmMgIHulTW9uZG9CdWlsZKV9CisJe1BQQ0N9IHtkZXBEaXJ9e2RlZmF1bHR9LmMgLW8ge3RhcmdEaXJ9e2RlZmF1bHR9LmMubyB7UFBDQ09wdGlvbnN9CisKKworIyMjIEJ1aWxkIFJ1bGVzICMjIworCitBbGwgIMQgIER5bmFtaWMge0VsZW1lbnRzVG9vbH0ge091dGxpbmVUb29sfQorCitTdGF0aWMgIMQgIHtTdExpYkZpbGV9CisKK0R5bmFtaWMgIMQgIFN0YXRpYyB7U2hMaWJGaWxlfSB7U3R1YkZpbGV9CisKK3tTdExpYkZpbGV9ICDExCAge09iakZpbGVzLVBQQ30ge1N0TGliRmlsZXMtUFBDfSB7pU1vbmRvQnVpbGSlfQorCVBQQ0xpbmsgtgorCQktbyB7VGFyZ30gtgorCQl7T2JqRmlsZXMtUFBDfSC2CisJCXtTdExpYkZpbGVzLVBQQ30gtgorCQl7U3ltLVBQQ30gtgorCQktbWYgLWQgtgorCQktdCAnWENPRicgtgorCQktYyAnTVBTICcgtgorCQkteG0gbAorCit7U2hMaWJGaWxlfSAgxMQgIHtTdExpYkZpbGV9IHtTaExpYkZpbGVzLVBQQ30ge0V4cG9ydEZpbGV9IHulTW9uZG9CdWlsZKV9CisJUFBDTGluayC2CisJCS1vIHtUYXJnfSC2CisJCXtTdExpYkZpbGV9ILYKKwkJe1NoTGliRmlsZXMtUFBDfSC2CisJCXtTeW0tUFBDfSC2CisJCS1AZXhwb3J0IHtFeHBvcnRGaWxlfSC2CisJCS1mcmFnbmFtZSB7RnJhZ05hbWV9ILYKKwkJLW1mIC1kILYKKwkJLXQgJ3NobGInILYKKwkJLWMgJz8/Pz8nILYKKwkJLXhtIHMKKwore1N0dWJGaWxlfSAgxMQgIHtTaExpYkZpbGV9IHulTW9uZG9CdWlsZKV9CisJc2hsYjJzdHViIC1vIHtUYXJnfSB7U2hMaWJGaWxlfQorCit7RWxlbWVudHNUb29sfSAgxMQgIHtFbGVtZW50VG9vbE9iakZpbGV9IHtTdHViRmlsZX0ge0xpYkZpbGVzLVBQQ30ge6VNb25kb0J1aWxkpX0KKwlQUENMaW5rILYKKwkJLW8ge1Rhcmd9ILYKKwkJe0VsZW1lbnRUb29sT2JqRmlsZX0gtgorCQl7U3RMaWJGaWxlfSC2CisJCXtMaWJGaWxlcy1QUEN9ILYKKwkJe1N5bS1QUEN9ILYKKwkJLW1mIC1kILYKKwkJLXQgJ01QU1QnILYKKwkJLWMgJ01QUyAnCisKK3tPdXRsaW5lVG9vbH0gIMTEICB7T3V0bGluZVRvb2xPYmpGaWxlfSB7U3R1YkZpbGV9IHtMaWJGaWxlcy1QUEN9IHulTW9uZG9CdWlsZKV9CisJUFBDTGluayC2CisJCS1vIHtUYXJnfSC2CisJCXtPdXRsaW5lVG9vbE9iakZpbGV9ILYKKwkJe1N0TGliRmlsZX0gtgorCQl7TGliRmlsZXMtUFBDfSC2CisJCXtTeW0tUFBDfSC2CisJCS1tZiAtZCC2CisJCS10ICdNUFNUJyC2CisJCS1jICdNUFMgJworCisKKyMjIyBTcGVjaWFsIFJ1bGVzICMjIworCit7RXhwb3J0RmlsZX0gIMTEICAie0hkckRpcn1leHBhdC5oIiB7pU1vbmRvQnVpbGSlfQorCVN0cmVhbUVkaXQgLWQgtgorCQktZSAiL6UoJ1hNTFBBUlNFQVBJKCfFJykgJynHMCwxyCdYTUxfJyhbQS1aYS16MC05X10rKagxJygnLyBQcmludCAnWE1MXycgqDEiILYKKwkJIntIZHJEaXJ9ZXhwYXQuaCIgPiB7VGFyZ30KKworCisjIyMgUmVxdWlyZWQgRGVwZW5kZW5jaWVzICMjIworCisie09iakRpcn14bWxwYXJzZS5jLm8iICDEICAie1NyY0Rpcn14bWxwYXJzZS5jIgorIntPYmpEaXJ9eG1scm9sZS5jLm8iICDEICAie1NyY0Rpcn14bWxyb2xlLmMiCisie09iakRpcn14bWx0b2suYy5vIiAgxCAgIntTcmNEaXJ9eG1sdG9rLmMiCisKKyJ7T2JqRGlyfWVsZW1lbnRzLmMubyIgIMQgIntUb29sRGlyfWVsZW1lbnRzLmMiCisie09iakRpcn1vdXRsaW5lLmMubyIgIMQgIntUb29sRGlyfW91dGxpbmUuYyIKKworCisjIyMgT3B0aW9uYWwgRGVwZW5kZW5jaWVzICMjIworIyMjIEJ1aWxkIHRoaXMgdGFyZ2V0IHRvIGNsZWFuIG91dCBnZW5lcmF0ZWQgaW50ZXJtZWRpYXRlIGZpbGVzLiAjIyMKKworQ2xlYW4gIMQKKwlEZWxldGUge09iakZpbGVzLVBQQ30ge0V4cG9ydEZpbGV9IHtFbGVtZW50VG9vbE9iakZpbGV9IHtPdXRsaW5lVG9vbE9iakZpbGV9CisKKyMjIyBCdWlsZCB0aGlzIHRhcmdldCB0byBjbGVhbiBvdXQgYWxsIGdlbmVyYXRlZCBmaWxlcy4gIyMjCisKK0NsZWFuLUFsbCAgxCAgQ2xlYW4KKwlEZWxldGUge1N0TGliRmlsZX0ge1NoTGliRmlsZX0ge1N0dWJGaWxlfSB7RWxlbWVudHNUb29sfSB7T3V0bGluZVRvb2x9CisKKyMjIyBCdWlsZCB0aGlzIHRhcmdldCB0byBnZW5lcmF0ZSAiaW5jbHVkZSBmaWxlIiBkZXBlbmRlbmNpZXMuICMjIworCitEZXBlbmRlbmNpZXMgIMQgICRPdXRPZkRhdGUKKwlNYWtlRGVwZW5kILYKKwkJLWFwcGVuZCB7TUFLRUZJTEV9ILYKKwkJLWlnbm9yZSAie0NJbmNsdWRlc30iILYKKwkJLW9iamRpciAie09iakRpcn0iILYKKwkJLW9iamV4dCAubyC2CisJCXtEZWZpbmVzfSC2CisJCXtJbmNsdWRlc30gtgorCQl7U3JjRmlsZXN9CisKKwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2FtaWdhY29uZmlnLmggYi9leHBhdC0yLjAuMS9saWIvYW1pZ2Fjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NmM2MTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2FtaWdhY29uZmlnLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBBTUlHQUNPTkZJR19ICisjZGVmaW5lIEFNSUdBQ09ORklHX0gKKworLyogMTIzNCA9IExJTF9FTkRJQU4sIDQzMjEgPSBCSUdFTkRJQU4gKi8KKyNkZWZpbmUgQllURU9SREVSIDQzMjEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiY29weScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQkNPUFkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNoZWNrLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ0hFQ0tfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01FTU1PVkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIHdoZXRoZXIgYnl0ZW9yZGVyIGlzIGJpZ2VuZGlhbiAqLworI2RlZmluZSBXT1JEU19CSUdFTkRJQU4KKworLyogRGVmaW5lIHRvIHNwZWNpZnkgaG93IG11Y2ggY29udGV4dCB0byByZXRhaW4gYXJvdW5kIHRoZSBjdXJyZW50IHBhcnNlCisgICBwb2ludC4gKi8KKyNkZWZpbmUgWE1MX0NPTlRFWFRfQllURVMgMTAyNAorCisvKiBEZWZpbmUgdG8gbWFrZSBwYXJhbWV0ZXIgZW50aXR5IHBhcnNpbmcgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUuICovCisjZGVmaW5lIFhNTF9EVEQKKworLyogRGVmaW5lIHRvIG1ha2UgWE1MIE5hbWVzcGFjZXMgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUuICovCisjZGVmaW5lIFhNTF9OUworCisjZW5kaWYgIC8qIEFNSUdBQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9hc2NpaS5oIGIvZXhwYXQtMi4wLjEvbGliL2FzY2lpLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDEwNTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi9hc2NpaS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjZGVmaW5lIEFTQ0lJX0EgMHg0MQorI2RlZmluZSBBU0NJSV9CIDB4NDIKKyNkZWZpbmUgQVNDSUlfQyAweDQzCisjZGVmaW5lIEFTQ0lJX0QgMHg0NAorI2RlZmluZSBBU0NJSV9FIDB4NDUKKyNkZWZpbmUgQVNDSUlfRiAweDQ2CisjZGVmaW5lIEFTQ0lJX0cgMHg0NworI2RlZmluZSBBU0NJSV9IIDB4NDgKKyNkZWZpbmUgQVNDSUlfSSAweDQ5CisjZGVmaW5lIEFTQ0lJX0ogMHg0QQorI2RlZmluZSBBU0NJSV9LIDB4NEIKKyNkZWZpbmUgQVNDSUlfTCAweDRDCisjZGVmaW5lIEFTQ0lJX00gMHg0RAorI2RlZmluZSBBU0NJSV9OIDB4NEUKKyNkZWZpbmUgQVNDSUlfTyAweDRGCisjZGVmaW5lIEFTQ0lJX1AgMHg1MAorI2RlZmluZSBBU0NJSV9RIDB4NTEKKyNkZWZpbmUgQVNDSUlfUiAweDUyCisjZGVmaW5lIEFTQ0lJX1MgMHg1MworI2RlZmluZSBBU0NJSV9UIDB4NTQKKyNkZWZpbmUgQVNDSUlfVSAweDU1CisjZGVmaW5lIEFTQ0lJX1YgMHg1NgorI2RlZmluZSBBU0NJSV9XIDB4NTcKKyNkZWZpbmUgQVNDSUlfWCAweDU4CisjZGVmaW5lIEFTQ0lJX1kgMHg1OQorI2RlZmluZSBBU0NJSV9aIDB4NUEKKworI2RlZmluZSBBU0NJSV9hIDB4NjEKKyNkZWZpbmUgQVNDSUlfYiAweDYyCisjZGVmaW5lIEFTQ0lJX2MgMHg2MworI2RlZmluZSBBU0NJSV9kIDB4NjQKKyNkZWZpbmUgQVNDSUlfZSAweDY1CisjZGVmaW5lIEFTQ0lJX2YgMHg2NgorI2RlZmluZSBBU0NJSV9nIDB4NjcKKyNkZWZpbmUgQVNDSUlfaCAweDY4CisjZGVmaW5lIEFTQ0lJX2kgMHg2OQorI2RlZmluZSBBU0NJSV9qIDB4NkEKKyNkZWZpbmUgQVNDSUlfayAweDZCCisjZGVmaW5lIEFTQ0lJX2wgMHg2QworI2RlZmluZSBBU0NJSV9tIDB4NkQKKyNkZWZpbmUgQVNDSUlfbiAweDZFCisjZGVmaW5lIEFTQ0lJX28gMHg2RgorI2RlZmluZSBBU0NJSV9wIDB4NzAKKyNkZWZpbmUgQVNDSUlfcSAweDcxCisjZGVmaW5lIEFTQ0lJX3IgMHg3MgorI2RlZmluZSBBU0NJSV9zIDB4NzMKKyNkZWZpbmUgQVNDSUlfdCAweDc0CisjZGVmaW5lIEFTQ0lJX3UgMHg3NQorI2RlZmluZSBBU0NJSV92IDB4NzYKKyNkZWZpbmUgQVNDSUlfdyAweDc3CisjZGVmaW5lIEFTQ0lJX3ggMHg3OAorI2RlZmluZSBBU0NJSV95IDB4NzkKKyNkZWZpbmUgQVNDSUlfeiAweDdBCisKKyNkZWZpbmUgQVNDSUlfMCAweDMwCisjZGVmaW5lIEFTQ0lJXzEgMHgzMQorI2RlZmluZSBBU0NJSV8yIDB4MzIKKyNkZWZpbmUgQVNDSUlfMyAweDMzCisjZGVmaW5lIEFTQ0lJXzQgMHgzNAorI2RlZmluZSBBU0NJSV81IDB4MzUKKyNkZWZpbmUgQVNDSUlfNiAweDM2CisjZGVmaW5lIEFTQ0lJXzcgMHgzNworI2RlZmluZSBBU0NJSV84IDB4MzgKKyNkZWZpbmUgQVNDSUlfOSAweDM5CisKKyNkZWZpbmUgQVNDSUlfVEFCIDB4MDkKKyNkZWZpbmUgQVNDSUlfU1BBQ0UgMHgyMAorI2RlZmluZSBBU0NJSV9FWENMIDB4MjEKKyNkZWZpbmUgQVNDSUlfUVVPVCAweDIyCisjZGVmaW5lIEFTQ0lJX0FNUCAweDI2CisjZGVmaW5lIEFTQ0lJX0FQT1MgMHgyNworI2RlZmluZSBBU0NJSV9NSU5VUyAweDJECisjZGVmaW5lIEFTQ0lJX1BFUklPRCAweDJFCisjZGVmaW5lIEFTQ0lJX0NPTE9OIDB4M0EKKyNkZWZpbmUgQVNDSUlfU0VNSSAweDNCCisjZGVmaW5lIEFTQ0lJX0xUIDB4M0MKKyNkZWZpbmUgQVNDSUlfRVFVQUxTIDB4M0QKKyNkZWZpbmUgQVNDSUlfR1QgMHgzRQorI2RlZmluZSBBU0NJSV9MU1FCIDB4NUIKKyNkZWZpbmUgQVNDSUlfUlNRQiAweDVECisjZGVmaW5lIEFTQ0lJX1VOREVSU0NPUkUgMHg1RgorI2RlZmluZSBBU0NJSV9MUEFSRU4gMHgyOAorI2RlZmluZSBBU0NJSV9SUEFSRU4gMHgyOQorI2RlZmluZSBBU0NJSV9GRiAweDBDCisjZGVmaW5lIEFTQ0lJX1NMQVNIIDB4MkYKKyNkZWZpbmUgQVNDSUlfSEFTSCAweDIzCisjZGVmaW5lIEFTQ0lJX1BJUEUgMHg3QworI2RlZmluZSBBU0NJSV9DT01NQSAweDJDCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvYXNjaWl0YWIuaCBiL2V4cGF0LTIuMC4xL2xpYi9hc2NpaXRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5YTE1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvYXNjaWl0YWIuaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworLyogMHgwMCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDA0ICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MDggKi8gQlRfTk9OWE1MLCBCVF9TLCBCVF9MRiwgQlRfTk9OWE1MLAorLyogMHgwQyAqLyBCVF9OT05YTUwsIEJUX0NSLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MTAgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgxNCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDE4ICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MUMgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgyMCAqLyBCVF9TLCBCVF9FWENMLCBCVF9RVU9ULCBCVF9OVU0sCisvKiAweDI0ICovIEJUX09USEVSLCBCVF9QRVJDTlQsIEJUX0FNUCwgQlRfQVBPUywKKy8qIDB4MjggKi8gQlRfTFBBUiwgQlRfUlBBUiwgQlRfQVNULCBCVF9QTFVTLAorLyogMHgyQyAqLyBCVF9DT01NQSwgQlRfTUlOVVMsIEJUX05BTUUsIEJUX1NPTCwKKy8qIDB4MzAgKi8gQlRfRElHSVQsIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsCisvKiAweDM0ICovIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULAorLyogMHgzOCAqLyBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0NPTE9OLCBCVF9TRU1JLAorLyogMHgzQyAqLyBCVF9MVCwgQlRfRVFVQUxTLCBCVF9HVCwgQlRfUVVFU1QsCisvKiAweDQwICovIEJUX09USEVSLCBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLAorLyogMHg0NCAqLyBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLCBCVF9OTVNUUlQsCisvKiAweDQ4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NEMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg1MCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDU0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NTggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTFNRQiwKKy8qIDB4NUMgKi8gQlRfT1RIRVIsIEJUX1JTUUIsIEJUX09USEVSLCBCVF9OTVNUUlQsCisvKiAweDYwICovIEJUX09USEVSLCBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLAorLyogMHg2NCAqLyBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLCBCVF9OTVNUUlQsCisvKiAweDY4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NkMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg3MCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDc0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NzggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfT1RIRVIsCisvKiAweDdDICovIEJUX1ZFUkJBUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9leHBhdC5kc3AgYi9leHBhdC0yLjAuMS9saWIvZXhwYXQuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzMDMyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvZXhwYXQuZHNwCkBAIC0wLDAgKzEsMTg1IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImV4cGF0IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyDQorDQorQ0ZHPWV4cGF0IC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImV4cGF0Lm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJleHBhdC5tYWsiIENGRz0iZXhwYXQgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiZXhwYXQgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikNCishTUVTU0FHRSAiZXhwYXQgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorTVRMPW1pZGwuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJFWFBBVF9FWFBPUlRTIiAvWXUic3RkYWZ4LmgiIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkNPTVBJTEVEX0ZST01fRFNQIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvcGRiOm5vbmUgL21hY2hpbmU6STM4NiAvb3V0OiIuLlx3aW4zMlxiaW5cUmVsZWFzZS9saWJleHBhdC5kbGwiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0IC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXERlYnVnIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkVYUEFUX0VYUE9SVFMiIC9ZdSJzdGRhZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HWCAvWkkgL09kIC9EICJfREVCVUciIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9GUiAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9wZGI6bm9uZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiIuLlx3aW4zMlxiaW5cRGVidWcvbGliZXhwYXQuZGxsIg0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiZXhwYXQgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiZXhwYXQgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0Ig0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxsaWJleHBhdC5kZWYNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWxwYXJzZS5jDQorDQorIUlGICAiJChDRkcpIiA9PSAiZXhwYXQgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJleHBhdCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgQUREIENQUCAvR1gtIC9PZA0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWxyb2xlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2suYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHRva19pbXBsLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2tfbnMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxhc2NpaS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYXNjaWl0YWIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGV4cGF0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxleHBhdF9leHRlcm5hbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caWFzY2lpdGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbnRlcm5hbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGF0aW4xdGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxuYW1ldGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx1dGY4dGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWxyb2xlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2suaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHRva19pbXBsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2V4cGF0LmggYi9leHBhdC0yLjAuMS9saWIvZXhwYXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGE4Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0LmgKQEAgLTAsMCArMSwxMDE0IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2lmbmRlZiBFeHBhdF9JTkNMVURFRAorI2RlZmluZSBFeHBhdF9JTkNMVURFRCAxCisKKyNpZmRlZiBfX1ZNUworLyogICAgICAwICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAwICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMKKyAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMSAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMSAqLworI2RlZmluZSBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBYTUxfU2V0UHJvY2Vzc2luZ0luc3RySGFuZGxlcgorI2RlZmluZSBYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciAgICBYTUxfU2V0VW5wYXJzZWRFbnREZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciAgICBYTUxfU2V0U3RhcnROYW1lc3BjRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyAgWE1MX1NldEV4dGVybmFsRW50UmVmSGFuZGxlckFyZworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJleHBhdF9leHRlcm5hbC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBYTUxfUGFyc2VyU3RydWN0OwordHlwZWRlZiBzdHJ1Y3QgWE1MX1BhcnNlclN0cnVjdCAqWE1MX1BhcnNlcjsKKworLyogU2hvdWxkIHRoaXMgYmUgZGVmaW5lZCB1c2luZyBzdGRib29sLmggd2hlbiBDOTkgaXMgYXZhaWxhYmxlPyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFhNTF9Cb29sOworI2RlZmluZSBYTUxfVFJVRSAgICgoWE1MX0Jvb2wpIDEpCisjZGVmaW5lIFhNTF9GQUxTRSAgKChYTUxfQm9vbCkgMCkKKworLyogVGhlIFhNTF9TdGF0dXMgZW51bSBnaXZlcyB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmb3Igc2V2ZXJhbAorICAgQVBJIGZ1bmN0aW9ucy4gIFRoZSBwcmVwcm9jZXNzb3IgI2RlZmluZXMgYXJlIGluY2x1ZGVkIHNvIHRoaXMKKyAgIHN0YW56YSBjYW4gYmUgYWRkZWQgdG8gY29kZSB0aGF0IHN0aWxsIG5lZWRzIHRvIHN1cHBvcnQgb2xkZXIKKyAgIHZlcnNpb25zIG9mIEV4cGF0IDEuOTUueDoKKworICAgI2lmbmRlZiBYTUxfU1RBVFVTX09LCisgICAjZGVmaW5lIFhNTF9TVEFUVVNfT0sgICAgMQorICAgI2RlZmluZSBYTUxfU1RBVFVTX0VSUk9SIDAKKyAgICNlbmRpZgorCisgICBPdGhlcndpc2UsIHRoZSAjZGVmaW5lIGhhY2tlcnkgaXMgcXVpdGUgdWdseSBhbmQgd291bGQgaGF2ZSBiZWVuCisgICBkcm9wcGVkLgorKi8KK2VudW0gWE1MX1N0YXR1cyB7CisgIFhNTF9TVEFUVVNfRVJST1IgPSAwLAorI2RlZmluZSBYTUxfU1RBVFVTX0VSUk9SIFhNTF9TVEFUVVNfRVJST1IKKyAgWE1MX1NUQVRVU19PSyA9IDEsCisjZGVmaW5lIFhNTF9TVEFUVVNfT0sgWE1MX1NUQVRVU19PSworICBYTUxfU1RBVFVTX1NVU1BFTkRFRCA9IDIKKyNkZWZpbmUgWE1MX1NUQVRVU19TVVNQRU5ERUQgWE1MX1NUQVRVU19TVVNQRU5ERUQKK307CisKK2VudW0gWE1MX0Vycm9yIHsKKyAgWE1MX0VSUk9SX05PTkUsCisgIFhNTF9FUlJPUl9OT19NRU1PUlksCisgIFhNTF9FUlJPUl9TWU5UQVgsCisgIFhNTF9FUlJPUl9OT19FTEVNRU5UUywKKyAgWE1MX0VSUk9SX0lOVkFMSURfVE9LRU4sCisgIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTiwKKyAgWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUiwKKyAgWE1MX0VSUk9SX1RBR19NSVNNQVRDSCwKKyAgWE1MX0VSUk9SX0RVUExJQ0FURV9BVFRSSUJVVEUsCisgIFhNTF9FUlJPUl9KVU5LX0FGVEVSX0RPQ19FTEVNRU5ULAorICBYTUxfRVJST1JfUEFSQU1fRU5USVRZX1JFRiwKKyAgWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFksCisgIFhNTF9FUlJPUl9SRUNVUlNJVkVfRU5USVRZX1JFRiwKKyAgWE1MX0VSUk9SX0FTWU5DX0VOVElUWSwKKyAgWE1MX0VSUk9SX0JBRF9DSEFSX1JFRiwKKyAgWE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGLAorICBYTUxfRVJST1JfQVRUUklCVVRFX0VYVEVSTkFMX0VOVElUWV9SRUYsCisgIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJLAorICBYTUxfRVJST1JfVU5LTk9XTl9FTkNPRElORywKKyAgWE1MX0VSUk9SX0lOQ09SUkVDVF9FTkNPRElORywKKyAgWE1MX0VSUk9SX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT04sCisgIFhNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkcsCisgIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORSwKKyAgWE1MX0VSUk9SX1VORVhQRUNURURfU1RBVEUsCisgIFhNTF9FUlJPUl9FTlRJVFlfREVDTEFSRURfSU5fUEUsCisgIFhNTF9FUlJPUl9GRUFUVVJFX1JFUVVJUkVTX1hNTF9EVEQsCisgIFhNTF9FUlJPUl9DQU5UX0NIQU5HRV9GRUFUVVJFX09OQ0VfUEFSU0lORywKKyAgLyogQWRkZWQgaW4gMS45NS43LiAqLworICBYTUxfRVJST1JfVU5CT1VORF9QUkVGSVgsCisgIC8qIEFkZGVkIGluIDEuOTUuOC4gKi8KKyAgWE1MX0VSUk9SX1VOREVDTEFSSU5HX1BSRUZJWCwKKyAgWE1MX0VSUk9SX0lOQ09NUExFVEVfUEUsCisgIFhNTF9FUlJPUl9YTUxfREVDTCwKKyAgWE1MX0VSUk9SX1RFWFRfREVDTCwKKyAgWE1MX0VSUk9SX1BVQkxJQ0lELAorICBYTUxfRVJST1JfU1VTUEVOREVELAorICBYTUxfRVJST1JfTk9UX1NVU1BFTkRFRCwKKyAgWE1MX0VSUk9SX0FCT1JURUQsCisgIFhNTF9FUlJPUl9GSU5JU0hFRCwKKyAgWE1MX0VSUk9SX1NVU1BFTkRfUEUsCisgIC8qIEFkZGVkIGluIDIuMC4gKi8KKyAgWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUwsCisgIFhNTF9FUlJPUl9SRVNFUlZFRF9QUkVGSVhfWE1MTlMsCisgIFhNTF9FUlJPUl9SRVNFUlZFRF9OQU1FU1BBQ0VfVVJJCit9OworCitlbnVtIFhNTF9Db250ZW50X1R5cGUgeworICBYTUxfQ1RZUEVfRU1QVFkgPSAxLAorICBYTUxfQ1RZUEVfQU5ZLAorICBYTUxfQ1RZUEVfTUlYRUQsCisgIFhNTF9DVFlQRV9OQU1FLAorICBYTUxfQ1RZUEVfQ0hPSUNFLAorICBYTUxfQ1RZUEVfU0VRCit9OworCitlbnVtIFhNTF9Db250ZW50X1F1YW50IHsKKyAgWE1MX0NRVUFOVF9OT05FLAorICBYTUxfQ1FVQU5UX09QVCwKKyAgWE1MX0NRVUFOVF9SRVAsCisgIFhNTF9DUVVBTlRfUExVUworfTsKKworLyogSWYgdHlwZSA9PSBYTUxfQ1RZUEVfRU1QVFkgb3IgWE1MX0NUWVBFX0FOWSwgdGhlbiBxdWFudCB3aWxsIGJlCisgICBYTUxfQ1FVQU5UX05PTkUsIGFuZCB0aGUgb3RoZXIgZmllbGRzIHdpbGwgYmUgemVybyBvciBOVUxMLgorICAgSWYgdHlwZSA9PSBYTUxfQ1RZUEVfTUlYRUQsIHRoZW4gcXVhbnQgd2lsbCBiZSBOT05FIG9yIFJFUCBhbmQKKyAgIG51bWNoaWxkcmVuIHdpbGwgY29udGFpbiBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBtYXkgYmUgbWl4ZWQgaW4KKyAgIGFuZCBjaGlsZHJlbiBwb2ludCB0byBhbiBhcnJheSBvZiBYTUxfQ29udGVudCBjZWxscyB0aGF0IHdpbGwgYmUKKyAgIGFsbCBvZiBYTUxfQ1RZUEVfTkFNRSB0eXBlIHdpdGggbm8gcXVhbnRpZmljYXRpb24uCisKKyAgIElmIHR5cGUgPT0gWE1MX0NUWVBFX05BTUUsIHRoZW4gdGhlIG5hbWUgcG9pbnRzIHRvIHRoZSBuYW1lLCBhbmQKKyAgIHRoZSBudW1jaGlsZHJlbiBmaWVsZCB3aWxsIGJlIHplcm8gYW5kIGNoaWxkcmVuIHdpbGwgYmUgTlVMTC4gVGhlCisgICBxdWFudCBmaWVsZHMgaW5kaWNhdGVzIGFueSBxdWFudGlmaWVycyBwbGFjZWQgb24gdGhlIG5hbWUuCisKKyAgIENIT0lDRSBhbmQgU0VRIHdpbGwgaGF2ZSBuYW1lIE5VTEwsIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4KKyAgIG51bWNoaWxkcmVuIGFuZCBjaGlsZHJlbiB3aWxsIHBvaW50LCByZWN1cnNpdmVseSwgdG8gYW4gYXJyYXkKKyAgIG9mIFhNTF9Db250ZW50IGNlbGxzLgorCisgICBUaGUgRU1QVFksIEFOWSwgYW5kIE1JWEVEIHR5cGVzIHdpbGwgb25seSBvY2N1ciBhdCB0b3AgbGV2ZWwuCisqLworCit0eXBlZGVmIHN0cnVjdCBYTUxfY3AgWE1MX0NvbnRlbnQ7CisKK3N0cnVjdCBYTUxfY3AgeworICBlbnVtIFhNTF9Db250ZW50X1R5cGUgICAgICAgICB0eXBlOworICBlbnVtIFhNTF9Db250ZW50X1F1YW50ICAgICAgICBxdWFudDsKKyAgWE1MX0NoYXIgKiAgICAgICAgICAgICAgICAgICAgbmFtZTsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgbnVtY2hpbGRyZW47CisgIFhNTF9Db250ZW50ICogICAgICAgICAgICAgICAgIGNoaWxkcmVuOworfTsKKworCisvKiBUaGlzIGlzIGNhbGxlZCBmb3IgYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4gU2VlIGFib3ZlIGZvcgorICAgZGVzY3JpcHRpb24gb2YgdGhlIG1vZGVsIGFyZ3VtZW50LiBJdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eQorICAgdG8gZnJlZSBtb2RlbCB3aGVuIGZpbmlzaGVkIHdpdGggaXQuCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfRWxlbWVudERlY2xIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Db250ZW50ICptb2RlbCk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRWxlbWVudERlY2xIYW5kbGVyIGVsZGVjbCk7CisKKy8qIFRoZSBBdHRsaXN0IGRlY2xhcmF0aW9uIGhhbmRsZXIgaXMgY2FsbGVkIGZvciAqZWFjaCogYXR0cmlidXRlLiBTbworICAgYSBzaW5nbGUgQXR0bGlzdCBkZWNsYXJhdGlvbiB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgZGVjbGFyZWQgd2lsbAorICAgZ2VuZXJhdGUgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBoYW5kbGVyLiBUaGUgImRlZmF1bHQiIHBhcmFtZXRlcgorICAgbWF5IGJlIE5VTEwgaW4gdGhlIGNhc2Ugb2YgdGhlICIjSU1QTElFRCIgb3IgIiNSRVFVSVJFRCIKKyAgIGtleXdvcmQuIFRoZSAiaXNyZXF1aXJlZCIgcGFyYW1ldGVyIHdpbGwgYmUgdHJ1ZSBhbmQgdGhlIGRlZmF1bHQKKyAgIHZhbHVlIHdpbGwgYmUgTlVMTCBpbiB0aGUgY2FzZSBvZiAiI1JFUVVJUkVEIi4gSWYgImlzcmVxdWlyZWQiIGlzCisgICB0cnVlIGFuZCBkZWZhdWx0IGlzIG5vbi1OVUxMLCB0aGVuIHRoaXMgaXMgYSAiI0ZJWEVEIiBkZWZhdWx0LgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX0F0dGxpc3REZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICAqZWxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICphdHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgICphdHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICAqZGZsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgaXNyZXF1aXJlZCk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIGF0dGRlY2wpOworCisvKiBUaGUgWE1MIGRlY2xhcmF0aW9uIGhhbmRsZXIgaXMgY2FsbGVkIGZvciAqYm90aCogWE1MIGRlY2xhcmF0aW9ucworICAgYW5kIHRleHQgZGVjbGFyYXRpb25zLiBUaGUgd2F5IHRvIGRpc3Rpbmd1aXNoIGlzIHRoYXQgdGhlIHZlcnNpb24KKyAgIHBhcmFtZXRlciB3aWxsIGJlIE5VTEwgZm9yIHRleHQgZGVjbGFyYXRpb25zLiBUaGUgZW5jb2RpbmcKKyAgIHBhcmFtZXRlciBtYXkgYmUgTlVMTCBmb3IgWE1MIGRlY2xhcmF0aW9ucy4gVGhlIHN0YW5kYWxvbmUKKyAgIHBhcmFtZXRlciB3aWxsIGJlIC0xLCAwLCBvciAxIGluZGljYXRpbmcgcmVzcGVjdGl2ZWx5IHRoYXQgdGhlcmUKKyAgIHdhcyBubyBzdGFuZGFsb25lIHBhcmFtZXRlciBpbiB0aGUgZGVjbGFyYXRpb24sIHRoYXQgaXQgd2FzIGdpdmVuCisgICBhcyBubywgb3IgdGhhdCBpdCB3YXMgZ2l2ZW4gYXMgeWVzLgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX1htbERlY2xIYW5kbGVyKSAodm9pZCAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc3RhbmRhbG9uZSk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0WG1sRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1htbERlY2xIYW5kbGVyIHhtbGRlY2wpOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAqKCptYWxsb2NfZmNuKShzaXplX3Qgc2l6ZSk7CisgIHZvaWQgKigqcmVhbGxvY19mY24pKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworICB2b2lkICgqZnJlZV9mY24pKHZvaWQgKnB0cik7Cit9IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGU7CisKKy8qIENvbnN0cnVjdHMgYSBuZXcgcGFyc2VyOyBlbmNvZGluZyBpcyB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHRoZQorICAgZXh0ZXJuYWwgcHJvdG9jb2wgb3IgTlVMTCBpZiB0aGVyZSBpcyBub25lIHNwZWNpZmllZC4KKyovCitYTUxQQVJTRUFQSShYTUxfUGFyc2VyKQorWE1MX1BhcnNlckNyZWF0ZShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworCisvKiBDb25zdHJ1Y3RzIGEgbmV3IHBhcnNlciBhbmQgbmFtZXNwYWNlIHByb2Nlc3Nvci4gIEVsZW1lbnQgdHlwZQorICAgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGJlbG9uZyB0byBhIG5hbWVzcGFjZSB3aWxsIGJlCisgICBleHBhbmRlZDsgdW5wcmVmaXhlZCBhdHRyaWJ1dGUgbmFtZXMgYXJlIG5ldmVyIGV4cGFuZGVkOyB1bnByZWZpeGVkCisgICBlbGVtZW50IHR5cGUgbmFtZXMgYXJlIGV4cGFuZGVkIG9ubHkgaWYgdGhlcmUgaXMgYSBkZWZhdWx0CisgICBuYW1lc3BhY2UuIFRoZSBleHBhbmRlZCBuYW1lIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBuYW1lc3BhY2UKKyAgIFVSSSwgdGhlIG5hbWVzcGFjZSBzZXBhcmF0b3IgY2hhcmFjdGVyLCBhbmQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCisgICBuYW1lLiAgSWYgdGhlIG5hbWVzcGFjZSBzZXBhcmF0b3IgaXMgJ1wwJyB0aGVuIHRoZSBuYW1lc3BhY2UgVVJJCisgICBhbmQgdGhlIGxvY2FsIHBhcnQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgd2l0aG91dCBhbnkgc2VwYXJhdG9yLgorICAgSXQgaXMgYSBwcm9ncmFtbWluZyBlcnJvciB0byB1c2UgdGhlIHNlcGFyYXRvciAnXDAnIHdpdGggbmFtZXNwYWNlCisgICB0cmlwbGV0cyAoc2VlIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQpLgorKi8KK1hNTFBBUlNFQVBJKFhNTF9QYXJzZXIpCitYTUxfUGFyc2VyQ3JlYXRlTlMoY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nLCBYTUxfQ2hhciBuYW1lc3BhY2VTZXBhcmF0b3IpOworCisKKy8qIENvbnN0cnVjdHMgYSBuZXcgcGFyc2VyIHVzaW5nIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWl0ZSByZWZlcnJlZCB0bworICAgYnkgbWVtc3VpdGUuIElmIG1lbXN1aXRlIGlzIE5VTEwsIHRoZW4gdXNlIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG1lbW9yeQorICAgc3VpdGUuIElmIG5hbWVzcGFjZVNlcGFyYXRvciBpcyBub24tTlVMTCBpdCBjcmVhdGVzIGEgcGFyc2VyIHdpdGgKKyAgIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGFzIGRlc2NyaWJlZCBhYm92ZS4gVGhlIGNoYXJhY3RlciBwb2ludGVkIGF0CisgICB3aWxsIHNlcnZlIGFzIHRoZSBuYW1lc3BhY2Ugc2VwYXJhdG9yLgorCisgICBBbGwgZnVydGhlciBtZW1vcnkgb3BlcmF0aW9ucyB1c2VkIGZvciB0aGUgY3JlYXRlZCBwYXJzZXIgd2lsbCBjb21lIGZyb20KKyAgIHRoZSBnaXZlbiBzdWl0ZS4KKyovCitYTUxQQVJTRUFQSShYTUxfUGFyc2VyKQorWE1MX1BhcnNlckNyZWF0ZV9NTShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbXN1aXRlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZXNwYWNlU2VwYXJhdG9yKTsKKworLyogUHJlcGFyZSBhIHBhcnNlciBvYmplY3QgdG8gYmUgcmUtdXNlZC4gIFRoaXMgaXMgcGFydGljdWxhcmx5CisgICB2YWx1YWJsZSB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIG92ZXJoZWFkIGlzIGRpc3Byb3BvcnRpb25hdGx5IGhpZ2gsCisgICBzdWNoIGFzIHdoZW4gYSBsYXJnZSBudW1iZXIgb2Ygc21hbGwgZG9jdW1uZW50cyBuZWVkIHRvIGJlIHBhcnNlZC4KKyAgIEFsbCBoYW5kbGVycyBhcmUgY2xlYXJlZCBmcm9tIHRoZSBwYXJzZXIsIGV4Y2VwdCBmb3IgdGhlCisgICB1bmtub3duRW5jb2RpbmdIYW5kbGVyLiBUaGUgcGFyc2VyJ3MgZXh0ZXJuYWwgc3RhdGUgaXMgcmUtaW5pdGlhbGl6ZWQKKyAgIGV4Y2VwdCBmb3IgdGhlIHZhbHVlcyBvZiBucyBhbmQgbnNfdHJpcGxldHMuCisKKyAgIEFkZGVkIGluIEV4cGF0IDEuOTUuMy4KKyovCitYTUxQQVJTRUFQSShYTUxfQm9vbCkKK1hNTF9QYXJzZXJSZXNldChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKKworLyogYXR0cyBpcyBhcnJheSBvZiBuYW1lL3ZhbHVlIHBhaXJzLCB0ZXJtaW5hdGVkIGJ5IDA7CisgICBuYW1lcyBhbmQgdmFsdWVzIGFyZSAwIHRlcm1pbmF0ZWQuCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfU3RhcnRFbGVtZW50SGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICoqYXR0cyk7CisKK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX0VuZEVsZW1lbnRIYW5kbGVyKSAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lKTsKKworCisvKiBzIGlzIG5vdCAwIHRlcm1pbmF0ZWQuICovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisKKy8qIHRhcmdldCBhbmQgZGF0YSBhcmUgMCB0ZXJtaW5hdGVkICovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZGF0YSk7CisKKy8qIGRhdGEgaXMgMCB0ZXJtaW5hdGVkICovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9Db21tZW50SGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZGF0YSk7CisKK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhKTsKK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSk7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciBhbnkgY2hhcmFjdGVycyBpbiB0aGUgWE1MIGRvY3VtZW50IGZvciB3aGljaAorICAgdGhlcmUgaXMgbm8gYXBwbGljYWJsZSBoYW5kbGVyLiAgVGhpcyBpbmNsdWRlcyBib3RoIGNoYXJhY3RlcnMgdGhhdAorICAgYXJlIHBhcnQgb2YgbWFya3VwIHdoaWNoIGlzIG9mIGEga2luZCB0aGF0IGlzIG5vdCByZXBvcnRlZAorICAgKGNvbW1lbnRzLCBtYXJrdXAgZGVjbGFyYXRpb25zKSwgb3IgY2hhcmFjdGVycyB0aGF0IGFyZSBwYXJ0IG9mIGEKKyAgIGNvbnN0cnVjdCB3aGljaCBjb3VsZCBiZSByZXBvcnRlZCBidXQgZm9yIHdoaWNoIG5vIGhhbmRsZXIgaGFzIGJlZW4KKyAgIHN1cHBsaWVkLiBUaGUgY2hhcmFjdGVycyBhcmUgcGFzc2VkIGV4YWN0bHkgYXMgdGhleSB3ZXJlIGluIHRoZSBYTUwKKyAgIGRvY3VtZW50IGV4Y2VwdCB0aGF0IHRoZXkgd2lsbCBiZSBlbmNvZGVkIGluIFVURi04IG9yIFVURi0xNi4KKyAgIExpbmUgYm91bmRhcmllcyBhcmUgbm90IG5vcm1hbGl6ZWQuIE5vdGUgdGhhdCBhIGJ5dGUgb3JkZXIgbWFyaworICAgY2hhcmFjdGVyIGlzIG5vdCBwYXNzZWQgdG8gdGhlIGRlZmF1bHQgaGFuZGxlci4gVGhlcmUgYXJlIG5vCisgICBndWFyYW50ZWVzIGFib3V0IGhvdyBjaGFyYWN0ZXJzIGFyZSBkaXZpZGVkIGJldHdlZW4gY2FsbHMgdG8gdGhlCisgICBkZWZhdWx0IGhhbmRsZXI6IGZvciBleGFtcGxlLCBhIGNvbW1lbnQgbWlnaHQgYmUgc3BsaXQgYmV0d2VlbgorICAgbXVsdGlwbGUgY2FsbHMuCisqLwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfRGVmYXVsdEhhbmRsZXIpICh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOworCisvKiBUaGlzIGlzIGNhbGxlZCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLCBiZWZvcmUKKyAgIGFueSBEVEQgb3IgaW50ZXJuYWwgc3Vic2V0IGlzIHBhcnNlZC4KKyovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRvY3R5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19pbnRlcm5hbF9zdWJzZXQpOworCisvKiBUaGlzIGlzIGNhbGxlZCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIHdoZW4gdGhlCisgICBjbG9zaW5nID4gaXMgZW5jb3VudGVyZWQsIGJ1dCBhZnRlciBwcm9jZXNzaW5nIGFueSBleHRlcm5hbAorICAgc3Vic2V0LgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlcikodm9pZCAqdXNlckRhdGEpOworCisvKiBUaGlzIGlzIGNhbGxlZCBmb3IgZW50aXR5IGRlY2xhcmF0aW9ucy4gVGhlIGlzX3BhcmFtZXRlcl9lbnRpdHkKKyAgIGFyZ3VtZW50IHdpbGwgYmUgbm9uLXplcm8gaWYgdGhlIGVudGl0eSBpcyBhIHBhcmFtZXRlciBlbnRpdHksIHplcm8KKyAgIG90aGVyd2lzZS4KKworICAgRm9yIGludGVybmFsIGVudGl0aWVzICg8IUVOVElUWSBmb28gImJhciI+KSwgdmFsdWUgd2lsbAorICAgYmUgbm9uLU5VTEwgYW5kIHN5c3RlbUlkLCBwdWJsaWNJRCwgYW5kIG5vdGF0aW9uTmFtZSB3aWxsIGJlIE5VTEwuCisgICBUaGUgdmFsdWUgc3RyaW5nIGlzIE5PVCBudWwtdGVybWluYXRlZDsgdGhlIGxlbmd0aCBpcyBwcm92aWRlZCBpbgorICAgdGhlIHZhbHVlX2xlbmd0aCBhcmd1bWVudC4gU2luY2UgaXQgaXMgbGVnYWwgdG8gaGF2ZSB6ZXJvLWxlbmd0aAorICAgdmFsdWVzLCBkbyBub3QgdXNlIHRoaXMgYXJndW1lbnQgdG8gdGVzdCBmb3IgaW50ZXJuYWwgZW50aXRpZXMuCisKKyAgIEZvciBleHRlcm5hbCBlbnRpdGllcywgdmFsdWUgd2lsbCBiZSBOVUxMIGFuZCBzeXN0ZW1JZCB3aWxsIGJlCisgICBub24tTlVMTC4gVGhlIHB1YmxpY0lkIGFyZ3VtZW50IHdpbGwgYmUgTlVMTCB1bmxlc3MgYSBwdWJsaWMKKyAgIGlkZW50aWZpZXIgd2FzIHByb3ZpZGVkLiBUaGUgbm90YXRpb25OYW1lIGFyZ3VtZW50IHdpbGwgaGF2ZSBhCisgICBub24tTlVMTCB2YWx1ZSBvbmx5IGZvciB1bnBhcnNlZCBlbnRpdHkgZGVjbGFyYXRpb25zLgorCisgICBOb3RlIHRoYXQgaXNfcGFyYW1ldGVyX2VudGl0eSBjYW4ndCBiZSBjaGFuZ2VkIHRvIFhNTF9Cb29sLCBzaW5jZQorICAgdGhhdCB3b3VsZCBicmVhayBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKyovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9FbnRpdHlEZWNsSGFuZGxlcikgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19wYXJhbWV0ZXJfZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpOworCisvKiBPQlNPTEVURSAtLSBPQlNPTEVURSAtLSBPQlNPTEVURQorICAgVGhpcyBoYW5kbGVyIGhhcyBiZWVuIHN1cGVyY2VkZWQgYnkgdGhlIEVudGl0eURlY2xIYW5kbGVyIGFib3ZlLgorICAgSXQgaXMgcHJvdmlkZWQgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworICAgVGhpcyBpcyBjYWxsZWQgZm9yIGEgZGVjbGFyYXRpb24gb2YgYW4gdW5wYXJzZWQgKE5EQVRBKSBlbnRpdHkuCisgICBUaGUgYmFzZSBhcmd1bWVudCBpcyB3aGF0ZXZlciB3YXMgc2V0IGJ5IFhNTF9TZXRCYXNlLiBUaGUKKyAgIGVudGl0eU5hbWUsIHN5c3RlbUlkIGFuZCBub3RhdGlvbk5hbWUgYXJndW1lbnRzIHdpbGwgbmV2ZXIgYmUKKyAgIE5VTEwuIFRoZSBvdGhlciBhcmd1bWVudHMgbWF5IGJlLgorKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUpOworCisvKiBUaGlzIGlzIGNhbGxlZCBmb3IgYSBkZWNsYXJhdGlvbiBvZiBub3RhdGlvbi4gIFRoZSBiYXNlIGFyZ3VtZW50IGlzCisgICB3aGF0ZXZlciB3YXMgc2V0IGJ5IFhNTF9TZXRCYXNlLiBUaGUgbm90YXRpb25OYW1lIHdpbGwgbmV2ZXIgYmUKKyAgIE5VTEwuICBUaGUgb3RoZXIgYXJndW1lbnRzIGNhbiBiZS4KKyovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCk7CisKKy8qIFdoZW4gbmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCwgdGhlc2UgYXJlIGNhbGxlZCBvbmNlIGZvcgorICAgZWFjaCBuYW1lc3BhY2UgZGVjbGFyYXRpb24uIFRoZSBjYWxsIHRvIHRoZSBzdGFydCBhbmQgZW5kIGVsZW1lbnQKKyAgIGhhbmRsZXJzIG9jY3VyIGJldHdlZW4gdGhlIGNhbGxzIHRvIHRoZSBzdGFydCBhbmQgZW5kIG5hbWVzcGFjZQorICAgZGVjbGFyYXRpb24gaGFuZGxlcnMuIEZvciBhbiB4bWxucyBhdHRyaWJ1dGUsIHByZWZpeCB3aWxsIGJlCisgICBOVUxMLiAgRm9yIGFuIHhtbG5zPSIiIGF0dHJpYnV0ZSwgdXJpIHdpbGwgYmUgTlVMTC4KKyovCit0eXBlZGVmIHZvaWQgKFhNTENBTEwgKlhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKTsKKwordHlwZWRlZiB2b2lkIChYTUxDQUxMICpYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCk7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGlmIHRoZSBkb2N1bWVudCBpcyBub3Qgc3RhbmRhbG9uZSwgdGhhdCBpcywgaXQgaGFzIGFuCisgICBleHRlcm5hbCBzdWJzZXQgb3IgYSByZWZlcmVuY2UgdG8gYSBwYXJhbWV0ZXIgZW50aXR5LCBidXQgZG9lcyBub3QKKyAgIGhhdmUgc3RhbmRhbG9uZT0ieWVzIi4gSWYgdGhpcyBoYW5kbGVyIHJldHVybnMgWE1MX1NUQVRVU19FUlJPUiwKKyAgIHRoZW4gcHJvY2Vzc2luZyB3aWxsIG5vdCBjb250aW51ZSwgYW5kIHRoZSBwYXJzZXIgd2lsbCByZXR1cm4gYQorICAgWE1MX0VSUk9SX05PVF9TVEFOREFMT05FIGVycm9yLgorICAgSWYgcGFyYW1ldGVyIGVudGl0eSBwYXJzaW5nIGlzIGVuYWJsZWQsIHRoZW4gaW4gYWRkaXRpb24gdG8gdGhlCisgICBjb25kaXRpb25zIGFib3ZlIHRoaXMgaGFuZGxlciB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSByZWZlcmVuY2VkCisgICBlbnRpdHkgd2FzIGFjdHVhbGx5IHJlYWQuCisqLwordHlwZWRlZiBpbnQgKFhNTENBTEwgKlhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlcikgKHZvaWQgKnVzZXJEYXRhKTsKKworLyogVGhpcyBpcyBjYWxsZWQgZm9yIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHBhcnNlZCBnZW5lcmFsCisgICBlbnRpdHkuICBUaGUgcmVmZXJlbmNlZCBlbnRpdHkgaXMgbm90IGF1dG9tYXRpY2FsbHkgcGFyc2VkLiAgVGhlCisgICBhcHBsaWNhdGlvbiBjYW4gcGFyc2UgaXQgaW1tZWRpYXRlbHkgb3IgbGF0ZXIgdXNpbmcKKyAgIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZS4KKworICAgVGhlIHBhcnNlciBhcmd1bWVudCBpcyB0aGUgcGFyc2VyIHBhcnNpbmcgdGhlIGVudGl0eSBjb250YWluaW5nIHRoZQorICAgcmVmZXJlbmNlOyBpdCBjYW4gYmUgcGFzc2VkIGFzIHRoZSBwYXJzZXIgYXJndW1lbnQgdG8KKyAgIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZS4gIFRoZSBzeXN0ZW1JZCBhcmd1bWVudCBpcyB0aGUKKyAgIHN5c3RlbSBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZW50aXR5IGRlY2xhcmF0aW9uOyBpdCB3aWxsCisgICBub3QgYmUgTlVMTC4KKworICAgVGhlIGJhc2UgYXJndW1lbnQgaXMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMKKyAgIHRoZSBiYXNlIGZvciByZXNvbHZpbmcgc3lzdGVtSWQgaWYgc3lzdGVtSWQgd2FzIHJlbGF0aXZlOyB0aGlzIGlzCisgICBzZXQgYnkgWE1MX1NldEJhc2U7IGl0IG1heSBiZSBOVUxMLgorCisgICBUaGUgcHVibGljSWQgYXJndW1lbnQgaXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiB0aGUKKyAgIGVudGl0eSBkZWNsYXJhdGlvbiwgb3IgTlVMTCBpZiBub25lIHdhcyBzcGVjaWZpZWQ7IHRoZSB3aGl0ZXNwYWNlCisgICBpbiB0aGUgcHVibGljIGlkZW50aWZpZXIgd2lsbCBoYXZlIGJlZW4gbm9ybWFsaXplZCBhcyByZXF1aXJlZCBieQorICAgdGhlIFhNTCBzcGVjLgorCisgICBUaGUgY29udGV4dCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHBhcnNpbmcgY29udGV4dCBpbiB0aGUgZm9ybWF0CisgICBleHBlY3RlZCBieSB0aGUgY29udGV4dCBhcmd1bWVudCB0byBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGU7CisgICBjb250ZXh0IGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIGhhbmRsZXIgcmV0dXJucywgc28gaWYgdGhlCisgICByZWZlcmVuY2VkIGVudGl0eSBpcyB0byBiZSBwYXJzZWQgbGF0ZXIsIGl0IG11c3QgYmUgY29waWVkLgorICAgY29udGV4dCBpcyBOVUxMIG9ubHkgd2hlbiB0aGUgZW50aXR5IGlzIGEgcGFyYW1ldGVyIGVudGl0eS4KKworICAgVGhlIGhhbmRsZXIgc2hvdWxkIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SIGlmIHByb2Nlc3Npbmcgc2hvdWxkIG5vdAorICAgY29udGludWUgYmVjYXVzZSBvZiBhIGZhdGFsIGVycm9yIGluIHRoZSBoYW5kbGluZyBvZiB0aGUgZXh0ZXJuYWwKKyAgIGVudGl0eS4gIEluIHRoaXMgY2FzZSB0aGUgY2FsbGluZyBwYXJzZXIgd2lsbCByZXR1cm4gYW4KKyAgIFhNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkcgZXJyb3IuCisKKyAgIE5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgaGFuZGxlcnMgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBwYXJzZXIsCisgICBub3QgdXNlckRhdGEuCisqLwordHlwZWRlZiBpbnQgKFhNTENBTEwgKlhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIpICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCk7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zOgorICAgMSkgQW4gZW50aXR5IHJlZmVyZW5jZSBpcyBlbmNvdW50ZXJlZCBmb3Igd2hpY2ggbm8gZGVjbGFyYXRpb24KKyAgICAgIGhhcyBiZWVuIHJlYWQgKmFuZCogdGhpcyBpcyBub3QgYW4gZXJyb3IuCisgICAyKSBBbiBpbnRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlIGlzIHJlYWQsIGJ1dCBub3QgZXhwYW5kZWQsIGJlY2F1c2UKKyAgICAgIFhNTF9TZXREZWZhdWx0SGFuZGxlciBoYXMgYmVlbiBjYWxsZWQuCisgICBOb3RlOiBza2lwcGVkIHBhcmFtZXRlciBlbnRpdGllcyBpbiBkZWNsYXJhdGlvbnMgYW5kIHNraXBwZWQgZ2VuZXJhbAorICAgICAgICAgZW50aXRpZXMgaW4gYXR0cmlidXRlIHZhbHVlcyBjYW5ub3QgYmUgcmVwb3J0ZWQsIGJlY2F1c2UKKyAgICAgICAgIHRoZSBldmVudCB3b3VsZCBiZSBvdXQgb2Ygc3luYyB3aXRoIHRoZSByZXBvcnRpbmcgb2YgdGhlCisgICAgICAgICBkZWNsYXJhdGlvbnMgb3IgYXR0cmlidXRlIHZhbHVlcworKi8KK3R5cGVkZWYgdm9pZCAoWE1MQ0FMTCAqWE1MX1NraXBwZWRFbnRpdHlIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbnRpdHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3BhcmFtZXRlcl9lbnRpdHkpOworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgaW4gYnkgdGhlIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIHRvCisgICBwcm92aWRlIGluZm9ybWF0aW9uIHRvIHRoZSBwYXJzZXIgYWJvdXQgZW5jb2RpbmdzIHRoYXQgYXJlIHVua25vd24KKyAgIHRvIHRoZSBwYXJzZXIuCisKKyAgIFRoZSBtYXBbYl0gbWVtYmVyIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IGJ5dGUgc2VxdWVuY2VzIHdob3NlCisgICBmaXJzdCBieXRlIGlzIGIuCisKKyAgIElmIG1hcFtiXSBpcyBjIHdoZXJlIGMgaXMgPj0gMCwgdGhlbiBiIGJ5IGl0c2VsZiBlbmNvZGVzIHRoZQorICAgVW5pY29kZSBzY2FsYXIgdmFsdWUgYy4KKworICAgSWYgbWFwW2JdIGlzIC0xLCB0aGVuIHRoZSBieXRlIHNlcXVlbmNlIGlzIG1hbGZvcm1lZC4KKworICAgSWYgbWFwW2JdIGlzIC1uLCB3aGVyZSBuID49IDIsIHRoZW4gYiBpcyB0aGUgZmlyc3QgYnl0ZSBvZiBhbgorICAgbi1ieXRlIHNlcXVlbmNlIHRoYXQgZW5jb2RlcyBhIHNpbmdsZSBVbmljb2RlIHNjYWxhciB2YWx1ZS4KKworICAgVGhlIGRhdGEgbWVtYmVyIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY29udmVydAorICAgZnVuY3Rpb24uCisKKyAgIFRoZSBjb252ZXJ0IGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydCBtdWx0aWJ5dGUgc2VxdWVuY2VzOyBzIHdpbGwKKyAgIHBvaW50IHRvIGEgbi1ieXRlIHNlcXVlbmNlIHdoZXJlIG1hcFsodW5zaWduZWQgY2hhcikqc10gPT0gLW4uICBUaGUKKyAgIGNvbnZlcnQgZnVuY3Rpb24gbXVzdCByZXR1cm4gdGhlIFVuaWNvZGUgc2NhbGFyIHZhbHVlIHJlcHJlc2VudGVkCisgICBieSB0aGlzIGJ5dGUgc2VxdWVuY2Ugb3IgLTEgaWYgdGhlIGJ5dGUgc2VxdWVuY2UgaXMgbWFsZm9ybWVkLgorCisgICBUaGUgY29udmVydCBmdW5jdGlvbiBtYXkgYmUgTlVMTCBpZiB0aGUgZW5jb2RpbmcgaXMgYSBzaW5nbGUtYnl0ZQorICAgZW5jb2RpbmcsIHRoYXQgaXMgaWYgbWFwW2JdID49IC0xIGZvciBhbGwgYnl0ZXMgYi4KKworICAgV2hlbiB0aGUgcGFyc2VyIGlzIGZpbmlzaGVkIHdpdGggdGhlIGVuY29kaW5nLCB0aGVuIGlmIHJlbGVhc2UgaXMKKyAgIG5vdCBOVUxMLCBpdCB3aWxsIGNhbGwgcmVsZWFzZSBwYXNzaW5nIGl0IHRoZSBkYXRhIG1lbWJlcjsgb25jZQorICAgcmVsZWFzZSBoYXMgYmVlbiBjYWxsZWQsIHRoZSBjb252ZXJ0IGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZAorICAgYWdhaW4uCisKKyAgIEV4cGF0IHBsYWNlcyBjZXJ0YWluIHJlc3RyaWN0aW9ucyBvbiB0aGUgZW5jb2RpbmdzIHRoYXQgYXJlIHN1cHBvcnRlZAorICAgdXNpbmcgdGhpcyBtZWNoYW5pc20uCisKKyAgIDEuIEV2ZXJ5IEFTQ0lJIGNoYXJhY3RlciB0aGF0IGNhbiBhcHBlYXIgaW4gYSB3ZWxsLWZvcm1lZCBYTUwgZG9jdW1lbnQsCisgICAgICBvdGhlciB0aGFuIHRoZSBjaGFyYWN0ZXJzCisKKyAgICAgICRAXF5ge31+CisKKyAgICAgIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgYnl0ZSwgYW5kIHRoYXQgYnl0ZSBtdXN0IGJlIHRoZQorICAgICAgc2FtZSBieXRlIHRoYXQgcmVwcmVzZW50cyB0aGF0IGNoYXJhY3RlciBpbiBBU0NJSS4KKworICAgMi4gTm8gY2hhcmFjdGVyIG1heSByZXF1aXJlIG1vcmUgdGhhbiA0IGJ5dGVzIHRvIGVuY29kZS4KKworICAgMy4gQWxsIGNoYXJhY3RlcnMgZW5jb2RlZCBtdXN0IGhhdmUgVW5pY29kZSBzY2FsYXIgdmFsdWVzIDw9CisgICAgICAweEZGRkYsIChpLmUuLCBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYmUgZW5jb2RlZCBieSBzdXJyb2dhdGVzIGluCisgICAgICBVVEYtMTYgYXJlICBub3QgYWxsb3dlZCkuICBOb3RlIHRoYXQgdGhpcyByZXN0cmljdGlvbiBkb2Vzbid0CisgICAgICBhcHBseSB0byB0aGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IgVVRGLTggYW5kIFVURi0xNi4KKworICAgNC4gTm8gVW5pY29kZSBjaGFyYWN0ZXIgbWF5IGJlIGVuY29kZWQgYnkgbW9yZSB0aGFuIG9uZSBkaXN0aW5jdAorICAgICAgc2VxdWVuY2Ugb2YgYnl0ZXMuCisqLwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbWFwWzI1Nl07CisgIHZvaWQgKmRhdGE7CisgIGludCAoWE1MQ0FMTCAqY29udmVydCkodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqcyk7CisgIHZvaWQgKFhNTENBTEwgKnJlbGVhc2UpKHZvaWQgKmRhdGEpOworfSBYTUxfRW5jb2Rpbmc7CisKKy8qIFRoaXMgaXMgY2FsbGVkIGZvciBhbiBlbmNvZGluZyB0aGF0IGlzIHVua25vd24gdG8gdGhlIHBhcnNlci4KKworICAgVGhlIGVuY29kaW5nSGFuZGxlckRhdGEgYXJndW1lbnQgaXMgdGhhdCB3aGljaCB3YXMgcGFzc2VkIGFzIHRoZQorICAgc2Vjb25kIGFyZ3VtZW50IHRvIFhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyLgorCisgICBUaGUgbmFtZSBhcmd1bWVudCBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgYXMgc3BlY2lmaWVkIGluCisgICB0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb24uCisKKyAgIElmIHRoZSBjYWxsYmFjayBjYW4gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5jb2RpbmcsIGl0IG11c3QKKyAgIGZpbGwgaW4gdGhlIFhNTF9FbmNvZGluZyBzdHJ1Y3R1cmUsIGFuZCByZXR1cm4gWE1MX1NUQVRVU19PSy4KKyAgIE90aGVyd2lzZSBpdCBtdXN0IHJldHVybiBYTUxfU1RBVFVTX0VSUk9SLgorCisgICBJZiBpbmZvIGRvZXMgbm90IGRlc2NyaWJlIGEgc3VpdGFibGUgZW5jb2RpbmcsIHRoZW4gdGhlIHBhcnNlciB3aWxsCisgICByZXR1cm4gYW4gWE1MX1VOS05PV05fRU5DT0RJTkcgZXJyb3IuCisqLwordHlwZWRlZiBpbnQgKFhNTENBTEwgKlhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyKSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5jb2RpbmcgKmluZm8pOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldEVsZW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRFbGVtZW50SGFuZGxlciBlbmQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciBoYW5kbGVyKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRFbmRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgaGFuZGxlcik7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBoYW5kbGVyKTsKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0Q29tbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbW1lbnRIYW5kbGVyIGhhbmRsZXIpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpOworCisvKiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgaGFuZGxlciBhbmQgYWxzbyBpbmhpYml0cyBleHBhbnNpb24gb2YKKyAgIGludGVybmFsIGVudGl0aWVzLiBUaGVzZSBlbnRpdHkgcmVmZXJlbmNlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGUKKyAgIGRlZmF1bHQgaGFuZGxlciwgb3IgdG8gdGhlIHNraXBwZWQgZW50aXR5IGhhbmRsZXIsIGlmIG9uZSBpcyBzZXQuCisqLworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXREZWZhdWx0SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcik7CisKKy8qIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBoYW5kbGVyIGJ1dCBkb2VzIG5vdCBpbmhpYml0IGV4cGFuc2lvbiBvZgorICAgaW50ZXJuYWwgZW50aXRpZXMuICBUaGUgZW50aXR5IHJlZmVyZW5jZSB3aWxsIG5vdCBiZSBwYXNzZWQgdG8gdGhlCisgICBkZWZhdWx0IGhhbmRsZXIuCisqLworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcik7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBlbmQpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciBoYW5kbGVyKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcik7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCk7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0KTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIgaGFuZGxlcik7CisKK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGhhbmRsZXIpOworCisvKiBJZiBhIG5vbi1OVUxMIHZhbHVlIGZvciBhcmcgaXMgc3BlY2lmaWVkIGhlcmUsIHRoZW4gaXQgd2lsbCBiZQorICAgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHJlZiBoYW5kbGVyCisgICBpbnN0ZWFkIG9mIHRoZSBwYXJzZXIgb2JqZWN0LgorKi8KK1hNTFBBUlNFQVBJKHZvaWQpCitYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciBoYW5kbGVyKTsKKworWE1MUEFSU0VBUEkodm9pZCkKK1hNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmVuY29kaW5nSGFuZGxlckRhdGEpOworCisvKiBUaGlzIGNhbiBiZSBjYWxsZWQgd2l0aGluIGEgaGFuZGxlciBmb3IgYSBzdGFydCBlbGVtZW50LCBlbmQKKyAgIGVsZW1lbnQsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gb3IgY2hhcmFjdGVyIGRhdGEuICBJdCBjYXVzZXMgdGhlCisgICBjb3JyZXNwb25kaW5nIG1hcmt1cCB0byBiZSBwYXNzZWQgdG8gdGhlIGRlZmF1bHQgaGFuZGxlci4KKyovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX0RlZmF1bHRDdXJyZW50KFhNTF9QYXJzZXIgcGFyc2VyKTsKKworLyogSWYgZG9fbnN0IGlzIG5vbi16ZXJvLCBhbmQgbmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgaW4gZWZmZWN0LCBhbmQKKyAgIGEgbmFtZSBoYXMgYSBwcmVmaXggKGkuZS4gYW4gZXhwbGljaXQgbmFtZXNwYWNlIHF1YWxpZmllcikgdGhlbgorICAgdGhhdCBuYW1lIGlzIHJldHVybmVkIGFzIGEgdHJpcGxldCBpbiBhIHNpbmdsZSBzdHJpbmcgc2VwYXJhdGVkIGJ5CisgICB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlciBzcGVjaWZpZWQgd2hlbiB0aGUgcGFyc2VyIHdhcyBjcmVhdGVkOiBVUkkKKyAgICsgc2VwICsgbG9jYWxfbmFtZSArIHNlcCArIHByZWZpeC4KKworICAgSWYgZG9fbnN0IGlzIHplcm8sIHRoZW4gbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZQorICAgZGVmYXVsdCBtYW5uZXIgKFVSSSArIHNlcCArIGxvY2FsX25hbWUpIHdoZXRoZXIgb3Igbm90IHRoZSBuYW1lCisgICBoYXMgYSBwcmVmaXguCisKKyAgIE5vdGU6IENhbGxpbmcgWE1MX1NldFJldHVybk5TVHJpcGxldCBhZnRlciBYTUxfUGFyc2Ugb3IKKyAgICAgWE1MX1BhcnNlQnVmZmVyIGhhcyBubyBlZmZlY3QuCisqLworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFJldHVybk5TVHJpcGxldChYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCk7CisKKy8qIFRoaXMgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudCB0byBjYWxsYmFja3MuICovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1NldFVzZXJEYXRhKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICp1c2VyRGF0YSk7CisKKy8qIFJldHVybnMgdGhlIGxhc3QgdmFsdWUgc2V0IGJ5IFhNTF9TZXRVc2VyRGF0YSBvciBOVUxMLiAqLworI2RlZmluZSBYTUxfR2V0VXNlckRhdGEocGFyc2VyKSAoKih2b2lkICoqKShwYXJzZXIpKQorCisvKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc3VwcGx5aW5nIGFuIGVuY29kaW5nIGFyZ3VtZW50IHRvCisgICBYTUxfUGFyc2VyQ3JlYXRlLiBPbiBzdWNjZXNzIFhNTF9TZXRFbmNvZGluZyByZXR1cm5zIG5vbi16ZXJvLAorICAgemVybyBvdGhlcndpc2UuCisgICBOb3RlOiBDYWxsaW5nIFhNTF9TZXRFbmNvZGluZyBhZnRlciBYTUxfUGFyc2Ugb3IgWE1MX1BhcnNlQnVmZmVyCisgICAgIGhhcyBubyBlZmZlY3QgYW5kIHJldHVybnMgWE1MX1NUQVRVU19FUlJPUi4KKyovCitYTUxQQVJTRUFQSShlbnVtIFhNTF9TdGF0dXMpCitYTUxfU2V0RW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7CisKKy8qIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGVuIHRoZSBwYXJzZXIgd2lsbCBiZSBwYXNzZWQgYXMgdGhlCisgICBmaXJzdCBhcmd1bWVudCB0byBjYWxsYmFja3MgaW5zdGVhZCBvZiB1c2VyRGF0YS4gIFRoZSB1c2VyRGF0YSB3aWxsCisgICBzdGlsbCBiZSBhY2Nlc3NpYmxlIHVzaW5nIFhNTF9HZXRVc2VyRGF0YS4KKyovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhYTUxfUGFyc2VyIHBhcnNlcik7CisKKy8qIElmIHVzZURURCA9PSBYTUxfVFJVRSBpcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiwgdGhlbiB0aGUgcGFyc2VyCisgICB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGFuIGV4dGVybmFsIHN1YnNldCwgZXZlbiBpZiBub25lIGlzCisgICBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50LiBJbiBzdWNoIGEgY2FzZSB0aGUgcGFyc2VyIHdpbGwgY2FsbCB0aGUKKyAgIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlciB3aXRoIGEgdmFsdWUgb2YgTlVMTCBmb3IgdGhlIHN5c3RlbUlkCisgICBhcmd1bWVudCAodGhlIHB1YmxpY0lkIGFuZCBjb250ZXh0IGFyZ3VtZW50cyB3aWxsIGJlIE5VTEwgYXMgd2VsbCkuCisgICBOb3RlOiBGb3IgdGhlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgV0ZDOiBFbnRpdHkgRGVjbGFyZWQsIHBhc3NpbmcKKyAgICAgdXNlRFREID09IFhNTF9UUlVFIHdpbGwgbWFrZSB0aGUgcGFyc2VyIGJlaGF2ZSBhcyBpZiB0aGUgZG9jdW1lbnQKKyAgICAgaGFkIGEgRFREIHdpdGggYW4gZXh0ZXJuYWwgc3Vic2V0LgorICAgTm90ZTogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZW4gdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCisgICAgIHRoZSBmaXJzdCBjYWxsIHRvIFhNTF9QYXJzZSBvciBYTUxfUGFyc2VCdWZmZXIsIHNpbmNlIGl0IHdpbGwKKyAgICAgaGF2ZSBubyBlZmZlY3QgYWZ0ZXIgdGhhdC4gIFJldHVybnMKKyAgICAgWE1MX0VSUk9SX0NBTlRfQ0hBTkdFX0ZFQVRVUkVfT05DRV9QQVJTSU5HLgorICAgTm90ZTogSWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYSBET0NUWVBFIGRlY2xhcmF0aW9uIGF0IGFsbCwKKyAgICAgdGhlbiBzdGFydERvY3R5cGVEZWNsSGFuZGxlciBhbmQgZW5kRG9jdHlwZURlY2xIYW5kbGVyIHdpbGwgbm90CisgICAgIGJlIGNhbGxlZCwgZGVzcGl0ZSBhbiBleHRlcm5hbCBzdWJzZXQgYmVpbmcgcGFyc2VkLgorICAgTm90ZTogSWYgWE1MX0RURCBpcyBub3QgZGVmaW5lZCB3aGVuIEV4cGF0IGlzIGNvbXBpbGVkLCByZXR1cm5zCisgICAgIFhNTF9FUlJPUl9GRUFUVVJFX1JFUVVJUkVTX1hNTF9EVEQuCisqLworWE1MUEFSU0VBUEkoZW51bSBYTUxfRXJyb3IpCitYTUxfVXNlRm9yZWlnbkRURChYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0Jvb2wgdXNlRFREKTsKKworCisvKiBTZXRzIHRoZSBiYXNlIHRvIGJlIHVzZWQgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBVUklzIGluIHN5c3RlbQorICAgaWRlbnRpZmllcnMgaW4gZGVjbGFyYXRpb25zLiAgUmVzb2x2aW5nIHJlbGF0aXZlIGlkZW50aWZpZXJzIGlzCisgICBsZWZ0IHRvIHRoZSBhcHBsaWNhdGlvbjogdGhpcyB2YWx1ZSB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIGFzIHRoZQorICAgYmFzZSBhcmd1bWVudCB0byB0aGUgWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlciwKKyAgIFhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyIGFuZCBYTUxfVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlci4gVGhlIGJhc2UKKyAgIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkLiAgUmV0dXJucyBYTUxfU1RBVFVTX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksCisgICBYTUxfU1RBVFVTX09LIG90aGVyd2lzZS4KKyovCitYTUxQQVJTRUFQSShlbnVtIFhNTF9TdGF0dXMpCitYTUxfU2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmJhc2UpOworCitYTUxQQVJTRUFQSShjb25zdCBYTUxfQ2hhciAqKQorWE1MX0dldEJhc2UoWE1MX1BhcnNlciBwYXJzZXIpOworCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBwYXNzZWQgaW4gbGFzdCBjYWxsCisgICB0byB0aGUgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgc3RhcnQtdGFnCisgICByYXRoZXIgdGhhbiBkZWZhdWx0ZWQuIEVhY2ggYXR0cmlidXRlL3ZhbHVlIHBhaXIgY291bnRzIGFzIDI7IHRodXMKKyAgIHRoaXMgY29ycmVzcG9uZGRzIHRvIGFuIGluZGV4IGludG8gdGhlIGF0dHMgYXJyYXkgcGFzc2VkIHRvIHRoZQorICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIuCisqLworWE1MUEFSU0VBUEkoaW50KQorWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KFhNTF9QYXJzZXIgcGFyc2VyKTsKKworLyogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIElEIGF0dHJpYnV0ZSBwYXNzZWQgaW4gdGhlIGxhc3QgY2FsbCB0bworICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIsIG9yIC0xIGlmIHRoZXJlIGlzIG5vIElEIGF0dHJpYnV0ZS4gIEVhY2gKKyAgIGF0dHJpYnV0ZS92YWx1ZSBwYWlyIGNvdW50cyBhcyAyOyB0aHVzIHRoaXMgY29ycmVzcG9uZGRzIHRvIGFuCisgICBpbmRleCBpbnRvIHRoZSBhdHRzIGFycmF5IHBhc3NlZCB0byB0aGUgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIuCisqLworWE1MUEFSU0VBUEkoaW50KQorWE1MX0dldElkQXR0cmlidXRlSW5kZXgoWE1MX1BhcnNlciBwYXJzZXIpOworCisvKiBQYXJzZXMgc29tZSBpbnB1dC4gUmV0dXJucyBYTUxfU1RBVFVTX0VSUk9SIGlmIGEgZmF0YWwgZXJyb3IgaXMKKyAgIGRldGVjdGVkLiAgVGhlIGxhc3QgY2FsbCB0byBYTUxfUGFyc2UgbXVzdCBoYXZlIGlzRmluYWwgdHJ1ZTsgbGVuCisgICBtYXkgYmUgemVybyBmb3IgdGhpcyBjYWxsIChvciBhbnkgb3RoZXIpLgorCisgICBUaG91Z2ggdGhlIHJldHVybiB2YWx1ZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucyBoYXMgYWx3YXlzIGJlZW4KKyAgIGRlc2NyaWJlZCBhcyBhIEJvb2xlYW4gdmFsdWUsIHRoZSBpbXBsZW1lbnRhdGlvbiwgYXQgbGVhc3QgZm9yIHRoZQorICAgMS45NS54IHNlcmllcywgaGFzIGFsd2F5cyByZXR1cm5lZCBleGFjdGx5IG9uZSBvZiB0aGUgWE1MX1N0YXR1cworICAgdmFsdWVzLgorKi8KK1hNTFBBUlNFQVBJKGVudW0gWE1MX1N0YXR1cykKK1hNTF9QYXJzZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGlzRmluYWwpOworCitYTUxQQVJTRUFQSSh2b2lkICopCitYTUxfR2V0QnVmZmVyKFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuKTsKKworWE1MUEFSU0VBUEkoZW51bSBYTUxfU3RhdHVzKQorWE1MX1BhcnNlQnVmZmVyKFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CisKKy8qIFN0b3BzIHBhcnNpbmcsIGNhdXNpbmcgWE1MX1BhcnNlKCkgb3IgWE1MX1BhcnNlQnVmZmVyKCkgdG8gcmV0dXJuLgorICAgTXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBjYWxsLWJhY2sgaGFuZGxlciwgZXhjZXB0IHdoZW4gYWJvcnRpbmcKKyAgIChyZXN1bWFibGUgPSAwKSBhbiBhbHJlYWR5IHN1c3BlbmRlZCBwYXJzZXIuIFNvbWUgY2FsbC1iYWNrcyBtYXkKKyAgIHN0aWxsIGZvbGxvdyBiZWNhdXNlIHRoZXkgd291bGQgb3RoZXJ3aXNlIGdldCBsb3N0LiBFeGFtcGxlczoKKyAgIC0gZW5kRWxlbWVudEhhbmRsZXIoKSBmb3IgZW1wdHkgZWxlbWVudHMgd2hlbiBzdG9wcGVkIGluCisgICAgIHN0YXJ0RWxlbWVudEhhbmRsZXIoKSwgCisgICAtIGVuZE5hbWVTcGFjZURlY2xIYW5kbGVyKCkgd2hlbiBzdG9wcGVkIGluIGVuZEVsZW1lbnRIYW5kbGVyKCksIAorICAgYW5kIHBvc3NpYmx5IG90aGVycy4KKworICAgQ2FuIGJlIGNhbGxlZCBmcm9tIG1vc3QgaGFuZGxlcnMsIGluY2x1ZGluZyBEVEQgcmVsYXRlZCBjYWxsLWJhY2tzLAorICAgZXhjZXB0IHdoZW4gcGFyc2luZyBhbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5IGFuZCByZXN1bWFibGUgIT0gMC4KKyAgIFJldHVybnMgWE1MX1NUQVRVU19PSyB3aGVuIHN1Y2Nlc3NmdWwsIFhNTF9TVEFUVVNfRVJST1Igb3RoZXJ3aXNlLgorICAgUG9zc2libGUgZXJyb3IgY29kZXM6IAorICAgLSBYTUxfRVJST1JfU1VTUEVOREVEOiB3aGVuIHN1c3BlbmRpbmcgYW4gYWxyZWFkeSBzdXNwZW5kZWQgcGFyc2VyLgorICAgLSBYTUxfRVJST1JfRklOSVNIRUQ6IHdoZW4gdGhlIHBhcnNlciBoYXMgYWxyZWFkeSBmaW5pc2hlZC4KKyAgIC0gWE1MX0VSUk9SX1NVU1BFTkRfUEU6IHdoZW4gc3VzcGVuZGluZyB3aGlsZSBwYXJzaW5nIGFuIGV4dGVybmFsIFBFLgorCisgICBXaGVuIHJlc3VtYWJsZSAhPSAwICh0cnVlKSB0aGVuIHBhcnNpbmcgaXMgc3VzcGVuZGVkLCB0aGF0IGlzLCAKKyAgIFhNTF9QYXJzZSgpIGFuZCBYTUxfUGFyc2VCdWZmZXIoKSByZXR1cm4gWE1MX1NUQVRVU19TVVNQRU5ERUQuIAorICAgT3RoZXJ3aXNlLCBwYXJzaW5nIGlzIGFib3J0ZWQsIHRoYXQgaXMsIFhNTF9QYXJzZSgpIGFuZCBYTUxfUGFyc2VCdWZmZXIoKQorICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1Igd2l0aCBlcnJvciBjb2RlIFhNTF9FUlJPUl9BQk9SVEVELgorCisgICAqTm90ZSo6CisgICBUaGlzIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgY3VycmVudCBwYXJzZXIgaW5zdGFuY2Ugb25seSwgdGhhdCBpcywgaWYKKyAgIHRoZXJlIGlzIGEgcGFyZW50IHBhcnNlciB0aGVuIGl0IHdpbGwgY29udGludWUgcGFyc2luZyB3aGVuIHRoZQorICAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKCkgcmV0dXJucy4gSXQgaXMgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mCisgICB0aGUgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKCkgdG8gY2FsbCBYTUxfU3RvcFBhcnNlcigpIG9uIHRoZSBwYXJlbnQKKyAgIHBhcnNlciAocmVjdXJzaXZlbHkpLCBpZiBvbmUgd2FudHMgdG8gc3RvcCBwYXJzaW5nIGFsdG9nZXRoZXIuCisKKyAgIFdoZW4gc3VzcGVuZGVkLCBwYXJzaW5nIGNhbiBiZSByZXN1bWVkIGJ5IGNhbGxpbmcgWE1MX1Jlc3VtZVBhcnNlcigpLiAKKyovCitYTUxQQVJTRUFQSShlbnVtIFhNTF9TdGF0dXMpCitYTUxfU3RvcFBhcnNlcihYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0Jvb2wgcmVzdW1hYmxlKTsKKworLyogUmVzdW1lcyBwYXJzaW5nIGFmdGVyIGl0IGhhcyBiZWVuIHN1c3BlbmRlZCB3aXRoIFhNTF9TdG9wUGFyc2VyKCkuCisgICBNdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBoYW5kbGVyIGNhbGwtYmFjay4gUmV0dXJucyBzYW1lCisgICBzdGF0dXMgY29kZXMgYXMgWE1MX1BhcnNlKCkgb3IgWE1MX1BhcnNlQnVmZmVyKCkuCisgICBBZGRpdGlvbmFsIGVycm9yIGNvZGUgWE1MX0VSUk9SX05PVF9TVVNQRU5ERUQgcG9zc2libGUuICAgCisKKyAgICpOb3RlKjoKKyAgIFRoaXMgbXVzdCBiZSBjYWxsZWQgb24gdGhlIG1vc3QgZGVlcGx5IG5lc3RlZCBjaGlsZCBwYXJzZXIgaW5zdGFuY2UKKyAgIGZpcnN0LCBhbmQgb24gaXRzIHBhcmVudCBwYXJzZXIgb25seSBhZnRlciB0aGUgY2hpbGQgcGFyc2VyIGhhcyBmaW5pc2hlZCwKKyAgIHRvIGJlIGFwcGxpZWQgcmVjdXJzaXZlbHkgdW50aWwgdGhlIGRvY3VtZW50IGVudGl0eSdzIHBhcnNlciBpcyByZXN0YXJ0ZWQuCisgICBUaGF0IGlzLCB0aGUgcGFyZW50IHBhcnNlciB3aWxsIG5vdCByZXN1bWUgYnkgaXRzZWxmIGFuZCBpdCBpcyB1cCB0byB0aGUKKyAgIGFwcGxpY2F0aW9uIHRvIGNhbGwgWE1MX1Jlc3VtZVBhcnNlcigpIG9uIGl0IGF0IHRoZSBhcHByb3ByaWF0ZSBtb21lbnQuCisqLworWE1MUEFSU0VBUEkoZW51bSBYTUxfU3RhdHVzKQorWE1MX1Jlc3VtZVBhcnNlcihYTUxfUGFyc2VyIHBhcnNlcik7CisKK2VudW0gWE1MX1BhcnNpbmcgeworICBYTUxfSU5JVElBTElaRUQsCisgIFhNTF9QQVJTSU5HLAorICBYTUxfRklOSVNIRUQsCisgIFhNTF9TVVNQRU5ERUQKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfUGFyc2luZyBwYXJzaW5nOworICBYTUxfQm9vbCBmaW5hbEJ1ZmZlcjsKK30gWE1MX1BhcnNpbmdTdGF0dXM7CisKKy8qIFJldHVybnMgc3RhdHVzIG9mIHBhcnNlciB3aXRoIHJlc3BlY3QgdG8gYmVpbmcgaW5pdGlhbGl6ZWQsIHBhcnNpbmcsCisgICBmaW5pc2hlZCwgb3Igc3VzcGVuZGVkIGFuZCBwcm9jZXNzaW5nIHRoZSBmaW5hbCBidWZmZXIuCisgICBYWFggWE1MX1BhcnNlKCkgYW5kIFhNTF9QYXJzZUJ1ZmZlcigpIHNob3VsZCByZXR1cm4gWE1MX1BhcnNpbmdTdGF0dXMsCisgICBYWFggd2l0aCBYTUxfRklOSVNIRURfT0sgb3IgWE1MX0ZJTklTSEVEX0VSUk9SIHJlcGxhY2luZyBYTUxfRklOSVNIRUQKKyovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX0dldFBhcnNpbmdTdGF0dXMoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9QYXJzaW5nU3RhdHVzICpzdGF0dXMpOworCisvKiBDcmVhdGVzIGFuIFhNTF9QYXJzZXIgb2JqZWN0IHRoYXQgY2FuIHBhcnNlIGFuIGV4dGVybmFsIGdlbmVyYWwKKyAgIGVudGl0eTsgY29udGV4dCBpcyBhICdcMCctdGVybWluYXRlZCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcGFyc2UKKyAgIGNvbnRleHQ7IGVuY29kaW5nIGlzIGEgJ1wwJy10ZXJtaW5hdGVkIHN0cmluZyBnaXZpbmcgdGhlIG5hbWUgb2YKKyAgIHRoZSBleHRlcm5hbGx5IHNwZWNpZmllZCBlbmNvZGluZywgb3IgTlVMTCBpZiB0aGVyZSBpcyBubworICAgZXh0ZXJuYWxseSBzcGVjaWZpZWQgZW5jb2RpbmcuICBUaGUgY29udGV4dCBzdHJpbmcgY29uc2lzdHMgb2YgYQorICAgc2VxdWVuY2Ugb2YgdG9rZW5zIHNlcGFyYXRlZCBieSBmb3JtZmVlZHMgKFxmKTsgYSB0b2tlbiBjb25zaXN0aW5nCisgICBvZiBhIG5hbWUgc3BlY2lmaWVzIHRoYXQgdGhlIGdlbmVyYWwgZW50aXR5IG9mIHRoZSBuYW1lIGlzIG9wZW47IGEKKyAgIHRva2VuIG9mIHRoZSBmb3JtIHByZWZpeD11cmkgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgZm9yIGEKKyAgIHBhcnRpY3VsYXIgcHJlZml4OyBhIHRva2VuIG9mIHRoZSBmb3JtID11cmkgc3BlY2lmaWVzIHRoZSBkZWZhdWx0CisgICBuYW1lc3BhY2UuICBUaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHBvaW50IGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvCisgICBhbiBFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgc28gbG9uZ2VyIGFzIHRoZSBwYXJzZXIgaGFzIG5vdCB5ZXQKKyAgIGJlZW4gZnJlZWQuICBUaGUgbmV3IHBhcnNlciBpcyBjb21wbGV0ZWx5IGluZGVwZW5kZW50IGFuZCBtYXkKKyAgIHNhZmVseSBiZSB1c2VkIGluIGEgc2VwYXJhdGUgdGhyZWFkLiAgVGhlIGhhbmRsZXJzIGFuZCB1c2VyRGF0YSBhcmUKKyAgIGluaXRpYWxpemVkIGZyb20gdGhlIHBhcnNlciBhcmd1bWVudC4gIFJldHVybnMgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgorICAgT3RoZXJ3aXNlIHJldHVybnMgYSBuZXcgWE1MX1BhcnNlciBvYmplY3QuCisqLworWE1MUEFSU0VBUEkoWE1MX1BhcnNlcikKK1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOworCitlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgeworICBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVIsCisgIFhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19VTkxFU1NfU1RBTkRBTE9ORSwKKyAgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUworfTsKKworLyogQ29udHJvbHMgcGFyc2luZyBvZiBwYXJhbWV0ZXIgZW50aXRpZXMgKGluY2x1ZGluZyB0aGUgZXh0ZXJuYWwgRFRECisgICBzdWJzZXQpLiBJZiBwYXJzaW5nIG9mIHBhcmFtZXRlciBlbnRpdGllcyBpcyBlbmFibGVkLCB0aGVuCisgICByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcyAoaW5jbHVkaW5nIHRoZSBleHRlcm5hbAorICAgRFREIHN1YnNldCkgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgc2V0IHdpdGgKKyAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIuICBUaGUgY29udGV4dCBwYXNzZWQgd2lsbCBiZSAwLgorCisgICBVbmxpa2UgZXh0ZXJuYWwgZ2VuZXJhbCBlbnRpdGllcywgZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzIGNhbgorICAgb25seSBiZSBwYXJzZWQgc3luY2hyb25vdXNseS4gIElmIHRoZSBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5IGlzCisgICB0byBiZSBwYXJzZWQsIGl0IG11c3QgYmUgcGFyc2VkIGR1cmluZyB0aGUgY2FsbCB0byB0aGUgZXh0ZXJuYWwKKyAgIGVudGl0eSByZWYgaGFuZGxlcjogdGhlIGNvbXBsZXRlIHNlcXVlbmNlIG9mCisgICBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUsIFhNTF9QYXJzZS9YTUxfUGFyc2VCdWZmZXIgYW5kCisgICBYTUxfUGFyc2VyRnJlZSBjYWxscyBtdXN0IGJlIG1hZGUgZHVyaW5nIHRoaXMgY2FsbC4gIEFmdGVyCisgICBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUgaGFzIGJlZW4gY2FsbGVkIHRvIGNyZWF0ZSB0aGUgcGFyc2VyCisgICBmb3IgdGhlIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkgKGNvbnRleHQgbXVzdCBiZSAwIGZvciB0aGlzCisgICBjYWxsKSwgaXQgaXMgaWxsZWdhbCB0byBtYWtlIGFueSBjYWxscyBvbiB0aGUgb2xkIHBhcnNlciB1bnRpbAorICAgWE1MX1BhcnNlckZyZWUgaGFzIGJlZW4gY2FsbGVkIG9uIHRoZSBuZXdseSBjcmVhdGVkIHBhcnNlci4KKyAgIElmIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIGNvbXBpbGVkIHdpdGhvdXQgc3VwcG9ydCBmb3IgcGFyYW1ldGVyCisgICBlbnRpdHkgcGFyc2luZyAoaWUgd2l0aG91dCBYTUxfRFREIGJlaW5nIGRlZmluZWQpLCB0aGVuCisgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nIHdpbGwgcmV0dXJuIDAgaWYgcGFyc2luZyBvZiBwYXJhbWV0ZXIKKyAgIGVudGl0aWVzIGlzIHJlcXVlc3RlZDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIG5vbi16ZXJvLgorICAgTm90ZTogSWYgWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyBpcyBjYWxsZWQgYWZ0ZXIgWE1MX1BhcnNlIG9yCisgICAgICBYTUxfUGFyc2VCdWZmZXIsIHRoZW4gaXQgaGFzIG5vIGVmZmVjdCBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIDAuCisqLworWE1MUEFSU0VBUEkoaW50KQorWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIHBhcnNpbmcpOworCisvKiBJZiBYTUxfUGFyc2Ugb3IgWE1MX1BhcnNlQnVmZmVyIGhhdmUgcmV0dXJuZWQgWE1MX1NUQVRVU19FUlJPUiwgdGhlbgorICAgWE1MX0dldEVycm9yQ29kZSByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4KKyovCitYTUxQQVJTRUFQSShlbnVtIFhNTF9FcnJvcikKK1hNTF9HZXRFcnJvckNvZGUoWE1MX1BhcnNlciBwYXJzZXIpOworCisvKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHBhcnNlCisgICBsb2NhdGlvbi4gIFRoZXkgbWF5IGJlIGNhbGxlZCBmcm9tIGFueSBjYWxsYmFjayBjYWxsZWQgdG8gcmVwb3J0CisgICBzb21lIHBhcnNlIGV2ZW50OyBpbiB0aGlzIGNhc2UgdGhlIGxvY2F0aW9uIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgIGZpcnN0IG9mIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgZ2VuZXJhdGVkIHRoZSBldmVudC4gIFdoZW4KKyAgIGNhbGxlZCBmcm9tIGNhbGxiYWNrcyBnZW5lcmF0ZWQgYnkgZGVjbGFyYXRpb25zIGluIHRoZSBkb2N1bWVudAorICAgcHJvbG9ndWUsIHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGlzbid0IGFzIG5lYXRseSBkZWZpbmVkLCBidXQgd2lsbAorICAgYmUgd2l0aGluIHRoZSByZWxldmFudCBtYXJrdXAuICBXaGVuIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBjYWxsYmFjaworICAgZnVuY3Rpb25zLCB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIHdpbGwgYmUganVzdCBwYXN0IHRoZSBsYXN0IHBhcnNlCisgICBldmVudCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIHdhcyBhbiBhc3NvY2lhdGVkIGNhbGxiYWNrKS4KKyAgIAorICAgVGhleSBtYXkgYWxzbyBiZSBjYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gYSBjYWxsIHRvIFhNTF9QYXJzZQorICAgb3IgWE1MX1BhcnNlQnVmZmVyLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBYTUxfU1RBVFVTX0VSUk9SIHRoZW4KKyAgIHRoZSBsb2NhdGlvbiBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNoYXJhY3RlciBhdCB3aGljaCB0aGUgZXJyb3IKKyAgIHdhcyBkZXRlY3RlZDsgb3RoZXJ3aXNlIHRoZSBsb2NhdGlvbiBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QKKyAgIHBhcnNlIGV2ZW50LCBhcyBkZXNjcmliZWQgYWJvdmUuCisqLworWE1MUEFSU0VBUEkoWE1MX1NpemUpIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7CitYTUxQQVJTRUFQSShYTUxfU2l6ZSkgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpOworWE1MUEFSU0VBUEkoWE1MX0luZGV4KSBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcik7CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IGV2ZW50LgorICAgUmV0dXJucyAwIGlmIHRoZSBldmVudCBpcyBpbiBhbiBpbnRlcm5hbCBlbnRpdHkuCisqLworWE1MUEFSU0VBUEkoaW50KQorWE1MX0dldEN1cnJlbnRCeXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpOworCisvKiBJZiBYTUxfQ09OVEVYVF9CWVRFUyBpcyBkZWZpbmVkLCByZXR1cm5zIHRoZSBpbnB1dCBidWZmZXIsIHNldHMKKyAgIHRoZSBpbnRlZ2VyIHBvaW50ZWQgdG8gYnkgb2Zmc2V0IHRvIHRoZSBvZmZzZXQgd2l0aGluIHRoaXMgYnVmZmVyCisgICBvZiB0aGUgY3VycmVudCBwYXJzZSBwb3NpdGlvbiwgYW5kIHNldHMgdGhlIGludGVnZXIgcG9pbnRlZCB0byBieSBzaXplCisgICB0byB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlciAodGhlIG51bWJlciBvZiBpbnB1dCBieXRlcykuIE90aGVyd2lzZQorICAgcmV0dXJucyBhIE5VTEwgcG9pbnRlci4gQWxzbyByZXR1cm5zIGEgTlVMTCBwb2ludGVyIGlmIGEgcGFyc2UgaXNuJ3QKKyAgIGFjdGl2ZS4KKworICAgTk9URTogVGhlIGNoYXJhY3RlciBwb2ludGVyIHJldHVybmVkIHNob3VsZCBub3QgYmUgdXNlZCBvdXRzaWRlCisgICB0aGUgaGFuZGxlciB0aGF0IG1ha2VzIHRoZSBjYWxsLgorKi8KK1hNTFBBUlNFQVBJKGNvbnN0IGNoYXIgKikKK1hNTF9HZXRJbnB1dENvbnRleHQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpOworCisvKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucy4gKi8KKyNkZWZpbmUgWE1MX0dldEVycm9yTGluZU51bWJlciAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcgorI2RlZmluZSBYTUxfR2V0RXJyb3JDb2x1bW5OdW1iZXIgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIKKyNkZWZpbmUgWE1MX0dldEVycm9yQnl0ZUluZGV4ICAgIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4CisKKy8qIEZyZWVzIHRoZSBjb250ZW50IG1vZGVsIHBhc3NlZCB0byB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBoYW5kbGVyICovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX0ZyZWVDb250ZW50TW9kZWwoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db250ZW50ICptb2RlbCk7CisKKy8qIEV4cG9zaW5nIHRoZSBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zIHVzZWQgaW4gRXhwYXQgKi8KK1hNTFBBUlNFQVBJKHZvaWQgKikKK1hNTF9NZW1NYWxsb2MoWE1MX1BhcnNlciBwYXJzZXIsIHNpemVfdCBzaXplKTsKKworWE1MUEFSU0VBUEkodm9pZCAqKQorWE1MX01lbVJlYWxsb2MoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX01lbUZyZWUoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKnB0cik7CisKKy8qIEZyZWVzIG1lbW9yeSB1c2VkIGJ5IHRoZSBwYXJzZXIuICovCitYTUxQQVJTRUFQSSh2b2lkKQorWE1MX1BhcnNlckZyZWUoWE1MX1BhcnNlciBwYXJzZXIpOworCisvKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLiAqLworWE1MUEFSU0VBUEkoY29uc3QgWE1MX0xDaGFyICopCitYTUxfRXJyb3JTdHJpbmcoZW51bSBYTUxfRXJyb3IgY29kZSk7CisKKy8qIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4cGF0ICovCitYTUxQQVJTRUFQSShjb25zdCBYTUxfTENoYXIgKikKK1hNTF9FeHBhdFZlcnNpb24odm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IG1ham9yOworICBpbnQgbWlub3I7CisgIGludCBtaWNybzsKK30gWE1MX0V4cGF0X1ZlcnNpb247CisKKy8qIFJldHVybiBhbiBYTUxfRXhwYXRfVmVyc2lvbiBzdHJ1Y3R1cmUgY29udGFpbmluZyBudW1lcmljIHZlcnNpb24KKyAgIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyB2ZXJzaW9uIG9mIGV4cGF0LgorKi8KK1hNTFBBUlNFQVBJKFhNTF9FeHBhdF9WZXJzaW9uKQorWE1MX0V4cGF0VmVyc2lvbkluZm8odm9pZCk7CisKKy8qIEFkZGVkIGluIEV4cGF0IDEuOTUuNS4gKi8KK2VudW0gWE1MX0ZlYXR1cmVFbnVtIHsKKyAgWE1MX0ZFQVRVUkVfRU5EID0gMCwKKyAgWE1MX0ZFQVRVUkVfVU5JQ09ERSwKKyAgWE1MX0ZFQVRVUkVfVU5JQ09ERV9XQ0hBUl9ULAorICBYTUxfRkVBVFVSRV9EVEQsCisgIFhNTF9GRUFUVVJFX0NPTlRFWFRfQllURVMsCisgIFhNTF9GRUFUVVJFX01JTl9TSVpFLAorICBYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0NIQVIsCisgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfTENIQVIsCisgIFhNTF9GRUFUVVJFX05TLAorICBYTUxfRkVBVFVSRV9MQVJHRV9TSVpFCisgIC8qIEFkZGl0aW9uYWwgZmVhdHVyZXMgbXVzdCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoaXMgZW51bS4gKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfRmVhdHVyZUVudW0gIGZlYXR1cmU7CisgIGNvbnN0IFhNTF9MQ2hhciAgICAgICAqbmFtZTsKKyAgbG9uZyBpbnQgICAgICAgICAgICAgIHZhbHVlOworfSBYTUxfRmVhdHVyZTsKKworWE1MUEFSU0VBUEkoY29uc3QgWE1MX0ZlYXR1cmUgKikKK1hNTF9HZXRGZWF0dXJlTGlzdCh2b2lkKTsKKworCisvKiBFeHBhdCBmb2xsb3dzIHRoZSBHTlUvTGludXggY29udmVudGlvbiBvZiBvZGQgbnVtYmVyIG1pbm9yIHZlcnNpb24gZm9yCisgICBiZXRhL2RldmVsb3BtZW50IHJlbGVhc2VzIGFuZCBldmVuIG51bWJlciBtaW5vciB2ZXJzaW9uIGZvciBzdGFibGUKKyAgIHJlbGVhc2VzLiBNaWNybyBpcyBidW1wZWQgd2l0aCBlYWNoIHJlbGVhc2UsIGFuZCBzZXQgdG8gMCB3aXRoIGVhY2gKKyAgIGNoYW5nZSB0byBtYWpvciBvciBtaW5vciB2ZXJzaW9uLgorKi8KKyNkZWZpbmUgWE1MX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBYTUxfTUlOT1JfVkVSU0lPTiAwCisjZGVmaW5lIFhNTF9NSUNST19WRVJTSU9OIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIG5vdCBFeHBhdF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2V4cGF0X2V4dGVybmFsLmggYi9leHBhdC0yLjAuMS9saWIvZXhwYXRfZXh0ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzAzMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0X2V4dGVybmFsLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaWZuZGVmIEV4cGF0X0V4dGVybmFsX0lOQ0xVREVECisjZGVmaW5lIEV4cGF0X0V4dGVybmFsX0lOQ0xVREVEIDEKKworLyogRXh0ZXJuYWwgQVBJIGRlZmluaXRpb25zICovCisKKyNpZiBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykgJiYgIWRlZmluZWQoX19CRU9TX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjZGVmaW5lIFhNTF9VU0VfTVNDX0VYVEVOU0lPTlMgMQorI2VuZGlmCisKKy8qIEV4cGF0IHRyaWVzIHZlcnkgaGFyZCB0byBtYWtlIHRoZSBBUEkgYm91bmRhcnkgdmVyeSBzcGVjaWZpY2FsbHkKKyAgIGRlZmluZWQuICBUaGVyZSBhcmUgdHdvIG1hY3JvcyBkZWZpbmVkIHRvIGNvbnRyb2wgdGhpcyBib3VuZGFyeTsKKyAgIGVhY2ggb2YgdGhlc2UgY2FuIGJlIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlciB0bworICAgYWNoaWV2ZSBzb21lIGRpZmZlcmVudCBiZWhhdmlvciwgYnV0IGRvaW5nIHNvIGl0IG5vdCByZWNvbW1lbmRlZCBvcgorICAgdGVzdGVkIGZyZXF1ZW50bHkuCisKKyAgIFhNTENBTEwgICAgLSBUaGUgY2FsbGluZyBjb252ZW50aW9uIHRvIHVzZSBmb3IgYWxsIGNhbGxzIGFjcm9zcyB0aGUKKyAgICAgICAgICAgICAgICAibGlicmFyeSBib3VuZGFyeS4iICBUaGlzIHdpbGwgZGVmYXVsdCB0byBjZGVjbCwgYW5kCisgICAgICAgICAgICAgICAgdHJ5IHJlYWxseSBoYXJkIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHRoYXQncyB3aGF0IHdlCisgICAgICAgICAgICAgICAgd2FudC4KKworICAgWE1MSU1QT1JUICAtIFdoYXRldmVyIG1hZ2ljIGlzIG5lZWRlZCB0byBub3RlIHRoYXQgYSBmdW5jdGlvbiBpcworICAgICAgICAgICAgICAgIHRvIGJlIGltcG9ydGVkIGZyb20gYSBkeW5hbWljYWxseSBsb2FkZWQgbGlicmFyeQorICAgICAgICAgICAgICAgICguZGxsLCAuc28sIG9yIC5zbCwgZGVwZW5kaW5nIG9uIHlvdXIgcGxhdGZvcm0pLgorCisgICBUaGUgWE1MQ0FMTCBtYWNybyB3YXMgYWRkZWQgaW4gRXhwYXQgMS45NS43LiAgVGhlIG9ubHkgb25lIHdoaWNoIGlzCisgICBleHBlY3RlZCB0byBiZSBkaXJlY3RseSB1c2VmdWwgaW4gY2xpZW50IGNvZGUgaXMgWE1MQ0FMTC4KKworICAgTm90ZSB0aGF0IG9uIGF0IGxlYXN0IHNvbWUgVW5peCB2ZXJzaW9ucywgdGhlIEV4cGF0IGxpYnJhcnkgbXVzdCBiZQorICAgY29tcGlsZWQgd2l0aCB0aGUgY2RlY2wgY2FsbGluZyBjb252ZW50aW9uIGFzIHRoZSBkZWZhdWx0IHNpbmNlCisgICBzeXN0ZW0gaGVhZGVycyBtYXkgYXNzdW1lIHRoZSBjZGVjbCBjb252ZW50aW9uLgorKi8KKyNpZm5kZWYgWE1MQ0FMTAorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFhNTENBTEwgX19jZGVjbAorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjZGVmaW5lIFhNTENBTEwgX19hdHRyaWJ1dGVfXygoY2RlY2wpKQorI2Vsc2UKKy8qIEZvciBhbnkgcGxhdGZvcm0gd2hpY2ggdXNlcyB0aGlzIGRlZmluaXRpb24gYW5kIHN1cHBvcnRzIG1vcmUgdGhhbgorICAgb25lIGNhbGxpbmcgY29udmVudGlvbiwgd2UgbmVlZCB0byBleHRlbmQgdGhpcyBkZWZpbml0aW9uIHRvCisgICBkZWNsYXJlIHRoZSBjb252ZW50aW9uIHVzZWQgb24gdGhhdCBwbGF0Zm9ybSwgaWYgaXQncyBwb3NzaWJsZSB0bworICAgZG8gc28uCisKKyAgIElmIHRoaXMgaXMgdGhlIGNhc2UgZm9yIHlvdXIgcGxhdGZvcm0sIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydAorICAgd2l0aCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaWRlbnRpZnkgeW91ciBwbGF0Zm9ybSB2aWEgdGhlIEMKKyAgIHByZS1wcm9jZXNzb3IgYW5kIGhvdyB0byBzcGVjaWZ5IHRoZSBzYW1lIGNhbGxpbmcgY29udmVudGlvbiBhcyB0aGUKKyAgIHBsYXRmb3JtJ3MgbWFsbG9jKCkgaW1wbGVtZW50YXRpb24uCisqLworI2RlZmluZSBYTUxDQUxMCisjZW5kaWYKKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MQ0FMTCAqLworCisKKyNpZiAhZGVmaW5lZChYTUxfU1RBVElDKSAmJiAhZGVmaW5lZChYTUxJTVBPUlQpCisjaWZuZGVmIFhNTF9CVUlMRElOR19FWFBBVAorLyogdXNpbmcgRXhwYXQgZnJvbSBhbiBhcHBsaWNhdGlvbiAqLworCisjaWZkZWYgWE1MX1VTRV9NU0NfRVhURU5TSU9OUworI2RlZmluZSBYTUxJTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZW5kaWYKKworI2VuZGlmCisjZW5kaWYgIC8qIG5vdCBkZWZpbmVkIFhNTF9TVEFUSUMgKi8KKworCisvKiBJZiB3ZSBkaWRuJ3QgZGVmaW5lIGl0IGFib3ZlLCBkZWZpbmUgaXQgYXdheTogKi8KKyNpZm5kZWYgWE1MSU1QT1JUCisjZGVmaW5lIFhNTElNUE9SVAorI2VuZGlmCisKKworI2RlZmluZSBYTUxQQVJTRUFQSSh0eXBlKSBYTUxJTVBPUlQgdHlwZSBYTUxDQUxMCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIFhNTF9VTklDT0RFX1dDSEFSX1QKKyNkZWZpbmUgWE1MX1VOSUNPREUKKyNlbmRpZgorCisjaWZkZWYgWE1MX1VOSUNPREUgICAgIC8qIEluZm9ybWF0aW9uIGlzIFVURi0xNiBlbmNvZGVkLiAqLworI2lmZGVmIFhNTF9VTklDT0RFX1dDSEFSX1QKK3R5cGVkZWYgd2NoYXJfdCBYTUxfQ2hhcjsKK3R5cGVkZWYgd2NoYXJfdCBYTUxfTENoYXI7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBYTUxfQ2hhcjsKK3R5cGVkZWYgY2hhciBYTUxfTENoYXI7CisjZW5kaWYgLyogWE1MX1VOSUNPREVfV0NIQVJfVCAqLworI2Vsc2UgICAgICAgICAgICAgICAgICAvKiBJbmZvcm1hdGlvbiBpcyBVVEYtOCBlbmNvZGVkLiAqLwordHlwZWRlZiBjaGFyIFhNTF9DaGFyOwordHlwZWRlZiBjaGFyIFhNTF9MQ2hhcjsKKyNlbmRpZiAvKiBYTUxfVU5JQ09ERSAqLworCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUgIC8qIFVzZSBsYXJnZSBpbnRlZ2VycyBmb3IgZmlsZS9zdHJlYW0gcG9zaXRpb25zLiAqLworI2lmIGRlZmluZWQoWE1MX1VTRV9NU0NfRVhURU5TSU9OUykgJiYgX01TQ19WRVIgPCAxNDAwCit0eXBlZGVmIF9faW50NjQgWE1MX0luZGV4OyAKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBYTUxfU2l6ZTsKKyNlbHNlCit0eXBlZGVmIGxvbmcgbG9uZyBYTUxfSW5kZXg7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBYTUxfU2l6ZTsKKyNlbmRpZgorI2Vsc2UKK3R5cGVkZWYgbG9uZyBYTUxfSW5kZXg7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWE1MX1NpemU7CisjZW5kaWYgLyogWE1MX0xBUkdFX1NJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIG5vdCBFeHBhdF9FeHRlcm5hbF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2V4cGF0X3N0YXRpYy5kc3AgYi9leHBhdC0yLjAuMS9saWIvZXhwYXRfc3RhdGljLmRzcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDY4ZmNlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0X3N0YXRpYy5kc3AKQEAgLTAsMCArMSwxNjIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iZXhwYXRfc3RhdGljIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQorDQorQ0ZHPWV4cGF0X3N0YXRpYyAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJleHBhdF9zdGF0aWMubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImV4cGF0X3N0YXRpYy5tYWsiIENGRz0iZXhwYXRfc3RhdGljIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImV4cGF0X3N0YXRpYyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJleHBhdF9zdGF0aWMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0X3N0YXRpYyAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZXhwYXRfc3RhdGljX19fV2luMzJfUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJleHBhdF9zdGF0aWNfX19XaW4zMl9SZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXFJlbGVhc2Vfc3RhdGljIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0ZEIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBSU0MgL2wgMHgxMDA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cd2luMzJcYmluXFJlbGVhc2UvbGliZXhwYXRNVC5saWIiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0X3N0YXRpYyAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImV4cGF0X3N0YXRpY19fX1dpbjMyX0RlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImV4cGF0X3N0YXRpY19fX1dpbjMyX0RlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxEZWJ1Z19zdGF0aWMiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiQ09NUElMRURfRlJPTV9EU1AiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9GUiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBSU0MgL2wgMHgxMDA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cd2luMzJcYmluXERlYnVnXGxpYmV4cGF0TVQubGliIg0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiZXhwYXRfc3RhdGljIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgImV4cGF0X3N0YXRpYyAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHBhcnNlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWxyb2xlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2suYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHRva19pbXBsLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2tfbnMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxhc2NpaS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYXNjaWl0YWIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGV4cGF0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxleHBhdF9leHRlcm5hbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caWFzY2lpdGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbnRlcm5hbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGF0aW4xdGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxuYW1ldGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx1dGY4dGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWxyb2xlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2suaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHRva19pbXBsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9leHBhdHcuZHNwIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0dy5kc3AKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmE0MGRjNQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi9leHBhdHcuZHNwCkBAIC0wLDAgKzEsMTg1IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImV4cGF0dyIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMg0KKw0KK0NGRz1leHBhdHcgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiZXhwYXR3Lm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJleHBhdHcubWFrIiBDRkc9ImV4cGF0dyAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJleHBhdHcgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikNCishTUVTU0FHRSAiZXhwYXR3IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJleHBhdHcgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiLi5cd2luMzJcYmluXFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxSZWxlYXNlLXciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiRVhQQVRfRVhQT1JUUyIgL1l1InN0ZGFmeC5oIiAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIk5ERUJVRyIgL0QgIkNPTVBJTEVEX0ZST01fRFNQIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIlhNTF9VTklDT0RFX1dDSEFSX1QiIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvZGxsIC9wZGI6bm9uZSAvbWFjaGluZTpJMzg2IC9vdXQ6Ii4uXHdpbjMyXGJpblxSZWxlYXNlL2xpYmV4cGF0dy5kbGwiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0dyAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxEZWJ1Zy13Ig0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiX1VTUkRMTCIgL0QgIkVYUEFUX0VYUE9SVFMiIC9ZdSJzdGRhZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HWCAvWkkgL09kIC9EICJfREVCVUciIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9VU1JETEwiIC9EICJYTUxfVU5JQ09ERV9XQ0hBUl9UIiAvRlIgL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvcGRiOm5vbmUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiLi5cd2luMzJcYmluXERlYnVnL2xpYmV4cGF0dy5kbGwiDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJleHBhdHcgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiZXhwYXR3IC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGliZXhwYXR3LmRlZg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHBhcnNlLmMNCisNCishSUYgICIkKENGRykiID09ICJleHBhdHcgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJleHBhdHcgLSBXaW4zMiBEZWJ1ZyINCisNCisjIEFERCBDUFAgL0dYLSAvT2QNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1scm9sZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sdG9rLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2tfaW1wbC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sdG9rX25zLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYXNjaWkuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGFzY2lpdGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxleHBhdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cZXhwYXRfZXh0ZXJuYWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGlhc2NpaXRhYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caW50ZXJuYWwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxhdGluMXRhYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbmFtZXRhYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdXRmOHRhYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1scm9sZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sdG9rLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2tfaW1wbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIg0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9leHBhdHdfc3RhdGljLmRzcCBiL2V4cGF0LTIuMC4xL2xpYi9leHBhdHdfc3RhdGljLmRzcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMTNkZDcyCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2V4cGF0d19zdGF0aWMuZHNwCkBAIC0wLDAgKzEsMTYyIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImV4cGF0d19zdGF0aWMiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQNCisNCitDRkc9ZXhwYXR3X3N0YXRpYyAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJleHBhdHdfc3RhdGljLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UNCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJleHBhdHdfc3RhdGljLm1hayIgQ0ZHPSJleHBhdHdfc3RhdGljIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgImV4cGF0d19zdGF0aWMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAiZXhwYXR3X3N0YXRpYyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiZXhwYXR3X3N0YXRpYyAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZXhwYXR3X3N0YXRpY19fX1dpbjMyX1JlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZXhwYXR3X3N0YXRpY19fX1dpbjMyX1JlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXHdpbjMyXGJpblxSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcUmVsZWFzZS13X3N0YXRpYyINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiTkRFQlVHIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiQ09NUElMRURfRlJPTV9EU1AiIC9EICJYTUxfVU5JQ09ERV9XQ0hBUl9UIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWVgNCisjIEFERCBCQVNFIFJTQyAvbCAweDEwMDkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSUIzMj1saW5rLmV4ZSAtbGliDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQorIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlx3aW4zMlxiaW5cUmVsZWFzZVxsaWJleHBhdHdNVC5saWIiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImV4cGF0d19zdGF0aWMgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJleHBhdHdfc3RhdGljX19fV2luMzJfRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZXhwYXR3X3N0YXRpY19fX1dpbjMyX0RlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXHdpbjMyXHRtcFxEZWJ1Zy13X3N0YXRpYyINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0QgIlhNTF9VTklDT0RFX1dDSEFSX1QiIC9GUiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBSU0MgL2wgMHgxMDA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElCMzI9bGluay5leGUgLWxpYg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KKyMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cd2luMzJcYmluXERlYnVnXGxpYmV4cGF0d01ULmxpYiINCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgImV4cGF0d19zdGF0aWMgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiZXhwYXR3X3N0YXRpYyAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHBhcnNlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWxyb2xlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2suYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHRva19pbXBsLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2tfbnMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxhc2NpaS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYXNjaWl0YWIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGV4cGF0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxleHBhdF9leHRlcm5hbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5caWFzY2lpdGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxpbnRlcm5hbC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cbGF0aW4xdGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxuYW1ldGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx1dGY4dGFiLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWxyb2xlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llx4bWx0b2suaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHhtbHRva19pbXBsLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9pYXNjaWl0YWIuaCBiL2V4cGF0LTIuMC4xL2xpYi9pYXNjaWl0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGExZDVjCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL2lhc2NpaXRhYi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisvKiBMaWtlIGFzY2lpdGFiLmgsIGV4Y2VwdCB0aGF0IDB4RCBoYXMgY29kZSBCVF9TIHJhdGhlciB0aGFuIEJUX0NSICovCisvKiAweDAwICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MDQgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgwOCAqLyBCVF9OT05YTUwsIEJUX1MsIEJUX0xGLCBCVF9OT05YTUwsCisvKiAweDBDICovIEJUX05PTlhNTCwgQlRfUywgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDEwICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MTQgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAorLyogMHgxOCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweDFDICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4MjAgKi8gQlRfUywgQlRfRVhDTCwgQlRfUVVPVCwgQlRfTlVNLAorLyogMHgyNCAqLyBCVF9PVEhFUiwgQlRfUEVSQ05ULCBCVF9BTVAsIEJUX0FQT1MsCisvKiAweDI4ICovIEJUX0xQQVIsIEJUX1JQQVIsIEJUX0FTVCwgQlRfUExVUywKKy8qIDB4MkMgKi8gQlRfQ09NTUEsIEJUX01JTlVTLCBCVF9OQU1FLCBCVF9TT0wsCisvKiAweDMwICovIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULAorLyogMHgzNCAqLyBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULCBCVF9ESUdJVCwKKy8qIDB4MzggKi8gQlRfRElHSVQsIEJUX0RJR0lULCBCVF9DT0xPTiwgQlRfU0VNSSwKKy8qIDB4M0MgKi8gQlRfTFQsIEJUX0VRVUFMUywgQlRfR1QsIEJUX1FVRVNULAorLyogMHg0MCAqLyBCVF9PVEhFUiwgQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwKKy8qIDB4NDQgKi8gQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwgQlRfTk1TVFJULAorLyogMHg0OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDRDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NTAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg1NCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDU4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX0xTUUIsCisvKiAweDVDICovIEJUX09USEVSLCBCVF9SU1FCLCBCVF9PVEhFUiwgQlRfTk1TVFJULAorLyogMHg2MCAqLyBCVF9PVEhFUiwgQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwKKy8qIDB4NjQgKi8gQlRfSEVYLCBCVF9IRVgsIEJUX0hFWCwgQlRfTk1TVFJULAorLyogMHg2OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDZDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4NzAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHg3NCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweDc4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHg3QyAqLyBCVF9WRVJCQVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvaW50ZXJuYWwuaCBiL2V4cGF0LTIuMC4xL2xpYi9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkNTQ1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvaW50ZXJuYWwuaApAQCAtMCwwICsxLDczIEBACisvKiBpbnRlcm5hbC5oCisKKyAgIEludGVybmFsIGRlZmluaXRpb25zIHVzZWQgYnkgRXhwYXQuICBUaGlzIGlzIG5vdCBuZWVkZWQgdG8gY29tcGlsZQorICAgY2xpZW50IGNvZGUuCisKKyAgIFRoZSBmb2xsb3dpbmcgY2FsbGluZyBjb252ZW50aW9uIG1hY3JvcyBhcmUgZGVmaW5lZCBmb3IgZnJlcXVlbnRseQorICAgY2FsbGVkIGZ1bmN0aW9uczoKKworICAgRkFTVENBTEwgICAgLSBVc2VkIGZvciB0aG9zZSBpbnRlcm5hbCBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgc2ltcGxlCisgICAgICAgICAgICAgICAgIGJvZHkgYW5kIGEgbG93IG51bWJlciBvZiBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcy4KKworICAgUFRSQ0FMTCAgICAgLSBVc2VkIGZvciBmdW5jdGlvbnMgY2FsbGVkIHRob3VnaCBmdW5jdGlvbiBwb2ludGVycy4KKworICAgUFRSRkFTVENBTEwgLSBMaWtlIFBUUkNBTEwsIGJ1dCBmb3IgbG93IG51bWJlciBvZiBhcmd1bWVudHMuCisKKyAgIGlubGluZSAgICAgIC0gVXNlZCBmb3Igc2VsZWN0ZWQgaW50ZXJuYWwgZnVuY3Rpb25zIGZvciB3aGljaCBpbmxpbmluZworICAgICAgICAgICAgICAgICBtYXkgaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzb21lIHBsYXRmb3Jtcy4KKworICAgTm90ZTogVXNlIG9mIHRoZXNlIG1hY3JvcyBpcyBiYXNlZCBvbiBqdWRnZW1lbnQsIG5vdCBoYXJkIHJ1bGVzLAorICAgICAgICAgYW5kIHRoZXJlZm9yZSBzdWJqZWN0IHRvIGNoYW5nZS4KKyovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKy8qIFdlJ2xsIHVzZSB0aGlzIHZlcnNpb24gYnkgZGVmYXVsdCBvbmx5IHdoZXJlIHdlIGtub3cgaXQgaGVscHMuCisKKyAgIHJlZ3Bhcm0oKSBnZW5lcmF0ZXMgd2FybmluZ3Mgb24gU29sYXJpcyBib3hlcy4gICBTZWUgU0YgYnVnICM2OTI4NzguCisKKyAgIEluc3RhYmlsaXR5IHJlcG9ydGVkIHdpdGggZWdjcyBvbiBhIFJlZEhhdCBMaW51eCA3LjMuCisgICBMZXQncyBjb21tZW50IG91dDoKKyAgICNkZWZpbmUgRkFTVENBTEwgX19hdHRyaWJ1dGVfXygoc3RkY2FsbCwgcmVncGFybSgzKSkpCisgICBhbmQgbGV0J3MgdHJ5IHRoaXM6CisqLworI2RlZmluZSBGQVNUQ0FMTCBfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpKSkKKyNkZWZpbmUgUFRSRkFTVENBTEwgX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSkpCisjZW5kaWYKKworLyogVXNpbmcgX19mYXN0Y2FsbCBzZWVtcyB0byBoYXZlIGFuIHVuZXhwZWN0ZWQgbmVnYXRpdmUgZWZmZWN0IHVuZGVyCisgICBNUyBWQysrLCBlc3BlY2lhbGx5IGZvciBmdW5jdGlvbiBwb2ludGVycywgc28gd2Ugd29uJ3QgdXNlIGl0IGZvcgorICAgbm93IG9uIHRoYXQgcGxhdGZvcm0uIEl0IG1heSBiZSByZWNvbnNpZGVyZWQgZm9yIGEgZnV0dXJlIHJlbGVhc2UKKyAgIGlmIGl0IGNhbiBiZSBtYWRlIG1vcmUgZWZmZWN0aXZlLgorICAgTGlrZWx5IHJlYXNvbjogX19mYXN0Y2FsbCBvbiBXaW5kb3dzIGlzIGxpa2Ugc3RkY2FsbCwgdGhlcmVmb3JlCisgICB0aGUgY29tcGlsZXIgY2Fubm90IHBlcmZvcm0gc3RhY2sgb3B0aW1pemF0aW9ucyBmb3IgY2FsbCBjbHVzdGVycy4KKyovCisKKy8qIE1ha2Ugc3VyZSBhbGwgb2YgdGhlc2UgYXJlIGRlZmluZWQgaWYgdGhleSBhcmVuJ3QgYWxyZWFkeS4gKi8KKworI2lmbmRlZiBGQVNUQ0FMTAorI2RlZmluZSBGQVNUQ0FMTAorI2VuZGlmCisKKyNpZm5kZWYgUFRSQ0FMTAorI2RlZmluZSBQVFJDQUxMCisjZW5kaWYKKworI2lmbmRlZiBQVFJGQVNUQ0FMTAorI2RlZmluZSBQVFJGQVNUQ0FMTAorI2VuZGlmCisKKyNpZm5kZWYgWE1MX01JTl9TSVpFCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpICYmICFkZWZpbmVkKGlubGluZSkKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmCisjZW5kaWYgLyogWE1MX01JTl9TSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBpbmxpbmUgaW5saW5lCisjZWxzZQorI2lmbmRlZiBpbmxpbmUKKyNkZWZpbmUgaW5saW5lCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL2xhdGluMXRhYi5oIGIvZXhwYXQtMi4wLjEvbGliL2xhdGluMXRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzYzI1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbGF0aW4xdGFiLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKy8qIDB4ODAgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweDg0ICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHg4OCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4OEMgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweDkwICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHg5NCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4OTggKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweDlDICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHhBMCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4QTQgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweEE4ICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfTk1TVFJULCBCVF9PVEhFUiwKKy8qIDB4QUMgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCisvKiAweEIwICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAorLyogMHhCNCAqLyBCVF9PVEhFUiwgQlRfTk1TVFJULCBCVF9PVEhFUiwgQlRfTkFNRSwKKy8qIDB4QjggKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHhCQyAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKKy8qIDB4QzAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhDNCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEM4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4Q0MgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhEMCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEQ0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHhEOCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweERDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4RTAgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhFNCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEU4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKKy8qIDB4RUMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAorLyogMHhGMCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEY0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX09USEVSLAorLyogMHhGOCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCisvKiAweEZDICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9saWJleHBhdC5kZWYgYi9leHBhdC0yLjAuMS9saWIvbGliZXhwYXQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5MjBiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbGliZXhwYXQuZGVmCkBAIC0wLDAgKzEsNzMgQEAKKzsgREVGIGZpbGUgZm9yIE1TIFZDKysKKworTElCUkFSWQorRVhQT1JUUworICBYTUxfRGVmYXVsdEN1cnJlbnQgQDEKKyAgWE1MX0Vycm9yU3RyaW5nIEAyCisgIFhNTF9FeHBhdFZlcnNpb24gQDMKKyAgWE1MX0V4cGF0VmVyc2lvbkluZm8gQDQKKyAgWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlIEA1CisgIFhNTF9HZXRCYXNlIEA2CisgIFhNTF9HZXRCdWZmZXIgQDcKKyAgWE1MX0dldEN1cnJlbnRCeXRlQ291bnQgQDgKKyAgWE1MX0dldEN1cnJlbnRCeXRlSW5kZXggQDkKKyAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgQDEwCisgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciBAMTEKKyAgWE1MX0dldEVycm9yQ29kZSBAMTIKKyAgWE1MX0dldElkQXR0cmlidXRlSW5kZXggQDEzCisgIFhNTF9HZXRJbnB1dENvbnRleHQgQDE0CisgIFhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCBAMTUKKyAgWE1MX1BhcnNlIEAxNgorICBYTUxfUGFyc2VCdWZmZXIgQDE3CisgIFhNTF9QYXJzZXJDcmVhdGUgQDE4CisgIFhNTF9QYXJzZXJDcmVhdGVOUyBAMTkKKyAgWE1MX1BhcnNlckNyZWF0ZV9NTSBAMjAKKyAgWE1MX1BhcnNlckZyZWUgQDIxCisgIFhNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIgQDIyCisgIFhNTF9TZXRCYXNlIEAyMworICBYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlciBAMjQKKyAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIEAyNQorICBYTUxfU2V0Q29tbWVudEhhbmRsZXIgQDI2CisgIFhNTF9TZXREZWZhdWx0SGFuZGxlciBAMjcKKyAgWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kIEAyOAorICBYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyIEAyOQorICBYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyIEAzMAorICBYTUxfU2V0RWxlbWVudEhhbmRsZXIgQDMxCisgIFhNTF9TZXRFbmNvZGluZyBAMzIKKyAgWE1MX1NldEVuZENkYXRhU2VjdGlvbkhhbmRsZXIgQDMzCisgIFhNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIgQDM0CisgIFhNTF9TZXRFbmRFbGVtZW50SGFuZGxlciBAMzUKKyAgWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyIEAzNgorICBYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIgQDM3CisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgQDM4CisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgQDM5CisgIFhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlciBANDAKKyAgWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyIEA0MQorICBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciBANDIKKyAgWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyBANDMKKyAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgQDQ0CisgIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQgQDQ1CisgIFhNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgQDQ2CisgIFhNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlciBANDcKKyAgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIgQDQ4CisgIFhNTF9TZXRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIEA0OQorICBYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciBANTAKKyAgWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgQDUxCisgIFhNTF9TZXRVc2VyRGF0YSBANTIKKyAgWE1MX1NldFhtbERlY2xIYW5kbGVyIEA1MworICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnIEA1NAorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS4zCisgIFhNTF9QYXJzZXJSZXNldCBANTUKKyAgWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyIEA1NgorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS41CisgIFhNTF9HZXRGZWF0dXJlTGlzdCBANTcKKyAgWE1MX1VzZUZvcmVpZ25EVEQgQDU4Cis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjYKKyAgWE1MX0ZyZWVDb250ZW50TW9kZWwgQDU5CisgIFhNTF9NZW1NYWxsb2MgQDYwCisgIFhNTF9NZW1SZWFsbG9jIEA2MQorICBYTUxfTWVtRnJlZSBANjIKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuOAorICBYTUxfU3RvcFBhcnNlciBANjMKKyAgWE1MX1Jlc3VtZVBhcnNlciBANjQKKyAgWE1MX0dldFBhcnNpbmdTdGF0dXMgQDY1CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvbGliZXhwYXR3LmRlZiBiL2V4cGF0LTIuMC4xL2xpYi9saWJleHBhdHcuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5MjBiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbGliZXhwYXR3LmRlZgpAQCAtMCwwICsxLDczIEBACis7IERFRiBmaWxlIGZvciBNUyBWQysrCisKK0xJQlJBUlkKK0VYUE9SVFMKKyAgWE1MX0RlZmF1bHRDdXJyZW50IEAxCisgIFhNTF9FcnJvclN0cmluZyBAMgorICBYTUxfRXhwYXRWZXJzaW9uIEAzCisgIFhNTF9FeHBhdFZlcnNpb25JbmZvIEA0CisgIFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSBANQorICBYTUxfR2V0QmFzZSBANgorICBYTUxfR2V0QnVmZmVyIEA3CisgIFhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50IEA4CisgIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4IEA5CisgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyIEAxMAorICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIgQDExCisgIFhNTF9HZXRFcnJvckNvZGUgQDEyCisgIFhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4IEAxMworICBYTUxfR2V0SW5wdXRDb250ZXh0IEAxNAorICBYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQgQDE1CisgIFhNTF9QYXJzZSBAMTYKKyAgWE1MX1BhcnNlQnVmZmVyIEAxNworICBYTUxfUGFyc2VyQ3JlYXRlIEAxOAorICBYTUxfUGFyc2VyQ3JlYXRlTlMgQDE5CisgIFhNTF9QYXJzZXJDcmVhdGVfTU0gQDIwCisgIFhNTF9QYXJzZXJGcmVlIEAyMQorICBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyIEAyMgorICBYTUxfU2V0QmFzZSBAMjMKKyAgWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIgQDI0CisgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciBAMjUKKyAgWE1MX1NldENvbW1lbnRIYW5kbGVyIEAyNgorICBYTUxfU2V0RGVmYXVsdEhhbmRsZXIgQDI3CisgIFhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCBAMjgKKyAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciBAMjkKKyAgWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciBAMzAKKyAgWE1MX1NldEVsZW1lbnRIYW5kbGVyIEAzMQorICBYTUxfU2V0RW5jb2RpbmcgQDMyCisgIFhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyIEAzMworICBYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyIEAzNAorICBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIgQDM1CisgIFhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciBAMzYKKyAgWE1MX1NldEVudGl0eURlY2xIYW5kbGVyIEAzNworICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIEAzOAorICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnIEAzOQorICBYTUxfU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIgQDQwCisgIFhNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlciBANDEKKyAgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIgQDQyCisgIFhNTF9TZXRQYXJhbUVudGl0eVBhcnNpbmcgQDQzCisgIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIEA0NAorICBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0IEA0NQorICBYTUxfU2V0U3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIEA0NgorICBYTUxfU2V0U3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgQDQ3CisgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyIEA0OAorICBYTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBANDkKKyAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIgQDUwCisgIFhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIEA1MQorICBYTUxfU2V0VXNlckRhdGEgQDUyCisgIFhNTF9TZXRYbWxEZWNsSGFuZGxlciBANTMKKyAgWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyBANTQKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuMworICBYTUxfUGFyc2VyUmVzZXQgQDU1CisgIFhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlciBANTYKKzsgYWRkZWQgd2l0aCB2ZXJzaW9uIDEuOTUuNQorICBYTUxfR2V0RmVhdHVyZUxpc3QgQDU3CisgIFhNTF9Vc2VGb3JlaWduRFREIEA1OAorOyBhZGRlZCB3aXRoIHZlcnNpb24gMS45NS42CisgIFhNTF9GcmVlQ29udGVudE1vZGVsIEA1OQorICBYTUxfTWVtTWFsbG9jIEA2MAorICBYTUxfTWVtUmVhbGxvYyBANjEKKyAgWE1MX01lbUZyZWUgQDYyCis7IGFkZGVkIHdpdGggdmVyc2lvbiAxLjk1LjgKKyAgWE1MX1N0b3BQYXJzZXIgQDYzCisgIFhNTF9SZXN1bWVQYXJzZXIgQDY0CisgIFhNTF9HZXRQYXJzaW5nU3RhdHVzIEA2NQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL21hY2NvbmZpZy5oIGIvZXhwYXQtMi4wLjEvbGliL21hY2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3MjVjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbWFjY29uZmlnLmgKQEAgLTAsMCArMSw1MyBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKiBDb3B5cmlnaHQgMjAwMCwgQ2xhcmsgQ29vcGVyCisqKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSwgb3IgbW9kaWZ5CisqKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVC9YIGxpY2Vuc2UgKGNvbnRhaW5lZCBpbiB0aGUgQ09QWUlORyBmaWxlCisqKiB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uLikKKyoqCisqLworCisjaWZuZGVmIE1BQ0NPTkZJR19ICisjZGVmaW5lIE1BQ0NPTkZJR19ICisKKworLyogMTIzNCA9IExJTF9FTkRJQU4sIDQzMjEgPSBCSUdFTkRJQU4gKi8KKyNkZWZpbmUgQllURU9SREVSICA0MzIxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYmNvcHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQkNPUFkKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NRU1NT1ZFCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogd2hldGhlciBieXRlb3JkZXIgaXMgYmlnZW5kaWFuICovCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTgorCisvKiBEZWZpbmUgdG8gc3BlY2lmeSBob3cgbXVjaCBjb250ZXh0IHRvIHJldGFpbiBhcm91bmQgdGhlIGN1cnJlbnQgcGFyc2UKKyAgIHBvaW50LiAqLworI3VuZGVmIFhNTF9DT05URVhUX0JZVEVTCisKKy8qIERlZmluZSB0byBtYWtlIHBhcmFtZXRlciBlbnRpdHkgcGFyc2luZyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgWE1MX0RURAorCisvKiBEZWZpbmUgdG8gbWFrZSBYTUwgTmFtZXNwYWNlcyBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgWE1MX05TCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjZGVmaW5lIG9mZl90ICBsb25nCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNpemVfdAorCisKKyNlbmRpZiAvKiBpZm5kZWYgTUFDQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi9uYW1ldGFiLmggYi9leHBhdC0yLjAuMS9saWIvbmFtZXRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIwNWU2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIvbmFtZXRhYi5oCkBAIC0wLDAgKzEsMTUwIEBACitzdGF0aWMgY29uc3QgdW5zaWduZWQgbmFtaW5nQml0bWFwW10gPSB7CisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorMHgwMDAwMDAwMCwgMHgwNDAwMDAwMCwgMHg4N0ZGRkZGRSwgMHgwN0ZGRkZGRSwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkY3RkZGRkYsIDB4RkY3RkZGRkYsCisweEZGRkZGRkZGLCAweDdGRjNGRkZGLCAweEZGRkZGREZFLCAweDdGRkZGRkZGLAorMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRTAwRiwgMHhGQzMxRkZGRiwKKzB4MDBGRkZGRkYsIDB4MDAwMDAwMDAsIDB4RkZGRjAwMDAsIDB4RkZGRkZGRkYsCisweEZGRkZGRkZGLCAweEY4MDAwMUZGLCAweDAwMDAwMDAzLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4RkZGRkQ3NDAsIDB4RkZGRkZGRkIsIDB4NTQ3RjdGRkYsIDB4MDAwRkZGRkQsCisweEZGRkZERkZFLCAweEZGRkZGRkZGLCAweERGRkVGRkZGLCAweEZGRkZGRkZGLAorMHhGRkZGMDAwMywgMHhGRkZGRkZGRiwgMHhGRkZGMTk5RiwgMHgwMzNGQ0ZGRiwKKzB4MDAwMDAwMDAsIDB4RkZGRTAwMDAsIDB4MDI3RkZGRkYsIDB4RkZGRkZGRkUsCisweDAwMDAwMDdGLCAweDAwMDAwMDAwLCAweEZGRkYwMDAwLCAweDAwMDcwN0ZGLAorMHgwMDAwMDAwMCwgMHgwN0ZGRkZGRSwgMHgwMDAwMDdGRSwgMHhGRkZFMDAwMCwKKzB4RkZGRkZGRkYsIDB4N0NGRkZGRkYsIDB4MDAyRjdGRkYsIDB4MDAwMDAwNjAsCisweEZGRkZGRkUwLCAweDIzRkZGRkZGLCAweEZGMDAwMDAwLCAweDAwMDAwMDAzLAorMHhGRkY5OUZFMCwgMHgwM0M1RkRGRiwgMHhCMDAwMDAwMCwgMHgwMDAzMDAwMywKKzB4RkZGOTg3RTAsIDB4MDM2REZERkYsIDB4NUUwMDAwMDAsIDB4MDAxQzAwMDAsCisweEZGRkJBRkUwLCAweDIzRURGREZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLAorMHhGRkY5OUZFMCwgMHgyM0NERkRGRiwgMHhCMDAwMDAwMCwgMHgwMDAwMDAwMywKKzB4RDYzREM3RTAsIDB4MDNCRkM3MTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweEZGRkRERkUwLCAweDAzRUZGREZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAzLAorMHhGRkZEREZFMCwgMHgwM0VGRkRGRiwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMywKKzB4RkZGRERGRTAsIDB4MDNGRkZERkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDMsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHhGRkZGRkZGRSwgMHgwMDBEN0ZGRiwgMHgwMDAwMDAzRiwgMHgwMDAwMDAwMCwKKzB4RkVGMDI1OTYsIDB4MjAwRDZDQUUsIDB4MDAwMDAwMUYsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRUZGLCAweDAwMDAwM0ZGLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkYwMDNGLCAweDAwN0ZGRkZGLAorMHgwMDA3REFFRCwgMHg1MDAwMDAwMCwgMHg4MjMxNTAwMSwgMHgwMDJDNjJBQiwKKzB4NDAwMDAwMDAsIDB4RjU4MEM5MDAsIDB4MDAwMDAwMDcsIDB4MDIwMTA4MDAsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorMHgwRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwM0ZGRkZGRiwKKzB4M0YzRkZGRkYsIDB4RkZGRkZGRkYsIDB4QUFGRjNGM0YsIDB4M0ZGRkZGRkYsCisweEZGRkZGRkZGLCAweDVGREZGRkZGLCAweDBGQ0YxRkRDLCAweDFGREMxRkZGLAorMHgwMDAwMDAwMCwgMHgwMDAwNEM0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDcsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDgwLCAweDAwMDAwM0ZFLCAweEZGRkZGRkZFLCAweEZGRkZGRkZGLAorMHgwMDFGRkZGRiwgMHhGRkZGRkZGRSwgMHhGRkZGRkZGRiwgMHgwN0ZGRkZGRiwKKzB4RkZGRkZGRTAsIDB4MDAwMDFGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKKzB4RkZGRkZGRkYsIDB4MDAwMDAwM0YsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorMHhGRkZGRkZGRiwgMHgwMDAwMDAwRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDdGRjYwMDAsIDB4ODdGRkZGRkUsIDB4MDdGRkZGRkUsCisweDAwMDAwMDAwLCAweDAwODAwMDAwLCAweEZGN0ZGRkZGLCAweEZGN0ZGRkZGLAorMHgwMEZGRkZGRiwgMHgwMDAwMDAwMCwgMHhGRkZGMDAwMCwgMHhGRkZGRkZGRiwKKzB4RkZGRkZGRkYsIDB4RjgwMDAxRkYsIDB4MDAwMzAwMDMsIDB4MDAwMDAwMDAsCisweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDNGLCAweDAwMDAwMDAzLAorMHhGRkZGRDdDMCwgMHhGRkZGRkZGQiwgMHg1NDdGN0ZGRiwgMHgwMDBGRkZGRCwKKzB4RkZGRkRGRkUsIDB4RkZGRkZGRkYsIDB4REZGRUZGRkYsIDB4RkZGRkZGRkYsCisweEZGRkYwMDdCLCAweEZGRkZGRkZGLCAweEZGRkYxOTlGLCAweDAzM0ZDRkZGLAorMHgwMDAwMDAwMCwgMHhGRkZFMDAwMCwgMHgwMjdGRkZGRiwgMHhGRkZGRkZGRSwKKzB4RkZGRTAwN0YsIDB4QkJGRkZGRkIsIDB4RkZGRjAwMTYsIDB4MDAwNzA3RkYsCisweDAwMDAwMDAwLCAweDA3RkZGRkZFLCAweDAwMDdGRkZGLCAweEZGRkYwM0ZGLAorMHhGRkZGRkZGRiwgMHg3Q0ZGRkZGRiwgMHhGRkVGN0ZGRiwgMHgwM0ZGM0RGRiwKKzB4RkZGRkZGRUUsIDB4RjNGRkZGRkYsIDB4RkYxRTNGRkYsIDB4MDAwMEZGQ0YsCisweEZGRjk5RkVFLCAweEQzQzVGREZGLCAweEIwODAzOTlGLCAweDAwMDNGRkNGLAorMHhGRkY5ODdFNCwgMHhEMzZERkRGRiwgMHg1RTAwMzk4NywgMHgwMDFGRkZDMCwKKzB4RkZGQkFGRUUsIDB4RjNFREZERkYsIDB4MDAwMDNCQkYsIDB4MDAwMEZGQzEsCisweEZGRjk5RkVFLCAweEYzQ0RGREZGLCAweEIwQzAzOThGLCAweDAwMDBGRkMzLAorMHhENjNEQzdFQywgMHhDM0JGQzcxOCwgMHgwMDgwM0RDNywgMHgwMDAwRkY4MCwKKzB4RkZGRERGRUUsIDB4QzNFRkZERkYsIDB4MDA2MDNEREYsIDB4MDAwMEZGQzMsCisweEZGRkRERkVDLCAweEMzRUZGREZGLCAweDQwNjAzRERGLCAweDAwMDBGRkMzLAorMHhGRkZEREZFQywgMHhDM0ZGRkRGRiwgMHgwMDgwM0RDRiwgMHgwMDAwRkZDMywKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweEZGRkZGRkZFLCAweDA3RkY3RkZGLCAweDAzRkY3RkZGLCAweDAwMDAwMDAwLAorMHhGRUYwMjU5NiwgMHgzQkZGNkNBRSwgMHgwM0ZGM0Y1RiwgMHgwMDAwMDAwMCwKKzB4MDMwMDAwMDAsIDB4QzJBMDAzRkYsIDB4RkZGRkZFRkYsIDB4RkZGRTAzRkYsCisweEZFQkYwRkRGLCAweDAyRkUzRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MUZGRjAwMDAsIDB4MDAwMDAwMDIsCisweDAwMDAwMEEwLCAweDAwM0VGRkZFLCAweEZGRkZGRkZFLCAweEZGRkZGRkZGLAorMHg2NjFGRkZGRiwgMHhGRkZGRkZGRSwgMHhGRkZGRkZGRiwgMHg3N0ZGRkZGRiwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBubXN0cnRQYWdlc1tdID0geworMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwMCwKKzB4MDAsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCisweDEwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgxMywKKzB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgxNSwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MTcsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDE4LAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmFtZVBhZ2VzW10gPSB7CisweDE5LCAweDAzLCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDAwLAorMHgwMCwgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwKKzB4MTAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDEzLAorMHgyNiwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDI3LCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgxNywKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKzB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MTgsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvdXRmOHRhYi5oIGIvZXhwYXQtMi4wLjEvbGliL3V0Zjh0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YmIzZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3V0Zjh0YWIuaApAQCAtMCwwICsxLDM3IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworCisvKiAweDgwICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHg4NCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4ODggKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweDhDICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHg5MCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4OTQgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweDk4ICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHg5QyAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4QTAgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweEE0ICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHhBOCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4QUMgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweEIwICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHhCNCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKKy8qIDB4QjggKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCisvKiAweEJDICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAorLyogMHhDMCAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKKy8qIDB4QzQgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCisvKiAweEM4ICovIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLAorLyogMHhDQyAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKKy8qIDB4RDAgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCisvKiAweEQ0ICovIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLAorLyogMHhEOCAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKKy8qIDB4REMgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCisvKiAweEUwICovIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLAorLyogMHhFNCAqLyBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLCBCVF9MRUFEMywKKy8qIDB4RTggKi8gQlRfTEVBRDMsIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsCisvKiAweEVDICovIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLAorLyogMHhGMCAqLyBCVF9MRUFENCwgQlRfTEVBRDQsIEJUX0xFQUQ0LCBCVF9MRUFENCwKKy8qIDB4RjQgKi8gQlRfTEVBRDQsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCisvKiAweEY4ICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKKy8qIDB4RkMgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX01BTEZPUk0sIEJUX01BTEZPUk0sCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIvd2luY29uZmlnLmggYi9leHBhdC0yLjAuMS9saWIvd2luY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzFiNzkxZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi93aW5jb25maWcuaApAQCAtMCwwICsxLDMwIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoqIENvcHlyaWdodCAyMDAwLCBDbGFyayBDb29wZXIKKyoqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKgorKiogVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiBZb3UgYXJlIHBlcm1pdHRlZCB0byBjb3B5LCBkaXN0cmlidXRlLCBvciBtb2RpZnkKKyoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUL1ggbGljZW5zZSAoY29udGFpbmVkIGluIHRoZSBDT1BZSU5HIGZpbGUKKyoqIHdpdGggdGhpcyBkaXN0cmlidXRpb24uKQorKi8KKworI2lmbmRlZiBXSU5DT05GSUdfSAorI2RlZmluZSBXSU5DT05GSUdfSAorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorCisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgWE1MX05TIDEKKyNkZWZpbmUgWE1MX0RURCAxCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKKworLyogd2Ugd2lsbCBhc3N1bWUgYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGFyZSBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIEJZVEVPUkRFUiAxMjM0CisKKy8qIFdpbmRvd3MgaGFzIG1lbW1vdmUoKSBhdmFpbGFibGUuICovCisjZGVmaW5lIEhBVkVfTUVNTU9WRQorCisjZW5kaWYgLyogbmRlZiBXSU5DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL3htbHBhcnNlLmMgYi9leHBhdC0yLjAuMS9saWIveG1scGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGUzMWRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3htbHBhcnNlLmMKQEAgLTAsMCArMSw2Mjg3IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgICAgICAgICAgICAgICAgIC8qIG1lbXNldCgpLCBtZW1jcHkoKSAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIFhNTF9CVUlMRElOR19FWFBBVCAxCisKKyNpZmRlZiBDT01QSUxFRF9GUk9NX0RTUAorI2luY2x1ZGUgIndpbmNvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQorI2luY2x1ZGUgIm1hY2NvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX2FtaWdhb3M0X18pCisjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjaW5jbHVkZSAid2F0Y29tY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKEhBVkVfRVhQQVRfQ09ORklHX0gpCisjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CisjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLworCisjaW5jbHVkZSAiYXNjaWkuaCIKKyNpbmNsdWRlICJleHBhdC5oIgorCisjaWZkZWYgWE1MX1VOSUNPREUKKyNkZWZpbmUgWE1MX0VOQ09ERV9NQVggWE1MX1VURjE2X0VOQ09ERV9NQVgKKyNkZWZpbmUgWG1sQ29udmVydCBYbWxVdGYxNkNvbnZlcnQKKyNkZWZpbmUgWG1sR2V0SW50ZXJuYWxFbmNvZGluZyBYbWxHZXRVdGYxNkludGVybmFsRW5jb2RpbmcKKyNkZWZpbmUgWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TIFhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZ05TCisjZGVmaW5lIFhtbEVuY29kZSBYbWxVdGYxNkVuY29kZQorLyogVXNpbmcgcG9pbnRlciBzdWJ0cmFjdGlvbiB0byBjb252ZXJ0IHRvIGludGVnZXIgdHlwZS4gKi8KKyNkZWZpbmUgTVVTVF9DT05WRVJUKGVuYywgcykgKCEoZW5jKS0+aXNVdGYxNiB8fCAoKChjaGFyICopKHMpIC0gKGNoYXIgKilOVUxMKSAmIDEpKQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBJQ0hBUjsKKyNlbHNlCisjZGVmaW5lIFhNTF9FTkNPREVfTUFYIFhNTF9VVEY4X0VOQ09ERV9NQVgKKyNkZWZpbmUgWG1sQ29udmVydCBYbWxVdGY4Q29udmVydAorI2RlZmluZSBYbWxHZXRJbnRlcm5hbEVuY29kaW5nIFhtbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nCisjZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmdOUyBYbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZ05TCisjZGVmaW5lIFhtbEVuY29kZSBYbWxVdGY4RW5jb2RlCisjZGVmaW5lIE1VU1RfQ09OVkVSVChlbmMsIHMpICghKGVuYyktPmlzVXRmOCkKK3R5cGVkZWYgY2hhciBJQ0hBUjsKKyNlbmRpZgorCisKKyNpZm5kZWYgWE1MX05TCisKKyNkZWZpbmUgWG1sSW5pdEVuY29kaW5nTlMgWG1sSW5pdEVuY29kaW5nCisjZGVmaW5lIFhtbEluaXRVbmtub3duRW5jb2RpbmdOUyBYbWxJbml0VW5rbm93bkVuY29kaW5nCisjdW5kZWYgWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TCisjZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmdOUyBYbWxHZXRJbnRlcm5hbEVuY29kaW5nCisjZGVmaW5lIFhtbFBhcnNlWG1sRGVjbE5TIFhtbFBhcnNlWG1sRGVjbAorCisjZW5kaWYKKworI2lmZGVmIFhNTF9VTklDT0RFCisKKyNpZmRlZiBYTUxfVU5JQ09ERV9XQ0hBUl9UCisjZGVmaW5lIFhNTF9UKHgpIChjb25zdCB3Y2hhcl90KXgKKyNkZWZpbmUgWE1MX0woeCkgTCAjIyB4CisjZWxzZQorI2RlZmluZSBYTUxfVCh4KSAoY29uc3QgdW5zaWduZWQgc2hvcnQpeAorI2RlZmluZSBYTUxfTCh4KSB4CisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBYTUxfVCh4KSB4CisjZGVmaW5lIFhNTF9MKHgpIHgKKworI2VuZGlmCisKKy8qIFJvdW5kIHVwIG4gdG8gYmUgYSBtdWx0aXBsZSBvZiBzeiwgd2hlcmUgc3ogaXMgYSBwb3dlciBvZiAyLiAqLworI2RlZmluZSBST1VORF9VUChuLCBzeikgKCgobikgKyAoKHN6KSAtIDEpKSAmIH4oKHN6KSAtIDEpKQorCisvKiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWVtbW92ZSgpIGRvZXNuJ3QgZXhpc3QuICovCisjaWZuZGVmIEhBVkVfTUVNTU9WRQorI2lmZGVmIEhBVkVfQkNPUFkKKyNkZWZpbmUgbWVtbW92ZShkLHMsbCkgYmNvcHkoKHMpLChkKSwobCkpCisjZWxzZQorI2Vycm9yIG1lbW1vdmUgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBwbGF0Zm9ybSwgbm9yIGlzIGEgc3Vic3RpdHV0ZSBhdmFpbGFibGUKKyNlbmRpZiAvKiBIQVZFX0JDT1BZICovCisjZW5kaWYgLyogSEFWRV9NRU1NT1ZFICovCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInhtbHRvay5oIgorI2luY2x1ZGUgInhtbHJvbGUuaCIKKwordHlwZWRlZiBjb25zdCBYTUxfQ2hhciAqS0VZOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEtFWSBuYW1lOworfSBOQU1FRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBOQU1FRCAqKnY7CisgIHVuc2lnbmVkIGNoYXIgcG93ZXI7CisgIHNpemVfdCBzaXplOworICBzaXplX3QgdXNlZDsKKyAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtOworfSBIQVNIX1RBQkxFOworCisvKiBCYXNpYyBjaGFyYWN0ZXIgaGFzaCBhbGdvcml0aG0sIHRha2VuIGZyb20gUHl0aG9uJ3Mgc3RyaW5nIGhhc2g6CisgICBoID0gaCAqIDEwMDAwMDMgXiBjaGFyYWN0ZXIsIHRoZSBjb25zdGFudCBiZWluZyBhIHByaW1lIG51bWJlci4KKworKi8KKyNpZmRlZiBYTUxfVU5JQ09ERQorI2RlZmluZSBDSEFSX0hBU0goaCwgYykgXAorICAoKChoKSAqIDB4RjQyNDMpIF4gKHVuc2lnbmVkIHNob3J0KShjKSkKKyNlbHNlCisjZGVmaW5lIENIQVJfSEFTSChoLCBjKSBcCisgICgoKGgpICogMHhGNDI0MykgXiAodW5zaWduZWQgY2hhcikoYykpCisjZW5kaWYKKworLyogRm9yIHByb2JpbmcgKGFmdGVyIGEgY29sbGlzaW9uKSB3ZSBuZWVkIGEgc3RlcCBzaXplIHJlbGF0aXZlIHByaW1lCisgICB0byB0aGUgaGFzaCB0YWJsZSBzaXplLCB3aGljaCBpcyBhIHBvd2VyIG9mIDIuIFdlIHVzZSBkb3VibGUtaGFzaGluZywKKyAgIHNpbmNlIHdlIGNhbiBjYWxjdWxhdGUgYSBzZWNvbmQgaGFzaCB2YWx1ZSBjaGVhcGx5IGJ5IHRha2luZyB0aG9zZSBiaXRzCisgICBvZiB0aGUgZmlyc3QgaGFzaCB2YWx1ZSB0aGF0IHdlcmUgZGlzY2FyZGVkIChtYXNrZWQgb3V0KSB3aGVuIHRoZSB0YWJsZQorICAgaW5kZXggd2FzIGNhbGN1bGF0ZWQ6IGluZGV4ID0gaGFzaCAmIG1hc2ssIHdoZXJlIG1hc2sgPSB0YWJsZS0+c2l6ZSAtIDEuCisgICBXZSBsaW1pdCB0aGUgbWF4aW11bSBzdGVwIHNpemUgdG8gdGFibGUtPnNpemUgLyA0IChtYXNrID4+IDIpIGFuZCBtYWtlCisgICBpdCBvZGQsIHNpbmNlIG9kZCBudW1iZXJzIGFyZSBhbHdheXMgcmVsYXRpdmUgcHJpbWUgdG8gYSBwb3dlciBvZiAyLgorKi8KKyNkZWZpbmUgU0VDT05EX0hBU0goaGFzaCwgbWFzaywgcG93ZXIpIFwKKyAgKCgoKGhhc2gpICYgfihtYXNrKSkgPj4gKChwb3dlcikgLSAxKSkgJiAoKG1hc2spID4+IDIpKQorI2RlZmluZSBQUk9CRV9TVEVQKGhhc2gsIG1hc2ssIHBvd2VyKSBcCisgICgodW5zaWduZWQgY2hhcikoKFNFQ09ORF9IQVNIKGhhc2gsIG1hc2ssIHBvd2VyKSkgfCAxKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICBOQU1FRCAqKnA7CisgIE5BTUVEICoqZW5kOworfSBIQVNIX1RBQkxFX0lURVI7CisKKyNkZWZpbmUgSU5JVF9UQUdfQlVGX1NJWkUgMzIgIC8qIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzaXplb2YoWE1MX0NoYXIpICovCisjZGVmaW5lIElOSVRfREFUQV9CVUZfU0laRSAxMDI0CisjZGVmaW5lIElOSVRfQVRUU19TSVpFIDE2CisjZGVmaW5lIElOSVRfQVRUU19WRVJTSU9OIDB4RkZGRkZGRkYKKyNkZWZpbmUgSU5JVF9CTE9DS19TSVpFIDEwMjQKKyNkZWZpbmUgSU5JVF9CVUZGRVJfU0laRSAxMDI0CisKKyNkZWZpbmUgRVhQQU5EX1NQQVJFIDI0CisKK3R5cGVkZWYgc3RydWN0IGJpbmRpbmcgeworICBzdHJ1Y3QgcHJlZml4ICpwcmVmaXg7CisgIHN0cnVjdCBiaW5kaW5nICpuZXh0VGFnQmluZGluZzsKKyAgc3RydWN0IGJpbmRpbmcgKnByZXZQcmVmaXhCaW5kaW5nOworICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2lkICphdHRJZDsKKyAgWE1MX0NoYXIgKnVyaTsKKyAgaW50IHVyaUxlbjsKKyAgaW50IHVyaUFsbG9jOworfSBCSU5ESU5HOworCit0eXBlZGVmIHN0cnVjdCBwcmVmaXggeworICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgQklORElORyAqYmluZGluZzsKK30gUFJFRklYOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IFhNTF9DaGFyICpzdHI7CisgIGNvbnN0IFhNTF9DaGFyICpsb2NhbFBhcnQ7CisgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXg7CisgIGludCBzdHJMZW47CisgIGludCB1cmlMZW47CisgIGludCBwcmVmaXhMZW47Cit9IFRBR19OQU1FOworCisvKiBUQUcgcmVwcmVzZW50cyBhbiBvcGVuIGVsZW1lbnQuCisgICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpcyBzdG9yZWQgaW4gYm90aCB0aGUgZG9jdW1lbnQgYW5kIEFQSQorICAgZW5jb2RpbmdzLiAgVGhlIG1lbW9yeSBidWZmZXIgJ2J1ZicgaXMgYSBzZXBhcmF0ZWx5LWFsbG9jYXRlZAorICAgbWVtb3J5IGFyZWEgd2hpY2ggc3RvcmVzIHRoZSBuYW1lLiAgRHVyaW5nIHRoZSBYTUxfUGFyc2UoKS8KKyAgIFhNTFBhcnNlQnVmZmVyKCkgd2hlbiB0aGUgZWxlbWVudCBpcyBvcGVuLCB0aGUgbWVtb3J5IGZvciB0aGUgJ3JhdycKKyAgIHZlcnNpb24gb2YgdGhlIG5hbWUgKGluIHRoZSBkb2N1bWVudCBlbmNvZGluZykgaXMgc2hhcmVkIHdpdGggdGhlCisgICBkb2N1bWVudCBidWZmZXIuICBJZiB0aGUgZWxlbWVudCBpcyBvcGVuIGFjcm9zcyBjYWxscyB0bworICAgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCksIHRoZSBidWZmZXIgaXMgcmUtYWxsb2NhdGVkIHRvCisgICBjb250YWluIHRoZSAncmF3JyBuYW1lIGFzIHdlbGwuCisKKyAgIEEgcGFyc2VyIHJlLXVzZXMgdGhlc2Ugc3RydWN0dXJlcywgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIGFsbG9jYXRlZAorICAgVEFHIG9iamVjdHMgaW4gYSBmcmVlIGxpc3QuCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnIHsKKyAgc3RydWN0IHRhZyAqcGFyZW50OyAgICAgICAgICAgLyogcGFyZW50IG9mIHRoaXMgZWxlbWVudCAqLworICBjb25zdCBjaGFyICpyYXdOYW1lOyAgICAgICAgICAvKiB0YWdOYW1lIGluIHRoZSBvcmlnaW5hbCBlbmNvZGluZyAqLworICBpbnQgcmF3TmFtZUxlbmd0aDsKKyAgVEFHX05BTUUgbmFtZTsgICAgICAgICAgICAgICAgLyogdGFnTmFtZSBpbiB0aGUgQVBJIGVuY29kaW5nICovCisgIGNoYXIgKmJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgbmFtZSBjb21wb25lbnRzICovCisgIGNoYXIgKmJ1ZkVuZDsgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiB0aGUgYnVmZmVyICovCisgIEJJTkRJTkcgKmJpbmRpbmdzOworfSBUQUc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgIGNvbnN0IFhNTF9DaGFyICp0ZXh0UHRyOworICBpbnQgdGV4dExlbjsgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW4gWE1MX0NoYXJzICovCisgIGludCBwcm9jZXNzZWQ7ICAgICAgICAgICAgICAgIC8qICMgb2YgcHJvY2Vzc2VkIGJ5dGVzIC0gd2hlbiBzdXNwZW5kZWQgKi8KKyAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkOworICBjb25zdCBYTUxfQ2hhciAqYmFzZTsKKyAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkOworICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb247CisgIFhNTF9Cb29sIG9wZW47CisgIFhNTF9Cb29sIGlzX3BhcmFtOworICBYTUxfQm9vbCBpc19pbnRlcm5hbDsgLyogdHJ1ZSBpZiBkZWNsYXJlZCBpbiBpbnRlcm5hbCBzdWJzZXQgb3V0c2lkZSBQRSAqLworfSBFTlRJVFk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBYTUxfQ29udGVudF9UeXBlICAgICAgICAgdHlwZTsKKyAgZW51bSBYTUxfQ29udGVudF9RdWFudCAgICAgICAgcXVhbnQ7CisgIGNvbnN0IFhNTF9DaGFyICogICAgICAgICAgICAgIG5hbWU7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Y2hpbGQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RjaGlsZDsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRjbnQ7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRzaWI7Cit9IENPTlRFTlRfU0NBRkZPTEQ7CisKKyNkZWZpbmUgSU5JVF9TQ0FGRk9MRF9FTEVNRU5UUyAzMgorCit0eXBlZGVmIHN0cnVjdCBibG9jayB7CisgIHN0cnVjdCBibG9jayAqbmV4dDsKKyAgaW50IHNpemU7CisgIFhNTF9DaGFyIHNbMV07Cit9IEJMT0NLOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEJMT0NLICpibG9ja3M7CisgIEJMT0NLICpmcmVlQmxvY2tzOworICBjb25zdCBYTUxfQ2hhciAqZW5kOworICBYTUxfQ2hhciAqcHRyOworICBYTUxfQ2hhciAqc3RhcnQ7CisgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbTsKK30gU1RSSU5HX1BPT0w7CisKKy8qIFRoZSBYTUxfQ2hhciBiZWZvcmUgdGhlIG5hbWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgYW4gYXR0cmlidXRlIGhhcyBiZWVuIHNwZWNpZmllZC4gKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJpYnV0ZV9pZCB7CisgIFhNTF9DaGFyICpuYW1lOworICBQUkVGSVggKnByZWZpeDsKKyAgWE1MX0Jvb2wgbWF5YmVUb2tlbml6ZWQ7CisgIFhNTF9Cb29sIHhtbG5zOworfSBBVFRSSUJVVEVfSUQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgQVRUUklCVVRFX0lEICppZDsKKyAgWE1MX0Jvb2wgaXNDZGF0YTsKKyAgY29uc3QgWE1MX0NoYXIgKnZhbHVlOworfSBERUZBVUxUX0FUVFJJQlVURTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBsb25nIHZlcnNpb247CisgIHVuc2lnbmVkIGxvbmcgaGFzaDsKKyAgY29uc3QgWE1MX0NoYXIgKnVyaU5hbWU7Cit9IE5TX0FUVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgUFJFRklYICpwcmVmaXg7CisgIGNvbnN0IEFUVFJJQlVURV9JRCAqaWRBdHQ7CisgIGludCBuRGVmYXVsdEF0dHM7CisgIGludCBhbGxvY0RlZmF1bHRBdHRzOworICBERUZBVUxUX0FUVFJJQlVURSAqZGVmYXVsdEF0dHM7Cit9IEVMRU1FTlRfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIQVNIX1RBQkxFIGdlbmVyYWxFbnRpdGllczsKKyAgSEFTSF9UQUJMRSBlbGVtZW50VHlwZXM7CisgIEhBU0hfVEFCTEUgYXR0cmlidXRlSWRzOworICBIQVNIX1RBQkxFIHByZWZpeGVzOworICBTVFJJTkdfUE9PTCBwb29sOworICBTVFJJTkdfUE9PTCBlbnRpdHlWYWx1ZVBvb2w7CisgIC8qIGZhbHNlIG9uY2UgYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBoYXMgYmVlbiBza2lwcGVkICovCisgIFhNTF9Cb29sIGtlZXBQcm9jZXNzaW5nOworICAvKiB0cnVlIG9uY2UgYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgUEUgcmVmZXJlbmNlIGhhcyBiZWVuIGVuY291bnRlcmVkOworICAgICB0aGlzIGluY2x1ZGVzIHRoZSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3Vic2V0ICovCisgIFhNTF9Cb29sIGhhc1BhcmFtRW50aXR5UmVmczsKKyAgWE1MX0Jvb2wgc3RhbmRhbG9uZTsKKyNpZmRlZiBYTUxfRFRECisgIC8qIGluZGljYXRlcyBpZiBleHRlcm5hbCBQRSBoYXMgYmVlbiByZWFkICovCisgIFhNTF9Cb29sIHBhcmFtRW50aXR5UmVhZDsKKyAgSEFTSF9UQUJMRSBwYXJhbUVudGl0aWVzOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgUFJFRklYIGRlZmF1bHRQcmVmaXg7CisgIC8qID09PSBzY2FmZm9sZGluZyBmb3IgYnVpbGRpbmcgY29udGVudCBtb2RlbCA9PT0gKi8KKyAgWE1MX0Jvb2wgaW5fZWxkZWNsOworICBDT05URU5UX1NDQUZGT0xEICpzY2FmZm9sZDsKKyAgdW5zaWduZWQgY29udGVudFN0cmluZ0xlbjsKKyAgdW5zaWduZWQgc2NhZmZTaXplOworICB1bnNpZ25lZCBzY2FmZkNvdW50OworICBpbnQgc2NhZmZMZXZlbDsKKyAgaW50ICpzY2FmZkluZGV4OworfSBEVEQ7CisKK3R5cGVkZWYgc3RydWN0IG9wZW5faW50ZXJuYWxfZW50aXR5IHsKKyAgY29uc3QgY2hhciAqaW50ZXJuYWxFdmVudFB0cjsKKyAgY29uc3QgY2hhciAqaW50ZXJuYWxFdmVudEVuZFB0cjsKKyAgc3RydWN0IG9wZW5faW50ZXJuYWxfZW50aXR5ICpuZXh0OworICBFTlRJVFkgKmVudGl0eTsKKyAgaW50IHN0YXJ0VGFnTGV2ZWw7CisgIFhNTF9Cb29sIGJldHdlZW5EZWNsOyAvKiBXRkM6IFBFIEJldHdlZW4gRGVjbGFyYXRpb25zICovCit9IE9QRU5fSU5URVJOQUxfRU5USVRZOworCit0eXBlZGVmIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwgUHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKTsKKworc3RhdGljIFByb2Nlc3NvciBwcm9sb2dQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIHByb2xvZ0luaXRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGNvbnRlbnRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGNkYXRhU2VjdGlvblByb2Nlc3NvcjsKKyNpZmRlZiBYTUxfRFRECitzdGF0aWMgUHJvY2Vzc29yIGlnbm9yZVNlY3Rpb25Qcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsUGFyRW50UHJvY2Vzc29yOworc3RhdGljIFByb2Nlc3NvciBleHRlcm5hbFBhckVudEluaXRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGVudGl0eVZhbHVlUHJvY2Vzc29yOworc3RhdGljIFByb2Nlc3NvciBlbnRpdHlWYWx1ZUluaXRQcm9jZXNzb3I7CisjZW5kaWYgLyogWE1MX0RURCAqLworc3RhdGljIFByb2Nlc3NvciBlcGlsb2dQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGVycm9yUHJvY2Vzc29yOworc3RhdGljIFByb2Nlc3NvciBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3I7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjI7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjM7CitzdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcjsKK3N0YXRpYyBQcm9jZXNzb3IgaW50ZXJuYWxFbnRpdHlQcm9jZXNzb3I7CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgoraGFuZGxlVW5rbm93bkVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKTsKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorcHJvY2Vzc1htbERlY2woWE1MX1BhcnNlciBwYXJzZXIsIGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqbmV4dCk7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2luaXRpYWxpemVFbmNvZGluZyhYTUxfUGFyc2VyIHBhcnNlcik7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2RvUHJvbG9nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpzLCAKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgaW50IHRvaywgY29uc3QgY2hhciAqbmV4dCwgY29uc3QgY2hhciAqKm5leHRQdHIsIAorICAgICAgICAgWE1MX0Jvb2wgaGF2ZU1vcmUpOworc3RhdGljIGVudW0gWE1MX0Vycm9yCitwcm9jZXNzSW50ZXJuYWxFbnRpdHkoWE1MX1BhcnNlciBwYXJzZXIsIEVOVElUWSAqZW50aXR5LCAKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfQm9vbCBiZXR3ZWVuRGVjbCk7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2RvQ29udGVudChYTUxfUGFyc2VyIHBhcnNlciwgaW50IHN0YXJ0VGFnTGV2ZWwsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKmVuZFB0ciwgCisgICAgICAgICAgWE1MX0Jvb2wgaGF2ZU1vcmUpOworc3RhdGljIGVudW0gWE1MX0Vycm9yCitkb0NkYXRhU2VjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKnN0YXJ0UHRyLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFB0ciwgWE1MX0Jvb2wgaGF2ZU1vcmUpOworI2lmZGVmIFhNTF9EVEQKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorZG9JZ25vcmVTZWN0aW9uKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICoqc3RhcnRQdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFB0ciwgWE1MX0Jvb2wgaGF2ZU1vcmUpOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitzdG9yZUF0dHMoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgVEFHX05BTUUgKnRhZ05hbWVQdHIsIEJJTkRJTkcgKipiaW5kaW5nc1B0cik7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2FkZEJpbmRpbmcoWE1MX1BhcnNlciBwYXJzZXIsIFBSRUZJWCAqcHJlZml4LCBjb25zdCBBVFRSSUJVVEVfSUQgKmF0dElkLAorICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpLCBCSU5ESU5HICoqYmluZGluZ3NQdHIpOworc3RhdGljIGludAorZGVmaW5lQXR0cmlidXRlKEVMRU1FTlRfVFlQRSAqdHlwZSwgQVRUUklCVVRFX0lEICosIFhNTF9Cb29sIGlzQ2RhdGEsIAorICAgICAgICAgICAgICAgIFhNTF9Cb29sIGlzSWQsIGNvbnN0IFhNTF9DaGFyICpkZmx0VmFsdWUsIFhNTF9QYXJzZXIgcGFyc2VyKTsKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorc3RvcmVBdHRyaWJ1dGVWYWx1ZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgWE1MX0Jvb2wgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFNUUklOR19QT09MICopOworc3RhdGljIGVudW0gWE1MX0Vycm9yCithcHBlbmRBdHRyaWJ1dGVWYWx1ZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgWE1MX0Jvb2wgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBTVFJJTkdfUE9PTCAqKTsKK3N0YXRpYyBBVFRSSUJVVEVfSUQgKgorZ2V0QXR0cmlidXRlSWQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kKTsKK3N0YXRpYyBpbnQKK3NldEVsZW1lbnRUeXBlUHJlZml4KFhNTF9QYXJzZXIgcGFyc2VyLCBFTEVNRU5UX1RZUEUgKik7CitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK3N0b3JlRW50aXR5VmFsdWUoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQpOworc3RhdGljIGludAorcmVwb3J0UHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpOworc3RhdGljIGludAorcmVwb3J0Q29tbWVudChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqc3RhcnQsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCk7CitzdGF0aWMgdm9pZAorcmVwb3J0RGVmYXVsdChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqc3RhcnQsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCk7CisKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqIGdldENvbnRleHQoWE1MX1BhcnNlciBwYXJzZXIpOworc3RhdGljIFhNTF9Cb29sCitzZXRDb250ZXh0KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqY29udGV4dCk7CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIG5vcm1hbGl6ZVB1YmxpY0lkKFhNTF9DaGFyICpzKTsKKworc3RhdGljIERURCAqIGR0ZENyZWF0ZShjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcyk7CisvKiBkbyBub3QgY2FsbCBpZiBwYXJlbnRQYXJzZXIgIT0gTlVMTCAqLworc3RhdGljIHZvaWQgZHRkUmVzZXQoRFREICpwLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcyk7CitzdGF0aWMgdm9pZAorZHRkRGVzdHJveShEVEQgKnAsIFhNTF9Cb29sIGlzRG9jRW50aXR5LCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcyk7CitzdGF0aWMgaW50CitkdGRDb3B5KERURCAqbmV3RHRkLCBjb25zdCBEVEQgKm9sZER0ZCwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpOworc3RhdGljIGludAorY29weUVudGl0eVRhYmxlKEhBU0hfVEFCTEUgKiwgU1RSSU5HX1BPT0wgKiwgY29uc3QgSEFTSF9UQUJMRSAqKTsKKworc3RhdGljIE5BTUVEICoKK2xvb2t1cChIQVNIX1RBQkxFICp0YWJsZSwgS0VZIG5hbWUsIHNpemVfdCBjcmVhdGVTaXplKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitoYXNoVGFibGVJbml0KEhBU0hfVEFCTEUgKiwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpOworc3RhdGljIHZvaWQgRkFTVENBTEwgaGFzaFRhYmxlQ2xlYXIoSEFTSF9UQUJMRSAqKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIGhhc2hUYWJsZURlc3Ryb3koSEFTSF9UQUJMRSAqKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitoYXNoVGFibGVJdGVySW5pdChIQVNIX1RBQkxFX0lURVIgKiwgY29uc3QgSEFTSF9UQUJMRSAqKTsKK3N0YXRpYyBOQU1FRCAqIEZBU1RDQUxMIGhhc2hUYWJsZUl0ZXJOZXh0KEhBU0hfVEFCTEVfSVRFUiAqKTsKKworc3RhdGljIHZvaWQgRkFTVENBTEwKK3Bvb2xJbml0KFNUUklOR19QT09MICosIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1zKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIHBvb2xDbGVhcihTVFJJTkdfUE9PTCAqKTsKK3N0YXRpYyB2b2lkIEZBU1RDQUxMIHBvb2xEZXN0cm95KFNUUklOR19QT09MICopOworc3RhdGljIFhNTF9DaGFyICoKK3Bvb2xBcHBlbmQoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKTsKK3N0YXRpYyBYTUxfQ2hhciAqCitwb29sU3RvcmVTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpOworc3RhdGljIFhNTF9Cb29sIEZBU1RDQUxMIHBvb2xHcm93KFNUUklOR19QT09MICpwb29sKTsKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqIEZBU1RDQUxMCitwb29sQ29weVN0cmluZyhTVFJJTkdfUE9PTCAqcG9vbCwgY29uc3QgWE1MX0NoYXIgKnMpOworc3RhdGljIGNvbnN0IFhNTF9DaGFyICoKK3Bvb2xDb3B5U3RyaW5nTihTVFJJTkdfUE9PTCAqcG9vbCwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBuKTsKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqIEZBU1RDQUxMCitwb29sQXBwZW5kU3RyaW5nKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcyk7CisKK3N0YXRpYyBpbnQgRkFTVENBTEwgbmV4dFNjYWZmb2xkUGFydChYTUxfUGFyc2VyIHBhcnNlcik7CitzdGF0aWMgWE1MX0NvbnRlbnQgKiBidWlsZF9tb2RlbChYTUxfUGFyc2VyIHBhcnNlcik7CitzdGF0aWMgRUxFTUVOVF9UWVBFICoKK2dldEVsZW1lbnRUeXBlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpOworCitzdGF0aWMgWE1MX1BhcnNlcgorcGFyc2VyQ3JlYXRlKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsCisgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWVTZXAsCisgICAgICAgICAgICAgRFREICpkdGQpOworc3RhdGljIHZvaWQKK3BhcnNlckluaXQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpOworCisjZGVmaW5lIHBvb2xTdGFydChwb29sKSAoKHBvb2wpLT5zdGFydCkKKyNkZWZpbmUgcG9vbEVuZChwb29sKSAoKHBvb2wpLT5wdHIpCisjZGVmaW5lIHBvb2xMZW5ndGgocG9vbCkgKChwb29sKS0+cHRyIC0gKHBvb2wpLT5zdGFydCkKKyNkZWZpbmUgcG9vbENob3AocG9vbCkgKCh2b2lkKS0tKHBvb2wtPnB0cikpCisjZGVmaW5lIHBvb2xMYXN0Q2hhcihwb29sKSAoKChwb29sKS0+cHRyKVstMV0pCisjZGVmaW5lIHBvb2xEaXNjYXJkKHBvb2wpICgocG9vbCktPnB0ciA9IChwb29sKS0+c3RhcnQpCisjZGVmaW5lIHBvb2xGaW5pc2gocG9vbCkgKChwb29sKS0+c3RhcnQgPSAocG9vbCktPnB0cikKKyNkZWZpbmUgcG9vbEFwcGVuZENoYXIocG9vbCwgYykgXAorICAoKChwb29sKS0+cHRyID09IChwb29sKS0+ZW5kICYmICFwb29sR3Jvdyhwb29sKSkgXAorICAgPyAwIFwKKyAgIDogKCgqKChwb29sKS0+cHRyKSsrID0gYyksIDEpKQorCitzdHJ1Y3QgWE1MX1BhcnNlclN0cnVjdCB7CisgIC8qIFRoZSBmaXJzdCBtZW1iZXIgbXVzdCBiZSB1c2VyRGF0YSBzbyB0aGF0IHRoZSBYTUxfR2V0VXNlckRhdGEKKyAgICAgbWFjcm8gd29ya3MuICovCisgIHZvaWQgKm1fdXNlckRhdGE7CisgIHZvaWQgKm1faGFuZGxlckFyZzsKKyAgY2hhciAqbV9idWZmZXI7CisgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgbV9tZW07CisgIC8qIGZpcnN0IGNoYXJhY3RlciB0byBiZSBwYXJzZWQgKi8KKyAgY29uc3QgY2hhciAqbV9idWZmZXJQdHI7CisgIC8qIHBhc3QgbGFzdCBjaGFyYWN0ZXIgdG8gYmUgcGFyc2VkICovCisgIGNoYXIgKm1fYnVmZmVyRW5kOworICAvKiBhbGxvY2F0ZWQgZW5kIG9mIGJ1ZmZlciAqLworICBjb25zdCBjaGFyICptX2J1ZmZlckxpbTsKKyAgWE1MX0luZGV4IG1fcGFyc2VFbmRCeXRlSW5kZXg7CisgIGNvbnN0IGNoYXIgKm1fcGFyc2VFbmRQdHI7CisgIFhNTF9DaGFyICptX2RhdGFCdWY7CisgIFhNTF9DaGFyICptX2RhdGFCdWZFbmQ7CisgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIG1fc3RhcnRFbGVtZW50SGFuZGxlcjsKKyAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIG1fZW5kRWxlbWVudEhhbmRsZXI7CisgIFhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciBtX2NoYXJhY3RlckRhdGFIYW5kbGVyOworICBYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBtX3Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXI7CisgIFhNTF9Db21tZW50SGFuZGxlciBtX2NvbW1lbnRIYW5kbGVyOworICBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIG1fc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyOworICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBtX2VuZENkYXRhU2VjdGlvbkhhbmRsZXI7CisgIFhNTF9EZWZhdWx0SGFuZGxlciBtX2RlZmF1bHRIYW5kbGVyOworICBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgbV9zdGFydERvY3R5cGVEZWNsSGFuZGxlcjsKKyAgWE1MX0VuZERvY3R5cGVEZWNsSGFuZGxlciBtX2VuZERvY3R5cGVEZWNsSGFuZGxlcjsKKyAgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgbV91bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyOworICBYTUxfTm90YXRpb25EZWNsSGFuZGxlciBtX25vdGF0aW9uRGVjbEhhbmRsZXI7CisgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIG1fc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcjsKKyAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIG1fZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXI7CisgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBtX25vdFN0YW5kYWxvbmVIYW5kbGVyOworICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIG1fZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyOworICBYTUxfUGFyc2VyIG1fZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnOworICBYTUxfU2tpcHBlZEVudGl0eUhhbmRsZXIgbV9za2lwcGVkRW50aXR5SGFuZGxlcjsKKyAgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgbV91bmtub3duRW5jb2RpbmdIYW5kbGVyOworICBYTUxfRWxlbWVudERlY2xIYW5kbGVyIG1fZWxlbWVudERlY2xIYW5kbGVyOworICBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIG1fYXR0bGlzdERlY2xIYW5kbGVyOworICBYTUxfRW50aXR5RGVjbEhhbmRsZXIgbV9lbnRpdHlEZWNsSGFuZGxlcjsKKyAgWE1MX1htbERlY2xIYW5kbGVyIG1feG1sRGVjbEhhbmRsZXI7CisgIGNvbnN0IEVOQ09ESU5HICptX2VuY29kaW5nOworICBJTklUX0VOQ09ESU5HIG1faW5pdEVuY29kaW5nOworICBjb25zdCBFTkNPRElORyAqbV9pbnRlcm5hbEVuY29kaW5nOworICBjb25zdCBYTUxfQ2hhciAqbV9wcm90b2NvbEVuY29kaW5nTmFtZTsKKyAgWE1MX0Jvb2wgbV9uczsKKyAgWE1MX0Jvb2wgbV9uc190cmlwbGV0czsKKyAgdm9pZCAqbV91bmtub3duRW5jb2RpbmdNZW07CisgIHZvaWQgKm1fdW5rbm93bkVuY29kaW5nRGF0YTsKKyAgdm9pZCAqbV91bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YTsKKyAgdm9pZCAoWE1MQ0FMTCAqbV91bmtub3duRW5jb2RpbmdSZWxlYXNlKSh2b2lkICopOworICBQUk9MT0dfU1RBVEUgbV9wcm9sb2dTdGF0ZTsKKyAgUHJvY2Vzc29yICptX3Byb2Nlc3NvcjsKKyAgZW51bSBYTUxfRXJyb3IgbV9lcnJvckNvZGU7CisgIGNvbnN0IGNoYXIgKm1fZXZlbnRQdHI7CisgIGNvbnN0IGNoYXIgKm1fZXZlbnRFbmRQdHI7CisgIGNvbnN0IGNoYXIgKm1fcG9zaXRpb25QdHI7CisgIE9QRU5fSU5URVJOQUxfRU5USVRZICptX29wZW5JbnRlcm5hbEVudGl0aWVzOworICBPUEVOX0lOVEVSTkFMX0VOVElUWSAqbV9mcmVlSW50ZXJuYWxFbnRpdGllczsKKyAgWE1MX0Jvb2wgbV9kZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllczsKKyAgaW50IG1fdGFnTGV2ZWw7CisgIEVOVElUWSAqbV9kZWNsRW50aXR5OworICBjb25zdCBYTUxfQ2hhciAqbV9kb2N0eXBlTmFtZTsKKyAgY29uc3QgWE1MX0NoYXIgKm1fZG9jdHlwZVN5c2lkOworICBjb25zdCBYTUxfQ2hhciAqbV9kb2N0eXBlUHViaWQ7CisgIGNvbnN0IFhNTF9DaGFyICptX2RlY2xBdHRyaWJ1dGVUeXBlOworICBjb25zdCBYTUxfQ2hhciAqbV9kZWNsTm90YXRpb25OYW1lOworICBjb25zdCBYTUxfQ2hhciAqbV9kZWNsTm90YXRpb25QdWJsaWNJZDsKKyAgRUxFTUVOVF9UWVBFICptX2RlY2xFbGVtZW50VHlwZTsKKyAgQVRUUklCVVRFX0lEICptX2RlY2xBdHRyaWJ1dGVJZDsKKyAgWE1MX0Jvb2wgbV9kZWNsQXR0cmlidXRlSXNDZGF0YTsKKyAgWE1MX0Jvb2wgbV9kZWNsQXR0cmlidXRlSXNJZDsKKyAgRFREICptX2R0ZDsKKyAgY29uc3QgWE1MX0NoYXIgKm1fY3VyQmFzZTsKKyAgVEFHICptX3RhZ1N0YWNrOworICBUQUcgKm1fZnJlZVRhZ0xpc3Q7CisgIEJJTkRJTkcgKm1faW5oZXJpdGVkQmluZGluZ3M7CisgIEJJTkRJTkcgKm1fZnJlZUJpbmRpbmdMaXN0OworICBpbnQgbV9hdHRzU2l6ZTsKKyAgaW50IG1fblNwZWNpZmllZEF0dHM7CisgIGludCBtX2lkQXR0SW5kZXg7CisgIEFUVFJJQlVURSAqbV9hdHRzOworICBOU19BVFQgKm1fbnNBdHRzOworICB1bnNpZ25lZCBsb25nIG1fbnNBdHRzVmVyc2lvbjsKKyAgdW5zaWduZWQgY2hhciBtX25zQXR0c1Bvd2VyOworICBQT1NJVElPTiBtX3Bvc2l0aW9uOworICBTVFJJTkdfUE9PTCBtX3RlbXBQb29sOworICBTVFJJTkdfUE9PTCBtX3RlbXAyUG9vbDsKKyAgY2hhciAqbV9ncm91cENvbm5lY3RvcjsKKyAgdW5zaWduZWQgaW50IG1fZ3JvdXBTaXplOworICBYTUxfQ2hhciBtX25hbWVzcGFjZVNlcGFyYXRvcjsKKyAgWE1MX1BhcnNlciBtX3BhcmVudFBhcnNlcjsKKyAgWE1MX1BhcnNpbmdTdGF0dXMgbV9wYXJzaW5nU3RhdHVzOworI2lmZGVmIFhNTF9EVEQKKyAgWE1MX0Jvb2wgbV9pc1BhcmFtRW50aXR5OworICBYTUxfQm9vbCBtX3VzZUZvcmVpZ25EVEQ7CisgIGVudW0gWE1MX1BhcmFtRW50aXR5UGFyc2luZyBtX3BhcmFtRW50aXR5UGFyc2luZzsKKyNlbmRpZgorfTsKKworI2RlZmluZSBNQUxMT0MocykgKHBhcnNlci0+bV9tZW0ubWFsbG9jX2ZjbigocykpKQorI2RlZmluZSBSRUFMTE9DKHAscykgKHBhcnNlci0+bV9tZW0ucmVhbGxvY19mY24oKHApLChzKSkpCisjZGVmaW5lIEZSRUUocCkgKHBhcnNlci0+bV9tZW0uZnJlZV9mY24oKHApKSkKKworI2RlZmluZSB1c2VyRGF0YSAocGFyc2VyLT5tX3VzZXJEYXRhKQorI2RlZmluZSBoYW5kbGVyQXJnIChwYXJzZXItPm1faGFuZGxlckFyZykKKyNkZWZpbmUgc3RhcnRFbGVtZW50SGFuZGxlciAocGFyc2VyLT5tX3N0YXJ0RWxlbWVudEhhbmRsZXIpCisjZGVmaW5lIGVuZEVsZW1lbnRIYW5kbGVyIChwYXJzZXItPm1fZW5kRWxlbWVudEhhbmRsZXIpCisjZGVmaW5lIGNoYXJhY3RlckRhdGFIYW5kbGVyIChwYXJzZXItPm1fY2hhcmFjdGVyRGF0YUhhbmRsZXIpCisjZGVmaW5lIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgXAorICAgICAgICAocGFyc2VyLT5tX3Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpCisjZGVmaW5lIGNvbW1lbnRIYW5kbGVyIChwYXJzZXItPm1fY29tbWVudEhhbmRsZXIpCisjZGVmaW5lIHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBcCisgICAgICAgIChwYXJzZXItPm1fc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKQorI2RlZmluZSBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyIChwYXJzZXItPm1fZW5kQ2RhdGFTZWN0aW9uSGFuZGxlcikKKyNkZWZpbmUgZGVmYXVsdEhhbmRsZXIgKHBhcnNlci0+bV9kZWZhdWx0SGFuZGxlcikKKyNkZWZpbmUgc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgKHBhcnNlci0+bV9zdGFydERvY3R5cGVEZWNsSGFuZGxlcikKKyNkZWZpbmUgZW5kRG9jdHlwZURlY2xIYW5kbGVyIChwYXJzZXItPm1fZW5kRG9jdHlwZURlY2xIYW5kbGVyKQorI2RlZmluZSB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIFwKKyAgICAgICAgKHBhcnNlci0+bV91bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKQorI2RlZmluZSBub3RhdGlvbkRlY2xIYW5kbGVyIChwYXJzZXItPm1fbm90YXRpb25EZWNsSGFuZGxlcikKKyNkZWZpbmUgc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBcCisgICAgICAgIChwYXJzZXItPm1fc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcikKKyNkZWZpbmUgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgKHBhcnNlci0+bV9lbmROYW1lc3BhY2VEZWNsSGFuZGxlcikKKyNkZWZpbmUgbm90U3RhbmRhbG9uZUhhbmRsZXIgKHBhcnNlci0+bV9ub3RTdGFuZGFsb25lSGFuZGxlcikKKyNkZWZpbmUgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIFwKKyAgICAgICAgKHBhcnNlci0+bV9leHRlcm5hbEVudGl0eVJlZkhhbmRsZXIpCisjZGVmaW5lIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyBcCisgICAgICAgIChwYXJzZXItPm1fZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKQorI2RlZmluZSBpbnRlcm5hbEVudGl0eVJlZkhhbmRsZXIgXAorICAgICAgICAocGFyc2VyLT5tX2ludGVybmFsRW50aXR5UmVmSGFuZGxlcikKKyNkZWZpbmUgc2tpcHBlZEVudGl0eUhhbmRsZXIgKHBhcnNlci0+bV9za2lwcGVkRW50aXR5SGFuZGxlcikKKyNkZWZpbmUgdW5rbm93bkVuY29kaW5nSGFuZGxlciAocGFyc2VyLT5tX3Vua25vd25FbmNvZGluZ0hhbmRsZXIpCisjZGVmaW5lIGVsZW1lbnREZWNsSGFuZGxlciAocGFyc2VyLT5tX2VsZW1lbnREZWNsSGFuZGxlcikKKyNkZWZpbmUgYXR0bGlzdERlY2xIYW5kbGVyIChwYXJzZXItPm1fYXR0bGlzdERlY2xIYW5kbGVyKQorI2RlZmluZSBlbnRpdHlEZWNsSGFuZGxlciAocGFyc2VyLT5tX2VudGl0eURlY2xIYW5kbGVyKQorI2RlZmluZSB4bWxEZWNsSGFuZGxlciAocGFyc2VyLT5tX3htbERlY2xIYW5kbGVyKQorI2RlZmluZSBlbmNvZGluZyAocGFyc2VyLT5tX2VuY29kaW5nKQorI2RlZmluZSBpbml0RW5jb2RpbmcgKHBhcnNlci0+bV9pbml0RW5jb2RpbmcpCisjZGVmaW5lIGludGVybmFsRW5jb2RpbmcgKHBhcnNlci0+bV9pbnRlcm5hbEVuY29kaW5nKQorI2RlZmluZSB1bmtub3duRW5jb2RpbmdNZW0gKHBhcnNlci0+bV91bmtub3duRW5jb2RpbmdNZW0pCisjZGVmaW5lIHVua25vd25FbmNvZGluZ0RhdGEgKHBhcnNlci0+bV91bmtub3duRW5jb2RpbmdEYXRhKQorI2RlZmluZSB1bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YSBcCisgIChwYXJzZXItPm1fdW5rbm93bkVuY29kaW5nSGFuZGxlckRhdGEpCisjZGVmaW5lIHVua25vd25FbmNvZGluZ1JlbGVhc2UgKHBhcnNlci0+bV91bmtub3duRW5jb2RpbmdSZWxlYXNlKQorI2RlZmluZSBwcm90b2NvbEVuY29kaW5nTmFtZSAocGFyc2VyLT5tX3Byb3RvY29sRW5jb2RpbmdOYW1lKQorI2RlZmluZSBucyAocGFyc2VyLT5tX25zKQorI2RlZmluZSBuc190cmlwbGV0cyAocGFyc2VyLT5tX25zX3RyaXBsZXRzKQorI2RlZmluZSBwcm9sb2dTdGF0ZSAocGFyc2VyLT5tX3Byb2xvZ1N0YXRlKQorI2RlZmluZSBwcm9jZXNzb3IgKHBhcnNlci0+bV9wcm9jZXNzb3IpCisjZGVmaW5lIGVycm9yQ29kZSAocGFyc2VyLT5tX2Vycm9yQ29kZSkKKyNkZWZpbmUgZXZlbnRQdHIgKHBhcnNlci0+bV9ldmVudFB0cikKKyNkZWZpbmUgZXZlbnRFbmRQdHIgKHBhcnNlci0+bV9ldmVudEVuZFB0cikKKyNkZWZpbmUgcG9zaXRpb25QdHIgKHBhcnNlci0+bV9wb3NpdGlvblB0cikKKyNkZWZpbmUgcG9zaXRpb24gKHBhcnNlci0+bV9wb3NpdGlvbikKKyNkZWZpbmUgb3BlbkludGVybmFsRW50aXRpZXMgKHBhcnNlci0+bV9vcGVuSW50ZXJuYWxFbnRpdGllcykKKyNkZWZpbmUgZnJlZUludGVybmFsRW50aXRpZXMgKHBhcnNlci0+bV9mcmVlSW50ZXJuYWxFbnRpdGllcykKKyNkZWZpbmUgZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgXAorICAgICAgICAocGFyc2VyLT5tX2RlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzKQorI2RlZmluZSB0YWdMZXZlbCAocGFyc2VyLT5tX3RhZ0xldmVsKQorI2RlZmluZSBidWZmZXIgKHBhcnNlci0+bV9idWZmZXIpCisjZGVmaW5lIGJ1ZmZlclB0ciAocGFyc2VyLT5tX2J1ZmZlclB0cikKKyNkZWZpbmUgYnVmZmVyRW5kIChwYXJzZXItPm1fYnVmZmVyRW5kKQorI2RlZmluZSBwYXJzZUVuZEJ5dGVJbmRleCAocGFyc2VyLT5tX3BhcnNlRW5kQnl0ZUluZGV4KQorI2RlZmluZSBwYXJzZUVuZFB0ciAocGFyc2VyLT5tX3BhcnNlRW5kUHRyKQorI2RlZmluZSBidWZmZXJMaW0gKHBhcnNlci0+bV9idWZmZXJMaW0pCisjZGVmaW5lIGRhdGFCdWYgKHBhcnNlci0+bV9kYXRhQnVmKQorI2RlZmluZSBkYXRhQnVmRW5kIChwYXJzZXItPm1fZGF0YUJ1ZkVuZCkKKyNkZWZpbmUgX2R0ZCAocGFyc2VyLT5tX2R0ZCkKKyNkZWZpbmUgY3VyQmFzZSAocGFyc2VyLT5tX2N1ckJhc2UpCisjZGVmaW5lIGRlY2xFbnRpdHkgKHBhcnNlci0+bV9kZWNsRW50aXR5KQorI2RlZmluZSBkb2N0eXBlTmFtZSAocGFyc2VyLT5tX2RvY3R5cGVOYW1lKQorI2RlZmluZSBkb2N0eXBlU3lzaWQgKHBhcnNlci0+bV9kb2N0eXBlU3lzaWQpCisjZGVmaW5lIGRvY3R5cGVQdWJpZCAocGFyc2VyLT5tX2RvY3R5cGVQdWJpZCkKKyNkZWZpbmUgZGVjbEF0dHJpYnV0ZVR5cGUgKHBhcnNlci0+bV9kZWNsQXR0cmlidXRlVHlwZSkKKyNkZWZpbmUgZGVjbE5vdGF0aW9uTmFtZSAocGFyc2VyLT5tX2RlY2xOb3RhdGlvbk5hbWUpCisjZGVmaW5lIGRlY2xOb3RhdGlvblB1YmxpY0lkIChwYXJzZXItPm1fZGVjbE5vdGF0aW9uUHVibGljSWQpCisjZGVmaW5lIGRlY2xFbGVtZW50VHlwZSAocGFyc2VyLT5tX2RlY2xFbGVtZW50VHlwZSkKKyNkZWZpbmUgZGVjbEF0dHJpYnV0ZUlkIChwYXJzZXItPm1fZGVjbEF0dHJpYnV0ZUlkKQorI2RlZmluZSBkZWNsQXR0cmlidXRlSXNDZGF0YSAocGFyc2VyLT5tX2RlY2xBdHRyaWJ1dGVJc0NkYXRhKQorI2RlZmluZSBkZWNsQXR0cmlidXRlSXNJZCAocGFyc2VyLT5tX2RlY2xBdHRyaWJ1dGVJc0lkKQorI2RlZmluZSBmcmVlVGFnTGlzdCAocGFyc2VyLT5tX2ZyZWVUYWdMaXN0KQorI2RlZmluZSBmcmVlQmluZGluZ0xpc3QgKHBhcnNlci0+bV9mcmVlQmluZGluZ0xpc3QpCisjZGVmaW5lIGluaGVyaXRlZEJpbmRpbmdzIChwYXJzZXItPm1faW5oZXJpdGVkQmluZGluZ3MpCisjZGVmaW5lIHRhZ1N0YWNrIChwYXJzZXItPm1fdGFnU3RhY2spCisjZGVmaW5lIGF0dHMgKHBhcnNlci0+bV9hdHRzKQorI2RlZmluZSBhdHRzU2l6ZSAocGFyc2VyLT5tX2F0dHNTaXplKQorI2RlZmluZSBuU3BlY2lmaWVkQXR0cyAocGFyc2VyLT5tX25TcGVjaWZpZWRBdHRzKQorI2RlZmluZSBpZEF0dEluZGV4IChwYXJzZXItPm1faWRBdHRJbmRleCkKKyNkZWZpbmUgbnNBdHRzIChwYXJzZXItPm1fbnNBdHRzKQorI2RlZmluZSBuc0F0dHNWZXJzaW9uIChwYXJzZXItPm1fbnNBdHRzVmVyc2lvbikKKyNkZWZpbmUgbnNBdHRzUG93ZXIgKHBhcnNlci0+bV9uc0F0dHNQb3dlcikKKyNkZWZpbmUgdGVtcFBvb2wgKHBhcnNlci0+bV90ZW1wUG9vbCkKKyNkZWZpbmUgdGVtcDJQb29sIChwYXJzZXItPm1fdGVtcDJQb29sKQorI2RlZmluZSBncm91cENvbm5lY3RvciAocGFyc2VyLT5tX2dyb3VwQ29ubmVjdG9yKQorI2RlZmluZSBncm91cFNpemUgKHBhcnNlci0+bV9ncm91cFNpemUpCisjZGVmaW5lIG5hbWVzcGFjZVNlcGFyYXRvciAocGFyc2VyLT5tX25hbWVzcGFjZVNlcGFyYXRvcikKKyNkZWZpbmUgcGFyZW50UGFyc2VyIChwYXJzZXItPm1fcGFyZW50UGFyc2VyKQorI2RlZmluZSBwc19wYXJzaW5nIChwYXJzZXItPm1fcGFyc2luZ1N0YXR1cy5wYXJzaW5nKQorI2RlZmluZSBwc19maW5hbEJ1ZmZlciAocGFyc2VyLT5tX3BhcnNpbmdTdGF0dXMuZmluYWxCdWZmZXIpCisjaWZkZWYgWE1MX0RURAorI2RlZmluZSBpc1BhcmFtRW50aXR5IChwYXJzZXItPm1faXNQYXJhbUVudGl0eSkKKyNkZWZpbmUgdXNlRm9yZWlnbkRURCAocGFyc2VyLT5tX3VzZUZvcmVpZ25EVEQpCisjZGVmaW5lIHBhcmFtRW50aXR5UGFyc2luZyAocGFyc2VyLT5tX3BhcmFtRW50aXR5UGFyc2luZykKKyNlbmRpZiAvKiBYTUxfRFREICovCisKK1hNTF9QYXJzZXIgWE1MQ0FMTAorWE1MX1BhcnNlckNyZWF0ZShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQoreworICByZXR1cm4gWE1MX1BhcnNlckNyZWF0ZV9NTShlbmNvZGluZ05hbWUsIE5VTEwsIE5VTEwpOworfQorCitYTUxfUGFyc2VyIFhNTENBTEwKK1hNTF9QYXJzZXJDcmVhdGVOUyhjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lLCBYTUxfQ2hhciBuc1NlcCkKK3sKKyAgWE1MX0NoYXIgdG1wWzJdOworICAqdG1wID0gbnNTZXA7CisgIHJldHVybiBYTUxfUGFyc2VyQ3JlYXRlX01NKGVuY29kaW5nTmFtZSwgTlVMTCwgdG1wKTsKK30KKworc3RhdGljIGNvbnN0IFhNTF9DaGFyIGltcGxpY2l0Q29udGV4dFtdID0geworICBBU0NJSV94LCBBU0NJSV9tLCBBU0NJSV9sLCBBU0NJSV9FUVVBTFMsIEFTQ0lJX2gsIEFTQ0lJX3QsIEFTQ0lJX3QsIEFTQ0lJX3AsCisgIEFTQ0lJX0NPTE9OLCBBU0NJSV9TTEFTSCwgQVNDSUlfU0xBU0gsIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX3csIAorICBBU0NJSV9QRVJJT0QsIEFTQ0lJX3csIEFTQ0lJXzMsIEFTQ0lJX1BFUklPRCwgQVNDSUlfbywgQVNDSUlfciwgQVNDSUlfZywKKyAgQVNDSUlfU0xBU0gsIEFTQ0lJX1gsIEFTQ0lJX00sIEFTQ0lJX0wsIEFTQ0lJX1NMQVNILCBBU0NJSV8xLCBBU0NJSV85LAorICBBU0NJSV85LCBBU0NJSV84LCBBU0NJSV9TTEFTSCwgQVNDSUlfbiwgQVNDSUlfYSwgQVNDSUlfbSwgQVNDSUlfZSwKKyAgQVNDSUlfcywgQVNDSUlfcCwgQVNDSUlfYSwgQVNDSUlfYywgQVNDSUlfZSwgJ1wwJworfTsKKworWE1MX1BhcnNlciBYTUxDQUxMCitYTUxfUGFyc2VyQ3JlYXRlX01NKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbXN1aXRlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZVNlcCkKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSBwYXJzZXJDcmVhdGUoZW5jb2RpbmdOYW1lLCBtZW1zdWl0ZSwgbmFtZVNlcCwgTlVMTCk7CisgIGlmIChwYXJzZXIgIT0gTlVMTCAmJiBucykgeworICAgIC8qIGltcGxpY2l0IGNvbnRleHQgb25seSBzZXQgZm9yIHJvb3QgcGFyc2VyLCBzaW5jZSBjaGlsZAorICAgICAgIHBhcnNlcnMgKGkuZS4gZXh0ZXJuYWwgZW50aXR5IHBhcnNlcnMpIHdpbGwgaW5oZXJpdCBpdAorICAgICovCisgICAgaWYgKCFzZXRDb250ZXh0KHBhcnNlciwgaW1wbGljaXRDb250ZXh0KSkgeworICAgICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICByZXR1cm4gcGFyc2VyOworfQorCitzdGF0aWMgWE1MX1BhcnNlcgorcGFyc2VyQ3JlYXRlKGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsCisgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWVTZXAsCisgICAgICAgICAgICAgRFREICpkdGQpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyOworCisgIGlmIChtZW1zdWl0ZSkgeworICAgIFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm10ZW1wOworICAgIHBhcnNlciA9IChYTUxfUGFyc2VyKQorICAgICAgbWVtc3VpdGUtPm1hbGxvY19mY24oc2l6ZW9mKHN0cnVjdCBYTUxfUGFyc2VyU3RydWN0KSk7CisgICAgaWYgKHBhcnNlciAhPSBOVUxMKSB7CisgICAgICBtdGVtcCA9IChYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICopJihwYXJzZXItPm1fbWVtKTsKKyAgICAgIG10ZW1wLT5tYWxsb2NfZmNuID0gbWVtc3VpdGUtPm1hbGxvY19mY247CisgICAgICBtdGVtcC0+cmVhbGxvY19mY24gPSBtZW1zdWl0ZS0+cmVhbGxvY19mY247CisgICAgICBtdGVtcC0+ZnJlZV9mY24gPSBtZW1zdWl0ZS0+ZnJlZV9mY247CisgICAgfQorICB9CisgIGVsc2UgeworICAgIFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm10ZW1wOworICAgIHBhcnNlciA9IChYTUxfUGFyc2VyKW1hbGxvYyhzaXplb2Yoc3RydWN0IFhNTF9QYXJzZXJTdHJ1Y3QpKTsKKyAgICBpZiAocGFyc2VyICE9IE5VTEwpIHsKKyAgICAgIG10ZW1wID0gKFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKikmKHBhcnNlci0+bV9tZW0pOworICAgICAgbXRlbXAtPm1hbGxvY19mY24gPSBtYWxsb2M7CisgICAgICBtdGVtcC0+cmVhbGxvY19mY24gPSByZWFsbG9jOworICAgICAgbXRlbXAtPmZyZWVfZmNuID0gZnJlZTsKKyAgICB9CisgIH0KKworICBpZiAoIXBhcnNlcikKKyAgICByZXR1cm4gcGFyc2VyOworCisgIGJ1ZmZlciA9IE5VTEw7CisgIGJ1ZmZlckxpbSA9IE5VTEw7CisKKyAgYXR0c1NpemUgPSBJTklUX0FUVFNfU0laRTsKKyAgYXR0cyA9IChBVFRSSUJVVEUgKilNQUxMT0MoYXR0c1NpemUgKiBzaXplb2YoQVRUUklCVVRFKSk7CisgIGlmIChhdHRzID09IE5VTEwpIHsKKyAgICBGUkVFKHBhcnNlcik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZGF0YUJ1ZiA9IChYTUxfQ2hhciAqKU1BTExPQyhJTklUX0RBVEFfQlVGX1NJWkUgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgaWYgKGRhdGFCdWYgPT0gTlVMTCkgeworICAgIEZSRUUoYXR0cyk7CisgICAgRlJFRShwYXJzZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGRhdGFCdWZFbmQgPSBkYXRhQnVmICsgSU5JVF9EQVRBX0JVRl9TSVpFOworCisgIGlmIChkdGQpCisgICAgX2R0ZCA9IGR0ZDsKKyAgZWxzZSB7CisgICAgX2R0ZCA9IGR0ZENyZWF0ZSgmcGFyc2VyLT5tX21lbSk7CisgICAgaWYgKF9kdGQgPT0gTlVMTCkgeworICAgICAgRlJFRShkYXRhQnVmKTsKKyAgICAgIEZSRUUoYXR0cyk7CisgICAgICBGUkVFKHBhcnNlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICBmcmVlQmluZGluZ0xpc3QgPSBOVUxMOworICBmcmVlVGFnTGlzdCA9IE5VTEw7CisgIGZyZWVJbnRlcm5hbEVudGl0aWVzID0gTlVMTDsKKworICBncm91cFNpemUgPSAwOworICBncm91cENvbm5lY3RvciA9IE5VTEw7CisKKyAgdW5rbm93bkVuY29kaW5nSGFuZGxlciA9IE5VTEw7CisgIHVua25vd25FbmNvZGluZ0hhbmRsZXJEYXRhID0gTlVMTDsKKworICBuYW1lc3BhY2VTZXBhcmF0b3IgPSBBU0NJSV9FWENMOworICBucyA9IFhNTF9GQUxTRTsKKyAgbnNfdHJpcGxldHMgPSBYTUxfRkFMU0U7CisKKyAgbnNBdHRzID0gTlVMTDsKKyAgbnNBdHRzVmVyc2lvbiA9IDA7CisgIG5zQXR0c1Bvd2VyID0gMDsKKworICBwb29sSW5pdCgmdGVtcFBvb2wsICYocGFyc2VyLT5tX21lbSkpOworICBwb29sSW5pdCgmdGVtcDJQb29sLCAmKHBhcnNlci0+bV9tZW0pKTsKKyAgcGFyc2VySW5pdChwYXJzZXIsIGVuY29kaW5nTmFtZSk7CisKKyAgaWYgKGVuY29kaW5nTmFtZSAmJiAhcHJvdG9jb2xFbmNvZGluZ05hbWUpIHsKKyAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKG5hbWVTZXApIHsKKyAgICBucyA9IFhNTF9UUlVFOworICAgIGludGVybmFsRW5jb2RpbmcgPSBYbWxHZXRJbnRlcm5hbEVuY29kaW5nTlMoKTsKKyAgICBuYW1lc3BhY2VTZXBhcmF0b3IgPSAqbmFtZVNlcDsKKyAgfQorICBlbHNlIHsKKyAgICBpbnRlcm5hbEVuY29kaW5nID0gWG1sR2V0SW50ZXJuYWxFbmNvZGluZygpOworICB9CisKKyAgcmV0dXJuIHBhcnNlcjsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlckluaXQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpCit7CisgIHByb2Nlc3NvciA9IHByb2xvZ0luaXRQcm9jZXNzb3I7CisgIFhtbFByb2xvZ1N0YXRlSW5pdCgmcHJvbG9nU3RhdGUpOworICBwcm90b2NvbEVuY29kaW5nTmFtZSA9IChlbmNvZGluZ05hbWUgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBvb2xDb3B5U3RyaW5nKCZ0ZW1wUG9vbCwgZW5jb2RpbmdOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpOworICBjdXJCYXNlID0gTlVMTDsKKyAgWG1sSW5pdEVuY29kaW5nKCZpbml0RW5jb2RpbmcsICZlbmNvZGluZywgMCk7CisgIHVzZXJEYXRhID0gTlVMTDsKKyAgaGFuZGxlckFyZyA9IE5VTEw7CisgIHN0YXJ0RWxlbWVudEhhbmRsZXIgPSBOVUxMOworICBlbmRFbGVtZW50SGFuZGxlciA9IE5VTEw7CisgIGNoYXJhY3RlckRhdGFIYW5kbGVyID0gTlVMTDsKKyAgcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IE5VTEw7CisgIGNvbW1lbnRIYW5kbGVyID0gTlVMTDsKKyAgc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gTlVMTDsKKyAgZW5kQ2RhdGFTZWN0aW9uSGFuZGxlciA9IE5VTEw7CisgIGRlZmF1bHRIYW5kbGVyID0gTlVMTDsKKyAgc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgPSBOVUxMOworICBlbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBOVUxMOworICB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gTlVMTDsKKyAgbm90YXRpb25EZWNsSGFuZGxlciA9IE5VTEw7CisgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBOVUxMOworICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IE5VTEw7CisgIG5vdFN0YW5kYWxvbmVIYW5kbGVyID0gTlVMTDsKKyAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gTlVMTDsKKyAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gcGFyc2VyOworICBza2lwcGVkRW50aXR5SGFuZGxlciA9IE5VTEw7CisgIGVsZW1lbnREZWNsSGFuZGxlciA9IE5VTEw7CisgIGF0dGxpc3REZWNsSGFuZGxlciA9IE5VTEw7CisgIGVudGl0eURlY2xIYW5kbGVyID0gTlVMTDsKKyAgeG1sRGVjbEhhbmRsZXIgPSBOVUxMOworICBidWZmZXJQdHIgPSBidWZmZXI7CisgIGJ1ZmZlckVuZCA9IGJ1ZmZlcjsKKyAgcGFyc2VFbmRCeXRlSW5kZXggPSAwOworICBwYXJzZUVuZFB0ciA9IE5VTEw7CisgIGRlY2xFbGVtZW50VHlwZSA9IE5VTEw7CisgIGRlY2xBdHRyaWJ1dGVJZCA9IE5VTEw7CisgIGRlY2xFbnRpdHkgPSBOVUxMOworICBkb2N0eXBlTmFtZSA9IE5VTEw7CisgIGRvY3R5cGVTeXNpZCA9IE5VTEw7CisgIGRvY3R5cGVQdWJpZCA9IE5VTEw7CisgIGRlY2xBdHRyaWJ1dGVUeXBlID0gTlVMTDsKKyAgZGVjbE5vdGF0aW9uTmFtZSA9IE5VTEw7CisgIGRlY2xOb3RhdGlvblB1YmxpY0lkID0gTlVMTDsKKyAgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEgPSBYTUxfRkFMU0U7CisgIGRlY2xBdHRyaWJ1dGVJc0lkID0gWE1MX0ZBTFNFOworICBtZW1zZXQoJnBvc2l0aW9uLCAwLCBzaXplb2YoUE9TSVRJT04pKTsKKyAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PTkU7CisgIGV2ZW50UHRyID0gTlVMTDsKKyAgZXZlbnRFbmRQdHIgPSBOVUxMOworICBwb3NpdGlvblB0ciA9IE5VTEw7CisgIG9wZW5JbnRlcm5hbEVudGl0aWVzID0gTlVMTDsKKyAgZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgPSBYTUxfVFJVRTsKKyAgdGFnTGV2ZWwgPSAwOworICB0YWdTdGFjayA9IE5VTEw7CisgIGluaGVyaXRlZEJpbmRpbmdzID0gTlVMTDsKKyAgblNwZWNpZmllZEF0dHMgPSAwOworICB1bmtub3duRW5jb2RpbmdNZW0gPSBOVUxMOworICB1bmtub3duRW5jb2RpbmdSZWxlYXNlID0gTlVMTDsKKyAgdW5rbm93bkVuY29kaW5nRGF0YSA9IE5VTEw7CisgIHBhcmVudFBhcnNlciA9IE5VTEw7CisgIHBzX3BhcnNpbmcgPSBYTUxfSU5JVElBTElaRUQ7CisjaWZkZWYgWE1MX0RURAorICBpc1BhcmFtRW50aXR5ID0gWE1MX0ZBTFNFOworICB1c2VGb3JlaWduRFREID0gWE1MX0ZBTFNFOworICBwYXJhbUVudGl0eVBhcnNpbmcgPSBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVI7CisjZW5kaWYKK30KKworLyogbW92ZXMgbGlzdCBvZiBiaW5kaW5ncyB0byBmcmVlQmluZGluZ0xpc3QgKi8KK3N0YXRpYyB2b2lkIEZBU1RDQUxMCittb3ZlVG9GcmVlQmluZGluZ0xpc3QoWE1MX1BhcnNlciBwYXJzZXIsIEJJTkRJTkcgKmJpbmRpbmdzKQoreworICB3aGlsZSAoYmluZGluZ3MpIHsKKyAgICBCSU5ESU5HICpiID0gYmluZGluZ3M7CisgICAgYmluZGluZ3MgPSBiaW5kaW5ncy0+bmV4dFRhZ0JpbmRpbmc7CisgICAgYi0+bmV4dFRhZ0JpbmRpbmcgPSBmcmVlQmluZGluZ0xpc3Q7CisgICAgZnJlZUJpbmRpbmdMaXN0ID0gYjsKKyAgfQorfQorCitYTUxfQm9vbCBYTUxDQUxMCitYTUxfUGFyc2VyUmVzZXQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpCit7CisgIFRBRyAqdFN0azsKKyAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHlMaXN0OworICBpZiAocGFyZW50UGFyc2VyKQorICAgIHJldHVybiBYTUxfRkFMU0U7CisgIC8qIG1vdmUgdGFnU3RhY2sgdG8gZnJlZVRhZ0xpc3QgKi8KKyAgdFN0ayA9IHRhZ1N0YWNrOworICB3aGlsZSAodFN0aykgeworICAgIFRBRyAqdGFnID0gdFN0azsKKyAgICB0U3RrID0gdFN0ay0+cGFyZW50OworICAgIHRhZy0+cGFyZW50ID0gZnJlZVRhZ0xpc3Q7CisgICAgbW92ZVRvRnJlZUJpbmRpbmdMaXN0KHBhcnNlciwgdGFnLT5iaW5kaW5ncyk7CisgICAgdGFnLT5iaW5kaW5ncyA9IE5VTEw7CisgICAgZnJlZVRhZ0xpc3QgPSB0YWc7CisgIH0KKyAgLyogbW92ZSBvcGVuSW50ZXJuYWxFbnRpdGllcyB0byBmcmVlSW50ZXJuYWxFbnRpdGllcyAqLworICBvcGVuRW50aXR5TGlzdCA9IG9wZW5JbnRlcm5hbEVudGl0aWVzOworICB3aGlsZSAob3BlbkVudGl0eUxpc3QpIHsKKyAgICBPUEVOX0lOVEVSTkFMX0VOVElUWSAqb3BlbkVudGl0eSA9IG9wZW5FbnRpdHlMaXN0OworICAgIG9wZW5FbnRpdHlMaXN0ID0gb3BlbkVudGl0eS0+bmV4dDsKKyAgICBvcGVuRW50aXR5LT5uZXh0ID0gZnJlZUludGVybmFsRW50aXRpZXM7CisgICAgZnJlZUludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5OworICB9CisgIG1vdmVUb0ZyZWVCaW5kaW5nTGlzdChwYXJzZXIsIGluaGVyaXRlZEJpbmRpbmdzKTsKKyAgRlJFRSh1bmtub3duRW5jb2RpbmdNZW0pOworICBpZiAodW5rbm93bkVuY29kaW5nUmVsZWFzZSkKKyAgICB1bmtub3duRW5jb2RpbmdSZWxlYXNlKHVua25vd25FbmNvZGluZ0RhdGEpOworICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgcG9vbENsZWFyKCZ0ZW1wMlBvb2wpOworICBwYXJzZXJJbml0KHBhcnNlciwgZW5jb2RpbmdOYW1lKTsKKyAgZHRkUmVzZXQoX2R0ZCwgJnBhcnNlci0+bV9tZW0pOworICByZXR1cm4gc2V0Q29udGV4dChwYXJzZXIsIGltcGxpY2l0Q29udGV4dCk7Cit9CisKK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfU2V0RW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpCit7CisgIC8qIEJsb2NrIGFmdGVyIFhNTF9QYXJzZSgpL1hNTF9QYXJzZUJ1ZmZlcigpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgWFhYIFRoZXJlJ3Mgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGRldGVybWluZSB3aGljaCBvZiB0aGUKKyAgICAgWFhYIHBvc3NpYmxlIGVycm9yIGNhc2VzIGNhdXNlZCB0aGUgWE1MX1NUQVRVU19FUlJPUiByZXR1cm4uCisgICovCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgaWYgKGVuY29kaW5nTmFtZSA9PSBOVUxMKQorICAgIHByb3RvY29sRW5jb2RpbmdOYW1lID0gTlVMTDsKKyAgZWxzZSB7CisgICAgcHJvdG9jb2xFbmNvZGluZ05hbWUgPSBwb29sQ29weVN0cmluZygmdGVtcFBvb2wsIGVuY29kaW5nTmFtZSk7CisgICAgaWYgKCFwcm90b2NvbEVuY29kaW5nTmFtZSkKKyAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICB9CisgIHJldHVybiBYTUxfU1RBVFVTX09LOworfQorCitYTUxfUGFyc2VyIFhNTENBTEwKK1hNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShYTUxfUGFyc2VyIG9sZFBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IG9sZFBhcnNlcjsKKyAgRFREICpuZXdEdGQgPSBOVUxMOworICBEVEQgKm9sZER0ZCA9IF9kdGQ7CisgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIG9sZFN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzdGFydEVsZW1lbnRIYW5kbGVyOworICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgb2xkRW5kRWxlbWVudEhhbmRsZXIgPSBlbmRFbGVtZW50SGFuZGxlcjsKKyAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIG9sZENoYXJhY3RlckRhdGFIYW5kbGVyID0gY2hhcmFjdGVyRGF0YUhhbmRsZXI7CisgIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIG9sZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIKKyAgICAgID0gcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcjsKKyAgWE1MX0NvbW1lbnRIYW5kbGVyIG9sZENvbW1lbnRIYW5kbGVyID0gY29tbWVudEhhbmRsZXI7CisgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgb2xkU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyCisgICAgICA9IHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcjsKKyAgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgb2xkRW5kQ2RhdGFTZWN0aW9uSGFuZGxlcgorICAgICAgPSBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyOworICBYTUxfRGVmYXVsdEhhbmRsZXIgb2xkRGVmYXVsdEhhbmRsZXIgPSBkZWZhdWx0SGFuZGxlcjsKKyAgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgb2xkVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcgorICAgICAgPSB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyOworICBYTUxfTm90YXRpb25EZWNsSGFuZGxlciBvbGROb3RhdGlvbkRlY2xIYW5kbGVyID0gbm90YXRpb25EZWNsSGFuZGxlcjsKKyAgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgb2xkU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcgorICAgICAgPSBzdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyOworICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgb2xkRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIKKyAgICAgID0gZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXI7CisgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBvbGROb3RTdGFuZGFsb25lSGFuZGxlciA9IG5vdFN0YW5kYWxvbmVIYW5kbGVyOworICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIG9sZEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcgorICAgICAgPSBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXI7CisgIFhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciBvbGRTa2lwcGVkRW50aXR5SGFuZGxlciA9IHNraXBwZWRFbnRpdHlIYW5kbGVyOworICBYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlciBvbGRVbmtub3duRW5jb2RpbmdIYW5kbGVyCisgICAgICA9IHVua25vd25FbmNvZGluZ0hhbmRsZXI7CisgIFhNTF9FbGVtZW50RGVjbEhhbmRsZXIgb2xkRWxlbWVudERlY2xIYW5kbGVyID0gZWxlbWVudERlY2xIYW5kbGVyOworICBYTUxfQXR0bGlzdERlY2xIYW5kbGVyIG9sZEF0dGxpc3REZWNsSGFuZGxlciA9IGF0dGxpc3REZWNsSGFuZGxlcjsKKyAgWE1MX0VudGl0eURlY2xIYW5kbGVyIG9sZEVudGl0eURlY2xIYW5kbGVyID0gZW50aXR5RGVjbEhhbmRsZXI7CisgIFhNTF9YbWxEZWNsSGFuZGxlciBvbGRYbWxEZWNsSGFuZGxlciA9IHhtbERlY2xIYW5kbGVyOworICBFTEVNRU5UX1RZUEUgKiBvbGREZWNsRWxlbWVudFR5cGUgPSBkZWNsRWxlbWVudFR5cGU7CisKKyAgdm9pZCAqb2xkVXNlckRhdGEgPSB1c2VyRGF0YTsKKyAgdm9pZCAqb2xkSGFuZGxlckFyZyA9IGhhbmRsZXJBcmc7CisgIFhNTF9Cb29sIG9sZERlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzID0gZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXM7CisgIFhNTF9QYXJzZXIgb2xkRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnOworI2lmZGVmIFhNTF9EVEQKKyAgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIG9sZFBhcmFtRW50aXR5UGFyc2luZyA9IHBhcmFtRW50aXR5UGFyc2luZzsKKyAgaW50IG9sZEluRW50aXR5VmFsdWUgPSBwcm9sb2dTdGF0ZS5pbkVudGl0eVZhbHVlOworI2VuZGlmCisgIFhNTF9Cb29sIG9sZG5zX3RyaXBsZXRzID0gbnNfdHJpcGxldHM7CisKKyNpZmRlZiBYTUxfRFRECisgIGlmICghY29udGV4dCkKKyAgICBuZXdEdGQgPSBvbGREdGQ7CisjZW5kaWYgLyogWE1MX0RURCAqLworCisgIC8qIE5vdGUgdGhhdCB0aGUgbWFnaWNhbCB1c2VzIG9mIHRoZSBwcmUtcHJvY2Vzc29yIHRvIG1ha2UgZmllbGQKKyAgICAgYWNjZXNzIGxvb2sgbW9yZSBsaWtlIEMrKyByZXF1aXJlIHRoYXQgYHBhcnNlcicgYmUgb3ZlcndyaXR0ZW4KKyAgICAgaGVyZS4gIFRoaXMgbWFrZXMgdGhpcyBmdW5jdGlvbiBtb3JlIHBhaW5mdWwgdG8gZm9sbG93IHRoYW4gaXQKKyAgICAgd291bGQgYmUgb3RoZXJ3aXNlLgorICAqLworICBpZiAobnMpIHsKKyAgICBYTUxfQ2hhciB0bXBbMl07CisgICAgKnRtcCA9IG5hbWVzcGFjZVNlcGFyYXRvcjsKKyAgICBwYXJzZXIgPSBwYXJzZXJDcmVhdGUoZW5jb2RpbmdOYW1lLCAmcGFyc2VyLT5tX21lbSwgdG1wLCBuZXdEdGQpOworICB9CisgIGVsc2UgeworICAgIHBhcnNlciA9IHBhcnNlckNyZWF0ZShlbmNvZGluZ05hbWUsICZwYXJzZXItPm1fbWVtLCBOVUxMLCBuZXdEdGQpOworICB9CisKKyAgaWYgKCFwYXJzZXIpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgc3RhcnRFbGVtZW50SGFuZGxlciA9IG9sZFN0YXJ0RWxlbWVudEhhbmRsZXI7CisgIGVuZEVsZW1lbnRIYW5kbGVyID0gb2xkRW5kRWxlbWVudEhhbmRsZXI7CisgIGNoYXJhY3RlckRhdGFIYW5kbGVyID0gb2xkQ2hhcmFjdGVyRGF0YUhhbmRsZXI7CisgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBvbGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyOworICBjb21tZW50SGFuZGxlciA9IG9sZENvbW1lbnRIYW5kbGVyOworICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBvbGRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXI7CisgIGVuZENkYXRhU2VjdGlvbkhhbmRsZXIgPSBvbGRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyOworICBkZWZhdWx0SGFuZGxlciA9IG9sZERlZmF1bHRIYW5kbGVyOworICB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gb2xkVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcjsKKyAgbm90YXRpb25EZWNsSGFuZGxlciA9IG9sZE5vdGF0aW9uRGVjbEhhbmRsZXI7CisgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBvbGRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyOworICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IG9sZEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyOworICBub3RTdGFuZGFsb25lSGFuZGxlciA9IG9sZE5vdFN0YW5kYWxvbmVIYW5kbGVyOworICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSBvbGRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI7CisgIHNraXBwZWRFbnRpdHlIYW5kbGVyID0gb2xkU2tpcHBlZEVudGl0eUhhbmRsZXI7CisgIHVua25vd25FbmNvZGluZ0hhbmRsZXIgPSBvbGRVbmtub3duRW5jb2RpbmdIYW5kbGVyOworICBlbGVtZW50RGVjbEhhbmRsZXIgPSBvbGRFbGVtZW50RGVjbEhhbmRsZXI7CisgIGF0dGxpc3REZWNsSGFuZGxlciA9IG9sZEF0dGxpc3REZWNsSGFuZGxlcjsKKyAgZW50aXR5RGVjbEhhbmRsZXIgPSBvbGRFbnRpdHlEZWNsSGFuZGxlcjsKKyAgeG1sRGVjbEhhbmRsZXIgPSBvbGRYbWxEZWNsSGFuZGxlcjsKKyAgZGVjbEVsZW1lbnRUeXBlID0gb2xkRGVjbEVsZW1lbnRUeXBlOworICB1c2VyRGF0YSA9IG9sZFVzZXJEYXRhOworICBpZiAob2xkVXNlckRhdGEgPT0gb2xkSGFuZGxlckFyZykKKyAgICBoYW5kbGVyQXJnID0gdXNlckRhdGE7CisgIGVsc2UKKyAgICBoYW5kbGVyQXJnID0gcGFyc2VyOworICBpZiAob2xkRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnICE9IG9sZFBhcnNlcikKKyAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSBvbGRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmc7CisgIGRlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzID0gb2xkRGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXM7CisgIG5zX3RyaXBsZXRzID0gb2xkbnNfdHJpcGxldHM7CisgIHBhcmVudFBhcnNlciA9IG9sZFBhcnNlcjsKKyNpZmRlZiBYTUxfRFRECisgIHBhcmFtRW50aXR5UGFyc2luZyA9IG9sZFBhcmFtRW50aXR5UGFyc2luZzsKKyAgcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZSA9IG9sZEluRW50aXR5VmFsdWU7CisgIGlmIChjb250ZXh0KSB7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIGlmICghZHRkQ29weShfZHRkLCBvbGREdGQsICZwYXJzZXItPm1fbWVtKQorICAgICAgfHwgIXNldENvbnRleHQocGFyc2VyLCBjb250ZXh0KSkgeworICAgICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwcm9jZXNzb3IgPSBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3I7CisjaWZkZWYgWE1MX0RURAorICB9CisgIGVsc2UgeworICAgIC8qIFRoZSBEVEQgaW5zdGFuY2UgcmVmZXJlbmNlZCBieSBfZHRkIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBkb2N1bWVudCdzCisgICAgICAgcm9vdCBwYXJzZXIgYW5kIGV4dGVybmFsIFBFIHBhcnNlcnMsIHRoZXJlZm9yZSBvbmUgZG9lcyBub3QgbmVlZCB0bworICAgICAgIGNhbGwgc2V0Q29udGV4dC4gSW4gYWRkaXRpb24sIG9uZSBhbHNvICptdXN0KiBub3QgY2FsbCBzZXRDb250ZXh0LAorICAgICAgIGJlY2F1c2UgdGhpcyB3b3VsZCBvdmVyd3JpdGUgZXhpc3RpbmcgcHJlZml4LT5iaW5kaW5nIHBvaW50ZXJzIGluCisgICAgICAgX2R0ZCB3aXRoIG9uZXMgdGhhdCBnZXQgZGVzdHJveWVkIHdpdGggdGhlIGV4dGVybmFsIFBFIHBhcnNlci4KKyAgICAgICBUaGlzIHdvdWxkIGxlYXZlIHRob3NlIHByZWZpeGVzIHdpdGggZGFuZ2xpbmcgcG9pbnRlcnMuCisgICAgKi8KKyAgICBpc1BhcmFtRW50aXR5ID0gWE1MX1RSVUU7CisgICAgWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnRpdHkoJnByb2xvZ1N0YXRlKTsKKyAgICBwcm9jZXNzb3IgPSBleHRlcm5hbFBhckVudEluaXRQcm9jZXNzb3I7CisgIH0KKyNlbmRpZiAvKiBYTUxfRFREICovCisgIHJldHVybiBwYXJzZXI7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitkZXN0cm95QmluZGluZ3MoQklORElORyAqYmluZGluZ3MsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBmb3IgKDs7KSB7CisgICAgQklORElORyAqYiA9IGJpbmRpbmdzOworICAgIGlmICghYikKKyAgICAgIGJyZWFrOworICAgIGJpbmRpbmdzID0gYi0+bmV4dFRhZ0JpbmRpbmc7CisgICAgRlJFRShiLT51cmkpOworICAgIEZSRUUoYik7CisgIH0KK30KKwordm9pZCBYTUxDQUxMCitYTUxfUGFyc2VyRnJlZShYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgVEFHICp0YWdMaXN0OworICBPUEVOX0lOVEVSTkFMX0VOVElUWSAqZW50aXR5TGlzdDsKKyAgaWYgKHBhcnNlciA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgLyogZnJlZSB0YWdTdGFjayBhbmQgZnJlZVRhZ0xpc3QgKi8KKyAgdGFnTGlzdCA9IHRhZ1N0YWNrOworICBmb3IgKDs7KSB7CisgICAgVEFHICpwOworICAgIGlmICh0YWdMaXN0ID09IE5VTEwpIHsKKyAgICAgIGlmIChmcmVlVGFnTGlzdCA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICAgIHRhZ0xpc3QgPSBmcmVlVGFnTGlzdDsKKyAgICAgIGZyZWVUYWdMaXN0ID0gTlVMTDsKKyAgICB9CisgICAgcCA9IHRhZ0xpc3Q7CisgICAgdGFnTGlzdCA9IHRhZ0xpc3QtPnBhcmVudDsKKyAgICBGUkVFKHAtPmJ1Zik7CisgICAgZGVzdHJveUJpbmRpbmdzKHAtPmJpbmRpbmdzLCBwYXJzZXIpOworICAgIEZSRUUocCk7CisgIH0KKyAgLyogZnJlZSBvcGVuSW50ZXJuYWxFbnRpdGllcyBhbmQgZnJlZUludGVybmFsRW50aXRpZXMgKi8KKyAgZW50aXR5TGlzdCA9IG9wZW5JbnRlcm5hbEVudGl0aWVzOworICBmb3IgKDs7KSB7CisgICAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHk7CisgICAgaWYgKGVudGl0eUxpc3QgPT0gTlVMTCkgeworICAgICAgaWYgKGZyZWVJbnRlcm5hbEVudGl0aWVzID09IE5VTEwpCisgICAgICAgIGJyZWFrOworICAgICAgZW50aXR5TGlzdCA9IGZyZWVJbnRlcm5hbEVudGl0aWVzOworICAgICAgZnJlZUludGVybmFsRW50aXRpZXMgPSBOVUxMOworICAgIH0KKyAgICBvcGVuRW50aXR5ID0gZW50aXR5TGlzdDsKKyAgICBlbnRpdHlMaXN0ID0gZW50aXR5TGlzdC0+bmV4dDsKKyAgICBGUkVFKG9wZW5FbnRpdHkpOworICB9CisKKyAgZGVzdHJveUJpbmRpbmdzKGZyZWVCaW5kaW5nTGlzdCwgcGFyc2VyKTsKKyAgZGVzdHJveUJpbmRpbmdzKGluaGVyaXRlZEJpbmRpbmdzLCBwYXJzZXIpOworICBwb29sRGVzdHJveSgmdGVtcFBvb2wpOworICBwb29sRGVzdHJveSgmdGVtcDJQb29sKTsKKyNpZmRlZiBYTUxfRFRECisgIC8qIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkgcGFyc2VycyBzaGFyZSB0aGUgRFREIHN0cnVjdHVyZQorICAgICBwYXJzZXItPm1fZHRkIHdpdGggdGhlIHJvb3QgcGFyc2VyLCBzbyB3ZSBtdXN0IG5vdCBkZXN0cm95IGl0CisgICovCisgIGlmICghaXNQYXJhbUVudGl0eSAmJiBfZHRkKQorI2Vsc2UKKyAgaWYgKF9kdGQpCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIGR0ZERlc3Ryb3koX2R0ZCwgKFhNTF9Cb29sKSFwYXJlbnRQYXJzZXIsICZwYXJzZXItPm1fbWVtKTsKKyAgRlJFRSgodm9pZCAqKWF0dHMpOworICBGUkVFKGdyb3VwQ29ubmVjdG9yKTsKKyAgRlJFRShidWZmZXIpOworICBGUkVFKGRhdGFCdWYpOworICBGUkVFKG5zQXR0cyk7CisgIEZSRUUodW5rbm93bkVuY29kaW5nTWVtKTsKKyAgaWYgKHVua25vd25FbmNvZGluZ1JlbGVhc2UpCisgICAgdW5rbm93bkVuY29kaW5nUmVsZWFzZSh1bmtub3duRW5jb2RpbmdEYXRhKTsKKyAgRlJFRShwYXJzZXIpOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGhhbmRsZXJBcmcgPSBwYXJzZXI7Cit9CisKK2VudW0gWE1MX0Vycm9yIFhNTENBTEwKK1hNTF9Vc2VGb3JlaWduRFREKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCB1c2VEVEQpCit7CisjaWZkZWYgWE1MX0RURAorICAvKiBibG9jayBhZnRlciBYTUxfUGFyc2UoKS9YTUxfUGFyc2VCdWZmZXIoKSBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQorICAgIHJldHVybiBYTUxfRVJST1JfQ0FOVF9DSEFOR0VfRkVBVFVSRV9PTkNFX1BBUlNJTkc7CisgIHVzZUZvcmVpZ25EVEQgPSB1c2VEVEQ7CisgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyNlbHNlCisgIHJldHVybiBYTUxfRVJST1JfRkVBVFVSRV9SRVFVSVJFU19YTUxfRFREOworI2VuZGlmCit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFJldHVybk5TVHJpcGxldChYTUxfUGFyc2VyIHBhcnNlciwgaW50IGRvX25zdCkKK3sKKyAgLyogYmxvY2sgYWZ0ZXIgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCkgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgICByZXR1cm47CisgIG5zX3RyaXBsZXRzID0gZG9fbnN0ID8gWE1MX1RSVUUgOiBYTUxfRkFMU0U7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFVzZXJEYXRhKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwKQoreworICBpZiAoaGFuZGxlckFyZyA9PSB1c2VyRGF0YSkKKyAgICBoYW5kbGVyQXJnID0gdXNlckRhdGEgPSBwOworICBlbHNlCisgICAgdXNlckRhdGEgPSBwOworfQorCitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1NldEJhc2UoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICpwKQoreworICBpZiAocCkgeworICAgIHAgPSBwb29sQ29weVN0cmluZygmX2R0ZC0+cG9vbCwgcCk7CisgICAgaWYgKCFwKQorICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgICAgY3VyQmFzZSA9IHA7CisgIH0KKyAgZWxzZQorICAgIGN1ckJhc2UgPSBOVUxMOworICByZXR1cm4gWE1MX1NUQVRVU19PSzsKK30KKworY29uc3QgWE1MX0NoYXIgKiBYTUxDQUxMCitYTUxfR2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgcmV0dXJuIGN1ckJhc2U7Cit9CisKK2ludCBYTUxDQUxMCitYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIHJldHVybiBuU3BlY2lmaWVkQXR0czsKK30KKworaW50IFhNTENBTEwKK1hNTF9HZXRJZEF0dHJpYnV0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKQoreworICByZXR1cm4gaWRBdHRJbmRleDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCkKK3sKKyAgc3RhcnRFbGVtZW50SGFuZGxlciA9IHN0YXJ0OworICBlbmRFbGVtZW50SGFuZGxlciA9IGVuZDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0KSB7CisgIHN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzdGFydDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCkgeworICBlbmRFbGVtZW50SGFuZGxlciA9IGVuZDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpCit7CisgIGNoYXJhY3RlckRhdGFIYW5kbGVyID0gaGFuZGxlcjsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpCit7CisgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRDb21tZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfQ29tbWVudEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgY29tbWVudEhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCkKK3sKKyAgc3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gc3RhcnQ7CisgIGVuZENkYXRhU2VjdGlvbkhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCkgeworICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBzdGFydDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIGVuZCkgeworICBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gZW5kOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXREZWZhdWx0SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOworICBkZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllcyA9IFhNTF9GQUxTRTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpCit7CisgIGRlZmF1bHRIYW5kbGVyID0gaGFuZGxlcjsKKyAgZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgPSBYTUxfVFJVRTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKQoreworICBzdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IHN0YXJ0OworICBlbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydERvY3R5cGVEZWNsSGFuZGxlciBzdGFydCkgeworICBzdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IHN0YXJ0OworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRFbmREb2N0eXBlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmREb2N0eXBlRGVjbEhhbmRsZXIgZW5kKSB7CisgIGVuZERvY3R5cGVEZWNsSGFuZGxlciA9IGVuZDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpCit7CisgIHVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcikKK3sKKyAgbm90YXRpb25EZWNsSGFuZGxlciA9IGhhbmRsZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpCit7CisgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBzdGFydDsKKyAgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCkgeworICBzdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gc3RhcnQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpIHsKKyAgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBlbmQ7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKQoreworICBub3RTdGFuZGFsb25lSGFuZGxlciA9IGhhbmRsZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlciBoYW5kbGVyKQoreworICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSBoYW5kbGVyOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKmFyZykKK3sKKyAgaWYgKGFyZykKKyAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSAoWE1MX1BhcnNlcilhcmc7CisgIGVsc2UKKyAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSBwYXJzZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFNraXBwZWRFbnRpdHlIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9Ta2lwcGVkRW50aXR5SGFuZGxlciBoYW5kbGVyKQoreworICBza2lwcGVkRW50aXR5SGFuZGxlciA9IGhhbmRsZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgdW5rbm93bkVuY29kaW5nSGFuZGxlciA9IGhhbmRsZXI7CisgIHVua25vd25FbmNvZGluZ0hhbmRsZXJEYXRhID0gZGF0YTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RWxlbWVudERlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfRWxlbWVudERlY2xIYW5kbGVyIGVsZGVjbCkKK3sKKyAgZWxlbWVudERlY2xIYW5kbGVyID0gZWxkZWNsOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9TZXRBdHRsaXN0RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9BdHRsaXN0RGVjbEhhbmRsZXIgYXR0ZGVjbCkKK3sKKyAgYXR0bGlzdERlY2xIYW5kbGVyID0gYXR0ZGVjbDsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0VudGl0eURlY2xIYW5kbGVyIGhhbmRsZXIpCit7CisgIGVudGl0eURlY2xIYW5kbGVyID0gaGFuZGxlcjsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfU2V0WG1sRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgWE1MX1htbERlY2xIYW5kbGVyIGhhbmRsZXIpIHsKKyAgeG1sRGVjbEhhbmRsZXIgPSBoYW5kbGVyOworfQorCitpbnQgWE1MQ0FMTAorWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZyhYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIHBlUGFyc2luZykKK3sKKyAgLyogYmxvY2sgYWZ0ZXIgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCkgaGFzIGJlZW4gY2FsbGVkICovCisgIGlmIChwc19wYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgICByZXR1cm4gMDsKKyNpZmRlZiBYTUxfRFRECisgIHBhcmFtRW50aXR5UGFyc2luZyA9IHBlUGFyc2luZzsKKyAgcmV0dXJuIDE7CisjZWxzZQorICByZXR1cm4gcGVQYXJzaW5nID09IFhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19ORVZFUjsKKyNlbmRpZgorfQorCitlbnVtIFhNTF9TdGF0dXMgWE1MQ0FMTAorWE1MX1BhcnNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCkKK3sKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOworICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGRlZmF1bHQ6CisgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOworICB9CisKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgcHNfZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKKyAgICBpZiAoIWlzRmluYWwpCisgICAgICByZXR1cm4gWE1MX1NUQVRVU19PSzsKKyAgICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKKyAgICBwYXJzZUVuZFB0ciA9IGJ1ZmZlckVuZDsKKworICAgIC8qIElmIGRhdGEgYXJlIGxlZnQgb3ZlciBmcm9tIGxhc3QgYnVmZmVyLCBhbmQgd2Ugbm93IGtub3cgdGhhdCB0aGVzZQorICAgICAgIGRhdGEgYXJlIHRoZSBmaW5hbCBjaHVuayBvZiBpbnB1dCwgdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIHRoZW0gYWdhaW4KKyAgICAgICB0byBkZXRlY3QgZXJyb3JzIGJhc2VkIG9uIHRoYXQgZmFjdC4KKyAgICAqLworICAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIGJ1ZmZlclB0ciwgcGFyc2VFbmRQdHIsICZidWZmZXJQdHIpOworCisgICAgaWYgKGVycm9yQ29kZSA9PSBYTUxfRVJST1JfTk9ORSkgeworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgYnVmZmVyUHRyLCAmcG9zaXRpb24pOworICAgICAgICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfU1VTUEVOREVEOworICAgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAorICAgICAgY2FzZSBYTUxfUEFSU0lORzoKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19PSzsKKyAgICAgIH0KKyAgICB9CisgICAgZXZlbnRFbmRQdHIgPSBldmVudFB0cjsKKyAgICBwcm9jZXNzb3IgPSBlcnJvclByb2Nlc3NvcjsKKyAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgfQorI2lmbmRlZiBYTUxfQ09OVEVYVF9CWVRFUworICBlbHNlIGlmIChidWZmZXJQdHIgPT0gYnVmZmVyRW5kKSB7CisgICAgY29uc3QgY2hhciAqZW5kOworICAgIGludCBuTGVmdE92ZXI7CisgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgIHBhcnNlRW5kQnl0ZUluZGV4ICs9IGxlbjsKKyAgICBwb3NpdGlvblB0ciA9IHM7CisgICAgcHNfZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKKworICAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIHMsIHBhcnNlRW5kUHRyID0gcyArIGxlbiwgJmVuZCk7CisKKyAgICBpZiAoZXJyb3JDb2RlICE9IFhNTF9FUlJPUl9OT05FKSB7CisgICAgICBldmVudEVuZFB0ciA9IGV2ZW50UHRyOworICAgICAgcHJvY2Vzc29yID0gZXJyb3JQcm9jZXNzb3I7CisgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICAgICAgcmVzdWx0ID0gWE1MX1NUQVRVU19TVVNQRU5ERUQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6CisgICAgICBjYXNlIFhNTF9QQVJTSU5HOgorICAgICAgICByZXN1bHQgPSBYTUxfU1RBVFVTX09LOworICAgICAgICBpZiAoaXNGaW5hbCkgeworICAgICAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgZW5kLCAmcG9zaXRpb24pOworICAgIG5MZWZ0T3ZlciA9IHMgKyBsZW4gLSBlbmQ7CisgICAgaWYgKG5MZWZ0T3ZlcikgeworICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IG5MZWZ0T3ZlciA+IGJ1ZmZlckxpbSAtIGJ1ZmZlcikgeworICAgICAgICAvKiBGSVhNRSBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgICAgIGNoYXIgKnRlbXA7CisgICAgICAgIHRlbXAgPSAoYnVmZmVyID09IE5VTEwKKyAgICAgICAgICAgICAgICA/IChjaGFyICopTUFMTE9DKGxlbiAqIDIpCisgICAgICAgICAgICAgICAgOiAoY2hhciAqKVJFQUxMT0MoYnVmZmVyLCBsZW4gKiAyKSk7CisgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKKyAgICAgICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlciA9IHRlbXA7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICBldmVudFB0ciA9IGV2ZW50RW5kUHRyID0gTlVMTDsKKyAgICAgICAgICBwcm9jZXNzb3IgPSBlcnJvclByb2Nlc3NvcjsKKyAgICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJMaW0gPSBidWZmZXIgKyBsZW4gKiAyOworICAgICAgfQorICAgICAgbWVtY3B5KGJ1ZmZlciwgZW5kLCBuTGVmdE92ZXIpOworICAgIH0KKyAgICBidWZmZXJQdHIgPSBidWZmZXI7CisgICAgYnVmZmVyRW5kID0gYnVmZmVyICsgbkxlZnRPdmVyOworICAgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOworICAgIHBhcnNlRW5kUHRyID0gYnVmZmVyRW5kOworICAgIGV2ZW50UHRyID0gYnVmZmVyUHRyOworICAgIGV2ZW50RW5kUHRyID0gYnVmZmVyUHRyOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KKyAgZWxzZSB7CisgICAgdm9pZCAqYnVmZiA9IFhNTF9HZXRCdWZmZXIocGFyc2VyLCBsZW4pOworICAgIGlmIChidWZmID09IE5VTEwpCisgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICBlbHNlIHsKKyAgICAgIG1lbWNweShidWZmLCBzLCBsZW4pOworICAgICAgcmV0dXJuIFhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGxlbiwgaXNGaW5hbCk7CisgICAgfQorICB9Cit9CisKK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfUGFyc2VCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4sIGludCBpc0ZpbmFsKQoreworICBjb25zdCBjaGFyICpzdGFydDsKKyAgZW51bSBYTUxfU3RhdHVzIHJlc3VsdCA9IFhNTF9TVEFUVVNfT0s7CisKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOworICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGRlZmF1bHQ6CisgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOworICB9CisKKyAgc3RhcnQgPSBidWZmZXJQdHI7CisgIHBvc2l0aW9uUHRyID0gc3RhcnQ7CisgIGJ1ZmZlckVuZCArPSBsZW47CisgIHBhcnNlRW5kUHRyID0gYnVmZmVyRW5kOworICBwYXJzZUVuZEJ5dGVJbmRleCArPSBsZW47CisgIHBzX2ZpbmFsQnVmZmVyID0gKFhNTF9Cb29sKWlzRmluYWw7CisKKyAgZXJyb3JDb2RlID0gcHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIHBhcnNlRW5kUHRyLCAmYnVmZmVyUHRyKTsKKworICBpZiAoZXJyb3JDb2RlICE9IFhNTF9FUlJPUl9OT05FKSB7CisgICAgZXZlbnRFbmRQdHIgPSBldmVudFB0cjsKKyAgICBwcm9jZXNzb3IgPSBlcnJvclByb2Nlc3NvcjsKKyAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgICByZXN1bHQgPSBYTUxfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOiAKKyAgICBjYXNlIFhNTF9QQVJTSU5HOgorICAgICAgaWYgKGlzRmluYWwpIHsKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OiA7ICAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworICAgIH0KKyAgfQorCisgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgYnVmZmVyUHRyLCAmcG9zaXRpb24pOworICBwb3NpdGlvblB0ciA9IGJ1ZmZlclB0cjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCAqIFhNTENBTEwKK1hNTF9HZXRCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pCit7CisgIHN3aXRjaCAocHNfcGFyc2luZykgeworICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX1NVU1BFTkRFRDsKKyAgICByZXR1cm4gTlVMTDsKKyAgY2FzZSBYTUxfRklOSVNIRUQ6CisgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX0ZJTklTSEVEOworICAgIHJldHVybiBOVUxMOworICBkZWZhdWx0OiA7CisgIH0KKworICBpZiAobGVuID4gYnVmZmVyTGltIC0gYnVmZmVyRW5kKSB7CisgICAgLyogRklYTUUgYXZvaWQgaW50ZWdlciBvdmVyZmxvdyAqLworICAgIGludCBuZWVkZWRTaXplID0gbGVuICsgKGludCkoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyNpZmRlZiBYTUxfQ09OVEVYVF9CWVRFUworICAgIGludCBrZWVwID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKTsKKworICAgIGlmIChrZWVwID4gWE1MX0NPTlRFWFRfQllURVMpCisgICAgICBrZWVwID0gWE1MX0NPTlRFWFRfQllURVM7CisgICAgbmVlZGVkU2l6ZSArPSBrZWVwOworI2VuZGlmICAvKiBkZWZpbmVkIFhNTF9DT05URVhUX0JZVEVTICovCisgICAgaWYgKG5lZWRlZFNpemUgIDw9IGJ1ZmZlckxpbSAtIGJ1ZmZlcikgeworI2lmZGVmIFhNTF9DT05URVhUX0JZVEVTCisgICAgICBpZiAoa2VlcCA8IGJ1ZmZlclB0ciAtIGJ1ZmZlcikgeworICAgICAgICBpbnQgb2Zmc2V0ID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKSAtIGtlZXA7CisgICAgICAgIG1lbW1vdmUoYnVmZmVyLCAmYnVmZmVyW29mZnNldF0sIGJ1ZmZlckVuZCAtIGJ1ZmZlclB0ciArIGtlZXApOworICAgICAgICBidWZmZXJFbmQgLT0gb2Zmc2V0OworICAgICAgICBidWZmZXJQdHIgLT0gb2Zmc2V0OworICAgICAgfQorI2Vsc2UKKyAgICAgIG1lbW1vdmUoYnVmZmVyLCBidWZmZXJQdHIsIGJ1ZmZlckVuZCAtIGJ1ZmZlclB0cik7CisgICAgICBidWZmZXJFbmQgPSBidWZmZXIgKyAoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyAgICAgIGJ1ZmZlclB0ciA9IGJ1ZmZlcjsKKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjaGFyICpuZXdCdWY7CisgICAgICBpbnQgYnVmZmVyU2l6ZSA9IChpbnQpKGJ1ZmZlckxpbSAtIGJ1ZmZlclB0cik7CisgICAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwKQorICAgICAgICBidWZmZXJTaXplID0gSU5JVF9CVUZGRVJfU0laRTsKKyAgICAgIGRvIHsKKyAgICAgICAgYnVmZmVyU2l6ZSAqPSAyOworICAgICAgfSB3aGlsZSAoYnVmZmVyU2l6ZSA8IG5lZWRlZFNpemUpOworICAgICAgbmV3QnVmID0gKGNoYXIgKilNQUxMT0MoYnVmZmVyU2l6ZSk7CisgICAgICBpZiAobmV3QnVmID09IDApIHsKKyAgICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBidWZmZXJMaW0gPSBuZXdCdWYgKyBidWZmZXJTaXplOworI2lmZGVmIFhNTF9DT05URVhUX0JZVEVTCisgICAgICBpZiAoYnVmZmVyUHRyKSB7CisgICAgICAgIGludCBrZWVwID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKTsKKyAgICAgICAgaWYgKGtlZXAgPiBYTUxfQ09OVEVYVF9CWVRFUykKKyAgICAgICAgICBrZWVwID0gWE1MX0NPTlRFWFRfQllURVM7CisgICAgICAgIG1lbWNweShuZXdCdWYsICZidWZmZXJQdHJbLWtlZXBdLCBidWZmZXJFbmQgLSBidWZmZXJQdHIgKyBrZWVwKTsKKyAgICAgICAgRlJFRShidWZmZXIpOworICAgICAgICBidWZmZXIgPSBuZXdCdWY7CisgICAgICAgIGJ1ZmZlckVuZCA9IGJ1ZmZlciArIChidWZmZXJFbmQgLSBidWZmZXJQdHIpICsga2VlcDsKKyAgICAgICAgYnVmZmVyUHRyID0gYnVmZmVyICsga2VlcDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBidWZmZXJFbmQgPSBuZXdCdWYgKyAoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyAgICAgICAgYnVmZmVyUHRyID0gYnVmZmVyID0gbmV3QnVmOworICAgICAgfQorI2Vsc2UKKyAgICAgIGlmIChidWZmZXJQdHIpIHsKKyAgICAgICAgbWVtY3B5KG5ld0J1ZiwgYnVmZmVyUHRyLCBidWZmZXJFbmQgLSBidWZmZXJQdHIpOworICAgICAgICBGUkVFKGJ1ZmZlcik7CisgICAgICB9CisgICAgICBidWZmZXJFbmQgPSBuZXdCdWYgKyAoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKKyAgICAgIGJ1ZmZlclB0ciA9IGJ1ZmZlciA9IG5ld0J1ZjsKKyNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX0NPTlRFWFRfQllURVMgKi8KKyAgICB9CisgIH0KKyAgcmV0dXJuIGJ1ZmZlckVuZDsKK30KKworZW51bSBYTUxfU3RhdHVzIFhNTENBTEwKK1hNTF9TdG9wUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQm9vbCByZXN1bWFibGUpCit7CisgIHN3aXRjaCAocHNfcGFyc2luZykgeworICBjYXNlIFhNTF9TVVNQRU5ERUQ6CisgICAgaWYgKHJlc3VtYWJsZSkgeworICAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX1NVU1BFTkRFRDsKKyAgICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICAgIH0KKyAgICBwc19wYXJzaW5nID0gWE1MX0ZJTklTSEVEOworICAgIGJyZWFrOworICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfRklOSVNIRUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIGRlZmF1bHQ6CisgICAgaWYgKHJlc3VtYWJsZSkgeworI2lmZGVmIFhNTF9EVEQKKyAgICAgIGlmIChpc1BhcmFtRW50aXR5KSB7CisgICAgICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9TVVNQRU5EX1BFOworICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgcHNfcGFyc2luZyA9IFhNTF9TVVNQRU5ERUQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CisgIH0KKyAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7Cit9CisKK2VudW0gWE1MX1N0YXR1cyBYTUxDQUxMCitYTUxfUmVzdW1lUGFyc2VyKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBlbnVtIFhNTF9TdGF0dXMgcmVzdWx0ID0gWE1MX1NUQVRVU19PSzsKKworICBpZiAocHNfcGFyc2luZyAhPSBYTUxfU1VTUEVOREVEKSB7CisgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PVF9TVVNQRU5ERUQ7CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CisgIH0KKyAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOworCisgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIGJ1ZmZlclB0ciwgcGFyc2VFbmRQdHIsICZidWZmZXJQdHIpOworCisgIGlmIChlcnJvckNvZGUgIT0gWE1MX0VSUk9SX05PTkUpIHsKKyAgICBldmVudEVuZFB0ciA9IGV2ZW50UHRyOworICAgIHByb2Nlc3NvciA9IGVycm9yUHJvY2Vzc29yOworICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworICB9CisgIGVsc2UgeworICAgIHN3aXRjaCAocHNfcGFyc2luZykgeworICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICAgIHJlc3VsdCA9IFhNTF9TVEFUVVNfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfSU5JVElBTElaRUQ6IAorICAgIGNhc2UgWE1MX1BBUlNJTkc6CisgICAgICBpZiAocHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OiA7CisgICAgfQorICB9CisKKyAgWG1sVXBkYXRlUG9zaXRpb24oZW5jb2RpbmcsIHBvc2l0aW9uUHRyLCBidWZmZXJQdHIsICZwb3NpdGlvbik7CisgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFhNTENBTEwKK1hNTF9HZXRQYXJzaW5nU3RhdHVzKFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfUGFyc2luZ1N0YXR1cyAqc3RhdHVzKQoreworICBhc3NlcnQoc3RhdHVzICE9IE5VTEwpOworICAqc3RhdHVzID0gcGFyc2VyLT5tX3BhcnNpbmdTdGF0dXM7Cit9CisKK2VudW0gWE1MX0Vycm9yIFhNTENBTEwKK1hNTF9HZXRFcnJvckNvZGUoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIHJldHVybiBlcnJvckNvZGU7Cit9CisKK1hNTF9JbmRleCBYTUxDQUxMCitYTUxfR2V0Q3VycmVudEJ5dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgaWYgKGV2ZW50UHRyKQorICAgIHJldHVybiBwYXJzZUVuZEJ5dGVJbmRleCAtIChwYXJzZUVuZFB0ciAtIGV2ZW50UHRyKTsKKyAgcmV0dXJuIC0xOworfQorCitpbnQgWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRCeXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGlmIChldmVudEVuZFB0ciAmJiBldmVudFB0cikKKyAgICByZXR1cm4gKGludCkoZXZlbnRFbmRQdHIgLSBldmVudFB0cik7CisgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICogWE1MQ0FMTAorWE1MX0dldElucHV0Q29udGV4dChYTUxfUGFyc2VyIHBhcnNlciwgaW50ICpvZmZzZXQsIGludCAqc2l6ZSkKK3sKKyNpZmRlZiBYTUxfQ09OVEVYVF9CWVRFUworICBpZiAoZXZlbnRQdHIgJiYgYnVmZmVyKSB7CisgICAgKm9mZnNldCA9IChpbnQpKGV2ZW50UHRyIC0gYnVmZmVyKTsKKyAgICAqc2l6ZSAgID0gKGludCkoYnVmZmVyRW5kIC0gYnVmZmVyKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisjZW5kaWYgLyogZGVmaW5lZCBYTUxfQ09OVEVYVF9CWVRFUyAqLworICByZXR1cm4gKGNoYXIgKikgMDsKK30KKworWE1MX1NpemUgWE1MQ0FMTAorWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBpZiAoZXZlbnRQdHIgJiYgZXZlbnRQdHIgPj0gcG9zaXRpb25QdHIpIHsKKyAgICBYbWxVcGRhdGVQb3NpdGlvbihlbmNvZGluZywgcG9zaXRpb25QdHIsIGV2ZW50UHRyLCAmcG9zaXRpb24pOworICAgIHBvc2l0aW9uUHRyID0gZXZlbnRQdHI7CisgIH0KKyAgcmV0dXJuIHBvc2l0aW9uLmxpbmVOdW1iZXIgKyAxOworfQorCitYTUxfU2l6ZSBYTUxDQUxMCitYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgaWYgKGV2ZW50UHRyICYmIGV2ZW50UHRyID49IHBvc2l0aW9uUHRyKSB7CisgICAgWG1sVXBkYXRlUG9zaXRpb24oZW5jb2RpbmcsIHBvc2l0aW9uUHRyLCBldmVudFB0ciwgJnBvc2l0aW9uKTsKKyAgICBwb3NpdGlvblB0ciA9IGV2ZW50UHRyOworICB9CisgIHJldHVybiBwb3NpdGlvbi5jb2x1bW5OdW1iZXI7Cit9CisKK3ZvaWQgWE1MQ0FMTAorWE1MX0ZyZWVDb250ZW50TW9kZWwoWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db250ZW50ICptb2RlbCkKK3sKKyAgRlJFRShtb2RlbCk7Cit9CisKK3ZvaWQgKiBYTUxDQUxMCitYTUxfTWVtTWFsbG9jKFhNTF9QYXJzZXIgcGFyc2VyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIE1BTExPQyhzaXplKTsKK30KKwordm9pZCAqIFhNTENBTEwKK1hNTF9NZW1SZWFsbG9jKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworICByZXR1cm4gUkVBTExPQyhwdHIsIHNpemUpOworfQorCit2b2lkIFhNTENBTEwKK1hNTF9NZW1GcmVlKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICpwdHIpCit7CisgIEZSRUUocHRyKTsKK30KKwordm9pZCBYTUxDQUxMCitYTUxfRGVmYXVsdEN1cnJlbnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGlmIChkZWZhdWx0SGFuZGxlcikgeworICAgIGlmIChvcGVuSW50ZXJuYWxFbnRpdGllcykKKyAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudFB0ciwKKyAgICAgICAgICAgICAgICAgICAgb3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRFbmRQdHIpOworICAgIGVsc2UKKyAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmNvZGluZywgZXZlbnRQdHIsIGV2ZW50RW5kUHRyKTsKKyAgfQorfQorCitjb25zdCBYTUxfTENoYXIgKiBYTUxDQUxMCitYTUxfRXJyb3JTdHJpbmcoZW51bSBYTUxfRXJyb3IgY29kZSkKK3sKKyAgc3RhdGljIGNvbnN0IFhNTF9MQ2hhciogY29uc3QgbWVzc2FnZVtdID0geworICAgIDAsCisgICAgWE1MX0woIm91dCBvZiBtZW1vcnkiKSwKKyAgICBYTUxfTCgic3ludGF4IGVycm9yIiksCisgICAgWE1MX0woIm5vIGVsZW1lbnQgZm91bmQiKSwKKyAgICBYTUxfTCgibm90IHdlbGwtZm9ybWVkIChpbnZhbGlkIHRva2VuKSIpLAorICAgIFhNTF9MKCJ1bmNsb3NlZCB0b2tlbiIpLAorICAgIFhNTF9MKCJwYXJ0aWFsIGNoYXJhY3RlciIpLAorICAgIFhNTF9MKCJtaXNtYXRjaGVkIHRhZyIpLAorICAgIFhNTF9MKCJkdXBsaWNhdGUgYXR0cmlidXRlIiksCisgICAgWE1MX0woImp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudCIpLAorICAgIFhNTF9MKCJpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIiksCisgICAgWE1MX0woInVuZGVmaW5lZCBlbnRpdHkiKSwKKyAgICBYTUxfTCgicmVjdXJzaXZlIGVudGl0eSByZWZlcmVuY2UiKSwKKyAgICBYTUxfTCgiYXN5bmNocm9ub3VzIGVudGl0eSIpLAorICAgIFhNTF9MKCJyZWZlcmVuY2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgbnVtYmVyIiksCisgICAgWE1MX0woInJlZmVyZW5jZSB0byBiaW5hcnkgZW50aXR5IiksCisgICAgWE1MX0woInJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlIiksCisgICAgWE1MX0woIlhNTCBvciB0ZXh0IGRlY2xhcmF0aW9uIG5vdCBhdCBzdGFydCBvZiBlbnRpdHkiKSwKKyAgICBYTUxfTCgidW5rbm93biBlbmNvZGluZyIpLAorICAgIFhNTF9MKCJlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdCIpLAorICAgIFhNTF9MKCJ1bmNsb3NlZCBDREFUQSBzZWN0aW9uIiksCisgICAgWE1MX0woImVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZSIpLAorICAgIFhNTF9MKCJkb2N1bWVudCBpcyBub3Qgc3RhbmRhbG9uZSIpLAorICAgIFhNTF9MKCJ1bmV4cGVjdGVkIHBhcnNlciBzdGF0ZSAtIHBsZWFzZSBzZW5kIGEgYnVnIHJlcG9ydCIpLAorICAgIFhNTF9MKCJlbnRpdHkgZGVjbGFyZWQgaW4gcGFyYW1ldGVyIGVudGl0eSIpLAorICAgIFhNTF9MKCJyZXF1ZXN0ZWQgZmVhdHVyZSByZXF1aXJlcyBYTUxfRFREIHN1cHBvcnQgaW4gRXhwYXQiKSwKKyAgICBYTUxfTCgiY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4iKSwKKyAgICBYTUxfTCgidW5ib3VuZCBwcmVmaXgiKSwKKyAgICBYTUxfTCgibXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeCIpLAorICAgIFhNTF9MKCJpbmNvbXBsZXRlIG1hcmt1cCBpbiBwYXJhbWV0ZXIgZW50aXR5IiksCisgICAgWE1MX0woIlhNTCBkZWNsYXJhdGlvbiBub3Qgd2VsbC1mb3JtZWQiKSwKKyAgICBYTUxfTCgidGV4dCBkZWNsYXJhdGlvbiBub3Qgd2VsbC1mb3JtZWQiKSwKKyAgICBYTUxfTCgiaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkIiksCisgICAgWE1MX0woInBhcnNlciBzdXNwZW5kZWQiKSwKKyAgICBYTUxfTCgicGFyc2VyIG5vdCBzdXNwZW5kZWQiKSwKKyAgICBYTUxfTCgicGFyc2luZyBhYm9ydGVkIiksCisgICAgWE1MX0woInBhcnNpbmcgZmluaXNoZWQiKSwKKyAgICBYTUxfTCgiY2Fubm90IHN1c3BlbmQgaW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSIpLAorICAgIFhNTF9MKCJyZXNlcnZlZCBwcmVmaXggKHhtbCkgbXVzdCBub3QgYmUgdW5kZWNsYXJlZCBvciBib3VuZCB0byBhbm90aGVyIG5hbWVzcGFjZSBuYW1lIiksCisgICAgWE1MX0woInJlc2VydmVkIHByZWZpeCAoeG1sbnMpIG11c3Qgbm90IGJlIGRlY2xhcmVkIG9yIHVuZGVjbGFyZWQiKSwKKyAgICBYTUxfTCgicHJlZml4IG11c3Qgbm90IGJlIGJvdW5kIHRvIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgbmFtZXNwYWNlIG5hbWVzIikKKyAgfTsKKyAgaWYgKGNvZGUgPiAwICYmIGNvZGUgPCBzaXplb2YobWVzc2FnZSkvc2l6ZW9mKG1lc3NhZ2VbMF0pKQorICAgIHJldHVybiBtZXNzYWdlW2NvZGVdOworICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgWE1MX0xDaGFyICogWE1MQ0FMTAorWE1MX0V4cGF0VmVyc2lvbih2b2lkKSB7CisKKyAgLyogVjEgaXMgdXNlZCB0byBzdHJpbmctaXplIHRoZSB2ZXJzaW9uIG51bWJlci4gSG93ZXZlciwgaXQgd291bGQKKyAgICAgc3RyaW5nLWl6ZSB0aGUgYWN0dWFsIHZlcnNpb24gbWFjcm8gKm5hbWVzKiB1bmxlc3Mgd2UgZ2V0IHRoZW0KKyAgICAgc3Vic3RpdHV0ZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byBWMS4gQ1BQIGlzIGRlZmluZWQgdG8gZXhwYW5kCisgICAgIGEgbWFjcm8sIHRoZW4gcmVzY2FuIGZvciBtb3JlIGV4cGFuc2lvbnMuIFRodXMsIHdlIHVzZSBWMiB0byBleHBhbmQKKyAgICAgdGhlIHZlcnNpb24gbWFjcm9zLCB0aGVuIENQUCB3aWxsIGV4cGFuZCB0aGUgcmVzdWx0aW5nIFYxKCkgbWFjcm8KKyAgICAgd2l0aCB0aGUgY29ycmVjdCBudW1lcmFscy4gKi8KKyAgLyogIyMjIEknbSBhc3N1bWluZyBjcHAgaXMgcG9ydGFibGUgaW4gdGhpcyByZXNwZWN0Li4uICovCisKKyNkZWZpbmUgVjEoYSxiLGMpIFhNTF9MKCNhKVhNTF9MKCIuIilYTUxfTCgjYilYTUxfTCgiLiIpWE1MX0woI2MpCisjZGVmaW5lIFYyKGEsYixjKSBYTUxfTCgiZXhwYXRfIilWMShhLGIsYykKKworICByZXR1cm4gVjIoWE1MX01BSk9SX1ZFUlNJT04sIFhNTF9NSU5PUl9WRVJTSU9OLCBYTUxfTUlDUk9fVkVSU0lPTik7CisKKyN1bmRlZiBWMQorI3VuZGVmIFYyCit9CisKK1hNTF9FeHBhdF9WZXJzaW9uIFhNTENBTEwKK1hNTF9FeHBhdFZlcnNpb25JbmZvKHZvaWQpCit7CisgIFhNTF9FeHBhdF9WZXJzaW9uIHZlcnNpb247CisKKyAgdmVyc2lvbi5tYWpvciA9IFhNTF9NQUpPUl9WRVJTSU9OOworICB2ZXJzaW9uLm1pbm9yID0gWE1MX01JTk9SX1ZFUlNJT047CisgIHZlcnNpb24ubWljcm8gPSBYTUxfTUlDUk9fVkVSU0lPTjsKKworICByZXR1cm4gdmVyc2lvbjsKK30KKworY29uc3QgWE1MX0ZlYXR1cmUgKiBYTUxDQUxMCitYTUxfR2V0RmVhdHVyZUxpc3Qodm9pZCkKK3sKKyAgc3RhdGljIGNvbnN0IFhNTF9GZWF0dXJlIGZlYXR1cmVzW10gPSB7CisgICAge1hNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUiwgIFhNTF9MKCJzaXplb2YoWE1MX0NoYXIpIiksCisgICAgIHNpemVvZihYTUxfQ2hhcil9LAorICAgIHtYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0xDSEFSLCBYTUxfTCgic2l6ZW9mKFhNTF9MQ2hhcikiKSwKKyAgICAgc2l6ZW9mKFhNTF9MQ2hhcil9LAorI2lmZGVmIFhNTF9VTklDT0RFCisgICAge1hNTF9GRUFUVVJFX1VOSUNPREUsICAgICAgICAgIFhNTF9MKCJYTUxfVU5JQ09ERSIpLCAwfSwKKyNlbmRpZgorI2lmZGVmIFhNTF9VTklDT0RFX1dDSEFSX1QKKyAgICB7WE1MX0ZFQVRVUkVfVU5JQ09ERV9XQ0hBUl9ULCAgWE1MX0woIlhNTF9VTklDT0RFX1dDSEFSX1QiKSwgMH0sCisjZW5kaWYKKyNpZmRlZiBYTUxfRFRECisgICAge1hNTF9GRUFUVVJFX0RURCwgICAgICAgICAgICAgIFhNTF9MKCJYTUxfRFREIiksIDB9LAorI2VuZGlmCisjaWZkZWYgWE1MX0NPTlRFWFRfQllURVMKKyAgICB7WE1MX0ZFQVRVUkVfQ09OVEVYVF9CWVRFUywgICAgWE1MX0woIlhNTF9DT05URVhUX0JZVEVTIiksCisgICAgIFhNTF9DT05URVhUX0JZVEVTfSwKKyNlbmRpZgorI2lmZGVmIFhNTF9NSU5fU0laRQorICAgIHtYTUxfRkVBVFVSRV9NSU5fU0laRSwgICAgICAgICBYTUxfTCgiWE1MX01JTl9TSVpFIiksIDB9LAorI2VuZGlmCisjaWZkZWYgWE1MX05TCisgICAge1hNTF9GRUFUVVJFX05TLCAgICAgICAgICAgICAgIFhNTF9MKCJYTUxfTlMiKSwgMH0sCisjZW5kaWYKKyNpZmRlZiBYTUxfTEFSR0VfU0laRQorICAgIHtYTUxfRkVBVFVSRV9MQVJHRV9TSVpFLCAgICAgICBYTUxfTCgiWE1MX0xBUkdFX1NJWkUiKSwgMH0sCisjZW5kaWYgICAgCisgICAge1hNTF9GRUFUVVJFX0VORCwgICAgICAgICAgICAgIE5VTEwsIDB9CisgIH07CisKKyAgcmV0dXJuIGZlYXR1cmVzOworfQorCisvKiBJbml0aWFsbHkgdGFnLT5yYXdOYW1lIGFsd2F5cyBwb2ludHMgaW50byB0aGUgcGFyc2UgYnVmZmVyOworICAgZm9yIHRob3NlIFRBRyBpbnN0YW5jZXMgb3BlbmVkIHdoaWxlIHRoZSBjdXJyZW50IHBhcnNlIGJ1ZmZlciB3YXMKKyAgIHByb2Nlc3NlZCwgYW5kIG5vdCB5ZXQgY2xvc2VkLCB3ZSBuZWVkIHRvIHN0b3JlIHRhZy0+cmF3TmFtZSBpbiBhIG1vcmUKKyAgIHBlcm1hbmVudCBsb2NhdGlvbiwgc2luY2UgdGhlIHBhcnNlIGJ1ZmZlciBpcyBhYm91dCB0byBiZSBkaXNjYXJkZWQuCisqLworc3RhdGljIFhNTF9Cb29sCitzdG9yZVJhd05hbWVzKFhNTF9QYXJzZXIgcGFyc2VyKQoreworICBUQUcgKnRhZyA9IHRhZ1N0YWNrOworICB3aGlsZSAodGFnKSB7CisgICAgaW50IGJ1ZlNpemU7CisgICAgaW50IG5hbWVMZW4gPSBzaXplb2YoWE1MX0NoYXIpICogKHRhZy0+bmFtZS5zdHJMZW4gKyAxKTsKKyAgICBjaGFyICpyYXdOYW1lQnVmID0gdGFnLT5idWYgKyBuYW1lTGVuOworICAgIC8qIFN0b3AgaWYgYWxyZWFkeSBzdG9yZWQuICBTaW5jZSB0YWdTdGFjayBpcyBhIHN0YWNrLCB3ZSBjYW4gc3RvcAorICAgICAgIGF0IHRoZSBmaXJzdCBlbnRyeSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY29waWVkOyBldmVyeXRoaW5nCisgICAgICAgYmVsb3cgaXQgaW4gdGhlIHN0YWNrIGlzIGFscmVhZHkgYmVlbiBhY2NvdW50ZWQgZm9yIGluIGEKKyAgICAgICBwcmV2aW91cyBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgKi8KKyAgICBpZiAodGFnLT5yYXdOYW1lID09IHJhd05hbWVCdWYpCisgICAgICBicmVhazsKKyAgICAvKiBGb3IgcmUtdXNlIHB1cnBvc2VzIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisgICAgICAgc2l6ZSBvZiB0YWctPmJ1ZiBpcyBhIG11bHRpcGxlIG9mIHNpemVvZihYTUxfQ2hhcikuCisgICAgKi8KKyAgICBidWZTaXplID0gbmFtZUxlbiArIFJPVU5EX1VQKHRhZy0+cmF3TmFtZUxlbmd0aCwgc2l6ZW9mKFhNTF9DaGFyKSk7CisgICAgaWYgKGJ1ZlNpemUgPiB0YWctPmJ1ZkVuZCAtIHRhZy0+YnVmKSB7CisgICAgICBjaGFyICp0ZW1wID0gKGNoYXIgKilSRUFMTE9DKHRhZy0+YnVmLCBidWZTaXplKTsKKyAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICAvKiBpZiB0YWctPm5hbWUuc3RyIHBvaW50cyB0byB0YWctPmJ1ZiAob25seSB3aGVuIG5hbWVzcGFjZQorICAgICAgICAgcHJvY2Vzc2luZyBpcyBvZmYpIHRoZW4gd2UgaGF2ZSB0byB1cGRhdGUgaXQKKyAgICAgICovCisgICAgICBpZiAodGFnLT5uYW1lLnN0ciA9PSAoWE1MX0NoYXIgKil0YWctPmJ1ZikKKyAgICAgICAgdGFnLT5uYW1lLnN0ciA9IChYTUxfQ2hhciAqKXRlbXA7CisgICAgICAvKiBpZiB0YWctPm5hbWUubG9jYWxQYXJ0IGlzIHNldCAod2hlbiBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyBvbikKKyAgICAgICAgIHRoZW4gdXBkYXRlIGl0IGFzIHdlbGwsIHNpbmNlIGl0IHdpbGwgYWx3YXlzIHBvaW50IGludG8gdGFnLT5idWYKKyAgICAgICovCisgICAgICBpZiAodGFnLT5uYW1lLmxvY2FsUGFydCkKKyAgICAgICAgdGFnLT5uYW1lLmxvY2FsUGFydCA9IChYTUxfQ2hhciAqKXRlbXAgKyAodGFnLT5uYW1lLmxvY2FsUGFydCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXRhZy0+YnVmKTsKKyAgICAgIHRhZy0+YnVmID0gdGVtcDsKKyAgICAgIHRhZy0+YnVmRW5kID0gdGVtcCArIGJ1ZlNpemU7CisgICAgICByYXdOYW1lQnVmID0gdGVtcCArIG5hbWVMZW47CisgICAgfQorICAgIG1lbWNweShyYXdOYW1lQnVmLCB0YWctPnJhd05hbWUsIHRhZy0+cmF3TmFtZUxlbmd0aCk7CisgICAgdGFnLT5yYXdOYW1lID0gcmF3TmFtZUJ1ZjsKKyAgICB0YWcgPSB0YWctPnBhcmVudDsKKyAgfQorICByZXR1cm4gWE1MX1RSVUU7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitjb250ZW50UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCAwLCBlbmNvZGluZywgc3RhcnQsIGVuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOworICBpZiAocmVzdWx0ID09IFhNTF9FUlJPUl9OT05FKSB7CisgICAgaWYgKCFzdG9yZVJhd05hbWVzKHBhcnNlcikpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBpbml0aWFsaXplRW5jb2RpbmcocGFyc2VyKTsKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworICBwcm9jZXNzb3IgPSBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IyOworICByZXR1cm4gZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMihwYXJzZXIsIHN0YXJ0LCBlbmQsIGVuZFB0cik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IyKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBjb25zdCBjaGFyICpuZXh0ID0gc3RhcnQ7IC8qIFhtbENvbnRlbnRUb2sgZG9lc24ndCBhbHdheXMgc2V0IHRoZSBsYXN0IGFyZyAqLworICBpbnQgdG9rID0gWG1sQ29udGVudFRvayhlbmNvZGluZywgc3RhcnQsIGVuZCwgJm5leHQpOworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfQk9NOgorICAgIC8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHRoaXMgd291bGQgY2F1c2UgdGhlIG5leHQgc3RhZ2UsCisgICAgICAgaS5lLiBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IzLCB0byBwYXNzIGNvbnRyb2wgZGlyZWN0bHkgdG8KKyAgICAgICBkb0NvbnRlbnQgKGJ5IGRldGVjdGluZyBYTUxfVE9LX05PTkUpIHdpdGhvdXQgcHJvY2Vzc2luZyBhbnkgeG1sIHRleHQKKyAgICAgICBkZWNsYXJhdGlvbiAtIGNhdXNpbmcgdGhlIGVycm9yIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJIGluIGRvQ29udGVudC4KKyAgICAqLworICAgIGlmIChuZXh0ID09IGVuZCAmJiAhcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIH0KKyAgICBzdGFydCA9IG5leHQ7CisgICAgYnJlYWs7CisgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBzdGFydDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgZXZlbnRQdHIgPSBzdGFydDsKKyAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOworICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgorICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBzdGFydDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgZXZlbnRQdHIgPSBzdGFydDsKKyAgICByZXR1cm4gWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUjsKKyAgfQorICBwcm9jZXNzb3IgPSBleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IzOworICByZXR1cm4gZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMyhwYXJzZXIsIHN0YXJ0LCBlbmQsIGVuZFB0cik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitleHRlcm5hbEVudGl0eUluaXRQcm9jZXNzb3IzKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQoreworICBpbnQgdG9rOworICBjb25zdCBjaGFyICpuZXh0ID0gc3RhcnQ7IC8qIFhtbENvbnRlbnRUb2sgZG9lc24ndCBhbHdheXMgc2V0IHRoZSBsYXN0IGFyZyAqLworICBldmVudFB0ciA9IHN0YXJ0OworICB0b2sgPSBYbWxDb250ZW50VG9rKGVuY29kaW5nLCBzdGFydCwgZW5kLCAmbmV4dCk7CisgIGV2ZW50RW5kUHRyID0gbmV4dDsKKworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfWE1MX0RFQ0w6CisgICAgeworICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgcmVzdWx0ID0gcHJvY2Vzc1htbERlY2wocGFyc2VyLCAxLCBzdGFydCwgbmV4dCk7CisgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgICAqZW5kUHRyID0gbmV4dDsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgY2FzZSBYTUxfRklOSVNIRUQ6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXJ0ID0gbmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICplbmRQdHIgPSBzdGFydDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyKSB7CisgICAgICAqZW5kUHRyID0gc3RhcnQ7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgfQorICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICB9CisgIHByb2Nlc3NvciA9IGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcjsKKyAgdGFnTGV2ZWwgPSAxOworICByZXR1cm4gZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIGVuZCwgZW5kUHRyKTsKK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK2V4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuZFB0cikKK3sKKyAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gZG9Db250ZW50KHBhcnNlciwgMSwgZW5jb2RpbmcsIHN0YXJ0LCBlbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKKyAgaWYgKHJlc3VsdCA9PSBYTUxfRVJST1JfTk9ORSkgeworICAgIGlmICghc3RvcmVSYXdOYW1lcyhwYXJzZXIpKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitkb0NvbnRlbnQoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgaW50IHN0YXJ0VGFnTGV2ZWwsCisgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0ciwKKyAgICAgICAgICBYTUxfQm9vbCBoYXZlTW9yZSkKK3sKKyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIAorCisgIGNvbnN0IGNoYXIgKipldmVudFBQOworICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKKyAgaWYgKGVuYyA9PSBlbmNvZGluZykgeworICAgIGV2ZW50UFAgPSAmZXZlbnRQdHI7CisgICAgZXZlbnRFbmRQUCA9ICZldmVudEVuZFB0cjsKKyAgfQorICBlbHNlIHsKKyAgICBldmVudFBQID0gJihvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudFB0cik7CisgICAgZXZlbnRFbmRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRFbmRQdHIpOworICB9CisgICpldmVudFBQID0gczsKKworICBmb3IgKDs7KSB7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHM7IC8qIFhtbENvbnRlbnRUb2sgZG9lc24ndCBhbHdheXMgc2V0IHRoZSBsYXN0IGFyZyAqLworICAgIGludCB0b2sgPSBYbWxDb250ZW50VG9rKGVuYywgcywgZW5kLCAmbmV4dCk7CisgICAgKmV2ZW50RW5kUFAgPSBuZXh0OworICAgIHN3aXRjaCAodG9rKSB7CisgICAgY2FzZSBYTUxfVE9LX1RSQUlMSU5HX0NSOgorICAgICAgaWYgKGhhdmVNb3JlKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgKmV2ZW50RW5kUFAgPSBlbmQ7CisgICAgICBpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpIHsKKyAgICAgICAgWE1MX0NoYXIgYyA9IDB4QTsKKyAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgJmMsIDEpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIGVuZCk7CisgICAgICAvKiBXZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmluYWwgYnVmZmVyLCBzaG91bGQgd2UgY2hlY2sgZm9yIAorICAgICAgICAgWE1MX1NVU1BFTkRFRCwgWE1MX0ZJTklTSEVEPyAKKyAgICAgICovCisgICAgICBpZiAoc3RhcnRUYWdMZXZlbCA9PSAwKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX0VMRU1FTlRTOworICAgICAgaWYgKHRhZ0xldmVsICE9IHN0YXJ0VGFnTGV2ZWwpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQVNZTkNfRU5USVRZOworICAgICAgKm5leHRQdHIgPSBlbmQ7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgY2FzZSBYTUxfVE9LX05PTkU6CisgICAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICBpZiAoc3RhcnRUYWdMZXZlbCA+IDApIHsKKyAgICAgICAgaWYgKHRhZ0xldmVsICE9IHN0YXJ0VGFnTGV2ZWwpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BU1lOQ19FTlRJVFk7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19FTEVNRU5UUzsKKyAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgICpldmVudFBQID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgIGlmIChoYXZlTW9yZSkgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICAgIGlmIChoYXZlTW9yZSkgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICAgIGNhc2UgWE1MX1RPS19FTlRJVFlfUkVGOgorICAgICAgeworICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgICAgICAgRU5USVRZICplbnRpdHk7CisgICAgICAgIFhNTF9DaGFyIGNoID0gKFhNTF9DaGFyKSBYbWxQcmVkZWZpbmVkRW50aXR5TmFtZShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmIChjaCkgeworICAgICAgICAgIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikKKyAgICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsICZjaCwgMSk7CisgICAgICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+Z2VuZXJhbEVudGl0aWVzLCBuYW1lLCAwKTsKKyAgICAgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgICAgICAgIC8qIEZpcnN0LCBkZXRlcm1pbmUgaWYgYSBjaGVjayBmb3IgYW4gZXhpc3RpbmcgZGVjbGFyYXRpb24gaXMgbmVlZGVkOworICAgICAgICAgICBpZiB5ZXMsIGNoZWNrIHRoYXQgdGhlIGVudGl0eSBleGlzdHMsIGFuZCB0aGF0IGl0IGlzIGludGVybmFsLAorICAgICAgICAgICBvdGhlcndpc2UgY2FsbCB0aGUgc2tpcHBlZCBlbnRpdHkgb3IgZGVmYXVsdCBoYW5kbGVyLgorICAgICAgICAqLworICAgICAgICBpZiAoIWR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzIHx8IGR0ZC0+c3RhbmRhbG9uZSkgeworICAgICAgICAgIGlmICghZW50aXR5KQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZOworICAgICAgICAgIGVsc2UgaWYgKCFlbnRpdHktPmlzX2ludGVybmFsKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9FTlRJVFlfREVDTEFSRURfSU5fUEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWVudGl0eSkgeworICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDApOworICAgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudGl0eS0+b3BlbikKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGOworICAgICAgICBpZiAoZW50aXR5LT5ub3RhdGlvbikKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGOworICAgICAgICBpZiAoZW50aXR5LT50ZXh0UHRyKSB7CisgICAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgICAgIGlmICghZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMpIHsKKyAgICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgICAgc2tpcHBlZEVudGl0eUhhbmRsZXIoaGFuZGxlckFyZywgZW50aXR5LT5uYW1lLCAwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQgPSBwcm9jZXNzSW50ZXJuYWxFbnRpdHkocGFyc2VyLCBlbnRpdHksIFhNTF9GQUxTRSk7CisgICAgICAgICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKSB7CisgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQ7CisgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX1RSVUU7CisgICAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQocGFyc2VyKTsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKCFjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgaWYgKCFleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+c3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKKyAgICAgICAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFhNTF9UT0tfU1RBUlRfVEFHX05PX0FUVFM6CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFhNTF9UT0tfU1RBUlRfVEFHX1dJVEhfQVRUUzoKKyAgICAgIHsKKyAgICAgICAgVEFHICp0YWc7CisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgICAgWE1MX0NoYXIgKnRvUHRyOworICAgICAgICBpZiAoZnJlZVRhZ0xpc3QpIHsKKyAgICAgICAgICB0YWcgPSBmcmVlVGFnTGlzdDsKKyAgICAgICAgICBmcmVlVGFnTGlzdCA9IGZyZWVUYWdMaXN0LT5wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdGFnID0gKFRBRyAqKU1BTExPQyhzaXplb2YoVEFHKSk7CisgICAgICAgICAgaWYgKCF0YWcpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB0YWctPmJ1ZiA9IChjaGFyICopTUFMTE9DKElOSVRfVEFHX0JVRl9TSVpFKTsKKyAgICAgICAgICBpZiAoIXRhZy0+YnVmKSB7CisgICAgICAgICAgICBGUkVFKHRhZyk7CisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGFnLT5idWZFbmQgPSB0YWctPmJ1ZiArIElOSVRfVEFHX0JVRl9TSVpFOworICAgICAgICB9CisgICAgICAgIHRhZy0+YmluZGluZ3MgPSBOVUxMOworICAgICAgICB0YWctPnBhcmVudCA9IHRhZ1N0YWNrOworICAgICAgICB0YWdTdGFjayA9IHRhZzsKKyAgICAgICAgdGFnLT5uYW1lLmxvY2FsUGFydCA9IE5VTEw7CisgICAgICAgIHRhZy0+bmFtZS5wcmVmaXggPSBOVUxMOworICAgICAgICB0YWctPnJhd05hbWUgPSBzICsgZW5jLT5taW5CeXRlc1BlckNoYXI7CisgICAgICAgIHRhZy0+cmF3TmFtZUxlbmd0aCA9IFhtbE5hbWVMZW5ndGgoZW5jLCB0YWctPnJhd05hbWUpOworICAgICAgICArK3RhZ0xldmVsOworICAgICAgICB7CisgICAgICAgICAgY29uc3QgY2hhciAqcmF3TmFtZUVuZCA9IHRhZy0+cmF3TmFtZSArIHRhZy0+cmF3TmFtZUxlbmd0aDsKKyAgICAgICAgICBjb25zdCBjaGFyICpmcm9tUHRyID0gdGFnLT5yYXdOYW1lOworICAgICAgICAgIHRvUHRyID0gKFhNTF9DaGFyICopdGFnLT5idWY7CisgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaW50IGJ1ZlNpemU7CisgICAgICAgICAgICBpbnQgY29udkxlbjsKKyAgICAgICAgICAgIFhtbENvbnZlcnQoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAmZnJvbVB0ciwgcmF3TmFtZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgKElDSEFSICoqKSZ0b1B0ciwgKElDSEFSICopdGFnLT5idWZFbmQgLSAxKTsKKyAgICAgICAgICAgIGNvbnZMZW4gPSAoaW50KSh0b1B0ciAtIChYTUxfQ2hhciAqKXRhZy0+YnVmKTsKKyAgICAgICAgICAgIGlmIChmcm9tUHRyID09IHJhd05hbWVFbmQpIHsKKyAgICAgICAgICAgICAgdGFnLT5uYW1lLnN0ckxlbiA9IGNvbnZMZW47CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmU2l6ZSA9IChpbnQpKHRhZy0+YnVmRW5kIC0gdGFnLT5idWYpIDw8IDE7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKnRlbXAgPSAoY2hhciAqKVJFQUxMT0ModGFnLT5idWYsIGJ1ZlNpemUpOworICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgICB0YWctPmJ1ZiA9IHRlbXA7CisgICAgICAgICAgICAgIHRhZy0+YnVmRW5kID0gdGVtcCArIGJ1ZlNpemU7CisgICAgICAgICAgICAgIHRvUHRyID0gKFhNTF9DaGFyICopdGVtcCArIGNvbnZMZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRhZy0+bmFtZS5zdHIgPSAoWE1MX0NoYXIgKil0YWctPmJ1ZjsKKyAgICAgICAgKnRvUHRyID0gWE1MX1QoJ1wwJyk7CisgICAgICAgIHJlc3VsdCA9IHN0b3JlQXR0cyhwYXJzZXIsIGVuYywgcywgJih0YWctPm5hbWUpLCAmKHRhZy0+YmluZGluZ3MpKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoc3RhcnRFbGVtZW50SGFuZGxlcikKKyAgICAgICAgICBzdGFydEVsZW1lbnRIYW5kbGVyKGhhbmRsZXJBcmcsIHRhZy0+bmFtZS5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgWE1MX0NoYXIgKiopYXR0cyk7CisgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBYTUxfVE9LX0VNUFRZX0VMRU1FTlRfTk9fQVRUUzoKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgWE1MX1RPS19FTVBUWV9FTEVNRU5UX1dJVEhfQVRUUzoKKyAgICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqcmF3TmFtZSA9IHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgICBCSU5ESU5HICpiaW5kaW5ncyA9IE5VTEw7CisgICAgICAgIFhNTF9Cb29sIG5vRWxtSGFuZGxlcnMgPSBYTUxfVFJVRTsKKyAgICAgICAgVEFHX05BTUUgbmFtZTsKKyAgICAgICAgbmFtZS5zdHIgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsIHJhd05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWUgKyBYbWxOYW1lTGVuZ3RoKGVuYywgcmF3TmFtZSkpOworICAgICAgICBpZiAoIW5hbWUuc3RyKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIHJlc3VsdCA9IHN0b3JlQXR0cyhwYXJzZXIsIGVuYywgcywgJm5hbWUsICZiaW5kaW5ncyk7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcG9vbEZpbmlzaCgmdGVtcFBvb2wpOworICAgICAgICBpZiAoc3RhcnRFbGVtZW50SGFuZGxlcikgeworICAgICAgICAgIHN0YXJ0RWxlbWVudEhhbmRsZXIoaGFuZGxlckFyZywgbmFtZS5zdHIsIChjb25zdCBYTUxfQ2hhciAqKilhdHRzKTsKKyAgICAgICAgICBub0VsbUhhbmRsZXJzID0gWE1MX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChlbmRFbGVtZW50SGFuZGxlcikgeworICAgICAgICAgIGlmIChzdGFydEVsZW1lbnRIYW5kbGVyKQorICAgICAgICAgICAgKmV2ZW50UFAgPSAqZXZlbnRFbmRQUDsKKyAgICAgICAgICBlbmRFbGVtZW50SGFuZGxlcihoYW5kbGVyQXJnLCBuYW1lLnN0cik7CisgICAgICAgICAgbm9FbG1IYW5kbGVycyA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9FbG1IYW5kbGVycyAmJiBkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgcG9vbENsZWFyKCZ0ZW1wUG9vbCk7CisgICAgICAgIHdoaWxlIChiaW5kaW5ncykgeworICAgICAgICAgIEJJTkRJTkcgKmIgPSBiaW5kaW5nczsKKyAgICAgICAgICBpZiAoZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpCisgICAgICAgICAgICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBiLT5wcmVmaXgtPm5hbWUpOworICAgICAgICAgIGJpbmRpbmdzID0gYmluZGluZ3MtPm5leHRUYWdCaW5kaW5nOworICAgICAgICAgIGItPm5leHRUYWdCaW5kaW5nID0gZnJlZUJpbmRpbmdMaXN0OworICAgICAgICAgIGZyZWVCaW5kaW5nTGlzdCA9IGI7CisgICAgICAgICAgYi0+cHJlZml4LT5iaW5kaW5nID0gYi0+cHJldlByZWZpeEJpbmRpbmc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0YWdMZXZlbCA9PSAwKQorICAgICAgICByZXR1cm4gZXBpbG9nUHJvY2Vzc29yKHBhcnNlciwgbmV4dCwgZW5kLCBuZXh0UHRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19FTkRfVEFHOgorICAgICAgaWYgKHRhZ0xldmVsID09IHN0YXJ0VGFnTGV2ZWwpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQVNZTkNfRU5USVRZOworICAgICAgZWxzZSB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNvbnN0IGNoYXIgKnJhd05hbWU7CisgICAgICAgIFRBRyAqdGFnID0gdGFnU3RhY2s7CisgICAgICAgIHRhZ1N0YWNrID0gdGFnLT5wYXJlbnQ7CisgICAgICAgIHRhZy0+cGFyZW50ID0gZnJlZVRhZ0xpc3Q7CisgICAgICAgIGZyZWVUYWdMaXN0ID0gdGFnOworICAgICAgICByYXdOYW1lID0gcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyKjI7CisgICAgICAgIGxlbiA9IFhtbE5hbWVMZW5ndGgoZW5jLCByYXdOYW1lKTsKKyAgICAgICAgaWYgKGxlbiAhPSB0YWctPnJhd05hbWVMZW5ndGgKKyAgICAgICAgICAgIHx8IG1lbWNtcCh0YWctPnJhd05hbWUsIHJhd05hbWUsIGxlbikgIT0gMCkgeworICAgICAgICAgICpldmVudFBQID0gcmF3TmFtZTsKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1RBR19NSVNNQVRDSDsKKyAgICAgICAgfQorICAgICAgICAtLXRhZ0xldmVsOworICAgICAgICBpZiAoZW5kRWxlbWVudEhhbmRsZXIpIHsKKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbG9jYWxQYXJ0OworICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXg7CisgICAgICAgICAgWE1MX0NoYXIgKnVyaTsKKyAgICAgICAgICBsb2NhbFBhcnQgPSB0YWctPm5hbWUubG9jYWxQYXJ0OworICAgICAgICAgIGlmIChucyAmJiBsb2NhbFBhcnQpIHsKKyAgICAgICAgICAgIC8qIGxvY2FsUGFydCBhbmQgcHJlZml4IG1heSBoYXZlIGJlZW4gb3ZlcndyaXR0ZW4gaW4KKyAgICAgICAgICAgICAgIHRhZy0+bmFtZS5zdHIsIHNpbmNlIHRoaXMgcG9pbnRzIHRvIHRoZSBiaW5kaW5nLT51cmkKKyAgICAgICAgICAgICAgIGJ1ZmZlciB3aGljaCBnZXRzIHJlLXVzZWQ7IHNvIHdlIGhhdmUgdG8gYWRkIHRoZW0gYWdhaW4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICB1cmkgPSAoWE1MX0NoYXIgKil0YWctPm5hbWUuc3RyICsgdGFnLT5uYW1lLnVyaUxlbjsKKyAgICAgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHNwYWNlIC0gYWxyZWFkeSBkb25lIGluIHN0b3JlQXR0cygpICovCisgICAgICAgICAgICB3aGlsZSAoKmxvY2FsUGFydCkgKnVyaSsrID0gKmxvY2FsUGFydCsrOworICAgICAgICAgICAgcHJlZml4ID0gKFhNTF9DaGFyICopdGFnLT5uYW1lLnByZWZpeDsKKyAgICAgICAgICAgIGlmIChuc190cmlwbGV0cyAmJiBwcmVmaXgpIHsKKyAgICAgICAgICAgICAgKnVyaSsrID0gbmFtZXNwYWNlU2VwYXJhdG9yOworICAgICAgICAgICAgICB3aGlsZSAoKnByZWZpeCkgKnVyaSsrID0gKnByZWZpeCsrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp1cmkgPSBYTUxfVCgnXDAnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZW5kRWxlbWVudEhhbmRsZXIoaGFuZGxlckFyZywgdGFnLT5uYW1lLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICAgIHdoaWxlICh0YWctPmJpbmRpbmdzKSB7CisgICAgICAgICAgQklORElORyAqYiA9IHRhZy0+YmluZGluZ3M7CisgICAgICAgICAgaWYgKGVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKQorICAgICAgICAgICAgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgYi0+cHJlZml4LT5uYW1lKTsKKyAgICAgICAgICB0YWctPmJpbmRpbmdzID0gdGFnLT5iaW5kaW5ncy0+bmV4dFRhZ0JpbmRpbmc7CisgICAgICAgICAgYi0+bmV4dFRhZ0JpbmRpbmcgPSBmcmVlQmluZGluZ0xpc3Q7CisgICAgICAgICAgZnJlZUJpbmRpbmdMaXN0ID0gYjsKKyAgICAgICAgICBiLT5wcmVmaXgtPmJpbmRpbmcgPSBiLT5wcmV2UHJlZml4QmluZGluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnTGV2ZWwgPT0gMCkKKyAgICAgICAgICByZXR1cm4gZXBpbG9nUHJvY2Vzc29yKHBhcnNlciwgbmV4dCwgZW5kLCBuZXh0UHRyKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKKyAgICAgIHsKKyAgICAgICAgaW50IG4gPSBYbWxDaGFyUmVmTnVtYmVyKGVuYywgcyk7CisgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKKyAgICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7CisgICAgICAgICAgWE1MX0NoYXIgYnVmW1hNTF9FTkNPREVfTUFYXTsKKyAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBidWYsIFhtbEVuY29kZShuLCAoSUNIQVIgKilidWYpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19YTUxfREVDTDoKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSTsKKyAgICBjYXNlIFhNTF9UT0tfREFUQV9ORVdMSU5FOgorICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7CisgICAgICAgIFhNTF9DaGFyIGMgPSAweEE7CisgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsICZjLCAxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DREFUQV9TRUNUX09QRU46CisgICAgICB7CisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgICAgaWYgKHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcikKKyAgICAgICAgICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoaGFuZGxlckFyZyk7CisjaWYgMAorICAgICAgICAvKiBTdXBwb3NlIHlvdSBkb2luZyBhIHRyYW5zZm9ybWF0aW9uIG9uIGEgZG9jdW1lbnQgdGhhdCBpbnZvbHZlcworICAgICAgICAgICBjaGFuZ2luZyBvbmx5IHRoZSBjaGFyYWN0ZXIgZGF0YS4gIFlvdSBzZXQgdXAgYSBkZWZhdWx0SGFuZGxlcgorICAgICAgICAgICBhbmQgYSBjaGFyYWN0ZXJEYXRhSGFuZGxlci4gIFRoZSBkZWZhdWx0SGFuZGxlciBzaW1wbHkgY29waWVzCisgICAgICAgICAgIGNoYXJhY3RlcnMgdGhyb3VnaC4gIFRoZSBjaGFyYWN0ZXJEYXRhSGFuZGxlciBkb2VzIHRoZQorICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiBhbmQgd3JpdGVzIHRoZSBjaGFyYWN0ZXJzIG91dCBlc2NhcGluZyB0aGVtIGFzCisgICAgICAgICAgIG5lY2Vzc2FyeS4gIFRoaXMgY2FzZSB3aWxsIGZhaWwgdG8gd29yayBpZiB3ZSBsZWF2ZSBvdXQgdGhlCisgICAgICAgICAgIGZvbGxvd2luZyB0d28gbGluZXMgKGJlY2F1c2UgJiBhbmQgPCBpbnNpZGUgQ0RBVEEgc2VjdGlvbnMgd2lsbAorICAgICAgICAgICBiZSBpbmNvcnJlY3RseSBlc2NhcGVkKS4KKworICAgICAgICAgICBIb3dldmVyLCBub3cgd2UgaGF2ZSBhIHN0YXJ0L2VuZENkYXRhU2VjdGlvbkhhbmRsZXIsIHNvIGl0IHNlZW1zCisgICAgICAgICAgIGVhc2llciB0byBsZXQgdGhlIHVzZXIgZGVhbCB3aXRoIHRoaXMuCisgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKQorICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsIDApOworI2VuZGlmCisgICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgICByZXN1bHQgPSBkb0NkYXRhU2VjdGlvbihwYXJzZXIsIGVuYywgJm5leHQsIGVuZCwgbmV4dFB0ciwgaGF2ZU1vcmUpOworICAgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGVsc2UgaWYgKCFuZXh0KSB7CisgICAgICAgICAgcHJvY2Vzc29yID0gY2RhdGFTZWN0aW9uUHJvY2Vzc29yOworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19SU1FCOgorICAgICAgaWYgKGhhdmVNb3JlKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7CisgICAgICAgIGlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgeworICAgICAgICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKKyAgICAgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIGVuZCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOworICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKilzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChYTUxfQ2hhciAqKWVuZCAtIChYTUxfQ2hhciAqKXMpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBlbmQpOworICAgICAgLyogV2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbmFsIGJ1ZmZlciwgc2hvdWxkIHdlIGNoZWNrIGZvciAKKyAgICAgICAgIFhNTF9TVVNQRU5ERUQsIFhNTF9GSU5JU0hFRD8gCisgICAgICAqLworICAgICAgaWYgKHN0YXJ0VGFnTGV2ZWwgPT0gMCkgeworICAgICAgICAqZXZlbnRQUCA9IGVuZDsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19FTEVNRU5UUzsKKyAgICAgIH0KKyAgICAgIGlmICh0YWdMZXZlbCAhPSBzdGFydFRhZ0xldmVsKSB7CisgICAgICAgICpldmVudFBQID0gZW5kOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FTWU5DX0VOVElUWTsKKyAgICAgIH0KKyAgICAgICpuZXh0UHRyID0gZW5kOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19EQVRBX0NIQVJTOiAKKyAgICAgIHsKKyAgICAgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGNoYXJEYXRhSGFuZGxlciA9IGNoYXJhY3RlckRhdGFIYW5kbGVyOworICAgICAgICBpZiAoY2hhckRhdGFIYW5kbGVyKSB7CisgICAgICAgICAgaWYgKE1VU1RfQ09OVkVSVChlbmMsIHMpKSB7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKKyAgICAgICAgICAgICAgWG1sQ29udmVydChlbmMsICZzLCBuZXh0LCAmZGF0YVB0ciwgKElDSEFSICopZGF0YUJ1ZkVuZCk7CisgICAgICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICAgICAgY2hhckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShkYXRhUHRyIC0gKElDSEFSICopZGF0YUJ1ZikpOworICAgICAgICAgICAgICBpZiAocyA9PSBuZXh0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAqZXZlbnRQUCA9IHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoYXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19QSToKKyAgICAgIGlmICghcmVwb3J0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHBhcnNlciwgZW5jLCBzLCBuZXh0KSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKKyAgICAgIGlmICghcmVwb3J0Q29tbWVudChwYXJzZXIsIGVuYywgcywgbmV4dCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgKmV2ZW50UFAgPSBzID0gbmV4dDsKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX0ZJTklTSEVEOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgIGRlZmF1bHQ6IDsKKyAgICB9CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworLyogUHJlY29uZGl0aW9uOiBhbGwgYXJndW1lbnRzIG11c3QgYmUgbm9uLU5VTEw7CisgICBQdXJwb3NlOgorICAgLSBub3JtYWxpemUgYXR0cmlidXRlcworICAgLSBjaGVjayBhdHRyaWJ1dGVzIGZvciB3ZWxsLWZvcm1lZG5lc3MKKyAgIC0gZ2VuZXJhdGUgbmFtZXNwYWNlIGF3YXJlIGF0dHJpYnV0ZSBuYW1lcyAoVVJJLCBwcmVmaXgpCisgICAtIGJ1aWxkIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3Igc3RhcnRFbGVtZW50SGFuZGxlcgorICAgLSBkZWZhdWx0IGF0dHJpYnV0ZXMKKyAgIC0gcHJvY2VzcyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIChjaGVjayBhbmQgcmVwb3J0IHRoZW0pCisgICAtIGdlbmVyYXRlIG5hbWVzcGFjZSBhd2FyZSBlbGVtZW50IG5hbWUgKFVSSSwgcHJlZml4KQorKi8KK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorc3RvcmVBdHRzKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmF0dFN0ciwgVEFHX05BTUUgKnRhZ05hbWVQdHIsCisgICAgICAgICAgQklORElORyAqKmJpbmRpbmdzUHRyKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgRUxFTUVOVF9UWVBFICplbGVtZW50VHlwZTsKKyAgaW50IG5EZWZhdWx0QXR0czsKKyAgY29uc3QgWE1MX0NoYXIgKiphcHBBdHRzOyAgIC8qIHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhlIGFwcGxpY2F0aW9uICovCisgIGludCBhdHRJbmRleCA9IDA7CisgIGludCBwcmVmaXhMZW47CisgIGludCBpOworICBpbnQgbjsKKyAgWE1MX0NoYXIgKnVyaTsKKyAgaW50IG5QcmVmaXhlcyA9IDA7CisgIEJJTkRJTkcgKmJpbmRpbmc7CisgIGNvbnN0IFhNTF9DaGFyICpsb2NhbFBhcnQ7CisKKyAgLyogbG9va3VwIHRoZSBlbGVtZW50IHR5cGUgbmFtZSAqLworICBlbGVtZW50VHlwZSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAoJmR0ZC0+ZWxlbWVudFR5cGVzLCB0YWdOYW1lUHRyLT5zdHIsMCk7CisgIGlmICghZWxlbWVudFR5cGUpIHsKKyAgICBjb25zdCBYTUxfQ2hhciAqbmFtZSA9IHBvb2xDb3B5U3RyaW5nKCZkdGQtPnBvb2wsIHRhZ05hbWVQdHItPnN0cik7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgZWxlbWVudFR5cGUgPSAoRUxFTUVOVF9UWVBFICopbG9va3VwKCZkdGQtPmVsZW1lbnRUeXBlcywgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVMRU1FTlRfVFlQRSkpOworICAgIGlmICghZWxlbWVudFR5cGUpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICBpZiAobnMgJiYgIXNldEVsZW1lbnRUeXBlUHJlZml4KHBhcnNlciwgZWxlbWVudFR5cGUpKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgIH0KKyAgbkRlZmF1bHRBdHRzID0gZWxlbWVudFR5cGUtPm5EZWZhdWx0QXR0czsKKworICAvKiBnZXQgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgdG9rZW5pemVyICovCisgIG4gPSBYbWxHZXRBdHRyaWJ1dGVzKGVuYywgYXR0U3RyLCBhdHRzU2l6ZSwgYXR0cyk7CisgIGlmIChuICsgbkRlZmF1bHRBdHRzID4gYXR0c1NpemUpIHsKKyAgICBpbnQgb2xkQXR0c1NpemUgPSBhdHRzU2l6ZTsKKyAgICBBVFRSSUJVVEUgKnRlbXA7CisgICAgYXR0c1NpemUgPSBuICsgbkRlZmF1bHRBdHRzICsgSU5JVF9BVFRTX1NJWkU7CisgICAgdGVtcCA9IChBVFRSSUJVVEUgKilSRUFMTE9DKCh2b2lkICopYXR0cywgYXR0c1NpemUgKiBzaXplb2YoQVRUUklCVVRFKSk7CisgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgIGF0dHMgPSB0ZW1wOworICAgIGlmIChuID4gb2xkQXR0c1NpemUpCisgICAgICBYbWxHZXRBdHRyaWJ1dGVzKGVuYywgYXR0U3RyLCBuLCBhdHRzKTsKKyAgfQorCisgIGFwcEF0dHMgPSAoY29uc3QgWE1MX0NoYXIgKiopYXR0czsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIC8qIGFkZCB0aGUgbmFtZSBhbmQgdmFsdWUgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0ICovCisgICAgQVRUUklCVVRFX0lEICphdHRJZCA9IGdldEF0dHJpYnV0ZUlkKHBhcnNlciwgZW5jLCBhdHRzW2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHNbaV0ubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFhtbE5hbWVMZW5ndGgoZW5jLCBhdHRzW2ldLm5hbWUpKTsKKyAgICBpZiAoIWF0dElkKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgLyogRGV0ZWN0IGR1cGxpY2F0ZSBhdHRyaWJ1dGVzIGJ5IHRoZWlyIFFOYW1lcy4gVGhpcyBkb2VzIG5vdCB3b3JrIHdoZW4KKyAgICAgICBuYW1lc3BhY2UgcHJvY2Vzc2luZyBpcyB0dXJuZWQgb24gYW5kIGRpZmZlcmVudCBwcmVmaXhlcyBmb3IgdGhlIHNhbWUKKyAgICAgICBuYW1lc3BhY2UgYXJlIHVzZWQuIEZvciB0aGlzIGNhc2Ugd2UgaGF2ZSBhIGNoZWNrIGZ1cnRoZXIgZG93bi4KKyAgICAqLworICAgIGlmICgoYXR0SWQtPm5hbWUpWy0xXSkgeworICAgICAgaWYgKGVuYyA9PSBlbmNvZGluZykKKyAgICAgICAgZXZlbnRQdHIgPSBhdHRzW2ldLm5hbWU7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX0RVUExJQ0FURV9BVFRSSUJVVEU7CisgICAgfQorICAgIChhdHRJZC0+bmFtZSlbLTFdID0gMTsKKyAgICBhcHBBdHRzW2F0dEluZGV4KytdID0gYXR0SWQtPm5hbWU7CisgICAgaWYgKCFhdHRzW2ldLm5vcm1hbGl6ZWQpIHsKKyAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgIFhNTF9Cb29sIGlzQ2RhdGEgPSBYTUxfVFJVRTsKKworICAgICAgLyogZmlndXJlIG91dCB3aGV0aGVyIGRlY2xhcmVkIGFzIG90aGVyIHRoYW4gQ0RBVEEgKi8KKyAgICAgIGlmIChhdHRJZC0+bWF5YmVUb2tlbml6ZWQpIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuRGVmYXVsdEF0dHM7IGorKykgeworICAgICAgICAgIGlmIChhdHRJZCA9PSBlbGVtZW50VHlwZS0+ZGVmYXVsdEF0dHNbal0uaWQpIHsKKyAgICAgICAgICAgIGlzQ2RhdGEgPSBlbGVtZW50VHlwZS0+ZGVmYXVsdEF0dHNbal0uaXNDZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBub3JtYWxpemUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLworICAgICAgcmVzdWx0ID0gc3RvcmVBdHRyaWJ1dGVWYWx1ZShwYXJzZXIsIGVuYywgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0c1tpXS52YWx1ZVB0ciwgYXR0c1tpXS52YWx1ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBQb29sKTsKKyAgICAgIGlmIChyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICBhcHBBdHRzW2F0dEluZGV4XSA9IHBvb2xTdGFydCgmdGVtcFBvb2wpOworICAgICAgcG9vbEZpbmlzaCgmdGVtcFBvb2wpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIHRoZSB2YWx1ZSBkaWQgbm90IG5lZWQgbm9ybWFsaXppbmcgKi8KKyAgICAgIGFwcEF0dHNbYXR0SW5kZXhdID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwgZW5jLCBhdHRzW2ldLnZhbHVlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0c1tpXS52YWx1ZUVuZCk7CisgICAgICBpZiAoYXBwQXR0c1thdHRJbmRleF0gPT0gMCkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgfQorICAgIC8qIGhhbmRsZSBwcmVmaXhlZCBhdHRyaWJ1dGUgbmFtZXMgKi8KKyAgICBpZiAoYXR0SWQtPnByZWZpeCkgeworICAgICAgaWYgKGF0dElkLT54bWxucykgeworICAgICAgICAvKiBkZWFsIHdpdGggbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBoZXJlICovCisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGFkZEJpbmRpbmcocGFyc2VyLCBhdHRJZC0+cHJlZml4LCBhdHRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBBdHRzW2F0dEluZGV4XSwgYmluZGluZ3NQdHIpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIC0tYXR0SW5kZXg7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogZGVhbCB3aXRoIG90aGVyIHByZWZpeGVkIG5hbWVzIGxhdGVyICovCisgICAgICAgIGF0dEluZGV4Kys7CisgICAgICAgIG5QcmVmaXhlcysrOworICAgICAgICAoYXR0SWQtPm5hbWUpWy0xXSA9IDI7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGF0dEluZGV4Kys7CisgIH0KKworICAvKiBzZXQtdXAgZm9yIFhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudCBhbmQgWE1MX0dldElkQXR0cmlidXRlSW5kZXggKi8KKyAgblNwZWNpZmllZEF0dHMgPSBhdHRJbmRleDsKKyAgaWYgKGVsZW1lbnRUeXBlLT5pZEF0dCAmJiAoZWxlbWVudFR5cGUtPmlkQXR0LT5uYW1lKVstMV0pIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXR0SW5kZXg7IGkgKz0gMikKKyAgICAgIGlmIChhcHBBdHRzW2ldID09IGVsZW1lbnRUeXBlLT5pZEF0dC0+bmFtZSkgeworICAgICAgICBpZEF0dEluZGV4ID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKyAgZWxzZQorICAgIGlkQXR0SW5kZXggPSAtMTsKKworICAvKiBkbyBhdHRyaWJ1dGUgZGVmYXVsdGluZyAqLworICBmb3IgKGkgPSAwOyBpIDwgbkRlZmF1bHRBdHRzOyBpKyspIHsKKyAgICBjb25zdCBERUZBVUxUX0FUVFJJQlVURSAqZGEgPSBlbGVtZW50VHlwZS0+ZGVmYXVsdEF0dHMgKyBpOworICAgIGlmICghKGRhLT5pZC0+bmFtZSlbLTFdICYmIGRhLT52YWx1ZSkgeworICAgICAgaWYgKGRhLT5pZC0+cHJlZml4KSB7CisgICAgICAgIGlmIChkYS0+aWQtPnhtbG5zKSB7CisgICAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gYWRkQmluZGluZyhwYXJzZXIsIGRhLT5pZC0+cHJlZml4LCBkYS0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYS0+dmFsdWUsIGJpbmRpbmdzUHRyKTsKKyAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAoZGEtPmlkLT5uYW1lKVstMV0gPSAyOworICAgICAgICAgIG5QcmVmaXhlcysrOworICAgICAgICAgIGFwcEF0dHNbYXR0SW5kZXgrK10gPSBkYS0+aWQtPm5hbWU7CisgICAgICAgICAgYXBwQXR0c1thdHRJbmRleCsrXSA9IGRhLT52YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIChkYS0+aWQtPm5hbWUpWy0xXSA9IDE7CisgICAgICAgIGFwcEF0dHNbYXR0SW5kZXgrK10gPSBkYS0+aWQtPm5hbWU7CisgICAgICAgIGFwcEF0dHNbYXR0SW5kZXgrK10gPSBkYS0+dmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisgIGFwcEF0dHNbYXR0SW5kZXhdID0gMDsKKworICAvKiBleHBhbmQgcHJlZml4ZWQgYXR0cmlidXRlIG5hbWVzLCBjaGVjayBmb3IgZHVwbGljYXRlcywKKyAgICAgYW5kIGNsZWFyIGZsYWdzIHRoYXQgc2F5IHdoZXRoZXIgYXR0cmlidXRlcyB3ZXJlIHNwZWNpZmllZCAqLworICBpID0gMDsKKyAgaWYgKG5QcmVmaXhlcykgeworICAgIGludCBqOyAgLyogaGFzaCB0YWJsZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGxvbmcgdmVyc2lvbiA9IG5zQXR0c1ZlcnNpb247CisgICAgaW50IG5zQXR0c1NpemUgPSAoaW50KTEgPDwgbnNBdHRzUG93ZXI7CisgICAgLyogc2l6ZSBvZiBoYXNoIHRhYmxlIG11c3QgYmUgYXQgbGVhc3QgMiAqICgjIG9mIHByZWZpeGVkIGF0dHJpYnV0ZXMpICovCisgICAgaWYgKChuUHJlZml4ZXMgPDwgMSkgPj4gbnNBdHRzUG93ZXIpIHsgIC8qIHRydWUgZm9yIG5zQXR0c1Bvd2VyID0gMCAqLworICAgICAgTlNfQVRUICp0ZW1wOworICAgICAgLyogaGFzaCB0YWJsZSBzaXplIG11c3QgYWxzbyBiZSBhIHBvd2VyIG9mIDIgYW5kID49IDggKi8KKyAgICAgIHdoaWxlIChuUHJlZml4ZXMgPj4gbnNBdHRzUG93ZXIrKyk7CisgICAgICBpZiAobnNBdHRzUG93ZXIgPCAzKQorICAgICAgICBuc0F0dHNQb3dlciA9IDM7CisgICAgICBuc0F0dHNTaXplID0gKGludCkxIDw8IG5zQXR0c1Bvd2VyOworICAgICAgdGVtcCA9IChOU19BVFQgKilSRUFMTE9DKG5zQXR0cywgbnNBdHRzU2l6ZSAqIHNpemVvZihOU19BVFQpKTsKKyAgICAgIGlmICghdGVtcCkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBuc0F0dHMgPSB0ZW1wOworICAgICAgdmVyc2lvbiA9IDA7ICAvKiBmb3JjZSByZS1pbml0aWFsaXphdGlvbiBvZiBuc0F0dHMgaGFzaCB0YWJsZSAqLworICAgIH0KKyAgICAvKiB1c2luZyBhIHZlcnNpb24gZmxhZyBzYXZlcyB1cyBmcm9tIGluaXRpYWxpemluZyBuc0F0dHMgZXZlcnkgdGltZSAqLworICAgIGlmICghdmVyc2lvbikgeyAgLyogaW5pdGlhbGl6ZSB2ZXJzaW9uIGZsYWdzIHdoZW4gdmVyc2lvbiB3cmFwcyBhcm91bmQgKi8KKyAgICAgIHZlcnNpb24gPSBJTklUX0FUVFNfVkVSU0lPTjsKKyAgICAgIGZvciAoaiA9IG5zQXR0c1NpemU7IGogIT0gMDsgKQorICAgICAgICBuc0F0dHNbLS1qXS52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisgICAgbnNBdHRzVmVyc2lvbiA9IC0tdmVyc2lvbjsKKworICAgIC8qIGV4cGFuZCBwcmVmaXhlZCBuYW1lcyBhbmQgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgKi8KKyAgICBmb3IgKDsgaSA8IGF0dEluZGV4OyBpICs9IDIpIHsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICpzID0gYXBwQXR0c1tpXTsKKyAgICAgIGlmIChzWy0xXSA9PSAyKSB7ICAvKiBwcmVmaXhlZCAqLworICAgICAgICBBVFRSSUJVVEVfSUQgKmlkOworICAgICAgICBjb25zdCBCSU5ESU5HICpiOworICAgICAgICB1bnNpZ25lZCBsb25nIHVyaUhhc2ggPSAwOworICAgICAgICAoKFhNTF9DaGFyICopcylbLTFdID0gMDsgIC8qIGNsZWFyIGZsYWcgKi8KKyAgICAgICAgaWQgPSAoQVRUUklCVVRFX0lEICopbG9va3VwKCZkdGQtPmF0dHJpYnV0ZUlkcywgcywgMCk7CisgICAgICAgIGIgPSBpZC0+cHJlZml4LT5iaW5kaW5nOworICAgICAgICBpZiAoIWIpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWDsKKworICAgICAgICAvKiBhcyB3ZSBleHBhbmQgdGhlIG5hbWUgd2UgYWxzbyBjYWxjdWxhdGUgaXRzIGhhc2ggdmFsdWUgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGItPnVyaUxlbjsgaisrKSB7CisgICAgICAgICAgY29uc3QgWE1MX0NoYXIgYyA9IGItPnVyaVtqXTsKKyAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgYykpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB1cmlIYXNoID0gQ0hBUl9IQVNIKHVyaUhhc2gsIGMpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgqcysrICE9IFhNTF9UKEFTQ0lJX0NPTE9OKSkKKyAgICAgICAgICA7CisgICAgICAgIGRvIHsgIC8qIGNvcGllcyBudWxsIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciBjID0gKnM7CisgICAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsICpzKSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIHVyaUhhc2ggPSBDSEFSX0hBU0godXJpSGFzaCwgYyk7CisgICAgICAgIH0gd2hpbGUgKCpzKyspOworCisgICAgICAgIHsgLyogQ2hlY2sgaGFzaCB0YWJsZSBmb3IgZHVwbGljYXRlIG9mIGV4cGFuZGVkIG5hbWUgKHVyaU5hbWUpLgorICAgICAgICAgICAgIERlcml2ZWQgZnJvbSBjb2RlIGluIGxvb2t1cChIQVNIX1RBQkxFICp0YWJsZSwgLi4uKS4KKyAgICAgICAgICAqLworICAgICAgICAgIHVuc2lnbmVkIGNoYXIgc3RlcCA9IDA7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXNrID0gbnNBdHRzU2l6ZSAtIDE7CisgICAgICAgICAgaiA9IHVyaUhhc2ggJiBtYXNrOyAgLyogaW5kZXggaW50byBoYXNoIHRhYmxlICovCisgICAgICAgICAgd2hpbGUgKG5zQXR0c1tqXS52ZXJzaW9uID09IHZlcnNpb24pIHsKKyAgICAgICAgICAgIC8qIGZvciBzcGVlZCB3ZSBjb21wYXJlIHN0b3JlZCBoYXNoIHZhbHVlcyBmaXJzdCAqLworICAgICAgICAgICAgaWYgKHVyaUhhc2ggPT0gbnNBdHRzW2pdLmhhc2gpIHsKKyAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnMxID0gcG9vbFN0YXJ0KCZ0ZW1wUG9vbCk7CisgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzMiA9IG5zQXR0c1tqXS51cmlOYW1lOworICAgICAgICAgICAgICAvKiBzMSBpcyBudWxsIHRlcm1pbmF0ZWQsIGJ1dCBub3QgczIgKi8KKyAgICAgICAgICAgICAgZm9yICg7ICpzMSA9PSAqczIgJiYgKnMxICE9IDA7IHMxKyssIHMyKyspOworICAgICAgICAgICAgICBpZiAoKnMxID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9EVVBMSUNBVEVfQVRUUklCVVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzdGVwKQorICAgICAgICAgICAgICBzdGVwID0gUFJPQkVfU1RFUCh1cmlIYXNoLCBtYXNrLCBuc0F0dHNQb3dlcik7CisgICAgICAgICAgICBqIDwgc3RlcCA/IChqICs9IG5zQXR0c1NpemUgLSBzdGVwKSA6IChqIC09IHN0ZXApOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuc190cmlwbGV0cykgeyAgLyogYXBwZW5kIG5hbWVzcGFjZSBzZXBhcmF0b3IgYW5kIHByZWZpeCAqLworICAgICAgICAgIHRlbXBQb29sLnB0clstMV0gPSBuYW1lc3BhY2VTZXBhcmF0b3I7CisgICAgICAgICAgcyA9IGItPnByZWZpeC0+bmFtZTsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgKnMpKQorICAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICB9IHdoaWxlICgqcysrKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0b3JlIGV4cGFuZGVkIG5hbWUgaW4gYXR0cmlidXRlIGxpc3QgKi8KKyAgICAgICAgcyA9IHBvb2xTdGFydCgmdGVtcFBvb2wpOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIGFwcEF0dHNbaV0gPSBzOworCisgICAgICAgIC8qIGZpbGwgZW1wdHkgc2xvdCB3aXRoIG5ldyB2ZXJzaW9uLCB1cmlOYW1lIGFuZCBoYXNoIHZhbHVlICovCisgICAgICAgIG5zQXR0c1tqXS52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbnNBdHRzW2pdLmhhc2ggPSB1cmlIYXNoOworICAgICAgICBuc0F0dHNbal0udXJpTmFtZSA9IHM7CisKKyAgICAgICAgaWYgKCEtLW5QcmVmaXhlcykgeworICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAgLyogbm90IHByZWZpeGVkICovCisgICAgICAgICgoWE1MX0NoYXIgKilzKVstMV0gPSAwOyAgLyogY2xlYXIgZmxhZyAqLworICAgIH0KKyAgfQorICAvKiBjbGVhciBmbGFncyBmb3IgdGhlIHJlbWFpbmluZyBhdHRyaWJ1dGVzICovCisgIGZvciAoOyBpIDwgYXR0SW5kZXg7IGkgKz0gMikKKyAgICAoKFhNTF9DaGFyICopKGFwcEF0dHNbaV0pKVstMV0gPSAwOworICBmb3IgKGJpbmRpbmcgPSAqYmluZGluZ3NQdHI7IGJpbmRpbmc7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0VGFnQmluZGluZykKKyAgICBiaW5kaW5nLT5hdHRJZC0+bmFtZVstMV0gPSAwOworCisgIGlmICghbnMpCisgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworCisgIC8qIGV4cGFuZCB0aGUgZWxlbWVudCB0eXBlIG5hbWUgKi8KKyAgaWYgKGVsZW1lbnRUeXBlLT5wcmVmaXgpIHsKKyAgICBiaW5kaW5nID0gZWxlbWVudFR5cGUtPnByZWZpeC0+YmluZGluZzsKKyAgICBpZiAoIWJpbmRpbmcpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQk9VTkRfUFJFRklYOworICAgIGxvY2FsUGFydCA9IHRhZ05hbWVQdHItPnN0cjsKKyAgICB3aGlsZSAoKmxvY2FsUGFydCsrICE9IFhNTF9UKEFTQ0lJX0NPTE9OKSkKKyAgICAgIDsKKyAgfQorICBlbHNlIGlmIChkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZykgeworICAgIGJpbmRpbmcgPSBkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZzsKKyAgICBsb2NhbFBhcnQgPSB0YWdOYW1lUHRyLT5zdHI7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgcHJlZml4TGVuID0gMDsKKyAgaWYgKG5zX3RyaXBsZXRzICYmIGJpbmRpbmctPnByZWZpeC0+bmFtZSkgeworICAgIGZvciAoOyBiaW5kaW5nLT5wcmVmaXgtPm5hbWVbcHJlZml4TGVuKytdOykKKyAgICAgIDsgIC8qIHByZWZpeExlbiBpbmNsdWRlcyBudWxsIHRlcm1pbmF0b3IgKi8KKyAgfQorICB0YWdOYW1lUHRyLT5sb2NhbFBhcnQgPSBsb2NhbFBhcnQ7CisgIHRhZ05hbWVQdHItPnVyaUxlbiA9IGJpbmRpbmctPnVyaUxlbjsKKyAgdGFnTmFtZVB0ci0+cHJlZml4ID0gYmluZGluZy0+cHJlZml4LT5uYW1lOworICB0YWdOYW1lUHRyLT5wcmVmaXhMZW4gPSBwcmVmaXhMZW47CisgIGZvciAoaSA9IDA7IGxvY2FsUGFydFtpKytdOykKKyAgICA7ICAvKiBpIGluY2x1ZGVzIG51bGwgdGVybWluYXRvciAqLworICBuID0gaSArIGJpbmRpbmctPnVyaUxlbiArIHByZWZpeExlbjsKKyAgaWYgKG4gPiBiaW5kaW5nLT51cmlBbGxvYykgeworICAgIFRBRyAqcDsKKyAgICB1cmkgPSAoWE1MX0NoYXIgKilNQUxMT0MoKG4gKyBFWFBBTkRfU1BBUkUpICogc2l6ZW9mKFhNTF9DaGFyKSk7CisgICAgaWYgKCF1cmkpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICBiaW5kaW5nLT51cmlBbGxvYyA9IG4gKyBFWFBBTkRfU1BBUkU7CisgICAgbWVtY3B5KHVyaSwgYmluZGluZy0+dXJpLCBiaW5kaW5nLT51cmlMZW4gKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICBmb3IgKHAgPSB0YWdTdGFjazsgcDsgcCA9IHAtPnBhcmVudCkKKyAgICAgIGlmIChwLT5uYW1lLnN0ciA9PSBiaW5kaW5nLT51cmkpCisgICAgICAgIHAtPm5hbWUuc3RyID0gdXJpOworICAgIEZSRUUoYmluZGluZy0+dXJpKTsKKyAgICBiaW5kaW5nLT51cmkgPSB1cmk7CisgIH0KKyAgLyogaWYgbmFtZXNwYWNlU2VwYXJhdG9yICE9ICdcMCcgdGhlbiB1cmkgaW5jbHVkZXMgaXQgYWxyZWFkeSAqLworICB1cmkgPSBiaW5kaW5nLT51cmkgKyBiaW5kaW5nLT51cmlMZW47CisgIG1lbWNweSh1cmksIGxvY2FsUGFydCwgaSAqIHNpemVvZihYTUxfQ2hhcikpOworICAvKiB3ZSBhbHdheXMgaGF2ZSBhIG5hbWVzcGFjZSBzZXBhcmF0b3IgYmV0d2VlbiBsb2NhbFBhcnQgYW5kIHByZWZpeCAqLworICBpZiAocHJlZml4TGVuKSB7CisgICAgdXJpICs9IGkgLSAxOworICAgICp1cmkgPSBuYW1lc3BhY2VTZXBhcmF0b3I7ICAvKiByZXBsYWNlIG51bGwgdGVybWluYXRvciAqLworICAgIG1lbWNweSh1cmkgKyAxLCBiaW5kaW5nLT5wcmVmaXgtPm5hbWUsIHByZWZpeExlbiAqIHNpemVvZihYTUxfQ2hhcikpOworICB9CisgIHRhZ05hbWVQdHItPnN0ciA9IGJpbmRpbmctPnVyaTsKKyAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworfQorCisvKiBhZGRCaW5kaW5nKCkgb3ZlcndyaXRlcyB0aGUgdmFsdWUgb2YgcHJlZml4LT5iaW5kaW5nIHdpdGhvdXQgY2hlY2tpbmcuCisgICBUaGVyZWZvcmUgb25lIG11c3Qga2VlcCB0cmFjayBvZiB0aGUgb2xkIHZhbHVlIG91dHNpZGUgb2YgYWRkQmluZGluZygpLgorKi8KK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorYWRkQmluZGluZyhYTUxfUGFyc2VyIHBhcnNlciwgUFJFRklYICpwcmVmaXgsIGNvbnN0IEFUVFJJQlVURV9JRCAqYXR0SWQsCisgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmksIEJJTkRJTkcgKipiaW5kaW5nc1B0cikKK3sKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIHhtbE5hbWVzcGFjZVtdID0geworICAgIEFTQ0lJX2gsIEFTQ0lJX3QsIEFTQ0lJX3QsIEFTQ0lJX3AsIEFTQ0lJX0NPTE9OLCBBU0NJSV9TTEFTSCwgQVNDSUlfU0xBU0gsCisgICAgQVNDSUlfdywgQVNDSUlfdywgQVNDSUlfdywgQVNDSUlfUEVSSU9ELCBBU0NJSV93LCBBU0NJSV8zLCBBU0NJSV9QRVJJT0QsCisgICAgQVNDSUlfbywgQVNDSUlfciwgQVNDSUlfZywgQVNDSUlfU0xBU0gsIEFTQ0lJX1gsIEFTQ0lJX00sIEFTQ0lJX0wsIAorICAgIEFTQ0lJX1NMQVNILCBBU0NJSV8xLCBBU0NJSV85LCBBU0NJSV85LCBBU0NJSV84LCBBU0NJSV9TTEFTSCwKKyAgICBBU0NJSV9uLCBBU0NJSV9hLCBBU0NJSV9tLCBBU0NJSV9lLCBBU0NJSV9zLCBBU0NJSV9wLCBBU0NJSV9hLCBBU0NJSV9jLAorICAgIEFTQ0lJX2UsICdcMCcKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludCB4bWxMZW4gPSAKKyAgICAoaW50KXNpemVvZih4bWxOYW1lc3BhY2UpL3NpemVvZihYTUxfQ2hhcikgLSAxOworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgeG1sbnNOYW1lc3BhY2VbXSA9IHsKKyAgICBBU0NJSV9oLCBBU0NJSV90LCBBU0NJSV90LCBBU0NJSV9wLCBBU0NJSV9DT0xPTiwgQVNDSUlfU0xBU0gsIEFTQ0lJX1NMQVNILAorICAgIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX3csIEFTQ0lJX1BFUklPRCwgQVNDSUlfdywgQVNDSUlfMywgQVNDSUlfUEVSSU9ELAorICAgIEFTQ0lJX28sIEFTQ0lJX3IsIEFTQ0lJX2csIEFTQ0lJX1NMQVNILCBBU0NJSV8yLCBBU0NJSV8wLCBBU0NJSV8wLCAKKyAgICBBU0NJSV8wLCBBU0NJSV9TTEFTSCwgQVNDSUlfeCwgQVNDSUlfbSwgQVNDSUlfbCwgQVNDSUlfbiwgQVNDSUlfcywgCisgICAgQVNDSUlfU0xBU0gsICdcMCcKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludCB4bWxuc0xlbiA9IAorICAgIChpbnQpc2l6ZW9mKHhtbG5zTmFtZXNwYWNlKS9zaXplb2YoWE1MX0NoYXIpIC0gMTsKKworICBYTUxfQm9vbCBtdXN0QmVYTUwgPSBYTUxfRkFMU0U7CisgIFhNTF9Cb29sIGlzWE1MID0gWE1MX1RSVUU7CisgIFhNTF9Cb29sIGlzWE1MTlMgPSBYTUxfVFJVRTsKKyAgCisgIEJJTkRJTkcgKmI7CisgIGludCBsZW47CisKKyAgLyogZW1wdHkgVVJJIGlzIG9ubHkgdmFsaWQgZm9yIGRlZmF1bHQgbmFtZXNwYWNlIHBlciBYTUwgTlMgMS4wIChub3QgMS4xKSAqLworICBpZiAoKnVyaSA9PSBYTUxfVCgnXDAnKSAmJiBwcmVmaXgtPm5hbWUpCisgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkRFQ0xBUklOR19QUkVGSVg7CisKKyAgaWYgKHByZWZpeC0+bmFtZQorICAgICAgJiYgcHJlZml4LT5uYW1lWzBdID09IFhNTF9UKEFTQ0lJX3gpCisgICAgICAmJiBwcmVmaXgtPm5hbWVbMV0gPT0gWE1MX1QoQVNDSUlfbSkKKyAgICAgICYmIHByZWZpeC0+bmFtZVsyXSA9PSBYTUxfVChBU0NJSV9sKSkgeworCisgICAgLyogTm90IGFsbG93ZWQgdG8gYmluZCB4bWxucyAqLworICAgIGlmIChwcmVmaXgtPm5hbWVbM10gPT0gWE1MX1QoQVNDSUlfbikKKyAgICAgICAgJiYgcHJlZml4LT5uYW1lWzRdID09IFhNTF9UKEFTQ0lJX3MpCisgICAgICAgICYmIHByZWZpeC0+bmFtZVs1XSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfUkVTRVJWRURfUFJFRklYX1hNTE5TOworCisgICAgaWYgKHByZWZpeC0+bmFtZVszXSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIG11c3RCZVhNTCA9IFhNTF9UUlVFOworICB9CisKKyAgZm9yIChsZW4gPSAwOyB1cmlbbGVuXTsgbGVuKyspIHsKKyAgICBpZiAoaXNYTUwgJiYgKGxlbiA+IHhtbExlbiB8fCB1cmlbbGVuXSAhPSB4bWxOYW1lc3BhY2VbbGVuXSkpCisgICAgICBpc1hNTCA9IFhNTF9GQUxTRTsKKworICAgIGlmICghbXVzdEJlWE1MICYmIGlzWE1MTlMgCisgICAgICAgICYmIChsZW4gPiB4bWxuc0xlbiB8fCB1cmlbbGVuXSAhPSB4bWxuc05hbWVzcGFjZVtsZW5dKSkKKyAgICAgIGlzWE1MTlMgPSBYTUxfRkFMU0U7CisgIH0KKyAgaXNYTUwgPSBpc1hNTCAmJiBsZW4gPT0geG1sTGVuOworICBpc1hNTE5TID0gaXNYTUxOUyAmJiBsZW4gPT0geG1sbnNMZW47CisKKyAgaWYgKG11c3RCZVhNTCAhPSBpc1hNTCkKKyAgICByZXR1cm4gbXVzdEJlWE1MID8gWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUwKKyAgICAgICAgICAgICAgICAgICAgIDogWE1MX0VSUk9SX1JFU0VSVkVEX05BTUVTUEFDRV9VUkk7CisKKyAgaWYgKGlzWE1MTlMpCisgICAgcmV0dXJuIFhNTF9FUlJPUl9SRVNFUlZFRF9OQU1FU1BBQ0VfVVJJOworCisgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCisgICAgbGVuKys7CisgIGlmIChmcmVlQmluZGluZ0xpc3QpIHsKKyAgICBiID0gZnJlZUJpbmRpbmdMaXN0OworICAgIGlmIChsZW4gPiBiLT51cmlBbGxvYykgeworICAgICAgWE1MX0NoYXIgKnRlbXAgPSAoWE1MX0NoYXIgKilSRUFMTE9DKGItPnVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFhNTF9DaGFyKSAqIChsZW4gKyBFWFBBTkRfU1BBUkUpKTsKKyAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgYi0+dXJpID0gdGVtcDsKKyAgICAgIGItPnVyaUFsbG9jID0gbGVuICsgRVhQQU5EX1NQQVJFOworICAgIH0KKyAgICBmcmVlQmluZGluZ0xpc3QgPSBiLT5uZXh0VGFnQmluZGluZzsKKyAgfQorICBlbHNlIHsKKyAgICBiID0gKEJJTkRJTkcgKilNQUxMT0Moc2l6ZW9mKEJJTkRJTkcpKTsKKyAgICBpZiAoIWIpCisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICBiLT51cmkgPSAoWE1MX0NoYXIgKilNQUxMT0Moc2l6ZW9mKFhNTF9DaGFyKSAqIChsZW4gKyBFWFBBTkRfU1BBUkUpKTsKKyAgICBpZiAoIWItPnVyaSkgeworICAgICAgRlJFRShiKTsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgIH0KKyAgICBiLT51cmlBbGxvYyA9IGxlbiArIEVYUEFORF9TUEFSRTsKKyAgfQorICBiLT51cmlMZW4gPSBsZW47CisgIG1lbWNweShiLT51cmksIHVyaSwgbGVuICogc2l6ZW9mKFhNTF9DaGFyKSk7CisgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCisgICAgYi0+dXJpW2xlbiAtIDFdID0gbmFtZXNwYWNlU2VwYXJhdG9yOworICBiLT5wcmVmaXggPSBwcmVmaXg7CisgIGItPmF0dElkID0gYXR0SWQ7CisgIGItPnByZXZQcmVmaXhCaW5kaW5nID0gcHJlZml4LT5iaW5kaW5nOworICAvKiBOVUxMIGJpbmRpbmcgd2hlbiBkZWZhdWx0IG5hbWVzcGFjZSB1bmRlY2xhcmVkICovCisgIGlmICgqdXJpID09IFhNTF9UKCdcMCcpICYmIHByZWZpeCA9PSAmX2R0ZC0+ZGVmYXVsdFByZWZpeCkKKyAgICBwcmVmaXgtPmJpbmRpbmcgPSBOVUxMOworICBlbHNlCisgICAgcHJlZml4LT5iaW5kaW5nID0gYjsKKyAgYi0+bmV4dFRhZ0JpbmRpbmcgPSAqYmluZGluZ3NQdHI7CisgICpiaW5kaW5nc1B0ciA9IGI7CisgIC8qIGlmIGF0dElkID09IE5VTEwgdGhlbiB3ZSBhcmUgbm90IHN0YXJ0aW5nIGEgbmFtZXNwYWNlIHNjb3BlICovCisgIGlmIChhdHRJZCAmJiBzdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKQorICAgIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgcHJlZml4LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LT5iaW5kaW5nID8gdXJpIDogMCk7CisgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKK30KKworLyogVGhlIGlkZWEgaGVyZSBpcyB0byBhdm9pZCB1c2luZyBzdGFjayBmb3IgZWFjaCBDREFUQSBzZWN0aW9uIHdoZW4KKyAgIHRoZSB3aG9sZSBmaWxlIGlzIHBhcnNlZCB3aXRoIG9uZSBjYWxsLgorKi8KK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitjZGF0YVNlY3Rpb25Qcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCit7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvQ2RhdGFTZWN0aW9uKHBhcnNlciwgZW5jb2RpbmcsICZzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOworICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgIHJldHVybiByZXN1bHQ7CisgIGlmIChzdGFydCkgeworICAgIGlmIChwYXJlbnRQYXJzZXIpIHsgIC8qIHdlIGFyZSBwYXJzaW5nIGFuIGV4dGVybmFsIGVudGl0eSAqLworICAgICAgcHJvY2Vzc29yID0gZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yOworICAgICAgcmV0dXJuIGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcihwYXJzZXIsIHN0YXJ0LCBlbmQsIGVuZFB0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcHJvY2Vzc29yID0gY29udGVudFByb2Nlc3NvcjsKKyAgICAgIHJldHVybiBjb250ZW50UHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIGVuZCwgZW5kUHRyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogc3RhcnRQdHIgZ2V0cyBzZXQgdG8gbm9uLW51bGwgaWYgdGhlIHNlY3Rpb24gaXMgY2xvc2VkLCBhbmQgdG8gbnVsbCBpZgorICAgdGhlIHNlY3Rpb24gaXMgbm90IHlldCBjbG9zZWQuCisqLworc3RhdGljIGVudW0gWE1MX0Vycm9yCitkb0NkYXRhU2VjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqc3RhcnRQdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0ciwKKyAgICAgICAgICAgICAgIFhNTF9Cb29sIGhhdmVNb3JlKQoreworICBjb25zdCBjaGFyICpzID0gKnN0YXJ0UHRyOworICBjb25zdCBjaGFyICoqZXZlbnRQUDsKKyAgY29uc3QgY2hhciAqKmV2ZW50RW5kUFA7CisgIGlmIChlbmMgPT0gZW5jb2RpbmcpIHsKKyAgICBldmVudFBQID0gJmV2ZW50UHRyOworICAgICpldmVudFBQID0gczsKKyAgICBldmVudEVuZFBQID0gJmV2ZW50RW5kUHRyOworICB9CisgIGVsc2UgeworICAgIGV2ZW50UFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50UHRyKTsKKyAgICBldmVudEVuZFBQID0gJihvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudEVuZFB0cik7CisgIH0KKyAgKmV2ZW50UFAgPSBzOworICAqc3RhcnRQdHIgPSBOVUxMOworCisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCB0b2sgPSBYbWxDZGF0YVNlY3Rpb25Ub2soZW5jLCBzLCBlbmQsICZuZXh0KTsKKyAgICAqZXZlbnRFbmRQUCA9IG5leHQ7CisgICAgc3dpdGNoICh0b2spIHsKKyAgICBjYXNlIFhNTF9UT0tfQ0RBVEFfU0VDVF9DTE9TRToKKyAgICAgIGlmIChlbmRDZGF0YVNlY3Rpb25IYW5kbGVyKQorICAgICAgICBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyKGhhbmRsZXJBcmcpOworI2lmIDAKKyAgICAgIC8qIHNlZSBjb21tZW50IHVuZGVyIFhNTF9UT0tfQ0RBVEFfU0VDVF9PUEVOICovCisgICAgICBlbHNlIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikKKyAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgMCk7CisjZW5kaWYKKyAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICpzdGFydFB0ciA9IG5leHQ7CisgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICBpZiAocHNfcGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19EQVRBX05FV0xJTkU6CisgICAgICBpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpIHsKKyAgICAgICAgWE1MX0NoYXIgYyA9IDB4QTsKKyAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgJmMsIDEpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX0RBVEFfQ0hBUlM6CisgICAgICB7CisgICAgICAgIFhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciBjaGFyRGF0YUhhbmRsZXIgPSBjaGFyYWN0ZXJEYXRhSGFuZGxlcjsKKyAgICAgICAgaWYgKGNoYXJEYXRhSGFuZGxlcikgeworICAgICAgICAgIGlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgeworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7CisgICAgICAgICAgICAgIFhtbENvbnZlcnQoZW5jLCAmcywgbmV4dCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOworICAgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IG5leHQ7CisgICAgICAgICAgICAgIGNoYXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBkYXRhQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKKyAgICAgICAgICAgICAgaWYgKHMgPT0gbmV4dCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgKmV2ZW50UFAgPSBzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBjaGFyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKilzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChYTUxfQ2hhciAqKW5leHQgLSAoWE1MX0NoYXIgKilzKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgICpldmVudFBQID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgorICAgICAgaWYgKGhhdmVNb3JlKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUw6CisgICAgY2FzZSBYTUxfVE9LX05PTkU6CisgICAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT047CisgICAgZGVmYXVsdDoKKyAgICAgICpldmVudFBQID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURTsKKyAgICB9CisKKyAgICAqZXZlbnRQUCA9IHMgPSBuZXh0OworICAgIHN3aXRjaCAocHNfcGFyc2luZykgeworICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKKyAgICAgICpuZXh0UHRyID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICBjYXNlIFhNTF9GSU5JU0hFRDoKKyAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKKyAgICBkZWZhdWx0OiA7CisgICAgfQorICB9CisgIC8qIG5vdCByZWFjaGVkICovCit9CisKKyNpZmRlZiBYTUxfRFRECisKKy8qIFRoZSBpZGVhIGhlcmUgaXMgdG8gYXZvaWQgdXNpbmcgc3RhY2sgZm9yIGVhY2ggSUdOT1JFIHNlY3Rpb24gd2hlbgorICAgdGhlIHdob2xlIGZpbGUgaXMgcGFyc2VkIHdpdGggb25lIGNhbGwuCisqLworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK2lnbm9yZVNlY3Rpb25Qcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCit7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvSWdub3JlU2VjdGlvbihwYXJzZXIsIGVuY29kaW5nLCAmc3RhcnQsIGVuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOworICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgIHJldHVybiByZXN1bHQ7CisgIGlmIChzdGFydCkgeworICAgIHByb2Nlc3NvciA9IHByb2xvZ1Byb2Nlc3NvcjsKKyAgICByZXR1cm4gcHJvbG9nUHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIGVuZCwgZW5kUHRyKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBzdGFydFB0ciBnZXRzIHNldCB0byBub24tbnVsbCBpcyB0aGUgc2VjdGlvbiBpcyBjbG9zZWQsIGFuZCB0byBudWxsCisgICBpZiB0aGUgc2VjdGlvbiBpcyBub3QgeWV0IGNsb3NlZC4KKyovCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2RvSWdub3JlU2VjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzdGFydFB0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIsCisgICAgICAgICAgICAgICAgWE1MX0Jvb2wgaGF2ZU1vcmUpCit7CisgIGNvbnN0IGNoYXIgKm5leHQ7CisgIGludCB0b2s7CisgIGNvbnN0IGNoYXIgKnMgPSAqc3RhcnRQdHI7CisgIGNvbnN0IGNoYXIgKipldmVudFBQOworICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKKyAgaWYgKGVuYyA9PSBlbmNvZGluZykgeworICAgIGV2ZW50UFAgPSAmZXZlbnRQdHI7CisgICAgKmV2ZW50UFAgPSBzOworICAgIGV2ZW50RW5kUFAgPSAmZXZlbnRFbmRQdHI7CisgIH0KKyAgZWxzZSB7CisgICAgZXZlbnRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRQdHIpOworICAgIGV2ZW50RW5kUFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50RW5kUHRyKTsKKyAgfQorICAqZXZlbnRQUCA9IHM7CisgICpzdGFydFB0ciA9IE5VTEw7CisgIHRvayA9IFhtbElnbm9yZVNlY3Rpb25Ub2soZW5jLCBzLCBlbmQsICZuZXh0KTsKKyAgKmV2ZW50RW5kUFAgPSBuZXh0OworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfSUdOT1JFX1NFQ1Q6CisgICAgaWYgKGRlZmF1bHRIYW5kbGVyKQorICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisgICAgKnN0YXJ0UHRyID0gbmV4dDsKKyAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX0ZJTklTSEVEKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgIGVsc2UKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6CisgICAgKmV2ZW50UFAgPSBuZXh0OworICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICpuZXh0UHRyID0gczsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICBjYXNlIFhNTF9UT0tfTk9ORToKKyAgICBpZiAoaGF2ZU1vcmUpIHsKKyAgICAgICpuZXh0UHRyID0gczsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9FUlJPUl9TWU5UQVg7IC8qIFhNTF9FUlJPUl9VTkNMT1NFRF9JR05PUkVfU0VDVElPTiAqLworICBkZWZhdWx0OgorICAgICpldmVudFBQID0gbmV4dDsKKyAgICByZXR1cm4gWE1MX0VSUk9SX1VORVhQRUNURURfU1RBVEU7CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitpbml0aWFsaXplRW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGNvbnN0IGNoYXIgKnM7CisjaWZkZWYgWE1MX1VOSUNPREUKKyAgY2hhciBlbmNvZGluZ0J1ZlsxMjhdOworICBpZiAoIXByb3RvY29sRW5jb2RpbmdOYW1lKQorICAgIHMgPSBOVUxMOworICBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBwcm90b2NvbEVuY29kaW5nTmFtZVtpXTsgaSsrKSB7CisgICAgICBpZiAoaSA9PSBzaXplb2YoZW5jb2RpbmdCdWYpIC0gMQorICAgICAgICAgIHx8IChwcm90b2NvbEVuY29kaW5nTmFtZVtpXSAmIH4weDdmKSAhPSAwKSB7CisgICAgICAgIGVuY29kaW5nQnVmWzBdID0gJ1wwJzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlbmNvZGluZ0J1ZltpXSA9IChjaGFyKXByb3RvY29sRW5jb2RpbmdOYW1lW2ldOworICAgIH0KKyAgICBlbmNvZGluZ0J1ZltpXSA9ICdcMCc7CisgICAgcyA9IGVuY29kaW5nQnVmOworICB9CisjZWxzZQorICBzID0gcHJvdG9jb2xFbmNvZGluZ05hbWU7CisjZW5kaWYKKyAgaWYgKChucyA/IFhtbEluaXRFbmNvZGluZ05TIDogWG1sSW5pdEVuY29kaW5nKSgmaW5pdEVuY29kaW5nLCAmZW5jb2RpbmcsIHMpKQorICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgcmV0dXJuIGhhbmRsZVVua25vd25FbmNvZGluZyhwYXJzZXIsIHByb3RvY29sRW5jb2RpbmdOYW1lKTsKK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yCitwcm9jZXNzWG1sRGVjbChYTUxfUGFyc2VyIHBhcnNlciwgaW50IGlzR2VuZXJhbFRleHRFbnRpdHksCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpuZXh0KQoreworICBjb25zdCBjaGFyICplbmNvZGluZ05hbWUgPSBOVUxMOworICBjb25zdCBYTUxfQ2hhciAqc3RvcmVkRW5jTmFtZSA9IE5VTEw7CisgIGNvbnN0IEVOQ09ESU5HICpuZXdFbmNvZGluZyA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKnZlcnNpb24gPSBOVUxMOworICBjb25zdCBjaGFyICp2ZXJzaW9uZW5kOworICBjb25zdCBYTUxfQ2hhciAqc3RvcmVkdmVyc2lvbiA9IE5VTEw7CisgIGludCBzdGFuZGFsb25lID0gLTE7CisgIGlmICghKG5zCisgICAgICAgID8gWG1sUGFyc2VYbWxEZWNsTlMKKyAgICAgICAgOiBYbWxQYXJzZVhtbERlY2wpKGlzR2VuZXJhbFRleHRFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVyc2lvbmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbmRhbG9uZSkpIHsKKyAgICBpZiAoaXNHZW5lcmFsVGV4dEVudGl0eSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfVEVYVF9ERUNMOworICAgIGVsc2UKKyAgICAgIHJldHVybiBYTUxfRVJST1JfWE1MX0RFQ0w7CisgIH0KKyAgaWYgKCFpc0dlbmVyYWxUZXh0RW50aXR5ICYmIHN0YW5kYWxvbmUgPT0gMSkgeworICAgIF9kdGQtPnN0YW5kYWxvbmUgPSBYTUxfVFJVRTsKKyNpZmRlZiBYTUxfRFRECisgICAgaWYgKHBhcmFtRW50aXR5UGFyc2luZyA9PSBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfVU5MRVNTX1NUQU5EQUxPTkUpCisgICAgICBwYXJhbUVudGl0eVBhcnNpbmcgPSBYTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfTkVWRVI7CisjZW5kaWYgLyogWE1MX0RURCAqLworICB9CisgIGlmICh4bWxEZWNsSGFuZGxlcikgeworICAgIGlmIChlbmNvZGluZ05hbWUgIT0gTlVMTCkgeworICAgICAgc3RvcmVkRW5jTmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcDJQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYbWxOYW1lTGVuZ3RoKGVuY29kaW5nLCBlbmNvZGluZ05hbWUpKTsKKyAgICAgIGlmICghc3RvcmVkRW5jTmFtZSkKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICBwb29sRmluaXNoKCZ0ZW1wMlBvb2wpOworICAgIH0KKyAgICBpZiAodmVyc2lvbikgeworICAgICAgc3RvcmVkdmVyc2lvbiA9IHBvb2xTdG9yZVN0cmluZygmdGVtcDJQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmVuZCAtIGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgaWYgKCFzdG9yZWR2ZXJzaW9uKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICB9CisgICAgeG1sRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgc3RvcmVkdmVyc2lvbiwgc3RvcmVkRW5jTmFtZSwgc3RhbmRhbG9uZSk7CisgIH0KKyAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuY29kaW5nLCBzLCBuZXh0KTsKKyAgaWYgKHByb3RvY29sRW5jb2RpbmdOYW1lID09IE5VTEwpIHsKKyAgICBpZiAobmV3RW5jb2RpbmcpIHsKKyAgICAgIGlmIChuZXdFbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyICE9IGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXIpIHsKKyAgICAgICAgZXZlbnRQdHIgPSBlbmNvZGluZ05hbWU7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfSU5DT1JSRUNUX0VOQ09ESU5HOworICAgICAgfQorICAgICAgZW5jb2RpbmcgPSBuZXdFbmNvZGluZzsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5jb2RpbmdOYW1lKSB7CisgICAgICBlbnVtIFhNTF9FcnJvciByZXN1bHQ7CisgICAgICBpZiAoIXN0b3JlZEVuY05hbWUpIHsKKyAgICAgICAgc3RvcmVkRW5jTmFtZSA9IHBvb2xTdG9yZVN0cmluZygKKyAgICAgICAgICAmdGVtcDJQb29sLCBlbmNvZGluZywgZW5jb2RpbmdOYW1lLAorICAgICAgICAgIGVuY29kaW5nTmFtZSArIFhtbE5hbWVMZW5ndGgoZW5jb2RpbmcsIGVuY29kaW5nTmFtZSkpOworICAgICAgICBpZiAoIXN0b3JlZEVuY05hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICB9CisgICAgICByZXN1bHQgPSBoYW5kbGVVbmtub3duRW5jb2RpbmcocGFyc2VyLCBzdG9yZWRFbmNOYW1lKTsKKyAgICAgIHBvb2xDbGVhcigmdGVtcDJQb29sKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gWE1MX0VSUk9SX1VOS05PV05fRU5DT0RJTkcpCisgICAgICAgIGV2ZW50UHRyID0gZW5jb2RpbmdOYW1lOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgIH0KKworICBpZiAoc3RvcmVkRW5jTmFtZSB8fCBzdG9yZWR2ZXJzaW9uKQorICAgIHBvb2xDbGVhcigmdGVtcDJQb29sKTsKKworICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgoraGFuZGxlVW5rbm93bkVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQoreworICBpZiAodW5rbm93bkVuY29kaW5nSGFuZGxlcikgeworICAgIFhNTF9FbmNvZGluZyBpbmZvOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgIGluZm8ubWFwW2ldID0gLTE7CisgICAgaW5mby5jb252ZXJ0ID0gTlVMTDsKKyAgICBpbmZvLmRhdGEgPSBOVUxMOworICAgIGluZm8ucmVsZWFzZSA9IE5VTEw7CisgICAgaWYgKHVua25vd25FbmNvZGluZ0hhbmRsZXIodW5rbm93bkVuY29kaW5nSGFuZGxlckRhdGEsIGVuY29kaW5nTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpIHsKKyAgICAgIEVOQ09ESU5HICplbmM7CisgICAgICB1bmtub3duRW5jb2RpbmdNZW0gPSBNQUxMT0MoWG1sU2l6ZU9mVW5rbm93bkVuY29kaW5nKCkpOworICAgICAgaWYgKCF1bmtub3duRW5jb2RpbmdNZW0pIHsKKyAgICAgICAgaWYgKGluZm8ucmVsZWFzZSkKKyAgICAgICAgICBpbmZvLnJlbGVhc2UoaW5mby5kYXRhKTsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICB9CisgICAgICBlbmMgPSAobnMKKyAgICAgICAgICAgICA/IFhtbEluaXRVbmtub3duRW5jb2RpbmdOUworICAgICAgICAgICAgIDogWG1sSW5pdFVua25vd25FbmNvZGluZykodW5rbm93bkVuY29kaW5nTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNvbnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmRhdGEpOworICAgICAgaWYgKGVuYykgeworICAgICAgICB1bmtub3duRW5jb2RpbmdEYXRhID0gaW5mby5kYXRhOworICAgICAgICB1bmtub3duRW5jb2RpbmdSZWxlYXNlID0gaW5mby5yZWxlYXNlOworICAgICAgICBlbmNvZGluZyA9IGVuYzsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5mby5yZWxlYXNlICE9IE5VTEwpCisgICAgICBpbmZvLnJlbGVhc2UoaW5mby5kYXRhKTsKKyAgfQorICByZXR1cm4gWE1MX0VSUk9SX1VOS05PV05fRU5DT0RJTkc7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitwcm9sb2dJbml0UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0UHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBpbml0aWFsaXplRW5jb2RpbmcocGFyc2VyKTsKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworICBwcm9jZXNzb3IgPSBwcm9sb2dQcm9jZXNzb3I7CisgIHJldHVybiBwcm9sb2dQcm9jZXNzb3IocGFyc2VyLCBzLCBlbmQsIG5leHRQdHIpOworfQorCisjaWZkZWYgWE1MX0RURAorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXh0ZXJuYWxQYXJFbnRJbml0UHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0UHRyKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBpbml0aWFsaXplRW5jb2RpbmcocGFyc2VyKTsKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworCisgIC8qIHdlIGtub3cgbm93IHRoYXQgWE1MX1BhcnNlKEJ1ZmZlcikgaGFzIGJlZW4gY2FsbGVkLAorICAgICBzbyB3ZSBjb25zaWRlciB0aGUgZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSByZWFkICovCisgIF9kdGQtPnBhcmFtRW50aXR5UmVhZCA9IFhNTF9UUlVFOworCisgIGlmIChwcm9sb2dTdGF0ZS5pbkVudGl0eVZhbHVlKSB7CisgICAgcHJvY2Vzc29yID0gZW50aXR5VmFsdWVJbml0UHJvY2Vzc29yOworICAgIHJldHVybiBlbnRpdHlWYWx1ZUluaXRQcm9jZXNzb3IocGFyc2VyLCBzLCBlbmQsIG5leHRQdHIpOworICB9CisgIGVsc2UgeworICAgIHByb2Nlc3NvciA9IGV4dGVybmFsUGFyRW50UHJvY2Vzc29yOworICAgIHJldHVybiBleHRlcm5hbFBhckVudFByb2Nlc3NvcihwYXJzZXIsIHMsIGVuZCwgbmV4dFB0cik7CisgIH0KK30KKworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK2VudGl0eVZhbHVlSW5pdFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgaW50IHRvazsKKyAgY29uc3QgY2hhciAqc3RhcnQgPSBzOworICBjb25zdCBjaGFyICpuZXh0ID0gc3RhcnQ7CisgIGV2ZW50UHRyID0gc3RhcnQ7CisKKyAgZm9yICg7OykgeyAgCisgICAgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzdGFydCwgZW5kLCAmbmV4dCk7CisgICAgZXZlbnRFbmRQdHIgPSBuZXh0OworICAgIGlmICh0b2sgPD0gMCkgeworICAgICAgaWYgKCFwc19maW5hbEJ1ZmZlciAmJiB0b2sgIT0gWE1MX1RPS19JTlZBTElEKSB7CisgICAgICAgICpuZXh0UHRyID0gczsKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgICAgfQorICAgICAgc3dpdGNoICh0b2spIHsKKyAgICAgIGNhc2UgWE1MX1RPS19JTlZBTElEOgorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU47CisgICAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMX0NIQVI6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICAgICAgY2FzZSBYTUxfVE9LX05PTkU6ICAgLyogc3RhcnQgPT0gZW5kICovCisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZvdW5kIGVuZCBvZiBlbnRpdHkgdmFsdWUgLSBjYW4gc3RvcmUgaXQgbm93ICovCisgICAgICByZXR1cm4gc3RvcmVFbnRpdHlWYWx1ZShwYXJzZXIsIGVuY29kaW5nLCBzLCBlbmQpOworICAgIH0KKyAgICBlbHNlIGlmICh0b2sgPT0gWE1MX1RPS19YTUxfREVDTCkgeworICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgcmVzdWx0ID0gcHJvY2Vzc1htbERlY2wocGFyc2VyLCAwLCBzdGFydCwgbmV4dCk7CisgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CisgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIGNhc2UgWE1MX0ZJTklTSEVEOgorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FCT1JURUQ7CisgICAgICBkZWZhdWx0OgorICAgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICB9CisgICAgICAvKiBzdG9wIHNjYW5uaW5nIGZvciB0ZXh0IGRlY2xhcmF0aW9uIC0gd2UgZm91bmQgb25lICovCisgICAgICBwcm9jZXNzb3IgPSBlbnRpdHlWYWx1ZVByb2Nlc3NvcjsKKyAgICAgIHJldHVybiBlbnRpdHlWYWx1ZVByb2Nlc3NvcihwYXJzZXIsIG5leHQsIGVuZCwgbmV4dFB0cik7CisgICAgfQorICAgIC8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHRoaXMgd291bGQgY2F1c2UgWG1sUHJvbG9nVG9rIHRvCisgICAgICAgcmV0dXJuIFhNTF9UT0tfTk9ORSBvbiB0aGUgbmV4dCBjYWxsLCB3aGljaCB3b3VsZCB0aGVuIGNhdXNlIHRoZQorICAgICAgIGZ1bmN0aW9uIHRvIGV4aXQgd2l0aCAqbmV4dFB0ciBzZXQgdG8gcyAtIHRoYXQgaXMgd2hhdCB3ZSB3YW50IGZvciBvdGhlcgorICAgICAgIHRva2VucywgYnV0IG5vdCBmb3IgdGhlIEJPTSAtIHdlIHdvdWxkIHJhdGhlciBsaWtlIHRvIHNraXAgaXQ7CisgICAgICAgdGhlbiwgd2hlbiB0aGlzIHJvdXRpbmUgaXMgZW50ZXJlZCB0aGUgbmV4dCB0aW1lLCBYbWxQcm9sb2dUb2sgd2lsbAorICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQsIHNpbmNlIHRoZSBCT00gaXMgc3RpbGwgaW4gdGhlIGJ1ZmZlcgorICAgICovCisgICAgZWxzZSBpZiAodG9rID09IFhNTF9UT0tfQk9NICYmIG5leHQgPT0gZW5kICYmICFwc19maW5hbEJ1ZmZlcikgeworICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIH0KKyAgICBzdGFydCA9IG5leHQ7CisgICAgZXZlbnRQdHIgPSBzdGFydDsKKyAgfQorfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXh0ZXJuYWxQYXJFbnRQcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIpCit7CisgIGNvbnN0IGNoYXIgKm5leHQgPSBzOworICBpbnQgdG9rOworCisgIHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgcywgZW5kLCAmbmV4dCk7CisgIGlmICh0b2sgPD0gMCkgeworICAgIGlmICghcHNfZmluYWxCdWZmZXIgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgeworICAgICAgKm5leHRQdHIgPSBzOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIH0KKyAgICBzd2l0Y2ggKHRvaykgeworICAgIGNhc2UgWE1MX1RPS19JTlZBTElEOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOOworICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgICAgY2FzZSBYTUxfVE9LX05PTkU6ICAgLyogc3RhcnQgPT0gZW5kICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvKiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBuZXh0IHN0YWdlLCBpLmUuIGRvUHJvbG9nIHRvIGJlIHBhc3NlZCBYTUxfVE9LX0JPTS4KKyAgICAgSG93ZXZlciwgd2hlbiBwYXJzaW5nIGFuIGV4dGVybmFsIHN1YnNldCwgZG9Qcm9sb2cgd2lsbCBub3QgYWNjZXB0IGEgQk9NCisgICAgIGFzIHZhbGlkLCBhbmQgcmVwb3J0IGEgc3ludGF4IGVycm9yLCBzbyB3ZSBoYXZlIHRvIHNraXAgdGhlIEJPTQorICAqLworICBlbHNlIGlmICh0b2sgPT0gWE1MX1RPS19CT00pIHsKKyAgICBzID0gbmV4dDsKKyAgICB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHMsIGVuZCwgJm5leHQpOworICB9CisKKyAgcHJvY2Vzc29yID0gcHJvbG9nUHJvY2Vzc29yOworICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIAorICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitlbnRpdHlWYWx1ZVByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgY29uc3QgY2hhciAqc3RhcnQgPSBzOworICBjb25zdCBjaGFyICpuZXh0ID0gczsKKyAgY29uc3QgRU5DT0RJTkcgKmVuYyA9IGVuY29kaW5nOworICBpbnQgdG9rOworCisgIGZvciAoOzspIHsKKyAgICB0b2sgPSBYbWxQcm9sb2dUb2soZW5jLCBzdGFydCwgZW5kLCAmbmV4dCk7CisgICAgaWYgKHRvayA8PSAwKSB7CisgICAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyICYmIHRvayAhPSBYTUxfVE9LX0lOVkFMSUQpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICBzd2l0Y2ggKHRvaykgeworICAgICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOworICAgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7CisgICAgICBjYXNlIFhNTF9UT0tfTk9ORTogICAvKiBzdGFydCA9PSBlbmQgKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLyogZm91bmQgZW5kIG9mIGVudGl0eSB2YWx1ZSAtIGNhbiBzdG9yZSBpdCBub3cgKi8KKyAgICAgIHJldHVybiBzdG9yZUVudGl0eVZhbHVlKHBhcnNlciwgZW5jLCBzLCBlbmQpOworICAgIH0KKyAgICBzdGFydCA9IG5leHQ7CisgIH0KK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKK3Byb2xvZ1Byb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgY29uc3QgY2hhciAqbmV4dCA9IHM7CisgIGludCB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHMsIGVuZCwgJm5leHQpOworICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIAorICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorZG9Qcm9sb2coWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgY29uc3QgY2hhciAqcywKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpuZXh0LAorICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIsCisgICAgICAgICBYTUxfQm9vbCBoYXZlTW9yZSkKK3sKKyNpZmRlZiBYTUxfRFRECisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBleHRlcm5hbFN1YnNldE5hbWVbXSA9IHsgQVNDSUlfSEFTSCAsICdcMCcgfTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUNEQVRBW10gPSAKKyAgICAgIHsgQVNDSUlfQywgQVNDSUlfRCwgQVNDSUlfQSwgQVNDSUlfVCwgQVNDSUlfQSwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVJRFtdID0geyBBU0NJSV9JLCBBU0NJSV9ELCAnXDAnIH07CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGW10gPQorICAgICAgeyBBU0NJSV9JLCBBU0NJSV9ELCBBU0NJSV9SLCBBU0NJSV9FLCBBU0NJSV9GLCAnXDAnIH07CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBhdHlwZUlEUkVGU1tdID0KKyAgICAgIHsgQVNDSUlfSSwgQVNDSUlfRCwgQVNDSUlfUiwgQVNDSUlfRSwgQVNDSUlfRiwgQVNDSUlfUywgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVFTlRJVFlbXSA9CisgICAgICB7IEFTQ0lJX0UsIEFTQ0lJX04sIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX1QsIEFTQ0lJX1ksICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGF0eXBlRU5USVRJRVNbXSA9IHsgQVNDSUlfRSwgQVNDSUlfTiwKKyAgICAgIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX0UsIEFTQ0lJX1MsICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGF0eXBlTk1UT0tFTltdID0geworICAgICAgQVNDSUlfTiwgQVNDSUlfTSwgQVNDSUlfVCwgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgYXR5cGVOTVRPS0VOU1tdID0geyBBU0NJSV9OLCBBU0NJSV9NLCBBU0NJSV9ULAorICAgICAgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgQVNDSUlfUywgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgbm90YXRpb25QcmVmaXhbXSA9IHsgQVNDSUlfTiwgQVNDSUlfTywgQVNDSUlfVCwKKyAgICAgIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX08sIEFTQ0lJX04sIEFTQ0lJX0xQQVJFTiwgJ1wwJyB9OworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgZW51bVZhbHVlU2VwW10gPSB7IEFTQ0lJX1BJUEUsICdcMCcgfTsKKyAgc3RhdGljIGNvbnN0IFhNTF9DaGFyIGVudW1WYWx1ZVN0YXJ0W10gPSB7IEFTQ0lJX0xQQVJFTiwgJ1wwJyB9OworCisgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7IAorCisgIGNvbnN0IGNoYXIgKipldmVudFBQOworICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKKyAgZW51bSBYTUxfQ29udGVudF9RdWFudCBxdWFudDsKKworICBpZiAoZW5jID09IGVuY29kaW5nKSB7CisgICAgZXZlbnRQUCA9ICZldmVudFB0cjsKKyAgICBldmVudEVuZFBQID0gJmV2ZW50RW5kUHRyOworICB9CisgIGVsc2UgeworICAgIGV2ZW50UFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50UHRyKTsKKyAgICBldmVudEVuZFBQID0gJihvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudEVuZFB0cik7CisgIH0KKworICBmb3IgKDs7KSB7CisgICAgaW50IHJvbGU7CisgICAgWE1MX0Jvb2wgaGFuZGxlRGVmYXVsdCA9IFhNTF9UUlVFOworICAgICpldmVudFBQID0gczsKKyAgICAqZXZlbnRFbmRQUCA9IG5leHQ7CisgICAgaWYgKHRvayA8PSAwKSB7CisgICAgICBpZiAoaGF2ZU1vcmUgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAodG9rKSB7CisgICAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgICAgKmV2ZW50UFAgPSBuZXh0OworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU47CisgICAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMX0NIQVI6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOworICAgICAgY2FzZSBYTUxfVE9LX05PTkU6CisjaWZkZWYgWE1MX0RURAorICAgICAgICAvKiBmb3IgaW50ZXJuYWwgUEUgTk9UIHJlZmVyZW5jZWQgYmV0d2VlbiBkZWNsYXJhdGlvbnMgKi8KKyAgICAgICAgaWYgKGVuYyAhPSBlbmNvZGluZyAmJiAhb3BlbkludGVybmFsRW50aXRpZXMtPmJldHdlZW5EZWNsKSB7CisgICAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgICAgfQorICAgICAgICAvKiBXRkM6IFBFIEJldHdlZW4gRGVjbGFyYXRpb25zIC0gbXVzdCBjaGVjayB0aGF0IFBFIGNvbnRhaW5zCisgICAgICAgICAgIGNvbXBsZXRlIG1hcmt1cCwgbm90IG9ubHkgZm9yIGV4dGVybmFsIFBFcywgYnV0IGFsc28gZm9yCisgICAgICAgICAgIGludGVybmFsIFBFcyBpZiB0aGUgcmVmZXJlbmNlIG9jY3VycyBiZXR3ZWVuIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGlzUGFyYW1FbnRpdHkgfHwgZW5jICE9IGVuY29kaW5nKSB7CisgICAgICAgICAgaWYgKFhtbFRva2VuUm9sZSgmcHJvbG9nU3RhdGUsIFhNTF9UT0tfTk9ORSwgZW5kLCBlbmQsIGVuYykKKyAgICAgICAgICAgICAgPT0gWE1MX1JPTEVfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0lOQ09NUExFVEVfUEU7CisgICAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19FTEVNRU5UUzsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRvayA9IC10b2s7CisgICAgICAgIG5leHQgPSBlbmQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByb2xlID0gWG1sVG9rZW5Sb2xlKCZwcm9sb2dTdGF0ZSwgdG9rLCBzLCBuZXh0LCBlbmMpOworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgWE1MX1JPTEVfWE1MX0RFQ0w6CisgICAgICB7CisgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IHByb2Nlc3NYbWxEZWNsKHBhcnNlciwgMCwgcywgbmV4dCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgZW5jID0gZW5jb2Rpbmc7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0RPQ1RZUEVfTkFNRToKKyAgICAgIGlmIChzdGFydERvY3R5cGVEZWNsSGFuZGxlcikgeworICAgICAgICBkb2N0eXBlTmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywgcywgbmV4dCk7CisgICAgICAgIGlmICghZG9jdHlwZU5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgZG9jdHlwZVB1YmlkID0gTlVMTDsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGRvY3R5cGVTeXNpZCA9IE5VTEw7IC8qIGFsd2F5cyBpbml0aWFsaXplIHRvIE5VTEwgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ6CisgICAgICBpZiAoc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIpIHsKKyAgICAgICAgc3RhcnREb2N0eXBlRGVjbEhhbmRsZXIoaGFuZGxlckFyZywgZG9jdHlwZU5hbWUsIGRvY3R5cGVTeXNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZVB1YmlkLCAxKTsKKyAgICAgICAgZG9jdHlwZU5hbWUgPSBOVUxMOworICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2lmZGVmIFhNTF9EVEQKKyAgICBjYXNlIFhNTF9ST0xFX1RFWFRfREVDTDoKKyAgICAgIHsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gcHJvY2Vzc1htbERlY2wocGFyc2VyLCAxLCBzLCBuZXh0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBlbmMgPSBlbmNvZGluZzsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICBjYXNlIFhNTF9ST0xFX0RPQ1RZUEVfUFVCTElDX0lEOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIHVzZUZvcmVpZ25EVEQgPSBYTUxfRkFMU0U7CisgICAgICBkZWNsRW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTdWJzZXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVOVElUWSkpOworICAgICAgaWYgKCFkZWNsRW50aXR5KQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgaWYgKHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKSB7CisgICAgICAgIGlmICghWG1sSXNQdWJsaWNJZChlbmMsIHMsIG5leHQsIGV2ZW50UFApKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfUFVCTElDSUQ7CisgICAgICAgIGRvY3R5cGVQdWJpZCA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmICghZG9jdHlwZVB1YmlkKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBub3JtYWxpemVQdWJsaWNJZCgoWE1MX0NoYXIgKilkb2N0eXBlUHViaWQpOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgIGdvdG8gYWxyZWFkeUNoZWNrZWQ7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFhNTF9ST0xFX0VOVElUWV9QVUJMSUNfSUQ6CisgICAgICBpZiAoIVhtbElzUHVibGljSWQoZW5jLCBzLCBuZXh0LCBldmVudFBQKSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9QVUJMSUNJRDsKKyAgICBhbHJlYWR5Q2hlY2tlZDoKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGRlY2xFbnRpdHkpIHsKKyAgICAgICAgWE1MX0NoYXIgKnRlbSA9IHBvb2xTdG9yZVN0cmluZygmZHRkLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCF0ZW0pCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIG5vcm1hbGl6ZVB1YmxpY0lkKHRlbSk7CisgICAgICAgIGRlY2xFbnRpdHktPnB1YmxpY0lkID0gdGVtOworICAgICAgICBwb29sRmluaXNoKCZkdGQtPnBvb2wpOworICAgICAgICBpZiAoZW50aXR5RGVjbEhhbmRsZXIpCisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRE9DVFlQRV9DTE9TRToKKyAgICAgIGlmIChkb2N0eXBlTmFtZSkgeworICAgICAgICBzdGFydERvY3R5cGVEZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBkb2N0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdHlwZVN5c2lkLCBkb2N0eXBlUHViaWQsIDApOworICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIC8qIGRvY3R5cGVTeXNpZCB3aWxsIGJlIG5vbi1OVUxMIGluIHRoZSBjYXNlIG9mIGEgcHJldmlvdXMKKyAgICAgICAgIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lELCBldmVuIGlmIHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyCisgICAgICAgICB3YXMgbm90IHNldCwgaW5kaWNhdGluZyBhbiBleHRlcm5hbCBzdWJzZXQKKyAgICAgICovCisjaWZkZWYgWE1MX0RURAorICAgICAgaWYgKGRvY3R5cGVTeXNpZCB8fCB1c2VGb3JlaWduRFREKSB7CisgICAgICAgIFhNTF9Cb29sIGhhZFBhcmFtRW50aXR5UmVmcyA9IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzOworICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgICBpZiAocGFyYW1FbnRpdHlQYXJzaW5nICYmIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgIEVOVElUWSAqZW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFTlRJVFkpKTsKKyAgICAgICAgICBpZiAoIWVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGlmICh1c2VGb3JlaWduRFREKQorICAgICAgICAgICAgZW50aXR5LT5iYXNlID0gY3VyQmFzZTsKKyAgICAgICAgICBkdGQtPnBhcmFtRW50aXR5UmVhZCA9IFhNTF9GQUxTRTsKKyAgICAgICAgICBpZiAoIWV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5zeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnB1YmxpY0lkKSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HOworICAgICAgICAgIGlmIChkdGQtPnBhcmFtRW50aXR5UmVhZCkgeworICAgICAgICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUgJiYgCisgICAgICAgICAgICAgICAgbm90U3RhbmRhbG9uZUhhbmRsZXIgJiYgCisgICAgICAgICAgICAgICAgIW5vdFN0YW5kYWxvbmVIYW5kbGVyKGhhbmRsZXJBcmcpKQorICAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PVF9TVEFOREFMT05FOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBpZiB3ZSBkaWRuJ3QgcmVhZCB0aGUgZm9yZWlnbiBEVEQgdGhlbiB0aGlzIG1lYW5zIHRoYXQgdGhlcmUKKyAgICAgICAgICAgICBpcyBubyBleHRlcm5hbCBzdWJzZXQgYW5kIHdlIG11c3QgcmVzZXQgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMKKyAgICAgICAgICAqLworICAgICAgICAgIGVsc2UgaWYgKCFkb2N0eXBlU3lzaWQpCisgICAgICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IGhhZFBhcmFtRW50aXR5UmVmczsKKyAgICAgICAgICAvKiBlbmQgb2YgRFREIC0gbm8gbmVlZCB0byB1cGRhdGUgZHRkLT5rZWVwUHJvY2Vzc2luZyAqLworICAgICAgICB9CisgICAgICAgIHVzZUZvcmVpZ25EVEQgPSBYTUxfRkFMU0U7CisgICAgICB9CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgaWYgKGVuZERvY3R5cGVEZWNsSGFuZGxlcikgeworICAgICAgICBlbmREb2N0eXBlRGVjbEhhbmRsZXIoaGFuZGxlckFyZyk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0lOU1RBTkNFX1NUQVJUOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIC8qIGlmIHRoZXJlIGlzIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24gdGhlbiBub3cgaXMgdGhlCisgICAgICAgICBsYXN0IGNoYW5jZSB0byByZWFkIHRoZSBmb3JlaWduIERURAorICAgICAgKi8KKyAgICAgIGlmICh1c2VGb3JlaWduRFREKSB7CisgICAgICAgIFhNTF9Cb29sIGhhZFBhcmFtRW50aXR5UmVmcyA9IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzOworICAgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgICBpZiAocGFyYW1FbnRpdHlQYXJzaW5nICYmIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgIEVOVElUWSAqZW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5wYXJhbUVudGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFN1YnNldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFTlRJVFkpKTsKKyAgICAgICAgICBpZiAoIWVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGVudGl0eS0+YmFzZSA9IGN1ckJhc2U7CisgICAgICAgICAgZHRkLT5wYXJhbUVudGl0eVJlYWQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKCFleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+c3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKKyAgICAgICAgICBpZiAoZHRkLT5wYXJhbUVudGl0eVJlYWQpIHsKKyAgICAgICAgICAgIGlmICghZHRkLT5zdGFuZGFsb25lICYmCisgICAgICAgICAgICAgICAgbm90U3RhbmRhbG9uZUhhbmRsZXIgJiYKKyAgICAgICAgICAgICAgICAhbm90U3RhbmRhbG9uZUhhbmRsZXIoaGFuZGxlckFyZykpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9UX1NUQU5EQUxPTkU7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIGlmIHdlIGRpZG4ndCByZWFkIHRoZSBmb3JlaWduIERURCB0aGVuIHRoaXMgbWVhbnMgdGhhdCB0aGVyZQorICAgICAgICAgICAgIGlzIG5vIGV4dGVybmFsIHN1YnNldCBhbmQgd2UgbXVzdCByZXNldCBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcworICAgICAgICAgICovCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBoYWRQYXJhbUVudGl0eVJlZnM7CisgICAgICAgICAgLyogZW5kIG9mIERURCAtIG5vIG5lZWQgdG8gdXBkYXRlIGR0ZC0+a2VlcFByb2Nlc3NpbmcgKi8KKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICAgIHByb2Nlc3NvciA9IGNvbnRlbnRQcm9jZXNzb3I7CisgICAgICByZXR1cm4gY29udGVudFByb2Nlc3NvcihwYXJzZXIsIHMsIGVuZCwgbmV4dFB0cik7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRMSVNUX0VMRU1FTlRfTkFNRToKKyAgICAgIGRlY2xFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIGlmICghZGVjbEVsZW1lbnRUeXBlKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGdvdG8gY2hlY2tBdHRMaXN0RGVjbEhhbmRsZXI7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfTkFNRToKKyAgICAgIGRlY2xBdHRyaWJ1dGVJZCA9IGdldEF0dHJpYnV0ZUlkKHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgIGlmICghZGVjbEF0dHJpYnV0ZUlkKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGRlY2xBdHRyaWJ1dGVJc0NkYXRhID0gWE1MX0ZBTFNFOworICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSBOVUxMOworICAgICAgZGVjbEF0dHJpYnV0ZUlzSWQgPSBYTUxfRkFMU0U7CisgICAgICBnb3RvIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOworICAgIGNhc2UgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfQ0RBVEE6CisgICAgICBkZWNsQXR0cmlidXRlSXNDZGF0YSA9IFhNTF9UUlVFOworICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSBhdHlwZUNEQVRBOworICAgICAgZ290byBjaGVja0F0dExpc3REZWNsSGFuZGxlcjsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0lEOgorICAgICAgZGVjbEF0dHJpYnV0ZUlzSWQgPSBYTUxfVFJVRTsKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVJRDsKKyAgICAgIGdvdG8gY2hlY2tBdHRMaXN0RGVjbEhhbmRsZXI7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9JRFJFRjoKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVJRFJFRjsKKyAgICAgIGdvdG8gY2hlY2tBdHRMaXN0RGVjbEhhbmRsZXI7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9JRFJFRlM6CisgICAgICBkZWNsQXR0cmlidXRlVHlwZSA9IGF0eXBlSURSRUZTOworICAgICAgZ290byBjaGVja0F0dExpc3REZWNsSGFuZGxlcjsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0VOVElUWToKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVFTlRJVFk7CisgICAgICBnb3RvIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOworICAgIGNhc2UgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfRU5USVRJRVM6CisgICAgICBkZWNsQXR0cmlidXRlVHlwZSA9IGF0eXBlRU5USVRJRVM7CisgICAgICBnb3RvIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOworICAgIGNhc2UgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfTk1UT0tFTjoKKyAgICAgIGRlY2xBdHRyaWJ1dGVUeXBlID0gYXR5cGVOTVRPS0VOOworICAgICAgZ290byBjaGVja0F0dExpc3REZWNsSGFuZGxlcjsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX05NVE9LRU5TOgorICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSBhdHlwZU5NVE9LRU5TOworICAgIGNoZWNrQXR0TGlzdERlY2xIYW5kbGVyOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcgJiYgYXR0bGlzdERlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfRU5VTV9WQUxVRToKKyAgICBjYXNlIFhNTF9ST0xFX0FUVFJJQlVURV9OT1RBVElPTl9WQUxVRToKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGF0dGxpc3REZWNsSGFuZGxlcikgeworICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4OworICAgICAgICBpZiAoZGVjbEF0dHJpYnV0ZVR5cGUpIHsKKyAgICAgICAgICBwcmVmaXggPSBlbnVtVmFsdWVTZXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcHJlZml4ID0gKHJvbGUgPT0gWE1MX1JPTEVfQVRUUklCVVRFX05PVEFUSU9OX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgID8gbm90YXRpb25QcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgOiBlbnVtVmFsdWVTdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwb29sQXBwZW5kU3RyaW5nKCZ0ZW1wUG9vbCwgcHJlZml4KSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgaWYgKCFwb29sQXBwZW5kKCZ0ZW1wUG9vbCwgZW5jLCBzLCBuZXh0KSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSB0ZW1wUG9vbC5zdGFydDsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfSU1QTElFRF9BVFRSSUJVVEVfVkFMVUU6CisgICAgY2FzZSBYTUxfUk9MRV9SRVFVSVJFRF9BVFRSSUJVVEVfVkFMVUU6CisgICAgICBpZiAoZHRkLT5rZWVwUHJvY2Vzc2luZykgeworICAgICAgICBpZiAoIWRlZmluZUF0dHJpYnV0ZShkZWNsRWxlbWVudFR5cGUsIGRlY2xBdHRyaWJ1dGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEsIGRlY2xBdHRyaWJ1dGVJc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBwYXJzZXIpKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBpZiAoYXR0bGlzdERlY2xIYW5kbGVyICYmIGRlY2xBdHRyaWJ1dGVUeXBlKSB7CisgICAgICAgICAgaWYgKCpkZWNsQXR0cmlidXRlVHlwZSA9PSBYTUxfVChBU0NJSV9MUEFSRU4pCisgICAgICAgICAgICAgIHx8ICgqZGVjbEF0dHJpYnV0ZVR5cGUgPT0gWE1MX1QoQVNDSUlfTikKKyAgICAgICAgICAgICAgICAgICYmIGRlY2xBdHRyaWJ1dGVUeXBlWzFdID09IFhNTF9UKEFTQ0lJX08pKSkgeworICAgICAgICAgICAgLyogRW51bWVyYXRlZCBvciBOb3RhdGlvbiB0eXBlICovCisgICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoQVNDSUlfUlBBUkVOKSkKKyAgICAgICAgICAgICAgICB8fCAhcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSB0ZW1wUG9vbC5zdGFydDsKKyAgICAgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgICAgIGF0dGxpc3REZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBkZWNsRWxlbWVudFR5cGUtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xBdHRyaWJ1dGVJZC0+bmFtZSwgZGVjbEF0dHJpYnV0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJvbGUgPT0gWE1MX1JPTEVfUkVRVUlSRURfQVRUUklCVVRFX1ZBTFVFKTsKKyAgICAgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0RFRkFVTFRfQVRUUklCVVRFX1ZBTFVFOgorICAgIGNhc2UgWE1MX1JPTEVfRklYRURfQVRUUklCVVRFX1ZBTFVFOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcpIHsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKmF0dFZhbDsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0KKyAgICAgICAgICBzdG9yZUF0dHJpYnV0ZVZhbHVlKHBhcnNlciwgZW5jLCBkZWNsQXR0cmlidXRlSXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdGQtPnBvb2wpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGF0dFZhbCA9IHBvb2xTdGFydCgmZHRkLT5wb29sKTsKKyAgICAgICAgcG9vbEZpbmlzaCgmZHRkLT5wb29sKTsKKyAgICAgICAgLyogSUQgYXR0cmlidXRlcyBhcmVuJ3QgYWxsb3dlZCB0byBoYXZlIGEgZGVmYXVsdCAqLworICAgICAgICBpZiAoIWRlZmluZUF0dHJpYnV0ZShkZWNsRWxlbWVudFR5cGUsIGRlY2xBdHRyaWJ1dGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEsIFhNTF9GQUxTRSwgYXR0VmFsLCBwYXJzZXIpKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBpZiAoYXR0bGlzdERlY2xIYW5kbGVyICYmIGRlY2xBdHRyaWJ1dGVUeXBlKSB7CisgICAgICAgICAgaWYgKCpkZWNsQXR0cmlidXRlVHlwZSA9PSBYTUxfVChBU0NJSV9MUEFSRU4pCisgICAgICAgICAgICAgIHx8ICgqZGVjbEF0dHJpYnV0ZVR5cGUgPT0gWE1MX1QoQVNDSUlfTikKKyAgICAgICAgICAgICAgICAgICYmIGRlY2xBdHRyaWJ1dGVUeXBlWzFdID09IFhNTF9UKEFTQ0lJX08pKSkgeworICAgICAgICAgICAgLyogRW51bWVyYXRlZCBvciBOb3RhdGlvbiB0eXBlICovCisgICAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoQVNDSUlfUlBBUkVOKSkKKyAgICAgICAgICAgICAgICB8fCAhcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgZGVjbEF0dHJpYnV0ZVR5cGUgPSB0ZW1wUG9vbC5zdGFydDsKKyAgICAgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgICAgIGF0dGxpc3REZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBkZWNsRWxlbWVudFR5cGUtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xBdHRyaWJ1dGVJZC0+bmFtZSwgZGVjbEF0dHJpYnV0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSA9PSBYTUxfUk9MRV9GSVhFRF9BVFRSSUJVVEVfVkFMVUUpOworICAgICAgICAgIHBvb2xDbGVhcigmdGVtcFBvb2wpOworICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRU5USVRZX1ZBTFVFOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcpIHsKKyAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gc3RvcmVFbnRpdHlWYWx1ZShwYXJzZXIsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoZGVjbEVudGl0eSkgeworICAgICAgICAgIGRlY2xFbnRpdHktPnRleHRQdHIgPSBwb29sU3RhcnQoJmR0ZC0+ZW50aXR5VmFsdWVQb29sKTsKKyAgICAgICAgICBkZWNsRW50aXR5LT50ZXh0TGVuID0gKGludCkocG9vbExlbmd0aCgmZHRkLT5lbnRpdHlWYWx1ZVBvb2wpKTsKKyAgICAgICAgICBwb29sRmluaXNoKCZkdGQtPmVudGl0eVZhbHVlUG9vbCk7CisgICAgICAgICAgaWYgKGVudGl0eURlY2xIYW5kbGVyKSB7CisgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IHM7CisgICAgICAgICAgICBlbnRpdHlEZWNsSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+dGV4dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJCYXNlLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwb29sRGlzY2FyZCgmZHRkLT5lbnRpdHlWYWx1ZVBvb2wpOworICAgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lEOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIHVzZUZvcmVpZ25EVEQgPSBYTUxfRkFMU0U7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBYTUxfVFJVRTsKKyAgICAgIGlmIChzdGFydERvY3R5cGVEZWNsSGFuZGxlcikgeworICAgICAgICBkb2N0eXBlU3lzaWQgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoZG9jdHlwZVN5c2lkID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyNpZmRlZiBYTUxfRFRECisgICAgICBlbHNlCisgICAgICAgIC8qIHVzZSBleHRlcm5hbFN1YnNldE5hbWUgdG8gbWFrZSBkb2N0eXBlU3lzaWQgbm9uLU5VTEwKKyAgICAgICAgICAgZm9yIHRoZSBjYXNlIHdoZXJlIG5vIHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyIGlzIHNldCAqLworICAgICAgICBkb2N0eXBlU3lzaWQgPSBleHRlcm5hbFN1YnNldE5hbWU7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUKKyNpZmRlZiBYTUxfRFRECisgICAgICAgICAgJiYgIXBhcmFtRW50aXR5UGFyc2luZworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICAgICAgICAmJiBub3RTdGFuZGFsb25lSGFuZGxlcgorICAgICAgICAgICYmICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKKyNpZm5kZWYgWE1MX0RURAorICAgICAgYnJlYWs7CisjZWxzZSAvKiBYTUxfRFREICovCisgICAgICBpZiAoIWRlY2xFbnRpdHkpIHsKKyAgICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTdWJzZXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRU5USVRZKSk7CisgICAgICAgIGlmICghZGVjbEVudGl0eSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZGVjbEVudGl0eS0+cHVibGljSWQgPSBOVUxMOworICAgICAgfQorICAgICAgLyogZmFsbCB0aHJvdWdoICovCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIGNhc2UgWE1MX1JPTEVfRU5USVRZX1NZU1RFTV9JRDoKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGRlY2xFbnRpdHkpIHsKKyAgICAgICAgZGVjbEVudGl0eS0+c3lzdGVtSWQgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmICghZGVjbEVudGl0eS0+c3lzdGVtSWQpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGRlY2xFbnRpdHktPmJhc2UgPSBjdXJCYXNlOworICAgICAgICBwb29sRmluaXNoKCZkdGQtPnBvb2wpOworICAgICAgICBpZiAoZW50aXR5RGVjbEhhbmRsZXIpCisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRU5USVRZX0NPTVBMRVRFOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcgJiYgZGVjbEVudGl0eSAmJiBlbnRpdHlEZWNsSGFuZGxlcikgeworICAgICAgICAqZXZlbnRFbmRQUCA9IHM7CisgICAgICAgIGVudGl0eURlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5wdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0VOVElUWV9OT1RBVElPTl9OQU1FOgorICAgICAgaWYgKGR0ZC0+a2VlcFByb2Nlc3NpbmcgJiYgZGVjbEVudGl0eSkgeworICAgICAgICBkZWNsRW50aXR5LT5ub3RhdGlvbiA9IHBvb2xTdG9yZVN0cmluZygmZHRkLT5wb29sLCBlbmMsIHMsIG5leHQpOworICAgICAgICBpZiAoIWRlY2xFbnRpdHktPm5vdGF0aW9uKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBwb29sRmluaXNoKCZkdGQtPnBvb2wpOworICAgICAgICBpZiAodW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcikgeworICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+cHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5ub3RhdGlvbik7CisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlbnRpdHlEZWNsSGFuZGxlcikgeworICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICBlbnRpdHlEZWNsSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xFbnRpdHktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbEVudGl0eS0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5zeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5wdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsRW50aXR5LT5ub3RhdGlvbik7CisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9HRU5FUkFMX0VOVElUWV9OQU1FOgorICAgICAgeworICAgICAgICBpZiAoWG1sUHJlZGVmaW5lZEVudGl0eU5hbWUoZW5jLCBzLCBuZXh0KSkgeworICAgICAgICAgIGRlY2xFbnRpdHkgPSBOVUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nKSB7CisgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICBkZWNsRW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5nZW5lcmFsRW50aXRpZXMsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVOVElUWSkpOworICAgICAgICAgIGlmICghZGVjbEVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGlmIChkZWNsRW50aXR5LT5uYW1lICE9IG5hbWUpIHsKKyAgICAgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAgICAgZGVjbEVudGl0eSA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcG9vbEZpbmlzaCgmZHRkLT5wb29sKTsKKyAgICAgICAgICAgIGRlY2xFbnRpdHktPnB1YmxpY0lkID0gTlVMTDsKKyAgICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtID0gWE1MX0ZBTFNFOworICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSBhIHBhcmVudCBwYXJzZXIgb3IgYXJlIHJlYWRpbmcgYW4gaW50ZXJuYWwgcGFyYW1ldGVyCisgICAgICAgICAgICAgICBlbnRpdHksIHRoZW4gdGhlIGVudGl0eSBkZWNsYXJhdGlvbiBpcyBub3QgY29uc2lkZXJlZCAiaW50ZXJuYWwiCisgICAgICAgICAgICAqLworICAgICAgICAgICAgZGVjbEVudGl0eS0+aXNfaW50ZXJuYWwgPSAhKHBhcmVudFBhcnNlciB8fCBvcGVuSW50ZXJuYWxFbnRpdGllcyk7CisgICAgICAgICAgICBpZiAoZW50aXR5RGVjbEhhbmRsZXIpCisgICAgICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAgIGRlY2xFbnRpdHkgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX1BBUkFNX0VOVElUWV9OQU1FOgorI2lmZGVmIFhNTF9EVEQKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nKSB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywgcywgbmV4dCk7CisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZGVjbEVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzaXplb2YoRU5USVRZKSk7CisgICAgICAgIGlmICghZGVjbEVudGl0eSkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgaWYgKGRlY2xFbnRpdHktPm5hbWUgIT0gbmFtZSkgeworICAgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAgIGRlY2xFbnRpdHkgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgICAgICAgZGVjbEVudGl0eS0+cHVibGljSWQgPSBOVUxMOworICAgICAgICAgIGRlY2xFbnRpdHktPmlzX3BhcmFtID0gWE1MX1RSVUU7CisgICAgICAgICAgLyogaWYgd2UgaGF2ZSBhIHBhcmVudCBwYXJzZXIgb3IgYXJlIHJlYWRpbmcgYW4gaW50ZXJuYWwgcGFyYW1ldGVyCisgICAgICAgICAgICAgZW50aXR5LCB0aGVuIHRoZSBlbnRpdHkgZGVjbGFyYXRpb24gaXMgbm90IGNvbnNpZGVyZWQgImludGVybmFsIgorICAgICAgICAgICovCisgICAgICAgICAgZGVjbEVudGl0eS0+aXNfaW50ZXJuYWwgPSAhKHBhcmVudFBhcnNlciB8fCBvcGVuSW50ZXJuYWxFbnRpdGllcyk7CisgICAgICAgICAgaWYgKGVudGl0eURlY2xIYW5kbGVyKQorICAgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICBkZWNsRW50aXR5ID0gTlVMTDsKKyAgICAgIH0KKyNlbHNlIC8qIG5vdCBYTUxfRFREICovCisgICAgICBkZWNsRW50aXR5ID0gTlVMTDsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX05PVEFUSU9OX05BTUU6CisgICAgICBkZWNsTm90YXRpb25QdWJsaWNJZCA9IE5VTEw7CisgICAgICBkZWNsTm90YXRpb25OYW1lID0gTlVMTDsKKyAgICAgIGlmIChub3RhdGlvbkRlY2xIYW5kbGVyKSB7CisgICAgICAgIGRlY2xOb3RhdGlvbk5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsIHMsIG5leHQpOworICAgICAgICBpZiAoIWRlY2xOb3RhdGlvbk5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfTk9UQVRJT05fUFVCTElDX0lEOgorICAgICAgaWYgKCFYbWxJc1B1YmxpY0lkKGVuYywgcywgbmV4dCwgZXZlbnRQUCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfUFVCTElDSUQ7CisgICAgICBpZiAoZGVjbE5vdGF0aW9uTmFtZSkgeyAgLyogbWVhbnMgbm90YXRpb25EZWNsSGFuZGxlciAhPSBOVUxMICovCisgICAgICAgIFhNTF9DaGFyICp0ZW0gPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCF0ZW0pCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIG5vcm1hbGl6ZVB1YmxpY0lkKHRlbSk7CisgICAgICAgIGRlY2xOb3RhdGlvblB1YmxpY0lkID0gdGVtOworICAgICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX05PVEFUSU9OX1NZU1RFTV9JRDoKKyAgICAgIGlmIChkZWNsTm90YXRpb25OYW1lICYmIG5vdGF0aW9uRGVjbEhhbmRsZXIpIHsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkCisgICAgICAgICAgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CisgICAgICAgIGlmICghc3lzdGVtSWQpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgbm90YXRpb25EZWNsSGFuZGxlcihoYW5kbGVyQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xOb3RhdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsTm90YXRpb25QdWJsaWNJZCk7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfTk9UQVRJT05fTk9fU1lTVEVNX0lEOgorICAgICAgaWYgKGRlY2xOb3RhdGlvblB1YmxpY0lkICYmIG5vdGF0aW9uRGVjbEhhbmRsZXIpIHsKKyAgICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgICBub3RhdGlvbkRlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbE5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbE5vdGF0aW9uUHVibGljSWQpOworICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgfQorICAgICAgcG9vbENsZWFyKCZ0ZW1wUG9vbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0VSUk9SOgorICAgICAgc3dpdGNoICh0b2spIHsKKyAgICAgIGNhc2UgWE1MX1RPS19QQVJBTV9FTlRJVFlfUkVGOgorICAgICAgICAvKiBQRSByZWZlcmVuY2VzIGluIGludGVybmFsIHN1YnNldCBhcmUKKyAgICAgICAgICAgbm90IGFsbG93ZWQgd2l0aGluIGRlY2xhcmF0aW9ucy4gKi8gIAorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1BBUkFNX0VOVElUWV9SRUY7CisgICAgICBjYXNlIFhNTF9UT0tfWE1MX0RFQ0w6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfU1lOVEFYOworICAgICAgfQorI2lmZGVmIFhNTF9EVEQKKyAgICBjYXNlIFhNTF9ST0xFX0lHTk9SRV9TRUNUOgorICAgICAgeworICAgICAgICBlbnVtIFhNTF9FcnJvciByZXN1bHQ7CisgICAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgcmVzdWx0ID0gZG9JZ25vcmVTZWN0aW9uKHBhcnNlciwgZW5jLCAmbmV4dCwgZW5kLCBuZXh0UHRyLCBoYXZlTW9yZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgZWxzZSBpZiAoIW5leHQpIHsKKyAgICAgICAgICBwcm9jZXNzb3IgPSBpZ25vcmVTZWN0aW9uUHJvY2Vzc29yOworICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICBjYXNlIFhNTF9ST0xFX0dST1VQX09QRU46CisgICAgICBpZiAocHJvbG9nU3RhdGUubGV2ZWwgPj0gZ3JvdXBTaXplKSB7CisgICAgICAgIGlmIChncm91cFNpemUpIHsKKyAgICAgICAgICBjaGFyICp0ZW1wID0gKGNoYXIgKilSRUFMTE9DKGdyb3VwQ29ubmVjdG9yLCBncm91cFNpemUgKj0gMik7CisgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGdyb3VwQ29ubmVjdG9yID0gdGVtcDsKKyAgICAgICAgICBpZiAoZHRkLT5zY2FmZkluZGV4KSB7CisgICAgICAgICAgICBpbnQgKnRlbXAgPSAoaW50ICopUkVBTExPQyhkdGQtPnNjYWZmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwU2l6ZSAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgZHRkLT5zY2FmZkluZGV4ID0gdGVtcDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ3JvdXBDb25uZWN0b3IgPSAoY2hhciAqKU1BTExPQyhncm91cFNpemUgPSAzMik7CisgICAgICAgICAgaWYgKCFncm91cENvbm5lY3RvcikKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICB9CisgICAgICBncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0gPSAwOworICAgICAgaWYgKGR0ZC0+aW5fZWxkZWNsKSB7CisgICAgICAgIGludCBteWluZGV4ID0gbmV4dFNjYWZmb2xkUGFydChwYXJzZXIpOworICAgICAgICBpZiAobXlpbmRleCA8IDApCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGR0ZC0+c2NhZmZJbmRleFtkdGQtPnNjYWZmTGV2ZWxdID0gbXlpbmRleDsKKyAgICAgICAgZHRkLT5zY2FmZkxldmVsKys7CisgICAgICAgIGR0ZC0+c2NhZmZvbGRbbXlpbmRleF0udHlwZSA9IFhNTF9DVFlQRV9TRVE7CisgICAgICAgIGlmIChlbGVtZW50RGVjbEhhbmRsZXIpCisgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfR1JPVVBfU0VRVUVOQ0U6CisgICAgICBpZiAoZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID09IEFTQ0lJX1BJUEUpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfU1lOVEFYOworICAgICAgZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID0gQVNDSUlfQ09NTUE7CisgICAgICBpZiAoZHRkLT5pbl9lbGRlY2wgJiYgZWxlbWVudERlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9HUk9VUF9DSE9JQ0U6CisgICAgICBpZiAoZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID09IEFTQ0lJX0NPTU1BKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1NZTlRBWDsKKyAgICAgIGlmIChkdGQtPmluX2VsZGVjbAorICAgICAgICAgICYmICFncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0KKyAgICAgICAgICAmJiAoZHRkLT5zY2FmZm9sZFtkdGQtPnNjYWZmSW5kZXhbZHRkLT5zY2FmZkxldmVsIC0gMV1dLnR5cGUKKyAgICAgICAgICAgICAgIT0gWE1MX0NUWVBFX01JWEVEKQorICAgICAgICAgICkgeworICAgICAgICBkdGQtPnNjYWZmb2xkW2R0ZC0+c2NhZmZJbmRleFtkdGQtPnNjYWZmTGV2ZWwgLSAxXV0udHlwZQorICAgICAgICAgICAgPSBYTUxfQ1RZUEVfQ0hPSUNFOworICAgICAgICBpZiAoZWxlbWVudERlY2xIYW5kbGVyKQorICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0gPSBBU0NJSV9QSVBFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfUkVGOgorI2lmZGVmIFhNTF9EVEQKKyAgICBjYXNlIFhNTF9ST0xFX0lOTkVSX1BBUkFNX0VOVElUWV9SRUY6CisgICAgICBkdGQtPmhhc1BhcmFtRW50aXR5UmVmcyA9IFhNTF9UUlVFOworICAgICAgaWYgKCFwYXJhbUVudGl0eVBhcnNpbmcpCisgICAgICAgIGR0ZC0+a2VlcFByb2Nlc3NpbmcgPSBkdGQtPnN0YW5kYWxvbmU7CisgICAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgICAgICAgIEVOVElUWSAqZW50aXR5OworICAgICAgICBuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQtPnBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgICAvKiBmaXJzdCwgZGV0ZXJtaW5lIGlmIGEgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGRlY2xhcmF0aW9uIGlzIG5lZWRlZDsKKyAgICAgICAgICAgaWYgeWVzLCBjaGVjayB0aGF0IHRoZSBlbnRpdHkgZXhpc3RzLCBhbmQgdGhhdCBpdCBpcyBpbnRlcm5hbCwKKyAgICAgICAgICAgb3RoZXJ3aXNlIGNhbGwgdGhlIHNraXBwZWQgZW50aXR5IGhhbmRsZXIKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHByb2xvZ1N0YXRlLmRvY3VtZW50RW50aXR5ICYmCisgICAgICAgICAgICAoZHRkLT5zdGFuZGFsb25lCisgICAgICAgICAgICAgPyAhb3BlbkludGVybmFsRW50aXRpZXMKKyAgICAgICAgICAgICA6ICFkdGQtPmhhc1BhcmFtRW50aXR5UmVmcykpIHsKKyAgICAgICAgICBpZiAoIWVudGl0eSkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWTsKKyAgICAgICAgICBlbHNlIGlmICghZW50aXR5LT5pc19pbnRlcm5hbCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfRU5USVRZX0RFQ0xBUkVEX0lOX1BFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFlbnRpdHkpIHsKKyAgICAgICAgICBkdGQtPmtlZXBQcm9jZXNzaW5nID0gZHRkLT5zdGFuZGFsb25lOworICAgICAgICAgIC8qIGNhbm5vdCByZXBvcnQgc2tpcHBlZCBlbnRpdGllcyBpbiBkZWNsYXJhdGlvbnMgKi8KKyAgICAgICAgICBpZiAoKHJvbGUgPT0gWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRikgJiYgc2tpcHBlZEVudGl0eUhhbmRsZXIpIHsKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDEpOworICAgICAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudGl0eS0+b3BlbikKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGOworICAgICAgICBpZiAoZW50aXR5LT50ZXh0UHRyKSB7CisgICAgICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OworICAgICAgICAgIFhNTF9Cb29sIGJldHdlZW5EZWNsID0gCisgICAgICAgICAgICAocm9sZSA9PSBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfUkVGID8gWE1MX1RSVUUgOiBYTUxfRkFMU0UpOworICAgICAgICAgIHJlc3VsdCA9IHByb2Nlc3NJbnRlcm5hbEVudGl0eShwYXJzZXIsIGVudGl0eSwgYmV0d2VlbkRlY2wpOworICAgICAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgIGR0ZC0+cGFyYW1FbnRpdHlSZWFkID0gWE1MX0ZBTFNFOworICAgICAgICAgIGVudGl0eS0+b3BlbiA9IFhNTF9UUlVFOworICAgICAgICAgIGlmICghZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+cHVibGljSWQpKSB7CisgICAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORzsKKyAgICAgICAgICB9CisgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKCFkdGQtPnBhcmFtRW50aXR5UmVhZCkgeworICAgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBkdGQtPmtlZXBQcm9jZXNzaW5nID0gZHRkLT5zdGFuZGFsb25lOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgaWYgKCFkdGQtPnN0YW5kYWxvbmUgJiYKKyAgICAgICAgICBub3RTdGFuZGFsb25lSGFuZGxlciAmJgorICAgICAgICAgICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKKyAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKKyAgICAgIGJyZWFrOworCisgICAgLyogRWxlbWVudCBkZWNsYXJhdGlvbiBzdHVmZiAqLworCisgICAgY2FzZSBYTUxfUk9MRV9FTEVNRU5UX05BTUU6CisgICAgICBpZiAoZWxlbWVudERlY2xIYW5kbGVyKSB7CisgICAgICAgIGRlY2xFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKKyAgICAgICAgaWYgKCFkZWNsRWxlbWVudFR5cGUpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGR0ZC0+c2NhZmZMZXZlbCA9IDA7CisgICAgICAgIGR0ZC0+c2NhZmZDb3VudCA9IDA7CisgICAgICAgIGR0ZC0+aW5fZWxkZWNsID0gWE1MX1RSVUU7CisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgWE1MX1JPTEVfQ09OVEVOVF9BTlk6CisgICAgY2FzZSBYTUxfUk9MRV9DT05URU5UX0VNUFRZOgorICAgICAgaWYgKGR0ZC0+aW5fZWxkZWNsKSB7CisgICAgICAgIGlmIChlbGVtZW50RGVjbEhhbmRsZXIpIHsKKyAgICAgICAgICBYTUxfQ29udGVudCAqIGNvbnRlbnQgPSAoWE1MX0NvbnRlbnQgKikgTUFMTE9DKHNpemVvZihYTUxfQ29udGVudCkpOworICAgICAgICAgIGlmICghY29udGVudCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgIGNvbnRlbnQtPnF1YW50ID0gWE1MX0NRVUFOVF9OT05FOworICAgICAgICAgIGNvbnRlbnQtPm5hbWUgPSBOVUxMOworICAgICAgICAgIGNvbnRlbnQtPm51bWNoaWxkcmVuID0gMDsKKyAgICAgICAgICBjb250ZW50LT5jaGlsZHJlbiA9IE5VTEw7CisgICAgICAgICAgY29udGVudC0+dHlwZSA9ICgocm9sZSA9PSBYTUxfUk9MRV9DT05URU5UX0FOWSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NUWVBFX0FOWSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfQ1RZUEVfRU1QVFkpOworICAgICAgICAgICpldmVudEVuZFBQID0gczsKKyAgICAgICAgICBlbGVtZW50RGVjbEhhbmRsZXIoaGFuZGxlckFyZywgZGVjbEVsZW1lbnRUeXBlLT5uYW1lLCBjb250ZW50KTsKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGR0ZC0+aW5fZWxkZWNsID0gWE1MX0ZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfUENEQVRBOgorICAgICAgaWYgKGR0ZC0+aW5fZWxkZWNsKSB7CisgICAgICAgIGR0ZC0+c2NhZmZvbGRbZHRkLT5zY2FmZkluZGV4W2R0ZC0+c2NhZmZMZXZlbCAtIDFdXS50eXBlCisgICAgICAgICAgICA9IFhNTF9DVFlQRV9NSVhFRDsKKyAgICAgICAgaWYgKGVsZW1lbnREZWNsSGFuZGxlcikKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVDoKKyAgICAgIHF1YW50ID0gWE1MX0NRVUFOVF9OT05FOworICAgICAgZ290byBlbGVtZW50Q29udGVudDsKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9PUFQ6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfT1BUOworICAgICAgZ290byBlbGVtZW50Q29udGVudDsKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9SRVA6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfUkVQOworICAgICAgZ290byBlbGVtZW50Q29udGVudDsKKyAgICBjYXNlIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9QTFVTOgorICAgICAgcXVhbnQgPSBYTUxfQ1FVQU5UX1BMVVM7CisgICAgZWxlbWVudENvbnRlbnQ6CisgICAgICBpZiAoZHRkLT5pbl9lbGRlY2wpIHsKKyAgICAgICAgRUxFTUVOVF9UWVBFICplbDsKKyAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgICAgICAgIGludCBuYW1lTGVuOworICAgICAgICBjb25zdCBjaGFyICpueHQgPSAocXVhbnQgPT0gWE1MX0NRVUFOVF9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaW50IG15aW5kZXggPSBuZXh0U2NhZmZvbGRQYXJ0KHBhcnNlcik7CisgICAgICAgIGlmIChteWluZGV4IDwgMCkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZHRkLT5zY2FmZm9sZFtteWluZGV4XS50eXBlID0gWE1MX0NUWVBFX05BTUU7CisgICAgICAgIGR0ZC0+c2NhZmZvbGRbbXlpbmRleF0ucXVhbnQgPSBxdWFudDsKKyAgICAgICAgZWwgPSBnZXRFbGVtZW50VHlwZShwYXJzZXIsIGVuYywgcywgbnh0KTsKKyAgICAgICAgaWYgKCFlbCkKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgbmFtZSA9IGVsLT5uYW1lOworICAgICAgICBkdGQtPnNjYWZmb2xkW215aW5kZXhdLm5hbWUgPSBuYW1lOworICAgICAgICBuYW1lTGVuID0gMDsKKyAgICAgICAgZm9yICg7IG5hbWVbbmFtZUxlbisrXTsgKTsKKyAgICAgICAgZHRkLT5jb250ZW50U3RyaW5nTGVuICs9ICBuYW1lTGVuOworICAgICAgICBpZiAoZWxlbWVudERlY2xIYW5kbGVyKQorICAgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgWE1MX1JPTEVfR1JPVVBfQ0xPU0U6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfTk9ORTsKKyAgICAgIGdvdG8gY2xvc2VHcm91cDsKKyAgICBjYXNlIFhNTF9ST0xFX0dST1VQX0NMT1NFX09QVDoKKyAgICAgIHF1YW50ID0gWE1MX0NRVUFOVF9PUFQ7CisgICAgICBnb3RvIGNsb3NlR3JvdXA7CisgICAgY2FzZSBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVA6CisgICAgICBxdWFudCA9IFhNTF9DUVVBTlRfUkVQOworICAgICAgZ290byBjbG9zZUdyb3VwOworICAgIGNhc2UgWE1MX1JPTEVfR1JPVVBfQ0xPU0VfUExVUzoKKyAgICAgIHF1YW50ID0gWE1MX0NRVUFOVF9QTFVTOworICAgIGNsb3NlR3JvdXA6CisgICAgICBpZiAoZHRkLT5pbl9lbGRlY2wpIHsKKyAgICAgICAgaWYgKGVsZW1lbnREZWNsSGFuZGxlcikKKyAgICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICBkdGQtPnNjYWZmTGV2ZWwtLTsKKyAgICAgICAgZHRkLT5zY2FmZm9sZFtkdGQtPnNjYWZmSW5kZXhbZHRkLT5zY2FmZkxldmVsXV0ucXVhbnQgPSBxdWFudDsKKyAgICAgICAgaWYgKGR0ZC0+c2NhZmZMZXZlbCA9PSAwKSB7CisgICAgICAgICAgaWYgKCFoYW5kbGVEZWZhdWx0KSB7CisgICAgICAgICAgICBYTUxfQ29udGVudCAqbW9kZWwgPSBidWlsZF9tb2RlbChwYXJzZXIpOworICAgICAgICAgICAgaWYgKCFtb2RlbCkKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IHM7CisgICAgICAgICAgICBlbGVtZW50RGVjbEhhbmRsZXIoaGFuZGxlckFyZywgZGVjbEVsZW1lbnRUeXBlLT5uYW1lLCBtb2RlbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGR0ZC0+aW5fZWxkZWNsID0gWE1MX0ZBTFNFOworICAgICAgICAgIGR0ZC0+Y29udGVudFN0cmluZ0xlbiA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgICAgLyogRW5kIGVsZW1lbnQgZGVjbGFyYXRpb24gc3R1ZmYgKi8KKworICAgIGNhc2UgWE1MX1JPTEVfUEk6CisgICAgICBpZiAoIXJlcG9ydFByb2Nlc3NpbmdJbnN0cnVjdGlvbihwYXJzZXIsIGVuYywgcywgbmV4dCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfQ09NTUVOVDoKKyAgICAgIGlmICghcmVwb3J0Q29tbWVudChwYXJzZXIsIGVuYywgcywgbmV4dCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfTk9ORToKKyAgICAgIHN3aXRjaCAodG9rKSB7CisgICAgICBjYXNlIFhNTF9UT0tfQk9NOgorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRE9DVFlQRV9OT05FOgorICAgICAgaWYgKHN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9FTlRJVFlfTk9ORToKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGVudGl0eURlY2xIYW5kbGVyKQorICAgICAgICBoYW5kbGVEZWZhdWx0ID0gWE1MX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfUk9MRV9OT1RBVElPTl9OT05FOgorICAgICAgaWYgKG5vdGF0aW9uRGVjbEhhbmRsZXIpCisgICAgICAgIGhhbmRsZURlZmF1bHQgPSBYTUxfRkFMU0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhNTF9ST0xFX0FUVExJU1RfTk9ORToKKyAgICAgIGlmIChkdGQtPmtlZXBQcm9jZXNzaW5nICYmIGF0dGxpc3REZWNsSGFuZGxlcikKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1JPTEVfRUxFTUVOVF9OT05FOgorICAgICAgaWYgKGVsZW1lbnREZWNsSGFuZGxlcikKKyAgICAgICAgaGFuZGxlRGVmYXVsdCA9IFhNTF9GQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0gLyogZW5kIG9mIGJpZyBzd2l0Y2ggKi8KKworICAgIGlmIChoYW5kbGVEZWZhdWx0ICYmIGRlZmF1bHRIYW5kbGVyKQorICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CisKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKKyAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAorICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX0ZJTklTSEVEOgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgIGRlZmF1bHQ6CisgICAgICBzID0gbmV4dDsKKyAgICAgIHRvayA9IFhtbFByb2xvZ1RvayhlbmMsIHMsIGVuZCwgJm5leHQpOworICAgIH0KKyAgfQorICAvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXBpbG9nUHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0UHRyKQoreworICBwcm9jZXNzb3IgPSBlcGlsb2dQcm9jZXNzb3I7CisgIGV2ZW50UHRyID0gczsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBOVUxMOworICAgIGludCB0b2sgPSBYbWxQcm9sb2dUb2soZW5jb2RpbmcsIHMsIGVuZCwgJm5leHQpOworICAgIGV2ZW50RW5kUHRyID0gbmV4dDsKKyAgICBzd2l0Y2ggKHRvaykgeworICAgIC8qIHJlcG9ydCBwYXJ0aWFsIGxpbmVicmVhayAtIGl0IG1pZ2h0IGJlIHRoZSBsYXN0IHRva2VuICovCisgICAgY2FzZSAtWE1MX1RPS19QUk9MT0dfUzoKKyAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikgeworICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpOworICAgICAgICBpZiAocHNfcGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOworICAgICAgfQorICAgICAgKm5leHRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19OT05FOgorICAgICAgKm5leHRQdHIgPSBzOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworICAgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikKKyAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuY29kaW5nLCBzLCBuZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19QSToKKyAgICAgIGlmICghcmVwb3J0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DT01NRU5UOgorICAgICAgaWYgKCFyZXBvcnRDb21tZW50KHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19JTlZBTElEOgorICAgICAgZXZlbnRQdHIgPSBuZXh0OworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOOworICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgorICAgICAgaWYgKCFwc19maW5hbEJ1ZmZlcikgeworICAgICAgICAqbmV4dFB0ciA9IHM7CisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKKyAgICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKKyAgICAgICAgKm5leHRQdHIgPSBzOworICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9KVU5LX0FGVEVSX0RPQ19FTEVNRU5UOworICAgIH0KKyAgICBldmVudFB0ciA9IHMgPSBuZXh0OworICAgIHN3aXRjaCAocHNfcGFyc2luZykgeworICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCisgICAgICAqbmV4dFB0ciA9IG5leHQ7CisgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CisgICAgY2FzZSBYTUxfRklOSVNIRUQ6CisgICAgICByZXR1cm4gWE1MX0VSUk9SX0FCT1JURUQ7CisgICAgZGVmYXVsdDogOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK3Byb2Nlc3NJbnRlcm5hbEVudGl0eShYTUxfUGFyc2VyIHBhcnNlciwgRU5USVRZICplbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgWE1MX0Jvb2wgYmV0d2VlbkRlY2wpCit7CisgIGNvbnN0IGNoYXIgKnRleHRTdGFydCwgKnRleHRFbmQ7CisgIGNvbnN0IGNoYXIgKm5leHQ7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHk7CisKKyAgaWYgKGZyZWVJbnRlcm5hbEVudGl0aWVzKSB7CisgICAgb3BlbkVudGl0eSA9IGZyZWVJbnRlcm5hbEVudGl0aWVzOworICAgIGZyZWVJbnRlcm5hbEVudGl0aWVzID0gb3BlbkVudGl0eS0+bmV4dDsKKyAgfQorICBlbHNlIHsKKyAgICBvcGVuRW50aXR5ID0gKE9QRU5fSU5URVJOQUxfRU5USVRZICopTUFMTE9DKHNpemVvZihPUEVOX0lOVEVSTkFMX0VOVElUWSkpOworICAgIGlmICghb3BlbkVudGl0eSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICB9CisgIGVudGl0eS0+b3BlbiA9IFhNTF9UUlVFOworICBlbnRpdHktPnByb2Nlc3NlZCA9IDA7CisgIG9wZW5FbnRpdHktPm5leHQgPSBvcGVuSW50ZXJuYWxFbnRpdGllczsKKyAgb3BlbkludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5OworICBvcGVuRW50aXR5LT5lbnRpdHkgPSBlbnRpdHk7CisgIG9wZW5FbnRpdHktPnN0YXJ0VGFnTGV2ZWwgPSB0YWdMZXZlbDsKKyAgb3BlbkVudGl0eS0+YmV0d2VlbkRlY2wgPSBiZXR3ZWVuRGVjbDsKKyAgb3BlbkVudGl0eS0+aW50ZXJuYWxFdmVudFB0ciA9IE5VTEw7CisgIG9wZW5FbnRpdHktPmludGVybmFsRXZlbnRFbmRQdHIgPSBOVUxMOworICB0ZXh0U3RhcnQgPSAoY2hhciAqKWVudGl0eS0+dGV4dFB0cjsKKyAgdGV4dEVuZCA9IChjaGFyICopKGVudGl0eS0+dGV4dFB0ciArIGVudGl0eS0+dGV4dExlbik7CisKKyNpZmRlZiBYTUxfRFRECisgIGlmIChlbnRpdHktPmlzX3BhcmFtKSB7CisgICAgaW50IHRvayA9IFhtbFByb2xvZ1RvayhpbnRlcm5hbEVuY29kaW5nLCB0ZXh0U3RhcnQsIHRleHRFbmQsICZuZXh0KTsKKyAgICByZXN1bHQgPSBkb1Byb2xvZyhwYXJzZXIsIGludGVybmFsRW5jb2RpbmcsIHRleHRTdGFydCwgdGV4dEVuZCwgdG9rLCAKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0LCAmbmV4dCwgWE1MX0ZBTFNFKTsKKyAgfQorICBlbHNlIAorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgICByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCB0YWdMZXZlbCwgaW50ZXJuYWxFbmNvZGluZywgdGV4dFN0YXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuZCwgJm5leHQsIFhNTF9GQUxTRSk7CisKKyAgaWYgKHJlc3VsdCA9PSBYTUxfRVJST1JfTk9ORSkgeworICAgIGlmICh0ZXh0RW5kICE9IG5leHQgJiYgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKSB7CisgICAgICBlbnRpdHktPnByb2Nlc3NlZCA9IChpbnQpKG5leHQgLSB0ZXh0U3RhcnQpOworICAgICAgcHJvY2Vzc29yID0gaW50ZXJuYWxFbnRpdHlQcm9jZXNzb3I7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgb3BlbkludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5LT5uZXh0OworICAgICAgLyogcHV0IG9wZW5FbnRpdHkgYmFjayBpbiBsaXN0IG9mIGZyZWUgaW5zdGFuY2VzICovCisgICAgICBvcGVuRW50aXR5LT5uZXh0ID0gZnJlZUludGVybmFsRW50aXRpZXM7CisgICAgICBmcmVlSW50ZXJuYWxFbnRpdGllcyA9IG9wZW5FbnRpdHk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvciBQVFJDQUxMCitpbnRlcm5hbEVudGl0eVByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFB0cikKK3sKKyAgRU5USVRZICplbnRpdHk7CisgIGNvbnN0IGNoYXIgKnRleHRTdGFydCwgKnRleHRFbmQ7CisgIGNvbnN0IGNoYXIgKm5leHQ7CisgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgKm9wZW5FbnRpdHkgPSBvcGVuSW50ZXJuYWxFbnRpdGllczsKKyAgaWYgKCFvcGVuRW50aXR5KQorICAgIHJldHVybiBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURTsKKworICBlbnRpdHkgPSBvcGVuRW50aXR5LT5lbnRpdHk7CisgIHRleHRTdGFydCA9ICgoY2hhciAqKWVudGl0eS0+dGV4dFB0cikgKyBlbnRpdHktPnByb2Nlc3NlZDsKKyAgdGV4dEVuZCA9IChjaGFyICopKGVudGl0eS0+dGV4dFB0ciArIGVudGl0eS0+dGV4dExlbik7CisKKyNpZmRlZiBYTUxfRFRECisgIGlmIChlbnRpdHktPmlzX3BhcmFtKSB7CisgICAgaW50IHRvayA9IFhtbFByb2xvZ1RvayhpbnRlcm5hbEVuY29kaW5nLCB0ZXh0U3RhcnQsIHRleHRFbmQsICZuZXh0KTsKKyAgICByZXN1bHQgPSBkb1Byb2xvZyhwYXJzZXIsIGludGVybmFsRW5jb2RpbmcsIHRleHRTdGFydCwgdGV4dEVuZCwgdG9rLCAKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0LCAmbmV4dCwgWE1MX0ZBTFNFKTsKKyAgfQorICBlbHNlCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgIHJlc3VsdCA9IGRvQ29udGVudChwYXJzZXIsIG9wZW5FbnRpdHktPnN0YXJ0VGFnTGV2ZWwsIGludGVybmFsRW5jb2RpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhcnQsIHRleHRFbmQsICZuZXh0LCBYTUxfRkFMU0UpOyAgCisKKyAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKKyAgICByZXR1cm4gcmVzdWx0OworICBlbHNlIGlmICh0ZXh0RW5kICE9IG5leHQgJiYgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKSB7CisgICAgZW50aXR5LT5wcm9jZXNzZWQgPSAoaW50KShuZXh0IC0gKGNoYXIgKillbnRpdHktPnRleHRQdHIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgZWxzZSB7CisgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgIG9wZW5JbnRlcm5hbEVudGl0aWVzID0gb3BlbkVudGl0eS0+bmV4dDsKKyAgICAvKiBwdXQgb3BlbkVudGl0eSBiYWNrIGluIGxpc3Qgb2YgZnJlZSBpbnN0YW5jZXMgKi8KKyAgICBvcGVuRW50aXR5LT5uZXh0ID0gZnJlZUludGVybmFsRW50aXRpZXM7CisgICAgZnJlZUludGVybmFsRW50aXRpZXMgPSBvcGVuRW50aXR5OworICB9CisKKyNpZmRlZiBYTUxfRFRECisgIGlmIChlbnRpdHktPmlzX3BhcmFtKSB7CisgICAgaW50IHRvazsKKyAgICBwcm9jZXNzb3IgPSBwcm9sb2dQcm9jZXNzb3I7CisgICAgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzLCBlbmQsICZuZXh0KTsKKyAgICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIG5leHRQdHIsIAorICAgICAgICAgICAgICAgICAgICAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKKyAgfQorICBlbHNlCisjZW5kaWYgLyogWE1MX0RURCAqLworICB7CisgICAgcHJvY2Vzc29yID0gY29udGVudFByb2Nlc3NvcjsKKyAgICAvKiBzZWUgZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yIHZzIGNvbnRlbnRQcm9jZXNzb3IgKi8KKyAgICByZXR1cm4gZG9Db250ZW50KHBhcnNlciwgcGFyZW50UGFyc2VyID8gMSA6IDAsIGVuY29kaW5nLCBzLCBlbmQsCisgICAgICAgICAgICAgICAgICAgICBuZXh0UHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsgCisgIH0gIAorfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IgUFRSQ0FMTAorZXJyb3JQcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIpCit7CisgIHJldHVybiBlcnJvckNvZGU7Cit9CisKK3N0YXRpYyBlbnVtIFhNTF9FcnJvcgorc3RvcmVBdHRyaWJ1dGVWYWx1ZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgWE1MX0Jvb2wgaXNDZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgIFNUUklOR19QT09MICpwb29sKQoreworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShwYXJzZXIsIGVuYywgaXNDZGF0YSwgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsIHBvb2wpOworICBpZiAocmVzdWx0KQorICAgIHJldHVybiByZXN1bHQ7CisgIGlmICghaXNDZGF0YSAmJiBwb29sTGVuZ3RoKHBvb2wpICYmIHBvb2xMYXN0Q2hhcihwb29sKSA9PSAweDIwKQorICAgIHBvb2xDaG9wKHBvb2wpOworICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsIFhNTF9UKCdcMCcpKSkKKyAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK2FwcGVuZEF0dHJpYnV0ZVZhbHVlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBYTUxfQm9vbCBpc0NkYXRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICBTVFJJTkdfUE9PTCAqcG9vbCkKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCB0b2sgPSBYbWxBdHRyaWJ1dGVWYWx1ZVRvayhlbmMsIHB0ciwgZW5kLCAmbmV4dCk7CisgICAgc3dpdGNoICh0b2spIHsKKyAgICBjYXNlIFhNTF9UT0tfTk9ORToKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKKyAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKKyAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgIGV2ZW50UHRyID0gbmV4dDsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKKyAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgIGV2ZW50UHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9FUlJPUl9JTlZBTElEX1RPS0VOOworICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKKyAgICAgIHsKKyAgICAgICAgWE1MX0NoYXIgYnVmW1hNTF9FTkNPREVfTUFYXTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBuID0gWG1sQ2hhclJlZk51bWJlcihlbmMsIHB0cik7CisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgICAgICBldmVudFB0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzQ2RhdGEKKyAgICAgICAgICAgICYmIG4gPT0gMHgyMCAvKiBzcGFjZSAqLworICAgICAgICAgICAgJiYgKHBvb2xMZW5ndGgocG9vbCkgPT0gMCB8fCBwb29sTGFzdENoYXIocG9vbCkgPT0gMHgyMCkpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIG4gPSBYbWxFbmNvZGUobiwgKElDSEFSICopYnVmKTsKKyAgICAgICAgaWYgKCFuKSB7CisgICAgICAgICAgaWYgKGVuYyA9PSBlbmNvZGluZykKKyAgICAgICAgICAgIGV2ZW50UHRyID0gcHRyOworICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfQkFEX0NIQVJfUkVGOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsIGJ1ZltpXSkpCisgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX0RBVEFfQ0hBUlM6CisgICAgICBpZiAoIXBvb2xBcHBlbmQocG9vbCwgZW5jLCBwdHIsIG5leHQpKQorICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19DUjoKKyAgICAgIG5leHQgPSBwdHIgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgWE1MX1RPS19BVFRSSUJVVEVfVkFMVUVfUzoKKyAgICBjYXNlIFhNTF9UT0tfREFUQV9ORVdMSU5FOgorICAgICAgaWYgKCFpc0NkYXRhICYmIChwb29sTGVuZ3RoKHBvb2wpID09IDAgfHwgcG9vbExhc3RDaGFyKHBvb2wpID09IDB4MjApKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgMHgyMCkpCisgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX0VOVElUWV9SRUY6CisgICAgICB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOworICAgICAgICBFTlRJVFkgKmVudGl0eTsKKyAgICAgICAgY2hhciBjaGVja0VudGl0eURlY2w7CisgICAgICAgIFhNTF9DaGFyIGNoID0gKFhNTF9DaGFyKSBYbWxQcmVkZWZpbmVkRW50aXR5TmFtZShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKGNoKSB7CisgICAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcihwb29sLCBjaCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcDJQb29sLCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICAgICAgICBlbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQtPmdlbmVyYWxFbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIHBvb2xEaXNjYXJkKCZ0ZW1wMlBvb2wpOworICAgICAgICAvKiBGaXJzdCwgZGV0ZXJtaW5lIGlmIGEgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGRlY2xhcmF0aW9uIGlzIG5lZWRlZDsKKyAgICAgICAgICAgaWYgeWVzLCBjaGVjayB0aGF0IHRoZSBlbnRpdHkgZXhpc3RzLCBhbmQgdGhhdCBpdCBpcyBpbnRlcm5hbC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHBvb2wgPT0gJmR0ZC0+cG9vbCkgIC8qIGFyZSB3ZSBjYWxsZWQgZnJvbSBwcm9sb2c/ICovCisgICAgICAgICAgY2hlY2tFbnRpdHlEZWNsID0KKyNpZmRlZiBYTUxfRFRECisgICAgICAgICAgICAgIHByb2xvZ1N0YXRlLmRvY3VtZW50RW50aXR5ICYmCisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgICAgICAgICAoZHRkLT5zdGFuZGFsb25lCisgICAgICAgICAgICAgICA/ICFvcGVuSW50ZXJuYWxFbnRpdGllcworICAgICAgICAgICAgICAgOiAhZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMpOworICAgICAgICBlbHNlIC8qIGlmIChwb29sID09ICZ0ZW1wUG9vbCk6IHdlIGFyZSBjYWxsZWQgZnJvbSBjb250ZW50ICovCisgICAgICAgICAgY2hlY2tFbnRpdHlEZWNsID0gIWR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzIHx8IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgaWYgKGNoZWNrRW50aXR5RGVjbCkgeworICAgICAgICAgIGlmICghZW50aXR5KQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZOworICAgICAgICAgIGVsc2UgaWYgKCFlbnRpdHktPmlzX2ludGVybmFsKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9FTlRJVFlfREVDTEFSRURfSU5fUEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWVudGl0eSkgeworICAgICAgICAgIC8qIENhbm5vdCByZXBvcnQgc2tpcHBlZCBlbnRpdHkgaGVyZSAtIHNlZSBjb21tZW50cyBvbgorICAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyLgorICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDApOworICAgICAgICAgICovCisgICAgICAgICAgLyogQ2Fubm90IGNhbGwgdGhlIGRlZmF1bHQgaGFuZGxlciBiZWNhdXNlIHRoaXMgd291bGQgYmUKKyAgICAgICAgICAgICBvdXQgb2Ygc3luYyB3aXRoIHRoZSBjYWxsIHRvIHRoZSBzdGFydEVsZW1lbnRIYW5kbGVyLgorICAgICAgICAgIGlmICgocG9vbCA9PSAmdGVtcFBvb2wpICYmIGRlZmF1bHRIYW5kbGVyKQorICAgICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcHRyLCBuZXh0KTsKKyAgICAgICAgICAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRpdHktPm9wZW4pIHsKKyAgICAgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICAgICAgZXZlbnRQdHIgPSBwdHI7CisgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9SRUNVUlNJVkVfRU5USVRZX1JFRjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50aXR5LT5ub3RhdGlvbikgeworICAgICAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgICAgICBldmVudFB0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0JJTkFSWV9FTlRJVFlfUkVGOworICAgICAgICB9CisgICAgICAgIGlmICghZW50aXR5LT50ZXh0UHRyKSB7CisgICAgICAgICAgaWYgKGVuYyA9PSBlbmNvZGluZykKKyAgICAgICAgICAgIGV2ZW50UHRyID0gcHRyOworICAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FUVFJJQlVURV9FWFRFUk5BTF9FTlRJVFlfUkVGOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdGV4dEVuZCA9IGVudGl0eS0+dGV4dFB0ciArIGVudGl0eS0+dGV4dExlbjsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfVFJVRTsKKyAgICAgICAgICByZXN1bHQgPSBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShwYXJzZXIsIGludGVybmFsRW5jb2RpbmcsIGlzQ2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKillbnRpdHktPnRleHRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKil0ZXh0RW5kLCBwb29sKTsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICBldmVudFB0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfRVJST1JfVU5FWFBFQ1RFRF9TVEFURTsKKyAgICB9CisgICAgcHRyID0gbmV4dDsKKyAgfQorICAvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgZW51bSBYTUxfRXJyb3IKK3N0b3JlRW50aXR5VmFsdWUoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudGl0eVRleHRQdHIsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVudGl0eVRleHRFbmQpCit7CisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7ICAvKiBzYXZlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLworICBTVFJJTkdfUE9PTCAqcG9vbCA9ICYoZHRkLT5lbnRpdHlWYWx1ZVBvb2wpOworICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBYTUxfRVJST1JfTk9ORTsKKyNpZmRlZiBYTUxfRFRECisgIGludCBvbGRJbkVudGl0eVZhbHVlID0gcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZTsKKyAgcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZSA9IDE7CisjZW5kaWYgLyogWE1MX0RURCAqLworICAvKiBuZXZlciByZXR1cm4gTnVsbCBmb3IgdGhlIHZhbHVlIGFyZ3VtZW50IGluIEVudGl0eURlY2xIYW5kbGVyLAorICAgICBzaW5jZSB0aGlzIHdvdWxkIGluZGljYXRlIGFuIGV4dGVybmFsIGVudGl0eTsgdGhlcmVmb3JlIHdlCisgICAgIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgZW50aXR5VmFsdWVQb29sLnN0YXJ0IGlzIG5vdCBudWxsICovCisgIGlmICghcG9vbC0+YmxvY2tzKSB7CisgICAgaWYgKCFwb29sR3Jvdyhwb29sKSkKKyAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOworICB9CisKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKm5leHQ7CisgICAgaW50IHRvayA9IFhtbEVudGl0eVZhbHVlVG9rKGVuYywgZW50aXR5VGV4dFB0ciwgZW50aXR5VGV4dEVuZCwgJm5leHQpOworICAgIHN3aXRjaCAodG9rKSB7CisgICAgY2FzZSBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUY6CisjaWZkZWYgWE1MX0RURAorICAgICAgaWYgKGlzUGFyYW1FbnRpdHkgfHwgZW5jICE9IGVuY29kaW5nKSB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOworICAgICAgICBFTlRJVFkgKmVudGl0eTsKKyAgICAgICAgbmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlUZXh0UHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGVudGl0eSA9IChFTlRJVFkgKilsb29rdXAoJmR0ZC0+cGFyYW1FbnRpdGllcywgbmFtZSwgMCk7CisgICAgICAgIHBvb2xEaXNjYXJkKCZ0ZW1wUG9vbCk7CisgICAgICAgIGlmICghZW50aXR5KSB7CisgICAgICAgICAgLyogbm90IGEgd2VsbC1mb3JtZWRuZXNzIGVycm9yIC0gc2VlIFhNTCAxLjA6IFdGQyBFbnRpdHkgRGVjbGFyZWQgKi8KKyAgICAgICAgICAvKiBjYW5ub3QgcmVwb3J0IHNraXBwZWQgZW50aXR5IGhlcmUgLSBzZWUgY29tbWVudHMgb24KKyAgICAgICAgICAgICBza2lwcGVkRW50aXR5SGFuZGxlcgorICAgICAgICAgIGlmIChza2lwcGVkRW50aXR5SGFuZGxlcikKKyAgICAgICAgICAgIHNraXBwZWRFbnRpdHlIYW5kbGVyKGhhbmRsZXJBcmcsIG5hbWUsIDApOworICAgICAgICAgICovCisgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRpdHktPm9wZW4pIHsKKyAgICAgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICAgICAgZXZlbnRQdHIgPSBlbnRpdHlUZXh0UHRyOworICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9SRUNVUlNJVkVfRU5USVRZX1JFRjsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRpdHktPnN5c3RlbUlkKSB7CisgICAgICAgICAgaWYgKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcikgeworICAgICAgICAgICAgZHRkLT5wYXJhbUVudGl0eVJlYWQgPSBYTUxfRkFMU0U7CisgICAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfVFJVRTsKKyAgICAgICAgICAgIGlmICghZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5wdWJsaWNJZCkpIHsKKyAgICAgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgICAgICAgICByZXN1bHQgPSBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HOworICAgICAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50aXR5LT5vcGVuID0gWE1MX0ZBTFNFOworICAgICAgICAgICAgaWYgKCFkdGQtPnBhcmFtRW50aXR5UmVhZCkKKyAgICAgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZHRkLT5rZWVwUHJvY2Vzc2luZyA9IGR0ZC0+c3RhbmRhbG9uZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfVFJVRTsKKyAgICAgICAgICByZXN1bHQgPSBzdG9yZUVudGl0eVZhbHVlKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKWVudGl0eS0+dGV4dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKGVudGl0eS0+dGV4dFB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRpdHktPnRleHRMZW4pKTsKKyAgICAgICAgICBlbnRpdHktPm9wZW4gPSBYTUxfRkFMU0U7CisgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjZW5kaWYgLyogWE1MX0RURCAqLworICAgICAgLyogSW4gdGhlIGludGVybmFsIHN1YnNldCwgUEUgcmVmZXJlbmNlcyBhcmUgbm90IGxlZ2FsCisgICAgICAgICB3aXRoaW4gbWFya3VwIGRlY2xhcmF0aW9ucywgZS5nIGVudGl0eSB2YWx1ZXMgaW4gdGhpcyBjYXNlLiAqLworICAgICAgZXZlbnRQdHIgPSBlbnRpdHlUZXh0UHRyOworICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX1BBUkFNX0VOVElUWV9SRUY7CisgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgIGNhc2UgWE1MX1RPS19OT05FOgorICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX05PTkU7CisgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgIGNhc2UgWE1MX1RPS19FTlRJVFlfUkVGOgorICAgIGNhc2UgWE1MX1RPS19EQVRBX0NIQVJTOgorICAgICAgaWYgKCFwb29sQXBwZW5kKHBvb2wsIGVuYywgZW50aXR5VGV4dFB0ciwgbmV4dCkpIHsKKyAgICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX05PX01FTU9SWTsKKyAgICAgICAgZ290byBlbmRFbnRpdHlWYWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19DUjoKKyAgICAgIG5leHQgPSBlbnRpdHlUZXh0UHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXI7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFhNTF9UT0tfREFUQV9ORVdMSU5FOgorICAgICAgaWYgKHBvb2wtPmVuZCA9PSBwb29sLT5wdHIgJiYgIXBvb2xHcm93KHBvb2wpKSB7CisgICAgICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgICB9CisgICAgICAqKHBvb2wtPnB0cikrKyA9IDB4QTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKKyAgICAgIHsKKyAgICAgICAgWE1MX0NoYXIgYnVmW1hNTF9FTkNPREVfTUFYXTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBuID0gWG1sQ2hhclJlZk51bWJlcihlbmMsIGVudGl0eVRleHRQdHIpOworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICAgICAgZXZlbnRQdHIgPSBlbnRpdHlUZXh0UHRyOworICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9CQURfQ0hBUl9SRUY7CisgICAgICAgICAgZ290byBlbmRFbnRpdHlWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBuID0gWG1sRW5jb2RlKG4sIChJQ0hBUiAqKWJ1Zik7CisgICAgICAgIGlmICghbikgeworICAgICAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgICAgICBldmVudFB0ciA9IGVudGl0eVRleHRQdHI7CisgICAgICAgICAgcmVzdWx0ID0gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKKyAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICBpZiAocG9vbC0+ZW5kID09IHBvb2wtPnB0ciAmJiAhcG9vbEdyb3cocG9vbCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgICBnb3RvIGVuZEVudGl0eVZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgICAqKHBvb2wtPnB0cikrKyA9IGJ1ZltpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUw6CisgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICBldmVudFB0ciA9IGVudGl0eVRleHRQdHI7CisgICAgICByZXN1bHQgPSBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6CisgICAgICBpZiAoZW5jID09IGVuY29kaW5nKQorICAgICAgICBldmVudFB0ciA9IG5leHQ7CisgICAgICByZXN1bHQgPSBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKKyAgICAgIGdvdG8gZW5kRW50aXR5VmFsdWU7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCisgICAgICAgIGV2ZW50UHRyID0gZW50aXR5VGV4dFB0cjsKKyAgICAgIHJlc3VsdCA9IFhNTF9FUlJPUl9VTkVYUEVDVEVEX1NUQVRFOworICAgICAgZ290byBlbmRFbnRpdHlWYWx1ZTsKKyAgICB9CisgICAgZW50aXR5VGV4dFB0ciA9IG5leHQ7CisgIH0KK2VuZEVudGl0eVZhbHVlOgorI2lmZGVmIFhNTF9EVEQKKyAgcHJvbG9nU3RhdGUuaW5FbnRpdHlWYWx1ZSA9IG9sZEluRW50aXR5VmFsdWU7CisjZW5kaWYgLyogWE1MX0RURCAqLworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTAorbm9ybWFsaXplTGluZXMoWE1MX0NoYXIgKnMpCit7CisgIFhNTF9DaGFyICpwOworICBmb3IgKDs7IHMrKykgeworICAgIGlmICgqcyA9PSBYTUxfVCgnXDAnKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoKnMgPT0gMHhEKQorICAgICAgYnJlYWs7CisgIH0KKyAgcCA9IHM7CisgIGRvIHsKKyAgICBpZiAoKnMgPT0gMHhEKSB7CisgICAgICAqcCsrID0gMHhBOworICAgICAgaWYgKCorK3MgPT0gMHhBKQorICAgICAgICBzKys7CisgICAgfQorICAgIGVsc2UKKyAgICAgICpwKysgPSAqcysrOworICB9IHdoaWxlICgqcyk7CisgICpwID0gWE1MX1QoJ1wwJyk7Cit9CisKK3N0YXRpYyBpbnQKK3JlcG9ydFByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKQoreworICBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0OworICBYTUxfQ2hhciAqZGF0YTsKKyAgY29uc3QgY2hhciAqdGVtOworICBpZiAoIXByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpIHsKKyAgICBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdGFydCArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhciAqIDI7CisgIHRlbSA9IHN0YXJ0ICsgWG1sTmFtZUxlbmd0aChlbmMsIHN0YXJ0KTsKKyAgdGFyZ2V0ID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwgZW5jLCBzdGFydCwgdGVtKTsKKyAgaWYgKCF0YXJnZXQpCisgICAgcmV0dXJuIDA7CisgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKKyAgZGF0YSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNraXBTKGVuYywgdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKjIpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIDA7CisgIG5vcm1hbGl6ZUxpbmVzKGRhdGEpOworICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKGhhbmRsZXJBcmcsIHRhcmdldCwgZGF0YSk7CisgIHBvb2xDbGVhcigmdGVtcFBvb2wpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorcmVwb3J0Q29tbWVudChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyAgWE1MX0NoYXIgKmRhdGE7CisgIGlmICghY29tbWVudEhhbmRsZXIpIHsKKyAgICBpZiAoZGVmYXVsdEhhbmRsZXIpCisgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBkYXRhID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhciAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gZW5jLT5taW5CeXRlc1BlckNoYXIgKiAzKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiAwOworICBub3JtYWxpemVMaW5lcyhkYXRhKTsKKyAgY29tbWVudEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YSk7CisgIHBvb2xDbGVhcigmdGVtcFBvb2wpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3JlcG9ydERlZmF1bHQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyAgaWYgKE1VU1RfQ09OVkVSVChlbmMsIHMpKSB7CisgICAgY29uc3QgY2hhciAqKmV2ZW50UFA7CisgICAgY29uc3QgY2hhciAqKmV2ZW50RW5kUFA7CisgICAgaWYgKGVuYyA9PSBlbmNvZGluZykgeworICAgICAgZXZlbnRQUCA9ICZldmVudFB0cjsKKyAgICAgIGV2ZW50RW5kUFAgPSAmZXZlbnRFbmRQdHI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXZlbnRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRQdHIpOworICAgICAgZXZlbnRFbmRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRFbmRQdHIpOworICAgIH0KKyAgICBkbyB7CisgICAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7CisgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIGVuZCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOworICAgICAgKmV2ZW50RW5kUFAgPSBzOworICAgICAgZGVmYXVsdEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKKyAgICAgICpldmVudFBQID0gczsKKyAgICB9IHdoaWxlIChzICE9IGVuZCk7CisgIH0KKyAgZWxzZQorICAgIGRlZmF1bHRIYW5kbGVyKGhhbmRsZXJBcmcsIChYTUxfQ2hhciAqKXMsIChpbnQpKChYTUxfQ2hhciAqKWVuZCAtIChYTUxfQ2hhciAqKXMpKTsKK30KKworCitzdGF0aWMgaW50CitkZWZpbmVBdHRyaWJ1dGUoRUxFTUVOVF9UWVBFICp0eXBlLCBBVFRSSUJVVEVfSUQgKmF0dElkLCBYTUxfQm9vbCBpc0NkYXRhLAorICAgICAgICAgICAgICAgIFhNTF9Cb29sIGlzSWQsIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSwgWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIERFRkFVTFRfQVRUUklCVVRFICphdHQ7CisgIGlmICh2YWx1ZSB8fCBpc0lkKSB7CisgICAgLyogVGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgYXR0cmlidXRlcyBnZXRzIG1lc3NlZCB1cCBpZiB3ZSBoYXZlCisgICAgICAgYSBkZWZhdWx0IHdoaWNoIGR1cGxpY2F0ZXMgYSBub24tZGVmYXVsdC4gKi8KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZS0+bkRlZmF1bHRBdHRzOyBpKyspCisgICAgICBpZiAoYXR0SWQgPT0gdHlwZS0+ZGVmYXVsdEF0dHNbaV0uaWQpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChpc0lkICYmICF0eXBlLT5pZEF0dCAmJiAhYXR0SWQtPnhtbG5zKQorICAgICAgdHlwZS0+aWRBdHQgPSBhdHRJZDsKKyAgfQorICBpZiAodHlwZS0+bkRlZmF1bHRBdHRzID09IHR5cGUtPmFsbG9jRGVmYXVsdEF0dHMpIHsKKyAgICBpZiAodHlwZS0+YWxsb2NEZWZhdWx0QXR0cyA9PSAwKSB7CisgICAgICB0eXBlLT5hbGxvY0RlZmF1bHRBdHRzID0gODsKKyAgICAgIHR5cGUtPmRlZmF1bHRBdHRzID0gKERFRkFVTFRfQVRUUklCVVRFICopTUFMTE9DKHR5cGUtPmFsbG9jRGVmYXVsdEF0dHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihERUZBVUxUX0FUVFJJQlVURSkpOworICAgICAgaWYgKCF0eXBlLT5kZWZhdWx0QXR0cykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgREVGQVVMVF9BVFRSSUJVVEUgKnRlbXA7CisgICAgICBpbnQgY291bnQgPSB0eXBlLT5hbGxvY0RlZmF1bHRBdHRzICogMjsKKyAgICAgIHRlbXAgPSAoREVGQVVMVF9BVFRSSUJVVEUgKikKKyAgICAgICAgUkVBTExPQyh0eXBlLT5kZWZhdWx0QXR0cywgKGNvdW50ICogc2l6ZW9mKERFRkFVTFRfQVRUUklCVVRFKSkpOworICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB0eXBlLT5hbGxvY0RlZmF1bHRBdHRzID0gY291bnQ7CisgICAgICB0eXBlLT5kZWZhdWx0QXR0cyA9IHRlbXA7CisgICAgfQorICB9CisgIGF0dCA9IHR5cGUtPmRlZmF1bHRBdHRzICsgdHlwZS0+bkRlZmF1bHRBdHRzOworICBhdHQtPmlkID0gYXR0SWQ7CisgIGF0dC0+dmFsdWUgPSB2YWx1ZTsKKyAgYXR0LT5pc0NkYXRhID0gaXNDZGF0YTsKKyAgaWYgKCFpc0NkYXRhKQorICAgIGF0dElkLT5tYXliZVRva2VuaXplZCA9IFhNTF9UUlVFOworICB0eXBlLT5uRGVmYXVsdEF0dHMgKz0gMTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3NldEVsZW1lbnRUeXBlUHJlZml4KFhNTF9QYXJzZXIgcGFyc2VyLCBFTEVNRU5UX1RZUEUgKmVsZW1lbnRUeXBlKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgIGZvciAobmFtZSA9IGVsZW1lbnRUeXBlLT5uYW1lOyAqbmFtZTsgbmFtZSsrKSB7CisgICAgaWYgKCpuYW1lID09IFhNTF9UKEFTQ0lJX0NPTE9OKSkgeworICAgICAgUFJFRklYICpwcmVmaXg7CisgICAgICBjb25zdCBYTUxfQ2hhciAqczsKKyAgICAgIGZvciAocyA9IGVsZW1lbnRUeXBlLT5uYW1lOyBzICE9IG5hbWU7IHMrKykgeworICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZkdGQtPnBvb2wsICpzKSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJmR0ZC0+cG9vbCwgWE1MX1QoJ1wwJykpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJmR0ZC0+cHJlZml4ZXMsIHBvb2xTdGFydCgmZHRkLT5wb29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBSRUZJWCkpOworICAgICAgaWYgKCFwcmVmaXgpCisgICAgICAgIHJldHVybiAwOworICAgICAgaWYgKHByZWZpeC0+bmFtZSA9PSBwb29sU3RhcnQoJmR0ZC0+cG9vbCkpCisgICAgICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgICBlbHNlCisgICAgICAgIHBvb2xEaXNjYXJkKCZkdGQtPnBvb2wpOworICAgICAgZWxlbWVudFR5cGUtPnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIEFUVFJJQlVURV9JRCAqCitnZXRBdHRyaWJ1dGVJZChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpCit7CisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7ICAvKiBzYXZlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLworICBBVFRSSUJVVEVfSUQgKmlkOworICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgaWYgKCFwb29sQXBwZW5kQ2hhcigmZHRkLT5wb29sLCBYTUxfVCgnXDAnKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIG5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLCBzdGFydCwgZW5kKTsKKyAgaWYgKCFuYW1lKQorICAgIHJldHVybiBOVUxMOworICAvKiBza2lwIHF1b3RhdGlvbiBtYXJrIC0gaXRzIHN0b3JhZ2Ugd2lsbCBiZSByZS11c2VkIChsaWtlIGluIG5hbWVbLTFdKSAqLworICArK25hbWU7CisgIGlkID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmZHRkLT5hdHRyaWJ1dGVJZHMsIG5hbWUsIHNpemVvZihBVFRSSUJVVEVfSUQpKTsKKyAgaWYgKCFpZCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGlkLT5uYW1lICE9IG5hbWUpCisgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgIGVsc2UgeworICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgaWYgKCFucykKKyAgICAgIDsKKyAgICBlbHNlIGlmIChuYW1lWzBdID09IFhNTF9UKEFTQ0lJX3gpCisgICAgICAgICYmIG5hbWVbMV0gPT0gWE1MX1QoQVNDSUlfbSkKKyAgICAgICAgJiYgbmFtZVsyXSA9PSBYTUxfVChBU0NJSV9sKQorICAgICAgICAmJiBuYW1lWzNdID09IFhNTF9UKEFTQ0lJX24pCisgICAgICAgICYmIG5hbWVbNF0gPT0gWE1MX1QoQVNDSUlfcykKKyAgICAgICAgJiYgKG5hbWVbNV0gPT0gWE1MX1QoJ1wwJykgfHwgbmFtZVs1XSA9PSBYTUxfVChBU0NJSV9DT0xPTikpKSB7CisgICAgICBpZiAobmFtZVs1XSA9PSBYTUxfVCgnXDAnKSkKKyAgICAgICAgaWQtPnByZWZpeCA9ICZkdGQtPmRlZmF1bHRQcmVmaXg7CisgICAgICBlbHNlCisgICAgICAgIGlkLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBuYW1lICsgNiwgc2l6ZW9mKFBSRUZJWCkpOworICAgICAgaWQtPnhtbG5zID0gWE1MX1RSVUU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBuYW1lW2ldOyBpKyspIHsKKyAgICAgICAgLyogYXR0cmlidXRlcyB3aXRob3V0IHByZWZpeCBhcmUgKm5vdCogaW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlICovCisgICAgICAgIGlmIChuYW1lW2ldID09IFhNTF9UKEFTQ0lJX0NPTE9OKSkgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJmR0ZC0+cG9vbCwgbmFtZVtqXSkpCisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZkdGQtPnBvb2wsIFhNTF9UKCdcMCcpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgIGlkLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBwb29sU3RhcnQoJmR0ZC0+cG9vbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBSRUZJWCkpOworICAgICAgICAgIGlmIChpZC0+cHJlZml4LT5uYW1lID09IHBvb2xTdGFydCgmZHRkLT5wb29sKSkKKyAgICAgICAgICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGlkOworfQorCisjZGVmaW5lIENPTlRFWFRfU0VQIFhNTF9UKEFTQ0lJX0ZGKQorCitzdGF0aWMgY29uc3QgWE1MX0NoYXIgKgorZ2V0Q29udGV4dChYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIEhBU0hfVEFCTEVfSVRFUiBpdGVyOworICBYTUxfQm9vbCBuZWVkU2VwID0gWE1MX0ZBTFNFOworCisgIGlmIChkdGQtPmRlZmF1bHRQcmVmaXguYmluZGluZykgeworICAgIGludCBpOworICAgIGludCBsZW47CisgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKEFTQ0lJX0VRVUFMUykpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuID0gZHRkLT5kZWZhdWx0UHJlZml4LmJpbmRpbmctPnVyaUxlbjsKKyAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yKQorICAgICAgbGVuLS07CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIGR0ZC0+ZGVmYXVsdFByZWZpeC5iaW5kaW5nLT51cmlbaV0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZWVkU2VwID0gWE1MX1RSVUU7CisgIH0KKworICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihkdGQtPnByZWZpeGVzKSk7CisgIGZvciAoOzspIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuOworICAgIGNvbnN0IFhNTF9DaGFyICpzOworICAgIFBSRUZJWCAqcHJlZml4ID0gKFBSRUZJWCAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIXByZWZpeCkKKyAgICAgIGJyZWFrOworICAgIGlmICghcHJlZml4LT5iaW5kaW5nKQorICAgICAgY29udGludWU7CisgICAgaWYgKG5lZWRTZXAgJiYgIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgQ09OVEVYVF9TRVApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChzID0gcHJlZml4LT5uYW1lOyAqczsgcysrKQorICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsICpzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKEFTQ0lJX0VRVUFMUykpKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuID0gcHJlZml4LT5iaW5kaW5nLT51cmlMZW47CisgICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvcikKKyAgICAgIGxlbi0tOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBwcmVmaXgtPmJpbmRpbmctPnVyaVtpXSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5lZWRTZXAgPSBYTUxfVFJVRTsKKyAgfQorCisKKyAgaGFzaFRhYmxlSXRlckluaXQoJml0ZXIsICYoZHRkLT5nZW5lcmFsRW50aXRpZXMpKTsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IFhNTF9DaGFyICpzOworICAgIEVOVElUWSAqZSA9IChFTlRJVFkgKiloYXNoVGFibGVJdGVyTmV4dCgmaXRlcik7CisgICAgaWYgKCFlKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFlLT5vcGVuKQorICAgICAgY29udGludWU7CisgICAgaWYgKG5lZWRTZXAgJiYgIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgQ09OVEVYVF9TRVApKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChzID0gZS0+bmFtZTsgKnM7IHMrKykKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqcykpCisgICAgICAgIHJldHVybiAwOworICAgIG5lZWRTZXAgPSBYTUxfVFJVRTsKKyAgfQorCisgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiB0ZW1wUG9vbC5zdGFydDsKK30KKworc3RhdGljIFhNTF9Cb29sCitzZXRDb250ZXh0KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqY29udGV4dCkKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIGNvbnN0IFhNTF9DaGFyICpzID0gY29udGV4dDsKKworICB3aGlsZSAoKmNvbnRleHQgIT0gWE1MX1QoJ1wwJykpIHsKKyAgICBpZiAoKnMgPT0gQ09OVEVYVF9TRVAgfHwgKnMgPT0gWE1MX1QoJ1wwJykpIHsKKyAgICAgIEVOVElUWSAqZTsKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICBlID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLT5nZW5lcmFsRW50aXRpZXMsIHBvb2xTdGFydCgmdGVtcFBvb2wpLCAwKTsKKyAgICAgIGlmIChlKQorICAgICAgICBlLT5vcGVuID0gWE1MX1RSVUU7CisgICAgICBpZiAoKnMgIT0gWE1MX1QoJ1wwJykpCisgICAgICAgIHMrKzsKKyAgICAgIGNvbnRleHQgPSBzOworICAgICAgcG9vbERpc2NhcmQoJnRlbXBQb29sKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gWE1MX1QoQVNDSUlfRVFVQUxTKSkgeworICAgICAgUFJFRklYICpwcmVmaXg7CisgICAgICBpZiAocG9vbExlbmd0aCgmdGVtcFBvb2wpID09IDApCisgICAgICAgIHByZWZpeCA9ICZkdGQtPmRlZmF1bHRQcmVmaXg7CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKKyAgICAgICAgICByZXR1cm4gWE1MX0ZBTFNFOworICAgICAgICBwcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQtPnByZWZpeGVzLCBwb29sU3RhcnQoJnRlbXBQb29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUFJFRklYKSk7CisgICAgICAgIGlmICghcHJlZml4KQorICAgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICAgIGlmIChwcmVmaXgtPm5hbWUgPT0gcG9vbFN0YXJ0KCZ0ZW1wUG9vbCkpIHsKKyAgICAgICAgICBwcmVmaXgtPm5hbWUgPSBwb29sQ29weVN0cmluZygmZHRkLT5wb29sLCBwcmVmaXgtPm5hbWUpOworICAgICAgICAgIGlmICghcHJlZml4LT5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOworICAgICAgfQorICAgICAgZm9yIChjb250ZXh0ID0gcyArIDE7CisgICAgICAgICAgICpjb250ZXh0ICE9IENPTlRFWFRfU0VQICYmICpjb250ZXh0ICE9IFhNTF9UKCdcMCcpOworICAgICAgICAgICBjb250ZXh0KyspCisgICAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqY29udGV4dCkpCisgICAgICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnXDAnKSkpCisgICAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgICBpZiAoYWRkQmluZGluZyhwYXJzZXIsIHByZWZpeCwgTlVMTCwgcG9vbFN0YXJ0KCZ0ZW1wUG9vbCksCisgICAgICAgICAgICAgICAgICAgICAmaW5oZXJpdGVkQmluZGluZ3MpICE9IFhNTF9FUlJPUl9OT05FKQorICAgICAgICByZXR1cm4gWE1MX0ZBTFNFOworICAgICAgcG9vbERpc2NhcmQoJnRlbXBQb29sKTsKKyAgICAgIGlmICgqY29udGV4dCAhPSBYTUxfVCgnXDAnKSkKKyAgICAgICAgKytjb250ZXh0OworICAgICAgcyA9IGNvbnRleHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsICpzKSkKKyAgICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICAgIHMrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UUlVFOworfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTAorbm9ybWFsaXplUHVibGljSWQoWE1MX0NoYXIgKnB1YmxpY0lkKQoreworICBYTUxfQ2hhciAqcCA9IHB1YmxpY0lkOworICBYTUxfQ2hhciAqczsKKyAgZm9yIChzID0gcHVibGljSWQ7ICpzOyBzKyspIHsKKyAgICBzd2l0Y2ggKCpzKSB7CisgICAgY2FzZSAweDIwOgorICAgIGNhc2UgMHhEOgorICAgIGNhc2UgMHhBOgorICAgICAgaWYgKHAgIT0gcHVibGljSWQgJiYgcFstMV0gIT0gMHgyMCkKKyAgICAgICAgKnArKyA9IDB4MjA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKnArKyA9ICpzOworICAgIH0KKyAgfQorICBpZiAocCAhPSBwdWJsaWNJZCAmJiBwWy0xXSA9PSAweDIwKQorICAgIC0tcDsKKyAgKnAgPSBYTUxfVCgnXDAnKTsKK30KKworc3RhdGljIERURCAqCitkdGRDcmVhdGUoY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpCit7CisgIERURCAqcCA9IChEVEQgKiltcy0+bWFsbG9jX2ZjbihzaXplb2YoRFREKSk7CisgIGlmIChwID09IE5VTEwpCisgICAgcmV0dXJuIHA7CisgIHBvb2xJbml0KCYocC0+cG9vbCksIG1zKTsKKyAgcG9vbEluaXQoJihwLT5lbnRpdHlWYWx1ZVBvb2wpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5nZW5lcmFsRW50aXRpZXMpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5lbGVtZW50VHlwZXMpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5hdHRyaWJ1dGVJZHMpLCBtcyk7CisgIGhhc2hUYWJsZUluaXQoJihwLT5wcmVmaXhlcyksIG1zKTsKKyNpZmRlZiBYTUxfRFRECisgIHAtPnBhcmFtRW50aXR5UmVhZCA9IFhNTF9GQUxTRTsKKyAgaGFzaFRhYmxlSW5pdCgmKHAtPnBhcmFtRW50aXRpZXMpLCBtcyk7CisjZW5kaWYgLyogWE1MX0RURCAqLworICBwLT5kZWZhdWx0UHJlZml4Lm5hbWUgPSBOVUxMOworICBwLT5kZWZhdWx0UHJlZml4LmJpbmRpbmcgPSBOVUxMOworCisgIHAtPmluX2VsZGVjbCA9IFhNTF9GQUxTRTsKKyAgcC0+c2NhZmZJbmRleCA9IE5VTEw7CisgIHAtPnNjYWZmb2xkID0gTlVMTDsKKyAgcC0+c2NhZmZMZXZlbCA9IDA7CisgIHAtPnNjYWZmU2l6ZSA9IDA7CisgIHAtPnNjYWZmQ291bnQgPSAwOworICBwLT5jb250ZW50U3RyaW5nTGVuID0gMDsKKworICBwLT5rZWVwUHJvY2Vzc2luZyA9IFhNTF9UUlVFOworICBwLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBYTUxfRkFMU0U7CisgIHAtPnN0YW5kYWxvbmUgPSBYTUxfRkFMU0U7CisgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZAorZHRkUmVzZXQoRFREICpwLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcykKK3sKKyAgSEFTSF9UQUJMRV9JVEVSIGl0ZXI7CisgIGhhc2hUYWJsZUl0ZXJJbml0KCZpdGVyLCAmKHAtPmVsZW1lbnRUeXBlcykpOworICBmb3IgKDs7KSB7CisgICAgRUxFTUVOVF9UWVBFICplID0gKEVMRU1FTlRfVFlQRSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIWUpCisgICAgICBicmVhazsKKyAgICBpZiAoZS0+YWxsb2NEZWZhdWx0QXR0cyAhPSAwKQorICAgICAgbXMtPmZyZWVfZmNuKGUtPmRlZmF1bHRBdHRzKTsKKyAgfQorICBoYXNoVGFibGVDbGVhcigmKHAtPmdlbmVyYWxFbnRpdGllcykpOworI2lmZGVmIFhNTF9EVEQKKyAgcC0+cGFyYW1FbnRpdHlSZWFkID0gWE1MX0ZBTFNFOworICBoYXNoVGFibGVDbGVhcigmKHAtPnBhcmFtRW50aXRpZXMpKTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisgIGhhc2hUYWJsZUNsZWFyKCYocC0+ZWxlbWVudFR5cGVzKSk7CisgIGhhc2hUYWJsZUNsZWFyKCYocC0+YXR0cmlidXRlSWRzKSk7CisgIGhhc2hUYWJsZUNsZWFyKCYocC0+cHJlZml4ZXMpKTsKKyAgcG9vbENsZWFyKCYocC0+cG9vbCkpOworICBwb29sQ2xlYXIoJihwLT5lbnRpdHlWYWx1ZVBvb2wpKTsKKyAgcC0+ZGVmYXVsdFByZWZpeC5uYW1lID0gTlVMTDsKKyAgcC0+ZGVmYXVsdFByZWZpeC5iaW5kaW5nID0gTlVMTDsKKworICBwLT5pbl9lbGRlY2wgPSBYTUxfRkFMU0U7CisKKyAgbXMtPmZyZWVfZmNuKHAtPnNjYWZmSW5kZXgpOworICBwLT5zY2FmZkluZGV4ID0gTlVMTDsKKyAgbXMtPmZyZWVfZmNuKHAtPnNjYWZmb2xkKTsKKyAgcC0+c2NhZmZvbGQgPSBOVUxMOworCisgIHAtPnNjYWZmTGV2ZWwgPSAwOworICBwLT5zY2FmZlNpemUgPSAwOworICBwLT5zY2FmZkNvdW50ID0gMDsKKyAgcC0+Y29udGVudFN0cmluZ0xlbiA9IDA7CisKKyAgcC0+a2VlcFByb2Nlc3NpbmcgPSBYTUxfVFJVRTsKKyAgcC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gWE1MX0ZBTFNFOworICBwLT5zdGFuZGFsb25lID0gWE1MX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZAorZHRkRGVzdHJveShEVEQgKnAsIFhNTF9Cb29sIGlzRG9jRW50aXR5LCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcykKK3sKKyAgSEFTSF9UQUJMRV9JVEVSIGl0ZXI7CisgIGhhc2hUYWJsZUl0ZXJJbml0KCZpdGVyLCAmKHAtPmVsZW1lbnRUeXBlcykpOworICBmb3IgKDs7KSB7CisgICAgRUxFTUVOVF9UWVBFICplID0gKEVMRU1FTlRfVFlQRSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIWUpCisgICAgICBicmVhazsKKyAgICBpZiAoZS0+YWxsb2NEZWZhdWx0QXR0cyAhPSAwKQorICAgICAgbXMtPmZyZWVfZmNuKGUtPmRlZmF1bHRBdHRzKTsKKyAgfQorICBoYXNoVGFibGVEZXN0cm95KCYocC0+Z2VuZXJhbEVudGl0aWVzKSk7CisjaWZkZWYgWE1MX0RURAorICBoYXNoVGFibGVEZXN0cm95KCYocC0+cGFyYW1FbnRpdGllcykpOworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgaGFzaFRhYmxlRGVzdHJveSgmKHAtPmVsZW1lbnRUeXBlcykpOworICBoYXNoVGFibGVEZXN0cm95KCYocC0+YXR0cmlidXRlSWRzKSk7CisgIGhhc2hUYWJsZURlc3Ryb3koJihwLT5wcmVmaXhlcykpOworICBwb29sRGVzdHJveSgmKHAtPnBvb2wpKTsKKyAgcG9vbERlc3Ryb3koJihwLT5lbnRpdHlWYWx1ZVBvb2wpKTsKKyAgaWYgKGlzRG9jRW50aXR5KSB7CisgICAgbXMtPmZyZWVfZmNuKHAtPnNjYWZmSW5kZXgpOworICAgIG1zLT5mcmVlX2ZjbihwLT5zY2FmZm9sZCk7CisgIH0KKyAgbXMtPmZyZWVfZmNuKHApOworfQorCisvKiBEbyBhIGRlZXAgY29weSBvZiB0aGUgRFRELiBSZXR1cm4gMCBmb3Igb3V0IG9mIG1lbW9yeSwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICAgVGhlIG5ldyBEVEQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyovCitzdGF0aWMgaW50CitkdGRDb3B5KERURCAqbmV3RHRkLCBjb25zdCBEVEQgKm9sZER0ZCwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpCit7CisgIEhBU0hfVEFCTEVfSVRFUiBpdGVyOworCisgIC8qIENvcHkgdGhlIHByZWZpeCB0YWJsZS4gKi8KKworICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihvbGREdGQtPnByZWZpeGVzKSk7CisgIGZvciAoOzspIHsKKyAgICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgICBjb25zdCBQUkVGSVggKm9sZFAgPSAoUFJFRklYICopaGFzaFRhYmxlSXRlck5leHQoJml0ZXIpOworICAgIGlmICghb2xkUCkKKyAgICAgIGJyZWFrOworICAgIG5hbWUgPSBwb29sQ29weVN0cmluZygmKG5ld0R0ZC0+cG9vbCksIG9sZFAtPm5hbWUpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybiAwOworICAgIGlmICghbG9va3VwKCYobmV3RHRkLT5wcmVmaXhlcyksIG5hbWUsIHNpemVvZihQUkVGSVgpKSkKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgaGFzaFRhYmxlSXRlckluaXQoJml0ZXIsICYob2xkRHRkLT5hdHRyaWJ1dGVJZHMpKTsKKworICAvKiBDb3B5IHRoZSBhdHRyaWJ1dGUgaWQgdGFibGUuICovCisKKyAgZm9yICg7OykgeworICAgIEFUVFJJQlVURV9JRCAqbmV3QTsKKyAgICBjb25zdCBYTUxfQ2hhciAqbmFtZTsKKyAgICBjb25zdCBBVFRSSUJVVEVfSUQgKm9sZEEgPSAoQVRUUklCVVRFX0lEICopaGFzaFRhYmxlSXRlck5leHQoJml0ZXIpOworCisgICAgaWYgKCFvbGRBKQorICAgICAgYnJlYWs7CisgICAgLyogUmVtZW1iZXIgdG8gYWxsb2NhdGUgdGhlIHNjcmF0Y2ggYnl0ZSBiZWZvcmUgdGhlIG5hbWUuICovCisgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmKG5ld0R0ZC0+cG9vbCksIFhNTF9UKCdcMCcpKSkKKyAgICAgIHJldHVybiAwOworICAgIG5hbWUgPSBwb29sQ29weVN0cmluZygmKG5ld0R0ZC0+cG9vbCksIG9sZEEtPm5hbWUpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybiAwOworICAgICsrbmFtZTsKKyAgICBuZXdBID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVRUUklCVVRFX0lEKSk7CisgICAgaWYgKCFuZXdBKQorICAgICAgcmV0dXJuIDA7CisgICAgbmV3QS0+bWF5YmVUb2tlbml6ZWQgPSBvbGRBLT5tYXliZVRva2VuaXplZDsKKyAgICBpZiAob2xkQS0+cHJlZml4KSB7CisgICAgICBuZXdBLT54bWxucyA9IG9sZEEtPnhtbG5zOworICAgICAgaWYgKG9sZEEtPnByZWZpeCA9PSAmb2xkRHRkLT5kZWZhdWx0UHJlZml4KQorICAgICAgICBuZXdBLT5wcmVmaXggPSAmbmV3RHRkLT5kZWZhdWx0UHJlZml4OworICAgICAgZWxzZQorICAgICAgICBuZXdBLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCYobmV3RHRkLT5wcmVmaXhlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQS0+cHJlZml4LT5uYW1lLCAwKTsKKyAgICB9CisgIH0KKworICAvKiBDb3B5IHRoZSBlbGVtZW50IHR5cGUgdGFibGUuICovCisKKyAgaGFzaFRhYmxlSXRlckluaXQoJml0ZXIsICYob2xkRHRkLT5lbGVtZW50VHlwZXMpKTsKKworICBmb3IgKDs7KSB7CisgICAgaW50IGk7CisgICAgRUxFTUVOVF9UWVBFICpuZXdFOworICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOworICAgIGNvbnN0IEVMRU1FTlRfVFlQRSAqb2xkRSA9IChFTEVNRU5UX1RZUEUgKiloYXNoVGFibGVJdGVyTmV4dCgmaXRlcik7CisgICAgaWYgKCFvbGRFKQorICAgICAgYnJlYWs7CisgICAgbmFtZSA9IHBvb2xDb3B5U3RyaW5nKCYobmV3RHRkLT5wb29sKSwgb2xkRS0+bmFtZSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuIDA7CisgICAgbmV3RSA9IChFTEVNRU5UX1RZUEUgKilsb29rdXAoJihuZXdEdGQtPmVsZW1lbnRUeXBlcyksIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVMRU1FTlRfVFlQRSkpOworICAgIGlmICghbmV3RSkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChvbGRFLT5uRGVmYXVsdEF0dHMpIHsKKyAgICAgIG5ld0UtPmRlZmF1bHRBdHRzID0gKERFRkFVTFRfQVRUUklCVVRFICopCisgICAgICAgICAgbXMtPm1hbGxvY19mY24ob2xkRS0+bkRlZmF1bHRBdHRzICogc2l6ZW9mKERFRkFVTFRfQVRUUklCVVRFKSk7CisgICAgICBpZiAoIW5ld0UtPmRlZmF1bHRBdHRzKSB7CisgICAgICAgIG1zLT5mcmVlX2ZjbihuZXdFKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGlmIChvbGRFLT5pZEF0dCkKKyAgICAgIG5ld0UtPmlkQXR0ID0gKEFUVFJJQlVURV9JRCAqKQorICAgICAgICAgIGxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgb2xkRS0+aWRBdHQtPm5hbWUsIDApOworICAgIG5ld0UtPmFsbG9jRGVmYXVsdEF0dHMgPSBuZXdFLT5uRGVmYXVsdEF0dHMgPSBvbGRFLT5uRGVmYXVsdEF0dHM7CisgICAgaWYgKG9sZEUtPnByZWZpeCkKKyAgICAgIG5ld0UtPnByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJihuZXdEdGQtPnByZWZpeGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRS0+cHJlZml4LT5uYW1lLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmV3RS0+bkRlZmF1bHRBdHRzOyBpKyspIHsKKyAgICAgIG5ld0UtPmRlZmF1bHRBdHRzW2ldLmlkID0gKEFUVFJJQlVURV9JRCAqKQorICAgICAgICAgIGxvb2t1cCgmKG5ld0R0ZC0+YXR0cmlidXRlSWRzKSwgb2xkRS0+ZGVmYXVsdEF0dHNbaV0uaWQtPm5hbWUsIDApOworICAgICAgbmV3RS0+ZGVmYXVsdEF0dHNbaV0uaXNDZGF0YSA9IG9sZEUtPmRlZmF1bHRBdHRzW2ldLmlzQ2RhdGE7CisgICAgICBpZiAob2xkRS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUpIHsKKyAgICAgICAgbmV3RS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUKKyAgICAgICAgICAgID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGRFLT5kZWZhdWx0QXR0c1tpXS52YWx1ZSk7CisgICAgICAgIGlmICghbmV3RS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIG5ld0UtPmRlZmF1bHRBdHRzW2ldLnZhbHVlID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvKiBDb3B5IHRoZSBlbnRpdHkgdGFibGVzLiAqLworICBpZiAoIWNvcHlFbnRpdHlUYWJsZSgmKG5ld0R0ZC0+Z2VuZXJhbEVudGl0aWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgJihuZXdEdGQtPnBvb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAmKG9sZER0ZC0+Z2VuZXJhbEVudGl0aWVzKSkpCisgICAgICByZXR1cm4gMDsKKworI2lmZGVmIFhNTF9EVEQKKyAgaWYgKCFjb3B5RW50aXR5VGFibGUoJihuZXdEdGQtPnBhcmFtRW50aXRpZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAmKG5ld0R0ZC0+cG9vbCksCisgICAgICAgICAgICAgICAgICAgICAgICYob2xkRHRkLT5wYXJhbUVudGl0aWVzKSkpCisgICAgICByZXR1cm4gMDsKKyAgbmV3RHRkLT5wYXJhbUVudGl0eVJlYWQgPSBvbGREdGQtPnBhcmFtRW50aXR5UmVhZDsKKyNlbmRpZiAvKiBYTUxfRFREICovCisKKyAgbmV3RHRkLT5rZWVwUHJvY2Vzc2luZyA9IG9sZER0ZC0+a2VlcFByb2Nlc3Npbmc7CisgIG5ld0R0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gb2xkRHRkLT5oYXNQYXJhbUVudGl0eVJlZnM7CisgIG5ld0R0ZC0+c3RhbmRhbG9uZSA9IG9sZER0ZC0+c3RhbmRhbG9uZTsKKworICAvKiBEb24ndCB3YW50IGRlZXAgY29weWluZyBmb3Igc2NhZmZvbGRpbmcgKi8KKyAgbmV3RHRkLT5pbl9lbGRlY2wgPSBvbGREdGQtPmluX2VsZGVjbDsKKyAgbmV3RHRkLT5zY2FmZm9sZCA9IG9sZER0ZC0+c2NhZmZvbGQ7CisgIG5ld0R0ZC0+Y29udGVudFN0cmluZ0xlbiA9IG9sZER0ZC0+Y29udGVudFN0cmluZ0xlbjsKKyAgbmV3RHRkLT5zY2FmZlNpemUgPSBvbGREdGQtPnNjYWZmU2l6ZTsKKyAgbmV3RHRkLT5zY2FmZkxldmVsID0gb2xkRHRkLT5zY2FmZkxldmVsOworICBuZXdEdGQtPnNjYWZmSW5kZXggPSBvbGREdGQtPnNjYWZmSW5kZXg7CisKKyAgcmV0dXJuIDE7Cit9ICAvKiBFbmQgZHRkQ29weSAqLworCitzdGF0aWMgaW50Citjb3B5RW50aXR5VGFibGUoSEFTSF9UQUJMRSAqbmV3VGFibGUsCisgICAgICAgICAgICAgICAgU1RSSU5HX1BPT0wgKm5ld1Bvb2wsCisgICAgICAgICAgICAgICAgY29uc3QgSEFTSF9UQUJMRSAqb2xkVGFibGUpCit7CisgIEhBU0hfVEFCTEVfSVRFUiBpdGVyOworICBjb25zdCBYTUxfQ2hhciAqY2FjaGVkT2xkQmFzZSA9IE5VTEw7CisgIGNvbnN0IFhNTF9DaGFyICpjYWNoZWROZXdCYXNlID0gTlVMTDsKKworICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgb2xkVGFibGUpOworCisgIGZvciAoOzspIHsKKyAgICBFTlRJVFkgKm5ld0U7CisgICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7CisgICAgY29uc3QgRU5USVRZICpvbGRFID0gKEVOVElUWSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKKyAgICBpZiAoIW9sZEUpCisgICAgICBicmVhazsKKyAgICBuYW1lID0gcG9vbENvcHlTdHJpbmcobmV3UG9vbCwgb2xkRS0+bmFtZSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuIDA7CisgICAgbmV3RSA9IChFTlRJVFkgKilsb29rdXAobmV3VGFibGUsIG5hbWUsIHNpemVvZihFTlRJVFkpKTsKKyAgICBpZiAoIW5ld0UpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAob2xkRS0+c3lzdGVtSWQpIHsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICp0ZW0gPSBwb29sQ29weVN0cmluZyhuZXdQb29sLCBvbGRFLT5zeXN0ZW1JZCk7CisgICAgICBpZiAoIXRlbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBuZXdFLT5zeXN0ZW1JZCA9IHRlbTsKKyAgICAgIGlmIChvbGRFLT5iYXNlKSB7CisgICAgICAgIGlmIChvbGRFLT5iYXNlID09IGNhY2hlZE9sZEJhc2UpCisgICAgICAgICAgbmV3RS0+YmFzZSA9IGNhY2hlZE5ld0Jhc2U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGNhY2hlZE9sZEJhc2UgPSBvbGRFLT5iYXNlOworICAgICAgICAgIHRlbSA9IHBvb2xDb3B5U3RyaW5nKG5ld1Bvb2wsIGNhY2hlZE9sZEJhc2UpOworICAgICAgICAgIGlmICghdGVtKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgY2FjaGVkTmV3QmFzZSA9IG5ld0UtPmJhc2UgPSB0ZW07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChvbGRFLT5wdWJsaWNJZCkgeworICAgICAgICB0ZW0gPSBwb29sQ29weVN0cmluZyhuZXdQb29sLCBvbGRFLT5wdWJsaWNJZCk7CisgICAgICAgIGlmICghdGVtKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuZXdFLT5wdWJsaWNJZCA9IHRlbTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjb25zdCBYTUxfQ2hhciAqdGVtID0gcG9vbENvcHlTdHJpbmdOKG5ld1Bvb2wsIG9sZEUtPnRleHRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEUtPnRleHRMZW4pOworICAgICAgaWYgKCF0ZW0pCisgICAgICAgIHJldHVybiAwOworICAgICAgbmV3RS0+dGV4dFB0ciA9IHRlbTsKKyAgICAgIG5ld0UtPnRleHRMZW4gPSBvbGRFLT50ZXh0TGVuOworICAgIH0KKyAgICBpZiAob2xkRS0+bm90YXRpb24pIHsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICp0ZW0gPSBwb29sQ29weVN0cmluZyhuZXdQb29sLCBvbGRFLT5ub3RhdGlvbik7CisgICAgICBpZiAoIXRlbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBuZXdFLT5ub3RhdGlvbiA9IHRlbTsKKyAgICB9CisgICAgbmV3RS0+aXNfcGFyYW0gPSBvbGRFLT5pc19wYXJhbTsKKyAgICBuZXdFLT5pc19pbnRlcm5hbCA9IG9sZEUtPmlzX2ludGVybmFsOworICB9CisgIHJldHVybiAxOworfQorCisjZGVmaW5lIElOSVRfUE9XRVIgNgorCitzdGF0aWMgWE1MX0Jvb2wgRkFTVENBTEwKK2tleWVxKEtFWSBzMSwgS0VZIHMyKQoreworICBmb3IgKDsgKnMxID09ICpzMjsgczErKywgczIrKykKKyAgICBpZiAoKnMxID09IDApCisgICAgICByZXR1cm4gWE1MX1RSVUU7CisgIHJldHVybiBYTUxfRkFMU0U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZBU1RDQUxMCitoYXNoKEtFWSBzKQoreworICB1bnNpZ25lZCBsb25nIGggPSAwOworICB3aGlsZSAoKnMpCisgICAgaCA9IENIQVJfSEFTSChoLCAqcysrKTsKKyAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBOQU1FRCAqCitsb29rdXAoSEFTSF9UQUJMRSAqdGFibGUsIEtFWSBuYW1lLCBzaXplX3QgY3JlYXRlU2l6ZSkKK3sKKyAgc2l6ZV90IGk7CisgIGlmICh0YWJsZS0+c2l6ZSA9PSAwKSB7CisgICAgc2l6ZV90IHRzaXplOworICAgIGlmICghY3JlYXRlU2l6ZSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHRhYmxlLT5wb3dlciA9IElOSVRfUE9XRVI7CisgICAgLyogdGFibGUtPnNpemUgaXMgYSBwb3dlciBvZiAyICovCisgICAgdGFibGUtPnNpemUgPSAoc2l6ZV90KTEgPDwgSU5JVF9QT1dFUjsKKyAgICB0c2l6ZSA9IHRhYmxlLT5zaXplICogc2l6ZW9mKE5BTUVEICopOworICAgIHRhYmxlLT52ID0gKE5BTUVEICoqKXRhYmxlLT5tZW0tPm1hbGxvY19mY24odHNpemUpOworICAgIGlmICghdGFibGUtPnYpIHsKKyAgICAgIHRhYmxlLT5zaXplID0gMDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQodGFibGUtPnYsIDAsIHRzaXplKTsKKyAgICBpID0gaGFzaChuYW1lKSAmICgodW5zaWduZWQgbG9uZyl0YWJsZS0+c2l6ZSAtIDEpOworICB9CisgIGVsc2UgeworICAgIHVuc2lnbmVkIGxvbmcgaCA9IGhhc2gobmFtZSk7CisgICAgdW5zaWduZWQgbG9uZyBtYXNrID0gKHVuc2lnbmVkIGxvbmcpdGFibGUtPnNpemUgLSAxOworICAgIHVuc2lnbmVkIGNoYXIgc3RlcCA9IDA7CisgICAgaSA9IGggJiBtYXNrOworICAgIHdoaWxlICh0YWJsZS0+dltpXSkgeworICAgICAgaWYgKGtleWVxKG5hbWUsIHRhYmxlLT52W2ldLT5uYW1lKSkKKyAgICAgICAgcmV0dXJuIHRhYmxlLT52W2ldOworICAgICAgaWYgKCFzdGVwKQorICAgICAgICBzdGVwID0gUFJPQkVfU1RFUChoLCBtYXNrLCB0YWJsZS0+cG93ZXIpOworICAgICAgaSA8IHN0ZXAgPyAoaSArPSB0YWJsZS0+c2l6ZSAtIHN0ZXApIDogKGkgLT0gc3RlcCk7CisgICAgfQorICAgIGlmICghY3JlYXRlU2l6ZSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICh0YWJsZSBpcyBoYWxmIGZ1bGwpICovCisgICAgaWYgKHRhYmxlLT51c2VkID4+ICh0YWJsZS0+cG93ZXIgLSAxKSkgeworICAgICAgdW5zaWduZWQgY2hhciBuZXdQb3dlciA9IHRhYmxlLT5wb3dlciArIDE7CisgICAgICBzaXplX3QgbmV3U2l6ZSA9IChzaXplX3QpMSA8PCBuZXdQb3dlcjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbmV3TWFzayA9ICh1bnNpZ25lZCBsb25nKW5ld1NpemUgLSAxOworICAgICAgc2l6ZV90IHRzaXplID0gbmV3U2l6ZSAqIHNpemVvZihOQU1FRCAqKTsKKyAgICAgIE5BTUVEICoqbmV3ViA9IChOQU1FRCAqKil0YWJsZS0+bWVtLT5tYWxsb2NfZmNuKHRzaXplKTsKKyAgICAgIGlmICghbmV3VikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBtZW1zZXQobmV3ViwgMCwgdHNpemUpOworICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspCisgICAgICAgIGlmICh0YWJsZS0+dltpXSkgeworICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3SGFzaCA9IGhhc2godGFibGUtPnZbaV0tPm5hbWUpOworICAgICAgICAgIHNpemVfdCBqID0gbmV3SGFzaCAmIG5ld01hc2s7CisgICAgICAgICAgc3RlcCA9IDA7CisgICAgICAgICAgd2hpbGUgKG5ld1Zbal0pIHsKKyAgICAgICAgICAgIGlmICghc3RlcCkKKyAgICAgICAgICAgICAgc3RlcCA9IFBST0JFX1NURVAobmV3SGFzaCwgbmV3TWFzaywgbmV3UG93ZXIpOworICAgICAgICAgICAgaiA8IHN0ZXAgPyAoaiArPSBuZXdTaXplIC0gc3RlcCkgOiAoaiAtPSBzdGVwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbmV3VltqXSA9IHRhYmxlLT52W2ldOworICAgICAgICB9CisgICAgICB0YWJsZS0+bWVtLT5mcmVlX2Zjbih0YWJsZS0+dik7CisgICAgICB0YWJsZS0+diA9IG5ld1Y7CisgICAgICB0YWJsZS0+cG93ZXIgPSBuZXdQb3dlcjsKKyAgICAgIHRhYmxlLT5zaXplID0gbmV3U2l6ZTsKKyAgICAgIGkgPSBoICYgbmV3TWFzazsKKyAgICAgIHN0ZXAgPSAwOworICAgICAgd2hpbGUgKHRhYmxlLT52W2ldKSB7CisgICAgICAgIGlmICghc3RlcCkKKyAgICAgICAgICBzdGVwID0gUFJPQkVfU1RFUChoLCBuZXdNYXNrLCBuZXdQb3dlcik7CisgICAgICAgIGkgPCBzdGVwID8gKGkgKz0gbmV3U2l6ZSAtIHN0ZXApIDogKGkgLT0gc3RlcCk7CisgICAgICB9CisgICAgfQorICB9CisgIHRhYmxlLT52W2ldID0gKE5BTUVEICopdGFibGUtPm1lbS0+bWFsbG9jX2ZjbihjcmVhdGVTaXplKTsKKyAgaWYgKCF0YWJsZS0+dltpXSkKKyAgICByZXR1cm4gTlVMTDsKKyAgbWVtc2V0KHRhYmxlLT52W2ldLCAwLCBjcmVhdGVTaXplKTsKKyAgdGFibGUtPnZbaV0tPm5hbWUgPSBuYW1lOworICAodGFibGUtPnVzZWQpKys7CisgIHJldHVybiB0YWJsZS0+dltpXTsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK2hhc2hUYWJsZUNsZWFyKEhBU0hfVEFCTEUgKnRhYmxlKQoreworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKyspIHsKKyAgICB0YWJsZS0+bWVtLT5mcmVlX2Zjbih0YWJsZS0+dltpXSk7CisgICAgdGFibGUtPnZbaV0gPSBOVUxMOworICB9CisgIHRhYmxlLT51c2VkID0gMDsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK2hhc2hUYWJsZURlc3Ryb3koSEFTSF9UQUJMRSAqdGFibGUpCit7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7IGkrKykKKyAgICB0YWJsZS0+bWVtLT5mcmVlX2Zjbih0YWJsZS0+dltpXSk7CisgIHRhYmxlLT5tZW0tPmZyZWVfZmNuKHRhYmxlLT52KTsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK2hhc2hUYWJsZUluaXQoSEFTSF9UQUJMRSAqcCwgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbXMpCit7CisgIHAtPnBvd2VyID0gMDsKKyAgcC0+c2l6ZSA9IDA7CisgIHAtPnVzZWQgPSAwOworICBwLT52ID0gTlVMTDsKKyAgcC0+bWVtID0gbXM7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitoYXNoVGFibGVJdGVySW5pdChIQVNIX1RBQkxFX0lURVIgKml0ZXIsIGNvbnN0IEhBU0hfVEFCTEUgKnRhYmxlKQoreworICBpdGVyLT5wID0gdGFibGUtPnY7CisgIGl0ZXItPmVuZCA9IGl0ZXItPnAgKyB0YWJsZS0+c2l6ZTsKK30KKworc3RhdGljIE5BTUVEICogRkFTVENBTEwKK2hhc2hUYWJsZUl0ZXJOZXh0KEhBU0hfVEFCTEVfSVRFUiAqaXRlcikKK3sKKyAgd2hpbGUgKGl0ZXItPnAgIT0gaXRlci0+ZW5kKSB7CisgICAgTkFNRUQgKnRlbSA9ICooaXRlci0+cCkrKzsKKyAgICBpZiAodGVtKQorICAgICAgcmV0dXJuIHRlbTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwKK3Bvb2xJbml0KFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfTWVtb3J5X0hhbmRsaW5nX1N1aXRlICptcykKK3sKKyAgcG9vbC0+YmxvY2tzID0gTlVMTDsKKyAgcG9vbC0+ZnJlZUJsb2NrcyA9IE5VTEw7CisgIHBvb2wtPnN0YXJ0ID0gTlVMTDsKKyAgcG9vbC0+cHRyID0gTlVMTDsKKyAgcG9vbC0+ZW5kID0gTlVMTDsKKyAgcG9vbC0+bWVtID0gbXM7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMCitwb29sQ2xlYXIoU1RSSU5HX1BPT0wgKnBvb2wpCit7CisgIGlmICghcG9vbC0+ZnJlZUJsb2NrcykKKyAgICBwb29sLT5mcmVlQmxvY2tzID0gcG9vbC0+YmxvY2tzOworICBlbHNlIHsKKyAgICBCTE9DSyAqcCA9IHBvb2wtPmJsb2NrczsKKyAgICB3aGlsZSAocCkgeworICAgICAgQkxPQ0sgKnRlbSA9IHAtPm5leHQ7CisgICAgICBwLT5uZXh0ID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgICAgIHBvb2wtPmZyZWVCbG9ja3MgPSBwOworICAgICAgcCA9IHRlbTsKKyAgICB9CisgIH0KKyAgcG9vbC0+YmxvY2tzID0gTlVMTDsKKyAgcG9vbC0+c3RhcnQgPSBOVUxMOworICBwb29sLT5wdHIgPSBOVUxMOworICBwb29sLT5lbmQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTAorcG9vbERlc3Ryb3koU1RSSU5HX1BPT0wgKnBvb2wpCit7CisgIEJMT0NLICpwID0gcG9vbC0+YmxvY2tzOworICB3aGlsZSAocCkgeworICAgIEJMT0NLICp0ZW0gPSBwLT5uZXh0OworICAgIHBvb2wtPm1lbS0+ZnJlZV9mY24ocCk7CisgICAgcCA9IHRlbTsKKyAgfQorICBwID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgd2hpbGUgKHApIHsKKyAgICBCTE9DSyAqdGVtID0gcC0+bmV4dDsKKyAgICBwb29sLT5tZW0tPmZyZWVfZmNuKHApOworICAgIHAgPSB0ZW07CisgIH0KK30KKworc3RhdGljIFhNTF9DaGFyICoKK3Bvb2xBcHBlbmQoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKQoreworICBpZiAoIXBvb2wtPnB0ciAmJiAhcG9vbEdyb3cocG9vbCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoOzspIHsKKyAgICBYbWxDb252ZXJ0KGVuYywgJnB0ciwgZW5kLCAoSUNIQVIgKiopJihwb29sLT5wdHIpLCAoSUNIQVIgKilwb29sLT5lbmQpOworICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFwb29sR3Jvdyhwb29sKSkKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwb29sLT5zdGFydDsKK30KKworc3RhdGljIGNvbnN0IFhNTF9DaGFyICogRkFTVENBTEwKK3Bvb2xDb3B5U3RyaW5nKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcykKK3sKKyAgZG8geworICAgIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgKnMpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0gd2hpbGUgKCpzKyspOworICBzID0gcG9vbC0+c3RhcnQ7CisgIHBvb2xGaW5pc2gocG9vbCk7CisgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgWE1MX0NoYXIgKgorcG9vbENvcHlTdHJpbmdOKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IG4pCit7CisgIGlmICghcG9vbC0+cHRyICYmICFwb29sR3Jvdyhwb29sKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yICg7IG4gPiAwOyAtLW4sIHMrKykgeworICAgIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgKnMpKQorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcyA9IHBvb2wtPnN0YXJ0OworICBwb29sRmluaXNoKHBvb2wpOworICByZXR1cm4gczsKK30KKworc3RhdGljIGNvbnN0IFhNTF9DaGFyICogRkFTVENBTEwKK3Bvb2xBcHBlbmRTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IFhNTF9DaGFyICpzKQoreworICB3aGlsZSAoKnMpIHsKKyAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsICpzKSkKKyAgICAgIHJldHVybiBOVUxMOworICAgIHMrKzsKKyAgfQorICByZXR1cm4gcG9vbC0+c3RhcnQ7Cit9CisKK3N0YXRpYyBYTUxfQ2hhciAqCitwb29sU3RvcmVTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpCit7CisgIGlmICghcG9vbEFwcGVuZChwb29sLCBlbmMsIHB0ciwgZW5kKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKHBvb2wtPnB0ciA9PSBwb29sLT5lbmQgJiYgIXBvb2xHcm93KHBvb2wpKQorICAgIHJldHVybiBOVUxMOworICAqKHBvb2wtPnB0cikrKyA9IDA7CisgIHJldHVybiBwb29sLT5zdGFydDsKK30KKworc3RhdGljIFhNTF9Cb29sIEZBU1RDQUxMCitwb29sR3JvdyhTVFJJTkdfUE9PTCAqcG9vbCkKK3sKKyAgaWYgKHBvb2wtPmZyZWVCbG9ja3MpIHsKKyAgICBpZiAocG9vbC0+c3RhcnQgPT0gMCkgeworICAgICAgcG9vbC0+YmxvY2tzID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgICAgIHBvb2wtPmZyZWVCbG9ja3MgPSBwb29sLT5mcmVlQmxvY2tzLT5uZXh0OworICAgICAgcG9vbC0+YmxvY2tzLT5uZXh0ID0gTlVMTDsKKyAgICAgIHBvb2wtPnN0YXJ0ID0gcG9vbC0+YmxvY2tzLT5zOworICAgICAgcG9vbC0+ZW5kID0gcG9vbC0+c3RhcnQgKyBwb29sLT5ibG9ja3MtPnNpemU7CisgICAgICBwb29sLT5wdHIgPSBwb29sLT5zdGFydDsKKyAgICAgIHJldHVybiBYTUxfVFJVRTsKKyAgICB9CisgICAgaWYgKHBvb2wtPmVuZCAtIHBvb2wtPnN0YXJ0IDwgcG9vbC0+ZnJlZUJsb2Nrcy0+c2l6ZSkgeworICAgICAgQkxPQ0sgKnRlbSA9IHBvb2wtPmZyZWVCbG9ja3MtPm5leHQ7CisgICAgICBwb29sLT5mcmVlQmxvY2tzLT5uZXh0ID0gcG9vbC0+YmxvY2tzOworICAgICAgcG9vbC0+YmxvY2tzID0gcG9vbC0+ZnJlZUJsb2NrczsKKyAgICAgIHBvb2wtPmZyZWVCbG9ja3MgPSB0ZW07CisgICAgICBtZW1jcHkocG9vbC0+YmxvY2tzLT5zLCBwb29sLT5zdGFydCwKKyAgICAgICAgICAgICAocG9vbC0+ZW5kIC0gcG9vbC0+c3RhcnQpICogc2l6ZW9mKFhNTF9DaGFyKSk7CisgICAgICBwb29sLT5wdHIgPSBwb29sLT5ibG9ja3MtPnMgKyAocG9vbC0+cHRyIC0gcG9vbC0+c3RhcnQpOworICAgICAgcG9vbC0+c3RhcnQgPSBwb29sLT5ibG9ja3MtPnM7CisgICAgICBwb29sLT5lbmQgPSBwb29sLT5zdGFydCArIHBvb2wtPmJsb2Nrcy0+c2l6ZTsKKyAgICAgIHJldHVybiBYTUxfVFJVRTsKKyAgICB9CisgIH0KKyAgaWYgKHBvb2wtPmJsb2NrcyAmJiBwb29sLT5zdGFydCA9PSBwb29sLT5ibG9ja3MtPnMpIHsKKyAgICBpbnQgYmxvY2tTaXplID0gKGludCkocG9vbC0+ZW5kIC0gcG9vbC0+c3RhcnQpKjI7CisgICAgcG9vbC0+YmxvY2tzID0gKEJMT0NLICopCisgICAgICBwb29sLT5tZW0tPnJlYWxsb2NfZmNuKHBvb2wtPmJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldG9mKEJMT0NLLCBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBibG9ja1NpemUgKiBzaXplb2YoWE1MX0NoYXIpKSk7CisgICAgaWYgKHBvb2wtPmJsb2NrcyA9PSBOVUxMKQorICAgICAgcmV0dXJuIFhNTF9GQUxTRTsKKyAgICBwb29sLT5ibG9ja3MtPnNpemUgPSBibG9ja1NpemU7CisgICAgcG9vbC0+cHRyID0gcG9vbC0+YmxvY2tzLT5zICsgKHBvb2wtPnB0ciAtIHBvb2wtPnN0YXJ0KTsKKyAgICBwb29sLT5zdGFydCA9IHBvb2wtPmJsb2Nrcy0+czsKKyAgICBwb29sLT5lbmQgPSBwb29sLT5zdGFydCArIGJsb2NrU2l6ZTsKKyAgfQorICBlbHNlIHsKKyAgICBCTE9DSyAqdGVtOworICAgIGludCBibG9ja1NpemUgPSAoaW50KShwb29sLT5lbmQgLSBwb29sLT5zdGFydCk7CisgICAgaWYgKGJsb2NrU2l6ZSA8IElOSVRfQkxPQ0tfU0laRSkKKyAgICAgIGJsb2NrU2l6ZSA9IElOSVRfQkxPQ0tfU0laRTsKKyAgICBlbHNlCisgICAgICBibG9ja1NpemUgKj0gMjsKKyAgICB0ZW0gPSAoQkxPQ0sgKilwb29sLT5tZW0tPm1hbGxvY19mY24ob2Zmc2V0b2YoQkxPQ0ssIHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBibG9ja1NpemUgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICBpZiAoIXRlbSkKKyAgICAgIHJldHVybiBYTUxfRkFMU0U7CisgICAgdGVtLT5zaXplID0gYmxvY2tTaXplOworICAgIHRlbS0+bmV4dCA9IHBvb2wtPmJsb2NrczsKKyAgICBwb29sLT5ibG9ja3MgPSB0ZW07CisgICAgaWYgKHBvb2wtPnB0ciAhPSBwb29sLT5zdGFydCkKKyAgICAgIG1lbWNweSh0ZW0tPnMsIHBvb2wtPnN0YXJ0LAorICAgICAgICAgICAgIChwb29sLT5wdHIgLSBwb29sLT5zdGFydCkgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICBwb29sLT5wdHIgPSB0ZW0tPnMgKyAocG9vbC0+cHRyIC0gcG9vbC0+c3RhcnQpOworICAgIHBvb2wtPnN0YXJ0ID0gdGVtLT5zOworICAgIHBvb2wtPmVuZCA9IHRlbS0+cyArIGJsb2NrU2l6ZTsKKyAgfQorICByZXR1cm4gWE1MX1RSVUU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVENBTEwKK25leHRTY2FmZm9sZFBhcnQoWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIERURCAqIGNvbnN0IGR0ZCA9IF9kdGQ7ICAvKiBzYXZlIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLworICBDT05URU5UX1NDQUZGT0xEICogbWU7CisgIGludCBuZXh0OworCisgIGlmICghZHRkLT5zY2FmZkluZGV4KSB7CisgICAgZHRkLT5zY2FmZkluZGV4ID0gKGludCAqKU1BTExPQyhncm91cFNpemUgKiBzaXplb2YoaW50KSk7CisgICAgaWYgKCFkdGQtPnNjYWZmSW5kZXgpCisgICAgICByZXR1cm4gLTE7CisgICAgZHRkLT5zY2FmZkluZGV4WzBdID0gMDsKKyAgfQorCisgIGlmIChkdGQtPnNjYWZmQ291bnQgPj0gZHRkLT5zY2FmZlNpemUpIHsKKyAgICBDT05URU5UX1NDQUZGT0xEICp0ZW1wOworICAgIGlmIChkdGQtPnNjYWZmb2xkKSB7CisgICAgICB0ZW1wID0gKENPTlRFTlRfU0NBRkZPTEQgKikKKyAgICAgICAgUkVBTExPQyhkdGQtPnNjYWZmb2xkLCBkdGQtPnNjYWZmU2l6ZSAqIDIgKiBzaXplb2YoQ09OVEVOVF9TQ0FGRk9MRCkpOworICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgZHRkLT5zY2FmZlNpemUgKj0gMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0ZW1wID0gKENPTlRFTlRfU0NBRkZPTEQgKilNQUxMT0MoSU5JVF9TQ0FGRk9MRF9FTEVNRU5UUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKENPTlRFTlRfU0NBRkZPTEQpKTsKKyAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGR0ZC0+c2NhZmZTaXplID0gSU5JVF9TQ0FGRk9MRF9FTEVNRU5UUzsKKyAgICB9CisgICAgZHRkLT5zY2FmZm9sZCA9IHRlbXA7CisgIH0KKyAgbmV4dCA9IGR0ZC0+c2NhZmZDb3VudCsrOworICBtZSA9ICZkdGQtPnNjYWZmb2xkW25leHRdOworICBpZiAoZHRkLT5zY2FmZkxldmVsKSB7CisgICAgQ09OVEVOVF9TQ0FGRk9MRCAqcGFyZW50ID0gJmR0ZC0+c2NhZmZvbGRbZHRkLT5zY2FmZkluZGV4W2R0ZC0+c2NhZmZMZXZlbC0xXV07CisgICAgaWYgKHBhcmVudC0+bGFzdGNoaWxkKSB7CisgICAgICBkdGQtPnNjYWZmb2xkW3BhcmVudC0+bGFzdGNoaWxkXS5uZXh0c2liID0gbmV4dDsKKyAgICB9CisgICAgaWYgKCFwYXJlbnQtPmNoaWxkY250KQorICAgICAgcGFyZW50LT5maXJzdGNoaWxkID0gbmV4dDsKKyAgICBwYXJlbnQtPmxhc3RjaGlsZCA9IG5leHQ7CisgICAgcGFyZW50LT5jaGlsZGNudCsrOworICB9CisgIG1lLT5maXJzdGNoaWxkID0gbWUtPmxhc3RjaGlsZCA9IG1lLT5jaGlsZGNudCA9IG1lLT5uZXh0c2liID0gMDsKKyAgcmV0dXJuIG5leHQ7Cit9CisKK3N0YXRpYyB2b2lkCitidWlsZF9ub2RlKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICBpbnQgc3JjX25vZGUsCisgICAgICAgICAgIFhNTF9Db250ZW50ICpkZXN0LAorICAgICAgICAgICBYTUxfQ29udGVudCAqKmNvbnRwb3MsCisgICAgICAgICAgIFhNTF9DaGFyICoqc3RycG9zKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgZGVzdC0+dHlwZSA9IGR0ZC0+c2NhZmZvbGRbc3JjX25vZGVdLnR5cGU7CisgIGRlc3QtPnF1YW50ID0gZHRkLT5zY2FmZm9sZFtzcmNfbm9kZV0ucXVhbnQ7CisgIGlmIChkZXN0LT50eXBlID09IFhNTF9DVFlQRV9OQU1FKSB7CisgICAgY29uc3QgWE1MX0NoYXIgKnNyYzsKKyAgICBkZXN0LT5uYW1lID0gKnN0cnBvczsKKyAgICBzcmMgPSBkdGQtPnNjYWZmb2xkW3NyY19ub2RlXS5uYW1lOworICAgIGZvciAoOzspIHsKKyAgICAgICooKnN0cnBvcykrKyA9ICpzcmM7CisgICAgICBpZiAoISpzcmMpCisgICAgICAgIGJyZWFrOworICAgICAgc3JjKys7CisgICAgfQorICAgIGRlc3QtPm51bWNoaWxkcmVuID0gMDsKKyAgICBkZXN0LT5jaGlsZHJlbiA9IE5VTEw7CisgIH0KKyAgZWxzZSB7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgaW50IGNuOworICAgIGRlc3QtPm51bWNoaWxkcmVuID0gZHRkLT5zY2FmZm9sZFtzcmNfbm9kZV0uY2hpbGRjbnQ7CisgICAgZGVzdC0+Y2hpbGRyZW4gPSAqY29udHBvczsKKyAgICAqY29udHBvcyArPSBkZXN0LT5udW1jaGlsZHJlbjsKKyAgICBmb3IgKGkgPSAwLCBjbiA9IGR0ZC0+c2NhZmZvbGRbc3JjX25vZGVdLmZpcnN0Y2hpbGQ7CisgICAgICAgICBpIDwgZGVzdC0+bnVtY2hpbGRyZW47CisgICAgICAgICBpKyssIGNuID0gZHRkLT5zY2FmZm9sZFtjbl0ubmV4dHNpYikgeworICAgICAgYnVpbGRfbm9kZShwYXJzZXIsIGNuLCAmKGRlc3QtPmNoaWxkcmVuW2ldKSwgY29udHBvcywgc3RycG9zKTsKKyAgICB9CisgICAgZGVzdC0+bmFtZSA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIFhNTF9Db250ZW50ICoKK2J1aWxkX21vZGVsIChYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgRFREICogY29uc3QgZHRkID0gX2R0ZDsgIC8qIHNhdmUgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisgIFhNTF9Db250ZW50ICpyZXQ7CisgIFhNTF9Db250ZW50ICpjcG9zOworICBYTUxfQ2hhciAqIHN0cjsKKyAgaW50IGFsbG9jc2l6ZSA9IChkdGQtPnNjYWZmQ291bnQgKiBzaXplb2YoWE1MX0NvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgKyAoZHRkLT5jb250ZW50U3RyaW5nTGVuICogc2l6ZW9mKFhNTF9DaGFyKSkpOworCisgIHJldCA9IChYTUxfQ29udGVudCAqKU1BTExPQyhhbGxvY3NpemUpOworICBpZiAoIXJldCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdHIgPSAgKFhNTF9DaGFyICopICgmcmV0W2R0ZC0+c2NhZmZDb3VudF0pOworICBjcG9zID0gJnJldFsxXTsKKworICBidWlsZF9ub2RlKHBhcnNlciwgMCwgcmV0LCAmY3BvcywgJnN0cik7CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBFTEVNRU5UX1RZUEUgKgorZ2V0RWxlbWVudFR5cGUoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kKQoreworICBEVEQgKiBjb25zdCBkdGQgPSBfZHRkOyAgLyogc2F2ZSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKyAgY29uc3QgWE1MX0NoYXIgKm5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC0+cG9vbCwgZW5jLCBwdHIsIGVuZCk7CisgIEVMRU1FTlRfVFlQRSAqcmV0OworCisgIGlmICghbmFtZSkKKyAgICByZXR1cm4gTlVMTDsKKyAgcmV0ID0gKEVMRU1FTlRfVFlQRSAqKSBsb29rdXAoJmR0ZC0+ZWxlbWVudFR5cGVzLCBuYW1lLCBzaXplb2YoRUxFTUVOVF9UWVBFKSk7CisgIGlmICghcmV0KQorICAgIHJldHVybiBOVUxMOworICBpZiAocmV0LT5uYW1lICE9IG5hbWUpCisgICAgcG9vbERpc2NhcmQoJmR0ZC0+cG9vbCk7CisgIGVsc2UgeworICAgIHBvb2xGaW5pc2goJmR0ZC0+cG9vbCk7CisgICAgaWYgKCFzZXRFbGVtZW50VHlwZVByZWZpeChwYXJzZXIsIHJldCkpCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL3htbHJvbGUuYyBiL2V4cGF0LTIuMC4xL2xpYi94bWxyb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM1ZTI1YgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL2xpYi94bWxyb2xlLmMKQEAgLTAsMCArMSwxMzM2IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKKyNpbmNsdWRlICJ3aW5jb25maWcuaCIKKyNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKKyNpbmNsdWRlICJtYWNjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19hbWlnYW9zNF9fKQorI2luY2x1ZGUgImFtaWdhY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorI2luY2x1ZGUgIndhdGNvbWNvbmZpZy5oIgorI2Vsc2UKKyNpZmRlZiBIQVZFX0VYUEFUX0NPTkZJR19ICisjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CisjZW5kaWYKKyNlbmRpZiAvKiBuZGVmIENPTVBJTEVEX0ZST01fRFNQICovCisKKyNpbmNsdWRlICJleHBhdF9leHRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAieG1scm9sZS5oIgorI2luY2x1ZGUgImFzY2lpLmgiCisKKy8qIERvZXNuJ3QgY2hlY2s6CisKKyB0aGF0ICx8IGFyZSBub3QgbWl4ZWQgaW4gYSBtb2RlbCBncm91cAorIGNvbnRlbnQgb2YgbGl0ZXJhbHMKKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgS1dfQU5ZW10gPSB7CisgICAgQVNDSUlfQSwgQVNDSUlfTiwgQVNDSUlfWSwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfQVRUTElTVFtdID0geworICAgIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX1QsIEFTQ0lJX0wsIEFTQ0lJX0ksIEFTQ0lJX1MsIEFTQ0lJX1QsICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0NEQVRBW10gPSB7CisgICAgQVNDSUlfQywgQVNDSUlfRCwgQVNDSUlfQSwgQVNDSUlfVCwgQVNDSUlfQSwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfRE9DVFlQRVtdID0geworICAgIEFTQ0lJX0QsIEFTQ0lJX08sIEFTQ0lJX0MsIEFTQ0lJX1QsIEFTQ0lJX1ksIEFTQ0lJX1AsIEFTQ0lJX0UsICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0VMRU1FTlRbXSA9IHsKKyAgICBBU0NJSV9FLCBBU0NJSV9MLCBBU0NJSV9FLCBBU0NJSV9NLCBBU0NJSV9FLCBBU0NJSV9OLCBBU0NJSV9ULCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19FTVBUWVtdID0geworICAgIEFTQ0lJX0UsIEFTQ0lJX00sIEFTQ0lJX1AsIEFTQ0lJX1QsIEFTQ0lJX1ksICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0VOVElUSUVTW10gPSB7CisgICAgQVNDSUlfRSwgQVNDSUlfTiwgQVNDSUlfVCwgQVNDSUlfSSwgQVNDSUlfVCwgQVNDSUlfSSwgQVNDSUlfRSwgQVNDSUlfUywKKyAgICAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19FTlRJVFlbXSA9IHsKKyAgICBBU0NJSV9FLCBBU0NJSV9OLCBBU0NJSV9ULCBBU0NJSV9JLCBBU0NJSV9ULCBBU0NJSV9ZLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19GSVhFRFtdID0geworICAgIEFTQ0lJX0YsIEFTQ0lJX0ksIEFTQ0lJX1gsIEFTQ0lJX0UsIEFTQ0lJX0QsICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0lEW10gPSB7CisgICAgQVNDSUlfSSwgQVNDSUlfRCwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfSURSRUZbXSA9IHsKKyAgICBBU0NJSV9JLCBBU0NJSV9ELCBBU0NJSV9SLCBBU0NJSV9FLCBBU0NJSV9GLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19JRFJFRlNbXSA9IHsKKyAgICBBU0NJSV9JLCBBU0NJSV9ELCBBU0NJSV9SLCBBU0NJSV9FLCBBU0NJSV9GLCBBU0NJSV9TLCAnXDAnIH07CisjaWZkZWYgWE1MX0RURAorc3RhdGljIGNvbnN0IGNoYXIgS1dfSUdOT1JFW10gPSB7CisgICAgQVNDSUlfSSwgQVNDSUlfRywgQVNDSUlfTiwgQVNDSUlfTywgQVNDSUlfUiwgQVNDSUlfRSwgJ1wwJyB9OworI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciBLV19JTVBMSUVEW10gPSB7CisgICAgQVNDSUlfSSwgQVNDSUlfTSwgQVNDSUlfUCwgQVNDSUlfTCwgQVNDSUlfSSwgQVNDSUlfRSwgQVNDSUlfRCwgJ1wwJyB9OworI2lmZGVmIFhNTF9EVEQKK3N0YXRpYyBjb25zdCBjaGFyIEtXX0lOQ0xVREVbXSA9IHsKKyAgICBBU0NJSV9JLCBBU0NJSV9OLCBBU0NJSV9DLCBBU0NJSV9MLCBBU0NJSV9VLCBBU0NJSV9ELCBBU0NJSV9FLCAnXDAnIH07CisjZW5kaWYKK3N0YXRpYyBjb25zdCBjaGFyIEtXX05EQVRBW10gPSB7CisgICAgQVNDSUlfTiwgQVNDSUlfRCwgQVNDSUlfQSwgQVNDSUlfVCwgQVNDSUlfQSwgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfTk1UT0tFTltdID0geworICAgIEFTQ0lJX04sIEFTQ0lJX00sIEFTQ0lJX1QsIEFTQ0lJX08sIEFTQ0lJX0ssIEFTQ0lJX0UsIEFTQ0lJX04sICdcMCcgfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX05NVE9LRU5TW10gPSB7CisgICAgQVNDSUlfTiwgQVNDSUlfTSwgQVNDSUlfVCwgQVNDSUlfTywgQVNDSUlfSywgQVNDSUlfRSwgQVNDSUlfTiwgQVNDSUlfUywKKyAgICAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19OT1RBVElPTltdID0KKyAgICB7IEFTQ0lJX04sIEFTQ0lJX08sIEFTQ0lJX1QsIEFTQ0lJX0EsIEFTQ0lJX1QsIEFTQ0lJX0ksIEFTQ0lJX08sIEFTQ0lJX04sCisgICAgICAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19QQ0RBVEFbXSA9IHsKKyAgICBBU0NJSV9QLCBBU0NJSV9DLCBBU0NJSV9ELCBBU0NJSV9BLCBBU0NJSV9ULCBBU0NJSV9BLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19QVUJMSUNbXSA9IHsKKyAgICBBU0NJSV9QLCBBU0NJSV9VLCBBU0NJSV9CLCBBU0NJSV9MLCBBU0NJSV9JLCBBU0NJSV9DLCAnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciBLV19SRVFVSVJFRFtdID0geworICAgIEFTQ0lJX1IsIEFTQ0lJX0UsIEFTQ0lJX1EsIEFTQ0lJX1UsIEFTQ0lJX0ksIEFTQ0lJX1IsIEFTQ0lJX0UsIEFTQ0lJX0QsCisgICAgJ1wwJyB9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfU1lTVEVNW10gPSB7CisgICAgQVNDSUlfUywgQVNDSUlfWSwgQVNDSUlfUywgQVNDSUlfVCwgQVNDSUlfRSwgQVNDSUlfTSwgJ1wwJyB9OworCisjaWZuZGVmIE1JTl9CWVRFU19QRVJfQ0hBUgorI2RlZmluZSBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSAoKGVuYyktPm1pbkJ5dGVzUGVyQ2hhcikKKyNlbmRpZgorCisjaWZkZWYgWE1MX0RURAorI2RlZmluZSBzZXRUb3BMZXZlbChzdGF0ZSkgXAorICAoKHN0YXRlKS0+aGFuZGxlciA9ICgoc3RhdGUpLT5kb2N1bWVudEVudGl0eSBcCisgICAgICAgICAgICAgICAgICAgICAgID8gaW50ZXJuYWxTdWJzZXQgXAorICAgICAgICAgICAgICAgICAgICAgICA6IGV4dGVybmFsU3Vic2V0MSkpCisjZWxzZSAvKiBub3QgWE1MX0RURCAqLworI2RlZmluZSBzZXRUb3BMZXZlbChzdGF0ZSkgKChzdGF0ZSktPmhhbmRsZXIgPSBpbnRlcm5hbFN1YnNldCkKKyNlbmRpZiAvKiBub3QgWE1MX0RURCAqLworCit0eXBlZGVmIGludCBQVFJDQUxMIFBST0xPR19IQU5ETEVSKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKTsKKworc3RhdGljIFBST0xPR19IQU5ETEVSCisgIHByb2xvZzAsIHByb2xvZzEsIHByb2xvZzIsCisgIGRvY3R5cGUwLCBkb2N0eXBlMSwgZG9jdHlwZTIsIGRvY3R5cGUzLCBkb2N0eXBlNCwgZG9jdHlwZTUsCisgIGludGVybmFsU3Vic2V0LAorICBlbnRpdHkwLCBlbnRpdHkxLCBlbnRpdHkyLCBlbnRpdHkzLCBlbnRpdHk0LCBlbnRpdHk1LCBlbnRpdHk2LAorICBlbnRpdHk3LCBlbnRpdHk4LCBlbnRpdHk5LCBlbnRpdHkxMCwKKyAgbm90YXRpb24wLCBub3RhdGlvbjEsIG5vdGF0aW9uMiwgbm90YXRpb24zLCBub3RhdGlvbjQsCisgIGF0dGxpc3QwLCBhdHRsaXN0MSwgYXR0bGlzdDIsIGF0dGxpc3QzLCBhdHRsaXN0NCwgYXR0bGlzdDUsIGF0dGxpc3Q2LAorICBhdHRsaXN0NywgYXR0bGlzdDgsIGF0dGxpc3Q5LAorICBlbGVtZW50MCwgZWxlbWVudDEsIGVsZW1lbnQyLCBlbGVtZW50MywgZWxlbWVudDQsIGVsZW1lbnQ1LCBlbGVtZW50NiwKKyAgZWxlbWVudDcsCisjaWZkZWYgWE1MX0RURAorICBleHRlcm5hbFN1YnNldDAsIGV4dGVybmFsU3Vic2V0MSwKKyAgY29uZFNlY3QwLCBjb25kU2VjdDEsIGNvbmRTZWN0MiwKKyNlbmRpZiAvKiBYTUxfRFREICovCisgIGRlY2xDbG9zZSwKKyAgZXJyb3I7CisKK3N0YXRpYyBpbnQgRkFTVENBTEwgY29tbW9uKFBST0xPR19TVEFURSAqc3RhdGUsIGludCB0b2spOworCitzdGF0aWMgaW50IFBUUkNBTEwKK3Byb2xvZzAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzE7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19YTUxfREVDTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzE7CisgICAgcmV0dXJuIFhNTF9ST0xFX1hNTF9ERUNMOworICBjYXNlIFhNTF9UT0tfUEk6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cxOworICAgIHJldHVybiBYTUxfUk9MRV9QSTsKKyAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cxOworICAgIHJldHVybiBYTUxfUk9MRV9DT01NRU5UOworICBjYXNlIFhNTF9UT0tfQk9NOgorICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICBjYXNlIFhNTF9UT0tfREVDTF9PUEVOOgorICAgIGlmICghWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIDIgKiBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19ET0NUWVBFKSkKKyAgICAgIGJyZWFrOworICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTA7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0lOU1RBTkNFX1NUQVJUOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZXJyb3I7CisgICAgcmV0dXJuIFhNTF9ST0xFX0lOU1RBTkNFX1NUQVJUOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorcHJvbG9nMShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICBjYXNlIFhNTF9UT0tfUEk6CisgICAgcmV0dXJuIFhNTF9ST0xFX1BJOworICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09NTUVOVDsKKyAgY2FzZSBYTUxfVE9LX0JPTToKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfT1BFTjoKKyAgICBpZiAoIVhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKyAyICogTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dfRE9DVFlQRSkpCisgICAgICBicmVhazsKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUwOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19JTlNUQU5DRV9TVEFSVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVycm9yOworICAgIHJldHVybiBYTUxfUk9MRV9JTlNUQU5DRV9TVEFSVDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK3Byb2xvZzIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX1BJOgorICAgIHJldHVybiBYTUxfUk9MRV9QSTsKKyAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTU1FTlQ7CisgIGNhc2UgWE1MX1RPS19JTlNUQU5DRV9TVEFSVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVycm9yOworICAgIHJldHVybiBYTUxfUk9MRV9JTlNUQU5DRV9TVEFSVDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2RvY3R5cGUwKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUxOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05BTUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitkb2N0eXBlMShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRE9DVFlQRV9OT05FOworICBjYXNlIFhNTF9UT0tfT1BFTl9CUkFDS0VUOgorICAgIHN0YXRlLT5oYW5kbGVyID0gaW50ZXJuYWxTdWJzZXQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzI7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfQ0xPU0U7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX1NZU1RFTSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTM7CisgICAgICByZXR1cm4gWE1MX1JPTEVfRE9DVFlQRV9OT05FOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19QVUJMSUMpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUyOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitkb2N0eXBlMihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRE9DVFlQRV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUzOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX1BVQkxJQ19JRDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2RvY3R5cGUzKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19MSVRFUkFMOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZG9jdHlwZTQoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX09QRU5fQlJBQ0tFVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGludGVybmFsU3Vic2V0OworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cyOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX0NMT1NFOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZG9jdHlwZTUoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cyOworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX0NMT1NFOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAoraW50ZXJuYWxTdWJzZXQoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19ERUNMX09QRU46CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIDIgKiBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dfRU5USVRZKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkwOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgMiAqIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19BVFRMSVNUKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0MDsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgICAgfQorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKyAyICogTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXX0VMRU1FTlQpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQwOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIDIgKiBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dfTk9UQVRJT04pKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uMDsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX1BJOgorICAgIHJldHVybiBYTUxfUk9MRV9QSTsKKyAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTU1FTlQ7CisgIGNhc2UgWE1MX1RPS19QQVJBTV9FTlRJVFlfUkVGOgorICAgIHJldHVybiBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfUkVGOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfQlJBQ0tFVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGU1OworICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05PTkU7CisgIGNhc2UgWE1MX1RPS19OT05FOgorICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKKyNpZmRlZiBYTUxfRFRECisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZXh0ZXJuYWxTdWJzZXQwKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN0YXRlLT5oYW5kbGVyID0gZXh0ZXJuYWxTdWJzZXQxOworICBpZiAodG9rID09IFhNTF9UT0tfWE1MX0RFQ0wpCisgICAgcmV0dXJuIFhNTF9ST0xFX1RFWFRfREVDTDsKKyAgcmV0dXJuIGV4dGVybmFsU3Vic2V0MShzdGF0ZSwgdG9rLCBwdHIsIGVuZCwgZW5jKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitleHRlcm5hbFN1YnNldDEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX0NPTkRfU0VDVF9PUEVOOgorICAgIHN0YXRlLT5oYW5kbGVyID0gY29uZFNlY3QwOworICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICBjYXNlIFhNTF9UT0tfQ09ORF9TRUNUX0NMT1NFOgorICAgIGlmIChzdGF0ZS0+aW5jbHVkZUxldmVsID09IDApCisgICAgICBicmVhazsKKyAgICBzdGF0ZS0+aW5jbHVkZUxldmVsIC09IDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX0JSQUNLRVQ6CisgICAgYnJlYWs7CisgIGNhc2UgWE1MX1RPS19OT05FOgorICAgIGlmIChzdGF0ZS0+aW5jbHVkZUxldmVsKQorICAgICAgYnJlYWs7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGludGVybmFsU3Vic2V0KHN0YXRlLCB0b2ssIHB0ciwgZW5kLCBlbmMpOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKKyNlbmRpZiAvKiBYTUxfRFREICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5MChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX1BFUkNFTlQ6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkxOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkyOworICAgIHJldHVybiBYTUxfUk9MRV9HRU5FUkFMX0VOVElUWV9OQU1FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5MShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHk3OworICAgIHJldHVybiBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfTkFNRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VudGl0eTIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX1NZU1RFTSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5NDsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfUFVCTElDKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkzOworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfVkFMVUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHkzKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9QVUJMSUNfSUQ7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk0KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTU7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9TWVNURU1fSUQ7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk1KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzZXRUb3BMZXZlbChzdGF0ZSk7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9DT01QTEVURTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfTkRBVEEpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTY7CisgICAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX05PTkU7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5NihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICBpbnQgdG9rLAorICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9UQVRJT05fTkFNRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VudGl0eTcoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgaW50IHRvaywKKyAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX1NZU1RFTSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5OTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfUFVCTElDKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHk4OworICAgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VOVElUWV9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfVkFMVUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk4KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTk7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9QVUJMSUNfSUQ7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbnRpdHk5KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgIGludCB0b2ssCisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTEwOworICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfU1lTVEVNX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZW50aXR5MTAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9OT05FOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzZXRUb3BMZXZlbChzdGF0ZSk7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9DT01QTEVURTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK25vdGF0aW9uMChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PVEFUSU9OX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIHN0YXRlLT5oYW5kbGVyID0gbm90YXRpb24xOworICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9OQU1FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorbm90YXRpb24xKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfU1lTVEVNKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBub3RhdGlvbjM7CisgICAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsIGVuZCwgS1dfUFVCTElDKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBub3RhdGlvbjI7CisgICAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitub3RhdGlvbjIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9OT05FOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uNDsKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fUFVCTElDX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorbm90YXRpb24zKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX05PVEFUSU9OX05PTkU7CisgICAgcmV0dXJuIFhNTF9ST0xFX05PVEFUSU9OX1NZU1RFTV9JRDsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK25vdGF0aW9uNChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PVEFUSU9OX05PTkU7CisgIGNhc2UgWE1MX1RPS19MSVRFUkFMOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgIHN0YXRlLT5yb2xlX25vbmUgPSBYTUxfUk9MRV9OT1RBVElPTl9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9TWVNURU1fSUQ7CisgIGNhc2UgWE1MX1RPS19ERUNMX0NMT1NFOgorICAgIHNldFRvcExldmVsKHN0YXRlKTsKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9fU1lTVEVNX0lEOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05BTUU6CisgIGNhc2UgWE1MX1RPS19QUkVGSVhFRF9OQU1FOgorICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfRUxFTUVOVF9OQU1FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6CisgICAgc2V0VG9wTGV2ZWwoc3RhdGUpOworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QyOworICAgIHJldHVybiBYTUxfUk9MRV9BVFRSSUJVVEVfTkFNRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2F0dGxpc3QyKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHlwZXNbXSA9IHsKKyAgICAgICAgS1dfQ0RBVEEsCisgICAgICAgIEtXX0lELAorICAgICAgICBLV19JRFJFRiwKKyAgICAgICAgS1dfSURSRUZTLAorICAgICAgICBLV19FTlRJVFksCisgICAgICAgIEtXX0VOVElUSUVTLAorICAgICAgICBLV19OTVRPS0VOLAorICAgICAgICBLV19OTVRPS0VOUywKKyAgICAgIH07CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YodHlwZXMpL3NpemVvZih0eXBlc1swXSkpOyBpKyspCisgICAgICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIHR5cGVzW2ldKSkgeworICAgICAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDg7CisgICAgICAgICAgcmV0dXJuIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0NEQVRBICsgaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19OT1RBVElPTikpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDU7CisgICAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBYTUxfVE9LX09QRU5fUEFSRU46CisgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0MzsKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDMoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX05NVE9LRU46CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q0OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRSSUJVVEVfRU5VTV9WQUxVRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2F0dGxpc3Q0KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q4OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19PUjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QzOworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCithdHRsaXN0NShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q2OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCithdHRsaXN0NihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q3OworICAgIHJldHVybiBYTUxfUk9MRV9BVFRSSUJVVEVfTk9UQVRJT05fVkFMVUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCithdHRsaXN0NyhQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU46CisgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0ODsKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICBjYXNlIFhNTF9UT0tfT1I6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0NjsKKyAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKKy8qIGRlZmF1bHQgdmFsdWUgKi8KK3N0YXRpYyBpbnQgUFRSQ0FMTAorYXR0bGlzdDgoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX1BPVU5EX05BTUU6CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19JTVBMSUVEKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0MTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9JTVBMSUVEX0FUVFJJQlVURV9WQUxVRTsKKyAgICB9CisgICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLV19SRVFVSVJFRCkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7CisgICAgICByZXR1cm4gWE1MX1JPTEVfUkVRVUlSRURfQVRUUklCVVRFX1ZBTFVFOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXX0ZJWEVEKSkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0OTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFhNTF9UT0tfTElURVJBTDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QxOworICAgIHJldHVybiBYTUxfUk9MRV9ERUZBVUxUX0FUVFJJQlVURV9WQUxVRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2F0dGxpc3Q5KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9BVFRMSVNUX05PTkU7CisgIGNhc2UgWE1MX1RPS19MSVRFUkFMOgorICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX0ZJWEVEX0FUVFJJQlVURV9WQUxVRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VsZW1lbnQwKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQxOworICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05BTUU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50MShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19FTVBUWSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VNUFRZOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19BTlkpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGRlY2xDbG9zZTsKKyAgICAgIHN0YXRlLT5yb2xlX25vbmUgPSBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgICAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9BTlk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQyOworICAgIHN0YXRlLT5sZXZlbCA9IDE7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX09QRU47CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50MihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfUE9VTkRfTkFNRToKKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICsgTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXX1BDREFUQSkpIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDM7CisgICAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9QQ0RBVEE7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKKyAgICBzdGF0ZS0+bGV2ZWwgPSAyOworICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDY7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX09QRU47CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OworICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlQ7CisgIGNhc2UgWE1MX1RPS19OQU1FX1FVRVNUSU9OOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9PUFQ7CisgIGNhc2UgWE1MX1RPS19OQU1FX0FTVEVSSVNLOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9SRVA7CisgIGNhc2UgWE1MX1RPS19OQU1FX1BMVVM6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NzsKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UX1BMVVM7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50MyhQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU46CisgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICByZXR1cm4gWE1MX1JPTEVfR1JPVVBfQ0xPU0U7CisgIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTl9BU1RFUklTSzoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGRlY2xDbG9zZTsKKyAgICBzdGF0ZS0+cm9sZV9ub25lID0gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVA7CisgIGNhc2UgWE1MX1RPS19PUjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ0OworICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlbGVtZW50NChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgaW50IHRvaywKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NTsKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZWxlbWVudDUoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgIHN0YXRlLT5yb2xlX25vbmUgPSBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1JFUDsKKyAgY2FzZSBYTUxfVE9LX09SOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDQ7CisgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2VsZW1lbnQ2KFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05PTkU7CisgIGNhc2UgWE1MX1RPS19PUEVOX1BBUkVOOgorICAgIHN0YXRlLT5sZXZlbCArPSAxOworICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9PUEVOOworICBjYXNlIFhNTF9UT0tfTkFNRToKKyAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NzsKKyAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UOworICBjYXNlIFhNTF9UT0tfTkFNRV9RVUVTVElPTjoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OworICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfT1BUOworICBjYXNlIFhNTF9UT0tfTkFNRV9BU1RFUklTSzoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OworICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUkVQOworICBjYXNlIFhNTF9UT0tfTkFNRV9QTFVTOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7CisgICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9QTFVTOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorZWxlbWVudDcoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgIGludCB0b2ssCisgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOOgorICAgIHN0YXRlLT5sZXZlbCAtPSAxOworICAgIGlmIChzdGF0ZS0+bGV2ZWwgPT0gMCkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgICBzdGF0ZS0+cm9sZV9ub25lID0gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICAgIH0KKyAgICByZXR1cm4gWE1MX1JPTEVfR1JPVVBfQ0xPU0U7CisgIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTl9BU1RFUklTSzoKKyAgICBzdGF0ZS0+bGV2ZWwgLT0gMTsKKyAgICBpZiAoc3RhdGUtPmxldmVsID09IDApIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1JFUDsKKyAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOX1FVRVNUSU9OOgorICAgIHN0YXRlLT5sZXZlbCAtPSAxOworICAgIGlmIChzdGF0ZS0+bGV2ZWwgPT0gMCkgeworICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7CisgICAgICBzdGF0ZS0+cm9sZV9ub25lID0gWE1MX1JPTEVfRUxFTUVOVF9OT05FOworICAgIH0KKyAgICByZXR1cm4gWE1MX1JPTEVfR1JPVVBfQ0xPU0VfT1BUOworICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUExVUzoKKyAgICBzdGF0ZS0+bGV2ZWwgLT0gMTsKKyAgICBpZiAoc3RhdGUtPmxldmVsID09IDApIHsKKyAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOworICAgICAgc3RhdGUtPnJvbGVfbm9uZSA9IFhNTF9ST0xFX0VMRU1FTlRfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1BMVVM7CisgIGNhc2UgWE1MX1RPS19DT01NQToKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ2OworICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9TRVFVRU5DRTsKKyAgY2FzZSBYTUxfVE9LX09SOgorICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDY7CisgICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NIT0lDRTsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCisjaWZkZWYgWE1MX0RURAorCitzdGF0aWMgaW50IFBUUkNBTEwKK2NvbmRTZWN0MChQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCBlbmQsIEtXX0lOQ0xVREUpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGNvbmRTZWN0MTsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICAgIH0KKyAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgZW5kLCBLV19JR05PUkUpKSB7CisgICAgICBzdGF0ZS0+aGFuZGxlciA9IGNvbmRTZWN0MjsKKyAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gY29tbW9uKHN0YXRlLCB0b2spOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2NvbmRTZWN0MShQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQoreworICBzd2l0Y2ggKHRvaykgeworICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6CisgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7CisgIGNhc2UgWE1MX1RPS19PUEVOX0JSQUNLRVQ6CisgICAgc3RhdGUtPmhhbmRsZXIgPSBleHRlcm5hbFN1YnNldDE7CisgICAgc3RhdGUtPmluY2x1ZGVMZXZlbCArPSAxOworICAgIHJldHVybiBYTUxfUk9MRV9OT05FOworICB9CisgIHJldHVybiBjb21tb24oc3RhdGUsIHRvayk7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorY29uZFNlY3QyKFBST0xPR19TVEFURSAqc3RhdGUsCisgICAgICAgICAgaW50IHRvaywKKyAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHN3aXRjaCAodG9rKSB7CisgIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKKyAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKKyAgY2FzZSBYTUxfVE9LX09QRU5fQlJBQ0tFVDoKKyAgICBzdGF0ZS0+aGFuZGxlciA9IGV4dGVybmFsU3Vic2V0MTsKKyAgICByZXR1cm4gWE1MX1JPTEVfSUdOT1JFX1NFQ1Q7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitkZWNsQ2xvc2UoUFJPTE9HX1NUQVRFICpzdGF0ZSwKKyAgICAgICAgICBpbnQgdG9rLAorICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKK3sKKyAgc3dpdGNoICh0b2spIHsKKyAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgorICAgIHJldHVybiBzdGF0ZS0+cm9sZV9ub25lOworICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKKyAgICBzZXRUb3BMZXZlbChzdGF0ZSk7CisgICAgcmV0dXJuIHN0YXRlLT5yb2xlX25vbmU7CisgIH0KKyAgcmV0dXJuIGNvbW1vbihzdGF0ZSwgdG9rKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitlcnJvcihQUk9MT0dfU1RBVEUgKnN0YXRlLAorICAgICAgaW50IHRvaywKKyAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCit7CisgIHJldHVybiBYTUxfUk9MRV9OT05FOworfQorCitzdGF0aWMgaW50IEZBU1RDQUxMCitjb21tb24oUFJPTE9HX1NUQVRFICpzdGF0ZSwgaW50IHRvaykKK3sKKyNpZmRlZiBYTUxfRFRECisgIGlmICghc3RhdGUtPmRvY3VtZW50RW50aXR5ICYmIHRvayA9PSBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUYpCisgICAgcmV0dXJuIFhNTF9ST0xFX0lOTkVSX1BBUkFNX0VOVElUWV9SRUY7CisjZW5kaWYKKyAgc3RhdGUtPmhhbmRsZXIgPSBlcnJvcjsKKyAgcmV0dXJuIFhNTF9ST0xFX0VSUk9SOworfQorCit2b2lkCitYbWxQcm9sb2dTdGF0ZUluaXQoUFJPTE9HX1NUQVRFICpzdGF0ZSkKK3sKKyAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cwOworI2lmZGVmIFhNTF9EVEQKKyAgc3RhdGUtPmRvY3VtZW50RW50aXR5ID0gMTsKKyAgc3RhdGUtPmluY2x1ZGVMZXZlbCA9IDA7CisgIHN0YXRlLT5pbkVudGl0eVZhbHVlID0gMDsKKyNlbmRpZiAvKiBYTUxfRFREICovCit9CisKKyNpZmRlZiBYTUxfRFRECisKK3ZvaWQKK1htbFByb2xvZ1N0YXRlSW5pdEV4dGVybmFsRW50aXR5KFBST0xPR19TVEFURSAqc3RhdGUpCit7CisgIHN0YXRlLT5oYW5kbGVyID0gZXh0ZXJuYWxTdWJzZXQwOworICBzdGF0ZS0+ZG9jdW1lbnRFbnRpdHkgPSAwOworICBzdGF0ZS0+aW5jbHVkZUxldmVsID0gMDsKK30KKworI2VuZGlmIC8qIFhNTF9EVEQgKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi94bWxyb2xlLmggYi9leHBhdC0yLjAuMS9saWIveG1scm9sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkZDlmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1scm9sZS5oCkBAIC0wLDAgKzEsMTE0IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2lmbmRlZiBYbWxSb2xlX0lOQ0xVREVECisjZGVmaW5lIFhtbFJvbGVfSU5DTFVERUQgMQorCisjaWZkZWYgX19WTVMKKy8qICAgICAgMCAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAgICAgMCAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzCisgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEgICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEgKi8KKyNkZWZpbmUgWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnRpdHkgICAgWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnQKKyNlbmRpZgorCisjaW5jbHVkZSAieG1sdG9rLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSB7CisgIFhNTF9ST0xFX0VSUk9SID0gLTEsCisgIFhNTF9ST0xFX05PTkUgPSAwLAorICBYTUxfUk9MRV9YTUxfREVDTCwKKyAgWE1MX1JPTEVfSU5TVEFOQ0VfU1RBUlQsCisgIFhNTF9ST0xFX0RPQ1RZUEVfTk9ORSwKKyAgWE1MX1JPTEVfRE9DVFlQRV9OQU1FLAorICBYTUxfUk9MRV9ET0NUWVBFX1NZU1RFTV9JRCwKKyAgWE1MX1JPTEVfRE9DVFlQRV9QVUJMSUNfSUQsCisgIFhNTF9ST0xFX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VULAorICBYTUxfUk9MRV9ET0NUWVBFX0NMT1NFLAorICBYTUxfUk9MRV9HRU5FUkFMX0VOVElUWV9OQU1FLAorICBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfTkFNRSwKKyAgWE1MX1JPTEVfRU5USVRZX05PTkUsCisgIFhNTF9ST0xFX0VOVElUWV9WQUxVRSwKKyAgWE1MX1JPTEVfRU5USVRZX1NZU1RFTV9JRCwKKyAgWE1MX1JPTEVfRU5USVRZX1BVQkxJQ19JRCwKKyAgWE1MX1JPTEVfRU5USVRZX0NPTVBMRVRFLAorICBYTUxfUk9MRV9FTlRJVFlfTk9UQVRJT05fTkFNRSwKKyAgWE1MX1JPTEVfTk9UQVRJT05fTk9ORSwKKyAgWE1MX1JPTEVfTk9UQVRJT05fTkFNRSwKKyAgWE1MX1JPTEVfTk9UQVRJT05fU1lTVEVNX0lELAorICBYTUxfUk9MRV9OT1RBVElPTl9OT19TWVNURU1fSUQsCisgIFhNTF9ST0xFX05PVEFUSU9OX1BVQkxJQ19JRCwKKyAgWE1MX1JPTEVfQVRUUklCVVRFX05BTUUsCisgIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0NEQVRBLAorICBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9JRCwKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfSURSRUYsCisgIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0lEUkVGUywKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfRU5USVRZLAorICBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9FTlRJVElFUywKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfTk1UT0tFTiwKKyAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfTk1UT0tFTlMsCisgIFhNTF9ST0xFX0FUVFJJQlVURV9FTlVNX1ZBTFVFLAorICBYTUxfUk9MRV9BVFRSSUJVVEVfTk9UQVRJT05fVkFMVUUsCisgIFhNTF9ST0xFX0FUVExJU1RfTk9ORSwKKyAgWE1MX1JPTEVfQVRUTElTVF9FTEVNRU5UX05BTUUsCisgIFhNTF9ST0xFX0lNUExJRURfQVRUUklCVVRFX1ZBTFVFLAorICBYTUxfUk9MRV9SRVFVSVJFRF9BVFRSSUJVVEVfVkFMVUUsCisgIFhNTF9ST0xFX0RFRkFVTFRfQVRUUklCVVRFX1ZBTFVFLAorICBYTUxfUk9MRV9GSVhFRF9BVFRSSUJVVEVfVkFMVUUsCisgIFhNTF9ST0xFX0VMRU1FTlRfTk9ORSwKKyAgWE1MX1JPTEVfRUxFTUVOVF9OQU1FLAorICBYTUxfUk9MRV9DT05URU5UX0FOWSwKKyAgWE1MX1JPTEVfQ09OVEVOVF9FTVBUWSwKKyAgWE1MX1JPTEVfQ09OVEVOVF9QQ0RBVEEsCisgIFhNTF9ST0xFX0dST1VQX09QRU4sCisgIFhNTF9ST0xFX0dST1VQX0NMT1NFLAorICBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVAsCisgIFhNTF9ST0xFX0dST1VQX0NMT1NFX09QVCwKKyAgWE1MX1JPTEVfR1JPVVBfQ0xPU0VfUExVUywKKyAgWE1MX1JPTEVfR1JPVVBfQ0hPSUNFLAorICBYTUxfUk9MRV9HUk9VUF9TRVFVRU5DRSwKKyAgWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5ULAorICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUkVQLAorICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfT1BULAorICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUExVUywKKyAgWE1MX1JPTEVfUEksCisgIFhNTF9ST0xFX0NPTU1FTlQsCisjaWZkZWYgWE1MX0RURAorICBYTUxfUk9MRV9URVhUX0RFQ0wsCisgIFhNTF9ST0xFX0lHTk9SRV9TRUNULAorICBYTUxfUk9MRV9JTk5FUl9QQVJBTV9FTlRJVFlfUkVGLAorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKyAgWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgcHJvbG9nX3N0YXRlIHsKKyAgaW50IChQVFJDQUxMICpoYW5kbGVyKSAoc3RydWN0IHByb2xvZ19zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jKTsKKyAgdW5zaWduZWQgbGV2ZWw7CisgIGludCByb2xlX25vbmU7CisjaWZkZWYgWE1MX0RURAorICB1bnNpZ25lZCBpbmNsdWRlTGV2ZWw7CisgIGludCBkb2N1bWVudEVudGl0eTsKKyAgaW50IGluRW50aXR5VmFsdWU7CisjZW5kaWYgLyogWE1MX0RURCAqLworfSBQUk9MT0dfU1RBVEU7CisKK3ZvaWQgWG1sUHJvbG9nU3RhdGVJbml0KFBST0xPR19TVEFURSAqKTsKKyNpZmRlZiBYTUxfRFRECit2b2lkIFhtbFByb2xvZ1N0YXRlSW5pdEV4dGVybmFsRW50aXR5KFBST0xPR19TVEFURSAqKTsKKyNlbmRpZiAvKiBYTUxfRFREICovCisKKyNkZWZpbmUgWG1sVG9rZW5Sb2xlKHN0YXRlLCB0b2ssIHB0ciwgZW5kLCBlbmMpIFwKKyAoKChzdGF0ZSktPmhhbmRsZXIpKHN0YXRlLCB0b2ssIHB0ciwgZW5kLCBlbmMpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbm90IFhtbFJvbGVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi94bWx0b2suYyBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2suYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjhhZmRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3htbHRvay5jCkBAIC0wLDAgKzEsMTY1MSBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmIENPTVBJTEVEX0ZST01fRFNQCisjaW5jbHVkZSAid2luY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCisjaW5jbHVkZSAibWFjY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKF9fYW1pZ2FvczRfXykKKyNpbmNsdWRlICJhbWlnYWNvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX1dBVENPTUNfXykKKyNpbmNsdWRlICJ3YXRjb21jb25maWcuaCIKKyNlbHNlCisjaWZkZWYgSEFWRV9FWFBBVF9DT05GSUdfSAorI2luY2x1ZGUgPGV4cGF0X2NvbmZpZy5oPgorI2VuZGlmCisjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLworCisjaW5jbHVkZSAiZXhwYXRfZXh0ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInhtbHRvay5oIgorI2luY2x1ZGUgIm5hbWV0YWIuaCIKKworI2lmZGVmIFhNTF9EVEQKKyNkZWZpbmUgSUdOT1JFX1NFQ1RJT05fVE9LX1ZUQUJMRSAsIFBSRUZJWChpZ25vcmVTZWN0aW9uVG9rKQorI2Vsc2UKKyNkZWZpbmUgSUdOT1JFX1NFQ1RJT05fVE9LX1ZUQUJMRSAvKiBhcyBub3RoaW5nICovCisjZW5kaWYKKworI2RlZmluZSBWVEFCTEUxIFwKKyAgeyBQUkVGSVgocHJvbG9nVG9rKSwgUFJFRklYKGNvbnRlbnRUb2spLCBcCisgICAgUFJFRklYKGNkYXRhU2VjdGlvblRvaykgSUdOT1JFX1NFQ1RJT05fVE9LX1ZUQUJMRSB9LCBcCisgIHsgUFJFRklYKGF0dHJpYnV0ZVZhbHVlVG9rKSwgUFJFRklYKGVudGl0eVZhbHVlVG9rKSB9LCBcCisgIFBSRUZJWChzYW1lTmFtZSksIFwKKyAgUFJFRklYKG5hbWVNYXRjaGVzQXNjaWkpLCBcCisgIFBSRUZJWChuYW1lTGVuZ3RoKSwgXAorICBQUkVGSVgoc2tpcFMpLCBcCisgIFBSRUZJWChnZXRBdHRzKSwgXAorICBQUkVGSVgoY2hhclJlZk51bWJlciksIFwKKyAgUFJFRklYKHByZWRlZmluZWRFbnRpdHlOYW1lKSwgXAorICBQUkVGSVgodXBkYXRlUG9zaXRpb24pLCBcCisgIFBSRUZJWChpc1B1YmxpY0lkKQorCisjZGVmaW5lIFZUQUJMRSBWVEFCTEUxLCBQUkVGSVgodG9VdGY4KSwgUFJFRklYKHRvVXRmMTYpCisKKyNkZWZpbmUgVUNTMl9HRVRfTkFNSU5HKHBhZ2VzLCBoaSwgbG8pIFwKKyAgIChuYW1pbmdCaXRtYXBbKHBhZ2VzW2hpXSA8PCAzKSArICgobG8pID4+IDUpXSAmICgxIDw8ICgobG8pICYgMHgxRikpKQorCisvKiBBIDIgYnl0ZSBVVEYtOCByZXByZXNlbnRhdGlvbiBzcGxpdHMgdGhlIGNoYXJhY3RlcnMgMTEgYml0cyBiZXR3ZWVuCisgICB0aGUgYm90dG9tIDUgYW5kIDYgYml0cyBvZiB0aGUgYnl0ZXMuICBXZSBuZWVkIDggYml0cyB0byBpbmRleCBpbnRvCisgICBwYWdlcywgMyBiaXRzIHRvIGFkZCB0byB0aGF0IGluZGV4IGFuZCA1IGJpdHMgdG8gZ2VuZXJhdGUgdGhlIG1hc2suCisqLworI2RlZmluZSBVVEY4X0dFVF9OQU1JTkcyKHBhZ2VzLCBieXRlKSBcCisgICAgKG5hbWluZ0JpdG1hcFsoKHBhZ2VzKVsoKChieXRlKVswXSkgPj4gMikgJiA3XSA8PCAzKSBcCisgICAgICAgICAgICAgICAgICAgICAgKyAoKCgoYnl0ZSlbMF0pICYgMykgPDwgMSkgXAorICAgICAgICAgICAgICAgICAgICAgICsgKCgoKGJ5dGUpWzFdKSA+PiA1KSAmIDEpXSBcCisgICAgICAgICAmICgxIDw8ICgoKGJ5dGUpWzFdKSAmIDB4MUYpKSkKKworLyogQSAzIGJ5dGUgVVRGLTggcmVwcmVzZW50YXRpb24gc3BsaXRzIHRoZSBjaGFyYWN0ZXJzIDE2IGJpdHMgYmV0d2VlbgorICAgdGhlIGJvdHRvbSA0LCA2IGFuZCA2IGJpdHMgb2YgdGhlIGJ5dGVzLiAgV2UgbmVlZCA4IGJpdHMgdG8gaW5kZXgKKyAgIGludG8gcGFnZXMsIDMgYml0cyB0byBhZGQgdG8gdGhhdCBpbmRleCBhbmQgNSBiaXRzIHRvIGdlbmVyYXRlIHRoZQorICAgbWFzay4KKyovCisjZGVmaW5lIFVURjhfR0VUX05BTUlORzMocGFnZXMsIGJ5dGUpIFwKKyAgKG5hbWluZ0JpdG1hcFsoKHBhZ2VzKVsoKCgoYnl0ZSlbMF0pICYgMHhGKSA8PCA0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoKGJ5dGUpWzFdKSA+PiAyKSAmIDB4RildIFwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgMykgXAorICAgICAgICAgICAgICAgICAgICAgICsgKCgoKGJ5dGUpWzFdKSAmIDMpIDw8IDEpIFwKKyAgICAgICAgICAgICAgICAgICAgICArICgoKChieXRlKVsyXSkgPj4gNSkgJiAxKV0gXAorICAgICAgICAgJiAoMSA8PCAoKChieXRlKVsyXSkgJiAweDFGKSkpCisKKyNkZWZpbmUgVVRGOF9HRVRfTkFNSU5HKHBhZ2VzLCBwLCBuKSBcCisgICgobikgPT0gMiBcCisgID8gVVRGOF9HRVRfTkFNSU5HMihwYWdlcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocCkpIFwKKyAgOiAoKG4pID09IDMgXAorICAgICA/IFVURjhfR0VUX05BTUlORzMocGFnZXMsIChjb25zdCB1bnNpZ25lZCBjaGFyICopKHApKSBcCisgICAgIDogMCkpCisKKy8qIERldGVjdGlvbiBvZiBpbnZhbGlkIFVURi04IHNlcXVlbmNlcyBpcyBiYXNlZCBvbiBUYWJsZSAzLjFCCisgICBvZiBVbmljb2RlIDMuMjogaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIyOC8KKyAgIHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gb2Ygbm90IGFsbG93aW5nIHRoZSBVbmljb2RlCisgICBjb2RlIHBvaW50cyAweEZGRkYgYW5kIDB4RkZGRSAoc2VxdWVuY2VzIEVGLEJGLEJGIGFuZCBFRixCRixCRSkuCisgICBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzOgorICAgICAoQSAmIDB4ODApID09IDAgICAgIG1lYW5zIEEgPCAweDgwCisgICBhbmQKKyAgICAgKEEgJiAweEMwKSA9PSAweEMwICBtZWFucyBBID4gMHhCRgorKi8KKworI2RlZmluZSBVVEY4X0lOVkFMSUQyKHApIFwKKyAgKCgqcCkgPCAweEMyIHx8ICgocClbMV0gJiAweDgwKSA9PSAwIHx8ICgocClbMV0gJiAweEMwKSA9PSAweEMwKQorCisjZGVmaW5lIFVURjhfSU5WQUxJRDMocCkgXAorICAoKChwKVsyXSAmIDB4ODApID09IDAgXAorICB8fCBcCisgICgoKnApID09IDB4RUYgJiYgKHApWzFdID09IDB4QkYgXAorICAgID8gXAorICAgIChwKVsyXSA+IDB4QkQgXAorICAgIDogXAorICAgICgocClbMl0gJiAweEMwKSA9PSAweEMwKSBcCisgIHx8IFwKKyAgKCgqcCkgPT0gMHhFMCBcCisgICAgPyBcCisgICAgKHApWzFdIDwgMHhBMCB8fCAoKHApWzFdICYgMHhDMCkgPT0gMHhDMCBcCisgICAgOiBcCisgICAgKChwKVsxXSAmIDB4ODApID09IDAgXAorICAgIHx8IFwKKyAgICAoKCpwKSA9PSAweEVEID8gKHApWzFdID4gMHg5RiA6ICgocClbMV0gJiAweEMwKSA9PSAweEMwKSkpCisKKyNkZWZpbmUgVVRGOF9JTlZBTElENChwKSBcCisgICgoKHApWzNdICYgMHg4MCkgPT0gMCB8fCAoKHApWzNdICYgMHhDMCkgPT0gMHhDMCBcCisgIHx8IFwKKyAgKChwKVsyXSAmIDB4ODApID09IDAgfHwgKChwKVsyXSAmIDB4QzApID09IDB4QzAgXAorICB8fCBcCisgICgoKnApID09IDB4RjAgXAorICAgID8gXAorICAgIChwKVsxXSA8IDB4OTAgfHwgKChwKVsxXSAmIDB4QzApID09IDB4QzAgXAorICAgIDogXAorICAgICgocClbMV0gJiAweDgwKSA9PSAwIFwKKyAgICB8fCBcCisgICAgKCgqcCkgPT0gMHhGNCA/IChwKVsxXSA+IDB4OEYgOiAoKHApWzFdICYgMHhDMCkgPT0gMHhDMCkpKQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitpc05ldmVyKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzTmFtZTIoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIFVURjhfR0VUX05BTUlORzIobmFtZVBhZ2VzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzTmFtZTMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIFVURjhfR0VUX05BTUlORzMobmFtZVBhZ2VzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCisjZGVmaW5lIHV0ZjhfaXNOYW1lNCBpc05ldmVyCisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3V0ZjhfaXNObXN0cnQyKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBVVEY4X0dFVF9OQU1JTkcyKG5tc3RydFBhZ2VzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzTm1zdHJ0Myhjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gVVRGOF9HRVRfTkFNSU5HMyhubXN0cnRQYWdlcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKK30KKworI2RlZmluZSB1dGY4X2lzTm1zdHJ0NCBpc05ldmVyCisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3V0ZjhfaXNJbnZhbGlkMihjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gVVRGOF9JTlZBTElEMigoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1dGY4X2lzSW52YWxpZDMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIFVURjhfSU5WQUxJRDMoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKK30KKworc3RhdGljIGludCBQVFJGQVNUQ0FMTAordXRmOF9pc0ludmFsaWQ0KGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBVVEY4X0lOVkFMSUQ0KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCk7Cit9CisKK3N0cnVjdCBub3JtYWxfZW5jb2RpbmcgeworICBFTkNPRElORyBlbmM7CisgIHVuc2lnbmVkIGNoYXIgdHlwZVsyNTZdOworI2lmZGVmIFhNTF9NSU5fU0laRQorICBpbnQgKFBUUkZBU1RDQUxMICpieXRlVHlwZSkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lTWluKShjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICopOworICBpbnQgKFBUUkZBU1RDQUxMICppc05tc3RydE1pbikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqYnl0ZVRvQXNjaWkpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKik7CisgIGludCAoUFRSQ0FMTCAqY2hhck1hdGNoZXMpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNlbmRpZiAvKiBYTUxfTUlOX1NJWkUgKi8KKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lMikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lMykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNOYW1lNCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNObXN0cnQyKShjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICopOworICBpbnQgKFBUUkZBU1RDQUxMICppc05tc3RydDMpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKik7CisgIGludCAoUFRSRkFTVENBTEwgKmlzTm1zdHJ0NCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNJbnZhbGlkMikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNJbnZhbGlkMykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqaXNJbnZhbGlkNCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKK307CisKKyNkZWZpbmUgQVNfTk9STUFMX0VOQ09ESU5HKGVuYykgICAoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikgKGVuYykpCisKKyNpZmRlZiBYTUxfTUlOX1NJWkUKKworI2RlZmluZSBTVEFOREFSRF9WVEFCTEUoRSkgXAorIEUgIyMgYnl0ZVR5cGUsIFwKKyBFICMjIGlzTmFtZU1pbiwgXAorIEUgIyMgaXNObXN0cnRNaW4sIFwKKyBFICMjIGJ5dGVUb0FzY2lpLCBcCisgRSAjIyBjaGFyTWF0Y2hlcywKKworI2Vsc2UKKworI2RlZmluZSBTVEFOREFSRF9WVEFCTEUoRSkgLyogYXMgbm90aGluZyAqLworCisjZW5kaWYKKworI2RlZmluZSBOT1JNQUxfVlRBQkxFKEUpIFwKKyBFICMjIGlzTmFtZTIsIFwKKyBFICMjIGlzTmFtZTMsIFwKKyBFICMjIGlzTmFtZTQsIFwKKyBFICMjIGlzTm1zdHJ0MiwgXAorIEUgIyMgaXNObXN0cnQzLCBcCisgRSAjIyBpc05tc3RydDQsIFwKKyBFICMjIGlzSW52YWxpZDIsIFwKKyBFICMjIGlzSW52YWxpZDMsIFwKKyBFICMjIGlzSW52YWxpZDQKKworc3RhdGljIGludCBGQVNUQ0FMTCBjaGVja0NoYXJSZWZOdW1iZXIoaW50KTsKKworI2luY2x1ZGUgInhtbHRva19pbXBsLmgiCisjaW5jbHVkZSAiYXNjaWkuaCIKKworI2lmZGVmIFhNTF9NSU5fU0laRQorI2RlZmluZSBzYl9pc05hbWVNaW4gaXNOZXZlcgorI2RlZmluZSBzYl9pc05tc3RydE1pbiBpc05ldmVyCisjZW5kaWYKKworI2lmZGVmIFhNTF9NSU5fU0laRQorI2RlZmluZSBNSU5CUEMoZW5jKSAoKGVuYyktPm1pbkJ5dGVzUGVyQ2hhcikKKyNlbHNlCisvKiBtaW5pbXVtIGJ5dGVzIHBlciBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgTUlOQlBDKGVuYykgMQorI2VuZGlmCisKKyNkZWZpbmUgU0JfQllURV9UWVBFKGVuYywgcCkgXAorICAoKChzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nICopKGVuYykpLT50eXBlWyh1bnNpZ25lZCBjaGFyKSoocCldKQorCisjaWZkZWYgWE1MX01JTl9TSVpFCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitzYl9ieXRlVHlwZShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gU0JfQllURV9UWVBFKGVuYywgcCk7Cit9CisjZGVmaW5lIEJZVEVfVFlQRShlbmMsIHApIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmJ5dGVUeXBlKGVuYywgcCkpCisjZWxzZQorI2RlZmluZSBCWVRFX1RZUEUoZW5jLCBwKSBTQl9CWVRFX1RZUEUoZW5jLCBwKQorI2VuZGlmCisKKyNpZmRlZiBYTUxfTUlOX1NJWkUKKyNkZWZpbmUgQllURV9UT19BU0NJSShlbmMsIHApIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmJ5dGVUb0FzY2lpKGVuYywgcCkpCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitzYl9ieXRlVG9Bc2NpaShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gKnA7Cit9CisjZWxzZQorI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgKCoocCkpCisjZW5kaWYKKworI2RlZmluZSBJU19OQU1FX0NIQVIoZW5jLCBwLCBuKSBcCisgKEFTX05PUk1BTF9FTkNPRElORyhlbmMpLT5pc05hbWUgIyMgbihlbmMsIHApKQorI2RlZmluZSBJU19OTVNUUlRfQ0hBUihlbmMsIHAsIG4pIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmlzTm1zdHJ0ICMjIG4oZW5jLCBwKSkKKyNkZWZpbmUgSVNfSU5WQUxJRF9DSEFSKGVuYywgcCwgbikgXAorIChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+aXNJbnZhbGlkICMjIG4oZW5jLCBwKSkKKworI2lmZGVmIFhNTF9NSU5fU0laRQorI2RlZmluZSBJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgXAorIChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+aXNOYW1lTWluKGVuYywgcCkpCisjZGVmaW5lIElTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIFwKKyAoQVNfTk9STUFMX0VOQ09ESU5HKGVuYyktPmlzTm1zdHJ0TWluKGVuYywgcCkpCisjZWxzZQorI2RlZmluZSBJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgKDApCisjZGVmaW5lIElTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApICgwKQorI2VuZGlmCisKKyNpZmRlZiBYTUxfTUlOX1NJWkUKKyNkZWZpbmUgQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykgXAorIChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+Y2hhck1hdGNoZXMoZW5jLCBwLCBjKSkKK3N0YXRpYyBpbnQgUFRSQ0FMTAorc2JfY2hhck1hdGNoZXMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCwgaW50IGMpCit7CisgIHJldHVybiAqcCA9PSBjOworfQorI2Vsc2UKKy8qIGMgaXMgYW4gQVNDSUkgY2hhcmFjdGVyICovCisjZGVmaW5lIENIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpICgqKHApID09IGMpCisjZW5kaWYKKworI2RlZmluZSBQUkVGSVgoaWRlbnQpIG5vcm1hbF8gIyMgaWRlbnQKKyNkZWZpbmUgWE1MX1RPS19JTVBMX0MKKyNpbmNsdWRlICJ4bWx0b2tfaW1wbC5jIgorI3VuZGVmIFhNTF9UT0tfSU1QTF9DCisKKyN1bmRlZiBNSU5CUEMKKyN1bmRlZiBCWVRFX1RZUEUKKyN1bmRlZiBCWVRFX1RPX0FTQ0lJCisjdW5kZWYgQ0hBUl9NQVRDSEVTCisjdW5kZWYgSVNfTkFNRV9DSEFSCisjdW5kZWYgSVNfTkFNRV9DSEFSX01JTkJQQworI3VuZGVmIElTX05NU1RSVF9DSEFSCisjdW5kZWYgSVNfTk1TVFJUX0NIQVJfTUlOQlBDCisjdW5kZWYgSVNfSU5WQUxJRF9DSEFSCisKK2VudW0geyAgLyogVVRGOF9jdmFsTiBpcyB2YWx1ZSBvZiBtYXNrZWQgZmlyc3QgYnl0ZSBvZiBOIGJ5dGUgc2VxdWVuY2UgKi8KKyAgVVRGOF9jdmFsMSA9IDB4MDAsCisgIFVURjhfY3ZhbDIgPSAweGMwLAorICBVVEY4X2N2YWwzID0gMHhlMCwKKyAgVVRGOF9jdmFsNCA9IDB4ZjAKK307CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK3V0ZjhfdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICBjb25zdCBjaGFyICoqZnJvbVAsIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICBjaGFyICoqdG9QLCBjb25zdCBjaGFyICp0b0xpbSkKK3sKKyAgY2hhciAqdG87CisgIGNvbnN0IGNoYXIgKmZyb207CisgIGlmIChmcm9tTGltIC0gKmZyb21QID4gdG9MaW0gLSAqdG9QKSB7CisgICAgLyogQXZvaWQgY29weWluZyBwYXJ0aWFsIGNoYXJhY3RlcnMuICovCisgICAgZm9yIChmcm9tTGltID0gKmZyb21QICsgKHRvTGltIC0gKnRvUCk7IGZyb21MaW0gPiAqZnJvbVA7IGZyb21MaW0tLSkKKyAgICAgIGlmICgoKHVuc2lnbmVkIGNoYXIpZnJvbUxpbVstMV0gJiAweGMwKSAhPSAweDgwKQorICAgICAgICBicmVhazsKKyAgfQorICBmb3IgKHRvID0gKnRvUCwgZnJvbSA9ICpmcm9tUDsgZnJvbSAhPSBmcm9tTGltOyBmcm9tKyssIHRvKyspCisgICAgKnRvID0gKmZyb207CisgICpmcm9tUCA9IGZyb207CisgICp0b1AgPSB0bzsKK30KKworc3RhdGljIHZvaWQgUFRSQ0FMTAordXRmOF90b1V0ZjE2KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICoqdG9QLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqdG9MaW0pCit7CisgIHVuc2lnbmVkIHNob3J0ICp0byA9ICp0b1A7CisgIGNvbnN0IGNoYXIgKmZyb20gPSAqZnJvbVA7CisgIHdoaWxlIChmcm9tICE9IGZyb21MaW0gJiYgdG8gIT0gdG9MaW0pIHsKKyAgICBzd2l0Y2ggKCgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKWVuYyktPnR5cGVbKHVuc2lnbmVkIGNoYXIpKmZyb21dKSB7CisgICAgY2FzZSBCVF9MRUFEMjoKKyAgICAgICp0bysrID0gKHVuc2lnbmVkIHNob3J0KSgoKGZyb21bMF0gJiAweDFmKSA8PCA2KSB8IChmcm9tWzFdICYgMHgzZikpOworICAgICAgZnJvbSArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9MRUFEMzoKKyAgICAgICp0bysrID0gKHVuc2lnbmVkIHNob3J0KSgoKGZyb21bMF0gJiAweGYpIDw8IDEyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChmcm9tWzFdICYgMHgzZikgPDwgNikgfCAoZnJvbVsyXSAmIDB4M2YpKTsKKyAgICAgIGZyb20gKz0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfTEVBRDQ6CisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbjsKKyAgICAgICAgaWYgKHRvICsgMSA9PSB0b0xpbSkKKyAgICAgICAgICBnb3RvIGFmdGVyOworICAgICAgICBuID0gKChmcm9tWzBdICYgMHg3KSA8PCAxOCkgfCAoKGZyb21bMV0gJiAweDNmKSA8PCAxMikKKyAgICAgICAgICAgIHwgKChmcm9tWzJdICYgMHgzZikgPDwgNikgfCAoZnJvbVszXSAmIDB4M2YpOworICAgICAgICBuIC09IDB4MTAwMDA7CisgICAgICAgIHRvWzBdID0gKHVuc2lnbmVkIHNob3J0KSgobiA+PiAxMCkgfCAweEQ4MDApOworICAgICAgICB0b1sxXSA9ICh1bnNpZ25lZCBzaG9ydCkoKG4gJiAweDNGRikgfCAweERDMDApOworICAgICAgICB0byArPSAyOworICAgICAgICBmcm9tICs9IDQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKnRvKysgPSAqZnJvbSsrOworICAgICAgYnJlYWs7CisgICAgfQorICB9CithZnRlcjoKKyAgKmZyb21QID0gZnJvbTsKKyAgKnRvUCA9IHRvOworfQorCisjaWZkZWYgWE1MX05TCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyB1dGY4X2VuY29kaW5nX25zID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2luY2x1ZGUgImFzY2lpdGFiLmgiCisjaW5jbHVkZSAidXRmOHRhYi5oIgorICB9LAorICBTVEFOREFSRF9WVEFCTEUoc2JfKSBOT1JNQUxfVlRBQkxFKHV0ZjhfKQorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyB1dGY4X2VuY29kaW5nID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorI3VuZGVmIEJUX0NPTE9OCisjaW5jbHVkZSAidXRmOHRhYi5oIgorICB9LAorICBTVEFOREFSRF9WVEFCTEUoc2JfKSBOT1JNQUxfVlRBQkxFKHV0ZjhfKQorfTsKKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBpbnRlcm5hbF91dGY4X2VuY29kaW5nX25zID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2luY2x1ZGUgImlhc2NpaXRhYi5oIgorI2luY2x1ZGUgInV0Zjh0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykgTk9STUFMX1ZUQUJMRSh1dGY4XykKK307CisKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBpbnRlcm5hbF91dGY4X2VuY29kaW5nID0geworICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJpYXNjaWl0YWIuaCIKKyN1bmRlZiBCVF9DT0xPTgorI2luY2x1ZGUgInV0Zjh0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykgTk9STUFMX1ZUQUJMRSh1dGY4XykKK307CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK2xhdGluMV90b1V0ZjgoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgICBjaGFyICoqdG9QLCBjb25zdCBjaGFyICp0b0xpbSkKK3sKKyAgZm9yICg7OykgeworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBpZiAoKmZyb21QID09IGZyb21MaW0pCisgICAgICBicmVhazsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpKipmcm9tUDsKKyAgICBpZiAoYyAmIDB4ODApIHsKKyAgICAgIGlmICh0b0xpbSAtICp0b1AgPCAyKQorICAgICAgICBicmVhazsKKyAgICAgICooKnRvUCkrKyA9IChjaGFyKSgoYyA+PiA2KSB8IFVURjhfY3ZhbDIpOworICAgICAgKigqdG9QKSsrID0gKGNoYXIpKChjICYgMHgzZikgfCAweDgwKTsKKyAgICAgICgqZnJvbVApKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCp0b1AgPT0gdG9MaW0pCisgICAgICAgIGJyZWFrOworICAgICAgKigqdG9QKSsrID0gKigqZnJvbVApKys7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK2xhdGluMV90b1V0ZjE2KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZnJvbVAsIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKQoreworICB3aGlsZSAoKmZyb21QICE9IGZyb21MaW0gJiYgKnRvUCAhPSB0b0xpbSkKKyAgICAqKCp0b1ApKysgPSAodW5zaWduZWQgY2hhcikqKCpmcm9tUCkrKzsKK30KKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBsYXRpbjFfZW5jb2RpbmdfbnMgPSB7CisgIHsgVlRBQkxFMSwgbGF0aW4xX3RvVXRmOCwgbGF0aW4xX3RvVXRmMTYsIDEsIDAsIDAgfSwKKyAgeworI2luY2x1ZGUgImFzY2lpdGFiLmgiCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShzYl8pCit9OworCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgbGF0aW4xX2VuY29kaW5nID0geworICB7IFZUQUJMRTEsIGxhdGluMV90b1V0ZjgsIGxhdGluMV90b1V0ZjE2LCAxLCAwLCAwIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiYXNjaWl0YWIuaCIKKyN1bmRlZiBCVF9DT0xPTgorI2luY2x1ZGUgImxhdGluMXRhYi5oIgorICB9LAorICBTVEFOREFSRF9WVEFCTEUoc2JfKQorfTsKKworc3RhdGljIHZvaWQgUFRSQ0FMTAorYXNjaWlfdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgIGNoYXIgKip0b1AsIGNvbnN0IGNoYXIgKnRvTGltKQoreworICB3aGlsZSAoKmZyb21QICE9IGZyb21MaW0gJiYgKnRvUCAhPSB0b0xpbSkKKyAgICAqKCp0b1ApKysgPSAqKCpmcm9tUCkrKzsKK30KKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBhc2NpaV9lbmNvZGluZ19ucyA9IHsKKyAgeyBWVEFCTEUxLCBhc2NpaV90b1V0ZjgsIGxhdGluMV90b1V0ZjE2LCAxLCAxLCAwIH0sCisgIHsKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorLyogQlRfTk9OWE1MID09IDAgKi8KKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykKK307CisKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBhc2NpaV9lbmNvZGluZyA9IHsKKyAgeyBWVEFCTEUxLCBhc2NpaV90b1V0ZjgsIGxhdGluMV90b1V0ZjE2LCAxLCAxLCAwIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiYXNjaWl0YWIuaCIKKyN1bmRlZiBCVF9DT0xPTgorLyogQlRfTk9OWE1MID09IDAgKi8KKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKHNiXykKK307CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3VuaWNvZGVfYnl0ZV90eXBlKGNoYXIgaGksIGNoYXIgbG8pCit7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpaGkpIHsKKyAgY2FzZSAweEQ4OiBjYXNlIDB4RDk6IGNhc2UgMHhEQTogY2FzZSAweERCOgorICAgIHJldHVybiBCVF9MRUFENDsKKyAgY2FzZSAweERDOiBjYXNlIDB4REQ6IGNhc2UgMHhERTogY2FzZSAweERGOgorICAgIHJldHVybiBCVF9UUkFJTDsKKyAgY2FzZSAweEZGOgorICAgIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpbG8pIHsKKyAgICBjYXNlIDB4RkY6CisgICAgY2FzZSAweEZFOgorICAgICAgcmV0dXJuIEJUX05PTlhNTDsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEJUX05PTkFTQ0lJOworfQorCisjZGVmaW5lIERFRklORV9VVEYxNl9UT19VVEY4KEUpIFwKK3N0YXRpYyB2b2lkICBQVFJDQUxMIFwKK0UgIyMgdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsIFwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwgXAorICAgICAgICAgICAgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pIFwKK3sgXAorICBjb25zdCBjaGFyICpmcm9tOyBcCisgIGZvciAoZnJvbSA9ICpmcm9tUDsgZnJvbSAhPSBmcm9tTGltOyBmcm9tICs9IDIpIHsgXAorICAgIGludCBwbGFuZTsgXAorICAgIHVuc2lnbmVkIGNoYXIgbG8yOyBcCisgICAgdW5zaWduZWQgY2hhciBsbyA9IEdFVF9MTyhmcm9tKTsgXAorICAgIHVuc2lnbmVkIGNoYXIgaGkgPSBHRVRfSEkoZnJvbSk7IFwKKyAgICBzd2l0Y2ggKGhpKSB7IFwKKyAgICBjYXNlIDA6IFwKKyAgICAgIGlmIChsbyA8IDB4ODApIHsgXAorICAgICAgICBpZiAoKnRvUCA9PSB0b0xpbSkgeyBcCisgICAgICAgICAgKmZyb21QID0gZnJvbTsgXAorICAgICAgICAgIHJldHVybjsgXAorICAgICAgICB9IFwKKyAgICAgICAgKigqdG9QKSsrID0gbG87IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICAgIH0gXAorICAgICAgLyogZmFsbCB0aHJvdWdoICovIFwKKyAgICBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOiBcCisgICAgY2FzZSAweDQ6IGNhc2UgMHg1OiBjYXNlIDB4NjogY2FzZSAweDc6IFwKKyAgICAgIGlmICh0b0xpbSAtICAqdG9QIDwgMikgeyBcCisgICAgICAgICpmcm9tUCA9IGZyb207IFwKKyAgICAgICAgcmV0dXJuOyBcCisgICAgICB9IFwKKyAgICAgICooKnRvUCkrKyA9ICgobG8gPj4gNikgfCAoaGkgPDwgMikgfCAgVVRGOF9jdmFsMik7IFwKKyAgICAgICooKnRvUCkrKyA9ICgobG8gJiAweDNmKSB8IDB4ODApOyBcCisgICAgICBicmVhazsgXAorICAgIGRlZmF1bHQ6IFwKKyAgICAgIGlmICh0b0xpbSAtICAqdG9QIDwgMykgIHsgXAorICAgICAgICAqZnJvbVAgPSBmcm9tOyBcCisgICAgICAgIHJldHVybjsgXAorICAgICAgfSBcCisgICAgICAvKiAxNiBiaXRzIGRpdmlkZWQgNCwgNiwgNiBhbW9uZ3N0IDMgYnl0ZXMgKi8gXAorICAgICAgKigqdG9QKSsrID0gKChoaSA+PiA0KSB8IFVURjhfY3ZhbDMpOyBcCisgICAgICAqKCp0b1ApKysgPSAoKChoaSAmIDB4ZikgPDwgMikgfCAobG8gPj4gNikgfCAweDgwKTsgXAorICAgICAgKigqdG9QKSsrID0gKChsbyAmIDB4M2YpIHwgMHg4MCk7IFwKKyAgICAgIGJyZWFrOyBcCisgICAgY2FzZSAweEQ4OiBjYXNlIDB4RDk6IGNhc2UgMHhEQTogY2FzZSAweERCOiBcCisgICAgICBpZiAodG9MaW0gLSAgKnRvUCA8IDQpIHsgXAorICAgICAgICAqZnJvbVAgPSBmcm9tOyBcCisgICAgICAgIHJldHVybjsgXAorICAgICAgfSBcCisgICAgICBwbGFuZSA9ICgoKGhpICYgMHgzKSA8PCAyKSB8ICgobG8gPj4gNikgJiAweDMpKSArIDE7IFwKKyAgICAgICooKnRvUCkrKyA9ICgocGxhbmUgPj4gMikgfCBVVEY4X2N2YWw0KTsgXAorICAgICAgKigqdG9QKSsrID0gKCgobG8gPj4gMikgJiAweEYpIHwgKChwbGFuZSAmIDB4MykgPDwgNCkgfCAweDgwKTsgXAorICAgICAgZnJvbSArPSAyOyBcCisgICAgICBsbzIgPSBHRVRfTE8oZnJvbSk7IFwKKyAgICAgICooKnRvUCkrKyA9ICgoKGxvICYgMHgzKSA8PCA0KSBcCisgICAgICAgICAgICAgICAgICAgfCAoKEdFVF9ISShmcm9tKSAmIDB4MykgPDwgMikgXAorICAgICAgICAgICAgICAgICAgIHwgKGxvMiA+PiA2KSBcCisgICAgICAgICAgICAgICAgICAgfCAweDgwKTsgXAorICAgICAgKigqdG9QKSsrID0gKChsbzIgJiAweDNmKSB8IDB4ODApOyBcCisgICAgICBicmVhazsgXAorICAgIH0gXAorICB9IFwKKyAgKmZyb21QID0gZnJvbTsgXAorfQorCisjZGVmaW5lIERFRklORV9VVEYxNl9UT19VVEYxNihFKSBcCitzdGF0aWMgdm9pZCAgUFRSQ0FMTCBcCitFICMjIHRvVXRmMTYoY29uc3QgRU5DT0RJTkcgKmVuYywgXAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwgXAorICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICoqdG9QLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqdG9MaW0pIFwKK3sgXAorICAvKiBBdm9pZCBjb3B5aW5nIGZpcnN0IGhhbGYgb25seSBvZiBzdXJyb2dhdGUgKi8gXAorICBpZiAoZnJvbUxpbSAtICpmcm9tUCA+ICgodG9MaW0gLSAqdG9QKSA8PCAxKSBcCisgICAgICAmJiAoR0VUX0hJKGZyb21MaW0gLSAyKSAmIDB4RjgpID09IDB4RDgpIFwKKyAgICBmcm9tTGltIC09IDI7IFwKKyAgZm9yICg7ICpmcm9tUCAhPSBmcm9tTGltICYmICp0b1AgIT0gdG9MaW07ICpmcm9tUCArPSAyKSBcCisgICAgKigqdG9QKSsrID0gKEdFVF9ISSgqZnJvbVApIDw8IDgpIHwgR0VUX0xPKCpmcm9tUCk7IFwKK30KKworI2RlZmluZSBTRVQyKHB0ciwgY2gpIFwKKyAgKCgocHRyKVswXSA9ICgoY2gpICYgMHhmZikpLCAoKHB0cilbMV0gPSAoKGNoKSA+PiA4KSkpCisjZGVmaW5lIEdFVF9MTyhwdHIpICgodW5zaWduZWQgY2hhcikocHRyKVswXSkKKyNkZWZpbmUgR0VUX0hJKHB0cikgKCh1bnNpZ25lZCBjaGFyKShwdHIpWzFdKQorCitERUZJTkVfVVRGMTZfVE9fVVRGOChsaXR0bGUyXykKK0RFRklORV9VVEYxNl9UT19VVEYxNihsaXR0bGUyXykKKworI3VuZGVmIFNFVDIKKyN1bmRlZiBHRVRfTE8KKyN1bmRlZiBHRVRfSEkKKworI2RlZmluZSBTRVQyKHB0ciwgY2gpIFwKKyAgKCgocHRyKVswXSA9ICgoY2gpID4+IDgpKSwgKChwdHIpWzFdID0gKChjaCkgJiAweEZGKSkpCisjZGVmaW5lIEdFVF9MTyhwdHIpICgodW5zaWduZWQgY2hhcikocHRyKVsxXSkKKyNkZWZpbmUgR0VUX0hJKHB0cikgKCh1bnNpZ25lZCBjaGFyKShwdHIpWzBdKQorCitERUZJTkVfVVRGMTZfVE9fVVRGOChiaWcyXykKK0RFRklORV9VVEYxNl9UT19VVEYxNihiaWcyXykKKworI3VuZGVmIFNFVDIKKyN1bmRlZiBHRVRfTE8KKyN1bmRlZiBHRVRfSEkKKworI2RlZmluZSBMSVRUTEUyX0JZVEVfVFlQRShlbmMsIHApIFwKKyAoKHApWzFdID09IDAgXAorICA/ICgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKShlbmMpKS0+dHlwZVsodW5zaWduZWQgY2hhcikqKHApXSBcCisgIDogdW5pY29kZV9ieXRlX3R5cGUoKHApWzFdLCAocClbMF0pKQorI2RlZmluZSBMSVRUTEUyX0JZVEVfVE9fQVNDSUkoZW5jLCBwKSAoKHApWzFdID09IDAgPyAocClbMF0gOiAtMSkKKyNkZWZpbmUgTElUVExFMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKSAoKHApWzFdID09IDAgJiYgKHApWzBdID09IGMpCisjZGVmaW5lIExJVFRMRTJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApIFwKKyAgVUNTMl9HRVRfTkFNSU5HKG5hbWVQYWdlcywgKHVuc2lnbmVkIGNoYXIpcFsxXSwgKHVuc2lnbmVkIGNoYXIpcFswXSkKKyNkZWZpbmUgTElUVExFMl9JU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKSBcCisgIFVDUzJfR0VUX05BTUlORyhubXN0cnRQYWdlcywgKHVuc2lnbmVkIGNoYXIpcFsxXSwgKHVuc2lnbmVkIGNoYXIpcFswXSkKKworI2lmZGVmIFhNTF9NSU5fU0laRQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitsaXR0bGUyX2J5dGVUeXBlKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBMSVRUTEUyX0JZVEVfVFlQRShlbmMsIHApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitsaXR0bGUyX2J5dGVUb0FzY2lpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBMSVRUTEUyX0JZVEVfVE9fQVNDSUkoZW5jLCBwKTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitsaXR0bGUyX2NoYXJNYXRjaGVzKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnAsIGludCBjKQoreworICByZXR1cm4gTElUVExFMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKTsKK30KKworc3RhdGljIGludCBQVFJGQVNUQ0FMTAorbGl0dGxlMl9pc05hbWVNaW4oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIExJVFRMRTJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitsaXR0bGUyX2lzTm1zdHJ0TWluKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIHJldHVybiBMSVRUTEUyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApOworfQorCisjdW5kZWYgVlRBQkxFCisjZGVmaW5lIFZUQUJMRSBWVEFCTEUxLCBsaXR0bGUyX3RvVXRmOCwgbGl0dGxlMl90b1V0ZjE2CisKKyNlbHNlIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KKworI3VuZGVmIFBSRUZJWAorI2RlZmluZSBQUkVGSVgoaWRlbnQpIGxpdHRsZTJfICMjIGlkZW50CisjZGVmaW5lIE1JTkJQQyhlbmMpIDIKKy8qIENIQVJfTUFUQ0hFUyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgTUlOQlBDIGJ5dGVzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgQllURV9UWVBFKGVuYywgcCkgTElUVExFMl9CWVRFX1RZUEUoZW5jLCBwKQorI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgTElUVExFMl9CWVRFX1RPX0FTQ0lJKGVuYywgcCkKKyNkZWZpbmUgQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykgTElUVExFMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKQorI2RlZmluZSBJU19OQU1FX0NIQVIoZW5jLCBwLCBuKSAwCisjZGVmaW5lIElTX05BTUVfQ0hBUl9NSU5CUEMoZW5jLCBwKSBMSVRUTEUyX0lTX05BTUVfQ0hBUl9NSU5CUEMoZW5jLCBwKQorI2RlZmluZSBJU19OTVNUUlRfQ0hBUihlbmMsIHAsIG4pICgwKQorI2RlZmluZSBJU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKSBMSVRUTEUyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApCisKKyNkZWZpbmUgWE1MX1RPS19JTVBMX0MKKyNpbmNsdWRlICJ4bWx0b2tfaW1wbC5jIgorI3VuZGVmIFhNTF9UT0tfSU1QTF9DCisKKyN1bmRlZiBNSU5CUEMKKyN1bmRlZiBCWVRFX1RZUEUKKyN1bmRlZiBCWVRFX1RPX0FTQ0lJCisjdW5kZWYgQ0hBUl9NQVRDSEVTCisjdW5kZWYgSVNfTkFNRV9DSEFSCisjdW5kZWYgSVNfTkFNRV9DSEFSX01JTkJQQworI3VuZGVmIElTX05NU1RSVF9DSEFSCisjdW5kZWYgSVNfTk1TVFJUX0NIQVJfTUlOQlBDCisjdW5kZWYgSVNfSU5WQUxJRF9DSEFSCisKKyNlbmRpZiAvKiBub3QgWE1MX01JTl9TSVpFICovCisKKyNpZmRlZiBYTUxfTlMKKworc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgbGl0dGxlMl9lbmNvZGluZ19ucyA9IHsKKyAgeyBWVEFCTEUsIDIsIDAsCisjaWYgQllURU9SREVSID09IDEyMzQKKyAgICAxCisjZWxzZQorICAgIDAKKyNlbmRpZgorICB9LAorICB7CisjaW5jbHVkZSAiYXNjaWl0YWIuaCIKKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQorfTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGxpdHRsZTJfZW5jb2RpbmcgPSB7CisgIHsgVlRBQkxFLCAyLCAwLAorI2lmIEJZVEVPUkRFUiA9PSAxMjM0CisgICAgMQorI2Vsc2UKKyAgICAwCisjZW5kaWYKKyAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorI3VuZGVmIEJUX0NPTE9OCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShsaXR0bGUyXykKK307CisKKyNpZiBCWVRFT1JERVIgIT0gNDMyMQorCisjaWZkZWYgWE1MX05TCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2xpdHRsZTJfZW5jb2RpbmdfbnMgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNpbmNsdWRlICJpYXNjaWl0YWIuaCIKKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQorfTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2xpdHRsZTJfZW5jb2RpbmcgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiaWFzY2lpdGFiLmgiCisjdW5kZWYgQlRfQ09MT04KKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQorfTsKKworI2VuZGlmCisKKworI2RlZmluZSBCSUcyX0JZVEVfVFlQRShlbmMsIHApIFwKKyAoKHApWzBdID09IDAgXAorICA/ICgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKShlbmMpKS0+dHlwZVsodW5zaWduZWQgY2hhcikocClbMV1dIFwKKyAgOiB1bmljb2RlX2J5dGVfdHlwZSgocClbMF0sIChwKVsxXSkpCisjZGVmaW5lIEJJRzJfQllURV9UT19BU0NJSShlbmMsIHApICgocClbMF0gPT0gMCA/IChwKVsxXSA6IC0xKQorI2RlZmluZSBCSUcyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpICgocClbMF0gPT0gMCAmJiAocClbMV0gPT0gYykKKyNkZWZpbmUgQklHMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgXAorICBVQ1MyX0dFVF9OQU1JTkcobmFtZVBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzBdLCAodW5zaWduZWQgY2hhcilwWzFdKQorI2RlZmluZSBCSUcyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIFwKKyAgVUNTMl9HRVRfTkFNSU5HKG5tc3RydFBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzBdLCAodW5zaWduZWQgY2hhcilwWzFdKQorCisjaWZkZWYgWE1MX01JTl9TSVpFCisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK2JpZzJfYnl0ZVR5cGUoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIEJJRzJfQllURV9UWVBFKGVuYywgcCk7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK2JpZzJfYnl0ZVRvQXNjaWkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIEJJRzJfQllURV9UT19BU0NJSShlbmMsIHApOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK2JpZzJfY2hhck1hdGNoZXMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCwgaW50IGMpCit7CisgIHJldHVybiBCSUcyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCitiaWcyX2lzTmFtZU1pbihjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gQklHMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCk7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK2JpZzJfaXNObXN0cnRNaW4oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIEJJRzJfSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcCk7Cit9CisKKyN1bmRlZiBWVEFCTEUKKyNkZWZpbmUgVlRBQkxFIFZUQUJMRTEsIGJpZzJfdG9VdGY4LCBiaWcyX3RvVXRmMTYKKworI2Vsc2UgLyogbm90IFhNTF9NSU5fU0laRSAqLworCisjdW5kZWYgUFJFRklYCisjZGVmaW5lIFBSRUZJWChpZGVudCkgYmlnMl8gIyMgaWRlbnQKKyNkZWZpbmUgTUlOQlBDKGVuYykgMgorLyogQ0hBUl9NQVRDSEVTIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBNSU5CUEMgYnl0ZXMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBCWVRFX1RZUEUoZW5jLCBwKSBCSUcyX0JZVEVfVFlQRShlbmMsIHApCisjZGVmaW5lIEJZVEVfVE9fQVNDSUkoZW5jLCBwKSBCSUcyX0JZVEVfVE9fQVNDSUkoZW5jLCBwKQorI2RlZmluZSBDSEFSX01BVENIRVMoZW5jLCBwLCBjKSBCSUcyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpCisjZGVmaW5lIElTX05BTUVfQ0hBUihlbmMsIHAsIG4pIDAKKyNkZWZpbmUgSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApIEJJRzJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApCisjZGVmaW5lIElTX05NU1RSVF9DSEFSKGVuYywgcCwgbikgKDApCisjZGVmaW5lIElTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIEJJRzJfSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcCkKKworI2RlZmluZSBYTUxfVE9LX0lNUExfQworI2luY2x1ZGUgInhtbHRva19pbXBsLmMiCisjdW5kZWYgWE1MX1RPS19JTVBMX0MKKworI3VuZGVmIE1JTkJQQworI3VuZGVmIEJZVEVfVFlQRQorI3VuZGVmIEJZVEVfVE9fQVNDSUkKKyN1bmRlZiBDSEFSX01BVENIRVMKKyN1bmRlZiBJU19OQU1FX0NIQVIKKyN1bmRlZiBJU19OQU1FX0NIQVJfTUlOQlBDCisjdW5kZWYgSVNfTk1TVFJUX0NIQVIKKyN1bmRlZiBJU19OTVNUUlRfQ0hBUl9NSU5CUEMKKyN1bmRlZiBJU19JTlZBTElEX0NIQVIKKworI2VuZGlmIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KKworI2lmZGVmIFhNTF9OUworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBiaWcyX2VuY29kaW5nX25zID0geworICB7IFZUQUJMRSwgMiwgMCwKKyNpZiBCWVRFT1JERVIgPT0gNDMyMQorICAxCisjZWxzZQorICAwCisjZW5kaWYKKyAgfSwKKyAgeworI2luY2x1ZGUgImFzY2lpdGFiLmgiCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShiaWcyXykKK307CisKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBiaWcyX2VuY29kaW5nID0geworICB7IFZUQUJMRSwgMiwgMCwKKyNpZiBCWVRFT1JERVIgPT0gNDMyMQorICAxCisjZWxzZQorICAwCisjZW5kaWYKKyAgfSwKKyAgeworI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKKyNpbmNsdWRlICJhc2NpaXRhYi5oIgorI3VuZGVmIEJUX0NPTE9OCisjaW5jbHVkZSAibGF0aW4xdGFiLmgiCisgIH0sCisgIFNUQU5EQVJEX1ZUQUJMRShiaWcyXykKK307CisKKyNpZiBCWVRFT1JERVIgIT0gMTIzNAorCisjaWZkZWYgWE1MX05TCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2JpZzJfZW5jb2RpbmdfbnMgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNpbmNsdWRlICJpYXNjaWl0YWIuaCIKKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGJpZzJfKQorfTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2JpZzJfZW5jb2RpbmcgPSB7CisgIHsgVlRBQkxFLCAyLCAwLCAxIH0sCisgIHsKKyNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCisjaW5jbHVkZSAiaWFzY2lpdGFiLmgiCisjdW5kZWYgQlRfQ09MT04KKyNpbmNsdWRlICJsYXRpbjF0YWIuaCIKKyAgfSwKKyAgU1RBTkRBUkRfVlRBQkxFKGJpZzJfKQorfTsKKworI2VuZGlmCisKKyN1bmRlZiBQUkVGSVgKKworc3RhdGljIGludCBGQVNUQ0FMTAorc3RyZXFjaShjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgIGZvciAoOzspIHsKKyAgICBjaGFyIGMxID0gKnMxKys7CisgICAgY2hhciBjMiA9ICpzMisrOworICAgIGlmIChBU0NJSV9hIDw9IGMxICYmIGMxIDw9IEFTQ0lJX3opCisgICAgICBjMSArPSBBU0NJSV9BIC0gQVNDSUlfYTsKKyAgICBpZiAoQVNDSUlfYSA8PSBjMiAmJiBjMiA8PSBBU0NJSV96KQorICAgICAgYzIgKz0gQVNDSUlfQSAtIEFTQ0lJX2E7CisgICAgaWYgKGMxICE9IGMyKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFjMSkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBQVFJDQUxMCitpbml0VXBkYXRlUG9zaXRpb24oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgUE9TSVRJT04gKnBvcykKK3sKKyAgbm9ybWFsX3VwZGF0ZVBvc2l0aW9uKCZ1dGY4X2VuY29kaW5nLmVuYywgcHRyLCBlbmQsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQKK3RvQXNjaWkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpCit7CisgIGNoYXIgYnVmWzFdOworICBjaGFyICpwID0gYnVmOworICBYbWxVdGY4Q29udmVydChlbmMsICZwdHIsIGVuZCwgJnAsIHAgKyAxKTsKKyAgaWYgKHAgPT0gYnVmKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHJldHVybiBidWZbMF07Cit9CisKK3N0YXRpYyBpbnQgRkFTVENBTEwKK2lzU3BhY2UoaW50IGMpCit7CisgIHN3aXRjaCAoYykgeworICBjYXNlIDB4MjA6CisgIGNhc2UgMHhEOgorICBjYXNlIDB4QToKKyAgY2FzZSAweDk6CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiAxIGlmIHRoZXJlJ3MganVzdCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBvciB0aGVyZSdzIGFuIFMKKyAgIGZvbGxvd2VkIGJ5IG5hbWU9dmFsLgorKi8KK3N0YXRpYyBpbnQKK3BhcnNlUHNldWRvQXR0cmlidXRlKGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmFtZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuYW1lRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZhbFB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpbnQgYzsKKyAgY2hhciBvcGVuOworICBpZiAocHRyID09IGVuZCkgeworICAgICpuYW1lUHRyID0gTlVMTDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIWlzU3BhY2UodG9Bc2NpaShlbmMsIHB0ciwgZW5kKSkpIHsKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBkbyB7CisgICAgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyOworICB9IHdoaWxlIChpc1NwYWNlKHRvQXNjaWkoZW5jLCBwdHIsIGVuZCkpKTsKKyAgaWYgKHB0ciA9PSBlbmQpIHsKKyAgICAqbmFtZVB0ciA9IE5VTEw7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgKm5hbWVQdHIgPSBwdHI7CisgIGZvciAoOzspIHsKKyAgICBjID0gdG9Bc2NpaShlbmMsIHB0ciwgZW5kKTsKKyAgICBpZiAoYyA9PSAtMSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGMgPT0gQVNDSUlfRVFVQUxTKSB7CisgICAgICAqbmFtZUVuZFB0ciA9IHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaXNTcGFjZShjKSkgeworICAgICAgKm5hbWVFbmRQdHIgPSBwdHI7CisgICAgICBkbyB7CisgICAgICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICAgIH0gd2hpbGUgKGlzU3BhY2UoYyA9IHRvQXNjaWkoZW5jLCBwdHIsIGVuZCkpKTsKKyAgICAgIGlmIChjICE9IEFTQ0lJX0VRVUFMUykgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyOworICB9CisgIGlmIChwdHIgPT0gKm5hbWVQdHIpIHsKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwdHIgKz0gZW5jLT5taW5CeXRlc1BlckNoYXI7CisgIGMgPSB0b0FzY2lpKGVuYywgcHRyLCBlbmQpOworICB3aGlsZSAoaXNTcGFjZShjKSkgeworICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgICBjID0gdG9Bc2NpaShlbmMsIHB0ciwgZW5kKTsKKyAgfQorICBpZiAoYyAhPSBBU0NJSV9RVU9UICYmIGMgIT0gQVNDSUlfQVBPUykgeworICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiAwOworICB9CisgIG9wZW4gPSAoY2hhciljOworICBwdHIgKz0gZW5jLT5taW5CeXRlc1BlckNoYXI7CisgICp2YWxQdHIgPSBwdHI7CisgIGZvciAoOzsgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyKSB7CisgICAgYyA9IHRvQXNjaWkoZW5jLCBwdHIsIGVuZCk7CisgICAgaWYgKGMgPT0gb3BlbikKKyAgICAgIGJyZWFrOworICAgIGlmICghKEFTQ0lJX2EgPD0gYyAmJiBjIDw9IEFTQ0lJX3opCisgICAgICAgICYmICEoQVNDSUlfQSA8PSBjICYmIGMgPD0gQVNDSUlfWikKKyAgICAgICAgJiYgIShBU0NJSV8wIDw9IGMgJiYgYyA8PSBBU0NJSV85KQorICAgICAgICAmJiBjICE9IEFTQ0lJX1BFUklPRAorICAgICAgICAmJiBjICE9IEFTQ0lJX01JTlVTCisgICAgICAgICYmIGMgIT0gQVNDSUlfVU5ERVJTQ09SRSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgKm5leHRUb2tQdHIgPSBwdHIgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIEtXX3ZlcnNpb25bXSA9IHsKKyAgQVNDSUlfdiwgQVNDSUlfZSwgQVNDSUlfciwgQVNDSUlfcywgQVNDSUlfaSwgQVNDSUlfbywgQVNDSUlfbiwgJ1wwJworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgS1dfZW5jb2RpbmdbXSA9IHsKKyAgQVNDSUlfZSwgQVNDSUlfbiwgQVNDSUlfYywgQVNDSUlfbywgQVNDSUlfZCwgQVNDSUlfaSwgQVNDSUlfbiwgQVNDSUlfZywgJ1wwJworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgS1dfc3RhbmRhbG9uZVtdID0geworICBBU0NJSV9zLCBBU0NJSV90LCBBU0NJSV9hLCBBU0NJSV9uLCBBU0NJSV9kLCBBU0NJSV9hLCBBU0NJSV9sLCBBU0NJSV9vLAorICBBU0NJSV9uLCBBU0NJSV9lLCAnXDAnCit9OworCitzdGF0aWMgY29uc3QgY2hhciBLV195ZXNbXSA9IHsKKyAgQVNDSUlfeSwgQVNDSUlfZSwgQVNDSUlfcywgICdcMCcKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIEtXX25vW10gPSB7CisgIEFTQ0lJX24sIEFTQ0lJX28sICAnXDAnCit9OworCitzdGF0aWMgaW50Citkb1BhcnNlWG1sRGVjbChjb25zdCBFTkNPRElORyAqKCplbmNvZGluZ0ZpbmRlcikoY29uc3QgRU5DT0RJTkcgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKSwKKyAgICAgICAgICAgICAgIGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipiYWRQdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqdmVyc2lvblB0ciwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmVuY29kaW5nTmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICoqZW5jb2RpbmcsCisgICAgICAgICAgICAgICBpbnQgKnN0YW5kYWxvbmUpCit7CisgIGNvbnN0IGNoYXIgKnZhbCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworICBjb25zdCBjaGFyICpuYW1lRW5kID0gTlVMTDsKKyAgcHRyICs9IDUgKiBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgZW5kIC09IDIgKiBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgaWYgKCFwYXJzZVBzZXVkb0F0dHJpYnV0ZShlbmMsIHB0ciwgZW5kLCAmbmFtZSwgJm5hbWVFbmQsICZ2YWwsICZwdHIpCisgICAgICB8fCAhbmFtZSkgeworICAgICpiYWRQdHIgPSBwdHI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgbmFtZSwgbmFtZUVuZCwgS1dfdmVyc2lvbikpIHsKKyAgICBpZiAoIWlzR2VuZXJhbFRleHRFbnRpdHkpIHsKKyAgICAgICpiYWRQdHIgPSBuYW1lOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmICh2ZXJzaW9uUHRyKQorICAgICAgKnZlcnNpb25QdHIgPSB2YWw7CisgICAgaWYgKHZlcnNpb25FbmRQdHIpCisgICAgICAqdmVyc2lvbkVuZFB0ciA9IHB0cjsKKyAgICBpZiAoIXBhcnNlUHNldWRvQXR0cmlidXRlKGVuYywgcHRyLCBlbmQsICZuYW1lLCAmbmFtZUVuZCwgJnZhbCwgJnB0cikpIHsKKyAgICAgICpiYWRQdHIgPSBwdHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFuYW1lKSB7CisgICAgICBpZiAoaXNHZW5lcmFsVGV4dEVudGl0eSkgeworICAgICAgICAvKiBhIFRleHREZWNsIG11c3QgaGF2ZSBhbiBFbmNvZGluZ0RlY2wgKi8KKyAgICAgICAgKmJhZFB0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBuYW1lLCBuYW1lRW5kLCBLV19lbmNvZGluZykpIHsKKyAgICBpbnQgYyA9IHRvQXNjaWkoZW5jLCB2YWwsIGVuZCk7CisgICAgaWYgKCEoQVNDSUlfYSA8PSBjICYmIGMgPD0gQVNDSUlfeikgJiYgIShBU0NJSV9BIDw9IGMgJiYgYyA8PSBBU0NJSV9aKSkgeworICAgICAgKmJhZFB0ciA9IHZhbDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZW5jb2RpbmdOYW1lKQorICAgICAgKmVuY29kaW5nTmFtZSA9IHZhbDsKKyAgICBpZiAoZW5jb2RpbmcpCisgICAgICAqZW5jb2RpbmcgPSBlbmNvZGluZ0ZpbmRlcihlbmMsIHZhbCwgcHRyIC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOworICAgIGlmICghcGFyc2VQc2V1ZG9BdHRyaWJ1dGUoZW5jLCBwdHIsIGVuZCwgJm5hbWUsICZuYW1lRW5kLCAmdmFsLCAmcHRyKSkgeworICAgICAgKmJhZFB0ciA9IHB0cjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIVhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBuYW1lLCBuYW1lRW5kLCBLV19zdGFuZGFsb25lKQorICAgICAgfHwgaXNHZW5lcmFsVGV4dEVudGl0eSkgeworICAgICpiYWRQdHIgPSBuYW1lOworICAgIHJldHVybiAwOworICB9CisgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgdmFsLCBwdHIgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhciwgS1dfeWVzKSkgeworICAgIGlmIChzdGFuZGFsb25lKQorICAgICAgKnN0YW5kYWxvbmUgPSAxOworICB9CisgIGVsc2UgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCB2YWwsIHB0ciAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyLCBLV19ubykpIHsKKyAgICBpZiAoc3RhbmRhbG9uZSkKKyAgICAgICpzdGFuZGFsb25lID0gMDsKKyAgfQorICBlbHNlIHsKKyAgICAqYmFkUHRyID0gdmFsOworICAgIHJldHVybiAwOworICB9CisgIHdoaWxlIChpc1NwYWNlKHRvQXNjaWkoZW5jLCBwdHIsIGVuZCkpKQorICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKKyAgaWYgKHB0ciAhPSBlbmQpIHsKKyAgICAqYmFkUHRyID0gcHRyOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEZBU1RDQUxMCitjaGVja0NoYXJSZWZOdW1iZXIoaW50IHJlc3VsdCkKK3sKKyAgc3dpdGNoIChyZXN1bHQgPj4gOCkgeworICBjYXNlIDB4RDg6IGNhc2UgMHhEOTogY2FzZSAweERBOiBjYXNlIDB4REI6CisgIGNhc2UgMHhEQzogY2FzZSAweEREOiBjYXNlIDB4REU6IGNhc2UgMHhERjoKKyAgICByZXR1cm4gLTE7CisgIGNhc2UgMDoKKyAgICBpZiAobGF0aW4xX2VuY29kaW5nLnR5cGVbcmVzdWx0XSA9PSBCVF9OT05YTUwpCisgICAgICByZXR1cm4gLTE7CisgICAgYnJlYWs7CisgIGNhc2UgMHhGRjoKKyAgICBpZiAocmVzdWx0ID09IDB4RkZGRSB8fCByZXN1bHQgPT0gMHhGRkZGKQorICAgICAgcmV0dXJuIC0xOworICAgIGJyZWFrOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGQVNUQ0FMTAorWG1sVXRmOEVuY29kZShpbnQgYywgY2hhciAqYnVmKQoreworICBlbnVtIHsKKyAgICAvKiBtaW5OIGlzIG1pbmltdW0gbGVnYWwgcmVzdWx0aW5nIHZhbHVlIGZvciBOIGJ5dGUgc2VxdWVuY2UgKi8KKyAgICBtaW4yID0gMHg4MCwKKyAgICBtaW4zID0gMHg4MDAsCisgICAgbWluNCA9IDB4MTAwMDAKKyAgfTsKKworICBpZiAoYyA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjIDwgbWluMikgeworICAgIGJ1ZlswXSA9IChjaGFyKShjIHwgVVRGOF9jdmFsMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGMgPCBtaW4zKSB7CisgICAgYnVmWzBdID0gKGNoYXIpKChjID4+IDYpIHwgVVRGOF9jdmFsMik7CisgICAgYnVmWzFdID0gKGNoYXIpKChjICYgMHgzZikgfCAweDgwKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAoYyA8IG1pbjQpIHsKKyAgICBidWZbMF0gPSAoY2hhcikoKGMgPj4gMTIpIHwgVVRGOF9jdmFsMyk7CisgICAgYnVmWzFdID0gKGNoYXIpKCgoYyA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7CisgICAgYnVmWzJdID0gKGNoYXIpKChjICYgMHgzZikgfCAweDgwKTsKKyAgICByZXR1cm4gMzsKKyAgfQorICBpZiAoYyA8IDB4MTEwMDAwKSB7CisgICAgYnVmWzBdID0gKGNoYXIpKChjID4+IDE4KSB8IFVURjhfY3ZhbDQpOworICAgIGJ1ZlsxXSA9IChjaGFyKSgoKGMgPj4gMTIpICYgMHgzZikgfCAweDgwKTsKKyAgICBidWZbMl0gPSAoY2hhcikoKChjID4+IDYpICYgMHgzZikgfCAweDgwKTsKKyAgICBidWZbM10gPSAoY2hhcikoKGMgJiAweDNmKSB8IDB4ODApOworICAgIHJldHVybiA0OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgRkFTVENBTEwKK1htbFV0ZjE2RW5jb2RlKGludCBjaGFyTnVtLCB1bnNpZ25lZCBzaG9ydCAqYnVmKQoreworICBpZiAoY2hhck51bSA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjaGFyTnVtIDwgMHgxMDAwMCkgeworICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBzaG9ydCljaGFyTnVtOworICAgIHJldHVybiAxOworICB9CisgIGlmIChjaGFyTnVtIDwgMHgxMTAwMDApIHsKKyAgICBjaGFyTnVtIC09IDB4MTAwMDA7CisgICAgYnVmWzBdID0gKHVuc2lnbmVkIHNob3J0KSgoY2hhck51bSA+PiAxMCkgKyAweEQ4MDApOworICAgIGJ1ZlsxXSA9ICh1bnNpZ25lZCBzaG9ydCkoKGNoYXJOdW0gJiAweDNGRikgKyAweERDMDApOworICAgIHJldHVybiAyOworICB9CisgIHJldHVybiAwOworfQorCitzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyB7CisgIHN0cnVjdCBub3JtYWxfZW5jb2Rpbmcgbm9ybWFsOworICBDT05WRVJURVIgY29udmVydDsKKyAgdm9pZCAqdXNlckRhdGE7CisgIHVuc2lnbmVkIHNob3J0IHV0ZjE2WzI1Nl07CisgIGNoYXIgdXRmOFsyNTZdWzRdOworfTsKKworI2RlZmluZSBBU19VTktOT1dOX0VOQ09ESU5HKGVuYykgICgoY29uc3Qgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKikgKGVuYykpCisKK2ludAorWG1sU2l6ZU9mVW5rbm93bkVuY29kaW5nKHZvaWQpCit7CisgIHJldHVybiBzaXplb2Yoc3RydWN0IHVua25vd25fZW5jb2RpbmcpOworfQorCitzdGF0aWMgaW50IFBUUkZBU1RDQUxMCit1bmtub3duX2lzTmFtZShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQoreworICBjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqdWVuYyA9IEFTX1VOS05PV05fRU5DT0RJTkcoZW5jKTsKKyAgaW50IGMgPSB1ZW5jLT5jb252ZXJ0KHVlbmMtPnVzZXJEYXRhLCBwKTsKKyAgaWYgKGMgJiB+MHhGRkZGKQorICAgIHJldHVybiAwOworICByZXR1cm4gVUNTMl9HRVRfTkFNSU5HKG5hbWVQYWdlcywgYyA+PiA4LCBjICYgMHhGRik7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3Vua25vd25faXNObXN0cnQoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKK3sKKyAgY29uc3Qgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKnVlbmMgPSBBU19VTktOT1dOX0VOQ09ESU5HKGVuYyk7CisgIGludCBjID0gdWVuYy0+Y29udmVydCh1ZW5jLT51c2VyRGF0YSwgcCk7CisgIGlmIChjICYgfjB4RkZGRikKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIFVDUzJfR0VUX05BTUlORyhubXN0cnRQYWdlcywgYyA+PiA4LCBjICYgMHhGRik7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK3Vua25vd25faXNJbnZhbGlkKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCit7CisgIGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICp1ZW5jID0gQVNfVU5LTk9XTl9FTkNPRElORyhlbmMpOworICBpbnQgYyA9IHVlbmMtPmNvbnZlcnQodWVuYy0+dXNlckRhdGEsIHApOworICByZXR1cm4gKGMgJiB+MHhGRkZGKSB8fCBjaGVja0NoYXJSZWZOdW1iZXIoYykgPCAwOworfQorCitzdGF0aWMgdm9pZCBQVFJDQUxMCit1bmtub3duX3RvVXRmOChjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAorICAgICAgICAgICAgICAgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pCit7CisgIGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICp1ZW5jID0gQVNfVU5LTk9XTl9FTkNPRElORyhlbmMpOworICBjaGFyIGJ1ZltYTUxfVVRGOF9FTkNPREVfTUFYXTsKKyAgZm9yICg7OykgeworICAgIGNvbnN0IGNoYXIgKnV0Zjg7CisgICAgaW50IG47CisgICAgaWYgKCpmcm9tUCA9PSBmcm9tTGltKQorICAgICAgYnJlYWs7CisgICAgdXRmOCA9IHVlbmMtPnV0ZjhbKHVuc2lnbmVkIGNoYXIpKipmcm9tUF07CisgICAgbiA9ICp1dGY4Kys7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgaW50IGMgPSB1ZW5jLT5jb252ZXJ0KHVlbmMtPnVzZXJEYXRhLCAqZnJvbVApOworICAgICAgbiA9IFhtbFV0ZjhFbmNvZGUoYywgYnVmKTsKKyAgICAgIGlmIChuID4gdG9MaW0gLSAqdG9QKQorICAgICAgICBicmVhazsKKyAgICAgIHV0ZjggPSBidWY7CisgICAgICAqZnJvbVAgKz0gKEFTX05PUk1BTF9FTkNPRElORyhlbmMpLT50eXBlWyh1bnNpZ25lZCBjaGFyKSoqZnJvbVBdCisgICAgICAgICAgICAgICAgIC0gKEJUX0xFQUQyIC0gMikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChuID4gdG9MaW0gLSAqdG9QKQorICAgICAgICBicmVhazsKKyAgICAgICgqZnJvbVApKys7CisgICAgfQorICAgIGRvIHsKKyAgICAgICooKnRvUCkrKyA9ICp1dGY4Kys7CisgICAgfSB3aGlsZSAoLS1uICE9IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK3Vua25vd25fdG9VdGYxNihjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKQoreworICBjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqdWVuYyA9IEFTX1VOS05PV05fRU5DT0RJTkcoZW5jKTsKKyAgd2hpbGUgKCpmcm9tUCAhPSBmcm9tTGltICYmICp0b1AgIT0gdG9MaW0pIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBjID0gdWVuYy0+dXRmMTZbKHVuc2lnbmVkIGNoYXIpKipmcm9tUF07CisgICAgaWYgKGMgPT0gMCkgeworICAgICAgYyA9ICh1bnNpZ25lZCBzaG9ydCkKKyAgICAgICAgICB1ZW5jLT5jb252ZXJ0KHVlbmMtPnVzZXJEYXRhLCAqZnJvbVApOworICAgICAgKmZyb21QICs9IChBU19OT1JNQUxfRU5DT0RJTkcoZW5jKS0+dHlwZVsodW5zaWduZWQgY2hhcikqKmZyb21QXQorICAgICAgICAgICAgICAgICAtIChCVF9MRUFEMiAtIDIpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgKCpmcm9tUCkrKzsKKyAgICAqKCp0b1ApKysgPSBjOworICB9Cit9CisKK0VOQ09ESU5HICoKK1htbEluaXRVbmtub3duRW5jb2Rpbmcodm9pZCAqbWVtLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICBDT05WRVJURVIgY29udmVydCwgCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKQoreworICBpbnQgaTsKKyAgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKmUgPSAoc3RydWN0IHVua25vd25fZW5jb2RpbmcgKiltZW07CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KXNpemVvZihzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nKTsgaSsrKQorICAgICgoY2hhciAqKW1lbSlbaV0gPSAoKGNoYXIgKikmbGF0aW4xX2VuY29kaW5nKVtpXTsKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIGlmIChsYXRpbjFfZW5jb2RpbmcudHlwZVtpXSAhPSBCVF9PVEhFUgorICAgICAgICAmJiBsYXRpbjFfZW5jb2RpbmcudHlwZVtpXSAhPSBCVF9OT05YTUwKKyAgICAgICAgJiYgdGFibGVbaV0gIT0gaSkKKyAgICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICBpbnQgYyA9IHRhYmxlW2ldOworICAgIGlmIChjID09IC0xKSB7CisgICAgICBlLT5ub3JtYWwudHlwZVtpXSA9IEJUX01BTEZPUk07CisgICAgICAvKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgZ2V0IHVzZWQuICovCisgICAgICBlLT51dGYxNltpXSA9IDB4RkZGRjsKKyAgICAgIGUtPnV0ZjhbaV1bMF0gPSAxOworICAgICAgZS0+dXRmOFtpXVsxXSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKGMgPCAwKSB7CisgICAgICBpZiAoYyA8IC00KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gKHVuc2lnbmVkIGNoYXIpKEJUX0xFQUQyIC0gKGMgKyAyKSk7CisgICAgICBlLT51dGY4W2ldWzBdID0gMDsKKyAgICAgIGUtPnV0ZjE2W2ldID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoYyA8IDB4ODApIHsKKyAgICAgIGlmIChsYXRpbjFfZW5jb2RpbmcudHlwZVtjXSAhPSBCVF9PVEhFUgorICAgICAgICAgICYmIGxhdGluMV9lbmNvZGluZy50eXBlW2NdICE9IEJUX05PTlhNTAorICAgICAgICAgICYmIGMgIT0gaSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBlLT5ub3JtYWwudHlwZVtpXSA9IGxhdGluMV9lbmNvZGluZy50eXBlW2NdOworICAgICAgZS0+dXRmOFtpXVswXSA9IDE7CisgICAgICBlLT51dGY4W2ldWzFdID0gKGNoYXIpYzsKKyAgICAgIGUtPnV0ZjE2W2ldID0gKHVuc2lnbmVkIHNob3J0KShjID09IDAgPyAweEZGRkYgOiBjKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2hlY2tDaGFyUmVmTnVtYmVyKGMpIDwgMCkgeworICAgICAgZS0+bm9ybWFsLnR5cGVbaV0gPSBCVF9OT05YTUw7CisgICAgICAvKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgZ2V0IHVzZWQuICovCisgICAgICBlLT51dGYxNltpXSA9IDB4RkZGRjsKKyAgICAgIGUtPnV0ZjhbaV1bMF0gPSAxOworICAgICAgZS0+dXRmOFtpXVsxXSA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGMgPiAweEZGRkYpCisgICAgICAgIHJldHVybiAwOworICAgICAgaWYgKFVDUzJfR0VUX05BTUlORyhubXN0cnRQYWdlcywgYyA+PiA4LCBjICYgMHhmZikpCisgICAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gQlRfTk1TVFJUOworICAgICAgZWxzZSBpZiAoVUNTMl9HRVRfTkFNSU5HKG5hbWVQYWdlcywgYyA+PiA4LCBjICYgMHhmZikpCisgICAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gQlRfTkFNRTsKKyAgICAgIGVsc2UKKyAgICAgICAgZS0+bm9ybWFsLnR5cGVbaV0gPSBCVF9PVEhFUjsKKyAgICAgIGUtPnV0ZjhbaV1bMF0gPSAoY2hhcilYbWxVdGY4RW5jb2RlKGMsIGUtPnV0ZjhbaV0gKyAxKTsKKyAgICAgIGUtPnV0ZjE2W2ldID0gKHVuc2lnbmVkIHNob3J0KWM7CisgICAgfQorICB9CisgIGUtPnVzZXJEYXRhID0gdXNlckRhdGE7CisgIGUtPmNvbnZlcnQgPSBjb252ZXJ0OworICBpZiAoY29udmVydCkgeworICAgIGUtPm5vcm1hbC5pc05hbWUyID0gdW5rbm93bl9pc05hbWU7CisgICAgZS0+bm9ybWFsLmlzTmFtZTMgPSB1bmtub3duX2lzTmFtZTsKKyAgICBlLT5ub3JtYWwuaXNOYW1lNCA9IHVua25vd25faXNOYW1lOworICAgIGUtPm5vcm1hbC5pc05tc3RydDIgPSB1bmtub3duX2lzTm1zdHJ0OworICAgIGUtPm5vcm1hbC5pc05tc3RydDMgPSB1bmtub3duX2lzTm1zdHJ0OworICAgIGUtPm5vcm1hbC5pc05tc3RydDQgPSB1bmtub3duX2lzTm1zdHJ0OworICAgIGUtPm5vcm1hbC5pc0ludmFsaWQyID0gdW5rbm93bl9pc0ludmFsaWQ7CisgICAgZS0+bm9ybWFsLmlzSW52YWxpZDMgPSB1bmtub3duX2lzSW52YWxpZDsKKyAgICBlLT5ub3JtYWwuaXNJbnZhbGlkNCA9IHVua25vd25faXNJbnZhbGlkOworICB9CisgIGUtPm5vcm1hbC5lbmMudXRmOENvbnZlcnQgPSB1bmtub3duX3RvVXRmODsKKyAgZS0+bm9ybWFsLmVuYy51dGYxNkNvbnZlcnQgPSB1bmtub3duX3RvVXRmMTY7CisgIHJldHVybiAmKGUtPm5vcm1hbC5lbmMpOworfQorCisvKiBJZiB0aGlzIGVudW1lcmF0aW9uIGlzIGNoYW5nZWQsIGdldEVuY29kaW5nSW5kZXggYW5kIGVuY29kaW5ncworbXVzdCBhbHNvIGJlIGNoYW5nZWQuICovCitlbnVtIHsKKyAgVU5LTk9XTl9FTkMgPSAtMSwKKyAgSVNPXzg4NTlfMV9FTkMgPSAwLAorICBVU19BU0NJSV9FTkMsCisgIFVURl84X0VOQywKKyAgVVRGXzE2X0VOQywKKyAgVVRGXzE2QkVfRU5DLAorICBVVEZfMTZMRV9FTkMsCisgIC8qIG11c3QgbWF0Y2ggZW5jb2RpbmdOYW1lcyB1cCB0byBoZXJlICovCisgIE5PX0VOQworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgS1dfSVNPXzg4NTlfMVtdID0geworICBBU0NJSV9JLCBBU0NJSV9TLCBBU0NJSV9PLCBBU0NJSV9NSU5VUywgQVNDSUlfOCwgQVNDSUlfOCwgQVNDSUlfNSwgQVNDSUlfOSwKKyAgQVNDSUlfTUlOVVMsIEFTQ0lJXzEsICdcMCcKK307CitzdGF0aWMgY29uc3QgY2hhciBLV19VU19BU0NJSVtdID0geworICBBU0NJSV9VLCBBU0NJSV9TLCBBU0NJSV9NSU5VUywgQVNDSUlfQSwgQVNDSUlfUywgQVNDSUlfQywgQVNDSUlfSSwgQVNDSUlfSSwKKyAgJ1wwJworfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX1VURl84W10gPSAgeworICBBU0NJSV9VLCBBU0NJSV9ULCBBU0NJSV9GLCBBU0NJSV9NSU5VUywgQVNDSUlfOCwgJ1wwJworfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX1VURl8xNltdID0geworICBBU0NJSV9VLCBBU0NJSV9ULCBBU0NJSV9GLCBBU0NJSV9NSU5VUywgQVNDSUlfMSwgQVNDSUlfNiwgJ1wwJworfTsKK3N0YXRpYyBjb25zdCBjaGFyIEtXX1VURl8xNkJFW10gPSB7CisgIEFTQ0lJX1UsIEFTQ0lJX1QsIEFTQ0lJX0YsIEFTQ0lJX01JTlVTLCBBU0NJSV8xLCBBU0NJSV82LCBBU0NJSV9CLCBBU0NJSV9FLAorICAnXDAnCit9Oworc3RhdGljIGNvbnN0IGNoYXIgS1dfVVRGXzE2TEVbXSA9IHsKKyAgQVNDSUlfVSwgQVNDSUlfVCwgQVNDSUlfRiwgQVNDSUlfTUlOVVMsIEFTQ0lJXzEsIEFTQ0lJXzYsIEFTQ0lJX0wsIEFTQ0lJX0UsCisgICdcMCcKK307CisKK3N0YXRpYyBpbnQgRkFTVENBTEwKK2dldEVuY29kaW5nSW5kZXgoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbmNvZGluZ05hbWVzW10gPSB7CisgICAgS1dfSVNPXzg4NTlfMSwKKyAgICBLV19VU19BU0NJSSwKKyAgICBLV19VVEZfOCwKKyAgICBLV19VVEZfMTYsCisgICAgS1dfVVRGXzE2QkUsCisgICAgS1dfVVRGXzE2TEUsCisgIH07CisgIGludCBpOworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHJldHVybiBOT19FTkM7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YoZW5jb2RpbmdOYW1lcykvc2l6ZW9mKGVuY29kaW5nTmFtZXNbMF0pKTsgaSsrKQorICAgIGlmIChzdHJlcWNpKG5hbWUsIGVuY29kaW5nTmFtZXNbaV0pKQorICAgICAgcmV0dXJuIGk7CisgIHJldHVybiBVTktOT1dOX0VOQzsKK30KKworLyogRm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LCB3ZSBzdG9yZSB0aGUgaW5kZXggb2YgdGhlIGVuY29kaW5nCisgICBzcGVjaWZpZWQgYXQgaW5pdGlhbGl6YXRpb24gaW4gdGhlIGlzVXRmMTYgbWVtYmVyLgorKi8KKworI2RlZmluZSBJTklUX0VOQ19JTkRFWChlbmMpICgoaW50KShlbmMpLT5pbml0RW5jLmlzVXRmMTYpCisjZGVmaW5lIFNFVF9JTklUX0VOQ19JTkRFWChlbmMsIGkpICgoZW5jKS0+aW5pdEVuYy5pc1V0ZjE2ID0gKGNoYXIpaSkKKworLyogVGhpcyBpcyB3aGF0IGRldGVjdHMgdGhlIGVuY29kaW5nLiAgZW5jb2RpbmdUYWJsZSBtYXBzIGZyb20KKyAgIGVuY29kaW5nIGluZGljZXMgdG8gZW5jb2RpbmdzOyBJTklUX0VOQ19JTkRFWChlbmMpIGlzIHRoZSBpbmRleCBvZgorICAgdGhlIGV4dGVybmFsIChwcm90b2NvbCkgc3BlY2lmaWVkIGVuY29kaW5nOyBzdGF0ZSBpcworICAgWE1MX0NPTlRFTlRfU1RBVEUgaWYgd2UncmUgcGFyc2luZyBhbiBleHRlcm5hbCB0ZXh0IGVudGl0eSwgYW5kCisgICBYTUxfUFJPTE9HX1NUQVRFIG90aGVyd2lzZS4KKyovCisKKworc3RhdGljIGludAoraW5pdFNjYW4oY29uc3QgRU5DT0RJTkcgKiBjb25zdCAqZW5jb2RpbmdUYWJsZSwKKyAgICAgICAgIGNvbnN0IElOSVRfRU5DT0RJTkcgKmVuYywKKyAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBjb25zdCBFTkNPRElORyAqKmVuY1B0cjsKKworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19OT05FOworICBlbmNQdHIgPSBlbmMtPmVuY1B0cjsKKyAgaWYgKHB0ciArIDEgPT0gZW5kKSB7CisgICAgLyogb25seSBhIHNpbmdsZSBieXRlIGF2YWlsYWJsZSBmb3IgYXV0by1kZXRlY3Rpb24gKi8KKyNpZm5kZWYgWE1MX0RURCAvKiBGSVhNRSAqLworICAgIC8qIGEgd2VsbC1mb3JtZWQgZG9jdW1lbnQgZW50aXR5IG11c3QgaGF2ZSBtb3JlIHRoYW4gb25lIGJ5dGUgKi8KKyAgICBpZiAoc3RhdGUgIT0gWE1MX0NPTlRFTlRfU1RBVEUpCisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworI2VuZGlmCisgICAgLyogc28gd2UncmUgcGFyc2luZyBhbiBleHRlcm5hbCB0ZXh0IGVudGl0eS4uLiAqLworICAgIC8qIGlmIFVURi0xNiB3YXMgZXh0ZXJuYWxseSBzcGVjaWZpZWQsIHRoZW4gd2UgbmVlZCBhdCBsZWFzdCAyIGJ5dGVzICovCisgICAgc3dpdGNoIChJTklUX0VOQ19JTkRFWChlbmMpKSB7CisgICAgY2FzZSBVVEZfMTZfRU5DOgorICAgIGNhc2UgVVRGXzE2TEVfRU5DOgorICAgIGNhc2UgVVRGXzE2QkVfRU5DOgorICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICB9CisgICAgc3dpdGNoICgodW5zaWduZWQgY2hhcikqcHRyKSB7CisgICAgY2FzZSAweEZFOgorICAgIGNhc2UgMHhGRjoKKyAgICBjYXNlIDB4RUY6IC8qIHBvc3NpYmx5IGZpcnN0IGJ5dGUgb2YgVVRGLTggQk9NICovCisgICAgICBpZiAoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBJU09fODg1OV8xX0VOQworICAgICAgICAgICYmIHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQorICAgICAgICBicmVhazsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMHgwMDoKKyAgICBjYXNlIDB4M0M6CisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKCgodW5zaWduZWQgY2hhcilwdHJbMF0gPDwgOCkgfCAodW5zaWduZWQgY2hhcilwdHJbMV0pIHsKKyAgICBjYXNlIDB4RkVGRjoKKyAgICAgIGlmIChJTklUX0VOQ19JTkRFWChlbmMpID09IElTT184ODU5XzFfRU5DCisgICAgICAgICAgJiYgc3RhdGUgPT0gWE1MX0NPTlRFTlRfU1RBVEUpCisgICAgICAgIGJyZWFrOworICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyAyOworICAgICAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2QkVfRU5DXTsKKyAgICAgIHJldHVybiBYTUxfVE9LX0JPTTsKKyAgICAvKiAwMCAzQyBpcyBoYW5kbGVkIGluIHRoZSBkZWZhdWx0IGNhc2UgKi8KKyAgICBjYXNlIDB4M0MwMDoKKyAgICAgIGlmICgoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBVVEZfMTZCRV9FTkMKKyAgICAgICAgICAgfHwgSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBVVEZfMTZfRU5DKQorICAgICAgICAgICYmIHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQorICAgICAgICBicmVhazsKKyAgICAgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW1VURl8xNkxFX0VOQ107CisgICAgICByZXR1cm4gWG1sVG9rKCplbmNQdHIsIHN0YXRlLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7CisgICAgY2FzZSAweEZGRkU6CisgICAgICBpZiAoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBJU09fODg1OV8xX0VOQworICAgICAgICAgICYmIHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQorICAgICAgICBicmVhazsKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgMjsKKyAgICAgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW1VURl8xNkxFX0VOQ107CisgICAgICByZXR1cm4gWE1MX1RPS19CT007CisgICAgY2FzZSAweEVGQkI6CisgICAgICAvKiBNYXliZSBhIFVURi04IEJPTSAoRUYgQkIgQkYpICovCisgICAgICAvKiBJZiB0aGVyZSdzIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIChleHRlcm5hbCkgZW5jb2RpbmcKKyAgICAgICAgIG9mIElTTy04ODU5LTEgb3Igc29tZSBmbGF2b3VyIG9mIFVURi0xNgorICAgICAgICAgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdGV4dCBlbnRpdHksCisgICAgICAgICBkb24ndCBsb29rIGZvciB0aGUgQk9NLAorICAgICAgICAgYmVjYXVzZSBpdCBtaWdodCBiZSBhIGxlZ2FsIGRhdGEuCisgICAgICAqLworICAgICAgaWYgKHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKSB7CisgICAgICAgIGludCBlID0gSU5JVF9FTkNfSU5ERVgoZW5jKTsKKyAgICAgICAgaWYgKGUgPT0gSVNPXzg4NTlfMV9FTkMgfHwgZSA9PSBVVEZfMTZCRV9FTkMKKyAgICAgICAgICAgIHx8IGUgPT0gVVRGXzE2TEVfRU5DIHx8IGUgPT0gVVRGXzE2X0VOQykKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwdHIgKyAyID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmICgodW5zaWduZWQgY2hhcilwdHJbMl0gPT0gMHhCRikgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIDM7CisgICAgICAgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW1VURl84X0VOQ107CisgICAgICAgIHJldHVybiBYTUxfVE9LX0JPTTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAocHRyWzBdID09ICdcMCcpIHsKKyAgICAgICAgLyogMCBpc24ndCBhIGxlZ2FsIGRhdGEgY2hhcmFjdGVyLiBGdXJ0aGVybW9yZSBhIGRvY3VtZW50CisgICAgICAgICAgIGVudGl0eSBjYW4gb25seSBzdGFydCB3aXRoIEFTQ0lJIGNoYXJhY3RlcnMuICBTbyB0aGUgb25seQorICAgICAgICAgICB3YXkgdGhpcyBjYW4gZmFpbCB0byBiZSBiaWctZW5kaWFuIFVURi0xNiBpZiBpdCBpdCdzIGFuCisgICAgICAgICAgIGV4dGVybmFsIHBhcnNlZCBnZW5lcmFsIGVudGl0eSB0aGF0J3MgbGFiZWxsZWQgYXMKKyAgICAgICAgICAgVVRGLTE2TEUuCisgICAgICAgICovCisgICAgICAgIGlmIChzdGF0ZSA9PSBYTUxfQ09OVEVOVF9TVEFURSAmJiBJTklUX0VOQ19JTkRFWChlbmMpID09IFVURl8xNkxFX0VOQykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2QkVfRU5DXTsKKyAgICAgICAgcmV0dXJuIFhtbFRvaygqZW5jUHRyLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAocHRyWzFdID09ICdcMCcpIHsKKyAgICAgICAgLyogV2UgY291bGQgcmVjb3ZlciBoZXJlIGluIHRoZSBjYXNlOgorICAgICAgICAgICAgLSBwYXJzaW5nIGFuIGV4dGVybmFsIGVudGl0eQorICAgICAgICAgICAgLSBzZWNvbmQgYnl0ZSBpcyAwCisgICAgICAgICAgICAtIG5vIGV4dGVybmFsbHkgc3BlY2lmaWVkIGVuY29kaW5nCisgICAgICAgICAgICAtIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uCisgICAgICAgICAgIGJ5IGFzc3VtaW5nIFVURi0xNkxFLiAgQnV0IHdlIGRvbid0LCBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB3aGVuCisgICAgICAgICAgIHByZXNlbnRlZCBqdXN0IHdpdGggYSBzaW5nbGUgYnl0ZSwgd2UgY291bGRuJ3QgcmVsaWFibHkgZGV0ZXJtaW5lCisgICAgICAgICAgIHdoZXRoZXIgd2UgbmVlZGVkIGZ1cnRoZXIgYnl0ZXMuCisgICAgICAgICovCisgICAgICAgIGlmIChzdGF0ZSA9PSBYTUxfQ09OVEVOVF9TVEFURSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2TEVfRU5DXTsKKyAgICAgICAgcmV0dXJuIFhtbFRvaygqZW5jUHRyLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW0lOSVRfRU5DX0lOREVYKGVuYyldOworICByZXR1cm4gWG1sVG9rKCplbmNQdHIsIHN0YXRlLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Cit9CisKKworI2RlZmluZSBOUyh4KSB4CisjZGVmaW5lIG5zKHgpIHgKKyNkZWZpbmUgWE1MX1RPS19OU19DCisjaW5jbHVkZSAieG1sdG9rX25zLmMiCisjdW5kZWYgWE1MX1RPS19OU19DCisjdW5kZWYgTlMKKyN1bmRlZiBucworCisjaWZkZWYgWE1MX05TCisKKyNkZWZpbmUgTlMoeCkgeCAjIyBOUworI2RlZmluZSBucyh4KSB4ICMjIF9ucworCisjZGVmaW5lIFhNTF9UT0tfTlNfQworI2luY2x1ZGUgInhtbHRva19ucy5jIgorI3VuZGVmIFhNTF9UT0tfTlNfQworCisjdW5kZWYgTlMKKyN1bmRlZiBucworCitFTkNPRElORyAqCitYbWxJbml0VW5rbm93bkVuY29kaW5nTlModm9pZCAqbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVkVSVEVSIGNvbnZlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKQoreworICBFTkNPRElORyAqZW5jID0gWG1sSW5pdFVua25vd25FbmNvZGluZyhtZW0sIHRhYmxlLCBjb252ZXJ0LCB1c2VyRGF0YSk7CisgIGlmIChlbmMpCisgICAgKChzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nICopZW5jKS0+dHlwZVtBU0NJSV9DT0xPTl0gPSBCVF9DT0xPTjsKKyAgcmV0dXJuIGVuYzsKK30KKworI2VuZGlmIC8qIFhNTF9OUyAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvbGliL3htbHRvay5oIGIvZXhwYXQtMi4wLjEvbGliL3htbHRvay5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhODY3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1sdG9rLmgKQEAgLTAsMCArMSwzMTYgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaWZuZGVmIFhtbFRva19JTkNMVURFRAorI2RlZmluZSBYbWxUb2tfSU5DTFVERUQgMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdG9rZW4gbWF5IGJlIHJldHVybmVkIGJ5IFhtbENvbnRlbnRUb2sgKi8KKyNkZWZpbmUgWE1MX1RPS19UUkFJTElOR19SU1FCIC01IC8qIF0gb3IgXV0gYXQgdGhlIGVuZCBvZiB0aGUgc2NhbjsgbWlnaHQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIGlsbGVnYWwgXV0+IHNlcXVlbmNlICovCisvKiBUaGUgZm9sbG93aW5nIHRva2VucyBtYXkgYmUgcmV0dXJuZWQgYnkgYm90aCBYbWxQcm9sb2dUb2sgYW5kCisgICBYbWxDb250ZW50VG9rLgorKi8KKyNkZWZpbmUgWE1MX1RPS19OT05FIC00ICAgICAgICAgIC8qIFRoZSBzdHJpbmcgdG8gYmUgc2Nhbm5lZCBpcyBlbXB0eSAqLworI2RlZmluZSBYTUxfVE9LX1RSQUlMSU5HX0NSIC0zICAgLyogQSBDUiBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlnaHQgYmUgcGFydCBvZiBDUkxGIHNlcXVlbmNlICovCisjZGVmaW5lIFhNTF9UT0tfUEFSVElBTF9DSEFSIC0yICAvKiBvbmx5IHBhcnQgb2YgYSBtdWx0aWJ5dGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUgWE1MX1RPS19QQVJUSUFMIC0xICAgICAgIC8qIG9ubHkgcGFydCBvZiBhIHRva2VuICovCisjZGVmaW5lIFhNTF9UT0tfSU5WQUxJRCAwCisKKy8qIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGFyZSByZXR1cm5lZCBieSBYbWxDb250ZW50VG9rOyBzb21lIGFyZSBhbHNvCisgICByZXR1cm5lZCBieSBYbWxBdHRyaWJ1dGVWYWx1ZVRvaywgWG1sRW50aXR5VG9rLCBYbWxDZGF0YVNlY3Rpb25Ub2suCisqLworI2RlZmluZSBYTUxfVE9LX1NUQVJUX1RBR19XSVRIX0FUVFMgMQorI2RlZmluZSBYTUxfVE9LX1NUQVJUX1RBR19OT19BVFRTIDIKKyNkZWZpbmUgWE1MX1RPS19FTVBUWV9FTEVNRU5UX1dJVEhfQVRUUyAzIC8qIGVtcHR5IGVsZW1lbnQgdGFnIDxlLz4gKi8KKyNkZWZpbmUgWE1MX1RPS19FTVBUWV9FTEVNRU5UX05PX0FUVFMgNAorI2RlZmluZSBYTUxfVE9LX0VORF9UQUcgNQorI2RlZmluZSBYTUxfVE9LX0RBVEFfQ0hBUlMgNgorI2RlZmluZSBYTUxfVE9LX0RBVEFfTkVXTElORSA3CisjZGVmaW5lIFhNTF9UT0tfQ0RBVEFfU0VDVF9PUEVOIDgKKyNkZWZpbmUgWE1MX1RPS19FTlRJVFlfUkVGIDkKKyNkZWZpbmUgWE1MX1RPS19DSEFSX1JFRiAxMCAgICAgICAgICAgICAgIC8qIG51bWVyaWMgY2hhcmFjdGVyIHJlZmVyZW5jZSAqLworCisvKiBUaGUgZm9sbG93aW5nIHRva2VucyBtYXkgYmUgcmV0dXJuZWQgYnkgYm90aCBYbWxQcm9sb2dUb2sgYW5kCisgICBYbWxDb250ZW50VG9rLgorKi8KKyNkZWZpbmUgWE1MX1RPS19QSSAxMSAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWE1MX1RPS19YTUxfREVDTCAxMiAgICAgICAgICAgICAgIC8qIFhNTCBkZWNsIG9yIHRleHQgZGVjbCAqLworI2RlZmluZSBYTUxfVE9LX0NPTU1FTlQgMTMKKyNkZWZpbmUgWE1MX1RPS19CT00gMTQgICAgICAgICAgICAgICAgICAgIC8qIEJ5dGUgb3JkZXIgbWFyayAqLworCisvKiBUaGUgZm9sbG93aW5nIHRva2VucyBhcmUgcmV0dXJuZWQgb25seSBieSBYbWxQcm9sb2dUb2sgKi8KKyNkZWZpbmUgWE1MX1RPS19QUk9MT0dfUyAxNQorI2RlZmluZSBYTUxfVE9LX0RFQ0xfT1BFTiAxNiAgICAgICAgICAgICAgLyogPCFmb28gKi8KKyNkZWZpbmUgWE1MX1RPS19ERUNMX0NMT1NFIDE3ICAgICAgICAgICAgIC8qID4gKi8KKyNkZWZpbmUgWE1MX1RPS19OQU1FIDE4CisjZGVmaW5lIFhNTF9UT0tfTk1UT0tFTiAxOQorI2RlZmluZSBYTUxfVE9LX1BPVU5EX05BTUUgMjAgICAgICAgICAgICAgLyogI25hbWUgKi8KKyNkZWZpbmUgWE1MX1RPS19PUiAyMSAgICAgICAgICAgICAgICAgICAgIC8qIHwgKi8KKyNkZWZpbmUgWE1MX1RPS19QRVJDRU5UIDIyCisjZGVmaW5lIFhNTF9UT0tfT1BFTl9QQVJFTiAyMworI2RlZmluZSBYTUxfVE9LX0NMT1NFX1BBUkVOIDI0CisjZGVmaW5lIFhNTF9UT0tfT1BFTl9CUkFDS0VUIDI1CisjZGVmaW5lIFhNTF9UT0tfQ0xPU0VfQlJBQ0tFVCAyNgorI2RlZmluZSBYTUxfVE9LX0xJVEVSQUwgMjcKKyNkZWZpbmUgWE1MX1RPS19QQVJBTV9FTlRJVFlfUkVGIDI4CisjZGVmaW5lIFhNTF9UT0tfSU5TVEFOQ0VfU1RBUlQgMjkKKworLyogVGhlIGZvbGxvd2luZyBvY2N1ciBvbmx5IGluIGVsZW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMgKi8KKyNkZWZpbmUgWE1MX1RPS19OQU1FX1FVRVNUSU9OIDMwICAgICAgICAgIC8qIG5hbWU/ICovCisjZGVmaW5lIFhNTF9UT0tfTkFNRV9BU1RFUklTSyAzMSAgICAgICAgICAvKiBuYW1lKiAqLworI2RlZmluZSBYTUxfVE9LX05BTUVfUExVUyAzMiAgICAgICAgICAgICAgLyogbmFtZSsgKi8KKyNkZWZpbmUgWE1MX1RPS19DT05EX1NFQ1RfT1BFTiAzMyAgICAgICAgIC8qIDwhWyAqLworI2RlZmluZSBYTUxfVE9LX0NPTkRfU0VDVF9DTE9TRSAzNCAgICAgICAgLyogXV0+ICovCisjZGVmaW5lIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUVVFU1RJT04gMzUgICAvKiApPyAqLworI2RlZmluZSBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLIDM2ICAgLyogKSogKi8KKyNkZWZpbmUgWE1MX1RPS19DTE9TRV9QQVJFTl9QTFVTIDM3ICAgICAgIC8qICkrICovCisjZGVmaW5lIFhNTF9UT0tfQ09NTUEgMzgKKworLyogVGhlIGZvbGxvd2luZyB0b2tlbiBpcyByZXR1cm5lZCBvbmx5IGJ5IFhtbEF0dHJpYnV0ZVZhbHVlVG9rICovCisjZGVmaW5lIFhNTF9UT0tfQVRUUklCVVRFX1ZBTFVFX1MgMzkKKworLyogVGhlIGZvbGxvd2luZyB0b2tlbiBpcyByZXR1cm5lZCBvbmx5IGJ5IFhtbENkYXRhU2VjdGlvblRvayAqLworI2RlZmluZSBYTUxfVE9LX0NEQVRBX1NFQ1RfQ0xPU0UgNDAKKworLyogV2l0aCBuYW1lc3BhY2UgcHJvY2Vzc2luZyB0aGlzIGlzIHJldHVybmVkIGJ5IFhtbFByb2xvZ1RvayBmb3IgYQorICAgbmFtZSB3aXRoIGEgY29sb24uCisqLworI2RlZmluZSBYTUxfVE9LX1BSRUZJWEVEX05BTUUgNDEKKworI2lmZGVmIFhNTF9EVEQKKyNkZWZpbmUgWE1MX1RPS19JR05PUkVfU0VDVCA0MgorI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworI2lmZGVmIFhNTF9EVEQKKyNkZWZpbmUgWE1MX05fU1RBVEVTIDQKKyNlbHNlIC8qIG5vdCBYTUxfRFREICovCisjZGVmaW5lIFhNTF9OX1NUQVRFUyAzCisjZW5kaWYgLyogbm90IFhNTF9EVEQgKi8KKworI2RlZmluZSBYTUxfUFJPTE9HX1NUQVRFIDAKKyNkZWZpbmUgWE1MX0NPTlRFTlRfU1RBVEUgMQorI2RlZmluZSBYTUxfQ0RBVEFfU0VDVElPTl9TVEFURSAyCisjaWZkZWYgWE1MX0RURAorI2RlZmluZSBYTUxfSUdOT1JFX1NFQ1RJT05fU1RBVEUgMworI2VuZGlmIC8qIFhNTF9EVEQgKi8KKworI2RlZmluZSBYTUxfTl9MSVRFUkFMX1RZUEVTIDIKKyNkZWZpbmUgWE1MX0FUVFJJQlVURV9WQUxVRV9MSVRFUkFMIDAKKyNkZWZpbmUgWE1MX0VOVElUWV9WQUxVRV9MSVRFUkFMIDEKKworLyogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBwYXNzZWQgdG8gWG1sVXRmOEVuY29kZSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMuICovCisjZGVmaW5lIFhNTF9VVEY4X0VOQ09ERV9NQVggNAorLyogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBwYXNzZWQgdG8gWG1sVXRmMTZFbmNvZGUgbXVzdCBiZSBhdCBsZWFzdCB0aGlzLiAqLworI2RlZmluZSBYTUxfVVRGMTZfRU5DT0RFX01BWCAyCisKK3R5cGVkZWYgc3RydWN0IHBvc2l0aW9uIHsKKyAgLyogZmlyc3QgbGluZSBhbmQgZmlyc3QgY29sdW1uIGFyZSAwIG5vdCAxICovCisgIFhNTF9TaXplIGxpbmVOdW1iZXI7CisgIFhNTF9TaXplIGNvbHVtbk51bWJlcjsKK30gUE9TSVRJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqdmFsdWVQdHI7CisgIGNvbnN0IGNoYXIgKnZhbHVlRW5kOworICBjaGFyIG5vcm1hbGl6ZWQ7Cit9IEFUVFJJQlVURTsKKworc3RydWN0IGVuY29kaW5nOwordHlwZWRlZiBzdHJ1Y3QgZW5jb2RpbmcgRU5DT0RJTkc7CisKK3R5cGVkZWYgaW50IChQVFJDQUxMICpTQ0FOTkVSKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKik7CisKK3N0cnVjdCBlbmNvZGluZyB7CisgIFNDQU5ORVIgc2Nhbm5lcnNbWE1MX05fU1RBVEVTXTsKKyAgU0NBTk5FUiBsaXRlcmFsU2Nhbm5lcnNbWE1MX05fTElURVJBTF9UWVBFU107CisgIGludCAoUFRSQ0FMTCAqc2FtZU5hbWUpKGNvbnN0IEVOQ09ESU5HICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJDQUxMICpuYW1lTWF0Y2hlc0FzY2lpKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJGQVNUQ0FMTCAqbmFtZUxlbmd0aCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgY29uc3QgY2hhciAqKFBUUkZBU1RDQUxMICpza2lwUykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKKyAgaW50IChQVFJDQUxMICpnZXRBdHRzKShjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0c01heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSSUJVVEUgKmF0dHMpOworICBpbnQgKFBUUkZBU1RDQUxMICpjaGFyUmVmTnVtYmVyKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpOworICBpbnQgKFBUUkNBTEwgKnByZWRlZmluZWRFbnRpdHlOYW1lKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKik7CisgIHZvaWQgKFBUUkNBTEwgKnVwZGF0ZVBvc2l0aW9uKShjb25zdCBFTkNPRElORyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TSVRJT04gKik7CisgIGludCAoUFRSQ0FMTCAqaXNQdWJsaWNJZCkoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipiYWRQdHIpOworICB2b2lkIChQVFJDQUxMICp1dGY4Q29udmVydCkoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdG9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9MaW0pOworICB2b2lkIChQVFJDQUxMICp1dGYxNkNvbnZlcnQpKGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmZyb21QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21MaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKip0b1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKTsKKyAgaW50IG1pbkJ5dGVzUGVyQ2hhcjsKKyAgY2hhciBpc1V0Zjg7CisgIGNoYXIgaXNVdGYxNjsKK307CisKKy8qIFNjYW4gdGhlIHN0cmluZyBzdGFydGluZyBhdCBwdHIgdW50aWwgdGhlIGVuZCBvZiB0aGUgbmV4dCBjb21wbGV0ZQorICAgdG9rZW4sIGJ1dCBkbyBub3Qgc2NhbiBwYXN0IGVwdHIuICBSZXR1cm4gYW4gaW50ZWdlciBnaXZpbmcgdGhlCisgICB0eXBlIG9mIHRva2VuLgorCisgICBSZXR1cm4gWE1MX1RPS19OT05FIHdoZW4gcHRyID09IGVwdHI7IG5leHRUb2tQdHIgd2lsbCBub3QgYmUgc2V0LgorCisgICBSZXR1cm4gWE1MX1RPS19QQVJUSUFMIHdoZW4gdGhlIHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgY29tcGxldGUKKyAgIHRva2VuOyBuZXh0VG9rUHRyIHdpbGwgbm90IGJlIHNldC4KKworICAgUmV0dXJuIFhNTF9UT0tfSU5WQUxJRCB3aGVuIHRoZSBzdHJpbmcgZG9lcyBub3Qgc3RhcnQgYSB2YWxpZAorICAgdG9rZW47IG5leHRUb2tQdHIgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8gdGhlIGNoYXJhY3RlciB3aGljaCBtYWRlCisgICB0aGUgdG9rZW4gaW52YWxpZC4KKworICAgT3RoZXJ3aXNlIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSB2YWxpZCB0b2tlbjsgbmV4dFRva1B0ciB3aWxsIGJlCisgICBzZXQgdG8gcG9pbnQgdG8gdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGVuZCBvZiB0aGF0IHRva2VuLgorCisgICBFYWNoIGRhdGEgY2hhcmFjdGVyIGNvdW50cyBhcyBhIHNpbmdsZSB0b2tlbiwgYnV0IGFkamFjZW50IGRhdGEKKyAgIGNoYXJhY3RlcnMgbWF5IGJlIHJldHVybmVkIHRvZ2V0aGVyLiAgU2ltaWxhcmx5IGZvciBjaGFyYWN0ZXJzIGluCisgICB0aGUgcHJvbG9nIG91dHNpZGUgbGl0ZXJhbHMsIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4KKyovCisKKworI2RlZmluZSBYbWxUb2soZW5jLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgKCgoZW5jKS0+c2Nhbm5lcnNbc3RhdGVdKShlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSkKKworI2RlZmluZSBYbWxQcm9sb2dUb2soZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAgWG1sVG9rKGVuYywgWE1MX1BST0xPR19TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNkZWZpbmUgWG1sQ29udGVudFRvayhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSBcCisgICBYbWxUb2soZW5jLCBYTUxfQ09OVEVOVF9TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNkZWZpbmUgWG1sQ2RhdGFTZWN0aW9uVG9rKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgIFhtbFRvayhlbmMsIFhNTF9DREFUQV9TRUNUSU9OX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKworI2lmZGVmIFhNTF9EVEQKKworI2RlZmluZSBYbWxJZ25vcmVTZWN0aW9uVG9rKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgIFhtbFRvayhlbmMsIFhNTF9JR05PUkVfU0VDVElPTl9TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNlbmRpZiAvKiBYTUxfRFREICovCisKKy8qIFRoaXMgaXMgdXNlZCBmb3IgcGVyZm9ybWluZyBhIDJuZC1sZXZlbCB0b2tlbml6YXRpb24gb24gdGhlIGNvbnRlbnQKKyAgIG9mIGEgbGl0ZXJhbCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgYnkgWG1sVG9rLgorKi8KKyNkZWZpbmUgWG1sTGl0ZXJhbFRvayhlbmMsIGxpdGVyYWxUeXBlLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAoKChlbmMpLT5saXRlcmFsU2Nhbm5lcnNbbGl0ZXJhbFR5cGVdKShlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSkKKworI2RlZmluZSBYbWxBdHRyaWJ1dGVWYWx1ZVRvayhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSBcCisgICBYbWxMaXRlcmFsVG9rKGVuYywgWE1MX0FUVFJJQlVURV9WQUxVRV9MSVRFUkFMLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKworI2RlZmluZSBYbWxFbnRpdHlWYWx1ZVRvayhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSBcCisgICBYbWxMaXRlcmFsVG9rKGVuYywgWE1MX0VOVElUWV9WQUxVRV9MSVRFUkFMLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKworI2RlZmluZSBYbWxTYW1lTmFtZShlbmMsIHB0cjEsIHB0cjIpICgoKGVuYyktPnNhbWVOYW1lKShlbmMsIHB0cjEsIHB0cjIpKQorCisjZGVmaW5lIFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIxLCBlbmQxLCBwdHIyKSBcCisgICgoKGVuYyktPm5hbWVNYXRjaGVzQXNjaWkpKGVuYywgcHRyMSwgZW5kMSwgcHRyMikpCisKKyNkZWZpbmUgWG1sTmFtZUxlbmd0aChlbmMsIHB0cikgXAorICAoKChlbmMpLT5uYW1lTGVuZ3RoKShlbmMsIHB0cikpCisKKyNkZWZpbmUgWG1sU2tpcFMoZW5jLCBwdHIpIFwKKyAgKCgoZW5jKS0+c2tpcFMpKGVuYywgcHRyKSkKKworI2RlZmluZSBYbWxHZXRBdHRyaWJ1dGVzKGVuYywgcHRyLCBhdHRzTWF4LCBhdHRzKSBcCisgICgoKGVuYyktPmdldEF0dHMpKGVuYywgcHRyLCBhdHRzTWF4LCBhdHRzKSkKKworI2RlZmluZSBYbWxDaGFyUmVmTnVtYmVyKGVuYywgcHRyKSBcCisgICgoKGVuYyktPmNoYXJSZWZOdW1iZXIpKGVuYywgcHRyKSkKKworI2RlZmluZSBYbWxQcmVkZWZpbmVkRW50aXR5TmFtZShlbmMsIHB0ciwgZW5kKSBcCisgICgoKGVuYyktPnByZWRlZmluZWRFbnRpdHlOYW1lKShlbmMsIHB0ciwgZW5kKSkKKworI2RlZmluZSBYbWxVcGRhdGVQb3NpdGlvbihlbmMsIHB0ciwgZW5kLCBwb3MpIFwKKyAgKCgoZW5jKS0+dXBkYXRlUG9zaXRpb24pKGVuYywgcHRyLCBlbmQsIHBvcykpCisKKyNkZWZpbmUgWG1sSXNQdWJsaWNJZChlbmMsIHB0ciwgZW5kLCBiYWRQdHIpIFwKKyAgKCgoZW5jKS0+aXNQdWJsaWNJZCkoZW5jLCBwdHIsIGVuZCwgYmFkUHRyKSkKKworI2RlZmluZSBYbWxVdGY4Q29udmVydChlbmMsIGZyb21QLCBmcm9tTGltLCB0b1AsIHRvTGltKSBcCisgICgoKGVuYyktPnV0ZjhDb252ZXJ0KShlbmMsIGZyb21QLCBmcm9tTGltLCB0b1AsIHRvTGltKSkKKworI2RlZmluZSBYbWxVdGYxNkNvbnZlcnQoZW5jLCBmcm9tUCwgZnJvbUxpbSwgdG9QLCB0b0xpbSkgXAorICAoKChlbmMpLT51dGYxNkNvbnZlcnQpKGVuYywgZnJvbVAsIGZyb21MaW0sIHRvUCwgdG9MaW0pKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIEVOQ09ESU5HIGluaXRFbmM7CisgIGNvbnN0IEVOQ09ESU5HICoqZW5jUHRyOworfSBJTklUX0VOQ09ESU5HOworCitpbnQgWG1sUGFyc2VYbWxEZWNsKGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmJhZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZlcnNpb25QdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5jb2RpbmdOYW1lUHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqKm5hbWVkRW5jb2RpbmdQdHIsCisgICAgICAgICAgICAgICAgICAgIGludCAqc3RhbmRhbG9uZVB0cik7CisKK2ludCBYbWxJbml0RW5jb2RpbmcoSU5JVF9FTkNPRElORyAqLCBjb25zdCBFTkNPRElORyAqKiwgY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBFTkNPRElORyAqWG1sR2V0VXRmOEludGVybmFsRW5jb2Rpbmcodm9pZCk7Citjb25zdCBFTkNPRElORyAqWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nKHZvaWQpOworaW50IEZBU1RDQUxMIFhtbFV0ZjhFbmNvZGUoaW50IGNoYXJOdW1iZXIsIGNoYXIgKmJ1Zik7CitpbnQgRkFTVENBTEwgWG1sVXRmMTZFbmNvZGUoaW50IGNoYXJOdW1iZXIsIHVuc2lnbmVkIHNob3J0ICpidWYpOworaW50IFhtbFNpemVPZlVua25vd25FbmNvZGluZyh2b2lkKTsKKworCit0eXBlZGVmIGludCAoWE1MQ0FMTCAqQ09OVkVSVEVSKSAodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKnApOworCitFTkNPRElORyAqCitYbWxJbml0VW5rbm93bkVuY29kaW5nKHZvaWQgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09OVkVSVEVSIGNvbnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKworaW50IFhtbFBhcnNlWG1sRGVjbE5TKGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqYmFkUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmNvZGluZ05hbWVQdHIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRU5DT0RJTkcgKipuYW1lZEVuY29kaW5nUHRyLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqc3RhbmRhbG9uZVB0cik7CisKK2ludCBYbWxJbml0RW5jb2RpbmdOUyhJTklUX0VOQ09ESU5HICosIGNvbnN0IEVOQ09ESU5HICoqLCBjb25zdCBjaGFyICpuYW1lKTsKK2NvbnN0IEVOQ09ESU5HICpYbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZ05TKHZvaWQpOworY29uc3QgRU5DT0RJTkcgKlhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZ05TKHZvaWQpOworRU5DT0RJTkcgKgorWG1sSW5pdFVua25vd25FbmNvZGluZ05TKHZvaWQgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZFUlRFUiBjb252ZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgWG1sVG9rX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuYyBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfaW1wbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyNjg4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuYwpAQCAtMCwwICsxLDE3ODMgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisvKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQhICovCisjaWZkZWYgWE1MX1RPS19JTVBMX0MKKworI2lmbmRlZiBJU19JTlZBTElEX0NIQVIKKyNkZWZpbmUgSVNfSU5WQUxJRF9DSEFSKGVuYywgcHRyLCBuKSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIElOVkFMSURfTEVBRF9DQVNFKG4sIHB0ciwgbmV4dFRva1B0cikgXAorICAgIGNhc2UgQlRfTEVBRCAjIyBuOiBcCisgICAgICBpZiAoZW5kIC0gcHRyIDwgbikgXAorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKKyAgICAgIGlmIChJU19JTlZBTElEX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKKyAgICAgICAgKihuZXh0VG9rUHRyKSA9IChwdHIpOyBcCisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7IFwKKyAgICAgIH0gXAorICAgICAgcHRyICs9IG47IFwKKyAgICAgIGJyZWFrOworCisjZGVmaW5lIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKSBcCisgIElOVkFMSURfTEVBRF9DQVNFKDIsIHB0ciwgbmV4dFRva1B0cikgXAorICBJTlZBTElEX0xFQURfQ0FTRSgzLCBwdHIsIG5leHRUb2tQdHIpIFwKKyAgSU5WQUxJRF9MRUFEX0NBU0UoNCwgcHRyLCBuZXh0VG9rUHRyKSBcCisgIGNhc2UgQlRfTk9OWE1MOiBcCisgIGNhc2UgQlRfTUFMRk9STTogXAorICBjYXNlIEJUX1RSQUlMOiBcCisgICAgKihuZXh0VG9rUHRyKSA9IChwdHIpOyBcCisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKworI2RlZmluZSBDSEVDS19OQU1FX0NBU0UobiwgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKKyAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKKyAgICAgaWYgKCFJU19OQU1FX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKKyAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAorICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7IFwKKyAgICAgfSBcCisgICAgIHB0ciArPSBuOyBcCisgICAgIGJyZWFrOworCisjZGVmaW5lIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICBjYXNlIEJUX05PTkFTQ0lJOiBcCisgICAgaWYgKCFJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeyBcCisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAorICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAorICAgIH0gXAorICBjYXNlIEJUX05NU1RSVDogXAorICBjYXNlIEJUX0hFWDogXAorICBjYXNlIEJUX0RJR0lUOiBcCisgIGNhc2UgQlRfTkFNRTogXAorICBjYXNlIEJUX01JTlVTOiBcCisgICAgcHRyICs9IE1JTkJQQyhlbmMpOyBcCisgICAgYnJlYWs7IFwKKyAgQ0hFQ0tfTkFNRV9DQVNFKDIsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgQ0hFQ0tfTkFNRV9DQVNFKDMsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgQ0hFQ0tfTkFNRV9DQVNFKDQsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisKKyNkZWZpbmUgQ0hFQ0tfTk1TVFJUX0NBU0UobiwgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKKyAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKKyAgICAgaWYgKCFJU19OTVNUUlRfQ0hBUihlbmMsIHB0ciwgbikpIHsgXAorICAgICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCisgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAorICAgICB9IFwKKyAgICAgcHRyICs9IG47IFwKKyAgICAgYnJlYWs7CisKKyNkZWZpbmUgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgY2FzZSBCVF9OT05BU0NJSTogXAorICAgIGlmICghSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeyBcCisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAorICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAorICAgIH0gXAorICBjYXNlIEJUX05NU1RSVDogXAorICBjYXNlIEJUX0hFWDogXAorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsgXAorICAgIGJyZWFrOyBcCisgIENIRUNLX05NU1RSVF9DQVNFKDIsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKKyAgQ0hFQ0tfTk1TVFJUX0NBU0UoMywgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAorICBDSEVDS19OTVNUUlRfQ0FTRSg0LCBlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorCisjaWZuZGVmIFBSRUZJWAorI2RlZmluZSBQUkVGSVgoaWRlbnQpIGlkZW50CisjZW5kaWYKKworLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICI8IS0iICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5Db21tZW50KShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgIT0gZW5kKSB7CisgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX01JTlVTKSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgICAgSU5WQUxJRF9DQVNFUyhwdHIsIG5leHRUb2tQdHIpCisgICAgICBjYXNlIEJUX01JTlVTOgorICAgICAgICBpZiAoKHB0ciArPSBNSU5CUEMoZW5jKSkgPT0gZW5kKQorICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX01JTlVTKSkgeworICAgICAgICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9HVCkpIHsKKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgICB9CisgICAgICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19DT01NRU5UOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKK30KKworLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICI8ISIgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhbkRlY2wpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgIGNhc2UgQlRfTUlOVVM6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuQ29tbWVudCkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9MU1FCOgorICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgcmV0dXJuIFhNTF9UT0tfQ09ORF9TRUNUX09QRU47CisgIGNhc2UgQlRfTk1TVFJUOgorICBjYXNlIEJUX0hFWDoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgfQorICB3aGlsZSAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfUEVSQ05UOgorICAgICAgaWYgKHB0ciArIE1JTkJQQyhlbmMpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIC8qIGRvbid0IGFsbG93IDwhRU5USVRZJSBmb28gIndoYXRldmVyIj4gKi8KKyAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyICsgTUlOQlBDKGVuYykpKSB7CisgICAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6IGNhc2UgQlRfUEVSQ05UOgorICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREVDTF9PUEVOOworICAgIGNhc2UgQlRfTk1TVFJUOgorICAgIGNhc2UgQlRfSEVYOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoY2hlY2tQaVRhcmdldCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgaW50ICp0b2tQdHIpCit7CisgIGludCB1cHBlciA9IDA7CisgICp0b2tQdHIgPSBYTUxfVE9LX1BJOworICBpZiAoZW5kIC0gcHRyICE9IE1JTkJQQyhlbmMpKjMpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAoQllURV9UT19BU0NJSShlbmMsIHB0cikpIHsKKyAgY2FzZSBBU0NJSV94OgorICAgIGJyZWFrOworICBjYXNlIEFTQ0lJX1g6CisgICAgdXBwZXIgPSAxOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiAxOworICB9CisgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgc3dpdGNoIChCWVRFX1RPX0FTQ0lJKGVuYywgcHRyKSkgeworICBjYXNlIEFTQ0lJX206CisgICAgYnJlYWs7CisgIGNhc2UgQVNDSUlfTToKKyAgICB1cHBlciA9IDE7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcHRyICs9IE1JTkJQQyhlbmMpOworICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7CisgIGNhc2UgQVNDSUlfbDoKKyAgICBicmVhazsKKyAgY2FzZSBBU0NJSV9MOgorICAgIHVwcGVyID0gMTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAodXBwZXIpCisgICAgcmV0dXJuIDA7CisgICp0b2tQdHIgPSBYTUxfVE9LX1hNTF9ERUNMOworICByZXR1cm4gMTsKK30KKworLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICI8PyIgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhblBpKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpbnQgdG9rOworICBjb25zdCBjaGFyICp0YXJnZXQgPSBwdHI7CisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgZGVmYXVsdDoKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICB9CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgQ0hFQ0tfTkFNRV9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgIGlmICghUFJFRklYKGNoZWNrUGlUYXJnZXQpKGVuYywgdGFyZ2V0LCBwdHIsICZ0b2spKSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICAgIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKQorICAgICAgICBjYXNlIEJUX1FVRVNUOgorICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgICAgICAgcmV0dXJuIHRvazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgIGNhc2UgQlRfUVVFU1Q6CisgICAgICBpZiAoIVBSRUZJWChjaGVja1BpVGFyZ2V0KShlbmMsIHRhcmdldCwgcHRyLCAmdG9rKSkgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHJldHVybiB0b2s7CisgICAgICB9CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChzY2FuQ2RhdGFTZWN0aW9uKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgQ0RBVEFfTFNRQltdID0geyBBU0NJSV9DLCBBU0NJSV9ELCBBU0NJSV9BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJX1QsIEFTQ0lJX0EsIEFTQ0lJX0xTUUIgfTsKKyAgaW50IGk7CisgIC8qIENEQVRBWyAqLworICBpZiAoZW5kIC0gcHRyIDwgNiAqIE1JTkJQQyhlbmMpKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyssIHB0ciArPSBNSU5CUEMoZW5jKSkgeworICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBDREFUQV9MU1FCW2ldKSkgeworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgcmV0dXJuIFhNTF9UT0tfQ0RBVEFfU0VDVF9PUEVOOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChjZGF0YVNlY3Rpb25Ub2spKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX05PTkU7CisgIGlmIChNSU5CUEMoZW5jKSA+IDEpIHsKKyAgICBzaXplX3QgbiA9IGVuZCAtIHB0cjsKKyAgICBpZiAobiAmIChNSU5CUEMoZW5jKSAtIDEpKSB7CisgICAgICBuICY9IH4oTUlOQlBDKGVuYykgLSAxKTsKKyAgICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICBlbmQgPSBwdHIgKyBuOworICAgIH0KKyAgfQorICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgY2FzZSBCVF9SU1FCOgorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBpZiAocHRyID09IGVuZCkKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX1JTUUIpKQorICAgICAgYnJlYWs7CisgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICBwdHIgLT0gTUlOQlBDKGVuYyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19DREFUQV9TRUNUX0NMT1NFOworICBjYXNlIEJUX0NSOgorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBpZiAocHRyID09IGVuZCkKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgaWYgKEJZVEVfVFlQRShlbmMsIHB0cikgPT0gQlRfTEYpCisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOworICBjYXNlIEJUX0xGOgorICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOworICBJTlZBTElEX0NBU0VTKHB0ciwgbmV4dFRva1B0cikKKyAgZGVmYXVsdDoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgYnJlYWs7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKKyAgICBjYXNlIEJUX0xFQUQgIyMgbjogXAorICAgICAgaWYgKGVuZCAtIHB0ciA8IG4gfHwgSVNfSU5WQUxJRF9DSEFSKGVuYywgcHRyLCBuKSkgeyBcCisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCisgICAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7IFwKKyAgICAgIH0gXAorICAgICAgcHRyICs9IG47IFwKKyAgICAgIGJyZWFrOworICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCisjdW5kZWYgTEVBRF9DQVNFCisgICAgY2FzZSBCVF9OT05YTUw6CisgICAgY2FzZSBCVF9NQUxGT1JNOgorICAgIGNhc2UgQlRfVFJBSUw6CisgICAgY2FzZSBCVF9DUjoKKyAgICBjYXNlIEJUX0xGOgorICAgIGNhc2UgQlRfUlNRQjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpuZXh0VG9rUHRyID0gcHRyOworICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIjwvIiAqLworCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChzY2FuRW5kVGFnKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgIENIRUNLX05NU1RSVF9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgorICAgICAgZm9yIChwdHIgKz0gTUlOQlBDKGVuYyk7IHB0ciAhPSBlbmQ7IHB0ciArPSBNSU5CUEMoZW5jKSkgeworICAgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJUX0dUOgorICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfRU5EX1RBRzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworI2lmZGVmIFhNTF9OUworICAgIGNhc2UgQlRfQ09MT046CisgICAgICAvKiBubyBuZWVkIHRvIGNoZWNrIHFuYW1lIHN5bnRheCBoZXJlLAorICAgICAgICAgc2luY2UgZW5kLXRhZyBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBCVF9HVDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICByZXR1cm4gWE1MX1RPS19FTkRfVEFHOworICAgIGRlZmF1bHQ6CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKKy8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiJiNYIiAqLworCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChzY2FuSGV4Q2hhclJlZikoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpZiAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfRElHSVQ6CisgICAgY2FzZSBCVF9IRVg6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7CisgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQlRfRElHSVQ6CisgICAgICBjYXNlIEJUX0hFWDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX1NFTUk6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0NIQVJfUkVGOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKKy8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiJiMiICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5DaGFyUmVmKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgIT0gZW5kKSB7CisgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfeCkpCisgICAgICByZXR1cm4gUFJFRklYKHNjYW5IZXhDaGFyUmVmKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfRElHSVQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7CisgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQlRfRElHSVQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCVF9TRU1JOgorICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgICByZXR1cm4gWE1MX1RPS19DSEFSX1JFRjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIiYiICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5SZWYpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgIGNhc2UgQlRfTlVNOgorICAgIHJldHVybiBQUkVGSVgoc2NhbkNoYXJSZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgIGRlZmF1bHQ6CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgfQorICB3aGlsZSAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICBjYXNlIEJUX1NFTUk6CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfRU5USVRZX1JFRjsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgZmlyc3QgY2hhcmFjdGVyIG9mIGF0dHJpYnV0ZSBuYW1lICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5BdHRzKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisjaWZkZWYgWE1MX05TCisgIGludCBoYWRDb2xvbiA9IDA7CisjZW5kaWYKKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyAgICAgIGlmIChoYWRDb2xvbikgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIGhhZENvbG9uID0gMTsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6CisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCB0OworCisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgdCA9IEJZVEVfVFlQRShlbmMsIHB0cik7CisgICAgICAgIGlmICh0ID09IEJUX0VRVUFMUykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoICh0KSB7CisgICAgICAgIGNhc2UgQlRfUzoKKyAgICAgICAgY2FzZSBCVF9MRjoKKyAgICAgICAgY2FzZSBCVF9DUjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgICB9CisgICAgICB9CisgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBCVF9FUVVBTFM6CisgICAgICB7CisgICAgICAgIGludCBvcGVuOworI2lmZGVmIFhNTF9OUworICAgICAgICBoYWRDb2xvbiA9IDA7CisjZW5kaWYKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgICAgb3BlbiA9IEJZVEVfVFlQRShlbmMsIHB0cik7CisgICAgICAgICAgaWYgKG9wZW4gPT0gQlRfUVVPVCB8fCBvcGVuID09IEJUX0FQT1MpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBzd2l0Y2ggKG9wZW4pIHsKKyAgICAgICAgICBjYXNlIEJUX1M6CisgICAgICAgICAgY2FzZSBCVF9MRjoKKyAgICAgICAgICBjYXNlIEJUX0NSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAvKiBpbiBhdHRyaWJ1dGUgdmFsdWUgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgIGludCB0OworICAgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgICB0ID0gQllURV9UWVBFKGVuYywgcHRyKTsKKyAgICAgICAgICBpZiAodCA9PSBvcGVuKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgc3dpdGNoICh0KSB7CisgICAgICAgICAgSU5WQUxJRF9DQVNFUyhwdHIsIG5leHRUb2tQdHIpCisgICAgICAgICAgY2FzZSBCVF9BTVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCB0b2sgPSBQUkVGSVgoc2NhblJlZikoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCAmcHRyKTsKKyAgICAgICAgICAgICAgaWYgKHRvayA8PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHRvayA9PSBYTUxfVE9LX0lOVkFMSUQpCisgICAgICAgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQlRfTFQ6CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgICAgICBjYXNlIEJUX1M6CisgICAgICAgIGNhc2UgQlRfQ1I6CisgICAgICAgIGNhc2UgQlRfTEY6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlRfU09MOgorICAgICAgICAgIGdvdG8gc29sOworICAgICAgICBjYXNlIEJUX0dUOgorICAgICAgICAgIGdvdG8gZ3Q7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICAvKiBwdHIgcG9pbnRzIHRvIGNsb3NpbmcgcXVvdGUgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICAgICAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgICAgICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSBCVF9HVDoKKyAgICAgICAgICBndDoKKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19TVEFSVF9UQUdfV0lUSF9BVFRTOworICAgICAgICAgIGNhc2UgQlRfU09MOgorICAgICAgICAgIHNvbDoKKyAgICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgICAgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX0dUKSkgeworICAgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19FTVBUWV9FTEVNRU5UX1dJVEhfQVRUUzsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworfQorCisvKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIjwiICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHNjYW5MdCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyNpZmRlZiBYTUxfTlMKKyAgaW50IGhhZENvbG9uOworI2VuZGlmCisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgY2FzZSBCVF9FWENMOgorICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfTUlOVVM6CisgICAgICByZXR1cm4gUFJFRklYKHNjYW5Db21tZW50KShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICAgIGNhc2UgQlRfTFNRQjoKKyAgICAgIHJldHVybiBQUkVGSVgoc2NhbkNkYXRhU2VjdGlvbikoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLCBuZXh0VG9rUHRyKTsKKyAgICB9CisgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgY2FzZSBCVF9RVUVTVDoKKyAgICByZXR1cm4gUFJFRklYKHNjYW5QaSkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9TT0w6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuRW5kVGFnKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyNpZmRlZiBYTUxfTlMKKyAgaGFkQ29sb24gPSAwOworI2VuZGlmCisgIC8qIHdlIGhhdmUgYSBzdGFydC10YWcgKi8KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyAgICAgIGlmIChoYWRDb2xvbikgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgIGhhZENvbG9uID0gMTsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6CisgICAgICB7CisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICAgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgICAgICAgICBjYXNlIEJUX0dUOgorICAgICAgICAgICAgZ290byBndDsKKyAgICAgICAgICBjYXNlIEJUX1NPTDoKKyAgICAgICAgICAgIGdvdG8gc29sOworICAgICAgICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBQUkVGSVgoc2NhbkF0dHMpKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgICAgICB9CisgICAgY2FzZSBCVF9HVDoKKyAgICBndDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICByZXR1cm4gWE1MX1RPS19TVEFSVF9UQUdfTk9fQVRUUzsKKyAgICBjYXNlIEJUX1NPTDoKKyAgICBzb2w6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9HVCkpIHsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfRU1QVFlfRUxFTUVOVF9OT19BVFRTOworICAgIGRlZmF1bHQ6CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGNvbnRlbnRUb2spKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19OT05FOworICBpZiAoTUlOQlBDKGVuYykgPiAxKSB7CisgICAgc2l6ZV90IG4gPSBlbmQgLSBwdHI7CisgICAgaWYgKG4gJiAoTUlOQlBDKGVuYykgLSAxKSkgeworICAgICAgbiAmPSB+KE1JTkJQQyhlbmMpIC0gMSk7CisgICAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgZW5kID0gcHRyICsgbjsKKyAgICB9CisgIH0KKyAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgIGNhc2UgQlRfTFQ6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuTHQpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgIGNhc2UgQlRfQU1QOgorICAgIHJldHVybiBQUkVGSVgoc2NhblJlZikoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9DUjoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICByZXR1cm4gWE1MX1RPS19UUkFJTElOR19DUjsKKyAgICBpZiAoQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7CisgIGNhc2UgQlRfTEY6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7CisgIGNhc2UgQlRfUlNRQjoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICByZXR1cm4gWE1MX1RPS19UUkFJTElOR19SU1FCOworICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9SU1FCKSkKKyAgICAgIGJyZWFrOworICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBpZiAocHRyID09IGVuZCkKKyAgICAgIHJldHVybiBYTUxfVE9LX1RSQUlMSU5HX1JTUUI7CisgICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX0dUKSkgeworICAgICAgcHRyIC09IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKQorICBkZWZhdWx0OgorICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBicmVhazsKKyAgfQorICB3aGlsZSAocHRyICE9IGVuZCkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworI2RlZmluZSBMRUFEX0NBU0UobikgXAorICAgIGNhc2UgQlRfTEVBRCAjIyBuOiBcCisgICAgICBpZiAoZW5kIC0gcHRyIDwgbiB8fCBJU19JTlZBTElEX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7IFwKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsgXAorICAgICAgfSBcCisgICAgICBwdHIgKz0gbjsgXAorICAgICAgYnJlYWs7CisgICAgTEVBRF9DQVNFKDIpIExFQURfQ0FTRSgzKSBMRUFEX0NBU0UoNCkKKyN1bmRlZiBMRUFEX0NBU0UKKyAgICBjYXNlIEJUX1JTUUI6CisgICAgICBpZiAocHRyICsgTUlOQlBDKGVuYykgIT0gZW5kKSB7CisgICAgICAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBBU0NJSV9SU1FCKSkgeworICAgICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgaWYgKHB0ciArIDIqTUlOQlBDKGVuYykgIT0gZW5kKSB7CisgICAgICAgICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyICsgMipNSU5CUEMoZW5jKSwgQVNDSUlfR1QpKSB7CisgICAgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgMipNSU5CUEMoZW5jKTsKKyAgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgQlRfQU1QOgorICAgIGNhc2UgQlRfTFQ6CisgICAgY2FzZSBCVF9OT05YTUw6CisgICAgY2FzZSBCVF9NQUxGT1JNOgorICAgIGNhc2UgQlRfVFJBSUw6CisgICAgY2FzZSBCVF9DUjoKKyAgICBjYXNlIEJUX0xGOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworICAgIGRlZmF1bHQ6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgKm5leHRUb2tQdHIgPSBwdHI7CisgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Cit9CisKKy8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiJSIgKi8KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhblBlcmNlbnQpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIC1YTUxfVE9LX1BFUkNFTlQ7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgY2FzZSBCVF9TOiBjYXNlIEJUX0xGOiBjYXNlIEJUX0NSOiBjYXNlIEJUX1BFUkNOVDoKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19QRVJDRU5UOworICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgY2FzZSBCVF9TRU1JOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUY7CisgICAgZGVmYXVsdDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhblBvdW5kTmFtZSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGlmIChwdHIgPT0gZW5kKQorICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKKyAgZGVmYXVsdDoKKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICB9CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgQ0hFQ0tfTkFNRV9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQorICAgIGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6IGNhc2UgQlRfUzoKKyAgICBjYXNlIEJUX1JQQVI6IGNhc2UgQlRfR1Q6IGNhc2UgQlRfUEVSQ05UOiBjYXNlIEJUX1ZFUkJBUjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfUE9VTkRfTkFNRTsKKyAgICBkZWZhdWx0OgorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIH0KKyAgfQorICByZXR1cm4gLVhNTF9UT0tfUE9VTkRfTkFNRTsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2NhbkxpdCkoaW50IG9wZW4sIGNvbnN0IEVOQ09ESU5HICplbmMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgaW50IHQgPSBCWVRFX1RZUEUoZW5jLCBwdHIpOworICAgIHN3aXRjaCAodCkgeworICAgIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKQorICAgIGNhc2UgQlRfUVVPVDoKKyAgICBjYXNlIEJUX0FQT1M6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAodCAhPSBvcGVuKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gLVhNTF9UT0tfTElURVJBTDsKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6CisgICAgICBjYXNlIEJUX0dUOiBjYXNlIEJUX1BFUkNOVDogY2FzZSBCVF9MU1FCOgorICAgICAgICByZXR1cm4gWE1MX1RPS19MSVRFUkFMOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKHByb2xvZ1RvaykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaW50IHRvazsKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKKyAgaWYgKE1JTkJQQyhlbmMpID4gMSkgeworICAgIHNpemVfdCBuID0gZW5kIC0gcHRyOworICAgIGlmIChuICYgKE1JTkJQQyhlbmMpIC0gMSkpIHsKKyAgICAgIG4gJj0gfihNSU5CUEMoZW5jKSAtIDEpOworICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGVuZCA9IHB0ciArIG47CisgICAgfQorICB9CisgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICBjYXNlIEJUX1FVT1Q6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuTGl0KShCVF9RVU9ULCBlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICBjYXNlIEJUX0FQT1M6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuTGl0KShCVF9BUE9TLCBlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICBjYXNlIEJUX0xUOgorICAgIHsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgICBjYXNlIEJUX0VYQ0w6CisgICAgICAgIHJldHVybiBQUkVGSVgoc2NhbkRlY2wpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgICAgICBjYXNlIEJUX1FVRVNUOgorICAgICAgICByZXR1cm4gUFJFRklYKHNjYW5QaSkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgICAgIGNhc2UgQlRfTk1TVFJUOgorICAgICAgY2FzZSBCVF9IRVg6CisgICAgICBjYXNlIEJUX05PTkFTQ0lJOgorICAgICAgY2FzZSBCVF9MRUFEMjoKKyAgICAgIGNhc2UgQlRfTEVBRDM6CisgICAgICBjYXNlIEJUX0xFQUQ0OgorICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciAtIE1JTkJQQyhlbmMpOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlNUQU5DRV9TVEFSVDsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIGNhc2UgQlRfQ1I6CisgICAgaWYgKHB0ciArIE1JTkJQQyhlbmMpID09IGVuZCkgeworICAgICAgKm5leHRUb2tQdHIgPSBlbmQ7CisgICAgICAvKiBpbmRpY2F0ZSB0aGF0IHRoaXMgbWlnaHQgYmUgcGFydCBvZiBhIENSL0xGIHBhaXIgKi8KKyAgICAgIHJldHVybiAtWE1MX1RPS19QUk9MT0dfUzsKKyAgICB9CisgICAgLyogZmFsbCB0aHJvdWdoICovCisgIGNhc2UgQlRfUzogY2FzZSBCVF9MRjoKKyAgICBmb3IgKDs7KSB7CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgYnJlYWs7CisgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQlRfUzogY2FzZSBCVF9MRjoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJUX0NSOgorICAgICAgICAvKiBkb24ndCBzcGxpdCBDUi9MRiBwYWlyICovCisgICAgICAgIGlmIChwdHIgKyBNSU5CUEMoZW5jKSAhPSBlbmQpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX1BST0xPR19TOworICAgICAgfQorICAgIH0KKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19QUk9MT0dfUzsKKyAgY2FzZSBCVF9QRVJDTlQ6CisgICAgcmV0dXJuIFBSRUZJWChzY2FuUGVyY2VudCkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKKyAgY2FzZSBCVF9DT01NQToKKyAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgIHJldHVybiBYTUxfVE9LX0NPTU1BOworICBjYXNlIEJUX0xTUUI6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19PUEVOX0JSQUNLRVQ7CisgIGNhc2UgQlRfUlNRQjoKKyAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICByZXR1cm4gLVhNTF9UT0tfQ0xPU0VfQlJBQ0tFVDsKKyAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9SU1FCKSkgeworICAgICAgaWYgKHB0ciArIE1JTkJQQyhlbmMpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgQVNDSUlfR1QpKSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgMipNSU5CUEMoZW5jKTsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfQ09ORF9TRUNUX0NMT1NFOworICAgICAgfQorICAgIH0KKyAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICByZXR1cm4gWE1MX1RPS19DTE9TRV9CUkFDS0VUOworICBjYXNlIEJUX0xQQVI6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19PUEVOX1BBUkVOOworICBjYXNlIEJUX1JQQVI6CisgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgcmV0dXJuIC1YTUxfVE9LX0NMT1NFX1BBUkVOOworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgIGNhc2UgQlRfQVNUOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLOworICAgIGNhc2UgQlRfUVVFU1Q6CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUVVFU1RJT047CisgICAgY2FzZSBCVF9QTFVTOgorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX0NMT1NFX1BBUkVOX1BMVVM7CisgICAgY2FzZSBCVF9DUjogY2FzZSBCVF9MRjogY2FzZSBCVF9TOgorICAgIGNhc2UgQlRfR1Q6IGNhc2UgQlRfQ09NTUE6IGNhc2UgQlRfVkVSQkFSOgorICAgIGNhc2UgQlRfUlBBUjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfQ0xPU0VfUEFSRU47CisgICAgfQorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIGNhc2UgQlRfVkVSQkFSOgorICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgcmV0dXJuIFhNTF9UT0tfT1I7CisgIGNhc2UgQlRfR1Q6CisgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICByZXR1cm4gWE1MX1RPS19ERUNMX0NMT1NFOworICBjYXNlIEJUX05VTToKKyAgICByZXR1cm4gUFJFRklYKHNjYW5Qb3VuZE5hbWUpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgIGNhc2UgQlRfTEVBRCAjIyBuOiBcCisgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKKyAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUxfQ0hBUjsgXAorICAgIGlmIChJU19OTVNUUlRfQ0hBUihlbmMsIHB0ciwgbikpIHsgXAorICAgICAgcHRyICs9IG47IFwKKyAgICAgIHRvayA9IFhNTF9UT0tfTkFNRTsgXAorICAgICAgYnJlYWs7IFwKKyAgICB9IFwKKyAgICBpZiAoSVNfTkFNRV9DSEFSKGVuYywgcHRyLCBuKSkgeyBcCisgICAgICBwdHIgKz0gbjsgXAorICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOyBcCisgICAgICBicmVhazsgXAorICAgIH0gXAorICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCisgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICBjYXNlIEJUX05NU1RSVDoKKyAgY2FzZSBCVF9IRVg6CisgICAgdG9rID0gWE1MX1RPS19OQU1FOworICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBicmVhazsKKyAgY2FzZSBCVF9ESUdJVDoKKyAgY2FzZSBCVF9OQU1FOgorICBjYXNlIEJUX01JTlVTOgorI2lmZGVmIFhNTF9OUworICBjYXNlIEJUX0NPTE9OOgorI2VuZGlmCisgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOworICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICBicmVhazsKKyAgY2FzZSBCVF9OT05BU0NJSToKKyAgICBpZiAoSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgdG9rID0gWE1MX1RPS19OQU1FOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICBkZWZhdWx0OgorICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgY2FzZSBCVF9HVDogY2FzZSBCVF9SUEFSOiBjYXNlIEJUX0NPTU1BOgorICAgIGNhc2UgQlRfVkVSQkFSOiBjYXNlIEJUX0xTUUI6IGNhc2UgQlRfUEVSQ05UOgorICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIHRvazsKKyNpZmRlZiBYTUxfTlMKKyAgICBjYXNlIEJUX0NPTE9OOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgc3dpdGNoICh0b2spIHsKKyAgICAgIGNhc2UgWE1MX1RPS19OQU1FOgorICAgICAgICBpZiAocHRyID09IGVuZCkKKyAgICAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOworICAgICAgICB0b2sgPSBYTUxfVE9LX1BSRUZJWEVEX05BTUU7CisgICAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworICAgICAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6CisgICAgICAgIHRvayA9IFhNTF9UT0tfTk1UT0tFTjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgQlRfUExVUzoKKyAgICAgIGlmICh0b2sgPT0gWE1MX1RPS19OTVRPS0VOKSAgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICByZXR1cm4gWE1MX1RPS19OQU1FX1BMVVM7CisgICAgY2FzZSBCVF9BU1Q6CisgICAgICBpZiAodG9rID09IFhNTF9UT0tfTk1UT0tFTikgIHsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgcmV0dXJuIFhNTF9UT0tfTkFNRV9BU1RFUklTSzsKKyAgICBjYXNlIEJUX1FVRVNUOgorICAgICAgaWYgKHRvayA9PSBYTUxfVE9LX05NVE9LRU4pICB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgICAgfQorICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgIHJldHVybiBYTUxfVE9LX05BTUVfUVVFU1RJT047CisgICAgZGVmYXVsdDoKKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC10b2s7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGF0dHJpYnV0ZVZhbHVlVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIGNvbnN0IGNoYXIgKnN0YXJ0OworICBpZiAocHRyID09IGVuZCkKKyAgICByZXR1cm4gWE1MX1RPS19OT05FOworICBzdGFydCA9IHB0cjsKKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKKyAgICBjYXNlIEJUX0xFQUQgIyMgbjogcHRyICs9IG47IGJyZWFrOworICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCisjdW5kZWYgTEVBRF9DQVNFCisgICAgY2FzZSBCVF9BTVA6CisgICAgICBpZiAocHRyID09IHN0YXJ0KQorICAgICAgICByZXR1cm4gUFJFRklYKHNjYW5SZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7CisgICAgY2FzZSBCVF9MVDoKKyAgICAgIC8qIHRoaXMgaXMgZm9yIGluc2lkZSBlbnRpdHkgcmVmZXJlbmNlcyAqLworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOworICAgIGNhc2UgQlRfTEY6CisgICAgICBpZiAocHRyID09IHN0YXJ0KSB7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBjYXNlIEJUX0NSOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkgeworICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgIGlmIChwdHIgPT0gZW5kKQorICAgICAgICAgIHJldHVybiBYTUxfVE9LX1RSQUlMSU5HX0NSOworICAgICAgICBpZiAoQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKKyAgICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7CisgICAgY2FzZSBCVF9TOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkgeworICAgICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOworICAgICAgICByZXR1cm4gWE1MX1RPS19BVFRSSUJVVEVfVkFMVUVfUzsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpuZXh0VG9rUHRyID0gcHRyOworICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChlbnRpdHlWYWx1ZVRvaykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICBjb25zdCBjaGFyICpzdGFydDsKKyAgaWYgKHB0ciA9PSBlbmQpCisgICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKKyAgc3RhcnQgPSBwdHI7CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IHB0ciArPSBuOyBicmVhazsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICAgIGNhc2UgQlRfQU1QOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkKKyAgICAgICAgcmV0dXJuIFBSRUZJWChzY2FuUmVmKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOworICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworICAgIGNhc2UgQlRfUEVSQ05UOgorICAgICAgaWYgKHB0ciA9PSBzdGFydCkgeworICAgICAgICBpbnQgdG9rID0gIFBSRUZJWChzY2FuUGVyY2VudCkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwgbmV4dFRva1B0cik7CisgICAgICAgIHJldHVybiAodG9rID09IFhNTF9UT0tfUEVSQ0VOVCkgPyBYTUxfVE9LX0lOVkFMSUQgOiB0b2s7CisgICAgICB9CisgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7CisgICAgY2FzZSBCVF9MRjoKKyAgICAgIGlmIChwdHIgPT0gc3RhcnQpIHsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOworICAgICAgfQorICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworICAgIGNhc2UgQlRfQ1I6CisgICAgICBpZiAocHRyID09IHN0YXJ0KSB7CisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgaWYgKHB0ciA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfVFJBSUxJTkdfQ1I7CisgICAgICAgIGlmIChCWVRFX1RZUEUoZW5jLCBwdHIpID09IEJUX0xGKQorICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgKm5leHRUb2tQdHIgPSBwdHI7CisgICAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKKyAgICAgIH0KKyAgICAgICpuZXh0VG9rUHRyID0gcHRyOworICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgICpuZXh0VG9rUHRyID0gcHRyOworICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOworfQorCisjaWZkZWYgWE1MX0RURAorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChpZ25vcmVTZWN0aW9uVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKK3sKKyAgaW50IGxldmVsID0gMDsKKyAgaWYgKE1JTkJQQyhlbmMpID4gMSkgeworICAgIHNpemVfdCBuID0gZW5kIC0gcHRyOworICAgIGlmIChuICYgKE1JTkJQQyhlbmMpIC0gMSkpIHsKKyAgICAgIG4gJj0gfihNSU5CUEMoZW5jKSAtIDEpOworICAgICAgZW5kID0gcHRyICsgbjsKKyAgICB9CisgIH0KKyAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBJTlZBTElEX0NBU0VTKHB0ciwgbmV4dFRva1B0cikKKyAgICBjYXNlIEJUX0xUOgorICAgICAgaWYgKChwdHIgKz0gTUlOQlBDKGVuYykpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX0VYQ0wpKSB7CisgICAgICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfTFNRQikpIHsKKyAgICAgICAgICArK2xldmVsOworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9SU1FCOgorICAgICAgaWYgKChwdHIgKz0gTUlOQlBDKGVuYykpID09IGVuZCkKKyAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX1JTUUIpKSB7CisgICAgICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCisgICAgICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKKyAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfR1QpKSB7CisgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsKKyAgICAgICAgICAgIHJldHVybiBYTUxfVE9LX0lHTk9SRV9TRUNUOworICAgICAgICAgIH0KKyAgICAgICAgICAtLWxldmVsOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Cit9CisKKyNlbmRpZiAvKiBYTUxfRFREICovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGlzUHVibGljSWQpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipiYWRQdHIpCit7CisgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgZW5kIC09IE1JTkJQQyhlbmMpOworICBmb3IgKDsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisgICAgY2FzZSBCVF9ESUdJVDoKKyAgICBjYXNlIEJUX0hFWDoKKyAgICBjYXNlIEJUX01JTlVTOgorICAgIGNhc2UgQlRfQVBPUzoKKyAgICBjYXNlIEJUX0xQQVI6CisgICAgY2FzZSBCVF9SUEFSOgorICAgIGNhc2UgQlRfUExVUzoKKyAgICBjYXNlIEJUX0NPTU1BOgorICAgIGNhc2UgQlRfU09MOgorICAgIGNhc2UgQlRfRVFVQUxTOgorICAgIGNhc2UgQlRfUVVFU1Q6CisgICAgY2FzZSBCVF9DUjoKKyAgICBjYXNlIEJUX0xGOgorICAgIGNhc2UgQlRfU0VNSToKKyAgICBjYXNlIEJUX0VYQ0w6CisgICAgY2FzZSBCVF9BU1Q6CisgICAgY2FzZSBCVF9QRVJDTlQ6CisgICAgY2FzZSBCVF9OVU06CisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9TOgorICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfVEFCKSkgeworICAgICAgICAqYmFkUHRyID0gcHRyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfTkFNRToKKyAgICBjYXNlIEJUX05NU1RSVDoKKyAgICAgIGlmICghKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpICYgfjB4N2YpKQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc3dpdGNoIChCWVRFX1RPX0FTQ0lJKGVuYywgcHRyKSkgeworICAgICAgY2FzZSAweDI0OiAvKiAkICovCisgICAgICBjYXNlIDB4NDA6IC8qIEAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAqYmFkUHRyID0gcHRyOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLyogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIGZvciBhIHdlbGwtZm9ybWVkIHN0YXJ0LXRhZyBvciBlbXB0eQorICAgZWxlbWVudCB0YWcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcy4gIFBvaW50ZXJzIHRvIHRoZQorICAgZmlyc3QgYXR0c01heCBhdHRyaWJ1dGVzIGFyZSBzdG9yZWQgaW4gYXR0cy4KKyovCisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorUFJFRklYKGdldEF0dHMpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwKKyAgICAgICAgICAgICAgICBpbnQgYXR0c01heCwgQVRUUklCVVRFICphdHRzKQoreworICBlbnVtIHsgb3RoZXIsIGluTmFtZSwgaW5WYWx1ZSB9IHN0YXRlID0gaW5OYW1lOworICBpbnQgbkF0dHMgPSAwOworICBpbnQgb3BlbiA9IDA7IC8qIGRlZmluZWQgd2hlbiBzdGF0ZSA9PSBpblZhbHVlOworICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIGp1c3QgdG8gc2h1dCB1cCBjb21waWxlcnMgKi8KKworICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTs7IHB0ciArPSBNSU5CUEMoZW5jKSkgeworICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgeworI2RlZmluZSBTVEFSVF9OQU1FIFwKKyAgICAgIGlmIChzdGF0ZSA9PSBvdGhlcikgeyBcCisgICAgICAgIGlmIChuQXR0cyA8IGF0dHNNYXgpIHsgXAorICAgICAgICAgIGF0dHNbbkF0dHNdLm5hbWUgPSBwdHI7IFwKKyAgICAgICAgICBhdHRzW25BdHRzXS5ub3JtYWxpemVkID0gMTsgXAorICAgICAgICB9IFwKKyAgICAgICAgc3RhdGUgPSBpbk5hbWU7IFwKKyAgICAgIH0KKyNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKKyAgICBjYXNlIEJUX0xFQUQgIyMgbjogU1RBUlRfTkFNRSBwdHIgKz0gKG4gLSBNSU5CUEMoZW5jKSk7IGJyZWFrOworICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCisjdW5kZWYgTEVBRF9DQVNFCisgICAgY2FzZSBCVF9OT05BU0NJSToKKyAgICBjYXNlIEJUX05NU1RSVDoKKyAgICBjYXNlIEJUX0hFWDoKKyAgICAgIFNUQVJUX05BTUUKKyAgICAgIGJyZWFrOworI3VuZGVmIFNUQVJUX05BTUUKKyAgICBjYXNlIEJUX1FVT1Q6CisgICAgICBpZiAoc3RhdGUgIT0gaW5WYWx1ZSkgeworICAgICAgICBpZiAobkF0dHMgPCBhdHRzTWF4KQorICAgICAgICAgIGF0dHNbbkF0dHNdLnZhbHVlUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7CisgICAgICAgIHN0YXRlID0gaW5WYWx1ZTsKKyAgICAgICAgb3BlbiA9IEJUX1FVT1Q7CisgICAgICB9CisgICAgICBlbHNlIGlmIChvcGVuID09IEJUX1FVT1QpIHsKKyAgICAgICAgc3RhdGUgPSBvdGhlcjsKKyAgICAgICAgaWYgKG5BdHRzIDwgYXR0c01heCkKKyAgICAgICAgICBhdHRzW25BdHRzXS52YWx1ZUVuZCA9IHB0cjsKKyAgICAgICAgbkF0dHMrKzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfQVBPUzoKKyAgICAgIGlmIChzdGF0ZSAhPSBpblZhbHVlKSB7CisgICAgICAgIGlmIChuQXR0cyA8IGF0dHNNYXgpCisgICAgICAgICAgYXR0c1tuQXR0c10udmFsdWVQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKKyAgICAgICAgc3RhdGUgPSBpblZhbHVlOworICAgICAgICBvcGVuID0gQlRfQVBPUzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG9wZW4gPT0gQlRfQVBPUykgeworICAgICAgICBzdGF0ZSA9IG90aGVyOworICAgICAgICBpZiAobkF0dHMgPCBhdHRzTWF4KQorICAgICAgICAgIGF0dHNbbkF0dHNdLnZhbHVlRW5kID0gcHRyOworICAgICAgICBuQXR0cysrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9BTVA6CisgICAgICBpZiAobkF0dHMgPCBhdHRzTWF4KQorICAgICAgICBhdHRzW25BdHRzXS5ub3JtYWxpemVkID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlRfUzoKKyAgICAgIGlmIChzdGF0ZSA9PSBpbk5hbWUpCisgICAgICAgIHN0YXRlID0gb3RoZXI7CisgICAgICBlbHNlIGlmIChzdGF0ZSA9PSBpblZhbHVlCisgICAgICAgICAgICAgICAmJiBuQXR0cyA8IGF0dHNNYXgKKyAgICAgICAgICAgICAgICYmIGF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQKKyAgICAgICAgICAgICAgICYmIChwdHIgPT0gYXR0c1tuQXR0c10udmFsdWVQdHIKKyAgICAgICAgICAgICAgICAgICB8fCBCWVRFX1RPX0FTQ0lJKGVuYywgcHRyKSAhPSBBU0NJSV9TUEFDRQorICAgICAgICAgICAgICAgICAgIHx8IEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSkgPT0gQVNDSUlfU1BBQ0UKKyAgICAgICAgICAgICAgICAgICB8fCBCWVRFX1RZUEUoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSkgPT0gb3BlbikpCisgICAgICAgIGF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKKyAgICAgIC8qIFRoaXMgY2FzZSBlbnN1cmVzIHRoYXQgdGhlIGZpcnN0IGF0dHJpYnV0ZSBuYW1lIGlzIGNvdW50ZWQKKyAgICAgICAgIEFwYXJ0IGZyb20gdGhhdCB3ZSBjb3VsZCBqdXN0IGNoYW5nZSBzdGF0ZSBvbiB0aGUgcXVvdGUuICovCisgICAgICBpZiAoc3RhdGUgPT0gaW5OYW1lKQorICAgICAgICBzdGF0ZSA9IG90aGVyOworICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gaW5WYWx1ZSAmJiBuQXR0cyA8IGF0dHNNYXgpCisgICAgICAgIGF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9HVDoKKyAgICBjYXNlIEJUX1NPTDoKKyAgICAgIGlmIChzdGF0ZSAhPSBpblZhbHVlKQorICAgICAgICByZXR1cm4gbkF0dHM7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8qIG5vdCByZWFjaGVkICovCit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK1BSRUZJWChjaGFyUmVmTnVtYmVyKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpCit7CisgIGludCByZXN1bHQgPSAwOworICAvKiBza2lwICYjICovCisgIHB0ciArPSAyKk1JTkJQQyhlbmMpOworICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV94KSkgeworICAgIGZvciAocHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfU0VNSSk7CisgICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYykpIHsKKyAgICAgIGludCBjID0gQllURV9UT19BU0NJSShlbmMsIHB0cik7CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgQVNDSUlfMDogY2FzZSBBU0NJSV8xOiBjYXNlIEFTQ0lJXzI6IGNhc2UgQVNDSUlfMzogY2FzZSBBU0NJSV80OgorICAgICAgY2FzZSBBU0NJSV81OiBjYXNlIEFTQ0lJXzY6IGNhc2UgQVNDSUlfNzogY2FzZSBBU0NJSV84OiBjYXNlIEFTQ0lJXzk6CisgICAgICAgIHJlc3VsdCA8PD0gNDsKKyAgICAgICAgcmVzdWx0IHw9IChjIC0gQVNDSUlfMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBU0NJSV9BOiBjYXNlIEFTQ0lJX0I6IGNhc2UgQVNDSUlfQzoKKyAgICAgIGNhc2UgQVNDSUlfRDogY2FzZSBBU0NJSV9FOiBjYXNlIEFTQ0lJX0Y6CisgICAgICAgIHJlc3VsdCA8PD0gNDsKKyAgICAgICAgcmVzdWx0ICs9IDEwICsgKGMgLSBBU0NJSV9BKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFTQ0lJX2E6IGNhc2UgQVNDSUlfYjogY2FzZSBBU0NJSV9jOgorICAgICAgY2FzZSBBU0NJSV9kOiBjYXNlIEFTQ0lJX2U6IGNhc2UgQVNDSUlfZjoKKyAgICAgICAgcmVzdWx0IDw8PSA0OworICAgICAgICByZXN1bHQgKz0gMTAgKyAoYyAtIEFTQ0lJX2EpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChyZXN1bHQgPj0gMHgxMTAwMDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZm9yICg7ICFDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX1NFTUkpOyBwdHIgKz0gTUlOQlBDKGVuYykpIHsKKyAgICAgIGludCBjID0gQllURV9UT19BU0NJSShlbmMsIHB0cik7CisgICAgICByZXN1bHQgKj0gMTA7CisgICAgICByZXN1bHQgKz0gKGMgLSBBU0NJSV8wKTsKKyAgICAgIGlmIChyZXN1bHQgPj0gMHgxMTAwMDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNoZWNrQ2hhclJlZk51bWJlcihyZXN1bHQpOworfQorCitzdGF0aWMgaW50IFBUUkNBTEwKK1BSRUZJWChwcmVkZWZpbmVkRW50aXR5TmFtZSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQpCit7CisgIHN3aXRjaCAoKGVuZCAtIHB0cikvTUlOQlBDKGVuYykpIHsKKyAgY2FzZSAyOgorICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgQVNDSUlfdCkpIHsKKyAgICAgIHN3aXRjaCAoQllURV9UT19BU0NJSShlbmMsIHB0cikpIHsKKyAgICAgIGNhc2UgQVNDSUlfbDoKKyAgICAgICAgcmV0dXJuIEFTQ0lJX0xUOworICAgICAgY2FzZSBBU0NJSV9nOgorICAgICAgICByZXR1cm4gQVNDSUlfR1Q7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfYSkpIHsKKyAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX20pKSB7CisgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfcCkpCisgICAgICAgICAgcmV0dXJuIEFTQ0lJX0FNUDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7CisgICAgY2FzZSBBU0NJSV9xOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgQVNDSUlfdSkpIHsKKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9vKSkgeworICAgICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKKyAgICAgICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV90KSkKKyAgICAgICAgICAgIHJldHVybiBBU0NJSV9RVU9UOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFTQ0lJX2E6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCBBU0NJSV9wKSkgeworICAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX28pKSB7CisgICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsIEFTQ0lJX3MpKQorICAgICAgICAgICAgcmV0dXJuIEFTQ0lJX0FQT1M7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgoc2FtZU5hbWUpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0cjEsIGNvbnN0IGNoYXIgKnB0cjIpCit7CisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cjEpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgIGlmICgqcHRyMSsrICE9ICpwdHIyKyspIFwKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTEVBRF9DQVNFKDQpIExFQURfQ0FTRSgzKSBMRUFEX0NBU0UoMikKKyN1bmRlZiBMRUFEX0NBU0UKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgaWYgKCpwdHIxKysgIT0gKnB0cjIrKykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJUX05PTkFTQ0lJOgorICAgIGNhc2UgQlRfTk1TVFJUOgorI2lmZGVmIFhNTF9OUworICAgIGNhc2UgQlRfQ09MT046CisjZW5kaWYKKyAgICBjYXNlIEJUX0hFWDoKKyAgICBjYXNlIEJUX0RJR0lUOgorICAgIGNhc2UgQlRfTkFNRToKKyAgICBjYXNlIEJUX01JTlVTOgorICAgICAgaWYgKCpwdHIyKysgIT0gKnB0cjErKykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBpZiAoTUlOQlBDKGVuYykgPiAxKSB7CisgICAgICAgIGlmICgqcHRyMisrICE9ICpwdHIxKyspCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChNSU5CUEMoZW5jKSA+IDIpIHsKKyAgICAgICAgICBpZiAoKnB0cjIrKyAhPSAqcHRyMSsrKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgaWYgKE1JTkJQQyhlbmMpID4gMykgeworICAgICAgICAgICAgaWYgKCpwdHIyKysgIT0gKnB0cjErKykKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKE1JTkJQQyhlbmMpID09IDEgJiYgKnB0cjEgPT0gKnB0cjIpCisgICAgICAgIHJldHVybiAxOworICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIyKSkgeworICAgICAgY2FzZSBCVF9MRUFEMjoKKyAgICAgIGNhc2UgQlRfTEVBRDM6CisgICAgICBjYXNlIEJUX0xFQUQ0OgorICAgICAgY2FzZSBCVF9OT05BU0NJSToKKyAgICAgIGNhc2UgQlRfTk1TVFJUOgorI2lmZGVmIFhNTF9OUworICAgICAgY2FzZSBCVF9DT0xPTjoKKyNlbmRpZgorICAgICAgY2FzZSBCVF9IRVg6CisgICAgICBjYXNlIEJUX0RJR0lUOgorICAgICAgY2FzZSBCVF9OQU1FOgorICAgICAgY2FzZSBCVF9NSU5VUzoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworc3RhdGljIGludCBQVFJDQUxMCitQUkVGSVgobmFtZU1hdGNoZXNBc2NpaSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQxLCBjb25zdCBjaGFyICpwdHIyKQoreworICBmb3IgKDsgKnB0cjI7IHB0cjEgKz0gTUlOQlBDKGVuYyksIHB0cjIrKykgeworICAgIGlmIChwdHIxID09IGVuZDEpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0cjEsICpwdHIyKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBwdHIxID09IGVuZDE7Cit9CisKK3N0YXRpYyBpbnQgUFRSRkFTVENBTEwKK1BSRUZJWChuYW1lTGVuZ3RoKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpCit7CisgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gcHRyOworICBmb3IgKDs7KSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IHB0ciArPSBuOyBicmVhazsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICAgIGNhc2UgQlRfTk9OQVNDSUk6CisgICAgY2FzZSBCVF9OTVNUUlQ6CisjaWZkZWYgWE1MX05TCisgICAgY2FzZSBCVF9DT0xPTjoKKyNlbmRpZgorICAgIGNhc2UgQlRfSEVYOgorICAgIGNhc2UgQlRfRElHSVQ6CisgICAgY2FzZSBCVF9OQU1FOgorICAgIGNhc2UgQlRfTUlOVVM6CisgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIChpbnQpKHB0ciAtIHN0YXJ0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBQVFJGQVNUQ0FMTAorUFJFRklYKHNraXBTKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpCit7CisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKKyAgICBjYXNlIEJUX0xGOgorICAgIGNhc2UgQlRfQ1I6CisgICAgY2FzZSBCVF9TOgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFBUUkNBTEwKK1BSRUZJWCh1cGRhdGVQb3NpdGlvbikoY29uc3QgRU5DT0RJTkcgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgIFBPU0lUSU9OICpwb3MpCit7CisgIHdoaWxlIChwdHIgIT0gZW5kKSB7CisgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7CisjZGVmaW5lIExFQURfQ0FTRShuKSBcCisgICAgY2FzZSBCVF9MRUFEICMjIG46IFwKKyAgICAgIHB0ciArPSBuOyBcCisgICAgICBicmVhazsKKyAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQorI3VuZGVmIExFQURfQ0FTRQorICAgIGNhc2UgQlRfTEY6CisgICAgICBwb3MtPmNvbHVtbk51bWJlciA9IChYTUxfU2l6ZSktMTsKKyAgICAgIHBvcy0+bGluZU51bWJlcisrOworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCVF9DUjoKKyAgICAgIHBvcy0+bGluZU51bWJlcisrOworICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgaWYgKHB0ciAhPSBlbmQgJiYgQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKKyAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgcG9zLT5jb2x1bW5OdW1iZXIgPSAoWE1MX1NpemUpLTE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcy0+Y29sdW1uTnVtYmVyKys7CisgIH0KK30KKworI3VuZGVmIERPX0xFQURfQ0FTRQorI3VuZGVmIE1VTFRJQllURV9DQVNFUworI3VuZGVmIElOVkFMSURfQ0FTRVMKKyN1bmRlZiBDSEVDS19OQU1FX0NBU0UKKyN1bmRlZiBDSEVDS19OQU1FX0NBU0VTCisjdW5kZWYgQ0hFQ0tfTk1TVFJUX0NBU0UKKyN1bmRlZiBDSEVDS19OTVNUUlRfQ0FTRVMKKworI2VuZGlmIC8qIFhNTF9UT0tfSU1QTF9DICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuaCBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhMGVhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS9saWIveG1sdG9rX2ltcGwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKK2VudW0geworICBCVF9OT05YTUwsCisgIEJUX01BTEZPUk0sCisgIEJUX0xULAorICBCVF9BTVAsCisgIEJUX1JTUUIsCisgIEJUX0xFQUQyLAorICBCVF9MRUFEMywKKyAgQlRfTEVBRDQsCisgIEJUX1RSQUlMLAorICBCVF9DUiwKKyAgQlRfTEYsCisgIEJUX0dULAorICBCVF9RVU9ULAorICBCVF9BUE9TLAorICBCVF9FUVVBTFMsCisgIEJUX1FVRVNULAorICBCVF9FWENMLAorICBCVF9TT0wsCisgIEJUX1NFTUksCisgIEJUX05VTSwKKyAgQlRfTFNRQiwKKyAgQlRfUywKKyAgQlRfTk1TVFJULAorICBCVF9DT0xPTiwKKyAgQlRfSEVYLAorICBCVF9ESUdJVCwKKyAgQlRfTkFNRSwKKyAgQlRfTUlOVVMsCisgIEJUX09USEVSLCAvKiBrbm93biBub3QgdG8gYmUgYSBuYW1lIG9yIG5hbWUgc3RhcnQgY2hhcmFjdGVyICovCisgIEJUX05PTkFTQ0lJLCAvKiBtaWdodCBiZSBhIG5hbWUgb3IgbmFtZSBzdGFydCBjaGFyYWN0ZXIgKi8KKyAgQlRfUEVSQ05ULAorICBCVF9MUEFSLAorICBCVF9SUEFSLAorICBCVF9BU1QsCisgIEJUX1BMVVMsCisgIEJUX0NPTU1BLAorICBCVF9WRVJCQVIKK307CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfbnMuYyBiL2V4cGF0LTIuMC4xL2xpYi94bWx0b2tfbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jM2I4OGZkCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvbGliL3htbHRva19ucy5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworLyogVGhpcyBmaWxlIGlzIGluY2x1ZGVkISAqLworI2lmZGVmIFhNTF9UT0tfTlNfQworCitjb25zdCBFTkNPRElORyAqCitOUyhYbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZykodm9pZCkKK3sKKyAgcmV0dXJuICZucyhpbnRlcm5hbF91dGY4X2VuY29kaW5nKS5lbmM7Cit9CisKK2NvbnN0IEVOQ09ESU5HICoKK05TKFhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZykodm9pZCkKK3sKKyNpZiBCWVRFT1JERVIgPT0gMTIzNAorICByZXR1cm4gJm5zKGludGVybmFsX2xpdHRsZTJfZW5jb2RpbmcpLmVuYzsKKyNlbGlmIEJZVEVPUkRFUiA9PSA0MzIxCisgIHJldHVybiAmbnMoaW50ZXJuYWxfYmlnMl9lbmNvZGluZykuZW5jOworI2Vsc2UKKyAgY29uc3Qgc2hvcnQgbiA9IDE7CisgIHJldHVybiAoKihjb25zdCBjaGFyICopJm4KKyAgICAgICAgICA/ICZucyhpbnRlcm5hbF9saXR0bGUyX2VuY29kaW5nKS5lbmMKKyAgICAgICAgICA6ICZucyhpbnRlcm5hbF9iaWcyX2VuY29kaW5nKS5lbmMpOworI2VuZGlmCit9CisKK3N0YXRpYyBjb25zdCBFTkNPRElORyAqIGNvbnN0IE5TKGVuY29kaW5ncylbXSA9IHsKKyAgJm5zKGxhdGluMV9lbmNvZGluZykuZW5jLAorICAmbnMoYXNjaWlfZW5jb2RpbmcpLmVuYywKKyAgJm5zKHV0ZjhfZW5jb2RpbmcpLmVuYywKKyAgJm5zKGJpZzJfZW5jb2RpbmcpLmVuYywKKyAgJm5zKGJpZzJfZW5jb2RpbmcpLmVuYywKKyAgJm5zKGxpdHRsZTJfZW5jb2RpbmcpLmVuYywKKyAgJm5zKHV0ZjhfZW5jb2RpbmcpLmVuYyAvKiBOT19FTkMgKi8KK307CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorTlMoaW5pdFNjYW5Qcm9sb2cpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQoreworICByZXR1cm4gaW5pdFNjYW4oTlMoZW5jb2RpbmdzKSwgKGNvbnN0IElOSVRfRU5DT0RJTkcgKillbmMsCisgICAgICAgICAgICAgICAgICBYTUxfUFJPTE9HX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Cit9CisKK3N0YXRpYyBpbnQgUFRSQ0FMTAorTlMoaW5pdFNjYW5Db250ZW50KShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCit7CisgIHJldHVybiBpbml0U2NhbihOUyhlbmNvZGluZ3MpLCAoY29uc3QgSU5JVF9FTkNPRElORyAqKWVuYywKKyAgICAgICAgICAgICAgICAgIFhNTF9DT05URU5UX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Cit9CisKK2ludAorTlMoWG1sSW5pdEVuY29kaW5nKShJTklUX0VOQ09ESU5HICpwLCBjb25zdCBFTkNPRElORyAqKmVuY1B0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IGkgPSBnZXRFbmNvZGluZ0luZGV4KG5hbWUpOworICBpZiAoaSA9PSBVTktOT1dOX0VOQykKKyAgICByZXR1cm4gMDsKKyAgU0VUX0lOSVRfRU5DX0lOREVYKHAsIGkpOworICBwLT5pbml0RW5jLnNjYW5uZXJzW1hNTF9QUk9MT0dfU1RBVEVdID0gTlMoaW5pdFNjYW5Qcm9sb2cpOworICBwLT5pbml0RW5jLnNjYW5uZXJzW1hNTF9DT05URU5UX1NUQVRFXSA9IE5TKGluaXRTY2FuQ29udGVudCk7CisgIHAtPmluaXRFbmMudXBkYXRlUG9zaXRpb24gPSBpbml0VXBkYXRlUG9zaXRpb247CisgIHAtPmVuY1B0ciA9IGVuY1B0cjsKKyAgKmVuY1B0ciA9ICYocC0+aW5pdEVuYyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgRU5DT0RJTkcgKgorTlMoZmluZEVuY29kaW5nKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCkKK3sKKyNkZWZpbmUgRU5DT0RJTkdfTUFYIDEyOAorICBjaGFyIGJ1ZltFTkNPRElOR19NQVhdOworICBjaGFyICpwID0gYnVmOworICBpbnQgaTsKKyAgWG1sVXRmOENvbnZlcnQoZW5jLCAmcHRyLCBlbmQsICZwLCBwICsgRU5DT0RJTkdfTUFYIC0gMSk7CisgIGlmIChwdHIgIT0gZW5kKQorICAgIHJldHVybiAwOworICAqcCA9IDA7CisgIGlmIChzdHJlcWNpKGJ1ZiwgS1dfVVRGXzE2KSAmJiBlbmMtPm1pbkJ5dGVzUGVyQ2hhciA9PSAyKQorICAgIHJldHVybiBlbmM7CisgIGkgPSBnZXRFbmNvZGluZ0luZGV4KGJ1Zik7CisgIGlmIChpID09IFVOS05PV05fRU5DKQorICAgIHJldHVybiAwOworICByZXR1cm4gTlMoZW5jb2RpbmdzKVtpXTsKK30KKworaW50CitOUyhYbWxQYXJzZVhtbERlY2wpKGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmJhZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnZlcnNpb25QdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5jb2RpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkNPRElORyAqKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBpbnQgKnN0YW5kYWxvbmUpCit7CisgIHJldHVybiBkb1BhcnNlWG1sRGVjbChOUyhmaW5kRW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmFsVGV4dEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25QdHIsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uRW5kUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFsb25lKTsKK30KKworI2VuZGlmIC8qIFhNTF9UT0tfTlNfQyAqLwpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMvUkVBRE1FLnR4dCBiL2V4cGF0LTIuMC4xL3Rlc3RzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzNhNDdjMwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIChmbGVkZ2xpbmcpIHRlc3Qgc3VpdGUgZm9yIEV4cGF0LiAgVGhlCit0ZXN0cyBwcm92aWRlIGdlbmVyYWwgdW5pdCB0ZXN0aW5nIGFuZCByZWdyZXNzaW9uIGNvdmVyYWdlLiAgVGhlIHRlc3RzCithcmUgbm90IGV4cGVjdGVkIHRvIGJlIHVzZWZ1bCBleGFtcGxlcyBvZiBFeHBhdCB1c2FnZTsgc2VlIHRoZQorZXhhbXBsZXMvIGRpcmVjdG9yeSBmb3IgdGhhdC4KKworVGhlIEV4cGF0IHRlc3RzIHVzZSBhIHBhcnRpYWwgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlICJDaGVjayIKK3VuaXQgdGVzdGluZyBmcmFtZXdvcmsgZm9yIEMuIE1vcmUgaW5mb3JtYXRpb24gb24gQ2hlY2sgY2FuIGJlIGZvdW5kIGF0OgorCisgICAgICAgIGh0dHA6Ly9jaGVjay5zb3VyY2Vmb3JnZS5uZXQvCisKK0V4cGF0IG11c3QgYmUgYnVpbHQgYW5kIGluc3RhbGxlZCBiZWZvcmUgIm1ha2UgY2hlY2siIGNhbiBiZSBleGVjdXRlZC4KKworU2luY2UgYm90aCBDaGVjayBhbmQgdGhpcyB0ZXN0IHN1aXRlIGFyZSB5b3VuZywgaXQgY2FuIGFsbCBjaGFuZ2UgaW4gYQorbGF0ZXIgdmVyc2lvbi4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9SRUFETUUudHh0IGIvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Y5Y2NhMAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1VzZSB0aGlzIGJlbmNobWFyayBjb21tYW5kIGxpbmUgdXRpbGl0eSBhcyBmb2xsb3dzOgorCisgIGJlbmNobWFyayBbLW5dIDxmaWxlIG5hbWU+IDxidWZmZXIgc2l6ZT4gPCMgaXRlcmF0aW9ucz4KKworVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXJlOgorCisgIC1uICAgICAgICAgICAgIC4uLiBvcHRpb25hbDsgaWYgc3VwcGxpZWQsIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIHR1cm5lZCBvbgorICA8ZmlsZSBuYW1lPiAgICAuLi4gbmFtZS9wYXRoIG9mIHRlc3QgeG1sIGZpbGUKKyAgPGJ1ZmZlciBzaXplPiAgLi4uIHNpemUgb2YgcHJvY2Vzc2luZyBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBwYXJzZWQgaW4gY2h1bmtzIG9mIHRoaXMgc2l6ZQorICA8IyBpdGVyYXRpb25zPiAuLi4gaG93IG9mdGVuIHdpbGwgdGhlIGZpbGUgYmUgcGFyc2VkCisKK1JldHVybnM6CisKKyAgVGhlIHRpbWUgKGluIHNlY29uZHMpIGl0IHRha2VzIHRvIHBhcnNlIHRoZSB0ZXN0IGZpbGUsCisgIGF2ZXJhZ2VkIG92ZXIgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuYyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjBmZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL2JlbmNobWFyay5jCkBAIC0wLDAgKzEsMTE0IEBACisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJleHBhdC5oIgorCisjaWYgZGVmaW5lZChfX2FtaWdhb3NfXykgJiYgZGVmaW5lZChfX1VTRV9JTkxJTkVfXykKKyNpbmNsdWRlIDxwcm90by9leHBhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBYTUxfTEFSR0VfU0laRQorI2RlZmluZSBYTUxfRk1UX0lOVF9NT0QgImxsIgorI2Vsc2UKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsIgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit1c2FnZShjb25zdCBjaGFyICpwcm9nLCBpbnQgcmMpCit7CisgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJ1c2FnZTogJXMgWy1uXSBmaWxlbmFtZSBidWZmZXJTaXplIG5yX29mX2xvb3BzXG4iLCBwcm9nKTsKKyAgZXhpdChyYyk7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSAKK3sKKyAgWE1MX1BhcnNlciAgcGFyc2VyOworICBjaGFyICAgICAgICAqWE1MQnVmLCAqWE1MQnVmRW5kLCAqWE1MQnVmUHRyOworICBGSUxFICAgICAgICAqZmQ7CisgIHN0cnVjdCBzdGF0IGZpbGVBdHRyOworICBpbnQgICAgICAgICBuck9mTG9vcHMsIGJ1ZmZlclNpemUsIGZpbGVTaXplLCBpLCBpc0ZpbmFsOworICBpbnQgICAgICAgICBqID0gMCwgbnMgPSAwOworICBjbG9ja190ICAgICB0c3RhcnQsIHRlbmQ7CisgIGRvdWJsZSAgICAgIGNwdVRpbWUgPSAwLjA7CisKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgaWYgKGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisgICAgICBpZiAoYXJndlsxXVsxXSA9PSAnbicgJiYgYXJndlsxXVsyXSA9PSAnXDAnKSB7CisgICAgICAgIG5zID0gMTsKKyAgICAgICAgaiA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHVzYWdlKGFyZ3ZbMF0sIDEpOworICAgIH0KKyAgfQorCisgIGlmIChhcmdjICE9IGogKyA0KQorICAgIHVzYWdlKGFyZ3ZbMF0sIDEpOworCisgIGlmIChzdGF0IChhcmd2W2ogKyAxXSwgJmZpbGVBdHRyKSAhPSAwKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiY291bGQgbm90IGFjY2VzcyBmaWxlICclcydcbiIsIGFyZ3ZbaiArIDFdKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICAKKyAgZmQgPSBmb3BlbiAoYXJndltqICsgMV0sICJyIik7CisgIGlmICghZmQpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiBmaWxlICclcydcbiIsIGFyZ3ZbaiArIDFdKTsKKyAgICBleGl0KDIpOworICB9CisgIAorICBidWZmZXJTaXplID0gYXRvaSAoYXJndltqICsgMl0pOworICBuck9mTG9vcHMgPSBhdG9pIChhcmd2W2ogKyAzXSk7CisgIGlmIChidWZmZXJTaXplIDw9IDAgfHwgbnJPZkxvb3BzIDw9IDApIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsIAorICAgICAgICAgICAgICJidWZmZXIgc2l6ZSBhbmQgbnIgb2YgbG9vcHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby5cbiIpOworICAgIGV4aXQoMyk7CisgIH0KKworICBYTUxCdWYgPSBtYWxsb2MgKGZpbGVBdHRyLnN0X3NpemUpOworICBmaWxlU2l6ZSA9IGZyZWFkIChYTUxCdWYsIHNpemVvZiAoY2hhciksIGZpbGVBdHRyLnN0X3NpemUsIGZkKTsKKyAgZmNsb3NlIChmZCk7CisgIAorICBpZiAobnMpCisgICAgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZU5TKE5VTEwsICchJyk7CisgIGVsc2UKKyAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCisgIGkgPSAwOworICBYTUxCdWZFbmQgPSBYTUxCdWYgKyBmaWxlU2l6ZTsKKyAgd2hpbGUgKGkgPCBuck9mTG9vcHMpIHsKKyAgICBYTUxCdWZQdHIgPSBYTUxCdWY7CisgICAgaXNGaW5hbCA9IDA7CisgICAgdHN0YXJ0ID0gY2xvY2soKTsKKyAgICBkbyB7CisgICAgICBpbnQgcGFyc2VCdWZmZXJTaXplID0gWE1MQnVmRW5kIC0gWE1MQnVmUHRyOworICAgICAgaWYgKHBhcnNlQnVmZmVyU2l6ZSA8PSBidWZmZXJTaXplKQorICAgICAgICBpc0ZpbmFsID0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcGFyc2VCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKyAgICAgIGlmICghWE1MX1BhcnNlIChwYXJzZXIsIFhNTEJ1ZlB0ciwgcGFyc2VCdWZmZXJTaXplLCBpc0ZpbmFsKSkgeworICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJlcnJvciAnJXMnIGF0IGxpbmUgJSIgWE1MX0ZNVF9JTlRfTU9EIFwKKyAgICAgICAgICAgICAgICAgICAgICJ1IGNoYXJhY3RlciAlIiBYTUxfRk1UX0lOVF9NT0QgInVcbiIsCisgICAgICAgICAgICAgICAgIFhNTF9FcnJvclN0cmluZyAoWE1MX0dldEVycm9yQ29kZSAocGFyc2VyKSksCisgICAgICAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAocGFyc2VyKSwKKyAgICAgICAgICAgICAgICAgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIgKHBhcnNlcikpOworICAgICAgICBmcmVlIChYTUxCdWYpOworICAgICAgICBYTUxfUGFyc2VyRnJlZSAocGFyc2VyKTsKKyAgICAgICAgZXhpdCAoNCk7CisgICAgICB9CisgICAgICBYTUxCdWZQdHIgKz0gYnVmZmVyU2l6ZTsKKyAgICB9IHdoaWxlICghaXNGaW5hbCk7CisgICAgdGVuZCA9IGNsb2NrKCk7CisgICAgY3B1VGltZSArPSAoKGRvdWJsZSkgKHRlbmQgLSB0c3RhcnQpKSAvIENMT0NLU19QRVJfU0VDOworICAgIFhNTF9QYXJzZXJSZXNldChwYXJzZXIsIE5VTEwpOworICAgIGkrKzsKKyAgfQorCisgIFhNTF9QYXJzZXJGcmVlIChwYXJzZXIpOworICBmcmVlIChYTUxCdWYpOworICAgICAgCisgIHByaW50ZiAoIiVkIGxvb3BzLCB3aXRoIGJ1ZmZlciBzaXplICVkLiBBdmVyYWdlIHRpbWUgcGVyIGxvb3A6ICVmXG4iLCAKKyAgICAgICAgICBuck9mTG9vcHMsIGJ1ZmZlclNpemUsIGNwdVRpbWUgLyAoZG91YmxlKSBuck9mTG9vcHMpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuZHNwIGIvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL2JlbmNobWFyay5kc3AKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmYzMTBkMAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2JlbmNobWFyay9iZW5jaG1hcmsuZHNwCkBAIC0wLDAgKzEsODggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iYmVuY2htYXJrIiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9YmVuY2htYXJrIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgImJlbmNobWFyay5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiYmVuY2htYXJrLm1hayIgQ0ZHPSJiZW5jaG1hcmsgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiYmVuY2htYXJrIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiYmVuY2htYXJrIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gImJlbmNobWFyayAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0kgIi4uXC4uXGxpYiIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4MTAwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDEwMDkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiYmVuY2htYXJrIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uXC4uXGxpYiIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDEwMDkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHgxMDA5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJiZW5jaG1hcmsgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiYmVuY2htYXJrIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGJlbmNobWFyay5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL2JlbmNobWFyay5kc3cgYi9leHBhdC0yLjAuMS90ZXN0cy9iZW5jaG1hcmsvYmVuY2htYXJrLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzQ2YTlhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvYmVuY2htYXJrL2JlbmNobWFyay5kc3cKQEAgLTAsMCArMSw0NCBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiYmVuY2htYXJrIj0uXGJlbmNobWFyay5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCisgICAgQmVnaW4gUHJvamVjdCBEZXBlbmRlbmN5DQorICAgIFByb2plY3RfRGVwX05hbWUgZXhwYXQNCisgICAgRW5kIFByb2plY3QgRGVwZW5kZW5jeQ0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiZXhwYXQiPS4uXC4uXGxpYlxleHBhdC5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMvY2hhcmRhdGEuYyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2NoYXJkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWZiMDI5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL2NoYXJkYXRhLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKworICAgY2hhcmRhdGEuYworKi8KKworI2lmZGVmIEhBVkVfRVhQQVRfQ09ORklHX0gKKyNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfQ0hFQ0tfSAorI2luY2x1ZGUgPGNoZWNrLmg+CisjZWxzZQorI2luY2x1ZGUgIm1pbmljaGVjay5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY2hhcmRhdGEuaCIKKworCitzdGF0aWMgaW50Cit4bWxzdHJsZW4oY29uc3QgWE1MX0NoYXIgKnMpCit7CisgICAgaW50IGxlbiA9IDA7CisgICAgYXNzZXJ0KHMgIT0gTlVMTCk7CisgICAgd2hpbGUgKHNbbGVuXSAhPSAwKQorICAgICAgICArK2xlbjsKKyAgICByZXR1cm4gbGVuOworfQorCisKK3ZvaWQKK0NoYXJEYXRhX0luaXQoQ2hhckRhdGEgKnN0b3JhZ2UpCit7CisgICAgYXNzZXJ0KHN0b3JhZ2UgIT0gTlVMTCk7CisgICAgc3RvcmFnZS0+Y291bnQgPSAtMTsKK30KKwordm9pZAorQ2hhckRhdGFfQXBwZW5kU3RyaW5nKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBjaGFyICpzKQoreworICAgIGludCBtYXhjaGFycyA9IHNpemVvZihzdG9yYWdlLT5kYXRhKSAvIHNpemVvZihzdG9yYWdlLT5kYXRhWzBdKTsKKyAgICBpbnQgbGVuOworCisgICAgYXNzZXJ0KHMgIT0gTlVMTCk7CisgICAgbGVuID0gc3RybGVuKHMpOworICAgIGlmIChzdG9yYWdlLT5jb3VudCA8IDApCisgICAgICAgIHN0b3JhZ2UtPmNvdW50ID0gMDsKKyAgICBpZiAoKGxlbiArIHN0b3JhZ2UtPmNvdW50KSA+IG1heGNoYXJzKSB7CisgICAgICAgIGxlbiA9IChtYXhjaGFycyAtIHN0b3JhZ2UtPmNvdW50KTsKKyAgICB9CisgICAgaWYgKGxlbiArIHN0b3JhZ2UtPmNvdW50IDwgc2l6ZW9mKHN0b3JhZ2UtPmRhdGEpKSB7CisgICAgICAgIG1lbWNweShzdG9yYWdlLT5kYXRhICsgc3RvcmFnZS0+Y291bnQsIHMsIGxlbik7CisgICAgICAgIHN0b3JhZ2UtPmNvdW50ICs9IGxlbjsKKyAgICB9Cit9CisKK3ZvaWQKK0NoYXJEYXRhX0FwcGVuZFhNTENoYXJzKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKK3sKKyAgICBpbnQgbWF4Y2hhcnM7CisKKyAgICBhc3NlcnQoc3RvcmFnZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQocyAhPSBOVUxMKTsKKyAgICBtYXhjaGFycyA9IHNpemVvZihzdG9yYWdlLT5kYXRhKSAvIHNpemVvZihzdG9yYWdlLT5kYXRhWzBdKTsKKyAgICBpZiAoc3RvcmFnZS0+Y291bnQgPCAwKQorICAgICAgICBzdG9yYWdlLT5jb3VudCA9IDA7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIGxlbiA9IHhtbHN0cmxlbihzKTsKKyAgICBpZiAoKGxlbiArIHN0b3JhZ2UtPmNvdW50KSA+IG1heGNoYXJzKSB7CisgICAgICAgIGxlbiA9IChtYXhjaGFycyAtIHN0b3JhZ2UtPmNvdW50KTsKKyAgICB9CisgICAgaWYgKGxlbiArIHN0b3JhZ2UtPmNvdW50IDwgc2l6ZW9mKHN0b3JhZ2UtPmRhdGEpKSB7CisgICAgICAgIG1lbWNweShzdG9yYWdlLT5kYXRhICsgc3RvcmFnZS0+Y291bnQsIHMsCisgICAgICAgICAgICAgICBsZW4gKiBzaXplb2Yoc3RvcmFnZS0+ZGF0YVswXSkpOworICAgICAgICBzdG9yYWdlLT5jb3VudCArPSBsZW47CisgICAgfQorfQorCitpbnQKK0NoYXJEYXRhX0NoZWNrU3RyaW5nKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBjaGFyICpleHBlY3RlZCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMjgwXTsKKyAgICBpbnQgbGVuOworICAgIGludCBjb3VudDsKKworICAgIGFzc2VydChzdG9yYWdlICE9IE5VTEwpOworICAgIGFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKKyAgICBjb3VudCA9IChzdG9yYWdlLT5jb3VudCA8IDApID8gMCA6IHN0b3JhZ2UtPmNvdW50OworICAgIGxlbiA9IHN0cmxlbihleHBlY3RlZCk7CisgICAgaWYgKGxlbiAhPSBjb3VudCkgeworICAgICAgICBpZiAoc2l6ZW9mKFhNTF9DaGFyKSA9PSAxKQorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICJ3cm9uZyBudW1iZXIgb2YgZGF0YSBjaGFyYWN0ZXJzOiIKKyAgICAgICAgICAgICAgICAgICAgIiBnb3QgJWQsIGV4cGVjdGVkICVkOlxuJXMiLCBjb3VudCwgbGVuLCBzdG9yYWdlLT5kYXRhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBudW1iZXIgb2YgZGF0YSBjaGFyYWN0ZXJzOiBnb3QgJWQsIGV4cGVjdGVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY291bnQsIGxlbik7CisgICAgICAgIGZhaWwoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtZW1jbXAoZXhwZWN0ZWQsIHN0b3JhZ2UtPmRhdGEsIGxlbikgIT0gMCkgeworICAgICAgICBmYWlsKCJnb3QgYmFkIGRhdGEgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitpbnQKK0NoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoQ2hhckRhdGEgKnN0b3JhZ2UsIGNvbnN0IFhNTF9DaGFyICpleHBlY3RlZCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBpbnQgbGVuID0geG1sc3RybGVuKGV4cGVjdGVkKTsKKyAgICBpbnQgY291bnQ7CisKKyAgICBhc3NlcnQoc3RvcmFnZSAhPSBOVUxMKTsKKyAgICBjb3VudCA9IChzdG9yYWdlLT5jb3VudCA8IDApID8gMCA6IHN0b3JhZ2UtPmNvdW50OworICAgIGlmIChsZW4gIT0gY291bnQpIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJ3cm9uZyBudW1iZXIgb2YgZGF0YSBjaGFyYWN0ZXJzOiBnb3QgJWQsIGV4cGVjdGVkICVkIiwKKyAgICAgICAgICAgICAgICBjb3VudCwgbGVuKTsKKyAgICAgICAgZmFpbChidWZmZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG1lbWNtcChleHBlY3RlZCwgc3RvcmFnZS0+ZGF0YSwgbGVuICogc2l6ZW9mKHN0b3JhZ2UtPmRhdGFbMF0pKSAhPSAwKSB7CisgICAgICAgIGZhaWwoImdvdCBiYWQgZGF0YSBieXRlcyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9jaGFyZGF0YS5oIGIvZXhwYXQtMi4wLjEvdGVzdHMvY2hhcmRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOGRjNGNlCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvY2hhcmRhdGEuaApAQCAtMCwwICsxLDQwIEBACisvKiBjaGFyZGF0YS5oCisKKyAgIEludGVyZmFjZSB0byBzb21lIGhlbHBlciByb3V0aW5lcyB1c2VkIHRvIGFjY3VtdWxhdGUgYW5kIGNoZWNrIHRleHQKKyAgIGFuZCBhdHRyaWJ1dGUgY29udGVudC4KKyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBYTUxfQ0hBUkRBVEFfSAorI2RlZmluZSBYTUxfQ0hBUkRBVEFfSCAxCisKKyNpZm5kZWYgWE1MX1ZFUlNJT04KKyNpbmNsdWRlICJleHBhdC5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkIFhNTF9DaGFyICovCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIyBvZiBjaGFycywgPCAwIGlmIG5vdCBzZXQgKi8KKyAgICBYTUxfQ2hhciBkYXRhWzEwMjRdOworfSBDaGFyRGF0YTsKKworCit2b2lkIENoYXJEYXRhX0luaXQoQ2hhckRhdGEgKnN0b3JhZ2UpOworCit2b2lkIENoYXJEYXRhX0FwcGVuZFN0cmluZyhDaGFyRGF0YSAqc3RvcmFnZSwgY29uc3QgY2hhciAqcyk7CisKK3ZvaWQgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoQ2hhckRhdGEgKnN0b3JhZ2UsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKTsKKworaW50IENoYXJEYXRhX0NoZWNrU3RyaW5nKENoYXJEYXRhICpzdG9yYWdlLCBjb25zdCBjaGFyICpzKTsKKworaW50IENoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoQ2hhckRhdGEgKnN0b3JhZ2UsIGNvbnN0IFhNTF9DaGFyICpzKTsKKworCisjZW5kaWYgIC8qIFhNTF9DSEFSREFUQV9IICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9taW5pY2hlY2suYyBiL2V4cGF0LTIuMC4xL3Rlc3RzL21pbmljaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyZjQyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS90ZXN0cy9taW5pY2hlY2suYwpAQCAtMCwwICsxLDE4MiBAQAorLyogTWluaWF0dXJlIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSAiY2hlY2siIGxpYnJhcnkuCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IGp1c3QgZW5vdWdoIG9mIGNoZWNrIHRvIHJ1biB0aGUgRXhwYXQKKyAqIHRlc3RzLiAgVGhpcyBpbnRlcmZhY2UgaXMgYmFzZWQgZW50aXJlbHkgb24gdGhlIHBvcnRpb24gb2YgdGhlCisgKiBjaGVjayBsaWJyYXJ5IGJlaW5nIHVzZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJtaW5pY2hlY2suaCIKKworU3VpdGUgKgorc3VpdGVfY3JlYXRlKGNoYXIgKm5hbWUpCit7CisgICAgU3VpdGUgKnN1aXRlID0gKFN1aXRlICopIGNhbGxvYygxLCBzaXplb2YoU3VpdGUpKTsKKyAgICBpZiAoc3VpdGUgIT0gTlVMTCkgeworICAgICAgICBzdWl0ZS0+bmFtZSA9IG5hbWU7CisgICAgfQorICAgIHJldHVybiBzdWl0ZTsKK30KKworVENhc2UgKgordGNhc2VfY3JlYXRlKGNoYXIgKm5hbWUpCit7CisgICAgVENhc2UgKnRjID0gKFRDYXNlICopIGNhbGxvYygxLCBzaXplb2YoVENhc2UpKTsKKyAgICBpZiAodGMgIT0gTlVMTCkgeworICAgICAgICB0Yy0+bmFtZSA9IG5hbWU7CisgICAgfQorICAgIHJldHVybiB0YzsKK30KKwordm9pZAorc3VpdGVfYWRkX3RjYXNlKFN1aXRlICpzdWl0ZSwgVENhc2UgKnRjKSAKK3sKKyAgICBhc3NlcnQoc3VpdGUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHRjICE9IE5VTEwpOworICAgIGFzc2VydCh0Yy0+bmV4dF90Y2FzZSA9PSBOVUxMKTsKKworICAgIHRjLT5uZXh0X3RjYXNlID0gc3VpdGUtPnRlc3RzOworICAgIHN1aXRlLT50ZXN0cyA9IHRjOworfQorCit2b2lkCit0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlKFRDYXNlICp0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGNhc2Vfc2V0dXBfZnVuY3Rpb24gc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRjYXNlX3RlYXJkb3duX2Z1bmN0aW9uIHRlYXJkb3duKQoreworICAgIGFzc2VydCh0YyAhPSBOVUxMKTsKKyAgICB0Yy0+c2V0dXAgPSBzZXR1cDsKKyAgICB0Yy0+dGVhcmRvd24gPSB0ZWFyZG93bjsKK30KKwordm9pZAordGNhc2VfYWRkX3Rlc3QoVENhc2UgKnRjLCB0Y2FzZV90ZXN0X2Z1bmN0aW9uIHRlc3QpCit7CisgICAgYXNzZXJ0KHRjICE9IE5VTEwpOworICAgIGlmICh0Yy0+YWxsb2NhdGVkID09IHRjLT5udGVzdHMpIHsKKyAgICAgICAgaW50IG5hbGxvYyA9IHRjLT5hbGxvY2F0ZWQgKyAxMDA7CisgICAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IHNpemVvZih0Y2FzZV90ZXN0X2Z1bmN0aW9uKSAqIG5hbGxvYzsKKyAgICAgICAgdGNhc2VfdGVzdF9mdW5jdGlvbiAqbmV3X3Rlc3RzID0gcmVhbGxvYyh0Yy0+dGVzdHMsIG5ld19zaXplKTsKKyAgICAgICAgYXNzZXJ0KG5ld190ZXN0cyAhPSBOVUxMKTsKKyAgICAgICAgaWYgKG5ld190ZXN0cyAhPSB0Yy0+dGVzdHMpIHsKKyAgICAgICAgICAgIGZyZWUodGMtPnRlc3RzKTsKKyAgICAgICAgICAgIHRjLT50ZXN0cyA9IG5ld190ZXN0czsKKyAgICAgICAgfQorICAgICAgICB0Yy0+YWxsb2NhdGVkID0gbmFsbG9jOworICAgIH0KKyAgICB0Yy0+dGVzdHNbdGMtPm50ZXN0c10gPSB0ZXN0OworICAgIHRjLT5udGVzdHMrKzsKK30KKworU1J1bm5lciAqCitzcnVubmVyX2NyZWF0ZShTdWl0ZSAqc3VpdGUpCit7CisgICAgU1J1bm5lciAqcnVubmVyID0gY2FsbG9jKDEsIHNpemVvZihTUnVubmVyKSk7CisgICAgaWYgKHJ1bm5lciAhPSBOVUxMKSB7CisgICAgICAgIHJ1bm5lci0+c3VpdGUgPSBzdWl0ZTsKKyAgICB9CisgICAgcmV0dXJuIHJ1bm5lcjsKK30KKworc3RhdGljIGptcF9idWYgZW52OworCitzdGF0aWMgY2hhciBjb25zdCAqX2NoZWNrX2N1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOworc3RhdGljIGludCBfY2hlY2tfY3VycmVudF9saW5lbm8gPSAtMTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpfY2hlY2tfY3VycmVudF9maWxlbmFtZSA9IE5VTEw7CisKK3ZvaWQKK19jaGVja19zZXRfdGVzdF9pbmZvKGNoYXIgY29uc3QgKmZ1bmN0aW9uLCBjaGFyIGNvbnN0ICpmaWxlbmFtZSwgaW50IGxpbmVubykKK3sKKyAgICBfY2hlY2tfY3VycmVudF9mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgIF9jaGVja19jdXJyZW50X2xpbmVubyA9IGxpbmVubzsKKyAgICBfY2hlY2tfY3VycmVudF9maWxlbmFtZSA9IGZpbGVuYW1lOworfQorCisKK3N0YXRpYyB2b2lkCithZGRfZmFpbHVyZShTUnVubmVyICpydW5uZXIsIGludCB2ZXJib3NpdHkpCit7CisgICAgcnVubmVyLT5uZmFpbHVyZXMrKzsKKyAgICBpZiAodmVyYm9zaXR5ID49IENLX1ZFUkJPU0UpIHsKKyAgICAgICAgcHJpbnRmKCIlczolZDogJXNcbiIsIF9jaGVja19jdXJyZW50X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgX2NoZWNrX2N1cnJlbnRfbGluZW5vLCBfY2hlY2tfY3VycmVudF9mdW5jdGlvbik7CisgICAgfQorfQorCit2b2lkCitzcnVubmVyX3J1bl9hbGwoU1J1bm5lciAqcnVubmVyLCBpbnQgdmVyYm9zaXR5KQoreworICAgIFN1aXRlICpzdWl0ZTsKKyAgICBUQ2FzZSAqdGM7CisgICAgYXNzZXJ0KHJ1bm5lciAhPSBOVUxMKTsKKyAgICBzdWl0ZSA9IHJ1bm5lci0+c3VpdGU7CisgICAgdGMgPSBzdWl0ZS0+dGVzdHM7CisgICAgd2hpbGUgKHRjICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0Yy0+bnRlc3RzOyArK2kpIHsKKyAgICAgICAgICAgIHJ1bm5lci0+bmNoZWNrcysrOworCisgICAgICAgICAgICBpZiAodGMtPnNldHVwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBzZXR1cCAqLworICAgICAgICAgICAgICAgIGlmIChzZXRqbXAoZW52KSkgeworICAgICAgICAgICAgICAgICAgICBhZGRfZmFpbHVyZShydW5uZXIsIHZlcmJvc2l0eSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Yy0+c2V0dXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHRlc3QgKi8KKyAgICAgICAgICAgIGlmIChzZXRqbXAoZW52KSkgeworICAgICAgICAgICAgICAgIGFkZF9mYWlsdXJlKHJ1bm5lciwgdmVyYm9zaXR5KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh0Yy0+dGVzdHNbaV0pKCk7CisKKyAgICAgICAgICAgIC8qIHRlYXJkb3duICovCisgICAgICAgICAgICBpZiAodGMtPnRlYXJkb3duICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0am1wKGVudikpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkX2ZhaWx1cmUocnVubmVyLCB2ZXJib3NpdHkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGMtPnRlYXJkb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGMgPSB0Yy0+bmV4dF90Y2FzZTsKKyAgICB9CisgICAgaWYgKHZlcmJvc2l0eSkgeworICAgICAgICBpbnQgcGFzc2VkID0gcnVubmVyLT5uY2hlY2tzIC0gcnVubmVyLT5uZmFpbHVyZXM7CisgICAgICAgIGRvdWJsZSBwZXJjZW50YWdlID0gKChkb3VibGUpIHBhc3NlZCkgLyBydW5uZXItPm5jaGVja3M7CisgICAgICAgIGludCBkaXNwbGF5ID0gKGludCkgKHBlcmNlbnRhZ2UgKiAxMDApOworICAgICAgICBwcmludGYoIiVkJSU6IENoZWNrczogJWQsIEZhaWxlZDogJWRcbiIsCisgICAgICAgICAgICAgICBkaXNwbGF5LCBydW5uZXItPm5jaGVja3MsIHJ1bm5lci0+bmZhaWx1cmVzKTsKKyAgICB9Cit9CisKK3ZvaWQKK19mYWlsX3VubGVzcyhpbnQgY29uZGl0aW9uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqbXNnKQoreworICAgIC8qIEFsd2F5cyBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBzbyBpdCBpc24ndCBsb3N0LiAgSW4gdGhpcyBjYXNlLAorICAgICAgIHdlIGhhdmUgYSBmYWlsdXJlLCBzbyB0aGVyZSdzIG5vIHJlYXNvbiB0byBiZSBxdWlldCBhYm91dCB3aGF0CisgICAgICAgaXQgaXMuCisgICAgKi8KKyAgICBpZiAobXNnICE9IE5VTEwpCisgICAgICAgIHByaW50ZigiJXMiLCBtc2cpOworICAgIGxvbmdqbXAoZW52LCAxKTsKK30KKworaW50CitzcnVubmVyX250ZXN0c19mYWlsZWQoU1J1bm5lciAqcnVubmVyKQoreworICAgIGFzc2VydChydW5uZXIgIT0gTlVMTCk7CisgICAgcmV0dXJuIHJ1bm5lci0+bmZhaWx1cmVzOworfQorCit2b2lkCitzcnVubmVyX2ZyZWUoU1J1bm5lciAqcnVubmVyKQoreworICAgIGZyZWUocnVubmVyLT5zdWl0ZSk7CisgICAgZnJlZShydW5uZXIpOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMvbWluaWNoZWNrLmggYi9leHBhdC0yLjAuMS90ZXN0cy9taW5pY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODQ2YmVhCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvbWluaWNoZWNrLmgKQEAgLTAsMCArMSw4OSBAQAorLyogTWluaWF0dXJlIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSAiY2hlY2siIGxpYnJhcnkuCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IGp1c3QgZW5vdWdoIG9mIGNoZWNrIHRvIHJ1biB0aGUgRXhwYXQKKyAqIHRlc3RzLiAgVGhpcyBpbnRlcmZhY2UgaXMgYmFzZWQgZW50aXJlbHkgb24gdGhlIHBvcnRpb24gb2YgdGhlCisgKiBjaGVjayBsaWJyYXJ5IGJlaW5nIHVzZWQuCisgKgorICogVGhpcyBpcyAqc291cmNlKiBjb21wYXRpYmxlLCBidXQgbm90IG5lY2Vzc2FyeSAqbGluayogY29tcGF0aWJsZS4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQ0tfTk9GT1JLIDAKKyNkZWZpbmUgQ0tfRk9SSyAgIDEKKworI2RlZmluZSBDS19TSUxFTlQgIDAKKyNkZWZpbmUgQ0tfTk9STUFMICAxCisjZGVmaW5lIENLX1ZFUkJPU0UgMgorCisvKiBXb3JrYXJvdW5kIGZvciBUcnU2NCBVbml4IHN5c3RlbXMgd2hlcmUgdGhlIEMgY29tcGlsZXIgaGFzIGEgd29ya2luZworICAgX19mdW5jX18sIGJ1dCB0aGUgQysrIGNvbXBpbGVyIG9ubHkgaGFzIGEgd29ya2luZyBfX0ZVTkNUSU9OX18uICBUaGlzCisgICBjb3VsZCBiZSBmaXhlZCBpbiBjb25maWd1cmUuaW4sIGJ1dCBpdCdzIG5vdCB3b3J0aCBpdCByaWdodCBub3cuICovCisjaWYgZGVmaW5lZChfX29zZl9fKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBfX2Z1bmNfXyBfX0ZVTkNUSU9OX18KKyNlbmRpZgorCisjZGVmaW5lIFNUQVJUX1RFU1QodGVzdG5hbWUpIHN0YXRpYyB2b2lkIHRlc3RuYW1lKHZvaWQpIHsgXAorICAgIF9jaGVja19zZXRfdGVzdF9pbmZvKF9fZnVuY19fLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgIFwKKyAgICB7CisjZGVmaW5lIEVORF9URVNUIH0gfQorCisjZGVmaW5lIGZhaWwobXNnKSAgX2ZhaWxfdW5sZXNzKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgbXNnKQorCit0eXBlZGVmIHZvaWQgKCp0Y2FzZV9zZXR1cF9mdW5jdGlvbikodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCp0Y2FzZV90ZWFyZG93bl9mdW5jdGlvbikodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCp0Y2FzZV90ZXN0X2Z1bmN0aW9uKSh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgU1J1bm5lciBTUnVubmVyOwordHlwZWRlZiBzdHJ1Y3QgU3VpdGUgU3VpdGU7Cit0eXBlZGVmIHN0cnVjdCBUQ2FzZSBUQ2FzZTsKKworc3RydWN0IFNSdW5uZXIgeworICAgIFN1aXRlICpzdWl0ZTsKKyAgICBpbnQgbmNoZWNrczsKKyAgICBpbnQgbmZhaWx1cmVzOworfTsKKworc3RydWN0IFN1aXRlIHsKKyAgICBjaGFyICpuYW1lOworICAgIFRDYXNlICp0ZXN0czsKK307CisKK3N0cnVjdCBUQ2FzZSB7CisgICAgY2hhciAqbmFtZTsKKyAgICB0Y2FzZV9zZXR1cF9mdW5jdGlvbiBzZXR1cDsKKyAgICB0Y2FzZV90ZWFyZG93bl9mdW5jdGlvbiB0ZWFyZG93bjsKKyAgICB0Y2FzZV90ZXN0X2Z1bmN0aW9uICp0ZXN0czsKKyAgICBpbnQgbnRlc3RzOworICAgIGludCBhbGxvY2F0ZWQ7CisgICAgVENhc2UgKm5leHRfdGNhc2U7Cit9OworCisKKy8qIEludGVybmFsIGhlbHBlci4gKi8KK3ZvaWQgX2NoZWNrX3NldF90ZXN0X2luZm8oY2hhciBjb25zdCAqZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vKTsKKworCisvKgorICogUHJvdG90eXBlcyBmb3IgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCit2b2lkIF9mYWlsX3VubGVzcyhpbnQgY29uZGl0aW9uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqbXNnKTsKK1N1aXRlICpzdWl0ZV9jcmVhdGUoY2hhciAqbmFtZSk7CitUQ2FzZSAqdGNhc2VfY3JlYXRlKGNoYXIgKm5hbWUpOwordm9pZCBzdWl0ZV9hZGRfdGNhc2UoU3VpdGUgKnN1aXRlLCBUQ2FzZSAqdGMpOwordm9pZCB0Y2FzZV9hZGRfY2hlY2tlZF9maXh0dXJlKFRDYXNlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNhc2Vfc2V0dXBfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNhc2VfdGVhcmRvd25fZnVuY3Rpb24pOwordm9pZCB0Y2FzZV9hZGRfdGVzdChUQ2FzZSAqdGMsIHRjYXNlX3Rlc3RfZnVuY3Rpb24gdGVzdCk7CitTUnVubmVyICpzcnVubmVyX2NyZWF0ZShTdWl0ZSAqc3VpdGUpOwordm9pZCBzcnVubmVyX3J1bl9hbGwoU1J1bm5lciAqcnVubmVyLCBpbnQgdmVyYm9zaXR5KTsKK2ludCBzcnVubmVyX250ZXN0c19mYWlsZWQoU1J1bm5lciAqcnVubmVyKTsKK3ZvaWQgc3J1bm5lcl9mcmVlKFNSdW5uZXIgKnJ1bm5lcik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9ydW50ZXN0cy5jIGIvZXhwYXQtMi4wLjEvdGVzdHMvcnVudGVzdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNTIxYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdGVzdHMvcnVudGVzdHMuYwpAQCAtMCwwICsxLDE1MTQgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisKKyAgIHJ1bnRlc3QuYyA6IHJ1biB0aGUgRXhwYXQgdGVzdCBzdWl0ZQorKi8KKworI2lmZGVmIEhBVkVfRVhQQVRfQ09ORklHX0gKKyNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImV4cGF0LmgiCisjaW5jbHVkZSAiY2hhcmRhdGEuaCIKKyNpbmNsdWRlICJtaW5pY2hlY2suaCIKKworI2lmIGRlZmluZWQoX19hbWlnYW9zX18pICYmIGRlZmluZWQoX19VU0VfSU5MSU5FX18pCisjaW5jbHVkZSA8cHJvdG8vZXhwYXQuaD4KKyNlbmRpZgorCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUKKyNkZWZpbmUgWE1MX0ZNVF9JTlRfTU9EICJsbCIKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibCIKKyNlbmRpZgorCitzdGF0aWMgWE1MX1BhcnNlciBwYXJzZXI7CisKKworc3RhdGljIHZvaWQKK2Jhc2ljX3NldHVwKHZvaWQpCit7CisgICAgcGFyc2VyID0gWE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKKyAgICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgICAgIGZhaWwoIlBhcnNlciBub3QgY3JlYXRlZC4iKTsKK30KKworc3RhdGljIHZvaWQKK2Jhc2ljX3RlYXJkb3duKHZvaWQpCit7CisgICAgaWYgKHBhcnNlciAhPSBOVUxMKQorICAgICAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworfQorCisvKiBHZW5lcmF0ZSBhIGZhaWx1cmUgdXNpbmcgdGhlIHBhcnNlciBzdGF0ZSB0byBjcmVhdGUgYW4gZXJyb3IgbWVzc2FnZTsKKyAgIHRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgcGFyc2VyIHJlcG9ydHMgYW4gZXJyb3Igd2Ugd2VyZW4ndAorICAgZXhwZWN0aW5nLgorKi8KK3N0YXRpYyB2b2lkCitfeG1sX2ZhaWx1cmUoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIGVudW0gWE1MX0Vycm9yIGVyciA9IFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKTsKKyAgICBzcHJpbnRmKGJ1ZmZlciwKKyAgICAgICAgICAgICIgICAgJWQ6ICVzIChsaW5lICUiIFhNTF9GTVRfSU5UX01PRCAidSwgb2Zmc2V0ICUiXAorICAgICAgICAgICAgICAgIFhNTF9GTVRfSU5UX01PRCAidSlcbiAgICByZXBvcnRlZCBmcm9tICVzLCBsaW5lICVkXG4iLAorICAgICAgICAgICAgZXJyLAorICAgICAgICAgICAgWE1MX0Vycm9yU3RyaW5nKGVyciksCisgICAgICAgICAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKSwKKyAgICAgICAgICAgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHBhcnNlciksCisgICAgICAgICAgICBmaWxlLCBsaW5lKTsKKyAgICBfZmFpbF91bmxlc3MoMCwgZmlsZSwgbGluZSwgYnVmZmVyKTsKK30KKworI2RlZmluZSB4bWxfZmFpbHVyZShwYXJzZXIpIF94bWxfZmFpbHVyZSgocGFyc2VyKSwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgdm9pZAorX2V4cGVjdF9mYWlsdXJlKGNoYXIgKnRleHQsIGVudW0gWE1MX0Vycm9yIGVycm9yQ29kZSwgY2hhciAqZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgIGNoYXIgKmZpbGUsIGludCBsaW5lbm8pCit7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfT0spCisgICAgICAgIC8qIEhhY2tpc2ggdXNlIG9mIF9mYWlsX3VubGVzcygpIG1hY3JvLCBidXQgbGV0J3MgdXMgcmVwb3J0CisgICAgICAgICAgIHRoZSByaWdodCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIuICovCisgICAgICAgIF9mYWlsX3VubGVzcygwLCBmaWxlLCBsaW5lbm8sIGVycm9yTWVzc2FnZSk7CisgICAgaWYgKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSAhPSBlcnJvckNvZGUpCisgICAgICAgIF94bWxfZmFpbHVyZShwYXJzZXIsIGZpbGUsIGxpbmVubyk7Cit9CisKKyNkZWZpbmUgZXhwZWN0X2ZhaWx1cmUodGV4dCwgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UpIFwKKyAgICAgICAgX2V4cGVjdF9mYWlsdXJlKCh0ZXh0KSwgKGVycm9yQ29kZSksIChlcnJvck1lc3NhZ2UpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qIER1bW15IGhhbmRsZXJzIGZvciB3aGVuIHdlIG5lZWQgdG8gc2V0IGEgaGFuZGxlciB0byB0aWNrbGUgYSBidWcsCisgICBidXQgaXQgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorKi8KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfc3RhcnRfZG9jdHlwZV9oYW5kbGVyKHZvaWQgICAgICAgICAgICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZG9jdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNfaW50ZXJuYWxfc3Vic2V0KQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfZW5kX2RvY3R5cGVfaGFuZGxlcih2b2lkICp1c2VyRGF0YSkKK3t9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2R1bW15X2VudGl0eV9kZWNsX2hhbmRsZXIodm9pZCAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaXNfcGFyYW1ldGVyX2VudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICB2YWx1ZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSkKK3t9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2R1bW15X25vdGF0aW9uX2RlY2xfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCit7fQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitkdW1teV9lbGVtZW50X2RlY2xfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbnRlbnQgKm1vZGVsKQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfYXR0bGlzdF9kZWNsX2hhbmRsZXIodm9pZCAgICAgICAgICAgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVsbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICphdHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmF0dF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRmbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBpc3JlcXVpcmVkKQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfY29tbWVudF9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSkKK3t9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2R1bW15X3BpX2hhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICp0YXJnZXQsIGNvbnN0IFhNTF9DaGFyICpkYXRhKQore30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZHVtbXlfc3RhcnRfZWxlbWVudCh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUsIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3t9CisKKworLyoKKyAqIENoYXJhY3RlciAmIGVuY29kaW5nIHRlc3RzLgorICovCisKK1NUQVJUX1RFU1QodGVzdF9udWxfYnl0ZSkKK3sKKyAgICBjaGFyIHRleHRbXSA9ICI8ZG9jPlwwPC9kb2M+IjsKKworICAgIC8qIHRlc3QgdGhhdCBhIE5VTCBieXRlIChpbiBVUy1BU0NJSSBkYXRhKSBpcyBhbiBlcnJvciAqLworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCkgLSAxLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19PSykKKyAgICAgICAgZmFpbCgiUGFyc2VyIGRpZCBub3QgcmVwb3J0IGVycm9yIG9uIE5VTC1ieXRlLiIpOworICAgIGlmIChYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikgIT0gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU4pCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisKK1NUQVJUX1RFU1QodGVzdF91MDAwMF9jaGFyKQoreworICAgIC8qIHRlc3QgdGhhdCBhIE5VTCBieXRlIChpbiBVUy1BU0NJSSBkYXRhKSBpcyBhbiBlcnJvciAqLworICAgIGV4cGVjdF9mYWlsdXJlKCI8ZG9jPiYjMDs8L2RvYz4iLAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9CQURfQ0hBUl9SRUYsCisgICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCBlcnJvciBvbiBOVUwtYnl0ZS4iKTsKK30KK0VORF9URVNUCisKK1NUQVJUX1RFU1QodGVzdF9ib21fdXRmOCkKK3sKKyAgICAvKiBUaGlzIHRlc3QgaXMgcmVhbGx5IGp1c3QgbWFraW5nIHN1cmUgd2UgZG9uJ3QgY29yZSBvbiBhIFVURi04IEJPTS4gKi8KKyAgICBjaGFyICp0ZXh0ID0gIlwzNTdcMjczXDI3NzxlLz4iOworCisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfYm9tX3V0ZjE2X2JlKQoreworICAgIGNoYXIgdGV4dFtdID0gIlwzNzZcMzc3XDA8XDBlXDAvXDA+IjsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfYm9tX3V0ZjE2X2xlKQoreworICAgIGNoYXIgdGV4dFtdID0gIlwzNzdcMzc2PFwwZVwwL1wwPlwwIjsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitzdGF0aWMgdm9pZCBYTUxDQUxMCithY2N1bXVsYXRlX2NoYXJhY3RlcnModm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworICAgIENoYXJEYXRhX0FwcGVuZFhNTENoYXJzKChDaGFyRGF0YSAqKXVzZXJEYXRhLCBzLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCithY2N1bXVsYXRlX2F0dHJpYnV0ZSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKil1c2VyRGF0YTsKKyAgICBpZiAoc3RvcmFnZS0+Y291bnQgPCAwICYmIGF0dHMgIT0gTlVMTCAmJiBhdHRzWzBdICE9IE5VTEwpIHsKKyAgICAgICAgLyogImFjY3VtdWxhdGUiIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYXR0cmlidXRlIHdlIHNlZSAqLworICAgICAgICBDaGFyRGF0YV9BcHBlbmRYTUxDaGFycyhzdG9yYWdlLCBhdHRzWzFdLCAtMSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfcnVuX2NoYXJhY3Rlcl9jaGVjayhYTUxfQ2hhciAqdGV4dCwgWE1MX0NoYXIgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgICAgQ2hhckRhdGEgc3RvcmFnZTsKKworICAgIENoYXJEYXRhX0luaXQoJnN0b3JhZ2UpOworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZzdG9yYWdlKTsKKyAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBhY2N1bXVsYXRlX2NoYXJhY3RlcnMpOworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICBfeG1sX2ZhaWx1cmUocGFyc2VyLCBmaWxlLCBsaW5lKTsKKyAgICBDaGFyRGF0YV9DaGVja1hNTENoYXJzKCZzdG9yYWdlLCBleHBlY3RlZCk7Cit9CisKKyNkZWZpbmUgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCBleHBlY3RlZCkgXAorICAgICAgICBfcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCBleHBlY3RlZCwgX19GSUxFX18sIF9fTElORV9fKQorCitzdGF0aWMgdm9pZAorX3J1bl9hdHRyaWJ1dGVfY2hlY2soWE1MX0NoYXIgKnRleHQsIFhNTF9DaGFyICpleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIENoYXJEYXRhIHN0b3JhZ2U7CisKKyAgICBDaGFyRGF0YV9Jbml0KCZzdG9yYWdlKTsKKyAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmc3RvcmFnZSk7CisgICAgWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBhY2N1bXVsYXRlX2F0dHJpYnV0ZSk7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIF94bWxfZmFpbHVyZShwYXJzZXIsIGZpbGUsIGxpbmUpOworICAgIENoYXJEYXRhX0NoZWNrWE1MQ2hhcnMoJnN0b3JhZ2UsIGV4cGVjdGVkKTsKK30KKworI2RlZmluZSBydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIGV4cGVjdGVkKSBcCisgICAgICAgIF9ydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIGV4cGVjdGVkLCBfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0OTE5ODYuICovCitTVEFSVF9URVNUKHRlc3RfZGFuaXNoX2xhdGluMSkKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz5cbiIKKyAgICAgICAgIjxlPkpceEY4cmdlbiBceEU2XHhGOFx4RTVceEM2XHhEOFx4QzU8L2U+IjsKKyAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsCisgICAgICAgICAgICAgIkpceEMzXHhCOHJnZW4gXHhDM1x4QTZceEMzXHhCOFx4QzNceEE1XHhDM1x4ODZceEMzXHg5OFx4QzNceDg1Iik7Cit9CitFTkRfVEVTVAorCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM1MTQyODEuICovCitTVEFSVF9URVNUKHRlc3RfZnJlbmNoX2NoYXJyZWZfaGV4aWRlY2ltYWwpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZG9jPiYjeEU5OyYjeEU4OyYjeEUwOyYjeEU3OyYjeEVBOyYjeEM4OzwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIlx4QzNceEE5XHhDM1x4QThceEMzXHhBMFx4QzNceEE3XHhDM1x4QUFceEMzXHg4OCIpOworfQorRU5EX1RFU1QKKworU1RBUlRfVEVTVCh0ZXN0X2ZyZW5jaF9jaGFycmVmX2RlY2ltYWwpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZG9jPiYjMjMzOyYjMjMyOyYjMjI0OyYjMjMxOyYjMjM0OyYjMjAwOzwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIlx4QzNceEE5XHhDM1x4QThceEMzXHhBMFx4QzNceEE3XHhDM1x4QUFceEMzXHg4OCIpOworfQorRU5EX1RFU1QKKworU1RBUlRfVEVTVCh0ZXN0X2ZyZW5jaF9sYXRpbjEpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZG9jPlx4RTlceEU4XHhFMFx4RTdceEVhXHhDODwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIlx4QzNceEE5XHhDM1x4QThceEMzXHhBMFx4QzNceEE3XHhDM1x4QUFceEMzXHg4OCIpOworfQorRU5EX1RFU1QKKworU1RBUlRfVEVTVCh0ZXN0X2ZyZW5jaF91dGY4KQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz5cbiIKKyAgICAgICAgIjxkb2M+XHhDM1x4QTk8L2RvYz4iOworICAgIHJ1bl9jaGFyYWN0ZXJfY2hlY2sodGV4dCwgIlx4QzNceEE5Iik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjAwNDc5LgorICAgWFhYIFRoZXJlIHNob3VsZCBiZSBhIHRlc3QgdGhhdCBleGVyY2lzZXMgYWxsIGxlZ2FsIFhNTCBVbmljb2RlCisgICBjaGFyYWN0ZXJzIGFzIFBDREFUQSBhbmQgYXR0cmlidXRlIHZhbHVlIGNvbnRlbnQsIGFuZCBYTUwgTmFtZQorICAgY2hhcmFjdGVycyBhcyBwYXJ0IG9mIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcy4KKyovCitTVEFSVF9URVNUKHRlc3RfdXRmOF9mYWxzZV9yZWplY3Rpb24pCit7CisgICAgY2hhciAqdGV4dCA9ICI8ZG9jPlx4RUZceEJBXHhCRjwvZG9jPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCAiXHhFRlx4QkFceEJGIik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNDc3NjY3LgorICAgVGhpcyB0ZXN0IGFzc3VyZXMgdGhhdCBhbnkgOC1iaXQgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IGEgNy1iaXQKKyAgIGNoYXJhY3RlciB3aWxsIG5vdCBiZSBtaXN0YWtlbmx5IGludGVycHJldGVkIGFzIGEgdmFsaWQgVVRGLTgKKyAgIHNlcXVlbmNlLgorKi8KK1NUQVJUX1RFU1QodGVzdF9pbGxlZ2FsX3V0ZjgpCit7CisgICAgY2hhciB0ZXh0WzEwMF07CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAxMjg7IGkgPD0gMjU1OyArK2kpIHsKKyAgICAgICAgc3ByaW50Zih0ZXh0LCAiPGU+JWNjZDwvZT4iLCBpKTsKKyAgICAgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIHNwcmludGYodGV4dCwKKyAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRva2VuIGVycm9yIGZvciAnJWMnIChvcmRpbmFsICVkKSBpbiBVVEYtOCB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaSk7CisgICAgICAgICAgICBmYWlsKHRleHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSAhPSBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTikKKyAgICAgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7CisgICAgICAgIC8qIFJlc2V0IHRoZSBwYXJzZXIgc2luY2Ugd2UgdXNlIHRoZSBzYW1lIHBhcnNlciByZXBlYXRlZGx5LiAqLworICAgICAgICBYTUxfUGFyc2VyUmVzZXQocGFyc2VyLCBOVUxMKTsKKyAgICB9Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfdXRmMTYpCit7CisgICAgLyogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTE2Ij8+CisgICAgICAgPGRvYyBhPScxMjMnPnNvbWUgdGV4dDwvZG9jPgorICAgICovCisgICAgY2hhciB0ZXh0W10gPQorICAgICAgICAiXDAwMDxcMDAwP1wwMDB4XDAwMG1cMDAwXDE1NFwwMDAgXDAwMHZcMDAwZVwwMDByXDAwMHNcMDAwaVwwMDBvIgorICAgICAgICAiXDAwMG5cMDAwPVwwMDAnXDAwMDFcMDAwLlwwMDBcMDYwXDAwMCdcMDAwIFwwMDBlXDAwMG5cMDAwY1wwMDBvIgorICAgICAgICAiXDAwMGRcMDAwaVwwMDBuXDAwMGdcMDAwPVwwMDAnXDAwMFVcMDAwVFwwMDBGXDAwMC1cMDAwMVwwMDBcMDY2IgorICAgICAgICAiXDAwMCdcMDAwP1wwMDA+XDAwMFxuIgorICAgICAgICAiXDAwMDxcMDAwZFwwMDBvXDAwMGNcMDAwIFwwMDBhXDAwMD1cMDAwJ1wwMDAxXDAwMDJcMDAwM1wwMDAnIgorICAgICAgICAiXDAwMD5cMDAwc1wwMDBvXDAwMG1cMDAwZVwwMDAgXDAwMHRcMDAwZVwwMDB4XDAwMHRcMDAwPFwwMDAvIgorICAgICAgICAiXDAwMGRcMDAwb1wwMDBjXDAwMD4iOworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzaXplb2YodGV4dCktMSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitTVEFSVF9URVNUKHRlc3RfdXRmMTZfbGVfZXBpbG9nX25ld2xpbmUpCit7CisgICAgdW5zaWduZWQgaW50IGZpcnN0X2NodW5rX2J5dGVzID0gMTc7CisgICAgY2hhciB0ZXh0W10gPSAKKyAgICAgICAgIlx4RkZceEZFIiAgICAgICAgICAgICAgICAgICAgICAvKiBCT00gKi8KKyAgICAgICAgIjxcMDAwZVwwMDAvXDAwMD5cMDAwIiAgICAgICAgICAvKiBkb2N1bWVudCBlbGVtZW50ICovCisgICAgICAgICJcclwwMDBcblwwMDBcclwwMDBcblwwMDAiOyAgICAgLyogZXBpbG9nICovCisKKyAgICBpZiAoZmlyc3RfY2h1bmtfYnl0ZXMgPj0gc2l6ZW9mKHRleHQpIC0gMSkKKyAgICAgICAgZmFpbCgiYmFkIHZhbHVlIG9mIGZpcnN0X2NodW5rX2J5dGVzIik7CisgICAgaWYgKCAgWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgZmlyc3RfY2h1bmtfYnl0ZXMsIFhNTF9GQUxTRSkKKyAgICAgICAgICA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIGVsc2UgeworICAgICAgICBlbnVtIFhNTF9TdGF0dXMgcmM7CisgICAgICAgIHJjID0gWE1MX1BhcnNlKHBhcnNlciwgdGV4dCArIGZpcnN0X2NodW5rX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGV4dCkgLSBmaXJzdF9jaHVua19ieXRlcyAtIDEsIFhNTF9UUlVFKTsKKyAgICAgICAgaWYgKHJjID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIH0KK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0ODE2MDksICM3NzQwMjguICovCitTVEFSVF9URVNUKHRlc3RfbGF0aW4xX3VtbGF1dHMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG4iCisgICAgICAgICI8ZSBhPSdceEU0IFx4RjYgXHhGQyAmIzIyODsgJiMyNDY7ICYjMjUyOyAmI3gwMEU0OyAmI3gwRjY7ICYjeEZDOyA+J1xuIgorICAgICAgICAiICA+XHhFNCBceEY2IFx4RkMgJiMyMjg7ICYjMjQ2OyAmIzI1MjsgJiN4MDBFNDsgJiN4MEY2OyAmI3hGQzsgPjwvZT4iOworICAgIGNoYXIgKnV0ZjggPQorICAgICAgICAiXHhDM1x4QTQgXHhDM1x4QjYgXHhDM1x4QkMgIgorICAgICAgICAiXHhDM1x4QTQgXHhDM1x4QjYgXHhDM1x4QkMgIgorICAgICAgICAiXHhDM1x4QTQgXHhDM1x4QjYgXHhDM1x4QkMgPiI7CisgICAgcnVuX2NoYXJhY3Rlcl9jaGVjayh0ZXh0LCB1dGY4KTsKKyAgICBYTUxfUGFyc2VyUmVzZXQocGFyc2VyLCBOVUxMKTsKKyAgICBydW5fYXR0cmlidXRlX2NoZWNrKHRleHQsIHV0ZjgpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICMxIGZvciBTRiBidWcgIzY1MzE4MC4gKi8KK1NUQVJUX1RFU1QodGVzdF9saW5lX251bWJlcl9hZnRlcl9wYXJzZSkKK3sgIAorICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPHRhZz5cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG48L3RhZz4iOworICAgIFhNTF9TaXplIGxpbmVubzsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9GQUxTRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKKyAgICBsaW5lbm8gPSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKTsKKyAgICBpZiAobGluZW5vICE9IDQpIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsIAorICAgICAgICAgICAgImV4cGVjdGVkIDQgbGluZXMsIHNhdyAlIiBYTUxfRk1UX0lOVF9NT0QgInUiLCBsaW5lbm8pOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICMyIGZvciBTRiBidWcgIzY1MzE4MC4gKi8KK1NUQVJUX1RFU1QodGVzdF9jb2x1bW5fbnVtYmVyX2FmdGVyX3BhcnNlKQoreworICAgIGNoYXIgKnRleHQgPSAiPHRhZz48L3RhZz4iOworICAgIFhNTF9TaXplIGNvbG5vOworCisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX0ZBTFNFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIGNvbG5vID0gWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKTsKKyAgICBpZiAoY29sbm8gIT0gMTEpIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsIAorICAgICAgICAgICAgImV4cGVjdGVkIDExIGNvbHVtbnMsIHNhdyAlIiBYTUxfRk1UX0lOVF9NT0QgInUiLCBjb2xubyk7CisgICAgICAgIGZhaWwoYnVmZmVyKTsKKyAgICB9Cit9CitFTkRfVEVTVAorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydF9lbGVtZW50X2V2ZW50X2hhbmRsZXIyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKwkJCSAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRyKQoreworICAgIENoYXJEYXRhICpzdG9yYWdlID0gKENoYXJEYXRhICopIHVzZXJEYXRhOworICAgIGNoYXIgYnVmZmVyWzEwMF07CisKKyAgICBzcHJpbnRmKGJ1ZmZlciwKKyAgICAgICAgIjwlcz4gYXQgY29sOiUiIFhNTF9GTVRfSU5UX01PRCAidSBsaW5lOiUiXAorICAgICAgICAgICAgWE1MX0ZNVF9JTlRfTU9EICJ1XG4iLCBuYW1lLAorCSAgICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihwYXJzZXIpLAorCSAgICBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIocGFyc2VyKSk7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK2VuZF9lbGVtZW50X2V2ZW50X2hhbmRsZXIyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgICBDaGFyRGF0YSAqc3RvcmFnZSA9IChDaGFyRGF0YSAqKSB1c2VyRGF0YTsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworCisgICAgc3ByaW50ZihidWZmZXIsCisgICAgICAgICI8LyVzPiBhdCBjb2w6JSIgWE1MX0ZNVF9JTlRfTU9EICJ1IGxpbmU6JSJcCisgICAgICAgICAgICBYTUxfRk1UX0lOVF9NT0QgInVcbiIsIG5hbWUsCisJICAgIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKHBhcnNlciksCisJICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpKTsKKyAgICBDaGFyRGF0YV9BcHBlbmRTdHJpbmcoc3RvcmFnZSwgYnVmZmVyKTsKK30KKworLyogUmVncmVzc2lvbiB0ZXN0ICMzIGZvciBTRiBidWcgIzY1MzE4MC4gKi8KK1NUQVJUX1RFU1QodGVzdF9saW5lX2FuZF9jb2x1bW5fbnVtYmVyc19pbnNpZGVfaGFuZGxlcnMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8YT5cbiIgICAgICAgIC8qIFVuaXggZW5kLW9mLWxpbmUgKi8KKyAgICAgICAgIiAgPGI+XHJcbiIgICAgLyogV2luZG93cyBlbmQtb2YtbGluZSAqLworICAgICAgICAiICAgIDxjLz5cciIgICAvKiBNYWMgT1MgZW5kLW9mLWxpbmUgKi8KKyAgICAgICAgIiAgPC9iPlxuIgorICAgICAgICAiICA8ZD5cbiIKKyAgICAgICAgIiAgICA8Zi8+XG4iCisgICAgICAgICIgIDwvZD5cbiIKKyAgICAgICAgIjwvYT4iOworICAgIGNoYXIgKmV4cGVjdGVkID0KKyAgICAgICAgIjxhPiBhdCBjb2w6MCBsaW5lOjFcbiIKKyAgICAgICAgIjxiPiBhdCBjb2w6MiBsaW5lOjJcbiIKKyAgICAgICAgIjxjPiBhdCBjb2w6NCBsaW5lOjNcbiIKKyAgICAgICAgIjwvYz4gYXQgY29sOjggbGluZTozXG4iCisgICAgICAgICI8L2I+IGF0IGNvbDoyIGxpbmU6NFxuIgorICAgICAgICAiPGQ+IGF0IGNvbDoyIGxpbmU6NVxuIgorICAgICAgICAiPGY+IGF0IGNvbDo0IGxpbmU6NlxuIgorICAgICAgICAiPC9mPiBhdCBjb2w6OCBsaW5lOjZcbiIKKyAgICAgICAgIjwvZD4gYXQgY29sOjIgbGluZTo3XG4iCisgICAgICAgICI8L2E+IGF0IGNvbDowIGxpbmU6OFxuIjsKKyAgICBDaGFyRGF0YSBzdG9yYWdlOworCisgICAgQ2hhckRhdGFfSW5pdCgmc3RvcmFnZSk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgJnN0b3JhZ2UpOworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgc3RhcnRfZWxlbWVudF9ldmVudF9oYW5kbGVyMik7CisgICAgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZW5kX2VsZW1lbnRfZXZlbnRfaGFuZGxlcjIpOworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworCisgICAgQ2hhckRhdGFfQ2hlY2tTdHJpbmcoJnN0b3JhZ2UsIGV4cGVjdGVkKTsgCit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgIzQgZm9yIFNGIGJ1ZyAjNjUzMTgwLiAqLworU1RBUlRfVEVTVCh0ZXN0X2xpbmVfbnVtYmVyX2FmdGVyX2Vycm9yKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGE+XG4iCisgICAgICAgICIgIDxiPlxuIgorICAgICAgICAiICA8L2E+IjsgIC8qIG1pc3NpbmcgPC9iPiAqLworICAgIFhNTF9TaXplIGxpbmVubzsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfRkFMU0UpICE9IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgcGFyc2UgZXJyb3IiKTsKKworICAgIGxpbmVubyA9IFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpOworICAgIGlmIChsaW5lbm8gIT0gMykgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgImV4cGVjdGVkIDMgbGluZXMsIHNhdyAlIiBYTUxfRk1UX0lOVF9NT0QgInUiLCBsaW5lbm8pOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorfQorRU5EX1RFU1QKKyAgICAKKy8qIFJlZ3Jlc3Npb24gdGVzdCAjNSBmb3IgU0YgYnVnICM2NTMxODAuICovCitTVEFSVF9URVNUKHRlc3RfY29sdW1uX251bWJlcl9hZnRlcl9lcnJvcikKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjxhPlxuIgorICAgICAgICAiICA8Yj5cbiIKKyAgICAgICAgIiAgPC9hPiI7ICAvKiBtaXNzaW5nIDwvYj4gKi8KKyAgICBYTUxfU2l6ZSBjb2xubzsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfRkFMU0UpICE9IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgcGFyc2UgZXJyb3IiKTsKKworICAgIGNvbG5vID0gWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIocGFyc2VyKTsKKyAgICBpZiAoY29sbm8gIT0gNCkgeyAKKyAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsIAorICAgICAgICAgICAgImV4cGVjdGVkIDQgY29sdW1ucywgc2F3ICUiIFhNTF9GTVRfSU5UX01PRCAidSIsIGNvbG5vKTsKKyAgICAgICAgZmFpbChidWZmZXIpOworICAgIH0KK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0NzgzMzIuICovCitTVEFSVF9URVNUKHRlc3RfcmVhbGx5X2xvbmdfbGluZXMpCit7CisgICAgLyogVGhpcyBwYXJzZXMgYW4gaW5wdXQgbGluZSBsb25nZXIgdGhhbiBJTklUX0RBVEFfQlVGX1NJWkUKKyAgICAgICBjaGFyYWN0ZXJzIGxvbmcgKGRlZmluZWQgdG8gYmUgMTAyNCBpbiB4bWxwYXJzZS5jKS4gIFdlIHRha2UgYQorICAgICAgIHJlYWxseSBjaGVlc3kgYXBwcm9hY2ggdG8gYnVpbGRpbmcgdGhlIGlucHV0IGJ1ZmZlciwgYmVjYXVzZQorICAgICAgIHRoaXMgYXZvaWRzIHdyaXRpbmcgYnVncyBpbiBidWZmZXItZmlsbGluZyBjb2RlLgorICAgICovCisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8ZT4iCisgICAgICAgIC8qIDY0IGNoYXJzICovCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAvKiB1bnRpbCB3ZSBoYXZlIGF0IGxlYXN0IDEwMjQgY2hhcmFjdGVycyBvbiB0aGUgbGluZTogKi8KKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS0rIgorICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktKyIKKyAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LSsiCisgICAgICAgICI8L2U+IjsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKworLyoKKyAqIEVsZW1lbnQgZXZlbnQgdGVzdHMuCisgKi8KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZW5kX2VsZW1lbnRfZXZlbnRfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICIvIik7CisgICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgbmFtZSwgLTEpOworfQorCitTVEFSVF9URVNUKHRlc3RfZW5kX2VsZW1lbnRfZXZlbnRzKQoreworICAgIGNoYXIgKnRleHQgPSAiPGE+PGI+PGMvPjwvYj48ZD48Zi8+PC9kPjwvYT4iOworICAgIGNoYXIgKmV4cGVjdGVkID0gIi9jL2IvZi9kL2EiOworICAgIENoYXJEYXRhIHN0b3JhZ2U7CisKKyAgICBDaGFyRGF0YV9Jbml0KCZzdG9yYWdlKTsKKyAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmc3RvcmFnZSk7CisgICAgWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZW5kX2VsZW1lbnRfZXZlbnRfaGFuZGxlcik7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7CisgICAgQ2hhckRhdGFfQ2hlY2tTdHJpbmcoJnN0b3JhZ2UsIGV4cGVjdGVkKTsKK30KK0VORF9URVNUCisKKworLyoKKyAqIEF0dHJpYnV0ZSB0ZXN0cy4KKyAqLworCisvKiBIZWxwZXJzIHVzZWQgYnkgdGhlIGZvbGxvd2luZyB0ZXN0OyB0aGlzIGNoZWNrcyBhbnkgImF0dHIiIGFuZCAicmVmcyIKKyAgIGF0dHJpYnV0ZXMgdG8gbWFrZSBzdXJlIHdoaXRlc3BhY2UgaGFzIGJlZW4gbm9ybWFsaXplZC4KKworICAgUmV0dXJuIHRydWUgaWYgd2hpdGVzcGFjZSBoYXMgYmVlbiBub3JtYWxpemVkIGluIGEgc3RyaW5nLCB1c2luZworICAgdGhlIHJ1bGVzIGZvciBhdHRyaWJ1dGUgdmFsdWUgbm9ybWFsaXphdGlvbi4gIFRoZSAnaXNfY2RhdGEnIGZsYWcKKyAgIGlzIG5lZWRlZCBzaW5jZSBDREFUQSBhdHRyaWJ1dGVzIGRvbid0IG5lZWQgdG8gaGF2ZSBtdWx0aXBsZQorICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbGxhcHNlZCB0byBhIHNpbmdsZSBzcGFjZSwgd2hpbGUgb3RoZXIKKyAgIGF0dHJpYnV0ZSBkYXRhIHR5cGVzIGRvLiAgKFNlY3Rpb24gMy4zLjMgb2YgdGhlIHJlY29tbWVuZGF0aW9uLikKKyovCitzdGF0aWMgaW50Citpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoY29uc3QgWE1MX0NoYXIgKnMsIGludCBpc19jZGF0YSkKK3sKKyAgICBpbnQgYmxhbmtzID0gMDsKKyAgICBpbnQgYXRfc3RhcnQgPSAxOworICAgIHdoaWxlICgqcykgeworICAgICAgICBpZiAoKnMgPT0gJyAnKQorICAgICAgICAgICAgKytibGFua3M7CisgICAgICAgIGVsc2UgaWYgKCpzID09ICdcdCcgfHwgKnMgPT0gJ1xuJyB8fCAqcyA9PSAnXHInKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGF0X3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgYXRfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIGlmIChibGFua3MgJiYgIWlzX2NkYXRhKQorICAgICAgICAgICAgICAgICAgICAvKiBpbGxlZ2FsIGxlYWRpbmcgYmxhbmtzICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYmxhbmtzID4gMSAmJiAhaXNfY2RhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBibGFua3MgPSAwOworICAgICAgICB9CisgICAgICAgICsrczsKKyAgICB9CisgICAgaWYgKGJsYW5rcyAmJiAhaXNfY2RhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCisvKiBDaGVjayB0aGUgYXR0cmlidXRlIHdoaXRlc3BhY2UgY2hlY2tlcjogKi8KK3N0YXRpYyB2b2lkCit0ZXN0aGVscGVyX2lzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCh2b2lkKQoreworICAgIGFzc2VydChpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmMiLCAxKSk7CisgICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjIGRlZiBnaGkiLCAwKSk7CisgICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjIGRlZiBnaGkiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIiBhYmMgZGVmIGdoaSIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCIgYWJjIGRlZiBnaGkiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyAgZGVmIGdoaSIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmMgIGRlZiBnaGkiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoImFiYyBkZWYgZ2hpICIsIDApKTsKKyAgICBhc3NlcnQoaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJhYmMgZGVmIGdoaSAiLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIiAiLCAwKSk7CisgICAgYXNzZXJ0KGlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiICIsIDEpKTsKKyAgICBhc3NlcnQoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiXHQiLCAwKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIlx0IiwgMSkpOworICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcbiIsIDApKTsKKyAgICBhc3NlcnQoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiXG4iLCAxKSk7CisgICAgYXNzZXJ0KCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQoIlxyIiwgMCkpOworICAgIGFzc2VydCghaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCJcciIsIDEpKTsKKyAgICBhc3NlcnQoIWlzX3doaXRlc3BhY2Vfbm9ybWFsaXplZCgiYWJjXHQgZGVmIiwgMSkpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitjaGVja19hdHRyX2NvbnRhaW5zX25vcm1hbGl6ZWRfd2hpdGVzcGFjZSh2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGF0dHNbaV0gIT0gTlVMTDsgaSArPSAyKSB7CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICphdHRybmFtZSA9IGF0dHNbaV07CisgICAgICAgIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSA9IGF0dHNbaSArIDFdOworICAgICAgICBpZiAoc3RyY21wKCJhdHRyIiwgYXR0cm5hbWUpID09IDAKKyAgICAgICAgICAgIHx8IHN0cmNtcCgiZW50cyIsIGF0dHJuYW1lKSA9PSAwCisgICAgICAgICAgICB8fCBzdHJjbXAoInJlZnMiLCBhdHRybmFtZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpc193aGl0ZXNwYWNlX25vcm1hbGl6ZWQodmFsdWUsIDApKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgImF0dHJpYnV0ZSB2YWx1ZSBub3Qgbm9ybWFsaXplZDogJXM9JyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRybmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGZhaWwoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworU1RBUlRfVEVTVCh0ZXN0X2F0dHJfd2hpdGVzcGFjZV9ub3JtYWxpemF0aW9uKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICIgIDwhQVRUTElTVCBkb2NcbiIKKyAgICAgICAgIiAgICAgICAgICAgIGF0dHIgTk1UT0tFTlMgI1JFUVVJUkVEXG4iCisgICAgICAgICIgICAgICAgICAgICBlbnRzIEVOVElUSUVTICNSRVFVSVJFRFxuIgorICAgICAgICAiICAgICAgICAgICAgcmVmcyBJRFJFRlMgICAjUkVRVUlSRUQ+XG4iCisgICAgICAgICJdPlxuIgorICAgICAgICAiPGRvYyBhdHRyPScgICAgYSAgYiBjXHRcdGRcdGVcdCcgcmVmcz0nIGlkLTEgICBcdCAgaWQtMlx0XHQnICBcbiIKKyAgICAgICAgIiAgICAgZW50cz0nIGVudC0xICAgXHRcclxuIgorICAgICAgICAiICAgICAgICAgICAgZW50LTIgICcgPlxuIgorICAgICAgICAiICA8ZSBpZD0naWQtMScvPlxuIgorICAgICAgICAiICA8ZSBpZD0naWQtMicvPlxuIgorICAgICAgICAiPC9kb2M+IjsKKworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19hdHRyX2NvbnRhaW5zX25vcm1hbGl6ZWRfd2hpdGVzcGFjZSk7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisKKy8qCisgKiBYTUwgZGVjbGFyYXRpb24gdGVzdHMuCisgKi8KKworU1RBUlRfVEVTVCh0ZXN0X3htbGRlY2xfbWlzcGxhY2VkKQoreworICAgIGV4cGVjdF9mYWlsdXJlKCJcbiIKKyAgICAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+XG4iCisgICAgICAgICAgICAgICAgICAgIjxhLz4iLAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJLAorICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVwb3J0IG1pc3BsYWNlZCBYTUwgZGVjbGFyYXRpb24iKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM1ODQ4MzIuICovCitzdGF0aWMgaW50IFhNTENBTEwKK1Vua25vd25FbmNvZGluZ0hhbmRsZXIodm9pZCAqZGF0YSxjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsWE1MX0VuY29kaW5nICppbmZvKQoreworICAgIGlmIChzdHJjbXAoZW5jb2RpbmcsInVuc3VwcG9ydGVkLWVuY29kaW5nIikgPT0gMCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQorICAgICAgICAgICAgaW5mby0+bWFwW2ldID0gaTsKKyAgICAgICAgaW5mby0+ZGF0YSA9IE5VTEw7CisgICAgICAgIGluZm8tPmNvbnZlcnQgPSBOVUxMOworICAgICAgICBpbmZvLT5yZWxlYXNlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7CisgICAgfQorICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOworfQorCitTVEFSVF9URVNUKHRlc3RfdW5rbm93bl9lbmNvZGluZ19pbnRlcm5hbF9lbnRpdHkpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1bnN1cHBvcnRlZC1lbmNvZGluZyc/PlxuIgorICAgICAgICAiPCFET0NUWVBFIHRlc3QgWzwhRU5USVRZIGZvbyAnYmFyJz5dPlxuIgorICAgICAgICAiPHRlc3QgYT0nJmZvbzsnLz4iOworCisgICAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIocGFyc2VyLCBVbmtub3duRW5jb2RpbmdIYW5kbGVyLCBOVUxMKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM2MjAxMDYuICovCitzdGF0aWMgaW50IFhNTENBTEwKK2V4dGVybmFsX2VudGl0eV9sb2FkZXJfc2V0X2VuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKK3sKKyAgICAvKiBUaGlzIHRleHQgc2F5cyBpdCdzIGFuIHVuc3VwcG9ydGVkIGVuY29kaW5nLCBidXQgaXQncyByZWFsbHkKKyAgICAgICBVVEYtOCwgd2hpY2ggd2UgdGVsbCBFeHBhdCB1c2luZyBYTUxfU2V0RW5jb2RpbmcoKS4KKyAgICAqLworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgZW5jb2Rpbmc9J2lzby04ODU5LTMnPz4iCisgICAgICAgICJceEMzXHhBOSI7CisgICAgWE1MX1BhcnNlciBleHRwYXJzZXI7CisKKyAgICBleHRwYXJzZXIgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUocGFyc2VyLCBjb250ZXh0LCBOVUxMKTsKKyAgICBpZiAoZXh0cGFyc2VyID09IE5VTEwpCisgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBjcmVhdGUgZXh0ZXJuYWwgZW50aXR5IHBhcnNlci4iKTsKKyAgICBpZiAoIVhNTF9TZXRFbmNvZGluZyhleHRwYXJzZXIsICJ1dGYtOCIpKQorICAgICAgICBmYWlsKCJYTUxfU2V0RW5jb2RpbmcoKSBpZ25vcmVkIGZvciBleHRlcm5hbCBlbnRpdHkiKTsKKyAgICBpZiAoICBYTUxfUGFyc2UoZXh0cGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKQorICAgICAgICAgID09IFhNTF9TVEFUVVNfRVJST1IpIHsKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitTVEFSVF9URVNUKHRlc3RfZXh0X2VudGl0eV9zZXRfZW5jb2RpbmcpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8IURPQ1RZUEUgZG9jIFtcbiIKKyAgICAgICAgIiAgPCFFTlRJVFkgZW4gU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9kdW1teS5lbnQnPlxuIgorICAgICAgICAiXT5cbiIKKyAgICAgICAgIjxkb2M+JmVuOzwvZG9jPiI7CisKKyAgICBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX2VudGl0eV9sb2FkZXJfc2V0X2VuY29kaW5nKTsKKyAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsICJceEMzXHhBOSIpOworfQorRU5EX1RFU1QKKworLyogVGVzdCB0aGF0IG5vIGVycm9yIGlzIHJlcG9ydGVkIGZvciB1bmtub3duIGVudGl0aWVzIGlmIHdlIGRvbid0CisgICByZWFkIGFuIGV4dGVybmFsIHN1YnNldC4gIFRoaXMgd2FzIGZpeGVkIGluIEV4cGF0IDEuOTUuNS4KKyovCitTVEFSVF9URVNUKHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3VucmVhZF9leHRlcm5hbF9zdWJzZXQpIHsKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgorICAgICAgICAiPGRvYz4mZW50aXR5OzwvZG9jPiI7CisKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFRlc3QgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgdW5rbm93biBlbnRpdGllcyBpZiB3ZSBkb24ndAorICAgaGF2ZSBhbiBleHRlcm5hbCBzdWJzZXQuCisqLworU1RBUlRfVEVTVCh0ZXN0X3dmY191bmRlY2xhcmVkX2VudGl0eV9ub19leHRlcm5hbF9zdWJzZXQpIHsKKyAgICBleHBlY3RfZmFpbHVyZSgiPGRvYz4mZW50aXR5OzwvZG9jPiIsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFksCisgICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCB1bmRlZmluZWQgZW50aXR5IHcvb3V0IGEgRFRELiIpOworfQorRU5EX1RFU1QKKworLyogVGVzdCB0aGF0IGFuIGVycm9yIGlzIHJlcG9ydGVkIGZvciB1bmtub3duIGVudGl0aWVzIGlmIHdlIGRvbid0CisgICByZWFkIGFuIGV4dGVybmFsIHN1YnNldCwgYnV0IGhhdmUgYmVlbiBkZWNsYXJlZCBzdGFuZGFsb25lLgorKi8KK1NUQVJUX1RFU1QodGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfc3RhbmRhbG9uZSkgeworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXMtYXNjaWknIHN0YW5kYWxvbmU9J3llcyc/PlxuIgorICAgICAgICAiPCFET0NUWVBFIGRvYyBTWVNURU0gJ2Zvbyc+XG4iCisgICAgICAgICI8ZG9jPiZlbnRpdHk7PC9kb2M+IjsKKworICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFksCisgICAgICAgICAgICAgICAgICAgIlBhcnNlciBkaWQgbm90IHJlcG9ydCB1bmRlZmluZWQgZW50aXR5IChzdGFuZGFsb25lKS4iKTsKK30KK0VORF9URVNUCisKK3N0YXRpYyBpbnQgWE1MQ0FMTAorZXh0ZXJuYWxfZW50aXR5X2xvYWRlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKK3sKKyAgICBjaGFyICp0ZXh0ID0gKGNoYXIgKilYTUxfR2V0VXNlckRhdGEocGFyc2VyKTsKKyAgICBYTUxfUGFyc2VyIGV4dHBhcnNlcjsKKworICAgIGV4dHBhcnNlciA9IFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIE5VTEwpOworICAgIGlmIChleHRwYXJzZXIgPT0gTlVMTCkKKyAgICAgICAgZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBleHRlcm5hbCBlbnRpdHkgcGFyc2VyLiIpOworICAgIGlmICggIFhNTF9QYXJzZShleHRwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpCisgICAgICAgICAgPT0gWE1MX1NUQVRVU19FUlJPUikgeworICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7Cit9CisKKy8qIFRlc3QgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgdW5rbm93biBlbnRpdGllcyBpZiB3ZSBoYXZlIHJlYWQKKyAgIGFuIGV4dGVybmFsIHN1YnNldCwgYW5kIHN0YW5kYWxvbmUgaXMgdHJ1ZS4KKyovCitTVEFSVF9URVNUKHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3dpdGhfZXh0ZXJuYWxfc3Vic2V0X3N0YW5kYWxvbmUpIHsKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3VzLWFzY2lpJyBzdGFuZGFsb25lPSd5ZXMnPz5cbiIKKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgorICAgICAgICAiPGRvYz4mZW50aXR5OzwvZG9jPiI7CisgICAgY2hhciAqZm9vX3RleHQgPQorICAgICAgICAiPCFFTEVNRU5UIGRvYyAoI1BDREFUQSkqPiI7CisKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUyk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgZm9vX3RleHQpOworICAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLCBleHRlcm5hbF9lbnRpdHlfbG9hZGVyKTsKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZLAorICAgICAgICAgICAgICAgICAgICJQYXJzZXIgZGlkIG5vdCByZXBvcnQgdW5kZWZpbmVkIGVudGl0eSAoZXh0ZXJuYWwgRFREKS4iKTsKK30KK0VORF9URVNUCisKKy8qIFRlc3QgdGhhdCBubyBlcnJvciBpcyByZXBvcnRlZCBmb3IgdW5rbm93biBlbnRpdGllcyBpZiB3ZSBoYXZlIHJlYWQKKyAgIGFuIGV4dGVybmFsIHN1YnNldCwgYW5kIHN0YW5kYWxvbmUgaXMgZmFsc2UuCisqLworU1RBUlRfVEVTVCh0ZXN0X3dmY191bmRlY2xhcmVkX2VudGl0eV93aXRoX2V4dGVybmFsX3N1YnNldCkgeworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXMtYXNjaWknPz5cbiIKKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdmb28nPlxuIgorICAgICAgICAiPGRvYz4mZW50aXR5OzwvZG9jPiI7CisgICAgY2hhciAqZm9vX3RleHQgPQorICAgICAgICAiPCFFTEVNRU5UIGRvYyAoI1BDREFUQSkqPiI7CisKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUyk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgZm9vX3RleHQpOworICAgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLCBleHRlcm5hbF9lbnRpdHlfbG9hZGVyKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKK1NUQVJUX1RFU1QodGVzdF93ZmNfbm9fcmVjdXJzaXZlX2VudGl0eV9yZWZzKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICIgIDwhRU5USVRZIGVudGl0eSAnJiMzODtlbnRpdHk7Jz5cbiIKKyAgICAgICAgIl0+XG4iCisgICAgICAgICI8ZG9jPiZlbnRpdHk7PC9kb2M+IjsKKworICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGLAorICAgICAgICAgICAgICAgICAgICJQYXJzZXIgZGlkIG5vdCByZXBvcnQgcmVjdXJzaXZlIGVudGl0eSByZWZlcmVuY2UuIik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNDgzNTE0LiAqLworU1RBUlRfVEVTVCh0ZXN0X2R0ZF9kZWZhdWx0X2hhbmRsaW5nKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICI8IUVOVElUWSBlIFNZU1RFTSAnaHR0cDovL3htbC5saWJleHBhdC5vcmcvZSc+XG4iCisgICAgICAgICI8IU5PVEFUSU9OIG4gU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9uJz5cbiIKKyAgICAgICAgIjwhRUxFTUVOVCBkb2MgRU1QVFk+XG4iCisgICAgICAgICI8IUFUVExJU1QgZG9jIGEgQ0RBVEEgI0lNUExJRUQ+XG4iCisgICAgICAgICI8P3BpIGluIGR0ZD8+XG4iCisgICAgICAgICI8IS0tY29tbWVudCBpbiBkdGQtLT5cbiIKKyAgICAgICAgIl0+PGRvYy8+IjsKKworICAgIFhNTF9TZXREZWZhdWx0SGFuZGxlcihwYXJzZXIsIGFjY3VtdWxhdGVfY2hhcmFjdGVycyk7CisgICAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV9zdGFydF9kb2N0eXBlX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV9lbmRfZG9jdHlwZV9oYW5kbGVyKTsKKyAgICBYTUxfU2V0RW50aXR5RGVjbEhhbmRsZXIocGFyc2VyLCBkdW1teV9lbnRpdHlfZGVjbF9oYW5kbGVyKTsKKyAgICBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlcihwYXJzZXIsIGR1bW15X25vdGF0aW9uX2RlY2xfaGFuZGxlcik7CisgICAgWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlcihwYXJzZXIsIGR1bW15X2VsZW1lbnRfZGVjbF9oYW5kbGVyKTsKKyAgICBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyKHBhcnNlciwgZHVtbXlfYXR0bGlzdF9kZWNsX2hhbmRsZXIpOworICAgIFhNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHBhcnNlciwgZHVtbXlfcGlfaGFuZGxlcik7CisgICAgWE1MX1NldENvbW1lbnRIYW5kbGVyKHBhcnNlciwgZHVtbXlfY29tbWVudF9oYW5kbGVyKTsKKyAgICBydW5fY2hhcmFjdGVyX2NoZWNrKHRleHQsICJcblxuXG5cblxuXG5cbjxkb2MvPiIpOworfQorRU5EX1RFU1QKKworLyogU2VlIHJlbGF0ZWQgU0YgYnVnICM2NzM3OTEuCisgICBXaGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIHNldHRpbmcgdGhlIG5hbWVzcGFjZSBVUkkgZm9yCisgICBhIHByZWZpeCBpcyBub3QgYWxsb3dlZDsgdGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCBpdCAqaXMqIGFsbG93ZWQKKyAgIHdoZW4gbmFtZXNwYWNlIHByb2Nlc3NpbmcgaXMgbm90IGVuYWJsZWQuCisgICAoU2VlIE5hbWVzcGFjZXMgaW4gWE1MLCBzZWN0aW9uIDIuKQorKi8KK1NUQVJUX1RFU1QodGVzdF9lbXB0eV9uc193aXRob3V0X25hbWVzcGFjZXMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8ZG9jIHhtbG5zOnByZWZpeD0naHR0cDovL3d3dy5leGFtcGxlLmNvbS8nPlxuIgorICAgICAgICAiICA8ZSB4bWxuczpwcmVmaXg9JycvPlxuIgorICAgICAgICAiPC9kb2M+IjsKKworICAgIGlmIChYTUxfUGFyc2UocGFyc2VyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzgyNDQyMC4KKyAgIENoZWNrcyB0aGF0IGFuIHhtbG5zOnByZWZpeCBhdHRyaWJ1dGUgc2V0IGluIGFuIGF0dHJpYnV0ZSdzIGRlZmF1bHQKKyAgIHZhbHVlIGlzbid0IG1pc2ludGVycHJldGVkLgorKi8KK1NUQVJUX1RFU1QodGVzdF9uc19pbl9hdHRyaWJ1dGVfZGVmYXVsdF93aXRob3V0X25hbWVzcGFjZXMpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8IURPQ1RZUEUgZTplbGVtZW50IFtcbiIKKyAgICAgICAgIiAgPCFBVFRMSVNUIGU6ZWxlbWVudFxuIgorICAgICAgICAiICAgIHhtbG5zOmUgQ0RBVEEgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nPlxuIgorICAgICAgICAiICAgICAgXT5cbiIKKyAgICAgICAgIjxlOmVsZW1lbnQvPiI7CisKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKK3N0YXRpYyBjaGFyICpsb25nX2NoYXJhY3Rlcl9kYXRhX3RleHQgPQorICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+PHM+IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiCisgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAiPC9zPiI7CisKK3N0YXRpYyBYTUxfQm9vbCByZXN1bWFibGUgPSBYTUxfRkFMU0U7CisKK3N0YXRpYyB2b2lkCitjbGVhcmluZ19hYm9ydGluZ19jaGFyYWN0ZXJfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworICAgIFhNTF9TdG9wUGFyc2VyKHBhcnNlciwgcmVzdW1hYmxlKTsKKyAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBOVUxMKTsKK30KKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzE1MTUyNjY6IG1pc3NpbmcgY2hlY2sgb2Ygc3RvcHBlZAorICAgcGFyc2VyIGluIGRvQ29udGV4dCgpICdmb3InIGxvb3AuICovCitTVEFSVF9URVNUKHRlc3Rfc3RvcF9wYXJzZXJfYmV0d2Vlbl9jaGFyX2RhdGFfY2FsbHMpCit7CisgICAgLyogVGhlIHNhbXBsZSBkYXRhIG11c3QgYmUgYmlnIGVub3VnaCB0aGF0IHRoZXJlIGFyZSB0d28gY2FsbHMgdG8KKyAgICAgICB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciBmcm9tIHdpdGhpbiB0aGUgaW5uZXIgImZvciIgbG9vcCBvZgorICAgICAgIHRoZSBYTUxfVE9LX0RBVEFfQ0hBUlMgY2FzZSBpbiBkb0NvbnRlbnQoKSwgYW5kIHRoZSBjaGFyYWN0ZXIKKyAgICAgICBoYW5kbGVyIG11c3Qgc3RvcCB0aGUgcGFyc2VyIGFuZCBjbGVhciB0aGUgY2hhcmFjdGVyIGRhdGEKKyAgICAgICBoYW5kbGVyLgorICAgICovCisgICAgY2hhciAqdGV4dCA9IGxvbmdfY2hhcmFjdGVyX2RhdGFfdGV4dDsKKworICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGNsZWFyaW5nX2Fib3J0aW5nX2NoYXJhY3Rlcl9oYW5kbGVyKTsKKyAgICByZXN1bWFibGUgPSBYTUxfRkFMU0U7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpICE9IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7CisgICAgaWYgKFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSAhPSBYTUxfRVJST1JfQUJPUlRFRCkKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICMxNTE1MjY2OiBtaXNzaW5nIGNoZWNrIG9mIHN0b3BwZWQKKyAgIHBhcnNlciBpbiBkb0NvbnRleHQoKSAnZm9yJyBsb29wLiAqLworU1RBUlRfVEVTVCh0ZXN0X3N1c3BlbmRfcGFyc2VyX2JldHdlZW5fY2hhcl9kYXRhX2NhbGxzKQoreworICAgIC8qIFRoZSBzYW1wbGUgZGF0YSBtdXN0IGJlIGJpZyBlbm91Z2ggdGhhdCB0aGVyZSBhcmUgdHdvIGNhbGxzIHRvCisgICAgICAgdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIgZnJvbSB3aXRoaW4gdGhlIGlubmVyICJmb3IiIGxvb3Agb2YKKyAgICAgICB0aGUgWE1MX1RPS19EQVRBX0NIQVJTIGNhc2UgaW4gZG9Db250ZW50KCksIGFuZCB0aGUgY2hhcmFjdGVyCisgICAgICAgaGFuZGxlciBtdXN0IHN0b3AgdGhlIHBhcnNlciBhbmQgY2xlYXIgdGhlIGNoYXJhY3RlciBkYXRhCisgICAgICAgaGFuZGxlci4KKyAgICAqLworICAgIGNoYXIgKnRleHQgPSBsb25nX2NoYXJhY3Rlcl9kYXRhX3RleHQ7CisKKyAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIocGFyc2VyLCBjbGVhcmluZ19hYm9ydGluZ19jaGFyYWN0ZXJfaGFuZGxlcik7CisgICAgcmVzdW1hYmxlID0gWE1MX1RSVUU7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpICE9IFhNTF9TVEFUVVNfU1VTUEVOREVEKQorICAgICAgICB4bWxfZmFpbHVyZShwYXJzZXIpOworICAgIGlmIChYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikgIT0gWE1MX0VSUk9SX05PTkUpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisKKy8qCisgKiBOYW1lc3BhY2VzIHRlc3RzLgorICovCisKK3N0YXRpYyB2b2lkCituYW1lc3BhY2Vfc2V0dXAodm9pZCkKK3sKKyAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlTlMoTlVMTCwgJyAnKTsKKyAgICBpZiAocGFyc2VyID09IE5VTEwpCisgICAgICAgIGZhaWwoIlBhcnNlciBub3QgY3JlYXRlZC4iKTsKK30KKworc3RhdGljIHZvaWQKK25hbWVzcGFjZV90ZWFyZG93bih2b2lkKQoreworICAgIGJhc2ljX3RlYXJkb3duKCk7Cit9CisKKy8qIENoZWNrIHRoYXQgYW4gZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZSBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWVzLgorICAgVGhlIGV4cGVjdGVkIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGFuIGFycmF5IHJlZmVyZW5jZSBvZiBzdHJpbmcgcG9pbnRlcnMKKyAgIHByb3ZpZGVkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudDsgdGhlIGZpcnN0IGlzIHRoZSBleHBlY3RlZAorICAgZWxlbWVudCBuYW1lLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgZXhwZWN0ZWQgYXR0cmlidXRlIG5hbWUuCisqLworc3RhdGljIHZvaWQgWE1MQ0FMTAordHJpcGxldF9zdGFydF9jaGVja2VyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgY2hhciAqKmVsZW1zdHIgPSAoY2hhciAqKil1c2VyRGF0YTsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBpZiAoc3RyY21wKGVsZW1zdHJbMF0sIG5hbWUpICE9IDApIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJ1bmV4cGVjdGVkIHN0YXJ0IHN0cmluZzogJyVzJyIsIG5hbWUpOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChzdHJjbXAoZWxlbXN0clsxXSwgYXR0c1swXSkgIT0gMCkgeworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgInVuZXhwZWN0ZWQgYXR0cmlidXRlIHN0cmluZzogJyVzJyIsIGF0dHNbMF0pOworICAgICAgICBmYWlsKGJ1ZmZlcik7CisgICAgfQorfQorCisvKiBDaGVjayB0aGF0IHRoZSBlbGVtZW50IG5hbWUgcGFzc2VkIHRvIHRoZSBlbmQtZWxlbWVudCBoYW5kbGVyIG1hdGNoZXMKKyAgIHRoZSBleHBlY3RlZCB2YWx1ZS4gIFRoZSBleHBlY3RlZCB2YWx1ZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQKKyAgIGluIGFuIGFycmF5IG9mIHN0cmluZ3MgcGFzc2VkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudC4KKyovCitzdGF0aWMgdm9pZCBYTUxDQUxMCit0cmlwbGV0X2VuZF9jaGVja2VyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICoqZWxlbXN0ciA9IChjaGFyICoqKXVzZXJEYXRhOworICAgIGlmIChzdHJjbXAoZWxlbXN0clswXSwgbmFtZSkgIT0gMCkgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICJ1bmV4cGVjdGVkIGVuZCBzdHJpbmc6ICclcyciLCBuYW1lKTsKKyAgICAgICAgZmFpbChidWZmZXIpOworICAgIH0KK30KKworU1RBUlRfVEVTVCh0ZXN0X3JldHVybl9uc190cmlwbGV0KQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGZvbzplIHhtbG5zOmZvbz0naHR0cDovL2V4cGF0LnNmLm5ldC8nIGJhcjphPScxMidcbiIKKyAgICAgICAgIiAgICAgICB4bWxuczpiYXI9J2h0dHA6Ly9leHBhdC5zZi5uZXQvJz48L2ZvbzplPiI7CisgICAgY2hhciAqZWxlbXN0cltdID0geworICAgICAgICAiaHR0cDovL2V4cGF0LnNmLm5ldC8gZSBmb28iLAorICAgICAgICAiaHR0cDovL2V4cGF0LnNmLm5ldC8gYSBiYXIiCisgICAgfTsKKyAgICBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KHBhcnNlciwgWE1MX1RSVUUpOworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIGVsZW1zdHIpOworICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHRyaXBsZXRfc3RhcnRfY2hlY2tlciwgdHJpcGxldF9lbmRfY2hlY2tlcik7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitvdmVyd3JpdGVfc3RhcnRfY2hlY2tlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICJzdGFydCAiKTsKKyAgICBDaGFyRGF0YV9BcHBlbmRYTUxDaGFycyhzdG9yYWdlLCBuYW1lLCAtMSk7CisgICAgd2hpbGUgKCphdHRzICE9IE5VTEwpIHsKKyAgICAgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICJcbmF0dHJpYnV0ZSAiKTsKKyAgICAgICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgKmF0dHMsIC0xKTsKKyAgICAgICAgYXR0cyArPSAyOworICAgIH0KKyAgICBDaGFyRGF0YV9BcHBlbmRTdHJpbmcoc3RvcmFnZSwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK292ZXJ3cml0ZV9lbmRfY2hlY2tlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUpCit7CisgICAgQ2hhckRhdGEgKnN0b3JhZ2UgPSAoQ2hhckRhdGEgKikgdXNlckRhdGE7CisgICAgQ2hhckRhdGFfQXBwZW5kU3RyaW5nKHN0b3JhZ2UsICJlbmQgIik7CisgICAgQ2hhckRhdGFfQXBwZW5kWE1MQ2hhcnMoc3RvcmFnZSwgbmFtZSwgLTEpOworICAgIENoYXJEYXRhX0FwcGVuZFN0cmluZyhzdG9yYWdlLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl9uc190YWduYW1lX292ZXJ3cml0ZV90ZXN0KGNoYXIgKnRleHQsIGNoYXIgKnJlc3VsdCkKK3sKKyAgICBDaGFyRGF0YSBzdG9yYWdlOworICAgIENoYXJEYXRhX0luaXQoJnN0b3JhZ2UpOworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZzdG9yYWdlKTsKKyAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfc3RhcnRfY2hlY2tlciwgb3ZlcndyaXRlX2VuZF9jaGVja2VyKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKKyAgICBDaGFyRGF0YV9DaGVja1N0cmluZygmc3RvcmFnZSwgcmVzdWx0KTsKK30KKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzU2NjMzNC4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc190YWduYW1lX292ZXJ3cml0ZSkKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjxuOmUgeG1sbnM6bj0naHR0cDovL3htbC5saWJleHBhdC5vcmcvJz5cbiIKKyAgICAgICAgIiAgPG46ZiBuOmF0dHI9J2ZvbycvPlxuIgorICAgICAgICAiICA8bjpnIG46YXR0cjI9J2JhcicvPlxuIgorICAgICAgICAiPC9uOmU+IjsKKyAgICBjaGFyICpyZXN1bHQgPQorICAgICAgICAic3RhcnQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGVcbiIKKyAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBmXG4iCisgICAgICAgICJhdHRyaWJ1dGUgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGF0dHJcbiIKKyAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZlxuIgorICAgICAgICAic3RhcnQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGdcbiIKKyAgICAgICAgImF0dHJpYnV0ZSBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gYXR0cjJcbiIKKyAgICAgICAgImVuZCBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gZ1xuIgorICAgICAgICAiZW5kIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBlXG4iOworICAgIHJ1bl9uc190YWduYW1lX292ZXJ3cml0ZV90ZXN0KHRleHQsIHJlc3VsdCk7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNTY2MzM0LiAqLworU1RBUlRfVEVTVCh0ZXN0X25zX3RhZ25hbWVfb3ZlcndyaXRlX3RyaXBsZXQpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8bjplIHhtbG5zOm49J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCisgICAgICAgICIgIDxuOmYgbjphdHRyPSdmb28nLz5cbiIKKyAgICAgICAgIiAgPG46ZyBuOmF0dHIyPSdiYXInLz5cbiIKKyAgICAgICAgIjwvbjplPiI7CisgICAgY2hhciAqcmVzdWx0ID0KKyAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBlIG5cbiIKKyAgICAgICAgInN0YXJ0IGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBmIG5cbiIKKyAgICAgICAgImF0dHJpYnV0ZSBodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy8gYXR0ciBuXG4iCisgICAgICAgICJlbmQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGYgblxuIgorICAgICAgICAic3RhcnQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGcgblxuIgorICAgICAgICAiYXR0cmlidXRlIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBhdHRyMiBuXG4iCisgICAgICAgICJlbmQgaHR0cDovL3htbC5saWJleHBhdC5vcmcvIGcgblxuIgorICAgICAgICAiZW5kIGh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBlIG5cbiI7CisgICAgWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIFhNTF9UUlVFKTsKKyAgICBydW5fbnNfdGFnbmFtZV9vdmVyd3JpdGVfdGVzdCh0ZXh0LCByZXN1bHQpOworfQorRU5EX1RFU1QKKworCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjIwMzQzLiAqLworc3RhdGljIHZvaWQgWE1MQ0FMTAorc3RhcnRfZWxlbWVudF9mYWlsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lLCBjb25zdCBYTUxfQ2hhciAqKmF0dHMpCit7CisgICAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworICAgIGZhaWwoInNob3VsZCBuZXZlciByZWFjaCBzdGFydF9lbGVtZW50X2ZhaWwoKSIpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydF9uc19jbGVhcmluZ19zdGFydF9lbGVtZW50KHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKQoreworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKChYTUxfUGFyc2VyKSB1c2VyRGF0YSwgTlVMTCk7Cit9CisKK1NUQVJUX1RFU1QodGVzdF9zdGFydF9uc19jbGVhcnNfc3RhcnRfZWxlbWVudCkKK3sKKyAgICAvKiBUaGlzIG5lZWRzIHRvIHVzZSBzZXBhcmF0ZSBzdGFydC9lbmQgdGFnczsgdXNpbmcgdGhlIGVtcHR5IHRhZworICAgICAgIHN5bnRheCBkb2Vzbid0IGNhdXNlIHRoZSBwcm9ibGVtYXRpYyBwYXRoIHRocm91Z2ggRXhwYXQgdG8gYmUKKyAgICAgICB0YWtlbi4KKyAgICAqLworICAgIGNoYXIgKnRleHQgPSAiPGUgeG1sbnM9J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+PC9lPiI7CisKKyAgICBYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0X2VsZW1lbnRfZmFpbCk7CisgICAgWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIocGFyc2VyLCBzdGFydF9uc19jbGVhcmluZ19zdGFydF9lbGVtZW50KTsKKyAgICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHBhcnNlcik7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjNjE2ODYzLiAqLworc3RhdGljIGludCBYTUxDQUxMCitleHRlcm5hbF9lbnRpdHlfaGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpIAoreworICAgIGxvbmcgY2FsbG5vID0gMSArIChsb25nKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICAgIGNoYXIgKnRleHQ7CisgICAgWE1MX1BhcnNlciBwMjsKKworICAgIGlmIChjYWxsbm8gPT0gMSkKKyAgICAgICAgdGV4dCA9ICgiPCFFTEVNRU5UIGRvYyAoZSspPlxuIgorICAgICAgICAgICAgICAgICI8IUFUVExJU1QgZG9jIHhtbG5zIENEQVRBICNJTVBMSUVEPlxuIgorICAgICAgICAgICAgICAgICI8IUVMRU1FTlQgZSBFTVBUWT5cbiIpOworICAgIGVsc2UKKyAgICAgICAgdGV4dCA9ICgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXMtYXNjaWknPz4iCisgICAgICAgICAgICAgICAgIjxlLz4iKTsKKworICAgIFhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICh2b2lkICopIGNhbGxubyk7CisgICAgcDIgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUocGFyc2VyLCBjb250ZXh0LCBOVUxMKTsKKyAgICBpZiAoWE1MX1BhcnNlKHAyLCB0ZXh0LCBzdHJsZW4odGV4dCksIFhNTF9UUlVFKSA9PSBYTUxfU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIHhtbF9mYWlsdXJlKHAyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFhNTF9QYXJzZXJGcmVlKHAyKTsKKyAgICByZXR1cm4gMTsKK30KKworU1RBUlRfVEVTVCh0ZXN0X2RlZmF1bHRfbnNfZnJvbV9leHRfc3Vic2V0X2FuZF9leHRfZ2UpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnPz5cbiIKKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdodHRwOi8veG1sLmxpYmV4cGF0Lm9yZy9kb2MuZHRkJyBbXG4iCisgICAgICAgICIgIDwhRU5USVRZIGVuIFNZU1RFTSAnaHR0cDovL3htbC5saWJleHBhdC5vcmcvZW50aXR5LmVudCc+XG4iCisgICAgICAgICJdPlxuIgorICAgICAgICAiPGRvYyB4bWxucz0naHR0cDovL3htbC5saWJleHBhdC5vcmcvbnMxJz5cbiIKKyAgICAgICAgIiZlbjtcbiIKKyAgICAgICAgIjwvZG9jPiI7CisKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUyk7CisgICAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsIGV4dGVybmFsX2VudGl0eV9oYW5kbGVyKTsKKyAgICAvKiBXZSBhY3R1YWxseSBuZWVkIHRvIHNldCB0aGlzIGhhbmRsZXIgdG8gdGlja2xlIHRoaXMgYnVnLiAqLworICAgIFhNTF9TZXRTdGFydEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgZHVtbXlfc3RhcnRfZWxlbWVudCk7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgTlVMTCk7CisgICAgaWYgKFhNTF9QYXJzZShwYXJzZXIsIHRleHQsIHN0cmxlbih0ZXh0KSwgWE1MX1RSVUUpID09IFhNTF9TVEFUVVNfRVJST1IpCisgICAgICAgIHhtbF9mYWlsdXJlKHBhcnNlcik7Cit9CitFTkRfVEVTVAorCisvKiBSZWdyZXNzaW9uIHRlc3QgIzEgZm9yIFNGIGJ1ZyAjNjczNzkxLiAqLworU1RBUlRfVEVTVCh0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV8xKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGRvYyB4bWxuczpwcmVmaXg9J2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCisgICAgICAgICIgIDxlIHhtbG5zOnByZWZpeD0nJy8+XG4iCisgICAgICAgICI8L2RvYz4iOworCisgICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKKyAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5ERUNMQVJJTkdfUFJFRklYLAorICAgICAgICAgICAgICAgICAgICJEaWQgbm90IHJlcG9ydCByZS1zZXR0aW5nIG5hbWVzcGFjZSIKKyAgICAgICAgICAgICAgICAgICAiIFVSSSB3aXRoIHByZWZpeCB0byAnJy4iKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCAjMiBmb3IgU0YgYnVnICM2NzM3OTEuICovCitTVEFSVF9URVNUKHRlc3RfbnNfcHJlZml4X3dpdGhfZW1wdHlfdXJpXzIpCit7CisgICAgY2hhciAqdGV4dCA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnPz5cbiIKKyAgICAgICAgIjxkb2NlbGVtIHhtbG5zOnByZT0nJy8+IjsKKworICAgIGV4cGVjdF9mYWlsdXJlKHRleHQsCisgICAgICAgICAgICAgICAgICAgWE1MX0VSUk9SX1VOREVDTEFSSU5HX1BSRUZJWCwKKyAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCByZXBvcnQgc2V0dGluZyBuYW1lc3BhY2UgVVJJIHdpdGggcHJlZml4IHRvICcnLiIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICMzIGZvciBTRiBidWcgIzY3Mzc5MS4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfMykKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgorICAgICAgICAiICA8IUVMRU1FTlQgZG9jIEVNUFRZPlxuIgorICAgICAgICAiICA8IUFUVExJU1QgZG9jXG4iCisgICAgICAgICIgICAgeG1sbnM6cHJlZml4IENEQVRBICcnPlxuIgorICAgICAgICAiXT5cbiIKKyAgICAgICAgIjxkb2MvPiI7CisKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkRFQ0xBUklOR19QUkVGSVgsCisgICAgICAgICAgICAgICAgICAgIkRpZG4ndCByZXBvcnQgYXR0ciBkZWZhdWx0IHNldHRpbmcgTlMgdy8gcHJlZml4IHRvICcnLiIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0ICM0IGZvciBTRiBidWcgIzY3Mzc5MS4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfNCkKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgorICAgICAgICAiICA8IUVMRU1FTlQgcHJlZml4OmRvYyBFTVBUWT5cbiIKKyAgICAgICAgIiAgPCFBVFRMSVNUIHByZWZpeDpkb2NcbiIKKyAgICAgICAgIiAgICB4bWxuczpwcmVmaXggQ0RBVEEgJ2h0dHA6Ly94bWwubGliZXhwYXQub3JnLyc+XG4iCisgICAgICAgICJdPlxuIgorICAgICAgICAiPHByZWZpeDpkb2MvPiI7CisgICAgLyogUGFja2FnZWQgaW5mbyBleHBlY3RlZCBieSB0aGUgZW5kIGVsZW1lbnQgaGFuZGxlcjsKKyAgICAgICB0aGUgd2VpcmQgc3RydWN0dXJpbmcgbGV0cyB1cyByZS11c2UgdGhlIHRyaXBsZXRfZW5kX2NoZWNrZXIoKQorICAgICAgIGZ1bmN0aW9uIGFsc28gdXNlZCBmb3IgYW5vdGhlciB0ZXN0LiAqLworICAgIGNoYXIgKmVsZW1zdHJbXSA9IHsKKyAgICAgICAgImh0dHA6Ly94bWwubGliZXhwYXQub3JnLyBkb2MgcHJlZml4IgorICAgIH07CisgICAgWE1MX1NldFJldHVybk5TVHJpcGxldChwYXJzZXIsIFhNTF9UUlVFKTsKKyAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCBlbGVtc3RyKTsKKyAgICBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIocGFyc2VyLCB0cmlwbGV0X2VuZF9jaGVja2VyKTsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKK1NUQVJUX1RFU1QodGVzdF9uc19kZWZhdWx0X3dpdGhfZW1wdHlfdXJpKQoreworICAgIGNoYXIgKnRleHQgPQorICAgICAgICAiPGRvYyB4bWxucz0naHR0cDovL3htbC5saWJleHBhdC5vcmcvJz5cbiIKKyAgICAgICAgIiAgPGUgeG1sbnM9JycvPlxuIgorICAgICAgICAiPC9kb2M+IjsKKyAgICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgdGV4dCwgc3RybGVuKHRleHQpLCBYTUxfVFJVRSkgPT0gWE1MX1NUQVRVU19FUlJPUikKKyAgICAgICAgeG1sX2ZhaWx1cmUocGFyc2VyKTsKK30KK0VORF9URVNUCisKKy8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM2OTI5NjQ6IHR3byBwcmVmaXhlcyBmb3Igb25lIG5hbWVzcGFjZS4gKi8KK1NUQVJUX1RFU1QodGVzdF9uc19kdXBsaWNhdGVfYXR0cnNfZGlmZl9wcmVmaXhlcykKK3sKKyAgICBjaGFyICp0ZXh0ID0KKyAgICAgICAgIjxkb2MgeG1sbnM6YT0naHR0cDovL3htbC5saWJleHBhdC5vcmcvYSdcbiIKKyAgICAgICAgIiAgICAgeG1sbnM6Yj0naHR0cDovL3htbC5saWJleHBhdC5vcmcvYSdcbiIKKyAgICAgICAgIiAgICAgYTphPSd2JyBiOmE9J3YnIC8+IjsKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9EVVBMSUNBVEVfQVRUUklCVVRFLAorICAgICAgICAgICAgICAgICAgICJkaWQgbm90IHJlcG9ydCBtdWx0aXBsZSBhdHRyaWJ1dGVzIHdpdGggc2FtZSBVUkkrbmFtZSIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzY5NTQwMTogdW5ib3VuZCBwcmVmaXguICovCitTVEFSVF9URVNUKHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fYXR0cmlidXRlKQoreworICAgIGNoYXIgKnRleHQgPSAiPGRvYyBhOmF0dHI9JycvPiI7CisgICAgZXhwZWN0X2ZhaWx1cmUodGV4dCwKKyAgICAgICAgICAgICAgICAgICBYTUxfRVJST1JfVU5CT1VORF9QUkVGSVgsCisgICAgICAgICAgICAgICAgICAgImRpZCBub3QgcmVwb3J0IHVuYm91bmQgcHJlZml4IG9uIGF0dHJpYnV0ZSIpOworfQorRU5EX1RFU1QKKworLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzY5NTQwMTogdW5ib3VuZCBwcmVmaXguICovCitTVEFSVF9URVNUKHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fZWxlbWVudCkKK3sKKyAgICBjaGFyICp0ZXh0ID0gIjxhOmRvYy8+IjsKKyAgICBleHBlY3RfZmFpbHVyZSh0ZXh0LAorICAgICAgICAgICAgICAgICAgIFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWCwKKyAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCByZXBvcnQgdW5ib3VuZCBwcmVmaXggb24gZWxlbWVudCIpOworfQorRU5EX1RFU1QKKworc3RhdGljIFN1aXRlICoKK21ha2Vfc3VpdGUodm9pZCkKK3sKKyAgICBTdWl0ZSAqcyA9IHN1aXRlX2NyZWF0ZSgiYmFzaWMiKTsKKyAgICBUQ2FzZSAqdGNfYmFzaWMgPSB0Y2FzZV9jcmVhdGUoImJhc2ljIHRlc3RzIik7CisgICAgVENhc2UgKnRjX25hbWVzcGFjZSA9IHRjYXNlX2NyZWF0ZSgiWE1MIG5hbWVzcGFjZXMiKTsKKworICAgIHN1aXRlX2FkZF90Y2FzZShzLCB0Y19iYXNpYyk7CisgICAgdGNhc2VfYWRkX2NoZWNrZWRfZml4dHVyZSh0Y19iYXNpYywgYmFzaWNfc2V0dXAsIGJhc2ljX3RlYXJkb3duKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9udWxfYnl0ZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfdTAwMDBfY2hhcik7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYm9tX3V0ZjgpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2JvbV91dGYxNl9iZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYm9tX3V0ZjE2X2xlKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9pbGxlZ2FsX3V0ZjgpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3V0ZjE2KTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF91dGYxNl9sZV9lcGlsb2dfbmV3bGluZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfbGF0aW4xX3VtbGF1dHMpOworICAgIC8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0OTE5ODYuICovCisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZGFuaXNoX2xhdGluMSk7CisgICAgLyogUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzUxNDI4MS4gKi8KKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9mcmVuY2hfY2hhcnJlZl9oZXhpZGVjaW1hbCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZnJlbmNoX2NoYXJyZWZfZGVjaW1hbCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZnJlbmNoX2xhdGluMSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZnJlbmNoX3V0ZjgpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3V0ZjhfZmFsc2VfcmVqZWN0aW9uKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9saW5lX251bWJlcl9hZnRlcl9wYXJzZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfY29sdW1uX251bWJlcl9hZnRlcl9wYXJzZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfbGluZV9hbmRfY29sdW1uX251bWJlcnNfaW5zaWRlX2hhbmRsZXJzKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9saW5lX251bWJlcl9hZnRlcl9lcnJvcik7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfY29sdW1uX251bWJlcl9hZnRlcl9lcnJvcik7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfcmVhbGx5X2xvbmdfbGluZXMpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2VuZF9lbGVtZW50X2V2ZW50cyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfYXR0cl93aGl0ZXNwYWNlX25vcm1hbGl6YXRpb24pOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3htbGRlY2xfbWlzcGxhY2VkKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF91bmtub3duX2VuY29kaW5nX2ludGVybmFsX2VudGl0eSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsCisgICAgICAgICAgICAgICAgICAgdGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfdW5yZWFkX2V4dGVybmFsX3N1YnNldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X25vX2V4dGVybmFsX3N1YnNldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfd2ZjX3VuZGVjbGFyZWRfZW50aXR5X3N0YW5kYWxvbmUpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3dmY191bmRlY2xhcmVkX2VudGl0eV93aXRoX2V4dGVybmFsX3N1YnNldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsCisgICAgICAgICAgICAgICAgICAgdGVzdF93ZmNfdW5kZWNsYXJlZF9lbnRpdHlfd2l0aF9leHRlcm5hbF9zdWJzZXRfc3RhbmRhbG9uZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfd2ZjX25vX3JlY3Vyc2l2ZV9lbnRpdHlfcmVmcyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3RfZXh0X2VudGl0eV9zZXRfZW5jb2RpbmcpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X2R0ZF9kZWZhdWx0X2hhbmRsaW5nKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19iYXNpYywgdGVzdF9lbXB0eV9uc193aXRob3V0X25hbWVzcGFjZXMpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X25zX2luX2F0dHJpYnV0ZV9kZWZhdWx0X3dpdGhvdXRfbmFtZXNwYWNlcyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfYmFzaWMsIHRlc3Rfc3RvcF9wYXJzZXJfYmV0d2Vlbl9jaGFyX2RhdGFfY2FsbHMpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX2Jhc2ljLCB0ZXN0X3N1c3BlbmRfcGFyc2VyX2JldHdlZW5fY2hhcl9kYXRhX2NhbGxzKTsKKworICAgIHN1aXRlX2FkZF90Y2FzZShzLCB0Y19uYW1lc3BhY2UpOworICAgIHRjYXNlX2FkZF9jaGVja2VkX2ZpeHR1cmUodGNfbmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3NldHVwLCBuYW1lc3BhY2VfdGVhcmRvd24pOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9yZXR1cm5fbnNfdHJpcGxldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3RhZ25hbWVfb3ZlcndyaXRlKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdGFnbmFtZV9vdmVyd3JpdGVfdHJpcGxldCk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X3N0YXJ0X25zX2NsZWFyc19zdGFydF9lbGVtZW50KTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfZGVmYXVsdF9uc19mcm9tX2V4dF9zdWJzZXRfYW5kX2V4dF9nZSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV8xKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfcHJlZml4X3dpdGhfZW1wdHlfdXJpXzIpOworICAgIHRjYXNlX2FkZF90ZXN0KHRjX25hbWVzcGFjZSwgdGVzdF9uc19wcmVmaXhfd2l0aF9lbXB0eV91cmlfMyk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX3ByZWZpeF93aXRoX2VtcHR5X3VyaV80KTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfZGVmYXVsdF93aXRoX2VtcHR5X3VyaSk7CisgICAgdGNhc2VfYWRkX3Rlc3QodGNfbmFtZXNwYWNlLCB0ZXN0X25zX2R1cGxpY2F0ZV9hdHRyc19kaWZmX3ByZWZpeGVzKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fYXR0cmlidXRlKTsKKyAgICB0Y2FzZV9hZGRfdGVzdCh0Y19uYW1lc3BhY2UsIHRlc3RfbnNfdW5ib3VuZF9wcmVmaXhfb25fZWxlbWVudCk7CisKKyAgICByZXR1cm4gczsKK30KKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgaSwgbmY7CisgICAgaW50IHZlcmJvc2l0eSA9IENLX05PUk1BTDsKKyAgICBTdWl0ZSAqcyA9IG1ha2Vfc3VpdGUoKTsKKyAgICBTUnVubmVyICpzciA9IHNydW5uZXJfY3JlYXRlKHMpOworCisgICAgLyogcnVuIHRoZSB0ZXN0cyBmb3IgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyAqLworICAgIHRlc3RoZWxwZXJfaXNfd2hpdGVzcGFjZV9ub3JtYWxpemVkKCk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgICAgIGNoYXIgKm9wdCA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChzdHJjbXAob3B0LCAiLXYiKSA9PSAwIHx8IHN0cmNtcChvcHQsICItLXZlcmJvc2UiKSA9PSAwKQorICAgICAgICAgICAgdmVyYm9zaXR5ID0gQ0tfVkVSQk9TRTsKKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKG9wdCwgIi1xIikgPT0gMCB8fCBzdHJjbXAob3B0LCAiLS1xdWlldCIpID09IDApCisgICAgICAgICAgICB2ZXJib3NpdHkgPSBDS19TSUxFTlQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJydW50ZXN0czogdW5rbm93biBvcHRpb24gJyVzJ1xuIiwgb3B0KTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgfQorICAgIGlmICh2ZXJib3NpdHkgIT0gQ0tfU0lMRU5UKQorICAgICAgICBwcmludGYoIkV4cGF0IHZlcnNpb246ICVzXG4iLCBYTUxfRXhwYXRWZXJzaW9uKCkpOworICAgIHNydW5uZXJfcnVuX2FsbChzciwgdmVyYm9zaXR5KTsKKyAgICBuZiA9IHNydW5uZXJfbnRlc3RzX2ZhaWxlZChzcik7CisgICAgc3J1bm5lcl9mcmVlKHNyKTsKKworICAgIHJldHVybiAobmYgPT0gMCkgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS90ZXN0cy9ydW50ZXN0c3BwLmNwcCBiL2V4cGF0LTIuMC4xL3Rlc3RzL3J1bnRlc3RzcHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzNWRjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS90ZXN0cy9ydW50ZXN0c3BwLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIEMrKyBjb21waWxhdGlvbiBoYXJuZXNzIGZvciB0aGUgdGVzdCBzdWl0ZS4KKy8vCisvLyBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSBFeHBhdCBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZCBmcm9tIEMrKworLy8gYW5kIGhhdmUgZXZlcnl0aGluZyB3b3JrIGFzIGV4cGVjdGVkLgorLy8KKyNpbmNsdWRlICJydW50ZXN0cy5jIgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdGVzdHMveG1sdGVzdC5zaCBiL2V4cGF0LTIuMC4xL3Rlc3RzL3htbHRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzI1NDQxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Rlc3RzL3htbHRlc3Quc2gKQEAgLTAsMCArMSwxNDEgQEAKKyMhIC9iaW4vc2gKKworIyAgIEVYUEFUIFRFU1QgU0NSSVBUIEZPUiBXM0MgWE1MIFRFU1QgU1VJVEUKKworIyBUaGlzIHNjcmlwdCBjYW4gYmUgdXNlZCB0byBleGVyY2lzZSBFeHBhdCBhZ2FpbnN0IHRoZQorIyB3M2Mub3JnIHhtbCB0ZXN0IHN1aXRlLCBhdmFpbGFibGUgZnJvbQorIyBodHRwOi8vd3d3LnczLm9yZy9YTUwvVGVzdC94bWx0czIwMDIwNjA2LnppcC4KKworIyBUbyBydW4gdGhpcyBzY3JpcHQsIGZpcnN0IHNldCBYTUxXRiBzbyB0aGF0IHhtbHdmIGNhbiBiZQorIyBmb3VuZCwgdGhlbiBzZXQgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2l0aCBPVVRQVVQuCisKKyMgVGhlIHNjcmlwdCBsaXN0cyBhbGwgdGVzdCBjYXNlcyB3aGVyZSBFeHBhdCBzaG93cyBhIGRpc2NyZXBhbmN5CisjIGZyb20gdGhlIGV4cGVjdGVkIHJlc3VsdC4gVGVzdCBjYXNlcyB3aGVyZSBvbmx5IHRoZSBjYW5vbmljYWwKKyMgb3V0cHV0IGRpZmZlcnMgYXJlIHByZWZpeGVkIHdpdGggIk91dHB1dCBkaWZmZXJzOiIsIGFuZCBhIGRpZmYgZmlsZQorIyBpcyBnZW5lcmF0ZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHN1YmRpcmVjdG9yeSB1bmRlciAkT1VUUFVULgorCisjIElmIHRoZXJlIGFyZSBvdXRwdXQgZmlsZXMgcHJvdmlkZWQsIHRoZSBzY3JpcHQgd2lsbCB1c2UKKyMgb3V0cHV0IGZyb20geG1sd2YgYW5kIGNvbXBhcmUgdGhlIGRlc2lyZWQgb3V0cHV0IGFnYWluc3QgaXQuCisjIEhvd2V2ZXIsIG9uZSBoYXMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgY2Fub25pY2FsIG91dHB1dAorIyBwcm9kdWNlZCBieSB4bWx3ZiBjb25mb3JtcyB0byBhbiBvbGRlciBkZWZpbml0aW9uIG9mIGNhbm9uaWNhbCBYTUwKKyMgYW5kIGRvZXMgbm90IGdlbmVyYXRlIG5vdGF0aW9uIGRlY2xhcmF0aW9ucy4KKworTVlESVI9ImBkaXJuYW1lIFwiJDBcImAiCitjZCAiJE1ZRElSIgorTVlESVI9ImBwd2RgIgorWE1MV0Y9ImBkaXJuYW1lIFwiJE1ZRElSXCJgL3htbHdmL3htbHdmIgorIyBYTUxXRj0vdXNyL2xvY2FsL2Jpbi94bWx3ZgorVFM9IiRNWURJUi9YTUwtVGVzdC1TdWl0ZSIKKyMgT1VUUFVUIG11c3QgdGVybWluYXRlIHdpdGggdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IuCitPVVRQVVQ9IiRUUy9vdXQvIgorIyBPVVRQVVQ9L2hvbWUvdG1wL3htbC10ZXN0c3VpdGUtb3V0LworCisKKyMgUnVuWG1sd2ZOb3RXRiBmaWxlIHJlbGRpcgorIyByZWxkaXIgaW5jbHVkZXMgdHJhaWxpbmcgc2xhc2gKK1J1blhtbHdmTm90V0YoKSB7CisgIGZpbGU9IiQxIgorICByZWxkaXI9IiQyIgorICAkWE1MV0YgLXAgIiRmaWxlIiA+IG91dGZpbGUgfHwgcmV0dXJuICQ/CisgIHJlYWQgb3V0ZGF0YSA8IG91dGZpbGUKKyAgaWYgdGVzdCAiJG91dGRhdGEiID0gIiIgOyB0aGVuCisgICAgICBlY2hvICJFeHBlY3RlZCB3ZWxsLWZvcm1lZDogJHJlbGRpciRmaWxlIgorICAgICAgcmV0dXJuIDEKKyAgZWxzZQorICAgICAgcmV0dXJuIDAKKyAgZmkgCit9CisKKyMgUnVuWG1sd2ZXRiBmaWxlIHJlbGRpcgorIyByZWxkaXIgaW5jbHVkZXMgdHJhaWxpbmcgc2xhc2gKK1J1blhtbHdmV0YoKSB7CisgIGZpbGU9IiQxIgorICByZWxkaXI9IiQyIgorICAkWE1MV0YgLXAgLWQgIiRPVVRQVVQkcmVsZGlyIiAiJGZpbGUiID4gb3V0ZmlsZSB8fCByZXR1cm4gJD8KKyAgcmVhZCBvdXRkYXRhIDwgb3V0ZmlsZSAKKyAgaWYgdGVzdCAiJG91dGRhdGEiID0gIiIgOyB0aGVuIAorICAgICAgaWYgWyAtZiAib3V0LyRmaWxlIiBdIDsgdGhlbiAKKyAgICAgICAgICBkaWZmICIkT1VUUFVUJHJlbGRpciRmaWxlIiAib3V0LyRmaWxlIiA+IG91dGZpbGUgCisgICAgICAgICAgaWYgWyAtcyBvdXRmaWxlIF0gOyB0aGVuIAorICAgICAgICAgICAgICBjcCBvdXRmaWxlICIkT1VUUFVUJHJlbGRpciRmaWxlLmRpZmYiCisgICAgICAgICAgICAgIGVjaG8gIk91dHB1dCBkaWZmZXJzOiAkcmVsZGlyJGZpbGUiCisgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgZmkgCisgICAgICBmaSAKKyAgICAgIHJldHVybiAwCisgIGVsc2UgCisgICAgICBlY2hvICJJbiAkcmVsZGlyOiAkb3V0ZGF0YSIKKyAgICAgIHJldHVybiAxCisgIGZpIAorfQorCitTVUNDRVNTPTAKK0VSUk9SPTAKKworVXBkYXRlU3RhdHVzKCkgeworICBpZiBbICIkMSIgLWVxIDAgXSA7IHRoZW4KKyAgICBTVUNDRVNTPWBleHByICRTVUNDRVNTICsgMWAKKyAgZWxzZQorICAgIEVSUk9SPWBleHByICRFUlJPUiArIDFgCisgIGZpCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHdlbGwtZm9ybWVkIHRlc3QgY2FzZXMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2QgIiRUUy94bWxjb25mIgorZm9yIHhtbGRpciBpbiBpYm0vdmFsaWQvUCogXAorICAgICAgICAgICAgICBpYm0vaW52YWxpZC9QKiBcCisgICAgICAgICAgICAgIHhtbHRlc3QvdmFsaWQvZXh0LXNhIFwKKyAgICAgICAgICAgICAgeG1sdGVzdC92YWxpZC9ub3Qtc2EgXAorICAgICAgICAgICAgICB4bWx0ZXN0L2ludmFsaWQgXAorICAgICAgICAgICAgICB4bWx0ZXN0L2ludmFsaWQvbm90LXNhIFwKKyAgICAgICAgICAgICAgeG1sdGVzdC92YWxpZC9zYSBcCisgICAgICAgICAgICAgIHN1bi92YWxpZCBcCisgICAgICAgICAgICAgIHN1bi9pbnZhbGlkIDsgZG8KKyAgY2QgIiRUUy94bWxjb25mLyR4bWxkaXIiCisgIG1rZGlyIC1wICIkT1VUUFVUJHhtbGRpciIKKyAgZm9yIHhtbGZpbGUgaW4gKi54bWwgOyBkbworICAgICAgUnVuWG1sd2ZXRiAiJHhtbGZpbGUiICIkeG1sZGlyLyIKKyAgICAgIFVwZGF0ZVN0YXR1cyAkPworICBkb25lCisgIHJtIG91dGZpbGUKK2RvbmUKKworY2QgIiRUUy94bWxjb25mL29hc2lzIgorbWtkaXIgLXAgIiRPVVRQVVQib2FzaXMKK2ZvciB4bWxmaWxlIGluICpwYXNzKi54bWwgOyBkbworICAgIFJ1blhtbHdmV0YgIiR4bWxmaWxlIiAib2FzaXMvIgorICAgIFVwZGF0ZVN0YXR1cyAkPworZG9uZQorcm0gb3V0ZmlsZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbm90IHdlbGwtZm9ybWVkIHRlc3QgY2FzZXMgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NkICIkVFMveG1sY29uZiIKK2ZvciB4bWxkaXIgaW4gaWJtL25vdC13Zi9QKiBcCisgICAgICAgICAgICAgIGlibS9ub3Qtd2YvbWlzYyBcCisgICAgICAgICAgICAgIHhtbHRlc3Qvbm90LXdmL2V4dC1zYSBcCisgICAgICAgICAgICAgIHhtbHRlc3Qvbm90LXdmL25vdC1zYSBcCisgICAgICAgICAgICAgIHhtbHRlc3Qvbm90LXdmL3NhIFwKKyAgICAgICAgICAgICAgc3VuL25vdC13ZiA7IGRvCisgIGNkICIkVFMveG1sY29uZi8keG1sZGlyIgorICBmb3IgeG1sZmlsZSBpbiAqLnhtbCA7IGRvCisgICAgICBSdW5YbWx3Zk5vdFdGICIkeG1sZmlsZSIgIiR4bWxkaXIvIgorICAgICAgVXBkYXRlU3RhdHVzICQ/CisgIGRvbmUKKyAgcm0gb3V0ZmlsZQorZG9uZQorCitjZCAiJFRTL3htbGNvbmYvb2FzaXMiCitmb3IgeG1sZmlsZSBpbiAqZmFpbCoueG1sIDsgZG8KKyAgICBSdW5YbWx3Zk5vdFdGICIkeG1sZmlsZSIgIm9hc2lzLyIKKyAgICBVcGRhdGVTdGF0dXMgJD8KK2RvbmUKK3JtIG91dGZpbGUKKworZWNobyAiUGFzc2VkOiAkU1VDQ0VTUyIKK2VjaG8gIkZhaWxlZDogJEVSUk9SIgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvdm1zL1JFQURNRS52bXMgYi9leHBhdC0yLjAuMS92bXMvUkVBRE1FLnZtcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZGQyY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdm1zL1JFQURNRS52bXMKQEAgLTAsMCArMSwyMyBAQAorNC1qdW4tMjAwMglDcmFpZyBBLiBCZXJyeQorCQlBZGRlZCBydWRpbWVudGFyeSBidWlsZCBwcm9jZWR1cmVzIGZvciAKKwkJT3BlblZNUyBiYXNlZCBvbiB3b3JrIGJ5IE1hcnRpbiBWb3JsYWVuZGVyLgorCisKK1lvdSdsbCBuZWVkIE1NUyBvciBpdHMgZnJlZXdhcmUgZXF1aXZhbGVudCBNTUsuICBKdXN0IGdvIHRvIHRoZSAKK3RvcC1sZXZlbCBkaXJlY3RvcnkgYW5kIHR5cGUKKworJCBNTVMvREVTQ1JJUFRJT049Wy52bXNdCisgCisgIG9yCisKKyQgTU1LL0RFU0NSSVBUSU9OPVsudm1zXQorCitZb3UnbGwgZW5kIHVwIHdpdGggdGhlIG9iamVjdCBsaWJyYXJ5IGV4cGF0Lm9sYi4gIEZvciBub3csIGluc3RhbGxhdGlvbgorY29uc2lzdHMgbWVyZWx5IG9mIGNvcHlpbmcgdGhlIG9iamVjdCBsaWJyYXJ5LCBpbmNsdWRlIGZpbGVzLCBhbmQKK2RvY3VtZW50YXRpb24gdG8gYSBzdWl0YWJsZSBsb2NhdGlvbi4gIAorCitUby1kbyBsaXN0OgorCisJLS0gY3JlYXRlIGEgc2hhcmVhYmxlIGltYWdlCisJLS0gYnVpbGQgYW5kIHJ1biB0aGUgdGVzdHMgYW5kIGJ1aWxkIHRoZSB4bWx3ZiB1dGlsaXR5CisJLS0gY3JlYXRlIGFuIGluc3RhbGwgdGFyZ2V0CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS92bXMvZGVzY3JpcC5tbXMgYi9leHBhdC0yLjAuMS92bXMvZGVzY3JpcC5tbXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDllZTNkOQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3Ztcy9kZXNjcmlwLm1tcwpAQCAtMCwwICsxLDcwIEBACisjIEJhcmUgYm9uZXMgZGVzY3JpcHRpb24gZmlsZSAoTWFrZWZpbGUpIGZvciBPcGVuVk1TCisKK1BBQ0tBR0UgPSBleHBhdAorVkVSU0lPTiA9IDEuOTUuOAorRVhQQVRfTUFKT1JfVkVSU0lPTj0xCitFWFBBVF9NSU5PUl9WRVJTSU9OPTk1CitFWFBBVF9FRElUPTgKKworTyA9IC5vYmoKK09MQiA9IC5vbGIKKyAKK0xJQlJBUlkgPSBleHBhdCQoT0xCKQorTElCRElSID0gWy5saWJdCitTT1VSQ0VTID0gJChMSUJESVIpeG1scGFyc2UuYyAkKExJQkRJUil4bWx0b2suYyAkKExJQkRJUil4bWxyb2xlLmMKK09CSkVDVFMgPSB4bWxwYXJzZSQoTykgeG1sdG9rJChPKSB4bWxyb2xlJChPKQorIAorVEVNUExBVEVTID0geG1sdG9rX2ltcGwuYyB4bWx0b2tfbnMuYworQVBJSEVBREVSID0gJChMSUJESVIpZXhwYXQuaAorSEVBREVSUyA9ICQoTElCRElSKWFzY2lpLmggJChMSUJESVIpaWFzY2lpdGFiLmggJChMSUJESVIpdXRmOHRhYi5oICQoTElCRElSKXhtbHRvay5oIFwKKwkkKExJQkRJUilhc2NpaXRhYi5oICQoTElCRElSKWxhdGluMXRhYi5oIFwKKwkkKExJQkRJUiluYW1ldGFiLmggJChMSUJESVIpeG1sZGVmLmggJChMSUJESVIpeG1scm9sZS5oICQoTElCRElSKXhtbHRva19pbXBsLmgKKyAKK0NPTkZJR19IRUFERVIgPSBleHBhdF9jb25maWcuaAorSU5DTFVERVMgPSAvSU5DTFVERT0oW10sWy5saWJdKQorREVGUyA9IC9ERUZJTkU9KFBBQ0tBR0U9IiIiJChQQUNLQUdFKSIiIixWRVJTSU9OPSIiIiQoUEFDS0FHRSlfJChWRVJTSU9OKSIiIixIQVZFX0VYUEFUX0NPTkZJR19IKQorTElCUkVWSVNJT04gPSAwCitMSUJDVVJSRU5UICA9IDEKK0xJQkFHRSAgICAgID0gMAorIyAKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKQorIyAKKyMgRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKFRFTVBMQVRFUykgJChBUElIRUFERVIpICQoSEVBREVSUykgCisjIAorIyBUQVIgPSBndGFyCisjIEdaSVBfRU5WID0gLS1iZXN0CisjIAorLkZJUlNUIDoKKyAgICAgICBJRiBGJFNFQVJDSCgiJChMSUJSQVJZKSIpIC5FUVMuICIiIFRIRU4gJChMSUJSKSAvQ1JFQVRFIC9PQkpFQ1QgJChMSUJSQVJZKQorCithbGwgOiAkKExJQlJBUlkpCisgICAgICAgIEAgd3JpdGUgc3lzJG91dHB1dCAiQWxsIG1hZGUuIgorIAorLlNVRkZJWEVTIDogCisuU1VGRklYRVMgOiAkKE9MQikgJChPKSAuQyAuSCAgCisgCisuYyQoTykgOgorICAgICAgICQoQ09NUElMRSkgJChNTVMkU09VUkNFKQorIAorJChPKSQoT0xCKSA6CisgICAgICAgIEAgSUYgRiRTRUFSQ0goIiQoTU1TJFRBUkdFVCkiKSAuRVFTLiAiIiAtCisgICAgICAgICAgICAgICAgVEhFTiBMSUJSQVJZL0NSRUFURS9MT0cgJChNTVMkVEFSR0VUKQorICAgICAgICBAIExJQlJBUlkgL1JFUExBQ0UgL0xPRyAkKE1NUyRUQVJHRVQpICQoTU1TJFNPVVJDRSkKKyAKK2NsZWFuIDoKKyAgICAgICBERUxFVEUgJChMSUJSQVJZKTsqLCokKE8pOyoKKyAKKyQoTElCUkFSWSkgOiAkKExJQlJBUlkpKCAkKE9CSkVDVFMpICkgCisgICAgICAgJChMSUJSKSAvQ09NUFJFU1MgJChNTVMkVEFSR0VUKQorCiskKENPTkZJR19IRUFERVIpIDogWy52bXNdZXhwYXRfY29uZmlnLmgKKyAgICAgICAgQ09QWS9MT0cgJChNTVMkU09VUkNFKSAkKE1NUyRUQVJHRVQpCisKK3htbHBhcnNlJChPKSA6ICQoTElCRElSKXhtbHBhcnNlLmMgJChMSUJESVIpZXhwYXQuaCAkKExJQkRJUil4bWxyb2xlLmggJChMSUJESVIpeG1sdG9rLmggJChDT05GSUdfSEVBREVSKQorIAoreG1scm9sZSQoTykgOiAkKExJQkRJUil4bWxyb2xlLmMgJChMSUJESVIpYXNjaWkuaCAkKExJQkRJUil4bWxyb2xlLmggJChDT05GSUdfSEVBREVSKQorIAoreG1sdG9rJChPKSA6ICQoTElCRElSKXhtbHRvay5jICQoTElCRElSKXhtbHRva19pbXBsLmMgJChMSUJESVIpeG1sdG9rX25zLmMgXAorICAgICAgICAkKExJQkRJUilhc2NpaS5oICQoTElCRElSKWFzY2lpdGFiLmggJChMSUJESVIpaWFzY2lpdGFiLmggJChMSUJESVIpbGF0aW4xdGFiLmggXAorCSQoTElCRElSKW5hbWV0YWIuaCAkKExJQkRJUil1dGY4dGFiLmggJChMSUJESVIpeG1sdG9rLmggJChMSUJESVIpeG1sdG9rX2ltcGwuaCAkKENPTkZJR19IRUFERVIpCisKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3Ztcy9leHBhdF9jb25maWcuaCBiL2V4cGF0LTIuMC4xL3Ztcy9leHBhdF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWRiODllCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvdm1zL2V4cGF0X2NvbmZpZy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIENvcHlyaWdodCAyMDAwLCBDbGFyayBDb29wZXIKKyAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSwgb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE1JVC9YIGxpY2Vuc2UgKGNvbnRhaW5lZCBpbiB0aGUgQ09QWUlORyBmaWxlCisgICB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uLikKKyovCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNvcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQkNPUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKyNkZWZpbmUgWE1MX05TCisjZGVmaW5lIFhNTF9EVEQKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBYTUxfQllURV9PUkRFUiAyMQorI2Vsc2UKKyNkZWZpbmUgWE1MX0JZVEVfT1JERVIgMTIKKyNlbmRpZgorCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKKworI2lmbmRlZiBIQVZFX01FTU1PVkUKKyNpZmRlZiBIQVZFX0JDT1BZCisjZGVmaW5lIG1lbW1vdmUoZCxzLGwpIGJjb3B5KChzKSwoZCksKGwpKQorI2Vsc2UKKyNkZWZpbmUgbWVtbW92ZShkLHMsbCkgO3B1bnRpbmcgb24gbWVtbW92ZTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3dpbjMyL01BTklGRVNULnR4dCBiL2V4cGF0LTIuMC4xL3dpbjMyL01BTklGRVNULnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iN2NkMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvd2luMzIvTUFOSUZFU1QudHh0CkBAIC0wLDAgKzEsMjcgQEAKKyAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3IG9mIHRoZSBFeHBhdCBkaXN0cmlidXRpb24KKworVGhlIEV4cGF0IGRpc3RyaWJ1dGlvbiBjcmVhdGVzIHNldmVyYWwgc3ViZGlyZWN0b3JpZXMgb24geW91ciBzeXN0ZW0uCitTb21lIG9mIHRoZXNlIGRpcmVjdG9yaWVzIGNvbnRhaW4gY29tcG9uZW50cyBvZiBpbnRlcmVzdCB0byBhbGwgRXhwYXQKK3VzZXJzLCBhbmQgc29tZSBjb250YWluIG1hdGVyaWFsIG9mIGludGVyZXN0IHRvIGRldmVsb3BlcnMgd2hvIHdpc2ggdG8KK3VzZSBFeHBhdCBpbiB0aGVpciBhcHBsaWNhdGlvbnMuICBJbiB0aGUgbGlzdCBiZWxvdywgPHRvcD4gaXMgdGhlCitkaXJlY3RvcnkgeW91IHNwZWNpZmllZCB0byB0aGUgaW5zdGFsbGVyLgorCisgIERpcmVjdG9yeSAgICAgICAgICAgQ29udGVudHMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDx0b3A+XCAgICAgICAgICAgICAgU29tZSBnZW5lcmFsIGluZm9ybWF0aW9uIGZpbGVzLgorCisgIDx0b3A+XERvY1wgICAgICAgICAgQVBJIGRvY3VtZW50YXRpb24gZm9yIGRldmVsb3BlcnMuCisKKyAgPHRvcD5cQmluXCAgICAgICAgICBQcmUtY29tcGlsZWQgZHluYW1pYyBsaWJyYXJpZXMgZm9yIGRldmVsb3BlcnMuCisgICAgICAgICAgICAgICAgICAgICAgUHJlLWNvbXBpbGVkIHN0YXRpYyBsaWJyYXJpZXMgZm9yIGRldmVsb3BlcnMgKCpNVC5saWIpLgorICAgICAgICAgICAgICAgICAgICAgIFRoZSBYTUwgd2VsbC1mb3JtZWRuZXNzIGNoZWNrZXIgeG1sd2YuCisKKyAgPHRvcD5cU291cmNlXCAgICAgICBTb3VyY2UgY29kZSwgd2hpY2ggbWF5IGludGVyZXN0IHNvbWUgZGV2ZWxvcGVycywKKyAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgYSB3b3Jrc3BhY2UgZm9yIE1pY3Jvc2Z0IFZpc3VhbCBDKysuCisgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvdXJjZSBjb2RlIGluY2x1ZGVzIHRoZSBwYXJzZXIsIHRoZSB3ZWxsLQorICAgICAgICAgICAgICAgICAgICAgIGZvcm1lZG5lc3MgY2hlY2tlciwgYW5kIGEgY291cGxlIG9mIHNtYWxsIHNhbXBsZQorICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4KKworICA8dG9wPlxTb3VyY2VcYmNiNVwgIFByb2plY3QgZmlsZXMgZm9yIEJvcmxhbmQgQysrIEJ1aWxkZXIgNSBhbmQgQkNDIDUuNS4KKworCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS93aW4zMi9SRUFETUUudHh0IGIvZXhwYXQtMi4wLjEvd2luMzIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43N2E5NGJjCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEvd2luMzIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDgwIEBACisKK0V4cGF0IGNhbiBiZSBidWlsdCBvbiBXaW5kb3dzIGluIHRocmVlIHdheXM6IAorICB1c2luZyBNUyBWaXN1YWwgQysrICg2LjAgb3IgLk5FVCksIEJvcmxhbmQgQysrIEJ1aWxkZXIgNSBvciBDeWd3aW4uCisKKyogQ3lnd2luOgorICBUaGlzIGZvbGxvd3MgdGhlIFVuaXggYnVpbGQgcHJvY2VkdXJlcy4KKworKiBDKysgQnVpbGRlciA1OgorICBQb3NzaWJsZSB3aXRoIG1ha2UgZmlsZXMgaW4gdGhlIEJDQjUgc3ViZGlyZWN0b3J5LgorICBEZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUmVhZE1lIGZpbGUgbG9jYXRlZCB0aGVyZS4KKworKiBNUyBWaXN1YWwgQysrIDY6CisgIEJhc2VkIG9uIHRoZSB3b3Jrc3BhY2UgZmlsZSBleHBhdC5kc3cuIFRoZSByZWxhdGVkIHByb2plY3QKKyAgZmlsZXMgKC5kc3ApIGFyZSBsb2NhdGVkIGluIHRoZSBsaWIgc3ViZGlyZWN0b3J5LgorCisqIE1TIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAyLCAyMDAzLCAyMDA1OgorICBUaGUgVkMrKyA2IHdvcmtzcGFjZSBmaWxlIChleHBhdC5kc3cpIGFuZCBwcm9qZWN0IGZpbGVzICguZHNwKQorICBjYW4gYmUgb3BlbmVkIGFuZCBpbXBvcnRlZCBpbiBWUy5ORVQgd2l0aG91dCBwcm9ibGVtcy4KKworKiBBbGwgTVMgQy9DKysgY29tcGlsZXJzOgorICBUaGUgb3V0cHV0IGZvciBhbGwgcHJvamVjdHMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdpbjMyXGJpbgorICBkaXJlY3RvcnksIGludGVybWVkaWF0ZSBmaWxlcyB3aWxsIGJlIGxvY2F0ZWQgaW4gcHJvamVjdC1zcGVjaWZpYworICBzdWJkaXJlY3RvcmllcyBvZiB3aW4zMlx0bXAuCisgIAorKiBDcmVhdGluZyBNaW5HVyBkeW5hbWljIGxpYnJhcmllcyBmcm9tIE1TIFZDKysgRExMczoKKyAgCisgIE9uIHRoZSBjb21tYW5kIGxpbmUsIGV4ZWN1dGUgdGhlc2Ugc3RlcHM6CisgIHBleHBvcnRzIGxpYmV4cGF0LmRsbCA+IGV4cGF0LmRlZgorICBwZXhwb3J0cyBsaWJleHBhdHcuZGxsID4gZXhwYXR3LmRlZgorICBkbGx0b29sIC1kIGV4cGF0LmRlZiAtbCBsaWJleHBhdC5hCisgIGRsbHRvb2wgLWQgZXhwYXR3LmRlZiAtbCBsaWJleHBhdHcuYQorICAKKyAgVGhlICouYSBmaWxlcyBhcmUgbWluZ3cgbGlicmFyaWVzLgorCisqIFNwZWNpYWwgbm90ZSBhYm91dCBNUyBWQysrIGFuZCBydW50aW1lIGxpYnJhcmllczoKKworICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY29uZmlndXJhdGlvbnM6IHVzaW5nIHRoZQorICBzaW5nbGUgdGhyZWFkZWQgb3IgbXVsdGl0aHJlYWRlZCBydW4tdGltZSBsaWJyYXJ5LAorICBvciB1c2luZyB0aGUgbXVsdGktdGhyZWFkZWQgcnVuLXRpbWUgRGxsLiBUaGF0IGlzLCAKKyAgb25lIGNhbiBidWlsZCB0aHJlZSBkaWZmZXJlbnQgRXhwYXQgbGlicmFyaWVzIGRlcGVuZGluZworICBvbiB0aGUgbmVlZHMgb2YgdGhlIGFwcGxpY2F0aW9uLgorCisgIER5bmFtaWMgTGlua2luZzoKKworICBCeSBkZWZhdWx0IHRoZSBFeHBhdCBEbGxzIGFyZSBidWlsdCB0byBsaW5rIHN0YXRpY2FsbHkKKyAgd2l0aCB0aGUgbXVsdGktdGhyZWFkZWQgcnVuLXRpbWUgbGlicmFyeS4gCisgIFRoZSBsaWJyYXJpZXMgYXJlIG5hbWVkCisgIC0gbGliZXhwYXQodykuZGxsIAorICAtIGxpYmV4cGF0KHcpLmxpYiAoaW1wb3J0IGxpYnJhcnkpCisgIFRoZSAidyIgaW5kaWNhdGVzIHRoZSBVVEYtMTYgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKworICBPbmUgcmFyZWx5IHVzZXMgb3RoZXIgdmVyc2lvbnMgb2YgdGhlIERsbCwgYnV0IHRoZXkgY2FuCisgIGJlIGJ1aWx0IGVhc2lseSBieSBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IFJUTCBsaW5rYWdlIGluCisgIHRoZSBJREUgb24gdGhlIEMvQysrIHRhYiB1bmRlciB0aGUgY2F0ZWdvcnkgQ29kZSBHZW5lcmF0aW9uLgorCisgIFN0YXRpYyBMaW5raW5nOgorCisgIFRoZSBsaWJyYXJpZXMgc2hvdWxkIGJlIG5hbWVkIGxpa2UgdGhpczoKKyAgU2luZ2xlLXRoZWFkZWQ6ICAgICBsaWJleHBhdCh3KU1MLmxpYgorICBNdWx0aS10aHJlYWRlZDogICAgIGxpYmV4cGF0KHcpTVQubGliCisgIE11bHRpLXRocmVhZGVkIERsbDogbGliZXhwYXQodylNRC5saWIKKyAgVGhlIHN1ZmZpeGVzIGNvbmZvcm0gdG8gdGhlIGNvbXBpbGVyIHN3aXRjaCBzZXR0aW5ncworICAvTUwsIC9NVCBhbmQgL01EIGZvciBNUyBWQysrLgorICAKKyAgTm90ZTogSW4gVmlzdWFsIFN0dWRpbyAyMDA1IChWaXN1YWwgQysrIDguMCkgYW5kIGxhdGVyLCB0aGUKKyAgc2luZ2xlLXRocmVhZGVkIHJ1bnRpbWUgbGlicmFyeSBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuCisKKyAgQnkgZGVmYXVsdCwgdGhlIGV4cGF0LXN0YXRpYyBhbmQgZXhwYXR3LXN0YXRpYyBwcm9qZWN0cyBhcmUgc2V0IHVwCisgIHRvIGxpbmsgc3RhdGljYWxseSBhZ2FpbnN0IHRoZSBtdWx0aXRocmVhZGVkIHJ1bi10aW1lIGxpYnJhcnksCisgIHNvIHRoZXkgd2lsbCBidWlsZCBsaWJleHBhdE1ULmxpYiBvciBsaWJleHBhdHdNVC5saWIgZmlsZXMuCisKKyAgVG8gYnVpbGQgdGhlIG90aGVyIHZlcnNpb25zIG9mIHRoZSBzdGF0aWMgbGlicmFyeSwgCisgIGdvIHRvIFByb2plY3QgLSBTZXR0aW5nczoKKyAgLSBzcGVjaWZ5IGEgZGlmZmVyZW50IFJUTCBsaW5rYWdlIG9uIHRoZSBDL0MrKyB0YWIKKyAgICB1bmRlciB0aGUgY2F0ZWdvcnkgQ29kZSBHZW5lcmF0aW9uLgorICAtIHRoZW4sIG9uIHRoZSBMaWJyYXJ5IHRhYiwgY2hhbmdlIHRoZSBvdXRwdXQgZmlsZSBuYW1lCisgICAgYWNjb3JkaW5nbHksIGFzIGRlc2NyaWJlZCBhYm92ZQorCisgIEFuIGFwcGxpY2F0aW9uIGxpbmtpbmcgdG8gdGhlIHN0YXRpYyBsaWJyYXJpZXMgbXVzdAorICBoYXZlIHRoZSBnbG9iYWwgbWFjcm8gWE1MX1NUQVRJQyBkZWZpbmVkLgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEvd2luMzIvZXhwYXQuaXNzIGIvZXhwYXQtMi4wLjEvd2luMzIvZXhwYXQuaXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQwMGIzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS93aW4zMi9leHBhdC5pc3MKQEAgLTAsMCArMSw2OSBAQAorOyBCYXNpYyBzZXR1cCBzY3JpcHQgZm9yIHRoZSBJbm5vIFNldHVwIGluc3RhbGxlciBidWlsZGVyLiAgRm9yIG1vcmUKKzsgaW5mb3JtYXRpb24gb24gdGhlIGZyZWUgaW5zdGFsbGVyIGJ1aWxkZXIsIHNlZSB3d3cuanJzb2Z0d2FyZS5vcmcuCis7Cis7IFRoaXMgc2NyaXB0IHdhcyBjb250cmlidXRlZCBieSBUaW0gUGV0ZXJzLgorOyBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIHVzZWQgd2l0aCBJbm5vIFNldHVwIDIuMC4xOS4KKworW1NldHVwXQorQXBwTmFtZT1FeHBhdAorQXBwSWQ9ZXhwYXQKK0FwcFZlcnNpb249Mi4wLjEKK0FwcFZlck5hbWU9RXhwYXQgMi4wLjEKK0FwcENvcHlyaWdodD1Db3B5cmlnaHQgqSAxOTk4LTIwMDYgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIsIENsYXJrIENvb3BlciwgYW5kIHRoZSBFeHBhdCBtYWludGFpbmVycworQXBwUHVibGlzaGVyPVRoZSBFeHBhdCBEZXZlbG9wZXJzCitBcHBQdWJsaXNoZXJVUkw9aHR0cDovL3d3dy5saWJleHBhdC5vcmcvCitBcHBTdXBwb3J0VVJMPWh0dHA6Ly93d3cubGliZXhwYXQub3JnLworQXBwVXBkYXRlc1VSTD1odHRwOi8vd3d3LmxpYmV4cGF0Lm9yZy8KK1VuaW5zdGFsbERpc3BsYXlOYW1lPUV4cGF0IFhNTCBQYXJzZXIgMi4wLjEKK1ZlcnNpb25JbmZvVmVyc2lvbj0yLjAuMQorCitEZWZhdWx0RGlyTmFtZT17cGZ9XEV4cGF0IDIuMC4xCitVbmluc3RhbGxGaWxlc0Rpcj17YXBwfVxVbmluc3RhbGwKKworQ29tcHJlc3Npb249bHptYQorU29saWRDb21wcmVzc2lvbj15ZXMKK1NvdXJjZURpcj0uLgorT3V0cHV0RGlyPXdpbjMyCitEaXNhYmxlU3RhcnR1cFByb21wdD15ZXMKK0FsbG93Tm9JY29ucz15ZXMKK0Rpc2FibGVQcm9ncmFtR3JvdXBQYWdlPXllcworRGlzYWJsZVJlYWR5UGFnZT15ZXMKKworW0ZpbGVzXQorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogd2luMzJcYmluXFJlbGVhc2VceG1sd2YuZXhlOyAgRGVzdERpcjogInthcHB9XEJpbiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHdpbjMyXE1BTklGRVNULnR4dDsgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IENoYW5nZXM7ICAgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfSI7IERlc3ROYW1lOiBDaGFuZ2VzLnR4dAorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogQ09QWUlORzsgICAgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9IjsgRGVzdE5hbWU6IENPUFlJTkcudHh0CitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBSRUFETUU7ICAgICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH0iOyBEZXN0TmFtZTogUkVBRE1FLnR4dAorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogZG9jXCouaHRtbDsgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XERvYyIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGRvY1wqLmNzczsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxEb2MiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBkb2NcKi5wbmc7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cRG9jIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogd2luMzJcYmluXFJlbGVhc2VcKi5kbGw7ICAgICAgRGVzdERpcjogInthcHB9XEJpbiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHdpbjMyXGJpblxSZWxlYXNlXCoubGliOyAgICAgIERlc3REaXI6ICJ7YXBwfVxCaW4iCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBleHBhdC5kc3c7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogd2luMzJcUkVBRE1FLnR4dDsgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5icCo7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5tYWs7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5kZWY7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi50eHQ7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGJjYjVcKi5iYXQ7ICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcYmNiNSIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGxpYlwqLmM7ICAgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcbGliIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogbGliXCouaDsgICAgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVxsaWIiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiBsaWJcKi5kZWY7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXGxpYiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGxpYlwqLmRzcDsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcbGliIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogZXhhbXBsZXNcKi5jOyAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVxleGFtcGxlcyIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IGV4YW1wbGVzXCouZHNwOyAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcZXhhbXBsZXMiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB0ZXN0c1wqLmM7ICAgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHRlc3RzIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogdGVzdHNcKi5jcHA7ICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVx0ZXN0cyIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHRlc3RzXCouaDsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcdGVzdHMiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB0ZXN0c1xSRUFETUUudHh0OyAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHRlc3RzIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogdGVzdHNcYmVuY2htYXJrXCouYzsgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVx0ZXN0c1xiZW5jaG1hcmsiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB0ZXN0c1xiZW5jaG1hcmtcKi5kcyo7ICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHRlc3RzXGJlbmNobWFyayIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHRlc3RzXGJlbmNobWFya1xSRUFETUUudHh0OyAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VcdGVzdHNcYmVuY2htYXJrIgorRmxhZ3M6IGlnbm9yZXZlcnNpb247IFNvdXJjZTogeG1sd2ZcKi5jKjsgICAgICAgICAgICAgICAgICAgRGVzdERpcjogInthcHB9XFNvdXJjZVx4bWx3ZiIKK0ZsYWdzOiBpZ25vcmV2ZXJzaW9uOyBTb3VyY2U6IHhtbHdmXCouaDsgICAgICAgICAgICAgICAgICAgIERlc3REaXI6ICJ7YXBwfVxTb3VyY2VceG1sd2YiCitGbGFnczogaWdub3JldmVyc2lvbjsgU291cmNlOiB4bWx3ZlwqLmRzcDsgICAgICAgICAgICAgICAgICBEZXN0RGlyOiAie2FwcH1cU291cmNlXHhtbHdmIgorCitbTWVzc2FnZXNdCitXZWxjb21lTGFiZWwxPVdlbGNvbWUgdG8gdGhlIEV4cGF0IFhNTCBQYXJzZXIgU2V0dXAgV2l6YXJkCitXZWxjb21lTGFiZWwyPVRoaXMgd2lsbCBpbnN0YWxsIFtuYW1lL3Zlcl0gb24geW91ciBjb21wdXRlci4lbiVuRXhwYXQgaXMgYW4gWE1MIHBhcnNlciB3aXRoIGEgQy1sYW5ndWFnZSBBUEksIGFuZCBpcyBwcmltYXJpbHkgbWFkZSBhdmFpbGFibGUgdG8gYWxsb3cgZGV2ZWxvcGVycyB0byBidWlsZCBhcHBsaWNhdGlvbnMgd2hpY2ggdXNlIFhNTCB1c2luZyBhIHBvcnRhYmxlIEFQSSBhbmQgZmFzdCBpbXBsZW1lbnRhdGlvbi4lbiVuSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgY2xvc2UgYWxsIG90aGVyIGFwcGxpY2F0aW9ucyB5b3UgaGF2ZSBydW5uaW5nIGJlZm9yZSBjb250aW51aW5nLiBUaGlzIHdpbGwgaGVscCBwcmV2ZW50IGFueSBjb25mbGljdHMgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL2NvZGVwYWdlLmMgYi9leHBhdC0yLjAuMS94bWx3Zi9jb2RlcGFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3ZTQ4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi9jb2RlcGFnZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaW5jbHVkZSAiY29kZXBhZ2UuaCIKKworI2lmIChkZWZpbmVkKFdJTjMyKSB8fCAoZGVmaW5lZChfX1dBVENPTUNfXykgJiYgZGVmaW5lZChfX05UX18pKSkKKyNkZWZpbmUgU1RSSUNUIDEKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK2ludAorY29kZXBhZ2VNYXAoaW50IGNwLCBpbnQgKm1hcCkKK3sKKyAgaW50IGk7CisgIENQSU5GTyBpbmZvOworICBpZiAoIUdldENQSW5mbyhjcCwgJmluZm8pIHx8IGluZm8uTWF4Q2hhclNpemUgPiAyKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgbWFwW2ldID0gLTE7CisgIGlmIChpbmZvLk1heENoYXJTaXplID4gMSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTEVBREJZVEVTOyBpKz0yKSB7CisgICAgICBpbnQgaiwgbGltOworICAgICAgaWYgKGluZm8uTGVhZEJ5dGVbaV0gPT0gMCAmJiBpbmZvLkxlYWRCeXRlW2kgKyAxXSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIGxpbSA9IGluZm8uTGVhZEJ5dGVbaSArIDFdOworICAgICAgZm9yIChqID0gaW5mby5MZWFkQnl0ZVtpXTsgaiA8PSBsaW07IGorKykKKyAgICAgICAgbWFwW2pdID0gLTI7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgaWYgKG1hcFtpXSA9PSAtMSkgeworICAgICBjaGFyIGMgPSAoY2hhcilpOworICAgICB1bnNpZ25lZCBzaG9ydCBuOworICAgICBpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhcihjcCwgTUJfUFJFQ09NUE9TRUR8TUJfRVJSX0lOVkFMSURfQ0hBUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLCAxLCAmbiwgMSkgPT0gMSkKKyAgICAgICBtYXBbaV0gPSBuOworICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQKK2NvZGVwYWdlQ29udmVydChpbnQgY3AsIGNvbnN0IGNoYXIgKnApCit7CisgIHVuc2lnbmVkIHNob3J0IGM7CisgIGlmIChNdWx0aUJ5dGVUb1dpZGVDaGFyKGNwLCBNQl9QUkVDT01QT1NFRHxNQl9FUlJfSU5WQUxJRF9DSEFSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgMiwgJmMsIDEpID09IDEpCisgICAgcmV0dXJuIGM7CisgIHJldHVybiAtMTsKK30KKworI2Vsc2UgLyogbm90IFdJTjMyICovCisKK2ludAorY29kZXBhZ2VNYXAoaW50IGNwLCBpbnQgKm1hcCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorY29kZXBhZ2VDb252ZXJ0KGludCBjcCwgY29uc3QgY2hhciAqcCkKK3sKKyAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogbm90IFdJTjMyICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi9jb2RlcGFnZS5oIGIvZXhwYXQtMi4wLjEveG1sd2YvY29kZXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YTRkZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEveG1sd2YvY29kZXBhZ2UuaApAQCAtMCwwICsxLDYgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCitpbnQgY29kZXBhZ2VNYXAoaW50IGNwLCBpbnQgKm1hcCk7CitpbnQgY29kZXBhZ2VDb252ZXJ0KGludCBjcCwgY29uc3QgY2hhciAqcCk7CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi9jdC5jIGIvZXhwYXQtMi4wLjEveG1sd2YvY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTkwM2EzCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEveG1sd2YvY3QuYwpAQCAtMCwwICsxLDE0NyBAQAorI2RlZmluZSBDSEFSU0VUX01BWCA0MQorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRUb2soY29uc3QgY2hhciAqKnBwKQoreworICBlbnVtIHsgaW5BdG9tLCBpblN0cmluZywgaW5pdCwgaW5Db21tZW50IH07CisgIGludCBzdGF0ZSA9IGluaXQ7CisgIGNvbnN0IGNoYXIgKnRva1N0YXJ0ID0gMDsKKyAgZm9yICg7OykgeworICAgIHN3aXRjaCAoKipwcCkgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgICAgaWYgKHN0YXRlID09IGluQXRvbSkKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnKCc6CisgICAgICBpZiAoc3RhdGUgPT0gaW5BdG9tKQorICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBpZiAoc3RhdGUgIT0gaW5TdHJpbmcpCisgICAgICAgIHN0YXRlKys7CisgICAgICBicmVhazsKKyAgICBjYXNlICcpJzoKKyAgICAgIGlmIChzdGF0ZSA+IGluaXQpCisgICAgICAgIC0tc3RhdGU7CisgICAgICBlbHNlIGlmIChzdGF0ZSAhPSBpblN0cmluZykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlICc7JzoKKyAgICBjYXNlICcvJzoKKyAgICBjYXNlICc9JzoKKyAgICAgIGlmIChzdGF0ZSA9PSBpbkF0b20pCisgICAgICAgIHJldHVybiB0b2tTdGFydDsKKyAgICAgIGlmIChzdGF0ZSA9PSBpbml0KQorICAgICAgICByZXR1cm4gKCpwcCkrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xcJzoKKyAgICAgICsrKnBwOworICAgICAgaWYgKCoqcHAgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgIGNhc2UgaW5TdHJpbmc6CisgICAgICAgICsrKnBwOworICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBjYXNlIGluQXRvbToKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgY2FzZSBpbml0OgorICAgICAgICB0b2tTdGFydCA9ICpwcDsKKyAgICAgICAgc3RhdGUgPSBpblN0cmluZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHN0YXRlID09IGluaXQpIHsKKyAgICAgICAgdG9rU3RhcnQgPSAqcHA7CisgICAgICAgIHN0YXRlID0gaW5BdG9tOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgICsrKnBwOworICB9CisgIC8qIG5vdCByZWFjaGVkICovCit9CisKKy8qIGtleSBtdXN0IGJlIGxvd2VyY2FzZSBBU0NJSSAqLworCitzdGF0aWMgaW50CittYXRjaGtleShjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICprZXkpCit7CisgIGlmICghc3RhcnQpCisgICAgcmV0dXJuIDA7CisgIGZvciAoOyBzdGFydCAhPSBlbmQ7IHN0YXJ0KyssIGtleSsrKQorICAgIGlmICgqc3RhcnQgIT0gKmtleSAmJiAqc3RhcnQgIT0gJ0EnICsgKCprZXkgLSAnYScpKQorICAgICAgcmV0dXJuIDA7CisgIHJldHVybiAqa2V5ID09ICdcMCc7Cit9CisKK3ZvaWQKK2dldFhNTENoYXJzZXQoY29uc3QgY2hhciAqYnVmLCBjaGFyICpjaGFyc2V0KQoreworICBjb25zdCBjaGFyICpuZXh0LCAqcDsKKworICBjaGFyc2V0WzBdID0gJ1wwJzsKKyAgbmV4dCA9IGJ1ZjsKKyAgcCA9IGdldFRvaygmbmV4dCk7CisgIGlmIChtYXRjaGtleShwLCBuZXh0LCAidGV4dCIpKQorICAgIHN0cmNweShjaGFyc2V0LCAidXMtYXNjaWkiKTsKKyAgZWxzZSBpZiAoIW1hdGNoa2V5KHAsIG5leHQsICJhcHBsaWNhdGlvbiIpKQorICAgIHJldHVybjsKKyAgcCA9IGdldFRvaygmbmV4dCk7CisgIGlmICghcCB8fCAqcCAhPSAnLycpCisgICAgcmV0dXJuOworICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgaWYgKG1hdGNoa2V5KHAsIG5leHQsICJ4bWwiKSkKKyAgICBpc1htbCA9IDE7CisgIHAgPSBnZXRUb2soJm5leHQpOworICB3aGlsZSAocCkgeworICAgIGlmICgqcCA9PSAnOycpIHsKKyAgICAgIHAgPSBnZXRUb2soJm5leHQpOworICAgICAgaWYgKG1hdGNoa2V5KHAsIG5leHQsICJjaGFyc2V0IikpIHsKKyAgICAgICAgcCA9IGdldFRvaygmbmV4dCk7CisgICAgICAgIGlmIChwICYmICpwID09ICc9JykgeworICAgICAgICAgIHAgPSBnZXRUb2soJm5leHQpOworICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICBjaGFyICpzID0gY2hhcnNldDsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnIicpIHsKKyAgICAgICAgICAgICAgd2hpbGUgKCsrcCAhPSBuZXh0IC0gMSkgeworICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnXFwnKQorICAgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICAgIGlmIChzID09IGNoYXJzZXQgKyBDSEFSU0VUX01BWCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgIGNoYXJzZXRbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpzKysgPSAqcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAqcysrID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZiAobmV4dCAtIHAgPiBDSEFSU0VUX01BWCAtIDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIHdoaWxlIChwICE9IG5leHQpCisgICAgICAgICAgICAgICAgKnMrKyA9ICpwKys7CisgICAgICAgICAgICAgICpzID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICBlbHNlCisgICAgcCA9IGdldFRvaygmbmV4dCk7CisgIH0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgY2hhciBidWZbQ0hBUlNFVF9NQVhdOworICBnZXRYTUxDaGFyc2V0KGFyZ3ZbMV0sIGJ1Zik7CisgIHByaW50ZigiY2hhcnNldCA9IFwiJXNcIlxuIiwgYnVmKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi9maWxlbWFwLmggYi9leHBhdC0yLjAuMS94bWx3Zi9maWxlbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODE0ZWRlYwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL2ZpbGVtYXAuaApAQCAtMCwwICsxLDE3IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgWE1MX1VOSUNPREUKK2ludCBmaWxlbWFwKGNvbnN0IHdjaGFyX3QgKm5hbWUsCisgICAgICAgICAgICB2b2lkICgqcHJvY2Vzc29yKShjb25zdCB2b2lkICosIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKiwgdm9pZCAqYXJnKSwKKyAgICAgICAgICAgIHZvaWQgKmFyZyk7CisjZWxzZQoraW50IGZpbGVtYXAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIHZvaWQgKCpwcm9jZXNzb3IpKGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCB2b2lkICphcmcpLAorICAgICAgICAgICAgdm9pZCAqYXJnKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEveG1sd2YvcmVhZGZpbGVtYXAuYyBiL2V4cGF0LTIuMC4xL3htbHdmL3JlYWRmaWxlbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDg4ZGRhNQotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3JlYWRmaWxlbWFwLmMKQEAgLTAsMCArMSw5OCBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIF9fV0FUQ09NQ19fCisjaWZuZGVmIF9fTElOVVhfXworI2luY2x1ZGUgPGlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fQkVPU19fCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBTX0lTUkVHCisjaWZuZGVmIFNfSUZSRUcKKyNkZWZpbmUgU19JRlJFRyBfU19JRlJFRworI2VuZGlmCisjaWZuZGVmIFNfSUZNVAorI2RlZmluZSBTX0lGTVQgX1NfSUZNVAorI2VuZGlmCisjZGVmaW5lIFNfSVNSRUcobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZW5kaWYgLyogbm90IFNfSVNSRUcgKi8KKworI2lmbmRlZiBPX0JJTkFSWQorI2lmZGVmIF9PX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyNlbHNlCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJmaWxlbWFwLmgiCisKK2ludAorZmlsZW1hcChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICB2b2lkICgqcHJvY2Vzc29yKShjb25zdCB2b2lkICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2b2lkICphcmcpLAorICAgICAgICB2b2lkICphcmcpCit7CisgIHNpemVfdCBuYnl0ZXM7CisgIGludCBmZDsKKyAgaW50IG47CisgIHN0cnVjdCBzdGF0IHNiOworICB2b2lkICpwOworCisgIGZkID0gb3BlbihuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7CisgIGlmIChmZCA8IDApIHsKKyAgICBwZXJyb3IobmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGZzdGF0KGZkLCAmc2IpIDwgMCkgeworICAgIHBlcnJvcihuYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBub3QgYSByZWd1bGFyIGZpbGVcbiIsIG5hbWUpOworICAgIHJldHVybiAwOworICB9CisgIG5ieXRlcyA9IHNiLnN0X3NpemU7CisgIC8qIG1hbGxvYyB3aWxsIHJldHVybiBOVUxMIHdpdGggbmJ5dGVzID09IDAsIGhhbmRsZSBmaWxlcyB3aXRoIHNpemUgMCAqLworICBpZiAobmJ5dGVzID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBjID0gJ1wwJzsKKyAgICBwcm9jZXNzb3IoJmMsIDAsIG5hbWUsIGFyZyk7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAxOworICB9CisgIHAgPSBtYWxsb2MobmJ5dGVzKTsKKyAgaWYgKCFwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb3V0IG9mIG1lbW9yeVxuIiwgbmFtZSk7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAwOworICB9CisgIG4gPSByZWFkKGZkLCBwLCBuYnl0ZXMpOworICBpZiAobiA8IDApIHsKKyAgICBwZXJyb3IobmFtZSk7CisgICAgZnJlZShwKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG4gIT0gbmJ5dGVzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogcmVhZCB1bmV4cGVjdGVkIG51bWJlciBvZiBieXRlc1xuIiwgbmFtZSk7CisgICAgZnJlZShwKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvY2Vzc29yKHAsIG5ieXRlcywgbmFtZSwgYXJnKTsKKyAgZnJlZShwKTsKKyAgY2xvc2UoZmQpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3VuaXhmaWxlbWFwLmMgYi9leHBhdC0yLjAuMS94bWx3Zi91bml4ZmlsZW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzYWRjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi91bml4ZmlsZW1hcC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIE1BUF9GSUxFCisjZGVmaW5lIE1BUF9GSUxFIDAKKyNlbmRpZgorCisjaW5jbHVkZSAiZmlsZW1hcC5oIgorCitpbnQKK2ZpbGVtYXAoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgdm9pZCAoKnByb2Nlc3NvcikoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdm9pZCAqYXJnKSwKKyAgICAgICAgdm9pZCAqYXJnKQoreworICBpbnQgZmQ7CisgIHNpemVfdCBuYnl0ZXM7CisgIHN0cnVjdCBzdGF0IHNiOworICB2b2lkICpwOworCisgIGZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7CisgIGlmIChmZCA8IDApIHsKKyAgICBwZXJyb3IobmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGZzdGF0KGZkLCAmc2IpIDwgMCkgeworICAgIHBlcnJvcihuYW1lKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFTX0lTUkVHKHNiLnN0X21vZGUpKSB7CisgICAgY2xvc2UoZmQpOworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5vdCBhIHJlZ3VsYXIgZmlsZVxuIiwgbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBuYnl0ZXMgPSBzYi5zdF9zaXplOworICAvKiBtbWFwIGZhaWxzIGZvciB6ZXJvIGxlbmd0aCBmaWxlcyAqLworICBpZiAobmJ5dGVzID09IDApIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBjID0gJ1wwJzsKKyAgICBwcm9jZXNzb3IoJmMsIDAsIG5hbWUsIGFyZyk7CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAxOworICB9CisgIHAgPSAodm9pZCAqKW1tYXAoKGNhZGRyX3QpMCwgKHNpemVfdCluYnl0ZXMsIFBST1RfUkVBRCwKKyAgICAgICAgICAgICAgICAgICBNQVBfRklMRXxNQVBfUFJJVkFURSwgZmQsIChvZmZfdCkwKTsKKyAgaWYgKHAgPT0gKHZvaWQgKiktMSkgeworICAgIHBlcnJvcihuYW1lKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcHJvY2Vzc29yKHAsIG5ieXRlcywgbmFtZSwgYXJnKTsKKyAgbXVubWFwKChjYWRkcl90KXAsIG5ieXRlcyk7CisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi93aW4zMmZpbGVtYXAuYyBiL2V4cGF0LTIuMC4xL3htbHdmL3dpbjMyZmlsZW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxZGMzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi93aW4zMmZpbGVtYXAuYwpAQCAtMCwwICsxLDk2IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2RlZmluZSBTVFJJQ1QgMQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKworI2lmZGVmIFhNTF9VTklDT0RFX1dDSEFSX1QKKyNpZm5kZWYgWE1MX1VOSUNPREUKKyNkZWZpbmUgWE1MX1VOSUNPREUKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBYTUxfVU5JQ09ERQorI2RlZmluZSBVTklDT0RFCisjZGVmaW5lIF9VTklDT0RFCisjZW5kaWYgLyogWE1MX1VOSUNPREUgKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgImZpbGVtYXAuaCIKKworc3RhdGljIHZvaWQgd2luMzJwZXJyb3IoY29uc3QgVENIQVIgKik7CisKK2ludAorZmlsZW1hcChjb25zdCBUQ0hBUiAqbmFtZSwKKyAgICAgICAgdm9pZCAoKnByb2Nlc3NvcikoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGNvbnN0IFRDSEFSICosIHZvaWQgKmFyZyksCisgICAgICAgIHZvaWQgKmFyZykKK3sKKyAgSEFORExFIGY7CisgIEhBTkRMRSBtOworICBEV09SRCBzaXplOworICBEV09SRCBzaXplSGk7CisgIHZvaWQgKnA7CisKKyAgZiA9IENyZWF0ZUZpbGUobmFtZSwgR0VORVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsIE9QRU5fRVhJU1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19TRVFVRU5USUFMX1NDQU4sIE5VTEwpOworICBpZiAoZiA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIHdpbjMycGVycm9yKG5hbWUpOworICAgIHJldHVybiAwOworICB9CisgIHNpemUgPSBHZXRGaWxlU2l6ZShmLCAmc2l6ZUhpKTsKKyAgaWYgKHNpemUgPT0gKERXT1JEKS0xKSB7CisgICAgd2luMzJwZXJyb3IobmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHNpemVIaSkgeworICAgIF9mdHByaW50ZihzdGRlcnIsIF9UKCIlczogYmlnZ2VyIHRoYW4gMkdiXG4iKSwgbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogQ3JlYXRlRmlsZU1hcHBpbmcgYmFyZnMgb24gemVybyBsZW5ndGggZmlsZXMgKi8KKyAgaWYgKHNpemUgPT0gMCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGMgPSAnXDAnOworICAgIHByb2Nlc3NvcigmYywgMCwgbmFtZSwgYXJnKTsKKyAgICBDbG9zZUhhbmRsZShmKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBtID0gQ3JlYXRlRmlsZU1hcHBpbmcoZiwgTlVMTCwgUEFHRV9SRUFET05MWSwgMCwgMCwgTlVMTCk7CisgIGlmIChtID09IE5VTEwpIHsKKyAgICB3aW4zMnBlcnJvcihuYW1lKTsKKyAgICBDbG9zZUhhbmRsZShmKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwID0gTWFwVmlld09mRmlsZShtLCBGSUxFX01BUF9SRUFELCAwLCAwLCAwKTsKKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHdpbjMycGVycm9yKG5hbWUpOworICAgIENsb3NlSGFuZGxlKG0pOworICAgIENsb3NlSGFuZGxlKGYpOworICAgIHJldHVybiAwOworICB9CisgIHByb2Nlc3NvcihwLCBzaXplLCBuYW1lLCBhcmcpOyAKKyAgVW5tYXBWaWV3T2ZGaWxlKHApOworICBDbG9zZUhhbmRsZShtKTsKKyAgQ2xvc2VIYW5kbGUoZik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAord2luMzJwZXJyb3IoY29uc3QgVENIQVIgKnMpCit7CisgIExQVk9JRCBidWY7CisgIGlmIChGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUgorICAgICAgICAgICAgICAgICAgICB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisgICAgICAgICAgICAgICAgICAgIChMUFRTVFIpICZidWYsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1QoIiVzOiAlcyIpLCBzLCBidWYpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIExvY2FsRnJlZShidWYpOworICB9CisgIGVsc2UKKyAgICBfZnRwcmludGYoc3RkZXJyLCBfVCgiJXM6IHVua25vd24gV2luZG93cyBlcnJvclxuIiksIHMpOworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5jIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5ZWVlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWxmaWxlLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKKyAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKKyNpbmNsdWRlICJ3aW5jb25maWcuaCIKKyNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKKyNpbmNsdWRlICJtYWNjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19hbWlnYW9zX18pCisjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pCisjaW5jbHVkZSAid2F0Y29tY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKEhBVkVfRVhQQVRfQ09ORklHX0gpCisjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CisjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLworCisjaW5jbHVkZSAiZXhwYXQuaCIKKyNpbmNsdWRlICJ4bWxmaWxlLmgiCisjaW5jbHVkZSAieG1sdGNoYXIuaCIKKyNpbmNsdWRlICJmaWxlbWFwLmgiCisKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgKGRlZmluZWQoX19XQVRDT01DX18pICYmICFkZWZpbmVkKF9fTElOVVhfXykpKQorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbWlnYW9zX18pICYmIGRlZmluZWQoX19VU0VfSU5MSU5FX18pCisjaW5jbHVkZSA8cHJvdG8vZXhwYXQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgT19CSU5BUlkKKyNpZmRlZiBfT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCisjZWxzZQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX0RFQlVHCisjZGVmaW5lIFJFQURfU0laRSAxNgorI2Vsc2UKKyNkZWZpbmUgUkVBRF9TSVpFICgxMDI0KjgpCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIFhNTF9QYXJzZXIgcGFyc2VyOworICBpbnQgKnJldFB0cjsKK30gUFJPQ0VTU19BUkdTOworCitzdGF0aWMgdm9pZAorcmVwb3J0RXJyb3IoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZSkKK3sKKyAgZW51bSBYTUxfRXJyb3IgY29kZSA9IFhNTF9HZXRFcnJvckNvZGUocGFyc2VyKTsKKyAgY29uc3QgWE1MX0NoYXIgKm1lc3NhZ2UgPSBYTUxfRXJyb3JTdHJpbmcoY29kZSk7CisgIGlmIChtZXNzYWdlKQorICAgIGZ0cHJpbnRmKHN0ZG91dCwgVCgiJXM6JSIgWE1MX0ZNVF9JTlRfTU9EICJ1OiUiIFhNTF9GTVRfSU5UX01PRCAidTogJXNcbiIpLAorICAgICAgICAgICAgIGZpbGVuYW1lLAorICAgICAgICAgICAgIFhNTF9HZXRFcnJvckxpbmVOdW1iZXIocGFyc2VyKSwKKyAgICAgICAgICAgICBYTUxfR2V0RXJyb3JDb2x1bW5OdW1iZXIocGFyc2VyKSwKKyAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgZWxzZQorICAgIGZ0cHJpbnRmKHN0ZGVyciwgVCgiJXM6ICh1bmtub3duIG1lc3NhZ2UgJWQpXG4iKSwgZmlsZW5hbWUsIGNvZGUpOworfQorIAorLyogVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGdpdmUgcHJvYmxlbXMgb24gZmlsZXMgbGFyZ2VyIHRoYW4gSU5UX01BWC4gKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzRmlsZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZSwgdm9pZCAqYXJncykKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSAoKFBST0NFU1NfQVJHUyAqKWFyZ3MpLT5wYXJzZXI7CisgIGludCAqcmV0UHRyID0gKChQUk9DRVNTX0FSR1MgKilhcmdzKS0+cmV0UHRyOworICBpZiAoWE1MX1BhcnNlKHBhcnNlciwgKGNvbnN0IGNoYXIgKilkYXRhLCAoaW50KXNpemUsIDEpID09IFhNTF9TVEFUVVNfRVJST1IpIHsKKyAgICByZXBvcnRFcnJvcihwYXJzZXIsIGZpbGVuYW1lKTsKKyAgICAqcmV0UHRyID0gMDsKKyAgfQorICBlbHNlCisgICAgKnJldFB0ciA9IDE7Cit9CisKKyNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dBVENPTUNfXykpCisKK3N0YXRpYyBpbnQKK2lzQXNjaWlMZXR0ZXIoWE1MX0NoYXIgYykKK3sKKyAgcmV0dXJuIChUKCdhJykgPD0gYyAmJiBjIDw9IFQoJ3onKSkgfHwgKFQoJ0EnKSA8PSBjICYmIGMgPD0gVCgnWicpKTsKK30KKworI2VuZGlmIC8qIFdJTjMyICovCisKK3N0YXRpYyBjb25zdCBYTUxfQ2hhciAqCityZXNvbHZlU3lzdGVtSWQoY29uc3QgWE1MX0NoYXIgKmJhc2UsIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICBYTUxfQ2hhciAqKnRvRnJlZSkKK3sKKyAgWE1MX0NoYXIgKnM7CisgICp0b0ZyZWUgPSAwOworICBpZiAoIWJhc2UKKyAgICAgIHx8ICpzeXN0ZW1JZCA9PSBUKCcvJykKKyNpZiAoZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dBVENPTUNfXykpCisgICAgICB8fCAqc3lzdGVtSWQgPT0gVCgnXFwnKQorICAgICAgfHwgKGlzQXNjaWlMZXR0ZXIoc3lzdGVtSWRbMF0pICYmIHN5c3RlbUlkWzFdID09IFQoJzonKSkKKyNlbmRpZgorICAgICApCisgICAgcmV0dXJuIHN5c3RlbUlkOworICAqdG9GcmVlID0gKFhNTF9DaGFyICopbWFsbG9jKCh0Y3NsZW4oYmFzZSkgKyB0Y3NsZW4oc3lzdGVtSWQpICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihYTUxfQ2hhcikpOworICBpZiAoISp0b0ZyZWUpCisgICAgcmV0dXJuIHN5c3RlbUlkOworICB0Y3NjcHkoKnRvRnJlZSwgYmFzZSk7CisgIHMgPSAqdG9GcmVlOworICBpZiAodGNzcmNocihzLCBUKCcvJykpKQorICAgIHMgPSB0Y3NyY2hyKHMsIFQoJy8nKSkgKyAxOworI2lmIChkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSkKKyAgaWYgKHRjc3JjaHIocywgVCgnXFwnKSkpCisgICAgcyA9IHRjc3JjaHIocywgVCgnXFwnKSkgKyAxOworI2VuZGlmCisgIHRjc2NweShzLCBzeXN0ZW1JZCk7CisgIHJldHVybiAqdG9GcmVlOworfQorCitzdGF0aWMgaW50CitleHRlcm5hbEVudGl0eVJlZkZpbGVtYXAoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgWE1MX0NoYXIgKnM7CisgIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZTsKKyAgWE1MX1BhcnNlciBlbnRQYXJzZXIgPSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUocGFyc2VyLCBjb250ZXh0LCAwKTsKKyAgUFJPQ0VTU19BUkdTIGFyZ3M7CisgIGFyZ3MucmV0UHRyID0gJnJlc3VsdDsKKyAgYXJncy5wYXJzZXIgPSBlbnRQYXJzZXI7CisgIGZpbGVuYW1lID0gcmVzb2x2ZVN5c3RlbUlkKGJhc2UsIHN5c3RlbUlkLCAmcyk7CisgIFhNTF9TZXRCYXNlKGVudFBhcnNlciwgZmlsZW5hbWUpOworICBpZiAoIWZpbGVtYXAoZmlsZW5hbWUsIHByb2Nlc3NGaWxlLCAmYXJncykpCisgICAgcmVzdWx0ID0gMDsKKyAgZnJlZShzKTsKKyAgWE1MX1BhcnNlckZyZWUoZW50UGFyc2VyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc1N0cmVhbShjb25zdCBYTUxfQ2hhciAqZmlsZW5hbWUsIFhNTF9QYXJzZXIgcGFyc2VyKQoreworICAvKiBwYXNzaW5nIE5VTEwgZm9yIGZpbGVuYW1lIG1lYW5zIHJlYWQgaW50cHV0IGZyb20gc3RkaW4gKi8KKyAgaW50IGZkID0gMDsgICAvKiAwIGlzIHRoZSBmaWxlbm8gZm9yIHN0ZGluICovCisKKyAgaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICBmZCA9IHRvcGVuKGZpbGVuYW1lLCBPX0JJTkFSWXxPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgdHBlcnJvcihmaWxlbmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZm9yICg7OykgeworICAgIGludCBucmVhZDsKKyAgICBjaGFyICpidWYgPSAoY2hhciAqKVhNTF9HZXRCdWZmZXIocGFyc2VyLCBSRUFEX1NJWkUpOworICAgIGlmICghYnVmKSB7CisgICAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgZnRwcmludGYoc3RkZXJyLCBUKCIlczogb3V0IG9mIG1lbW9yeVxuIiksCisgICAgICAgICAgICAgICBmaWxlbmFtZSAhPSBOVUxMID8gZmlsZW5hbWUgOiAieG1sd2YiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBucmVhZCA9IHJlYWQoZmQsIGJ1ZiwgUkVBRF9TSVpFKTsKKyAgICBpZiAobnJlYWQgPCAwKSB7CisgICAgICB0cGVycm9yKGZpbGVuYW1lICE9IE5VTEwgPyBmaWxlbmFtZSA6ICJTVERJTiIpOworICAgICAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoWE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgbnJlYWQsIG5yZWFkID09IDApID09IFhNTF9TVEFUVVNfRVJST1IpIHsKKyAgICAgIHJlcG9ydEVycm9yKHBhcnNlciwgZmlsZW5hbWUgIT0gTlVMTCA/IGZpbGVuYW1lIDogIlNURElOIik7CisgICAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChucmVhZCA9PSAwKSB7CisgICAgICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgYnJlYWs7OworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZXh0ZXJuYWxFbnRpdHlSZWZTdHJlYW0oWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKQoreworICBYTUxfQ2hhciAqczsKKyAgY29uc3QgWE1MX0NoYXIgKmZpbGVuYW1lOworICBpbnQgcmV0OworICBYTUxfUGFyc2VyIGVudFBhcnNlciA9IFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShwYXJzZXIsIGNvbnRleHQsIDApOworICBmaWxlbmFtZSA9IHJlc29sdmVTeXN0ZW1JZChiYXNlLCBzeXN0ZW1JZCwgJnMpOworICBYTUxfU2V0QmFzZShlbnRQYXJzZXIsIGZpbGVuYW1lKTsKKyAgcmV0ID0gcHJvY2Vzc1N0cmVhbShmaWxlbmFtZSwgZW50UGFyc2VyKTsKKyAgZnJlZShzKTsKKyAgWE1MX1BhcnNlckZyZWUoZW50UGFyc2VyKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50CitYTUxfUHJvY2Vzc0ZpbGUoWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKQoreworICBpbnQgcmVzdWx0OworCisgIGlmICghWE1MX1NldEJhc2UocGFyc2VyLCBmaWxlbmFtZSkpIHsKKyAgICBmdHByaW50ZihzdGRlcnIsIFQoIiVzOiBvdXQgb2YgbWVtb3J5IiksIGZpbGVuYW1lKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgaWYgKGZsYWdzICYgWE1MX0VYVEVSTkFMX0VOVElUSUVTKQorICAgICAgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFhNTF9NQVBfRklMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBleHRlcm5hbEVudGl0eVJlZkZpbGVtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHRlcm5hbEVudGl0eVJlZlN0cmVhbSk7CisgIGlmIChmbGFncyAmIFhNTF9NQVBfRklMRSkgeworICAgIFBST0NFU1NfQVJHUyBhcmdzOworICAgIGFyZ3MucmV0UHRyID0gJnJlc3VsdDsKKyAgICBhcmdzLnBhcnNlciA9IHBhcnNlcjsKKyAgICBpZiAoIWZpbGVtYXAoZmlsZW5hbWUsIHByb2Nlc3NGaWxlLCAmYXJncykpCisgICAgICByZXN1bHQgPSAwOworICB9CisgIGVsc2UKKyAgICByZXN1bHQgPSBwcm9jZXNzU3RyZWFtKGZpbGVuYW1lLCBwYXJzZXIpOworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5oIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwOTNlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWxmaWxlLmgKQEAgLTAsMCArMSwyMCBAQAorLyogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZAorICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KKyovCisKKyNkZWZpbmUgWE1MX01BUF9GSUxFIDAxCisjZGVmaW5lIFhNTF9FWFRFUk5BTF9FTlRJVElFUyAwMgorCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUKKyNpZiBkZWZpbmVkKFhNTF9VU0VfTVNDX0VYVEVOU0lPTlMpICYmIF9NU0NfVkVSIDwgMTQwMAorI2RlZmluZSBYTUxfRk1UX0lOVF9NT0QgIkk2NCIKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibGwiCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFhNTF9GTVRfSU5UX01PRCAibCIKKyNlbmRpZgorCitleHRlcm4gaW50IFhNTF9Qcm9jZXNzRmlsZShYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbG1pbWUuYyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbG1pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NmEwZTdmCi0tLSAvZGV2L251bGwKKysrIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sbWltZS5jCkBAIC0wLDAgKzEsMTYzIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAieG1sbWltZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRUb2soY29uc3QgY2hhciAqKnBwKQoreworICAvKiBpbkNvbW1lbnQgbWVhbnMgb25lIGxldmVsIG9mIG5lc3Rpbmc7IGluQ29tbWVudCsxIG1lYW5zIHR3byBsZXZlbHMgZXRjICovCisgIGVudW0geyBpbkF0b20sIGluU3RyaW5nLCBpbml0LCBpbkNvbW1lbnQgfTsKKyAgaW50IHN0YXRlID0gaW5pdDsKKyAgY29uc3QgY2hhciAqdG9rU3RhcnQgPSAwOworICBmb3IgKDs7KSB7CisgICAgc3dpdGNoICgqKnBwKSB7CisgICAgY2FzZSAnXDAnOgorICAgICAgaWYgKHN0YXRlID09IGluQXRvbSkKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnXHInOgorICAgIGNhc2UgJ1x0JzoKKyAgICBjYXNlICdcbic6CisgICAgICBpZiAoc3RhdGUgPT0gaW5BdG9tKQorICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICcoJzoKKyAgICAgIGlmIChzdGF0ZSA9PSBpbkF0b20pCisgICAgICAgIHJldHVybiB0b2tTdGFydDsKKyAgICAgIGlmIChzdGF0ZSAhPSBpblN0cmluZykKKyAgICAgICAgc3RhdGUrKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyknOgorICAgICAgaWYgKHN0YXRlID4gaW5pdCkKKyAgICAgICAgLS1zdGF0ZTsKKyAgICAgIGVsc2UgaWYgKHN0YXRlICE9IGluU3RyaW5nKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzsnOgorICAgIGNhc2UgJy8nOgorICAgIGNhc2UgJz0nOgorICAgICAgaWYgKHN0YXRlID09IGluQXRvbSkKKyAgICAgICAgcmV0dXJuIHRva1N0YXJ0OworICAgICAgaWYgKHN0YXRlID09IGluaXQpCisgICAgICAgIHJldHVybiAoKnBwKSsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXFwnOgorICAgICAgKysqcHA7CisgICAgICBpZiAoKipwcCA9PSAnXDAnKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJyInOgorICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgY2FzZSBpblN0cmluZzoKKyAgICAgICAgKysqcHA7CisgICAgICAgIHJldHVybiB0b2tTdGFydDsKKyAgICAgIGNhc2UgaW5BdG9tOgorICAgICAgICByZXR1cm4gdG9rU3RhcnQ7CisgICAgICBjYXNlIGluaXQ6CisgICAgICAgIHRva1N0YXJ0ID0gKnBwOworICAgICAgICBzdGF0ZSA9IGluU3RyaW5nOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoc3RhdGUgPT0gaW5pdCkgeworICAgICAgICB0b2tTdGFydCA9ICpwcDsKKyAgICAgICAgc3RhdGUgPSBpbkF0b207CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgKysqcHA7CisgIH0KKyAgLyogbm90IHJlYWNoZWQgKi8KK30KKworLyoga2V5IG11c3QgYmUgbG93ZXJjYXNlIEFTQ0lJICovCisKK3N0YXRpYyBpbnQKK21hdGNoa2V5KGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgaWYgKCFzdGFydCkKKyAgICByZXR1cm4gMDsKKyAgZm9yICg7IHN0YXJ0ICE9IGVuZDsgc3RhcnQrKywga2V5KyspCisgICAgaWYgKCpzdGFydCAhPSAqa2V5ICYmICpzdGFydCAhPSAnQScgKyAoKmtleSAtICdhJykpCisgICAgICByZXR1cm4gMDsKKyAgcmV0dXJuICprZXkgPT0gJ1wwJzsKK30KKwordm9pZAorZ2V0WE1MQ2hhcnNldChjb25zdCBjaGFyICpidWYsIGNoYXIgKmNoYXJzZXQpCit7CisgIGNvbnN0IGNoYXIgKm5leHQsICpwOworCisgIGNoYXJzZXRbMF0gPSAnXDAnOworICBuZXh0ID0gYnVmOworICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgaWYgKG1hdGNoa2V5KHAsIG5leHQsICJ0ZXh0IikpCisgICAgc3RyY3B5KGNoYXJzZXQsICJ1cy1hc2NpaSIpOworICBlbHNlIGlmICghbWF0Y2hrZXkocCwgbmV4dCwgImFwcGxpY2F0aW9uIikpCisgICAgcmV0dXJuOworICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgaWYgKCFwIHx8ICpwICE9ICcvJykKKyAgICByZXR1cm47CisgIHAgPSBnZXRUb2soJm5leHQpOworI2lmIDAKKyAgaWYgKCFtYXRjaGtleShwLCBuZXh0LCAieG1sIikgJiYgY2hhcnNldFswXSA9PSAnXDAnKQorICAgIHJldHVybjsKKyNlbmRpZgorICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgd2hpbGUgKHApIHsKKyAgICBpZiAoKnAgPT0gJzsnKSB7CisgICAgICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgICAgIGlmIChtYXRjaGtleShwLCBuZXh0LCAiY2hhcnNldCIpKSB7CisgICAgICAgIHAgPSBnZXRUb2soJm5leHQpOworICAgICAgICBpZiAocCAmJiAqcCA9PSAnPScpIHsKKyAgICAgICAgICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgY2hhciAqcyA9IGNoYXJzZXQ7CisgICAgICAgICAgICBpZiAoKnAgPT0gJyInKSB7CisgICAgICAgICAgICAgIHdoaWxlICgrK3AgIT0gbmV4dCAtIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJ1xcJykKKyAgICAgICAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBjaGFyc2V0ICsgQ0hBUlNFVF9NQVggLSAxKSB7CisgICAgICAgICAgICAgICAgICBjaGFyc2V0WzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcysrID0gKnA7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKnMrKyA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKG5leHQgLSBwID4gQ0hBUlNFVF9NQVggLSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB3aGlsZSAocCAhPSBuZXh0KQorICAgICAgICAgICAgICAgICpzKysgPSAqcCsrOworICAgICAgICAgICAgICAqcyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBwID0gZ2V0VG9rKCZuZXh0KTsKKyAgfQorfQorCisjaWZkZWYgVEVTVAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGNoYXIgYnVmW0NIQVJTRVRfTUFYXTsKKyAgaWYgKGFyZ2MgPD0gMSkKKyAgICByZXR1cm4gMTsKKyAgcHJpbnRmKCIlc1xuIiwgYXJndlsxXSk7CisgIGdldFhNTENoYXJzZXQoYXJndlsxXSwgYnVmKTsKKyAgcHJpbnRmKCJjaGFyc2V0PVwiJXNcIlxuIiwgYnVmKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi94bWxtaW1lLmggYi9leHBhdC0yLjAuMS94bWx3Zi94bWxtaW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmYwMzU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbG1pbWUuaApAQCAtMCwwICsxLDE5IEBACisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFJlZ2lzdGVyZWQgY2hhcnNldCBuYW1lcyBhcmUgYXQgbW9zdCA0MCBjaGFyYWN0ZXJzIGxvbmcuICovCisKKyNkZWZpbmUgQ0hBUlNFVF9NQVggNDEKKworLyogRmlndXJlIG91dCB0aGUgY2hhcnNldCB0byB1c2UgZnJvbSB0aGUgQ29udGVudFR5cGUuCisgICBidWYgY29udGFpbnMgdGhlIGJvZHkgb2YgdGhlIGhlYWRlciBmaWVsZCAodGhlIHBhcnQgYWZ0ZXIgIkNvbnRlbnQtVHlwZToiKS4KKyAgIGNoYXJzZXQgZ2V0cyB0aGUgY2hhcnNldCB0byB1c2UuICBJdCBtdXN0IGJlIGF0IGxlYXN0IENIQVJTRVRfTUFYIGNoYXJzCisgICBsb25nLiAgY2hhcnNldCB3aWxsIGJlIGVtcHR5IGlmIHRoZSBkZWZhdWx0IGNoYXJzZXQgc2hvdWxkIGJlIHVzZWQuCisqLworCit2b2lkIGdldFhNTENoYXJzZXQoY29uc3QgY2hhciAqYnVmLCBjaGFyICpjaGFyc2V0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbHRjaGFyLmggYi9leHBhdC0yLjAuMS94bWx3Zi94bWx0Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwODg1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx0Y2hhci5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZmRlZiBYTUxfVU5JQ09ERQorI2lmbmRlZiBYTUxfVU5JQ09ERV9XQ0hBUl9UCisjZXJyb3IgeG1sd2YgcmVxdWlyZXMgYSAxNi1iaXQgVW5pY29kZS1jb21wYXRpYmxlIHdjaGFyX3QgCisjZW5kaWYKKyNkZWZpbmUgVCh4KSBMICMjIHgKKyNkZWZpbmUgZnRwcmludGYgZndwcmludGYKKyNkZWZpbmUgdGZvcGVuIF93Zm9wZW4KKyNkZWZpbmUgZnB1dHRzIGZwdXR3cworI2RlZmluZSBwdXR0YyBwdXR3YworI2RlZmluZSB0Y3NjbXAgd2NzY21wCisjZGVmaW5lIHRjc2NweSB3Y3NjcHkKKyNkZWZpbmUgdGNzY2F0IHdjc2NhdAorI2RlZmluZSB0Y3NjaHIgd2NzY2hyCisjZGVmaW5lIHRjc3JjaHIgd2NzcmNocgorI2RlZmluZSB0Y3NsZW4gd2NzbGVuCisjZGVmaW5lIHRwZXJyb3IgX3dwZXJyb3IKKyNkZWZpbmUgdG9wZW4gX3dvcGVuCisjZGVmaW5lIHRtYWluIHdtYWluCisjZGVmaW5lIHRyZW1vdmUgX3dyZW1vdmUKKyNlbHNlIC8qIG5vdCBYTUxfVU5JQ09ERSAqLworI2RlZmluZSBUKHgpIHgKKyNkZWZpbmUgZnRwcmludGYgZnByaW50ZgorI2RlZmluZSB0Zm9wZW4gZm9wZW4KKyNkZWZpbmUgZnB1dHRzIGZwdXRzCisjZGVmaW5lIHB1dHRjIHB1dGMKKyNkZWZpbmUgdGNzY21wIHN0cmNtcAorI2RlZmluZSB0Y3NjcHkgc3RyY3B5CisjZGVmaW5lIHRjc2NhdCBzdHJjYXQKKyNkZWZpbmUgdGNzY2hyIHN0cmNocgorI2RlZmluZSB0Y3NyY2hyIHN0cnJjaHIKKyNkZWZpbmUgdGNzbGVuIHN0cmxlbgorI2RlZmluZSB0cGVycm9yIHBlcnJvcgorI2RlZmluZSB0b3BlbiBvcGVuCisjZGVmaW5lIHRtYWluIG1haW4KKyNkZWZpbmUgdHJlbW92ZSByZW1vdmUKKyNlbmRpZiAvKiBub3QgWE1MX1VOSUNPREUgKi8KZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbHVybC5oIGIvZXhwYXQtMi4wLjEveG1sd2YveG1sdXJsLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDMyOTkxMwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbHVybC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50IFhNTF9VUkxJbml0KCk7Cit2b2lkIFhNTF9VUkxVbmluaXQoKTsKK2ludCBYTUxfUHJvY2Vzc1VSTChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJsLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4cGF0LTIuMC4xL3htbHdmL3htbHdmLmMgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYTQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5jCkBAIC0wLDAgKzEsODU5IEBACisvKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgVGhhaSBPcGVuIFNvdXJjZSBTb2Z0d2FyZSBDZW50ZXIgTHRkCisgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJleHBhdC5oIgorI2luY2x1ZGUgImNvZGVwYWdlLmgiCisjaW5jbHVkZSAieG1sZmlsZS5oIgorI2luY2x1ZGUgInhtbHRjaGFyLmgiCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGNydGRiZy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fYW1pZ2Fvc19fKSAmJiBkZWZpbmVkKF9fVVNFX0lOTElORV9fKQorI2luY2x1ZGUgPHByb3RvL2V4cGF0Lmg+CisjZW5kaWYKKworLyogVGhpcyBlbnN1cmVzIHByb3BlciBzb3J0aW5nLiAqLworCisjZGVmaW5lIE5TU0VQIFQoJ1wwMDEnKQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitjaGFyYWN0ZXJEYXRhKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKK3sKKyAgRklMRSAqZnAgPSAoRklMRSAqKXVzZXJEYXRhOworICBmb3IgKDsgbGVuID4gMDsgLS1sZW4sICsrcykgeworICAgIHN3aXRjaCAoKnMpIHsKKyAgICBjYXNlIFQoJyYnKToKKyAgICAgIGZwdXR0cyhUKCImYW1wOyIpLCBmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJzwnKToKKyAgICAgIGZwdXR0cyhUKCImbHQ7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnPicpOgorICAgICAgZnB1dHRzKFQoIiZndDsiKSwgZnApOworICAgICAgYnJlYWs7CisjaWZkZWYgVzNDMTROCisgICAgY2FzZSAxMzoKKyAgICAgIGZwdXR0cyhUKCImI3hEOyIpLCBmcCk7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgY2FzZSBUKCciJyk6CisgICAgICBmcHV0dHMoVCgiJnF1b3Q7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTM6CisgICAgICBmdHByaW50ZihmcCwgVCgiJiMlZDsiKSwgKnMpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcHV0dGMoKnMsIGZwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorYXR0cmlidXRlVmFsdWUoRklMRSAqZnAsIGNvbnN0IFhNTF9DaGFyICpzKQoreworICBwdXR0YyhUKCc9JyksIGZwKTsKKyAgcHV0dGMoVCgnIicpLCBmcCk7CisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKCpzKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgTlNTRVA6CisgICAgICBwdXR0YyhUKCciJyksIGZwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFQoJyYnKToKKyAgICAgIGZwdXR0cyhUKCImYW1wOyIpLCBmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJzwnKToKKyAgICAgIGZwdXR0cyhUKCImbHQ7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnIicpOgorICAgICAgZnB1dHRzKFQoIiZxdW90OyIpLCBmcCk7CisgICAgICBicmVhazsKKyNpZmRlZiBXM0MxNE4KKyAgICBjYXNlIDk6CisgICAgICBmcHV0dHMoVCgiJiN4OTsiKSwgZnApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGZwdXR0cyhUKCImI3hBOyIpLCBmcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEzOgorICAgICAgZnB1dHRzKFQoIiYjeEQ7IiksIGZwKTsKKyAgICAgIGJyZWFrOworI2Vsc2UKKyAgICBjYXNlIFQoJz4nKToKKyAgICAgIGZwdXR0cyhUKCImZ3Q7IiksIGZwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTM6CisgICAgICBmdHByaW50ZihmcCwgVCgiJiMlZDsiKSwgKnMpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgcHV0dGMoKnMsIGZwKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzKys7CisgIH0KK30KKworLyogTGV4aWNvZ3JhcGhpY2FsbHkgY29tcGFyaW5nIFVURi04IGVuY29kZWQgYXR0cmlidXRlIHZhbHVlcywKK2lzIGVxdWl2YWxlbnQgdG8gbGV4aWNvZ3JhcGhpY2FsbHkgY29tcGFyaW5nIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXIgbnVtYmVyLiAqLworCitzdGF0aWMgaW50CithdHRjbXAoY29uc3Qgdm9pZCAqYXR0MSwgY29uc3Qgdm9pZCAqYXR0MikKK3sKKyAgcmV0dXJuIHRjc2NtcCgqKGNvbnN0IFhNTF9DaGFyICoqKWF0dDEsICooY29uc3QgWE1MX0NoYXIgKiopYXR0Mik7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK3N0YXJ0RWxlbWVudCh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3sKKyAgaW50IG5BdHRzOworICBjb25zdCBYTUxfQ2hhciAqKnA7CisgIEZJTEUgKmZwID0gKEZJTEUgKil1c2VyRGF0YTsKKyAgcHV0dGMoVCgnPCcpLCBmcCk7CisgIGZwdXR0cyhuYW1lLCBmcCk7CisKKyAgcCA9IGF0dHM7CisgIHdoaWxlICgqcCkKKyAgICArK3A7CisgIG5BdHRzID0gKGludCkoKHAgLSBhdHRzKSA+PiAxKTsKKyAgaWYgKG5BdHRzID4gMSkKKyAgICBxc29ydCgodm9pZCAqKWF0dHMsIG5BdHRzLCBzaXplb2YoWE1MX0NoYXIgKikgKiAyLCBhdHRjbXApOworICB3aGlsZSAoKmF0dHMpIHsKKyAgICBwdXR0YyhUKCcgJyksIGZwKTsKKyAgICBmcHV0dHMoKmF0dHMrKywgZnApOworICAgIGF0dHJpYnV0ZVZhbHVlKGZwLCAqYXR0cyk7CisgICAgYXR0cysrOworICB9CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitlbmRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKKyAgRklMRSAqZnAgPSAoRklMRSAqKXVzZXJEYXRhOworICBwdXR0YyhUKCc8JyksIGZwKTsKKyAgcHV0dGMoVCgnLycpLCBmcCk7CisgIGZwdXR0cyhuYW1lLCBmcCk7CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCitzdGF0aWMgaW50Cituc2F0dGNtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisgIGNvbnN0IFhNTF9DaGFyICphdHQxID0gKihjb25zdCBYTUxfQ2hhciAqKilwMTsKKyAgY29uc3QgWE1MX0NoYXIgKmF0dDIgPSAqKGNvbnN0IFhNTF9DaGFyICoqKXAyOworICBpbnQgc2VwMSA9ICh0Y3NyY2hyKGF0dDEsIE5TU0VQKSAhPSAwKTsKKyAgaW50IHNlcDIgPSAodGNzcmNocihhdHQxLCBOU1NFUCkgIT0gMCk7CisgIGlmIChzZXAxICE9IHNlcDIpCisgICAgcmV0dXJuIHNlcDEgLSBzZXAyOworICByZXR1cm4gdGNzY21wKGF0dDEsIGF0dDIpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitzdGFydEVsZW1lbnROUyh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3sKKyAgaW50IG5BdHRzOworICBpbnQgbnNpOworICBjb25zdCBYTUxfQ2hhciAqKnA7CisgIEZJTEUgKmZwID0gKEZJTEUgKil1c2VyRGF0YTsKKyAgY29uc3QgWE1MX0NoYXIgKnNlcDsKKyAgcHV0dGMoVCgnPCcpLCBmcCk7CisKKyAgc2VwID0gdGNzcmNocihuYW1lLCBOU1NFUCk7CisgIGlmIChzZXApIHsKKyAgICBmcHV0dHMoVCgibjE6IiksIGZwKTsKKyAgICBmcHV0dHMoc2VwICsgMSwgZnApOworICAgIGZwdXR0cyhUKCIgeG1sbnM6bjEiKSwgZnApOworICAgIGF0dHJpYnV0ZVZhbHVlKGZwLCBuYW1lKTsKKyAgICBuc2kgPSAyOworICB9CisgIGVsc2UgeworICAgIGZwdXR0cyhuYW1lLCBmcCk7CisgICAgbnNpID0gMTsKKyAgfQorCisgIHAgPSBhdHRzOworICB3aGlsZSAoKnApCisgICAgKytwOworICBuQXR0cyA9IChpbnQpKChwIC0gYXR0cykgPj4gMSk7CisgIGlmIChuQXR0cyA+IDEpCisgICAgcXNvcnQoKHZvaWQgKilhdHRzLCBuQXR0cywgc2l6ZW9mKFhNTF9DaGFyICopICogMiwgbnNhdHRjbXApOworICB3aGlsZSAoKmF0dHMpIHsKKyAgICBuYW1lID0gKmF0dHMrKzsKKyAgICBzZXAgPSB0Y3NyY2hyKG5hbWUsIE5TU0VQKTsKKyAgICBwdXR0YyhUKCcgJyksIGZwKTsKKyAgICBpZiAoc2VwKSB7CisgICAgICBmdHByaW50ZihmcCwgVCgibiVkOiIpLCBuc2kpOworICAgICAgZnB1dHRzKHNlcCArIDEsIGZwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgZnB1dHRzKG5hbWUsIGZwKTsKKyAgICBhdHRyaWJ1dGVWYWx1ZShmcCwgKmF0dHMpOworICAgIGlmIChzZXApIHsKKyAgICAgIGZ0cHJpbnRmKGZwLCBUKCIgeG1sbnM6biVkIiksIG5zaSsrKTsKKyAgICAgIGF0dHJpYnV0ZVZhbHVlKGZwLCBuYW1lKTsKKyAgICB9CisgICAgYXR0cysrOworICB9CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitlbmRFbGVtZW50TlModm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQoreworICBGSUxFICpmcCA9IChGSUxFICopdXNlckRhdGE7CisgIGNvbnN0IFhNTF9DaGFyICpzZXA7CisgIHB1dHRjKFQoJzwnKSwgZnApOworICBwdXR0YyhUKCcvJyksIGZwKTsKKyAgc2VwID0gdGNzcmNocihuYW1lLCBOU1NFUCk7CisgIGlmIChzZXApIHsKKyAgICBmcHV0dHMoVCgibjE6IiksIGZwKTsKKyAgICBmcHV0dHMoc2VwICsgMSwgZnApOworICB9CisgIGVsc2UKKyAgICBmcHV0dHMobmFtZSwgZnApOworICBwdXR0YyhUKCc+JyksIGZwKTsKK30KKworI2lmbmRlZiBXM0MxNE4KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorcHJvY2Vzc2luZ0luc3RydWN0aW9uKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKQoreworICBGSUxFICpmcCA9IChGSUxFICopdXNlckRhdGE7CisgIHB1dHRjKFQoJzwnKSwgZnApOworICBwdXR0YyhUKCc/JyksIGZwKTsKKyAgZnB1dHRzKHRhcmdldCwgZnApOworICBwdXR0YyhUKCcgJyksIGZwKTsKKyAgZnB1dHRzKGRhdGEsIGZwKTsKKyAgcHV0dGMoVCgnPycpLCBmcCk7CisgIHB1dHRjKFQoJz4nKSwgZnApOworfQorCisjZW5kaWYgLyogbm90IFczQzE0TiAqLworCitzdGF0aWMgdm9pZCBYTUxDQUxMCitkZWZhdWx0Q2hhcmFjdGVyRGF0YSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCit7CisgIFhNTF9EZWZhdWx0Q3VycmVudCgoWE1MX1BhcnNlcikgdXNlckRhdGEpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitkZWZhdWx0U3RhcnRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworICBYTUxfRGVmYXVsdEN1cnJlbnQoKFhNTF9QYXJzZXIpIHVzZXJEYXRhKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZGVmYXVsdEVuZEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQoreworICBYTUxfRGVmYXVsdEN1cnJlbnQoKFhNTF9QYXJzZXIpIHVzZXJEYXRhKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorZGVmYXVsdFByb2Nlc3NpbmdJbnN0cnVjdGlvbih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRhdGEpCit7CisgIFhNTF9EZWZhdWx0Q3VycmVudCgoWE1MX1BhcnNlcikgdXNlckRhdGEpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitub3BDaGFyYWN0ZXJEYXRhKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKK3sKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbm9wU3RhcnRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwgY29uc3QgWE1MX0NoYXIgKiphdHRzKQoreworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCitub3BFbmRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSkKK3sKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbm9wUHJvY2Vzc2luZ0luc3RydWN0aW9uKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpkYXRhKQoreworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittYXJrdXAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKChYTUxfUGFyc2VyKSB1c2VyRGF0YSk7CisgIGZvciAoOyBsZW4gPiAwOyAtLWxlbiwgKytzKQorICAgIHB1dHRjKCpzLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkCittZXRhTG9jYXRpb24oWE1MX1BhcnNlciBwYXJzZXIpCit7CisgIGNvbnN0IFhNTF9DaGFyICp1cmkgPSBYTUxfR2V0QmFzZShwYXJzZXIpOworICBpZiAodXJpKQorICAgIGZ0cHJpbnRmKChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlciksIFQoIiB1cmk9XCIlc1wiIiksIHVyaSk7CisgIGZ0cHJpbnRmKChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlciksCisgICAgICAgICAgIFQoIiBieXRlPVwiJSIgWE1MX0ZNVF9JTlRfTU9EICJkXCIgbmJ5dGVzPVwiJWRcIiBcCisJCQkgbGluZT1cIiUiIFhNTF9GTVRfSU5UX01PRCAidVwiIGNvbD1cIiUiIFhNTF9GTVRfSU5UX01PRCAidVwiIiksCisgICAgICAgICAgIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KHBhcnNlciksCisgICAgICAgICAgIFhNTF9HZXRDdXJyZW50Qnl0ZUNvdW50KHBhcnNlciksCisgICAgICAgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihwYXJzZXIpLAorICAgICAgICAgICBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihwYXJzZXIpKTsKK30KKworc3RhdGljIHZvaWQKK21ldGFTdGFydERvY3VtZW50KHZvaWQgKnVzZXJEYXRhKQoreworICBmcHV0dHMoVCgiPGRvY3VtZW50PlxuIiksIChGSUxFICopWE1MX0dldFVzZXJEYXRhKChYTUxfUGFyc2VyKSB1c2VyRGF0YSkpOworfQorCitzdGF0aWMgdm9pZAorbWV0YUVuZERvY3VtZW50KHZvaWQgKnVzZXJEYXRhKQoreworICBmcHV0dHMoVCgiPC9kb2N1bWVudD5cbiIpLCAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YSgoWE1MX1BhcnNlcikgdXNlckRhdGEpKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YVN0YXJ0RWxlbWVudCh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICoqYXR0cykKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSAoWE1MX1BhcnNlcikgdXNlckRhdGE7CisgIEZJTEUgKmZwID0gKEZJTEUgKilYTUxfR2V0VXNlckRhdGEocGFyc2VyKTsKKyAgY29uc3QgWE1MX0NoYXIgKipzcGVjaWZpZWRBdHRzRW5kCisgICAgPSBhdHRzICsgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KHBhcnNlcik7CisgIGNvbnN0IFhNTF9DaGFyICoqaWRBdHRQdHI7CisgIGludCBpZEF0dEluZGV4ID0gWE1MX0dldElkQXR0cmlidXRlSW5kZXgocGFyc2VyKTsKKyAgaWYgKGlkQXR0SW5kZXggPCAwKQorICAgIGlkQXR0UHRyID0gMDsKKyAgZWxzZQorICAgIGlkQXR0UHRyID0gYXR0cyArIGlkQXR0SW5kZXg7CisgICAgCisgIGZ0cHJpbnRmKGZwLCBUKCI8c3RhcnR0YWcgbmFtZT1cIiVzXCIiKSwgbmFtZSk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBpZiAoKmF0dHMpIHsKKyAgICBmcHV0dHMoVCgiPlxuIiksIGZwKTsKKyAgICBkbyB7CisgICAgICBmdHByaW50ZihmcCwgVCgiPGF0dHJpYnV0ZSBuYW1lPVwiJXNcIiB2YWx1ZT1cIiIpLCBhdHRzWzBdKTsKKyAgICAgIGNoYXJhY3RlckRhdGEoZnAsIGF0dHNbMV0sIChpbnQpdGNzbGVuKGF0dHNbMV0pKTsKKyAgICAgIGlmIChhdHRzID49IHNwZWNpZmllZEF0dHNFbmQpCisgICAgICAgIGZwdXR0cyhUKCJcIiBkZWZhdWx0ZWQ9XCJ5ZXNcIi8+XG4iKSwgZnApOworICAgICAgZWxzZSBpZiAoYXR0cyA9PSBpZEF0dFB0cikKKyAgICAgICAgZnB1dHRzKFQoIlwiIGlkPVwieWVzXCIvPlxuIiksIGZwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnB1dHRzKFQoIlwiLz5cbiIpLCBmcCk7CisgICAgfSB3aGlsZSAoKihhdHRzICs9IDIpKTsKKyAgICBmcHV0dHMoVCgiPC9zdGFydHRhZz5cbiIpLCBmcCk7CisgIH0KKyAgZWxzZQorICAgIGZwdXR0cyhUKCIvPlxuIiksIGZwKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YUVuZEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSB1c2VyRGF0YTsKKyAgRklMRSAqZnAgPSAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICBmdHByaW50ZihmcCwgVCgiPGVuZHRhZyBuYW1lPVwiJXNcIiIpLCBuYW1lKTsKKyAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgIGZwdXR0cyhUKCIvPlxuIiksIGZwKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YVByb2Nlc3NpbmdJbnN0cnVjdGlvbih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRhdGEpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZ0cHJpbnRmKGZwLCBUKCI8cGkgdGFyZ2V0PVwiJXNcIiBkYXRhPVwiIiksIHRhcmdldCk7CisgIGNoYXJhY3RlckRhdGEoZnAsIGRhdGEsIChpbnQpdGNzbGVuKGRhdGEpKTsKKyAgcHV0dGMoVCgnIicpLCBmcCk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFDb21tZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSkKK3sKKyAgWE1MX1BhcnNlciBwYXJzZXIgPSAoWE1MX1BhcnNlcikgdXNlckRhdGE7CisgIEZJTEUgKmZwID0gKEZJTEUgKilYTUxfR2V0VXNlckRhdGEocGFyc2VyKTsKKyAgZnB1dHRzKFQoIjxjb21tZW50IGRhdGE9XCIiKSwgZnApOworICBjaGFyYWN0ZXJEYXRhKGZwLCBkYXRhLCAoaW50KXRjc2xlbihkYXRhKSk7CisgIHB1dHRjKFQoJyInKSwgZnApOworICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittZXRhU3RhcnRDZGF0YVNlY3Rpb24odm9pZCAqdXNlckRhdGEpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8c3RhcnRjZGF0YSIpLCBmcCk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFFbmRDZGF0YVNlY3Rpb24odm9pZCAqdXNlckRhdGEpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8ZW5kY2RhdGEiKSwgZnApOworICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittZXRhQ2hhcmFjdGVyRGF0YSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8Y2hhcnMgc3RyPVwiIiksIGZwKTsKKyAgY2hhcmFjdGVyRGF0YShmcCwgcywgbGVuKTsKKyAgcHV0dGMoVCgnIicpLCBmcCk7CisgIG1ldGFMb2NhdGlvbihwYXJzZXIpOworICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFTdGFydERvY3R5cGVEZWNsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmRvY3R5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c2lkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmlkLAorICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19pbnRlcm5hbF9zdWJzZXQpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZ0cHJpbnRmKGZwLCBUKCI8c3RhcnRkb2N0eXBlIG5hbWU9XCIlc1wiIiksIGRvY3R5cGVOYW1lKTsKKyAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgIGZwdXR0cyhUKCIvPlxuIiksIGZwKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTAorbWV0YUVuZERvY3R5cGVEZWNsKHZvaWQgKnVzZXJEYXRhKQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSB1c2VyRGF0YTsKKyAgRklMRSAqZnAgPSAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICBmcHV0dHMoVCgiPGVuZGRvY3R5cGUiKSwgZnApOworICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMCittZXRhTm90YXRpb25EZWNsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZ0cHJpbnRmKGZwLCBUKCI8bm90YXRpb24gbmFtZT1cIiVzXCIiKSwgbm90YXRpb25OYW1lKTsKKyAgaWYgKHB1YmxpY0lkKQorICAgIGZ0cHJpbnRmKGZwLCBUKCIgcHVibGljPVwiJXNcIiIpLCBwdWJsaWNJZCk7CisgIGlmIChzeXN0ZW1JZCkgeworICAgIGZwdXR0cyhUKCIgc3lzdGVtPVwiIiksIGZwKTsKKyAgICBjaGFyYWN0ZXJEYXRhKGZwLCBzeXN0ZW1JZCwgKGludCl0Y3NsZW4oc3lzdGVtSWQpKTsKKyAgICBwdXR0YyhUKCciJyksIGZwKTsKKyAgfQorICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworfQorCisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFFbnRpdHlEZWNsKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmVudGl0eU5hbWUsCisgICAgICAgICAgICAgICBpbnQgIGlzX3BhcmFtLAorICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnZhbHVlLAorICAgICAgICAgICAgICAgaW50ICB2YWx1ZV9sZW5ndGgsCisgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCwKKyAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpub3RhdGlvbk5hbWUpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisKKyAgaWYgKHZhbHVlKSB7CisgICAgZnRwcmludGYoZnAsIFQoIjxlbnRpdHkgbmFtZT1cIiVzXCIiKSwgZW50aXR5TmFtZSk7CisgICAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgICAgcHV0dGMoVCgnPicpLCBmcCk7CisgICAgY2hhcmFjdGVyRGF0YShmcCwgdmFsdWUsIHZhbHVlX2xlbmd0aCk7CisgICAgZnB1dHRzKFQoIjwvZW50aXR5Lz5cbiIpLCBmcCk7CisgIH0KKyAgZWxzZSBpZiAobm90YXRpb25OYW1lKSB7CisgICAgZnRwcmludGYoZnAsIFQoIjxlbnRpdHkgbmFtZT1cIiVzXCIiKSwgZW50aXR5TmFtZSk7CisgICAgaWYgKHB1YmxpY0lkKQorICAgICAgZnRwcmludGYoZnAsIFQoIiBwdWJsaWM9XCIlc1wiIiksIHB1YmxpY0lkKTsKKyAgICBmcHV0dHMoVCgiIHN5c3RlbT1cIiIpLCBmcCk7CisgICAgY2hhcmFjdGVyRGF0YShmcCwgc3lzdGVtSWQsIChpbnQpdGNzbGVuKHN5c3RlbUlkKSk7CisgICAgcHV0dGMoVCgnIicpLCBmcCk7CisgICAgZnRwcmludGYoZnAsIFQoIiBub3RhdGlvbj1cIiVzXCIiKSwgbm90YXRpb25OYW1lKTsKKyAgICBtZXRhTG9jYXRpb24ocGFyc2VyKTsKKyAgICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7CisgIH0KKyAgZWxzZSB7CisgICAgZnRwcmludGYoZnAsIFQoIjxlbnRpdHkgbmFtZT1cIiVzXCIiKSwgZW50aXR5TmFtZSk7CisgICAgaWYgKHB1YmxpY0lkKQorICAgICAgZnRwcmludGYoZnAsIFQoIiBwdWJsaWM9XCIlc1wiIiksIHB1YmxpY0lkKTsKKyAgICBmcHV0dHMoVCgiIHN5c3RlbT1cIiIpLCBmcCk7CisgICAgY2hhcmFjdGVyRGF0YShmcCwgc3lzdGVtSWQsIChpbnQpdGNzbGVuKHN5c3RlbUlkKSk7CisgICAgcHV0dGMoVCgnIicpLCBmcCk7CisgICAgbWV0YUxvY2F0aW9uKHBhcnNlcik7CisgICAgZnB1dHRzKFQoIi8+XG4iKSwgZnApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFTdGFydE5hbWVzcGFjZURlY2wodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICp1cmkpCit7CisgIFhNTF9QYXJzZXIgcGFyc2VyID0gKFhNTF9QYXJzZXIpIHVzZXJEYXRhOworICBGSUxFICpmcCA9IChGSUxFICopWE1MX0dldFVzZXJEYXRhKHBhcnNlcik7CisgIGZwdXR0cyhUKCI8c3RhcnRucyIpLCBmcCk7CisgIGlmIChwcmVmaXgpCisgICAgZnRwcmludGYoZnAsIFQoIiBwcmVmaXg9XCIlc1wiIiksIHByZWZpeCk7CisgIGlmICh1cmkpIHsKKyAgICBmcHV0dHMoVCgiIG5zPVwiIiksIGZwKTsKKyAgICBjaGFyYWN0ZXJEYXRhKGZwLCB1cmksIChpbnQpdGNzbGVuKHVyaSkpOworICAgIGZwdXR0cyhUKCJcIi8+XG4iKSwgZnApOworICB9CisgIGVsc2UKKyAgICBmcHV0dHMoVCgiLz5cbiIpLCBmcCk7Cit9CisKK3N0YXRpYyB2b2lkIFhNTENBTEwKK21ldGFFbmROYW1lc3BhY2VEZWNsKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcHJlZml4KQoreworICBYTUxfUGFyc2VyIHBhcnNlciA9IChYTUxfUGFyc2VyKSB1c2VyRGF0YTsKKyAgRklMRSAqZnAgPSAoRklMRSAqKVhNTF9HZXRVc2VyRGF0YShwYXJzZXIpOworICBpZiAoIXByZWZpeCkKKyAgICBmcHV0dHMoVCgiPGVuZG5zLz5cbiIpLCBmcCk7CisgIGVsc2UKKyAgICBmdHByaW50ZihmcCwgVCgiPGVuZG5zIHByZWZpeD1cIiVzXCIvPlxuIiksIHByZWZpeCk7Cit9CisKK3N0YXRpYyBpbnQgWE1MQ0FMTAordW5rbm93bkVuY29kaW5nQ29udmVydCh2b2lkICpkYXRhLCBjb25zdCBjaGFyICpwKQoreworICByZXR1cm4gY29kZXBhZ2VDb252ZXJ0KCooaW50ICopZGF0YSwgcCk7Cit9CisKK3N0YXRpYyBpbnQgWE1MQ0FMTAordW5rbm93bkVuY29kaW5nKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwgWE1MX0VuY29kaW5nICppbmZvKQoreworICBpbnQgY3A7CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciBwcmVmaXhMW10gPSBUKCJ3aW5kb3dzLSIpOworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgcHJlZml4VVtdID0gVCgiV0lORE9XUy0iKTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgcHJlZml4VVtpXTsgaSsrKQorICAgIGlmIChuYW1lW2ldICE9IHByZWZpeFVbaV0gJiYgbmFtZVtpXSAhPSBwcmVmaXhMW2ldKQorICAgICAgcmV0dXJuIDA7CisgIAorICBjcCA9IDA7CisgIGZvciAoOyBuYW1lW2ldOyBpKyspIHsKKyAgICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgZGlnaXRzW10gPSBUKCIwMTIzNDU2Nzg5Iik7CisgICAgY29uc3QgWE1MX0NoYXIgKnMgPSB0Y3NjaHIoZGlnaXRzLCBuYW1lW2ldKTsKKyAgICBpZiAoIXMpCisgICAgICByZXR1cm4gMDsKKyAgICBjcCAqPSAxMDsKKyAgICBjcCArPSAoaW50KShzIC0gZGlnaXRzKTsKKyAgICBpZiAoY3AgPj0gMHgxMDAwMCkKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmICghY29kZXBhZ2VNYXAoY3AsIGluZm8tPm1hcCkpCisgICAgcmV0dXJuIDA7CisgIGluZm8tPmNvbnZlcnQgPSB1bmtub3duRW5jb2RpbmdDb252ZXJ0OworICAvKiBXZSBjb3VsZCBqdXN0IGNhc3QgdGhlIGNvZGUgcGFnZSBpbnRlZ2VyIHRvIGEgdm9pZCAqLAorICBhbmQgYXZvaWQgdGhlIHVzZSBvZiByZWxlYXNlLiAqLworICBpbmZvLT5yZWxlYXNlID0gZnJlZTsKKyAgaW5mby0+ZGF0YSA9IG1hbGxvYyhzaXplb2YoaW50KSk7CisgIGlmICghaW5mby0+ZGF0YSkKKyAgICByZXR1cm4gMDsKKyAgKihpbnQgKilpbmZvLT5kYXRhID0gY3A7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFhNTENBTEwKK25vdFN0YW5kYWxvbmUodm9pZCAqdXNlckRhdGEpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2hvd1ZlcnNpb24oWE1MX0NoYXIgKnByb2cpCit7CisgIFhNTF9DaGFyICpzID0gcHJvZzsKKyAgWE1MX0NoYXIgY2g7CisgIGNvbnN0IFhNTF9GZWF0dXJlICpmZWF0dXJlcyA9IFhNTF9HZXRGZWF0dXJlTGlzdCgpOworICB3aGlsZSAoKGNoID0gKnMpICE9IDApIHsKKyAgICBpZiAoY2ggPT0gJy8nCisjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XQVRDT01DX18pKQorICAgICAgICB8fCBjaCA9PSAnXFwnCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgcHJvZyA9IHMgKyAxOworICAgICsrczsKKyAgfQorICBmdHByaW50ZihzdGRvdXQsIFQoIiVzIHVzaW5nICVzXG4iKSwgcHJvZywgWE1MX0V4cGF0VmVyc2lvbigpKTsKKyAgaWYgKGZlYXR1cmVzICE9IE5VTEwgJiYgZmVhdHVyZXNbMF0uZmVhdHVyZSAhPSBYTUxfRkVBVFVSRV9FTkQpIHsKKyAgICBpbnQgaSA9IDE7CisgICAgZnRwcmludGYoc3Rkb3V0LCBUKCIlcyIpLCBmZWF0dXJlc1swXS5uYW1lKTsKKyAgICBpZiAoZmVhdHVyZXNbMF0udmFsdWUpCisgICAgICBmdHByaW50ZihzdGRvdXQsIFQoIj0lbGQiKSwgZmVhdHVyZXNbMF0udmFsdWUpOworICAgIHdoaWxlIChmZWF0dXJlc1tpXS5mZWF0dXJlICE9IFhNTF9GRUFUVVJFX0VORCkgeworICAgICAgZnRwcmludGYoc3Rkb3V0LCBUKCIsICVzIiksIGZlYXR1cmVzW2ldLm5hbWUpOworICAgICAgaWYgKGZlYXR1cmVzW2ldLnZhbHVlKQorICAgICAgICBmdHByaW50ZihzdGRvdXQsIFQoIj0lbGQiKSwgZmVhdHVyZXNbaV0udmFsdWUpOworICAgICAgKytpOworICAgIH0KKyAgICBmdHByaW50ZihzdGRvdXQsIFQoIlxuIikpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZShjb25zdCBYTUxfQ2hhciAqcHJvZywgaW50IHJjKQoreworICBmdHByaW50ZihzdGRlcnIsCisgICAgICAgICAgIFQoInVzYWdlOiAlcyBbLW5dIFstcF0gWy1yXSBbLXNdIFstd10gWy14XSBbLWQgb3V0cHV0LWRpcl0gIgorICAgICAgICAgICAgICJbLWUgZW5jb2RpbmddIGZpbGUgLi4uXG4iKSwgcHJvZyk7CisgIGV4aXQocmMpOworfQorCitpbnQKK3RtYWluKGludCBhcmdjLCBYTUxfQ2hhciAqKmFyZ3YpCit7CisgIGludCBpLCBqOworICBjb25zdCBYTUxfQ2hhciAqb3V0cHV0RGlyID0gTlVMTDsKKyAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nID0gTlVMTDsKKyAgdW5zaWduZWQgcHJvY2Vzc0ZsYWdzID0gWE1MX01BUF9GSUxFOworICBpbnQgd2luZG93c0NvZGVQYWdlcyA9IDA7CisgIGludCBvdXRwdXRUeXBlID0gMDsKKyAgaW50IHVzZU5hbWVzcGFjZXMgPSAwOworICBpbnQgcmVxdWlyZVN0YW5kYWxvbmUgPSAwOworICBlbnVtIFhNTF9QYXJhbUVudGl0eVBhcnNpbmcgcGFyYW1FbnRpdHlQYXJzaW5nID0gCisgICAgWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX05FVkVSOworICBpbnQgdXNlU3RkaW4gPSAwOworCisjaWZkZWYgX01TQ19WRVIKKyAgX0NydFNldERiZ0ZsYWcoX0NSVERCR19BTExPQ19NRU1fREZ8X0NSVERCR19MRUFLX0NIRUNLX0RGKTsKKyNlbmRpZgorCisgIGkgPSAxOworICBqID0gMDsKKyAgd2hpbGUgKGkgPCBhcmdjKSB7CisgICAgaWYgKGogPT0gMCkgeworICAgICAgaWYgKGFyZ3ZbaV1bMF0gIT0gVCgnLScpKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChhcmd2W2ldWzFdID09IFQoJy0nKSAmJiBhcmd2W2ldWzJdID09IFQoJ1wwJykpIHsKKyAgICAgICAgaSsrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGorKzsKKyAgICB9CisgICAgc3dpdGNoIChhcmd2W2ldW2pdKSB7CisgICAgY2FzZSBUKCdyJyk6CisgICAgICBwcm9jZXNzRmxhZ3MgJj0gflhNTF9NQVBfRklMRTsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgncycpOgorICAgICAgcmVxdWlyZVN0YW5kYWxvbmUgPSAxOworICAgICAgaisrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUKCduJyk6CisgICAgICB1c2VOYW1lc3BhY2VzID0gMTsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgncCcpOgorICAgICAgcGFyYW1FbnRpdHlQYXJzaW5nID0gWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUzsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgVCgneCcpOgorICAgICAgcHJvY2Vzc0ZsYWdzIHw9IFhNTF9FWFRFUk5BTF9FTlRJVElFUzsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgndycpOgorICAgICAgd2luZG93c0NvZGVQYWdlcyA9IDE7CisgICAgICBqKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJ20nKToKKyAgICAgIG91dHB1dFR5cGUgPSAnbSc7CisgICAgICBqKys7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJ2MnKToKKyAgICAgIG91dHB1dFR5cGUgPSAnYyc7CisgICAgICB1c2VOYW1lc3BhY2VzID0gMDsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgndCcpOgorICAgICAgb3V0cHV0VHlwZSA9ICd0JzsKKyAgICAgIGorKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnZCcpOgorICAgICAgaWYgKGFyZ3ZbaV1baiArIDFdID09IFQoJ1wwJykpIHsKKyAgICAgICAgaWYgKCsraSA9PSBhcmdjKQorICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0sIDIpOworICAgICAgICBvdXRwdXREaXIgPSBhcmd2W2ldOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBvdXRwdXREaXIgPSBhcmd2W2ldICsgaiArIDE7CisgICAgICBpKys7CisgICAgICBqID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVCgnZScpOgorICAgICAgaWYgKGFyZ3ZbaV1baiArIDFdID09IFQoJ1wwJykpIHsKKyAgICAgICAgaWYgKCsraSA9PSBhcmdjKQorICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0sIDIpOworICAgICAgICBlbmNvZGluZyA9IGFyZ3ZbaV07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGVuY29kaW5nID0gYXJndltpXSArIGogKyAxOworICAgICAgaSsrOworICAgICAgaiA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFQoJ2gnKToKKyAgICAgIHVzYWdlKGFyZ3ZbMF0sIDApOworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUKCd2Jyk6CisgICAgICBzaG93VmVyc2lvbihhcmd2WzBdKTsKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgVCgnXDAnKToKKyAgICAgIGlmIChqID4gMSkgeworICAgICAgICBpKys7CisgICAgICAgIGogPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICB1c2FnZShhcmd2WzBdLCAyKTsKKyAgICB9CisgIH0KKyAgaWYgKGkgPT0gYXJnYykgeworICAgIHVzZVN0ZGluID0gMTsKKyAgICBwcm9jZXNzRmxhZ3MgJj0gflhNTF9NQVBfRklMRTsKKyAgICBpLS07CisgIH0KKyAgZm9yICg7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBGSUxFICpmcCA9IDA7CisgICAgWE1MX0NoYXIgKm91dE5hbWUgPSAwOworICAgIGludCByZXN1bHQ7CisgICAgWE1MX1BhcnNlciBwYXJzZXI7CisgICAgaWYgKHVzZU5hbWVzcGFjZXMpCisgICAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlTlMoZW5jb2RpbmcsIE5TU0VQKTsKKyAgICBlbHNlCisgICAgICBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKGVuY29kaW5nKTsKKyAgICBpZiAocmVxdWlyZVN0YW5kYWxvbmUpCisgICAgICBYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIocGFyc2VyLCBub3RTdGFuZGFsb25lKTsKKyAgICBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nKHBhcnNlciwgcGFyYW1FbnRpdHlQYXJzaW5nKTsKKyAgICBpZiAob3V0cHV0VHlwZSA9PSAndCcpIHsKKyAgICAgIC8qIFRoaXMgaXMgZm9yIGRvaW5nIHRpbWluZ3M7IHRoaXMgZ2l2ZXMgYSBtb3JlIHJlYWxpc3RpYyBlc3RpbWF0ZSBvZgorICAgICAgICAgdGhlIHBhcnNpbmcgdGltZS4gKi8KKyAgICAgIG91dHB1dERpciA9IDA7CisgICAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBub3BTdGFydEVsZW1lbnQsIG5vcEVuZEVsZW1lbnQpOworICAgICAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgbm9wQ2hhcmFjdGVyRGF0YSk7CisgICAgICBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihwYXJzZXIsIG5vcFByb2Nlc3NpbmdJbnN0cnVjdGlvbik7CisgICAgfQorICAgIGVsc2UgaWYgKG91dHB1dERpcikgeworICAgICAgY29uc3QgWE1MX0NoYXIgKiBkZWxpbSA9IFQoIi8iKTsKKyAgICAgIGNvbnN0IFhNTF9DaGFyICpmaWxlID0gdXNlU3RkaW4gPyBUKCJTVERJTiIpIDogYXJndltpXTsKKyAgICAgIGlmICghdXNlU3RkaW4pIHsKKyAgICAgICAgLyogSnVtcCBhZnRlciBsYXN0IChiYWNrKXNsYXNoICovCisgICAgICAgIGNvbnN0IFhNTF9DaGFyICogbGFzdERlbGltID0gdGNzcmNocihmaWxlLCBkZWxpbVswXSk7CisgICAgICAgIGlmIChsYXN0RGVsaW0pCisgICAgICAgICAgZmlsZSA9IGxhc3REZWxpbSArIDE7CisjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XQVRDT01DX18pKQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqIHdpbkRlbGltID0gVCgiXFwiKTsKKyAgICAgICAgICBsYXN0RGVsaW0gPSB0Y3NyY2hyKGZpbGUsIHdpbkRlbGltWzBdKTsKKyAgICAgICAgICBpZiAobGFzdERlbGltKSB7CisgICAgICAgICAgICBmaWxlID0gbGFzdERlbGltICsgMTsKKyAgICAgICAgICAgIGRlbGltID0gd2luRGVsaW07CisgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIG91dE5hbWUgPSAoWE1MX0NoYXIgKiltYWxsb2MoKHRjc2xlbihvdXRwdXREaXIpICsgdGNzbGVuKGZpbGUpICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoWE1MX0NoYXIpKTsKKyAgICAgIHRjc2NweShvdXROYW1lLCBvdXRwdXREaXIpOworICAgICAgdGNzY2F0KG91dE5hbWUsIGRlbGltKTsKKyAgICAgIHRjc2NhdChvdXROYW1lLCBmaWxlKTsKKyAgICAgIGZwID0gdGZvcGVuKG91dE5hbWUsIFQoIndiIikpOworICAgICAgaWYgKCFmcCkgeworICAgICAgICB0cGVycm9yKG91dE5hbWUpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgICAgc2V0dmJ1ZihmcCwgTlVMTCwgX0lPRkJGLCAxNjM4NCk7CisjaWZkZWYgWE1MX1VOSUNPREUKKyAgICAgIHB1dHRjKDB4RkVGRiwgZnApOworI2VuZGlmCisgICAgICBYTUxfU2V0VXNlckRhdGEocGFyc2VyLCBmcCk7CisgICAgICBzd2l0Y2ggKG91dHB1dFR5cGUpIHsKKyAgICAgIGNhc2UgJ20nOgorICAgICAgICBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKHBhcnNlcik7CisgICAgICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIG1ldGFTdGFydEVsZW1lbnQsIG1ldGFFbmRFbGVtZW50KTsKKyAgICAgICAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLCBtZXRhUHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKKyAgICAgICAgWE1MX1NldENvbW1lbnRIYW5kbGVyKHBhcnNlciwgbWV0YUNvbW1lbnQpOworICAgICAgICBYTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihwYXJzZXIsIG1ldGFTdGFydENkYXRhU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUVuZENkYXRhU2VjdGlvbik7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIG1ldGFDaGFyYWN0ZXJEYXRhKTsKKyAgICAgICAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlcihwYXJzZXIsIG1ldGFTdGFydERvY3R5cGVEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFFbmREb2N0eXBlRGVjbCk7CisgICAgICAgIFhNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcihwYXJzZXIsIG1ldGFFbnRpdHlEZWNsKTsKKyAgICAgICAgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIocGFyc2VyLCBtZXRhTm90YXRpb25EZWNsKTsKKyAgICAgICAgWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKHBhcnNlciwgbWV0YVN0YXJ0TmFtZXNwYWNlRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFFbmROYW1lc3BhY2VEZWNsKTsKKyAgICAgICAgbWV0YVN0YXJ0RG9jdW1lbnQocGFyc2VyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJzoKKyAgICAgICAgWE1MX1VzZVBhcnNlckFzSGFuZGxlckFyZyhwYXJzZXIpOworICAgICAgICBYTUxfU2V0RGVmYXVsdEhhbmRsZXIocGFyc2VyLCBtYXJrdXApOworICAgICAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBkZWZhdWx0U3RhcnRFbGVtZW50LCBkZWZhdWx0RW5kRWxlbWVudCk7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGRlZmF1bHRDaGFyYWN0ZXJEYXRhKTsKKyAgICAgICAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAodXNlTmFtZXNwYWNlcykKKyAgICAgICAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBzdGFydEVsZW1lbnROUywgZW5kRWxlbWVudE5TKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHN0YXJ0RWxlbWVudCwgZW5kRWxlbWVudCk7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIGNoYXJhY3RlckRhdGEpOworI2lmbmRlZiBXM0MxNE4KKyAgICAgICAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIocGFyc2VyLCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pOworI2VuZGlmIC8qIG5vdCBXM0MxNE4gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICh3aW5kb3dzQ29kZVBhZ2VzKQorICAgICAgWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIocGFyc2VyLCB1bmtub3duRW5jb2RpbmcsIDApOworICAgIHJlc3VsdCA9IFhNTF9Qcm9jZXNzRmlsZShwYXJzZXIsIHVzZVN0ZGluID8gTlVMTCA6IGFyZ3ZbaV0sIHByb2Nlc3NGbGFncyk7CisgICAgaWYgKG91dHB1dERpcikgeworICAgICAgaWYgKG91dHB1dFR5cGUgPT0gJ20nKQorICAgICAgICBtZXRhRW5kRG9jdW1lbnQocGFyc2VyKTsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgdHJlbW92ZShvdXROYW1lKTsKKyAgICAgIGZyZWUob3V0TmFtZSk7CisgICAgfQorICAgIFhNTF9QYXJzZXJGcmVlKHBhcnNlcik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5kc3AgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3Zi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2JjZmY0MwotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LTIuMC4xL3htbHdmL3htbHdmLmRzcApAQCAtMCwwICsxLDEzOSBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJ4bWx3ZiIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPXhtbHdmIC0gV2luMzIgUmVsZWFzZQ0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAieG1sd2YubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgInhtbHdmLm1hayIgQ0ZHPSJ4bWx3ZiAtIFdpbjMyIFJlbGVhc2UiDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgInhtbHdmIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAieG1sd2YgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAieG1sd2YgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiLiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlx3aW4zMlxiaW5cUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cd2luMzJcdG1wXFJlbGVhc2UteG1sd2YiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiLiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MNCisjIEFERCBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0kgIi4uXGxpYiIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJDT01QSUxFRF9GUk9NX0RTUCIgL0ZEIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIgc2V0YXJndi5vYmoga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL3BkYjpub25lIC9tYWNoaW5lOkkzODYNCisjIFNVQlRSQUNUIExJTkszMiAvbm9kZWZhdWx0bGliDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInhtbHdmIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIi4iDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiLi5cd2luMzJcYmluXERlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlx3aW4zMlx0bXBcRGVidWcteG1sd2YiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiLiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HWCAvWkkgL09kIC9JICIuLlxsaWIiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiQ09NUElMRURfRlJPTV9EU1AiIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9GciAvWVgNCisjIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIHNldGFyZ3Yub2JqIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9wZGI6bm9uZSAvZGVidWcgL21hY2hpbmU6STM4Ng0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAieG1sd2YgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAieG1sd2YgLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0O2ZvcjtmOTAiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGNvZGVwYWdlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZWFkZmlsZW1hcC5jDQorIyBQUk9QIEV4Y2x1ZGVfRnJvbV9CdWlsZCAxDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cdW5peGZpbGVtYXAuYw0KKyMgUFJPUCBFeGNsdWRlX0Zyb21fQnVpbGQgMQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHdpbjMyZmlsZW1hcC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sZmlsZS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sd2YuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxjb2RlcGFnZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sZmlsZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ceG1sdGNoYXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiDQorIyBFbmQgR3JvdXANCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvZXhwYXQtMi4wLjEveG1sd2YveG1sd2luMzJ1cmwuY3h4IGIvZXhwYXQtMi4wLjEveG1sd2YveG1sd2luMzJ1cmwuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiZmNjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHBhdC0yLjAuMS94bWx3Zi94bWx3aW4zMnVybC5jeHgKQEAgLTAsMCArMSwzOTUgQEAKKyNpbmNsdWRlICJleHBhdC5oIgorI2lmZGVmIFhNTF9VTklDT0RFCisjZGVmaW5lIFVOSUNPREUKKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx1cmxtb24uaD4KKyNpbmNsdWRlIDx3aW5pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgInhtbHVybC5oIgorI2luY2x1ZGUgInhtbG1pbWUuaCIKKworc3RhdGljIGludAorcHJvY2Vzc1VSTChYTUxfUGFyc2VyIHBhcnNlciwgSU1vbmlrZXIgKmJhc2VNb25pa2VyLCBjb25zdCBYTUxfQ2hhciAqdXJsKTsKKwordHlwZWRlZiB2b2lkICgqU3RvcEhhbmRsZXIpKHZvaWQgKiwgSFJFU1VMVCk7CisKK2NsYXNzIENhbGxiYWNrIDogcHVibGljIElCaW5kU3RhdHVzQ2FsbGJhY2sgeworcHVibGljOgorICAvLyBJVW5rbm93biBtZXRob2RzCisgIFNURE1FVEhPRElNUCBRdWVyeUludGVyZmFjZShSRUZJSUQsdm9pZCAqKik7CisgIFNURE1FVEhPRElNUF8oVUxPTkcpIEFkZFJlZigpOworICBTVERNRVRIT0RJTVBfKFVMT05HKSBSZWxlYXNlKCk7CisgIC8vIElCaW5kU3RhdHVzQ2FsbGJhY2sgbWV0aG9kcworICBTVERNRVRIT0RJTVAgT25TdGFydEJpbmRpbmcoRFdPUkQsIElCaW5kaW5nICopOworICBTVERNRVRIT0RJTVAgR2V0UHJpb3JpdHkoTE9ORyAqKTsKKyAgU1RETUVUSE9ESU1QIE9uTG93UmVzb3VyY2UoRFdPUkQpOworICBTVERNRVRIT0RJTVAgT25Qcm9ncmVzcyhVTE9ORywgVUxPTkcsIFVMT05HLCBMUENXU1RSKTsKKyAgU1RETUVUSE9ESU1QIE9uU3RvcEJpbmRpbmcoSFJFU1VMVCwgTFBDV1NUUik7CisgIFNURE1FVEhPRElNUCBHZXRCaW5kSW5mbyhEV09SRCAqLCBCSU5ESU5GTyAqKTsKKyAgU1RETUVUSE9ESU1QIE9uRGF0YUF2YWlsYWJsZShEV09SRCwgRFdPUkQsIEZPUk1BVEVUQyAqLCBTVEdNRURJVU0gKik7CisgIFNURE1FVEhPRElNUCBPbk9iamVjdEF2YWlsYWJsZShSRUZJSUQsIElVbmtub3duICopOworICBDYWxsYmFjayhYTUxfUGFyc2VyLCBJTW9uaWtlciAqLCBTdG9wSGFuZGxlciwgdm9pZCAqKTsKKyAgfkNhbGxiYWNrKCk7CisgIGludCBleHRlcm5hbEVudGl0eVJlZihjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKTsKK3ByaXZhdGU6CisgIFhNTF9QYXJzZXIgcGFyc2VyXzsKKyAgSU1vbmlrZXIgKmJhc2VNb25pa2VyXzsKKyAgRFdPUkQgdG90YWxSZWFkXzsKKyAgVUxPTkcgcmVmXzsKKyAgSUJpbmRpbmcgKnBCaW5kaW5nXzsKKyAgU3RvcEhhbmRsZXIgc3RvcEhhbmRsZXJfOworICB2b2lkICpzdG9wQXJnXzsKK307CisKK1NURE1FVEhPRElNUF8oVUxPTkcpCitDYWxsYmFjazo6QWRkUmVmKCkKK3sgCisgIHJldHVybiByZWZfKys7Cit9CisKK1NURE1FVEhPRElNUF8oVUxPTkcpCitDYWxsYmFjazo6UmVsZWFzZSgpCit7IAorICBpZiAoLS1yZWZfID09IDApIHsKKyAgICBkZWxldGUgdGhpczsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcmVmXzsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHYpCit7IAorICBpZiAoSXNFcXVhbEdVSUQocmlpZCwgSUlEX0lVbmtub3duKSkKKyAgICAqcHB2ID0gKElVbmtub3duICopdGhpczsKKyAgZWxzZSBpZiAoSXNFcXVhbEdVSUQocmlpZCwgSUlEX0lCaW5kU3RhdHVzQ2FsbGJhY2spKQorICAgICpwcHYgPSAoSUJpbmRTdGF0dXNDYWxsYmFjayAqKXRoaXM7CisgIGVsc2UKKyAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKKyAgKChMUFVOS05PV04pKnBwdiktPkFkZFJlZigpOworICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6T25TdGFydEJpbmRpbmcoRFdPUkQsIElCaW5kaW5nKiBwQmluZGluZykKK3sKKyAgcEJpbmRpbmdfID0gcEJpbmRpbmc7CisgIHBCaW5kaW5nLT5BZGRSZWYoKTsKKyAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUAorQ2FsbGJhY2s6OkdldFByaW9yaXR5KExPTkcgKikKK3sKKyAgcmV0dXJuIEVfTk9USU1QTDsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6T25Mb3dSZXNvdXJjZShEV09SRCkKK3sKKyAgcmV0dXJuIEVfTk9USU1QTDsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6T25Qcm9ncmVzcyhVTE9ORywgVUxPTkcsIFVMT05HLCBMUENXU1RSKQoreworICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6T25TdG9wQmluZGluZyhIUkVTVUxUIGhyLCBMUENXU1RSIHN6RXJyb3IpCit7CisgIGlmIChwQmluZGluZ18pIHsKKyAgICBwQmluZGluZ18tPlJlbGVhc2UoKTsKKyAgICBwQmluZGluZ18gPSAwOworICB9CisgIGlmIChiYXNlTW9uaWtlcl8pIHsKKyAgICBiYXNlTW9uaWtlcl8tPlJlbGVhc2UoKTsKKyAgICBiYXNlTW9uaWtlcl8gPSAwOworICB9CisgIHN0b3BIYW5kbGVyXyhzdG9wQXJnXywgaHIpOworICByZXR1cm4gU19PSzsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6R2V0QmluZEluZm8oRFdPUkQqIHBncmZCSU5ERiwgQklORElORk8qIHBiaW5kaW5mbykKK3sKKyAgKnBncmZCSU5ERiA9IEJJTkRGX0FTWU5DSFJPTk9VUzsKKyAgcmV0dXJuIFNfT0s7Cit9CisKK3N0YXRpYyB2b2lkCityZXBvcnRFcnJvcihYTUxfUGFyc2VyIHBhcnNlcikKK3sKKyAgaW50IGNvZGUgPSBYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcik7CisgIGNvbnN0IFhNTF9DaGFyICptZXNzYWdlID0gWE1MX0Vycm9yU3RyaW5nKGNvZGUpOworICBpZiAobWVzc2FnZSkKKyAgICBfZnRwcmludGYoc3RkZXJyLCBfVCgiJXM6JWQ6JWxkOiAlc1xuIiksCisJICAgICBYTUxfR2V0QmFzZShwYXJzZXIpLAorCSAgICAgWE1MX0dldEVycm9yTGluZU51bWJlcihwYXJzZXIpLAorCSAgICAgWE1MX0dldEVycm9yQ29sdW1uTnVtYmVyKHBhcnNlciksCisJICAgICBtZXNzYWdlKTsKKyAgZWxzZQorICAgIF9mdHByaW50ZihzdGRlcnIsIF9UKCIlczogKHVua25vd24gbWVzc2FnZSAlZClcbiIpLAorICAgICAgICAgICAgICBYTUxfR2V0QmFzZShwYXJzZXIpLCBjb2RlKTsKK30KKworU1RETUVUSE9ESU1QCitDYWxsYmFjazo6T25EYXRhQXZhaWxhYmxlKERXT1JEIGdyZkJTQ0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFURVRDICpwZm10ZXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTVEdNRURJVU0qIHBzdGdtZWQpCit7CisgIGlmIChncmZCU0NGICYgQlNDRl9GSVJTVERBVEFOT1RJRklDQVRJT04pIHsKKyAgICBJV2luSW5ldEh0dHBJbmZvICpocDsKKyAgICBIUkVTVUxUIGhyID0gcEJpbmRpbmdfLT5RdWVyeUludGVyZmFjZShJSURfSVdpbkluZXRIdHRwSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmaHApOworICAgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgICBjaGFyIGNvbnRlbnRUeXBlWzEwMjRdOworICAgICAgRFdPUkQgYnVmU2l6ZSA9IHNpemVvZihjb250ZW50VHlwZSk7CisgICAgICBEV09SRCBmbGFncyA9IDA7CisgICAgICBjb250ZW50VHlwZVswXSA9IDA7CisgICAgICBociA9IGhwLT5RdWVyeUluZm8oSFRUUF9RVUVSWV9DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZidWZTaXplLCAwLCBOVUxMKTsKKyAgICAgIGlmIChTVUNDRUVERUQoaHIpKSB7CisJY2hhciBjaGFyc2V0W0NIQVJTRVRfTUFYXTsKKwlnZXRYTUxDaGFyc2V0KGNvbnRlbnRUeXBlLCBjaGFyc2V0KTsKKwlpZiAoY2hhcnNldFswXSkgeworI2lmZGVmIFhNTF9VTklDT0RFCisJICBYTUxfQ2hhciB3Y2hhcnNldFtDSEFSU0VUX01BWF07CisJICBYTUxfQ2hhciAqcDEgPSB3Y2hhcnNldDsKKwkgIGNvbnN0IGNoYXIgKnAyID0gY2hhcnNldDsKKwkgIHdoaWxlICgoKnAxKysgPSAodW5zaWduZWQgY2hhcikqcDIrKykgIT0gMCkKKwkgICAgOworCSAgWE1MX1NldEVuY29kaW5nKHBhcnNlcl8sIHdjaGFyc2V0KTsKKyNlbHNlCisJICBYTUxfU2V0RW5jb2RpbmcocGFyc2VyXywgY2hhcnNldCk7CisjZW5kaWYKKwl9CisgICAgICB9CisgICAgICBocC0+UmVsZWFzZSgpOworICAgIH0KKyAgfQorICBpZiAoIXBhcnNlcl8pCisgICAgcmV0dXJuIEVfQUJPUlQ7CisgIGlmIChwc3RnbWVkLT50eW1lZCA9PSBUWU1FRF9JU1RSRUFNKSB7CisgICAgd2hpbGUgKHRvdGFsUmVhZF8gPCBkd1NpemUpIHsKKyNkZWZpbmUgUkVBRF9NQVggKDY0KjEwMjQpCisgICAgICBEV09SRCBuVG9SZWFkID0gZHdTaXplIC0gdG90YWxSZWFkXzsKKyAgICAgIGlmIChuVG9SZWFkID4gUkVBRF9NQVgpCisJblRvUmVhZCA9IFJFQURfTUFYOworICAgICAgdm9pZCAqYnVmID0gWE1MX0dldEJ1ZmZlcihwYXJzZXJfLCBuVG9SZWFkKTsKKyAgICAgIGlmICghYnVmKSB7CisJX2Z0cHJpbnRmKHN0ZGVyciwgX1QoIm91dCBvZiBtZW1vcnlcbiIpKTsKKwlyZXR1cm4gRV9BQk9SVDsKKyAgICAgIH0KKyAgICAgIERXT1JEIG5SZWFkOworICAgICAgSFJFU1VMVCBociA9IHBzdGdtZWQtPnBzdG0tPlJlYWQoYnVmLCBuVG9SZWFkLCAmblJlYWQpOworICAgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKwl0b3RhbFJlYWRfICs9IG5SZWFkOworCWlmICghWE1MX1BhcnNlQnVmZmVyKHBhcnNlcl8sCisJCQkgICAgIG5SZWFkLAorCQkJICAgICAoZ3JmQlNDRiAmIEJTQ0ZfTEFTVERBVEFOT1RJRklDQVRJT04pICE9IDAKKwkJCSAgICAgJiYgdG90YWxSZWFkXyA9PSBkd1NpemUpKSB7CisJICByZXBvcnRFcnJvcihwYXJzZXJfKTsKKwkgIHJldHVybiBFX0FCT1JUOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFNfT0s7Cit9CisKK1NURE1FVEhPRElNUAorQ2FsbGJhY2s6Ok9uT2JqZWN0QXZhaWxhYmxlKFJFRklJRCwgSVVua25vd24gKikKK3sKKyAgcmV0dXJuIFNfT0s7Cit9CisKK2ludAorQ2FsbGJhY2s6OmV4dGVybmFsRW50aXR5UmVmKGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpCit7CisgIFhNTF9QYXJzZXIgZW50UGFyc2VyID0gWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKHBhcnNlcl8sIGNvbnRleHQsIDApOworICBYTUxfU2V0QmFzZShlbnRQYXJzZXIsIHN5c3RlbUlkKTsKKyAgaW50IHJldCA9IHByb2Nlc3NVUkwoZW50UGFyc2VyLCBiYXNlTW9uaWtlcl8sIHN5c3RlbUlkKTsKKyAgWE1MX1BhcnNlckZyZWUoZW50UGFyc2VyKTsKKyAgcmV0dXJuIHJldDsKK30KKworQ2FsbGJhY2s6OkNhbGxiYWNrKFhNTF9QYXJzZXIgcGFyc2VyLCBJTW9uaWtlciAqYmFzZU1vbmlrZXIsCisgICAgICAgICAgICAgICAgICAgU3RvcEhhbmRsZXIgc3RvcEhhbmRsZXIsIHZvaWQgKnN0b3BBcmcpCis6IHBhcnNlcl8ocGFyc2VyKSwKKyAgYmFzZU1vbmlrZXJfKGJhc2VNb25pa2VyKSwKKyAgcmVmXygwKSwKKyAgcEJpbmRpbmdfKDApLAorICB0b3RhbFJlYWRfKDApLAorICBzdG9wSGFuZGxlcl8oc3RvcEhhbmRsZXIpLAorICBzdG9wQXJnXyhzdG9wQXJnKQoreworICBpZiAoYmFzZU1vbmlrZXJfKQorICAgIGJhc2VNb25pa2VyXy0+QWRkUmVmKCk7Cit9CisKK0NhbGxiYWNrOjp+Q2FsbGJhY2soKQoreworICBpZiAocEJpbmRpbmdfKQorICAgIHBCaW5kaW5nXy0+UmVsZWFzZSgpOworICBpZiAoYmFzZU1vbmlrZXJfKQorICAgIGJhc2VNb25pa2VyXy0+UmVsZWFzZSgpOworfQorCitzdGF0aWMgaW50CitleHRlcm5hbEVudGl0eVJlZih2b2lkICphcmcsCisgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKQoreworICByZXR1cm4gKChDYWxsYmFjayAqKWFyZyktPmV4dGVybmFsRW50aXR5UmVmKGNvbnRleHQsIHN5c3RlbUlkLCBwdWJsaWNJZCk7Cit9CisKKworc3RhdGljIEhSRVNVTFQKK29wZW5TdHJlYW0oWE1MX1BhcnNlciBwYXJzZXIsCisgICAgICAgICAgIElNb25pa2VyICpiYXNlTW9uaWtlciwKKyAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnVyaSwKKyAgICAgICAgICAgU3RvcEhhbmRsZXIgc3RvcEhhbmRsZXIsIHZvaWQgKnN0b3BBcmcpCit7CisgIGlmICghWE1MX1NldEJhc2UocGFyc2VyLCB1cmkpKQorICAgIHJldHVybiBFX09VVE9GTUVNT1JZOworICBIUkVTVUxUIGhyOworICBJTW9uaWtlciAqbTsKKyNpZmRlZiBYTUxfVU5JQ09ERQorICBociA9IENyZWF0ZVVSTE1vbmlrZXIoMCwgdXJpLCAmbSk7CisjZWxzZQorICBMUFdTVFIgdXJpdyA9IG5ldyB3Y2hhcl90W3N0cmxlbih1cmkpICsgMV07CisgIGZvciAoaW50IGkgPSAwOzsgaSsrKSB7CisgICAgdXJpd1tpXSA9IHVyaVtpXTsKKyAgICBpZiAodXJpd1tpXSA9PSAwKQorICAgICAgYnJlYWs7CisgIH0KKyAgaHIgPSBDcmVhdGVVUkxNb25pa2VyKGJhc2VNb25pa2VyLCB1cml3LCAmbSk7CisgIGRlbGV0ZSBbXSB1cml3OworI2VuZGlmCisgIGlmIChGQUlMRUQoaHIpKQorICAgIHJldHVybiBocjsKKyAgSUJpbmRTdGF0dXNDYWxsYmFjayAqY2IgPSBuZXcgQ2FsbGJhY2socGFyc2VyLCBtLCBzdG9wSGFuZGxlciwgc3RvcEFyZyk7CisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIocGFyc2VyLCBleHRlcm5hbEVudGl0eVJlZik7CisgIFhNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcocGFyc2VyLCBjYik7CisgIGNiLT5BZGRSZWYoKTsKKyAgSUJpbmRDdHggKmI7CisgIGlmIChGQUlMRUQoaHIgPSBDcmVhdGVBc3luY0JpbmRDdHgoMCwgY2IsIDAsICZiKSkpIHsKKyAgICBjYi0+UmVsZWFzZSgpOworICAgIG0tPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gaHI7CisgIH0KKyAgY2ItPlJlbGVhc2UoKTsKKyAgSVN0cmVhbSAqcFN0cmVhbTsKKyAgaHIgPSBtLT5CaW5kVG9TdG9yYWdlKGIsIDAsIElJRF9JU3RyZWFtLCAodm9pZCAqKikmcFN0cmVhbSk7CisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgaWYgKHBTdHJlYW0pCisgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgIH0KKyAgaWYgKGhyID09IE1LX1NfQVNZTkNIUk9OT1VTKQorICAgIGhyID0gU19PSzsKKyAgbS0+UmVsZWFzZSgpOworICBiLT5SZWxlYXNlKCk7CisgIHJldHVybiBocjsKK30KKworc3RydWN0IFF1aXRJbmZvIHsKKyAgY29uc3QgWE1MX0NoYXIgKnVybDsKKyAgSFJFU1VMVCBocjsKKyAgaW50IHN0b3A7Cit9OworCitzdGF0aWMgdm9pZAord2luUGVycm9yKGNvbnN0IFhNTF9DaGFyICp1cmwsIEhSRVNVTFQgaHIpCit7CisgIExQVk9JRCBidWY7CisgIGlmIChGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUgorCQkgICAgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX0hNT0RVTEUsCisJCSAgICBHZXRNb2R1bGVIYW5kbGVBKCJ1cmxtb24uZGxsIiksCisJCSAgICBociwKKwkJICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAorCQkgICAgKExQVFNUUikgJmJ1ZiwKKwkJICAgIDAsCisJCSAgICBOVUxMKQorICAgICAgfHwgRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIKKwkJICAgICAgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKwkJICAgICAgMCwKKwkJICAgICAgaHIsCisJCSAgICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAorCQkgICAgICAoTFBUU1RSKSAmYnVmLAorCQkgICAgICAwLAorCQkgICAgICBOVUxMKSkgeworICAgIC8qIFRoZSBzeXN0ZW0gZXJyb3IgbWVzc2FnZXMgc2VlbSB0byBlbmQgd2l0aCBhIG5ld2xpbmUuICovCisgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1QoIiVzOiAlcyIpLCB1cmwsIGJ1Zik7CisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgTG9jYWxGcmVlKGJ1Zik7CisgIH0KKyAgZWxzZQorICAgIF9mdHByaW50ZihzdGRlcnIsIF9UKCIlczogZXJyb3IgJXhcbiIpLCB1cmwsIGhyKTsKK30KKworc3RhdGljIHZvaWQKK3RocmVhZFF1aXQodm9pZCAqcCwgSFJFU1VMVCBocikKK3sKKyAgUXVpdEluZm8gKnFpID0gKFF1aXRJbmZvICopcDsKKyAgcWktPmhyID0gaHI7CisgIHFpLT5zdG9wID0gMTsKK30KKworZXh0ZXJuICJDIgoraW50CitYTUxfVVJMSW5pdCh2b2lkKQoreworICByZXR1cm4gU1VDQ0VFREVEKENvSW5pdGlhbGl6ZSgwKSk7Cit9CisKK2V4dGVybiAiQyIKK3ZvaWQKK1hNTF9VUkxVbmluaXQodm9pZCkKK3sKKyAgQ29VbmluaXRpYWxpemUoKTsKK30KKworc3RhdGljIGludAorcHJvY2Vzc1VSTChYTUxfUGFyc2VyIHBhcnNlciwgSU1vbmlrZXIgKmJhc2VNb25pa2VyLAorICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJsKQoreworICBRdWl0SW5mbyBxaTsKKyAgcWkuc3RvcCA9IDA7CisgIHFpLnVybCA9IHVybDsKKworICBYTUxfU2V0QmFzZShwYXJzZXIsIHVybCk7CisgIEhSRVNVTFQgaHIgPSBvcGVuU3RyZWFtKHBhcnNlciwgYmFzZU1vbmlrZXIsIHVybCwgdGhyZWFkUXVpdCwgJnFpKTsKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICB3aW5QZXJyb3IodXJsLCBocik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSBpZiAoRkFJTEVEKHFpLmhyKSkgeworICAgIHdpblBlcnJvcih1cmwsIHFpLmhyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNU0cgbXNnOworICB3aGlsZSAoIXFpLnN0b3AgJiYgR2V0TWVzc2FnZSAoJm1zZywgTlVMTCwgMCwgMCkpIHsKKyAgICBUcmFuc2xhdGVNZXNzYWdlICgmbXNnKTsKKyAgICBEaXNwYXRjaE1lc3NhZ2UgKCZtc2cpOworICB9CisgIHJldHVybiAxOworfQorCitleHRlcm4gIkMiCitpbnQKK1hNTF9Qcm9jZXNzVVJMKFhNTF9QYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnVybCwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKQoreworICByZXR1cm4gcHJvY2Vzc1VSTChwYXJzZXIsIDAsIHVybCk7Cit9CmRpZmYgLS1naXQgYS9leHBhdC50YXIuZ3ogYi9leHBhdC50YXIuZ3oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwZDM4NgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LnRhci5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leHBhdC51cmwgYi9leHBhdC51cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzZDJhMgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LnVybApAQCAtMCwwICsxIEBACitodHRwOi8vZG93bmxvYWQuc291cmNlZm9yZ2UubmV0L2V4cGF0L2V4cGF0LTIuMC4xLnRhci5negpkaWZmIC0tZ2l0IGEvZXhwYXQudmVyc2lvbiBiL2V4cGF0LnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNzdhNgotLS0gL2Rldi9udWxsCisrKyBiL2V4cGF0LnZlcnNpb24KQEAgLTAsMCArMSBAQAorMi4wLjEK