UGF0cmljayBCZWFyZCdzIE5vdGVzIGZvciBidWlsZGluZyBHQyB2NC4xMiB3aXRoIENvZGVXYXJyaW9yIFBybyAyOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoZSBjdXJyZW50IGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgY29sbGVjdG9yIGlzIENvZGVXYXJyaW9yIFBybyAyLgpQcm9qZWN0cyBmb3IgQ29kZVdhcnJpb3IgUHJvIDIgKGFuZCBmb3IgcXVpdGUgYSBmZXcgb2xkZXIgdmVyc2lvbnMpCmFyZSBkaXN0cmlidXRlZCBpbiB0aGUgZmlsZSBNYWNfcHJvamVjdHMuc2l0LmhxeC4gVGhlIHByb2plY3QgZmlsZQo6TWFjX3Byb2plY3RzOmdjLnByaiBidWlsZHMgc3RhdGljIGxpYnJhcnkgdmVyc2lvbnMgb2YgdGhlIGNvbGxlY3Rvci4KOk1hY19wcm9qZWN0czpnY3Rlc3QucHJqIGJ1aWxkcyB0aGUgR0MgdGVzdCBzdWl0ZS4KCkNvbmZpZ3VyaW5nIHRoZSBjb2xsZWN0b3IgaXMgc3RpbGwgZG9uZSBieSBlZGl0aW5nIHRoZSBmaWxlcwo6TWFjX2ZpbGVzOk1hY09TX2NvbmZpZy5oIGFuZCA6TWFjX2ZpbGVzOk1hY09TX1Rlc3RfY29uZmlnLmguCgpMYXJzIEZhcm0ncyBzdWdnZXN0aW9ucyBvbiBidWlsZGluZyB0aGUgY29sbGVjdG9yOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkdhcmJhZ2UgQ29sbGVjdGlvbiBvbiBNYWNPUyAtIGEgbWFudWFsICdNYWtlRmlsZScKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUHJvamVjdCBmaWxlcyBhbmQgSURFJ3MgYXJlIGdyZWF0IG9uIHRoZSBNYWNpbnRvc2gsIGJ1dCB0aGV5IGRvIGhhdmUKcHJvYmxlbXMgd2hlbiB1c2VkIGFzIGRpc3RyaWJ1dGlvbiBtZWRpYS4gVGhpcyBub3RlIHRyaWVzIHRvIHByb3ZpZGUKcG9ydGluZyBpbnN0cnVjdGlvbnMgaW4gcHVyZSBURVhUIGZvcm0gdG8gYXZvaWQgdGhvc2UgcHJvYmxlbXMuIEEgbWFudWFsCidtYWtlZmlsZScgaWYgeW91IGxpa2UuCgogICAgR0MgdmVyc2lvbjogICAgIDQuMTJhMgogICAgQ29kZXdhcnJpb3I6ICAgIENXUHJvMQogICAgZGF0ZTogICAgICAgICAgIDE4IEp1bHkgMTk5NwoKVGhlIG5vdGVzIG1heSBvciBtYXkgbm90IGFwcGx5IHRvIGVhcmxpZXIgb3IgbGF0ZXIgdmVyc2lvbnMgb2YgdGhlCkdDL0NXUHJvLiBBY3R1YWxseSwgdGhleSBkbyBhcHBseSB0byBlYXJsaWVyIHZlcnNpb25zIG9mIGJvdGggZXhjZXB0IHRoYXQKdW50aWwgcmVjZW50bHkgYSBwcm9qZWN0IGNvdWxkIG9ubHkgYnVpbGQgb25lIHRhcmdldCBzbyBlYWNoIHRhcmdldCB3YXMgYQpzZXBhcmF0ZSBwcm9qZWN0LiBUaGUgbm90ZXMgd2lsbCBtb3N0IGxpa2VseSBhcHBseSB0byBmdXR1cmUgdmVyc2lvbnMgdG9vLgpQb3NzaWJseSB3aXRoIG1pbm9yIHR3ZWFrcy4KClRoaXMgaXMganVzdCB0byByZWNvcmQgbXkgZXhwZXJpZW5jZXMuIFRoZXNlIG5vdGVzIGRvIG5vdCBtZWFuIEkgbm93CnByb3ZpZGUgYSBzdXBwb3J0ZWQgcG9ydCBvZiB0aGUgR0MgdG8gTWFjT1MuIEl0IHdvcmtzIGZvciBtZS4gSWYgaXQgd29ya3MKZm9yIHlvdSwgZ3JlYXQuIElmIGl0IGRvZXNuJ3QsIHNvcnJ5LCB0cnkgYWdhaW4uLi47LSkgU3RpbGwsIGlmIHlvdSBmaW5kCmVycm9ycywgcGxlYXNlIGxldCBtZSBrbm93LgoKICAgIG1haWx0bzogICAgICAgICBsYXJzLmZhcm1AaXRlLm1oLnNlCgogICAgYWRkcmVzczogICAgICAgIExhcnMgRmFybQogICAgICAgICAgICAgICAgICAgIEty9m525GdlbiAzM2IKICAgICAgICAgICAgICAgICAgICA4NTYgNDQgU3VuZHN2YWxsCiAgICAgICAgICAgICAgICAgICAgU3dlZGVuCgpQb3J0aW5nIHRvIE1hY09TIGlzIGEgYml0IG1vcmUgY29tcGxleCB0aGFuIGl0IGZpcnN0IHNlZW1zLiBXaGljaCBNYWNPUz8KNjhLL1Bvd2VyUEM/IFdoaWNoIGNvbXBpbGVyPyBFYWNoIHN1cHBvcnRzIGJvdGggNjhLIGFuZCBQb3dlclBDIGFuZCBvZmZlciBhCmxhcmdlIG51bWJlciBvZiAodW5pcXVlIHRvIGVhY2ggZW52aXJvbm1lbnQpIGNvbXBpbGVyIHNldHRpbmdzLiBFYWNoCmNvbWJpbmF0aW9uIG9mIGNvbXBpbGVyLzY4Sy9QUEMvc2V0dGluZ3MgcmVxdWlyZSBhIHVuaXF1ZSBjb21iaW5hdGlvbiBvZgpzdGFuZGFyZCBsaWJyYXJpZXMuIEFuZCB0aGUgSURFJ3MgZG9lcyBub3Qgc2VsZWN0IHRoZW0gZm9yIHlvdS4gVGhleSBkb24ndApldmVuIGNoZWNrIHRoYXQgdGhlIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBjb21wYXRpYmxlIHNldHRpbmcgYW5kIHRoaXMgaXMKdGhlIG1ham9yIHNvdXJjZSBvZiBwcm9ibGVtcyB3aGVuIHBvcnRpbmcgdGhlIEdDIChhbmQgb3RoZXJ3aXNlIHRvbykuCgpZb3Ugd2lsbCBoYXZlIHRvIG1ha2UgY2hvaWNlcyB3aGVuIHlvdSBjb25maWd1cmUgdGhlIEdDLiBJJ3ZlIG1hZGUgc29tZQpjaG9pY2VzIGhlcmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXIgY29tYmluYXRpb25zIG9mIHNldHRpbmdzIGFuZCAjZGVmaW5lcwp0aGF0IHdvcmsgdG9vLgoKQXMgZm9yIHRhcmdldCBzZXR0aW5ncyB0aGUgbWFqb3Igb2JzdGFjbGVzIG1heSBiZToKLSA2OEsgUHJvY2Vzc29yOiBjaGVjayAiNC1ieXRlIEludHMiLgotIFBQQyBQcm9jZXNzb3I6IHVuY2hlY2sgIlN0b3JlIFN0YXRpYyBEYXRhIGluIFRPQyIuCgpXaGF0IHlvdSBuZWVkIHRvIGRvOgo9PT09PT09PT09PT09PT09PT09CgoxKSBCdWlsZCB0aGUgR0MgYXMgYSBsaWJyYXJ5CjIpIFRlc3QgdGhhdCB0aGUgbGlicmFyeSB3b3JrcyB3aXRoICd0ZXN0LmMnLgozKSBUZXN0IHRoYXQgdGhlIEMrKyBpbnRlcmZhY2UgJ2djX2NwcC5jYy9oJyB3b3JrcyB3aXRoICd0ZXN0X2NwcC5jYycuCgoxKSBUaGUgTGlicmFyaWVzOgo9PT09PT09PT09PT09PT09PQpJIG1hZGUgb25lIHByb2plY3Qgd2l0aCBmb3VyIHRhcmdldHMgKDY4Sy9QUEMgdGVtcG1lbSBvciBhcHBoZWFwKS4gT25lIHRhcmdldAp3aWxsIHN1ZmZpY2UgaWYgeW91J3JlIGFibGUgdG8gZGVjaWRlIHdoaWNoIG9uZSB5b3Ugd2FudC4gSSB3YXNuJ3QuLi4KCkNvZGV3YXJyaW9yIGFsbG93cyBhIGxhcmdlIG51bWJlciBvZiBjb21waWxlci9saW5rZXIgc2V0dGluZ3MuIEkgdXNlZCB0aGVzZToKClNldHRpbmdzIHNoYXJlZCBieSBhbGwgdGFyZ2V0czoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm8gQWNjZXNzIFBhdGhzOgogIC0gVXNlciBQYXRoczogICB0aGUgR0MgZm9sZGVyCiAgLSBTeXN0ZW0gUGF0aHM6IHtDb21waWxlcn06TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5OgogICAgICAgICAgICAgICAgICB7Q29tcGlsZXJ9Ok1hY09TIFN1cHBvcnQ6SGVhZGVyczoKICAgICAgICAgICAgICAgICAge0NvbXBpbGVyfTpNYWNPUyBTdXBwb3J0Ok1hY0hlYWRlcnM6Cm8gQy9DKysgbGFuZ3VhZ2U6CiAgLSBpbmxpbmluZzogbm9ybWFsCiAgLSBkaXJlY3QgdG8gU09NOiBvZmYKICAtIGVuYWJsZS9jaGVjazogZXhjZXB0aW9ucywgUlRUSSwgYm9vbCAoYW5kIGlmIHlvdSBsaWtlIHBvb2wgc3RyaW5ncykKClBvd2VyUEMgdGFyZ2V0IHNldHRpbmdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm8gVGFyZ2V0IFNldHRpbmdzOgogIC0gbmFtZSBvZiB0YXJnZXQKICAtIE1hY09TIFBQQyBMaW5rZXIKbyBQUEMgVGFyZ2V0CiAgLSBuYW1lIG9mIGxpYnJhcnkKbyBDL0MrKyBsYW5ndWFnZQogIC0gcHJlZml4IGZpbGUgYXMgZGVzY3JpYmVkIGJlbG93Cm8gUFBDIFByb2Nlc3NvcgogIC0gU3RydWN0IEFsaWdubWVudDogUG93ZXJQQwogIC0gdW5jaGVjayAiU3RvcmUgU3RhdGljIERhdGEgaW4gVE9DIiAtLSBpbXBvcnRhbnQhCiAgICBJIGRvbid0IHRoaW5rIHRoZSBvdGhlcnMgbWF0dGVyLCBJIHVzZSBmdWxsIG9wdGltaXphdGlvbiBhbmQgaXRzIG9rCm8gUFBDIExpbmtlcgogIC0gRmFjdG9yeSBTZXR0aW5ncyAoU1lNIGZpbGUgd2l0aCBmdWxsIHBhdGhzLCBmYXN0ZXIgbGlua2luZywgZGVhZC1zdHJpcAogICAgc3RhdGljIGluaXQsIE1haW46IF9fc3RhcnQpCgoKNjhLIHRhcmdldCBzZXR0aW5ncwotLS0tLS0tLS0tLS0tLS0tLS0tCm8gVGFyZ2V0IFNldHRpbmdzOgogIC0gbmFtZSBvZiB0YXJnZXQKICAtIE1hY09TIDY4SyBMaW5rZXIKbyA2OEsgVGFyZ2V0CiAgLSBuYW1lIG9mIGxpYnJhcnkKICAtIEE1IHJlbGF0aXZlIGRhdGEKbyBDL0MrKyBsYW5ndWFnZQogIC0gcHJlZml4IGZpbGUgYXMgZGVzY3JpYmVkIGJlbG93Cm8gNjhLIFByb2Nlc3NvcgogIC0gQ29kZSBtb2RlbDogc21hcnQKICAtIFN0cnVjdCBhbGlnbm1lbnQ6IDY4SwogIC0gRlA6IFNBTkUKICAtIGVuYWJsZSA0LUJ5dGUgSW50cyAtLSBpbXBvcnRhbnQhCiAgICBJIGRvbid0IHRoaW5rIHRoZSBvdGhlcnMgbWF0dGVyLiBJIHNlbGVjdGVkLi4uCiAgLSBlbmFibGU6IDY4MDIwCiAgLSBlbmFibGU6IGdsb2JhbCByZWdpc3RlciBhbGxvY2F0aW9uCm8gSVIgT3B0aW1pemVyCiAgLSBlbmFibGU6IE9wdGltaXplIFNwYWNlLCBPcHRpbWl6ZSBTcGVlZAogICAgSSBzdXBwb3NlIHRoZSBvdGhlcnMgd291bGQgd29yayB0b28sIGJ1dCBoYXZlbid0IHRyaWVkLi4uCm8gNjhLIExpbmtlcgogIC0gRmFjdG9yeSBTZXR0aW5ncyAoTmV3IFN0eWxlIE1hY3NCdWcsU1lNIGZpbGUgd2l0aCBmdWxsIHBhdGhzLAogICAgQTYgRnJhbWVzLCBmYXN0IGxpbmssIE1lcmdlIGNvbXBpbGVyIGdsdWUgaW50byBzZWdtZW50IDEsCiAgICBkZWFkLXN0cmlwIHN0YXRpYyBpbml0KQoKUHJlZml4IEZpbGVzIHRvIGNvbmZpZ3VyZSB0aGUgR0Mgc291cmNlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoZSBDb2Rld2FycmlvciBlcXVpdmFsZW50IG9mIGNvbW1hbmRsaW5lIGNvbXBpbGVycyAtRE5BTUU9WCBpcyB0byB1c2UKcHJlZml4LWZpbGVzLiBBIFRFWFQgZmlsZSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgI2luY2x1ZGVkIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZQpvZiBldmVyeSBzb3VyY2UgZmlsZS4gSSB1c2VkIHRoZXNlOgoKLS0tLSAoIGN1dCBoZXJlICkgLS0tLSAgZ2NfcHJlZml4X3RlbXBtZW0uaCAgICAgLS0gNjhLIGFuZCBQUEMgLS0tLS0KICAgICNpbmNsdWRlICJnY19wcmVmaXhfY29tbW9uLmgiCiAgICAjdW5kZWYgVVNFX1RFTVBPUkFSWV9NRU1PUlkKICAgICNkZWZpbmUgVVNFX1RFTVBPUkFSWV9NRU1PUlkKLS0tLSAoIGN1dCBoZXJlICkgLS0tLSAgZ2NfcHJlZml4X2FwcG1lbS5oICAgICAgLS0gNjhLIGFuZCBQUEMgLS0tLS0KICAgICNpbmNsdWRlICJnY19wcmVmaXhfY29tbW9uLmgiCiAgICAjdW5kZWYgVVNFX1RFTVBPUkFSWV9NRU1PUlkKLy8gICNkZWZpbmUgVVNFX1RFTVBPUkFSWV9NRU1PUlkKCi0tLS0gKCBjdXQgaGVyZSApIC0tLS0gIGdjX3ByZWZpeF9jb21tb24uaCAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGdjX3ByZWZpeF9jb21tb24uaAovLyAtLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29kZXdhcnJpb3IgcHJlZml4IGZpbGUgdG8gY29uZmlndXJlIHRoZSBHQyBsaWJyYXJpZXMKLy8KLy8gICBwcmVmaXggZmlsZXMgYXJlIHRoZSBDb2Rld2FycmlvciBlcXVpdmFsZW50IG9mIHRoZQovLyAgIGNvbW1hbmQgbGluZSBvcHRpb24gLURuYW1lPXggZnJlcXVlbnRseSBzZWVuIGluIG1ha2VmaWxlcwoKI2lmICFfX01XRVJLU19fCiAgI2Vycm9yIG9ubHkgdHJpZWQgdGhpcyB3aXRoIENvZGV3YXJyaW9yCiNlbmRpZgoKI2lmIG1hY2ludG9zaAogICNkZWZpbmUgTVNMX1VTRV9QUkVDT01QSUxFRF9IRUFERVJTIDAKICAjaW5jbHVkZSA8YW5zaV9wcmVmaXgubWFjLmg+CiAgI2lmbmRlZiBfX1NURENfXwogICAgI2RlZmluZSBfX1NURENfXyAwCiAgI2VuZGlmCgogIC8vICBTZWUgbGlzdCBvZiAjZGVmaW5lcyB0byBjb25maWd1cmUgdGhlIGxpYnJhcnkgaW46ICdNYWtlRmlsZScKICAvLyAgc2VlIGFsc28gUkVBRE1FCgogICNkZWZpbmUgU0lMRU5UICAgICAgICAgICAgICAgIC8vIG5vIGNvbGxlY3Rpb24gbWVzc2FnZXMuIEluIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0cm91YmxlIHlvdSBtaWdodCB3YW50IHRoaXMgb2ZmCiAgI2RlZmluZSBBTExfSU5URVJJT1JfUE9JTlRFUlMgLy8gZm9sbG93cyBpbnRlcmlvciBwb2ludGVycy4KLy8jZGVmaW5lIERPTlRfQUREX0JZVEVfQVRfRU5EICAvLyBkaXNhYmxlcyB0aGUgcGFkZGluZyBpZiBkZWZpbmVkLgovLyNkZWZpbmUgU01BTExfQ09ORklHICAgICAgICAgIC8vIHdoZXRoZXIgdG8gdXNlIGEgc21hbGxlciBoZWFwLgogICNkZWZpbmUgTk9fU0lHTkFMUyAgICAgICAgICAgIC8vIHNpZ25hbHMgYXJlbid0IHJlYWwgb24gdGhlIE1hY2ludG9zaC4KICAjZGVmaW5lIEFUT01JQ19VTkNPTExFQ1RBQkxFICAvLyBHQ19tYWxsb2NfYXRvbWljX3VuY29sbGVjdGFibGUoKQoKICAvLyBkZWZpbmUgZWl0aGVyIG9yIG5vbmUgYXMgcGVyIHBlcnNvbmFsIHByZWZlcmVuY2UKICAvLyAgIHVzZWQgaW4gbWFsbG9jLmMKICAjZGVmaW5lIFJFRElSRUNUX01BTExPQyBHQ19tYWxsb2MKLy8jZGVmaW5lIFJFRElSRUNUX01BTExPQyBHQ19tYWxsb2NfdW5jb2xsZWN0YWJsZQogIC8vIGlmIFJFRElSRUNUX01BTExPQyBpcyAjZGVmaW5lZCBtYWtlIHN1cmUgdGhhdCB0aGUgR0MgbGlicmFyeQogIC8vIGlzIGxpc3RlZCBiZWZvcmUgdGhlIEFOU0kvSVNPIGxpYnMgaW4gdGhlIENvZGV3YXJyaW9yCiAgLy8gJ0xpbmsgb3JkZXInIHBhbmVsCi8vI2RlZmluZSBJR05PUkVfRlJFRQoKICAvLyBtYWMgc3BlY2lmaWMgY29uZmlncwovLyNkZWZpbmUgVVNFX1RFTVBPUkFSWV9NRU1PUlkgICAgLy8gdXNlIE1hY2ludG9zaCB0ZW1wb3JhcnkgbWVtb3J5LgovLyNkZWZpbmUgU0hBUkVEX0xJQlJBUllfQlVJTEQgICAgLy8gYnVpbGQgZm9yIHVzZSBpbiBhIHNoYXJlZCBsaWJyYXJ5LgoKI2Vsc2UKICAvLyBjb3VsZCBidWlsZCBXaW4zMiBoZXJlIHRvbywgb3IgaW4gdGhlIGZ1dHVyZQogIC8vIFJoYXBzb2R5IFBQQy1tYWNoLCBSaGFwc29keSBQUEMtTWFjT1MsCiAgLy8gUmhhcHNvZHkgSW50ZWwtbWFjaCwgUmhhcHNvZHkgSW50ZWwtV2luMzIsLi4uCiAgLy8gLi4uIHVnaCB0aGlzIHdpbGwgZ2V0IG1lc3N5IC4uLgojZW5kaWYKCi8vIG1ha2Ugc3VyZSBpbnRzIGFyZSBhdCBsZWFzdCAzMi1iaXQKLy8gKCBjb3VsZCBiZSBzZXQgdG8gMTYtYml0IGJ5IGNvbXBpbGVyIHNldHRpbmdzICg2OEspICkKCnN0cnVjdCBnY19wcml2YXRlX2Fzc2VydF9pbnRzaXplX3sgY2hhciB4WyBzaXplb2YoaW50KT49NCA/IDEgOiAwIF07IH07CgojaWYgX19wb3dlcmMKICAjaWYgX19vcHRpb24odG9jX2RhdGEpCiAgICAjZXJyb3IgdHVybiBvZmYgInN0b3JlIHN0YXRpYyBkYXRhIGluIFRPQyIgd2hlbiB1c2luZyBHQwogICAgLy8gICAgIC4uLiBvciBmaW5kIGEgd2F5IHRvIGFkZCBUT0MgdG8gdGhlIHJvb3Qgc2V0Li4uKD8pCiAgI2VuZGlmCiNlbmRpZgotLS0tICggY3V0IGhlcmUgKSAtLS0tICBlbmQgb2YgZ2NfcHJlZml4X2NvbW1vbi5oICAtLS0tLS0tLS0tLS0tLS0tLQoKRmlsZXMgdG8gIGJ1aWxkIHRoZSBHQyBsaWJyYXJpZXM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBhbGxjaGJsay5jCiAgICBhbGxvYy5jCiAgICBibGFja2xzdC5jCiAgICBjaGVja3N1bXMuYwogICAgZGJnX21sYy5jCiAgICBmaW5hbGl6ZS5jCiAgICBoZWFkZXJzLmMKICAgIG1hY2hfZGVwLmMKICAgIE1hY09TLmMgICAgLS0gY29udGFpbnMgTWFjT1MgY29kZQogICAgbWFsbG9jLmMKICAgIG1hbGxvY3guYwogICAgbWFyay5jCiAgICBtYXJrX3J0cy5jCiAgICBtaXNjLmMKICAgIG5ld19oYmxrLmMKICAgIG9ial9tYXAuYwogICAgb3NfZGVwLmMgICAtLSBjb250YWlucyBNYWNPUyBjb2RlCiAgICBwdHJfY2hjay5jCiAgICByZWNsYWltLmMKICAgIHN0dWJib3JuLmMKICAgIHR5cGRfbWxjLmMKICAgIGdjKysuY2MgICAgLS0gdGhpcyBpcyAnZ2NfY3BwLmNjJyB3aXRoIGxlc3MgJ2lubGluZScgYW5kCiAgICAgICAgICAgICAgIC0tIHRocm93IHN0ZDo6YmFkX2FsbG9jIHdoZW4gb3V0IG9mIG1lbW9yeQogICAgICAgICAgICAgICAtLSBnY19jcHAuY2Mgd29ya3MganVzdCBmaW5lIHRvbwoKMikgVGVzdCB0aGF0IHRoZSBsaWJyYXJ5IHdvcmtzIHdpdGggJ3Rlc3QuYycuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIHRlc3QgYXBwIGlzIGp1c3QgYW4gb3JkaW5hcnkgQU5TSS1DIGNvbnNvbGUgYXBwLiBNYWtlIHN1cmUgc2V0dGluZ3MKbWF0Y2ggdGhlIGxpYnJhcnkgeW91J3JlIHRlc3RpbmcuCgpGaWxlcwotLS0tLQogICAgdGVzdC5jCiAgICB0aGUgR0MgbGlicmFyeSB0byB0ZXN0ICAgICAgICAtLSBsaW5rIG9yZGVyIGJlZm9yZSBBTlNJIGxpYnMKICAgIHN1aXRhYmxlIE1hYytBTlNJIGxpYnJhcmllcwoKcHJlZml4OgotLS0tLS0KLS0tLSAoIGN1dCBoZXJlICkgLS0tLSAgZ2NfcHJlZml4X3Rlc3RsaWIuaCAgICAgLS0gYWxsIGxpYnMgLS0tLS0KI2RlZmluZSBNU0xfVVNFX1BSRUNPTVBJTEVEX0hFQURFUlMgMAojaW5jbHVkZSA8YW5zaV9wcmVmaXgubWFjLmg+CiN1bmRlZiBOREVCVUcKCiNkZWZpbmUgQUxMX0lOVEVSSU9SX1BPSU5URVJTCS8qIGZvciBHQ19wcml2LmggKi8KLS0tLSAoIGN1dCBoZXJlICkgLS0tLQoKMykgVGVzdCB0aGF0IHRoZSBDKysgaW50ZXJmYWNlICdnY19jcHAuY2MvaCcgd29ya3Mgd2l0aCAndGVzdF9jcHAuY2MnLgoKVGhlIHRlc3QgYXBwIGlzIGp1c3QgYW4gb3JkaW5hcnkgQU5TSS1DIGNvbnNvbGUgYXBwLiBNYWtlIHN1cmUgc2V0dGluZ3MgbWF0Y2gKdGhlIGxpYnJhcnkgeW91J3JlIHRlc3RpbmcuCgpGaWxlcwotLS0tLQogICAgdGVzdF9jcHAuY2MKICAgIHRoZSBHQyBsaWJyYXJ5IHRvIHRlc3QgICAgICAgIC0tIGxpbmsgb3JkZXIgYmVmb3JlIEFOU0kgbGlicwogICAgc3VpdGFibGUgTWFjK0FOU0kgbGlicmFyaWVzCgpwcmVmaXg6Ci0tLS0tLQpzYW1lIGFzIGZvciB0ZXN0LmMKCkZvciBjb252ZW5pZW5jZSBJIHVzZWQgb25lIHRlc3QtcHJvamVjdCB3aXRoIHNldmVyYWwgdGFyZ2V0cyBzbyB0aGF0IGFsbAp0ZXN0IGFwcHMgYXJlIGJ1aWxkIGF0IG9uY2UuIFR3byBmb3IgZWFjaCBsaWJyYXJ5IHRvIHRlc3Q6IHRlc3QuYyBhbmQKZ2NfYXBwLmNjLiBXaGVuIEkgd2FzIHNhdGlzZmllZCB0aGF0IHRoZSBsaWJyYXJpZXMgd2VyZSBvay4gSSBwdXQgdGhlCmxpYnJhcmllcyArIGdjLmggKyB0aGUgYysrIGludGVyZmFjZS1maWxlIGluIGEgZm9sZGVyIHRoYXQgSSB0aGVuIHB1dCBpbnRvCnRoZSBNU0wgaGllcmFyY2h5IHNvIHRoYXQgSSBkb24ndCBoYXZlIHRvIGFsdGVyIGFjY2Vzcy1wYXRocyBpbiBwcm9qZWN0cwp0aGF0IHVzZSB0aGUgR0MuCgpBZnRlciB0aGF0LCBqdXN0IGFkZCB0aGUgcHJvcGVyIEdDIGxpYnJhcnkgdG8geW91ciBwcm9qZWN0IGFuZCB0aGUgR0MgaXMgaW4KYWN0aW9uISBtYWxsb2Mgd2lsbCBjYWxsIEdDX21hbGxvYyBhbmQgZnJlZSBHQ19mcmVlLCBuZXcvZGVsZXRlIHRvby4gWW91CmRvbid0IGhhdmUgdG8gY2FsbCBmcmVlIG9yIGRlbGV0ZS4gWW91IG1heSBoYXZlIHRvIGJlIGEgYml0IGNhdXRpb3VzIGFib3V0CmRlbGV0ZSBpZiB5b3UncmUgZnJlZWluZyBvdGhlciByZXNvdXJjZXMgdGhhbiBSQU0uIFNlZSBnY19jcHAuaC4gWW91IGNhbgphbHNvIGtlZXAgY29kaW5nIGFzIGFsd2F5cyB3aXRoIGRlbGV0ZS9mcmVlLiBUaGF0IHdvcmtzIHRvby4gSWYgeW91IHdhbnQsCiJpbmNsdWRlIDxnYy5oPiBhbmQgdHdlYWsgaXQncyB1c2UgYSBiaXQuCgpTeW1hbnRlYyBTUE0KPT09PT09PT09PT09Ckl0IGhhcyBiZWVuIGEgd2hpbGUgc2luY2UgSSB0cmllZCB0aGUgR0MgaW4gU1BNLCBidXQgSSB0aGluayB0aGF0IHRoZSBhYm92ZQppbnN0cnVjdGlvbnMgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gZ3VpZGUgeW91IHRocm91Z2ggaW4gU1BNIHRvby4gU1BNCm5lZWRzIHRvIGtub3cgd2hlcmUgdGhlIGdsb2JhbCBkYXRhIGlzLiBVc2UgdGhlIGZpbGVzICdkYXRhc3RhcnQuYycgYW5kCidkYXRhZW5kLmMnLiBQdXQgJ2RhdGFzdGFydC5jJyBhdCB0aGUgdG9wIG9mIHlvdXIgcHJvamVjdCBhbmQgJ2RhdGFlbmQuYycKYXQgdGhlIGJvdHRvbSAgb2YgeW91ciBwcm9qZWN0IHNvIHRoYXQgYWxsIGRhdGEgaXMgc3Vycm91bmRlZC4gVGhpcyBpcyBub3QKbmVlZGVkIGluIENvZGV3YXJyaW9yIGJlY2F1c2UgaXQgcHJvdmlkZXMgaW50cmluc2ljIHZhcmlhYmxlcwpfX2RhdGFzdGFydF9fLCBfX2RhdGFfZW5kX18gdGhhdCB3cmFwcyBhbGwgZ2xvYmFscy4KClNvdXJjZSBDaGFuZ2VzIChHQyA0LjEyYTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09ClZlcnkgZmV3LiBKdXN0IG9uZSB0aW55IGluIHRoZSBHQywgbm90IHN0cmljdGx5IG5lZWRlZC4KLSBNYWNPUy5jIGxpbmUgMTMxIGluIHJvdXRpbmUgR0NfTWFjRnJlZVRlbXBvcmFyeU1lbW9yeSgpCiAgY2hhbmdlICMgICAgICAgaWYgIWRlZmluZWQoU0hBUkVEX0xJQlJBUllfQlVJTEQpCiAgdG8gICAgICMgICAgICAgaWYgIWRlZmluZWQoU0lMRU5UKSAmJiAhZGVmaW5lZChTSEFSRURfTElCUkFSWV9CVUlMRCkKICBUbyB0dXJuIG9mZiBhIG1lc3NhZ2Ugd2hlbiB0aGUgYXBwbGljYXRpb24gcXVpdHMgKGFjdHVhbGx5LCBJIGZha2VkCiAgdGhpcyBjaGFuZ2UgYnkgI2RlZmluaW5nIFNIQVJFRF9MSUJSQVJZX0JVSUxEIGluIGEgc3RhdGljYWxseSBsaW5rZWQKICBsaWJyYXJ5IGZvciBtb3JlIHRoYW4gYSB5ZWFyIHdpdGhvdXQgaWxsIGVmZmVjdHMgYnV0IHBlcmhhcHMgdGhpcyBpcwogIGJldHRlcikuCgotIHRlc3RfY3BwLmNjCiAgbWFkZSB0aGUgZmlyc3QgbGluZXMgb2YgbWFpbigpIGxvb2sgbGlrZSB0aGlzOgogIC0tLS0tLS0tLS0tLQogIGludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgewogICNlbmRpZgogICNpZiBtYWNpbnRvc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hY09TCiAgICBjaGFyKiBhcmd2X1tdID0geyJ0ZXN0X2NwcCIsIjEwIn07ICAgICAgLy8gICBkb2Vzbid0CiAgICBhcmd2PWFyZ3ZfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhdmUgYQogICAgYXJnYyA9IHNpemVvZihhcmd2Xykvc2l6ZW9mKGFyZ3ZfWzBdKTsgIC8vICAgICAgIGNvbW1hbmRsaW5lCiAgI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KCiAgaW50IGksIGl0ZXJzLCBuOwogICMgaWZuZGVmIF9fR05VQ19fCiAgIGFsbG9jIGR1bW15X3RvX2Zvb2xfdGhlX2NvbXBpbGVyX2ludG9fZG9pbmdfdGhpbmdzX2l0X2N1cnJlbnRseV9jYW50X2hhbmRsZTsKICAtLS0tLS0tLS0tLS0KCi0gY29uZmlnLmggW25vdyBnY2NvbmZpZy5oXQogIF9fTVdFUktTX18gZG9lcyBub3QgaGF2ZSB0byBtZWFuIE1BQ09TLiBZb3UgY2FuIHVzZSBDb2Rld2FycmlvciB0bwogIGJ1aWxkIGEgV2luMzIgb3IgQmVPUyBsaWJyYXJ5IGFuZCBzb29uIGEgUmhhcHNvZHkgbGlicmFyeS4gWW91IG1heQogIGhhdmUgdG8gY2hhbmdlIHRoYXQgI2lmLi4uCgoKCiAgIEl0IHdvcmtlZCBmb3IgbWUsIGhvcGUgaXQgd29ya3MgZm9yIHlvdS4KCiAgIExhcnMgRmFybQogICAxOCBKdWx5IDE5OTcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKClBhdHJpY2sgQmVhcmQncyBpbnN0cnVjdGlvbnMgKG1heSBiZSBkYXRlZCk6Cgp2NC4zIG9mIHRoZSBjb2xsZWN0b3Igbm93IHJ1bnMgdW5kZXIgU3ltYW50ZWMgQysrL1RISU5LIEMgdjcuMC40LCBhbmQKTWV0cm93ZXJrcyBDL0MrKyB2NC41IGJvdGggNjhLIGFuZCBQb3dlclBDLiBQcm9qZWN0IGZpbGVzIGFyZSBwcm92aWRlZAp0byBidWlsZCBhbmQgdGVzdCB0aGUgY29sbGVjdG9yIHVuZGVyIGJvdGggZGV2ZWxvcG1lbnQgc3lzdGVtcy4KCkNvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLQoKVG8gY29uZmlndXJlIHRoZSBjb2xsZWN0b3IsIHVuZGVyIGJvdGggZGV2ZWxvcG1lbnQgc3lzdGVtcywgYSBwcmVmaXggZmlsZQppcyB1c2VkIHRvIHNldCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4gVGhpcyBmaWxlIGlzIGNhbGxlZCAiTWFjT1NfY29uZmlnLmgiLgpBbHNvIHRvIHRlc3QgdGhlIGNvbGxlY3RvciwgIk1hY09TX1Rlc3RfY29uZmlnLmgiIGlzIHByb3ZpZGVkLgoKVGVzdGluZwotLS0tLS0tCgpUbyB0ZXN0IHRoZSBjb2xsZWN0b3IgKGFsd2F5cyBhIGdvb2QgaWRlYSksIGJ1aWxkIG9uZSBvZiB0aGUgZ2N0ZXN0IHByb2plY3RzLApnY3Rlc3QuuSAoU3ltYW50ZWMgQysrL1RISU5LIEMpLCBtdy9nY3Rlc3QuNjhLLrksIG9yIG13L2djdGVzdC5QUEMuuS4gVGhlCnRlc3Qgd2lsbCBhc2sgeW91IGhvdyBtYW55IHRpbWVzIHRvIHJ1bjsgMSBzaG91bGQgYmUgc3VmZmljaWVudC4KCkJ1aWxkaW5nIAotLS0tLS0tLQoKRm9yIHlvdXIgY29udmVuaWVuY2UgcHJvamVjdCBmaWxlcyBmb3IgdGhlIG1ham9yIE1hY2ludG9zaCBkZXZlbG9wbWVudApzeXN0ZW1zIGFyZSBwcm92aWRlZC4KCkZvciBTeW1hbnRlYyBDKysvVEhJTksgQywgeW91IG11c3QgYnVpbGQgdGhlIHR3byBwcm9qZWN0cyBnY2xpYi0xLrkgYW5kCmdjbGliLTIuuS4gSXQgaGFzIHRvIGJlIHNwbGl0IHVwIGJlY2F1c2UgdGhlIGNvbGxlY3RvciBoYXMgbW9yZSB0aGFuIDMyawpvZiBzdGF0aWMgZGF0YSBhbmQgbm8gbGlicmFyeSBjYW4gaGF2ZSBtb3JlIHRoYW4gdGhpcyBpbiB0aGUgU3ltYW50ZWMKZW52aXJvbm1lbnQuIChGdXR1cmUgdmVyc2lvbnMgd2lsbCBwcm9iYWJseSBmaXggdGhpcy4pCgpGb3IgTWV0cm93ZXJrcyBDL0MrKyA0LjUgeW91IGJ1aWxkIGdjLjY4Sy65L2djLlBQQy65IGFuZCB0aGUgcmVzdWx0IHdpbGwKYmUgYSBsaWJyYXJ5IGNhbGxlZCBnYy42OEsubGliL2djLlBQQy5saWIuCgpVc2luZwotLS0tLQoKVW5kZXIgU3ltYW50ZWMgQysrL1RISU5LIEMsIHlvdSBjYW4ganVzdCBhZGQgdGhlIGdjbGliLTEuuSBhbmQgZ2NsaWItMi65CnByb2plY3RzIHRvIHlvdXIgb3duIHByb2plY3QuIFVuZGVyIE1ldHJvd2Vya3MsIHlvdSBhZGQgZ2MuNjhLLmxpYiBvcgpnYy5QUEMubGliIGFuZCB0d28gYWRkaXRpb25hbCBmaWxlcy4gWW91IGFkZCB0aGUgZmlsZXMgY2FsbGVkIGRhdGFzdGFydC5jCmFuZCBkYXRhZW5kLmMgdG8geW91ciBwcm9qZWN0LCBicmFja2V0aW5nIGFsbCBmaWxlcyB0aGF0IHVzZSB0aGUgY29sbGVjdG9yLgpTZWUgbXcvZ2N0ZXN0LrkgZm9yIGFuIGV4YW1wbGUuCgpJbmNsdWRlIHRoZSBwcm9qZWN0cy9saWJyYXJpZXMgeW91IGJ1aWx0IGFib3ZlIGludG8geW91ciBvd24gcHJvamVjdCwKI2luY2x1ZGUgImdjLmgiLCBhbmQgY2FsbCBHQ19tYWxsb2MuIFlvdSBkb24ndCBoYXZlIHRvIGNhbGwgR0NfZnJlZS4KCgpQYXRyaWNrIEMuIEJlYXJkCkphbnVhcnkgNCwgMTk5NQo=