ZGlmZiAtLWdpdCBhL0NPTlRSSUJVVElORy5tZCBiL0NPTlRSSUJVVElORy5tZAppbmRleCBiNjc0ZGE5Li44ZmY1MmQ3IDEwMDY0NAotLS0gYS9DT05UUklCVVRJTkcubWQKKysrIGIvQ09OVFJJQlVUSU5HLm1kCkBAIC01LDkgKzUsOSBAQAogVGhpcyBndWlkZSBtYWlubHkgZm9jdXNlcyBvbiB0aGUgcHJvcGVyIHVzZSBvZiBHaXQuCiAKICMjIyAxLiBCZWZvcmUgb3BlbmluZyBhbiBpc3N1ZQotVG8gcmVwb3J0IGEgYnVnL3JlcXVlc3QgcGxlYXNlIGZpbGUgYW4gaXNzdWUgaW4gdGhlIHJpZ2h0IHJlcG9zaXRvcnkKLShleGFtcGxlIGZvciBbc3RtMzJmNHh4X2hhbF9kcml2ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJmNHh4X2hhbF9kcml2ZXIvaXNzdWVzL25ldy9jaG9vc2UpKS4KLUJ1dCBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgorSW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB5b3VyIGJ1ZyByZXBvcnRzIGFuZCByZXF1ZXN0cyBhbmQgdG8gZWFzZSB0aGVpciB0cmFja2luZyBwbGVhc2UgZmlsZSBhbiBpc3N1ZSBpbnRvIHRoZSBmaXJtd2FyZSByZXBvc2l0b3J5IFtTVE0zMkN1YmVGNF0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9TVE0zMkN1YmVGNC9pc3N1ZXMvbmV3L2Nob29zZSkuCisKK1BsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgogCiAtIFsgXSBgTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCBjb21taXQgKG1ham9yIHJlbGVhc2VzIGFyZSBUYWdnZWQsIGJ1dCBjb3JyZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIG5ldyBjb21taXRzKS5gCiAtIFsgXSBgTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgYSBxdWVzdGlvbi9mZWVkYmFjay9zdWdnZXN0aW9ucyBSRUxBVEVEIFRPIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHJlcG8uYCBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBkaXNjdXNzZWQgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgpAQCAtMTUsNyArMTUsNyBAQAogCiAKICMjIyAyLiBQb3N0aW5nIHRoZSBpc3N1ZQotV2hlbiB5b3UgaGF2ZSBjaGVja2VkIHRoZSBwcmV2aW91cyBib3hlcy4gWW91IHdpbGwgZmluZCB0d28gdGVtcGxhdGVzIElzc3VlcyAoQnVnIFJlcG9ydCBvciBPdGhlciBJc3N1ZSkgYXZhaWxhYmxlIGluIHRoZSAqKklzc3VlcyoqIHRhYiBvZiB0aGUgcmVwbworT25jZSB5b3UgaGF2ZSBjaGVja2VkIHRoZSBwcmV2aW91cyBib3hlcywgeW91IHdpbGwgZmluZCB0d28gdGVtcGxhdGVzIGZvciBpc3N1ZXMgKEJ1ZyBSZXBvcnQgb3IgT3RoZXIgSXNzdWUpIGF2YWlsYWJsZSBpbiB0aGUgKipJc3N1ZXMqKiB0YWIgb2YgdGhlIGZpcm13YXJlIHJlcG9zaXRvcnkuCiAKICMjIyAzLiBQdWxsIFJlcXVlc3RzCi1Gb3IgdGhlIG1vbWVudCwgdGhlIFB1bGwgUmVxdWVzdCBmZWF0dXJlIGlzIG5vdCBkZXBsb3llZC4gU1RNaWNyb2xlY3Ryb25pY3MgaXMgd29ya2luZyBvbiBhIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IHByb2NlZHVyZQorRm9yIHRoZSBtb21lbnQsIHRoZSBQdWxsIFJlcXVlc3QgZmVhdHVyZSBpcyBub3QgZGVwbG95ZWQuIFNUTWljcm9sZWN0cm9uaWNzIGlzIHdvcmtpbmcgb24gYSBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKSBwcm9jZWR1cmUuCmRpZmYgLS1naXQgYS9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCmluZGV4IGYwODVlMmQuLjkwNzY3ZWQgMTAwNjQ0Ci0tLSBhL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCisrKyBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCkBAIC0yNDEsNyArMjQxLDcgQEAKICNkZWZpbmUgREFDX0NISVBDT05ORUNUX0VOQUJMRSAgICAgICAgREFDX0NISVBDT05ORUNUX0lOVEVSTkFMCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoU1RNMzJMMSkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkY0KQorI2lmIGRlZmluZWQoU1RNMzJMMSkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJMNSkgfHwgZGVmaW5lZChTVE0zMkg3KSB8fCBkZWZpbmVkKFNUTTMyRjQpCiAjZGVmaW5lIEhBTF9EQUNfTVNQX0lOSVRfQ0JfSUQgICAgICAgSEFMX0RBQ19NU1BJTklUX0NCX0lECiAjZGVmaW5lIEhBTF9EQUNfTVNQX0RFSU5JVF9DQl9JRCAgICAgSEFMX0RBQ19NU1BERUlOSVRfQ0JfSUQKICNlbmRpZgpAQCAtOTU1LDcgKzk1NSw3IEBACiAjZGVmaW5lIE9QQU1QX1BHQUNPTk5FQ1RfVk0wICAgICAgICAgICAgICAgICAgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8wCiAjZGVmaW5lIE9QQU1QX1BHQUNPTk5FQ1RfVk0xICAgICAgICAgICAgICAgICAgT1BBTVBfUEdBX0NPTk5FQ1RfSU5WRVJUSU5HSU5QVVRfSU8xCiAKLSNpZiBkZWZpbmVkKFNUTTMyTDEpIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkg3KQorI2lmIGRlZmluZWQoU1RNMzJMMSkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJINykKICNkZWZpbmUgSEFMX09QQU1QX01TUF9JTklUX0NCX0lEICAgICAgIEhBTF9PUEFNUF9NU1BJTklUX0NCX0lECiAjZGVmaW5lIEhBTF9PUEFNUF9NU1BfREVJTklUX0NCX0lEICAgICBIQUxfT1BBTVBfTVNQREVJTklUX0NCX0lECiAjZW5kaWYKQEAgLTE1MzEsMTggKzE1MzEsMTggQEAKIAogI2RlZmluZSBIQUxfSTJDRmFzdE1vZGVQbHVzQ29uZmlnKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMsIGNtZCkgKCgoY21kKT09RU5BQkxFKT8gSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzKTogSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXMoU1lTQ0ZHX0kyQ0Zhc3RNb2RlUGx1cykpCiAKLSNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMSkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkc0KQorI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJGMCkgfHwgZGVmaW5lZChTVE0zMkYxKSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJGMykgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJHNCkKICNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCAgSEFMX0kyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUCiAjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCAgIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0lUCiAjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9JVCAgIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0lUCiAjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9SZWNlaXZlX0lUICAgIEhBTF9JMkNfU2xhdmVfU2VxX1JlY2VpdmVfSVQKLSNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyV0IgIHx8IFNUTTMyRzAgfHwgU1RNMzJGMCB8fCBTVE0zMkYxIHx8IFNUTTMyRjIgfHwgU1RNMzJGMyB8fCBTVE0zMkY0IHx8IFNUTTMyRjcgfHwgU1RNMzJMMCB8fCBTVE0zMkw0IHx8IFNUTTMyRzQgKi8KLSNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJHNCkKKyNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyV0IgIHx8IFNUTTMyRzAgfHwgU1RNMzJGMCB8fCBTVE0zMkYxIHx8IFNUTTMyRjIgfHwgU1RNMzJGMyB8fCBTVE0zMkY0IHx8IFNUTTMyRjcgfHwgU1RNMzJMMCB8fCBTVE0zMkw0IHx8IFNUTTMyTDUgfHwgU1RNMzJHNCAqLworI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkw1KSB8fCBkZWZpbmVkKFNUTTMyRzQpCiAjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfRE1BIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9ETUEKICNkZWZpbmUgSEFMX0kyQ19NYXN0ZXJfU2VxdWVudGlhbF9SZWNlaXZlX0RNQSAgSEFMX0kyQ19NYXN0ZXJfU2VxX1JlY2VpdmVfRE1BCiAjZGVmaW5lIEhBTF9JMkNfU2xhdmVfU2VxdWVudGlhbF9UcmFuc21pdF9ETUEgIEhBTF9JMkNfU2xhdmVfU2VxX1RyYW5zbWl0X0RNQQogI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgICBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0RNQQotI2VuZGlmIC8qIFNUTTMySDcgfHwgU1RNMzJXQiAgfHwgU1RNMzJHMCB8fCBTVE0zMkY0IHx8IFNUTTMyRjcgfHwgU1RNMzJMMCB8fCBTVE0zMkw0IHx8IFNUTTMyRzQgKi8KKyNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyV0IgIHx8IFNUTTMyRzAgfHwgU1RNMzJGNCB8fCBTVE0zMkY3IHx8IFNUTTMyTDAgfHwgU1RNMzJMNCB8fCBTVE0zMkw1IHx8IFNUTTMyRzQgKi8KIAogI2lmIGRlZmluZWQoU1RNMzJGNCkKICNkZWZpbmUgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxdWVudGlhbF9UcmFuc21pdF9JVCAgSEFMX0ZNUEkyQ19NYXN0ZXJfU2VxX1RyYW5zbWl0X0lUCkBAIC0zMjQ1LDcgKzMyNDUsNyBAQAogCiAjaWYgZGVmaW5lZChTVE0zMkw0KQogI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFX05PX0NMSyAgICAgUkNDX1JUQ0NMS1NPVVJDRV9OT05FCi0jZWxpZiBkZWZpbmVkKFNUTTMyV0IpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkc0KQorI2VsaWYgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJHNCkgfHwgZGVmaW5lZChTVE0zMkw1KQogI2Vsc2UKICNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9OT05FICAgICAgIFJDQ19SVENDTEtTT1VSQ0VfTk9fQ0xLCiAjZW5kaWYKQEAgLTMzNzMsNyArMzM3Myw3IEBACiAvKiogQGRlZmdyb3VwIEhBTF9SVENfQWxpYXNlZF9NYWNyb3MgSEFMIFJUQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQogICAqIEB7CiAgICovCi0jaWYgZGVmaW5lZCAoU1RNMzJHMCkgfHwgZGVmaW5lZCAoU1RNMzJMNDEyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDQyMnh4KSB8fCBkZWZpbmVkIChTVE0zMkc0KQorI2lmIGRlZmluZWQgKFNUTTMyRzApIHx8IGRlZmluZWQgKFNUTTMyTDUpIHx8IGRlZmluZWQgKFNUTTMyTDQxMnh4KSB8fCBkZWZpbmVkIChTVE0zMkw0MjJ4eCkgfHwgZGVmaW5lZCAoU1RNMzJMNFA1eHgpIHx8IGRlZmluZWQgKFNUTTMyTDRRNXh4KSB8fCBkZWZpbmVkIChTVE0zMkc0KQogI2Vsc2UKICNkZWZpbmUgX19IQUxfUlRDX0NMRUFSX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgX19IQUxfUlRDX0VYVElfQ0xFQVJfRkxBRwogI2VuZGlmCkBAIC0zNDk2LDcgKzM0OTYsNyBAQAogI2RlZmluZSAgSEFMX1NEX0NhcmRTdGF0ZVR5cGVkZWYgICAgIEhBTF9TRF9DYXJkU3RhdGVUeXBlRGVmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoU1RNMzJINykKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJMNSkKICNkZWZpbmUgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmZmVyMENwbHRDYWxsYmFjayAgIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZjBDcGx0Q2FsbGJhY2sKICNkZWZpbmUgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmZmVyMUNwbHRDYWxsYmFjayAgIEhBTF9NTUNFeF9SZWFkX0RNQURvdWJsZUJ1ZjFDcGx0Q2FsbGJhY2sKICNkZWZpbmUgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZmZlcjBDcGx0Q2FsbGJhY2sgIEhBTF9NTUNFeF9Xcml0ZV9ETUFEb3VibGVCdWYwQ3BsdENhbGxiYWNrCkBAIC0zNzUxLDkgKzM3NTEsOSBAQAogLyoqIEBkZWZncm91cCBIQUxfUVNQSV9BbGlhc2VkX01hY3JvcyBIQUwgUVNQSSBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQogICAqIEB7CiAgICovCi0jaWYgZGVmaW5lZCAoU1RNMzJMNCkKKyNpZiBkZWZpbmVkIChTVE0zMkw0KSB8fCBkZWZpbmVkIChTVE0zMkY0KSB8fCBkZWZpbmVkIChTVE0zMkY3KQogI2RlZmluZSBIQUxfUVBTSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUgSEFMX1FTUElfVElNRU9VVF9ERUZBVUxUX1ZBTFVFCi0jZW5kaWYKKyNlbmRpZiAvKiBTVE0zMkw0IHx8IFNUTTMyRjQgfHwgU1RNMzJGNyAqLwogLyoqCiAgICogQH0KICAgKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY0eHhfaGFsX2NyeXAuaCBiL0luYy9zdG0zMmY0eHhfaGFsX2NyeXAuaAppbmRleCA4MjUxZWJkLi5kYzlkZTZlIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmNHh4X2hhbF9jcnlwLmgKKysrIGIvSW5jL3N0bTMyZjR4eF9oYWxfY3J5cC5oCkBAIC02LDIzICs2LDIzIEBACiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqIEBhdHRlbnRpb24KICAgKgotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgICoKICAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKLSAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKi8gCisgICovCiAKIC8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaWZuZGVmIF9fU1RNMzJGNHh4X0hBTF9DUllQX0gKICNkZWZpbmUgX19TVE0zMkY0eHhfSEFMX0NSWVBfSAogCiAjaWZkZWYgX19jcGx1c3BsdXMKLSBleHRlcm4gIkMiIHsKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKIApAQCAtNTEsODcgKzUxLDk3IEBACiB7CiAgIHVpbnQzMl90IERhdGFUeXBlOyAgICAgICAgICAgICAgICAgICAvKiE8IDMyLWJpdCBkYXRhLCAxNi1iaXQgZGF0YSwgOC1iaXQgZGF0YSBvciAxLWJpdCBzdHJpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDUllQX0RhdGFfVHlwZSAqLwotICB1aW50MzJfdCBLZXlTaXplOyAgICAgICAgICAgICAgICAgICAgLyohPCBVc2VkIG9ubHkgaW4gQUVTIG1vZGUgOiAxMjgsIDE5MiBvciAyNTYgYml0IGtleSBsZW5ndGggaW4gQ1JZUDEuIAorICB1aW50MzJfdCBLZXlTaXplOyAgICAgICAgICAgICAgICAgICAgLyohPCBVc2VkIG9ubHkgaW4gQUVTIG1vZGUgOiAxMjgsIDE5MiBvciAyNTYgYml0IGtleSBsZW5ndGggaW4gQ1JZUDEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4IG9yIDI1NiBiaXQga2V5IGxlbmd0aCBpbiBUaW55QUVTIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ1JZUF9LZXlfU2l6ZSAqLwotICB1aW50MzJfdCogcEtleTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbiAqLwotICB1aW50MzJfdCogcEluaXRWZWN0OyAgICAgICAgICAgICAgICAgLyohPCBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHVzZWQgYWxzbyBhcyBpbml0aWFsaXphdGlvbgorICB1aW50MzJfdCAqcEtleTsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUga2V5IHVzZWQgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbiAqLworICB1aW50MzJfdCAqcEluaXRWZWN0OyAgICAgICAgICAgICAgICAgLyohPCBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHVzZWQgYWxzbyBhcyBpbml0aWFsaXphdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyIGluIENUUiBtb2RlICovCi0gIHVpbnQzMl90IEFsZ29yaXRobTsgICAgICAgICAgICAgICAgICAvKiE8ICBERVMvIFRERVMgQWxnb3JpdGhtIEVDQi9DQkMgCisgIHVpbnQzMl90IEFsZ29yaXRobTsgICAgICAgICAgICAgICAgICAvKiE8ICBERVMvIFRERVMgQWxnb3JpdGhtIEVDQi9DQkMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVMgQWxnb3JpdGhtIEVDQi9DQkMvQ1RSL0dDTSBvciBDQ00KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENSWVBfQWxnb3JpdGhtX01vZGUgKi8KLSAgdWludDMyX3QqIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgIC8qITwgdXNlZCBvbmx5IGluIEFFUyBHQ00gYW5kIENDTSBBbGdvcml0aG0gZm9yIGF1dGhlbnRpY2F0aW9uLAorICB1aW50MzJfdCAqSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgLyohPCB1c2VkIG9ubHkgaW4gQUVTIEdDTSBhbmQgQ0NNIEFsZ29yaXRobSBmb3IgYXV0aGVudGljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NNIDogYWxzbyBrbm93biBhcyBBZGRpdGlvbmFsIEF1dGhlbnRpY2F0aW9uIERhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ00gOiBuYW1lZCBCMSBjb21wb3NlZCBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBhbmQgQXNzb2NpYXRlZCBEYXRhLiAqLwogICB1aW50MzJfdCBIZWFkZXJTaXplOyAgICAgICAgICAgICAgICAvKiE8IFRoZSBzaXplIG9mIGhlYWRlciBidWZmZXIgaW4gd29yZCAgKi8KLSAgdWludDMyX3QqIEIwOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBCMCBpcyBmaXJzdCBhdXRoZW50aWNhdGlvbiBibG9jayB1c2VkIG9ubHkgIGluIEFFUyBDQ00gbW9kZSAqLworICB1aW50MzJfdCAqQjA7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEIwIGlzIGZpcnN0IGF1dGhlbnRpY2F0aW9uIGJsb2NrIHVzZWQgb25seSAgaW4gQUVTIENDTSBtb2RlICovCiAgIHVpbnQzMl90IERhdGFXaWR0aFVuaXQ7ICAgICAgICAgICAgICAvKiE8IERhdGEgV2l0aCBVbml0LCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgdmFsdWUgb2YgQHJlZiBDUllQX0RhdGFfV2lkdGhfVW5pdCovCisgIHVpbnQzMl90IEtleUlWQ29uZmlnU2tpcDsgICAgICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gc2tpcCwgdG8gY29uZmlnIEtleSBhbmQgSW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3Igb25seSBvbmNlIGFuZCB0byBza2lwIGNvbmZpZ3VyYXRpb24gZm9yIGNvbnNlY3V0aXZlIHByb2Nlc3NpbmdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ1JZUF9Db25maWd1cmF0aW9uX1NraXAgKi8KIAotfUNSWVBfQ29uZmlnVHlwZURlZjsKK30gQ1JZUF9Db25maWdUeXBlRGVmOwogCiAKIC8qKgogICAqIEBicmllZiAgQ1JZUCBTdGF0ZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgogICAqLwotICAgIAorCiB0eXBlZGVmIGVudW0KIHsKICAgSEFMX0NSWVBfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgQ1JZUCBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAqLwogICBIQUxfQ1JZUF9TVEFURV9SRUFEWSAgICAgICAgICAgICA9IDB4MDFVLCAgLyohPCBDUllQIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCiAgIEhBTF9DUllQX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUgIC8qITwgQ1JZUCBCVVNZLCBpbnRlcm5hbCBwcm9jZXNzaW5nIGlzIG9uZ29pbmcgICovCi19SEFMX0NSWVBfU1RBVEVUeXBlRGVmOwotICAKK30gSEFMX0NSWVBfU1RBVEVUeXBlRGVmOworCiAKIC8qKgogICAqIEBicmllZiAgQ1JZUCBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KICAgKi8KLSAgCisKIHR5cGVkZWYgc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmCiB7CiAjaWYgZGVmaW5lZCAoQ1JZUCkKLSAgICAgIENSWVBfVHlwZURlZiAgICAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgLyohPCBDUllQIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgKi8KKyAgQ1JZUF9UeXBlRGVmICAgICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAvKiE8IENSWVAgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAqLwogI2Vsc2UgLyogQUVTKi8KLSAgICAgIEFFU19UeXBlRGVmICAgICAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgLyohPCBBRVMgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovICAgCisgIEFFU19UeXBlRGVmICAgICAgICAgICAgICAgICAgICAgICAqSW5zdGFuY2U7ICAgICAgICAgICAgLyohPCBBRVMgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAKLSAgICAgIENSWVBfQ29uZmlnVHlwZURlZiAgICAgICAgICAgICAgICBJbml0OyAgICAgICAgICAgICAvKiE8IENSWVAgcmVxdWlyZWQgcGFyYW1ldGVycyAqLwotIAotICAgICAgRnVuY3Rpb25hbFN0YXRlICAgICAgICAgICAgICAgICAgIEF1dG9LZXlEZXJpdmF0aW9uOyAgIC8qITwgVXNlZCBvbmx5IGluIFRpbnlBRVMgdG8gYWxsb3dzIHRvIGJ5cGFzcyBvciBub3Qga2V5IHdyaXRlLXVwIGJlZm9yZSBkZWNyeXB0aW9uLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEVOQUJMRS9ESVNBQkxFICovICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ3J5cEluQnVmZlB0cjsgIC8qITwgUG9pbnRlciB0byBDUllQIHByb2Nlc3NpbmcgKGVuY3J5cHRpb24sIGRlY3J5cHRpb24sLi4uKSBidWZmZXIgKi8KKyAgQ1JZUF9Db25maWdUeXBlRGVmICAgICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgIC8qITwgQ1JZUCByZXF1aXJlZCBwYXJhbWV0ZXJzICovCiAKLSAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAqcENyeXBPdXRCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gQ1JZUCBwcm9jZXNzaW5nIChlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLC4uLikgYnVmZmVyICovCisgIEZ1bmN0aW9uYWxTdGF0ZSAgICAgICAgICAgICAgICAgICBBdXRvS2V5RGVyaXZhdGlvbjsgICAvKiE8IFVzZWQgb25seSBpbiBUaW55QUVTIHRvIGFsbG93cyB0byBieXBhc3Mgb3Igbm90IGtleSB3cml0ZS11cCBiZWZvcmUgZGVjcnlwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEVOQUJMRS9ESVNBQkxFICovCiAKLSAgICAgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBDcnlwSGVhZGVyQ291bnQ7ICAgLyohPCBDb3VudGVyIG9mIGhlYWRlciBkYXRhICovCi0gICAgICAKLSAgICAgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBDcnlwSW5Db3VudDsgICAgICAvKiE8IENvdW50ZXIgb2YgaW5wdXQgZGF0YSAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDcnlwSW5CdWZmUHRyOyAgLyohPCBQb2ludGVyIHRvIENSWVAgcHJvY2Vzc2luZyAoZW5jcnlwdGlvbiwgZGVjcnlwdGlvbiwuLi4pIGJ1ZmZlciAqLwogCi0gICAgICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgQ3J5cE91dENvdW50OyAgICAgLyohPCBDb3VudGVyIG9mIG91dHB1dCBkYXRhICovCi0gICAgICAKLSAgICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgLyohPCBsZW5ndGggb2YgaW5wdXQgZGF0YSBpbiB3b3JkICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAqcENyeXBPdXRCdWZmUHRyOyAvKiE8IFBvaW50ZXIgdG8gQ1JZUCBwcm9jZXNzaW5nIChlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLC4uLikgYnVmZmVyICovCiAKLSAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBQaGFzZTsgICAgICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBwaGFzZSAqLworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgQ3J5cEhlYWRlckNvdW50OyAgIC8qITwgQ291bnRlciBvZiBoZWFkZXIgZGF0YSAqLwogCi0gICAgICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAgICAgKmhkbWFpbjsgICAgICAgICAgLyohPCBDUllQIEluIERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgQ3J5cEluQ291bnQ7ICAgICAgLyohPCBDb3VudGVyIG9mIGlucHV0IGRhdGEgKi8KIAotICAgICAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAgICpoZG1hb3V0OyAgICAgICAgIC8qITwgQ1JZUCBPdXQgRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBDcnlwT3V0Q291bnQ7ICAgICAvKiE8IENvdW50ZXIgb2Ygb3V0cHV0IGRhdGEgKi8KIAotICAgICAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgIC8qITwgQ1JZUCBsb2NraW5nIG9iamVjdCAqLworICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgIC8qITwgbGVuZ3RoIG9mIGlucHV0IGRhdGEgaW4gd29yZCAqLwogCi0gICAgICBfX0lPICBIQUxfQ1JZUF9TVEFURVR5cGVEZWYgICAgICAgU3RhdGU7ICAgICAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KLSAgICAgIAotICAgICAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGVycm9yIGNvZGUgKi8KLSAgICAgIAorICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgUGhhc2U7ICAgICAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgcGhhc2UgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAgICAgKmhkbWFpbjsgICAgICAgICAgLyohPCBDUllQIEluIERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICAgICAqaGRtYW91dDsgICAgICAgICAvKiE8IENSWVAgT3V0IERNQSBoYW5kbGUgcGFyYW1ldGVycyAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IENSWVAgbG9ja2luZyBvYmplY3QgKi8KKworICBfX0lPICBIQUxfQ1JZUF9TVEFURVR5cGVEZWYgICAgICAgU3RhdGU7ICAgICAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKworICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgZXJyb3IgY29kZSAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJVkNvbmZpZzsgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gZmxhZywgdXNlZCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHNraXBwZWQgKi8KKworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZXNTdW07ICAgICAgICAgLyohPCBTdW0gb2Ygc3VjY2Vzc2l2ZSBwYXlsb2FkcyBsZW5ndGhzIChpbiBieXRlcyksIHN0b3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBzaW5nbGUgc2lnbmF0dXJlIGNvbXB1dGF0aW9uIGFmdGVyIHNldmVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgcHJvY2Vzc2luZyAqLworCiAjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSB2b2lkICgqSW5DcGx0Q2FsbGJhY2spICAgIChzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKiBoY3J5cCk7IC8qITwgQ1JZUCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAgKi8KLSB2b2lkICgqT3V0Q3BsdENhbGxiYWNrKSAgIChzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKiBoY3J5cCk7IC8qITwgQ1JZUCBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KLSB2b2lkICgqRXJyb3JDYWxsYmFjaykgICAgIChzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKiBoY3J5cCk7IC8qITwgQ1JZUCBFcnJvciBjYWxsYmFjayAqLwotIAotIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKSAgKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqIGhjcnlwKTsgLyohPCBDUllQIE1zcCBJbml0IGNhbGxiYWNrICAqLwotIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqIGhjcnlwKTsgLyohPCBDUllQIE1zcCBEZUluaXQgY2FsbGJhY2sgICovCisgIHZvaWQgKCpJbkNwbHRDYWxsYmFjaykoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAgICAgLyohPCBDUllQIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLworICB2b2lkICgqT3V0Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsgICAgIC8qITwgQ1JZUCBPdXRwdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKkVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAgICAvKiE8IENSWVAgRXJyb3IgY2FsbGJhY2sgKi8KIAotI2VuZGlmIC8qIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLyAKLX1DUllQX0hhbmRsZVR5cGVEZWY7CisgIHZvaWQgKCogTXNwSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsgICAgLyohPCBDUllQIE1zcCBJbml0IGNhbGxiYWNrICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsgIC8qITwgQ1JZUCBNc3AgRGVJbml0IGNhbGxiYWNrICAqLworCisjZW5kaWYgLyogKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCit9IENSWVBfSGFuZGxlVHlwZURlZjsKIAogCiAvKioKQEAgLTE1Miw3ICsxNjIsNyBAQAogICBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEICAgICAgICA9IDB4MDRVLCAgICAvKiE8IENSWVAgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICovCiAgIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCAgICAgID0gMHgwNVUgICAgIC8qITwgQ1JZUCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgICAgKi8KIAotfUhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmOworfSBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZjsKIC8qKgogICAqIEB9CiAgICovCkBAIC0xNjIsNyArMTcyLDcgQEAKICAgKiBAewogICAqLwogCi10eXBlZGVmICB2b2lkICgqcENSWVBfQ2FsbGJhY2tUeXBlRGVmKShDUllQX0hhbmRsZVR5cGVEZWYgKiBoY3J5cCk7ICAgLyohPCBwb2ludGVyIHRvIGEgY29tbW9uIENSWVAgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgIHZvaWQgKCpwQ1JZUF9DYWxsYmFja1R5cGVEZWYpKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gQ1JZUCBjYWxsYmFjayBmdW5jdGlvbiAqLwogCiAvKioKICAgKiBAfQpAQCAtMTgxLDcgKzE5MSw3IEBACiAjZGVmaW5lIEhBTF9DUllQX0VSUk9SX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAvKiE8IE5vIGVycm9yICAgICAgICAqLwogI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9XUklURSAgICAgICAgICAgICAweDAwMDAwMDAxVSAgLyohPCBXcml0ZSBlcnJvciAgICAgKi8KICNkZWZpbmUgSEFMX0NSWVBfRVJST1JfUkVBRCAgICAgICAgICAgICAgMHgwMDAwMDAwMlUgIC8qITwgUmVhZCBlcnJvciAgICAgICovCi0jZGVmaW5lIEhBTF9DUllQX0VSUk9SX0RNQSAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVICAvKiE8IERNQSBlcnJvciAgICAgICAqLyAgCisjZGVmaW5lIEhBTF9DUllQX0VSUk9SX0RNQSAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVICAvKiE8IERNQSBlcnJvciAgICAgICAqLwogI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9CVVNZICAgICAgICAgICAgICAweDAwMDAwMDA4VSAgLyohPCBCdXN5IGZsYWcgZXJyb3IgKi8KICNkZWZpbmUgSEFMX0NSWVBfRVJST1JfVElNRU9VVCAgICAgICAgICAgMHgwMDAwMDAxMFUgIC8qITwgVGltZW91dCBlcnJvciAqLwogI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEICAgICAweDAwMDAwMDIwVSAgLyohPCBOb3Qgc3VwcG9ydGVkIG1vZGUgKi8KQEAgLTE4OSwyMSArMTk5LDIxIEBACiAjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICNkZWZpbmUgIEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLS8qKiAKKy8qKgogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgQ1JZUF9EYXRhX1dpZHRoX1VuaXQgQ1JZUCBEYXRhIFdpZHRoIFVuaXQgCisvKiogQGRlZmdyb3VwIENSWVBfRGF0YV9XaWR0aF9Vbml0IENSWVAgRGF0YSBXaWR0aCBVbml0CiAgICogQHsKICAgKi8KIAogI2RlZmluZSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCAgIDB4MDAwMDAwMDBVICAvKiE8IEJ5IGRlZmF1bHQsIHNpemUgdW5pdCBpcyB3b3JkICovCi0jZGVmaW5lIENSWVBfREFUQVdJRFRIVU5JVF9CWVRFICAgMHgwMDAwMDAwMVUgIC8qITwgQnkgZGVmYXVsdCwgc2l6ZSB1bml0IGlzIHdvcmQgKi8gICAKKyNkZWZpbmUgQ1JZUF9EQVRBV0lEVEhVTklUX0JZVEUgICAweDAwMDAwMDAxVSAgLyohPCBCeSBkZWZhdWx0LCBzaXplIHVuaXQgaXMgd29yZCAqLwogCi0vKiogCisvKioKICAgKiBAfQotICAqLyAKLSAgICAKKyAgKi8KKwogLyoqIEBkZWZncm91cCBDUllQX0FsZ29yaXRobV9Nb2RlIENSWVAgQWxnb3JpdGhtIE1vZGUKICAgKiBAewogICAqLwpAQCAtMjEyLDE0ICsyMjIsMTQgQEAKICNkZWZpbmUgQ1JZUF9ERVNfRUNCICAgICBDUllQX0NSX0FMR09NT0RFX0RFU19FQ0IKICNkZWZpbmUgQ1JZUF9ERVNfQ0JDICAgICBDUllQX0NSX0FMR09NT0RFX0RFU19DQkMKICNkZWZpbmUgQ1JZUF9UREVTX0VDQiAgICBDUllQX0NSX0FMR09NT0RFX1RERVNfRUNCCi0jZGVmaW5lIENSWVBfVERFU19DQkMgICAgQ1JZUF9DUl9BTEdPTU9ERV9UREVTX0NCQyAKKyNkZWZpbmUgQ1JZUF9UREVTX0NCQyAgICBDUllQX0NSX0FMR09NT0RFX1RERVNfQ0JDCiAjZGVmaW5lIENSWVBfQUVTX0VDQiAgICAgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfRUNCCiAjZGVmaW5lIENSWVBfQUVTX0NCQyAgICAgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfQ0JDCiAjZGVmaW5lIENSWVBfQUVTX0NUUiAgICAgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfQ1RSCiAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQotI2RlZmluZSBDUllQX0FFU19HQ00gICAgIENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSAgICAKKyNkZWZpbmUgQ1JZUF9BRVNfR0NNICAgICBDUllQX0NSX0FMR09NT0RFX0FFU19HQ00KICNkZWZpbmUgQ1JZUF9BRVNfQ0NNICAgICBDUllQX0NSX0FMR09NT0RFX0FFU19DQ00KLSNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLyAKKyNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLwogI2Vsc2UgLyogQUVTKi8KICNkZWZpbmUgQ1JZUF9BRVNfRUNCICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWxlY3Ryb25pYyBjb2RlYm9vayBjaGFpbmluZyBhbGdvcml0aG0gICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgQ1JZUF9BRVNfQ0JDICAgICAgICAgICAgQUVTX0NSX0NITU9EXzAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2lwaGVyIGJsb2NrIGNoYWluaW5nIGFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIyOCw3ICsyMzgsNyBAQAogI2RlZmluZSBDUllQX0FFU19DQ00gICAgICAgICAgICBBRVNfQ1JfQ0hNT0RfMiAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHdpdGggQ2lwaGVyIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogCi0vKiogCisvKioKICAgKiBAfQogICAqLwogCkBAIC0yNDAsMTAgKzI1MCwxMCBAQAogI2RlZmluZSBDUllQX0tFWVNJWkVfMTkyQiAgICAgICAgIENSWVBfQ1JfS0VZU0laRV8wCiAjZGVmaW5lIENSWVBfS0VZU0laRV8yNTZCICAgICAgICAgQ1JZUF9DUl9LRVlTSVpFXzEKICNlbHNlIC8qIEFFUyovCi0jZGVmaW5lIENSWVBfS0VZU0laRV8xMjhCICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCAxMjgtYml0IGxvbmcga2V5ICovIAotI2RlZmluZSBDUllQX0tFWVNJWkVfMjU2QiAgICAgICAgIEFFU19DUl9LRVlTSVpFICAgICAgIC8qITwgMjU2LWJpdCBsb25nIGtleSAqLyAKKyNkZWZpbmUgQ1JZUF9LRVlTSVpFXzEyOEIgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IDEyOC1iaXQgbG9uZyBrZXkgKi8KKyNkZWZpbmUgQ1JZUF9LRVlTSVpFXzI1NkIgICAgICAgICBBRVNfQ1JfS0VZU0laRSAgICAgICAvKiE8IDI1Ni1iaXQgbG9uZyBrZXkgKi8KICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KLS8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKioKICAgKiBAfQogICAqLwogCkBAIC0yNjEsMTUgKzI3MSwxNSBAQAogI2RlZmluZSBDUllQX0RBVEFUWVBFXzhCICAgICAgICAgIEFFU19DUl9EQVRBVFlQRV8xICAgICAgIC8qITwgOC1iaXQgZGF0YSB0eXBlIChieXRlIHN3YXBwaW5nKSAgICAgICAqLwogI2RlZmluZSBDUllQX0RBVEFUWVBFXzFCICAgICAgICAgIEFFU19DUl9EQVRBVFlQRSAgICAgICAgIC8qITwgMS1iaXQgZGF0YSB0eXBlIChiaXQgc3dhcHBpbmcpICAgICAgICAqLwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAgIAotLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqCiAgICogQH0KICAgKi8KIAogLyoqIEBkZWZncm91cCBDUllQX0ludGVycnVwdCAgQ1JZUCBJbnRlcnJ1cHQKICAgKiBAewogICAqLwotI2lmIGRlZmluZWQgKENSWVApIAorI2lmIGRlZmluZWQgKENSWVApCiAjZGVmaW5lIENSWVBfSVRfSU5JICAgICAgIENSWVBfSU1TQ1JfSU5JTSAgIC8qITwgSW5wdXQgRklGTyBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgQ1JZUF9JVF9PVVRJICAgICAgQ1JZUF9JTVNDUl9PVVRJTSAgLyohPCBPdXRwdXQgRklGTyBJbnRlcnJ1cHQgKi8KICNlbHNlIC8qIEFFUyovCkBAIC0yOTcsNyArMzA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEga2V5IHByZXBhcmF0aW9uIChmb3IgQUVTIGRlY3J5cHRpb24pLiAqLwogLyogRmxhZ3MgaW4gdGhlIFJJU1IgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQ1JZUF9GTEFHX09VVFJJUyAgMHgwMTAwMDAwMlUgIC8qITwgT3V0cHV0IEZJRk8gc2VydmljZSByYXcgaW50ZXJydXB0IHN0YXR1cyAqLwotI2RlZmluZSBDUllQX0ZMQUdfSU5SSVMgICAweDAxMDAwMDAxVSAgLyohPCBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBzdGF0dXMqLyAgCisjZGVmaW5lIENSWVBfRkxBR19JTlJJUyAgIDB4MDEwMDAwMDFVICAvKiE8IElucHV0IEZJRk8gc2VydmljZSByYXcgaW50ZXJydXB0IHN0YXR1cyovCiAjZWxzZSAvKiBBRVMqLwogLyogc3RhdHVzIGZsYWdzICovCiAjZGVmaW5lIENSWVBfRkxBR19CVVNZICAgIEFFU19TUl9CVVNZICAgLyohPCBHQ00gcHJvY2VzcyBzdXNwZW5zaW9uIGZvcmJpZGRlbiAqLwpAQCAtMzEyLDcgKzMyMiwxOCBAQAogLyoqCiAgICogQH0KICAgKi8KLSAgICAKKworLyoqIEBkZWZncm91cCBDUllQX0NvbmZpZ3VyYXRpb25fU2tpcCBDUllQIEtleSBhbmQgSVYgQ29uZmlndXJhdGlvbiBTa2lwIE1vZGUKKyAgKiBAeworICAqLworCisjZGVmaW5lIENSWVBfS0VZSVZDT05GSUdfQUxXQVlTICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gdG8gZG8gc3lzdGVtYXRpY2FsbHkgKi8KKyNkZWZpbmUgQ1JZUF9LRVlJVkNPTkZJR19PTkNFICAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiB0byBkbyBvbmx5IG9uY2UgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCiAKIC8qKgogICAqIEB9CkBAIC0zMzYsNyArMzU3LDcgQEAKICNlbHNlCiAjZGVmaW5lIF9fSEFMX0NSWVBfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICggKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogLyoqCiAgICogQGJyaWVmICBFbmFibGUvRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXzogc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KQEAgLTM0NSwzMyArMzY2LDMzIEBACiAjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBDUllQX0NSX0NSWVBFTikKICNkZWZpbmUgX19IQUxfQ1JZUF9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAgfkNSWVBfQ1JfQ1JZUEVOKQotI2Vsc2UgLyogQUVTKi8gCisjZWxzZSAvKiBBRVMqLwogI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBBRVNfQ1JfRU4pCiAjZGVmaW5lIF9fSEFMX0NSWVBfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gIH5BRVNfQ1JfRU4pCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLyAgCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwogCiAvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBzdGF0dXMgZmxhZyBpcyBzZXQgb3Igbm90LgogICAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6Ci0gICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9GTEFHX0JVU1kgR0NNIHByb2Nlc3Mgc3VzcGVuc2lvbiBmb3JiaWRkZW4gIAotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IgCi0gICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9SREVSUiBSZWFkIEVycm9yIAotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGIENvbXB1dGF0aW9uIENvbXBsZXRlICAgICAgICAgICAgICAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0ZMQUdfQlVTWSBHQ00gcHJvY2VzcyBzdXNwZW5zaW9uIGZvcmJpZGRlbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1JERVJSIFJlYWQgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiBDb21wdXRhdGlvbiBDb21wbGV0ZQogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgQ1JZUDoKLSAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX0JVU1k6IFRoZSBDUllQIGNvcmUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgYSBibG9jayBvZiBkYXRhIAotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBrZXkgcHJlcGFyYXRpb24gKGZvciBBRVMgZGVjcnlwdGlvbikuIAorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfQlVTWTogVGhlIENSWVAgY29yZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyBhIGJsb2NrIG9mIGRhdGEKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEga2V5IHByZXBhcmF0aW9uIChmb3IgQUVTIGRlY3J5cHRpb24pLgogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSUZFTTogSW5wdXQgRklGTyBpcyBlbXB0eQogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSUZORjogSW5wdXQgRklGTyBpcyBub3QgZnVsbAogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSU5SSVM6IElucHV0IEZJRk8gc2VydmljZSByYXcgaW50ZXJydXB0IGlzIHBlbmRpbmcKICAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX09GTkU6IE91dHB1dCBGSUZPIGlzIG5vdCBlbXB0eQogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT0ZGVTogT3V0cHV0IEZJRk8gaXMgZnVsbAotICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT1VUUklTOiBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBpcyBwZW5kaW5nIAotICogQHJldHZhbCBUaGUgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT1VUUklTOiBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBpcyBwZW5kaW5nCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgogICAqLwogI2RlZmluZSBDUllQX0ZMQUdfTUFTSyAgMHgwMDAwMDAxRlUKLSNpZiBkZWZpbmVkKENSWVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgodWludDhfdCkoKF9fRkxBR19fKSA+PiAyNCkpID09IDB4MDFVKT8oKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SSVNSKSAmICgoX19GTEFHX18pICYgQ1JZUF9GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIENSWVBfRkxBR19NQVNLKSk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SSVNSKSAmICgoX19GTEFHX18pICYgQ1JZUF9GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIENSWVBfRkxBR19NQVNLKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SSVNSKSAmICgoX19GTEFHX18pICYgQ1JZUF9GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIENSWVBfRkxBR19NQVNLKSkpCiAjZWxzZSAvKiBBRVMqLwogI2RlZmluZSBfX0hBTF9DUllQX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KQEAgLTM4MCwxMiArNDAxLDEyIEBACiAgICogQHBhcmFtICBfX0ZMQUdfXzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0VSUl9DTEVBUiBSZWFkIChSREVSUikgb3IgV3JpdGUgRXJyb3IgKFdSRVJSKSBGbGFnIENsZWFyCi0gICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9DQ0ZfQ0xFQVIgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyAoQ0NGKSBDbGVhciAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9DQ0ZfQ0xFQVIgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyAoQ0NGKSBDbGVhcgogICAqIEBwYXJhbSAgX19IQU5ETEVfXzogc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIAotI2lmIGRlZmluZWQoQUVTKSAKKyNpZiBkZWZpbmVkKEFFUykKICNkZWZpbmUgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19GTEFHX18pKQogCiAKQEAgLTM5MywzNyArNDE0LDM5IEBACiAgICogQHBhcmFtIF9fSU5URVJSVVBUX186IENSWVAgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjawogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0VSUklFIEVycm9yIGludGVycnVwdCAodXNlZCBmb3IgUkRFUlIgYW5kIFdSRVJSKQotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0ICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgU3RhdGUgb2YgaW50ZXJydXB0aW9uIChUUlVFIG9yIEZBTFNFKS4KICAgKi8KIAotI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKIAogI2VuZGlmIC8qIEFFUyAqLwogCiAvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBpbnRlcnJ1cHQgaXMgc2V0IG9yIG5vdC4KICAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHRvIGNoZWNrLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1dSRVJSIFdyaXRlIEVycm9yIAotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfUkRFUlIgUmVhZCBFcnJvciAKLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiAgQ29tcHV0YXRpb24gQ29tcGxldGUgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1JERVJSIFJlYWQgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiAgQ29tcHV0YXRpb24gQ29tcGxldGUKICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIENSWVA6CiAgICogICAgICAgICAgICBAYXJnIENSWVBfSVRfSU5JOiBJbnB1dCBGSUZPIHNlcnZpY2UgbWFza2VkIGludGVycnVwdCBzdGF0dXMKICAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9JVF9PVVRJOiBPdXRwdXQgRklGTyBzZXJ2aWNlIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzCiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFRSVUUgb3IgRkFMU0UpLgogICAqLwotI2lmIGRlZmluZWQoQ1JZUCkgIAotI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPk1JU1IgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKyNpZiBkZWZpbmVkKENSWVApCisjZGVmaW5lIF9fSEFMX0NSWVBfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+TUlTUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQogI2Vsc2UgLyogQUVTKi8KICNkZWZpbmUgX19IQUxfQ1JZUF9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogCiAvKioKLSAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ1JZUCBpbnRlcnJ1cHQuICAKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ1JZUCBpbnRlcnJ1cHQuCiAgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fOiBDUllQIEludGVycnVwdC4KLSAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6ICAKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6CiAgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9FUlJJRSBFcnJvciBpbnRlcnJ1cHQgKHVzZWQgZm9yIFJERVJSIGFuZCBXUkVSUikKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRklFIENvbXB1dGF0aW9uIENvbXBsZXRlIGludGVycnVwdAogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgQ1JZUDoKQEAgLTQzMiwxNiArNDU1LDE2IEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2lmIGRlZmluZWQoQ1JZUCkgCisjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklNU0NSKSB8PSAoX19JTlRFUlJVUFRfXykpCi0jZWxzZSAvKiBBRVMqLyAKKyNlbHNlIC8qIEFFUyovCiAjZGVmaW5lIF9fSEFMX0NSWVBfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpIHw9IChfX0lOVEVSUlVQVF9fKSkKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDUllQIGludGVycnVwdC4KICAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IENSWVAgSW50ZXJydXB0LgotICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzogIAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0VSUklFIEVycm9yIGludGVycnVwdCAodXNlZCBmb3IgUkRFUlIgYW5kIFdSRVJSKQogICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBDUllQOgpAQCAtNDUwLDkgKzQ3Myw5IEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2lmIGRlZmluZWQoQ1JZUCkgCisjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JTVNDUikgJj0gfihfX0lOVEVSUlVQVF9fKSkKLSNlbHNlIC8qIEFFUyovICAKKyNlbHNlIC8qIEFFUyovCiAjZGVmaW5lIF9fSEFMX0NSWVBfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmPSB+KF9fSU5URVJSVVBUX18pKQogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogCkBAIC00NjIsNyArNDg1LDcgQEAKICNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pfHwgZGVmaW5lZCAoQUVTKQogLyogSW5jbHVkZSBDUllQIEhBTCBFeHRlbmRlZCBtb2R1bGUgKi8KICNpbmNsdWRlICJzdG0zMmY0eHhfaGFsX2NyeXBfZXguaCIKLSNlbmRpZiAvKiBBRVMgb3IgR0NNIENDTSBkZWZpbmVkKi8gICAgCisjZW5kaWYgLyogQUVTIG9yIEdDTSBDQ00gZGVmaW5lZCovCiAvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUllQIEV4cG9ydGVkIEZ1bmN0aW9ucwogICAqIEB7CkBAIC00NzAsMjggKzQ5MywzMSBAQAogCiAvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCiAgICogQHsKLSAgKi8gICAgCisgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9Jbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogdm9pZCBIQUxfQ1JZUF9Nc3BJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogdm9pZCBIQUxfQ1JZUF9Nc3BEZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Ci1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9TZXRDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgQ1JZUF9Db25maWdUeXBlRGVmICpwQ29uZiApOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfR2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYgKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1NldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0dldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKTsKICNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENSWVBfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKICAgKiBAewotICAqLyAKKyAgKi8KIAogLyogZW5jcnlwdGlvbi9kZWNyeXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KTsKQEAgLTQ5OSwxMiArNTI1LDEyIEBACiAKIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogCiAKIC8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKICAgKiBAewotICAqLyAgCisgICovCiAvKiBJbnRlcnJ1cHQgSGFuZGxlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEhBTF9DUllQX0lSUUhhbmRsZXIoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CiBIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CkBAIC01MTUsOCArNTQxLDggQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCi0gIAorICAqLworCiAvKioKICAgKiBAfQogICAqLwpAQCAtNTMyLDMyICs1NTgsMzIgQEAKICNpZiBkZWZpbmVkKENSWVApCiAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQogI2RlZmluZSBJU19DUllQX0FMR09SSVRITShBTEdPUklUSE0pICgoKEFMR09SSVRITSkgPT0gQ1JZUF9ERVNfRUNCKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0RFU19DQkMpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfVERFU19FQ0IpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9UREVTX0NCQykgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19FQ0IpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NCQykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ1RSKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19HQ00pICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NDTSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9ERVNfQ0JDKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX1RERVNfRUNCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfVERFU19DQkMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfRUNCKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DQkMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NUUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfR0NNKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DQ00pKQogI2Vsc2UgLypOTyBHQ00gQ0NNICovCiAjZGVmaW5lIElTX0NSWVBfQUxHT1JJVEhNKEFMR09SSVRITSkgKCgoQUxHT1JJVEhNKSA9PSBDUllQX0RFU19FQ0IpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfREVTX0NCQykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9UREVTX0VDQikgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX1RERVNfQ0JDKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0VDQikgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ0JDKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DVFIpKQotI2VuZGlmIC8qIEdDTSBDQ00gZGVmaW5lZCovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfREVTX0NCQykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9UREVTX0VDQikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX1RERVNfQ0JDKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0VDQikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ0JDKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DVFIpKQorI2VuZGlmIC8qIEdDTSBDQ00gZGVmaW5lZCovCiAjZGVmaW5lIElTX0NSWVBfS0VZU0laRShLRVlTSVpFKSgoKEtFWVNJWkUpID09IENSWVBfS0VZU0laRV8xMjhCKSAgIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoS0VZU0laRSkgPT0gQ1JZUF9LRVlTSVpFXzE5MkIpICAgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChLRVlTSVpFKSA9PSBDUllQX0tFWVNJWkVfMjU2QikpCi0jZWxzZSAvKiBBRVMqLyAKKyNlbHNlIC8qIEFFUyovCiAjZGVmaW5lIElTX0NSWVBfQUxHT1JJVEhNKEFMR09SSVRITSkgKCgoQUxHT1JJVEhNKSA9PSBDUllQX0FFU19FQ0IpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NCQykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ1RSKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0dDTV9HTUFDKXx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DQ00pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NCQykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ1RSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0dDTV9HTUFDKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DQ00pKQogCiAKICNkZWZpbmUgSVNfQ1JZUF9LRVlTSVpFKEtFWVNJWkUpKCgoS0VZU0laRSkgPT0gQ1JZUF9LRVlTSVpFXzEyOEIpICAgfHwgXApAQCAtNTY5LDYgKzU5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfOEIpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8xQikpCiAKKyNkZWZpbmUgSVNfQ1JZUF9JTklUKENPTkZJRykoKChDT05GSUcpID09IENSWVBfS0VZSVZDT05GSUdfQUxXQVlTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09ORklHKSA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTU4NSw3ICs2MTMsNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIC8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBfUHJpdmF0ZV9EZWZpbmVzIENSWVAgUHJpdmF0ZSBEZWZpbmVzCiAgICogQHsKQEAgLTU5Myw4ICs2MjEsOCBAQAogCiAvKioKICAgKiBAfQotICAqLyAKLSAgICAgICAgICAKKyAgKi8KKwogLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUF9Qcml2YXRlX1ZhcmlhYmxlcyBDUllQIFByaXZhdGUgVmFyaWFibGVzCiAgICogQHsKQEAgLTYwMiw3ICs2MzAsNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIC8qIFByaXZhdGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBfUHJpdmF0ZV9GdW5jdGlvbnNfUHJvdG90eXBlcyBDUllQIFByaXZhdGUgRnVuY3Rpb25zIFByb3RvdHlwZXMKICAgKiBAewpAQCAtNjIwLDIxICs2NDgsMjEgQEAKIC8qKgogICAqIEB9CiAgICovCi0gCi0gICAgIAotLyoqCi0gICogQH0KLSAgKi8gCiAKIAogLyoqCiAgICogQH0KLSAgKi8gCisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KICNlbmRpZiAvKiBUaW55QUVTIG9yIENSWVAqLwogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmNHh4X2hhbF9jcnlwX2V4LmggYi9JbmMvc3RtMzJmNHh4X2hhbF9jcnlwX2V4LmgKaW5kZXggZjkzYTNiNy4uMjUxZTk0YiAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjR4eF9oYWxfY3J5cF9leC5oCisrKyBiL0luYy9zdG0zMmY0eHhfaGFsX2NyeXBfZXguaApAQCAtNiwyMyArNiwyMyBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICAqCiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCi0gICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICovIAorICAqLwogCiAvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmbmRlZiBfX1NUTTMyRjR4eF9IQUxfQ1JZUF9FWF9ICiAjZGVmaW5lIF9fU1RNMzJGNHh4X0hBTF9DUllQX0VYX0gKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi0gZXh0ZXJuICJDIiB7CitleHRlcm4gIkMiIHsKICNlbmRpZgogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzUsMTQgKzM1LDE0IEBACiAvKiogQGFkZHRvZ3JvdXAgQ1JZUEV4CiAgICogQHsKICAgKi8KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX1R5cGVzIENSWVBFeCBFeHBvcnRlZCB0eXBlcwogICAqIEB7CiAgICovCiAKIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0NvbnN0YW50cyBDUllQRXggRXhwb3J0ZWQgY29uc3RhbnRzCiAgICogQHsKQEAgLTUwLDggKzUwLDggQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCi0gCisgICovCisKIC8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX1R5cGVzIENSWVBFeCBQcml2YXRlIFR5cGVzCiAgICogQHsKQEAgLTU5LDcgKzU5LDcgQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX1ZhcmlhYmxlcyBDUllQRXggUHJpdmF0ZSBWYXJpYWJsZXMKQEAgLTY4LDcgKzY4LDcgQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX0NvbnN0YW50cyBDUllQRXggUHJpdmF0ZSBDb25zdGFudHMKQEAgLTc3LDE3ICs3NywxNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfTWFjcm9zIENSWVBFeCBQcml2YXRlIE1hY3JvcwogICAqIEB7CiAgICovCiAKLSAvKioKKy8qKgogICAqIEB9Ci0gICovIAotICAKKyAqLworCiAvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBDUllQRXhfUHJpdmF0ZV9GdW5jdGlvbnMgQ1JZUEV4IFByaXZhdGUgRnVuY3Rpb25zCiAgICogQHsKQEAgLTEwNCw3ICsxMDQsNyBAQAogI2lmIGRlZmluZWQgKENSWVApIHx8IGRlZmluZWQgKEFFUykKIC8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQogICAqIEB7Ci0gICovICAgIAorICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCk7CiAvKioKQEAgLTExMiwxMCArMTEyLDEwIEBACiAgICovCiAjZW5kaWYgLyogQ1JZUHx8QUVTICovCiAKLSNpZiBkZWZpbmVkIChBRVMpICAgIAorI2lmIGRlZmluZWQgKEFFUykKIC8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgogICAqIEB7Ci0gICovICAgIAorICAqLwogdm9pZCAgSEFMX0NSWVBFeF9FbmFibGVBdXRvS2V5RGVyaXZhdGlvbihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKIHZvaWQgIEhBTF9DUllQRXhfRGlzYWJsZUF1dG9LZXlEZXJpdmF0aW9uKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogLyoqCkBAIC0xMjUsMTYgKzEyNSwxNiBAQAogCiAvKioKICAgKiBAfQotICAqLyAKLSAgIAotLyoqCi0gICogQH0KLSAgKi8gCisgICovCiAKIC8qKgogICAqIEB9Ci0gICovIAotICAKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY0eHhfaGFsX2V4dGkuaCBiL0luYy9zdG0zMmY0eHhfaGFsX2V4dGkuaAppbmRleCA4YmI1MTZjLi5mZjc0MjIyIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmNHh4X2hhbF9leHRpLmgKKysrIGIvSW5jL3N0bTMyZjR4eF9oYWxfZXh0aS5oCkBAIC0yNTMsOSArMjUzLDcgQEAKIAogI2RlZmluZSBJU19FWFRJX1RSSUdHRVIoX19MSU5FX18pICAgICAgICgoKF9fTElORV9fKSAgJiB+RVhUSV9UUklHR0VSX01BU0spID09IDB4MDB1KQogCi0jZGVmaW5lIElTX0VYVElfUEVORElOR19FREdFKF9fTElORV9fKSAgKCgoX19MSU5FX18pID09IEVYVElfVFJJR0dFUl9GQUxMSU5HKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MSU5FX18pID09IEVYVElfVFJJR0dFUl9SSVNJTkcpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MSU5FX18pID09IEVYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORykpCisjZGVmaW5lIElTX0VYVElfUEVORElOR19FREdFKF9fTElORV9fKSAgKChfX0xJTkVfXykgPT0gRVhUSV9UUklHR0VSX1JJU0lOR19GQUxMSU5HKQogCiAjZGVmaW5lIElTX0VYVElfQ09ORklHX0xJTkUoX19MSU5FX18pICAgKCgoX19MSU5FX18pICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KQogCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmNHh4X2hhbF9mbXBzbWJ1cy5oIGIvSW5jL3N0bTMyZjR4eF9oYWxfZm1wc21idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDUzMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jL3N0bTMyZjR4eF9oYWxfZm1wc21idXMuaApAQCAtMCwwICsxLDc0NSBAQAorLyoqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqIEBmaWxlICAgIHN0bTMyZjR4eF9oYWxfZm1wc21idXMuaAorICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCisgICogQGJyaWVmICAgSGVhZGVyIGZpbGUgb2YgRk1QU01CVVMgSEFMIG1vZHVsZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworCisvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBTVE0zMkY0eHhfSEFMX0ZNUFNNQlVTX0gKKyNkZWZpbmUgU1RNMzJGNHh4X0hBTF9GTVBTTUJVU19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRk1QSTJDX0NSMV9QRSkKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmNHh4X2hhbF9kZWYuaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCisgICogQHsKKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIEZNUFNNQlVTCisgICogQHsKKyAgKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfRXhwb3J0ZWRfVHlwZXMgRk1QU01CVVMgRXhwb3J0ZWQgVHlwZXMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX0NvbmZpZ3VyYXRpb25fU3RydWN0dXJlX2RlZmluaXRpb24gRk1QU01CVVMgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEBicmllZiAgRk1QU01CVVMgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBUaW1pbmc7ICAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgRk1QU01CVVNfVElNSU5HUl9yZWdpc3RlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYWxjdWxhdGVkIGJ5IHJlZmVycmluZyB0byBGTVBTTUJVUyBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIFJlZmVyZW5jZSBtYW51YWwgKi8KKyAgdWludDMyX3QgQW5hbG9nRmlsdGVyOyAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgQW5hbG9nIEZpbHRlciBpcyBlbmFibGUgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1QU01CVVNfQW5hbG9nX0ZpbHRlciAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MxOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBmaXJzdCBkZXZpY2Ugb3duIGFkZHJlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgNy1iaXQgb3IgMTAtYml0IGFkZHJlc3MuICovCisKKyAgdWludDMyX3QgQWRkcmVzc2luZ01vZGU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgNy1iaXQgb3IgMTAtYml0IGFkZHJlc3NpbmcgbW9kZSBmb3IgbWFzdGVyIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1QU01CVVNfYWRkcmVzc2luZ19tb2RlICovCisKKyAgdWludDMyX3QgRHVhbEFkZHJlc3NNb2RlOyAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgZHVhbCBhZGRyZXNzaW5nIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTVBTTUJVU19kdWFsX2FkZHJlc3NpbmdfbW9kZSAqLworCisgIHVpbnQzMl90IE93bkFkZHJlc3MyOyAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBzZWNvbmQgZGV2aWNlIG93biBhZGRyZXNzIGlmIGR1YWwgYWRkcmVzc2luZyBtb2RlIGlzIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgNy1iaXQgYWRkcmVzcy4gKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMk1hc2tzOyAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYWNrbm9sZWRnZSBtYXNrIGFkZHJlc3Mgc2Vjb25kIGRldmljZSBvd24gYWRkcmVzcyBpZiBkdWFsIGFkZHJlc3NpbmcgbW9kZSBpcyBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1QU01CVVNfb3duX2FkZHJlc3MyX21hc2tzLiAqLworCisgIHVpbnQzMl90IEdlbmVyYWxDYWxsTW9kZTsgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIGdlbmVyYWwgY2FsbCBtb2RlIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1QU01CVVNfZ2VuZXJhbF9jYWxsX2FkZHJlc3NpbmdfbW9kZS4gKi8KKworICB1aW50MzJfdCBOb1N0cmV0Y2hNb2RlOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyBpZiBub3N0cmV0Y2ggbW9kZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIEZNUFNNQlVTX25vc3RyZXRjaF9tb2RlICovCisKKyAgdWludDMyX3QgUGFja2V0RXJyb3JDaGVja01vZGU7ICAgLyohPCBTcGVjaWZpZXMgaWYgUGFja2V0IEVycm9yIENoZWNrIG1vZGUgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTVBTTUJVU19wYWNrZXRfZXJyb3JfY2hlY2tfbW9kZSAqLworCisgIHVpbnQzMl90IFBlcmlwaGVyYWxNb2RlOyAgICAgICAgIC8qITwgU3BlY2lmaWVzIHdoaWNoIG1vZGUgb2YgUGVyaXBoYWwgaXMgc2VsZWN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTVBTTUJVU19wZXJpcGhlcmFsX21vZGUgKi8KKworICB1aW50MzJfdCBTTUJ1c1RpbWVvdXQ7ICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgY29udGVudCBvZiB0aGUgMzIgQml0cyBGTVBTTUJVU19USU1FT1VUX3JlZ2lzdGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRW5hYmxlIGJpdHMgYW5kIGRpZmZlcmVudCB0aW1lb3V0IHZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYWxjdWxhdGVkIGJ5IHJlZmVycmluZyB0byBGTVBTTUJVUyBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIFJlZmVyZW5jZSBtYW51YWwgKi8KK30gRk1QU01CVVNfSW5pdFR5cGVEZWY7CisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEhBTF9zdGF0ZV9kZWZpbml0aW9uIEhBTCBzdGF0ZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBIQUwgU3RhdGUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19TVEFURV9SRVNFVCAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgLyohPCBGTVBTTUJVUyBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZICAgICAgICAgICAoMHgwMDAwMDAwMVUpICAvKiE8IEZNUFNNQlVTIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRk1QU01CVVNfU1RBVEVfQlVTWSAgICAgICAgICAgICgweDAwMDAwMDAyVSkgIC8qITwgRk1QU01CVVMgaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCAgKDB4MDAwMDAwMTJVKSAgLyohPCBNYXN0ZXIgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgKi8KKyNkZWZpbmUgSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYICAoMHgwMDAwMDAyMlUpICAvKiE8IE1hc3RlciBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAqLworI2RlZmluZSBIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCAgICgweDAwMDAwMDMyVSkgIC8qITwgU2xhdmUgRGF0YSBUcmFuc21pc3Npb24gcHJvY2VzcyBpcyBvbmdvaW5nICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYICAgKDB4MDAwMDAwNDJVKSAgLyohPCBTbGF2ZSBEYXRhIFJlY2VwdGlvbiBwcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgKi8KKyNkZWZpbmUgSEFMX0ZNUFNNQlVTX1NUQVRFX1RJTUVPVVQgICAgICAgICAoMHgwMDAwMDAwM1UpICAvKiE8IFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfRk1QU01CVVNfU1RBVEVfRVJST1IgICAgICAgICAgICgweDAwMDAwMDA0VSkgIC8qITwgUmVjZXB0aW9uIHByb2Nlc3MgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4gICAgICAgICAgKDB4MDAwMDAwMDhVKSAgIC8qITwgQWRkcmVzcyBMaXN0ZW4gTW9kZSBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX0Vycm9yX0NvZGVfZGVmaW5pdGlvbiBGTVBTTUJVUyBFcnJvciBDb2RlIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEZNUFNNQlVTIEVycm9yIENvZGUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9OT05FICAgICAgICAgICAgKDB4MDAwMDAwMDBVKSAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9CRVJSICAgICAgICAgICAgKDB4MDAwMDAwMDFVKSAgICAvKiE8IEJFUlIgZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9BUkxPICAgICAgICAgICAgKDB4MDAwMDAwMDJVKSAgICAvKiE8IEFSTE8gZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9BQ0tGICAgICAgICAgICAgKDB4MDAwMDAwMDRVKSAgICAvKiE8IEFDS0YgZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9PVlIgICAgICAgICAgICAgKDB4MDAwMDAwMDhVKSAgICAvKiE8IE9WUiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9IQUxUSU1FT1VUICAgICAgKDB4MDAwMDAwMTBVKSAgICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9CVVNUSU1FT1VUICAgICAgKDB4MDAwMDAwMjBVKSAgICAvKiE8IEJ1cyBUaW1lb3V0IGVycm9yICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9BTEVSVCAgICAgICAgICAgKDB4MDAwMDAwNDBVKSAgICAvKiE8IEFsZXJ0IGVycm9yICAgICAgICAgICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9QRUNFUlIgICAgICAgICAgKDB4MDAwMDAwODBVKSAgICAvKiE8IFBFQyBlcnJvciAgICAgICAgICAgICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAoMHgwMDAwMDEwMFUpICAgIC8qITwgSW52YWxpZCBDYWxsYmFjayBlcnJvciAqLworI2VuZGlmIC8qIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisjZGVmaW5lIEhBTF9GTVBTTUJVU19FUlJPUl9JTlZBTElEX1BBUkFNICAgICgweDAwMDAwMjAwVSkgICAvKiE8IEludmFsaWQgUGFyYW1ldGVycyBlcnJvciAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBTTUJVU19oYW5kbGVfU3RydWN0dXJlX2RlZmluaXRpb24gRk1QU01CVVMgaGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uCisgICogQGJyaWVmICBGTVBTTUJVUyBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKiBAeworICAqLwordHlwZWRlZiBzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmCit7CisgIEZNUEkyQ19UeXBlRGVmICAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAvKiE8IEZNUFNNQlVTIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgKi8KKworICBGTVBTTUJVU19Jbml0VHlwZURlZiAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgLyohPCBGTVBTTUJVUyBjb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgICAgICovCisKKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAqcEJ1ZmZQdHI7ICAgICAgIC8qITwgUG9pbnRlciB0byBGTVBTTUJVUyB0cmFuc2ZlciBidWZmZXIgICAqLworCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgWGZlclNpemU7ICAgICAgICAvKiE8IEZNUFNNQlVTIHRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICAgKi8KKworICBfX0lPIHVpbnQxNl90ICAgICAgICAgICAgICAgIFhmZXJDb3VudDsgICAgICAgLyohPCBGTVBTTUJVUyB0cmFuc2ZlciBjb3VudGVyICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICBYZmVyT3B0aW9uczsgICAgIC8qITwgRk1QU01CVVMgdHJhbnNmZXIgb3B0aW9ucyAgICAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgUHJldmlvdXNTdGF0ZTsgICAvKiE8IEZNUFNNQlVTIGNvbW11bmljYXRpb24gUHJldmlvdXMgc3RhdGUgKi8KKworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgLyohPCBGTVBTTUJVUyBsb2NraW5nIG9iamVjdCAgICAgICAgICAgICAgICovCisKKyAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgIC8qITwgRk1QU01CVVMgY29tbXVuaWNhdGlvbiBzdGF0ZSAgICAgICAgICAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAvKiE8IEZNUFNNQlVTIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIChVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICB2b2lkICgqIE1hc3RlclR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOyAgICAgICAgICAgLyohPCBGTVBTTUJVUyBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICovCisgIHZvaWQgKCogTWFzdGVyUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7ICAgICAgICAgICAvKiE8IEZNUFNNQlVTIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgKi8KKyAgdm9pZCAoKiBTbGF2ZVR4Q3BsdENhbGxiYWNrKShzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOyAgICAgICAgICAgIC8qITwgRk1QU01CVVMgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLworICB2b2lkICgqIFNsYXZlUnhDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7ICAgICAgICAgICAgLyohPCBGTVBTTUJVUyBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgICovCisgIHZvaWQgKCogTGlzdGVuQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOyAgICAgICAgICAgICAvKiE8IEZNUFNNQlVTIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKShzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOyAgICAgICAgICAgICAgICAgIC8qITwgRk1QU01CVVMgRXJyb3IgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHZvaWQgKCogQWRkckNhbGxiYWNrKShzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQ4X3QgVHJhbnNmZXJEaXJlY3Rpb24sIHVpbnQxNl90IEFkZHJNYXRjaENvZGUpOyAgLyohPCBGTVBTTUJVUyBTbGF2ZSBBZGRyZXNzIE1hdGNoIGNhbGxiYWNrICovCisKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7ICAgICAgICAgICAgICAgIC8qITwgRk1QU01CVVMgTXNwIEluaXQgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOyAgICAgICAgICAgICAgLyohPCBGTVBTTUJVUyBNc3AgRGVJbml0IGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZiAgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KK30gRk1QU01CVVNfSGFuZGxlVHlwZURlZjsKKworI2lmIChVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBIQUwgRk1QU01CVVMgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiBlbnVtCit7CisgIEhBTF9GTVBTTUJVU19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgICAgICA9IDB4MDBVLCAgICAvKiE8IEZNUFNNQlVTIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9GTVBTTUJVU19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgICAgICA9IDB4MDFVLCAgICAvKiE8IEZNUFNNQlVTIE1hc3RlciBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQgICovCisgIEhBTF9GTVBTTUJVU19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCAgICAgICA9IDB4MDJVLCAgICAvKiE8IEZNUFNNQlVTIFNsYXZlIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgICovCisgIEhBTF9GTVBTTUJVU19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCAgICAgICA9IDB4MDNVLCAgICAvKiE8IEZNUFNNQlVTIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRCAgICovCisgIEhBTF9GTVBTTUJVU19MSVNURU5fQ09NUExFVEVfQ0JfSUQgICAgICAgICA9IDB4MDRVLCAgICAvKiE8IEZNUFNNQlVTIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICovCisgIEhBTF9GTVBTTUJVU19FUlJPUl9DQl9JRCAgICAgICAgICAgICAgICAgICA9IDB4MDVVLCAgICAvKiE8IEZNUFNNQlVTIEVycm9yIGNhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgSEFMX0ZNUFNNQlVTX01TUElOSVRfQ0JfSUQgICAgICAgICAgICAgICAgID0gMHgwNlUsICAgIC8qITwgRk1QU01CVVMgTXNwIEluaXQgY2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0ZNUFNNQlVTX01TUERFSU5JVF9DQl9JRCAgICAgICAgICAgICAgID0gMHgwN1UgICAgIC8qITwgRk1QU01CVVMgTXNwIERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgKi8KKworfSBIQUxfRk1QU01CVVNfQ2FsbGJhY2tJRFR5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgSEFMIEZNUFNNQlVTIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorICAqLwordHlwZWRlZiAgdm9pZCAoKnBGTVBTTUJVU19DYWxsYmFja1R5cGVEZWYpKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7IC8qITwgcG9pbnRlciB0byBhbiBGTVBTTUJVUyBjYWxsYmFjayBmdW5jdGlvbiAqLwordHlwZWRlZiAgdm9pZCAoKnBGTVBTTUJVU19BZGRyQ2FsbGJhY2tUeXBlRGVmKShGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQ4X3QgVHJhbnNmZXJEaXJlY3Rpb24sIHVpbnQxNl90IEFkZHJNYXRjaENvZGUpOyAvKiE8IHBvaW50ZXIgdG8gYW4gRk1QU01CVVMgQWRkcmVzcyBNYXRjaCBjYWxsYmFjayBmdW5jdGlvbiAqLworCisjZW5kaWYgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX0V4cG9ydGVkX0NvbnN0YW50cyBGTVBTTUJVUyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX0FuYWxvZ19GaWx0ZXIgRk1QU01CVVMgQW5hbG9nIEZpbHRlcgorICAqIEB7CisgICovCisjZGVmaW5lIEZNUFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEUgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEZNUFNNQlVTX0FOQUxPR0ZJTFRFUl9ESVNBQkxFICAgICAgICAgICAgICBGTVBJMkNfQ1IxX0FORk9GRgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBTTUJVU19hZGRyZXNzaW5nX21vZGUgRk1QU01CVVMgYWRkcmVzc2luZyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRk1QU01CVVNfQUREUkVTU0lOR01PREVfN0JJVCAgICAgICAgICAgICAgICgweDAwMDAwMDAxVSkKKyNkZWZpbmUgRk1QU01CVVNfQUREUkVTU0lOR01PREVfMTBCSVQgICAgICAgICAgICAgICgweDAwMDAwMDAyVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfZHVhbF9hZGRyZXNzaW5nX21vZGUgRk1QU01CVVMgZHVhbCBhZGRyZXNzaW5nIG1vZGUKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNUFNNQlVTX0RVQUxBRERSRVNTX0RJU0FCTEUgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEZNUFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRSAgICAgICAgICAgICAgICBGTVBJMkNfT0FSMl9PQTJFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBTTUJVU19vd25fYWRkcmVzczJfbWFza3MgRk1QU01CVVMgb3duYWRkcmVzczIgbWFza3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIEZNUFNNQlVTX09BMl9OT01BU0sgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMFUpCisjZGVmaW5lIEZNUFNNQlVTX09BMl9NQVNLMDEgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMVUpCisjZGVmaW5lIEZNUFNNQlVTX09BMl9NQVNLMDIgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwMlUpCisjZGVmaW5lIEZNUFNNQlVTX09BMl9NQVNLMDMgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwM1UpCisjZGVmaW5lIEZNUFNNQlVTX09BMl9NQVNLMDQgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNFUpCisjZGVmaW5lIEZNUFNNQlVTX09BMl9NQVNLMDUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNVUpCisjZGVmaW5lIEZNUFNNQlVTX09BMl9NQVNLMDYgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwNlUpCisjZGVmaW5lIEZNUFNNQlVTX09BMl9NQVNLMDcgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMHgwN1UpCisvKioKKyAgKiBAfQorICAqLworCisKKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfZ2VuZXJhbF9jYWxsX2FkZHJlc3NpbmdfbW9kZSBGTVBTTUJVUyBnZW5lcmFsIGNhbGwgYWRkcmVzc2luZyBtb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgRk1QU01CVVNfR0VORVJBTENBTExfRElTQUJMRSAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgRk1QU01CVVNfR0VORVJBTENBTExfRU5BQkxFICAgICAgICAgICAgICAgIEZNUEkyQ19DUjFfR0NFTgorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBTTUJVU19ub3N0cmV0Y2hfbW9kZSBGTVBTTUJVUyBub3N0cmV0Y2ggbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEZNUFNNQlVTX05PU1RSRVRDSF9ESVNBQkxFICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEZNUFNNQlVTX05PU1RSRVRDSF9FTkFCTEUgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IxX05PU1RSRVRDSAorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBTTUJVU19wYWNrZXRfZXJyb3JfY2hlY2tfbW9kZSBGTVBTTUJVUyBwYWNrZXQgZXJyb3IgY2hlY2sgbW9kZQorICAqIEB7CisgICovCisjZGVmaW5lIEZNUFNNQlVTX1BFQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEZNUFNNQlVTX1BFQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IxX1BFQ0VOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX3BlcmlwaGVyYWxfbW9kZSBGTVBTTUJVUyBwZXJpcGhlcmFsIG1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBGTVBTTUJVU19QRVJJUEhFUkFMX01PREVfRk1QU01CVVNfSE9TVCAgICAgICAgRk1QSTJDX0NSMV9TTUJIRU4KKyNkZWZpbmUgRk1QU01CVVNfUEVSSVBIRVJBTF9NT0RFX0ZNUFNNQlVTX1NMQVZFICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgRk1QU01CVVNfUEVSSVBIRVJBTF9NT0RFX0ZNUFNNQlVTX1NMQVZFX0FSUCAgIEZNUEkyQ19DUjFfU01CREVOCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX1JlbG9hZEVuZE1vZGVfZGVmaW5pdGlvbiBGTVBTTUJVUyBSZWxvYWRFbmRNb2RlIGRlZmluaXRpb24KKyAgKiBAeworICAqLworCisjZGVmaW5lICBGTVBTTUJVU19TT0ZURU5EX01PREUgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lICBGTVBTTUJVU19SRUxPQURfTU9ERSAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IyX1JFTE9BRAorI2RlZmluZSAgRk1QU01CVVNfQVVUT0VORF9NT0RFICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0NSMl9BVVRPRU5ECisjZGVmaW5lICBGTVBTTUJVU19TRU5EUEVDX01PREUgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IyX1BFQ0JZVEUKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfU3RhcnRTdG9wTW9kZV9kZWZpbml0aW9uIEZNUFNNQlVTIFN0YXJ0U3RvcE1vZGUgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKyNkZWZpbmUgIEZNUFNNQlVTX05PX1NUQVJUU1RPUCAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkKKyNkZWZpbmUgIEZNUFNNQlVTX0dFTkVSQVRFX1NUT1AgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBGTVBJMkNfQ1IyX1NUT1ApCisjZGVmaW5lICBGTVBTTUJVU19HRU5FUkFURV9TVEFSVF9SRUFEICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgRk1QSTJDX0NSMl9TVEFSVCB8IEZNUEkyQ19DUjJfUkRfV1JOKQorI2RlZmluZSAgRk1QU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUgICAgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEZNUEkyQ19DUjJfU1RBUlQpCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24gRk1QU01CVVMgWGZlck9wdGlvbnMgZGVmaW5pdGlvbgorICAqIEB7CisgICovCisKKy8qIExpc3Qgb2YgWGZlck9wdGlvbnMgaW4gdXNhZ2Ugb2YgOgorICogMS0gUmVzdGFydCBjb25kaXRpb24gd2hlbiBkaXJlY3Rpb24gY2hhbmdlCisgKiAyLSBObyBSZXN0YXJ0IGNvbmRpdGlvbiBpbiBvdGhlciB1c2UgY2FzZXMKKyAqLworI2RlZmluZSAgRk1QU01CVVNfRklSU1RfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgRk1QU01CVVNfU09GVEVORF9NT0RFCisjZGVmaW5lICBGTVBTTUJVU19ORVhUX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShGTVBTTUJVU19SRUxPQURfTU9ERSB8IEZNUFNNQlVTX1NPRlRFTkRfTU9ERSkpCisjZGVmaW5lICBGTVBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9OT19QRUMgICAgICBGTVBTTUJVU19BVVRPRU5EX01PREUKKyNkZWZpbmUgIEZNUFNNQlVTX0xBU1RfRlJBTUVfTk9fUEVDICAgICAgICAgICAgICAgIEZNUFNNQlVTX0FVVE9FTkRfTU9ERQorI2RlZmluZSAgRk1QU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMgICAgKCh1aW50MzJfdCkoRk1QU01CVVNfQVVUT0VORF9NT0RFIHwgRk1QU01CVVNfU0VORFBFQ19NT0RFKSkKKyNkZWZpbmUgIEZNUFNNQlVTX0xBU1RfRlJBTUVfV0lUSF9QRUMgICAgICAgICAgICAgICgodWludDMyX3QpKEZNUFNNQlVTX0FVVE9FTkRfTU9ERSB8IEZNUFNNQlVTX1NFTkRQRUNfTU9ERSkpCisKKy8qIExpc3Qgb2YgWGZlck9wdGlvbnMgaW4gdXNhZ2Ugb2YgOgorICogMS0gUmVzdGFydCBjb25kaXRpb24gaW4gYWxsIHVzZSBjYXNlcyAoZGlyZWN0aW9uIGNoYW5nZSBvciBub3QpCisgKi8KKyNkZWZpbmUgIEZNUFNNQlVTX09USEVSX0ZSQU1FX05PX1BFQyAgICAgICAgICAgICAgICgweDAwMDAwMEFBVSkKKyNkZWZpbmUgIEZNUFNNQlVTX09USEVSX0ZSQU1FX1dJVEhfUEVDICAgICAgICAgICAgICgweDAwMDBBQTAwVSkKKyNkZWZpbmUgIEZNUFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX05PX1BFQyAgICAgICgweDAwQUEwMDAwVSkKKyNkZWZpbmUgIEZNUFNNQlVTX09USEVSX0FORF9MQVNUX0ZSQU1FX1dJVEhfUEVDICAgICgweEFBMDAwMDAwVSkKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbiBGTVBTTUJVUyBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCisgICogQGJyaWVmIEZNUFNNQlVTIEludGVycnVwdCBkZWZpbml0aW9uCisgICogICAgICAgIEVsZW1lbnRzIHZhbHVlcyBjb252ZW50aW9uOiAweFhYWFhYWFhYCisgICogICAgICAgICAgIC0gWFhYWFhYWFggIDogSW50ZXJydXB0IGNvbnRyb2wgbWFzaworICAqIEB7CisgICovCisjZGVmaW5lIEZNUFNNQlVTX0lUX0VSUkkgICAgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IxX0VSUklFCisjZGVmaW5lIEZNUFNNQlVTX0lUX1RDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IxX1RDSUUKKyNkZWZpbmUgRk1QU01CVVNfSVRfU1RPUEkgICAgICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19DUjFfU1RPUElFCisjZGVmaW5lIEZNUFNNQlVTX0lUX05BQ0tJICAgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IxX05BQ0tJRQorI2RlZmluZSBGTVBTTUJVU19JVF9BRERSSSAgICAgICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0NSMV9BRERSSUUKKyNkZWZpbmUgRk1QU01CVVNfSVRfUlhJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19DUjFfUlhJRQorI2RlZmluZSBGTVBTTUJVU19JVF9UWEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0NSMV9UWElFCisjZGVmaW5lIEZNUFNNQlVTX0lUX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRk1QU01CVVNfSVRfRVJSSSB8IEZNUFNNQlVTX0lUX1RDSSB8IEZNUFNNQlVTX0lUX1NUT1BJIHwgRk1QU01CVVNfSVRfTkFDS0kgfCBGTVBTTUJVU19JVF9UWEkpCisjZGVmaW5lIEZNUFNNQlVTX0lUX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRk1QU01CVVNfSVRfRVJSSSB8IEZNUFNNQlVTX0lUX1RDSSB8IEZNUFNNQlVTX0lUX05BQ0tJIHwgRk1QU01CVVNfSVRfUlhJKQorI2RlZmluZSBGTVBTTUJVU19JVF9BTEVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgKEZNUFNNQlVTX0lUX0VSUkkpCisjZGVmaW5lIEZNUFNNQlVTX0lUX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAoRk1QU01CVVNfSVRfQUREUkkgfCBGTVBTTUJVU19JVF9TVE9QSSB8IEZNUFNNQlVTX0lUX05BQ0tJKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBTTUJVU19GbGFnX2RlZmluaXRpb24gRk1QU01CVVMgRmxhZyBkZWZpbml0aW9uCisgICogQGJyaWVmIEZsYWcgZGVmaW5pdGlvbgorICAqICAgICAgICBFbGVtZW50cyB2YWx1ZXMgY29udmVudGlvbjogMHhYWFhYWVlZWQorICAqICAgICAgICAgICAtIFhYWFhYWFhYICA6IEZsYWcgbWFzaworICAqIEB7CisgICovCisKKyNkZWZpbmUgIEZNUFNNQlVTX0ZMQUdfVFhFICAgICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfVFhFCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX1RYSVMgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1RYSVMKKyNkZWZpbmUgIEZNUFNNQlVTX0ZMQUdfUlhORSAgICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfUlhORQorI2RlZmluZSAgRk1QU01CVVNfRkxBR19BRERSICAgICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9BRERSCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX0FGICAgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX05BQ0tGCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX1NUT1BGICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1NUT1BGCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1RDCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX1RDUiAgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1RDUgorI2RlZmluZSAgRk1QU01CVVNfRkxBR19CRVJSICAgICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9CRVJSCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX0FSTE8gICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX0FSTE8KKyNkZWZpbmUgIEZNUFNNQlVTX0ZMQUdfT1ZSICAgICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfT1ZSCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX1BFQ0VSUiAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1BFQ0VSUgorI2RlZmluZSAgRk1QU01CVVNfRkxBR19USU1FT1VUICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9USU1FT1VUCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX0FMRVJUICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX0FMRVJUCisjZGVmaW5lICBGTVBTTUJVU19GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX0JVU1kKKyNkZWZpbmUgIEZNUFNNQlVTX0ZMQUdfRElSICAgICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfRElSCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfRXhwb3J0ZWRfTWFjcm9zIEZNUFNNQlVTIEV4cG9ydGVkIE1hY3JvcworICAqIEB7CisgICovCisKKy8qKiBAYnJpZWYgIFJlc2V0IEZNUFNNQlVTIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBGTVBTTUJVUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0ZNUFNNQlVTX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVTRVQ7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgX19IQUxfRk1QU01CVVNfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICAgICAgICAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVTRVQpCisjZW5kaWYKKworLyoqIEBicmllZiAgRW5hYmxlIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMgaW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBGTVBTTUJVUyBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfSVRfU1RPUEkgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX1JYSSAgIFJYIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRk1QU01CVVNfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSB8PSAoX19JTlRFUlJVUFRfXykpCisKKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBGTVBTTUJVUyBpbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEZNUFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfSVRfU1RPUEkgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX1JYSSAgIFJYIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRk1QU01CVVNfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAofihfX0lOVEVSUlVQVF9fKSkpCisKKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGTVBTTUJVUyBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEZNUFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBGTVBTTUJVUyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfSVRfRVJSSSAgRXJyb3JzIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19JVF9UQ0kgICBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgZW5hYmxlCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfSVRfU1RPUEkgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX05BQ0tJIE5BQ0sgcmVjZWl2ZWQgaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX0FERFJJIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGVuYWJsZQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0lUX1JYSSAgIFJYIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19JVF9UWEkgICBUWCBpbnRlcnJ1cHQgZW5hYmxlCisgICoKKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JVF9fIChTRVQgb3IgUkVTRVQpLgorICAqLworI2RlZmluZSBfX0hBTF9GTVBTTUJVU19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEZNUFNNQlVTIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KKyAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX1RYRSAgICAgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0ZMQUdfVFhJUyAgICBUcmFuc21pdCBpbnRlcnJ1cHQgc3RhdHVzCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19SWE5FICAgIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX0FERFIgICAgQWRkcmVzcyBtYXRjaGVkIChzbGF2ZSBtb2RlKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0ZMQUdfQUYgICAgICBOQUNLIHJlY2VpdmVkIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX1NUT1BGICAgU1RPUCBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0ZMQUdfVEMgICAgICBUcmFuc2ZlciBjb21wbGV0ZSAobWFzdGVyIG1vZGUpCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19UQ1IgICAgIFRyYW5zZmVyIGNvbXBsZXRlIHJlbG9hZAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0ZMQUdfQkVSUiAgICBCdXMgZXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX0FSTE8gICAgQXJiaXRyYXRpb24gbG9zdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0ZMQUdfT1ZSICAgICBPdmVycnVuL1VuZGVycnVuCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19QRUNFUlIgIFBFQyBlcnJvciBpbiByZWNlcHRpb24KKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX1RJTUVPVVQgVGltZW91dCBvciBUbG93IGRldGVjdGlvbiBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19BTEVSVCAgIFNNQnVzIGFsZXJ0CisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19CVVNZICAgIEJ1cyBidXN5CisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19ESVIgICAgIFRyYW5zZmVyIGRpcmVjdGlvbiAoc2xhdmUgbW9kZSkKKyAgKgorICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0ZMQUdfXyAoU0VUIG9yIFJFU0VUKS4KKyAgKi8KKyNkZWZpbmUgRk1QU01CVVNfRkxBR19NQVNLICAoMHgwMDAxRkZGRlUpCisjZGVmaW5lIF9fSEFMX0ZNUFNNQlVTX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSKSAmICgoX19GTEFHX18pICYgRk1QU01CVVNfRkxBR19NQVNLKSkgPT0gKChfX0ZMQUdfXykgJiBGTVBTTUJVU19GTEFHX01BU0spKSA/IFNFVCA6IFJFU0VUKQorCisvKiogQGJyaWVmICBDbGVhciB0aGUgRk1QU01CVVMgcGVuZGluZyBmbGFncyB3aGljaCBhcmUgY2xlYXJlZCBieSB3cml0aW5nIDEgaW4gYSBzcGVjaWZpYyBiaXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgRk1QU01CVVMgSGFuZGxlLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19BRERSICAgIEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX0FGICAgICAgTkFDSyByZWNlaXZlZCBmbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19TVE9QRiAgIFNUT1AgZGV0ZWN0aW9uIGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX0JFUlIgICAgQnVzIGVycm9yCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19BUkxPICAgIEFyYml0cmF0aW9uIGxvc3QKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19GTEFHX09WUiAgICAgT3ZlcnJ1bi9VbmRlcnJ1bgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0ZMQUdfUEVDRVJSICBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uCisgICogICAgICAgICAgICBAYXJnIEByZWYgRk1QU01CVVNfRkxBR19USU1FT1VUIFRpbWVvdXQgb3IgVGxvdyBkZXRlY3Rpb24gZmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0ZMQUdfQUxFUlQgICBTTUJ1cyBhbGVydAorICAqCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JQ1IgPSAoX19GTEFHX18pKQorCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBGTVBTTUJVUyBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIEZNUFNNQlVTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfRk1QU01CVVNfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgKFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxLCBGTVBJMkNfQ1IxX1BFKSkKKworLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgRk1QU01CVVMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9GTVBTTUJVU19ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAoQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSwgRk1QSTJDX0NSMV9QRSkpCisKKy8qKiBAYnJpZWYgIEdlbmVyYXRlIGEgTm9uLUFja25vd2xlZGdlIEZNUFNNQlVTIHBlcmlwaGVyYWwgaW4gU2xhdmUgbW9kZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBGTVBTTUJVUyBIYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX0ZNUFNNQlVTX0dFTkVSQVRFX05BQ0soX19IQU5ETEVfXykgICAgICAgICAgIChTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiwgRk1QSTJDX0NSMl9OQUNLKSkKKworLyoqCisgICogQH0KKyAgKi8KKworCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTVBTTUJVU19Qcml2YXRlX01hY3JvIEZNUFNNQlVTIFByaXZhdGUgTWFjcm9zCisgICogQHsKKyAgKi8KKworI2RlZmluZSBJU19GTVBTTUJVU19BTkFMT0dfRklMVEVSKEZJTFRFUikgICAgICAgICAgICAgICAgICAoKChGSUxURVIpID09IEZNUFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZJTFRFUikgPT0gRk1QU01CVVNfQU5BTE9HRklMVEVSX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX0ZNUFNNQlVTX0RJR0lUQUxfRklMVEVSKEZJTFRFUikgICAgICAgICAgICAgICAgICgoRklMVEVSKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19GTVBTTUJVU19BRERSRVNTSU5HX01PREUoTU9ERSkgICAgICAgICAgICAgICAgICAoKChNT0RFKSA9PSBGTVBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gRk1QU01CVVNfQUREUkVTU0lOR01PREVfMTBCSVQpKQorCisjZGVmaW5lIElTX0ZNUFNNQlVTX0RVQUxfQUREUkVTUyhBRERSRVNTKSAgICAgICAgICAgICAgICAgICgoKEFERFJFU1MpID09IEZNUFNNQlVTX0RVQUxBRERSRVNTX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJFU1MpID09IEZNUFNNQlVTX0RVQUxBRERSRVNTX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfRk1QU01CVVNfT1dOX0FERFJFU1MyX01BU0soTUFTSykgICAgICAgICAgICAgICAgKCgoTUFTSykgPT0gRk1QU01CVVNfT0EyX05PTUFTSykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBGTVBTTUJVU19PQTJfTUFTSzAxKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEZNUFNNQlVTX09BMl9NQVNLMDIpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gRk1QU01CVVNfT0EyX01BU0swMykgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBGTVBTTUJVU19PQTJfTUFTSzA0KSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1BU0spID09IEZNUFNNQlVTX09BMl9NQVNLMDUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTUFTSykgPT0gRk1QU01CVVNfT0EyX01BU0swNikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNQVNLKSA9PSBGTVBTTUJVU19PQTJfTUFTSzA3KSkKKworI2RlZmluZSBJU19GTVBTTUJVU19HRU5FUkFMX0NBTEwoQ0FMTCkgICAgICAgICAgICAgICAgICAgICAoKChDQUxMKSA9PSBGTVBTTUJVU19HRU5FUkFMQ0FMTF9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENBTEwpID09IEZNUFNNQlVTX0dFTkVSQUxDQUxMX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfRk1QU01CVVNfTk9fU1RSRVRDSChTVFJFVENIKSAgICAgICAgICAgICAgICAgICAgKCgoU1RSRVRDSCkgPT0gRk1QU01CVVNfTk9TVFJFVENIX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1RSRVRDSCkgPT0gRk1QU01CVVNfTk9TVFJFVENIX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfRk1QU01CVVNfUEVDKFBFQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUEVDKSA9PSBGTVBTTUJVU19QRUNfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUEVDKSA9PSBGTVBTTUJVU19QRUNfRU5BQkxFKSkKKworI2RlZmluZSBJU19GTVBTTUJVU19QRVJJUEhFUkFMX01PREUoTU9ERSkgICAgICAgICAgICAgICAgICAoKChNT0RFKSA9PSBGTVBTTUJVU19QRVJJUEhFUkFMX01PREVfRk1QU01CVVNfSE9TVCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gRk1QU01CVVNfUEVSSVBIRVJBTF9NT0RFX0ZNUFNNQlVTX1NMQVZFKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gRk1QU01CVVNfUEVSSVBIRVJBTF9NT0RFX0ZNUFNNQlVTX1NMQVZFX0FSUCkpCisKKyNkZWZpbmUgSVNfRk1QU01CVVNfVFJBTlNGRVJfTU9ERShNT0RFKSAgICAgICAgICAgICAgICAgICAgKCgoTU9ERSkgPT0gRk1QU01CVVNfUkVMT0FEX01PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gRk1QU01CVVNfQVVUT0VORF9NT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBGTVBTTUJVU19TT0ZURU5EX01PREUpICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEZNUFNNQlVTX1NFTkRQRUNfTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gKEZNUFNNQlVTX1JFTE9BRF9NT0RFIHwgRk1QU01CVVNfU0VORFBFQ19NT0RFKSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSAoRk1QU01CVVNfQVVUT0VORF9NT0RFIHwgRk1QU01CVVNfU0VORFBFQ19NT0RFKSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IChGTVBTTUJVU19BVVRPRU5EX01PREUgfCBGTVBTTUJVU19SRUxPQURfTU9ERSkpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gKEZNUFNNQlVTX0FVVE9FTkRfTU9ERSB8IEZNUFNNQlVTX1NFTkRQRUNfTU9ERSB8IEZNUFNNQlVTX1JFTE9BRF9NT0RFICkpKQorCisKKyNkZWZpbmUgSVNfRk1QU01CVVNfVFJBTlNGRVJfUkVRVUVTVChSRVFVRVNUKSAgICAgICAgICAgICAgKCgoUkVRVUVTVCkgPT0gRk1QU01CVVNfR0VORVJBVEVfU1RPUCkgICAgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFKSAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEZNUFNNQlVTX05PX1NUQVJUU1RPUCkpCisKKworI2RlZmluZSBJU19GTVBTTUJVU19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoUkVRVUVTVCkgICAgICAoSVNfRk1QU01CVVNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKFJFUVVFU1QpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEZNUFNNQlVTX0ZJUlNUX0ZSQU1FKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRk1QU01CVVNfTkVYVF9GUkFNRSkgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBGTVBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9OT19QRUMpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEZNUFNNQlVTX0xBU1RfRlJBTUVfTk9fUEVDKSAgICAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRk1QU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBGTVBTTUJVU19MQVNUX0ZSQU1FX1dJVEhfUEVDKSkKKworI2RlZmluZSBJU19GTVBTTUJVU19UUkFOU0ZFUl9PVEhFUl9PUFRJT05TX1JFUVVFU1QoUkVRVUVTVCkgKCgoUkVRVUVTVCkgPT0gRk1QU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDKSAgICAgICAgICAgICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVFVRVNUKSA9PSBGTVBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMpICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFUVVFU1QpID09IEZNUFNNQlVTX09USEVSX0ZSQU1FX1dJVEhfUEVDKSAgICAgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVRVUVTVCkgPT0gRk1QU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMpKQorCisjZGVmaW5lIEZNUFNNQlVTX1JFU0VUX0NSMShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSAodWludDMyX3QpfigodWludDMyX3QpKEZNUEkyQ19DUjFfU01CSEVOIHwgRk1QSTJDX0NSMV9TTUJERU4gfCBGTVBJMkNfQ1IxX1BFQ0VOKSkpCisjZGVmaW5lIEZNUFNNQlVTX1JFU0VUX0NSMihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmPSAodWludDMyX3QpfigodWludDMyX3QpKEZNUEkyQ19DUjJfU0FERCB8IEZNUEkyQ19DUjJfSEVBRDEwUiB8IEZNUEkyQ19DUjJfTkJZVEVTIHwgRk1QSTJDX0NSMl9SRUxPQUQgfCBGTVBJMkNfQ1IyX1JEX1dSTikpKQorCisjZGVmaW5lIEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUKF9fQURETU9ERV9fLF9fQUREUkVTU19fKSAgICAgKCgoX19BRERNT0RFX18pID09IEZNUFNNQlVTX0FERFJFU1NJTkdNT0RFXzdCSVQpID8gKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEZNUEkyQ19DUjJfU0FERCkpIHwgKEZNUEkyQ19DUjJfU1RBUlQpIHwgKEZNUEkyQ19DUjJfQVVUT0VORCkpICYgKH5GTVBJMkNfQ1IyX1JEX1dSTikpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgoKCh1aW50MzJfdCkoX19BRERSRVNTX18pICYgKEZNUEkyQ19DUjJfU0FERCkpIHwgKEZNUEkyQ19DUjJfQUREMTApIHwgKEZNUEkyQ19DUjJfU1RBUlQpKSAmICh+Rk1QSTJDX0NSMl9SRF9XUk4pKSkKKworI2RlZmluZSBGTVBTTUJVU19HRVRfQUREUl9NQVRDSChfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgRk1QSTJDX0lTUl9BRERDT0RFKSA+PiAxN1UpCisjZGVmaW5lIEZNUFNNQlVTX0dFVF9ESVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiBGTVBJMkNfSVNSX0RJUikgPj4gMTZVKQorI2RlZmluZSBGTVBTTUJVU19HRVRfU1RPUF9NT0RFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgJiBGTVBJMkNfQ1IyX0FVVE9FTkQpCisjZGVmaW5lIEZNUFNNQlVTX0dFVF9QRUNfTU9ERShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiAmIEZNUEkyQ19DUjJfUEVDQllURSkKKyNkZWZpbmUgRk1QU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmIEZNUEkyQ19DUjFfQUxFUlRFTikKKworI2RlZmluZSBGTVBTTUJVU19DSEVDS19GTEFHKF9fSVNSX18sIF9fRkxBR19fKSAgICAgICAgICAgICAoKCgoX19JU1JfXykgJiAoKF9fRkxBR19fKSAmIEZNUFNNQlVTX0ZMQUdfTUFTSykpID09ICgoX19GTEFHX18pICYgRk1QU01CVVNfRkxBR19NQVNLKSkgPyBTRVQgOiBSRVNFVCkKKyNkZWZpbmUgRk1QU01CVVNfQ0hFQ0tfSVRfU09VUkNFKF9fQ1IxX18sIF9fSVRfXykgICAgICAgICAgKCgoKF9fQ1IxX18pICYgKF9fSVRfXykpID09IChfX0lUX18pKSA/IFNFVCA6IFJFU0VUKQorCisjZGVmaW5lIElTX0ZNUFNNQlVTX09XTl9BRERSRVNTMShBRERSRVNTMSkgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTMSkgPD0gMHgwMDAwMDNGRlUpCisjZGVmaW5lIElTX0ZNUFNNQlVTX09XTl9BRERSRVNTMihBRERSRVNTMikgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSRVNTMikgPD0gKHVpbnQxNl90KTB4MDBGRlUpCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRk1QU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zIEZNUFNNQlVTIEV4cG9ydGVkIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTVBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyogSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19Jbml0KEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfRGVJbml0KEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7Cit2b2lkIEhBTF9GTVBTTUJVU19Nc3BJbml0KEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7Cit2b2lkIEhBTF9GTVBTTUJVU19Nc3BEZUluaXQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19Db25maWdBbmFsb2dGaWx0ZXIoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKTsKKworLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19SZWdpc3RlckNhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgSEFMX0ZNUFNNQlVTX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBGTVBTTUJVU19DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19VblJlZ2lzdGVyQ2FsbGJhY2soRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCBIQUxfRk1QU01CVVNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19SZWdpc3RlckFkZHJDYWxsYmFjayhGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHBGTVBTTUJVU19BZGRyQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfVW5SZWdpc3RlckFkZHJDYWxsYmFjayhGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRk1QU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyogSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQGFkZHRvZ3JvdXAgQmxvY2tpbmdfbW9kZV9Qb2xsaW5nIEJsb2NraW5nIG1vZGUgUG9sbGluZworICogQHsKKyAqLworLyoqKioqKiogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX0lzRGV2aWNlUmVhZHkoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50MzJfdCBUcmlhbHMsIHVpbnQzMl90IFRpbWVvdXQpOworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBhZGR0b2dyb3VwIE5vbi1CbG9ja2luZ19tb2RlX0ludGVycnVwdCBOb24tQmxvY2tpbmcgbW9kZSBJbnRlcnJ1cHQKKyAqIEB7CisgKi8KKy8qKioqKioqIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19NYXN0ZXJfVHJhbnNtaXRfSVQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX01hc3Rlcl9SZWNlaXZlX0lUKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19NYXN0ZXJfQWJvcnRfSVQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MTZfdCBEZXZBZGRyZXNzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19TbGF2ZV9UcmFuc21pdF9JVChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfU2xhdmVfUmVjZWl2ZV9JVChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucyk7CisKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19FbmFibGVBbGVydF9JVChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX0Rpc2FibGVBbGVydF9JVChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX0VuYWJsZUxpc3Rlbl9JVChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX0Rpc2FibGVMaXN0ZW5fSVQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKTsKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTVBTTUJVU19JUlFfSGFuZGxlcl9hbmRfQ2FsbGJhY2tzIElSUSBIYW5kbGVyIGFuZCBDYWxsYmFja3MKKyAqIEB7CisgKi8KKy8qKioqKioqIEZNUFNNQlVTIElSUUhhbmRsZXIgYW5kIENhbGxiYWNrcyB1c2VkIGluIG5vbiBibG9ja2luZyBtb2RlcyAoSW50ZXJydXB0KSAqLwordm9pZCBIQUxfRk1QU01CVVNfRVZfSVJRSGFuZGxlcihGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOwordm9pZCBIQUxfRk1QU01CVVNfRVJfSVJRSGFuZGxlcihGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOwordm9pZCBIQUxfRk1QU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKTsKK3ZvaWQgSEFMX0ZNUFNNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7Cit2b2lkIEhBTF9GTVBTTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7Cit2b2lkIEhBTF9GTVBTTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7Cit2b2lkIEhBTF9GTVBTTUJVU19BZGRyQ2FsbGJhY2soRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uLCB1aW50MTZfdCBBZGRyTWF0Y2hDb2RlKTsKK3ZvaWQgSEFMX0ZNUFNNQlVTX0xpc3RlbkNwbHRDYWxsYmFjayhGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOwordm9pZCBIQUxfRk1QU01CVVNfRXJyb3JDYWxsYmFjayhGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOworCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGFkZHRvZ3JvdXAgRk1QU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKiAgQHsKKyAqLworCisvKiBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IEhBTF9GTVBTTUJVU19HZXRTdGF0ZShGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpOwordWludDMyX3QgSEFMX0ZNUFNNQlVTX0dldEVycm9yKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qIFByaXZhdGUgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX1ByaXZhdGVfRnVuY3Rpb25zIEZNUFNNQlVTIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHN0bTMyZjR4eF9oYWxfZm1wc21idXMuYyBmaWxlICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogRk1QSTJDX0NSMV9QRSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogU1RNMzJGNHh4X0hBTF9GTVBTTUJVU19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmNHh4X2hhbF9oY2QuaCBiL0luYy9zdG0zMmY0eHhfaGFsX2hjZC5oCmluZGV4IDVmNGNjY2QuLjRlNzZhZjQgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY0eHhfaGFsX2hjZC5oCisrKyBiL0luYy9zdG0zMmY0eHhfaGFsX2hjZC5oCkBAIC0xMDksOCArMTA5LDggQEAKICAgKiBAewogICAqLwogI2RlZmluZSBIQ0RfU1BFRURfSElHSCAgICAgICAgICAgICAgIFVTQkhfSFNfU1BFRUQKLSNkZWZpbmUgSENEX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICBVU0JIX0ZTX1NQRUVECi0jZGVmaW5lIEhDRF9TUEVFRF9MT1cgICAgICAgICAgICAgICAgVVNCSF9MU19TUEVFRAorI2RlZmluZSBIQ0RfU1BFRURfRlVMTCAgICAgICAgICAgICAgIFVTQkhfRlNMU19TUEVFRAorI2RlZmluZSBIQ0RfU1BFRURfTE9XICAgICAgICAgICAgICAgIFVTQkhfRlNMU19TUEVFRAogCiAvKioKICAgKiBAfQpAQCAtMTcwLDE5ICsxNzAsMTUgQEAKIC8qKiBAZGVmZ3JvdXAgSENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwogICAqIEB7CiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiAgICAgIEhBTF9IQ0RfSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Ci1IQUxfU3RhdHVzVHlwZURlZiAgICAgIEhBTF9IQ0RfRGVJbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKLUhBTF9TdGF0dXNUeXBlRGVmICAgICAgSEFMX0hDRF9IQ19Jbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaF9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXZfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtcHMpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hDRF9Jbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfRGVJbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfSENfSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwgdWludDhfdCBjaF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcG51bSwgdWludDhfdCBkZXZfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNwZWVkLCB1aW50OF90IGVwX3R5cGUsIHVpbnQxNl90IG1wcyk7CiAKLUhBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfSENEX0hDX0hhbHQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QsIHVpbnQ4X3QgY2hfbnVtKTsKLXZvaWQgICAgICAgICAgICAgICAgICBIQUxfSENEX01zcEluaXQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotdm9pZCAgICAgICAgICAgICAgICAgIEhBTF9IQ0RfTXNwRGVJbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfSENfSGFsdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwgdWludDhfdCBjaF9udW0pOwordm9pZCAgICAgICAgICAgICAgSEFMX0hDRF9Nc3BJbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9IQ0RfTXNwRGVJbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKIAogI2lmIChVU0VfSEFMX0hDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAvKiogQGRlZmdyb3VwIEhBTF9IQ0RfQ2FsbGJhY2tfSURfZW51bWVyYXRpb25fZGVmaW5pdGlvbiBIQUwgVVNCIE9URyBIQ0QgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgpAQCAtMTkxLDE0ICsxODcsMTQgQEAKICAgKi8KIHR5cGVkZWYgZW51bQogewotICBIQUxfSENEX1NPRl9DQl9JRCAgICAgICAgICAgPSAweDAxLCAgICAgICAvKiE8IFVTQiBIQ0QgU09GIGNhbGxiYWNrIElEICAgICAgICAgICAqLwotICBIQUxfSENEX0NPTk5FQ1RfQ0JfSUQgICAgICAgPSAweDAyLCAgICAgICAvKiE8IFVTQiBIQ0QgQ29ubmVjdCBjYWxsYmFjayBJRCAgICAgICAqLwotICBIQUxfSENEX0RJU0NPTk5FQ1RfQ0JfSUQgICA9IDB4MDMsICAgICAgIC8qITwgVVNCIEhDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElEICAgICovCi0gIEhBTF9IQ0RfUE9SVF9FTkFCTEVEX0NCX0lEICAgPSAweDA0LCAgICAgIC8qITwgVVNCIEhDRCBQb3J0IEVuYWJsZSBjYWxsYmFjayBJRCAgICovCi0gIEhBTF9IQ0RfUE9SVF9ESVNBQkxFRF9DQl9JRCAgPSAweDA1LCAgICAgIC8qITwgVVNCIEhDRCBQb3J0IERpc2FibGUgY2FsbGJhY2sgSUQgICovCisgIEhBTF9IQ0RfU09GX0NCX0lEICAgICAgICAgICAgPSAweDAxLCAgICAgICAvKiE8IFVTQiBIQ0QgU09GIGNhbGxiYWNrIElEICAgICAgICAgICAqLworICBIQUxfSENEX0NPTk5FQ1RfQ0JfSUQgICAgICAgID0gMHgwMiwgICAgICAgLyohPCBVU0IgSENEIENvbm5lY3QgY2FsbGJhY2sgSUQgICAgICAgKi8KKyAgSEFMX0hDRF9ESVNDT05ORUNUX0NCX0lEICAgICA9IDB4MDMsICAgICAgIC8qITwgVVNCIEhDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElEICAgICovCisgIEhBTF9IQ0RfUE9SVF9FTkFCTEVEX0NCX0lEICAgPSAweDA0LCAgICAgICAvKiE8IFVTQiBIQ0QgUG9ydCBFbmFibGUgY2FsbGJhY2sgSUQgICAqLworICBIQUxfSENEX1BPUlRfRElTQUJMRURfQ0JfSUQgID0gMHgwNSwgICAgICAgLyohPCBVU0IgSENEIFBvcnQgRGlzYWJsZSBjYWxsYmFjayBJRCAgKi8KIAotICBIQUxfSENEX01TUElOSVRfQ0JfSUQgICAgICAgPSAweDA2LCAgICAgICAvKiE8IFVTQiBIQ0QgTXNwSW5pdCBjYWxsYmFjayBJRCAgICAgICAqLwotICBIQUxfSENEX01TUERFSU5JVF9DQl9JRCAgICAgPSAweDA3ICAgICAgICAvKiE8IFVTQiBIQ0QgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAqLworICBIQUxfSENEX01TUElOSVRfQ0JfSUQgICAgICAgID0gMHgwNiwgICAgICAgLyohPCBVU0IgSENEIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgKi8KKyAgSEFMX0hDRF9NU1BERUlOSVRfQ0JfSUQgICAgICA9IDB4MDcgICAgICAgIC8qITwgVVNCIEhDRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgICovCiAKIH0gSEFMX0hDRF9DYWxsYmFja0lEVHlwZURlZjsKIC8qKgpAQCAtMjMyLDI1ICsyMjgsMjAgQEAKIC8qKiBAYWRkdG9ncm91cCBIQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKICAgKiBAewogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0hDRF9IQ19TdWJtaXRSZXF1ZXN0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRvX3BpbmcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hDRF9IQ19TdWJtaXRSZXF1ZXN0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLCB1aW50OF90IGNoX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpcmVjdGlvbiwgdWludDhfdCBlcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdG9rZW4sIHVpbnQ4X3QgKnBidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCwgdWludDhfdCBkb19waW5nKTsKIAogLyogTm9uLUJsb2NraW5nIG1vZGU6IEludGVycnVwdCAqLwotdm9pZCAgICAgICAgICAgICBIQUxfSENEX0lSUUhhbmRsZXIoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotdm9pZCAgICAgICAgICAgICBIQUxfSENEX1NPRl9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Ci12b2lkICAgICAgICAgICAgIEhBTF9IQ0RfQ29ubmVjdF9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Ci12b2lkICAgICAgICAgICAgIEhBTF9IQ0RfRGlzY29ubmVjdF9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Ci12b2lkICAgICAgICAgICAgIEhBTF9IQ0RfUG9ydEVuYWJsZWRfQ2FsbGJhY2soSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotdm9pZCAgICAgICAgICAgICBIQUxfSENEX1BvcnREaXNhYmxlZF9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Ci12b2lkICAgICAgICAgICAgIEhBTF9IQ0RfSENfTm90aWZ5VVJCQ2hhbmdlX0NhbGxiYWNrKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNobnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0RfVVJCU3RhdGVUeXBlRGVmIHVyYl9zdGF0ZSk7Cit2b2lkIEhBTF9IQ0RfSVJRSGFuZGxlcihIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Cit2b2lkIEhBTF9IQ0RfU09GX0NhbGxiYWNrKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK3ZvaWQgSEFMX0hDRF9Db25uZWN0X0NhbGxiYWNrKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK3ZvaWQgSEFMX0hDRF9EaXNjb25uZWN0X0NhbGxiYWNrKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK3ZvaWQgSEFMX0hDRF9Qb3J0RW5hYmxlZF9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Cit2b2lkIEhBTF9IQ0RfUG9ydERpc2FibGVkX0NhbGxiYWNrKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK3ZvaWQgSEFMX0hDRF9IQ19Ob3RpZnlVUkJDaGFuZ2VfQ2FsbGJhY2soSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QsIHVpbnQ4X3QgY2hudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDRF9VUkJTdGF0ZVR5cGVEZWYgdXJiX3N0YXRlKTsKIC8qKgogICAqIEB9CiAgICovCkBAIC0yNTksOSArMjUwLDkgQEAKIC8qKiBAYWRkdG9ncm91cCBIQ0RfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCiAgICogQHsKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9IQ0RfUmVzZXRQb3J0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKLUhBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9IQ0RfU3RhcnQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgSEFMX0hDRF9TdG9wKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfUmVzZXRQb3J0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfU3RhcnQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hDRF9TdG9wKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKIC8qKgogICAqIEB9CiAgICovCkBAIC0yNzIsOCArMjYzLDggQEAKICAgKi8KIEhDRF9TdGF0ZVR5cGVEZWYgICAgICAgIEhBTF9IQ0RfR2V0U3RhdGUoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwogSENEX1VSQlN0YXRlVHlwZURlZiAgICAgSEFMX0hDRF9IQ19HZXRVUkJTdGF0ZShIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwgdWludDhfdCBjaG51bSk7Ci11aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfSENEX0hDX0dldFhmZXJDb3VudChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwgdWludDhfdCBjaG51bSk7CiBIQ0RfSENTdGF0ZVR5cGVEZWYgICAgICBIQUxfSENEX0hDX0dldFN0YXRlKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLCB1aW50OF90IGNobnVtKTsKK3VpbnQzMl90ICAgICAgICAgICAgICAgIEhBTF9IQ0RfSENfR2V0WGZlckNvdW50KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLCB1aW50OF90IGNobnVtKTsKIHVpbnQzMl90ICAgICAgICAgICAgICAgIEhBTF9IQ0RfR2V0Q3VycmVudEZyYW1lKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKIHVpbnQzMl90ICAgICAgICAgICAgICAgIEhBTF9IQ0RfR2V0Q3VycmVudFNwZWVkKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKIC8qKgpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjR4eF9oYWxfaTJzLmggYi9JbmMvc3RtMzJmNHh4X2hhbF9pMnMuaAppbmRleCAyZDk2MzE1Li4yMDNmZmMxIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmNHh4X2hhbF9pMnMuaAorKysgYi9JbmMvc3RtMzJmNHh4X2hhbF9pMnMuaApAQCAtMTgxLDYgKzE4MSw3IEBACiAjaWYgKFVTRV9IQUxfSTJTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICNkZWZpbmUgSEFMX0kyU19FUlJPUl9JTlZBTElEX0NBTExCQUNLICAgKDB4MDAwMDAwMjBVKSAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAgICAgKi8KICNlbmRpZiAvKiBVU0VfSEFMX0kyU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyNkZWZpbmUgSEFMX0kyU19FUlJPUl9CVVNZX0xJTkVfUlggICAgICAgKDB4MDAwMDAwNDBVKSAgLyohPCBCdXN5IFJ4IExpbmUgZXJyb3IgICAgICAgICAgKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC00MjEsNiArNDIyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWdfdWRyID0gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRUQodG1wcmVnX3Vkcik7IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCisvKiogQGJyaWVmIEZsdXNoIHRoZSBJMlMgRFIgUmVnaXN0ZXIuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgSTJTIEhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfSTJTX0ZMVVNIX1JYX0RSKF9fSEFORExFX18pICBkb3tcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0lPIHVpbnQzMl90IHRtcHJlZ19kciA9IDB4MDBVO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcHJlZ19kciA9ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5EUik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5VU0VEKHRtcHJlZ19kcik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMFUpCiAvKioKICAgKiBAfQogICAqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjR4eF9oYWxfaTJzX2V4LmggYi9JbmMvc3RtMzJmNHh4X2hhbF9pMnNfZXguaAppbmRleCA4NzIyODNiLi4xMDMzNWY0IDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmNHh4X2hhbF9pMnNfZXguaAorKysgYi9JbmMvc3RtMzJmNHh4X2hhbF9pMnNfZXguaApAQCAtMTExLDYgKzExMSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnX3VkciA9IEkyU3hFWFQoKF9fSEFORExFX18pLT5JbnN0YW5jZSktPlNSO1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWdfdWRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKKy8qKiBAYnJpZWYgRmx1c2ggdGhlIEkyUyBhbmQgSTJTRXh0IERSIFJlZ2lzdGVycy4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJMlMgSGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworI2RlZmluZSBfX0hBTF9JMlNFWFRfRkxVU0hfUlhfRFIoX19IQU5ETEVfXykgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fSU8gdWludDMyX3QgdG1wcmVnX2RyID0gMHgwMFU7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXByZWdfZHIgPSBJMlN4RVhUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UpLT5EUjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wcmVnX2RyID0gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRSKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVVNFRCh0bXByZWdfZHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwVSkKIC8qKgogICAqIEB9CiAgICovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmNHh4X2hhbF9wY2QuaCBiL0luYy9zdG0zMmY0eHhfaGFsX3BjZC5oCmluZGV4IDJkYjU5NWMuLmVkYmI3YzYgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY0eHhfaGFsX3BjZC5oCisrKyBiL0luYy9zdG0zMmY0eHhfaGFsX3BjZC5oCkBAIC05NiwxNiArOTYsMTYgQEAKIHR5cGVkZWYgc3RydWN0CiAjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiB7Ci0gIFBDRF9UeXBlRGVmICAgICAgICAgICAgICpJbnN0YW5jZTsgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgKi8KLSAgUENEX0luaXRUeXBlRGVmICAgICAgICAgSW5pdDsgICAgICAgIC8qITwgUENEIHJlcXVpcmVkIHBhcmFtZXRlcnMgICAgICAgICAgICAqLwotICBfX0lPIHVpbnQ4X3QgICAgICAgICAgICBVU0JfQWRkcmVzczsgLyohPCBVU0IgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFBDRF9FUFR5cGVEZWYgICAgICAgICAgIElOX2VwWzE2XTsgICAvKiE8IElOIGVuZHBvaW50IHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KLSAgUENEX0VQVHlwZURlZiAgICAgICAgICAgT1VUX2VwWzE2XTsgIC8qITwgT1VUIGVuZHBvaW50IHBhcmFtZXRlcnMgICAgICAgICAgICAqLwotICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICBMb2NrOyAgICAgICAgLyohPCBQQ0QgcGVyaXBoZXJhbCBzdGF0dXMgICAgICAgICAgICAgICovCi0gIF9fSU8gUENEX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAvKiE8IFBDRCBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAgKi8KLSAgX19JTyAgdWludDMyX3QgICAgICAgICAgRXJyb3JDb2RlOyAgIC8qITwgUENEIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAqLwotICB1aW50MzJfdCAgICAgICAgICAgICAgICBTZXR1cFsxMl07ICAgLyohPCBTZXR1cCBwYWNrZXQgYnVmZmVyICAgICAgICAgICAgICAgICovCi0gIFBDRF9MUE1fU3RhdGVUeXBlRGVmICAgIExQTV9TdGF0ZTsgICAvKiE8IExQTSBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENEX1R5cGVEZWYgICAgICAgICAgICAgKkluc3RhbmNlOyAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICovCisgIFBDRF9Jbml0VHlwZURlZiAgICAgICAgIEluaXQ7ICAgICAgICAvKiE8IFBDRCByZXF1aXJlZCBwYXJhbWV0ZXJzICAgICAgICAgICAqLworICBfX0lPIHVpbnQ4X3QgICAgICAgICAgICBVU0JfQWRkcmVzczsgLyohPCBVU0IgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENEX0VQVHlwZURlZiAgICAgICAgICAgSU5fZXBbMTZdOyAgIC8qITwgSU4gZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgICovCisgIFBDRF9FUFR5cGVEZWYgICAgICAgICAgIE9VVF9lcFsxNl07ICAvKiE8IE9VVCBlbmRwb2ludCBwYXJhbWV0ZXJzICAgICAgICAgICAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICBMb2NrOyAgICAgICAgLyohPCBQQ0QgcGVyaXBoZXJhbCBzdGF0dXMgICAgICAgICAgICAgKi8KKyAgX19JTyBQQ0RfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgIC8qITwgUENEIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICovCisgIF9fSU8gIHVpbnQzMl90ICAgICAgICAgIEVycm9yQ29kZTsgICAvKiE8IFBDRCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICBTZXR1cFsxMl07ICAgLyohPCBTZXR1cCBwYWNrZXQgYnVmZmVyICAgICAgICAgICAgICAgKi8KKyAgUENEX0xQTV9TdGF0ZVR5cGVEZWYgICAgTFBNX1N0YXRlOyAgIC8qITwgTFBNIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIEJFU0w7CiAKIApAQCAtMjYwLDcgKzI2MCw3IEBACiAgIEhBTF9QQ0RfU1VTUEVORF9DQl9JRCAgICAgID0gMHgwNCwgICAgICAvKiE8IFVTQiBQQ0QgU3VzcGVuZCBjYWxsYmFjayBJRCAgICAgICovCiAgIEhBTF9QQ0RfUkVTVU1FX0NCX0lEICAgICAgID0gMHgwNSwgICAgICAvKiE8IFVTQiBQQ0QgUmVzdW1lIGNhbGxiYWNrIElEICAgICAgICovCiAgIEhBTF9QQ0RfQ09OTkVDVF9DQl9JRCAgICAgID0gMHgwNiwgICAgICAvKiE8IFVTQiBQQ0QgQ29ubmVjdCBjYWxsYmFjayBJRCAgICAgICovCi0gIEhBTF9QQ0RfRElTQ09OTkVDVF9DQl9JRCAgPSAweDA3LCAgICAgIC8qITwgVVNCIFBDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElEICAgKi8KKyAgSEFMX1BDRF9ESVNDT05ORUNUX0NCX0lEICAgPSAweDA3LCAgICAgIC8qITwgVVNCIFBDRCBEaXNjb25uZWN0IGNhbGxiYWNrIElEICAgKi8KIAogICBIQUxfUENEX01TUElOSVRfQ0JfSUQgICAgICA9IDB4MDgsICAgICAgLyohPCBVU0IgUENEIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAqLwogICBIQUxfUENEX01TUERFSU5JVF9DQl9JRCAgICA9IDB4MDkgICAgICAgLyohPCBVU0IgUENEIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAqLwpAQCAtMzc5LDE0ICszNzksNiBAQAogICAqIEB7CiAgICovCiAjaWYgZGVmaW5lZCAoVVNCX09UR19GUykgfHwgZGVmaW5lZCAoVVNCX09UR19IUykKLSNkZWZpbmUgVVNCX09UR19GU19XQUtFVVBfRVhUSV9SSVNJTkdfRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4VQotI2RlZmluZSBVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0ZBTExJTkdfRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MENVCi0jZGVmaW5lIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0ZBTExJTkdfRURHRSAgICAgICAgICAgICAgICAgICAgMHgxMFUKLQotI2RlZmluZSBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX1JJU0lOR19FREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDhVCi0jZGVmaW5lIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfRkFMTElOR19FREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQ1UKLSNkZWZpbmUgVVNCX09UR19IU19XQUtFVVBfRVhUSV9SSVNJTkdfRkFMTElOR19FREdFICAgICAgICAgICAgICAgICAgICAweDEwVQotCiAjZGVmaW5lIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfTElORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MVUgPDwgMTgpICAvKiE8IFVTQiBGUyBFWFRJIExpbmUgV2FrZVVwIEludGVycnVwdCAqLwogI2RlZmluZSBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFVIDw8IDIwKSAgLyohPCBVU0IgSFMgRVhUSSBMaW5lIFdha2VVcCBJbnRlcnJ1cHQgKi8KICNlbmRpZiAvKiBkZWZpbmVkIChVU0JfT1RHX0ZTKSB8fCBkZWZpbmVkIChVU0JfT1RHX0hTKSAqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjR4eF9oYWxfcXNwaS5oIGIvSW5jL3N0bTMyZjR4eF9oYWxfcXNwaS5oCmluZGV4IDRjNWRlNTguLjk3ZTkzMjQgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY0eHhfaGFsX3FzcGkuaAorKysgYi9JbmMvc3RtMzJmNHh4X2hhbF9xc3BpLmgKQEAgLTYsODIgKzYsNzQgQEAKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICogQGF0dGVudGlvbgogICAqCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAgKgogICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAotICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKi8KIAogLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX19TVE0zMkY0eHhfSEFMX1FTUElfSAotI2RlZmluZSBfX1NUTTMyRjR4eF9IQUxfUVNQSV9ICisjaWZuZGVmIFNUTTMyRjR4eF9IQUxfUVNQSV9ICisjZGVmaW5lIFNUTTMyRjR4eF9IQUxfUVNQSV9ICiAKICNpZmRlZiBfX2NwbHVzcGx1cwogIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKFNUTTMyRjQ0Nnh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ2OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ3OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQxMlp4KSB8fCBkZWZpbmVkKFNUTTMyRjQxMlZ4KSB8fCBcCi0gICAgZGVmaW5lZChTVE0zMkY0MTJSeCkgfHwgZGVmaW5lZChTVE0zMkY0MTN4eCkgfHwgZGVmaW5lZChTVE0zMkY0MjN4eCkKIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSAic3RtMzJmNHh4X2hhbF9kZWYuaCIKIAorI2lmIGRlZmluZWQoUVVBRFNQSSkKKwogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgICogQHsKICAgKi8KIAogLyoqIEBhZGR0b2dyb3VwIFFTUEkKICAgKiBAewotICAqLyAKKyAgKi8KIAotLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCisvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX1R5cGVzIFFTUEkgRXhwb3J0ZWQgVHlwZXMKICAgKiBAewogICAqLwotICAKLS8qKiAKLSAgKiBAYnJpZWYgIFFTUEkgSW5pdCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCi0gICovCiAKKy8qKgorICAqIEBicmllZiAgUVNQSSBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uCisgICovCiB0eXBlZGVmIHN0cnVjdAogewogICB1aW50MzJfdCBDbG9ja1ByZXNjYWxlcjsgICAgIC8qIFNwZWNpZmllcyB0aGUgcHJlc2NhbGVyIGZhY3RvciBmb3IgZ2VuZXJhdGluZyBjbG9jayBiYXNlZCBvbiB0aGUgQUhCIGNsb2NrLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NSAqLyAKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NSAqLwogICB1aW50MzJfdCBGaWZvVGhyZXNob2xkOyAgICAgIC8qIFNwZWNpZmllcyB0aGUgdGhyZXNob2xkIG51bWJlciBvZiBieXRlcyBpbiB0aGUgRklGTyAodXNlZCBvbmx5IGluIGluZGlyZWN0IG1vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAzMiAqLwotCi0gIHVpbnQzMl90IFNhbXBsZVNoaWZ0aW5nOyAgICAgLyogU3BlY2lmaWVzIHRoZSBTYW1wbGUgU2hpZnQuIFRoZSBkYXRhIGlzIHNhbXBsZWQgMS8yIGNsb2NrIGN5Y2xlIGRlbGF5IGxhdGVyIHRvIAorICB1aW50MzJfdCBTYW1wbGVTaGlmdGluZzsgICAgIC8qIFNwZWNpZmllcyB0aGUgU2FtcGxlIFNoaWZ0LiBUaGUgZGF0YSBpcyBzYW1wbGVkIDEvMiBjbG9jayBjeWNsZSBkZWxheSBsYXRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UgaW4gYWNjb3VudCBleHRlcm5hbCBzaWduYWwgZGVsYXlzLiAoSXQgc2hvdWxkIGJlIFFTUElfU0FNUExFX1NISUZUSU5HX05PTkUgaW4gRERSIG1vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX1NhbXBsZVNoaWZ0aW5nICovCi0KLSAgdWludDMyX3QgRmxhc2hTaXplOyAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIEZsYXNoIFNpemUuIEZsYXNoU2l6ZSsxIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYWRkcmVzcyBiaXRzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGFkZHJlc3MgdGhlIGZsYXNoIG1lbW9yeS4gVGhlIGZsYXNoIGNhcGFjaXR5IGNhbiBiZSB1cCB0byA0R0IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHJlc3NlZCB1c2luZyAzMiBiaXRzKSBpbiBpbmRpcmVjdCBtb2RlLCBidXQgdGhlIGFkZHJlc3NhYmxlIHNwYWNlIGluIAorICB1aW50MzJfdCBGbGFzaFNpemU7ICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgRmxhc2ggU2l6ZS4gRmxhc2hTaXplKzEgaXMgZWZmZWN0aXZlbHkgdGhlIG51bWJlciBvZiBhZGRyZXNzIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCB0byBhZGRyZXNzIHRoZSBmbGFzaCBtZW1vcnkuIFRoZSBmbGFzaCBjYXBhY2l0eSBjYW4gYmUgdXAgdG8gNEdCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHJlc3NlZCB1c2luZyAzMiBiaXRzKSBpbiBpbmRpcmVjdCBtb2RlLCBidXQgdGhlIGFkZHJlc3NhYmxlIHNwYWNlIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LW1hcHBlZCBtb2RlIGlzIGxpbWl0ZWQgdG8gMjU2TUIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAzMSAqLwotCi0gIHVpbnQzMl90IENoaXBTZWxlY3RIaWdoVGltZTsgLyogU3BlY2lmaWVzIHRoZSBDaGlwIFNlbGVjdCBIaWdoIFRpbWUuIENoaXBTZWxlY3RIaWdoVGltZSsxIGRlZmluZXMgdGhlIG1pbmltdW0gbnVtYmVyIAorICB1aW50MzJfdCBDaGlwU2VsZWN0SGlnaFRpbWU7IC8qIFNwZWNpZmllcyB0aGUgQ2hpcCBTZWxlY3QgSGlnaCBUaW1lLiBDaGlwU2VsZWN0SGlnaFRpbWUrMSBkZWZpbmVzIHRoZSBtaW5pbXVtIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNsb2NrIGN5Y2xlcyB3aGljaCB0aGUgY2hpcCBzZWxlY3QgbXVzdCByZW1haW4gaGlnaCBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9DaGlwU2VsZWN0SGlnaFRpbWUgKi8gCi0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQ2hpcFNlbGVjdEhpZ2hUaW1lICovCiAgIHVpbnQzMl90IENsb2NrTW9kZTsgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBDbG9jayBNb2RlLiBJdCBpbmRpY2F0ZXMgdGhlIGxldmVsIHRoYXQgY2xvY2sgdGFrZXMgYmV0d2VlbiBjb21tYW5kcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQ2xvY2tNb2RlICovCi0KICAgdWludDMyX3QgRmxhc2hJRDsgICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIEZsYXNoIHdoaWNoIHdpbGwgYmUgdXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfRmxhc2hfU2VsZWN0ICovCi0KICAgdWludDMyX3QgRHVhbEZsYXNoOyAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIER1YWwgRmxhc2ggTW9kZSBTdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9EdWFsRmxhc2hfTW9kZSAqLwogfVFTUElfSW5pdFR5cGVEZWY7CiAKLS8qKiAKLSAgKiBAYnJpZWYgSEFMIFFTUEkgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uICAKLSAgKi8gCisvKioKKyAgKiBAYnJpZWYgSEFMIFFTUEkgU3RhdGUgc3RydWN0dXJlcyBkZWZpbml0aW9uCisgICovCiB0eXBlZGVmIGVudW0KIHsKICAgSEFMX1FTUElfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBQZXJpcGhlcmFsIG5vdCBpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTM0LDE3ICsxMjYsMTcgQEAKICNlbmRpZgogfVFTUElfSGFuZGxlVHlwZURlZjsKIAotLyoqIAotICAqIEBicmllZiAgUVNQSSBDb21tYW5kIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKy8qKgorICAqIEBicmllZiAgUVNQSSBDb21tYW5kIHN0cnVjdHVyZSBkZWZpbml0aW9uCiAgICovCiB0eXBlZGVmIHN0cnVjdAogewogICB1aW50MzJfdCBJbnN0cnVjdGlvbjsgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgSW5zdHJ1Y3Rpb24gdG8gYmUgc2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlICg4LWJpdCkgYmV0d2VlbiAweDAwIGFuZCAweEZGICovCiAgIHVpbnQzMl90IEFkZHJlc3M7ICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBBZGRyZXNzIHRvIGJlIHNlbnQgKFNpemUgZnJvbSAxIHRvIDQgYnl0ZXMgYWNjb3JkaW5nIEFkZHJlc3NTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlICgzMi1iaXRzKSBiZXR3ZWVuIDB4MCBhbmQgMHhGRkZGRkZGRlUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSAoMzItYml0cykgYmV0d2VlbiAweDAgYW5kIDB4RkZGRkZGRkYgKi8KICAgdWludDMyX3QgQWx0ZXJuYXRlQnl0ZXM7ICAgICAvKiBTcGVjaWZpZXMgdGhlIEFsdGVybmF0ZSBCeXRlcyB0byBiZSBzZW50IChTaXplIGZyb20gMSB0byA0IGJ5dGVzIGFjY29yZGluZyBBbHRlcm5hdGVCeXRlc1NpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgKDMyLWJpdHMpIGJldHdlZW4gMHgwIGFuZCAweEZGRkZGRkZGVSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlICgzMi1iaXRzKSBiZXR3ZWVuIDB4MCBhbmQgMHhGRkZGRkZGRiAqLwogICB1aW50MzJfdCBBZGRyZXNzU2l6ZTsgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgQWRkcmVzcyBTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX0FkZHJlc3NTaXplICovCiAgIHVpbnQzMl90IEFsdGVybmF0ZUJ5dGVzU2l6ZTsgLyogU3BlY2lmaWVzIHRoZSBBbHRlcm5hdGUgQnl0ZXMgU2l6ZQpAQCAtMTU5LDI5ICsxNTEsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQWx0ZXJuYXRlQnl0ZXNNb2RlICovCiAgIHVpbnQzMl90IERhdGFNb2RlOyAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBEYXRhIE1vZGUgKHVzZWQgZm9yIGR1bW15IGN5Y2xlcyBhbmQgZGF0YSBwaGFzZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX0RhdGFNb2RlICovCi0gIHVpbnQzMl90IE5iRGF0YTsgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRkZGRkZVICgwIG1lYW5zIHVuZGVmaW5lZCBsZW5ndGggCisgIHVpbnQzMl90IE5iRGF0YTsgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGF0YSB0byB0cmFuc2Zlci4gKFRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGRkZGRiAoMCBtZWFucyB1bmRlZmluZWQgbGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgZW5kIG9mIG1lbW9yeSkqLwogICB1aW50MzJfdCBEZHJNb2RlOyAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgZG91YmxlIGRhdGEgcmF0ZSBtb2RlIGZvciBhZGRyZXNzLCBhbHRlcm5hdGUgYnl0ZSBhbmQgZGF0YSBwaGFzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9EZHJNb2RlICovCi0gIHVpbnQzMl90IERkckhvbGRIYWxmQ3ljbGU7ICAgLyogU3BlY2lmaWVzIHRoZSBERFIgaG9sZCBoYWxmIGN5Y2xlLiBJdCBkZWxheXMgdGhlIGRhdGEgb3V0cHV0IGJ5IG9uZSBoYWxmIG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjbG9jayBpbiBERFIgbW9kZS4KKyAgdWludDMyX3QgRGRySG9sZEhhbGZDeWNsZTsgICAvKiBTcGVjaWZpZXMgaWYgdGhlIEREUiBob2xkIGlzIGVuYWJsZWQuIFdoZW4gZW5hYmxlZCBpdCBkZWxheXMgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYnkgb25lIGhhbGYgb2Ygc3lzdGVtIGNsb2NrIGluIEREUiBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9EZHJIb2xkSGFsZkN5Y2xlICovCi0gIHVpbnQzMl90IFNJT09Nb2RlOyAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIHNlbmQgaW5zdHJ1Y3Rpb24gb25seSBvbmNlIG1vZGUKKyAgdWludDMyX3QgU0lPT01vZGU7ICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIHNlbmQgaW5zdHJ1Y3Rpb24gb25seSBvbmNlIG1vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfU0lPT01vZGUgKi8KIH1RU1BJX0NvbW1hbmRUeXBlRGVmOwogCi0vKiogCi0gICogQGJyaWVmICBRU1BJIEF1dG8gUG9sbGluZyBtb2RlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24gIAorLyoqCisgICogQGJyaWVmICBRU1BJIEF1dG8gUG9sbGluZyBtb2RlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb24KICAgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgIHVpbnQzMl90IE1hdGNoOyAgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSB2YWx1ZSB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBtYXNrZWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCBhIG1hdGNoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGRkZGRkZGVSAqLwotICB1aW50MzJfdCBNYXNrOyAgICAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgbWFzayB0byBiZSBhcHBsaWVkIHRvIHRoZSBzdGF0dXMgYnl0ZXMgcmVjZWl2ZWQuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGRkZGRkZGVSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGRkZGRkZGICovCisgIHVpbnQzMl90IE1hc2s7ICAgICAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBtYXNrIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHN0YXR1cyBieXRlcyByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGRkZGRiAqLwogICB1aW50MzJfdCBJbnRlcnZhbDsgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIHR3byByZWFkIGR1cmluZyBhdXRvbWF0aWMgcG9sbGluZyBwaGFzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRlUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGICovCiAgIHVpbnQzMl90IFN0YXR1c0J5dGVzU2l6ZTsgICAgLyogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBzdGF0dXMgYnl0ZXMgcmVjZWl2ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDQgKi8KICAgdWludDMyX3QgTWF0Y2hNb2RlOyAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIGZvciBkZXRlcm1pbmluZyBhIG1hdGNoLgpAQCAtMTkwLDE0ICsxODIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQXV0b21hdGljU3RvcCAqLwogfVFTUElfQXV0b1BvbGxpbmdUeXBlRGVmOwogCi0vKiogCi0gICogQGJyaWVmICBRU1BJIE1lbW9yeSBNYXBwZWQgbW9kZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKy8qKgorICAqIEBicmllZiAgUVNQSSBNZW1vcnkgTWFwcGVkIG1vZGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgogICAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgdWludDMyX3QgVGltZU91dFBlcmlvZDsgICAgICAvKiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjbG9jayB0byB3YWl0IHdoZW4gdGhlIEZJRk8gaXMgZnVsbCBiZWZvcmUgdG8gcmVsZWFzZSB0aGUgY2hpcCBzZWxlY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRlUgKi8KLSAgdWludDMyX3QgVGltZU91dEFjdGl2YXRpb247ICAvKiBTcGVjaWZpZXMgaWYgdGhlIHRpbWUgb3V0IGNvdW50ZXIgaXMgZW5hYmxlZCB0byByZWxlYXNlIHRoZSBjaGlwIHNlbGVjdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRiAqLworICB1aW50MzJfdCBUaW1lT3V0QWN0aXZhdGlvbjsgIC8qIFNwZWNpZmllcyBpZiB0aGUgdGltZW91dCBjb3VudGVyIGlzIGVuYWJsZWQgdG8gcmVsZWFzZSB0aGUgY2hpcCBzZWxlY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX1RpbWVPdXRBY3RpdmF0aW9uICovCiB9UVNQSV9NZW1vcnlNYXBwZWRUeXBlRGVmOwogCkBAIC0yMzUsNDEgKzIyNyw0MiBAQAogLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX0NvbnN0YW50cyBRU1BJIEV4cG9ydGVkIENvbnN0YW50cwogICAqIEB7CiAgICovCisKIC8qKiBAZGVmZ3JvdXAgUVNQSV9FcnJvckNvZGUgUVNQSSBFcnJvciBDb2RlCiAgICogQHsKLSAgKi8gCi0jZGVmaW5lIEhBTF9RU1BJX0VSUk9SX05PTkUgICAgICAgICAgICAweDAwMDAwMDAwVSAvKiE8IE5vIGVycm9yICAgICAgICAgICAqLwotI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9USU1FT1VUICAgICAgICAgMHgwMDAwMDAwMVUgLyohPCBUaW1lb3V0IGVycm9yICAgICAgKi8KLSNkZWZpbmUgSEFMX1FTUElfRVJST1JfVFJBTlNGRVIgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgVHJhbnNmZXIgZXJyb3IgICAgICovCi0jZGVmaW5lIEhBTF9RU1BJX0VSUk9SX0RNQSAgICAgICAgICAgICAweDAwMDAwMDA0VSAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAqLwotI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNICAgMHgwMDAwMDAwOFUgLyohPCBJbnZhbGlkIHBhcmFtZXRlcnMgZXJyb3IgKi8KKyAgKi8KKyNkZWZpbmUgSEFMX1FTUElfRVJST1JfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwVSAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9USU1FT1VUICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9RU1BJX0VSUk9SX1RSQU5TRkVSICAgICAgICAgMHgwMDAwMDAwMlUgLyohPCBUcmFuc2ZlciBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1FTUElfRVJST1JfRE1BICAgICAgICAgICAgICAweDAwMDAwMDA0VSAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICAqLworI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNICAgIDB4MDAwMDAwMDhVIC8qITwgSW52YWxpZCBwYXJhbWV0ZXJzIGVycm9yICovCiAjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICNkZWZpbmUgSEFMX1FTUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAweDAwMDAwMDEwVSAvKiE8IEludmFsaWQgY2FsbGJhY2sgZXJyb3IgICAqLwogI2VuZGlmCiAvKioKICAgKiBAfQotICAqLyAKLSAgCisgICovCisKIC8qKiBAZGVmZ3JvdXAgUVNQSV9TYW1wbGVTaGlmdGluZyBRU1BJIFNhbXBsZSBTaGlmdGluZwogICAqIEB7CiAgICovCi0jZGVmaW5lIFFTUElfU0FNUExFX1NISUZUSU5HX05PTkUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITxObyBjbG9jayBjeWNsZSBzaGlmdCB0byBzYW1wbGUgZGF0YSovCi0jZGVmaW5lIFFTUElfU0FNUExFX1NISUZUSU5HX0hBTEZDWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9TU0hJRlQpIC8qITwxLzIgY2xvY2sgY3ljbGUgc2hpZnQgdG8gc2FtcGxlIGRhdGEqLworI2RlZmluZSBRU1BJX1NBTVBMRV9TSElGVElOR19OT05FICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgLyohPE5vIGNsb2NrIGN5Y2xlIHNoaWZ0IHRvIHNhbXBsZSBkYXRhKi8KKyNkZWZpbmUgUVNQSV9TQU1QTEVfU0hJRlRJTkdfSEFMRkNZQ0xFICgodWludDMyX3QpUVVBRFNQSV9DUl9TU0hJRlQpIC8qITwxLzIgY2xvY2sgY3ljbGUgc2hpZnQgdG8gc2FtcGxlIGRhdGEqLwogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9DaGlwU2VsZWN0SGlnaFRpbWUgUVNQSSBDaGlwIFNlbGVjdCBIaWdoIFRpbWUKKy8qKiBAZGVmZ3JvdXAgUVNQSV9DaGlwU2VsZWN0SGlnaFRpbWUgUVNQSSBDaGlwU2VsZWN0IEhpZ2ggVGltZQogICAqIEB7CiAgICovCi0jZGVmaW5lIFFTUElfQ1NfSElHSF9USU1FXzFfQ1lDTEUgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgMSBjbG9jayBjeWNsZSBiZXR3ZWVuIGNvbW1hbmRzKi8KLSNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfMl9DWUNMRSAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzApICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCAyIGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KLSNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfM19DWUNMRSAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzEpICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCAzIGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KLSNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfNF9DWUNMRSAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzAgfCBRVUFEU1BJX0RDUl9DU0hUXzEpIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA0IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KLSNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfNV9DWUNMRSAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzIpICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA1IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KLSNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfNl9DWUNMRSAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzIgfCBRVUFEU1BJX0RDUl9DU0hUXzApIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA2IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KLSNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfN19DWUNMRSAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzIgfCBRVUFEU1BJX0RDUl9DU0hUXzEpIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA3IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KLSNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfOF9DWUNMRSAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA4IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfMV9DWUNMRSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgMSBjbG9jayBjeWNsZSBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfMl9DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVF8wKSAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgMiBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCisjZGVmaW5lIFFTUElfQ1NfSElHSF9USU1FXzNfQ1lDTEUgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMSkgICAgICAgICAgICAgICAgICAgICAgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDMgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV80X0NZQ0xFICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzAgfCBRVUFEU1BJX0RDUl9DU0hUXzEpIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA0IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfNV9DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVF8yKSAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgNSBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCisjZGVmaW5lIFFTUElfQ1NfSElHSF9USU1FXzZfQ1lDTEUgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMiB8IFFVQURTUElfRENSX0NTSFRfMCkgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDYgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV83X0NZQ0xFICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzIgfCBRVUFEU1BJX0RDUl9DU0hUXzEpIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA3IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfOF9DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVCkgICAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgOCBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjc3LDMxICsyNzAsMzEgQEAKIC8qKiBAZGVmZ3JvdXAgUVNQSV9DbG9ja01vZGUgUVNQSSBDbG9jayBNb2RlCiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9DTE9DS19NT0RFXzAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgIC8qITxDbGsgc3RheXMgbG93IHdoaWxlIG5DUyBpcyByZWxlYXNlZCovCi0jZGVmaW5lIFFTUElfQ0xPQ0tfTU9ERV8zICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ0tNT0RFKSAvKiE8Q2xrIGdvZXMgaGlnaCB3aGlsZSBuQ1MgaXMgcmVsZWFzZWQqLworI2RlZmluZSBRU1BJX0NMT0NLX01PREVfMCAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgIC8qITxDbGsgc3RheXMgbG93IHdoaWxlIG5DUyBpcyByZWxlYXNlZCovCisjZGVmaW5lIFFTUElfQ0xPQ0tfTU9ERV8zICAgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NLTU9ERSkgLyohPENsayBnb2VzIGhpZ2ggd2hpbGUgbkNTIGlzIHJlbGVhc2VkKi8KIC8qKgogICAqIEB9CiAgICovCi0gIAorCiAvKiogQGRlZmdyb3VwIFFTUElfRmxhc2hfU2VsZWN0IFFTUEkgRmxhc2ggU2VsZWN0CiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9GTEFTSF9JRF8xICAgICAgICAgICAweDAwMDAwMDAwVQotI2RlZmluZSBRU1BJX0ZMQVNIX0lEXzIgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9GU0VMKQorI2RlZmluZSBRU1BJX0ZMQVNIX0lEXzEgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITxGTEFTSCAxIHNlbGVjdGVkKi8KKyNkZWZpbmUgUVNQSV9GTEFTSF9JRF8yICAgICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9GU0VMKSAvKiE8RkxBU0ggMiBzZWxlY3RlZCovCiAvKioKICAgKiBAfQotICAqLyAgCisgICovCiAKLSAgLyoqIEBkZWZncm91cCBRU1BJX0R1YWxGbGFzaF9Nb2RlICBRU1BJIER1YWwgRmxhc2ggTW9kZQorICAvKiogQGRlZmdyb3VwIFFTUElfRHVhbEZsYXNoX01vZGUgUVNQSSBEdWFsIEZsYXNoIE1vZGUKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0RVQUxGTEFTSF9FTkFCTEUgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfREZNKQotI2RlZmluZSBRU1BJX0RVQUxGTEFTSF9ESVNBQkxFICAgICAgICAgICAweDAwMDAwMDAwVSAKKyNkZWZpbmUgUVNQSV9EVUFMRkxBU0hfRU5BQkxFICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9ERk0pIC8qITxEdWFsLWZsYXNoIG1vZGUgZW5hYmxlZCovCisjZGVmaW5lIFFTUElfRFVBTEZMQVNIX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8RHVhbC1mbGFzaCBtb2RlIGRpc2FibGVkKi8KIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfQWRkcmVzc1NpemUgUVNQSSBBZGRyZXNzIFNpemUgCisvKiogQGRlZmdyb3VwIFFTUElfQWRkcmVzc1NpemUgUVNQSSBBZGRyZXNzIFNpemUKICAgKiBAewogICAqLwogI2RlZmluZSBRU1BJX0FERFJFU1NfOF9CSVRTICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgLyohPDgtYml0IGFkZHJlc3MqLwpAQCAtMzEwLDcgKzMwMyw3IEBACiAjZGVmaW5lIFFTUElfQUREUkVTU18zMl9CSVRTICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FEU0laRSkgICAvKiE8MzItYml0IGFkZHJlc3MqLwogLyoqCiAgICogQH0KLSAgKi8gIAorICAqLwogCiAvKiogQGRlZmdyb3VwIFFTUElfQWx0ZXJuYXRlQnl0ZXNTaXplIFFTUEkgQWx0ZXJuYXRlIEJ5dGVzIFNpemUKICAgKiBAewpAQCAtMzQzLDEwICszMzYsMTAgQEAKICNkZWZpbmUgUVNQSV9BRERSRVNTXzRfTElORVMgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQURNT0RFKSAgIC8qITxBZGRyZXNzIG9uIGZvdXIgbGluZXMqLwogLyoqCiAgICogQH0KLSAgKi8gIAorICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfQWx0ZXJuYXRlQnl0ZXNNb2RlICBRU1BJIEFsdGVybmF0ZSBCeXRlcyBNb2RlCi0qIEB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyoqIEBkZWZncm91cCBRU1BJX0FsdGVybmF0ZUJ5dGVzTW9kZSBRU1BJIEFsdGVybmF0ZSBCeXRlcyBNb2RlCisqIEB7CiAqLwogI2RlZmluZSBRU1BJX0FMVEVSTkFURV9CWVRFU19OT05FICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgLyohPE5vIGFsdGVybmF0ZSBieXRlcyovCiAjZGVmaW5lIFFTUElfQUxURVJOQVRFX0JZVEVTXzFfTElORSAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FCTU9ERV8wKSAvKiE8QWx0ZXJuYXRlIGJ5dGVzIG9uIGEgc2luZ2xlIGxpbmUqLwpAQCAtMzU0LDcgKzM0Nyw3IEBACiAjZGVmaW5lIFFTUElfQUxURVJOQVRFX0JZVEVTXzRfTElORVMgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FCTU9ERSkgICAvKiE8QWx0ZXJuYXRlIGJ5dGVzIG9uIGZvdXIgbGluZXMqLwogLyoqCiAgICogQH0KLSAgKi8gIAorICAqLwogCiAvKiogQGRlZmdyb3VwIFFTUElfRGF0YU1vZGUgUVNQSSBEYXRhIE1vZGUKICAgKiBAewpAQCAtMzY1LDI3ICszNTgsMjcgQEAKICNkZWZpbmUgUVNQSV9EQVRBXzRfTElORVMgICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfRE1PREUpICAgLyohPERhdGEgb24gZm91ciBsaW5lcyovCiAvKioKICAgKiBAfQotICAqLyAgCisgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9EZHJNb2RlIFFTUEkgRGRyIE1vZGUKKy8qKiBAZGVmZ3JvdXAgUVNQSV9EZHJNb2RlIFFTUEkgRERSIE1vZGUKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0REUl9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgLyohPERvdWJsZSBkYXRhIHJhdGUgbW9kZSBkaXNhYmxlZCovCi0jZGVmaW5lIFFTUElfRERSX01PREVfRU5BQkxFICAgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9ERFJNKSAvKiE8RG91YmxlIGRhdGEgcmF0ZSBtb2RlIGVuYWJsZWQqLworI2RlZmluZSBRU1BJX0REUl9NT0RFX0RJU0FCTEUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8RG91YmxlIGRhdGEgcmF0ZSBtb2RlIGRpc2FibGVkKi8KKyNkZWZpbmUgUVNQSV9ERFJfTU9ERV9FTkFCTEUgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfRERSTSkgLyohPERvdWJsZSBkYXRhIHJhdGUgbW9kZSBlbmFibGVkKi8KIC8qKgogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9EZHJIb2xkSGFsZkN5Y2xlIFFTUEkgRGRyIEhvbGRIYWxmQ3ljbGUKKy8qKiBAZGVmZ3JvdXAgUVNQSV9EZHJIb2xkSGFsZkN5Y2xlIFFTUEkgRERSIERhdGEgT3V0cHV0IERlbGF5CiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9ERFJfSEhDX0FOQUxPR19ERUxBWSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8RGVsYXkgdGhlIGRhdGEgb3V0cHV0IHVzaW5nIGFuYWxvZyBkZWxheSBpbiBERFIgbW9kZSovCi0jZGVmaW5lIFFTUElfRERSX0hIQ19IQUxGX0NMS19ERUxBWSAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfREhIQykgLyohPERlbGF5IHRoZSBkYXRhIG91dHB1dCBieSAxLzIgY2xvY2sgY3ljbGUgaW4gRERSIG1vZGUqLworI2RlZmluZSBRU1BJX0REUl9ISENfQU5BTE9HX0RFTEFZICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8RGVsYXkgdGhlIGRhdGEgb3V0cHV0IHVzaW5nIGFuYWxvZyBkZWxheSBpbiBERFIgbW9kZSovCisjZGVmaW5lIFFTUElfRERSX0hIQ19IQUxGX0NMS19ERUxBWSAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0RISEMpIC8qITxEZWxheSB0aGUgZGF0YSBvdXRwdXQgYnkgb25lIGhhbGYgb2Ygc3lzdGVtIGNsb2NrIGluIEREUiBtb2RlKi8KIC8qKgogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9TSU9PTW9kZSBRU1BJIFNJT08gTW9kZQorLyoqIEBkZWZncm91cCBRU1BJX1NJT09Nb2RlIFFTUEkgU2VuZCBJbnN0cnVjdGlvbiBNb2RlCiAgICogQHsKICAgKi8KICNkZWZpbmUgUVNQSV9TSU9PX0lOU1RfRVZFUllfQ01EICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgLyohPFNlbmQgaW5zdHJ1Y3Rpb24gb24gZXZlcnkgdHJhbnNhY3Rpb24qLwpAQCAtMzk3LDYzICszOTAsNjQgQEAKIC8qKiBAZGVmZ3JvdXAgUVNQSV9NYXRjaE1vZGUgUVNQSSBNYXRjaCBNb2RlCiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9NQVRDSF9NT0RFX0FORCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgLyohPEFORCBtYXRjaCBtb2RlIGJldHdlZW4gdW5tYXNrZWQgYml0cyovCi0jZGVmaW5lIFFTUElfTUFUQ0hfTU9ERV9PUiAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9QTU0pIC8qITxPUiBtYXRjaCBtb2RlIGJldHdlZW4gdW5tYXNrZWQgYml0cyovCisjZGVmaW5lIFFTUElfTUFUQ0hfTU9ERV9BTkQgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8QU5EIG1hdGNoIG1vZGUgYmV0d2VlbiB1bm1hc2tlZCBiaXRzKi8KKyNkZWZpbmUgUVNQSV9NQVRDSF9NT0RFX09SICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9QTU0pIC8qITxPUiBtYXRjaCBtb2RlIGJldHdlZW4gdW5tYXNrZWQgYml0cyovCiAvKioKICAgKiBAfQotICAqLyAgCisgICovCiAKIC8qKiBAZGVmZ3JvdXAgUVNQSV9BdXRvbWF0aWNTdG9wIFFTUEkgQXV0b21hdGljIFN0b3AKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0FVVE9NQVRJQ19TVE9QX0RJU0FCTEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8QXV0b1BvbGxpbmcgc3RvcHMgb25seSB3aXRoIGFib3J0IG9yIFFTUEkgZGlzYWJsaW5nKi8KLSNkZWZpbmUgUVNQSV9BVVRPTUFUSUNfU1RPUF9FTkFCTEUgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfQVBNUykgLyohPEF1dG9Qb2xsaW5nIHN0b3BzIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBtYXRjaCovCi0vKioKLSAgKiBAfQotICAqLyAgCi0KLS8qKiBAZGVmZ3JvdXAgUVNQSV9UaW1lT3V0QWN0aXZhdGlvbiBRU1BJIFRpbWVPdXQgQWN0aXZhdGlvbgotICAqIEB7Ci0gICovCi0jZGVmaW5lIFFTUElfVElNRU9VVF9DT1VOVEVSX0RJU0FCTEUgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITxUaW1lb3V0IGNvdW50ZXIgZGlzYWJsZWQsIG5DUyByZW1haW5zIGFjdGl2ZSovCi0jZGVmaW5lIFFTUElfVElNRU9VVF9DT1VOVEVSX0VOQUJMRSAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NSX1RDRU4pIC8qITxUaW1lb3V0IGNvdW50ZXIgZW5hYmxlZCwgbkNTIHJlbGVhc2VkIHdoZW4gdGltZW91dCBleHBpcmVzKi8KLS8qKgotICAqIEB9Ci0gICovICAKLQotLyoqIEBkZWZncm91cCBRU1BJX0ZsYWdzICBRU1BJIEZsYWdzCi0gICogQHsKLSAgKi8KLSNkZWZpbmUgUVNQSV9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9CVVNZIC8qITxCdXN5IGZsYWc6IG9wZXJhdGlvbiBpcyBvbmdvaW5nKi8KLSNkZWZpbmUgUVNQSV9GTEFHX1RPICAgICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9UT0YgIC8qITxUaW1lb3V0IGZsYWc6IHRpbWVvdXQgb2NjdXJzIGluIG1lbW9yeS1tYXBwZWQgbW9kZSovCi0jZGVmaW5lIFFTUElfRkxBR19TTSAgICAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfU1JfU01GICAvKiE8U3RhdHVzIG1hdGNoIGZsYWc6IHJlY2VpdmVkIGRhdGEgbWF0Y2hlcyBpbiBhdXRvcG9sbGluZyBtb2RlKi8KLSNkZWZpbmUgUVNQSV9GTEFHX0ZUICAgICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9GVEYgIC8qITxGaWZvIHRocmVzaG9sZCBmbGFnOiBGaWZvIHRocmVzaG9sZCByZWFjaGVkIG9yIGRhdGEgbGVmdCBhZnRlciByZWFkIGZyb20gbWVtb3J5IGlzIGNvbXBsZXRlKi8KLSNkZWZpbmUgUVNQSV9GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9UQ0YgIC8qITxUcmFuc2ZlciBjb21wbGV0ZSBmbGFnOiBwcm9ncmFtbWVkIG51bWJlciBvZiBkYXRhIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBvciB0aGUgdHJhbnNmZXIgaGFzIGJlZW4gYWJvcnRlZCovCi0jZGVmaW5lIFFTUElfRkxBR19URSAgICAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfU1JfVEVGICAvKiE8VHJhbnNmZXIgZXJyb3IgZmxhZzogaW52YWxpZCBhZGRyZXNzIGlzIGJlaW5nIGFjY2Vzc2VkKi8KKyNkZWZpbmUgUVNQSV9BVVRPTUFUSUNfU1RPUF9ESVNBQkxFICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8QXV0b1BvbGxpbmcgc3RvcHMgb25seSB3aXRoIGFib3J0IG9yIFFTUEkgZGlzYWJsaW5nKi8KKyNkZWZpbmUgUVNQSV9BVVRPTUFUSUNfU1RPUF9FTkFCTEUgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9BUE1TKSAvKiE8QXV0b1BvbGxpbmcgc3RvcHMgYXMgc29vbiBhcyB0aGVyZSBpcyBhIG1hdGNoKi8KIC8qKgogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9JbnRlcnJ1cHRzICBRU1BJIEludGVycnVwdHMKKy8qKiBAZGVmZ3JvdXAgUVNQSV9UaW1lT3V0QWN0aXZhdGlvbiBRU1BJIFRpbWVvdXQgQWN0aXZhdGlvbgogICAqIEB7Ci0gICovICAKLSNkZWZpbmUgUVNQSV9JVF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9UT0lFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRpbWVvdXQgZmxhZyovCi0jZGVmaW5lIFFTUElfSVRfU00gICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfU01JRSAvKiE8SW50ZXJydXB0IG9uIHRoZSBzdGF0dXMgbWF0Y2ggZmxhZyovCi0jZGVmaW5lIFFTUElfSVRfRlQgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfRlRJRSAvKiE8SW50ZXJydXB0IG9uIHRoZSBmaWZvIHRocmVzaG9sZCBmbGFnKi8KLSNkZWZpbmUgUVNQSV9JVF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9UQ0lFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcqLwotI2RlZmluZSBRU1BJX0lUX1RFICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEU1BJX0NSX1RFSUUgLyohPEludGVycnVwdCBvbiB0aGUgdHJhbnNmZXIgZXJyb3IgZmxhZyovCisgICovCisjZGVmaW5lIFFTUElfVElNRU9VVF9DT1VOVEVSX0RJU0FCTEUgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPFRpbWVvdXQgY291bnRlciBkaXNhYmxlZCwgbkNTIHJlbWFpbnMgYWN0aXZlKi8KKyNkZWZpbmUgUVNQSV9USU1FT1VUX0NPVU5URVJfRU5BQkxFICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9UQ0VOKSAvKiE8VGltZW91dCBjb3VudGVyIGVuYWJsZWQsIG5DUyByZWxlYXNlZCB3aGVuIHRpbWVvdXQgZXhwaXJlcyovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfRmxhZ3MgUVNQSSBGbGFncworICAqIEB7CisgICovCisjZGVmaW5lIFFTUElfRkxBR19CVVNZICAgICAgICAgICAgICAgICBRVUFEU1BJX1NSX0JVU1kgLyohPEJ1c3kgZmxhZzogb3BlcmF0aW9uIGlzIG9uZ29pbmcqLworI2RlZmluZSBRU1BJX0ZMQUdfVE8gICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9UT0YgIC8qITxUaW1lb3V0IGZsYWc6IHRpbWVvdXQgb2NjdXJzIGluIG1lbW9yeS1tYXBwZWQgbW9kZSovCisjZGVmaW5lIFFTUElfRkxBR19TTSAgICAgICAgICAgICAgICAgICBRVUFEU1BJX1NSX1NNRiAgLyohPFN0YXR1cyBtYXRjaCBmbGFnOiByZWNlaXZlZCBkYXRhIG1hdGNoZXMgaW4gYXV0b3BvbGxpbmcgbW9kZSovCisjZGVmaW5lIFFTUElfRkxBR19GVCAgICAgICAgICAgICAgICAgICBRVUFEU1BJX1NSX0ZURiAgLyohPEZpZm8gdGhyZXNob2xkIGZsYWc6IEZpZm8gdGhyZXNob2xkIHJlYWNoZWQgb3IgZGF0YSBsZWZ0IGFmdGVyIHJlYWQgZnJvbSBtZW1vcnkgaXMgY29tcGxldGUqLworI2RlZmluZSBRU1BJX0ZMQUdfVEMgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9TUl9UQ0YgIC8qITxUcmFuc2ZlciBjb21wbGV0ZSBmbGFnOiBwcm9ncmFtbWVkIG51bWJlciBvZiBkYXRhIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCBvciB0aGUgdHJhbnNmZXIgaGFzIGJlZW4gYWJvcnRlZCovCisjZGVmaW5lIFFTUElfRkxBR19URSAgICAgICAgICAgICAgICAgICBRVUFEU1BJX1NSX1RFRiAgLyohPFRyYW5zZmVyIGVycm9yIGZsYWc6IGludmFsaWQgYWRkcmVzcyBpcyBiZWluZyBhY2Nlc3NlZCovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfSW50ZXJydXB0cyBRU1BJIEludGVycnVwdHMKKyAgKiBAeworICAqLworI2RlZmluZSBRU1BJX0lUX1RPICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9UT0lFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRpbWVvdXQgZmxhZyovCisjZGVmaW5lIFFTUElfSVRfU00gICAgICAgICAgICAgICAgICAgICBRVUFEU1BJX0NSX1NNSUUgLyohPEludGVycnVwdCBvbiB0aGUgc3RhdHVzIG1hdGNoIGZsYWcqLworI2RlZmluZSBRU1BJX0lUX0ZUICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9GVElFIC8qITxJbnRlcnJ1cHQgb24gdGhlIGZpZm8gdGhyZXNob2xkIGZsYWcqLworI2RlZmluZSBRU1BJX0lUX1RDICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9UQ0lFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcqLworI2RlZmluZSBRU1BJX0lUX1RFICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9URUlFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRyYW5zZmVyIGVycm9yIGZsYWcqLwogLyoqCiAgICogQH0KICAgKi8KIAogLyoqIEBkZWZncm91cCBRU1BJX1RpbWVvdXRfZGVmaW5pdGlvbiBRU1BJIFRpbWVvdXQgZGVmaW5pdGlvbgorICAqIEBicmllZiBRU1BJIFRpbWVvdXQgZGVmaW5pdGlvbgogICAqIEB7Ci0gICovIAotI2RlZmluZSBIQUxfUVBTSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUgNTAwMFUgLyogNSBzICovCisgICovCisjZGVmaW5lIEhBTF9RU1BJX1RJTUVPVVRfREVGQVVMVF9WQUxVRSA1MDAwVSAvKiA1IHMgKi8KIC8qKgogICAqIEB9Ci0gICovICAKLSAgICAKKyAgKi8KKwogLyoqCiAgICogQH0KICAgKi8KQEAgLTQ2Miw5ICs0NTYsOCBAQAogLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX01hY3JvcyBRU1BJIEV4cG9ydGVkIE1hY3JvcwogICAqIEB7CiAgICovCi0KLS8qKiBAYnJpZWYgUmVzZXQgUVNQSSBoYW5kbGUgc3RhdGUKLSAgKiBAcGFyYW0gIF9fSEFORExFX18gUVNQSSBoYW5kbGUuCisvKiogQGJyaWVmIFJlc2V0IFFTUEkgaGFuZGxlIHN0YXRlLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IFFTUEkgaGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCkBAIC00NzcsMjMgKzQ3MCwyMyBAQAogI2RlZmluZSBfX0hBTF9RU1BJX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgICAgICAgICAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRVNFVCkKICNlbmRpZgogCi0vKiogQGJyaWVmICBFbmFibGUgUVNQSQotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgorLyoqIEBicmllZiAgRW5hYmxlIHRoZSBRU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKLSAgKi8gCisgICovCiAjZGVmaW5lIF9fSEFMX1FTUElfRU5BQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0VOKQogCi0vKiogQGJyaWVmICBEaXNhYmxlIFFTUEkKLSAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIFFTUEkgcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9RU1BJX0RJU0FCTEUoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0VOKQogCi0vKiogQGJyaWVmICBFbmFibGVzIHRoZSBzcGVjaWZpZWQgUVNQSSBpbnRlcnJ1cHQuCi0gICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCi0gICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgUVNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIFFTUEkgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVE86IFFTUEkgVGltZSBvdXQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVE86IFFTUEkgVGltZW91dCBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9TTTogUVNQSSBTdGF0dXMgbWF0Y2ggaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfRlQ6IFFTUEkgRklGTyB0aHJlc2hvbGQgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfVEM6IFFTUEkgVHJhbnNmZXIgY29tcGxldGUgaW50ZXJydXB0CkBAIC01MDMsOSArNDk2LDkgQEAKICNkZWZpbmUgX19IQUxfUVNQSV9FTkFCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0lOVEVSUlVQVF9fKSkKIAogCi0vKiogQGJyaWVmICBEaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFFTUEkgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFFTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBkaXNhYmxlLgorLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIFFTUEkgaW50ZXJydXB0LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RPOiBRU1BJIFRpbWVvdXQgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfU006IFFTUEkgU3RhdHVzIG1hdGNoIGludGVycnVwdApAQCAtNTE2LDM5ICs1MDksMzkgQEAKICAgKi8KICNkZWZpbmUgX19IQUxfUVNQSV9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgKF9fSU5URVJSVVBUX18pKQogCi0vKiogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFFTUEkgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkLgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFFTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KKy8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBRU1BJIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RPOiBRU1BJIFRpbWUgb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RPOiBRU1BJIFRpbWVvdXQgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfU006IFFTUEkgU3RhdHVzIG1hdGNoIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX0ZUOiBRU1BJIEZJRk8gdGhyZXNob2xkIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RDOiBRU1BJIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RFOiBRU1BJIFRyYW5zZmVyIGVycm9yIGludGVycnVwdAogICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChUUlVFIG9yIEZBTFNFKS4KICAgKi8KLSNkZWZpbmUgX19IQUxfUVNQSV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIChSRUFEX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpIAorI2RlZmluZSBfX0hBTF9RU1BJX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKFJFQURfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKIAogLyoqCi0gICogQGJyaWVmICBHZXQgdGhlIHNlbGVjdGVkIFFTUEkncyBmbGFnIHN0YXR1cy4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KLSAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUVNQSSBmbGFnIHRvIGNoZWNrLgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc2VsZWN0ZWQgUVNQSSBmbGFnIGlzIHNldCBvciBub3QuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIDogc3BlY2lmaWVzIHRoZSBRU1BJIGZsYWcgdG8gY2hlY2suCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX0JVU1k6IFFTUEkgQnVzeSBmbGFnCi0gICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19UTzogICBRU1BJIFRpbWUgb3V0IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RPOiAgIFFTUEkgVGltZW91dCBmbGFnCiAgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19TTTogICBRU1BJIFN0YXR1cyBtYXRjaCBmbGFnCiAgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19GVDogICBRU1BJIEZJRk8gdGhyZXNob2xkIGZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RDOiAgIFFTUEkgVHJhbnNmZXIgY29tcGxldGUgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVEU6ICAgUVNQSSBUcmFuc2ZlciBlcnJvciBmbGFnCiAgICogQHJldHZhbCBOb25lCiAgICovCi0jZGVmaW5lIF9fSEFMX1FTUElfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgICAoUkVBRF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+U1IsIChfX0ZMQUdfXykpICE9IDBVKQorI2RlZmluZSBfX0hBTF9RU1BJX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgKChSRUFEX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiwgKF9fRkxBR19fKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCiAKIC8qKiBAYnJpZWYgIENsZWFycyB0aGUgc3BlY2lmaWVkIFFTUEkncyBmbGFnIHN0YXR1cy4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KLSAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUVNQSSBjbGVhciByZWdpc3RlciBmbGFnIHRoYXQgbmVlZHMgdG8gYmUgc2V0CisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIDogc3BlY2lmaWVzIHRoZSBRU1BJIGNsZWFyIHJlZ2lzdGVyIGZsYWcgdGhhdCBuZWVkcyB0byBiZSBzZXQKICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVE86IFFTUEkgVGltZSBvdXQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVE86IFFTUEkgVGltZW91dCBmbGFnCiAgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19TTTogUVNQSSBTdGF0dXMgbWF0Y2ggZmxhZwogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVEM6IFFTUEkgVHJhbnNmZXIgY29tcGxldGUgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVEU6IFFTUEkgVHJhbnNmZXIgZXJyb3IgZmxhZwpAQCAtNTU4LDcgKzU1MSw3IEBACiAvKioKICAgKiBAfQogICAqLwotICAKKwogLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAYWRkdG9ncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9ucwogICAqIEB7CkBAIC01NzgsNyArNTcxLDcgQEAKIAogLyoqIEBhZGR0b2dyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgogICAqIEB7Ci0gICovICAKKyAgKi8KIC8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBRU1BJIElSUSBoYW5kbGVyIG1ldGhvZCAqLwogdm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX0lSUUhhbmRsZXIoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CkBAIC01OTksMTMgKzU5Miw3IEBACiAKIC8qIFFTUEkgbWVtb3J5LW1hcHBlZCBtb2RlICovCiBIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1FTUElfTWVtb3J5TWFwcGVkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCwgUVNQSV9NZW1vcnlNYXBwZWRUeXBlRGVmICpjZmcpOwotLyoqCi0gICogQH0KLSAgKi8KIAotLyoqIEBhZGR0b2dyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMwotICAqIEB7Ci0gICovICAKIC8qIENhbGxiYWNrIGZ1bmN0aW9ucyBpbiBub24tYmxvY2tpbmcgbW9kZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfRXJyb3JDYWxsYmFjayAgICAgICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOwogdm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX0Fib3J0Q3BsdENhbGxiYWNrICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKQEAgLTYzMyw5ICs2MjAsOSBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAYWRkdG9ncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKy8qKiBAYWRkdG9ncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKICAgKiBAewotICAqLyAgCisgICovCiAvKiBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSEFMX1FTUElfU3RhdGVUeXBlRGVmIEhBTF9RU1BJX0dldFN0YXRlICAgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CiB1aW50MzJfdCAgICAgICAgICAgICAgSEFMX1FTUElfR2V0RXJyb3IgICAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKQEAgLTY0NCwxNjQgKzYzMSwxMDggQEAKIHZvaWQgICAgICAgICAgICAgICAgICBIQUxfUVNQSV9TZXRUaW1lb3V0ICAgICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IFRpbWVvdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX1NldEZpZm9UaHJlc2hvbGQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDMyX3QgVGhyZXNob2xkKTsKIHVpbnQzMl90ICAgICAgICAgICAgICBIQUxfUVNQSV9HZXRGaWZvVGhyZXNob2xkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOworSEFMX1N0YXR1c1R5cGVEZWYgICAgIEhBTF9RU1BJX1NldEZsYXNoSUQgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDMyX3QgRmxhc2hJRCk7CiAvKioKICAgKiBAfQogICAqLwogCisvKioKKyAgKiBAfQorICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgUVNQSV9Qcml2YXRlX01hY3JvcyBRU1BJIFByaXZhdGUgTWFjcm9zCiAgICogQHsKICAgKi8KLS8qKiBAZGVmZ3JvdXAgUVNQSV9DbG9ja1ByZXNjYWxlciBRU1BJIENsb2NrIFByZXNjYWxlcgotICAqIEB7Ci0gICovIAotI2RlZmluZSBJU19RU1BJX0NMT0NLX1BSRVNDQUxFUihQUkVTQ0FMRVIpICAoKFBSRVNDQUxFUikgPD0gMHhGRlUpCisjZGVmaW5lIElTX1FTUElfQ0xPQ0tfUFJFU0NBTEVSKFBSRVNDQUxFUikgKChQUkVTQ0FMRVIpIDw9IDB4RkZVKQorCisjZGVmaW5lIElTX1FTUElfRklGT19USFJFU0hPTEQoVEhSKSAgICAgICAgKCgoVEhSKSA+IDBVKSAmJiAoKFRIUikgPD0gMzJVKSkKKworI2RlZmluZSBJU19RU1BJX1NTSElGVChTU0hJRlQpICAgICAgICAgICAgICgoKFNTSElGVCkgPT0gUVNQSV9TQU1QTEVfU0hJRlRJTkdfTk9ORSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNTSElGVCkgPT0gUVNQSV9TQU1QTEVfU0hJRlRJTkdfSEFMRkNZQ0xFKSkKKworI2RlZmluZSBJU19RU1BJX0ZMQVNIX1NJWkUoRlNJWkUpICAgICAgICAgICgoKEZTSVpFKSA8PSAzMVUpKQorCisjZGVmaW5lIElTX1FTUElfQ1NfSElHSF9USU1FKENTSFRJTUUpICAgICAgKCgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfMV9DWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzJfQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV8zX0NZQ0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfNF9DWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzVfQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV82X0NZQ0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfN19DWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzhfQ1lDTEUpKQorCisjZGVmaW5lIElTX1FTUElfQ0xPQ0tfTU9ERShDTEtNT0RFKSAgICAgICAgKCgoQ0xLTU9ERSkgPT0gUVNQSV9DTE9DS19NT0RFXzApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDTEtNT0RFKSA9PSBRU1BJX0NMT0NLX01PREVfMykpCisKKyNkZWZpbmUgSVNfUVNQSV9GTEFTSF9JRChGTEFTSF9JRCkgICAgICAgICAoKChGTEFTSF9JRCkgPT0gUVNQSV9GTEFTSF9JRF8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBU0hfSUQpID09IFFTUElfRkxBU0hfSURfMikpCisKKyNkZWZpbmUgSVNfUVNQSV9EVUFMX0ZMQVNIX01PREUoTU9ERSkgICAgICAoKChNT0RFKSA9PSBRU1BJX0RVQUxGTEFTSF9FTkFCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RVQUxGTEFTSF9ESVNBQkxFKSkKKworI2RlZmluZSBJU19RU1BJX0lOU1RSVUNUSU9OKElOU1RSVUNUSU9OKSAgICgoSU5TVFJVQ1RJT04pIDw9IDB4RkZVKQorCisjZGVmaW5lIElTX1FTUElfQUREUkVTU19TSVpFKEFERFJfU0laRSkgICAgKCgoQUREUl9TSVpFKSA9PSBRU1BJX0FERFJFU1NfOF9CSVRTKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJfU0laRSkgPT0gUVNQSV9BRERSRVNTXzE2X0JJVFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSX1NJWkUpID09IFFTUElfQUREUkVTU18yNF9CSVRTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUl9TSVpFKSA9PSBRU1BJX0FERFJFU1NfMzJfQklUUykpCisKKyNkZWZpbmUgSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfU0laRShTSVpFKSAoKChTSVpFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU184X0JJVFMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMTZfQklUUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzI0X0JJVFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU18zMl9CSVRTKSkKKworI2RlZmluZSBJU19RU1BJX0RVTU1ZX0NZQ0xFUyhEQ1kpICAgICAgICAgICgoRENZKSA8PSAzMVUpCisKKyNkZWZpbmUgSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKE1PREUpICAgICAoKChNT0RFKSA9PSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0lOU1RSVUNUSU9OXzFfTElORSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0lOU1RSVUNUSU9OXzJfTElORVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0lOU1RSVUNUSU9OXzRfTElORVMpKQorCisjZGVmaW5lIElTX1FTUElfQUREUkVTU19NT0RFKE1PREUpICAgICAgICAgKCgoTU9ERSkgPT0gUVNQSV9BRERSRVNTX05PTkUpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfMV9MSU5FKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUREUkVTU18yX0xJTkVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BRERSRVNTXzRfTElORVMpKQorCisjZGVmaW5lIElTX1FTUElfQUxURVJOQVRFX0JZVEVTX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzFfTElORSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU18yX0xJTkVTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfNF9MSU5FUykpCisKKyNkZWZpbmUgSVNfUVNQSV9EQVRBX01PREUoTU9ERSkgICAgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX0RBVEFfTk9ORSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfREFUQV8xX0xJTkUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9EQVRBXzJfTElORVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RBVEFfNF9MSU5FUykpCisKKyNkZWZpbmUgSVNfUVNQSV9ERFJfTU9ERShERFJfTU9ERSkgICAgICAgICAoKChERFJfTU9ERSkgPT0gUVNQSV9ERFJfTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRERSX01PREUpID09IFFTUElfRERSX01PREVfRU5BQkxFKSkKKworI2RlZmluZSBJU19RU1BJX0REUl9ISEMoRERSX0hIQykgICAgICAgICAgICgoKEREUl9ISEMpID09IFFTUElfRERSX0hIQ19BTkFMT0dfREVMQVkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERFJfSEhDKSA9PSBRU1BJX0REUl9ISENfSEFMRl9DTEtfREVMQVkpKQorCisjZGVmaW5lIElTX1FTUElfU0lPT19NT0RFKFNJT09fTU9ERSkgICAgICAgKCgoU0lPT19NT0RFKSA9PSBRU1BJX1NJT09fSU5TVF9FVkVSWV9DTUQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSU9PX01PREUpID09IFFTUElfU0lPT19JTlNUX09OTFlfRklSU1RfQ01EKSkKKworI2RlZmluZSBJU19RU1BJX0lOVEVSVkFMKElOVEVSVkFMKSAgICAgICAgICgoSU5URVJWQUwpIDw9IFFVQURTUElfUElSX0lOVEVSVkFMKQorCisjZGVmaW5lIElTX1FTUElfU1RBVFVTX0JZVEVTX1NJWkUoU0laRSkgICAgKCgoU0laRSkgPj0gMVUpICYmICgoU0laRSkgPD0gNFUpKQorCisjZGVmaW5lIElTX1FTUElfTUFUQ0hfTU9ERShNT0RFKSAgICAgICAgICAgKCgoTU9ERSkgPT0gUVNQSV9NQVRDSF9NT0RFX0FORCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfTUFUQ0hfTU9ERV9PUikpCisKKyNkZWZpbmUgSVNfUVNQSV9BVVRPTUFUSUNfU1RPUChBUE1TKSAgICAgICAoKChBUE1TKSA9PSBRU1BJX0FVVE9NQVRJQ19TVE9QX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBUE1TKSA9PSBRU1BJX0FVVE9NQVRJQ19TVE9QX0VOQUJMRSkpCisKKyNkZWZpbmUgSVNfUVNQSV9USU1FT1VUX0FDVElWQVRJT04oVENFTikgICAoKChUQ0VOKSA9PSBRU1BJX1RJTUVPVVRfQ09VTlRFUl9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVENFTikgPT0gUVNQSV9USU1FT1VUX0NPVU5URVJfRU5BQkxFKSkKKworI2RlZmluZSBJU19RU1BJX1RJTUVPVVRfUEVSSU9EKFBFUklPRCkgICAgICgoUEVSSU9EKSA8PSAweEZGRkZVKQogLyoqCi0gICogQH0KLSAgKi8KLQotLyoqIEBkZWZncm91cCBRU1BJX0ZpZm9UaHJlc2hvbGQgIFFTUEkgRmlmbyBUaHJlc2hvbGQgCi0gICogQHsKLSAgKi8KLSNkZWZpbmUgSVNfUVNQSV9GSUZPX1RIUkVTSE9MRChUSFIpICAgICAgICAgKCgoVEhSKSA+IDBVKSAmJiAoKFRIUikgPD0gMzJVKSkKLS8qKgotICAqIEB9Ci0gICovCi0gIAotI2RlZmluZSBJU19RU1BJX1NTSElGVChTU0hJRlQpICAgICAgICAgICAgICAoKChTU0hJRlQpID09IFFTUElfU0FNUExFX1NISUZUSU5HX05PTkUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1NISUZUKSA9PSBRU1BJX1NBTVBMRV9TSElGVElOR19IQUxGQ1lDTEUpKSAKLQotLyoqIEBkZWZncm91cCBRU1BJX0ZsYXNoU2l6ZSBRU1BJIEZsYXNoIFNpemUKLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX0ZMQVNIX1NJWkUoRlNJWkUpICAgICAgICAgICAoKChGU0laRSkgPD0gMzFVKSkKLS8qKgotICAqIEB9Ci0gICovCi0gIAotI2RlZmluZSBJU19RU1BJX0NTX0hJR0hfVElNRShDU0hUSU1FKSAgICAgICAoKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV8xX0NZQ0xFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzJfQ1lDTEUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfM19DWUNMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV80X0NZQ0xFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzVfQ1lDTEUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfNl9DWUNMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV83X0NZQ0xFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzhfQ1lDTEUpKSAgIAotCi0jZGVmaW5lIElTX1FTUElfQ0xPQ0tfTU9ERShDTEtNT0RFKSAgICAgICAgICgoKENMS01PREUpID09IFFTUElfQ0xPQ0tfTU9ERV8wKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMS01PREUpID09IFFTUElfQ0xPQ0tfTU9ERV8zKSkKLQotI2RlZmluZSBJU19RU1BJX0ZMQVNIX0lEKEZMQSkgICAgKCgoRkxBKSA9PSBRU1BJX0ZMQVNIX0lEXzEpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQSkgPT0gUVNQSV9GTEFTSF9JRF8yKSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIElTX1FTUElfRFVBTF9GTEFTSF9NT0RFKE1PREUpICAgICgoKE1PREUpID09IFFTUElfRFVBTEZMQVNIX0VOQUJMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RVQUxGTEFTSF9ESVNBQkxFKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9JbnN0cnVjdGlvbiBRU1BJIEluc3RydWN0aW9uCi0gICogQHsKLSAgKi8KLSNkZWZpbmUgSVNfUVNQSV9JTlNUUlVDVElPTihJTlNUUlVDVElPTikgICAgKChJTlNUUlVDVElPTikgPD0gMHhGRlUpIAotLyoqCi0gICogQH0KLSAgKi8gCi0KLSNkZWZpbmUgSVNfUVNQSV9BRERSRVNTX1NJWkUoQUREUl9TSVpFKSAgICAgKCgoQUREUl9TSVpFKSA9PSBRU1BJX0FERFJFU1NfOF9CSVRTKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSX1NJWkUpID09IFFTUElfQUREUkVTU18xNl9CSVRTKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJfU0laRSkgPT0gUVNQSV9BRERSRVNTXzI0X0JJVFMpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUl9TSVpFKSA9PSBRU1BJX0FERFJFU1NfMzJfQklUUykpCi0KLSNkZWZpbmUgSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfU0laRShTSVpFKSAgKCgoU0laRSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfOF9CSVRTKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU18xNl9CSVRTKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzI0X0JJVFMpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMzJfQklUUykpCi0KLQotLyoqIEBkZWZncm91cCBRU1BJX0R1bW15Q3ljbGVzIFFTUEkgRHVtbXkgQ3ljbGVzCi0gICogQHsKLSAgKi8KLSNkZWZpbmUgSVNfUVNQSV9EVU1NWV9DWUNMRVMoRENZKSAgICAgICAgICAgKChEQ1kpIDw9IDMxVSkgCi0vKioKLSAgKiBAfQotICAqLwotCi0jZGVmaW5lIElTX1FTUElfSU5TVFJVQ1RJT05fTU9ERShNT0RFKSAgICAgICgoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0lOU1RSVUNUSU9OXzFfTElORSkgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9JTlNUUlVDVElPTl8yX0xJTkVTKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fNF9MSU5FUykpICAKLQotI2RlZmluZSBJU19RU1BJX0FERFJFU1NfTU9ERShNT0RFKSAgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfTk9ORSkgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfMV9MSU5FKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfMl9MSU5FUykgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfNF9MSU5FUykpCi0KLSNkZWZpbmUgSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfTU9ERShNT0RFKSAgKCgoTU9ERSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU18xX0xJTkUpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzJfTElORVMpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfNF9MSU5FUykpCi0KLSNkZWZpbmUgSVNfUVNQSV9EQVRBX01PREUoTU9ERSkgICAgICAgICAgICAgKCgoTU9ERSkgPT0gUVNQSV9EQVRBX05PTkUpICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9EQVRBXzFfTElORSkgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9EQVRBXzJfTElORVMpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9EQVRBXzRfTElORVMpKQotCi0jZGVmaW5lIElTX1FTUElfRERSX01PREUoRERSX01PREUpICAgICAgICAgICgoKEREUl9NT0RFKSA9PSBRU1BJX0REUl9NT0RFX0RJU0FCTEUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRERSX01PREUpID09IFFTUElfRERSX01PREVfRU5BQkxFKSkKLQotI2RlZmluZSBJU19RU1BJX0REUl9ISEMoRERSX0hIQykgICAgICAgICAgICAoKChERFJfSEhDKSA9PSBRU1BJX0REUl9ISENfQU5BTE9HX0RFTEFZKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEREUl9ISEMpID09IFFTUElfRERSX0hIQ19IQUxGX0NMS19ERUxBWSkpCi0KLSNkZWZpbmUgSVNfUVNQSV9TSU9PX01PREUoU0lPT19NT0RFKSAgICAgICgoKFNJT09fTU9ERSkgPT0gUVNQSV9TSU9PX0lOU1RfRVZFUllfQ01EKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJT09fTU9ERSkgPT0gUVNQSV9TSU9PX0lOU1RfT05MWV9GSVJTVF9DTUQpKQotCi0vKiogQGRlZmdyb3VwIFFTUElfSW50ZXJ2YWwgUVNQSSBJbnRlcnZhbCAKLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX0lOVEVSVkFMKElOVEVSVkFMKSAgICAgICAgKChJTlRFUlZBTCkgPD0gUVVBRFNQSV9QSVJfSU5URVJWQUwpIAotLyoqCi0gICogQH0KLSAgKi8KLQotLyoqIEBkZWZncm91cCBRU1BJX1N0YXR1c0J5dGVzU2l6ZSBRU1BJIFN0YXR1cyBCeXRlcyBTaXplCi0gICogQHsKLSAgKi8KLSNkZWZpbmUgSVNfUVNQSV9TVEFUVVNfQllURVNfU0laRShTSVpFKSAgICgoKFNJWkUpID49IDFVKSAmJiAoKFNJWkUpIDw9IDRVKSkgCi0vKioKLSAgKiBAfQotICAqLwotI2RlZmluZSBJU19RU1BJX01BVENIX01PREUoTU9ERSkgICAgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX01BVENIX01PREVfQU5EKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfTUFUQ0hfTU9ERV9PUikpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIElTX1FTUElfQVVUT01BVElDX1NUT1AoQVBNUykgICAgICAgICgoKEFQTVMpID09IFFTUElfQVVUT01BVElDX1NUT1BfRElTQUJMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBUE1TKSA9PSBRU1BJX0FVVE9NQVRJQ19TVE9QX0VOQUJMRSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSNkZWZpbmUgSVNfUVNQSV9USU1FT1VUX0FDVElWQVRJT04oVENFTikgICAgKCgoVENFTikgPT0gUVNQSV9USU1FT1VUX0NPVU5URVJfRElTQUJMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUQ0VOKSA9PSBRU1BJX1RJTUVPVVRfQ09VTlRFUl9FTkFCTEUpKSAKLQotLyoqIEBkZWZncm91cCBRU1BJX1RpbWVPdXRQZXJpb2QgIFFTUEkgVGltZU91dCBQZXJpb2QKLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX1RJTUVPVVRfUEVSSU9EKFBFUklPRCkgICAgICAoKFBFUklPRCkgPD0gMHhGRkZGVSkgCi0vKioKLSAgKiBAfQotICAqLwotCi0jZGVmaW5lIElTX1FTUElfR0VUX0ZMQUcoRkxBRykgICAgICAgICAgICAgICgoKEZMQUcpID09IFFTUElfRkxBR19CVVNZKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFFTUElfRkxBR19UTykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFFTUElfRkxBR19TTSkgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFFTUElfRkxBR19GVCkgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFFTUElfRkxBR19UQykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZMQUcpID09IFFTUElfRkxBR19URSkpICAgIAotCi0jZGVmaW5lIElTX1FTUElfSVQoSVQpICAgICAgICAgICAgICAgICAgICAgICgoKChJVCkgJiAweEZGRTBGRkZGVSkgPT0gMHgwMDAwMDAwMFUpICYmICgoSVQpICE9IDB4MDAwMDAwMDBVKSkKLS8qKgotICAqIEB9Ci0gICovCi0KLS8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGRlZmdyb3VwIFFTUElfUHJpdmF0ZV9GdW5jdGlvbnMgUVNQSSBQcml2YXRlIEZ1bmN0aW9ucwotICAqIEB7Ci0gICovCisqIEB9CisqLworLyogRW5kIG9mIHByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoqCiAgICogQH0KQEAgLTgwOSwyMiArNzQwLDE0IEBACiAKIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogCi0vKioKLSAgKiBAfQotICAqLwotICAKLS8qKgotICAqIEB9Ci0gICovCi0jZW5kaWYgLyogU1RNMzJGNDQ2eHggfHwgU1RNMzJGNDY5eHggfHwgU1RNMzJGNDc5eHggfHwgU1RNMzJGNDEyWnggfHwgU1RNMzJGNDEyVnggfHwgU1RNMzJGNDEyUnggfHwKLSAgICAgICAgICBTVE0zMkY0MTN4eCB8fCBTVE0zMkY0MjN4eCAqLworI2VuZGlmIC8qIGRlZmluZWQoUVVBRFNQSSkgfHwgZGVmaW5lZChRVUFEU1BJMSkgfHwgZGVmaW5lZChRVUFEU1BJMikgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9fU1RNMzJGNHh4X0hBTF9RU1BJX0ggKi8KKyNlbmRpZiAvKiBTVE0zMkY0eHhfSEFMX1FTUElfSCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjR4eF9sbF9mbXBpMmMuaCBiL0luYy9zdG0zMmY0eHhfbGxfZm1waTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3NzlhNAotLS0gL2Rldi9udWxsCisrKyBiL0luYy9zdG0zMmY0eHhfbGxfZm1waTJjLmgKQEAgLTAsMCArMSwyMTkxIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmNHh4X2xsX2ZtcGkyYy5oCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBIZWFkZXIgZmlsZSBvZiBGTVBJMkMgTEwgbW9kdWxlLgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIFNUTTMyRjR4eF9MTF9GTVBJMkNfSAorI2RlZmluZSBTVE0zMkY0eHhfTExfRk1QSTJDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChGTVBJMkNfQ1IxX1BFKQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmY0eHguaCIKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRk1QSTJDMSkKKworLyoqIEBkZWZncm91cCBGTVBJMkNfTEwgRk1QSTJDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9Qcml2YXRlX0NvbnN0YW50cyBGTVBJMkMgUHJpdmF0ZSBDb25zdGFudHMKKyAgKiBAeworICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRk1QSTJDX0xMX1ByaXZhdGVfTWFjcm9zIEZNUEkyQyBQcml2YXRlIE1hY3JvcworICAqIEB7CisgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qVVNFX0ZVTExfTExfRFJJVkVSKi8KKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFVTRV9GVUxMX0xMX0RSSVZFUikKKy8qKiBAZGVmZ3JvdXAgRk1QSTJDX0xMX0VTX0lOSVQgRk1QSTJDIEV4cG9ydGVkIEluaXQgc3RydWN0dXJlCisgICogQHsKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFBlcmlwaGVyYWxNb2RlOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBwZXJpcGhlcmFsIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTVBJMkNfTExfRUNfUEVSSVBIRVJBTF9NT0RFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0ZNUEkyQ19TZXRNb2RlKCkuICovCisKKyAgdWludDMyX3QgVGltaW5nOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIFNEQSBzZXR1cCwgaG9sZCB0aW1lIGFuZCB0aGUgU0NMIGhpZ2gsIGxvdyBwZXJpb2QgdmFsdWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IGJ5IHJlZmVycmluZyB0byB0aGUgU1RNMzJDdWJlTVggVG9vbCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGVscGVyIG1hY3JvIEByZWYgX19MTF9GTVBJMkNfQ09OVkVSVF9USU1JTkdTKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRk1QSTJDX1NldFRpbWluZygpLiAqLworCisgIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcjsgICAgICAgIC8qITwgRW5hYmxlcyBvciBkaXNhYmxlcyBhbmFsb2cgbm9pc2UgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRk1QSTJDX0xMX0VDX0FOQUxPR0ZJTFRFUl9TRUxFQ1RJT04KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9ucyBAcmVmIExMX0ZNUEkyQ19FbmFibGVBbmFsb2dGaWx0ZXIoKSBvciBMTF9GTVBJMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcigpLiAqLworCisgIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXI7ICAgICAgIC8qITwgQ29uZmlndXJlcyB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4MEYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRk1QSTJDX1NldERpZ2l0YWxGaWx0ZXIoKS4gKi8KKworICB1aW50MzJfdCBPd25BZGRyZXNzMTsgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgZGV2aWNlIG93biBhZGRyZXNzIDEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGEgPSAweDAwIGFuZCBNYXhfRGF0YSA9IDB4M0ZGCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0ZNUEkyQ19TZXRPd25BZGRyZXNzMSgpLiAqLworCisgIHVpbnQzMl90IFR5cGVBY2tub3dsZWRnZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBBQ0tub3dsZWRnZSBvciBOb24gQUNLbm93bGVkZ2UgY29uZGl0aW9uIGFmdGVyIHRoZSBhZGRyZXNzIHJlY2VpdmUgbWF0Y2ggY29kZSBvciBuZXh0IHJlY2VpdmVkIGJ5dGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTVBJMkNfTExfRUNfSTJDX0FDS05PV0xFREdFCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgdXNpbmcgdW5pdGFyeSBmdW5jdGlvbiBAcmVmIExMX0ZNUEkyQ19BY2tub3dsZWRnZU5leHREYXRhKCkuICovCisKKyAgdWludDMyX3QgT3duQWRkclNpemU7ICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRldmljZSBvd24gYWRkcmVzcyAxIHNpemUgKDctYml0IG9yIDEwLWJpdCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBGTVBJMkNfTExfRUNfT1dOQUREUkVTUzEKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfRk1QSTJDX1NldE93bkFkZHJlc3MxKCkuICovCit9IExMX0ZNUEkyQ19Jbml0VHlwZURlZjsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLypVU0VfRlVMTF9MTF9EUklWRVIqLworCisvKiBFeHBvcnRlZCBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRXhwb3J0ZWRfQ29uc3RhbnRzIEZNUEkyQyBFeHBvcnRlZCBDb25zdGFudHMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FQ19DTEVBUl9GTEFHIENsZWFyIEZsYWdzIERlZmluZXMKKyAgKiBAYnJpZWYgICAgRmxhZ3MgZGVmaW5lcyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExMX0ZNUEkyQ19Xcml0ZVJlZyBmdW5jdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19JQ1JfQUREUkNGICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JQ1JfQUREUkNGICAgICAgICAgIC8qITwgQWRkcmVzcyBNYXRjaGVkIGZsYWcgICAqLworI2RlZmluZSBMTF9GTVBJMkNfSUNSX05BQ0tDRiAgICAgICAgICAgICAgICAgICBGTVBJMkNfSUNSX05BQ0tDRiAgICAgICAgICAvKiE8IE5vdCBBY2tub3dsZWRnZSBmbGFnICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lDUl9TVE9QQ0YgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lDUl9TVE9QQ0YgICAgICAgICAgLyohPCBTdG9wIGRldGVjdGlvbiBmbGFnICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19JQ1JfQkVSUkNGICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JQ1JfQkVSUkNGICAgICAgICAgIC8qITwgQnVzIGVycm9yIGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfSUNSX0FSTE9DRiAgICAgICAgICAgICAgICAgICBGTVBJMkNfSUNSX0FSTE9DRiAgICAgICAgICAvKiE8IEFyYml0cmF0aW9uIExvc3QgZmxhZyAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lDUl9PVlJDRiAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lDUl9PVlJDRiAgICAgICAgICAgLyohPCBPdmVycnVuL1VuZGVycnVuIGZsYWcgICovCisjZGVmaW5lIExMX0ZNUEkyQ19JQ1JfUEVDQ0YgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JQ1JfUEVDQ0YgICAgICAgICAgIC8qITwgUEVDIGVycm9yIGZsYWcgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfSUNSX1RJTU9VVENGICAgICAgICAgICAgICAgICBGTVBJMkNfSUNSX1RJTU9VVENGICAgICAgICAvKiE8IFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lDUl9BTEVSVENGICAgICAgICAgICAgICAgICAgRk1QSTJDX0lDUl9BTEVSVENGICAgICAgICAgLyohPCBBbGVydCBmbGFnICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FQ19HRVRfRkxBRyBHZXQgRmxhZ3MgRGVmaW5lcworICAqIEBicmllZiAgICBGbGFncyBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRk1QSTJDX1JlYWRSZWcgZnVuY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBMTF9GTVBJMkNfSVNSX1RYRSAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1RYRSAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19JU1JfVFhJUyAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfVFhJUyAgICAgICAgICAgIC8qITwgVHJhbnNtaXQgaW50ZXJydXB0IHN0YXR1cyAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lTUl9SWE5FICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9SWE5FICAgICAgICAgICAgLyohPCBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5ICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfSVNSX0FERFIgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX0FERFIgICAgICAgICAgICAvKiE8IEFkZHJlc3MgbWF0Y2hlZCAoc2xhdmUgbW9kZSkgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19JU1JfTkFDS0YgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfTkFDS0YgICAgICAgICAgIC8qITwgTm90IEFja25vd2xlZGdlIHJlY2VpdmVkIGZsYWcgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lTUl9TVE9QRiAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9TVE9QRiAgICAgICAgICAgLyohPCBTdG9wIGRldGVjdGlvbiBmbGFnICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfSVNSX1RDICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1RDICAgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIENvbXBsZXRlIChtYXN0ZXIgbW9kZSkgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19JU1JfVENSICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfVENSICAgICAgICAgICAgIC8qITwgVHJhbnNmZXIgQ29tcGxldGUgUmVsb2FkICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lTUl9CRVJSICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9CRVJSICAgICAgICAgICAgLyohPCBCdXMgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfSVNSX0FSTE8gICAgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX0FSTE8gICAgICAgICAgICAvKiE8IEFyYml0cmF0aW9uIGxvc3QgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19JU1JfT1ZSICAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfT1ZSICAgICAgICAgICAgIC8qITwgT3ZlcnJ1bi9VbmRlcnJ1biAoc2xhdmUgbW9kZSkgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lTUl9QRUNFUlIgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9QRUNFUlIgICAgICAgICAgLyohPCBQRUMgRXJyb3IgaW4gcmVjZXB0aW9uIChTTUJ1cyBtb2RlKSAqLworI2RlZmluZSBMTF9GTVBJMkNfSVNSX1RJTUVPVVQgICAgICAgICAgICAgICAgICBGTVBJMkNfSVNSX1RJTUVPVVQgICAgICAgICAvKiE8IFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcgKFNNQnVzIG1vZGUpICovCisjZGVmaW5lIExMX0ZNUEkyQ19JU1JfQUxFUlQgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfQUxFUlQgICAgICAgICAgIC8qITwgU01CdXMgYWxlcnQgKFNNQnVzIG1vZGUpICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0lTUl9CVVNZICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0lTUl9CVVNZICAgICAgICAgICAgLyohPCBCdXMgYnVzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfSVQgSVQgRGVmaW5lcworICAqIEBicmllZiAgICBJVCBkZWZpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTExfRk1QSTJDX1JlYWRSZWcgYW5kICBMTF9GTVBJMkNfV3JpdGVSZWcgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0NSMV9UWElFICAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0NSMV9UWElFICAgICAgICAgICAgLyohPCBUWCBJbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19DUjFfUlhJRSAgICAgICAgICAgICAgICAgICAgIEZNUEkyQ19DUjFfUlhJRSAgICAgICAgICAgIC8qITwgUlggSW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfQ1IxX0FERFJJRSAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IxX0FERFJJRSAgICAgICAgICAvKiE8IEFkZHJlc3MgbWF0Y2ggSW50ZXJydXB0IGVuYWJsZSAoc2xhdmUgb25seSkgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0NSMV9OQUNLSUUgICAgICAgICAgICAgICAgICAgRk1QSTJDX0NSMV9OQUNLSUUgICAgICAgICAgLyohPCBOb3QgYWNrbm93bGVkZ2UgcmVjZWl2ZWQgSW50ZXJydXB0IGVuYWJsZSAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19DUjFfU1RPUElFICAgICAgICAgICAgICAgICAgIEZNUEkyQ19DUjFfU1RPUElFICAgICAgICAgIC8qITwgU1RPUCBkZXRlY3Rpb24gSW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfQ1IxX1RDSUUgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IxX1RDSUUgICAgICAgICAgICAvKiE8IFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdCBlbmFibGUgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0NSMV9FUlJJRSAgICAgICAgICAgICAgICAgICAgRk1QSTJDX0NSMV9FUlJJRSAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHRzIGVuYWJsZSAgICAgICAgICAgICAgICAgICAgICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FQ19QRVJJUEhFUkFMX01PREUgUGVyaXBoZXJhbCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX01PREVfSTJDICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBGTVBJMkMgTWFzdGVyIG9yIFNsYXZlIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfTU9ERV9TTUJVU19IT1NUICAgICAgICAgICAgIEZNUEkyQ19DUjFfU01CSEVOICAgICAgICAgICAvKiE8IFNNQnVzIEhvc3QgYWRkcmVzcyBhY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19NT0RFX1NNQlVTX0RFVklDRSAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgU01CdXMgRGV2aWNlIGRlZmF1bHQgbW9kZSAoRGVmYXVsdCBhZGRyZXNzIG5vdCBhY2tub3dsZWRnZSkgKi8KKyNkZWZpbmUgTExfRk1QSTJDX01PREVfU01CVVNfREVWSUNFX0FSUCAgICAgICBGTVBJMkNfQ1IxX1NNQkRFTiAgICAgICAgICAgLyohPCBTTUJ1cyBEZXZpY2UgRGVmYXVsdCBhZGRyZXNzIGFja25vd2xlZGdlICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfQU5BTE9HRklMVEVSX1NFTEVDVElPTiBBbmFsb2cgRmlsdGVyIFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgQW5hbG9nIGZpbHRlciBpcyBlbmFibGVkLiAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFICAgICAgICAgRk1QSTJDX0NSMV9BTkZPRkYgICAgICAgICAgLyohPCBBbmFsb2cgZmlsdGVyIGlzIGRpc2FibGVkLiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfQUREUkVTU0lOR19NT0RFIE1hc3RlciBBZGRyZXNzaW5nIE1vZGUKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9GTVBJMkNfQUREUkVTU0lOR19NT0RFXzdCSVQgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgb3BlcmF0ZXMgaW4gNy1iaXQgYWRkcmVzc2luZyBtb2RlLiAqLworI2RlZmluZSBMTF9GTVBJMkNfQUREUkVTU0lOR19NT0RFXzEwQklUICAgICAgICBGTVBJMkNfQ1IyX0FERDEwICAgICAgICAgICAgLyohPCBNYXN0ZXIgb3BlcmF0ZXMgaW4gMTAtYml0IGFkZHJlc3NpbmcgbW9kZS4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfT1dOQUREUkVTUzEgT3duIEFkZHJlc3MgMSBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9GTVBJMkNfT1dOQUREUkVTUzFfN0JJVCAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IE93biBhZGRyZXNzIDEgaXMgYSA3LWJpdCBhZGRyZXNzLiAqLworI2RlZmluZSBMTF9GTVBJMkNfT1dOQUREUkVTUzFfMTBCSVQgICAgICAgICAgICBGTVBJMkNfT0FSMV9PQTFNT0RFICAgICAgICAvKiE8IE93biBhZGRyZXNzIDEgaXMgYSAxMC1iaXQgYWRkcmVzcy4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfT1dOQUREUkVTUzIgT3duIEFkZHJlc3MgMiBNYXNrcworICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19PV05BRERSRVNTMl9OT01BU0sgICAgICAgICAgIEZNUEkyQ19PQVIyX09BMk5PTUFTSyAgICAgIC8qITwgT3duIEFkZHJlc3MyIE5vIG1hc2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfT1dOQUREUkVTUzJfTUFTSzAxICAgICAgICAgICBGTVBJMkNfT0FSMl9PQTJNQVNLMDEgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjJdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX09XTkFERFJFU1MyX01BU0swMiAgICAgICAgICAgRk1QSTJDX09BUjJfT0EyTUFTSzAyICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzozXSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19PV05BRERSRVNTMl9NQVNLMDMgICAgICAgICAgIEZNUEkyQ19PQVIyX09BMk1BU0swMyAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzc6NF0gYXJlIGNvbXBhcmVkLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfT1dOQUREUkVTUzJfTUFTSzA0ICAgICAgICAgICBGTVBJMkNfT0FSMl9PQTJNQVNLMDQgICAgICAvKiE8IE9ubHkgQWRkcmVzczIgYml0c1s3OjVdIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX09XTkFERFJFU1MyX01BU0swNSAgICAgICAgICAgRk1QSTJDX09BUjJfT0EyTUFTSzA1ICAgICAgLyohPCBPbmx5IEFkZHJlc3MyIGJpdHNbNzo2XSBhcmUgY29tcGFyZWQuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19PV05BRERSRVNTMl9NQVNLMDYgICAgICAgICAgIEZNUEkyQ19PQVIyX09BMk1BU0swNiAgICAgIC8qITwgT25seSBBZGRyZXNzMiBiaXRzWzddIGFyZSBjb21wYXJlZC4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfT1dOQUREUkVTUzJfTUFTSzA3ICAgICAgICAgICBGTVBJMkNfT0FSMl9PQTJNQVNLMDcgICAgICAvKiE8IE5vIGNvbXBhcmlzb24gaXMgZG9uZS4gQWxsIEFkZHJlc3MyIGFyZSBhY2tub3dsZWRnZWQuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QSTJDX0xMX0VDX0kyQ19BQ0tOT1dMRURHRSBBY2tub3dsZWRnZSBHZW5lcmF0aW9uCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITwgQUNLIGlzIHNlbnQgYWZ0ZXIgY3VycmVudCByZWNlaXZlZCBieXRlLiAqLworI2RlZmluZSBMTF9GTVBJMkNfTkFDSyAgICAgICAgICAgICAgICAgICAgICAgICBGTVBJMkNfQ1IyX05BQ0sgICAgICAgICAgICAgLyohPCBOQUNLIGlzIHNlbnQgYWZ0ZXIgY3VycmVudCByZWNlaXZlZCBieXRlLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FQ19BRERSU0xBVkUgU2xhdmUgQWRkcmVzcyBMZW5ndGgKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9GTVBJMkNfQUREUlNMQVZFXzdCSVQgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBTbGF2ZSBBZGRyZXNzIGluIDctYml0LiAqLworI2RlZmluZSBMTF9GTVBJMkNfQUREUlNMQVZFXzEwQklUICAgICAgICAgICAgICBGTVBJMkNfQ1IyX0FERDEwICAgICAgICAgICAgLyohPCBTbGF2ZSBBZGRyZXNzIGluIDEwLWJpdC4qLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfUkVRVUVTVCBUcmFuc2ZlciBSZXF1ZXN0IERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19SRVFVRVNUX1dSSVRFICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IE1hc3RlciByZXF1ZXN0IGEgd3JpdGUgdHJhbnNmZXIuICovCisjZGVmaW5lIExMX0ZNUEkyQ19SRVFVRVNUX1JFQUQgICAgICAgICAgICAgICAgIEZNUEkyQ19DUjJfUkRfV1JOICAgICAgICAgICAvKiE8IE1hc3RlciByZXF1ZXN0IGEgcmVhZCB0cmFuc2Zlci4gICovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FQ19NT0RFIFRyYW5zZmVyIEVuZCBNb2RlCisgICogQHsKKyAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX01PREVfUkVMT0FEICAgICAgICAgICAgICAgICAgRk1QSTJDX0NSMl9SRUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIEZNUEkyQyBSZWxvYWQgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19NT0RFX0FVVE9FTkQgICAgICAgICAgICAgICAgIEZNUEkyQ19DUjJfQVVUT0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBGTVBJMkMgQXV0b21hdGljIGVuZCBtb2RlIHdpdGggbm8gSFcgUEVDIGNvbXBhcmlzb24uICAqLworI2RlZmluZSBMTF9GTVBJMkNfTU9ERV9TT0ZURU5EICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgRk1QSTJDIFNvZnR3YXJlIGVuZCBtb2RlIHdpdGggbm8gSFcgUEVDIGNvbXBhcmlzb24uICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX01PREVfU01CVVNfUkVMT0FEICAgICAgICAgICAgTExfRk1QSTJDX01PREVfUkVMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIFNNQlVTIEF1dG9tYXRpYyBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19NT0RFX1NNQlVTX0FVVE9FTkRfTk9fUEVDICAgIExMX0ZNUEkyQ19NT0RFX0FVVE9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEVuYWJsZSBTTUJVUyBBdXRvbWF0aWMgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAqLworI2RlZmluZSBMTF9GTVBJMkNfTU9ERV9TTUJVU19TT0ZURU5EX05PX1BFQyAgICBMTF9GTVBJMkNfTU9ERV9TT0ZURU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBFbmFibGUgU01CVVMgU29mdHdhcmUgZW5kIG1vZGUgd2l0aCBIVyBQRUMgY29tcGFyaXNvbi4gICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX01PREVfU01CVVNfQVVUT0VORF9XSVRIX1BFQyAgKHVpbnQzMl90KShMTF9GTVBJMkNfTU9ERV9BVVRPRU5EIHwgRk1QSTJDX0NSMl9QRUNCWVRFKSAgIC8qITwgRW5hYmxlIFNNQlVTIEF1dG9tYXRpYyBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19NT0RFX1NNQlVTX1NPRlRFTkRfV0lUSF9QRUMgICh1aW50MzJfdCkoTExfRk1QSTJDX01PREVfU09GVEVORCB8IEZNUEkyQ19DUjJfUEVDQllURSkgICAvKiE8IEVuYWJsZSBTTUJVUyBTb2Z0d2FyZSBlbmQgbW9kZSB3aXRoIEhXIFBFQyBjb21wYXJpc29uLiAgICAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfR0VORVJBVEUgU3RhcnQgQW5kIFN0b3AgR2VuZXJhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19HRU5FUkFURV9OT1NUQVJUU1RPUCAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRG9uJ3QgR2VuZXJhdGUgU3RvcCBhbmQgU3RhcnQgY29uZGl0aW9uLiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfR0VORVJBVEVfU1RPUCAgICAgICAgICAgICAgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgRk1QSTJDX0NSMl9TVE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFN0b3AgY29uZGl0aW9uIChTaXplIHNob3VsZCBiZSBzZXQgdG8gMCkuICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0dFTkVSQVRFX1NUQVJUX1JFQUQgICAgICAgICAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEZNUEkyQ19DUjJfU1RBUlQgfCBGTVBJMkNfQ1IyX1JEX1dSTikgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBTdGFydCBmb3IgcmVhZCByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19HRU5FUkFURV9TVEFSVF9XUklURSAgICAgICAgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBGTVBJMkNfQ1IyX1NUQVJUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2VuZXJhdGUgU3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfR0VORVJBVEVfUkVTVEFSVF83QklUX1JFQUQgICAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgRk1QSTJDX0NSMl9TVEFSVCB8IEZNUEkyQ19DUjJfUkRfV1JOKSAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFJlc3RhcnQgZm9yIHJlYWQgcmVxdWVzdCwgc2xhdmUgN0JpdCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX0dFTkVSQVRFX1JFU1RBUlRfN0JJVF9XUklURSAgKHVpbnQzMl90KSgweDgwMDAwMDAwVSB8IEZNUEkyQ19DUjJfU1RBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmF0ZSBSZXN0YXJ0IGZvciB3cml0ZSByZXF1ZXN0LCBzbGF2ZSA3Qml0IGFkZHJlc3MuICovCisjZGVmaW5lIExMX0ZNUEkyQ19HRU5FUkFURV9SRVNUQVJUXzEwQklUX1JFQUQgICh1aW50MzJfdCkoMHg4MDAwMDAwMFUgfCBGTVBJMkNfQ1IyX1NUQVJUIHwgRk1QSTJDX0NSMl9SRF9XUk4gfCBGTVBJMkNfQ1IyX0hFQUQxMFIpIC8qITwgR2VuZXJhdGUgUmVzdGFydCBmb3IgcmVhZCByZXF1ZXN0LCBzbGF2ZSAxMEJpdCBhZGRyZXNzLiAqLworI2RlZmluZSBMTF9GTVBJMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9XUklURSAodWludDMyX3QpKDB4ODAwMDAwMDBVIHwgRk1QSTJDX0NSMl9TVEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYXRlIFJlc3RhcnQgZm9yIHdyaXRlIHJlcXVlc3QsIHNsYXZlIDEwQml0IGFkZHJlc3MuKi8KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QSTJDX0xMX0VDX0RJUkVDVElPTiBSZWFkIFdyaXRlIERpcmVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19ESVJFQ1RJT05fV1JJVEUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAvKiE8IFdyaXRlIHRyYW5zZmVyIHJlcXVlc3QgYnkgbWFzdGVyLCBzbGF2ZSBlbnRlcnMgcmVjZWl2ZXIgbW9kZS4gICovCisjZGVmaW5lIExMX0ZNUEkyQ19ESVJFQ1RJT05fUkVBRCAgICAgICAgICAgICAgIEZNUEkyQ19JU1JfRElSICAgICAgICAgICAgICAvKiE8IFJlYWQgdHJhbnNmZXIgcmVxdWVzdCBieSBtYXN0ZXIsIHNsYXZlIGVudGVycyB0cmFuc21pdHRlciBtb2RlLiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FQ19ETUFfUkVHX0RBVEEgRE1BIFJlZ2lzdGVyIERhdGEKKyAgKiBAeworICAqLworI2RlZmluZSBMTF9GTVBJMkNfRE1BX1JFR19EQVRBX1RSQU5TTUlUICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBMTF9GTVBJMkNfRE1BX1JFR19EQVRBX1JFQ0VJVkUgICAgICAgICAweDAwMDAwMDAxVSAgICAgICAgICAgICAgLyohPCBHZXQgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yIHJlY2VwdGlvbiAqLworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUNfU01CVVNfVElNRU9VVEFfTU9ERSBTTUJ1cyBUaW1lb3V0QSBNb2RlIFNDTCBTREEgVGltZW91dAorICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NDTF9MT1cgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IFRpbWVvdXRBIGlzIHVzZWQgdG8gZGV0ZWN0IFNDTCBsb3cgbGV2ZWwgdGltZW91dC4gICAgICAgICAgICAgICovCisjZGVmaW5lIExMX0ZNUEkyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NEQV9TQ0xfSElHSCBGTVBJMkNfVElNRU9VVFJfVElETEUgICAvKiE8IFRpbWVvdXRBIGlzIHVzZWQgdG8gZGV0ZWN0IGJvdGggU0NMIGFuZCBTREEgaGlnaCBsZXZlbCB0aW1lb3V0LiovCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FQ19TTUJVU19USU1FT1VUX1NFTEVDVElPTiBTTUJ1cyBUaW1lb3V0IFNlbGVjdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19TTUJVU19USU1FT1VUQSAgICAgICAgICAgICAgIEZNUEkyQ19USU1FT1VUUl9USU1PVVRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lb3V0QSBlbmFibGUgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMTF9GTVBJMkNfU01CVVNfVElNRU9VVEIgICAgICAgICAgICAgICBGTVBJMkNfVElNRU9VVFJfVEVYVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGltZW91dEIgKGV4dGVuZGVkIGNsb2NrKSBlbmFibGUgYml0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX1NNQlVTX0FMTF9USU1FT1VUICAgICAgICAgICAgKHVpbnQzMl90KShGTVBJMkNfVElNRU9VVFJfVElNT1VURU4gfCBGTVBJMkNfVElNRU9VVFJfVEVYVEVOKSAvKiE8IFRpbWVvdXRBIGFuZCBUaW1lb3V0QiAoZXh0ZW5kZWQgY2xvY2spIGVuYWJsZSBiaXRzICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRXhwb3J0ZWRfTWFjcm9zIEZNUEkyQyBFeHBvcnRlZCBNYWNyb3MKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FTV9XUklURV9SRUFEIENvbW1vbiBXcml0ZSBhbmQgcmVhZCByZWdpc3RlcnMgTWFjcm9zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBXcml0ZSBhIHZhbHVlIGluIEZNUEkyQyByZWdpc3RlcgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIEZNUEkyQyBJbnN0YW5jZQorICAqIEBwYXJhbSAgX19SRUdfXyBSZWdpc3RlciB0byBiZSB3cml0dGVuCisgICogQHBhcmFtICBfX1ZBTFVFX18gVmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgcmVnaXN0ZXIKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgTExfRk1QSTJDX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKworLyoqCisgICogQGJyaWVmICBSZWFkIGEgdmFsdWUgaW4gRk1QSTJDIHJlZ2lzdGVyCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gRk1QSTJDIEluc3RhbmNlCisgICogQHBhcmFtICBfX1JFR19fIFJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAgKiBAcmV0dmFsIFJlZ2lzdGVyIHZhbHVlCisgICovCisjZGVmaW5lIExMX0ZNUEkyQ19SZWFkUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXykgUkVBRF9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRU1fQ09OVkVSVF9USU1JTkdTIENvbnZlcnQgU0RBIFNDTCB0aW1pbmdzCisgICogQHsKKyAgKi8KKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTREEgc2V0dXAsIGhvbGQgdGltZSBhbmQgdGhlIFNDTCBoaWdoLCBsb3cgcGVyaW9kLgorICAqIEBwYXJhbSAgX19QUkVTQ0FMRVJfXyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGLgorICAqIEBwYXJhbSAgX19EQVRBX1NFVFVQX1RJTUVfXyBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEYuICh0c2NsZGVsID0gKFNDTERFTCsxKXh0cHJlc2MpCisgICogQHBhcmFtICBfX0RBVEFfSE9MRF9USU1FX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGLiAodHNkYWRlbCA9IFNEQURFTHh0cHJlc2MpCisgICogQHBhcmFtICBfX0NMT0NLX0hJR0hfUEVSSU9EX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRi4gKHRzY2xoID0gKFNDTEgrMSl4dHByZXNjKQorICAqIEBwYXJhbSAgX19DTE9DS19MT1dfUEVSSU9EX18gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkYuICh0c2NsbCA9IChTQ0xMKzEpeHRwcmVzYykKKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkZGRkZGRgorICAqLworI2RlZmluZSBfX0xMX0ZNUEkyQ19DT05WRVJUX1RJTUlOR1MoX19QUkVTQ0FMRVJfXywgX19EQVRBX1NFVFVQX1RJTUVfXywgX19EQVRBX0hPTERfVElNRV9fLCBfX0NMT0NLX0hJR0hfUEVSSU9EX18sIF9fQ0xPQ0tfTE9XX1BFUklPRF9fKSAgIFwKKyAgICAgICAgKCgoKHVpbnQzMl90KShfX1BSRVNDQUxFUl9fKSAgICAgICAgIDw8IEZNUEkyQ19USU1JTkdSX1BSRVNDX1BvcykgICYgRk1QSTJDX1RJTUlOR1JfUFJFU0MpICAgfCBcCisgICAgICAgICAoKCh1aW50MzJfdCkoX19EQVRBX1NFVFVQX1RJTUVfXykgICA8PCBGTVBJMkNfVElNSU5HUl9TQ0xERUxfUG9zKSAmIEZNUEkyQ19USU1JTkdSX1NDTERFTCkgIHwgXAorICAgICAgICAgKCgodWludDMyX3QpKF9fREFUQV9IT0xEX1RJTUVfXykgICAgPDwgRk1QSTJDX1RJTUlOR1JfU0RBREVMX1BvcykgJiBGTVBJMkNfVElNSU5HUl9TREFERUwpICB8IFwKKyAgICAgICAgICgoKHVpbnQzMl90KShfX0NMT0NLX0hJR0hfUEVSSU9EX18pIDw8IEZNUEkyQ19USU1JTkdSX1NDTEhfUG9zKSAgICYgRk1QSTJDX1RJTUlOR1JfU0NMSCkgICAgfCBcCisgICAgICAgICAoKCh1aW50MzJfdCkoX19DTE9DS19MT1dfUEVSSU9EX18pICA8PCBGTVBJMkNfVElNSU5HUl9TQ0xMX1BvcykgICAmIEZNUEkyQ19USU1JTkdSX1NDTEwpKQorLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAZGVmZ3JvdXAgRk1QSTJDX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucyBGTVBJMkMgRXhwb3J0ZWQgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUZfQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRk1QSTJDIHBlcmlwaGVyYWwgKFBFID0gMSkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgUEUgICAgICAgICAgICBMTF9GTVBJMkNfRW5hYmxlCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1BFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEZNUEkyQyBwZXJpcGhlcmFsIChQRSA9IDApLgorICAqIEBub3RlICAgV2hlbiBQRSA9IDAsIHRoZSBGTVBJMkMgU0NMIGFuZCBTREEgbGluZXMgYXJlIHJlbGVhc2VkLgorICAqICAgICAgICAgSW50ZXJuYWwgc3RhdGUgbWFjaGluZXMgYW5kIHN0YXR1cyBiaXRzIGFyZSBwdXQgYmFjayB0byB0aGVpciByZXNldCB2YWx1ZS4KKyAgKiAgICAgICAgIFdoZW4gY2xlYXJlZCwgUEUgbXVzdCBiZSBrZXB0IGxvdyBmb3IgYXQgbGVhc3QgMyBBUEIgY2xvY2sgY3ljbGVzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFICAgICAgICAgICAgTExfRk1QSTJDX0Rpc2FibGUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfUEUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBGTVBJMkMgcGVyaXBoZXJhbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFICAgICAgICAgICAgTExfRk1QSTJDX0lzRW5hYmxlZAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1BFKSA9PSAoRk1QSTJDX0NSMV9QRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgTm9pc2UgRmlsdGVycyAoQW5hbG9nIGFuZCBEaWdpdGFsKS4KKyAgKiBAbm90ZSAgIElmIHRoZSBhbmFsb2cgZmlsdGVyIGlzIGFsc28gZW5hYmxlZCwgdGhlIGRpZ2l0YWwgZmlsdGVyIGlzIGFkZGVkIHRvIGFuYWxvZyBmaWx0ZXIuCisgICogICAgICAgICBUaGUgZmlsdGVycyBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEZNUEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBBTkZPRkYgICAgICAgIExMX0ZNUEkyQ19Db25maWdGaWx0ZXJzXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBETkYgICAgICAgICAgIExMX0ZNUEkyQ19Db25maWdGaWx0ZXJzCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIEFuYWxvZ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX0FOQUxPR0ZJTFRFUl9ESVNBQkxFCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgKERpZ2l0YWwgZmlsdGVyIGRpc2FibGVkKSBhbmQgTWF4X0RhdGE9MHgwRiAoRGlnaXRhbCBmaWx0ZXIgZW5hYmxlZCBhbmQgZmlsdGVyaW5nIGNhcGFiaWxpdHkgdXAgdG8gMTUqdGZtcGkyY2NsaykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIgb24gU0RBIGFuZCBTQ0wgaW5wdXQuCisgICogICAgICAgICBUaGUgZGlnaXRhbCBmaWx0ZXIgd2lsbCBmaWx0ZXIgc3Bpa2VzIHdpdGggYSBsZW5ndGggb2YgdXAgdG8gRE5GWzM6MF0qdGZtcGkyY2Nsay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19Db25maWdGaWx0ZXJzKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4LCB1aW50MzJfdCBBbmFsb2dGaWx0ZXIsIHVpbnQzMl90IERpZ2l0YWxGaWx0ZXIpCit7CisgIE1PRElGWV9SRUcoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX0FORk9GRiB8IEZNUEkyQ19DUjFfRE5GLCBBbmFsb2dGaWx0ZXIgfCAoRGlnaXRhbEZpbHRlciA8PCBGTVBJMkNfQ1IxX0RORl9Qb3MpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgRGlnaXRhbCBOb2lzZSBGaWx0ZXIuCisgICogQG5vdGUgICBJZiB0aGUgYW5hbG9nIGZpbHRlciBpcyBhbHNvIGVuYWJsZWQsIHRoZSBkaWdpdGFsIGZpbHRlciBpcyBhZGRlZCB0byBhbmFsb2cgZmlsdGVyLgorICAqICAgICAgICAgVGhpcyBmaWx0ZXIgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBGTVBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRE5GICAgICAgICAgICBMTF9GTVBJMkNfU2V0RGlnaXRhbEZpbHRlcgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgKERpZ2l0YWwgZmlsdGVyIGRpc2FibGVkKSBhbmQgTWF4X0RhdGE9MHgwRiAoRGlnaXRhbCBmaWx0ZXIgZW5hYmxlZCBhbmQgZmlsdGVyaW5nIGNhcGFiaWxpdHkgdXAgdG8gMTUqdGZtcGkyY2NsaykuCisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGlnaXRhbCBub2lzZSBmaWx0ZXIgb24gU0RBIGFuZCBTQ0wgaW5wdXQuCisgICogICAgICAgICBUaGUgZGlnaXRhbCBmaWx0ZXIgd2lsbCBmaWx0ZXIgc3Bpa2VzIHdpdGggYSBsZW5ndGggb2YgdXAgdG8gRE5GWzM6MF0qdGZtcGkyY2Nsay4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19TZXREaWdpdGFsRmlsdGVyKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4LCB1aW50MzJfdCBEaWdpdGFsRmlsdGVyKQoreworICBNT0RJRllfUkVHKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9ETkYsIERpZ2l0YWxGaWx0ZXIgPDwgRk1QSTJDX0NSMV9ETkZfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIGN1cnJlbnQgRGlnaXRhbCBOb2lzZSBGaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBETkYgICAgICAgICAgIExMX0ZNUEkyQ19HZXREaWdpdGFsRmlsdGVyCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0RGlnaXRhbEZpbHRlcihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX0RORikgPj4gRk1QSTJDX0NSMV9ETkZfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQW5hbG9nIE5vaXNlIEZpbHRlci4KKyAgKiBAbm90ZSAgIFRoaXMgZmlsdGVyIGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgRk1QSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFORk9GRiAgICAgICAgTExfRk1QSTJDX0VuYWJsZUFuYWxvZ0ZpbHRlcgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlQW5hbG9nRmlsdGVyKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBDTEVBUl9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX0FORk9GRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBBbmFsb2cgTm9pc2UgRmlsdGVyLgorICAqIEBub3RlICAgVGhpcyBmaWx0ZXIgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBGTVBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQU5GT0ZGICAgICAgICBMTF9GTVBJMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRGlzYWJsZUFuYWxvZ0ZpbHRlcihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfQU5GT0ZGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBBbmFsb2cgTm9pc2UgRmlsdGVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQU5GT0ZGICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkQW5hbG9nRmlsdGVyCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfSXNFbmFibGVkQW5hbG9nRmlsdGVyKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfQU5GT0ZGKSAhPSAoRk1QSTJDX0NSMV9BTkZPRkYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIERNQSB0cmFuc21pc3Npb24gcmVxdWVzdHMuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9GTVBJMkNfRW5hYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGVETUFSZXFfVFgoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1RYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgRE1BIHRyYW5zbWlzc2lvbiByZXF1ZXN0cy4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWERNQUVOICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlRE1BUmVxX1RYCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19EaXNhYmxlRE1BUmVxX1RYKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBDTEVBUl9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1RYRE1BRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIERNQSB0cmFuc21pc3Npb24gcmVxdWVzdHMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhETUFFTiAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkRE1BUmVxX1RYCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfSXNFbmFibGVkRE1BUmVxX1RYKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfVFhETUFFTikgPT0gKEZNUEkyQ19DUjFfVFhETUFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRE1BIHJlY2VwdGlvbiByZXF1ZXN0cy4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWERNQUVOICAgICAgIExMX0ZNUEkyQ19FbmFibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0VuYWJsZURNQVJlcV9SWChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfUlhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBETUEgcmVjZXB0aW9uIHJlcXVlc3RzLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYRE1BRU4gICAgICAgTExfRk1QSTJDX0Rpc2FibGVETUFSZXFfUlgKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVETUFSZXFfUlgoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfUlhETUFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRE1BIHJlY2VwdGlvbiByZXF1ZXN0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWERNQUVOICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRETUFSZXFfUlgKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRETUFSZXFfUlgoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9SWERNQUVOKSA9PSAoRk1QSTJDX0NSMV9SWERNQUVOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgZGF0YSByZWdpc3RlciBhZGRyZXNzIHVzZWQgZm9yIERNQSB0cmFuc2ZlcgorICAqIEBybXRvbGwgVFhEUiAgICAgICAgIFRYREFUQSAgICAgICAgTExfRk1QSTJDX0RNQV9HZXRSZWdBZGRyXG4KKyAgKiAgICAgICAgIFJYRFIgICAgICAgICBSWERBVEEgICAgICAgIExMX0ZNUEkyQ19ETUFfR2V0UmVnQWRkcgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UKKyAgKiBAcGFyYW0gIERpcmVjdGlvbiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19ETUFfUkVHX0RBVEFfVFJBTlNNSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfRE1BX1JFR19EQVRBX1JFQ0VJVkUKKyAgKiBAcmV0dmFsIEFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlcgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19ETUFfR2V0UmVnQWRkcihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgRGlyZWN0aW9uKQoreworICByZWdpc3RlciB1aW50MzJfdCBkYXRhX3JlZ19hZGRyOworCisgIGlmIChEaXJlY3Rpb24gPT0gTExfRk1QSTJDX0RNQV9SRUdfREFUQV9UUkFOU01JVCkKKyAgeworICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFRYRFIgcmVnaXN0ZXIgKi8KKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChGTVBJMkN4LT5UWERSKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBSWERSIHJlZ2lzdGVyICovCisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJiAoRk1QSTJDeC0+UlhEUik7CisgIH0KKworICByZXR1cm4gZGF0YV9yZWdfYWRkcjsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQ2xvY2sgc3RyZXRjaGluZy4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiB0aGUgRk1QSTJDIGlzIGRpc2FibGVkIChQRSA9IDApLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIE5PU1RSRVRDSCAgICAgTExfRk1QSTJDX0VuYWJsZUNsb2NrU3RyZXRjaGluZworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlQ2xvY2tTdHJldGNoaW5nKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBDTEVBUl9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX05PU1RSRVRDSCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBDbG9jayBzdHJldGNoaW5nLgorICAqIEBub3RlICAgVGhpcyBiaXQgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIHRoZSBGTVBJMkMgaXMgZGlzYWJsZWQgKFBFID0gMCkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTk9TVFJFVENIICAgICBMTF9GTVBJMkNfRGlzYWJsZUNsb2NrU3RyZXRjaGluZworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRGlzYWJsZUNsb2NrU3RyZXRjaGluZyhGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfTk9TVFJFVENIKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBDbG9jayBzdHJldGNoaW5nIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTk9TVFJFVENIICAgICBMTF9GTVBJMkNfSXNFbmFibGVkQ2xvY2tTdHJldGNoaW5nCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfSXNFbmFibGVkQ2xvY2tTdHJldGNoaW5nKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfTk9TVFJFVENIKSAhPSAoRk1QSTJDX0NSMV9OT1NUUkVUQ0gpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGhhcmR3YXJlIGJ5dGUgY29udHJvbCBpbiBzbGF2ZSBtb2RlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNCQyAgICAgICAgICAgTExfRk1QSTJDX0VuYWJsZVNsYXZlQnl0ZUNvbnRyb2wKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0VuYWJsZVNsYXZlQnl0ZUNvbnRyb2woRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1NCQyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBoYXJkd2FyZSBieXRlIGNvbnRyb2wgaW4gc2xhdmUgbW9kZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTQkMgICAgICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlU2xhdmVCeXRlQ29udHJvbAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRGlzYWJsZVNsYXZlQnl0ZUNvbnRyb2woRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfU0JDKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBoYXJkd2FyZSBieXRlIGNvbnRyb2wgaW4gc2xhdmUgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNCQyAgICAgICAgICAgTExfRk1QSTJDX0lzRW5hYmxlZFNsYXZlQnl0ZUNvbnRyb2wKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRTbGF2ZUJ5dGVDb250cm9sKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfU0JDKSA9PSAoRk1QSTJDX0NSMV9TQkMpKSA/IDFVTCA6IDBVTCk7Cit9CisKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgR2VuZXJhbCBDYWxsLgorICAqIEBub3RlICAgV2hlbiBlbmFibGVkIHRoZSBBZGRyZXNzIDB4MDAgaXMgQUNLZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgR0NFTiAgICAgICAgICBMTF9GTVBJMkNfRW5hYmxlR2VuZXJhbENhbGwKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0VuYWJsZUdlbmVyYWxDYWxsKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9HQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEdlbmVyYWwgQ2FsbC4KKyAgKiBAbm90ZSAgIFdoZW4gZGlzYWJsZWQgdGhlIEFkZHJlc3MgMHgwMCBpcyBOQUNLZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgR0NFTiAgICAgICAgICBMTF9GTVBJMkNfRGlzYWJsZUdlbmVyYWxDYWxsCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19EaXNhYmxlR2VuZXJhbENhbGwoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfR0NFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgR2VuZXJhbCBDYWxsIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgR0NFTiAgICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkR2VuZXJhbENhbGwKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRHZW5lcmFsQ2FsbChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX0dDRU4pID09IChGTVBJMkNfQ1IxX0dDRU4pKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBNYXN0ZXIgdG8gb3BlcmF0ZSBpbiA3LWJpdCBvciAxMC1iaXQgYWRkcmVzc2luZyBtb2RlLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhpcyBiaXQgaXMgbm90IGFsbG93ZWQsIHdoZW4gdGhlIFNUQVJUIGJpdCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQUREMTAgICAgICAgICBMTF9GTVBJMkNfU2V0TWFzdGVyQWRkcmVzc2luZ01vZGUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQWRkcmVzc2luZ01vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfQUREUkVTU0lOR19NT0RFXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfQUREUkVTU0lOR19NT0RFXzEwQklUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfU2V0TWFzdGVyQWRkcmVzc2luZ01vZGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gsIHVpbnQzMl90IEFkZHJlc3NpbmdNb2RlKQoreworICBNT0RJRllfUkVHKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9BREQxMCwgQWRkcmVzc2luZ01vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgTWFzdGVyIGFkZHJlc3NpbmcgbW9kZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBREQxMCAgICAgICAgIExMX0ZNUEkyQ19HZXRNYXN0ZXJBZGRyZXNzaW5nTW9kZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19BRERSRVNTSU5HX01PREVfN0JJVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19BRERSRVNTSU5HX01PREVfMTBCSVQKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0TWFzdGVyQWRkcmVzc2luZ01vZGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9BREQxMCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgT3duIEFkZHJlc3MxLgorICAqIEBybXRvbGwgT0FSMSAgICAgICAgIE9BMSAgICAgICAgICAgTExfRk1QSTJDX1NldE93bkFkZHJlc3MxXG4KKyAgKiAgICAgICAgIE9BUjEgICAgICAgICBPQTFNT0RFICAgICAgIExMX0ZNUEkyQ19TZXRPd25BZGRyZXNzMQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBPd25BZGRyZXNzMSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weDNGRi4KKyAgKiBAcGFyYW0gIE93bkFkZHJTaXplIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX09XTkFERFJFU1MxXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfT1dOQUREUkVTUzFfMTBCSVQKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19TZXRPd25BZGRyZXNzMShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgT3duQWRkcmVzczEsIHVpbnQzMl90IE93bkFkZHJTaXplKQoreworICBNT0RJRllfUkVHKEZNUEkyQ3gtPk9BUjEsIEZNUEkyQ19PQVIxX09BMSB8IEZNUEkyQ19PQVIxX09BMU1PREUsIE93bkFkZHJlc3MxIHwgT3duQWRkclNpemUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhY2tub3dsZWRnZSBvbiBPd24gQWRkcmVzczEgbWF0Y2ggYWRkcmVzcy4KKyAgKiBAcm10b2xsIE9BUjEgICAgICAgICBPQTFFTiAgICAgICAgIExMX0ZNUEkyQ19FbmFibGVPd25BZGRyZXNzMQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlT3duQWRkcmVzczEoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+T0FSMSwgRk1QSTJDX09BUjFfT0ExRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYWNrbm93bGVkZ2Ugb24gT3duIEFkZHJlc3MxIG1hdGNoIGFkZHJlc3MuCisgICogQHJtdG9sbCBPQVIxICAgICAgICAgT0ExRU4gICAgICAgICBMTF9GTVBJMkNfRGlzYWJsZU93bkFkZHJlc3MxCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19EaXNhYmxlT3duQWRkcmVzczEoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5PQVIxLCBGTVBJMkNfT0FSMV9PQTFFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgT3duIEFkZHJlc3MxIGFja25vd2xlZGdlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBPQVIxICAgICAgICAgT0ExRU4gICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkT3duQWRkcmVzczEKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRPd25BZGRyZXNzMShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+T0FSMSwgRk1QSTJDX09BUjFfT0ExRU4pID09IChGTVBJMkNfT0FSMV9PQTFFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgdGhlIDdiaXRzIE93biBBZGRyZXNzMi4KKyAgKiBAbm90ZSAgIFRoaXMgYWN0aW9uIGhhcyBubyBlZmZlY3QgaWYgb3duIGFkZHJlc3MyIGlzIGVuYWJsZWQuCisgICogQHJtdG9sbCBPQVIyICAgICAgICAgT0EyICAgICAgICAgICBMTF9GTVBJMkNfU2V0T3duQWRkcmVzczJcbgorICAqICAgICAgICAgT0FSMiAgICAgICAgIE9BMk1TSyAgICAgICAgTExfRk1QSTJDX1NldE93bkFkZHJlc3MyCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIE93bkFkZHJlc3MyIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHg3Ri4KKyAgKiBAcGFyYW0gIE93bkFkZHJNYXNrIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX09XTkFERFJFU1MyX05PTUFTSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19PV05BRERSRVNTMl9NQVNLMDEKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfT1dOQUREUkVTUzJfTUFTSzAyCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX09XTkFERFJFU1MyX01BU0swMworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19PV05BRERSRVNTMl9NQVNLMDQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfT1dOQUREUkVTUzJfTUFTSzA1CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX09XTkFERFJFU1MyX01BU0swNgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19PV05BRERSRVNTMl9NQVNLMDcKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19TZXRPd25BZGRyZXNzMihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgT3duQWRkcmVzczIsIHVpbnQzMl90IE93bkFkZHJNYXNrKQoreworICBNT0RJRllfUkVHKEZNUEkyQ3gtPk9BUjIsIEZNUEkyQ19PQVIyX09BMiB8IEZNUEkyQ19PQVIyX09BMk1TSywgT3duQWRkcmVzczIgfCBPd25BZGRyTWFzayk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIGFja25vd2xlZGdlIG9uIE93biBBZGRyZXNzMiBtYXRjaCBhZGRyZXNzLgorICAqIEBybXRvbGwgT0FSMiAgICAgICAgIE9BMkVOICAgICAgICAgTExfRk1QSTJDX0VuYWJsZU93bkFkZHJlc3MyCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGVPd25BZGRyZXNzMihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5PQVIyLCBGTVBJMkNfT0FSMl9PQTJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSAgYWNrbm93bGVkZ2Ugb24gT3duIEFkZHJlc3MyIG1hdGNoIGFkZHJlc3MuCisgICogQHJtdG9sbCBPQVIyICAgICAgICAgT0EyRU4gICAgICAgICBMTF9GTVBJMkNfRGlzYWJsZU93bkFkZHJlc3MyCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19EaXNhYmxlT3duQWRkcmVzczIoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5PQVIyLCBGTVBJMkNfT0FSMl9PQTJFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgT3duIEFkZHJlc3MxIGFja25vd2xlZGdlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBPQVIyICAgICAgICAgT0EyRU4gICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkT3duQWRkcmVzczIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRPd25BZGRyZXNzMihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+T0FSMiwgRk1QSTJDX09BUjJfT0EyRU4pID09IChGTVBJMkNfT0FSMl9PQTJFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNEQSBzZXR1cCwgaG9sZCB0aW1lIGFuZCB0aGUgU0NMIGhpZ2gsIGxvdyBwZXJpb2QuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gdGhlIEZNUEkyQyBpcyBkaXNhYmxlZCAoUEUgPSAwKS4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBUSU1JTkdSICAgICAgIExMX0ZNUEkyQ19TZXRUaW1pbmcKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltaW5nIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGRkZGRkYuCisgICogQG5vdGUgICBUaGlzIHBhcmFtZXRlciBpcyBjb21wdXRlZCB3aXRoIHRoZSBTVE0zMkN1YmVNWCBUb29sLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX1NldFRpbWluZyhGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgVGltaW5nKQoreworICBXUklURV9SRUcoRk1QSTJDeC0+VElNSU5HUiwgVGltaW5nKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFRpbWluZyBQcmVzY2FsZXIgc2V0dGluZy4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBQUkVTQyAgICAgICAgIExMX0ZNUEkyQ19HZXRUaW1pbmdQcmVzY2FsZXIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19HZXRUaW1pbmdQcmVzY2FsZXIoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZNUEkyQ3gtPlRJTUlOR1IsIEZNUEkyQ19USU1JTkdSX1BSRVNDKSA+PiBGTVBJMkNfVElNSU5HUl9QUkVTQ19Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU0NMIGxvdyBwZXJpb2Qgc2V0dGluZy4KKyAgKiBAcm10b2xsIFRJTUlOR1IgICAgICBTQ0xMICAgICAgICAgIExMX0ZNUEkyQ19HZXRDbG9ja0xvd1BlcmlvZAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0Q2xvY2tMb3dQZXJpb2QoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZNUEkyQ3gtPlRJTUlOR1IsIEZNUEkyQ19USU1JTkdSX1NDTEwpID4+IEZNUEkyQ19USU1JTkdSX1NDTExfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNDTCBoaWdoIHBlcmlvZCBzZXR0aW5nLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFNDTEggICAgICAgICAgTExfRk1QSTJDX0dldENsb2NrSGlnaFBlcmlvZAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0Q2xvY2tIaWdoUGVyaW9kKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTVBJMkN4LT5USU1JTkdSLCBGTVBJMkNfVElNSU5HUl9TQ0xIKSA+PiBGTVBJMkNfVElNSU5HUl9TQ0xIX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBTREEgaG9sZCB0aW1lLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFNEQURFTCAgICAgICAgTExfRk1QSTJDX0dldERhdGFIb2xkVGltZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MCBhbmQgTWF4X0RhdGE9MHhGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0dldERhdGFIb2xkVGltZShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRk1QSTJDeC0+VElNSU5HUiwgRk1QSTJDX1RJTUlOR1JfU0RBREVMKSA+PiBGTVBJMkNfVElNSU5HUl9TREFERUxfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBHZXQgdGhlIFNEQSBzZXR1cCB0aW1lLgorICAqIEBybXRvbGwgVElNSU5HUiAgICAgIFNDTERFTCAgICAgICAgTExfRk1QSTJDX0dldERhdGFTZXR1cFRpbWUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4RgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19HZXREYXRhU2V0dXBUaW1lKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTVBJMkN4LT5USU1JTkdSLCBGTVBJMkNfVElNSU5HUl9TQ0xERUwpID4+IEZNUEkyQ19USU1JTkdSX1NDTERFTF9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSBwZXJpcGhlcmFsIG1vZGUuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0ZNUFNNQlVTX0FMTF9JTlNUQU5DRShGTVBJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEZNUEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU01CSEVOICAgICAgICBMTF9GTVBJMkNfU2V0TW9kZVxuCisgICogICAgICAgICBDUjEgICAgICAgICAgU01CREVOICAgICAgICBMTF9GTVBJMkNfU2V0TW9kZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBQZXJpcGhlcmFsTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19NT0RFX0kyQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19NT0RFX1NNQlVTX0hPU1QKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfTU9ERV9TTUJVU19ERVZJQ0UKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfTU9ERV9TTUJVU19ERVZJQ0VfQVJQCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfU2V0TW9kZShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgUGVyaXBoZXJhbE1vZGUpCit7CisgIE1PRElGWV9SRUcoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1NNQkhFTiB8IEZNUEkyQ19DUjFfU01CREVOLCBQZXJpcGhlcmFsTW9kZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHBlcmlwaGVyYWwgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBTTUJIRU4gICAgICAgIExMX0ZNUEkyQ19HZXRNb2RlXG4KKyAgKiAgICAgICAgIENSMSAgICAgICAgICBTTUJERU4gICAgICAgIExMX0ZNUEkyQ19HZXRNb2RlCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX01PREVfSTJDCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX01PREVfU01CVVNfSE9TVAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19NT0RFX1NNQlVTX0RFVklDRQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlAKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0TW9kZShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1NNQkhFTiB8IEZNUEkyQ19DUjFfU01CREVOKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFNNQnVzIGFsZXJ0IChIb3N0IG9yIERldmljZSBtb2RlKQorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgU01CdXMgRGV2aWNlIG1vZGU6CisgICogICAgICAgICAtIFNNQnVzIEFsZXJ0IHBpbiBpcyBkcml2ZWQgbG93IGFuZAorICAqICAgICAgICAgICBBbGVydCBSZXNwb25zZSBBZGRyZXNzIEhlYWRlciBhY2tub3dsZWRnZSBpcyBlbmFibGVkLgorICAqICAgICAgICAgU01CdXMgSG9zdCBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUxFUlRFTiAgICAgICBMTF9GTVBJMkNfRW5hYmxlU01CdXNBbGVydAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlU01CdXNBbGVydChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfQUxFUlRFTik7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTTUJ1cyBhbGVydCAoSG9zdCBvciBEZXZpY2UgbW9kZSkKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFNNQnVzIERldmljZSBtb2RlOgorICAqICAgICAgICAgLSBTTUJ1cyBBbGVydCBwaW4gaXMgbm90IGRyaXZlZCAoY2FuIGJlIHVzZWQgYXMgYSBzdGFuZGFyZCBHUElPKSBhbmQKKyAgKiAgICAgICAgICAgQWxlcnQgUmVzcG9uc2UgQWRkcmVzcyBIZWFkZXIgYWNrbm93bGVkZ2UgaXMgZGlzYWJsZWQuCisgICogICAgICAgICBTTUJ1cyBIb3N0IG1vZGU6CisgICogICAgICAgICAtIFNNQnVzIEFsZXJ0IHBpbiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUxFUlRFTiAgICAgICBMTF9GTVBJMkNfRGlzYWJsZVNNQnVzQWxlcnQKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVTTUJ1c0FsZXJ0KEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBDTEVBUl9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX0FMRVJURU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIFNNQnVzIGFsZXJ0IChIb3N0IG9yIERldmljZSBtb2RlKSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFMRVJURU4gICAgICAgTExfRk1QSTJDX0lzRW5hYmxlZFNNQnVzQWxlcnQKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRTTUJ1c0FsZXJ0KEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfQUxFUlRFTikgPT0gKEZNUEkyQ19DUjFfQUxFUlRFTikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU01CdXMgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIChQRUMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfRk1QSTJDX0VuYWJsZVNNQnVzUEVDCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGVTTUJ1c1BFQyhGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfUEVDRU4pOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgU01CdXMgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIChQRUMpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFBFQ0VOICAgICAgICAgTExfRk1QSTJDX0Rpc2FibGVTTUJ1c1BFQworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRGlzYWJsZVNNQnVzUEVDKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBDTEVBUl9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1BFQ0VOKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBTTUJ1cyBQYWNrZXQgRXJyb3IgQ2FsY3VsYXRpb24gKFBFQykgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBQRUNFTiAgICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRTTUJ1c1BFQworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZFNNQnVzUEVDKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfUEVDRU4pID09IChGTVBJMkNfQ1IxX1BFQ0VOKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gYXNzb2NpYXRlZCBUaW1lb3V0IGlzIGRpc2FibGVkIChUaW1lb3V0QSBhbmQvb3JUaW1lb3V0QikuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEEgICAgICBMTF9GTVBJMkNfQ29uZmlnU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBUSURMRSAgICAgICAgIExMX0ZNUEkyQ19Db25maWdTTUJ1c1RpbWVvdXRcbgorICAqICAgICAgICAgVElNRU9VVFIgICAgIFRJTUVPVVRCICAgICAgTExfRk1QSTJDX0NvbmZpZ1NNQnVzVGltZW91dAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYuCisgICogQHBhcmFtICBUaW1lb3V0QU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0RBX1NDTF9ISUdICisgICogQHBhcmFtICBUaW1lb3V0QgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0NvbmZpZ1NNQnVzVGltZW91dChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgVGltZW91dEEsIHVpbnQzMl90IFRpbWVvdXRBTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dEIpCit7CisgIE1PRElGWV9SRUcoRk1QSTJDeC0+VElNRU9VVFIsIEZNUEkyQ19USU1FT1VUUl9USU1FT1VUQSB8IEZNUEkyQ19USU1FT1VUUl9USURMRSB8IEZNUEkyQ19USU1FT1VUUl9USU1FT1VUQiwKKyAgICAgICAgICAgICBUaW1lb3V0QSB8IFRpbWVvdXRBTW9kZSB8IChUaW1lb3V0QiA8PCBGTVBJMkNfVElNRU9VVFJfVElNRU9VVEJfUG9zKSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0QSAoU0NMIGxvdyB0aW1lb3V0IG9yIFNDTCBhbmQgU0RBIGhpZ2ggdGltZW91dCBkZXBlbmRzIG9uIFRpbWVvdXRBIG1vZGUpLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgVGhlc2UgYml0cyBjYW4gb25seSBiZSBwcm9ncmFtbWVkIHdoZW4gVGltZW91dEEgaXMgZGlzYWJsZWQuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNRU9VVEEgICAgICBMTF9GTVBJMkNfU2V0U01CdXNUaW1lb3V0QQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QSBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAgTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfU2V0U01CdXNUaW1lb3V0QShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgVGltZW91dEEpCit7CisgIFdSSVRFX1JFRyhGTVBJMkN4LT5USU1FT1VUUiwgVGltZW91dEEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgc2V0dGluZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1FT1VUQSAgICAgIExMX0ZNUEkyQ19HZXRTTUJ1c1RpbWVvdXRBCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MHhGRkYKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0U01CdXNUaW1lb3V0QShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRk1QSTJDeC0+VElNRU9VVFIsIEZNUEkyQ19USU1FT1VUUl9USU1FT1VUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFNldCB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgYml0IGNhbiBvbmx5IGJlIHByb2dyYW1tZWQgd2hlbiBUaW1lb3V0QSBpcyBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSURMRSAgICAgICAgIExMX0ZNUEkyQ19TZXRTTUJ1c1RpbWVvdXRBTW9kZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHBhcmFtICBUaW1lb3V0QU1vZGUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TQ0xfTE9XCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX1RJTUVPVVRBX01PREVfU0RBX1NDTF9ISUdICisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfU2V0U01CdXNUaW1lb3V0QU1vZGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gsIHVpbnQzMl90IFRpbWVvdXRBTW9kZSkKK3sKKyAgV1JJVEVfUkVHKEZNUEkyQ3gtPlRJTUVPVVRSLCBUaW1lb3V0QU1vZGUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgQ2xvY2sgVGltZW91dEEgbW9kZS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSURMRSAgICAgICAgIExMX0ZNUEkyQ19HZXRTTUJ1c1RpbWVvdXRBTW9kZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBSZXR1cm5lZCB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19TTUJVU19USU1FT1VUQV9NT0RFX1NDTF9MT1cKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfU01CVVNfVElNRU9VVEFfTU9ERV9TREFfU0NMX0hJR0gKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0U01CdXNUaW1lb3V0QU1vZGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZNUEkyQ3gtPlRJTUVPVVRSLCBGTVBJMkNfVElNRU9VVFJfVElETEUpKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNNQnVzIEV4dGVuZGVkIEN1bXVsYXRpdmUgQ2xvY2sgVGltZW91dEIgKE1hc3RlciBvciBTbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoZXNlIGJpdHMgY2FuIG9ubHkgYmUgcHJvZ3JhbW1lZCB3aGVuIFRpbWVvdXRCIGlzIGRpc2FibGVkLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRCICAgICAgTExfRk1QSTJDX1NldFNNQnVzVGltZW91dEIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVGltZW91dEIgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTB4RkZGLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX1NldFNNQnVzVGltZW91dEIoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gsIHVpbnQzMl90IFRpbWVvdXRCKQoreworICBXUklURV9SRUcoRk1QSTJDeC0+VElNRU9VVFIsIFRpbWVvdXRCIDw8IEZNUEkyQ19USU1FT1VUUl9USU1FT1VUQl9Qb3MpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgRXh0ZW50ZWQgQ3VtdWxhdGl2ZSBDbG9jayBUaW1lb3V0QiBzZXR0aW5nLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgVElNRU9VVFIgICAgIFRJTUVPVVRCICAgICAgTExfRk1QSTJDX0dldFNNQnVzVGltZW91dEIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT0weEZGRgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19HZXRTTUJ1c1RpbWVvdXRCKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTVBJMkN4LT5USU1FT1VUUiwgRk1QSTJDX1RJTUVPVVRSX1RJTUVPVVRCKSA+PiBGTVBJMkNfVElNRU9VVFJfVElNRU9VVEJfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIFNNQnVzIENsb2NrIFRpbWVvdXQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0ZNUFNNQlVTX0FMTF9JTlNUQU5DRShGTVBJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEZNUEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNT1VURU4gICAgICBMTF9GTVBJMkNfRW5hYmxlU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBURVhURU4gICAgICAgIExMX0ZNUEkyQ19FbmFibGVTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2xvY2tUaW1lb3V0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX1RJTUVPVVRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX1RJTUVPVVRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX0FMTF9USU1FT1VUCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlU01CdXNUaW1lb3V0KEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4LCB1aW50MzJfdCBDbG9ja1RpbWVvdXQpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+VElNRU9VVFIsIENsb2NrVGltZW91dCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU01CdXMgQ2xvY2sgVGltZW91dC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFRJTUVPVVRSICAgICBUSU1PVVRFTiAgICAgIExMX0ZNUEkyQ19EaXNhYmxlU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBURVhURU4gICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlU01CdXNUaW1lb3V0CisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIENsb2NrVGltZW91dCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19TTUJVU19USU1FT1VUQQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19TTUJVU19USU1FT1VUQgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19TTUJVU19BTExfVElNRU9VVAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVTTUJ1c1RpbWVvdXQoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gsIHVpbnQzMl90IENsb2NrVGltZW91dCkKK3sKKyAgQ0xFQVJfQklUKEZNUEkyQ3gtPlRJTUVPVVRSLCBDbG9ja1RpbWVvdXQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBTTUJ1cyBDbG9jayBUaW1lb3V0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0ZNUFNNQlVTX0FMTF9JTlNUQU5DRShGTVBJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEZNUEkyQ3ggSW5zdGFuY2UuCisgICogQHJtdG9sbCBUSU1FT1VUUiAgICAgVElNT1VURU4gICAgICBMTF9GTVBJMkNfSXNFbmFibGVkU01CdXNUaW1lb3V0XG4KKyAgKiAgICAgICAgIFRJTUVPVVRSICAgICBURVhURU4gICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRTTUJ1c1RpbWVvdXQKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgQ2xvY2tUaW1lb3V0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX1RJTUVPVVRBCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX1RJTUVPVVRCCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1NNQlVTX0FMTF9USU1FT1VUCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZFNNQnVzVGltZW91dChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgQ2xvY2tUaW1lb3V0KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5USU1FT1VUUiwgKEZNUEkyQ19USU1FT1VUUl9USU1PVVRFTiB8IEZNUEkyQ19USU1FT1VUUl9URVhURU4pKSA9PSAoQ2xvY2tUaW1lb3V0KSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FRl9JVF9NYW5hZ2VtZW50IElUX01hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBUWElTIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUWElFICAgICAgICAgIExMX0ZNUEkyQ19FbmFibGVJVF9UWAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlSVRfVFgoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1RYSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVFhJUyBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhJRSAgICAgICAgICBMTF9GTVBJMkNfRGlzYWJsZUlUX1RYCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19EaXNhYmxlSVRfVFgoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfVFhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFRYSVMgSW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVFhJRSAgICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkSVRfVFgKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRJVF9UWChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1RYSUUpID09IChGTVBJMkNfQ1IxX1RYSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIFJYTkUgaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFJYSUUgICAgICAgICAgTExfRk1QSTJDX0VuYWJsZUlUX1JYCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGVJVF9SWChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfUlhJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBSWE5FIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlSVRfUlgKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVJVF9SWChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9SWElFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgUlhORSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBSWElFICAgICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRJVF9SWAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZElUX1JYKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfUlhJRSkgPT0gKEZNUEkyQ19DUjFfUlhJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgQWRkcmVzcyBtYXRjaCBpbnRlcnJ1cHQgKHNsYXZlIG1vZGUgb25seSkuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUREUklFICAgICAgICBMTF9GTVBJMkNfRW5hYmxlSVRfQUREUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlSVRfQUREUihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfQUREUklFKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IChzbGF2ZSBtb2RlIG9ubHkpLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEFERFJJRSAgICAgICAgTExfRk1QSTJDX0Rpc2FibGVJVF9BRERSCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19EaXNhYmxlSVRfQUREUihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9BRERSSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIEFkZHJlc3MgbWF0Y2ggaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgQUREUklFICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkSVRfQUREUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZElUX0FERFIoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9BRERSSUUpID09IChGTVBJMkNfQ1IxX0FERFJJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOQUNLSUUgICAgICAgIExMX0ZNUEkyQ19FbmFibGVJVF9OQUNLCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGVJVF9OQUNLKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9OQUNLSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgTm90IGFja25vd2xlZGdlIHJlY2VpdmVkIGludGVycnVwdC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBOQUNLSUUgICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlSVRfTkFDSworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRGlzYWJsZUlUX05BQ0soRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfTkFDS0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBOb3QgYWNrbm93bGVkZ2UgcmVjZWl2ZWQgaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgTkFDS0lFICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkSVRfTkFDSworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZElUX05BQ0soRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9OQUNLSUUpID09IChGTVBJMkNfQ1IxX05BQ0tJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0LgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFNUT1BJRSAgICAgICAgTExfRk1QSTJDX0VuYWJsZUlUX1NUT1AKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0VuYWJsZUlUX1NUT1AoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1NUT1BJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBTVE9QIGRldGVjdGlvbiBpbnRlcnJ1cHQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1RPUElFICAgICAgICBMTF9GTVBJMkNfRGlzYWJsZUlUX1NUT1AKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVJVF9TVE9QKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBDTEVBUl9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1NUT1BJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgU1RPUCBkZXRlY3Rpb24gaW50ZXJydXB0IGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgU1RPUElFICAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkSVRfU1RPUAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZElUX1NUT1AoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9TVE9QSUUpID09IChGTVBJMkNfQ1IxX1NUT1BJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0LgorICAqIEBub3RlICAgQW55IG9mIHRoZXNlIGV2ZW50cyB3aWxsIGdlbmVyYXRlIGludGVycnVwdCA6CisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSAoVEMpCisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSBSZWxvYWQgKFRDUikKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0ZNUEkyQ19FbmFibGVJVF9UQworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlSVRfVEMoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+Q1IxLCBGTVBJMkNfQ1IxX1RDSUUpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0LgorICAqIEBub3RlICAgQW55IG9mIHRoZXNlIGV2ZW50cyB3aWxsIGdlbmVyYXRlIGludGVycnVwdCA6CisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSAoVEMpCisgICogICAgICAgICBUcmFuc2ZlciBDb21wbGV0ZSBSZWxvYWQgKFRDUikKKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlSVRfVEMKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVJVF9UQyhGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9UQ0lFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBUcmFuc2ZlciBDb21wbGV0ZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBUQ0lFICAgICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRJVF9UQworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZElUX1RDKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjEsIEZNUEkyQ19DUjFfVENJRSkgPT0gKEZNUEkyQ19DUjFfVENJRSkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgRXJyb3IgaW50ZXJydXB0cy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIEFueSBvZiB0aGVzZSBlcnJvcnMgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHQgOgorICAqICAgICAgICAgQXJiaXRyYXRpb24gTG9zcyAoQVJMTykKKyAgKiAgICAgICAgIEJ1cyBFcnJvciBkZXRlY3Rpb24gKEJFUlIpCisgICogICAgICAgICBPdmVycnVuL1VuZGVycnVuIChPVlIpCisgICogICAgICAgICBTTUJ1cyBUaW1lb3V0IGRldGVjdGlvbiAoVElNRU9VVCkKKyAgKiAgICAgICAgIFNNQnVzIFBFQyBlcnJvciBkZXRlY3Rpb24gKFBFQ0VSUikKKyAgKiAgICAgICAgIFNNQnVzIEFsZXJ0IHBpbiBldmVudCBkZXRlY3Rpb24gKEFMRVJUKQorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIEVSUklFICAgICAgICAgTExfRk1QSTJDX0VuYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRW5hYmxlSVRfRVJSKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBFcnJvciBpbnRlcnJ1cHRzLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgQW55IG9mIHRoZXNlIGVycm9ycyB3aWxsIGdlbmVyYXRlIGludGVycnVwdCA6CisgICogICAgICAgICBBcmJpdHJhdGlvbiBMb3NzIChBUkxPKQorICAqICAgICAgICAgQnVzIEVycm9yIGRldGVjdGlvbiAoQkVSUikKKyAgKiAgICAgICAgIE92ZXJydW4vVW5kZXJydW4gKE9WUikKKyAgKiAgICAgICAgIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIChUSU1FT1VUKQorICAqICAgICAgICAgU01CdXMgUEVDIGVycm9yIGRldGVjdGlvbiAoUEVDRVJSKQorICAqICAgICAgICAgU01CdXMgQWxlcnQgcGluIGV2ZW50IGRldGVjdGlvbiAoQUxFUlQpCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgRVJSSUUgICAgICAgICBMTF9GTVBJMkNfRGlzYWJsZUlUX0VSUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRGlzYWJsZUlUX0VSUihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9FUlJJRSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgRXJyb3IgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBFUlJJRSAgICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRJVF9FUlIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRJVF9FUlIoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPkNSMSwgRk1QSTJDX0NSMV9FUlJJRSkgPT0gKEZNUEkyQ19DUjFfRVJSSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QSTJDX0xMX0VGX0ZMQUdfbWFuYWdlbWVudCBGTEFHX21hbmFnZW1lbnQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IFdoZW4gbmV4dCBkYXRhIGlzIHdyaXR0ZW4gaW4gVHJhbnNtaXQgZGF0YSByZWdpc3Rlci4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGlzIGVtcHR5LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRSAgICAgICAgICAgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19UWEUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfVFhFKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5JU1IsIEZNUEkyQ19JU1JfVFhFKSA9PSAoRk1QSTJDX0lTUl9UWEUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBUcmFuc21pdCBpbnRlcnJ1cHQgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBXaGVuIG5leHQgZGF0YSBpcyB3cml0dGVuIGluIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIuCisgICogICAgICAgICBTRVQ6IFdoZW4gVHJhbnNtaXQgZGF0YSByZWdpc3RlciBpcyBlbXB0eS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBUWElTICAgICAgICAgIExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfVFhJUworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19UWElTKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5JU1IsIEZNUEkyQ19JU1JfVFhJUykgPT0gKEZNUEkyQ19JU1JfVFhJUykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBXaGVuIFJlY2VpdmUgZGF0YSByZWdpc3RlciBpcyByZWFkLgorICAqICAgICAgICAgU0VUOiBXaGVuIHRoZSByZWNlaXZlZCBkYXRhIGlzIGNvcGllZCBpbiBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUlhORSAgICAgICAgICBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX1JYTkUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfUlhORShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+SVNSLCBGTVBJMkNfSVNSX1JYTkUpID09IChGTVBJMkNfSVNSX1JYTkUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoc2xhdmUgbW9kZSkuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiB0aGUgcmVjZWl2ZWQgc2xhdmUgYWRkcmVzcyBtYXRjaGVkIHdpdGggb25lIG9mIHRoZSBlbmFibGVkIHNsYXZlIGFkZHJlc3MuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQUREUiAgICAgICAgICBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX0FERFIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfQUREUihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+SVNSLCBGTVBJMkNfSVNSX0FERFIpID09IChGTVBJMkNfSVNSX0FERFIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBOb3QgQWNrbm93bGVkZ2UgcmVjZWl2ZWQgZmxhZy4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGEgTkFDSyBpcyByZWNlaXZlZCBhZnRlciBhIGJ5dGUgdHJhbnNtaXNzaW9uLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIE5BQ0tGICAgICAgICAgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19OQUNLCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX05BQ0soRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPklTUiwgRk1QSTJDX0lTUl9OQUNLRikgPT0gKEZNUEkyQ19JU1JfTkFDS0YpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBTdG9wIGRldGVjdGlvbiBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSBTdG9wIGNvbmRpdGlvbiBpcyBkZXRlY3RlZC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBTVE9QRiAgICAgICAgIExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfU1RPUAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19TVE9QKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5JU1IsIEZNUEkyQ19JU1JfU1RPUEYpID09IChGTVBJMkNfSVNSX1NUT1BGKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgVHJhbnNmZXIgY29tcGxldGUgZmxhZyAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gUkVMT0FEPTAsIEFVVE9FTkQ9MCBhbmQgTkJZVEVTIGRhdGUgaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRDICAgICAgICAgICAgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19UQworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19UQyhGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+SVNSLCBGTVBJMkNfSVNSX1RDKSA9PSAoRk1QSTJDX0lTUl9UQykpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIFJFTE9BRD0xIGFuZCBOQllURVMgZGF0ZSBoYXZlIGJlZW4gdHJhbnNmZXJyZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVENSICAgICAgICAgICBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX1RDUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19UQ1IoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPklTUiwgRk1QSTJDX0lTUl9UQ1IpID09IChGTVBJMkNfSVNSX1RDUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIEJ1cyBlcnJvciBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSBtaXNwbGFjZWQgU3RhcnQgb3IgU3RvcCBjb25kaXRpb24gaXMgZGV0ZWN0ZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQkVSUiAgICAgICAgICBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX0JFUlIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfQkVSUihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+SVNSLCBGTVBJMkNfSVNSX0JFUlIpID09IChGTVBJMkNfSVNSX0JFUlIpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhcmJpdHJhdGlvbiBsb3N0LgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFSTE8gICAgICAgICAgTExfRk1QSTJDX0lzQWN0aXZlRmxhZ19BUkxPCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX0FSTE8oRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPklTUiwgRk1QSTJDX0lTUl9BUkxPKSA9PSAoRk1QSTJDX0lTUl9BUkxPKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnIChzbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIGFuIG92ZXJydW4vdW5kZXJydW4gZXJyb3Igb2NjdXJzIChDbG9jayBTdHJldGNoaW5nIERpc2FibGVkKS4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBPVlIgICAgICAgICAgIExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfT1ZSCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX09WUihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+SVNSLCBGTVBJMkNfSVNSX09WUikgPT0gKEZNUEkyQ19JU1JfT1ZSKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgU01CdXMgUEVDIGVycm9yIGZsYWcgaW4gcmVjZXB0aW9uLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gdGhlIHJlY2VpdmVkIFBFQyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBQRUMgcmVnaXN0ZXIgY29udGVudC4KKyAgKiBAcm10b2xsIElTUiAgICAgICAgICBQRUNFUlIgICAgICAgIExMX0ZNUEkyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19QRUNFUlIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0FjdGl2ZVNNQnVzRmxhZ19QRUNFUlIoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPklTUiwgRk1QSTJDX0lTUl9QRUNFUlIpID09IChGTVBJMkNfSVNSX1BFQ0VSUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIFNNQnVzIFRpbWVvdXQgZGV0ZWN0aW9uIGZsYWcuCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX0ZNUFNNQlVTX0FMTF9JTlNUQU5DRShGTVBJMkN4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgU01CdXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIEZNUEkyQ3ggSW5zdGFuY2UuCisgICogQG5vdGUgICBSRVNFVDogQ2xlYXIgZGVmYXVsdCB2YWx1ZS4KKyAgKiAgICAgICAgIFNFVDogV2hlbiBhIHRpbWVvdXQgb3IgZXh0ZW5kZWQgY2xvY2sgdGltZW91dCBvY2N1cnMuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgVElNRU9VVCAgICAgICBMTF9GTVBJMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfVElNRU9VVAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzQWN0aXZlU01CdXNGbGFnX1RJTUVPVVQoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPklTUiwgRk1QSTJDX0lTUl9USU1FT1VUKSA9PSAoRk1QSTJDX0lTUl9USU1FT1VUKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEluZGljYXRlIHRoZSBzdGF0dXMgb2YgU01CdXMgYWxlcnQgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBDbGVhciBkZWZhdWx0IHZhbHVlLgorICAqICAgICAgICAgU0VUOiBXaGVuIFNNQnVzIGhvc3QgY29uZmlndXJhdGlvbiwgU01CdXMgYWxlcnQgZW5hYmxlZCBhbmQKKyAgKiAgICAgICAgICAgICAgYSBmYWxsaW5nIGVkZ2UgZXZlbnQgb2NjdXJzIG9uIFNNQkEgcGluLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFMRVJUICAgICAgICAgTExfRk1QSTJDX0lzQWN0aXZlU01CdXNGbGFnX0FMRVJUCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfSXNBY3RpdmVTTUJ1c0ZsYWdfQUxFUlQoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPklTUiwgRk1QSTJDX0lTUl9BTEVSVCkgPT0gKEZNUEkyQ19JU1JfQUxFUlQpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBCdXMgQnVzeSBmbGFnLgorICAqIEBub3RlICAgUkVTRVQ6IENsZWFyIGRlZmF1bHQgdmFsdWUuCisgICogICAgICAgICBTRVQ6IFdoZW4gYSBTdGFydCBjb25kaXRpb24gaXMgZGV0ZWN0ZWQuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgQlVTWSAgICAgICAgICBMTF9GTVBJMkNfSXNBY3RpdmVGbGFnX0JVU1kKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0FjdGl2ZUZsYWdfQlVTWShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICgoUkVBRF9CSVQoRk1QSTJDeC0+SVNSLCBGTVBJMkNfSVNSX0JVU1kpID09IChGTVBJMkNfSVNSX0JVU1kpKSA/IDFVTCA6IDBVTCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQWRkcmVzcyBNYXRjaGVkIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgQUREUkNGICAgICAgICBMTF9GTVBJMkNfQ2xlYXJGbGFnX0FERFIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0NsZWFyRmxhZ19BRERSKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPklDUiwgRk1QSTJDX0lDUl9BRERSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIE5vdCBBY2tub3dsZWRnZSBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIE5BQ0tDRiAgICAgICAgTExfRk1QSTJDX0NsZWFyRmxhZ19OQUNLCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19DbGVhckZsYWdfTkFDSyhGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5JQ1IsIEZNUEkyQ19JQ1JfTkFDS0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBTdG9wIGRldGVjdGlvbiBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFNUT1BDRiAgICAgICAgTExfRk1QSTJDX0NsZWFyRmxhZ19TVE9QCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19DbGVhckZsYWdfU1RPUChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5JQ1IsIEZNUEkyQ19JQ1JfU1RPUENGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcgKFRYRSkuCisgICogQG5vdGUgICBUaGlzIGJpdCBjYW4gYmUgY2xlYXIgYnkgc29mdHdhcmUgaW4gb3JkZXIgdG8gZmx1c2ggdGhlIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgKFRYRFIpLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRYRSAgICAgICAgICAgTExfRk1QSTJDX0NsZWFyRmxhZ19UWEUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0NsZWFyRmxhZ19UWEUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFdSSVRFX1JFRyhGTVBJMkN4LT5JU1IsIEZNUEkyQ19JU1JfVFhFKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBCdXMgZXJyb3IgZmxhZy4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBCRVJSQ0YgICAgICAgIExMX0ZNUEkyQ19DbGVhckZsYWdfQkVSUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfQ2xlYXJGbGFnX0JFUlIoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+SUNSLCBGTVBJMkNfSUNSX0JFUlJDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgQXJiaXRyYXRpb24gbG9zdCBmbGFnLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIEFSTE9DRiAgICAgICAgTExfRk1QSTJDX0NsZWFyRmxhZ19BUkxPCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19DbGVhckZsYWdfQVJMTyhGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5JQ1IsIEZNUEkyQ19JQ1JfQVJMT0NGKTsKK30KKworLyoqCisgICogQGJyaWVmICBDbGVhciBPdmVycnVuL1VuZGVycnVuIGZsYWcuCisgICogQHJtdG9sbCBJQ1IgICAgICAgICAgT1ZSQ0YgICAgICAgICBMTF9GTVBJMkNfQ2xlYXJGbGFnX09WUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfQ2xlYXJGbGFnX09WUihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5JQ1IsIEZNUEkyQ19JQ1JfT1ZSQ0YpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENsZWFyIFNNQnVzIFBFQyBlcnJvciBmbGFnLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoRk1QSTJDeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFNNQnVzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBGTVBJMkN4IEluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFBFQ0NGICAgICAgICAgTExfRk1QSTJDX0NsZWFyU01CdXNGbGFnX1BFQ0VSUgorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfQ2xlYXJTTUJ1c0ZsYWdfUEVDRVJSKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPklDUiwgRk1QSTJDX0lDUl9QRUNDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgVGltZW91dCBkZXRlY3Rpb24gZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBUSU1PVVRDRiAgICAgIExMX0ZNUEkyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19DbGVhclNNQnVzRmxhZ19USU1FT1VUKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPklDUiwgRk1QSTJDX0lDUl9USU1PVVRDRik7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2xlYXIgU01CdXMgQWxlcnQgZmxhZy4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIElDUiAgICAgICAgICBBTEVSVENGICAgICAgIExMX0ZNUEkyQ19DbGVhclNNQnVzRmxhZ19BTEVSVAorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfQ2xlYXJTTUJ1c0ZsYWdfQUxFUlQoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+SUNSLCBGTVBJMkNfSUNSX0FMRVJUQ0YpOworfQorCisvKioKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIEZNUEkyQ19MTF9FRl9EYXRhX01hbmFnZW1lbnQgRGF0YV9NYW5hZ2VtZW50CisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgYXV0b21hdGljIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24gKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIEF1dG9tYXRpYyBlbmQgbW9kZSA6IGEgU1RPUCBjb25kaXRpb24gaXMgYXV0b21hdGljYWxseSBzZW50IHdoZW4gTkJZVEVTIGRhdGEgYXJlIHRyYW5zZmVycmVkLgorICAqICAgICAgICAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCBpbiBzbGF2ZSBtb2RlIG9yIHdoZW4gUkVMT0FEIGJpdCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9GTVBJMkNfRW5hYmxlQXV0b0VuZE1vZGUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0VuYWJsZUF1dG9FbmRNb2RlKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9BVVRPRU5EKTsKK30KKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGF1dG9tYXRpYyBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uIChtYXN0ZXIgbW9kZSkuCisgICogQG5vdGUgICBTb2Z0d2FyZSBlbmQgbW9kZSA6IFRDIGZsYWcgaXMgc2V0IHdoZW4gTkJZVEVTIGRhdGEgYXJlIHRyYW5zZmVycmUsIHN0cmV0Y2hpbmcgU0NMIGxvdy4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlQXV0b0VuZE1vZGUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVBdXRvRW5kTW9kZShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgQ0xFQVJfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9BVVRPRU5EKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhdXRvbWF0aWMgU1RPUCBjb25kaXRpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBBVVRPRU5EICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRBdXRvRW5kTW9kZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZEF1dG9FbmRNb2RlKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjIsIEZNUEkyQ19DUjJfQVVUT0VORCkgPT0gKEZNUEkyQ19DUjJfQVVUT0VORCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgcmVsb2FkIG1vZGUgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFRoZSB0cmFuc2ZlciBpcyBub3QgY29tcGxldGVkIGFmdGVyIHRoZSBOQllURVMgZGF0YSB0cmFuc2ZlciwgTkJZVEVTIHdpbGwgYmUgcmVsb2FkZWQgd2hlbiBUQ1IgZmxhZyBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkVMT0FEICAgICAgIExMX0ZNUEkyQ19FbmFibGVSZWxvYWRNb2RlCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGVSZWxvYWRNb2RlKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9SRUxPQUQpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgcmVsb2FkIG1vZGUgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgYWZ0ZXIgdGhlIE5CWVRFUyBkYXRhIHRyYW5zZmVyKFNUT1Agb3IgUkVTVEFSVCB3aWxsIGZvbGxvdykuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkVMT0FEICAgICAgIExMX0ZNUEkyQ19EaXNhYmxlUmVsb2FkTW9kZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfRGlzYWJsZVJlbG9hZE1vZGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIENMRUFSX0JJVChGTVBJMkN4LT5DUjIsIEZNUEkyQ19DUjJfUkVMT0FEKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiByZWxvYWQgbW9kZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICBMTF9GTVBJMkNfSXNFbmFibGVkUmVsb2FkTW9kZQorICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0lzRW5hYmxlZFJlbG9hZE1vZGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9SRUxPQUQpID09IChGTVBJMkNfQ1IyX1JFTE9BRCkpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIG51bWJlciBvZiBieXRlcyBmb3IgdHJhbnNmZXIuCisgICogQG5vdGUgICBDaGFuZ2luZyB0aGVzZSBiaXRzIHdoZW4gU1RBUlQgYml0IGlzIHNldCBpcyBub3QgYWxsb3dlZC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBOQllURVMgICAgICAgICAgIExMX0ZNUEkyQ19TZXRUcmFuc2ZlclNpemUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVHJhbnNmZXJTaXplIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfU2V0VHJhbnNmZXJTaXplKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4LCB1aW50MzJfdCBUcmFuc2ZlclNpemUpCit7CisgIE1PRElGWV9SRUcoRk1QSTJDeC0+Q1IyLCBGTVBJMkNfQ1IyX05CWVRFUywgVHJhbnNmZXJTaXplIDw8IEZNUEkyQ19DUjJfTkJZVEVTX1Bvcyk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uZmlndXJlZCBmb3IgdHJhbnNmZXIuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgTkJZVEVTICAgICAgICAgICBMTF9GTVBJMkNfR2V0VHJhbnNmZXJTaXplCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFZhbHVlIGJldHdlZW4gTWluX0RhdGE9MHgwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0dldFRyYW5zZmVyU2l6ZShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRk1QSTJDeC0+Q1IyLCBGTVBJMkNfQ1IyX05CWVRFUykgPj4gRk1QSTJDX0NSMl9OQllURVNfUG9zKTsKK30KKworLyoqCisgICogQGJyaWVmICBQcmVwYXJlIHRoZSBnZW5lcmF0aW9uIG9mIGEgQUNLbm93bGVkZ2Ugb3IgTm9uIEFDS25vd2xlZGdlIGNvbmRpdGlvbiBhZnRlciB0aGUgYWRkcmVzcyByZWNlaXZlIG1hdGNoIGNvZGUgb3IgbmV4dCByZWNlaXZlZCBieXRlLgorICAqIEBub3RlICAgVXNhZ2UgaW4gU2xhdmUgbW9kZSBvbmx5LgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIE5BQ0sgICAgICAgICAgTExfRk1QSTJDX0Fja25vd2xlZGdlTmV4dERhdGEKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgVHlwZUFja25vd2xlZGdlIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX0FDSworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19OQUNLCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfQWNrbm93bGVkZ2VOZXh0RGF0YShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgVHlwZUFja25vd2xlZGdlKQoreworICBNT0RJRllfUkVHKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9OQUNLLCBUeXBlQWNrbm93bGVkZ2UpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdlbmVyYXRlIGEgU1RBUlQgb3IgUkVTVEFSVCBjb25kaXRpb24KKyAgKiBAbm90ZSAgIFRoZSBTVEFSVCBiaXQgY2FuIGJlIHNldCBldmVuIGlmIGJ1cyBpcyBCVVNZIG9yIEZNUEkyQyBpcyBpbiBzbGF2ZSBtb2RlLgorICAqICAgICAgICAgVGhpcyBhY3Rpb24gaGFzIG5vIGVmZmVjdCB3aGVuIFJFTE9BRCBpcyBzZXQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RBUlQgICAgICAgICAgIExMX0ZNUEkyQ19HZW5lcmF0ZVN0YXJ0Q29uZGl0aW9uCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19HZW5lcmF0ZVN0YXJ0Q29uZGl0aW9uKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9TVEFSVCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2VuZXJhdGUgYSBTVE9QIGNvbmRpdGlvbiBhZnRlciB0aGUgY3VycmVudCBieXRlIHRyYW5zZmVyIChtYXN0ZXIgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9GTVBJMkNfR2VuZXJhdGVTdG9wQ29uZGl0aW9uCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19HZW5lcmF0ZVN0b3BDb25kaXRpb24oRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIFNFVF9CSVQoRk1QSTJDeC0+Q1IyLCBGTVBJMkNfQ1IyX1NUT1ApOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvbWF0aWMgUkVTVEFSVCBSZWFkIHJlcXVlc3QgY29uZGl0aW9uIGZvciAxMGJpdCBhZGRyZXNzIGhlYWRlciAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgVGhlIG1hc3RlciBzZW5kcyB0aGUgY29tcGxldGUgMTBiaXQgc2xhdmUgYWRkcmVzcyByZWFkIHNlcXVlbmNlIDoKKyAgKiAgICAgICAgIFN0YXJ0ICsgMiBieXRlcyAxMGJpdCBhZGRyZXNzIGluIFdyaXRlIGRpcmVjdGlvbiArIFJlc3RhcnQgKyBmaXJzdCA3IGJpdHMgb2YgMTBiaXQgYWRkcmVzcyBpbiBSZWFkIGRpcmVjdGlvbi4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBIRUFEMTBSICAgICAgIExMX0ZNUEkyQ19FbmFibGVBdXRvMTBCaXRSZWFkCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19FbmFibGVBdXRvMTBCaXRSZWFkKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBDTEVBUl9CSVQoRk1QSTJDeC0+Q1IyLCBGTVBJMkNfQ1IyX0hFQUQxMFIpOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgYXV0b21hdGljIFJFU1RBUlQgUmVhZCByZXF1ZXN0IGNvbmRpdGlvbiBmb3IgMTBiaXQgYWRkcmVzcyBoZWFkZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIFRoZSBtYXN0ZXIgb25seSBzZW5kcyB0aGUgZmlyc3QgNyBiaXRzIG9mIDEwYml0IGFkZHJlc3MgaW4gUmVhZCBkaXJlY3Rpb24uCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgSEVBRDEwUiAgICAgICBMTF9GTVBJMkNfRGlzYWJsZUF1dG8xMEJpdFJlYWQKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0Rpc2FibGVBdXRvMTBCaXRSZWFkKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICBTRVRfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9IRUFEMTBSKTsKK30KKworLyoqCisgICogQGJyaWVmICBDaGVjayBpZiBhdXRvbWF0aWMgUkVTVEFSVCBSZWFkIHJlcXVlc3QgY29uZGl0aW9uIGZvciAxMGJpdCBhZGRyZXNzIGhlYWRlciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfRk1QSTJDX0lzRW5hYmxlZEF1dG8xMEJpdFJlYWQKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRBdXRvMTBCaXRSZWFkKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKChSRUFEX0JJVChGTVBJMkN4LT5DUjIsIEZNUEkyQ19DUjJfSEVBRDEwUikgIT0gKEZNUEkyQ19DUjJfSEVBRDEwUikpID8gMVVMIDogMFVMKTsKK30KKworLyoqCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIHRyYW5zZmVyIGRpcmVjdGlvbiAobWFzdGVyIG1vZGUpLgorICAqIEBub3RlICAgQ2hhbmdpbmcgdGhlc2UgYml0cyB3aGVuIFNUQVJUIGJpdCBpcyBzZXQgaXMgbm90IGFsbG93ZWQuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkRfV1JOICAgICAgICAgICBMTF9GTVBJMkNfU2V0VHJhbnNmZXJSZXF1ZXN0CisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyUmVxdWVzdCBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19SRVFVRVNUX1dSSVRFCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1JFUVVFU1RfUkVBRAorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX1NldFRyYW5zZmVyUmVxdWVzdChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgVHJhbnNmZXJSZXF1ZXN0KQoreworICBNT0RJRllfUkVHKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9SRF9XUk4sIFRyYW5zZmVyUmVxdWVzdCk7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSB0cmFuc2ZlciBkaXJlY3Rpb24gcmVxdWVzdGVkIChtYXN0ZXIgbW9kZSkuCisgICogQHJtdG9sbCBDUjIgICAgICAgICAgUkRfV1JOICAgICAgICAgICBMTF9GTVBJMkNfR2V0VHJhbnNmZXJSZXF1ZXN0CisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX1JFUVVFU1RfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfUkVRVUVTVF9SRUFECisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0dldFRyYW5zZmVyUmVxdWVzdChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRk1QSTJDeC0+Q1IyLCBGTVBJMkNfQ1IyX1JEX1dSTikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgc2xhdmUgYWRkcmVzcyBmb3IgdHJhbnNmZXIgKG1hc3RlciBtb2RlKS4KKyAgKiBAbm90ZSAgIENoYW5naW5nIHRoZXNlIGJpdHMgd2hlbiBTVEFSVCBiaXQgaXMgc2V0IGlzIG5vdCBhbGxvd2VkLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNBREQgICAgICAgICAgIExMX0ZNUEkyQ19TZXRTbGF2ZUFkZHIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgU2xhdmVBZGRyIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4M0YuCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9GTVBJMkNfU2V0U2xhdmVBZGRyKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4LCB1aW50MzJfdCBTbGF2ZUFkZHIpCit7CisgIE1PRElGWV9SRUcoRk1QSTJDeC0+Q1IyLCBGTVBJMkNfQ1IyX1NBREQsIFNsYXZlQWRkcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgR2V0IHRoZSBzbGF2ZSBhZGRyZXNzIHByb2dyYW1tZWQgZm9yIHRyYW5zZmVyLgorICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFNBREQgICAgICAgICAgIExMX0ZNUEkyQ19HZXRTbGF2ZUFkZHIKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAgYW5kIE1heF9EYXRhPTB4M0YKKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9GTVBJMkNfR2V0U2xhdmVBZGRyKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTVBJMkN4LT5DUjIsIEZNUEkyQ19DUjJfU0FERCkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEhhbmRsZXMgRk1QSTJDeCBjb21tdW5pY2F0aW9uIHdoZW4gc3RhcnRpbmcgdHJhbnNmZXIgb3IgZHVyaW5nIHRyYW5zZmVyIChUQyBvciBUQ1IgZmxhZyBhcmUgc2V0KS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBTQUREICAgICAgICAgIExMX0ZNUEkyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQUREMTAgICAgICAgICBMTF9GTVBJMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFJEX1dSTiAgICAgICAgTExfRk1QSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBTVEFSVCAgICAgICAgIExMX0ZNUEkyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgU1RPUCAgICAgICAgICBMTF9GTVBJMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIFJFTE9BRCAgICAgICAgTExfRk1QSTJDX0hhbmRsZVRyYW5zZmVyXG4KKyAgKiAgICAgICAgIENSMiAgICAgICAgICBOQllURVMgICAgICAgIExMX0ZNUEkyQ19IYW5kbGVUcmFuc2ZlclxuCisgICogICAgICAgICBDUjIgICAgICAgICAgQVVUT0VORCAgICAgICBMTF9GTVBJMkNfSGFuZGxlVHJhbnNmZXJcbgorICAqICAgICAgICAgQ1IyICAgICAgICAgIEhFQUQxMFIgICAgICAgTExfRk1QSTJDX0hhbmRsZVRyYW5zZmVyCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIFNsYXZlQWRkciBTcGVjaWZpZXMgdGhlIHNsYXZlIGFkZHJlc3MgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiBAcGFyYW0gIFNsYXZlQWRkclNpemUgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfQUREUlNMQVZFXzdCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfQUREUlNMQVZFXzEwQklUCisgICogQHBhcmFtICBUcmFuc2ZlclNpemUgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ3JhbW1lZC4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1LgorICAqIEBwYXJhbSAgRW5kTW9kZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19NT0RFX1JFTE9BRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19NT0RFX0FVVE9FTkQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfTU9ERV9TT0ZURU5ECisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX01PREVfU01CVVNfUkVMT0FECisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX01PREVfU01CVVNfQVVUT0VORF9OT19QRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfTU9ERV9TTUJVU19TT0ZURU5EX05PX1BFQworICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19NT0RFX1NNQlVTX0FVVE9FTkRfV0lUSF9QRUMKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfTU9ERV9TTUJVU19TT0ZURU5EX1dJVEhfUEVDCisgICogQHBhcmFtICBSZXF1ZXN0IFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX0dFTkVSQVRFX05PU1RBUlRTVE9QCisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX0dFTkVSQVRFX1NUT1AKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfR0VORVJBVEVfU1RBUlRfUkVBRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19HRU5FUkFURV9TVEFSVF9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfUkVBRAorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19HRU5FUkFURV9SRVNUQVJUXzdCSVRfV1JJVEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9GTVBJMkNfR0VORVJBVEVfUkVTVEFSVF8xMEJJVF9SRUFECisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX0dFTkVSQVRFX1JFU1RBUlRfMTBCSVRfV1JJVEUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19IYW5kbGVUcmFuc2ZlcihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCwgdWludDMyX3QgU2xhdmVBZGRyLCB1aW50MzJfdCBTbGF2ZUFkZHJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRyYW5zZmVyU2l6ZSwgdWludDMyX3QgRW5kTW9kZSwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgTU9ESUZZX1JFRyhGTVBJMkN4LT5DUjIsIEZNUEkyQ19DUjJfU0FERCB8IEZNUEkyQ19DUjJfQUREMTAgfCAoRk1QSTJDX0NSMl9SRF9XUk4gJiAodWludDMyX3QpKFJlcXVlc3QgPj4gKDMxVSAtIEZNUEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEZNUEkyQ19DUjJfU1RBUlQgfCBGTVBJMkNfQ1IyX1NUT1AgfCBGTVBJMkNfQ1IyX1JFTE9BRCB8CisgICAgICAgICAgICAgRk1QSTJDX0NSMl9OQllURVMgfCBGTVBJMkNfQ1IyX0FVVE9FTkQgfCBGTVBJMkNfQ1IyX0hFQUQxMFIsCisgICAgICAgICAgICAgU2xhdmVBZGRyIHwgU2xhdmVBZGRyU2l6ZSB8IChUcmFuc2ZlclNpemUgPDwgRk1QSTJDX0NSMl9OQllURVNfUG9zKSB8IEVuZE1vZGUgfCBSZXF1ZXN0KTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSB0aGUgdmFsdWUgb2YgdHJhbnNmZXIgZGlyZWN0aW9uIChzbGF2ZSBtb2RlKS4KKyAgKiBAbm90ZSAgIFJFU0VUOiBXcml0ZSB0cmFuc2ZlciwgU2xhdmUgZW50ZXJzIGluIHJlY2VpdmVyIG1vZGUuCisgICogICAgICAgICBTRVQ6IFJlYWQgdHJhbnNmZXIsIFNsYXZlIGVudGVycyBpbiB0cmFuc21pdHRlciBtb2RlLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIERJUiAgICAgICAgICAgTExfRk1QSTJDX0dldFRyYW5zZmVyRGlyZWN0aW9uCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfRk1QSTJDX0RJUkVDVElPTl9XUklURQorICAqICAgICAgICAgQGFyZyBAcmVmIExMX0ZNUEkyQ19ESVJFQ1RJT05fUkVBRAorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19HZXRUcmFuc2ZlckRpcmVjdGlvbihGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoRk1QSTJDeC0+SVNSLCBGTVBJMkNfSVNSX0RJUikpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgc2xhdmUgbWF0Y2hlZCBhZGRyZXNzLgorICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFERENPREUgICAgICAgTExfRk1QSTJDX0dldEFkZHJlc3NNYXRjaENvZGUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weDNGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0dldEFkZHJlc3NNYXRjaENvZGUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAodWludDMyX3QpKFJFQURfQklUKEZNUEkyQ3gtPklTUiwgRk1QSTJDX0lTUl9BRERDT0RFKSA+PiBGTVBJMkNfSVNSX0FERENPREVfUG9zIDw8IDEpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEVuYWJsZSBpbnRlcm5hbCBjb21wYXJpc29uIG9mIHRoZSBTTUJ1cyBQYWNrZXQgRXJyb3IgYnl0ZSAodHJhbnNtaXNzaW9uIG9yIHJlY2VwdGlvbiBtb2RlKS4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAbm90ZSAgIFRoaXMgZmVhdHVyZSBpcyBjbGVhcmVkIGJ5IGhhcmR3YXJlIHdoZW4gdGhlIFBFQyBieXRlIGlzIHRyYW5zZmVycmVkLCBvciB3aGVuIGEgU1RPUCBjb25kaXRpb24gb3IgYW4gQWRkcmVzcyBNYXRjaGVkIGlzIHJlY2VpdmVkLgorICAqICAgICAgICAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCB3aGVuIFJFTE9BRCBiaXQgaXMgc2V0LgorICAqICAgICAgICAgVGhpcyBiaXQgaGFzIG5vIGVmZmVjdCBpbiBkZXZpY2UgbW9kZSB3aGVuIFNCQyBiaXQgaXMgbm90IHNldC4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQRUNCWVRFICAgICAgIExMX0ZNUEkyQ19FbmFibGVTTUJ1c1BFQ0NvbXBhcmUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfRk1QSTJDX0VuYWJsZVNNQnVzUEVDQ29tcGFyZShGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCkKK3sKKyAgU0VUX0JJVChGTVBJMkN4LT5DUjIsIEZNUEkyQ19DUjJfUEVDQllURSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFNNQnVzIFBhY2tldCBFcnJvciBieXRlIGludGVybmFsIGNvbXBhcmlzb24gaXMgcmVxdWVzdGVkIG9yIG5vdC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMiAgICAgICAgICBQRUNCWVRFICAgICAgIExMX0ZNUEkyQ19Jc0VuYWJsZWRTTUJ1c1BFQ0NvbXBhcmUKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0ZNUEkyQ19Jc0VuYWJsZWRTTUJ1c1BFQ0NvbXBhcmUoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIHJldHVybiAoKFJFQURfQklUKEZNUEkyQ3gtPkNSMiwgRk1QSTJDX0NSMl9QRUNCWVRFKSA9PSAoRk1QSTJDX0NSMl9QRUNCWVRFKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB0aGUgU01CdXMgUGFja2V0IEVycm9yIGJ5dGUgY2FsY3VsYXRlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfRk1QU01CVVNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBTTUJ1cyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgRk1QSTJDeCBJbnN0YW5jZS4KKyAgKiBAcm10b2xsIFBFQ1IgICAgICAgICBQRUMgICAgICAgICAgIExMX0ZNUEkyQ19HZXRTTUJ1c1BFQworICAqIEBwYXJhbSAgRk1QSTJDeCBGTVBJMkMgSW5zdGFuY2UuCisgICogQHJldHZhbCBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfRk1QSTJDX0dldFNNQnVzUEVDKEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChGTVBJMkN4LT5QRUNSLCBGTVBJMkNfUEVDUl9QRUMpKTsKK30KKworLyoqCisgICogQGJyaWVmICBSZWFkIFJlY2VpdmUgRGF0YSByZWdpc3Rlci4KKyAgKiBAcm10b2xsIFJYRFIgICAgICAgICBSWERBVEEgICAgICAgIExMX0ZNUEkyQ19SZWNlaXZlRGF0YTgKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEByZXR2YWwgVmFsdWUgYmV0d2VlbiBNaW5fRGF0YT0weDAwIGFuZCBNYXhfRGF0YT0weEZGCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9GTVBJMkNfUmVjZWl2ZURhdGE4KEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4KQoreworICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKEZNUEkyQ3gtPlJYRFIsIEZNUEkyQ19SWERSX1JYREFUQSkpOworfQorCisvKioKKyAgKiBAYnJpZWYgIFdyaXRlIGluIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgLgorICAqIEBybXRvbGwgVFhEUiAgICAgICAgIFRYREFUQSAgICAgICAgTExfRk1QSTJDX1RyYW5zbWl0RGF0YTgKKyAgKiBAcGFyYW0gIEZNUEkyQ3ggRk1QSTJDIEluc3RhbmNlLgorICAqIEBwYXJhbSAgRGF0YSBWYWx1ZSBiZXR3ZWVuIE1pbl9EYXRhPTB4MDAgYW5kIE1heF9EYXRhPTB4RkYKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX0ZNUEkyQ19UcmFuc21pdERhdGE4KEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4LCB1aW50OF90IERhdGEpCit7CisgIFdSSVRFX1JFRyhGTVBJMkN4LT5UWERSLCBEYXRhKTsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBGTVBJMkNfTExfRUZfSW5pdCBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworRXJyb3JTdGF0dXMgTExfRk1QSTJDX0luaXQoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gsIExMX0ZNUEkyQ19Jbml0VHlwZURlZiAqRk1QSTJDX0luaXRTdHJ1Y3QpOworRXJyb3JTdGF0dXMgTExfRk1QSTJDX0RlSW5pdChGTVBJMkNfVHlwZURlZiAqRk1QSTJDeCk7Cit2b2lkIExMX0ZNUEkyQ19TdHJ1Y3RJbml0KExMX0ZNUEkyQ19Jbml0VHlwZURlZiAqRk1QSTJDX0luaXRTdHJ1Y3QpOworCisKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBGTVBJMkMxICovCisKKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBGTVBJMkNfQ1IxX1BFICovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU1RNMzJGNHh4X0xMX0ZNUEkyQ19IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmNHh4X2xsX2dwaW8uaCBiL0luYy9zdG0zMmY0eHhfbGxfZ3Bpby5oCmluZGV4IDhmZjg2YWMuLjNmMWIzYTEgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY0eHhfbGxfZ3Bpby5oCisrKyBiL0luYy9zdG0zMmY0eHhfbGxfZ3Bpby5oCkBAIC0zNDAsMTEgKzM0MCwxMCBAQAogICAqICAgICAgICAgQGFyZyBAcmVmIExMX0dQSU9fT1VUUFVUX09QRU5EUkFJTgogICAqIEByZXR2YWwgTm9uZQogICAqLwotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfR1BJT19TZXRQaW5PdXRwdXRUeXBlKEdQSU9fVHlwZURlZiAqR1BJT3gsIHVpbnQzMl90IFBpbiwgdWludDMyX3QgT3V0cHV0VHlwZSkKK19fU1RBVElDX0lOTElORSB2b2lkIExMX0dQSU9fU2V0UGluT3V0cHV0VHlwZShHUElPX1R5cGVEZWYgKkdQSU94LCB1aW50MzJfdCBQaW5NYXNrLCB1aW50MzJfdCBPdXRwdXRUeXBlKQogewotICBNT0RJRllfUkVHKEdQSU94LT5PVFlQRVIsIChHUElPX09UWVBFUl9PVF8wIDw8IFBPU0lUSU9OX1ZBTChQaW4pKSwgKE91dHB1dFR5cGUgPDwgUE9TSVRJT05fVkFMKFBpbikpKTsKKyAgTU9ESUZZX1JFRyhHUElPeC0+T1RZUEVSLCBQaW5NYXNrLCAoUGluTWFzayAqIE91dHB1dFR5cGUpKTsKIH0KLSAgCiAKIC8qKgogICAqIEBicmllZiAgUmV0dXJuIGdwaW8gb3V0cHV0IHR5cGUgZm9yIHNldmVyYWwgcGlucyBvbiBkZWRpY2F0ZWQgcG9ydC4KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY0eHhfbGxfdXNiLmggYi9JbmMvc3RtMzJmNHh4X2xsX3VzYi5oCmluZGV4IGExZjMxYjMuLjJmMTkwN2YgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY0eHhfbGxfdXNiLmgKKysrIGIvSW5jL3N0bTMyZjR4eF9sbF91c2IuaApAQCAtMTU1LDcgKzE1NSw3IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gIHVpbnQ4X3QgICBkZXZfYWRkciA7ICAgICAgICAgIC8qITwgVVNCIGRldmljZSBhZGRyZXNzLgorICB1aW50OF90ICAgZGV2X2FkZHI7ICAgICAgICAgICAvKiE8IFVTQiBkZXZpY2UgYWRkcmVzcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDI1NSAgICAqLwogCiAgIHVpbnQ4X3QgICBjaF9udW07ICAgICAgICAgICAgIC8qITwgSG9zdCBjaGFubmVsIG51bWJlci4KQEAgLTE5OSwxMCArMTk5LDEwIEBACiAKICAgdWludDMyX3QgIEVyckNudDsgICAgICAgICAgICAgLyohPCBIb3N0IGNoYW5uZWwgZXJyb3IgY291bnQuKi8KIAotICBVU0JfT1RHX1VSQlN0YXRlVHlwZURlZiAgdXJiX3N0YXRlOyAgLyohPCBVUkIgc3RhdGUuCisgIFVTQl9PVEdfVVJCU3RhdGVUeXBlRGVmIHVyYl9zdGF0ZTsgIC8qITwgVVJCIHN0YXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgVVNCX09UR19VUkJTdGF0ZVR5cGVEZWYgKi8KIAotICBVU0JfT1RHX0hDU3RhdGVUeXBlRGVmICAgc3RhdGU7ICAgICAvKiE8IEhvc3QgQ2hhbm5lbCBzdGF0ZS4KKyAgVVNCX09UR19IQ1N0YXRlVHlwZURlZiBzdGF0ZTsgICAgICAgLyohPCBIb3N0IENoYW5uZWwgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIFVTQl9PVEdfSENTdGF0ZVR5cGVEZWYgICAqLwogfSBVU0JfT1RHX0hDVHlwZURlZjsKICNlbmRpZiAvKiBkZWZpbmVkIChVU0JfT1RHX0ZTKSB8fCBkZWZpbmVkIChVU0JfT1RHX0hTKSAqLwpAQCAtMjM3LDExICsyMzcsMTEgQEAKIC8qKiBAZGVmZ3JvdXAgVVNCX0xMIERldmljZSBTcGVlZAogICAqIEB7CiAgICovCi0jZGVmaW5lIFVTQkRfSFNfU1BFRUQgICAgICAgICAgICAgICAwVQotI2RlZmluZSBVU0JEX0hTSU5GU19TUEVFRCAgICAgICAgICAgMVUKLSNkZWZpbmUgVVNCSF9IU19TUEVFRCAgICAgICAgICAgICAgIDBVCi0jZGVmaW5lIFVTQkRfRlNfU1BFRUQgICAgICAgICAgICAgICAyVQotI2RlZmluZSBVU0JIX0ZTX1NQRUVEICAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgVVNCRF9IU19TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMFUKKyNkZWZpbmUgVVNCRF9IU0lORlNfU1BFRUQgICAgICAgICAgICAgICAgICAgICAgMVUKKyNkZWZpbmUgVVNCSF9IU19TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMFUKKyNkZWZpbmUgVVNCRF9GU19TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMlUKKyNkZWZpbmUgVVNCSF9GU0xTX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAgMVUKIC8qKgogICAqIEB9CiAgICovCkBAIC0yNjksMTEgKzI2OSwxMSBAQAogICAqIEB7CiAgICovCiAjaWZuZGVmIFVTQkRfSFNfVFJEVF9WQUxVRQotI2RlZmluZSBVU0JEX0hTX1RSRFRfVkFMVUUgICAgICAgICAgIDlVCisjZGVmaW5lIFVTQkRfSFNfVFJEVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgIDlVCiAjZW5kaWYgLyogVVNCRF9IU19UUkRUX1ZBTFVFICovCiAjaWZuZGVmIFVTQkRfRlNfVFJEVF9WQUxVRQotI2RlZmluZSBVU0JEX0ZTX1RSRFRfVkFMVUUgICAgICAgICAgIDVVCi0jZGVmaW5lIFVTQkRfREVGQVVMVF9UUkRUX1ZBTFVFICAgICAgOVUKKyNkZWZpbmUgVVNCRF9GU19UUkRUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgNVUKKyNkZWZpbmUgVVNCRF9ERUZBVUxUX1RSRFRfVkFMVUUgICAgICAgICAgICAgICAgOVUKICNlbmRpZiAvKiBVU0JEX0hTX1RSRFRfVkFMVUUgKi8KIC8qKgogICAqIEB9CkBAIC0yODIsOSArMjgyLDkgQEAKIC8qKiBAZGVmZ3JvdXAgVVNCX0xMX0NvcmVfTVBTIFVTQiBMb3cgTGF5ZXIgQ29yZSBNUFMKICAgKiBAewogICAqLwotI2RlZmluZSBVU0JfT1RHX0hTX01BWF9QQUNLRVRfU0laRSAgICAgICAgICAgICA1MTJVCi0jZGVmaW5lIFVTQl9PVEdfRlNfTUFYX1BBQ0tFVF9TSVpFICAgICAgICAgICAgIDY0VQotI2RlZmluZSBVU0JfT1RHX01BWF9FUDBfU0laRSAgICAgICAgICAgICAgICAgICA2NFUKKyNkZWZpbmUgVVNCX09UR19IU19NQVhfUEFDS0VUX1NJWkUgICAgICAgICAgIDUxMlUKKyNkZWZpbmUgVVNCX09UR19GU19NQVhfUEFDS0VUX1NJWkUgICAgICAgICAgICA2NFUKKyNkZWZpbmUgVVNCX09UR19NQVhfRVAwX1NJWkUgICAgICAgICAgICAgICAgICA2NFUKIC8qKgogICAqIEB9CiAgICovCkBAIC0yOTQsNyArMjk0LDYgQEAKICAgKi8KICNkZWZpbmUgRFNUU19FTlVNU1BEX0hTX1BIWV8zME1IWl9PUl82ME1IWiAgICAgKDBVIDw8IDEpCiAjZGVmaW5lIERTVFNfRU5VTVNQRF9GU19QSFlfMzBNSFpfT1JfNjBNSFogICAgICgxVSA8PCAxKQotI2RlZmluZSBEU1RTX0VOVU1TUERfTFNfUEhZXzZNSFogICAgICAgICAgICAgICAoMlUgPDwgMSkKICNkZWZpbmUgRFNUU19FTlVNU1BEX0ZTX1BIWV80OE1IWiAgICAgICAgICAgICAgKDNVIDw8IDEpCiAvKioKICAgKiBAfQpAQCAtNDAzLDcgKzQwMiw3IEBACiAjZGVmaW5lIFVTQnhfSEMoaSkgICAgICAoKFVTQl9PVEdfSG9zdENoYW5uZWxUeXBlRGVmICopKFVTQnhfQkFTRSArIFVTQl9PVEdfSE9TVF9DSEFOTkVMX0JBU0UgKyAoKGkpICogVVNCX09UR19IT1NUX0NIQU5ORUxfU0laRSkpKQogI2VuZGlmIC8qIGRlZmluZWQgKFVTQl9PVEdfRlMpIHx8IGRlZmluZWQgKFVTQl9PVEdfSFMpICovCiAKLSNkZWZpbmUgRVBfQUREUl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGVQorI2RlZmluZSBFUF9BRERSX01TSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGVQogLyoqCiAgICogQH0KICAgKi8KQEAgLTQ2OCwxMyArNDY3LDkgQEAKIEhBTF9TdGF0dXNUeXBlRGVmIFVTQl9Ecml2ZVZidXMoVVNCX09UR19HbG9iYWxUeXBlRGVmICpVU0J4LCB1aW50OF90IHN0YXRlKTsKIHVpbnQzMl90ICAgICAgICAgIFVTQl9HZXRIb3N0U3BlZWQoVVNCX09UR19HbG9iYWxUeXBlRGVmICpVU0J4KTsKIHVpbnQzMl90ICAgICAgICAgIFVTQl9HZXRDdXJyZW50RnJhbWUoVVNCX09UR19HbG9iYWxUeXBlRGVmICpVU0J4KTsKLUhBTF9TdGF0dXNUeXBlRGVmIFVTQl9IQ19Jbml0KFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGV2X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXBzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIFVTQl9IQ19Jbml0KFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCwgdWludDhfdCBjaF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwbnVtLCB1aW50OF90IGRldl9hZGRyZXNzLCB1aW50OF90IHNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcF90eXBlLCB1aW50MTZfdCBtcHMpOwogSEFMX1N0YXR1c1R5cGVEZWYgVVNCX0hDX1N0YXJ0WGZlcihVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQngsIFVTQl9PVEdfSENUeXBlRGVmICpoYywgdWludDhfdCBkbWEpOwogdWludDMyX3QgICAgICAgICAgVVNCX0hDX1JlYWRJbnRlcnJ1cHQoVVNCX09UR19HbG9iYWxUeXBlRGVmICpVU0J4KTsKIEhBTF9TdGF0dXNUeXBlRGVmIFVTQl9IQ19IYWx0KFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCwgdWludDhfdCBoY19udW0pOwpkaWZmIC0tZ2l0IGEvTGljZW5zZS5tZCBiL0xpY2Vuc2UubWQKaW5kZXggNjJmOTA4Zi4uODRhN2ZjNCAxMDA2NDQKLS0tIGEvTGljZW5zZS5tZAorKysgYi9MaWNlbnNlLm1kCkBAIC0xLDMgKzEsMyBAQAogIyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzCiAKLVRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciB0aGUgKipCU0QgMy1DbGF1c2UqKiBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhpcyBsaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KK1RoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciB0aGUgKipCU0QtMy1DbGF1c2UqKiBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhpcyBsaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCBlMjIyNzNmLi5jMWE2YWE1IDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC01LDI3ICs1LDMxIEBACiAqKlNUTTMyQ3ViZSoqIGlzIGFuIFNUTWljcm9lbGVjdHJvbmljcyBvcmlnaW5hbCBpbml0aWF0aXZlIHRvIGVhc2UgdGhlIGRldmVsb3BlcnMgbGlmZSBieSByZWR1Y2luZyBlZmZvcnRzLCB0aW1lIGFuZCBjb3N0LgogCiAqKlNUTTMyQ3ViZSoqIGNvdmVycyB0aGUgb3ZlcmFsbCBTVE0zMiBwcm9kdWN0cyBwb3J0Zm9saW8uIEl0IGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBlbWJlZGRlZCBzb2Z0d2FyZSBwbGF0Zm9ybSwgZGVsaXZlcmVkIGZvciBlYWNoIFNUTTMyIHNlcmllcy4KLSAgICogVGhlIENNU0lTIG1vZHVsZXMgKGNvcmUgYW5kIGRldmljZSkgY29ycmVzcG9uZGluZyB0byB0aGUgQVJNKHRtKSBjb3JlIGltcGxlbWVudGVkIGluIHRoaXMgU1RNMzIgcHJvZHVjdAotICAgKiBUaGUgU1RNMzIgSEFMLUxMIGRyaXZlcnMgOiBhbiBhYnN0cmFjdGlvbiBkcml2ZXJzIGxheWVyLCB0aGUgQVBJIGVuc3VyaW5nIG1heGltaXplZCBwb3J0YWJpbGl0eSBhY3Jvc3MgdGhlIFNUTTMyIHBvcnRmb2xpbwotICAgKiBUaGUgQlNQIERyaXZlcnMgb2YgZWFjaCBldmFsdWF0aW9uIG9yIGRlbW9uc3RyYXRpb24gYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMKLSAgICogQSBjb25zaXN0ZW50IHNldCBvZiBtaWRkbGV3YXJlcyBjb21wb25lbnRzIHN1Y2ggYXMgUlRPUywgVVNCLCBGYXRGUywgR3JhcGhpY3MsIFNUTTMyX1RvdWNoU2Vuc2luZ19MaWJyYXJ5IC4uLgotICAgKiBBIGZ1bGwgc2V0IG9mIHNvZnR3YXJlIHByb2plY3RzIChiYXNpYyBleGFtcGxlcywgYXBwbGljYXRpb25zIG9yIGRlbW9uc3RyYXRpb25zKSBmb3IgZWFjaCBib2FyZCBwcm92aWRlZCBieSB0aGlzIFNUTTMyIHNlcmllcworICAgKiBUaGUgQ01TSVMgbW9kdWxlcyAoY29yZSBhbmQgZGV2aWNlKSBjb3JyZXNwb25kaW5nIHRvIHRoZSBBUk0odG0pIGNvcmUgaW1wbGVtZW50ZWQgaW4gdGhpcyBTVE0zMiBwcm9kdWN0LgorICAgKiBUaGUgU1RNMzIgSEFMLUxMIGRyaXZlcnMgOiBhbiBhYnN0cmFjdGlvbiBkcml2ZXJzIGxheWVyLCB0aGUgQVBJIGVuc3VyaW5nIG1heGltaXplZCBwb3J0YWJpbGl0eSBhY3Jvc3MgdGhlIFNUTTMyIHBvcnRmb2xpby4KKyAgICogVGhlIEJTUCBEcml2ZXJzIG9mIGVhY2ggZXZhbHVhdGlvbiBvciBkZW1vbnN0cmF0aW9uIGJvYXJkIHByb3ZpZGVkIGJ5IHRoaXMgU1RNMzIgc2VyaWVzLgorICAgKiBBIGNvbnNpc3RlbnQgc2V0IG9mIG1pZGRsZXdhcmVzIGNvbXBvbmVudHMgc3VjaCBhcyBSVE9TLCBVU0IsIEZhdEZTLCBHcmFwaGljcywgU1RNMzJfVG91Y2hTZW5zaW5nX0xpYnJhcnkuLi4KKyAgICogQSBmdWxsIHNldCBvZiBzb2Z0d2FyZSBwcm9qZWN0cyAoYmFzaWMgZXhhbXBsZXMsIGFwcGxpY2F0aW9ucyBvciBkZW1vbnN0cmF0aW9ucykgZm9yIGVhY2ggYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMuCiAKIFR3byBtb2RlbHMgb2YgcHVibGljYXRpb24gYXJlIHByb3Bvc2VkIGZvciB0aGUgU1RNMzJDdWJlIGVtYmVkZGVkIHNvZnR3YXJlOgotICAgKiBUaGUgbW9ub2xpdGhpYyAqKk1DVSBQYWNrYWdlKiogOiBhbGwgU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZXMgb2Ygb25lIFNUTTMyIHNlcmllcyBhcmUgcHJlc2VudCAoRHJpdmVycywgTWlkZGxld2FyZXMsIFByb2plY3RzLCBVdGlsaXRpZXMpIGluIHRoZSByZXBvICh1c3VhbCBuYW1lICoqU1RNMzJDdWJleHgqKiwgeHggY29ycmVzcG9uZGluZyB0byB0aGUgU1RNMzIgc2VyaWVzKQorICAgKiBUaGUgbW9ub2xpdGhpYyAqKk1DVSBQYWNrYWdlKiogOiBhbGwgU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZXMgb2Ygb25lIFNUTTMyIHNlcmllcyBhcmUgcHJlc2VudCAoRHJpdmVycywgTWlkZGxld2FyZXMsIFByb2plY3RzLCBVdGlsaXRpZXMpIGluIHRoZSByZXBvICh1c3VhbCBuYW1lICoqU1RNMzJDdWJleHgqKiwgeHggY29ycmVzcG9uZGluZyB0byB0aGUgU1RNMzIgc2VyaWVzKS4KICAgICogVGhlICoqTUNVIGNvbXBvbmVudCoqIDogcHJvZ3Jlc3NpdmVseSBmcm9tIE5vdmVtYmVyIDIwMTksIGVhY2ggU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZSBiZWluZyBwYXJ0IG9mIHRoZSBTVE0zMkN1YmUgTUNVIFBhY2thZ2UsIHdpbGwgYmUgZGVsaXZlcmVkIGFzIGFuIGluZGl2aWR1YWwgcmVwbywgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc2VsZWN0IGFuZCBnZXQgb25seSB0aGUgcmVxdWlyZWQgc29mdHdhcmUgZnVuY3Rpb25zLgogCiAjIyBEZXNjcmlwdGlvbgogCi1UaGlzICoqc3RtMzJmNHh4X2hhbF9kcml2ZXIqKiBNQ1UgY29tcG9uZW50IHJlcG8gaXMgb25lIGVsZW1lbnQgb2YgdGhlIFNUTTMyQ3ViZUY0IE1DVSBlbWJlZGRlZCBzb2Z0d2FyZSBwYWNrYWdlLCBwcm92aWRpbmcgdGhlICoqSEFMLUxMIERyaXZlcnMqKiBwYXJ0LgorVGhpcyAqKnN0bTMyZjR4eF9oYWxfZHJpdmVyKiogTUNVIGNvbXBvbmVudCByZXBvc2l0b3J5IGlzIG9uZSBlbGVtZW50IG9mIHRoZSBTVE0zMkN1YmVGNCBNQ1UgZW1iZWRkZWQgc29mdHdhcmUgcGFja2FnZSwgcHJvdmlkaW5nIHRoZSAqKkhBTC1MTCBEcml2ZXJzKiogcGFydC4KIAogIyMgTGljZW5zZQogCiBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgogCi1UaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVE1pY3JvZWxlY3Ryb25pY3MgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCitUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVE1pY3JvZWxlY3Ryb25pY3MgdW5kZXIgQlNELTMtQ2xhdXNlIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KIAorIyMgUmVsZWFzZSBub3RlCisKK0RldGFpbHMgYWJvdXQgdGhlIGNvbnRlbnQgb2YgdGhpcyByZWxlYXNlIGFyZSBhdmFpbGFibGUgaW4gdGhlIHJlbGVhc2Ugbm90ZSBbaGVyZV0oaHR0cHM6Ly9odG1scHJldmlldy5naXRodWIuaW8vP2h0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJmNHh4X2hhbF9kcml2ZXIvYmxvYi9tYXN0ZXIvUmVsZWFzZV9Ob3Rlcy5odG1sKS4KKwogIyMgQ29tcGF0aWJpbGl0eSBpbmZvcm1hdGlvbgogCiBJbiB0aGlzIHRhYmxlLCB5b3UgY2FuIGZpbmQgdGhlIHN1Y2Nlc3NpdmUgdmVyc2lvbnMgb2YgdGhpcyBIQUwtTEwgRHJpdmVyIGNvbXBvbmVudCwgaW4gbGluZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb25zIG9mIHRoZSBmdWxsIE1DVSBwYWNrYWdlOgpAQCAtMzQsMTMgKzM4LDE0IEBACiAKIEhBTCBEcml2ZXIgRjQgfCBDTVNJUyBEZXZpY2UgRjQgfCBDTVNJUyBDb3JlIHwgV2FzIGRlbGl2ZXJlZCBpbiB0aGUgZnVsbCBNQ1UgcGFja2FnZQogLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UYWcgdjEuNy42IHwgVGFnIHYyLjYuMyB8IFRhZyB2NS40LjBfY200IHwgVGFnIHYxLjI0LjEgKGFuZCBmb2xsb3dpbmcsIGlmIGFueSwgdGlsbCBuZXh0IG5ldyB0YWcpCi1UYWcgdjEuNy43IHwgVGFnIHYyLjYuNCB8IFRhZyB2NS40LjBfY200IHwgVGFnIHYxLjI0LjIgKGFuZCBmb2xsb3dpbmcsIGlmIGFueSwgdGlsbCBuZXh0IG5ldyB0YWcpCitUYWcgdjEuNy42IHwgVGFnIHYyLjYuMyB8IFRhZyB2NS40LjBfY200IHwgVGFnIHYxLjI0LjEgKGFuZCBmb2xsb3dpbmcsIGlmIGFueSwgdGlsbCBuZXh0IHRhZykKK1RhZyB2MS43LjcgfCBUYWcgdjIuNi40IHwgVGFnIHY1LjQuMF9jbTQgfCBUYWcgdjEuMjQuMiAoYW5kIGZvbGxvd2luZywgaWYgYW55LCB0aWxsIG5leHQgdGFnKQorVGFnIHYxLjcuOCB8IFRhZyB2Mi42LjQgfCBUYWcgdjUuNC4wX2NtNCB8IFRhZyB2MS4yNS4wIChhbmQgZm9sbG93aW5nLCBpZiBhbnksIHRpbGwgbmV4dCB0YWcpCiAKIFRoZSBmdWxsICoqU1RNMzJDdWJlRjQqKiBNQ1UgcGFja2FnZSBpcyBhdmFpbGFibGUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3MvU1RNMzJDdWJlRjQpLgogCiAjIyBUcm91Ymxlc2hvb3RpbmcKIAotSWYgeW91IGhhdmUgYW55IGlzc3VlIHdpdGggdGhlICoqU29mdHdhcmUgY29udGVudCoqIG9mIHRoaXMgcmVwbywgeW91IGNhbiBbZmlsZSBhbiBpc3N1ZSBvbiBHaXRodWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJmNHh4X2hhbF9kcml2ZXIvaXNzdWVzL25ldykuCitJZiB5b3UgaGF2ZSBhbnkgaXNzdWUgd2l0aCB0aGUgKipTb2Z0d2FyZSBjb250ZW50Kiogb2YgdGhpcyByZXBvc2l0b3J5LCB5b3UgY2FuIGZpbGUgYW4gaXNzdWUgaW50byB0aGUgZmlybXdhcmUgcmVwb3NpdG9yeSBbU1RNMzJDdWJlRjRdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3MvU1RNMzJDdWJlRjQvaXNzdWVzL25ldy9jaG9vc2UpLgogCiBGb3IgYW55IG90aGVyIHF1ZXN0aW9uIHJlbGF0ZWQgdG8gdGhlIHByb2R1Y3QsIHRoZSB0b29scywgdGhlIGVudmlyb25tZW50LCB5b3UgY2FuIHN1Ym1pdCBhIHRvcGljIG9uIHRoZSBbU1QgQ29tbXVuaXR5L1NUTTMyIE1DVXMgZm9ydW1dKGh0dHBzOi8vY29tbXVuaXR5LnN0LmNvbS9zL2dyb3VwLzBGOTBYMDAwMDAwQVhzQVNBVy9zdG0zMi1tY3VzKS4KZGlmZiAtLWdpdCBhL1JlbGVhc2VfTm90ZXMuaHRtbCBiL1JlbGVhc2VfTm90ZXMuaHRtbAppbmRleCAwYzY3NzEyLi4xNWM4NmUwIDEwMDY0NAotLS0gYS9SZWxlYXNlX05vdGVzLmh0bWwKKysrIGIvUmVsZWFzZV9Ob3Rlcy5odG1sCkBAIC0yOSw2ICsyOSwxMSBAQAogCiAKIAorCisKKworCisKIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+CiA8bGluayByZWw9IkZpbGUtTGlzdCIgaHJlZj0iUmVsZWFzZV9Ob3Rlc19mb3JfU1RNMzJGNDV4X1N0ZFBlcmlwaF9Ecml2ZXJfZmlsZXMvZmlsZWxpc3QueG1sIj4KIDxsaW5rIHJlbD0iRWRpdC1UaW1lLURhdGEiIGhyZWY9IlJlbGVhc2VfTm90ZXNfZm9yX1NUTTMyRjQ1eF9TdGRQZXJpcGhfRHJpdmVyX2ZpbGVzL2VkaXRkYXRhLm1zbyI+PCEtLVtpZiAhbXNvXT4KQEAgLTkwNyw4ICs5MTIsNyBAQAogIDxvOnNoYXBlbGF5b3V0IHY6ZXh0PSJlZGl0Ij4KICAgPG86aWRtYXAgdjpleHQ9ImVkaXQiIGRhdGE9IjEiLz4KICA8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+Ci0gIDxtZXRhIGNvbnRlbnQ9Ik1DRCBBcHBsaWNhdGlvbiBUZWFtIiBuYW1lPSJhdXRob3IiPjwvaGVhZD4KLTxib2R5IGxpbms9ImJsdWUiIHZsaW5rPSJibHVlIj4KKyAgPG1ldGEgY29udGVudD0iTUNEIEFwcGxpY2F0aW9uIFRlYW0iIG5hbWU9ImF1dGhvciI+PC9oZWFkPjxib2R5IGxpbms9ImJsdWUiIHZsaW5rPSJibHVlIj4KIAogPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4KIApAQCAtOTQwLDggKzk0NCw2MSBAQAogICAgIDx0ZCBzdHlsZT0icGFkZGluZzogMGluOyIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJNc29Ob3JtYWxUYWJsZSIgc3R5bGU9IndpZHRoOiA2NzVwdDsiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI5MDAiPgogPHRib2R5Pjx0cj48dGQgc3R5bGU9InBhZGRpbmc6IDBpbjsiIHZhbGlnbj0idG9wIj4KLSAgICAgICAgPGgyIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7Ij48YSBuYW1lPSJIaXN0b3J5Ij48L2E+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IHdoaXRlOyI+VXBkYXRlIEhpc3Rvcnk8L3NwYW4+PC9oMj4KLSAgICAgICAgICAgIDxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjc0cHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjcuNyAvIDA2LURlY2VtYmVyLTIwMTk8L3NwYW4+PC9oMz4KKyAgICAgICAgPGgyIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7Ij48YSBuYW1lPSJIaXN0b3J5Ij48L2E+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IHdoaXRlOyI+VXBkYXRlIEhpc3Rvcnk8L3NwYW4+PC9oMj4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgPGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNzRweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNy44IC8gMTItRmVicnVhcnktMjAyMDwvc3Bhbj48L2gzPgorCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KK0NoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgPHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJkaXNjIj4KKyAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRk1QU01CVVM8L3NwYW4+IGFuZCA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBGTVBJMkM8L3NwYW4+IGRyaXZlcnM8L3NwYW4+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+R2VuZXJhbCB1cGRhdGVzIHRvIGZpeCBrbm93biBkZWZlY3RzIGFuZAorICAgICBlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L3NwYW4+PC9saT4KKzwvdWw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICA8dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPgorPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEhBTCBDUllQIGRyaXZlciB0byBzdXBwb3J0IGJsb2NrIGJ5IGJsb2NrIGRlY3J5cHRpb24gd2l0aG91dCByZWluaXRpYWxpemVzIHRoZSBJViBhbmQgS0VZIGZvciBlYWNoIGNhbGwuPC9zcGFuPjwvbGk+CisgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkltcHJvdmUgY29kZSBxdWFsaXR5IGJ5IGZpeGluZyBNaXNyYUMtMjAxMiB2aW9sYXRpb25zPGJyPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9saT4KKzxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFML0xMIFVTQiA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+CisgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij4mbmJzcDtBZGQgaGFuZGxpbmcgVVNCIGhvc3QgYmFiYmxlIGVycm9yIGludGVycnVwdDwvc3Bhbj48L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+Jm5ic3A7Rml4IEVuYWJsaW5nIFVMUEkgaW50ZXJmYWNlIGZvciBwbGF0Zm9ybXMgdGhhdCBpbnRlZ3JhdGVzIFVTQiBIUyBQSFk8L3NwYW4+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPiZuYnNwO0ZpeCBIb3N0IGRhdGEgdG9nZ2xpbmcgZm9yIElOIElzbyB0cmFuc2ZlcnM8L3NwYW4+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPiZuYnNwO0Vuc3VyZSB0byBkaXNhYmxlIFVTQiBFUCBkdXJpbmcgZW5kcG9pbnQgZGVhY3RpdmF0aW9uPGJyPgorPC9zcGFuPjwvbGk+Cis8L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFMIENSWVAgPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPgorICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+Jm5ic3A7VXBkYXRlIEhBTCBDUllQIGRyaXZlciB0byBzdXBwb3J0IGJsb2NrIGJ5IGJsb2NrIGRlY3J5cHRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgdGhlIElWIGFuZCBLRVkgYXQgZWFjaCBjYWxsLjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+PC9zcGFuPjxicj4KKyAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+QWRkIG5ldyBDUllQIEhhbmRsZXIgcGFyYW1ldGVyczogIktleUlWQ29uZmlnIiBhbmQgIlNpemVzU3VtIjwvc3Bhbj48L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQgbmV3IENSWVAgaW5pdCBwYXJhbWV0ZXI6ICJLZXlJVkNvbmZpZ1NraXAiPGJyPgorPC9zcGFuPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKzwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5IQUwgSTJTIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48L2xpPgorICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5VcGRhdGUgSEFMX0kyU19ETUFTdG9wKCkgQVBJIHRvIGJlIG1vcmUgc2FmZTwvc3Bhbj48L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+QWRkIGEgY2hlY2sgb24gQlNZLCBUWEUgYW5kIFJYTkUgZmxhZ3MgYmVmb3JlIGRpc2FibGluZyB0aGUgSTJTPC9zcGFuPjwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlVwZGF0ZSBIQUxfSTJTX0RNQVN0b3AoKSBBUEkgdG8gZml4IG11bHRpLWNhbGwgdHJhbnNmZXIgaXNzdWUodG8gYXZvaWQgcmUtaW5pdGlhbGl6aW5nIHRoZSBJMlMgZm9yIHRoZSBuZXh0IHRyYW5zZmVyKS48YnI+Cis8L3NwYW4+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkFkZCBfX0hBTF9JMlNFWFRfRkxVU0hfUlhfRFIoKSBhbmQgX19IQUxfSTJTX0ZMVVNIX1JYX0RSKCkgbWFjcm9zIHRvIGZsdXNoIHRoZSByZW1haW5pbmcgZGF0YSBpbnNpZGUgRFIgcmVnaXN0ZXJzLjwvc3Bhbj48L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQgbmV3IEVycm9yQ29kZSBkZWZpbmU6IEhBTF9JMlNfRVJST1JfQlVTWV9MSU5FX1JYPGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICA8L3VsPgorCisgICAgICAgICAgICAgICAgICA8aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI3NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjcgLyAwNi1EZWNlbWJlci0yMDE5PC9zcGFuPjwvaDM+CisKICAgICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAgICAgICAgICAgICAKQEAgLTEwMTksNyArMTA3Niw3IEBACiBjb25kaXRpb24gYW5kIGhhbmRsZSBpdCBiZWZvcmUgY2xlYXJpbmcgdGhlIEFERFIgZmxhZzwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkhBTCBOQU5EIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUKIEhBTF9OQU5EX1dyaXRlX1BhZ2VfOGIoKSwgSEFMX05BTkRfV3JpdGVfUGFnZV8xNmIoKSBhbmQmbmJzcDsKIEhBTF9OQU5EX1dyaXRlX1NwYXJlQXJlYV8xNmIoKSB0byBtYW5hZ2UgY29ycmVjdGx5IHRoZSB0aW1lIG91dAotY29uZGl0aW9uLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5IQUwgU0FJIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5PcHRpbWl6ZSBTQUlfRE1BVHhDcGx0KCkgYW5kIFNBSV9ETUFSeENwbHQoKSBBUElzIHRvIGNoZWNrIG9uICJNb2RlIiBwYXJhbWV0ZXIgaW5zdGVhZCBvZiZuYnNwO0NJUkMgYml0IGluIHRoZSBDUiByZWdpc3Rlci48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5SZW1vdmUgdW51c2VkIFNBSV9GSUZPX1NJWkUgZGVmaW5lPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEhBTF9TQUlfUmVjZWl2ZV9ETUEoKSBwcm9ncmFtbWluZyBzZXF1ZW5jZSB0byBiZSBpbmxpbmUgd2l0aCByZWZlcmVuY2UgbWFudWFsPGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI3NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjYgLyAxMi1BcHJpbC0yMDE5PC9zcGFuPjwvaDM+Citjb25kaXRpb24uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkhBTCBTQUkgPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPk9wdGltaXplIFNBSV9ETUFUeENwbHQoKSBhbmQgU0FJX0RNQVJ4Q3BsdCgpIEFQSXMgdG8gY2hlY2sgb24gIk1vZGUiIHBhcmFtZXRlciBpbnN0ZWFkIG9mJm5ic3A7Q0lSQyBiaXQgaW4gdGhlIENSIHJlZ2lzdGVyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlJlbW92ZSB1bnVzZWQgU0FJX0ZJRk9fU0laRSBkZWZpbmU8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSEFMX1NBSV9SZWNlaXZlX0RNQSgpIHByb2dyYW1taW5nIHNlcXVlbmNlIHRvIGJlIGlubGluZSB3aXRoIHJlZmVyZW5jZSBtYW51YWw8YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjc0cHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjcuNiAvIDEyLUFwcmlsLTIwMTk8L3NwYW4+PC9oMz4KICAgICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAgICAgICAgICAgICAKQEAgLTEwNDQsNyArMTEwMSw3IEBACiAgICAgIENvZGVTb25hciB3YXJuaW5nIG9uIFBDRF9Qb3J0X0lSUUhhbmRsZXIoKSBhbmQgJm5ic3A7SENEX1BvcnRfSVJRSGFuZGxlcigpCiAgICAgIGludGVycnVwdCBoYW5kbGVyczxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPgogCi08aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI3NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjUgLyAwOC1GZWJydWFyeS0yMDE5PC9zcGFuPjwvaDM+Cis8aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI3NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjUgLyAwOC1GZWJydWFyeS0yMDE5PC9zcGFuPjwvaDM+CiAgICAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPgogICAgICAgICAgICAgCkBAIC0xNDM2LDkgKzE0OTMsOSBAQAogCiAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAKLSAgICA8aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI3NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjQgLyAwMi1GZWJydWFyeS0yMDE4PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorICAgIDxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjc0cHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjcuNCAvIDAyLUZlYnJ1YXJ5LTIwMTg8L3NwYW4+PC9oMz48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+R2VuZXJhbCB1cGRhdGVzIAotdG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCZuYnNwOzwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIFVOVVNFRCgpIG1hY3JvIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIEdDQyB3YXJuaW5nPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlRoZSB3YXJuaW5nIGlzIGRldGVjdGVkIHdoZW4gdGhlIFVOVVNFRCgpIG1hY3JvIGlzIGNhbGxlZCBmcm9tIEMrKyBmaWxlPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gbWFrZSBSQU1GVU5DIGRlZmluZSBhcyBnZW5lcmljIHR5cGUgaW5zdGVhZCBvZiBIQUxfU3RhdHVzVHlwZGVmIHR5cGUuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRkxBU0ggPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdGhlJm5ic3A7cHJvdG90eXBlcyBvZiB0aGUgZm9sbG93aW5nIEFQSXMgYWZ0ZXIgY2hhbmdlIG9uIFJBTUZVTkMgZGVmaW5lcyZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfRkxBU0hFeF9TdG9wRmxhc2hJbnRlcmZhY2VDbGsoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9GTEFTSEV4X1N0YXJ0Rmxhc2hJbnRlcmZhY2VDbGsoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9GTEFTSEV4X0VuYWJsZUZsYXNoU2xlZXBNb2RlKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfRkxBU0hFeF9EaXNhYmxlRmxhc2hTbGVlcE1vZGUoKTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNBSSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfU0FJX0RNQVN0b3AoKSBhbmQgSEFMX1NBSV9BYm9ydCgpIHByb2Nlc3MgdG8gZml4IHRoZSBsb2NrL3VubG9jayBhdWRpbyBpc3N1ZTwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI3NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjMgLyAyMi1EZWNlbWJlci0yMDE3PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgordG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCZuYnNwOzwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIFVOVVNFRCgpIG1hY3JvIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIEdDQyB3YXJuaW5nPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlRoZSB3YXJuaW5nIGlzIGRldGVjdGVkIHdoZW4gdGhlIFVOVVNFRCgpIG1hY3JvIGlzIGNhbGxlZCBmcm9tIEMrKyBmaWxlPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gbWFrZSBSQU1GVU5DIGRlZmluZSBhcyBnZW5lcmljIHR5cGUgaW5zdGVhZCBvZiBIQUxfU3RhdHVzVHlwZGVmIHR5cGUuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRkxBU0ggPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdGhlJm5ic3A7cHJvdG90eXBlcyBvZiB0aGUgZm9sbG93aW5nIEFQSXMgYWZ0ZXIgY2hhbmdlIG9uIFJBTUZVTkMgZGVmaW5lcyZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfRkxBU0hFeF9TdG9wRmxhc2hJbnRlcmZhY2VDbGsoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9GTEFTSEV4X1N0YXJ0Rmxhc2hJbnRlcmZhY2VDbGsoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9GTEFTSEV4X0VuYWJsZUZsYXNoU2xlZXBNb2RlKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfRkxBU0hFeF9EaXNhYmxlRmxhc2hTbGVlcE1vZGUoKTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNBSSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfU0FJX0RNQVN0b3AoKSBhbmQgSEFMX1NBSV9BYm9ydCgpIHByb2Nlc3MgdG8gZml4IHRoZSBsb2NrL3VubG9jayBhdWRpbyBpc3N1ZTwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI3NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjMgLyAyMi1EZWNlbWJlci0yMDE3PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgogQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkdlbmVyYWwgdXBkYXRlcyAKIHRvIGZpeCBrbm93biBkZWZlY3RzIGFuZCBlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPlRoZSBmb2xsb3dpbmcgY2hhbmdlcyBkb25lIG9uIHRoZSBIQUwgZHJpdmVycyByZXF1aXJlIGFuIHVwZGF0ZSBvbiB0aGUgYXBwbGljYXRpb24gY29kZSBiYXNlZCBvbiBvbGRlciBIQUwgdmVyc2lvbnM8L3NwYW4+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJld29yayBvZiBIQUwgQ0FOIGRyaXZlciAoY29tcGF0aWJpbGl0eSBicmVhaykmbmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BCiBuZXcgSEFMIENBTiBkcml2ZXIgaGFzIGJlZW4gcmVkZXNpZ25lZCB3aXRoIG5ldyBBUElzLCB0byBieXBhc3MKQEAgLTE0NzAsNyArMTUyNyw3IEBACiAgICAgICAgIGFsbG93aW5nIHRvIGdldCB0aGUgSFNFIGNsb2NrIGRpdmlkZXIgZm9yIFJUQyBwZXJpcGhlcmFsPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5FbnN1cmUgcmVzZXQgb2YgQ0lSIGFuZCBDU1IKICAgICAgICByZWdpc3RlcnMgd2hlbiBpc3N1aW5nIEhBTF9SQ0NfRGVJbml0KCkvTExfUkNDX0RlSW5pdCBmdW5jdGlvbnM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5VcGRhdGUgSEFMX1JDQ19Pc2NDb25maWcoKSZuYnNwO3RvIGtlZXAgYmFja3VwIGRvbWFpbiBlbmFibGVkIHdoZW4gY29uZmlndXJpbmcgcmVzcGVjdGl2ZWx5Jm5ic3A7TFNFIGFuZCBSVEMgY2xvY2sgc291cmNlPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+QWRkIG5ldyBIQUwgaW50ZXJmYWNlcyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBhY3RpdmF0aW9uIG9yIGRlYWN0aXZhdGlvbiBvZiBQTExJMlMgYW5kIFBMTFNBSTo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX1JDQ0V4X0VuYWJsZVBMTEkyUygpPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX1JDQ0V4X0Rpc2FibGVQTExJMlMoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5IQUxfUkNDRXhfRW5hYmxlUExMU0FJKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+SEFMX1JDQ0V4X0Rpc2FibGVQTExTQUkoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBSQ0M8L3NwYW4+IHVwZGF0ZSZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IExMIFJDQyBtYWNybyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9SQ0NfUExMX1NldE1haW5Tb3VyY2UoKQogICAgICAgICBhbGxvd2luZyB0byBjb25maWd1cmUgUExMIG1haW4gY2xvY2sgc291cmNlPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIEZNQyAvIExMIEZTTUMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BZGQgY2xlYXIgb2YgdGhlIFBUWVAgYml0IHRvIHNlbGVjdCB0aGUgUENBUkQgbW9kZSBpbiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5GTUNfUENDQVJEX0luaXQoKSAvIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkZTTUNfUENDQVJEX0luaXQoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD4KLTxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTk3cHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjcuMiAvIDA2LU9jdG9iZXItMjAxNzwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KKzxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTk3cHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjcuMiAvIDA2LU9jdG9iZXItMjAxNzwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5HZW5lcmFsIHVwZGF0ZXMgCiB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Rml4IGNvbXBpbGF0aW9uJm5ic3A7d2FybmluZyB3aXRoIEdDQyBjb21waWxlcjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+UmVtb3ZlIERhdGUgYW5kIHZlcnNpb24gZnJvbSZuYnNwO2hlYWRlciBmaWxlczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTCBkcml2ZXJzIHRvIHJlZmVyIHRvIHRoZSBuZXcmbmJzcDtDTVNJUyBiaXQgcG9zaXRpb24gZGVmaW5lcyBpbnN0ZWFkIG9mIHVzYWdlIHRoZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlBPU0lUSU9OX1ZBTCgpIG1hY3JvPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdlbmVyaWMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5zdG0zMmY0eHhfaGFsX2RlZi5oIGZpbGUgY2hhbmdlczombmJzcDs8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIF9fd2VhayBhbmQgX19wYWNrZWQgZGVmaW5lZCB2YWx1ZXMgZm9yJm5ic3A7QVJNIGNvbXBpbGVyPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIF9fQUxJR05fQkVHSU4gYW5kIF9fQUxJR05fRU5EIGRlZmluZWQgdmFsdWVzIGZvciZuYnNwO0FSTSBjb21waWxlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+c3RtMzJmNHh4X2xsX3N5c3RlbS5oIGZpbGU6IGFkZCZuYnNwO0xMX1NZU0NGR19SRU1BUF9TRFJBTSBkZWZpbmU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBBREMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5GaXggd3JvbmcgZGVmaW5pdGlvbiBvZiBBREMgY2hhbm5lbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZm9yIFNUTTMyRjQxM3h4IGFuZCBTVE0zMkY0MjN4eCBkZXZpY2VzLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSZuYnNwO3ZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbmVzOiBETUFfRkxBR19GRUlGMF80IGFuZCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5ETUFfRkxBR19ETUVJRjBfNCZuYnNwOzwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERTSSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkZpeCBFeHRyYSB3YXJuaW5nIHdpdGggU1c0U1RNMzIgY29tcGlsZXI8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GaXggRFNJIGRpc3BsYXkgaXNzdWUgd2hlbiB1c2luZyBFV0FSTSB3LyBoaWdoIGxldmVsIG9wdGltaXphdGlvbiZuYnNwOzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkZpeCBNSVNSQUMmbmJzcDtlcnJvcnM8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTEFTSCA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9GTEFTSF9VbmxvY2soKSB1cGRhdGUgdG8gcmV0dXJuIHN0YXRlIGVycm9yIHdoZW4gdGhlIEZMQVNIIGlzIGFscmVhZHkgdW5sb2NrZWQ8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFMIEZNUEkyQyZuYnNwOzwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyI+PG86cD48L286cD48L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlCiAgICAgICBJbnRlcmZhY2UgQVBJcyBoZWFkZXJzIHRvIHJlbW92ZSBjb25mdXNpbmcgbWVzc2FnZSBhYm91dCBkZXZpY2UgYWRkcmVzczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlCkBAIC0xNTAxLDcgKzE1NTgsNyBAQAogPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAzNnB0OyB0ZXh0LWluZGVudDogLTE4cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogU3ltYm9sOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9IiI+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9wPgogPHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJORyA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9STkdfSW5pdCgpIHJlbW92ZSBMb2NrKCkvVW5sb2NrKCk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBNTUMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfTU1DX0VyYXNlKCkgQVBJOiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+YWRkIG1pc3NpbmcgKCkgdG8gZml4Jm5ic3A7Y29tcGlsYXRpb24gd2FybmluZyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPmRldGVjdGVkIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+d2l0aCBTVzRTVE0zMiB3aGVuIGV4dHJhIGZlYXR1cmUgaXMgZW5hYmxlZC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSVEMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfUlRDX0luaXQoKSBBUEk6IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIHRvIGZvcmNlIHRoZSB3YWl0IGZvciBzeW5jaHJvIGJlZm9yZSBzZXR0aW5nIFRBRkNSIHJlZ2lzdGVyIHdoZW4gQllQU0hBRCBiaXQgaW4gQ1IgcmVnaXN0ZXIgaXMgMC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTQUkgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSEFMX1NBSV9ETUFTdG9wKCkgQVBJIHRvIGZsdXNoIGZpZm8gYWZ0ZXIgZGlzYWJsaW5nJm5ic3A7U0FJPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSTJTIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEkyUyBETUEgZnVsbGR1cGxleCBwcm9jZXNzIHRvIGhhbmRsZSBJMlMgUnggYW5kIFR4IERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9USU1FeF9PQ05feHh4eCgpIGFuZCBIQUxfVElNRXhfUFdNTl94eHgoKSBBUEkgZGVzY3JpcHRpb24mbmJzcDt0byByZW1vdmUgc3VwcG9ydCBvZiBUSU1fQ0hBTk5FTF80PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBETUEgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gY2xlYXIgRE1BIGZsYWdzIHVzaW5nIFdSSVRFX1JFRygpIGluc3RlYWQgU0VUX1JFRygpIEFQSSB0byBhdm9pZCByZWFkIGFjY2VzcyB0byB0aGUgSUZDUiByZWdpc3RlciB0aGF0IGlzIHdyaXRlIG9ubHkuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBSVEMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GaXggd2FybmluZyB3aXRoIHN0YXRpYyBhbmFseXplcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVVNBUlQgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgYXNzZXJ0IG1hY3JvcyB0byBjaGVjayBVU0FSVCBCYXVkUmF0ZSByZWdpc3Rlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgSTJDIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+UmVuYW1lIElTX0kyQ19DTE9DS19TUEVFRCgpCiAgICAgICBhbmQgSVNfSTJDX0RVVFlfQ1lDTEUoKSByZXNwZWN0aXZlbHkgdG8gSVNfTExfSTJDX0NMT0NLX1NQRUVEKCkgYW5kCi0gICAgICBJU19MTF9JMkNfRFVUWV9DWUNMRSgpIHRvIGF2b2lkIGluY29tcGF0aWJsZSBtYWNyb3MgcmVkZWZpbml0aW9uLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVElNIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudCgpIEFQSSB0byBjbGVhciBVRElTIGJpdCBpbiBUSU0gQ1IxIHJlZ2lzdGVyIGluc3RlYWQgb2Ygc2V0dGluZyBpdC48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgTExfVElNX0Rpc2FibGVVcGRhdGVFdmVudCgpIEFQSSB0byBzZXQgVURJUyBiaXQgaW4gVElNIENSMSByZWdpc3RlciBpbnN0ZWFkIG9mIGNsZWFyaW5nIGl0Ljwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVVNBUlQgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GaXggTUlTUkEgZXJyb3Igdy8gSVNfTExfVVNBUlRfQlJSKCkgbWFjcm88L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GaXggd3JvbmcgY2hlY2sgd2hlbiBVQVJUMTAgaW5zdGFuY2UgaXMgdXNlZDwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE5N3B4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjEgLyAxNC1BcHJpbC0yMDE3PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorICAgICAgSVNfTExfSTJDX0RVVFlfQ1lDTEUoKSB0byBhdm9pZCBpbmNvbXBhdGlibGUgbWFjcm9zIHJlZGVmaW5pdGlvbi48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFRJTSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBMTF9USU1fRW5hYmxlVXBkYXRlRXZlbnQoKSBBUEkgdG8gY2xlYXIgVURJUyBiaXQgaW4gVElNIENSMSByZWdpc3RlciBpbnN0ZWFkIG9mIHNldHRpbmcgaXQuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIExMX1RJTV9EaXNhYmxlVXBkYXRlRXZlbnQoKSBBUEkgdG8gc2V0IFVESVMgYml0IGluIFRJTSBDUjEgcmVnaXN0ZXIgaW5zdGVhZCBvZiBjbGVhcmluZyBpdC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFVTQVJUIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Rml4IE1JU1JBIGVycm9yIHcvIElTX0xMX1VTQVJUX0JSUigpIG1hY3JvPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Rml4IHdyb25nIGNoZWNrIHdoZW4gVUFSVDEwIGluc3RhbmNlIGlzIHVzZWQ8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxOTdweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNy4xIC8gMTQtQXByaWwtMjAxNzwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAKIDx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPlVwZGF0ZSBDSE0gVXNlck1hbnVhbHMgdG8gc3VwcG9ydCBMTCBkcml2ZXJzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5HZW5lcmFsIHVwZGF0ZXMgCkBAIC0xNTE1LDcgKzE1NzIsNyBAQAogPHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBXUiA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9QV1JFeF9FbnRlclVuZGVyRHJpdmVTVE9QTW9kZSgpIEFQSTogcmVtb3ZlIGNoZWNrIG9uIFVEUkRZIGZsYWc8L3NwYW4+PC9saT48L3VsPjwvdWw+CiA8dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBBREMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GaXggd3JvbmcgQURDIGdyb3VwIGluamVjdGVkIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb248L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PC9saT48L3VsPjx1bD48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+TExfQURDX0lOSl9TZXRTZXF1ZW5jZXJSYW5rcygpCiBhbmQgTExfQURDX0lOSl9HZXRTZXF1ZW5jZXJSYW5rcygpIEFQSSdzIHVwZGF0ZSB0byB0YWtlIGluCi1jb25zaWRlcmF0aW9uIHRoZSBBREMgbnVtYmVyIG9mIGNvbnZlcnNpb25zPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRoZSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPmRlZmluZWQgdmFsdWVzIGZvcjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPiBBREMgZ3JvdXAgaW5qZWN0ZWQgc2VxZW5jZXIgcmFua3MmbmJzcDs8L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE5N3B4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS43LjAgLyAxNy1GZWJydWFyeS0yMDE3PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgorY29uc2lkZXJhdGlvbiB0aGUgQURDIG51bWJlciBvZiBjb252ZXJzaW9uczwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWw+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0aGUmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5kZWZpbmVkIHZhbHVlcyBmb3I8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij4gQURDIGdyb3VwIGluamVjdGVkIHNlcWVuY2VyIHJhbmtzJm5ic3A7PC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxOTdweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNy4wIC8gMTctRmVicnVhcnktMjAxNzwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAKIDx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5BZGQgTG93IExheWVyIGRyaXZlcnMgYWxsb3dpbmcgcGVyZm9ybWFuY2UgYW5kIGZvb3RwcmludCBvcHRpbWl6YXRpb248L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+TG93CkBAIC0xNTQxLDEwICsxNTk4LDEwIEBACiB0aGUmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkkyUyBjbG9jayBpbnB1dCBmcmVxdWVuY3kKIGNhbGN1bGF0aW9uJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj50byBIQUwgUkNDIGRyaXZlci48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgdGhlCiBIQUwgSTJTRXggZHJpdmVyIHRvIGtlZXAgb25seSBmdWxsIGR1cGxleCBmZWF0dXJlLjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5IQUxfSTJTX0luaXQoKSBBUEkgdXBkYXRlZCB0bzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkZpeCB3cm9uZyBJMlMgY2xvY2sgY2FsY3VsYXRpb24gd2hlbiBQQ00gbW9kZSBpcyB1c2VkLjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+UmV0dXJuIHN0YXRlJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5IQUxfSTJTX0VSUk9SX1BSRVNDQUxFUjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+Jm5ic3A7d2hlbiB0aGUgSTJTIGNsb2NrIGlzIHdyb25nbHkgY29uZmlndXJlZDwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPgotPHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgTFREQyA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJ1NlZ29lIFVJJzsgY29sb3I6IHJnYigwLCAwLCAwKTsgZGlyZWN0aW9uOiBsdHI7IiBkaXI9Imx0ciI+T3B0aW1pemUgSEFMX0xURENfSVJRSGFuZGxlcigpIGZ1bmN0aW9uIGJ5IHVzaW5nIGRpcmVjdCByZWdpc3RlciByZWFkPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknOyBjb2xvcjogcmdiKDAsIDAsIDApOyBkaXJlY3Rpb246IGx0cjsiIGRpcj0ibHRyIj5SZW5hbWUgdGhlIGZvbGxvd2luZyBBUEknczwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSSc7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGRpcmVjdGlvbjogbHRyOyIgZGlyPSJsdHIiPkhBTF9MVERDX1JlbGFvZCgpIGJ5IEhBTF9MVERDX1JlbG9hZCgpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknOyBjb2xvcjogcmdiKDAsIDAsIDApOyBkaXJlY3Rpb246IGx0cjsiIGRpcj0ibHRyIj4mbmJzcDs8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSSc7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGRpcmVjdGlvbjogbHRyOyIgZGlyPSJsdHIiPkhBTF9MVERDX1N0cnVjdEluaXRGcm9tVmlkZW9Db25maWcoKSBieSBIQUxfTFREQ0V4X1N0cnVjdEluaXRGcm9tVmlkZW9Db25maWcoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJ1NlZ29lIFVJJzsgY29sb3I6IHJnYigwLCAwLCAwKTsgZGlyZWN0aW9uOiBsdHI7IiBkaXI9Imx0ciI+SEFMX0xURENfU3RydWN0SW5pdEZyb21BZGFwdGVkQ29tbWFuZENvbmZpZygpIGJ5IEhBTF9MVERDRXhfU3RydWN0SW5pdEZyb21BZGFwdGVkQ29tbWFuZENvbmZpZygpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSSc7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGRpcmVjdGlvbjogbHRyOyIgZGlyPSJsdHIiPkFkZCBuZXcgZGVmaW5lcyBmb3IgTFREQyBsYXllcnMgKExURENfTEFZRVJfMSAvIExURENfTEFZRVJfMik8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSSc7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGRpcmVjdGlvbjogbHRyOyIgZGlyPSJsdHIiPlJlbW92ZSB1bnVzZWQgYXNzZXJ0czwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVVNCPC9zcGFuPjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5QQ0Q8L3NwYW4+IDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5GbHVzaCBhbGwgVFggRklGT3Mgb24gVVNCIFJlc2V0PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5SZW1vdmUgTG9jayBtZWNoYW5pc20gZnJvbSBIQUxfUENEX0VQX1RyYW5zbWl0KCkgYW5kIEhBTF9QQ0RfRVBfUmVjZWl2ZSgpIEFQSSdzPC9zcGFuPjwvbGk+PC91bD48L3VsPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknOyBjb2xvcjogcmdiKDAsIDAsIDApOyBkaXJlY3Rpb246IGx0cjsiIGRpcj0ibHRyIj48L3NwYW4+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBVU0I8L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+IDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5FbmFibGUgRE1BIEJ1cnN0IG1vZGUgZm9yIFVTQiBPVEcgSFM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkZpeCBTRCBjYXJkIGRldGVjdGlvbiBpc3N1ZTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBTRE1NQzwvc3Bhbj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIG5ldyBTRE1NQ19DbWRTREVyYXNlU3RhcnRBZGQsIFNETU1DX0NtZFNERXJhc2VFbmRBZGQsIFNETU1DX0NtZE9wQ29uZGl0aW9uIGFuZCBTRE1NQ19DbWRTd2l0Y2ggZnVuY3Rpb25zPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O0FyaWFsJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiByZ2IoMCwgMzIsIDgyKTsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iIj48L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjYuMCAvIDA0LU5vdmVtYmVyLTIwMTY8L3NwYW4+PC9oMz48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCis8dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMVERDIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknOyBjb2xvcjogcmdiKDAsIDAsIDApOyBkaXJlY3Rpb246IGx0cjsiIGRpcj0ibHRyIj5PcHRpbWl6ZSBIQUxfTFREQ19JUlFIYW5kbGVyKCkgZnVuY3Rpb24gYnkgdXNpbmcgZGlyZWN0IHJlZ2lzdGVyIHJlYWQ8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSSc7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGRpcmVjdGlvbjogbHRyOyIgZGlyPSJsdHIiPlJlbmFtZSB0aGUgZm9sbG93aW5nIEFQSSdzPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJ1NlZ29lIFVJJzsgY29sb3I6IHJnYigwLCAwLCAwKTsgZGlyZWN0aW9uOiBsdHI7IiBkaXI9Imx0ciI+SEFMX0xURENfUmVsYW9kKCkgYnkgSEFMX0xURENfUmVsb2FkKCk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSSc7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGRpcmVjdGlvbjogbHRyOyIgZGlyPSJsdHIiPiZuYnNwOzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJ1NlZ29lIFVJJzsgY29sb3I6IHJnYigwLCAwLCAwKTsgZGlyZWN0aW9uOiBsdHI7IiBkaXI9Imx0ciI+SEFMX0xURENfU3RydWN0SW5pdEZyb21WaWRlb0NvbmZpZygpIGJ5IEhBTF9MVERDRXhfU3RydWN0SW5pdEZyb21WaWRlb0NvbmZpZygpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknOyBjb2xvcjogcmdiKDAsIDAsIDApOyBkaXJlY3Rpb246IGx0cjsiIGRpcj0ibHRyIj5IQUxfTFREQ19TdHJ1Y3RJbml0RnJvbUFkYXB0ZWRDb21tYW5kQ29uZmlnKCkgYnkgSEFMX0xURENFeF9TdHJ1Y3RJbml0RnJvbUFkYXB0ZWRDb21tYW5kQ29uZmlnKCk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJ1NlZ29lIFVJJzsgY29sb3I6IHJnYigwLCAwLCAwKTsgZGlyZWN0aW9uOiBsdHI7IiBkaXI9Imx0ciI+QWRkIG5ldyBkZWZpbmVzIGZvciBMVERDIGxheWVycyAoTFREQ19MQVlFUl8xIC8gTFREQ19MQVlFUl8yKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJ1NlZ29lIFVJJzsgY29sb3I6IHJnYigwLCAwLCAwKTsgZGlyZWN0aW9uOiBsdHI7IiBkaXI9Imx0ciI+UmVtb3ZlIHVudXNlZCBhc3NlcnRzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVU0I8L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+IDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPlBDRDwvc3Bhbj4gPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkZsdXNoIGFsbCBUWCBGSUZPcyBvbiBVU0IgUmVzZXQ8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZSBMb2NrIG1lY2hhbmlzbSBmcm9tIEhBTF9QQ0RfRVBfVHJhbnNtaXQoKSBhbmQgSEFMX1BDRF9FUF9SZWNlaXZlKCkgQVBJJ3M8L3NwYW4+PC9saT48L3VsPjwvdWw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSSc7IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGRpcmVjdGlvbjogbHRyOyIgZGlyPSJsdHIiPjwvc3Bhbj48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFVTQjwvc3Bhbj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4gPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkVuYWJsZSBETUEgQnVyc3QgbW9kZSBmb3IgVVNCIE9URyBIUzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+Rml4IFNEIGNhcmQgZGV0ZWN0aW9uIGlzc3VlPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFNETU1DPC9zcGFuPjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgbmV3IFNETU1DX0NtZFNERXJhc2VTdGFydEFkZCwgU0RNTUNfQ21kU0RFcmFzZUVuZEFkZCwgU0RNTUNfQ21kT3BDb25kaXRpb24gYW5kIFNETU1DX0NtZFN3aXRjaCBmdW5jdGlvbnM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssc2Fucy1zZXJpZjsgY29sb3I6IHJnYigwLCAzMiwgODIpOyIgbGFuZz0iRU4tVVMiPjxzcGFuIHN0eWxlPSIiPjwvc3Bhbj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNi4wIC8gMDQtTm92ZW1iZXItMjAxNjwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAKLTx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+QWRkPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+c3VwcG9ydCBvZjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj48Yj5TVE0zMkY0MTN4eCBhbmQmbmJzcDs8L2I+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij48Yj5TVE0zMkY0MjN4eDwvYj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPiBkZXZpY2VzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5HZW5lcmFsIHVwZGF0ZXMgdG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENBTjwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSB0byBhZGQgdGhlIHN1cHBvcnQgb2YgMyBDQU4gbWFuYWdlbWVudDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ1JZUDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSB0byBhZGQgdGhlIHN1cHBvcnQgb2YgQUVTIGZlYXR1cmVzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBERlNETTwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+QWRkIGRlZmluaXRpb25zIGZvciBuZXcgZXh0ZXJuYWwgdHJpZ2dlciBmaWx0ZXJzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5BZGQgZGVmaW5pdGlvbiBmb3IgbmV3IENoYW5uZWxzIDQsIDUsIDYgYW5kIDc8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+QWRkIGZ1bmN0aW9ucyBhbmQgQVBJIGZvciBGaWx0ZXIgc3RhdGUgY29uZmlndXJhdGlvbiBhbmQgbWFuYWdlbWVudDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBmdW5jdGlvbnM6Jm5ic3A7PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkhBTF9ERlNETV9CaXRzdHJlYW1DbG9ja19TdGFydCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkhBTF9ERlNETV9CaXRzdHJlYW1DbG9ja19TdG9wKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkhBTF9ERlNETV9CaXRTdHJlYW1DbGtEaXN0cmlidXRpb25fQ29uZmlnKCkmbmJzcDs8L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRE1BPC9zcGFuPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5BZGQgdGhlIHN1cHBvcnQgb2YgRE1BIENoYW5uZWxzIGZyb20gOCB0byAxNTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+VXBkYXRlIEhBTF9ETUFfRGVJbml0KCkgZnVuY3Rpb24gd2l0aCB0aGUgY2hlY2sgb24gRE1BIHN0cmVhbSBpbnN0YW5jZTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgRFNJPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+Jm5ic3A7dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IG1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBjaXJjbGU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSEFMX0RTSV9Db25maWdIb3N0VGltZW91dHMoKSBhbmQgSEFMX0RTSV9Jbml0KCkgZnVuY3Rpb25zIHRvIGF2b2lkIHNjcmF0Y2ggaW4gRFNJX0NDUiByZWdpc3Rlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgRkxBU0g8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij4gdXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IG1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBjaXJjbGU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5FbmhhbmNlIEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb248L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgX19IQUxfRkxBU0hfR0VUX0ZMQUcoKSBtYWNybyBpbXBsZW1lbnRhdGlvbjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdQSU88L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5BZGQgc3BlY2lmaWMgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBkZWZpbml0aW9uczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgSTJDIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEkyQ19ETUFFcnJvcigpIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIHRvIGlnbm9yZSBETUEgRklGTyBlcnJvcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgSTJTIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+RW5oYW5jZSBIQUxfSTJTX0luaXQoKSBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0IG9uIFBDTV9TSE9SVCBhbmQgUENNX0xPTkcgc3RhbmRhcmRzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgSVJEQTwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBmdW5jdGlvbnMgYW5kIGNhbGwgYmFja3MgZm9yIFRyYW5zZmVyIEFib3J0PG86cD48L286cD48L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFRyYW5zbWl0KCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTF9JUkRBX0Fib3J0UmVjZWl2ZSgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydF9JVCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjaygpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgUENEPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiA8L3NwYW4+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEhBTF9QQ0RfR2V0UnhDb3VudCgpICZuYnNwO2Z1bmN0aW9uIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5VcGRhdGUgX19IQUxfUkNDX0hTRV9DT05GSUcoKSBtYWNybyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+VXBkYXRlPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+X19IQUxfUkNDX0xTRV9DT05GSUcoKSBtYWNybyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIFNNQVJUQ0FSRDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkFkZCBuZXcgZnVuY3Rpb25zIGFuZCBjYWxsIGJhY2tzIGZvciBUcmFuc2ZlciBBYm9ydDxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+U01BUlRDQVJEX0Fib3J0VHJhbnNtaXQoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydFJlY2VpdmUoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydF9JVCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+U01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+U01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUSU08L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+VXBkYXRlIEhBTF9USU1FeF9SZW1hcENvbmZpZygpIGZ1bmN0aW9uIHRvIG1hbmFnZSBUSU0gaW50ZXJuYWwgdHJpZ2dlciByZW1hcDogTFBUSU0gb3IgVElNM19UUkdPPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVQVJUPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+QWRkIFRyYW5zZmVyIGFib3J0IGZ1bmN0aW9ucyBhbmQgY2FsbGJhY2tzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVU0FSVDxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPkFkZCBUcmFuc2ZlciBhYm9ydCBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrczwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS41LjIgLyAyMi1TZXB0ZW1iZXItMjAxNjwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KKzx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+QWRkPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+c3VwcG9ydCBvZjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj48Yj5TVE0zMkY0MTN4eCBhbmQmbmJzcDs8L2I+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij48Yj5TVE0zMkY0MjN4eDwvYj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPiBkZXZpY2VzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5HZW5lcmFsIHVwZGF0ZXMgdG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENBTjwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSB0byBhZGQgdGhlIHN1cHBvcnQgb2YgMyBDQU4gbWFuYWdlbWVudDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ1JZUDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSB0byBhZGQgdGhlIHN1cHBvcnQgb2YgQUVTIGZlYXR1cmVzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBERlNETTwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+QWRkIGRlZmluaXRpb25zIGZvciBuZXcgZXh0ZXJuYWwgdHJpZ2dlciBmaWx0ZXJzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5BZGQgZGVmaW5pdGlvbiBmb3IgbmV3IENoYW5uZWxzIDQsIDUsIDYgYW5kIDc8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+QWRkIGZ1bmN0aW9ucyBhbmQgQVBJIGZvciBGaWx0ZXIgc3RhdGUgY29uZmlndXJhdGlvbiBhbmQgbWFuYWdlbWVudDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBmdW5jdGlvbnM6Jm5ic3A7PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkhBTF9ERlNETV9CaXRzdHJlYW1DbG9ja19TdGFydCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkhBTF9ERlNETV9CaXRzdHJlYW1DbG9ja19TdG9wKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPkhBTF9ERlNETV9CaXRTdHJlYW1DbGtEaXN0cmlidXRpb25fQ29uZmlnKCkmbmJzcDs8L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRE1BPC9zcGFuPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5BZGQgdGhlIHN1cHBvcnQgb2YgRE1BIENoYW5uZWxzIGZyb20gOCB0byAxNTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+VXBkYXRlIEhBTF9ETUFfRGVJbml0KCkgZnVuY3Rpb24gd2l0aCB0aGUgY2hlY2sgb24gRE1BIHN0cmVhbSBpbnN0YW5jZTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgRFNJPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+Jm5ic3A7dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IG1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBjaXJjbGU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSEFMX0RTSV9Db25maWdIb3N0VGltZW91dHMoKSBhbmQgSEFMX0RTSV9Jbml0KCkgZnVuY3Rpb25zIHRvIGF2b2lkIHNjcmF0Y2ggaW4gRFNJX0NDUiByZWdpc3Rlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgRkxBU0g8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij4gdXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IG1hcmdpbi10b3A6IDBjbTsgbGlzdC1zdHlsZS10eXBlOiBjaXJjbGU7Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5FbmhhbmNlIEZMQVNIX1dhaXRGb3JMYXN0T3BlcmF0aW9uKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb248L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgX19IQUxfRkxBU0hfR0VUX0ZMQUcoKSBtYWNybyBpbXBsZW1lbnRhdGlvbjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdQSU88L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5BZGQgc3BlY2lmaWMgYWx0ZXJuYXRlIGZ1bmN0aW9ucyBkZWZpbml0aW9uczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgSTJDIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEkyQ19ETUFFcnJvcigpIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIHRvIGlnbm9yZSBETUEgRklGTyBlcnJvcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwgSTJTIDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+RW5oYW5jZSBIQUxfSTJTX0luaXQoKSBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0IG9uIFBDTV9TSE9SVCBhbmQgUENNX0xPTkcgc3RhbmRhcmRzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgSVJEQTwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBmdW5jdGlvbnMgYW5kIGNhbGwgYmFja3MgZm9yIFRyYW5zZmVyIEFib3J0PG86cD48L286cD48L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFRyYW5zbWl0KCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTF9JUkRBX0Fib3J0UmVjZWl2ZSgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydF9JVCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFRyYW5zbWl0X0lUKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydENwbHRDYWxsYmFjaygpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUwgUENEPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiA8L3NwYW4+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEhBTF9QQ0RfR2V0UnhDb3VudCgpICZuYnNwO2Z1bmN0aW9uIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7Ij5VcGRhdGUgX19IQUxfUkNDX0hTRV9DT05GSUcoKSBtYWNybyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+VXBkYXRlPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+X19IQUxfUkNDX0xTRV9DT05GSUcoKSBtYWNybyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIFNNQVJUQ0FSRDwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkFkZCBuZXcgZnVuY3Rpb25zIGFuZCBjYWxsIGJhY2tzIGZvciBUcmFuc2ZlciBBYm9ydDxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+U01BUlRDQVJEX0Fib3J0VHJhbnNtaXQoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydFJlY2VpdmUoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydF9JVCgpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+U01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydENwbHRDYWxsYmFjaygpPG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogd2luZG93dGV4dDsiIGxhbmc9IkVOLVVTIj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+U01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMXzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHdpbmRvd3RleHQ7IiBsYW5nPSJFTi1VUyI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlNNQVJUQ0FSRF9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUSU08L3NwYW4+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+VXBkYXRlIEhBTF9USU1FeF9SZW1hcENvbmZpZygpIGZ1bmN0aW9uIHRvIG1hbmFnZSBUSU0gaW50ZXJuYWwgdHJpZ2dlciByZW1hcDogTFBUSU0gb3IgVElNM19UUkdPPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVQVJUPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyI+QWRkIFRyYW5zZmVyIGFib3J0IGZ1bmN0aW9ucyBhbmQgY2FsbGJhY2tzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVU0FSVDxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZmxvYXQ6IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsiPkFkZCBUcmFuc2ZlciBhYm9ydCBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrczwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS41LjIgLyAyMi1TZXB0ZW1iZXItMjAxNjwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAKIDx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkZpeCB3cm9uZwpAQCAtMTU1Myw3ICsxNjEwLDcgQEAKIDxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSTJDIEFQSSdzIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+KFBvbGxpbmcsIElUIGFuZCBETUEgaW50ZXJmYWNlcyk8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPiB0byBtYW5hZ2UgSTJDIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+WGZlclNpemUgYW5kJm5ic3A7WGZlckNvdW50PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj4gaGFuZGxlIHBhcmFtZXRlcnMgaW5zdGVhZCBvZiBBUEkgc2l6ZSBwYXJhbWV0ZXIgdG8gaGVscCB1c2VyIHRvIGdldCBpbmZvcm1hdGlvbiBvZiBjb3VudGVyIGluIGNhc2Ugb2YgZXJyb3IuJm5ic3A7PC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij4KIAogPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBBYm9ydCBmdW5jdGlvbmFsaXR5IHRvIG1hbmFnZSBETUEgdXNlCi1jYXNlPC9zcGFuPjwvcD48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRk1QSTJDPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5VcGRhdGUgdG8gZGlzYWJsZSBPd24gQWRkcmVzczwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij4gYmVmb3JlJm5ic3A7c2V0dGluZyB0aGUgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5uZXcgT3duIEFkZHJlc3M8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPiBjb25maWd1cmF0aW9uOjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPlVwZGF0ZSBIQUxfRk1QSTJDX0luaXQoKSB0byBkaXNhYmxlIEZNUEkyQ19PQVJ4X0VOIGJpdCBiZWZvcmUgYW55IGNvbmZpZ3VyYXRpb24gaW4gT0FSeCByZWdpc3RlcnM8L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ0FOIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5VcGRhdGUgQ0FOIHJlY2VpdmUgcHJvY2Vzc2VzIHRvIHNldCBDQU4gUnhNc2cgRklGT051bWJlciBwYXJhbWV0ZXI8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFVBUlQgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPlVwZGF0ZSZuYnNwO1VBUlQgaGFuZGxlIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+VHhYZmVyQ291bnQgYW5kIFJ4WGZlckNvdW50IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+cGFyYW1ldGVycyBhcyB2b2xhdGlsZSB0byBhdm9pZCBldmVudHVhbCZuYnNwO2lzc3VlIHdpdGggSGlnaCBTcGVlZCBvcHRpbWl6YXRpb24gJm5ic3A7PC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjUuMSAvIDAxLUp1bHktMjAxNjwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KK2Nhc2U8L3NwYW4+PC9wPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTVBJMkM8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPlVwZGF0ZSB0byBkaXNhYmxlIE93biBBZGRyZXNzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPiBiZWZvcmUmbmJzcDtzZXR0aW5nIHRoZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPm5ldyBPd24gQWRkcmVzczwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+IGNvbmZpZ3VyYXRpb246PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+VXBkYXRlIEhBTF9GTVBJMkNfSW5pdCgpIHRvIGRpc2FibGUgRk1QSTJDX09BUnhfRU4gYml0IGJlZm9yZSBhbnkgY29uZmlndXJhdGlvbiBpbiBPQVJ4IHJlZ2lzdGVyczwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDQU4gPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPlVwZGF0ZSBDQU4gcmVjZWl2ZSBwcm9jZXNzZXMgdG8gc2V0IENBTiBSeE1zZyBGSUZPTnVtYmVyIHBhcmFtZXRlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVUFSVCA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+VXBkYXRlJm5ic3A7VUFSVCBoYW5kbGUgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5UeFhmZXJDb3VudCBhbmQgUnhYZmVyQ291bnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5wYXJhbWV0ZXJzIGFzIHZvbGF0aWxlIHRvIGF2b2lkIGV2ZW50dWFsJm5ic3A7aXNzdWUgd2l0aCBIaWdoIFNwZWVkIG9wdGltaXphdGlvbiAmbmJzcDs8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNS4xIC8gMDEtSnVseS0yMDE2PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgogQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD4KIAogPHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR1BJTzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+SEFMX0dQSU9fSW5pdCgpL0hBTF9HUElPX0RlSW5pdCgpIEFQSSdzOiB1cGRhdGUmbmJzcDtHUElPX0dFVF9JTkRFWCgpIG1hY3JvIGltcGxlbWVudGF0aW9uIHRvIHN1cHBvcnQgYWxsIEdQSU8nczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU1BJPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5GaXggcmVncmVzc2lvbiBpc3N1ZTogcmV0b3JlJm5ic3A7SEFMX1NQSV9ETUFQYXVzZSgpIGFuZCBIQUxfU1BJX0RNQVJlc3VtZSgpJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5BUEknczwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigzMSwgNzMsIDEyNSk7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJDQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+Rml4IEZTTUMgbWFjcm9zIGNvbXBpbGF0aW9uIHdhcm5pbmdzIHdpdGggU1RNMzJGNDEyUnggZGV2aWNlczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRE1BIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij5IQUxfRE1BX1BvbGxGb3J0cmFuc2ZlcigpIEFQSSBjbGVhbiB1cCA8YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBQUFAgPC9zcGFuPnVwZGF0ZShQUFAgcmVmZXJzIHRvIElSREEsIFVBUlQsIFVTQVJUIGFuZCBTTUFSVENBUkQpPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+VXBkYXRlIEhBTF9QUFBfSVJRSGFuZGxlcigpIHRvIGFkZCBhIGNoZWNrIG9uIGludGVycnVwdCBzb3VyY2UgYmVmb3JlIG1hbmFnaW5nIHRoZSBlcnJvcjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7OyBjb2xvcjogcmdiKDMxLCA3MywgMTI1KTsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0iIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OzsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiA3cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZS1hZGp1c3Q6IG5vbmU7IGZvbnQtc3RyZXRjaDogbm9ybWFsOyI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMzEsIDczLCAxMjUpOyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPgpAQCAtMTU2Miw3ICsxNjE5LDcgQEAKIDx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMy4zMzMzcHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFFTUEkgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPkltcGxlbWVudAogd29ya2Fyb3VuZCB0byBmaXggdGhlIGxpbWl0YXRpb24mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsgY29sb3I6IGJsYWNrOyIgbGFuZz0iRU4tVVMiPnByb25vdW5jZWQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMTsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7Ij4gaW4gdGhlJm5ic3A7RXJyYXRhCiBzaGVldCZuYnNwOzIuMS44IHNlY3Rpb246IEluIHNvbWUgc3BlY2lmaWMgY2FzZXMsIERNQTIgZGF0YSBjb3JydXB0aW9uCi1vY2N1cnMgd2hlbiBtYW5hZ2luZyBBSEIgYW5kIEFQQjIgcGVyaXBoZXJhbHMgaW4gYSBjb25jdXJyZW50IHdheTwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS41LjAgLyAwNi1NYXktMjAxNjwvc3Bhbj48L2gzPgorb2NjdXJzIHdoZW4gbWFuYWdpbmcgQUhCIGFuZCBBUEIyIHBlcmlwaGVyYWxzIGluIGEgY29uY3VycmVudCB3YXk8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNS4wIC8gMDYtTWF5LTIwMTY8L3NwYW4+PC9oMz4KIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAKQEAgLTE2MTMsNyArMTY3MCw3IEBACiAgICAgIGRldmljZXM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj4gdG8gcHJvdmlkZSZuYnNwO3RoZSBwb3NzaWJpbGl0eSB0byBjb252ZXJ0IFZyZWZJbnQgY2hhbm5lbCB3aGVuIGJvdGgKICAgICAgVnJlZkludCBhbmQgVmJhdCBjaGFubmVscyBhcmUgc2VsZWN0ZWQuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTUERJRlJYPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+T3ZlcmFsbCBkcml2ZXIgdXBkYXRlIGZvciB3YWl0IG9uIGZsYWcgbWFuYWdlbWVudCBvcHRpbWl6YXRpb248c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBXV0RHPHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGUmbmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+T3ZlcmFsbCByZXdvcmsgb2YgdGhlIGRyaXZlciBmb3IgbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb248L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+UmVtb3ZlIHRoZSBmb2xsb3dpbmcgQVBJczo8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfU3RhcnQoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfU3RhcnRfSVQoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfTXNwRGVJbml0KCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX0dldFN0YXRlKCk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIGltcGxlbWVudGF0aW9uOjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfV1dER19Jbml0KCk8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QSZuYnNwO25ldyBwYXJhbWV0ZXIgaW4gdGhlIEluaXQgU3RydWN0dXJlOiZuYnNwO0VXSU1vZGU8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfTXNwSW5pdCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfV1dER19SZWZyZXNoKCkmbmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VGhpcyBmdW5jdGlvbiBpbnN1cmVzIHRoZSByZWxvYWQgb2YgdGhlIGNvdW50ZXI8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlRoZSAiY291bnRlciIgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQ8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfSVJRSGFuZGxlcigpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKCkgaXMgdGhlIG5ldyBwcm90b3R5cGUgb2YgSEFMX1dXREdfV2FrZVVwQ2FsbGJhY2soKTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5SZWZlciB0byB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZXM6IFdXREdfRXhhbXBsZTwvc3Bhbj48L2xpPjwvdWw+PC91bD4KIAotPGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNC40IC8gMjItSmFudWFyeS0yMDE2PC9zcGFuPjwvaDM+Cis8aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS40LjQgLyAyMi1KYW51YXJ5LTIwMTY8L3NwYW4+PC9oMz4KIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij4KIApAQCAtMTgyNSwxMSArMTg4MiwxMSBAQAogPC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPgogCiA8c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSB0aGUgRlNNQ19OT1JTUkFNX0luaXQoKSBmdW5jdGlvbiB0byB1c2UKLUJ1cnN0QWNjZXNzTW9kZSBmaWVsZCBwcm9wZXJseTwvc3Bhbj48L2xpPjwvdWw+PC91bD48YnI+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNC40IC8gMTEtRGVjZW1iZXItMjAxNTwvc3Bhbj48L2gzPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+PC9zcGFuPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCitCdXJzdEFjY2Vzc01vZGUgZmllbGQgcHJvcGVybHk8L3NwYW4+PC9saT48L3VsPjwvdWw+PGJyPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjQuNCAvIDExLURlY2VtYmVyLTIwMTU8L3NwYW4+PC9oMz48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPjwvc3Bhbj48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgogQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR2VuZXJpYyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUwgCiB3ZWFrIGVtcHR5IGNhbGxiYWNrcyB0byBwcmV2ZW50IHVudXNlZCBhcmd1bWVudCBjb21waWxhdGlvbiB3YXJuaW5ncyB3aXRoIHNvbWUgCiBjb21waWxlcnMgYnkgY2FsbGluZyB0aGUgZm9sbG93aW5nIGxpbmU6PC9zcGFuPgotPC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VU5VU0VEKGhwcHApOzwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+U1RNMzJGeHh4X1VzZXJfTWFudWFsLmNobSBmaWxlcyByZWdlbmVyYXRlZCBmb3IgSEFMIFYxLjQuMzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEVUSDwvc3Bhbj4gdXBkYXRlJm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfRVRIX0luaXQoKSBmdW5jdGlvbiB0byBhZGQgdGltZW91dCBvbiB0aGUgU29mdHdhcmUgcmVzZXQgbWFuYWdlbWVudDwvc3Bhbj48YnI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij48L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNC4yIC8gMTAtTm92ZW1iZXItMjAxNTwvc3Bhbj48L2gzPgorPC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VU5VU0VEKGhwcHApOzwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+U1RNMzJGeHh4X1VzZXJfTWFudWFsLmNobSBmaWxlcyByZWdlbmVyYXRlZCBmb3IgSEFMIFYxLjQuMzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEVUSDwvc3Bhbj4gdXBkYXRlJm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfRVRIX0luaXQoKSBmdW5jdGlvbiB0byBhZGQgdGltZW91dCBvbiB0aGUgU29mdHdhcmUgcmVzZXQgbWFuYWdlbWVudDwvc3Bhbj48YnI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij48L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNC4yIC8gMTAtTm92ZW1iZXItMjAxNTwvc3Bhbj48L2gzPgogCiAgICAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPk1haW4gQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CiAKQEAgLTE4NDIsNyArMTg5OSw3IEBACiBIQUwgd2VhayBlbXB0eSBjYWxsYmFja3MgdG8gcHJldmVudCB1bnVzZWQgYXJndW1lbnQgY29tcGlsYXRpb24KIHdhcm5pbmdzIHdpdGggc29tZSBjb21waWxlcnMgYnkgY2FsbGluZyB0aGUgZm9sbG93aW5nIGxpbmU6PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVOVVNFRChocHBwKTs8YnI+PGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPgogPHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENPUlRFWCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZSBkdXBsaWNhdGlvbiBmb3IgX19IQUxfQ09SVEVYX1NZU1RJQ0tDTEtfQ09ORklHKCkgbWFjcm88L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhBU0ggPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW5hbWUgSEFMX0hBU0hfU1RBVEVUeXBlRGVmIHRvIEhBTF9IQVNIX1N0YXRlVHlwZURlZjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbmFtZSBIQUxfSEFTSF9QaGFzZVR5cGVEZWYgdG8gSEFMX0hBU0hfUGhhc2VUeXBlRGVmPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJDQyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IG1hY3JvcyBfX0hBTF9SQ0NfPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPlBQUDwvc3Bhbj5fSVNfQ0xLX0VOQUJMRUQoKSB0byBjaGVjayBvbiBDbG9jayBlbmFibGUvZGlzYWJsZSBzdGF0dXM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIF9fSEFMX1JDQ19VU0JfT1RHX0ZTX0NMS19ESVNBQkxFKCkgbWFjcm8gdG8gcmVtb3ZlIHRoZSBkaXNhYmxlIGZvciB0aGUgU1lTQ0ZHPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBIQUxfUkNDX01DT0NvbmZpZygpIEFQSSB0byB1c2UgbmV3IGRlZmluZXMgZm9yIHRoZSBHUElPIFNwZWVkPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkdlbmVyaWMgdXBkYXRlIHRvIGltcHJvdmUgdGhlIFBMTCZuYnNwO1ZDTyBtaW4gdmFsdWUoMTAwTUh6KTogUExMTiwgUExMSTJTIGFuZCBQTExTQUkgbWluIHZhbHVlIGlzIDUwIGluc3RlYWQgb2YgMTkyPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRkxBU0ggPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IHJnYigyLCAzLCAyKTsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMS43cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAyMHB4OyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ij5fX0hBTF9GTEFTSF9JTlNUUlVDVElPTl9DQUNIRV9SRVNFVCgpIG1hY3JvOiB1cGRhdGUgdG8mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTEuN3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogMjBweDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyI+cmVzZXQgJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDExLjdweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDIwcHg7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsiPklDUlNUIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMS43cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiAyMHB4OyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ij5iaXQgaW4gdGhlIEFDUiByZWdpc3RlciBhZnRlciBzZXR0aW5nIGl0Ljwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogcmdiKDIsIDMsIDIpOyBmb250LWZhbWlseTogVmVyZGFuYTsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHN1cHBvcnQgdW50aWwgMTUgRkxBU0ggd2FpdCBzdGF0ZSAoRkxBU0hfTEFURU5DWV8xNSkgZm9yIFNUTTMyRjQ0Nnh4IGRldmljZXMgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+Ci08cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ1JZUCZuYnNwOzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9wPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfQ1JZUF9ERVNFQ0JfRGVjcnlwdCgpIEFQSSB0byBmaXggdGhlIGludmVydGVkIHBQbGFpbkRhdGEgYW5kIHBDeXBoZXJEYXRhIHBhcmFtZXRlcnMgaXNzdWU8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBJMlMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgSEFMX0kyU19Jbml0KCkgQVBJJm5ic3A7dG8gY2FsbCBfX0hBTF9SQ0NfSTJTX0NPTkZJRygpIG1hY3JvIHdoZW4gZXh0ZXJuYWwgSTJTIGNsb2NrIGlzIHNlbGVjdGVkPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgTFREQyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfTFREQ19TZXRXaW5kb3dQb3NpdGlvbigpIEFQSSZuYnNwO3RvIGNvbmZpZ3VyZSBJbW1lZGlhdGUmbmJzcDtyZWxvYWQmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5yZWdpc3RlciA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5pbnN0ZWFkIG9mIHZlcnRpY2FsIGJsYW5raW5nIHJlbG9hZCByZWdpc3Rlci48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUSU0gPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgSEFMX1RJTV9Db25maWdDbG9ja1NvdXJjZSgpIEFQSSB0byZuYnNwO2NoZWNrIG9ubHkgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnM8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBOQU5EIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9OQU5EX1JlYWRfUGFnZSgpL0hBTF9OQU5EX1dyaXRlX1BhZ2UoKS9IQUxfTkFORF9SZWFkX1NwYXJlQXJlYSgpIEFQSXMgdG8gbWFuYWdlIGNvcnJlY3RseSB0aGUgTkFORCBQYWdlIGFjY2Vzczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENBTiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0byB1c2UgIj0iIGluc3RlYWQgb2YgInw9IiB0byBjbGVhciBmbGFncyBpbiB0aGUgTVNSLCBUU1IsIFJGMFIgYW5kIFJGMVIgcmVnaXN0ZXJzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSENEIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Rml4IHR5cG8gaW4gX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIG1hY3JvIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUENEIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9QQ0RfSVJRSGFuZGxlcigpIEFQSSB0byBhdm9pZCBpc3N1ZSB3aGVuJm5ic3A7RE1BIG1vZGUgZW5hYmxlZCBmb3IgU3RhdHVzIFBoYXNlIElOIHN0YWdlPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBGTUMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdGhlIEZNQ19OT1JTUkFNX0V4dGVuZGVkX1RpbWluZ19Jbml0KCkgQVBJIHRvIHJlbW92ZSB0aGUgY2hlY2sgb24mbmJzcDtDTEtESXZpc29uIGFuZCBEYXRhTGF0ZW5jeSBwYXJhbWV0ZXJzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRoZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GTUNfTk9SU1JBTV9Jbml0KCkgQVBJIHRvIGFkZCBhIGNoZWNrIG9uIHRoZSBQYWdlU2l6ZSBwYXJhbWV0ZXIgZm9yIFNUTTMyRjQyLzQzeHggZGV2aWNlczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgRlNNQyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0aGUgRlNNQ19OT1JTUkFNX0V4dGVuZGVkX1RpbWluZ19Jbml0KCkgQVBJIHRvIHJlbW92ZSB0aGUgY2hlY2sgb24mbmJzcDtDTEtESXZpc29uIGFuZCBEYXRhTGF0ZW5jeSBwYXJhbWV0ZXJzPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjQuMSAvIDA5LU9jdG9iZXItMjAxNTwvc3Bhbj48L2gzPgorPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENSWVAmbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvcD48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgSEFMX0NSWVBfREVTRUNCX0RlY3J5cHQoKSBBUEkgdG8gZml4IHRoZSBpbnZlcnRlZCBwUGxhaW5EYXRhIGFuZCBwQ3lwaGVyRGF0YSBwYXJhbWV0ZXJzIGlzc3VlPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSTJTIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9JMlNfSW5pdCgpIEFQSSZuYnNwO3RvIGNhbGwgX19IQUxfUkNDX0kyU19DT05GSUcoKSBtYWNybyB3aGVuIGV4dGVybmFsIEkyUyBjbG9jayBpcyBzZWxlY3RlZDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIExUREMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgSEFMX0xURENfU2V0V2luZG93UG9zaXRpb24oKSBBUEkmbmJzcDt0byBjb25maWd1cmUgSW1tZWRpYXRlJm5ic3A7cmVsb2FkJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+cmVnaXN0ZXIgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+aW5zdGVhZCBvZiB2ZXJ0aWNhbCBibGFua2luZyByZWxvYWQgcmVnaXN0ZXIuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9USU1fQ29uZmlnQ2xvY2tTb3VyY2UoKSBBUEkgdG8mbmJzcDtjaGVjayBvbmx5IHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgTkFORCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfTkFORF9SZWFkX1BhZ2UoKS9IQUxfTkFORF9Xcml0ZV9QYWdlKCkvSEFMX05BTkRfUmVhZF9TcGFyZUFyZWEoKSBBUElzIHRvIG1hbmFnZSBjb3JyZWN0bHkgdGhlIE5BTkQgUGFnZSBhY2Nlc3M8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDQU4gPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gdXNlICI9IiBpbnN0ZWFkIG9mICJ8PSIgdG8gY2xlYXIgZmxhZ3MgaW4gdGhlIE1TUiwgVFNSLCBSRjBSIGFuZCBSRjFSIHJlZ2lzdGVyczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhDRCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkZpeCB0eXBvIGluIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19GQUxMSU5HX0VER0UoKSBtYWNybyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBDRCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfUENEX0lSUUhhbmRsZXIoKSBBUEkgdG8gYXZvaWQgaXNzdWUgd2hlbiZuYnNwO0RNQSBtb2RlIGVuYWJsZWQgZm9yIFN0YXR1cyBQaGFzZSBJTiBzdGFnZTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgRk1DIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRoZSBGTUNfTk9SU1JBTV9FeHRlbmRlZF9UaW1pbmdfSW5pdCgpIEFQSSB0byByZW1vdmUgdGhlIGNoZWNrIG9uJm5ic3A7Q0xLREl2aXNvbiBhbmQgRGF0YUxhdGVuY3kgcGFyYW1ldGVyczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0aGUgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Rk1DX05PUlNSQU1fSW5pdCgpIEFQSSB0byBhZGQgYSBjaGVjayBvbiB0aGUgUGFnZVNpemUgcGFyYW1ldGVyIGZvciBTVE0zMkY0Mi80M3h4IGRldmljZXM8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIEZTTUMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdGhlIEZTTUNfTk9SU1JBTV9FeHRlbmRlZF9UaW1pbmdfSW5pdCgpIEFQSSB0byByZW1vdmUgdGhlIGNoZWNrIG9uJm5ic3A7Q0xLREl2aXNvbiBhbmQgRGF0YUxhdGVuY3kgcGFyYW1ldGVyczwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS40LjEgLyAwOS1PY3RvYmVyLTIwMTU8L3NwYW4+PC9oMz4KIAogICAgICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZxdW90O3NlcmlmJnF1b3Q7OyI+PG86cD48L286cD48L3NwYW4+PC9wPgogCkBAIC0xODU5LDcgKzE5MTYsNyBAQAogSEFMX0RTSV9Gb3JjZVJYTG93UG93ZXIoKSwgSEFMX0RTSV9Gb3JjZURhdGFMYW5lc0luUlgoKSwKIEhBTF9EU0lfU2V0UHVsbERvd24oKSBhbmQgSEFMX0RTSV9TZXRDb250ZW50aW9uRGV0ZWN0aW9uT2ZmKCkgZnVuY3Rpb25zPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBEU0lfSFNfUE1fRU5BQkxFIGRlZmluZSB2YWx1ZTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5JbXBsZW1lbnQKIHdvcmthcm91bmQgZm9yIHRoZSBoYXJkd2FyZSBsaW1pdGF0aW9uOiCTVGhlIHRpbWUgdG8gYWN0aXZhdGUgdGhlIGNsb2NrCi1iZXR3ZWVuIEhTIHRyYW5zbWlzc2lvbnMgaXMgbm90IGNhbGN1bGF0ZWQgY29ycmVjdGx5lDwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS40LjAgLyAxNC1BdWd1c3QtMjAxNTwvc3Bhbj48L2gzPgorYmV0d2VlbiBIUyB0cmFuc21pc3Npb25zIGlzIG5vdCBjYWxjdWxhdGVkIGNvcnJlY3RseZQ8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuNC4wIC8gMTQtQXVndXN0LTIwMTU8L3NwYW4+PC9oMz4KIAogICAgICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZxdW90O3NlcmlmJnF1b3Q7OyI+PG86cD48L286cD48L3NwYW4+PC9wPgogCkBAIC0xODc2LDcgKzE5MzMsNyBAQAogSEFMX1BXUkV4X0VuYWJsZVdha2VVcFBpblBvbGFyaXR5RmFsbGluZ0VkZ2UoKSwgYXBwbGljYWJsZSBvbmx5IHRvIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjQ2OXh4IGFuZCBTVE0zMkY0Nzl4eCBkZXZpY2VzPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSVEMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEhBTF9SVENFeF9TZXRXYWtlVXBUaW1lcigpIGFuZCBIQUxfUlRDRXhfU2V0V2FrZVVwVGltZXJfSVQoKSBmdW5jdGlvbnMgdG8gcHJvcGVybHkgY2hlY2sgb24gdGhlIFdVVFdGIGZsYWc8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUSU0gPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5hZGQKIG5ldyBkZWZpbmVzIFRJTV9TWVNURU1CUkVBS0lOUFVUX0hBUkRGQVVMVCwmbmJzcDsKIFRJTV9TWVNURU1CUkVBS0lOUFVUX1BWRCBhbmQgVElNX1NZU1RFTUJSRUFLSU5QVVRfSEFSREZBVUxUX1BWRCwKLWFwcGxpY2FibGUgb25seSB0byBTVE0zMkY0MTB4eCBkZXZpY2VzPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjMuMiAvIDI2LUp1bmUtMjAxNTwvc3Bhbj48L2gzPgorYXBwbGljYWJsZSBvbmx5IHRvIFNUTTMyRjQxMHh4IGRldmljZXM8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMy4yIC8gMjYtSnVuZS0yMDE1PC9zcGFuPjwvaDM+CiAKICAgICAgICAgICAgIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyI+TWFpbiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OywmcXVvdDtzZXJpZiZxdW90OzsiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KIApAQCAtMTg5Nyw3ICsxOTU0LDcgQEAKIGZvciB0aGUgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSBwYXJhbWV0ZXIgaW4gdGhlIEFEQ19Jbml0VHlwZURlZgogc3RydWN0dXJlIHRvIHNlbGVjdCB0aGUgQURDIHNvZnR3YXJlIHRyaWdnZXIgbW9kZS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTEFTSCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkZMQVNIX09CX0dldFJEUCgpIEFQSSB1cGRhdGUgdG8gcmV0dXJuIHVpbnQ4X3QgaW5zdGVhZCBvZiBGbGFnU3RhdHVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Jm5ic3A7X19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSBuZXcgbWFjcm8gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+YWRkIHRvIGdldCB0aGUgZmxhc2ggbGF0ZW5jeTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNQSSA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkZpeCB0aGUgd3JvbmcgZGVmaW5pdGlvbiBvZiBIQUxfU1BJX0VSUk9SX0ZMQUcgbGl0ZXJhbDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyUyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9JMlNfVHJhbnNtaXQoKSBBUEkgdXBkYXRlIHRvIGNoZWNrIG9uIGJ1c3kgZmxhZyBvbmx5IGZvciBJMlMgc2xhdmUgbW9kZTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENSQyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPl9fSEFMX0NSQ19TRVRfSURSKCkgbWFjcm8gaW1wbGVtZW50YXRpb24gY2hhbmdlIHRvIHVzZSBXUklURV9SRUcoKSBpbnN0ZWFkIG9mIE1PRElGWV9SRUcoKTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQTJEIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0RNQTJEX0NvbmZpZ0xheWVyKCkgQVBJIHVwZGF0ZSB0byB1c2UgIj0iIGluc3RlYWQgb2YgInw9IiB0byBlcmFzZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5CR0NPTFIgYW5kPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+IEZHQ09MUiByZWdpc3RlcnMgYmVmb3JlIHNldHRpbmcgdGhlIG5ldyBjb25maWd1cmF0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSEFTSCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIXzxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPk1PREU8L3NwYW4+X1N0YXJ0X0lUKCkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPig8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5NT0RFIDwvc3Bhbj5zdGFuZHMgZm9yIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+TUQ1LCBTSEExLCBTSEEyMjQgYW5kIFNIQTM2KSB1cGRhdGVzOjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GaXgmbmJzcDtwcm9jZXNzaW5nIGZhaWwgZm9yIHNtYWxsIGlucHV0IGJ1ZmZlcnM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUKIHRvIHVubG9jayB0aGUgcHJvY2VzcyBhbmQgY2FsbCZuYnNwO3JldHVybiBIQUxfT0smbmJzcDthdCB0aGUgZW5kIG9mIEhBU0gKLXByb2Nlc3NpbmcgdG8gYXZvaWQgaW5jb3JyZWN0bHkgcmVwZWF0aW5nIHNvZnR3YXJlPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHByb3Blcmx5IG1hbmFnZSB0aGUgSGFzaElUQ291bnRlcjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0byBjYWxsIHRoZSBIQUxfSEFTSF9JbkNwbHRDYWxsYmFjaygpIGF0IHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRlIGJ1ZmZlciBpbnN0ZWFkIG9mPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+IGV2ZXJ5IGVhY2ggNTEyIGJpdHMgPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5fX0hBTF9IQVNIX0dFVF9GTEFHKCkgdXBkYXRlIHRvICZuYnNwO2NoZWNrIHRoZSByaWdodCByZWdpc3RlciB3aGVuIHRoZSBESU5ORSBmbGFnICZuYnNwO2lzIHNlbGVjdGVkPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlKCkgdXBkYXRlczo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIGEmbmJzcDtjYWxsIHRvIHRoZSBuZXcgSVNfSEFTSF9TSEExX0JVRkZFUl9TSVpFKCkgbWFjcm8gdG8gY2hlY2sgdGhlIHNpemUgcGFyYW1ldGVyLiZuYnNwOzwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCB0aGUgZm9sbG93aW5nIG5vdGUgaW4gQVBJIGRlc2NyaXB0aW9uPC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEyMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPiZuYnNwOyogQG5vdGUmbmJzcDsgSW5wdXQgYnVmZmVyIHNpemUgaW4gYnl0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgb3RoZXJ3aXNlIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvZGl2Pjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSVEMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gZGVmaW5lJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+aGFyZHdhcmUgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5pbmRlcGVuZGVudCBsPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+aXRlcmFscyBuYW1lczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Ojwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW5hbWUgUlRDX1RBTVBFUlBJTl9QQzEzIGJ5ICZuYnNwO1JUQ19UQU1QRVJQSU5fREVGQVVMVDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbmFtZSBSVENfVEFNUEVSUElOX1BBMCBieSBSVENfVEFNUEVSUElOX1BPUzE8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW5hbWUgUlRDX1RBTVBFUlBJTl9QSTggYnkgUlRDX1RBTVBFUlBJTl9QT1MxPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVuYW1lIFJUQ19USU1FU1RBTVBQSU5fUEMxMyBieSBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQ8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW5hbWUgUlRDX1RJTUVTVEFNUFBJTl9QQTAgYnkgUlRDX1RJTUVTVEFNUFBJTl9QT1MxPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVuYW1lIFJUQ19USU1FU1RBTVBQSU5fUEk4IGJ5IFJUQ19USU1FU1RBTVBQSU5fUE9TMTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEVUSCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZSBkdXBsaWNhdGVkJm5ic3A7SVNfRVRIX0RVUExFWF9NT0RFKCkgYW5kIElTX0VUSF9SWF9NT0RFKCkgbWFjcm9zPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVtb3ZlIGlsbGVnYWwgc3BhY2UgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9GTFVTSElORyBtYWNybzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1hYWCBkZWZpbmVkIHZhbHVlcyAoWFhYIGNhbiBiZSBJRExFLCBSRUFESU5HX0RBVEEgYW5kIFJFQURJTkdfU1RBVFVTKTxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBQQ0QgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfUENEX0lSUUhhbmRsZXIgQVBJOiBmaXggdGhlIGJhZCBDb25maWd1cmF0aW9uIG9mIFR1cm5hcm91bmQgVGltZTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhDRCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0byB1c2UgbG9jYWwgdmFyaWFibGUmbmJzcDtpbiBVU0IgSG9zdCBjaGFubmVsIHJlLWFjdGl2YXRpb248L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIEZNQyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkZNQ19TRFJBTV9TZW5kQ29tbWFuZCgpIEFQSTogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZTogcmV0dXJuIEhBTF9FUlJPUjs8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFVTQiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVTQl9GbHVzaFR4RmlmbyZuYnNwO0FQSTogdXBkYXRlIHRvIGZsdXNoIGFsbCBUeCBGSUZPPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHVzZSBsb2NhbCB2YXJpYWJsZSZuYnNwO2luIFVTQiBIb3N0IGNoYW5uZWwgcmUtYWN0aXZhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4zLjEgLyAyNS1NYXJzLTIwMTU8L3NwYW4+PC9oMz4KK3Byb2Nlc3NpbmcgdG8gYXZvaWQgaW5jb3JyZWN0bHkgcmVwZWF0aW5nIHNvZnR3YXJlPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHByb3Blcmx5IG1hbmFnZSB0aGUgSGFzaElUQ291bnRlcjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0byBjYWxsIHRoZSBIQUxfSEFTSF9JbkNwbHRDYWxsYmFjaygpIGF0IHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRlIGJ1ZmZlciBpbnN0ZWFkIG9mPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+IGV2ZXJ5IGVhY2ggNTEyIGJpdHMgPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5fX0hBTF9IQVNIX0dFVF9GTEFHKCkgdXBkYXRlIHRvICZuYnNwO2NoZWNrIHRoZSByaWdodCByZWdpc3RlciB3aGVuIHRoZSBESU5ORSBmbGFnICZuYnNwO2lzIHNlbGVjdGVkPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlKCkgdXBkYXRlczo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIGEmbmJzcDtjYWxsIHRvIHRoZSBuZXcgSVNfSEFTSF9TSEExX0JVRkZFUl9TSVpFKCkgbWFjcm8gdG8gY2hlY2sgdGhlIHNpemUgcGFyYW1ldGVyLiZuYnNwOzwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCB0aGUgZm9sbG93aW5nIG5vdGUgaW4gQVBJIGRlc2NyaXB0aW9uPC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEyMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPiZuYnNwOyogQG5vdGUmbmJzcDsgSW5wdXQgYnVmZmVyIHNpemUgaW4gYnl0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgb3RoZXJ3aXNlIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvZGl2Pjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSVEMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gZGVmaW5lJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+aGFyZHdhcmUgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj5pbmRlcGVuZGVudCBsPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+aXRlcmFscyBuYW1lczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Ojwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW5hbWUgUlRDX1RBTVBFUlBJTl9QQzEzIGJ5ICZuYnNwO1JUQ19UQU1QRVJQSU5fREVGQVVMVDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbmFtZSBSVENfVEFNUEVSUElOX1BBMCBieSBSVENfVEFNUEVSUElOX1BPUzE8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW5hbWUgUlRDX1RBTVBFUlBJTl9QSTggYnkgUlRDX1RBTVBFUlBJTl9QT1MxPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVuYW1lIFJUQ19USU1FU1RBTVBQSU5fUEMxMyBieSBSVENfVElNRVNUQU1QUElOX0RFRkFVTFQ8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW5hbWUgUlRDX1RJTUVTVEFNUFBJTl9QQTAgYnkgUlRDX1RJTUVTVEFNUFBJTl9QT1MxPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVuYW1lIFJUQ19USU1FU1RBTVBQSU5fUEk4IGJ5IFJUQ19USU1FU1RBTVBQSU5fUE9TMTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEVUSCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZSBkdXBsaWNhdGVkJm5ic3A7SVNfRVRIX0RVUExFWF9NT0RFKCkgYW5kIElTX0VUSF9SWF9NT0RFKCkgbWFjcm9zPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVtb3ZlIGlsbGVnYWwgc3BhY2UgRVRIX01BQ19SRUFEQ09OVFJPTExFUl9GTFVTSElORyBtYWNybzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBFVEhfTUFDX1JFQURDT05UUk9MTEVSX1hYWCBkZWZpbmVkIHZhbHVlcyAoWFhYIGNhbiBiZSBJRExFLCBSRUFESU5HX0RBVEEgYW5kIFJFQURJTkdfU1RBVFVTKTxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBQQ0QgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfUENEX0lSUUhhbmRsZXIgQVBJOiBmaXggdGhlIGJhZCBDb25maWd1cmF0aW9uIG9mIFR1cm5hcm91bmQgVGltZTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhDRCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0byB1c2UgbG9jYWwgdmFyaWFibGUmbmJzcDtpbiBVU0IgSG9zdCBjaGFubmVsIHJlLWFjdGl2YXRpb248L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIEZNQyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkZNQ19TRFJBTV9TZW5kQ29tbWFuZCgpIEFQSTogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZTogcmV0dXJuIEhBTF9FUlJPUjs8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFVTQiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVTQl9GbHVzaFR4RmlmbyZuYnNwO0FQSTogdXBkYXRlIHRvIGZsdXNoIGFsbCBUeCBGSUZPPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHVzZSBsb2NhbCB2YXJpYWJsZSZuYnNwO2luIFVTQiBIb3N0IGNoYW5uZWwgcmUtYWN0aXZhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4zLjEgLyAyNS1NYXJzLTIwMTU8L3NwYW4+PC9oMz4KIAogICAgICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZxdW90O3NlcmlmJnF1b3Q7OyI+PG86cD48L286cD48L3NwYW4+PC9wPgogCkBAIC0xOTA3LDcgKzE5NjQsNyBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIDx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBQV1IgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5GaXggY29tcGlsYXRpb24gaXNzdWUgd2l0aCBTVE0zMkY0MTd4eCBwcm9kdWN0OiB1cGRhdGUmbmJzcDs8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TVE0zMkYxN3h4PC9zcGFuPiBieSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TVE0zMkY0MTd4eDwvc3Bhbj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTUEkgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRvIGF2b2lkIHdhcm5pbmcgd2l0aCBUcnVlU1RVRElPJm5ic3A7PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSTJDIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+STJDIFBvbGxpbmcvSVQvRE1BIHByb2Nlc3NlczogbW92ZSB0aGUmbmJzcDt3YWl0IGxvb3Agb24gYnVzeSBmbGFnIGF0IHRoZSB0b3Agb2YgdGhlIHByb2Nlc3NlcywgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij50byBlbnN1cmUgdGhhdCBzb2Z0d2FyZSBub3QgcGVyZm9ybSBhbnkgd3JpdGUgYWNjZXNzIHRvIEkyQ19DUjEgcmVnaXN0ZXIgYmVmb3JlIGhhcmR3YXJlIGNsZWFyaW5nJm5ic3A7U1RPUCBiaXQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5hbmQgdG8gYXZvaWQgYWxzbyB0aGUgd2FpdGluZyBsb29wIG9uIEJVU1kgZmxhZyB1bmRlciBJMkMvRE1BIElTUi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPlVwZGF0ZSBidXN5IGZsYWcmbmJzcDtUaW1lb3V0IHZhbHVlPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5JMkMgTWFzdGVyIFJlY2VpdmUgUHJvY2Vzc2VzIHVwZGF0ZSB0byBkaXNhYmxlIEFDSyBiZWZvcmUgZ2VuZXJhdGUgdGhlIFNUT1AmbmJzcDs8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBEQUMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5GaXgKLVYxLjMuMCByZWdyZXNzaW9uIGlzc3VlIHdpdGggREFDIHNvZnR3YXJlIHRyaWdnZXIgY29uZmlndXJhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4zLjAgLyAwOS1NYXJzLTIwMTU8L3NwYW4+PC9oMz4KK1YxLjMuMCByZWdyZXNzaW9uIGlzc3VlIHdpdGggREFDIHNvZnR3YXJlIHRyaWdnZXIgY29uZmlndXJhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4zLjAgLyAwOS1NYXJzLTIwMTU8L3NwYW4+PC9oMz4KIAogICAgICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZxdW90O3NlcmlmJnF1b3Q7OyI+PG86cD48L286cD48L3NwYW4+PC9wPgogCkBAIC0xOTY0LDcgKzIwMjEsNyBAQAogICAgICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEyMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+Jm5ic3A7Jm5ic3A7KiBAbm90ZSZuYnNwOyZuYnNwOyBUcmFuc2l0aW9uIExTRSBCeXBhc3MgdG8gTFNFIE9uIGFuZCBMU0UgT24gdG8gTFNFIEJ5cGFzcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1hY3JvLjxicj4mbmJzcDsKICombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgVXNlciBzaG91bGQgcmVxdWVzdCBhCiB0cmFuc2l0aW9uIHRvIExTRSBPZmYgZmlyc3QgYW5kIHRoZW4gTFNFIE9uIG9yIExTRSBCeXBhc3MuPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvZGl2Pjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+QWRkIHRoZSAKLWZvbGxvd2luZyBuZXcgIG1hY3JvcyBmb3IgUExMJm5ic3A7c291cmNlIGFuZCBQTExNJm5ic3A7c2VsZWN0aW9uIDo8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5fX0hBTF9SQ0NfUExMX1BMTFNPVVJDRV9DT05GSUcoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+X19IQUxfUkNDX1BMTF9QTExNX0NPTkZJRygpPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5NYWNyb3MgcmVuYW1lOjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX09UR0hTX0ZPUkNFX1JFU0VUKCkgYnkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfVVNCX09UR19IU19GT1JDRV9SRVNFVDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfT1RHSFNfUkVMRUFTRV9SRVNFVCgpIGJ5Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX1VTQl9PVEdfSFNfUkVMRUFTRV9SRVNFVDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfT1RHSFNfQ0xLX1NMRUVQX0VOQUJMRSgpIGJ5Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX1VTQl9PVEdfSFNfQ0xLX1NMRUVQX0VOQUJMRTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfT1RHSFNfQ0xLX1NMRUVQX0RJU0FCTEUoKSBieSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9ESVNBQkxFPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4oKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19PVEdIU1VMUElfQ0xLX1NMRUVQX0VOQUJMRSgpIGJ5Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX1VTQl9PVEdfSFNfVUxQSV9DTEtfU0xFRVBfRU5BQkxFPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4oKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19PVEdIU1VMUElfQ0xLX1NMRUVQX0RJU0FCTEUoKSBieSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0RJU0FCTEU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPigpPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyBmb250LWZhbWlseTogVmVyZGFuYTsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7Ij5BZGQmbmJzcDtfX0hBTF9SQ0NfU1lTQ0xLX0NPTkZJRygpIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyI+bmV3IG1hY3JvPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7Ij4gdG8gY29uZmlndXJlIHRoZSBzeXN0ZW0gY2xvY2sgc291cmNlICg8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsiPlNZU0NMSzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyI+KTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+X19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgdXBkYXRlczo8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5BZGQgbmV3IFJDQyBMaXRlcmFsczo8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5SQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0k8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5SQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExSQ0xLPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+VXBkYXRlIG1hY3JvIGRlc2NyaXB0aW9uIHRvIHJlZmVyIHRvIHRoZSBsaXRlcmFscyBhYm92ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYig3MSwgNzEsIDcxKTsgZm9udC1mYW1pbHk6IGhlbHZldGljYSxhcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDI2cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogMjBweDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBQV1IgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgbmV3IGRlZmluZSBQV1JfV0FLRVVQX1BJTjI8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgbmV3IEFQSSB0byBDb250cm9sL0dldCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5WT1MmbmJzcDtiaXRzIG9mIENSIHJlZ2lzdGVyPC9zcGFuPjwvbGk+PHVsPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9QV1JfSEFMX1BXUkV4X0NvbnRyb2xWb2x0YWdlU2NhbGluZygpPC9zcGFuPjwvbGk+PGxpPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1BXUkV4X0dldFZvbHRhZ2VSYW5nZSgpPC9zcGFuPjwvbGk+PC91bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiIGxhbmc9IkVOLVVTIj5fX0hBTF9QV1JfPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDExcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtDYWxpYnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiIGxhbmc9IkVOLVVTIj4gVk9MVEFHRVNDQUxJTkdfQ09ORklHPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+KCk6IEltcGxlbWVudCB3b3JrYXJvdW5kIHRvIGNvdmVyIFZPUyBsaW1pdGF0aW9uIGRlbGF5IHdoZW4gUExMIGlzIGVuYWJsZWQgYWZ0ZXIgc2V0dGluZyB0aGUgVk9TIGNvbmZpZ3VyYXRpb248L3NwYW4+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6IHJnYigyNTIsIDI1MiwgMjUyKSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogcmdiKDIsIDMsIDIpOyIgbGFuZz0iRU4tVVMiPjxzcGFuIHN0eWxlPSJ0ZXh0LWFsaWduOiBzdGFydDsgZmxvYXQ6IG5vbmU7IHdvcmQtc3BhY2luZzogMHB4OyI+IDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBHUElPIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFkZCB0aGUgCitmb2xsb3dpbmcgbmV3ICBtYWNyb3MgZm9yIFBMTCZuYnNwO3NvdXJjZSBhbmQgUExMTSZuYnNwO3NlbGVjdGlvbiA6PG86cD48L286cD48L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+X19IQUxfUkNDX1BMTF9QTExTT1VSQ0VfQ09ORklHKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPl9fSEFMX1JDQ19QTExfUExMTV9DT05GSUcoKTwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+TWFjcm9zIHJlbmFtZTo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19PVEdIU19GT1JDRV9SRVNFVCgpIGJ5Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX1VTQl9PVEdfSFNfRk9SQ0VfUkVTRVQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPigpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX09UR0hTX1JFTEVBU0VfUkVTRVQoKSBieSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19VU0JfT1RHX0hTX1JFTEVBU0VfUkVTRVQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPigpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9FTkFCTEUoKSBieSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19VU0JfT1RHX0hTX0NMS19TTEVFUF9FTkFCTEU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPigpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5IQUxfUkNDX09UR0hTX0NMS19TTEVFUF9ESVNBQkxFKCkgYnkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfVVNCX09UR19IU19DTEtfU0xFRVBfRElTQUJMRTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfT1RHSFNVTFBJX0NMS19TTEVFUF9FTkFCTEUoKSBieSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+SEFMX1JDQ19VU0JfT1RHX0hTX1VMUElfQ0xLX1NMRUVQX0VOQUJMRTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfT1RHSFNVTFBJX0NMS19TTEVFUF9ESVNBQkxFKCkgYnkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPkhBTF9SQ0NfVVNCX09UR19IU19VTFBJX0NMS19TTEVFUF9ESVNBQkxFPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4oKTwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyI+QWRkJm5ic3A7X19IQUxfUkNDX1NZU0NMS19DT05GSUcoKSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsiPm5ldyBtYWNybzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyI+IHRvIGNvbmZpZ3VyZSB0aGUgc3lzdGVtIGNsb2NrIHNvdXJjZSAoPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7Ij5TWVNDTEs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsiPik8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPl9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpIHVwZGF0ZXM6PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+QWRkIG5ldyBSQ0MgTGl0ZXJhbHM6PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNJPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5SQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0U8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSzwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+UkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMUkNMSzwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPlVwZGF0ZSBtYWNybyBkZXNjcmlwdGlvbiB0byByZWZlciB0byB0aGUgbGl0ZXJhbHMgYWJvdmU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoNzEsIDcxLCA3MSk7IGZvbnQtZmFtaWx5OiBoZWx2ZXRpY2EsYXJpYWwsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAyNnB4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDIwcHg7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IGRpc3BsYXk6IGlubGluZSAhIGltcG9ydGFudDsgZmxvYXQ6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsiPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUFdSIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIG5ldyBkZWZpbmUgUFdSX1dBS0VVUF9QSU4yPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIG5ldyBBUEkgdG8gQ29udHJvbC9HZXQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Vk9TJm5ic3A7Yml0cyBvZiBDUiByZWdpc3Rlcjwvc3Bhbj48L2xpPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfUFdSX0hBTF9QV1JFeF9Db250cm9sVm9sdGFnZVNjYWxpbmcoKTwvc3Bhbj48L2xpPjxsaT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9QV1JFeF9HZXRWb2x0YWdlUmFuZ2UoKTwvc3Bhbj48L2xpPjwvdWw+PGxpPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IiBsYW5nPSJFTi1VUyI+X19IQUxfUFdSXzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMXB0OyBmb250LWZhbWlseTogJnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+IFZPTFRBR0VTQ0FMSU5HX0NPTkZJRzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyIgbGFuZz0iRU4tVVMiPigpOiBJbXBsZW1lbnQgd29ya2Fyb3VuZCB0byBjb3ZlciBWT1MgbGltaXRhdGlvbiBkZWxheSB3aGVuIFBMTCBpcyBlbmFibGVkIGFmdGVyIHNldHRpbmcgdGhlIFZPUyBjb25maWd1cmF0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTIsIDI1Mikgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IHJnYigyLCAzLCAyKTsiIGxhbmc9IkVOLVVTIj48c3BhbiBzdHlsZT0idGV4dC1hbGlnbjogc3RhcnQ7IGZsb2F0OiBub25lOyB3b3JkLXNwYWNpbmc6IDBweDsiPiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR1BJTyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5BZGQgdGhlIAogbmV3IEFsdGVybmF0ZSBmdW5jdGlvbnMgbGl0ZXJhbHMgcmVsYXRlZCB0byByZW1hcCBmb3IgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TUEksIFVTQVJULCBJMkMsIFNQRElGUlgsIENFQyBhbmQgCiBRU1BJPC9zcGFuPjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMXB0OyBmb250LWZhbWlseTogJnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+PHNtYWxsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsiPkhBTF9HUElPX0RlSW5pdCgpOgogVXBkYXRlJm5ic3A7dG8gY2hlY2sgaWYgR1BJTyBQaW4geCBpcyBhbHJlYWR5IHVzZWQgaW4gRVhUSSBtb2RlIG9uCkBAIC0yMDEzLDcgKzIwNzAsNyBAQAogZHVwbGV4IG1hbmFnZW1lbnQgYW5kIGFkZCB0aGUgYXR0cmlidXRlIF9fd2VhayBpbiB0aGUgR2VuZXJpYyBBUEk8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkhBTF88L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+STJTX0luaXQoKSwgSEFMX0kyU19ETUFQYXVzZSgpLCZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5IQUxfSTJTX0RNQVN0b3AoKSwmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+SEFMX0kyU19ETUFSZXN1bWUoKSwmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+SEFMX0kyU19JUlFIYW5kbGUoKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj4gPG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEycHQ7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+TW92ZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBmdW5jdGlvbnMgZnJvbSBnZW5lcmljIHRvIGV4dGVuc2lvbiBkcml2ZXI8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMTJwdDsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij4mbmJzcDtJMlNfRE1BUnhDcGx0KCkgYW5kIEkyU19ETUFUeENwbHQoKTwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMTJwdDsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5SZW1vdmUgc3RhdGljIGF0dHJpYnV0ZSBmcm9tIEkyU19UcmFuc21pdF9JVCgpIGFuZCBJMlNfUmVjZWl2ZV9JVCgpIGZ1bmN0aW9uczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEycHQ7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+TW92ZSBJMlN4RVhUKCkgbWFjcm8gdG8gZXh0ZW5zaW9uIGZpbGU8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBJMlNfQ0xPQ0tfUExMUiBhbmQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5JMlNfQ0xPQ0tfUExMU1JDIGRlZmluZXMgZm9yIEkyUyBjbG9jayBzb3VyY2U8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBuZXcgZnVuY3Rpb24gSTJTX0dldElucHV0Q2xvY2soKTxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMTCBGTUMgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgV3JpdGVGaWZvIGFuZCBQYWdlU2l6ZSBmaWVsZHMgaW4gdGhlIEZNQ19OT1JTUkFNX0luaXRUeXBlRGVmIHN0cnVjdHVyZTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZAogRk1DX1BBR0VfU0laRV9OT05FLCBGTUNfUEFHRV9TSVpFXzEyOCwgRk1DX1BBR0VfU0laRV8yNTYsCiBGTUNfUEFHRV9TSVpFXzEwMjQsIEZNQ19XUklURV9GSUZPX0RJU0FCTEUsIEZNQ19XUklURV9GSUZPX0VOQUJMRQotZGVmaW5lczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBGTUNfTk9SU1JBTV9Jbml0KCksIEZNQ19OT1JTUkFNX0RlSW5pdCgpIGFuZCZuYnNwO0ZNQ19OT1JTUkFNX0V4dGVuZGVkX1RpbWluZ19Jbml0KCkmbmJzcDtmdW5jdGlvbnM8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBMTCBVU0IgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgVVNCX09UR19DZmdUeXBlRGVmIHN0cnVjdHVyZSB0byBzdXBwb3J0IExQTSwgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+bHBtX2VuYWJsZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5maWVsZCBhZGRlZDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBVU0JfSG9zdEluaXQoKSBhbmQgVVNCX0RldkluaXQoKSBmdW5jdGlvbnMgdG8gc3VwcG9ydCB0aGUgVkJVUyBTZW5zaW5nIEIgYWN0aXZhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMnB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4yLjAgLyAyNi1EZWNlbWJlci0yMDE0PC9zcGFuPjwvaDM+CitkZWZpbmVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEZNQ19OT1JTUkFNX0luaXQoKSwgRk1DX05PUlNSQU1fRGVJbml0KCkgYW5kJm5ic3A7Rk1DX05PUlNSQU1fRXh0ZW5kZWRfVGltaW5nX0luaXQoKSZuYnNwO2Z1bmN0aW9uczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIExMIFVTQiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBVU0JfT1RHX0NmZ1R5cGVEZWYgc3RydWN0dXJlIHRvIHN1cHBvcnQgTFBNLCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5scG1fZW5hYmxlIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPmZpZWxkIGFkZGVkPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIFVTQl9Ib3N0SW5pdCgpIGFuZCBVU0JfRGV2SW5pdCgpIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRoZSBWQlVTIFNlbnNpbmcgQiBhY3RpdmF0aW9uPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAycHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjIuMCAvIDI2LURlY2VtYmVyLTIwMTQ8L3NwYW4+PC9oMz4KIAogCiAgICAgICAgICAgICAKQEAgLTIyMzIsNyArMjI4OSw3IEBACiAgICAgICAgICAgICAKIAogICAgICAgICAgICAgCi0gICAgICAgICAgICA8aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4xLjAgLyAxOS1KdW5lLTIwMTQ8L3NwYW4+PC9oMz4KKyAgICAgICAgICAgIDxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjEuMCAvIDE5LUp1bmUtMjAxNDwvc3Bhbj48L2gzPgogCiAgICAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPk1haW4gQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CiAKQEAgLTI3MzcsNyArMjc5NCw3IEBACiAgICAgICAgICAgICAgIDwvdWw+CiAKIDwvdWw+Ci08c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPjwvc3Bhbj48L3NwYW4+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMC4wIC8gMTgtRmVicnVhcnktMjAxNDwvc3Bhbj48L2gzPgorPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48L3NwYW4+PC9zcGFuPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjAuMCAvIDE4LUZlYnJ1YXJ5LTIwMTQ8L3NwYW4+PC9oMz4KIAogICAgICAgICAgICAgPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBjb2xvcjogYmxhY2s7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZxdW90O3NlcmlmJnF1b3Q7OyI+PG86cD48L286cD48L3NwYW4+PC9wPgogCkBAIC0yNzQ3LDcgKzI4MDQsNyBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIDx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj4KLSAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Rmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvbGk+PC91bD48aDIgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsiPjxhIG5hbWU9IkxpY2Vuc2UiPjwvYT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBjb2xvcjogd2hpdGU7Ij5MaWNlbnNlPG86cD48L286cD48L3NwYW4+PC9oMj4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+Rmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjwvbGk+PC91bD48aDIgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsiPjxhIG5hbWU9IkxpY2Vuc2UiPjwvYT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBjb2xvcjogd2hpdGU7Ij5MaWNlbnNlPG86cD48L286cD48L3NwYW4+PC9oMj4KICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij48Zm9udCBzaXplPSItMSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij4KIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjR4eF9oYWwuYyBiL1NyYy9zdG0zMmY0eHhfaGFsLmMKaW5kZXggMTdhNTJiNC4uMjQ1MTQ3YSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjR4eF9oYWwuYworKysgYi9TcmMvc3RtMzJmNHh4X2hhbC5jCkBAIC01MCwxMSArNTAsMTEgQEAKICAgKiBAewogICAqLwogLyoqCi0gICogQGJyaWVmIFNUTTMyRjR4eCBIQUwgRHJpdmVyIHZlcnNpb24gbnVtYmVyIFYxLjcuNworICAqIEBicmllZiBTVE0zMkY0eHggSEFMIERyaXZlciB2ZXJzaW9uIG51bWJlciBWMS43LjgKICAgKi8KICNkZWZpbmUgX19TVE0zMkY0eHhfSEFMX1ZFUlNJT05fTUFJTiAgICgweDAxVSkgLyohPCBbMzE6MjRdIG1haW4gdmVyc2lvbiAqLwogI2RlZmluZSBfX1NUTTMyRjR4eF9IQUxfVkVSU0lPTl9TVUIxICAgKDB4MDdVKSAvKiE8IFsyMzoxNl0gc3ViMSB2ZXJzaW9uICovCi0jZGVmaW5lIF9fU1RNMzJGNHh4X0hBTF9WRVJTSU9OX1NVQjIgICAoMHgwN1UpIC8qITwgWzE1OjhdICBzdWIyIHZlcnNpb24gKi8KKyNkZWZpbmUgX19TVE0zMkY0eHhfSEFMX1ZFUlNJT05fU1VCMiAgICgweDA4VSkgLyohPCBbMTU6OF0gIHN1YjIgdmVyc2lvbiAqLwogI2RlZmluZSBfX1NUTTMyRjR4eF9IQUxfVkVSU0lPTl9SQyAgICAgKDB4MDBVKSAvKiE8IFs3OjBdICByZWxlYXNlIGNhbmRpZGF0ZSAqLyAKICNkZWZpbmUgX19TVE0zMkY0eHhfSEFMX1ZFUlNJT04gICAgICAgICAoKF9fU1RNMzJGNHh4X0hBTF9WRVJTSU9OX01BSU4gPDwgMjRVKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KF9fU1RNMzJGNHh4X0hBTF9WRVJTSU9OX1NVQjEgPDwgMTZVKVwKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY0eHhfaGFsX2Nhbi5jIGIvU3JjL3N0bTMyZjR4eF9oYWxfY2FuLmMKaW5kZXggMDA5YTQ0Ny4uMGZiYzcyMyAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjR4eF9oYWxfY2FuLmMKKysrIGIvU3JjL3N0bTMyZjR4eF9oYWxfY2FuLmMKQEAgLTUzNywxOSArNTM3LDE5IEBACiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ0FOIG1vZHVsZQogICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDBfQ09NUExFVEVfQ0FMTEJBQ0tfQ0JfSUQgVHggTWFpbGJveCAwIENvbXBsZXRlIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gxX0NPTVBMRVRFX0NBTExCQUNLX0NCX0lEIFR4IE1haWxib3ggMSBDb21wbGV0ZSBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMl9DT01QTEVURV9DQUxMQkFDS19DQl9JRCBUeCBNYWlsYm94IDIgQ29tcGxldGUgY2FsbGJhY2sgSUQKLSAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDBfQUJPUlRfQ0FMTEJBQ0tfQ0JfSUQgVHggTWFpbGJveCAwIEFib3J0IGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gxX0FCT1JUX0NBTExCQUNLX0NCX0lEIFR4IE1haWxib3ggMSBBYm9ydCBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMl9BQk9SVF9DQUxMQkFDS19DQl9JRCBUeCBNYWlsYm94IDIgQWJvcnQgY2FsbGJhY2sgSUQKLSAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fUlhfRklGTzBfTVNHX1BFTkRJTkdfQ0FMTEJBQ0tfQ0JfSUQgUnggRmlmbyAwIG1lc3NhZ2UgcGVuZGluZyBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMF9GVUxMX0NBTExCQUNLX0NCX0lEIFJ4IEZpZm8gMCBmdWxsIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1JYX0ZJRk8xX01TR1BFTkRJTkdfQ0FMTEJBQ0tfQ0JfSUQgUnggRmlmbyAxIG1lc3NhZ2UgcGVuZGluZyBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMV9GVUxMX0NBTExCQUNLX0NCX0lEIFJ4IEZpZm8gMSBmdWxsIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1NMRUVQX0NBTExCQUNLX0NCX0lEIFNsZWVwIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1dBS0VVUF9GUk9NX1JYX01TR19DQUxMQkFDS19DQl9JRCBXYWtlIFVwIGZyb20gUnggbWVzc2FnZSBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9FUlJPUl9DQUxMQkFDS19DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMF9DT01QTEVURV9DQl9JRCBUeCBNYWlsYm94IDAgQ29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDFfQ09NUExFVEVfQ0JfSUQgVHggTWFpbGJveCAxIENvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gyX0NPTVBMRVRFX0NCX0lEIFR4IE1haWxib3ggMiBDb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMF9BQk9SVF9DQl9JRCBUeCBNYWlsYm94IDAgQWJvcnQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDFfQUJPUlRfQ0JfSUQgVHggTWFpbGJveCAxIEFib3J0IGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gyX0FCT1JUX0NCX0lEIFR4IE1haWxib3ggMiBBYm9ydCBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMF9NU0dfUEVORElOR19DQl9JRCBSeCBGaWZvIDAgbWVzc2FnZSBwZW5kaW5nIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1JYX0ZJRk8wX0ZVTExfQ0JfSUQgUnggRmlmbyAwIGZ1bGwgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fUlhfRklGTzFfTVNHX1BFTkRJTkdfQ0JfSUQgUnggRmlmbyAxIG1lc3NhZ2UgcGVuZGluZyBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMV9GVUxMX0NCX0lEIFJ4IEZpZm8gMSBmdWxsIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1NMRUVQX0NCX0lEIFNsZWVwIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1dBS0VVUF9GUk9NX1JYX01TR19DQl9JRCBXYWtlIFVwIGZyb20gUnggbWVzc2FnZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAogICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCkBAIC02ODAsMTkgKzY4MCwxOSBAQAogICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENBTiBtb2R1bGUKICAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDBfQ09NUExFVEVfQ0FMTEJBQ0tfQ0JfSUQgVHggTWFpbGJveCAwIENvbXBsZXRlIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gxX0NPTVBMRVRFX0NBTExCQUNLX0NCX0lEIFR4IE1haWxib3ggMSBDb21wbGV0ZSBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMl9DT01QTEVURV9DQUxMQkFDS19DQl9JRCBUeCBNYWlsYm94IDIgQ29tcGxldGUgY2FsbGJhY2sgSUQKLSAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDBfQUJPUlRfQ0FMTEJBQ0tfQ0JfSUQgVHggTWFpbGJveCAwIEFib3J0IGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gxX0FCT1JUX0NBTExCQUNLX0NCX0lEIFR4IE1haWxib3ggMSBBYm9ydCBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMl9BQk9SVF9DQUxMQkFDS19DQl9JRCBUeCBNYWlsYm94IDIgQWJvcnQgY2FsbGJhY2sgSUQKLSAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fUlhfRklGTzBfTVNHX1BFTkRJTkdfQ0FMTEJBQ0tfQ0JfSUQgUnggRmlmbyAwIG1lc3NhZ2UgcGVuZGluZyBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMF9GVUxMX0NBTExCQUNLX0NCX0lEIFJ4IEZpZm8gMCBmdWxsIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1JYX0ZJRk8xX01TR1BFTkRJTkdfQ0FMTEJBQ0tfQ0JfSUQgUnggRmlmbyAxIG1lc3NhZ2UgcGVuZGluZyBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMV9GVUxMX0NBTExCQUNLX0NCX0lEIFJ4IEZpZm8gMSBmdWxsIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1NMRUVQX0NBTExCQUNLX0NCX0lEIFNsZWVwIGNhbGxiYWNrIElECi0gICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1dBS0VVUF9GUk9NX1JYX01TR19DQUxMQkFDS19DQl9JRCBXYWtlIFVwIGZyb20gUnggbWVzc2FnZSBjYWxsYmFjayBJRAotICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9FUlJPUl9DQUxMQkFDS19DQl9JRCBFcnJvciBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMF9DT01QTEVURV9DQl9JRCBUeCBNYWlsYm94IDAgQ29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDFfQ09NUExFVEVfQ0JfSUQgVHggTWFpbGJveCAxIENvbXBsZXRlIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gyX0NPTVBMRVRFX0NCX0lEIFR4IE1haWxib3ggMiBDb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9UWF9NQUlMQk9YMF9BQk9SVF9DQl9JRCBUeCBNYWlsYm94IDAgQWJvcnQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fVFhfTUFJTEJPWDFfQUJPUlRfQ0JfSUQgVHggTWFpbGJveCAxIEFib3J0IGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1RYX01BSUxCT1gyX0FCT1JUX0NCX0lEIFR4IE1haWxib3ggMiBBYm9ydCBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMF9NU0dfUEVORElOR19DQl9JRCBSeCBGaWZvIDAgbWVzc2FnZSBwZW5kaW5nIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1JYX0ZJRk8wX0ZVTExfQ0JfSUQgUnggRmlmbyAwIGZ1bGwgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fUlhfRklGTzFfTVNHX1BFTkRJTkdfQ0JfSUQgUnggRmlmbyAxIG1lc3NhZ2UgcGVuZGluZyBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9SWF9GSUZPMV9GVUxMX0NCX0lEIFJ4IEZpZm8gMSBmdWxsIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1NMRUVQX0NCX0lEIFNsZWVwIGNhbGxiYWNrIElECisgICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ0FOX1dBS0VVUF9GUk9NX1JYX01TR19DQl9JRCBXYWtlIFVwIGZyb20gUnggbWVzc2FnZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAogICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX0NBTl9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9DQU5fTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjR4eF9oYWxfY3J5cC5jIGIvU3JjL3N0bTMyZjR4eF9oYWxfY3J5cC5jCmluZGV4IDkwN2RiNGEuLjk3ZjhiZDcgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY0eHhfaGFsX2NyeXAuYworKysgYi9TcmMvc3RtMzJmNHh4X2hhbF9jcnlwLmMKQEAgLTMsNyArMyw3IEBACiAgICogQGZpbGUgICAgc3RtMzJmNHh4X2hhbF9jcnlwLmMKICAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICAqIEBicmllZiAgIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDcnlwdG9ncmFwaHkgKENSWVApIHBlcmlwaGVyYWw6CiAgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24sIGRlLWluaXRpYWxpemF0aW9uLCBzZXQgY29uZmlnIGFuZCBnZXQgY29uZmlnICBmdW5jdGlvbnMKICAgKiAgICAgICAgICAgKyBERVMvVERFUywgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zCkBAIC02NCw2ICs2NCwxMiBAQAogCiAgICAgICAgKCMpQ2FsbCBIQUxfQ1JZUF9EZUluaXQoKSB0byBkZWluaXRpYWxpemUgdGhlIENSWVAgcGVyaXBoZXJhbC4KIAorICAgICAgICgjKVRvIHByb2Nlc3MgYSBzaW5nbGUgbWVzc2FnZSB3aXRoIGNvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9DUllQX0VuY3J5cHQoKSBvciBIQUxfQ1JZUF9EZWNyeXB0KCkKKyAgICAgICAgICB3aXRob3V0IGhhdmluZyB0byBjb25maWd1cmUgYWdhaW4gdGhlIEtleSBvciB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yIGJldHdlZW4gZWFjaCBBUEkgY2FsbCwKKyAgICAgICAgICB0aGUgZmllbGQgS2V5SVZDb25maWdTa2lwIG9mIHRoZSBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgbXVzdCBiZSBzZXQgdG8gQ1JZUF9LRVlJVkNPTkZJR19PTkNFLgorICAgICAgICAgIFNhbWUgaXMgdHJ1ZSBmb3IgY29uc2VjdXRpdmUgY2FsbHMgb2YgSEFMX0NSWVBfRW5jcnlwdF9JVCgpLCBIQUxfQ1JZUF9EZWNyeXB0X0lUKCksIEhBTF9DUllQX0VuY3J5cHRfRE1BKCkKKyAgICAgICAgICBvciBIQUxfQ1JZUF9EZWNyeXB0X0RNQSgpLgorCiAgICAgWy4uXQogICAgICAgVGhlIGNyeXB0b2dyYXBoaWMgcHJvY2Vzc29yIHN1cHBvcnRzIGZvbGxvd2luZyBzdGFuZGFyZHM6CiAgICAgICAoIykgVGhlIGRhdGEgZW5jcnlwdGlvbiBzdGFuZGFyZCAoREVTKSBhbmQgVHJpcGxlLURFUyAoVERFUykgc3VwcG9ydGVkIG9ubHkgYnkgQ1JZUDEgSVA6CkBAIC0yMzcsMTYgKzI0MywxNiBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICAqCiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCi0gICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICovIAorICAqLwogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInN0bTMyZjR4eF9oYWwuaCIKQEAgLTI1NCw5ICsyNjAsOSBAQAogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgICogQHsKICAgKi8KLSAgCisKICNpZiBkZWZpbmVkIChBRVMpICB8fCBkZWZpbmVkIChDUllQKQotICAKKwogLyoqIEBkZWZncm91cCBDUllQIENSWVAKICAgKiBAYnJpZWYgQ1JZUCBIQUwgbW9kdWxlIGRyaXZlci4KICAgKiBAewpAQCAtMjc2LDM2ICsyODIsMzYgQEAKIAogI2RlZmluZSAgQ1JZUF9QSEFTRV9SRUFEWSAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyByZWFkeSBmb3IgaW5pdGlhbGl6YXRpb24uICovCiAjZGVmaW5lICBDUllQX1BIQVNFX1BST0NFU1MgICAgICAgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIGluIHByb2Nlc3NpbmcgcGhhc2UgKi8KLSAgICAKKwogI2lmIGRlZmluZWQoQUVTKQogI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgLyohPCBFbmNyeXB0aW9uIG1vZGUoTW9kZSAxKSAgKi8KICNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgIC8qITwgS2V5IGRlcml2YXRpb24gbW9kZSAgb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAoTW9kZSAyKSAqLwogI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgICAgICAgICAgICAgICBBRVNfQ1JfTU9ERV8xICAgLyohPCBEZWNyeXB0aW9uICAgIChNb2RlIDMpICAgICovCiAjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQgICAgIEFFU19DUl9NT0RFICAgICAvKiE8IEtleSBkZXJpdmF0aW9uIGFuZCBkZWNyeXB0aW9uIG9ubHkgdXNlZCB3aGVuIHBlcmZvcm1pbmcgRUNCIGFuZCBDQkMgZGVjcnlwdGlvbnMgKE1vZGUgNCkgKi8KLSNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzEgICAgIC8qITwgR0NNKC9DQ00pIHBheWxvYWQgcGhhc2UgICAgICAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAqLyAKKyNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMCAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gaGVhZGVyIHBoYXNlICovCisjZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8xICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAqLwogI2Vsc2UgIC8qIENSWVAgKi8KICNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCi0jZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMSAgICAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICAgICovIAotI2RlZmluZSBDUllQX1BIQVNFX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQX0NSX0dDTV9DQ01QSCAgICAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSAgZmluYWwgcGhhc2UgKi8gCisjZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQX0NSX0dDTV9DQ01QSF8xICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEggICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICovCiAjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlICAgKi8KICNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgQ1JZUF9DUl9BTEdPRElSICAgICAgICAgLyohPCBEZWNyeXB0aW9uICAgICAgICAqLwotI2VuZGlmIC8qIEVuZCBDUllQIG9yICBBRVMgKi8gCisjZW5kaWYgLyogRW5kIENSWVAgb3IgIEFFUyAqLwogCi0gLyogIENUUjEgaW5mb3JtYXRpb24gdG8gdXNlIGluIENDTSBhbGdvcml0aG0gKi8KLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8wICAgICAgICAgICAgICAgICAgMHgwN0ZGRkZGRlUgICAgICAgICAKLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8xICAgICAgICAgICAgICAgICAgMHhGRkZGRkYwMFUgICAgICAgICAKLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8yICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAKKy8qICBDVFIxIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMCAgICAgICAgICAgICAgICAgIDB4MDdGRkZGRkZVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMSAgICAgICAgICAgICAgICAgIDB4RkZGRkZGMDBVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCiAKIAogLyoqCiAgICogQH0KICAgKi8KIAotICAKKwogLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfTWFjcm9zCiAgICogQHsKQEAgLTMxNyw5ICszMjMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKF9fUEhBU0VfXyk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQogCi0jZGVmaW5lIEhBTF9DUllQX0ZJRk9fRkxVU0goX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBDUllQX0NSX0ZGTFVTSCkgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNlbHNlIC8qQUVTKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSEFMX0NSWVBfRklGT19GTFVTSChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIENSWVBfQ1JfRkZMVVNIKQorCisjZWxzZSAvKkFFUyovCiAjZGVmaW5lIENSWVBfU0VUX1BIQVNFKF9fSEFORExFX18sIF9fUEhBU0VfXykgIGRveyhfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkofkFFU19DUl9HQ01QSCk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKF9fUEhBU0VfXyk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQpAQCAtMzI4LDE0ICszMzQsMTQgQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKi8KKwogLyogUHJpdmF0ZSBzdHJ1Y3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfRnVuY3Rpb25zX3Byb3RvdHlwZXMKICAgKiBAewotICAqLyAgCisgICovCiAKIHN0YXRpYyB2b2lkIENSWVBfU2V0RE1BQ29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IGlucHV0YWRkciwgdWludDE2X3QgU2l6ZSwgdWludDMyX3Qgb3V0cHV0YWRkcik7CiBzdGF0aWMgdm9pZCBDUllQX0RNQUluQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CkBAIC0zNTAsNyArMzU2LDcgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CiBzdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Ci1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVCAoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKQEAgLTM3Niw3ICszODIsNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTM4NCwyNyArMzkwLDI3IEBACiAgICogQHsKICAgKi8KIAotICAKLS8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCi0gKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4gCi0gKgotQHZlcmJhdGltICAgIAorCisvKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uLCBkZS1pbml0aWFsaXphdGlvbiBhbmQgU2V0IGFuZCBHZXQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86Ci0gICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCAgCi0gICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUllQICAKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUllQCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUllQCiAgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKLSAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSWVAgTVNQIAorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKICAgICAgICgrKSBjb25maWd1cmUgQ1JZUCAoSEFMX0NSWVBfU2V0Q29uZmlnKSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgQ1JZUF9Db25maWdUeXBlRGVmCiAgICAgICAgICAgUGFyYW1ldGVycyB3aGljaCBhcmUgY29uZmlndXJlZCBpbiBUaGlzIHNlY3Rpb24gYXJlIDoKLSAgICAgICAgICAoKykgS2V5IHNpemUgCisgICAgICAgICAgKCspIEtleSBzaXplCiAgICAgICAgICAgKCspIERhdGEgVHlwZSA6IDMyLDE2LCA4IG9yIDFiaXQKLSAgICAgICAgICAoKykgQWxnb01vZGUgOiAKLSAgICAgICAgICAgICAgLSBmb3IgQ1JZUDEgSVAgOiAKLSAgICAgICAgICAgICAgICAgRUNCIGFuZCBDQkMgaW4gREVTL1RERVMgU3RhbmRhcmQgCi0gICAgICAgICAgICAgICAgIEVDQixDQkMsQ1RSLEdDTS9HTUFDIGFuZCBDQ00gaW4gQUVTIFN0YW5kYXJkLiAKKyAgICAgICAgICAoKykgQWxnb01vZGUgOgorICAgICAgICAgICAgICAtIGZvciBDUllQMSBJUCA6CisgICAgICAgICAgICAgICAgIEVDQiBhbmQgQ0JDIGluIERFUy9UREVTIFN0YW5kYXJkCisgICAgICAgICAgICAgICAgIEVDQixDQkMsQ1RSLEdDTS9HTUFDIGFuZCBDQ00gaW4gQUVTIFN0YW5kYXJkLgogICAgICAgICAgICAgICAtIGZvciBUaW55QUVTMiBJUCwgb25seSBFQ0IsQ0JDLENUUixHQ00vR01BQyBhbmQgQ0NNIGluIEFFUyBTdGFuZGFyZCBhcmUgc3VwcG9ydGVkLgogICAgICAgKCspIEdldCBDUllQIGNvbmZpZ3VyYXRpb24gKEhBTF9DUllQX0dldENvbmZpZykgZnJvbSB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfSGFuZGxlVHlwZURlZgogCkBAIC00MjIsMTUyICs0MjgsMTU1IEBACiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9Jbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCi17IAorewogICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLwotICBpZihoY3J5cCA9PSBOVUxMKQorICBpZiAoaGNyeXAgPT0gTlVMTCkKICAgewogICAgIHJldHVybiBIQUxfRVJST1I7Ci0gIH0gCi0gIAorICB9CisKICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9LRVlTSVpFKGhjcnlwLT5Jbml0LktleVNpemUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfREFUQVRZUEUoaGNyeXAtPkluaXQuRGF0YVR5cGUpKTsKLSAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfQUxHT1JJVEhNKGhjcnlwLT5Jbml0LkFsZ29yaXRobSkpOyAgCi0gIAotICAjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPUklUSE0oaGNyeXAtPkluaXQuQWxnb3JpdGhtKSk7CisgIGFzc2VydF9wYXJhbShJU19DUllQX0lOSVQoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwKSk7CisKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogICB7CiAgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgIGhjcnlwLT5Mb2NrID0gSEFMX1VOTE9DS0VEOwotICAgIAorCiAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrICA9IEhBTF9DUllQX0luQ3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgSW5DcGx0Q2FsbGJhY2sgICAqLwogICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE91dENwbHRDYWxsYmFjayAgKi8KICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayAgID0gSEFMX0NSWVBfRXJyb3JDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICovCi0gICAgCi0gICAgaWYoaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorCisgICAgaWYgKGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICAgICB7CiAgICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KICAgICB9Ci0gICAgCisKICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KLSAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrKGhjcnlwKTsgICAgCisgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayhoY3J5cCk7CiAgIH0KICNlbHNlCi0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKICAgewogICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KICAgICBoY3J5cC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKLSAgICAKKwogICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogICAgIEhBTF9DUllQX01zcEluaXQoaGNyeXApOwogICB9Ci0gI2VuZGlmIC8qIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLwotICAKKyNlbmRpZiAvKiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKwogICAvKiBTZXQgdGhlIGtleSBzaXplKFRoaXMgYml0IGZpZWxkIGlzIGRvbpJ0IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSBkYXRhIHR5cGUgYW5kIEFsZ29yaXRobSAqLwogI2lmIGRlZmluZWQgKENSWVApCi0gIAotICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfREFUQVRZUEV8Q1JZUF9DUl9LRVlTSVpFfENSWVBfQ1JfQUxHT01PREUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7Ci0gIAorCisgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9EQVRBVFlQRSB8IENSWVBfQ1JfS0VZU0laRSB8IENSWVBfQ1JfQUxHT01PREUsCisgICAgICAgICAgICAgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKKwogI2Vsc2UgLypBRVMqLwotICAKLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEV8QUVTX0NSX0tFWVNJWkV8QUVTX0NSX0NITU9ELCBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwotICAKKworICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSB8IEFFU19DUl9LRVlTSVpFIHwgQUVTX0NSX0NITU9ELAorICAgICAgICAgICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CisKICNlbmRpZiAgLyogRW5kIEFFUyBvciBDUllQKi8KLSAgCisKICAgLyogUmVzZXQgRXJyb3IgQ29kZSBmaWVsZCAqLwotICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsgCi0gIAorICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsKKwogICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KLSAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCiAgIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCiAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUkVBRFk7Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBEZS1Jbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsLiAKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwuCiAgICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCi0qLworICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CiAgIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCi0gIGlmKGhjcnlwID09IE5VTEwpCisgIGlmIChoY3J5cCA9PSBOVUxMKQogICB7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotICAKKwogICAvKiBTZXQgdGhlIGRlZmF1bHQgQ1JZUCBwaGFzZSAqLwogICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1JFQURZOwotICAKKwogICAvKiBSZXNldCBDcnlwSW5Db3VudCBhbmQgQ3J5cE91dENvdW50ICovCiAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDA7CiAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwOwotICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0wOyAKLSAgCisgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwOworCiAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKKwogI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi0gIAotICBpZihoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKworICBpZiAoaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCiAgIHsKICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KICAgfQogICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2soaGNyeXApOwotICAKKwogI2Vsc2UKLSAgCisKICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCiAgIEhBTF9DUllQX01zcERlSW5pdChoY3J5cCk7Ci0gIAorCiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotICAKKwogICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVTRVQ7Ci0gIAorCiAgIC8qIFJlbGVhc2UgTG9jayAqLwogICBfX0hBTF9VTkxPQ0soaGNyeXApOwotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9Ci0gICAgCisKIC8qKgogICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCi0gICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0NvbmZpZ1R5cGVEZWYgCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0NvbmZpZ1R5cGVEZWYKICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQogICAqIEBwYXJhbSAgcENvbmY6IHBvaW50ZXIgdG8gYSBDUllQX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfU2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYgKQoteyAKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1NldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKQorewogICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLwotICBpZigoaGNyeXAgPT0gTlVMTCl8fCAocENvbmYgPT0gTlVMTCkgKQorICBpZiAoKGhjcnlwID09IE5VTEwpIHx8IChwQ29uZiA9PSBOVUxMKSkKICAgewogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9LRVlTSVpFKHBDb25mLT5LZXlTaXplKSk7CiAgIGFzc2VydF9wYXJhbShJU19DUllQX0RBVEFUWVBFKHBDb25mLT5EYXRhVHlwZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPUklUSE0ocENvbmYtPkFsZ29yaXRobSkpOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSAKLSAgeyAgCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgewogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwotICAgIF9fSEFMX0xPQ0soaGNyeXApOyAgICAgCi0gICAgCi0gICAgLyogU2V0ICBDUllQIHBhcmFtZXRlcnMgICovICAgIAorICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogU2V0ICBDUllQIHBhcmFtZXRlcnMgICovCiAgICAgaGNyeXAtPkluaXQuRGF0YVR5cGUgICA9IHBDb25mLT5EYXRhVHlwZTsKICAgICBoY3J5cC0+SW5pdC5wS2V5ICAgICAgID0gcENvbmYtPnBLZXk7CiAgICAgaGNyeXAtPkluaXQuQWxnb3JpdGhtICA9IHBDb25mLT5BbGdvcml0aG07CkBAIC01NzcsNDIgKzU4Niw0NCBAQAogICAgIGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPSBwQ29uZi0+SGVhZGVyU2l6ZTsKICAgICBoY3J5cC0+SW5pdC5CMCAgICAgICAgID0gcENvbmYtPkIwOwogICAgIGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPSBwQ29uZi0+RGF0YVdpZHRoVW5pdDsKLSAgICAKLSAgICAvKiBTZXQgdGhlIGtleSBzaXplKFRoaXMgYml0IGZpZWxkIGlzIGRvbpJ0IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSBkYXRhIHR5cGUsIEFsZ29Nb2RlIGFuZCBvcGVyYXRpbmcgbW9kZSovICAgIAotI2lmIGRlZmluZWQgKENSWVApIAotICAgIAotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9EQVRBVFlQRXxDUllQX0NSX0tFWVNJWkV8Q1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKLSAgICAKKworICAgIC8qIFNldCB0aGUga2V5IHNpemUoVGhpcyBiaXQgZmllbGQgaXMgZG9uknQgY2FyZSBpbiB0aGUgREVTIG9yIFRERVMgbW9kZXMpIGRhdGEgdHlwZSwgQWxnb01vZGUgYW5kIG9wZXJhdGluZyBtb2RlKi8KKyNpZiBkZWZpbmVkIChDUllQKQorCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0RBVEFUWVBFIHwgQ1JZUF9DUl9LRVlTSVpFIHwgQ1JZUF9DUl9BTEdPTU9ERSwKKyAgICAgICAgICAgICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CisKICNlbHNlIC8qQUVTKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRXxBRVNfQ1JfS0VZU0laRXxBRVNfQ1JfQ0hNT0QsIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7Ci0gICAgCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUgfCBBRVNfQ1JfS0VZU0laRSB8IEFFU19DUl9DSE1PRCwKKyAgICAgICAgICAgICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CisKICAgICAvKmNsZWFyIGVycm9yIGZsYWdzKi8KLSAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9FUlJfQ0xFQVIpOwotICAgIAotI2VuZGlmICAvKiBFbmQgQUVTIG9yIENSWVAgKi8gCi0gICAgCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0VSUl9DTEVBUik7CisKKyNlbmRpZiAgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIFJlc2V0IEVycm9yIENvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsgCi0gICAgCisgICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX05PTkU7CisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KLSAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgIAorICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCiAgICAgLyogU2V0IHRoZSBkZWZhdWx0IENSWVAgcGhhc2UgKi8KICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1JFQURZOwotICAgIAorCiAgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwotICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgCi0gICAgCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKwogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KIH0KQEAgLTYyNCwyMyArNjM1LDIzIEBACiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0dldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mICkKLXsgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9HZXRDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgQ1JZUF9Db25maWdUeXBlRGVmICpwQ29uZikKK3sKICAgLyogQ2hlY2sgdGhlIENSWVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KLSAgaWYoKGhjcnlwID09IE5VTEwpfHwgKHBDb25mID09IE5VTEwpICkKKyAgaWYgKChoY3J5cCA9PSBOVUxMKSB8fCAocENvbmYgPT0gTlVMTCkpCiAgIHsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9Ci0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpIAotICB7ICAKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CiAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKLSAgICAKKwogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCi0gICAgX19IQUxfTE9DSyhoY3J5cCk7ICAKLSAgICAKLSAgICAvKiBHZXQgIENSWVAgcGFyYW1ldGVycyAgKi8gICAgICAKKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKworICAgIC8qIEdldCAgQ1JZUCBwYXJhbWV0ZXJzICAqLwogICAgIHBDb25mLT5EYXRhVHlwZSAgICAgICAgPSBoY3J5cC0+SW5pdC5EYXRhVHlwZTsKICAgICBwQ29uZi0+cEtleSAgICAgICAgICAgID0gaGNyeXAtPkluaXQucEtleTsKICAgICBwQ29uZi0+QWxnb3JpdGhtICAgICAgID0gaGNyeXAtPkluaXQuQWxnb3JpdGhtOwpAQCAtNjUwLDIzICs2NjEsMjMgQEAKICAgICBwQ29uZi0+SGVhZGVyU2l6ZSAgICAgID0gaGNyeXAtPkluaXQuSGVhZGVyU2l6ZTsKICAgICBwQ29uZi0+QjAgICAgICAgICAgICAgID0gaGNyeXAtPkluaXQuQjA7CiAgICAgcENvbmYtPkRhdGFXaWR0aFVuaXQgICAgPSBoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0OwotICAgIAorCiAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KLSAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAKLSAgICAKKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKwogICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgICByZXR1cm4gSEFMX09LOwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgICAKLSAgICAKKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCiAgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQogfQpAQCAtNjgwLDcgKzY5MSw3IEBACiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhjcnlwKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwpAQCAtNjk2LDcgKzcwNyw3IEBACiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhjcnlwKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCkBAIC03MTEsNzYgKzcyMiw3NyBAQAogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElEIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICAqIEBwYXJhbSBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAgKiBAcmV0dmFsIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAotICBpZihwQ2FsbGJhY2sgPT0gTlVMTCkKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCiAgIHsKICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7Ci0gICAgCisKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9CiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaGNyeXApOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgIHsKICAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgewotICAgIGNhc2UgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgOgotICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX09VVFBVVF9DT01QTEVURV9DQl9JRCA6Ci0gICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX0VSUk9SX0NCX0lEIDoKLSAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwotICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfRVJST1JfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICBlbHNlIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgZWxzZSBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogICB7CiAgICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgIHsKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwotICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAgIGVsc2UKQEAgLTc5MCwxMCArODAyLDEwIEBACiAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogUmVsZWFzZSBMb2NrICovCiAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gIAorCiAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTgwNSw3ICs4MTcsNyBAQAogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElEIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICAqIEByZXR2YWwgc3RhdHVzCkBAIC04MTMsNjAgKzgyNSw2MCBAQAogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIEhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhoY3J5cCk7Ci0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICAgewogICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7Ci0gICAgY2FzZSBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCA6Ci0gICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrICBJbkNwbHRDYWxsYmFjayAgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgOgotICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IEhBTF9DUllQX091dENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBPdXRDcGx0Q2FsbGJhY2sgICAgICAgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9FUlJPUl9DQl9JRCA6Ci0gICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IEhBTF9DUllQX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKLSAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKLSAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrICBJbkNwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IEhBTF9DUllQX091dENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBPdXRDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfRVJST1JfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IEhBTF9DUllQX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICBlbHNlIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgZWxzZSBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogICB7CiAgICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgIHsKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKLSAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKLSAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKICAgICB9CiAgIH0KICAgZWxzZQpAQCAtODc2LDEwICs4ODgsMTAgQEAKICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgfQotICAKKwogICAvKiBSZWxlYXNlIExvY2sgKi8KICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgCisKICAgcmV0dXJuIHN0YXR1czsKIH0KICNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCkBAIC04ODcsMTYgKzg5OSwxNiBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyICBFbmNyeXB0IERlY3J5cHQgZnVuY3Rpb25zIAotICogIEBicmllZiAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLiAKLSAqCi1AdmVyYmF0aW0gICAKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyICBFbmNyeXB0IERlY3J5cHQgZnVuY3Rpb25zCisgICogIEBicmllZiAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgorICAqCitAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgRW5jcnlwdCBEZWNyeXB0ICBmdW5jdGlvbnMgIyMjIyMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKLSAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgQVBJIGFsbG93aW5nIHRvIEVuY3J5cHQvRGVjcnlwdCBEYXRhIGZvbGxvd2luZyAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIEFQSSBhbGxvd2luZyB0byBFbmNyeXB0L0RlY3J5cHQgRGF0YSBmb2xsb3dpbmcKICAgICAgICAgICBTdGFuZGFyZCBERVMvVERFUyBvciBBRVMsIGFuZCBBbGdvcml0aG0gY29uZmlndXJlZCBieSB0aGUgdXNlcjoKLSAgICAgICgrKSBTdGFuZGFyZCBERVMvVERFUyBvbmx5IHN1cHBvcnRlZCBieSBDUllQMSBJUCwgYmVsb3cgbGlzdCBvZiBBbGdvcml0aG0gc3VwcG9ydGVkIDogCisgICAgICAoKykgU3RhbmRhcmQgREVTL1RERVMgb25seSBzdXBwb3J0ZWQgYnkgQ1JZUDEgSVAsIGJlbG93IGxpc3Qgb2YgQWxnb3JpdGhtIHN1cHBvcnRlZCA6CiAgICAgICAgICAgIC0gRWxlY3Ryb25pYyBDb2RlIEJvb2soRUNCKQogICAgICAgICAgICAtIENpcGhlciBCbG9jayBDaGFpbmluZyAoQ0JDKQogICAgICAgKCspIFN0YW5kYXJkIEFFUyAgc3VwcG9ydGVkIGJ5IENSWVAxIElQICYgVGlueUFFUywgbGlzdCBvZiBBbGdvcml0aG0gc3VwcG9ydGVkOgpAQCAtOTA2LDcgKzkxOCw3IEBACiAgICAgICAgICAgIC0gQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCiAgICAgICAgICAgIC0gQ291bnRlciBtb2RlIChDVFIpCiAgICAgICAgICAgIC0gR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKQotICAgICAgICAgICAtIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZShDQ00pIAorICAgICAgICAgICAtIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZShDQ00pCiAgICAgWy4uXSAgVGhyZWUgcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKICAgICAgICgrKSBQb2xsaW5nIG1vZGUgOiBIQUxfQ1JZUF9FbmNyeXB0ICYgSEFMX0NSWVBfRGVjcnlwdAogICAgICAgKCspIEludGVycnVwdCBtb2RlIDogSEFMX0NSWVBfRW5jcnlwdF9JVCAmIEhBTF9DUllQX0RlY3J5cHRfSVQKQEAgLTkyNCwyOCArOTM2LDI5IEBACiAgICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCiAgICogQHBhcmFtICBTaXplOiBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gd29yZC4KICAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQotICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlICAKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgYWxnbzsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQotICB7IAorCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKICAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaGNyeXApOwotICAgIAorCiAgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KICAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKLSAgICAKKwogICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCiAgICAgewpAQCAtOTUzLDEzMiArOTY2LDE0MCBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgICB9Ci0gICAgCi0jaWYgZGVmaW5lZCAoQ1JZUCkgIAotICAgIC8qIFNldCBFbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8gICAKLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgICAKKworI2lmIGRlZmluZWQgKENSWVApCisgICAgLyogU2V0IEVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7Ci0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAKLSAgICBjYXNlIENSWVBfREVTX0VDQjoKLSAgICBjYXNlIENSWVBfREVTX0NCQzoKLSAgICBjYXNlIENSWVBfVERFU19FQ0I6Ci0gICAgY2FzZSBDUllQX1RERVNfQ0JDOgotICAgICAgCi0gICAgICAvKlNldCBLZXkgKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwotICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLypTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChJVikqLyAgICAKLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogRmx1c2ggRklGTyAqLwotICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAgIAotICAgICAgLyogU3RhdHJ0IERFUy9UREVTIGVuY3J5cHRpb24gcHJvY2VzcyAqLyAgICAgCi0gICAgICBzdGF0dXMgPSBDUllQX1RERVNfUHJvY2VzcyhoY3J5cCxUaW1lb3V0KTsgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0VDQjoKLSAgICBjYXNlIENSWVBfQUVTX0NCQzoKLSAgICBjYXNlIENSWVBfQUVTX0NUUjoKLSAgICAgIAotICAgICAgLyogQUVTIGVuY3J5cHRpb24gKi8gICAgICAgCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKLSAgICAgIGJyZWFrOyAgIAotI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkgICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0dDTToKLSAgICAgIAotICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovICAgICAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7Ci0gICAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19DQ006Ci0gICAgICAKLSAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLyAgCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLFRpbWVvdXQpOyAgICAgCi0gICAgICBicmVhazsKLSNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLyAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9ICAgICAgCi0gICAgCi0jZWxzZSAvKkFFUyovCi0gICAgCi0gICAgLyogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKLSAgICAKLSAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gIAotICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOyAgCi0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgotICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgotICAgICAgCi0gICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLyAgICAgICAgCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0KGhjcnlwLCBUaW1lb3V0KTsgICAgIAotICAgICAgYnJlYWs7ICAgCi0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgotICAgICAgCi0gICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8gIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2VzcyAoaGNyeXAsVGltZW91dCkgOyAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgotICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLFRpbWVvdXQpOyAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgICBjYXNlIENSWVBfREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgorICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgorICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgorCisgICAgICAgIC8qU2V0IEtleSAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgICB9CisKKyAgICAgICAgLypTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChJVikqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggRklGTyAqLworICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGF0cnQgREVTL1RERVMgZW5jcnlwdGlvbiBwcm9jZXNzICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfVERFU19Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgICNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pCisgICAgICBjYXNlIENSWVBfQUVTX0dDTToKKworICAgICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgICNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSNlbmRpZiAvKmVuZCBBRVMgb3IgQ1JZUCAqLyAgIAotICAgIAorCisjZWxzZSAvKkFFUyovCisKKyAgICAvKiBTZXQgdGhlIG9wZXJhdGluZyBtb2RlKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KKyAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisjZW5kaWYgLyplbmQgQUVTIG9yIENSWVAgKi8KKwogICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQotICAgIHsgCisgICAgewogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgfSAgICAKKyAgICB9CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfSAKLSAgCisgIH0KKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gIHJldHVybiBIQUxfT0s7ICAKKyAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCkBAIC0xMDg4LDI4ICsxMTA5LDI5IEBACiAgICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKICAgKiBAcGFyYW0gIFNpemU6IExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkLgogICAqIEBwYXJhbSAgT3V0cHV0OiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyKHBsYWludGV4dCkKLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgVGltZW91dCB2YWx1ZSAgCisgICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0LCB1aW50MzJfdCBUaW1lb3V0KQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKLSAgdWludDMyX3QgYWxnbzsgCi0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHVpbnQzMl90IGFsZ287CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICAgewogICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKLSAgICAKKwogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCi0gICAgX19IQUxfTE9DSyhoY3J5cCk7IAotICAgIAorICAgIF9fSEFMX0xPQ0soaGNyeXApOworCiAgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciAgcGFyYW1ldGVycyovCiAgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CiAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOwogICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7Ci0gICAgCisKICAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLwogICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgIHsKQEAgLTExMTcsMTMzICsxMTM5LDE0MSBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgICB9Ci0gICAgCisKICNpZiBkZWZpbmVkIChDUllQKQotICAgIAorCiAgICAgLyogU2V0IERlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7Ci0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgCisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7Ci0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAKLSAgICBjYXNlIENSWVBfREVTX0VDQjoKLSAgICBjYXNlIENSWVBfREVTX0NCQzoKLSAgICBjYXNlIENSWVBfVERFU19FQ0I6Ci0gICAgY2FzZSBDUllQX1RERVNfQ0JDOgotICAgICAgCi0gICAgICAvKlNldCBLZXkgKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwotICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLypTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChJVikqLyAgIAotICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBGbHVzaCBGSUZPICovCi0gICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKLSAgICAgIAotICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwotICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAgICAgCi0gICAgICAvKiBTdGFydCBERVMvVERFUyBkZWNyeXB0aW9uIHByb2Nlc3MgKi8gIAotICAgICAgc3RhdHVzID0gQ1JZUF9UREVTX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOwotICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgotICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgotICAgICAgCi0gICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLyAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7Ci0gICAgICBicmVhazsgICAKLSNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ006Ci0gICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAgICAgICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MgKGhjcnlwLCBUaW1lb3V0KSA7ICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgotICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsgCi0gICAgICBicmVhazsKLSNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLyAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9ICAgICAgCi0gICAgCi0jZWxzZSAvKkFFUyovCi0gICAgCi0gICAgLyogU2V0IERlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsgICAgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKLSAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7Ci0gICAgICBicmVhazsgICAKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2VzcyAoaGNyeXAsIFRpbWVvdXQpIDsgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0NDTToKLSAgICAgIAotICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7ICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgICBjYXNlIENSWVBfREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgorICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgorICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgorCisgICAgICAgIC8qU2V0IEtleSAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgICB9CisKKyAgICAgICAgLypTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChJVikqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggRklGTyAqLworICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGFydCBERVMvVERFUyBkZWNyeXB0aW9uIHByb2Nlc3MgKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9UREVTX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQorICAgICAgY2FzZSBDUllQX0FFU19HQ006CisKKyAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgICNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gCi0gICAgCisKKyNlbHNlIC8qQUVTKi8KKworICAgIC8qIFNldCBEZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KKyAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKLSAgICB7IAorICAgIHsKICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgIAorCiAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwotICAgIH0gICAgCisgICAgfQogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gSEFMX09LOyAgCisgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgpAQCAtMTI1NywyMyArMTI4NywyMyBAQAogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpCiB7Ci0gIHVpbnQzMl90IGFsZ287IAorICB1aW50MzJfdCBhbGdvOwogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICAgewogICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKLSAgICAKKwogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICAgX19IQUxfTE9DSyhoY3J5cCk7Ci0gICAgCisKICAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKLSAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OyAgCi0gICAgCisgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKKwogICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCiAgICAgewpAQCAtMTI4MSwxMjQgKzEzMTEsMTMyIEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CQorICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwogICAgIH0KLSAgICAKKwogI2lmIGRlZmluZWQgKENSWVApCi0gICAgCi0gICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLyAgIAotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7IAotICAgIAotICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLyAgCi0gICAgYWxnbyA9IChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERSk7Ci0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAKLSAgICBjYXNlIENSWVBfREVTX0VDQjoKLSAgICBjYXNlIENSWVBfREVTX0NCQzoKLSAgICBjYXNlIENSWVBfVERFU19FQ0I6Ci0gICAgY2FzZSBDUllQX1RERVNfQ0JDOgotICAgICAgCi0gICAgICAvKlNldCBLZXkgKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwotICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7ICAKLSAgICAgIH0KLSAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogRmx1c2ggRklGTyAqLwotICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAgIAotICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KLSAgICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7Ci0gICAgICAKLSAgICAgIC8qIEVuYWJsZSBDUllQIHRvIHN0YXJ0IERFUy9UREVTIHByb2Nlc3MqLwotICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOyAgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0VDQjoKLSAgICBjYXNlIENSWVBfQUVTX0NCQzoKLSAgICBjYXNlIENSWVBfQUVTX0NUUjoKLSAgICAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdF9JVChoY3J5cCk7Ci0gICAgICBicmVhazsgICAKLSNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ006Ci0gICAgICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQgKGhjcnlwKSA7ICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19DQ006Ci0gICAgICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOyAgCi0gICAgICBicmVhazsKLSNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLyAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7ICAgCi0gICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0jZWxzZSAvKiBBRVMgKi8KLSAgICAKKwogICAgIC8qIFNldCBlbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7IAotICAgIAotICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLyAgCi0gICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7Ci0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgotICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgotICAgICAgCi0gICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLyAgCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0X0lUKGhjcnlwKTsKLSAgICAgIGJyZWFrOyAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKLSAgICAgIAotICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQgKGhjcnlwKSA7ICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19DQ006Ci0gICAgICAKLSAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLyAgCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7Ci0gICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwotICAgICAgYnJlYWs7CisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSAoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREUpOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgorICAgICAgY2FzZSBDUllQX0RFU19DQkM6CisgICAgICBjYXNlIENSWVBfVERFU19FQ0I6CisgICAgICBjYXNlIENSWVBfVERFU19DQkM6CisKKyAgICAgICAgLypTZXQgS2V5ICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMik7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMyk7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNSk7CisgICAgICAgIH0KKyAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggRklGTyAqLworICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLworICAgICAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOworCisgICAgICAgIC8qIEVuYWJsZSBDUllQIHRvIHN0YXJ0IERFUy9UREVTIHByb2Nlc3MqLworICAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdF9JVChoY3J5cCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQorICAgICAgY2FzZSBDUllQX0FFU19HQ006CisKKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisKKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAjZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQotI2VuZGlmIC8qZW5kIEFFUyBvciBDUllQKi8gCi0gICAgCisKKyNlbHNlIC8qIEFFUyAqLworCisgICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0X0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qZW5kIEFFUyBvciBDUllQKi8KKwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gIH0gCi0gIAorICB9CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgpAQCAtMTQxNCwyMSArMTQ1MiwyMSBAQAogewogICB1aW50MzJfdCBhbGdvOwogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCi0gIHsgIAorCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKICAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwotICAgIF9fSEFMX0xPQ0soaGNyeXApOyAgCi0gICAgCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKICAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKICAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OwotICAgIAorCiAgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KICAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgICB7CkBAIC0xNDM2LDEyOCArMTQ3NCwxMzYgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsJCisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CiAgICAgfQotICAgIAorCiAjaWYgZGVmaW5lZCAoQ1JZUCkKLSAgICAKKwogICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUixDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7Ci0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgICAKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09NT0RFOwotICAgIAotICAgIHN3aXRjaChhbGdvKQotICAgIHsgICAgCi0gICAgY2FzZSBDUllQX0RFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0RFU19DQkM6Ci0gICAgY2FzZSBDUllQX1RERVNfRUNCOgotICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKLSAgICAgIAotICAgICAgLypTZXQgS2V5ICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOyAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICAgIH0KLSAgICAgIC8qIEZsdXNoIEZJRk8gKi8KLSAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gICAgICAKLSAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwotICAgICAgCi0gICAgICAvKiBFbmFibGUgQ1JZUCBhbmQgc3RhcnQgREVTL1RERVMgcHJvY2VzcyovCi0gICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7IAotICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgotICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgotICAgICAgCi0gICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfSVQoaGNyeXApOwotICAgICAgYnJlYWs7ICAgCi0jaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNOgotICAgICAgCi0gICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUIChoY3J5cCkgOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0NDTToKLSAgICAgIAotICAgICAgLyogQUVTIENDTWRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsgIAotICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOyAKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgICBjYXNlIENSWVBfREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgorICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgorICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgorCisgICAgICAgIC8qU2V0IEtleSAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisgICAgICAgIC8qIEZsdXNoIEZJRk8gKi8KKyAgICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7CisKKyAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JIHwgQ1JZUF9JVF9PVVRJKTsKKworICAgICAgICAvKiBFbmFibGUgQ1JZUCBhbmQgc3RhcnQgREVTL1RERVMgcHJvY2VzcyovCisgICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfSVQoaGNyeXApOworICAgICAgICBicmVhazsKKyAgICAgICAgI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNOgorCisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUKGhjcnlwKSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgICNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKICAgICB9Ci0gICAgCisKICNlbHNlIC8qQUVTKi8KLSAgICAKKwogICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7IAotICAgIAotICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLyAgCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7Ci0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9JVChoY3J5cCk7Ci0gICAgICBicmVhazsgICAKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQgKGhjcnlwKSA7ICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0NDTToKLSAgICAgIAotICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7IAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAgCi0gICAgCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwotICB9IAotICAKKyAgfQorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KLSAgcmV0dXJuIHN0YXR1czsgIAorICByZXR1cm4gc3RhdHVzOwogfQogCiAvKioKQEAgLTE1NzEsMjMgKzE2MTcsMjQgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0VuY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKIHsKLSAgdWludDMyX3QgYWxnbzsgCisgIHVpbnQzMl90IGFsZ287CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKLSAgCi0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogICB7CiAgICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwotICAgIAorCiAgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgICBfX0hBTF9MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyIGFuZCBwQ3J5cE91dEJ1ZmZQdHIgcGFyYW1ldGVycyovCiAgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CiAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOwogICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7Ci0gICAgCisKICAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLwogICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgIHsKQEAgLTE1OTUsMTUwICsxNjQyLDIwMCBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgICB9Ci0gICAgCisKICNpZiBkZWZpbmVkIChDUllQKQotICAgIAotICAgIC8qIFNldCBlbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8gICAKLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKLSAgICAKLSAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gIAotICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERTsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgotICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKLSAgICBjYXNlIENSWVBfVERFU19DQkM6Ci0gICAgICAKLSAgICAgIC8qU2V0IEtleSAqLwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7Ci0gICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzQpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgIAotICAgICAgfQotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0gICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIEZsdXNoIEZJRk8gKi8KLSAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gICAgICAKLSAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBERVMvVERFUyAqLyAKLSAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKCBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkvNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0VDQjoKLSAgICBjYXNlIENSWVBfQUVTX0NCQzoKLSAgICBjYXNlIENSWVBfQUVTX0NUUjoKLSAgICAgIAotICAgICAgLyogIFNldCB0aGUgS2V5Ki8KLSAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgICAgIAotICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgSVYgKi8KLSAgICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7Ci0gICAgICB9ICAgICAKLSAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsgIAotICAgICAgCi0gICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgQUVTICovIAotICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOyAgICAgICAgICAgIAotICAgICAgYnJlYWs7ICAgCi0jaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNOiAgICAKLSAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BIChoY3J5cCkgOyAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOiAgICAgIAotICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOyAgICAgICAKLSAgICAgIGJyZWFrOwotI2VuZGlmIC8qIEdDTSBDQ00gZGVmaW5lZCovICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0jZWxzZSAvKkFFUyovIAorCiAgICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKLSAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8gCi0gICAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKLSAgICAgIHsgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAgIAotICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIEFFUyAqLyAKLSAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKCBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUvNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAgCi0gICAgICBicmVhazsgICAKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6ICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BIChoY3J5cCkgOyAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19DQ006ICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7ICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7Ci0gICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwotICAgICAgYnJlYWs7CisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERTsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgICBjYXNlIENSWVBfREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgorICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgorICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgorCisgICAgICAgIC8qU2V0IEtleSAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggRklGTyAqLworICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgREVTL1RERVMgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgICAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICAgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBBRVMgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgICNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pCisgICAgICBjYXNlIENSWVBfQUVTX0dDTToKKyAgICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BKGhjcnlwKSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKyAgICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgICNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKICAgICB9Ci0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovICAKLSAgICAKKworI2Vsc2UgLypBRVMqLworICAgIC8qIFNldCBlbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KKyAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgICAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICAgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOworICAgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisgICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBBRVMgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKGhjcnlwLT5TaXplIC8gNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisgICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gIH0gCi0gIAorICB9CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgpAQCAtMTc1MiwyNCArMTg0OSwyNCBAQAogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQogewotICB1aW50MzJfdCBhbGdvOyAKKyAgdWludDMyX3QgYWxnbzsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICAgCi0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogICB7Ci0gICAgCisKICAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwotICAgIF9fSEFMX0xPQ0soaGNyeXApOyAKLSAgICAKKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKwogICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyLCBwQ3J5cE91dEJ1ZmZQdHIgYW5kIFNpemUgcGFyYW1ldGVycyovCiAgICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CiAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDBVOwogICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7Ci0gICAgCisKICAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLwogICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgIHsKQEAgLTE3NzcsMTQwICsxODc0LDE0OSBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKLSAgICB9ICAgIAotICAgIAorICAgICAgaGNyeXAtPlNpemUgPSBTaXplOworICAgIH0KKwogI2lmIGRlZmluZWQgKENSWVApCi0gICAgCisKICAgICAvKiBTZXQgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKLSAgICAKLSAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gICAKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLwogICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERTsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgotICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKLSAgICBjYXNlIENSWVBfVERFU19DQkM6Ci0gICAgICAKLSAgICAgIC8qU2V0IEtleSAqLwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7Ci0gICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzQpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgIAotICAgICAgfQotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0gICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIEZsdXNoIEZJRk8gKi8KLSAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gICAgICAKLSAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBERVMvVERFUyAqLyAKLSAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKCBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkvNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9ETUEoaGNyeXApOwotICAgICAgYnJlYWs7ICAgCi0jaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNOiAgICAgCi0gICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQSAoaGNyeXApIDsgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOiAgICAgIAotICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOyAgICAgICAKLSAgICAgIGJyZWFrOwotI2VuZGlmIC8qIEdDTSBDQ00gZGVmaW5lZCovICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgICBjYXNlIENSWVBfREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgorICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgorICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgorCisgICAgICAgIC8qU2V0IEtleSAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggRklGTyAqLworICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgREVTL1RERVMgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQorICAgICAgY2FzZSBDUllQX0FFU19HQ006CisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAjZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIAorCiAjZWxzZSAvKkFFUyovCi0gICAgCisKICAgICAvKiBTZXQgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOwotICAgIAotICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLyAgCisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9ETUEoaGNyeXApOwotICAgICAgYnJlYWs7ICAgCi0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOiAgICAgCi0gICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQSAoaGNyeXApIDsgICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOiAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7ICAgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfRE1BKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgICAgICAgIAorI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIENSWVAgSVJRIGhhbmRsZXIgbWFuYWdlbWVudCAgCi0gKiAgQGJyaWVmICAgQ1JZUCBJUlEgaGFuZGxlci4KLSAqCi1AdmVyYmF0aW0gICAKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIENSWVAgSVJRIGhhbmRsZXIgbWFuYWdlbWVudAorICAqICBAYnJpZWYgICBDUllQIElSUSBoYW5kbGVyLgorICAqCitAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgIyMjIyMgQ1JZUCBJUlEgaGFuZGxlciBtYW5hZ2VtZW50ICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIENSWVAgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAgICAgICgrKSBIQUxfQ1JZUF9JUlFIYW5kbGVyIENSWVAgaW50ZXJydXB0IHJlcXVlc3QKICAgICAgICgrKSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICAoKykgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrIG91dHB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICAoKykgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayAgQ1JZUCBlcnJvciBjYWxsYmFjawotICAgICAgKCspIEhBTF9DUllQX0dldFN0YXRlIHJldHVybiB0aGUgQ1JZUCBzdGF0ZSAKKyAgICAgICgrKSBIQUxfQ1JZUF9HZXRTdGF0ZSByZXR1cm4gdGhlIENSWVAgc3RhdGUKICAgICAgICgrKSBIQUxfQ1JZUF9HZXRFcnJvciByZXR1cm4gdGhlIENSWVAgZXJyb3IgY29kZQogQGVuZHZlcmJhdGltCiAgICogQHsKQEAgLTE5MjQsOTEgKzIwMzAsOTggQEAKICAgKi8KIHZvaWQgSEFMX0NSWVBfSVJRSGFuZGxlcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQogewotICAKKwogI2lmIGRlZmluZWQgKENSWVApCi0gIAotICBpZigoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfSU5JKSAhPSAweDBVKSB8fCAoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSkgIT0gMHgwVSkpCisKKyAgdWludDMyX3QgaXRzdGF0dXMgPSBoY3J5cC0+SW5zdGFuY2UtPk1JU1I7CisKKyAgaWYgKChpdHN0YXR1cyAmIChDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSkpICE9IDBVKQogICB7Ci0gICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfRUNCKXx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykKKyAgICAgICAgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgIHsKICAgICAgIENSWVBfVERFU19JVChoY3J5cCk7IC8qIERFUyBvciBUREVTKi8KICAgICB9Ci0gICAgZWxzZSBpZigoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ1RSKSkKKyAgICBlbHNlIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQkMpCisgICAgICAgICAgICAgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DVFIpKQogICAgIHsKICAgICAgIENSWVBfQUVTX0lUKGhjcnlwKTsgLypBRVMqLwogICAgIH0KLSNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pICAgIAotICAgIGVsc2UgaWYoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ00pIHx8KGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0NSX0FMR09NT0RFX0FFU19DQ00pICkKKyAgICAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQorICAgIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQ1JfQUxHT01PREVfQUVTX0NDTSkpCiAgICAgewogICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCi0gICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX1BIQVNFX0hFQURFUikgPT0gQ1JZUF9QSEFTRV9IRUFERVIgKQorICAgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9QSEFTRV9IRUFERVIpID09IENSWVBfUEhBU0VfSEVBREVSKQogICAgICAgewogICAgICAgICBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9JVChoY3J5cCk7Ci0gICAgICB9ICAgICAKLSAgICAgIGVsc2UgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8gICAgICAgICAKKyAgICAgIH0KKyAgICAgIGVsc2UgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8KICAgICAgIHsKICAgICAgICAgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKGhjcnlwKTsKICAgICAgIH0KICAgICB9Ci0jZW5kaWYgLyogR0NNIENDTSBkZWZpbmVkKi8gICAgCisgICAgI2VuZGlmIC8qIEdDTSBDQ00gZGVmaW5lZCovCiAgICAgZWxzZQogICAgIHsKICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICB9Ci0gIH0gCi0gIAotI2Vsc2UgLypBRVMqLyAKLSAgaWYoKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsQ1JZUF9JVF9DQ0YpICE9IDB4MFUpICYmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsQ1JZUF9JVF9DQ0ZJRSkgIT0gMHgwVSkpCisgIH0KKworI2Vsc2UgLypBRVMqLworICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9JVF9DQ0YpICE9IFJFU0VUKQogICB7Ci0gICAgCi0gICAgLyogQ2xlYXIgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyAqLwotICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCxDUllQX0NDRl9DTEVBUik7Ci0gICAgCi0gICAgaWYoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKQorICAgIGlmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsIENSWVBfSVRfQ0NGSUUpICE9IFJFU0VUKQogICAgIHsKLSAgICAgIAotICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCi0gICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX1BIQVNFX0hFQURFUikgPT0gQ1JZUF9QSEFTRV9IRUFERVIgKQorCisgICAgICAvKiBDbGVhciBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnICovCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgICAgIHsKLSAgICAgICAgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoaGNyeXApOwotICAgICAgfSAgICAKLSAgICAgIGVsc2UgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8gICAgCisKKyAgICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCisgICAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfUEhBU0VfSEVBREVSKSA9PSBDUllQX1BIQVNFX0hFQURFUikKKyAgICAgICAgeworICAgICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAvKiBpZiBwYXlsb2FkIHBoYXNlICovCisgICAgICAgIHsKKyAgICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKQogICAgICAgewotICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOworICAgICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KKyAgICAgICAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPj0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9JVChoY3J5cCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8KKyAgICAgICAgeworICAgICAgICAgIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChoY3J5cCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgIC8qIEFFUyBBbGdvcml0aG0gRUNCLENCQyBvciBDVFIqLworICAgICAgeworICAgICAgICBDUllQX0FFU19JVChoY3J5cCk7CiAgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKLSAgICB7Ci0gICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KLSAgICAgIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplID49ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICkKLSAgICAgIHsKLSAgICAgICAgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoaGNyeXApOwotICAgICAgfSAgICAKLSAgICAgIGVsc2UgICAvKiBpZiBwYXlsb2FkIHBoYXNlICovICAKLSAgICAgIHsKLSAgICAgICAgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKGhjcnlwKTsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIGVsc2UgIC8qIEFFUyBBbGdvcml0aG0gRUNCLENCQyBvciBDVFIqLwotICAgIHsKLSAgICAgIENSWVBfQUVTX0lUKGhjcnlwKTsKLSAgICB9Ci0gIH0gICAgCisgIH0KICAgLyogQ2hlY2sgaWYgZXJyb3Igb2NjdXJyZWQgKi8KLSAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCxDUllQX0lUX0VSUklFKSAhPSBSRVNFVCkKKyAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCwgQ1JZUF9JVF9FUlJJRSkgIT0gUkVTRVQpCiAgIHsKICAgICAvKiBJZiB3cml0ZSBFcnJvciBvY2N1cnJlZCAqLwotICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLENSWVBfSVRfV1JFUlIpICE9IFJFU0VUKQorICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLCBDUllQX0lUX1dSRVJSKSAhPSBSRVNFVCkKICAgICB7CiAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1dSSVRFOwogICAgIH0KICAgICAvKiBJZiByZWFkIEVycm9yIG9jY3VycmVkICovCi0gICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsQ1JZUF9JVF9SREVSUikgIT0gUkVTRVQpCisgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsIENSWVBfSVRfUkRFUlIpICE9IFJFU0VUKQogICAgIHsKICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfUkVBRDsKICAgICB9CiAgIH0KLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgIAorI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogfQogCiAvKioKQEAgLTIwNDMsMTAgKzIxNTYsMTAgQEAKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGNyeXApOwotIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAKIC8qKgpAQCAtMjA1OSw3ICsyMTcyLDcgQEAKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGNyeXApOwotIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KQEAgLTIwNzEsMTQgKzIxODQsMTQgQEAKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSBfX3dlYWsgdm9pZCBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCitfX3dlYWsgdm9pZCBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhjcnlwKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAvKioKICAgKiBAfQpAQCAtMjA4OSw4OCArMjIwMiw5NCBAQAogICAqIEB7CiAgICovCiAKLSAjaWYgZGVmaW5lZCAoQ1JZUCkKKyNpZiBkZWZpbmVkIChDUllQKQogCiAvKioKICAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gRUNCL0NCQyBBbGdvcml0aG0gd2l0aCBERVMvVERFUyBzdGFuZGFyZC4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUgCi0gICogQHBhcmFtICBUaW1lb3V0OiBzcGVjaWZ5IFRpbWVvdXQgdmFsdWUgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IHNwZWNpZnkgVGltZW91dCB2YWx1ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfVERFU19Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8gIAotICB1aW50MTZfdCBpbmNvdW50OyAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8gCisgIHVpbnQzMl90IHRlbXBbMl07ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDE2X3QgaW5jb3VudDsgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCiAgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLwotICAKKyAgdWludDMyX3QgaTsKKwogICAvKiBFbmFibGUgQ1JZUCAqLwogICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKLSAgCi0gIC8qU3RhcnQgcHJvY2Vzc2luZyovICAKLSAgd2hpbGUoKGhjcnlwLT5DcnlwSW5Db3VudCA8IChoY3J5cC0+U2l6ZS80VSkpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQotICB7IAotICAgIC8qIFRlbXBvcmFyeSBDcnlwSW5Db3VudCBWYWx1ZSAqLyAKLSAgICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OyAgICAgIAorCisgIC8qU3RhcnQgcHJvY2Vzc2luZyovCisgIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQorICB7CisgICAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCisgICAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKICAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KLSAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORiApICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCisgICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19JRk5GKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCiAgICAgewogICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgICAgICAKLSAgICB9ICAgCi0gICAgCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICB9CisKICAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgeyAKKyAgICBpZiAoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvckNvZGUqLwogICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICB9Ci0gICAgCisKICAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKLSAgICAKLSAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQorCisgICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQogICAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IEJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovICAgIAotICAgICAgdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgCi0gICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgCi0gICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsgICAgICAKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgIAorICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgQnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8KKyAgICAgIGZvciAoaSA9IDBVOyBpIDwgMlU7IGkrKykKKyAgICAgIHsKKyAgICAgICAgdGVtcFtpXSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICAgIH0KKyAgICAgIGkgPSAwVTsKKyAgICAgIHdoaWxlICgoKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoKGhjcnlwLT5TaXplKSAvIDRVKSkpICYmIChpIDwgMlUpKQorICAgICAgeworICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CisgICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICAgICAgaSsrOworICAgICAgfQogICAgIH0KICAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAgfQogICAvKiBEaXNhYmxlIENSWVAgKi8KLSAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsgCisgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gSEFMX09LOyAgCisgIHJldHVybiBIQUxfT0s7CiB9CiAKLS8qKiAKKy8qKgogICAqIEBicmllZiAgQ1JZUCBibG9jayBpbnB1dC9vdXRwdXQgZGF0YSBoYW5kbGluZyB1bmRlciBpbnRlcnJ1cHRpb24gd2l0aCBERVMvVERFUyBzdGFuZGFyZC4KICAgKiBAbm90ZSAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKICAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgQ1JZUF9EZWNyeXB0X0lUKCkgYW5kIENSWVBfRW5jcnlwdF9JVCgpLgpAQCAtMjE4MCw3MyArMjI5OSw4NCBAQAogICAqLwogc3RhdGljIHZvaWQgQ1JZUF9UREVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7Ci0gIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8gCi0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfQlVTWSkKLSAgeyAKLSAgICBpZigoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfSU5JKSAhPSAweDBVKSAmJiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9GTEFHX0lOUklTKSAhPSAweDBVKSkKLSAgICAgIAotICAgIHsgICAgIAotICAgICAgLyogV3JpdGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICAKLSAgICAgIGlmKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSkKLSAgICAgIHsgICAgIAotICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdGlvbiAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKLSAgICAgICAgLyogQ2FsbCB0aGUgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKSAKLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwotICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOworICB1aW50MzJfdCB0ZW1wWzJdOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisgIHVpbnQzMl90IGk7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9CVVNZKQorICB7CisgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUKGhjcnlwLCBDUllQX0lUX0lOSSkgIT0gMHgwVSkKKyAgICB7CisgICAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9GTEFHX0lOUklTKSAhPSAweDBVKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKworICAgICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09ICgodWludDE2X3QpKGhjcnlwLT5TaXplKSAvIDRVKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0aW9uICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CisgICAgICAgICAgLyogQ2FsbCB0aGUgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKLSAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICBpZigoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSkgIT0gMHgwVSkmJiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9GTEFHX09VVFJJUykgIT0gMHgwVSkpCisgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUKGhjcnlwLCBDUllQX0lUX09VVEkpICE9IDB4MFUpCiAgICAgewotICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgQnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8gICAgCi0gICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7ICAgICAgCi0gICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAKLSAgICAgIHRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgICAgICAgICAgIAotICAgICAgaWYoaGNyeXAtPkNyeXBPdXRDb3VudCA9PSAgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSkKKyAgICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLCBDUllQX0ZMQUdfT1VUUklTKSAhPSAweDBVKQogICAgICAgewotICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdGlvbiAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7Ci0gICAgICAgIAotICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAKLSAgICAgICAgCi0gICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CisgICAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IEJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovCisgICAgICAgIGZvciAoaSA9IDBVOyBpIDwgMlU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHRlbXBbaV0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgICAgIH0KKyAgICAgICAgaSA9IDBVOworICAgICAgICB3aGlsZSAoKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSkgLyA0VSkpKSAmJiAoaSA8IDJVKSkKKyAgICAgICAgeworICAgICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChoY3J5cC0+Q3J5cE91dENvdW50ID09ICgodWludDE2X3QpKGhjcnlwLT5TaXplKSAvIDRVKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0aW9uICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX09VVEkpOworCisgICAgICAgICAgLyogRGlzYWJsZSBDUllQICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQogICAgICAgfQotICAgIH0gICAKKyAgICB9CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwotICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgICAKKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCkBAIC0yMjYwLDU4ICsyMzkwLDgwIEBACiAKIC8qKgogICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIEFsZ29yaXRobSB3aXRoIEFFUyBTdGFuZGFyZAotICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIAotICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlIAorICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCisgICogQHBhcmFtICBUaW1lb3V0OiBzcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCi17ICAKK3sKICAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCi0gIAotICAvKiAgU2V0IHRoZSBLZXkqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KLSNpZiBkZWZpbmVkIChBRVMpICAgICAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotI2Vsc2UgLyogQ1JZUCAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQogICB9Ci0gIAorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisKKyAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisjZWxzZSAvKiBDUllQICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworICAgIH0KKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKwogICAvKiBTZXQgdGhlIHBoYXNlICovCiAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgCisKICAgLyogRW5hYmxlIENSWVAgKi8KICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKKwogICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gIAotICB3aGlsZSgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCi0gIHsgICAgICAKKworICB3aGlsZSAoKGhjcnlwLT5DcnlwSW5Db3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKKyAgewogICAgIC8qIFdyaXRlIHBsYWluIERkdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLwotICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOyAKKyAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CiAgICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KLSAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7ICAgICAKLSAgfSAKLSAgCisgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICB9CisKICAgLyogRGlzYWJsZSBDUllQICovCiAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gIAorCiAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gSEFMX09LOyAgIAorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKQEAgLTIzMjEsMjAyICsyNDczLDI0NSBAQAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKLXsgICAKLSAgCi0gIC8qICBTZXQgdGhlIEtleSovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgCi0gIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQoreworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogICB7Ci0gICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwotI2lmIGRlZmluZWQgKEFFUykgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotICAgIAotI2Vsc2UgLyogQ1JZUCAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQogICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKyAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyNlbHNlIC8qIENSWVAgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisgICAgfQorICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSAgaWYoaGNyeXAtPlNpemUgIT0gMFUpCi0gIHsgICAgCi0jaWYgZGVmaW5lZCAoQUVTKSAKLSAgICAKKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKyNpZiBkZWZpbmVkIChBRVMpCisKICAgICAvKiBFbmFibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKLSAgICAKKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCiAgICAgLyogRW5hYmxlIENSWVAgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7IAotICAgIAotI2Vsc2UgLyogQ1JZUCAqLyAgCi0gICAgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworCisjZWxzZSAvKiBDUllQICovCisKICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7Ci0gICAgCisKICAgICAvKiBFbmFibGUgQ1JZUCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgCi0gICAgCi0jZW5kaWYgLyogIEVuZCBBRVMgb3IgQ1JZUCAgKi8gICAgICAKKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyNlbmRpZiAvKiAgRW5kIEFFUyBvciBDUllQICAqLwogICB9CiAgIGVsc2UKLSAgeyAgCisgIHsKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAKKwogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgCi0gIH0gICAKLSAgCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgfQorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCiAgICogQGJyaWVmICBEZWNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZAotICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIAotICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlIAorICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCisgICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQgKQoteyAgCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQorewogICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KLSAgCi0gIC8qICBLZXkgcHJlcGFyYXRpb24gZm9yIEVDQi9DQkMgKi8KLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19DVFIpIAorICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogICB7Ci0jaWYgZGVmaW5lZCAoQUVTKSAKLSAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIgS2V5IHByZXBhcmF0aW9uKi8KLSAgICB7ICAgICAKLSAgICAgIC8qIFNldCBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOwotICAgICAgCisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgIH0KKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQorICAgIHsKKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIgS2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKKworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICB9CisgICAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOworICAgICAgfQorI2Vsc2UgLyogQ1JZUCAqLworICAgICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQ1JfQUxHT01PREVfQUVTX0tFWSk7CisKICAgICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7IAotICAgICAgCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKICAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgeyAKKworICAgICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgaWYgKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAotICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KLSAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCi0gICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgICAgIAotICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovICAgICAgCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICAvKiBUdXJuIGJhY2sgdG8gQUxHT01PREUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KICAgICB9Ci0gICAgZWxzZSAvKk1vZGUgNCA6IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24qLworICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwogICAgIHsKICAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYgS2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8gICAgICAgICAgICAgCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKTsgIAotICAgIH0gICAgIAorICAgIH0KKworICAgIC8qIFNldCBJViAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiAjZWxzZSAvKiBDUllQICovCi0gICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkgKTsKLSAgICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgICAKLSAgICAvKiBFbmFibGUgQ1JZUCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgICAKLSAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgaWYoQ1JZUF9XYWl0T25CVVNZRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgeyAKLSAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAotICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9ICAgICAgIAotICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuQWxnb3JpdGhtICk7ICAKLSAgICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovIAotICB9Ci0gIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwotICB7ICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgfSAKLSAgCi0gIC8qIFNldCBJViAqLyAKLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCi0gIHsKLSAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0jaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSNlbHNlIC8qIENSWVAgKi8KLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICB9ICAgICAKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCiAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKKwogICAvKiBFbmFibGUgQ1JZUCAqLwogICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLyAgCi0gIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsgCi0gIAotICB3aGlsZSgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCi0gIHsgICAgICAKKworICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLworICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisKKyAgd2hpbGUgKChoY3J5cC0+Q3J5cEluQ291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCisgIHsKICAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KLSAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCxUaW1lb3V0KTsKKyAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CiAgICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gIH0gIAotICAKKyAgfQorCiAgIC8qIERpc2FibGUgQ1JZUCAqLwogICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKKwogICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KLSAgcmV0dXJuIEhBTF9PSzsgICAKKyAgcmV0dXJuIEhBTF9PSzsKIH0KIC8qKgogICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQgdXNpbmcgaW50ZXJydXB0IG1vZGUKQEAgLTI1MjcsMTU2ICsyNzIyLDE3NiBAQAogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKICAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOwotICAKLSAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLwotICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0NUUikgCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgIHsKLSNpZiBkZWZpbmVkIChBRVMpIAotICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBLZXkgcHJlcGFyYXRpb24qLwotICAgIHsgICAgIAotICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTik7Ci0gICAgICAKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQorICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKyAgICAvKiAgS2V5IHByZXBhcmF0aW9uIGZvciBFQ0IvQ0JDICovCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19DVFIpCisgICAgeworI2lmIGRlZmluZWQgKEFFUykKKyAgICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBLZXkgcHJlcGFyYXRpb24qLworICAgICAgeworICAgICAgICAvKiBTZXQga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOworCisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0tFWVBSRVBBUkFUSU9OOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgY291bnQtLSA7CisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7CisgICAgICB9CisjZWxzZSAvKiBDUllQICovCisKKyAgICAgIC8qIGNoYW5nZSBBTEdPTU9ERSB0byBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24qLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkpOworCiAgICAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOyAKLSAgICAgIAorICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCiAgICAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KKworICAgICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT047CiAgICAgICBkbwogICAgICAgewogICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgaWYoY291bnQgPT0gMFUpCisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgewotICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCiAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQotICAgICAgfQotICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwotICAgICAgCi0gICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwotICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7Ci0gICAgICAKLSAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLyAKLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKKyAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7CisKKyAgICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOworCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgICAgfQotICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KKworICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwogICAgIHsKICAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8gCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKTsgCi0gICAgfSAgICAgICAgCi0jZWxzZSAvKiBDUllQICovCi0gICAgCi0gICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkgKTsKLSAgICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgICAKLSAgICAvKiBFbmFibGUgQ1JZUCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgICAKLSAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgY291bnQgPSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT047Ci0gICAgZG8KLSAgICB7Ci0gICAgICBjb3VudC0tIDsKLSAgICAgIGlmKGNvdW50ID09IDBVKQotICAgICAgewotICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgICB9CiAgICAgfQotICAgIHdoaWxlKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7ICAKLSAgICAKLSAgICAvKiBUdXJuIGJhY2sgdG8gQUxHT01PREUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIGhjcnlwLT5Jbml0LkFsZ29yaXRobSApOyAKLSAgICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgCi0gIH0KLSAgCi0gIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwotICB7ICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgfSAgICAKLSAgCi0gIC8qIFNldCBJViAqLyAKLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCi0gIHsKLSAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0jaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKKworICAgIC8qIFNldCBJViAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiAjZWxzZSAvKiBDUllQICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KLSAgfSAgICAgCisgICAgfQorICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKLSAgeyAKLSAgICAKLSNpZiBkZWZpbmVkIChBRVMpIAotICAgIAorICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKworI2lmIGRlZmluZWQgKEFFUykKKwogICAgIC8qIEVuYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCi0gICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOwotICAgIAorICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKICAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgIAotICAgIAorICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKwogI2Vsc2UgLyogQ1JZUCAqLwotICAgIAorCiAgICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwotICAgIAorCiAgICAgLyogRW5hYmxlIENSWVAgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovICAgICAgICAKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogICB9Ci0gIGVsc2UgCisgIGVsc2UKICAgewogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICB9ICAKLSAgCisgIH0KKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CkBAIC0yNjg5LDEzMSArMjkwNCwxNTAgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQogewogICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7Ci0gIAotICAvKiAgS2V5IHByZXBhcmF0aW9uIGZvciBFQ0IvQ0JDICovCi0gIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKSAgCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgIHsKLSNpZiBkZWZpbmVkIChBRVMpIAotICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBrZXkgcHJlcGFyYXRpb24qLwotICAgIHsgICAgIAotICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTik7Ci0gICAgICAKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQorICB9CisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQorICAgIHsKKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIga2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKKworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICB9CisgICAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOworICAgICAgfQorI2Vsc2UgLyogQ1JZUCAqLworICAgICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQ1JfQUxHT01PREVfQUVTX0tFWSk7CisKICAgICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7IAotICAgICAgCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKICAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworCisgICAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKICAgICAgIGRvCiAgICAgICB7CiAgICAgICAgIGNvdW50LS0gOwotICAgICAgICBpZihjb3VudCA9PSAwVSkKKyAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgICAgCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKLSAgICAgIAotICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KLSAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAgICAgCi0gICAgICAvKiBSZXR1cm4gdG8gZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZShNb2RlIDMpKi8gICAgICAKLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsgICAKKyAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7CisKKyAgICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOworCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwogICAgIH0KLSAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiovCisgICAgZWxzZSAgLypBbGdvcml0aG0gQ1RSICovCiAgICAgewogICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgICAgIAotICAgICAgLyogU2V0IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24gb3BlcmF0aW5nIG1vZGUqLyAKLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOyAKLSAgICB9ICAgICAKLSNlbHNlIC8qIENSWVAgKi8gICAKLSAgICAvKiBjaGFuZ2UgQUxHT01PREUgdG8ga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQ1JfQUxHT01PREVfQUVTX0tFWSApOwotICAgIAotICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwotICAgIAotICAgIC8qIEVuYWJsZSBDUllQICovCi0gICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAgIAotICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKLSAgICBkbwotICAgIHsKLSAgICAgIGNvdW50LS0gOwotICAgICAgaWYoY291bnQgPT0gMFUpCi0gICAgICB7Ci0gICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKLSAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgfQogICAgIH0KLSAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpOwotICAgIAotICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuQWxnb3JpdGhtICk7IAotICAgIAotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8gCi0gIH0KLSAgZWxzZSAgLypBbGdvcml0aG0gQ1RSICovCi0gIHsgIAotICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwotICB9IAotICAKLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCi0gIHsKLSAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0jaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiAjZWxzZSAvKiBDUllQICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCi0gIH0gICAgICAKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gIAotICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKLSAgeyAgICAKLSAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCi0gICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOyAgICAKKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKyAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8KKyAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUgLyA0VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICB9Ci0gIGVsc2UgCisgIGVsc2UKICAgewogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwotICAgIAorCiAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gIH0gICAgICAgCi0gIAorICB9CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQpAQCAtMjgyNCw0MCArMzA1OCw0MCBAQAogICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotc3RhdGljIHZvaWQgQ1JZUF9ETUFJbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAKK3N0YXRpYyB2b2lkIENSWVBfRE1BSW5DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBDUllQX0hhbmRsZVR5cGVEZWYqIGhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKLSAgCisgIENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAgPSAoQ1JZUF9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciBpbnB1dCBGSUZPIHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBESUVOIGJpdAogICBpbiB0aGUgRE1BQ1IgcmVnaXN0ZXIgKi8KLSNpZiBkZWZpbmVkIChDUllQKSAgCi0gIGhjcnlwLT5JbnN0YW5jZS0+RE1BQ1IgJj0gKHVpbnQzMl90KSh+Q1JZUF9ETUFDUl9ESUVOKTsgIAotICAKKyNpZiBkZWZpbmVkIChDUllQKQorICBoY3J5cC0+SW5zdGFuY2UtPkRNQUNSICY9ICh1aW50MzJfdCkofkNSWVBfRE1BQ1JfRElFTik7CisKICNlbHNlIC8qIEFFUyAqLwogICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RNQUlORU4pOwotICAKKwogICAvKiBUaW55QUVTMiwgTm8gb3V0cHV0IG9uIENDTSBBRVMsIHVubG9jayBzaG91bGQgYmUgZG9uZSB3aGVuIGlucHV0IGRhdGEgcHJvY2VzcyBjb21wbGV0ZSAqLwotICBpZigoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfQ0NNKSA9PSBDUllQX0FFU19DQ00pCi0gIHsgIAorICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0NDTSkgPT0gQ1JZUF9BRVNfQ0NNKQorICB7CiAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9DQ0ZfQ0xFQVIpOwotICAgIAorICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCiAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIHRvIHJlYWR5ICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgfQotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAKLSAgCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgLyogQ2FsbCBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogfQogCiAvKioKQEAgLTI4NjcsODQgKzMxMDEsODQgQEAKICAgKi8KIHN0YXRpYyB2b2lkIENSWVBfRE1BT3V0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgQ1JZUF9IYW5kbGVUeXBlRGVmKiBoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7Ci0gIAorICBDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCiAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igb3V0cHV0IEZJRk8gcmVxdWVzdCBieSByZXNldHRpbmcKICAgdGhlIERPRU4gYml0IGluIHRoZSBETUFDUiByZWdpc3RlciAqLwotICAKLSNpZiBkZWZpbmVkIChDUllQKSAKKworI2lmIGRlZmluZWQgKENSWVApCiAKICAgaGNyeXAtPkluc3RhbmNlLT5ETUFDUiAmPSAodWludDMyX3QpKH5DUllQX0RNQUNSX0RPRU4pOwotI2lmIGRlZmluZWQgKENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSkgIAotICBpZigoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNKSAhPSBDUllQX0FFU19HQ00pCi0gIHsgIAorICAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQorICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTSkgIT0gQ1JZUF9BRVNfR0NNKQorICB7CiAgICAgLyogRGlzYWJsZSBDUllQICAobm90IGFsbG93ZWQgaW4gIEdDTSkqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgIH0KIAotI2Vsc2UgLypOTyBHQ00gQ0NNICovCi0gICAgLyogRGlzYWJsZSBDUllQICovCi0gICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLyAgICAKLSNlbHNlIC8qIEFFUyAqLyAKLSAgCisgICNlbHNlIC8qTk8gR0NNIENDTSAqLworICAvKiBEaXNhYmxlIENSWVAgKi8KKyAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKyAgI2VuZGlmIC8qIEdDTSBDQ00gZGVmaW5lZCovCisjZWxzZSAvKiBBRVMgKi8KKwogICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RNQU9VVEVOKTsKLSAgCisKICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLENSWVBfQ0NGX0NMRUFSKTsgIAotICAKLSAgaWYoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTV9HTUFDKSAhPSBDUllQX0FFU19HQ01fR01BQykKLSAgeyAgCi0gICAgLyogRGlzYWJsZSBDUllQIChub3QgYWxsb3dlZCBpbiAgR0NNKSovIAorICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTV9HTUFDKSAhPSBDUllQX0FFU19HQ01fR01BQykKKyAgeworICAgIC8qIERpc2FibGUgQ1JZUCAobm90IGFsbG93ZWQgaW4gIEdDTSkqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gIH0gCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovIAotICAKKyAgfQorI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworCiAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSB0byByZWFkeSAqLwogICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwotICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgLyogQ2FsbCBvdXRwdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgRE1BIENSWVAgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4gCisgICogQGJyaWVmICBETUEgQ1JZUCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgogICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogc3RhdGljIHZvaWQgQ1JZUF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgQ1JZUF9IYW5kbGVUeXBlRGVmKiBoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7Ci0gIAotICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLyAKLSAgaGNyeXAtPlN0YXRlPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisgIENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAgPSAoQ1JZUF9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7IAotICAKLSNpZiBkZWZpbmVkIChBRVMpIAotICAKKyAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7CisKKyNpZiBkZWZpbmVkIChBRVMpCisKICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLENSWVBfQ0NGX0NMRUFSKTsgIAotICAKLSNlbmRpZiAvKiBBRVMgKi8gICAKLSAgCisgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisjZW5kaWYgLyogQUVTICovCisKICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiB9CiAKIC8qKgpAQCAtMjk2MCw0NCArMzE5NCw0NCBAQAogewogICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgIGhjcnlwLT5oZG1haW4tPlhmZXJDcGx0Q2FsbGJhY2sgPSBDUllQX0RNQUluQ3BsdDsKLSAgCisKICAgLyogU2V0IHRoZSBETUEgaW5wdXQgZXJyb3IgY2FsbGJhY2sgKi8KICAgaGNyeXAtPmhkbWFpbi0+WGZlckVycm9yQ2FsbGJhY2sgPSBDUllQX0RNQUVycm9yOwotICAKKwogICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgIGhjcnlwLT5oZG1hb3V0LT5YZmVyQ3BsdENhbGxiYWNrID0gQ1JZUF9ETUFPdXRDcGx0OwotICAKKwogICAvKiBTZXQgdGhlIERNQSBvdXRwdXQgZXJyb3IgY2FsbGJhY2sgKi8KICAgaGNyeXAtPmhkbWFvdXQtPlhmZXJFcnJvckNhbGxiYWNrID0gQ1JZUF9ETUFFcnJvcjsKLSAgCi0jaWYgZGVmaW5lZCAoQ1JZUCkgICAKLSAgCisKKyNpZiBkZWZpbmVkIChDUllQKQorCiAgIC8qIEVuYWJsZSBDUllQICovCiAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCisKICAgLyogRW5hYmxlIHRoZSBpbnB1dCBETUEgU3RyZWFtICovCi0gIGlmICggSEFMX0RNQV9TdGFydF9JVChoY3J5cC0+aGRtYWluLCBpbnB1dGFkZHIsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ESU4sIFNpemUpIT1IQUxfT0spCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1haW4sIGlucHV0YWRkciwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRJTiwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAotICB9ICAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KICAgLyogRW5hYmxlIHRoZSBvdXRwdXQgRE1BIFN0cmVhbSAqLwotICBpZiAoSEFMX0RNQV9TdGFydF9JVChoY3J5cC0+aGRtYW91dCwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRPVVQsIG91dHB1dGFkZHIsIFNpemUpIT1IQUxfT0spCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1hb3V0LCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RE9VVCwgb3V0cHV0YWRkciwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCkBAIC0zMDA3LDE4OSArMzI0MSwxODggQEAKICAgfQogICAvKiBFbmFibGUgSW4vT3V0IERNQSByZXF1ZXN0ICovCiAgIGhjcnlwLT5JbnN0YW5jZS0+RE1BQ1IgPSBDUllQX0RNQUNSX0RPRU4gfCBDUllQX0RNQUNSX0RJRU47Ci0gIAorCiAjZWxzZSAvKiBBRVMgKi8KLSAgCi0gIGlmKCgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNX0dNQUMpICE9IENSWVBfQUVTX0dDTV9HTUFDKSAmJiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0NDTSkgIT0gQ1JZUF9BRVNfQ0NNKSkKLSAgeyAgCi0gICAgLyogRW5hYmxlIENSWVAgKG5vdCBhbGxvd2VkIGluICBHQ00gJiBDQ00pKi8gCisKKyAgaWYgKCgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNX0dNQUMpICE9IENSWVBfQUVTX0dDTV9HTUFDKQorICAgICAgJiYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pICE9IENSWVBfQUVTX0NDTSkpCisgIHsKKyAgICAvKiBFbmFibGUgQ1JZUCAobm90IGFsbG93ZWQgaW4gIEdDTSAmIENDTSkqLwogICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgfSAKLSAgCisgIH0KKwogICAvKiBFbmFibGUgdGhlIERNQSBpbnB1dCBzdHJlYW0gKi8KLSAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RElOUiwgU2l6ZSkhPUhBTF9PSykKKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RElOUiwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0gIH0gIAorICB9CiAgIC8qIEVuYWJsZSB0aGUgRE1BIG91dHB1dCBzdHJlYW0gKi8KLSAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFvdXQsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ET1VUUiwgb3V0cHV0YWRkciwgU2l6ZSkhPUhBTF9PSykKKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFvdXQsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ET1VUUiwgb3V0cHV0YWRkciwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0gIH0gIAotIC8qQUVTMnYxLjEuMSA6IENDTSBhdXRoZW50aWNhdGlvbiA6IG5vIGluaXQgcGhhc2UsIG9ubHkgaGVhZGVyIGFuZCBmaW5hbCBwaGFzZSAqLyAKKyAgfQorICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8KICAgLyogRW5hYmxlIEluIGFuZCBPdXQgRE1BIHJlcXVlc3RzICovCi0gIGlmKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKLSAgeyAKKyAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKKyAgewogICAgIC8qIEVuYWJsZSBvbmx5IEluIERNQSByZXF1ZXN0cyBmb3IgQ0NNKi8KLSAgICBTRVRfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfRE1BSU5FTiApKTsKKyAgICBTRVRfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfRE1BSU5FTikpOwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEVuYWJsZSBJbiBhbmQgT3V0IERNQSByZXF1ZXN0cyAqLwogICAgIFNFVF9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgKEFFU19DUl9ETUFJTkVOIHwgQUVTX0NSX0RNQU9VVEVOKSk7Ci0gIH0gIAorICB9CiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgUHJvY2VzcyBEYXRhOiBXcml0ZSBJbnB1dCBkYXRhIGluIHBvbGxpbmcgbW9kZSBhbmQgdXNlZCBpbiBBRVMgZnVuY3Rpb25zLiAKKyAgKiBAYnJpZWYgIFByb2Nlc3MgRGF0YTogV3JpdGUgSW5wdXQgZGF0YSBpbiBwb2xsaW5nIG1vZGUgYW5kIHVzZWQgaW4gQUVTIGZ1bmN0aW9ucy4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgVGltZW91dCB2YWx1ZSAgCisgICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIENSWVBfQUVTX1Byb2Nlc3NEYXRhKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIAotICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisKKyAgdWludDMyX3QgdGVtcFs0XTsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBpOwogI2lmIGRlZmluZWQgKENSWVApCiAgIHVpbnQxNl90IGluY291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KICAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCi0jZW5kaWYgCi0gIAotI2lmIGRlZmluZWQgKENSWVApICAKLSAgIAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChDUllQKQorCiAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCi0gIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7IAotICAKLSAgaWYoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX0lGTkYgKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQorICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworCisgIGlmICgoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORikgIT0gMHgwVSkgJiYgKGluY291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQogICB7CiAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgICAgIAorICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgIH0KLSAgCisKICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICBpZihDUllQX1dhaXRPbk9GTkVGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgeyAKKyAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgewogICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgCi0gICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAotICB9IAotICAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKwogICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gIAotICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQorCisgIGlmICgoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKICAgewotICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAgIAotICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXA7ICAgICAgCi0gICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgIAotICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAotICB9IAotICAKKyAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLworICAgIGZvciAoaSA9IDBVOyBpIDwgNFU7IGkrKykKKyAgICB7CisgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgIH0KKyAgICBpID0gMFU7CisgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCA0VSkpCisgICAgeworICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgICAgaSsrOworICAgIH0KKyAgfQorCiAjZWxzZSAvKiBBRVMgKi8KLSAgCisKICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAgICAKLSAgCisgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKwogICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICB7IAorICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgewogICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAKLSAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICB9Ci0gIAorCiAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAKLSAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPXRlbXA7Ci0gIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID10ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsgCi0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAotICAKKworICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyKi8KKyAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQorICB7CisgICAgdGVtcFtpXSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgIH0KKyAgaSA9IDBVOworICB3aGlsZSAoKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoKGhjcnlwLT5TaXplICsgM1UpIC8gNFUpKSAmJiAoaSA8IDRVKSkKKyAgeworICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgaSsrOworICB9CiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiB9CiAKLS8qKiAKKy8qKgogICAqIEBicmllZiAgSGFuZGxlIENSWVAgYmxvY2sgaW5wdXQvb3V0cHV0IGRhdGEgaGFuZGxpbmcgdW5kZXIgaW50ZXJydXB0aW9uLgogICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQogICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfQ1JZUF9FbmNyeXB0X0lUIG9yIEhBTF9DUllQX0RlY3J5cHRfSVQuCkBAIC0zMTk5LDM2ICszNDMyLDM3IEBACiAgICovCiBzdGF0aWMgdm9pZCBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQogewotICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCi0jaWYgZGVmaW5lZCAoQ1JZUCkgCisgIHVpbnQzMl90IHRlbXBbNF07ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDMyX3QgaTsKKyNpZiBkZWZpbmVkIChDUllQKQogICB1aW50MTZfdCBpbmNvdW50OyAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KICAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCi0jZW5kaWYgCi0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfQlVTWSkKLSAgeyAKLSNpZiBkZWZpbmVkIChDUllQKSAKLSAgIAorI2VuZGlmCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9CVVNZKQorICB7CisjaWYgZGVmaW5lZCAoQ1JZUCkKKwogICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKLSAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORiApICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCisgICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19JRk5GKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCiAgICAgewogICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgICAgCi0gICAgICBpZihoY3J5cC0+Q3J5cEluQ291bnQgPT0gICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSkpCi0gICAgICB7ICAgICAKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09ICgodWludDE2X3QpKGhjcnlwLT5TaXplKSAvIDRVKSkKKyAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpOwotICAgICAgICAKKwogICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKQEAgLTMyMzksNzkgKzM0NzMsNzcgQEAKICAgICB9CiAgICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gICAgCi0gICAgaWYoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUvNFUpKSkKKworICAgIGlmICgoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKICAgICB7Ci0gICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLyAKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOyAgICAgIAotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwotICAgICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAgIAotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgICAKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgIAotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAKLSAgICAgIGlmKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSkpCisgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLworICAgICAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQorICAgICAgeworICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgICAgfQorICAgICAgaSA9IDBVOworICAgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCA0VSkpCisgICAgICB7CisgICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKKyAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgICAgICBpKys7CisgICAgICB9CisgICAgICBpZiAoaGNyeXAtPkNyeXBPdXRDb3VudCA9PSAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkgLyA0VSkpCiAgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAgICAgIAotICAgICAgICAKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKICAgICAgICAgLyogRGlzYWJsZSBDUllQICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAotICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworCisgICAgICAgIC8qIENhbGwgT3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQotICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKICNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICB9CiAgICAgfQotICAgIAorCiAjZWxzZSAvKkFFUyovCi0gICAgCi0gICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID10ZW1wOwotICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9dGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsgICAgICAKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOyAKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID0gdGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAotICAgIAotICAgIGlmKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gIChoY3J5cC0+U2l6ZS80VSkpCisKKyAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyKi8KKyAgICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCisgICAgeworICAgICAgdGVtcFtpXSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgfQorICAgIGkgPSAwVTsKKyAgICB3aGlsZSAoKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoKGhjcnlwLT5TaXplICsgM1UpIC8gNFUpKSAmJiAoaSA8IDRVKSkKKyAgICB7CisgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CisgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICBpKys7CisgICAgfQorCisgICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gKGhjcnlwLT5TaXplIC8gNFUpKQogICAgIHsKICAgICAgIC8qIERpc2FibGUgQ29tcHV0YXRpb24gQ29tcGxldGUgZmxhZyBhbmQgZXJyb3JzIGludGVycnVwdHMgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCxDUllQX0lUX0NDRklFfENSWVBfSVRfRVJSSUUpOwotICAgICAgCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKwogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgIAorCiAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKKwogICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAgIAorCiAgICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQpAQCAtMzMyMCwxMTYgKzM1NTIsMTE2IEBACiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgIH0KICAgICBlbHNlCi0gICAgeyAgCisgICAgewogICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgICAgCi0gICAgICAKLSAgICAgIGlmKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKGhjcnlwLT5TaXplLzRVKSkgCi0gICAgICB7ICAgIAorICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworCisgICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09IChoY3J5cC0+U2l6ZSAvIDRVKSkKKyAgICAgIHsKICAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKSAKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgIH0gICAKLSAgICB9IAorICAgICAgfQorICAgIH0KICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCi0gICAKLSAgfSAKKworICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgfQotfSAKK30KIAogLyoqCi0gICogQGJyaWVmICBXcml0ZXMgS2V5IGluIEtleSByZWdpc3RlcnMuIAorICAqIEBicmllZiAgV3JpdGVzIEtleSBpbiBLZXkgcmVnaXN0ZXJzLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICAqIEBwYXJhbSAgS2V5U2l6ZTogU2l6ZSBvZiBLZXkKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIENSWVBfU2V0S2V5KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IEtleVNpemUpCi17ICAKK3sKICNpZiBkZWZpbmVkIChDUllQKQotICAKLSAgc3dpdGNoKEtleVNpemUpCisKKyAgc3dpdGNoIChLZXlTaXplKQogICB7Ci0gIGNhc2UgQ1JZUF9LRVlTSVpFXzI1NkI6Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzQpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzcpOyAKLSAgICBicmVhazsKLSAgY2FzZSBDUllQX0tFWVNJWkVfMTkyQjoKLSAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7IAotICAgIGJyZWFrOwotICBjYXNlIENSWVBfS0VZU0laRV8xMjhCOiAgICAgICAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsgCi0gICAgCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBDUllQX0tFWVNJWkVfMjU2QjoKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkswUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMyk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA3KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzE5MkI6CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA1KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzEyOEI6CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KICNlbHNlIC8qQUVTKi8KLSAgc3dpdGNoKEtleVNpemUpCisgIHN3aXRjaCAoS2V5U2l6ZSkKICAgewotICBjYXNlIENSWVBfS0VZU0laRV8yNTZCOgotICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjcgPSoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI2ID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI1ID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI0ID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIyID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIxID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIwID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs3KTsKLSAgICBicmVhazsKLSAgY2FzZSBDUllQX0tFWVNJWkVfMTI4QjogICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7ICAgCi0gICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7ICAgCi0gICAgCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBDUllQX0tFWVNJWkVfMjU2QjoKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjcgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUllQX0tFWVNJWkVfMTI4QjoKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiB9CiAKICNpZiBkZWZpbmVkIChDUllQX0NSX0FMR09NT0RFX0FFU19HQ00pfHwgZGVmaW5lZCAoQUVTKQogLyoqCi0gICogQGJyaWVmICBFbmNyeXB0aW9uL0RlY3J5cHRpb24gcHJvY2VzcyBpbiBBRVMgR0NNIG1vZGUgYW5kIHByZXBhcmUgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyAKKyAgKiBAYnJpZWYgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBwcm9jZXNzIGluIEFFUyBHQ00gbW9kZSBhbmQgcHJlcGFyZSB0aGUgYXV0aGVudGljYXRpb24gVEFHCiAgICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uCkBAIC0zNDM4LDE2NCArMzY3MCwxOTEgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIHVpbnQzMl90IHRpY2tzdGFydDsKLSAgdWludDMyX3Qgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKS80VSA7CisgIHVpbnQzMl90IHdvcmRzaXplID0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyA0VSA7CiAgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLwotICAgIAotICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCi0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsgCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7Ci0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgLyogR2V0IHRpY2sgKi8KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgCi0gIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCi0gIHdoaWxlKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKQorICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogICB7Ci0gICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICAgewotICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQotICAgICAgewotICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAgIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICAgIH0KKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgfQotICAKLSNlbHNlIC8qIEFFUyAqLwotICAvKiBXb3JrYXJvdW5kIDEgOiBvbmx5IEFFUy4KLSAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKLSAgZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBkaWZmZXJlbnQgZnJvbSAzMiBiaXRzIGNhbiBiZSBjb25maWd1cmVkLiovCi0gIC8qIFNlbGVjdCBEQVRBVFlQRSAzMiAgKi8KLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsgICAKLSAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCi0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCi0gIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgeyAKLSAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAgICAgICAgIAotICAgIAotICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgJiByZXR1cm4gZXJyb3IgKi8KLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgICAgICAgICAKLSAgICByZXR1cm4gSEFMX0VSUk9SOwotICB9Ci0gIC8qIENsZWFyIENDRiBmbGFnICovCi0gIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovICAKLSAgCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotICBpZihDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShoY3J5cCwgIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgZWxzZQogICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKICAgfQotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKipQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKLSAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsgCi0gIAotICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotI2Vsc2UgLyogQUVTICovCi0gIAotICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOwotICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovIAotICAKLSAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpIAorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogICB7Ci0gICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAotICAgIHdvcmRzaXplID0gICgod29yZHNpemUvNFUpKjRVKSA7IAorICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIEdldCB0aWNrICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworI2Vsc2UgLyogQUVTICovCisgICAgLyogV29ya2Fyb3VuZCAxIDogb25seSBBRVMuCisgICAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKKyAgICBlbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGRpZmZlcmVudCBmcm9tIDMyIGJpdHMgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KKyAgICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoaGNyeXAsICBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKlBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworI2lmIGRlZmluZWQoQ1JZUCkKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworI2Vsc2UgLyogQUVTICovCisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCisgIHsKKyAgICAvKiByZWNhbGN1bGF0ZSAgd29yZHNpemUgKi8KKyAgICB3b3Jkc2l6ZSA9ICgod29yZHNpemUgLyA0VSkgKiA0VSkgOwogICB9Ci0gIAorCiAgIC8qIEdldCB0aWNrICovCiAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKLSAgCisKICAgLyogV3JpdGUgaW5wdXQgZGF0YSBhbmQgZ2V0IG91dHB1dCBEYXRhICovCi0gIHdoaWxlKChoY3J5cC0+Q3J5cEluQ291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQotICB7ICAgICAgCisgIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgd29yZHNpemUpICYmIChvdXRjb3VudCA8IHdvcmRzaXplKSkKKyAgewogICAgIC8qIFdyaXRlIHBsYWluIGRhdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLwotICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOwotICAgIAorICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLCBUaW1lb3V0KTsKKwogICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCi0gICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OyAKLSAgICAKKyAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisKICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICB7Ci0gICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAmIGVycm9yIGNvZGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgCi0gIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKSAKKworICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKICAgewogICAgIC8qICBXb3JrYXJvdW5kIDIgOiAgQ1JZUDEgJiBBRVMgZ2VuZXJhdGVzIGNvcnJlY3QgVEFHIGZvciBHQ00gbW9kZSBvbmx5IHdoZW4gaW5wdXQgYmxvY2sgc2l6ZSBpcyBtdWx0aXBsZSBvZgogICAgIDEyOCBiaXRzLiBJZiBsdGhlIHNpemUgb2YgdGhlIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCBpcyBpbmZlcmlvciB0byAxMjggYml0cywgd2hlbiBHQ00gZW5jcnlwdGlvbgotICAgIGlzIHNlbGVjdGVkLCB0aGVuIHRoZSBUQUcgbWVzc2FnZSB3aWxsIGJlIHdyb25nLiovICAgCi0gICAgQ1JZUF9Xb3JrYXJvdW5kKGhjcnlwLFRpbWVvdXQpOyAgIAorICAgIGlzIHNlbGVjdGVkLCB0aGVuIHRoZSBUQUcgbWVzc2FnZSB3aWxsIGJlIHdyb25nLiovCisgICAgQ1JZUF9Xb3JrYXJvdW5kKGhjcnlwLCBUaW1lb3V0KTsKICAgfQotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CkBAIC0zNjA5LDI0NiArMzg2OCwyNzIgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CiAgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKLSNpZiBkZWZpbmVkKEFFUykgCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisjaWYgZGVmaW5lZChBRVMpCiAgIHVpbnQzMl90IGxvb3Bjb3VudGVyOwotICB1aW50MzJfdCBsYXN0d29yZHNpemU7IAorICB1aW50MzJfdCBsYXN0d29yZHNpemU7CiAgIHVpbnQzMl90IG5wYmxiOwotI2VuZGlmIC8qIEFFUyAqLyAKLSAgCi0gIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KLSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9MFU7Ci0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7Ci0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotI2lmIGRlZmluZWQoQ1JZUCkgICAgIAotICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwotICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7Ci0gIAotICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotICAvKldhaXQgZm9yIHRoZSBDUllQRU4gYml0IHRvIGJlIGNsZWFyZWQqLwotICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7Ci0gIGRvCisjZW5kaWYgLyogQUVTICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgIHsKLSAgICBjb3VudC0tIDsKLSAgICBpZihjb3VudCA9PSAwVSkKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQogICAgIHsKLSAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAotICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KICAgICB9Ci0gIH0KLSAgd2hpbGUoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pOwotICAKLSNlbHNlIC8qIEFFUyAqLwotICAKLSAgLyogV29ya2Fyb3VuZCAxIDogb25seSBBRVMKLSAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIElOSVQgcGhhc2UuIE9ubHksIGFmdGVyIElOSVQsIGFuZCBiZWZvcmUgcmUKLSAgZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBkaWZmZXJlbnQgZnJvbSAzMiBiaXRzIGNhbiBiZSBjb25maWd1cmVkLiovCi0gIC8qIFNlbGVjdCBEQVRBVFlQRSAzMiAgKi8KLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsgICAKLSAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCi0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOyAgICAKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLwotICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7Ci0gIGRvCi0gIHsKLSAgICBjb3VudC0tIDsKLSAgICBpZihjb3VudCA9PSAwVSkKKyAgICBlbHNlCiAgICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgfQotICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7Ci0gIAotICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0jaWYgZGVmaW5lZChDUllQKSAgCi0gIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7ICAKLSAgCi0gIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7Ci0gIAotICAvKiBFbmFibGUgQ1JZUCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotI2Vsc2UgLyogQUVTICovCi0gIAotICAvKiBXb3JrYXJvdW5kIDE6IG9ubHkgQUVTICwgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQqLwotICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOyAKLSAgCi0gIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KLSAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsgCi0gIAotICAvKiBFbmFibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwotICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCxDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7ICAgIAotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgaWYoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAwVSkgLypoZWFkZXIgcGhhc2UgaXMgIHNraXBwZWQqLwotICB7Ci0gICAgLyogU2V0IHRoZSBwaGFzZSAqLwotICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAKLSAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7Ci0gICAgCi0gICAgLyogV3JpdGUgdGhlIHBheWxvYWQgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8gCi0gICAgaWYoaGNyeXAtPlNpemUgPT0gMFUpCi0gICAgeyAgICAgCi0gICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRXwgQ1JZUF9JVF9FUlJJRSk7Ci0gICAgICAKLSAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgfSAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKLSAgICB7ICAgICAgIAotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGlmKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAoIGhjcnlwLT5TaXplLzRVKSkgICAKLSAgICAgIHsgICAKLSAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAotICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZWxzZQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwotICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotICAgICAgfSAKLSAgICB9Ci0gICAgZWxzZSAvKiBTaXplIDwgMTZCeXRlcyAgOiBmaXJzdCBibG9jayBpcyB0aGUgbGFzdCBibG9jayovCi0gICAgewotICAgICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQqLyAgCi0gICAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgotICAgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCi0gICAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfRW5jcnlwdF9JVCBvdGhlcndpc2UgVEFHIGlzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24uICovCi0gICAgICAKLSAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwotICAgICAgbnBibGIgPSAxNlUtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOyAKLSAgICAgIAotICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KLSAgICAgIGlmICgobnBibGIgJSA0VSkgPT0wVSkgCi0gICAgICB7IAotICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsJCQotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUtbnBibGIpLzRVKSArMVU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplIDsgbG9vcGNvdW50ZXIrKykKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICAgIHsgCi0gICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgCi0gICAgICAgIGxvb3Bjb3VudGVyKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA8IDRVKQotICB7Ci0gICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA7IGxvb3Bjb3VudGVyKyspCi0gICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOyAgCi0gICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgIH0KLSAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICB7IAotICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgCi0gICAgICBsb29wY291bnRlcisrOwotICAgIH0KLSAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAgIAotICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KLSAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgICAKLSAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCi0gICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwotICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZWxzZQotICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gIAotICB9IAotICBlbHNlIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgPj0gNFUpCi0gIHsgIAotICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwotICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7ICAKLSAgfQogICBlbHNlCiAgIHsKLSAgICAvKiBOb3RoaW5nIHRvIGRvICovCi0gIH0gIAotICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgICAKLSAgCisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CisgIH0KKworICAvKiBDb25maWd1cmUgS2V5LCBJViBhbmQgcHJvY2VzcyBtZXNzYWdlIChoZWFkZXIgYW5kIHBheWxvYWQpICovCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworI2lmIGRlZmluZWQoQ1JZUCkKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7CisKKyNlbHNlIC8qIEFFUyAqLworCisgICAgLyogV29ya2Fyb3VuZCAxIDogb25seSBBRVMKKyAgICBEYXRhdHlwZSBjb25maWd1cmF0aW9uIG11c3QgYmUgMzIgYml0cyBkdXJpbmcgSU5JVCBwaGFzZS4gT25seSwgYWZ0ZXIgSU5JVCwgYW5kIGJlZm9yZSByZQorICAgIGVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgZGlmZmVyZW50IGZyb20gMzIgYml0cyBjYW4gYmUgY29uZmlndXJlZC4qLworICAgIC8qIFNlbGVjdCBEQVRBVFlQRSAzMiAgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgQ1JZUF9EQVRBVFlQRV8zMkIpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKKworICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisjZWxzZSAvKiBBRVMgKi8KKworICAgIC8qIFdvcmthcm91bmQgMTogb25seSBBRVMgLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZCovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsKKworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAwVSkgLypoZWFkZXIgcGhhc2UgaXMgIHNraXBwZWQqLworICAgIHsKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaWYgKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAoaGNyeXAtPlNpemUgLyA0VSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIC8qIFNpemUgPCAxNkJ5dGVzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KKyAgICAgIHsKKyAgICAgICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQqLworICAgICAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgorICAgICAgICBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgorICAgICAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfRW5jcnlwdF9JVCBvdGhlcndpc2UgVEFHIGlzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24uICovCisKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCisgICAgICAgIG5wYmxiID0gMTZVIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKKyAgICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgICAgICB9CisKKyAgICAgICAgLyogIGxhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemUgOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA8IDRVKQorICAgIHsKKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplIDsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpID49IDRVKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisgIH0gLyogZW5kIG9mIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KQEAgLTM4NjQsMTQ3ICs0MTQ5LDE3NCBAQAogewogICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAgIHVpbnQzMl90IHdvcmRzaXplOwotICAKLSAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLwotICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7Ci0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAKLSAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsQ1JZUF9QSEFTRV9JTklUKTsKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgCi0jaWYgZGVmaW5lZChDUllQKSAgICAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCi0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQorICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgfQotICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7Ci0gIAotI2Vsc2UgLyogQUVTICovCi0gIAotICAvKldvcmthcm91bmQgMSA6IG9ubHkgQUVTCi0gIERhdGF0eXBlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSAzMiBiaXRzIGR1cmluZyBJbml0IHBoYXNlLiBPbmx5LCBhZnRlciBJbml0LCBhbmQgYmVmb3JlIHJlCi0gIGVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgZGlmZmVyZW50IGZyb20gMzIgYml0cyBjYW4gYmUgY29uZmlndXJlZC4qLwotICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCi0gIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBDUllQX0RBVEFUWVBFXzMyQik7ICAgCi0gIAotICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsgIAotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KKyAgZWxzZQogICB7Ci0gICAgY291bnQtLSA7Ci0gICAgaWYoY291bnQgPT0gMFUpCi0gICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9CisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CiAgIH0KLSAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwotICAKLSAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7Ci0gIAotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIGlmKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShoY3J5cCkgIT0gSEFMX09LKQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfQotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOyAgCi0gIAorICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKwogI2lmIGRlZmluZWQoQ1JZUCkKLSAgCi0gIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKLSNlbmRpZiAvKiBDUllQICovIAotICAKLSAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgCi0gIGlmKGhjcnlwLT5TaXplICE9IDBVKQotICB7IAorICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKTsKKworI2Vsc2UgLyogQUVTICovCisKKyAgICAvKldvcmthcm91bmQgMSA6IG9ubHkgQUVTCisgICAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKKyAgICBlbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGRpZmZlcmVudCBmcm9tIDMyIGJpdHMgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KKyAgICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKworICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKGhjcnlwKSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworI2lmIGRlZmluZWQoQ1JZUCkKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyNlbmRpZiAvKiBDUllQICovCisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKICAgICAvKiBDUllQMSBJUCBWIDwgMi4yLjEgIFNpemUgc2hvdWxkIGJlICU0ICBvdGhlcndpc2UgVGFnIHdpbGwgIGJlIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb246Ci0gICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCisgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKICAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIERNQSBtb2RlIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIC4gKi8KLSAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCi0gICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpIAotICAgIHsgIAotICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOyAgICAKKyAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8KKyAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkKKyAgICB7CisgICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUgLyA0VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICAgIH0KICAgICBlbHNlIC8qdG8gY29tcHV0ZSBsYXN0IHdvcmQ8MTI4Yml0cywgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIGVuY3J5cHRlZC9kZWNyeXB0ZWQgKi8KICAgICB7Ci0gICAgICB3b3Jkc2l6ZSA9ICh1aW50MzJfdCkoaGNyeXAtPlNpemUpKygxNlUtKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpJTE2VSkpIDsKLSAgICAgIAotICAgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyLCBwQ3J5cE91dEJ1ZmZQdHIgc2l6ZSBzaG91bGQgYmUgJTQgKi8gCi0gICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCl3b3Jkc2l6ZS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwotICAgIH0gICAKKyAgICAgIHdvcmRzaXplID0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgKyAoMTZVIC0gKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpICUgMTZVKSkgOworCisgICAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIsIHBDcnlwT3V0QnVmZlB0ciBzaXplIHNob3VsZCBiZSAlNCAqLworICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCl3b3Jkc2l6ZSAvIDRVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICAgIH0KICAgfQotICBlbHNlIAorICBlbHNlCiAgIHsKICAgICAvKiBQcm9jZXNzIHVuTG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSBhbmQgcGhhc2UgKi8KICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgfSAKLSAgCisgIH0KKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIAogLyoqCi0gICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZSAKKyAgKiBAYnJpZWYgIEFFUyBDQ00gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHByb2Nlc3NpbmcgaW4gcG9sbGluZyBtb2RlCiAgICogICAgICAgICBmb3IgVGlueUFFUyBJUCwgbm8gZW5jcnlwdC9kZWNyeXB0IHBlcmZvcm1lZCwgb25seSBhdXRoZW50aWNhdGlvbiBwcmVwYXJhdGlvbi4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKQEAgLTQwMTQsMzk1ICs0MzI2LDQyNSBAQAogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgdGlja3N0YXJ0OwotICB1aW50MzJfdCB3b3Jkc2l6ZT0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkvNFU7Ci0gIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLyAgCi0jaWYgZGVmaW5lZChBRVMpIAorICB1aW50MzJfdCB3b3Jkc2l6ZSA9ICh1aW50MzJfdCkoaGNyeXAtPlNpemUpIC8gNFU7CisgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworI2lmIGRlZmluZWQoQUVTKQogICB1aW50MzJfdCBsb29wY291bnRlcjsKICAgdWludDMyX3QgbnBibGI7Ci0gIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsgCisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKICNlbmRpZiAvKiBBRVMgKi8KLSAgCi0gIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KLSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOyAgICAgCi0gIAotI2lmIGRlZmluZWQoQ1JZUCkgCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7Ci0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpIHdpdGggQ1RSMSBpbmZvcm1hdGlvbiAqLwotICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjFfMDsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9IGhjcnlwLT5Jbml0LkIwWzFdOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gaGNyeXAtPkluaXQuQjBbMl07Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoaGNyeXAtPkluaXQuQjBbM10gJiBDUllQX0NDTV9DVFIxXzEpfCAgQ1JZUF9DQ01fQ1RSMV8yOwotICAKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KLSAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFViggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSwgMTYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpLCAxNik7Ci0gIH0KLSAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQotICB7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQogICB9CiAgIGVsc2UKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKICAgfQotICAvKiBHZXQgdGljayAqLwotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKLSAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KLSAgd2hpbGUoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pCisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCiAgIHsKLSAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisKKyAgICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOworCisjaWYgZGVmaW5lZChDUllQKQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjFfMDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gaGNyeXAtPkluaXQuQjBbMV07CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoaGNyeXAtPkluaXQuQjBbM10gJiBDUllQX0NDTV9DVFIxXzEpIHwgIENSWVBfQ0NNX0NUUjFfMjsKKworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKldyaXRlICBCMCBwYWNrZXQgaW50byBDUllQX0RJTiBSZWdpc3RlciovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgewotICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQotICAgICAgewotICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAgIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICAgIH0KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOwogICAgIH0KLSAgfSAgCi0jZWxzZSAvKiBBRVMgKi8gCi0gIC8qQUVTMnYxLjEuMSA6IENDTSBhdXRoZW50aWNhdGlvbiA6IG5vIGluaXQgcGhhc2UsIG9ubHkgaGVhZGVyIGFuZCBmaW5hbCBwaGFzZSAqLyAKLSAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOyAKLSAgCi0gIC8qIGNvbmZpZ3VyZWQgZW5jcnlwdGlvbiBtb2RlICovCi0gIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsgCi0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7ICAgICAKLSAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLyAKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gMFU7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9IDBVOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAwVTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gMFU7Ci0gIAotICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotICAvKldyaXRlIHRoZSBCMCBwYWNrZXQgaW50byBDUllQX0RJTiovCi0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCk7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMyk7IAotICAKLSAgLyogIHdhaXQgdW50aWwgdGhlIGVuZCBvZiBjb21wdXRhdGlvbiAqLwotICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gIHsgCi0gICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAgICAgICAKLSAgICAKLSAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCi0gICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAgICAgICAgCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfQotICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSAgLyogRnJvbSB0aGF0IHBvaW50IHRoZSB3aG9sZSBtZXNzYWdlIG11c3QgYmUgcHJvY2Vzc2VkLCBmaXJzdCB0aGUgSGVhZGVyIHRoZW4gdGhlIHBheWxvYWQuCi0gIEZpcnN0IHRoZSAgSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZCB3aXRoIEFzc29jaWF0ZWQgRGF0YSAoQSkqLwotICAKLSAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpCi0gIHsKLSAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICk9PSAwVSkKLSAgICB7ICAgICAKLSAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyKz00VSkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIAotICAgICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgICAgCi0gICAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSwgMTYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSksIDE2KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpLCAxNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSwgMTYpOworICAgIH0KKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpKTsKICAgICB9CiAgICAgZWxzZQotICAgIHsgICAKLSAgICAgIC8qV3JpdGUgSGVhZGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPIHdpdGhvdXQgbGFzdCBibG9jayAqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8ICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSktKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICkpKTsgbG9vcGNvdW50ZXIrPTRVKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMyk7CisgICAgfQorICAgIC8qIEdldCB0aWNrICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgIHsKLSAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7IAotICAgICAgICAKLSAgICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgICB7IAorICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAgIAotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCi0gICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAKICAgICAgIH0KLSAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKTsgbG9vcGNvdW50ZXIrKykKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgICAgICAKLSAgICAgIH0KLSAgICAgIHdoaWxlKGxvb3Bjb3VudGVyIDw0VSApCi0gICAgICB7IAotICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8gICAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsgICAgICAgICAgICAgIAotICAgICAgICBsb29wY291bnRlcisrOwotICAgICAgfSAgICAKLSAgICAgIAotICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgeyAKLSAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAotICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgfQotICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgCiAgICAgfQotICB9CisjZWxzZSAvKiBBRVMgKi8KKyAgICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8KKyAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgIC8qIGNvbmZpZ3VyZWQgZW5jcnlwdGlvbiBtb2RlICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciB3aXRoIHplcm8gdmFsdWVzKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4qLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOworCisgICAgLyogIHdhaXQgdW50aWwgdGhlIGVuZCBvZiBjb21wdXRhdGlvbiAqLworICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgJiByZXR1cm4gZXJyb3IgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIEZyb20gdGhhdCBwb2ludCB0aGUgd2hvbGUgbWVzc2FnZSBtdXN0IGJlIHByb2Nlc3NlZCwgZmlyc3QgdGhlIEhlYWRlciB0aGVuIHRoZSBwYXlsb2FkLgorICAgIEZpcnN0IHRoZSAgSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZCB3aXRoIEFzc29jaWF0ZWQgRGF0YSAoQSkqLworCisgICAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpCisgICAgeworICAgICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogV3JpdGUgdGhlIElucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLypXcml0ZSBIZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCiAgIC8qIFRoZW4gdGhlIHBheWxvYWQ6IGNsZWFydGV4dCBwYXlsb2FkIChub3QgdGhlIGNpcGhlcnRleHQgcGF5bG9hZCkuCiAgIFdyaXRlIGlucHV0IERhdGEsIG5vIG91dHB1dCBEYXRhIHRvIGdldCAqLwogICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCiAgIHsKLSAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgCisgICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCiAgICAgewotICAgICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAotICAgICAgd29yZHNpemUgPSAgKCh3b3Jkc2l6ZS80VSkqNFUpIDsgCisgICAgICAvKiByZWNhbGN1bGF0ZSAgd29yZHNpemUgKi8KKyAgICAgIHdvcmRzaXplID0gKCh3b3Jkc2l6ZSAvIDRVKSAqIDRVKSA7CiAgICAgfQotICAgIAorCiAgICAgLyogR2V0IHRpY2sgKi8KICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwotICAgIAotICAgIHdoaWxlKChoY3J5cC0+Q3J5cEluQ291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQotICAgIHsgICAgICAKKworICAgIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgd29yZHNpemUpICYmIChvdXRjb3VudCA8IHdvcmRzaXplKSkKKyAgICB7CiAgICAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KLSAgICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOwotICAgICAKLSAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwotICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsgCi0gICAgCisgICAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CisKKyAgICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCisgICAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisKICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgIHsKLSAgICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICAKLSAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgIAotICAgIHsgCisKKyAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKKyAgICB7CiAgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KLSAgICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkvMTZVKSsxVSkqMTZVKS0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7IAotICAgICAgCisgICAgICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKKwogICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KLSAgICAgIGlmICgobnBibGIlNFUpID09MFUpIAotICAgICAgeyAKLSAgICAgICAgbGFzdHdvcmRzaXplID0gKDE2VS1ucGJsYikvNFU7CQkKLSAgICAgIH0KLSAgICAgIGVsc2UgCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQogICAgICAgewotICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICAgIH0gICAKLSAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLyAgICAKLSAgICAgIGZvcihsb29wY291bnRlcj0wVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyICsrKSAgICAgICAgCisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgIH0KKyAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIgKyspCiAgICAgICB7CiAgICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIH0gICAgCi0gICAgICB3aGlsZShsb29wY291bnRlciA8IDRVKQorICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCiAgICAgICB7CiAgICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gMFU7Ci0gICAgICAgIGxvb3Bjb3VudGVyKys7IAotICAgICAgfSAgIAorICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQogICAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICB7IAorICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgCi0gICAgICB9IAorICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CiAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7Ci0gICAgICAKKwogICAgIH0KLSAgfSAgICAgICAKKyAgfQogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBIZWFkZXIgYmxvY2soQjEpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBleHByZXNzZWQgaW4gYnl0ZXMgY29uY2F0ZW5hdGVkCi0gIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCi0gIAotICBpZihDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorCisjaWYgZGVmaW5lZChDUllQKQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZAorICAgIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQogICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfSAgCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gIAotICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOyAKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgIAotICAKLSAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpIAotICB7Ci0gICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAotICAgIHdvcmRzaXplID0gICgod29yZHNpemUvNFUpKjRVKSA7IAorICAgIC8qIHJlY2FsY3VsYXRlICB3b3Jkc2l6ZSAqLworICAgIHdvcmRzaXplID0gKCh3b3Jkc2l6ZSAvIDRVKSAqIDRVKSA7CiAgIH0KICAgLyogR2V0IHRpY2sgKi8KICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwotICAKKwogICAvKiBXcml0ZSBpbnB1dCBkYXRhIGFuZCBnZXQgb3V0cHV0IGRhdGEgKi8KLSAgd2hpbGUoKGhjcnlwLT5DcnlwSW5Db3VudCA8IHdvcmRzaXplKSAmJiAob3V0Y291bnQgPCB3b3Jkc2l6ZSkpCi0gIHsgICAgICAKKyAgd2hpbGUgKChoY3J5cC0+Q3J5cEluQ291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQorICB7CiAgICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCi0gICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsVGltZW91dCk7Ci0gICAgCisgICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOworCiAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgewotICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQogICAgIH0KICAgfQotICAKLSAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpICAKLSAgeyAgCisKKyAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCisgIHsKICAgICAvKiBDUllQIFdvcmthcm91bmQgOiAgQ1JZUDEgZ2VuZXJhdGVzIGNvcnJlY3QgVEFHICBkdXJpbmcgQ0NNIGRlY3J5cHRpb24gb25seSB3aGVuIGNpcGhlcnRleHQgYmxvY2tzIHNpemUgaXMgbXVsdGlwbGUgb2YKICAgICAxMjggYml0cy4gSWYgbHRoZSBzaXplIG9mIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgaXMgaW5mZXJpb3IgdG8gMTI4IGJpdHMsIHdoZW4gQ0NNIGRlY3J5cHRpb24KLSAgICBpcyBzZWxlY3RlZCwgdGhlbiB0aGUgVEFHIG1lc3NhZ2Ugd2lsbCBiZSB3cm9uZy4qLyAgIAotICAgIENSWVBfV29ya2Fyb3VuZChoY3J5cCxUaW1lb3V0KTsKKyAgICBpcyBzZWxlY3RlZCwgdGhlbiB0aGUgVEFHIG1lc3NhZ2Ugd2lsbCBiZSB3cm9uZy4qLworICAgIENSWVBfV29ya2Fyb3VuZChoY3J5cCwgVGltZW91dCk7CiAgIH0KICNlbmRpZiAvKiBDUllQICovCi0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzIGluIGludGVycnVwdCBtb2RlIAorICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBpbnRlcnJ1cHQgbW9kZQogICAqICAgICAgICAgZm9yIFRpbnlBRVMgSVAsIG5vIGVuY3J5cHQvZGVjcnlwdCBwZXJmb3JtZWQsIG9ubHkgYXV0aGVudGljYXRpb24gcHJlcGFyYXRpb24uCiAgICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCkBAIC00NDEwLDMxMCArNDc1Miw1NjUgQEAKICAgKi8KIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCiAjaWYgZGVmaW5lZChDUllQKQogICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAjZW5kaWYgLyogQ1JZUCAqLwotICAKLSAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLwotICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7Ci0gIAotI2lmIGRlZmluZWQoQ1JZUCkKLSAgCi0gIC8qKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKiovCi0gIAotICBDUllQX1NFVF9QSEFTRShoY3J5cCxDUllQX1BIQVNFX0lOSVQpOwotICAKLSAgLyogU2V0IHRoZSBrZXkgKi8KLSAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIxXzA7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKGhjcnlwLT5Jbml0LkIwWzNdICYgQ1JZUF9DQ01fQ1RSMV8xKXwgIENSWVBfQ0NNX0NUUjFfMjsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KLSAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFViggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSwgMTYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpLCAxNik7Ci0gIH0KLSAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQotICB7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQogICB9CiAgIGVsc2UKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKICAgfQotICAvKldhaXQgZm9yIHRoZSBDUllQRU4gYml0IHRvIGJlIGNsZWFyZWQqLwotICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7Ci0gIGRvCisKKyAgLyogQ29uZmlndXJlIEtleSwgSVYgYW5kIHByb2Nlc3MgbWVzc2FnZSAoaGVhZGVyIGFuZCBwYXlsb2FkKSAqLworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKICAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQorICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBDVFIxIGluZm9ybWF0aW9uICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIxXzA7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9IGhjcnlwLT5Jbml0LkIwWzFdOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSBoY3J5cC0+SW5pdC5CMFsyXTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKGhjcnlwLT5Jbml0LkIwWzNdICYgQ1JZUF9DQ01fQ1RSMV8xKSB8ICBDUllQX0NDTV9DVFIxXzI7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgICB7Ci0gICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOwogICAgIH0KLSAgfQotICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7Ci0gIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAKKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApLCAxNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSwgMTYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMiksIDE2KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpLCAxNik7CisgICAgfQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKTsKKyAgICB9CisgICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKTsKKworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgIH0gLyogZW5kIG9mIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7Ci0gIAorCiAgIC8qIEVuYWJsZSBDUllQICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgCi0gIAotI2Vsc2UgLyogQUVTICovIAotICAKLSAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAKLSAgLyogY29uZmlndXJlZCBtb2RlIGFuZCBlbmNyeXB0aW9uIG1vZGUgKi8KLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgICAgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3Igd2l0aCB6ZXJvIHZhbHVlcyovIAotICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMFU7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKLSAgCi0gIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMik7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsgCi0gIAorCisjZWxzZSAvKiBBRVMgKi8KKworICAgIC8qQUVTMnYxLjEuMSA6IENDTSBhdXRoZW50aWNhdGlvbiA6IG5vIGluaXQgcGhhc2UsIG9ubHkgaGVhZGVyIGFuZCBmaW5hbCBwaGFzZSAqLworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogY29uZmlndXJlZCBtb2RlIGFuZCBlbmNyeXB0aW9uIG1vZGUgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9IDBVOworCisgICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4qLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOworCisgIH0gLyogZW5kIG9mIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gIHJldHVybiBIQUxfT0s7ICAKKyAgcmV0dXJuIEhBTF9PSzsKIH0KIC8qKgotICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBETUEgbW9kZSAKKyAgKiBAYnJpZWYgIEFFUyBDQ00gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHByb2Nlc3MgaW4gRE1BIG1vZGUKICAgKiAgICAgICAgIGZvciBUaW55QUVTIElQLCBubyBlbmNyeXB0L2RlY3J5cHQgcGVyZm9ybWVkLCBvbmx5IGF1dGhlbnRpY2F0aW9uIHByZXBhcmF0aW9uLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCi17ICAKK3sKICAgdWludDMyX3Qgd29yZHNpemU7CiAgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKLSAgCi0gIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KLSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAKLSAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsQ1JZUF9QSEFTRV9JTklUKTsKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIxXzA7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKGhjcnlwLT5Jbml0LkIwWzNdICYgQ1JZUF9DQ01fQ1RSMV8xKXwgIENSWVBfQ0NNX0NUUjFfMjsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KLSAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKyNpZiBkZWZpbmVkKEFFUykKKyAgdWludDMyX3QgbG9vcGNvdW50ZXI7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisjZW5kaWYKKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFViggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSwgMTYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpLCAxNik7ICAgIAotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKLSAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCkpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSkpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMyk7Ci0gIH0KLSAgCi0gIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KLSAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQorICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgIH0KLSAgfQotICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7Ci0gIAotI2Vsc2UgLyogQUVTICovIAotICAKLSAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAKLSAgLyogY29uZmlndXJlZCBDQ00gY2hhaW5pbmcgbW9kZSBhbmQgZW5jcnlwdGlvbiBtb2RlICovCi0gIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgICAgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3Igd2l0aCB6ZXJvIHZhbHVlcyovIAotICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMFU7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMik7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsgCi0gIAotICAvKiAgd2FpdCB1bnRpbCB0aGUgZW5kIG9mIGNvbXB1dGF0aW9uICovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KLSAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQotewotICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgCi0gIC8qIENoYW5nZSBzdGF0ZSAqLwotICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gIAotICAvKiBQcm9jZXNzIFVubG9ja2VkICovICAgICAgICAgIAotICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgcmV0dXJuIEhBTF9FUlJPUjsKLX0KLSAgfQotICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7Ci0gIAotICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgCi0jZW5kaWYgLyogQUVTICovCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIGlmKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShoY3J5cCkgIT0gSEFMX09LKQotICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfQotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCi0gIAotICAvKiBTZXQgdGhlIHBoYXNlICovCi0gIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsgIAotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKLSAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgCi0jZW5kaWYgLyogQ1JZUCAqLyAgIAotICAKLSAgaWYoaGNyeXAtPlNpemUgIT0gMFUpCi0gIHsgCi0gICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCi0gICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCi0gICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBIQUxfQ1JZUF9BRVNHQ01fRE1BIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbi4gKi8KLSAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCi0gICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpIAotICAgIHsgIAotICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIGhjcnlwLT5TaXplLzRVLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSsxNlUtKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpICUxNlUpIDsgCi0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciwgcENyeXBPdXRCdWZmUHRyIHNpemUgc2hvdWxkIGJlICU0Ki8gCi0gICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKHVpbnQxNl90KXdvcmRzaXplLzRVLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKLSAgICB9ICAgCisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOworICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKworICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpIHdpdGggQ1RSMSBpbmZvcm1hdGlvbiAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMV8wOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gaGNyeXAtPkluaXQuQjBbMl07CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9IChoY3J5cC0+SW5pdC5CMFszXSAmIENSWVBfQ0NNX0NUUjFfMSkgfCAgQ1JZUF9DQ01fQ1RSMV8yOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKldyaXRlIHRoZSBCMCBwYWNrZXQgaW50byBDUllQX0RJTiBSZWdpc3RlciovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpLCAxNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSwgMTYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMyksIDE2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOworICAgIH0KKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7CisKKyNlbHNlIC8qIEFFUyAqLworCisgICAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovCisgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKKyAgICAvKiBjb25maWd1cmVkIGVuY3J5cHRpb24gbW9kZSAqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3Igd2l0aCB6ZXJvIHZhbHVlcyovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gMFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gMFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gMFU7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKTsKKworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgLyogRnJvbSB0aGF0IHBvaW50IHRoZSB3aG9sZSBtZXNzYWdlIG11c3QgYmUgcHJvY2Vzc2VkLCBmaXJzdCB0aGUgSGVhZGVyIHRoZW4gdGhlIHBheWxvYWQuCisgICAgRmlyc3QgdGhlICBIZWFkZXIgYmxvY2soQjEpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBleHByZXNzZWQgaW4gYnl0ZXMgY29uY2F0ZW5hdGVkIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCisKKyAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkKKyAgICB7CisgICAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KKyAgICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXcml0ZSB0aGUgSW5wdXQgYmxvY2sgaW4gdGhlIERhdGEgSW5wdXQgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCisgICAgICAgICAgLyogIHdhaXQgdW50aWwgdGhlIGVuZCBvZiBjb21wdXRhdGlvbiAqLworICAgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICAgICAgICBkbworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworICAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLypXcml0ZSBIZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICAgICAgICBkbworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworICAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgY291bnQtLSA7CisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgICAgfQorICAgIH0KKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKyAgLyogVGhlbiB0aGUgcGF5bG9hZDogY2xlYXJ0ZXh0IHBheWxvYWQgKG5vdCB0aGUgY2lwaGVydGV4dCBwYXlsb2FkKS4KKyAgV3JpdGUgaW5wdXQgRGF0YSwgbm8gb3V0cHV0IERhdGEgdG8gZ2V0ICovCisgIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKKyAgeworICAgIGlmIChoY3J5cC0+U2l6ZSA+PSAxNlUpCisgICAgeworICAgICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZSAvIDRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CisgICAgICB9CisgICAgICBlbHNlIC8qdG8gY29tcHV0ZSBsYXN0IHdvcmQ8MTI4Yml0cywgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIGVuY3J5cHRlZC9kZWNyeXB0ZWQgKi8KKyAgICAgIHsKKyAgICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSArICgxNlUgLSAoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgJSAxNlUpKSA7CisKKyAgICAgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyLCBwQ3J5cE91dEJ1ZmZQdHIgc2l6ZSBzaG91bGQgYmUgJTQgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCl3b3Jkc2l6ZSAvIDRVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CisgICAgICB9CisgICAgfQorICAgIGlmICgoaGNyeXAtPlNpemUgPCAxNlUpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKKyAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgICB9CisgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyICsrKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgY291bnQtLSA7CisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSBhbmQgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIHVuTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSBhbmQgcGhhc2UgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgfQorI2VuZGlmIC8qIEFFUyAqLworI2lmIGRlZmluZWQoQ1JZUCkKKyAgICAvKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoaGNyeXApICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKyAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQorICB7CisgICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCisgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKKyAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIEhBTF9DUllQX0FFU0dDTV9ETUEgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLworICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLworICAgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKQorICAgIHsKKyAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIGhjcnlwLT5TaXplIC8gNFUsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSArIDE2VSAtICgodWludDMyX3QpKGhjcnlwLT5TaXplKSAlIDE2VSkgOworCisgICAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIsIHBDcnlwT3V0QnVmZlB0ciBzaXplIHNob3VsZCBiZSAlNCovCisgICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAodWludDE2X3Qpd29yZHNpemUgLyA0VSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICAgIH0KICAgfQogICBlbHNlIC8qU2l6ZSA9IDAqLwogICB7CiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgYW5kIHBoYXNlICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gIH0gICAgICAgICAKLSAgCisgIH0KKyNlbmRpZiAvKiBDUllQICovCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KQEAgLTQ3MjEsNTE2ICs1MzE4LDUyNSBAQAogLyoqCiAgICogQGJyaWVmICBTZXRzIHRoZSBwYXlsb2FkIHBoYXNlIGluIGl0ZXJydXB0IG1vZGUKICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUgIAorICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgICogQHJldHZhbCBzdGF0ZQogICAqLwogc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCi17ICAKK3sKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0gIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KLSAgdWludDMyX3QgbGFzdHdvcmRzaXplOyAKLSAgdWludDMyX3QgbnBibGI7CQotICNpZiBkZWZpbmVkKEFFUykgCi0gIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLyAKLSNlbmRpZiAvKiBBRVMgKi8gCi0gIAorICB1aW50MzJfdCB0ZW1wWzRdOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgbnBibGI7CisgIHVpbnQzMl90IGk7CisjaWYgZGVmaW5lZChBRVMpCisgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworI2VuZGlmIC8qIEFFUyAqLworCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICBpZihoY3J5cC0+U2l6ZSA9PSAwVSkKLSAgeyAgICAgCisKKyNpZiBkZWZpbmVkKENSWVApCisgIGlmIChoY3J5cC0+U2l6ZSA9PSAwVSkKKyAgewogICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwotICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkl8IENSWVBfSVRfT1VUSSk7Ci0gICAgCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CisKICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAgIAotICB9ICAgIAotICAKLSAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZS80VSkgLSAoaGNyeXAtPkNyeXBJbkNvdW50KSkgPj0gNFUpCi0gIHsgCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgIH0KKworICBlbHNlIGlmICgoKGhjcnlwLT5TaXplIC8gNFUpIC0gKGhjcnlwLT5DcnlwSW5Db3VudCkpID49IDRVKQorICB7CiAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAKLSAgICBpZigoKGhjcnlwLT5TaXplLzRVKSA9PSBoY3J5cC0+Q3J5cEluQ291bnQpICYmKChoY3J5cC0+U2l6ZSAlMTZVICk9PSAwVSkpCi0gICAgeyAgICAgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBpZiAoKChoY3J5cC0+U2l6ZSAvIDRVKSA9PSBoY3J5cC0+Q3J5cEluQ291bnQpICYmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKSkKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpOwotICAgICAgCisKICAgICAgIC8qIENhbGwgdGhlIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotICAgIH0gICAgCi0gICAgaWYoaGNyeXAtPkNyeXBPdXRDb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpICAgICAgICAKKyAgICB9CisgICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpCiAgICAgewotICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8gCi0gICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgICAgCi0gICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgICAgCi0gICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXA7ICAgICAgCi0gICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICAgIGlmICgoKGhjcnlwLT5TaXplLzRVKSA9PSBoY3J5cC0+Q3J5cE91dENvdW50KSYmKChoY3J5cC0+U2l6ZSAlMTZVICk9PSAwVSkpCi0gICAgICB7ICAgICAKKyAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovCisgICAgICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCisgICAgICB7CisgICAgICAgIHRlbXBbaV0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgICB9CisgICAgICBpID0gMFU7CisgICAgICB3aGlsZSAoKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSkgLyA0VSkpKSAmJiAoaSA8IDRVKSkKKyAgICAgIHsKKyAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICAgIGlmICgoKGhjcnlwLT5TaXplIC8gNFUpID09IGhjcnlwLT5DcnlwT3V0Q291bnQpICYmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKSkKKyAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9PVVRJKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgICAKKwogICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCisKICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDYWxsIG91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAgCi0gICAgICB9ICAgIAotICAgIH0gICAgICAKLSAgfSAgIAotICBlbHNlIGlmICgoaGNyeXAtPlNpemUgJTE2VSApIT0gMFUpCi0gIHsgICAKLSAgICAvKiBTaXplIHNob3VsZCBiZSAlNCBpbiB3b3JkIGFuZCAlMTYgaW4gYnl0ZSAgb3RoZXJ3aXNlIFRBRyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24KLSAgICBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZiAKLSAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfQUVTR0NNX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQuICovCi0gICAgCi0gICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCi0gICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKLSAgICAKLSAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLwotICAgIGlmICgobnBibGIlNFUpID09MFUpIAotICAgIHsgCi0gICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsJCQorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KICAgICB9Ci0gICAgZWxzZSAKKyAgfQorICBlbHNlIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQorICB7CisgICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgaW4gd29yZCBhbmQgJTE2IGluIGJ5dGUgIG90aGVyd2lzZSBUQUcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCisgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKKyAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfQUVTR0NNX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQuICovCisKKyAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKKworICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKICAgICB7Ci0gICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICB9CQotICAgIAorICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIrKykKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgIH0KLSAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICB7IAotICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsgICAgICAgICAKKyAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICB7CisgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsKICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgfQogICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpOwotICAgIAotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKSAKKworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKQogICAgIHsKLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IDRVOyBsb29wY291bnRlcisrKSAgICAgICAgCi0gICAgICB7ICAKLSAgICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyICovCi0gICAgICAgIHRlbXA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgCi0gICAgICAgIAotICAgICAgICAvKmdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovCi0gICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSk9dGVtcDsgCi0gICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgICAKLSAgICAgIH0gICAgIAotICAgIH0gICAgICAgICAKLSAgICBpZihoY3J5cC0+Q3J5cE91dENvdW50ID49ICAoaGNyeXAtPlNpemUvNFUpKQotICAgIHsgICAgICAgICAgICAgIAorICAgICAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQorICAgICAgeworICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgICAgfQorICAgICAgaWYgKCgoaGNyeXAtPlNpemUpIC8gNFUpID09IDBVKQorICAgICAgeworICAgICAgICBmb3IgKGkgPSAwVTsgaSA8ICgodWludDMyX3QpKGhjcnlwLT5TaXplKSAlIDRVKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaSA9IDB4MFU7CisgICAgICB3aGlsZSAoKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSkgLyA0VSkpKSAmJiAoaSA8IDRVKSkKKyAgICAgIHsKKyAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPj0gKGhjcnlwLT5TaXplIC8gNFUpKQorICAgIHsKICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwotICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX09VVEl8Q1JZUF9JVF9JTkkpOwotICAgICAgCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSB8IENSWVBfSVRfSU5JKTsKKwogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgICAKKwogICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKLSAgICB9ICAgCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgIH0KICNlbHNlIC8qIEFFUyAqLwotICAKLSAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPXRlbXA7Ci0gIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID10ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsgCi0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAorCisgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIqLworICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCisgIHsKKyAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgfQorICBpID0gMFU7CisgIHdoaWxlICgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUgKyAzVSkgLyA0VSkpICYmIChpIDwgNFUpKQorICB7CisgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICBpKys7CisgIH0KICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwotICAKLSAgaWYoKGhjcnlwLT5DcnlwT3V0Q291bnQgPj0gIChoY3J5cC0+U2l6ZS80VSkpICYmICgob3V0Y291bnQqNFUpID49ICBoY3J5cC0+U2l6ZSkgKQorCisgIGlmICgoaGNyeXAtPkNyeXBPdXRDb3VudCA+PSAoaGNyeXAtPlNpemUgLyA0VSkpICYmICgob3V0Y291bnQgKiA0VSkgPj0gIGhjcnlwLT5TaXplKSkKICAgewogICAgIC8qIERpc2FibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3JzIGludGVycnVwdHMgKi8KLSAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsQ1JZUF9JVF9DQ0ZJRXxDUllQX0lUX0VSUklFKTsKLSAgICAKKyAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgIAorCiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgCi0gICAgICAgIC8qIENhbGwgb3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCi0gICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworCisgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKLSAgfSAgIAotICAKLSAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZS80VSkgLSAoaGNyeXAtPkNyeXBJbkNvdW50KSkgPj0gNFUpCi0gIHsgCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBlbHNlIGlmICgoKGhjcnlwLT5TaXplIC8gNFUpIC0gKGhjcnlwLT5DcnlwSW5Db3VudCkpID49IDRVKQorICB7CiAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgCi0gICAgaWYoKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgaGNyeXAtPlNpemUpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpKQotICAgIHsgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGlmICgoaGNyeXAtPkNyeXBJbkNvdW50ID09ICBoY3J5cC0+U2l6ZSkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpCisgICAgewogICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAgICAgIAotICAgIH0gCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KICAgfQogICBlbHNlIC8qIExhc3QgYmxvY2sgb2YgcGF5bG9hZCA8IDEyOGJpdCovCi0gIHsgICAgCisgIHsKICAgICAvKiBXb3JrYXJvdW5kIG5vdCBpbXBsZW1lbnRlZCwgU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkKLSAgICBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24uIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mIAotICAgIHBheWxvYWQgPDEyOGJpdCBkb24ndCB1c2UgQ1JZUF9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uLiAqLyAgCi0gICAgCisgICAgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uLiBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgorICAgIHBheWxvYWQgPDEyOGJpdCBkb24ndCB1c2UgQ1JZUF9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uLiAqLworCiAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCi0gICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7Ci0gCi0gICAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCi0gICAgaWYgKChucGJsYiU0VSkgPT0wVSkgCi0gICAgeyAKLSAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUtbnBibGIpLzRVOwkJCisgICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOwogICAgIH0KLSAgICBlbHNlIAorICAgIGVsc2UKICAgICB7Ci0gICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICB9CQotICAgIAorICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIrKykKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgfQotICAgIHdoaWxlKGxvb3Bjb3VudGVyIDwgNFUgKQotICAgIHsgCi0gICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8gICAgIAotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsgICAgICAgICAKKyAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICB7CisgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICBsb29wY291bnRlcisrOwogICAgIH0KLSAgfSAKLSNlbmRpZiAvKiBBRVMgKi8gCisgIH0KKyNlbmRpZiAvKiBBRVMgKi8KIAotfSAKK30KIAogCiAvKioKICAgKiBAYnJpZWYgIFNldHMgdGhlIGhlYWRlciBwaGFzZSBpbiBwb2xsaW5nIG1vZGUKICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUgICAKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIHN0YXRlCiAgICovCiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0gIAorCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgZm9yIEdDTS9HTUFDIG9yIENDTSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotICBpZigoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkpCisKKyAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICE9IDBVKSkKICAgewotICAgIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICAgIAorCisjaWYgZGVmaW5lZChDUllQKQorCiAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwotICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAgIAorICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgICAgCi0gICAgCi0gICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApPT0gMFUpCi0gICAgeyAKLSAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyKz00VSkKLSAgICAgIHsgICAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgICAgIAotICAgICAgICAvKiBXYWl0IGZvciBJRkVNIHRvIGJlIHJhaXNlZCAqLwotICAgICAgICBpZihDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgICAgICAgeyAKLSAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgIAotICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgICAgCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgICB9ICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgIAotICAgICAgLypXcml0ZSBoZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKS0oaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSkpOyBsb29wY291bnRlcis9IDRVKQotICAgICAgeyAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICAKLSAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KLSAgICAgICAgaWYoQ1JZUF9XYWl0T25JRkVNRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAgIAotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICkpOyBsb29wY291bnRlcisrKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgCi0gICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQotICAgICAgeyAKLSAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOyAgICAgICAgIAotICAgICAgICBsb29wY291bnRlcisrOwotICAgICAgfQotICAgICAgLyogV2FpdCBmb3IgQ0NGIElGRU0gdG8gYmUgcmFpc2VkICovCi0gICAgICBpZihDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgICAgIHsgCi0gICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKLSAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgfSAgICAgICAgICAKLSAgICB9ICAgICAKLSAgICAvKiBXYWl0IHVudGlsIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIGlmKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgIHsgCi0gICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAmIHJldHVybiBlcnJvciAqLwotICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAgICAgICAgCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgIH0KLSAgICAKLSNlbHNlIC8qIEFFUyAqLyAKLSAgICAKLSAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQogICAgIHsKLSAgICAgIC8qIFdvcmthcm91bmQgMSA6b25seSBBRVMgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7IAotICAgICAgCi0gICAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOwotICAgICAgCi0gICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAgICAgCi0gICAgfQotICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKT09IDBVKQotICAgIHsgICAgIAotICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLyAKLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPSA0VSkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIAotICAgICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgCi0gICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKKyAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQogICAgICAgewotICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCi0gICAgICAgIAotICAgICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAvKiBXYWl0IGZvciBJRkVNIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBpZiAoQ1JZUF9XYWl0T25JRkVNRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLypXcml0ZSBoZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8ICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgLSAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSkpOyBsb29wY291bnRlciArPSA0VSkKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCisgICAgICAgIC8qIFdhaXQgZm9yIElGRU0gdG8gYmUgcmFpc2VkICovCisgICAgICAgIGlmIChDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgICB7CisgICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDB4MFU7CisgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICB9CisgICAgICAvKiBXYWl0IGZvciBDQ0YgSUZFTSB0byBiZSByYWlzZWQgKi8KKyAgICAgIGlmIChDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogV2FpdCB1bnRpbCB0aGUgY29tcGxldGUgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KKyAgICBpZiAoQ1JZUF9XYWl0T25CVVNZRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAmIHJldHVybiBlcnJvciAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisjZWxzZSAvKiBBRVMgKi8KKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgeworICAgICAgLyogV29ya2Fyb3VuZCAxIDpvbmx5IEFFUyBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsKKworICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIH0KKyAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCi0gICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAKKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisKKyAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgIH0KICAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQogICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAgICAgIAorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgfQotICAgICAgd2hpbGUobG9vcGNvdW50ZXIgPCA0VSApCi0gICAgICB7IAotICAgICAgICAvKlBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOyAgICAgICAgICAgICAgCisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLypQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKICAgICAgICAgbG9vcGNvdW50ZXIrKzsKLSAgICAgIH0gICAgCi0gICAgICAKLSAgICAgIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgICAgIHsgCisgICAgICB9CisKKyAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgewogICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCi0gICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsgIAotICAgIH0gICAgICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICB9CisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgIH0KICAgZWxzZQogICB7Ci0jaWYgZGVmaW5lZChBRVMpIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKLSAgICB7IAorI2lmIGRlZmluZWQoQUVTKQorICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgewogICAgICAgLypXb3JrYXJvdW5kIDE6IG9ubHkgQUVTLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsgCi0gICAgICAKKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7CisKICAgICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KLSAgICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAgICAgCisgICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCiAgICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgIH0KLSNlbmRpZiAvKiBBRVMgKi8gICAgIAorI2VuZGlmIC8qIEFFUyAqLwogICB9CiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKQEAgLTUyMzksMTA3ICs1ODQ1LDEwNSBAQAogLyoqCiAgICogQGJyaWVmICBTZXRzIHRoZSBoZWFkZXIgcGhhc2Ugd2hlbiB1c2luZyBETUEgaW4gcHJvY2VzcwogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKLSAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZShIZWFkZXIgJiBIZWFkZXJTaXplKSAgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKICAgX19JTyB1aW50MzJfdCBjb3VudCAgPSAwVTsKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlIGZvciBHQ00vR01BQyBvciBDQ00gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCi0gIGlmKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICE9IDBVKSkKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlIGZvciBHQ00vR01BQyBvciBDQ00gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpKQogICB7Ci0gICAgCi0jaWYgZGVmaW5lZChDUllQKSAgCi0gICAgCisKKyNpZiBkZWZpbmVkKENSWVApCisKICAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsgCi0gICAgCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKwogICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOyAgICAKLSAgICAKLSAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICk9PSAwVSkKLSAgICB7IAotICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLyAKLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPTRVKQotICAgICAgeyAgICAgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgCisKICAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICAgIGRvCiAgICAgICAgIHsKICAgICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgICBpZihjb3VudCA9PSAwVSkKKyAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgICAgewogICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSk7ICAgICAgICAKKyAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZQotICAgIHsgICAKKyAgICB7CiAgICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKLSAgICAgIHsgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7IAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICAKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCiAgICAgICAgIC8qIFdhaXQgZm9yIElGRU0gdG8gYmUgcmFpc2VkICovCiAgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOwogICAgICAgICBkbwogICAgICAgICB7CiAgICAgICAgICAgY291bnQtLSA7Ci0gICAgICAgICAgaWYoY291bnQgPT0gMFUpCisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICAgIHsKICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsgCisgICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSk7CiAgICAgICB9CiAgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSk7IGxvb3Bjb3VudGVyKyspCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKICAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAgIAorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICAgIHsgCi0gICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsgICAgICAgICAKKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOwogICAgICAgICBsb29wY291bnRlcisrOwogICAgICAgfQogICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KQEAgLTUzNDcsMTg5ICs1OTUxLDE4NCBAQAogICAgICAgZG8KICAgICAgIHsKICAgICAgICAgY291bnQtLSA7Ci0gICAgICAgIGlmKGNvdW50ID09IDBVKQorICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgIHsKICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgIAorCiAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQotICAgICAgfQotICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsgICAgICAgICAKLSAgICB9ICAgICAKKyAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSk7CisgICAgfQogICAgIC8qIFdhaXQgdW50aWwgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkICovCiAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgZG8KICAgICB7CiAgICAgICBjb3VudC0tIDsKLSAgICAgIGlmKGNvdW50ID09IDBVKQorICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgewogICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0JVU1kpKTsgICAgIAotICAgIAotI2Vsc2UgLyogQUVTICovIAotICAgIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKKyAgICB9IHdoaWxlIChIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpOworCisjZWxzZSAvKiBBRVMgKi8KKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICAgewogICAgICAgLyogV29ya2Fyb3VuZCAxOiBvbmx5IEFFUywgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7IAotICAgICAgCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOworCiAgICAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOyAKLSAgICAgIAorICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKwogICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgICB9Ci0gICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApPT0gMFUpCi0gICAgeyAgICAgCi0gICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovIAotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IGhjcnlwLT5Jbml0LkhlYWRlclNpemUpOyBsb29wY291bnRlcis9NFUpCi0gICAgICB7ICAgICAgIAorICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IGhjcnlwLT5Jbml0LkhlYWRlclNpemUpOyBsb29wY291bnRlciArPSA0VSkKKyAgICAgIHsKICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgCi0gICAgICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovIAorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLwogICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKICAgICAgICAgZG8KICAgICAgICAgewogICAgICAgICAgIGNvdW50LS0gOwotICAgICAgICAgIGlmKGNvdW50ID09IDBVKQorICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgICB7CiAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwotICAgICAgICAKKyAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCiAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCi0gICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAgICAgIAorICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZQotICAgIHsgICAKKyAgICB7CiAgICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQogICAgICAgewogICAgICAgICAvKiBXcml0ZSB0aGUgSW5wdXQgYmxvY2sgaW4gdGhlIERhdGEgSW5wdXQgcmVnaXN0ZXIgKi8KLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCi0gICAgICAgIAotICAgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLyAKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisKKyAgICAgICAgLypXYWl0IG9uIENDRiBmbGFnKi8KICAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICAgIGRvCiAgICAgICAgIHsKICAgICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgICBpZihjb3VudCA9PSAwVSkKKyAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgICAgewogICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKLSAgICAgICAgCisgICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKwogICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsgICAgCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICAgfQogICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICkpOyBsb29wY291bnRlcisrKQorICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSk7IGxvb3Bjb3VudGVyKyspCiAgICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQotICAgICAgeyAKLSAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgICAgICAKKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKICAgICAgICAgbG9vcGNvdW50ZXIrKzsKLSAgICAgIH0gICAgCi0gICAgICAKLSAgICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovIAorICAgICAgfQorCisgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLwogICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICBkbwogICAgICAgewogICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgaWYoY291bnQgPT0gMFUpCisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKLSAgICAgIAorICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCiAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAKLSAgICB9ICAgICAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLyAKKyAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgIH0KKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiAgIH0KICAgZWxzZQogICB7Ci0jaWYgZGVmaW5lZChBRVMpIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKLSAgICB7IAorI2lmIGRlZmluZWQoQUVTKQorICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgewogICAgICAgLypXb3JrYXJvdW5kIDE6IG9ubHkgQUVTLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsgCi0gICAgICAKKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7CisKICAgICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KLSAgICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAgICAgCisgICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCiAgICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgIH0KLSNlbmRpZiAvKiBBRVMgKi8gICAgIAorI2VuZGlmIC8qIEFFUyAqLwogICB9CiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKQEAgLTU1NDQsMzY1ICs2MTQzLDI1NCBAQAogc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0jaWYgZGVmaW5lZChBRVMpIAotICB1aW50MzJfdCBsYXN0d29yZHNpemU7IAotICB1aW50MzJfdCBucGJsYjsJCi0jZW5kaWYgCisjaWYgZGVmaW5lZChBRVMpCisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgbnBibGI7CisjZW5kaWYKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICBpZihoY3J5cC0+SW5pdC5IZWFkZXJTaXplID09ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KQotICB7ICAgICAKKworI2lmIGRlZmluZWQoQ1JZUCkKKyAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCisgIHsKICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLSAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JICk7Ci0gICAgCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CisKICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgIAorCiAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAKKwogICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KLSAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsgCi0gICAgCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKICAgICAvKiBFbmFibGUgSW50ZXJydXB0cyAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSApOwotICAgIAorICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CisKICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgIAotICB9ICAgIAorICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgfQogICBlbHNlIGlmICgoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpKSA+PSA0VSkKLSAgICAKLSAgeyAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrICA7ICAgICAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworCisgIHsKKyAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgICAgIAorICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgIDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgfQogICBlbHNlCi0gIHsgICAgICAKKyAgewogICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApOyBsb29wY291bnRlcisrKQorICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKTsgbG9vcGNvdW50ZXIrKykKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIrIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOyAgICAKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgfQotICAgIHdoaWxlKGxvb3Bjb3VudGVyIDw0VSApCi0gICAgeyAKLSAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDB4MFU7ICAgICAgICAgCisgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgeworICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDB4MFU7CiAgICAgICBsb29wY291bnRlcisrOwotICAgIH0gICAgICAgICAKLSAgfSAgICAgICAgICAKLSNlbHNlIC8qIEFFUyAqLyAgCi0gIAotICBpZihoY3J5cC0+SW5pdC5IZWFkZXJTaXplID09ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KQorICAgIH0KKyAgfQorI2Vsc2UgLyogQUVTICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCiAgIHsKICAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAgIAorCiAgICAgLyogIFBheWxvYWQgcGhhc2Ugbm90IHN1cHBvcnRlZCBpbiBDQ00gQUVTMiAgKi8KLSAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgICB7CiAgICAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCiAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgICB9ICAgIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQ00pCisgICAgfQorICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKQogICAgIHsKICAgICAgIC8qIEluY3JlbWVudCBDcnlwSGVhZGVyQ291bnQgdG8gcGFzcyBpbiBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQgKi8KLSAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsgICAgCi0gICAgfSAgICAgICAgICAgIAotICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovIAotICAgIGlmKGhjcnlwLT5TaXplID09IDBVKQotICAgIHsgICAgIAorICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIH0KKyAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgIGlmIChoY3J5cC0+U2l6ZSA9PSAwVSkKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRXwgQ1JZUF9JVF9FUlJJRSk7Ci0gICAgICAKKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCiAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgfSAgICAgICAgICAgIAorICAgIH0KICAgICBlbHNlIGlmIChoY3J5cC0+U2l6ZSA+PSAxNlUpCi0gICAgeyAgICAgICAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgICAgCi0gICAgICBpZigoaGNyeXAtPkNyeXBJbkNvdW50ID09ICAoaGNyeXAtPlNpemUvNFUpKSAmJigoaGNyeXAtPlNpemUgJTE2VSApPT0gMFUpKSAgICAgICAKLSAgICAgIHsgICAgCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisKKyAgICAgIGlmICgoaGNyeXAtPkNyeXBJbkNvdW50ID09IChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpKQorICAgICAgewogICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgIH0gCisgICAgICB9CiAgICAgfQogICAgIGVsc2UgLyogU2l6ZSA8IDQgd29yZHMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLwogICAgIHsKICAgICAgIC8qIFdvcmthcm91bmQgbm90IGltcGxlbWVudGVkLCBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseQotICAgICAgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbi4gV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCisgICAgICBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgogICAgICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBDUllQX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLwotICAgICAgCisKICAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwotICAgICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7Ci0gICAgICAKKyAgICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyAxNlUpICsgMVUpICogMTZVKSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOworCiAgICAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLwotICAgICAgaWYgKChucGJsYiAlIDRVKSA9PTBVKSAKLSAgICAgIHsgCi0gICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUtbnBibGIpLzRVOwkJCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CiAgICAgICB9Ci0gICAgICBlbHNlIAorICAgICAgZWxzZQogICAgICAgewotICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICAgIH0JCi0gICAgICAKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgIH0KKwogICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQogICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICAgfQotICAgICAgd2hpbGUobG9vcGNvdW50ZXIgPDRVICkKLSAgICAgIHsgCi0gICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgCisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgICB9CiAgICAgfQotICB9ICAKKyAgfQogICBlbHNlIGlmICgoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpKSA+PSA0VSkKLSAgeyAKKyAgewogICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwotICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7ICAgICAgICAgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKICAgfQogICBlbHNlIC8qSGVhZGVyU2l6ZSA8IDQgb3IgSGVhZGVyU2l6ZSA+NCAmIEhlYWRlclNpemUgJTQgIT0gMCovCi0gIHsgCisgIHsKICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKTsgbG9vcGNvdW50ZXIrKykKKyAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSk7IGxvb3Bjb3VudGVyKyspCiAgICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOyAgIAorICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgfQotICAgIHdoaWxlKGxvb3Bjb3VudGVyIDw0VSApCi0gICAgeyAKLSAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOyAgICAgICAgIAorICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgIHsKKyAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgfQotICB9ICAgICAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovIAotfSAgICAgICAgICAgCisgIH0KKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KK30KIAogCiAvKioKLSAgKiBAYnJpZWYgIFdvcmthcm91bmQgdXNlZCBmb3IgR0NNL0NDTSBtb2RlLiAKKyAgKiBAYnJpZWYgIFdvcmthcm91bmQgdXNlZCBmb3IgR0NNL0NDTSBtb2RlLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQotICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlIAorICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlCiAgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCApCitzdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgbGFzdHdvcmRzaXplOwotICB1aW50MzJfdCBucGJsYjsJICAKLSNpZiBkZWZpbmVkKENSWVApIAorICB1aW50MzJfdCBucGJsYjsKKyNpZiBkZWZpbmVkKENSWVApCiAgIHVpbnQzMl90ICBpdjF0ZW1wOwogICB1aW50MzJfdCAgdGVtcFs0XSA9IHswfTsKLSAgdWludDMyX3QgIHRlbXAyWzRdPSB7MH07CisgIHVpbnQzMl90ICB0ZW1wMls0XSA9IHswfTsKICNlbmRpZiAvKiBDUllQICovCi0gIHVpbnQzMl90IGludGVybWVkaWF0ZV9kYXRhWzRdPXswfTsKKyAgdWludDMyX3QgaW50ZXJtZWRpYXRlX2RhdGFbNF0gPSB7MH07CiAgIHVpbnQzMl90IGluZGV4OwotICAKLSAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovIAotICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpLzE2VSkrMVUpKjE2VSktICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwotICAKKworICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KLSAgaWYgKChucGJsYiU0VSkgPT0wVSkgCi0gIHsgbGFzdHdvcmRzaXplID0gKDE2VS1ucGJsYikvNFU7CQkKKyAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgeworICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKICAgfQotICBlbHNlIAotICB7bGFzdHdvcmRzaXplID0gKCgxNlUtbnBibGIpLzRVKSArMVU7CisgIGVsc2UKKyAgeworICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CiAgIH0KLSAgCi0jaWYgZGVmaW5lZChDUllQKSAgICAJCi0gIAorCisjaWYgZGVmaW5lZChDUllQKQorCiAgIC8qIFdvcmthcm91bmQgMiwgY2FzZSBHQ00gZW5jcnlwdGlvbiAqLwogICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTSkKICAgewotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKLSAgICB7LypXb3JrYXJvdW5kIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXB1dGUgYXV0aGVudGljYXRpb24gdGFncyB3aGlsZSBkb2luZwotICAgICAgYSBHQ00gZW5jcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCisgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKKyAgICB7CisgICAgICAvKldvcmthcm91bmQgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZSBhdXRoZW50aWNhdGlvbiB0YWdzIHdoaWxlIGRvaW5nCisgICAgICAgYSBHQ00gZW5jcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCiAgICAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCisKICAgICAgIC8qVXBkYXRlIENSWVBfSVYxUiByZWdpc3RlciBhbmQgQUxHT01PREUqLwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICgoaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTdSKS0xKTsKLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9BRVNfQ1RSKTsgCi0gICAgICAKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoKGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ003UikgLSAxVSk7CisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0NUUik7CisKICAgICAgIC8qIEVuYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgIH0KLSAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8gICAgCi0gICAgZm9yKGluZGV4PTA7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykgICAgICAgIAorICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgICAgewogICAgICAgLyogV3JpdGUgdGhlIGxhc3QgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICB9ICAgIAotICAgIHdoaWxlKGluZGV4IDwgNFUpCisgICAgfQorICAgIHdoaWxlIChpbmRleCA8IDRVKQogICAgIHsKICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gMFU7Ci0gICAgICBpbmRleCsrOyAKLSAgICB9ICAgCisgICAgICBpbmRleCsrOworICAgIH0KICAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgeyAKKyAgICBpZiAoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKLSAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KLSAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbHNlCi0gICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwotICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKLSAgICB9ICAgIAotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKQotICAgIHsKLSAgICAgIGZvcihpbmRleD0wVTsgaW5kZXg8IDRVO2luZGV4KyspCi0gICAgICB7IAotICAgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gKi8KLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAKLSAgICAgICAgCi0gICAgICAgIC8qIEludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluIGZvciB0aGUgd29ya2Fyb3VuZCovCi0gICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSk9aW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwotICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgCi0gICAgICB9ICAgICAKLSAgICB9ICAKLSAgICAKLSAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCi0gICAgewotICAgICAgLyp3b3JrYXJvdW5kIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXB1dGUgYXV0aGVudGljYXRpb24gdGFncyB3aGlsZSBkb2luZwotICAgICAgYSBHQ00gZW5jcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCi0gICAgICAvKiBDaGFuZ2UgdGhlIEFFUyBtb2RlIHRvIEdDTSBtb2RlIGFuZCBTZWxlY3QgRmluYWwgcGhhc2UgKi8KLSAgICAgIC8qIGNvbmZpZ3VyZWQgIENITU9EIEdDTSAgICovCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0dDTSk7Ci0gICAgICAKLSAgICAgIC8qIGNvbmZpZ3VyZWQgIGZpbmFsIHBoYXNlICAqLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7Ci0gICAgICAKLSAgICAgIGlmICggKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0RBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzMyQikKLSAgICAgIHsKLSAgICAgICAgaWYgKChucGJsYiAlNFUpPT0xVSkKLSAgICAgICAgewotICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gMHhGRkZGRkYwMFU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChucGJsYiAlNFUpPT0yVSkKLSAgICAgICAgewotICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gMHhGRkZGMDAwMFU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChucGJsYiAlNFUpPT0zVSkKLSAgICAgICAgewotICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gMHhGRjAwMDAwMFU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV84QikKLSAgICAgIHsKLSAgICAgICAgaWYgKChucGJsYiAlNFUpPT0xVSkKLSAgICAgICAgewotICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gX19SRVYoMHhGRkZGRkYwMFUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobnBibGIgJTRVKT09MlUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUtMVVdICY9IF9fUkVWKDB4RkZGRjAwMDBVKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG5wYmxiICU0VSk9PTNVKQotICAgICAgICB7Ci0gICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JFVigweEZGMDAwMDAwVSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCi0gICAgICB7Ci0gICAgICAgIGlmICgobnBibGIgJTRVKT09MVUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUtMVVdICY9IF9fUk9SKCgweEZGRkZGRjAwVSksIDE2KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG5wYmxiICU0VSk9PTJVKQotICAgICAgICB7Ci0gICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JPUigoMHhGRkZGMDAwMFUpLCAxNik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChucGJsYiAlNFUpPT0zVSkKLSAgICAgICAgewotICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gX19ST1IoKDB4RkYwMDAwMDBVKSwgMTYpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8qQ1JZUF9EQVRBVFlQRV8xQiovCi0gICAgICB7Ci0gICAgICAgIGlmICgobnBibGIgJTRVKT09MVUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUtMVVdICY9IF9fUkJJVCgweEZGRkZGRjAwVSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChucGJsYiAlNFUpPT0yVSkKLSAgICAgICAgewotICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gX19SQklUKDB4RkZGRjAwMDBVKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG5wYmxiICU0VSk9PTNVKQotICAgICAgICB7Ci0gICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JCSVQoMHhGRjAwMDAwMFUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3IgKGluZGV4PTBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCi0gICAgICB7Ci0gICAgICAgIC8qV3JpdGUgdGhlIGludGVybWVkaWF0ZV9kYXRhIGluIHRoZSBJTiBGSUZPICovCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOPWludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKLSAgICAgIH0KLSAgICAgIHdoaWxlKGluZGV4IDwgNFUpCi0gICAgICB7Ci0gICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAweDBVOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICAgICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQotICAgICAgewotICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwotICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CkBAIC01OTEwLDY2ICs2Mzk4LDE4MyBAQAogICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpCisgICAgfQorICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKQorICAgIHsKKyAgICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXgrKykKICAgICAgIHsKLSAgICAgICAgZm9yKCBpbmRleD0wVTsgaW5kZXg8IDRVO2luZGV4KyspCisgICAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyAqLworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisKKyAgICAgICAgLyogSW50ZXJtZWRpYXRlIGRhdGEgYnVmZmVyIHRvIGJlIHVzZWQgaW4gZm9yIHRoZSB3b3JrYXJvdW5kKi8KKyAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKKyAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgICAgfQorICAgIH0KKworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCisgICAgeworICAgICAgLyp3b3JrYXJvdW5kIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXB1dGUgYXV0aGVudGljYXRpb24gdGFncyB3aGlsZSBkb2luZworICAgICAgYSBHQ00gZW5jcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCisgICAgICAvKiBDaGFuZ2UgdGhlIEFFUyBtb2RlIHRvIEdDTSBtb2RlIGFuZCBTZWxlY3QgRmluYWwgcGhhc2UgKi8KKyAgICAgIC8qIGNvbmZpZ3VyZWQgIENITU9EIEdDTSAgICovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0dDTSk7CisKKyAgICAgIC8qIGNvbmZpZ3VyZWQgIGZpbmFsIHBoYXNlICAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CisKKyAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMzJCKQorICAgICAgeworICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQogICAgICAgICB7Ci0gICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdPWhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGRkYwMFU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKKyAgICAgICAgeworICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkYwMDAwVTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkYwMDAwMDBVOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgICB7CisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SRVYoMHhGRkZGRkYwMFUpOworICAgICAgICB9CisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SRVYoMHhGRkZGMDAwMFUpOworICAgICAgICB9CisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SRVYoMHhGRjAwMDAwMFUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMTZCKQorICAgICAgeworICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUk9SKCgweEZGRkZGRjAwVSksIDE2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDJVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUk9SKCgweEZGRkYwMDAwVSksIDE2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUk9SKCgweEZGMDAwMDAwVSksIDE2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSAvKkNSWVBfREFUQVRZUEVfMUIqLworICAgICAgeworICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkJJVCgweEZGRkZGRjAwVSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKKyAgICAgICAgeworICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JCSVQoMHhGRkZGMDAwMFUpOworICAgICAgICB9CisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkYwMDAwMDBVKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCisgICAgICB7CisgICAgICAgIC8qV3JpdGUgdGhlIGludGVybWVkaWF0ZV9kYXRhIGluIHRoZSBJTiBGSUZPICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOworICAgICAgfQorICAgICAgd2hpbGUgKGluZGV4IDwgNFUpCisgICAgICB7CisgICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAweDBVOworICAgICAgICBpbmRleCsrOworICAgICAgfQorICAgICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworI2Vsc2UKKyAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorCisgICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkKKyAgICAgIHsKKyAgICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9IC8qIEVuZCBvZiBHQ00gZW5jcnlwdGlvbiAqLwotICBlbHNleyAgICAvKiBXb3JrYXJvdW5kIDIsIGNhc2UgQ0NNIGRlY3J5cHRpb24sIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXB1dGUKLSAgICBhdXRoZW50aWNhdGlvbiB0YWdzIHdoaWxlIGRvaW5nIGEgQ0NNIGRlY3J5cHRpb24gd2l0aCB0aGUgbGFzdCBibG9jawotICAgIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCi0gICAgCi0gICAgaWYoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09ESVIpID09IENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKQorICBlbHNlCisgIHsKKyAgICAvKiBXb3JrYXJvdW5kIDIsIGNhc2UgQ0NNIGRlY3J5cHRpb24sIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXB1dGUKKyAgICAgIGF1dGhlbnRpY2F0aW9uIHRhZ3Mgd2hpbGUgZG9pbmcgYSBDQ00gZGVjcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrCisgICAgICBvZiBwYXlsb2FkIHNpemUgaW5mZXJpb3IgdG8gMTI4IGJpdHMqLworCisgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkKICAgICB7CiAgICAgICBpdjF0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTdSOwotICAgICAgCisKICAgICAgIC8qIERpc2FibGUgQ1JZUCB0byBzdGFydCB0aGUgZmluYWwgcGhhc2UgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIHRlbXBbMF09ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMFI7Ci0gICAgICB0ZW1wWzFdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTFSOwotICAgICAgdGVtcFsyXT0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00yUjsKLSAgICAgIHRlbXBbM109ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNM1I7Ci0gICAgICAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlI9IGl2MXRlbXA7Ci0gICAgICAKKworICAgICAgdGVtcFswXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMFI7CisgICAgICB0ZW1wWzFdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00xUjsKKyAgICAgIHRlbXBbMl0gPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTJSOworICAgICAgdGVtcFszXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNM1I7CisKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSBpdjF0ZW1wOworCiAgICAgICAvKiBDb25maWd1cmVkICBDSE1PRCBDVFIgICAqLwogICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0FFU19DVFIpOwotICAgICAgCisKICAgICAgIC8qIEVuYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgIH0KLSAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8gCi0gICAgZm9yKGluZGV4PTA7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKKyAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKQogICAgIHsKICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgfSAgICAKLSAgICB3aGlsZShpbmRleCA8IDRVKQorICAgIH0KKyAgICB3aGlsZSAoaW5kZXggPCA0VSkKICAgICB7CiAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9IDBVOwotICAgICAgaW5kZXgrKzsgCisgICAgICBpbmRleCsrOwogICAgIH0KICAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQotICAgIHsgCisgICAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKKwogICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCiAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CkBAIC01OTc4LDc5ICs2NTgzLDc5IEBACiAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgfQotICAgIAotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKQorCisgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUpICE9IDB4MFUpCiAgICAgewotICAgICAgZm9yKGluZGV4PTBVOyBpbmRleDwgNFU7aW5kZXgrKykKLSAgICAgIHsgIAorICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQorICAgICAgewogICAgICAgICAvKiBSZWFkIHRoZSBPdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gKi8KICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICAgICAKKwogICAgICAgICAvKmludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluIGZvciB0aGUgd29ya2Fyb3VuZCovCi0gICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSk9aW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOworICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwogICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgICB9CiAgICAgfQotICAgIAotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkKKworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpCiAgICAgewotICAgICAgdGVtcDJbMF09ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMFI7Ci0gICAgICB0ZW1wMlsxXT0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00xUjsKLSAgICAgIHRlbXAyWzJdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTJSOwotICAgICAgdGVtcDJbM109ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNM1I7Ci0gICAgICAKKyAgICAgIHRlbXAyWzBdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00wUjsKKyAgICAgIHRlbXAyWzFdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00xUjsKKyAgICAgIHRlbXAyWzJdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00yUjsKKyAgICAgIHRlbXAyWzNdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00zUjsKKwogICAgICAgLyogY29uZmlndXJlZCAgQ0hNT0QgQ0NNICAgKi8KICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9BRVNfQ0NNKTsKLSAgICAgIAorCiAgICAgICAvKiBjb25maWd1cmVkICBIZWFkZXIgcGhhc2UgICovCiAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfR0NNX0NDTVBILCBDUllQX1BIQVNFX0hFQURFUik7Ci0gICAgICAKKwogICAgICAgLypzZXQgdG8gemVybyB0aGUgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWRkZWQgYml0cyovCi0gICAgICBmb3IoaW5kZXggPSBsYXN0d29yZHNpemU7IGluZGV4PDRVOyBpbmRleCArKykKKyAgICAgIGZvciAoaW5kZXggPSBsYXN0d29yZHNpemU7IGluZGV4IDwgNFU7IGluZGV4ICsrKQogICAgICAgewotICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPTBVOworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSAwVTsKICAgICAgIH0KLSAgICAgIGlmICgobnBibGIgJTRVKT09MVUpCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQogICAgICAgewotICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUtMVVdICY9IDB4RkZGRkZGMDBVOworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGRkYwMFU7CiAgICAgICB9Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTJVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSAweEZGRkYwMDAwVTsKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkZGRjAwMDBVOwogICAgICAgfQotICAgICAgaWYgKChucGJsYiAlNFUpPT0zVSkKKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCiAgICAgICB7Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gMHhGRjAwMDAwMFU7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGMDAwMDAwVTsKICAgICAgIH0KLSAgICAgIGZvcihpbmRleD0wVTsgaW5kZXggPCA0VSA7IGluZGV4ICsrKQorICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVIDsgaW5kZXggKyspCiAgICAgICB7CiAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSBePSAgdGVtcFtpbmRleF07Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSBePSAgdGVtcDJbaW5kZXhdOyAKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdIF49ICB0ZW1wMltpbmRleF07CiAgICAgICB9Ci0gICAgICBmb3IoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXggKyspCisgICAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4ICsrKQogICAgICAgewogICAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgICAgIGlmKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIGlmIChDUllQX1dhaXRPbkJVU1lGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCiAgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCisKICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQotICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwotICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCi0gICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwotICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CisgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgIH0KICAgICB9CkBAIC02MDYxLDE0NCArNjY2NiwxNDQgQEAKIAogI2Vsc2UgLyogQUVTICovCiAKLSAgLypXb3JrYXJvdW5kIDI6IGNhc2UgR0NNIGVuY3J5cHRpb24sIGR1cmluZyBwYXlsb2FkIHBoYXNlIGFuZCBiZWZvcmUgaW5zZXJ0aW5nIAotICB0aGUgbGFzdCBibG9jayBvZiBwYXlsYW9kLCB3aGljaCBzaXplIGlzIGluZmVyaW9yIHRvICAxMjggYml0cyAgKi8gICAKLSAgCi0gIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQorICAvKldvcmthcm91bmQgMjogY2FzZSBHQ00gZW5jcnlwdGlvbiwgZHVyaW5nIHBheWxvYWQgcGhhc2UgYW5kIGJlZm9yZSBpbnNlcnRpbmcKKyAgdGhlIGxhc3QgYmxvY2sgb2YgcGF5bGFvZCwgd2hpY2ggc2l6ZSBpcyBpbmZlcmlvciB0byAgMTI4IGJpdHMgICovCisKKyAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQogICB7CiAgICAgLyogY29uZmlndXJlZCAgQ0hNT0QgQ1RSICAgKi8KICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9DSE1PRCwgQ1JZUF9BRVNfQ1RSKTsKLSAgfSAKKyAgfQogICAvKiAgbGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgZm9yKGluZGV4ID0gMFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKKyAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgIHsKICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gIH0gICAgCi0gIHdoaWxlKGluZGV4IDwgNFUpCisgIH0KKyAgd2hpbGUgKGluZGV4IDwgNFUpCiAgIHsKICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gMFU7Ci0gICAgaW5kZXgrKzsgCisgICAgaW5kZXgrKzsKICAgfQogICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKLSAgeyAKKyAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgIHsKICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQotICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwotICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQotICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KLSAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOworICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCisgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICB9Ci0gIAorCiAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAKLSAgZm9yKGluZGV4ID0gMFU7IGluZGV4PCA0VTtpbmRleCsrKQorCisgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXgrKykKICAgewogICAgIC8qIFJlYWQgdGhlIE91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyAqLwogICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICAgCisKICAgICAvKmludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluICB0aGUgd29ya2Fyb3VuZCovCi0gICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKT0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwotICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgCisgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgIH0KLSAgCi0gIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQotICB7ICAgIAorCisgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9NT0RFKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKKyAgewogICAgIC8qIGNvbmZpZ3VyZWQgIENITU9EIEdDTSAgICovCiAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfQ0hNT0QsIENSWVBfQUVTX0dDTV9HTUFDKTsKLSAgICAKKwogICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLwogICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX0ZJTkFMKTsKLSAgICAKLSAgICBpZiAoIChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0RBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzMyQikKKworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCiAgICAgewotICAgICAgaWYgKChucGJsYiAlNFUpPT0xVSkKKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMVUpCiAgICAgICB7Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gMHhGRkZGRkYwMFU7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkZGRjAwVTsKICAgICAgIH0KLSAgICAgIGlmICgobnBibGIgJTRVKT09MlUpCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDJVKQogICAgICAgewotICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUtMVVdICY9IDB4RkZGRjAwMDBVOworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGMDAwMFU7CiAgICAgICB9Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTNVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSAweEZGMDAwMDAwVTsKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkYwMDAwMDBVOwogICAgICAgfQogICAgIH0KICAgICBlbHNlIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgICB7Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTFVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JFVigweEZGRkZGRjAwVSk7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGRkZGRjAwVSk7CiAgICAgICB9Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTJVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JFVigweEZGRkYwMDAwVSk7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGRkYwMDAwVSk7CiAgICAgICB9Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTNVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JFVigweEZGMDAwMDAwVSk7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGMDAwMDAwVSk7CiAgICAgICB9CiAgICAgfQogICAgIGVsc2UgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0RBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgICB7Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTFVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JPUigoMHhGRkZGRkYwMFUpLCAxNik7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGRkYwMFUpLCAxNik7CiAgICAgICB9Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTJVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JPUigoMHhGRkZGMDAwMFUpLCAxNik7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGMDAwMFUpLCAxNik7CiAgICAgICB9Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTNVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JPUigoMHhGRjAwMDAwMFUpLCAxNik7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRjAwMDAwMFUpLCAxNik7CiAgICAgICB9CiAgICAgfQogICAgIGVsc2UgLypDUllQX0RBVEFUWVBFXzFCKi8KICAgICB7Ci0gICAgICBpZiAoKG5wYmxiICU0VSk9PTFVKQorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKICAgICAgIHsKLSAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSBfX1JCSVQoMHhGRkZGRkYwMFUpOworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkZGRkZGMDBVKTsKICAgICAgIH0KLSAgICAgIGlmICgobnBibGIgJTRVKT09MlUpCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDJVKQogICAgICAgewotICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUtMVVdICY9IF9fUkJJVCgweEZGRkYwMDAwVSk7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JCSVQoMHhGRkZGMDAwMFUpOwogICAgICAgfQotICAgICAgaWYgKChucGJsYiAlNFUpPT0zVSkKKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCiAgICAgICB7Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gX19SQklUKDB4RkYwMDAwMDBVKTsKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkJJVCgweEZGMDAwMDAwVSk7CiAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qV3JpdGUgdGhlIGludGVybWVkaWF0ZV9kYXRhIGluIHRoZSBJTiBGSUZPICovICAgCi0gICAgZm9yKGluZGV4ID0gMFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykgICAgICAgIAorCisgICAgLypXcml0ZSB0aGUgaW50ZXJtZWRpYXRlX2RhdGEgaW4gdGhlIElOIEZJRk8gKi8KKyAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKICAgICB7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwotICAgIH0gICAgCi0gICAgd2hpbGUoaW5kZXggPCA0VSkKKyAgICB9CisgICAgd2hpbGUgKGluZGV4IDwgNFUpCiAgICAgewogICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgIGluZGV4Kys7CiAgICAgfQogICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICAgIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCi0gICAgeyAKKyAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKKwogICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgIAorCiAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQpAQCAtNjIwNywxMDQgKzY4MTIsMTA0IEBACiAjZWxzZQogICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCi0gICAgfSAgICAgIAorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CiAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgICAKLSAgICBmb3IoIGluZGV4ID0gMFU7IGluZGV4PCA0VTtpbmRleCsrKQotICAgIHsgCi0gICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF09aGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKworICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXgrKykKKyAgICB7CisgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgIH0KICAgfS8qRW5kIG9mIFdvcmthcm91bmQgMiovCiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiB9CiAjZW5kaWYgLyogQUVTIG9yIEdDTSBDQ00gZGVmaW5lZCovCi0jaWYgZGVmaW5lZCAoQ1JZUCkgIAorI2lmIGRlZmluZWQgKENSWVApCiAjaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKQogLyoqCiAgICogQGJyaWVmICBIYW5kbGUgQ1JZUCBoYXJkd2FyZSBibG9jayBUaW1lb3V0IHdoZW4gd2FpdGluZyBmb3IgSUZFTSBmbGFnIHRvIGJlIHJhaXNlZC4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuICAgICAgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uSUZFTUZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgdGlja3N0YXJ0OwotICAKKwogICAvKiBHZXQgdGltZW91dCAqLwogICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKLSAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKQorCisgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfSUZFTSkpCiAgIHsKICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICB7Ci0gICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCi0gICAgICB7IAorICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CiAgICAgfQotICB9ICAKLSAgcmV0dXJuIEhBTF9PSzsgCisgIH0KKyAgcmV0dXJuIEhBTF9PSzsKIH0KICNlbmRpZiAvKiBHQ00gQ0NNIGRlZmluZWQqLwogLyoqCiAgICogQGJyaWVmICBIYW5kbGUgQ1JZUCBoYXJkd2FyZSBibG9jayBUaW1lb3V0IHdoZW4gd2FpdGluZyBmb3IgQlVTWSBmbGFnIHRvIGJlIHJhaXNlZC4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuICAgICAgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uQlVTWUZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgdGlja3N0YXJ0OwotICAKKwogICAvKiBHZXQgdGltZW91dCAqLwogICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKLSAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0JVU1kpKQorCisgIHdoaWxlIChIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpCiAgIHsKICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICB7Ci0gICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCi0gICAgICB7ICAgICAgCisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIEhBTF9PSzsgCisgIHJldHVybiBIQUxfT0s7CiB9CiAKIAogLyoqCiAgICogQGJyaWVmICBIYW5kbGUgQ1JZUCBoYXJkd2FyZSBibG9jayBUaW1lb3V0IHdoZW4gd2FpdGluZyBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZC4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuICAgICAgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uT0ZORUZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgdGlja3N0YXJ0OwotICAKKwogICAvKiBHZXQgdGltZW91dCAqLwogICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKLSAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQorCisgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCiAgIHsKICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICB7Ci0gICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCi0gICAgICB7ICAgICAgIAorICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiBIQUxfT0s7IAorICByZXR1cm4gSEFMX09LOwogfQogCiAjZWxzZSAvKiBBRVMgKi8KQEAgLTYzMTIsMjkgKzY5MTcsMjkgQEAKIC8qKgogICAqIEBicmllZiAgSGFuZGxlIENSWVAgaGFyZHdhcmUgYmxvY2sgVGltZW91dCB3aGVuIHdhaXRpbmcgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZC4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuICAgICAgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uQ0NGbGFnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIHVpbnQzMl90IHRpY2tzdGFydDsKLSAgCisKICAgLyogR2V0IHRpbWVvdXQgKi8KICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgCi0gIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQotICB7ICAgIAorCisgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKKyAgewogICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgIHsKLSAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSApCi0gICAgICB7ICAgIAorICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICB7CiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiBIQUxfT0s7IAorICByZXR1cm4gSEFMX09LOwogfQogCiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwpAQCAtNjM0Miw4ICs2OTQ3LDggQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCi0gIAorICAqLworCiAKIAogLyoqCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmNHh4X2hhbF9jcnlwX2V4LmMgYi9TcmMvc3RtMzJmNHh4X2hhbF9jcnlwX2V4LmMKaW5kZXggYzg0ZjY5MC4uMzY5YTAzYyAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjR4eF9oYWxfY3J5cF9leC5jCisrKyBiL1NyYy9zdG0zMmY0eHhfaGFsX2NyeXBfZXguYwpAQCAtMywxNyArMywxNyBAQAogICAqIEBmaWxlICAgIHN0bTMyZjR4eF9oYWxfY3J5cF9leC5jCiAgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAgKiBAYnJpZWYgICBFeHRlbmRlZCBDUllQIEhBTCBtb2R1bGUgZHJpdmVyCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIENSWVAgZXh0ZW5zaW9uIHBlcmlwaGVyYWw6Ci0gICogICAgICAgICAgICsgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zICAgICAKLSAgKiAgCisgICogICAgICAgICAgICsgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zCisgICoKICAgQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBbLi5dCiAgICAgVGhlIENSWVAgZXh0ZW5zaW9uIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKLSAgICAoIylBZnRlciBBRVMtR0NNIG9yIEFFUy1DQ00gIEVuY3J5cHRpb24vRGVjcnlwdGlvbiB1c2VyIGNhbiBzdGFydCBmb2xsb3dpbmcgQVBJIAorICAgICgjKUFmdGVyIEFFUy1HQ00gb3IgQUVTLUNDTSAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHVzZXIgY2FuIHN0YXJ0IGZvbGxvd2luZyBBUEkKICAgICAgICB0byBnZXQgdGhlICBhdXRoZW50aWNhdGlvbiBtZXNzYWdlcyA6CiAgICAgICAoIyMpIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAgKCMjKSBIQUxfQ1JZUEV4X0FFU0NDTV9HZW5lcmF0ZUF1dGhUQUcKQEAgLTIyLDE2ICsyMiwxNiBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICAqCiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCi0gICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICovIAorICAqLwogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInN0bTMyZjR4eF9oYWwuaCIKQEAgLTU1LDEwICs1NSwxMCBAQAogICAqIEB7CiAgICovCiAjaWYgZGVmaW5lZChBRVMpCi0jZGVmaW5lIENSWVBfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gaGVhZGVyIHBoYXNlICovIAotI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgICAgICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgKi8gCi0jZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSCAgICAgICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAgKi8gCisjZGVmaW5lIENSWVBfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMCAgICAgICAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSBoZWFkZXIgcGhhc2UgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzEgICAgICAgICAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICovCisjZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSCAgICAgICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAgKi8KIAogI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEVuY3J5cHRpb24gbW9kZSAgICovCiAjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OICAgICAgICAgICAgIEFFU19DUl9NT0RFXzAgICAgICAgICAgIC8qITwgS2V5IGRlcml2YXRpb24gbW9kZSAgb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAgKi8KQEAgLTc3LDExICs3NywxMSBAQAogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogCiAjZGVmaW5lICBDUllQRXhfUEhBU0VfUFJPQ0VTUyAgICAgICAweDAyVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gcHJvY2Vzc2luZyBwaGFzZSAqLwotI2RlZmluZSAgQ1JZUEV4X1BIQVNFX0ZJTkFMICAgICAgICAgMHgwM1UgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIGluIGZpbmFsIHBoYXNlIHRoaXMgaXMgcmVsZXZhbnQgb25seSB3aXRoIENDTSBhbmQgR0NNIG1vZGVzICovICAgCisjZGVmaW5lICBDUllQRXhfUEhBU0VfRklOQUwgICAgICAgICAweDAzVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gZmluYWwgcGhhc2UgdGhpcyBpcyByZWxldmFudCBvbmx5IHdpdGggQ0NNIGFuZCBHQ00gbW9kZXMgKi8KIAotIC8qICBDVFIwIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCi0jZGVmaW5lIENSWVBfQ0NNX0NUUjBfMCAgICAgICAgICAgIDB4MDdGRkZGRkZVICAgICAgICAgCi0jZGVmaW5lIENSWVBfQ0NNX0NUUjBfMyAgICAgICAgICAgIDB4RkZGRkZGMDBVICAgICAgICAgCisvKiAgQ1RSMCBpbmZvcm1hdGlvbiB0byB1c2UgaW4gQ0NNIGFsZ29yaXRobSAqLworI2RlZmluZSBDUllQX0NDTV9DVFIwXzAgICAgICAgICAgICAweDA3RkZGRkZGVQorI2RlZmluZSBDUllQX0NDTV9DVFIwXzMgICAgICAgICAgICAweEZGRkZGRjAwVQogCiAKIC8qKgpAQCAtOTksMTUgKzk5LDE1IEBACiAgICogQHsKICAgKi8KIAotLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMgCi0gKiAgQGJyaWVmICAgRXh0ZW5kZWQgcHJvY2Vzc2luZyBmdW5jdGlvbnMuIAotICoKLUB2ZXJiYXRpbSAgIAorLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgRXh0ZW5kZWQgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCi0gICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBnZW5lcmF0ZSB0aGUgYXV0aGVudGljYXRpb24gCi0gICAgICAgICAgVEFHIGluIFBvbGxpbmcgbW9kZSAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBnZW5lcmF0ZSB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgICAgICBUQUcgaW4gUG9sbGluZyBtb2RlCiAgICAgICAoIylIQUxfQ1JZUEV4X0FFU0dDTV9HZW5lcmF0ZUF1dGhUQUcKICAgICAgICgjKUhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAgICAgdGhleSBzaG91bGQgYmUgdXNlZCBhZnRlciBFbmNyeXB0L0RlY3J5cHQgb3BlcmF0aW9uLgpAQCAtMTI3LDc5ICsxMjcsNzkgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCkKIHsKLSAgdWludDMyX3QgdGlja3N0YXJ0OyAgICAKKyAgdWludDMyX3QgdGlja3N0YXJ0OwogICB1aW50NjRfdCBoZWFkZXJsZW5ndGggPSAodWludDY0X3QpKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpICogMzJVOyAvKiBIZWFkZXIgbGVuZ3RoIGluIGJpdHMgKi8KLSAgdWludDY0X3QgaW5wdXRsZW5ndGggPSAodWludDY0X3QpKGhjcnlwLT5TaXplKSAqIDhVOyAvKiBpbnB1dCBsZW5ndGggaW4gYml0cyAqLwotICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7ICAKLSAgCi0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKLSAgeyAgCisgIHVpbnQ2NF90IGlucHV0bGVuZ3RoID0gKHVpbnQ2NF90KWhjcnlwLT5TaXplc1N1bSAqIDhVOyAvKiBpbnB1dCBsZW5ndGggaW4gYml0cyAqLworICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgewogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICAgX19IQUxfTE9DSyhoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLwotICAgIGlmKGhjcnlwLT5QaGFzZSA9PSBDUllQRXhfUEhBU0VfUFJPQ0VTUykKKyAgICBpZiAoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQogICAgIHsKICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwaGFzZSAqLwogICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUEV4X1BIQVNFX0ZJTkFMOwogICAgIH0KICAgICBlbHNlIC8qIEluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBub3QgYmVlbiBwZXJmb3JtZWQqLwotICAgIHsgCisgICAgewogICAgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAotICAgICAgLyogU2VxdWVuY2UgZXJyb3IgY29kZSBmaWVsZCAqLyAKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQVVUSF9UQUdfU0VRVUVOQ0U7IAotICAgICAgCisKKyAgICAgIC8qIFNlcXVlbmNlIGVycm9yIGNvZGUgZmllbGQgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQVVUSF9UQUdfU0VRVUVOQ0U7CisKICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCi0gICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAgCi0gICAgICAKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCiAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICNpZiBkZWZpbmVkKENSWVApCi0gICAgCisKICAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAKLSAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8gIAotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOyAgCi0gICAgCi0gICAgLypBTEdPRElSIGJpdCBtdXN0IGJlIHNldCB0byCRMJIuKi8gCisKKyAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfR0NNX0NDTVBILCBDUllQX1BIQVNFX0ZJTkFMKTsKKworICAgIC8qQUxHT0RJUiBiaXQgbXVzdCBiZSBzZXQgdG8gkTCSLiovCiAgICAgaGNyeXAtPkluc3RhbmNlLT5DUiAmPSAgfkNSWVBfQ1JfQUxHT0RJUjsKLSAgICAKKwogICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAgIAorCiAgICAgLyogV3JpdGUgdGhlIG51bWJlciBvZiBiaXRzIGluIGhlYWRlciAoNjQgYml0cykgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzCiAgICAgaW4gdGhlIHBheWxvYWQgKi8KLSAgICBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQorICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgIHsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsKICAgICB9Ci0gICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsgICAgCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsKICAgICB9Ci0gICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgICB7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigodWludDMyX3QpaGVhZGVybGVuZ3RoLCAxNlUpOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKHVpbnQzMl90KWlucHV0bGVuZ3RoLCAxNlUpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMzJCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMzJCKQogICAgIHsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKTsKQEAgLTIxMCw2OCArMjEwLDY4IEBACiAgICAgewogICAgICAgLyogTm90aGluZyB0byBkbyAqLwogICAgIH0KLSAgICAKKwogICAgIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19PRk5FKSkKKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQogICAgIHsKICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgIHsKLSAgICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQotICAgICAgICB7ICAgICAgIAorICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgUGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQogICAgICAgfQotICAgIH0gICAgICAgICAgCi0gICAgCisgICAgfQorCiAgICAgLyogUmVhZCB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIHRoZSBvdXRwdXQgRklGTyAqLwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgICAgICAKLSAgICAKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworCiAjZWxzZSAvKiBBRVMqLwotICAgIAorCiAgICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOyAgICAKLSAgICAKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CisKICAgICAvKiBXcml0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gaGVhZGVyICg2NCBiaXRzKSBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMKLSAgICBpbiB0aGUgcGF5bG9hZCAqLyAKLSAgICBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQorICAgIGluIHRoZSBwYXlsb2FkICovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SQklUKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsKICAgICB9Ci0gICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7ICAgIAorICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgIHsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKHVpbnQzMl90KWhlYWRlcmxlbmd0aCwgMTZVKTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKHVpbnQzMl90KWlucHV0bGVuZ3RoLCAxNlUpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMzJCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMzJCKQogICAgIHsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpOwpAQCAtMjg0LDU2ICsyODQsNTYgQEAKICAgICB9CiAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpCiAgICAgewogICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICAgewotICAgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCi0gICAgICAgIHsgICAgICAgCisgICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgICAgICAgIAotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfSAgICAgICAgIAotICAgIAorICAgIH0KKwogICAgIC8qIFJlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyBpbiB0aGUgb3V0cHV0IEZJRk8gKi8KLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOyAKLSAgICAKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKwogICAgIC8qIENsZWFyIENDRiBmbGFnICovCi0gICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgIAotICAgIAotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAKLSAgICAKKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworCiAgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwotICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAKLSAgICAKKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKwogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHJldHVybiBIQUxfRVJST1I7Ci0gIH0gICAKKyAgfQogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CkBAIC0zNDksMTEgKzM0OSwxMSBAQAogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KQogewogICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7Ci0gIHVpbnQzMl90IGN0cjAgWzRdPXswfTsKKyAgdWludDMyX3QgY3RyMCBbNF0gPSB7MH07CiAgIHVpbnQzMl90IGN0cjBhZGRyID0gKHVpbnQzMl90KWN0cjA7CiAgIHVpbnQzMl90IHRpY2tzdGFydDsKIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgIHsKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaGNyeXApOwpAQCAtMzYyLDcgKzM2Miw3IEBACiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKIAogICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCi0gICAgaWYoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQorICAgIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUEV4X1BIQVNFX1BST0NFU1MpCiAgICAgewogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBoYXNlICovCiAgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQRXhfUEhBU0VfRklOQUw7CkBAIC0zODMsNzIgKzM4Myw3MiBAQAogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9CiAKLSNpZiBkZWZpbmVkKENSWVApIAorI2lmIGRlZmluZWQoQ1JZUCkKIAogICAgIC8qIERpc2FibGUgQ1JZUCB0byBzdGFydCB0aGUgZmluYWwgcGhhc2UgKi8KICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogCiAgICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICYgQUxHT0RJUiBiaXQgbXVzdCBiZSBzZXQgdG8gkTCSLiAqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEh8Q1JZUF9DUl9BTEdPRElSLCBDUllQX1BIQVNFX0ZJTkFMfENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfR0NNX0NDTVBIIHwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX1BIQVNFX0ZJTkFMIHwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOwogCiAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAKICAgICAvKiBXcml0ZSB0aGUgY291bnRlciBibG9jayBpbiB0aGUgSU4gRklGTywgQ1RSMCBpbmZvcm1hdGlvbiBmcm9tIEIwCiAgICAgZGF0YSBoYXMgdG8gYmUgc3dhcHBlZCBhY2NvcmRpbmcgdG8gdGhlIERBVEFUWVBFKi8KLSAgICBjdHIwWzBdPShoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzA7Ci0gICAgY3RyMFsxXT1oY3J5cC0+SW5pdC5CMFsxXTsKLSAgICBjdHIwWzJdPWhjcnlwLT5Jbml0LkIwWzJdOwotICAgIGN0cjBbM109aGNyeXAtPkluaXQuQjBbM10gJiAgQ1JZUF9DQ01fQ1RSMF8zOworICAgIGN0cjBbMF0gPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMF8wOworICAgIGN0cjBbMV0gPSBoY3J5cC0+SW5pdC5CMFsxXTsKKyAgICBjdHIwWzJdID0gaGNyeXAtPkluaXQuQjBbMl07CisgICAgY3RyMFszXSA9IGhjcnlwLT5Jbml0LkIwWzNdICYgIENSWVBfQ0NNX0NUUjBfMzsKIAotICAgIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShjdHIwYWRkcikpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgIHsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgIHsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgICB9CiAgICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQorICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCiAgICAgewogICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICAgewotICAgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCisgICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIENsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKQEAgLTQ2NSwxMyArNDY1LDEzIEBACiAgICAgfQogCiAgICAgLyogUmVhZCB0aGUgQXV0aCBUQUcgaW4gdGhlIElOIEZJRk8gKi8KLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKIAogI2Vsc2UgLyogQUVTICovCiAKQEAgLTQ4MCw3NSArNDgwLDc1IEBACiAKICAgICAvKiBXcml0ZSB0aGUgY291bnRlciBibG9jayBpbiB0aGUgSU4gRklGTywgQ1RSMCBpbmZvcm1hdGlvbiBmcm9tIEIwCiAgICAgZGF0YSBoYXMgdG8gYmUgc3dhcHBlZCBhY2NvcmRpbmcgdG8gdGhlIERBVEFUWVBFKi8KLSAgICBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQorICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQogICAgIHsKLSAgICAgIGN0cjBbMF09KF9fUkVWKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjBfMCk7Ci0gICAgICBjdHIwWzFdPV9fUkVWKGhjcnlwLT5Jbml0LkIwWzFdKTsKLSAgICAgIGN0cjBbMl09X19SRVYoaGNyeXAtPkluaXQuQjBbMl0pOwotICAgICAgY3RyMFszXT0oX19SRVYoaGNyeXAtPkluaXQuQjBbM10pJiBDUllQX0NDTV9DVFIwXzMpOworICAgICAgY3RyMFswXSA9IChfX1JFVihoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzApOworICAgICAgY3RyMFsxXSA9IF9fUkVWKGhjcnlwLT5Jbml0LkIwWzFdKTsKKyAgICAgIGN0cjBbMl0gPSBfX1JFVihoY3J5cC0+SW5pdC5CMFsyXSk7CisgICAgICBjdHIwWzNdID0gKF9fUkVWKGhjcnlwLT5Jbml0LkIwWzNdKSYgQ1JZUF9DQ01fQ1RSMF8zKTsKIAotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QqKShjdHIwYWRkcikpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICAgewotICAgICAgY3RyMFswXT0gKCBfX1JPUigoaGNyeXAtPkluaXQuQjBbMF0pLCAxNlUpJiBDUllQX0NDTV9DVFIwXzApOwotICAgICAgY3RyMFsxXT0gICBfX1JPUigoaGNyeXAtPkluaXQuQjBbMV0pLCAxNlUpOwotICAgICAgY3RyMFsyXT0gICBfX1JPUigoaGNyeXAtPkluaXQuQjBbMl0pLCAxNlUpOwotICAgICAgY3RyMFszXT0gKCBfX1JPUigoaGNyeXAtPkluaXQuQjBbM10pLCAxNlUpJiBDUllQX0NDTV9DVFIwXzMpOworICAgICAgY3RyMFswXSA9IChfX1JPUigoaGNyeXAtPkluaXQuQjBbMF0pLCAxNlUpJiBDUllQX0NDTV9DVFIwXzApOworICAgICAgY3RyMFsxXSA9ICAgX19ST1IoKGhjcnlwLT5Jbml0LkIwWzFdKSwgMTZVKTsKKyAgICAgIGN0cjBbMl0gPSAgIF9fUk9SKChoY3J5cC0+SW5pdC5CMFsyXSksIDE2VSk7CisgICAgICBjdHIwWzNdID0gKF9fUk9SKChoY3J5cC0+SW5pdC5CMFszXSksIDE2VSkmIENSWVBfQ0NNX0NUUjBfMyk7CiAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QqKShjdHIwYWRkciksIDE2VSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QqKShjdHIwYWRkciksIDE2VSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgICB9Ci0gICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICAgewotICAgICAgY3RyMFswXT0oX19SQklUKGhjcnlwLT5Jbml0LkIwWzBdKSYgQ1JZUF9DQ01fQ1RSMF8wKTsKLSAgICAgIGN0cjBbMV09X19SQklUKGhjcnlwLT5Jbml0LkIwWzFdKTsKLSAgICAgIGN0cjBbMl09X19SQklUKGhjcnlwLT5Jbml0LkIwWzJdKTsKLSAgICAgIGN0cjBbM109KF9fUkJJVChoY3J5cC0+SW5pdC5CMFszXSkmIENSWVBfQ0NNX0NUUjBfMyk7CisgICAgICBjdHIwWzBdID0gKF9fUkJJVChoY3J5cC0+SW5pdC5CMFswXSkmIENSWVBfQ0NNX0NUUjBfMCk7CisgICAgICBjdHIwWzFdID0gX19SQklUKGhjcnlwLT5Jbml0LkIwWzFdKTsKKyAgICAgIGN0cjBbMl0gPSBfX1JCSVQoaGNyeXAtPkluaXQuQjBbMl0pOworICAgICAgY3RyMFszXSA9IChfX1JCSVQoaGNyeXAtPkluaXQuQjBbM10pJiBDUllQX0NDTV9DVFIwXzMpOwogCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgY3RyMFswXT0oaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMF8wOwotICAgICAgY3RyMFsxXT1oY3J5cC0+SW5pdC5CMFsxXTsKLSAgICAgIGN0cjBbMl09aGNyeXAtPkluaXQuQjBbMl07Ci0gICAgICBjdHIwWzNdPWhjcnlwLT5Jbml0LkIwWzNdICYgIENSWVBfQ0NNX0NUUjBfMzsKKyAgICAgIGN0cjBbMF0gPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMF8wOworICAgICAgY3RyMFsxXSA9IGhjcnlwLT5Jbml0LkIwWzFdOworICAgICAgY3RyMFsyXSA9IGhjcnlwLT5Jbml0LkIwWzJdOworICAgICAgY3RyMFszXSA9IGhjcnlwLT5Jbml0LkIwWzNdICYgIENSWVBfQ0NNX0NUUjBfMzsKIAotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGN0cjBhZGRyKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGN0cjBhZGRyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgIH0KIAogICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpCisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQogICAgIHsKICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgIHsKLSAgICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CkBAIC01NjUsMTMgKzU2NSwxMyBAQAogICAgIH0KIAogICAgIC8qIFJlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyBpbiB0aGUgb3V0cHV0IEZJRk8gKi8KLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogCiAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKQEAgLTU5NCw3ICs1OTQsNyBAQAogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gSEFMX09LOyAgIAorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKQEAgLTYwMywxMiArNjAzLDEyIEBACiAKICNpZiBkZWZpbmVkIChBRVMpCiAvKiogQGRlZmdyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEtleSBEZXJpdmF0aW9uIGZ1bmN0aW9ucwotICogIEBicmllZiAgIEF1dG9LZXlEZXJpdmF0aW9uIGZ1bmN0aW9ucyAKLSAqCisgICogIEBicmllZiAgIEF1dG9LZXlEZXJpdmF0aW9uIGZ1bmN0aW9ucworICAqCiBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICMjIyMjIEtleSBEZXJpdmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIEVuYWJsZSBvciBEaXNhYmxlIHRoZQogICAgICAgICAgIHRoZSBBdXRvS2V5RGVyaXZhdGlvbiBwYXJhbWV0ZXIgaW4gQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQogICAgICAgICAgIFRoZXNlIGZ1bmN0aW9uIGFyZSBhbGxvd2VkIG9ubHkgaW4gVGlueUFFUyBJUC4KQEAgLTYyNCwxNSArNjI0LDE1IEBACiAgICovCiB2b2lkICBIQUxfQ1JZUEV4X0VuYWJsZUF1dG9LZXlEZXJpdmF0aW9uKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7Ci0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKLSAgeyAgCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKICAgICBoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPSBFTkFCTEU7CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAotICB9IAorICAgIGhjcnlwLT5FcnJvckNvZGUgPSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworICB9CiB9CiAvKioKICAgKiBAYnJpZWYgIEFFUyBkaXNhYmxlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9ucwpAQCAtNjQxLDIyICs2NDEsMjIgQEAKICAgKi8KIHZvaWQgIEhBTF9DUllQRXhfRGlzYWJsZUF1dG9LZXlEZXJpdmF0aW9uKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7Ci0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICAgewogICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IERJU0FCTEU7CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAotICB9ICAKKyAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKKyAgfQogfQogCiAvKioKICAgKiBAfQogICAqLwogI2VuZGlmIC8qIEFFUyBvciBHQ00gQ0NNIGRlZmluZWQqLwotI2VuZGlmIC8qIEFFUyAqLyAKKyNlbmRpZiAvKiBBRVMgKi8KICNlbmRpZiAvKiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAqLwogCiAvKioKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY0eHhfaGFsX2ZtcGkyYy5jIGIvU3JjL3N0bTMyZjR4eF9oYWxfZm1waTJjLmMKaW5kZXggNDRmNjRmMy4uZDRmNDJkNSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjR4eF9oYWxfZm1waTJjLmMKKysrIGIvU3JjL3N0bTMyZjR4eF9oYWxfZm1waTJjLmMKQEAgLTM1MiwxMyArMzUyLDEzIEBACiAKIAogLyogUHJpdmF0ZSBkZWZpbmUgdG8gY2VudHJhbGl6ZSB0aGUgZW5hYmxlL2Rpc2FibGUgb2YgSW50ZXJydXB0cyAqLwotI2RlZmluZSBGTVBJMkNfWEZFUl9UWF9JVCAgICAgICAgICAoMHgwMDAwMDAwMVUpCi0jZGVmaW5lIEZNUEkyQ19YRkVSX1JYX0lUICAgICAgICAgICgweDAwMDAwMDAyVSkKLSNkZWZpbmUgRk1QSTJDX1hGRVJfTElTVEVOX0lUICAgICAgKDB4MDAwMDAwMDRVKQorI2RlZmluZSBGTVBJMkNfWEZFUl9UWF9JVCAgICAgICAgICAodWludDE2X3QpKDB4MDAwMVUpICAgLyogQml0IGZpZWxkIGNhbiBiZSBjb21iaW5hdGVkIHdpdGggQHJlZiBGTVBJMkNfWEZFUl9MSVNURU5fSVQgKi8KKyNkZWZpbmUgRk1QSTJDX1hGRVJfUlhfSVQgICAgICAgICAgKHVpbnQxNl90KSgweDAwMDJVKSAgIC8qIEJpdCBmaWVsZCBjYW4gYmUgY29tYmluYXRlZCB3aXRoIEByZWYgRk1QSTJDX1hGRVJfTElTVEVOX0lUICovCisjZGVmaW5lIEZNUEkyQ19YRkVSX0xJU1RFTl9JVCAgICAgICh1aW50MTZfdCkoMHg4MDAwVSkgICAvKiBCaXQgZmllbGQgY2FuIGJlIGNvbWJpbmF0ZWQgd2l0aCBAcmVmIEZNUEkyQ19YRkVSX1RYX0lUIGFuZCBAcmVmIEZNUEkyQ19YRkVSX1JYX0lUICovCiAKLSNkZWZpbmUgRk1QSTJDX1hGRVJfRVJST1JfSVQgICAgICAgKDB4MDAwMDAwMTFVKQotI2RlZmluZSBGTVBJMkNfWEZFUl9DUExUX0lUICAgICAgICAoMHgwMDAwMDAxMlUpCi0jZGVmaW5lIEZNUEkyQ19YRkVSX1JFTE9BRF9JVCAgICAgICgweDAwMDAwMDEyVSkKKyNkZWZpbmUgRk1QSTJDX1hGRVJfRVJST1JfSVQgICAgICAgKHVpbnQxNl90KSgweDAwMTBVKSAgIC8qIEJpdCBkZWZpbml0aW9uIHRvIG1hbmFnZSBhZGRpdGlvbiBvZiBnbG9iYWwgRXJyb3IgYW5kIE5BQ0sgdHJlYXRtZW50ICovCisjZGVmaW5lIEZNUEkyQ19YRkVSX0NQTFRfSVQgICAgICAgICh1aW50MTZfdCkoMHgwMDIwVSkgICAvKiBCaXQgZGVmaW5pdGlvbiB0byBtYW5hZ2Ugb25seSBTVE9QIGV2ZW5lbWVudCAqLworI2RlZmluZSBGTVBJMkNfWEZFUl9SRUxPQURfSVQgICAgICAodWludDE2X3QpKDB4MDA0MFUpICAgLyogQml0IGRlZmluaXRpb24gdG8gbWFuYWdlIG9ubHkgUmVsb2FkIG9mIE5CWVRFICovCiAKIC8qIFByaXZhdGUgZGVmaW5lIFNlcXVlbnRpYWwgVHJhbnNmZXIgT3B0aW9ucyBkZWZhdWx0L3Jlc2V0IHZhbHVlICovCiAjZGVmaW5lIEZNUEkyQ19OT19PUFRJT05fRlJBTUUgICAgICgweEZGRkYwMDAwVSkKQEAgLTQxMSw2ICs0MTEsOSBAQAogc3RhdGljIHZvaWQgRk1QSTJDX0VuYWJsZV9JUlEoRk1QSTJDX0hhbmRsZVR5cGVEZWYgKmhmbXBpMmMsIHVpbnQxNl90IEludGVycnVwdFJlcXVlc3QpOwogc3RhdGljIHZvaWQgRk1QSTJDX0Rpc2FibGVfSVJRKEZNUEkyQ19IYW5kbGVUeXBlRGVmICpoZm1waTJjLCB1aW50MTZfdCBJbnRlcnJ1cHRSZXF1ZXN0KTsKIAorLyogUHJpdmF0ZSBmdW5jdGlvbiB0byB0cmVhdCBkaWZmZXJlbnQgZXJyb3IgY2FsbGJhY2sgKi8KK3N0YXRpYyB2b2lkIEZNUEkyQ19UcmVhdEVycm9yQ2FsbGJhY2soRk1QSTJDX0hhbmRsZVR5cGVEZWYgKmhmbXBpMmMpOworCiAvKiBQcml2YXRlIGZ1bmN0aW9uIHRvIGZsdXNoIFRYRFIgcmVnaXN0ZXIgKi8KIHN0YXRpYyB2b2lkIEZNUEkyQ19GbHVzaF9UWERSKEZNUEkyQ19IYW5kbGVUeXBlRGVmICpoZm1waTJjKTsKIApAQCAtMzIwMSw3ICszMjA0LDcgQEAKICAgICAgIEZNUEkyQ19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoZm1waTJjKTsKIAogICAgICAgLyogVXBkYXRlIHhmZXJtb2RlIGFjY29yZGluZ2x5IGlmIG5vIHJlbG9hZCBpcyBuZWNlc3NhcnkgKi8KLSAgICAgIGlmIChoZm1waTJjLT5YZmVyQ291bnQgPCBNQVhfTkJZVEVfU0laRSkKKyAgICAgIGlmIChoZm1waTJjLT5YZmVyQ291bnQgPD0gTUFYX05CWVRFX1NJWkUpCiAgICAgICB7CiAgICAgICAgIHhmZXJtb2RlID0gaGZtcGkyYy0+WGZlck9wdGlvbnM7CiAgICAgICB9CkBAIC0zMjg2LDcgKzMyODksNyBAQAogICAgICAgRk1QSTJDX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhmbXBpMmMpOwogCiAgICAgICAvKiBVcGRhdGUgeGZlcm1vZGUgYWNjb3JkaW5nbHkgaWYgbm8gcmVsb2FkIGlzIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKGhmbXBpMmMtPlhmZXJDb3VudCA8IE1BWF9OQllURV9TSVpFKQorICAgICAgaWYgKGhmbXBpMmMtPlhmZXJDb3VudCA8PSBNQVhfTkJZVEVfU0laRSkKICAgICAgIHsKICAgICAgICAgeGZlcm1vZGUgPSBoZm1waTJjLT5YZmVyT3B0aW9uczsKICAgICAgIH0KQEAgLTM0NDcsNyArMzQ1MCw3IEBACiAgICAgICBGTVBJMkNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaGZtcGkyYyk7CiAKICAgICAgIC8qIFVwZGF0ZSB4ZmVybW9kZSBhY2NvcmRpbmdseSBpZiBubyByZWxvYWQgaXMgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoaGZtcGkyYy0+WGZlckNvdW50IDwgTUFYX05CWVRFX1NJWkUpCisgICAgICBpZiAoaGZtcGkyYy0+WGZlckNvdW50IDw9IE1BWF9OQllURV9TSVpFKQogICAgICAgewogICAgICAgICB4ZmVybW9kZSA9IGhmbXBpMmMtPlhmZXJPcHRpb25zOwogICAgICAgfQpAQCAtMzUzMiw3ICszNTM1LDcgQEAKICAgICAgIEZNUEkyQ19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoZm1waTJjKTsKIAogICAgICAgLyogVXBkYXRlIHhmZXJtb2RlIGFjY29yZGluZ2x5IGlmIG5vIHJlbG9hZCBpcyBuZWNlc3NhcnkgKi8KLSAgICAgIGlmIChoZm1waTJjLT5YZmVyQ291bnQgPCBNQVhfTkJZVEVfU0laRSkKKyAgICAgIGlmIChoZm1waTJjLT5YZmVyQ291bnQgPD0gTUFYX05CWVRFX1NJWkUpCiAgICAgICB7CiAgICAgICAgIHhmZXJtb2RlID0gaGZtcGkyYy0+WGZlck9wdGlvbnM7CiAgICAgICB9CkBAIC00MjUyLDkgKzQyNTUsMjEgQEAKICAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaGZtcGkyYyk7CiAKLSAgICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KLSAgICBGTVBJMkNfRGlzYWJsZV9JUlEoaGZtcGkyYywgRk1QSTJDX1hGRVJfUlhfSVQpOwotICAgIEZNUEkyQ19EaXNhYmxlX0lSUShoZm1waTJjLCBGTVBJMkNfWEZFUl9UWF9JVCk7CisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzIGFuZCBTdG9yZSBQcmV2aW91cyBzdGF0ZSAqLworICAgIGlmIChoZm1waTJjLT5TdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfVFgpCisgICAgeworICAgICAgRk1QSTJDX0Rpc2FibGVfSVJRKGhmbXBpMmMsIEZNUEkyQ19YRkVSX1RYX0lUKTsKKyAgICAgIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfVFg7CisgICAgfQorICAgIGVsc2UgaWYgKGhmbXBpMmMtPlN0YXRlID09IEhBTF9GTVBJMkNfU1RBVEVfQlVTWV9SWCkKKyAgICB7CisgICAgICBGTVBJMkNfRGlzYWJsZV9JUlEoaGZtcGkyYywgRk1QSTJDX1hGRVJfUlhfSVQpOworICAgICAgaGZtcGkyYy0+UHJldmlvdXNTdGF0ZSA9IEZNUEkyQ19TVEFURV9NQVNURVJfQlVTWV9SWDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICB9CiAKICAgICAvKiBTZXQgU3RhdGUgYXQgSEFMX0ZNUEkyQ19TVEFURV9BQk9SVCAqLwogICAgIGhmbXBpMmMtPlN0YXRlID0gSEFMX0ZNUEkyQ19TVEFURV9BQk9SVDsKQEAgLTUwMDIsNiArNTAxNyw3IEBACiB7CiAgIHVpbnQzMl90IHRtcG9wdGlvbnMgPSBoZm1waTJjLT5YZmVyT3B0aW9uczsKICAgdWludDMyX3QgdHJlYXRkbWFuYWNrID0gMFU7CisgIEhBTF9GTVBJMkNfU3RhdGVUeXBlRGVmIHRtcHN0YXRlOwogCiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaGZtcGkyYyk7CkBAIC01MDgwLDggKzUwOTYsMjQgQEAKICAgICAgICAgLyogU2V0IEVycm9yQ29kZSBjb3JyZXNwb25kaW5nIHRvIGEgTm9uLUFja25vd2xlZGdlICovCiAgICAgICAgIGhmbXBpMmMtPkVycm9yQ29kZSB8PSBIQUxfRk1QSTJDX0VSUk9SX0FGOwogCisgICAgICAgIC8qIFN0b3JlIGN1cnJlbnQgaGZtcGkyYy0+U3RhdGUsIHNvbHZlIE1JU1JBMjAxMi1SdWxlLTEzLjUgKi8KKyAgICAgICAgdG1wc3RhdGUgPSBoZm1waTJjLT5TdGF0ZTsKKwogICAgICAgICBpZiAoKHRtcG9wdGlvbnMgPT0gRk1QSTJDX0ZJUlNUX0ZSQU1FKSB8fCAodG1wb3B0aW9ucyA9PSBGTVBJMkNfTkVYVF9GUkFNRSkpCiAgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHRtcHN0YXRlID09IEhBTF9GTVBJMkNfU1RBVEVfQlVTWV9UWCkgfHwgKHRtcHN0YXRlID09IEhBTF9GTVBJMkNfU1RBVEVfQlVTWV9UWF9MSVNURU4pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfU0xBVkVfQlVTWV9UWDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKHRtcHN0YXRlID09IEhBTF9GTVBJMkNfU1RBVEVfQlVTWV9SWCkgfHwgKHRtcHN0YXRlID09IEhBTF9GTVBJMkNfU1RBVEVfQlVTWV9SWF9MSVNURU4pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfU0xBVkVfQlVTWV9SWDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICAgICAgICB9CisKICAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KICAgICAgICAgICBGTVBJMkNfSVRFcnJvcihoZm1waTJjLCBoZm1waTJjLT5FcnJvckNvZGUpOwogICAgICAgICB9CkBAIC01MzcwLDkgKzU0MDIsMjcgQEAKICAgKi8KIHN0YXRpYyB2b2lkIEZNUEkyQ19JVFNsYXZlU2VxQ3BsdChGTVBJMkNfSGFuZGxlVHlwZURlZiAqaGZtcGkyYykKIHsKKyAgdWludDMyX3QgdG1wY3IxdmFsdWUgPSBSRUFEX1JFRyhoZm1waTJjLT5JbnN0YW5jZS0+Q1IxKTsKKwogICAvKiBSZXNldCBGTVBJMkMgaGFuZGxlIG1vZGUgKi8KICAgaGZtcGkyYy0+TW9kZSA9IEhBTF9GTVBJMkNfTU9ERV9OT05FOwogCisgIC8qIElmIGEgRE1BIGlzIG9uZ29pbmcsIFVwZGF0ZSBoYW5kbGUgc2l6ZSBjb250ZXh0ICovCisgIGlmIChGTVBJMkNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBGTVBJMkNfQ1IxX1RYRE1BRU4pICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhmbXBpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkZNUEkyQ19DUjFfVFhETUFFTjsKKyAgfQorICBlbHNlIGlmIChGTVBJMkNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBGTVBJMkNfQ1IxX1JYRE1BRU4pICE9IFJFU0VUKQorICB7CisgICAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhmbXBpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkZNUEkyQ19DUjFfUlhETUFFTjsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBEbyBub3RoaW5nICovCisgIH0KKwogICBpZiAoaGZtcGkyYy0+U3RhdGUgPT0gSEFMX0ZNUEkyQ19TVEFURV9CVVNZX1RYX0xJU1RFTikKICAgewogICAgIC8qIFJlbW92ZSBIQUxfRk1QSTJDX1NUQVRFX1NMQVZFX0JVU1lfVFgsIGtlZXAgb25seSBIQUxfRk1QSTJDX1NUQVRFX0xJU1RFTiAqLwpAQCAtNTQyNywxOSArNTQ3NywzNiBAQAogc3RhdGljIHZvaWQgRk1QSTJDX0lUTWFzdGVyQ3BsdChGTVBJMkNfSGFuZGxlVHlwZURlZiAqaGZtcGkyYywgdWludDMyX3QgSVRGbGFncykKIHsKICAgdWludDMyX3QgdG1wZXJyb3I7CisgIHVpbnQzMl90IHRtcElURmxhZ3MgPSBJVEZsYWdzOworICB1aW50MzJfdCB0bXA7CiAKICAgLyogQ2xlYXIgU1RPUCBGbGFnICovCiAgIF9fSEFMX0ZNUEkyQ19DTEVBUl9GTEFHKGhmbXBpMmMsIEZNUEkyQ19GTEFHX1NUT1BGKTsKIAorICAvKiBEaXNhYmxlIEludGVycnVwdHMgYW5kIFN0b3JlIFByZXZpb3VzIHN0YXRlICovCisgIGlmIChoZm1waTJjLT5TdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfVFgpCisgIHsKKyAgICBGTVBJMkNfRGlzYWJsZV9JUlEoaGZtcGkyYywgRk1QSTJDX1hGRVJfVFhfSVQpOworICAgIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfVFg7CisgIH0KKyAgZWxzZSBpZiAoaGZtcGkyYy0+U3RhdGUgPT0gSEFMX0ZNUEkyQ19TVEFURV9CVVNZX1JYKQorICB7CisgICAgRk1QSTJDX0Rpc2FibGVfSVJRKGhmbXBpMmMsIEZNUEkyQ19YRkVSX1JYX0lUKTsKKyAgICBoZm1waTJjLT5QcmV2aW91c1N0YXRlID0gRk1QSTJDX1NUQVRFX01BU1RFUl9CVVNZX1JYOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgfQorCiAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLwogICBGTVBJMkNfUkVTRVRfQ1IyKGhmbXBpMmMpOwogCiAgIC8qIFJlc2V0IGhhbmRsZSBwYXJhbWV0ZXJzICovCi0gIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfTk9ORTsKICAgaGZtcGkyYy0+WGZlcklTUiAgICAgICA9IE5VTEw7CiAgIGhmbXBpMmMtPlhmZXJPcHRpb25zICAgPSBGTVBJMkNfTk9fT1BUSU9OX0ZSQU1FOwogCi0gIGlmIChGTVBJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBGTVBJMkNfRkxBR19BRikgIT0gUkVTRVQpCisgIGlmIChGTVBJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBGTVBJMkNfRkxBR19BRikgIT0gUkVTRVQpCiAgIHsKICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KICAgICBfX0hBTF9GTVBJMkNfQ0xFQVJfRkxBRyhoZm1waTJjLCBGTVBJMkNfRkxBR19BRik7CkBAIC01NDQ4LDEyICs1NTE1LDE4IEBACiAgICAgaGZtcGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBJMkNfRVJST1JfQUY7CiAgIH0KIAorICAvKiBGZXRjaCBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgaWYgKChoZm1waTJjLT5TdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0FCT1JUKSAmJiAoRk1QSTJDX0NIRUNLX0ZMQUcodG1wSVRGbGFncywgRk1QSTJDX0ZMQUdfUlhORSkgIT0gUkVTRVQpKQorICB7CisgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgIHRtcCA9ICh1aW50OF90KWhmbXBpMmMtPkluc3RhbmNlLT5SWERSOworCisgICAgVU5VU0VEKHRtcCk7CisgIH0KKwogICAvKiBGbHVzaCBUWCByZWdpc3RlciAqLwogICBGTVBJMkNfRmx1c2hfVFhEUihoZm1waTJjKTsKIAotICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KLSAgRk1QSTJDX0Rpc2FibGVfSVJRKGhmbXBpMmMsIEZNUEkyQ19YRkVSX1RYX0lUIHwgRk1QSTJDX1hGRVJfUlhfSVQpOwotCiAgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgaGZtcGkyYy0+RXJyb3JDb2RlLCBtaXNyYSBydWxlICovCiAgIHRtcGVycm9yID0gaGZtcGkyYy0+RXJyb3JDb2RlOwogCkBAIC01NDY3LDYgKzU1NDAsNyBAQAogICBlbHNlIGlmIChoZm1waTJjLT5TdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfVFgpCiAgIHsKICAgICBoZm1waTJjLT5TdGF0ZSA9IEhBTF9GTVBJMkNfU1RBVEVfUkVBRFk7CisgICAgaGZtcGkyYy0+UHJldmlvdXNTdGF0ZSA9IEZNUEkyQ19TVEFURV9OT05FOwogCiAgICAgaWYgKGhmbXBpMmMtPk1vZGUgPT0gSEFMX0ZNUEkyQ19NT0RFX01FTSkKICAgICB7CkBAIC01NTAxLDYgKzU1NzUsNyBAQAogICBlbHNlIGlmIChoZm1waTJjLT5TdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfUlgpCiAgIHsKICAgICBoZm1waTJjLT5TdGF0ZSA9IEhBTF9GTVBJMkNfU1RBVEVfUkVBRFk7CisgICAgaGZtcGkyYy0+UHJldmlvdXNTdGF0ZSA9IEZNUEkyQ19TVEFURV9OT05FOwogCiAgICAgaWYgKGhmbXBpMmMtPk1vZGUgPT0gSEFMX0ZNUEkyQ19NT0RFX01FTSkKICAgICB7CkBAIC01NTQ3LDEyICs1NjIyLDI2IEBACiB7CiAgIHVpbnQzMl90IHRtcGNyMXZhbHVlID0gUkVBRF9SRUcoaGZtcGkyYy0+SW5zdGFuY2UtPkNSMSk7CiAgIHVpbnQzMl90IHRtcElURmxhZ3MgPSBJVEZsYWdzOworICBIQUxfRk1QSTJDX1N0YXRlVHlwZURlZiB0bXBzdGF0ZSA9IGhmbXBpMmMtPlN0YXRlOwogCiAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLwogICBfX0hBTF9GTVBJMkNfQ0xFQVJfRkxBRyhoZm1waTJjLCBGTVBJMkNfRkxBR19TVE9QRik7CiAKLSAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotICBGTVBJMkNfRGlzYWJsZV9JUlEoaGZtcGkyYywgRk1QSTJDX1hGRVJfTElTVEVOX0lUIHwgRk1QSTJDX1hGRVJfVFhfSVQgfCBGTVBJMkNfWEZFUl9SWF9JVCk7CisgIC8qIERpc2FibGUgSW50ZXJydXB0cyBhbmQgU3RvcmUgUHJldmlvdXMgc3RhdGUgKi8KKyAgaWYgKCh0bXBzdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfVFgpIHx8ICh0bXBzdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfVFhfTElTVEVOKSkKKyAgeworICAgIEZNUEkyQ19EaXNhYmxlX0lSUShoZm1waTJjLCBGTVBJMkNfWEZFUl9MSVNURU5fSVQgfCBGTVBJMkNfWEZFUl9UWF9JVCk7CisgICAgaGZtcGkyYy0+UHJldmlvdXNTdGF0ZSA9IEZNUEkyQ19TVEFURV9TTEFWRV9CVVNZX1RYOworICB9CisgIGVsc2UgaWYgKCh0bXBzdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfUlgpIHx8ICh0bXBzdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfUlhfTElTVEVOKSkKKyAgeworICAgIEZNUEkyQ19EaXNhYmxlX0lSUShoZm1waTJjLCBGTVBJMkNfWEZFUl9MSVNURU5fSVQgfCBGTVBJMkNfWEZFUl9SWF9JVCk7CisgICAgaGZtcGkyYy0+UHJldmlvdXNTdGF0ZSA9IEZNUEkyQ19TVEFURV9TTEFWRV9CVVNZX1JYOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgfQogCiAgIC8qIERpc2FibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLwogICBoZm1waTJjLT5JbnN0YW5jZS0+Q1IyIHw9IEZNUEkyQ19DUjJfTkFDSzsKQEAgLTU1NjYsNiArNTY1NSw5IEBACiAgIC8qIElmIGEgRE1BIGlzIG9uZ29pbmcsIFVwZGF0ZSBoYW5kbGUgc2l6ZSBjb250ZXh0ICovCiAgIGlmIChGTVBJMkNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBGTVBJMkNfQ1IxX1RYRE1BRU4pICE9IFJFU0VUKQogICB7CisgICAgLyogRGlzYWJsZSBETUEgUmVxdWVzdCAqLworICAgIGhmbXBpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkZNUEkyQ19DUjFfVFhETUFFTjsKKwogICAgIGlmIChoZm1waTJjLT5oZG1hdHggIT0gTlVMTCkKICAgICB7CiAgICAgICBoZm1waTJjLT5YZmVyQ291bnQgPSAodWludDE2X3QpX19IQUxfRE1BX0dFVF9DT1VOVEVSKGhmbXBpMmMtPmhkbWF0eCk7CkBAIC01NTczLDYgKzU2NjUsOSBAQAogICB9CiAgIGVsc2UgaWYgKEZNUEkyQ19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIEZNUEkyQ19DUjFfUlhETUFFTikgIT0gUkVTRVQpCiAgIHsKKyAgICAvKiBEaXNhYmxlIERNQSBSZXF1ZXN0ICovCisgICAgaGZtcGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+Rk1QSTJDX0NSMV9SWERNQUVOOworCiAgICAgaWYgKGhmbXBpMmMtPmhkbWFyeCAhPSBOVUxMKQogICAgIHsKICAgICAgIGhmbXBpMmMtPlhmZXJDb3VudCA9ICh1aW50MTZfdClfX0hBTF9ETUFfR0VUX0NPVU5URVIoaGZtcGkyYy0+aGRtYXJ4KTsKQEAgLTU2MDksNyArNTcwNCw2IEBACiAgICAgaGZtcGkyYy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBJMkNfRVJST1JfQUY7CiAgIH0KIAotICBoZm1waTJjLT5QcmV2aW91c1N0YXRlID0gRk1QSTJDX1NUQVRFX05PTkU7CiAgIGhmbXBpMmMtPk1vZGUgPSBIQUxfRk1QSTJDX01PREVfTk9ORTsKICAgaGZtcGkyYy0+WGZlcklTUiA9IE5VTEw7CiAKQEAgLTU2MzIsNiArNTcyNiw3IEBACiAKICAgICBoZm1waTJjLT5YZmVyT3B0aW9ucyA9IEZNUEkyQ19OT19PUFRJT05fRlJBTUU7CiAgICAgaGZtcGkyYy0+U3RhdGUgPSBIQUxfRk1QSTJDX1NUQVRFX1JFQURZOworICAgIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfTk9ORTsKIAogICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaGZtcGkyYyk7CkBAIC01NjQ3LDYgKzU3NDIsNyBAQAogICBlbHNlIGlmIChoZm1waTJjLT5TdGF0ZSA9PSBIQUxfRk1QSTJDX1NUQVRFX0JVU1lfUlgpCiAgIHsKICAgICBoZm1waTJjLT5TdGF0ZSA9IEhBTF9GTVBJMkNfU1RBVEVfUkVBRFk7CisgICAgaGZtcGkyYy0+UHJldmlvdXNTdGF0ZSA9IEZNUEkyQ19TVEFURV9OT05FOwogCiAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoZm1waTJjKTsKQEAgLTU2NjEsNiArNTc1Nyw3IEBACiAgIGVsc2UKICAgewogICAgIGhmbXBpMmMtPlN0YXRlID0gSEFMX0ZNUEkyQ19TVEFURV9SRUFEWTsKKyAgICBoZm1waTJjLT5QcmV2aW91c1N0YXRlID0gRk1QSTJDX1NUQVRFX05PTkU7CiAKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhmbXBpMmMpOwpAQCAtNTczNCw2ICs1ODMxLDcgQEAKIHN0YXRpYyB2b2lkIEZNUEkyQ19JVEVycm9yKEZNUEkyQ19IYW5kbGVUeXBlRGVmICpoZm1waTJjLCB1aW50MzJfdCBFcnJvckNvZGUpCiB7CiAgIEhBTF9GTVBJMkNfU3RhdGVUeXBlRGVmIHRtcHN0YXRlID0gaGZtcGkyYy0+U3RhdGU7CisgIHVpbnQzMl90IHRtcHByZXZpb3Vzc3RhdGU7CiAKICAgLyogUmVzZXQgaGFuZGxlIHBhcmFtZXRlcnMgKi8KICAgaGZtcGkyYy0+TW9kZSAgICAgICAgICA9IEhBTF9GTVBJMkNfTU9ERV9OT05FOwpAQCAtNTc1Myw3ICs1ODUxLDYgQEAKIAogICAgIC8qIGtlZXAgSEFMX0ZNUEkyQ19TVEFURV9MSVNURU4gaWYgc2V0ICovCiAgICAgaGZtcGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9GTVBJMkNfU1RBVEVfTElTVEVOOwotICAgIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfTk9ORTsKICAgICBoZm1waTJjLT5YZmVySVNSICAgICAgID0gRk1QSTJDX1NsYXZlX0lTUl9JVDsKICAgfQogICBlbHNlCkBAIC01NzY4LDE2ICs1ODY1LDE5IEBACiAgICAgICAvKiBTZXQgSEFMX0ZNUEkyQ19TVEFURV9SRUFEWSAqLwogICAgICAgaGZtcGkyYy0+U3RhdGUgICAgICAgICA9IEhBTF9GTVBJMkNfU1RBVEVfUkVBRFk7CiAgICAgfQotICAgIGhmbXBpMmMtPlByZXZpb3VzU3RhdGUgPSBGTVBJMkNfU1RBVEVfTk9ORTsKICAgICBoZm1waTJjLT5YZmVySVNSICAgICAgID0gTlVMTDsKICAgfQogCiAgIC8qIEFib3J0IERNQSBUWCB0cmFuc2ZlciBpZiBhbnkgKi8KLSAgaWYgKChoZm1waTJjLT5JbnN0YW5jZS0+Q1IxICYgRk1QSTJDX0NSMV9UWERNQUVOKSA9PSBGTVBJMkNfQ1IxX1RYRE1BRU4pCisgIHRtcHByZXZpb3Vzc3RhdGUgPSBoZm1waTJjLT5QcmV2aW91c1N0YXRlOworICBpZiAoKGhmbXBpMmMtPmhkbWF0eCAhPSBOVUxMKSAmJiAoKHRtcHByZXZpb3Vzc3RhdGUgPT0gRk1QSTJDX1NUQVRFX01BU1RFUl9CVVNZX1RYKSB8fCAodG1wcHJldmlvdXNzdGF0ZSA9PSBGTVBJMkNfU1RBVEVfU0xBVkVfQlVTWV9UWCkpKQogICB7Ci0gICAgaGZtcGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+Rk1QSTJDX0NSMV9UWERNQUVOOworICAgIGlmICgoaGZtcGkyYy0+SW5zdGFuY2UtPkNSMSAmIEZNUEkyQ19DUjFfVFhETUFFTikgPT0gRk1QSTJDX0NSMV9UWERNQUVOKQorICAgIHsKKyAgICAgIGhmbXBpMmMtPkluc3RhbmNlLT5DUjEgJj0gfkZNUEkyQ19DUjFfVFhETUFFTjsKKyAgICB9CiAKLSAgICBpZiAoaGZtcGkyYy0+aGRtYXR4ICE9IE5VTEwpCisgICAgaWYgKEhBTF9ETUFfR2V0U3RhdGUoaGZtcGkyYy0+aGRtYXR4KSAhPSBIQUxfRE1BX1NUQVRFX1JFQURZKQogICAgIHsKICAgICAgIC8qIFNldCB0aGUgRk1QSTJDIERNQSBBYm9ydCBjYWxsYmFjayA6CiAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0ZNUEkyQ19FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KQEAgLTU3OTMsMTMgKzU4OTMsMjAgQEAKICAgICAgICAgaGZtcGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayhoZm1waTJjLT5oZG1hdHgpOwogICAgICAgfQogICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgRk1QSTJDX1RyZWF0RXJyb3JDYWxsYmFjayhoZm1waTJjKTsKKyAgICB9CiAgIH0KICAgLyogQWJvcnQgRE1BIFJYIHRyYW5zZmVyIGlmIGFueSAqLwotICBlbHNlIGlmICgoaGZtcGkyYy0+SW5zdGFuY2UtPkNSMSAmIEZNUEkyQ19DUjFfUlhETUFFTikgPT0gRk1QSTJDX0NSMV9SWERNQUVOKQorICBlbHNlIGlmICgoaGZtcGkyYy0+aGRtYXJ4ICE9IE5VTEwpICYmICgodG1wcHJldmlvdXNzdGF0ZSA9PSBGTVBJMkNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpIHx8ICh0bXBwcmV2aW91c3N0YXRlID09IEZNUEkyQ19TVEFURV9TTEFWRV9CVVNZX1JYKSkpCiAgIHsKLSAgICBoZm1waTJjLT5JbnN0YW5jZS0+Q1IxICY9IH5GTVBJMkNfQ1IxX1JYRE1BRU47CisgICAgaWYgKChoZm1waTJjLT5JbnN0YW5jZS0+Q1IxICYgRk1QSTJDX0NSMV9SWERNQUVOKSA9PSBGTVBJMkNfQ1IxX1JYRE1BRU4pCisgICAgeworICAgICAgaGZtcGkyYy0+SW5zdGFuY2UtPkNSMSAmPSB+Rk1QSTJDX0NSMV9SWERNQUVOOworICAgIH0KIAotICAgIGlmIChoZm1waTJjLT5oZG1hcnggIT0gTlVMTCkKKyAgICBpZiAoSEFMX0RNQV9HZXRTdGF0ZShoZm1waTJjLT5oZG1hcngpICE9IEhBTF9ETUFfU1RBVEVfUkVBRFkpCiAgICAgewogICAgICAgLyogU2V0IHRoZSBGTVBJMkMgRE1BIEFib3J0IGNhbGxiYWNrIDoKICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX0ZNUEkyQ19FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8KQEAgLTU4MTUsMTAgKzU5MjIsMjggQEAKICAgICAgICAgaGZtcGkyYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoZm1waTJjLT5oZG1hcngpOwogICAgICAgfQogICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgRk1QSTJDX1RyZWF0RXJyb3JDYWxsYmFjayhoZm1waTJjKTsKKyAgICB9CiAgIH0KLSAgZWxzZSBpZiAoaGZtcGkyYy0+U3RhdGUgPT0gSEFMX0ZNUEkyQ19TVEFURV9BQk9SVCkKKyAgZWxzZQorICB7CisgICAgRk1QSTJDX1RyZWF0RXJyb3JDYWxsYmFjayhoZm1waTJjKTsKKyAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgIEZNUEkyQyBFcnJvciBjYWxsYmFjayB0cmVhdG1lbnQuCisgICogQHBhcmFtICBoZm1waTJjIEZNUEkyQyBoYW5kbGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBGTVBJMkNfVHJlYXRFcnJvckNhbGxiYWNrKEZNUEkyQ19IYW5kbGVUeXBlRGVmICpoZm1waTJjKQoreworICBpZiAoaGZtcGkyYy0+U3RhdGUgPT0gSEFMX0ZNUEkyQ19TVEFURV9BQk9SVCkKICAgewogICAgIGhmbXBpMmMtPlN0YXRlID0gSEFMX0ZNUEkyQ19TVEFURV9SRUFEWTsKKyAgICBoZm1waTJjLT5QcmV2aW91c1N0YXRlID0gRk1QSTJDX1NUQVRFX05PTkU7CiAKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhmbXBpMmMpOwpAQCAtNTgzMiw2ICs1OTU3LDggQEAKICAgfQogICBlbHNlCiAgIHsKKyAgICBoZm1waTJjLT5QcmV2aW91c1N0YXRlID0gRk1QSTJDX1NUQVRFX05PTkU7CisKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhmbXBpMmMpOwogCkBAIC02MDY2LDI3ICs2MTkzLDcgQEAKICAgaGZtcGkyYy0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CiAgIGhmbXBpMmMtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOwogCi0gIC8qIENoZWNrIGlmIGNvbWUgZnJvbSBhYm9ydCBmcm9tIHVzZXIgKi8KLSAgaWYgKGhmbXBpMmMtPlN0YXRlID09IEhBTF9GTVBJMkNfU1RBVEVfQUJPUlQpCi0gIHsKLSAgICBoZm1waTJjLT5TdGF0ZSA9IEhBTF9GTVBJMkNfU1RBVEVfUkVBRFk7Ci0KLSAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KLSNpZiAoVVNFX0hBTF9GTVBJMkNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi0gICAgaGZtcGkyYy0+QWJvcnRDcGx0Q2FsbGJhY2soaGZtcGkyYyk7Ci0jZWxzZQotICAgIEhBTF9GTVBJMkNfQWJvcnRDcGx0Q2FsbGJhY2soaGZtcGkyYyk7Ci0jZW5kaWYgLyogVVNFX0hBTF9GTVBJMkNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCi0jaWYgKFVTRV9IQUxfRk1QSTJDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotICAgIGhmbXBpMmMtPkVycm9yQ2FsbGJhY2soaGZtcGkyYyk7Ci0jZWxzZQotICAgIEhBTF9GTVBJMkNfRXJyb3JDYWxsYmFjayhoZm1waTJjKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0ZNUEkyQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgfQorICBGTVBJMkNfVHJlYXRFcnJvckNhbGxiYWNrKGhmbXBpMmMpOwogfQogCiAvKioKQEAgLTYzNjMsMTkgKzY0NzAsMTkgQEAKICAgICAgIHRtcGlzciB8PSBGTVBJMkNfSVRfQUREUkkgfCBGTVBJMkNfSVRfU1RPUEkgfCBGTVBJMkNfSVRfTkFDS0kgfCBGTVBJMkNfSVRfRVJSSTsKICAgICB9CiAKLSAgICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBGTVBJMkNfWEZFUl9FUlJPUl9JVCkgPT0gRk1QSTJDX1hGRVJfRVJST1JfSVQpCisgICAgaWYgKEludGVycnVwdFJlcXVlc3QgPT0gRk1QSTJDX1hGRVJfRVJST1JfSVQpCiAgICAgewogICAgICAgLyogRW5hYmxlIEVSUiBhbmQgTkFDSyBpbnRlcnJ1cHRzICovCiAgICAgICB0bXBpc3IgfD0gRk1QSTJDX0lUX0VSUkkgfCBGTVBJMkNfSVRfTkFDS0k7CiAgICAgfQogCi0gICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgRk1QSTJDX1hGRVJfQ1BMVF9JVCkgPT0gRk1QSTJDX1hGRVJfQ1BMVF9JVCkKKyAgICBpZiAoSW50ZXJydXB0UmVxdWVzdCA9PSBGTVBJMkNfWEZFUl9DUExUX0lUKQogICAgIHsKICAgICAgIC8qIEVuYWJsZSBTVE9QIGludGVycnVwdHMgKi8KLSAgICAgIHRtcGlzciB8PSBGTVBJMkNfSVRfU1RPUEk7CisgICAgICB0bXBpc3IgfD0gKEZNUEkyQ19JVF9TVE9QSSB8IEZNUEkyQ19JVF9UQ0kpOwogICAgIH0KIAotICAgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEZNUEkyQ19YRkVSX1JFTE9BRF9JVCkgPT0gRk1QSTJDX1hGRVJfUkVMT0FEX0lUKQorICAgIGlmIChJbnRlcnJ1cHRSZXF1ZXN0ID09IEZNUEkyQ19YRkVSX1JFTE9BRF9JVCkKICAgICB7CiAgICAgICAvKiBFbmFibGUgVEMgaW50ZXJydXB0cyAqLwogICAgICAgdG1waXNyIHw9IEZNUEkyQ19JVF9UQ0k7CkBAIC02NDAxLDcgKzY1MDgsNyBAQAogICAgICAgdG1waXNyIHw9IEZNUEkyQ19JVF9FUlJJIHwgRk1QSTJDX0lUX1RDSSB8IEZNUEkyQ19JVF9TVE9QSSB8IEZNUEkyQ19JVF9OQUNLSSB8IEZNUEkyQ19JVF9SWEk7CiAgICAgfQogCi0gICAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgRk1QSTJDX1hGRVJfQ1BMVF9JVCkgPT0gRk1QSTJDX1hGRVJfQ1BMVF9JVCkKKyAgICBpZiAoSW50ZXJydXB0UmVxdWVzdCA9PSBGTVBJMkNfWEZFUl9DUExUX0lUKQogICAgIHsKICAgICAgIC8qIEVuYWJsZSBTVE9QIGludGVycnVwdHMgKi8KICAgICAgIHRtcGlzciB8PSBGTVBJMkNfSVRfU1RPUEk7CkBAIC02NDU1LDE5ICs2NTYyLDE5IEBACiAgICAgdG1waXNyIHw9IEZNUEkyQ19JVF9BRERSSSB8IEZNUEkyQ19JVF9TVE9QSSB8IEZNUEkyQ19JVF9OQUNLSSB8IEZNUEkyQ19JVF9FUlJJOwogICB9CiAKLSAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgRk1QSTJDX1hGRVJfRVJST1JfSVQpID09IEZNUEkyQ19YRkVSX0VSUk9SX0lUKQorICBpZiAoSW50ZXJydXB0UmVxdWVzdCA9PSBGTVBJMkNfWEZFUl9FUlJPUl9JVCkKICAgewogICAgIC8qIEVuYWJsZSBFUlIgYW5kIE5BQ0sgaW50ZXJydXB0cyAqLwogICAgIHRtcGlzciB8PSBGTVBJMkNfSVRfRVJSSSB8IEZNUEkyQ19JVF9OQUNLSTsKICAgfQogCi0gIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEZNUEkyQ19YRkVSX0NQTFRfSVQpID09IEZNUEkyQ19YRkVSX0NQTFRfSVQpCisgIGlmIChJbnRlcnJ1cHRSZXF1ZXN0ID09IEZNUEkyQ19YRkVSX0NQTFRfSVQpCiAgIHsKICAgICAvKiBFbmFibGUgU1RPUCBpbnRlcnJ1cHRzICovCiAgICAgdG1waXNyIHw9IEZNUEkyQ19JVF9TVE9QSTsKICAgfQogCi0gIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEZNUEkyQ19YRkVSX1JFTE9BRF9JVCkgPT0gRk1QSTJDX1hGRVJfUkVMT0FEX0lUKQorICBpZiAoSW50ZXJydXB0UmVxdWVzdCA9PSBGTVBJMkNfWEZFUl9SRUxPQURfSVQpCiAgIHsKICAgICAvKiBFbmFibGUgVEMgaW50ZXJydXB0cyAqLwogICAgIHRtcGlzciB8PSBGTVBJMkNfSVRfVENJOwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjR4eF9oYWxfZm1wc21idXMuYyBiL1NyYy9zdG0zMmY0eHhfaGFsX2ZtcHNtYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwY2QyMAotLS0gL2Rldi9udWxsCisrKyBiL1NyYy9zdG0zMmY0eHhfaGFsX2ZtcHNtYnVzLmMKQEAgLTAsMCArMSwyNjc1IEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmNHh4X2hhbF9mbXBzbWJ1cy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBGTVBTTUJVUyBIQUwgbW9kdWxlIGRyaXZlci4KKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCisgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBCdXMgKFNNQnVzKSBwZXJpcGhlcmFsLAorICAqICAgICAgICAgIGJhc2VkIG9uIEkyQyBwcmluY2lwbGVzIG9mIG9wZXJhdGlvbiA6CisgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgICoKKyAgQHZlcmJhdGltCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgVGhlIEZNUFNNQlVTIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworICAgICgjKSBEZWNsYXJlIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBoYW5kbGUgc3RydWN0dXJlLCBmb3IgZXhhbXBsZToKKyAgICAgICAgRk1QU01CVVNfSGFuZGxlVHlwZURlZiAgaGZtcHNtYnVzOworCisgICAgKCMpSW5pdGlhbGl6ZSB0aGUgRk1QU01CVVMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEByZWYgSEFMX0ZNUFNNQlVTX01zcEluaXQoKSBBUEk6CisgICAgICAgICgjIykgRW5hYmxlIHRoZSBGTVBTTUJVU3ggaW50ZXJmYWNlIGNsb2NrCisgICAgICAgICgjIykgRk1QU01CVVMgcGlucyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgRk1QU01CVVMgR1BJT3MKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBGTVBTTUJVUyBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBvcGVuLWRyYWluCisgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcworICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBGTVBTTUJVU3ggaW50ZXJydXB0IHByaW9yaXR5CisgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgRk1QU01CVVMgSVJRIENoYW5uZWwKKworICAgICgjKSBDb25maWd1cmUgdGhlIENvbW11bmljYXRpb24gQ2xvY2sgVGltaW5nLCBCdXMgVGltZW91dCwgT3duIEFkZHJlc3MxLCBNYXN0ZXIgQWRkcmVzc2luZyBtb2RlLAorICAgICAgICBEdWFsIEFkZHJlc3NpbmcgbW9kZSwgT3duIEFkZHJlc3MyLCBPd24gQWRkcmVzczIgTWFzaywgR2VuZXJhbCBjYWxsLCBOb3N0cmV0Y2ggbW9kZSwKKyAgICAgICAgUGVyaXBoZXJhbCBtb2RlIGFuZCBQYWNrZXQgRXJyb3IgQ2hlY2sgbW9kZSBpbiB0aGUgaGZtcHNtYnVzIEluaXQgc3RydWN0dXJlLgorCisgICAgKCMpIEluaXRpYWxpemUgdGhlIEZNUFNNQlVTIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBAcmVmIEhBTF9GTVBTTUJVU19Jbml0KCkgQVBJOgorICAgICAgICAoKyspIFRoZXNlIEFQSSdzIGNvbmZpZ3VyZXMgYWxzbyB0aGUgbG93IGxldmVsIEhhcmR3YXJlIEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMpCisgICAgICAgICAgICAgYnkgY2FsbGluZyB0aGUgY3VzdG9taXplZCBAcmVmIEhBTF9GTVBTTUJVU19Nc3BJbml0KCZoZm1wc21idXMpIEFQSS4KKworICAgICgjKSBUbyBjaGVjayBpZiB0YXJnZXQgZGV2aWNlIGlzIHJlYWR5IGZvciBjb21tdW5pY2F0aW9uLCB1c2UgdGhlIGZ1bmN0aW9uIEByZWYgSEFMX0ZNUFNNQlVTX0lzRGV2aWNlUmVhZHkoKQorCisgICAgKCMpIEZvciBGTVBTTUJVUyBJTyBvcGVyYXRpb25zLCBvbmx5IG9uZSBtb2RlIG9mIG9wZXJhdGlvbnMgaXMgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlcgorCisgICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICAgICgrKSBUcmFuc21pdCBpbiBtYXN0ZXIvaG9zdCBGTVBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0ZNUFNNQlVTX01hc3Rlcl9UcmFuc21pdF9JVCgpCisgICAgICAoKyspIEF0IHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfRk1QU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfRk1QU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlY2VpdmUgaW4gbWFzdGVyL2hvc3QgRk1QU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB1c2luZyBAcmVmIEhBTF9GTVBTTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAoKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfRk1QU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfRk1QU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIEFib3J0IGEgbWFzdGVyL2hvc3QgRk1QU01CVVMgcHJvY2VzcyBjb21tdW5pY2F0aW9uIHdpdGggSW50ZXJydXB0IHVzaW5nIEByZWYgSEFMX0ZNUFNNQlVTX01hc3Rlcl9BYm9ydF9JVCgpCisgICAgICAoKyspIFRoZSBhc3NvY2lhdGVkIHByZXZpb3VzIHRyYW5zZmVyIGNhbGxiYWNrIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGFib3J0IHByb2Nlc3MKKyAgICAgICgrKykgbWVhbiBAcmVmIEhBTF9GTVBTTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGluIGNhc2Ugb2YgcHJldmlvdXMgc3RhdGUgd2FzIG1hc3RlciB0cmFuc21pdAorICAgICAgKCsrKSBtZWFuIEByZWYgSEFMX0ZNUFNNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgaW4gY2FzZSBvZiBwcmV2aW91cyBzdGF0ZSB3YXMgbWFzdGVyIHJlY2VpdmUKKyAgICAgICgrKSBFbmFibGUvZGlzYWJsZSB0aGUgQWRkcmVzcyBsaXN0ZW4gbW9kZSBpbiBzbGF2ZS9kZXZpY2Ugb3IgaG9zdC9zbGF2ZSBGTVBTTUJVUyBtb2RlCisgICAgICAgICAgIHVzaW5nIEByZWYgSEFMX0ZNUFNNQlVTX0VuYWJsZUxpc3Rlbl9JVCgpIEByZWYgSEFMX0ZNUFNNQlVTX0Rpc2FibGVMaXN0ZW5fSVQoKQorICAgICAgKCsrKSBXaGVuIGFkZHJlc3Mgc2xhdmUvZGV2aWNlIEZNUFNNQlVTIG1hdGNoLCBAcmVmIEhBTF9GTVBTTUJVU19BZGRyQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSB0byBjaGVjayB0aGUgQWRkcmVzcyBNYXRjaCBDb2RlIGFuZCB0aGUgdHJhbnNtaXNzaW9uIGRpcmVjdGlvbiByZXF1ZXN0IGJ5IG1hc3Rlci9ob3N0IChXcml0ZS9SZWFkKS4KKyAgICAgICgrKykgQXQgTGlzdGVuIG1vZGUgZW5kIEByZWYgSEFMX0ZNUFNNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9GTVBTTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFRyYW5zbWl0IGluIHNsYXZlL2RldmljZSBGTVBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEByZWYgSEFMX0ZNUFNNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICgrKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBAcmVmIEhBTF9GTVBTTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCisgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEByZWYgSEFMX0ZNUFNNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soKQorICAgICAgKCspIFJlY2VpdmUgaW4gc2xhdmUvZGV2aWNlIEZNUFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgQHJlZiBIQUxfRk1QU01CVVNfU2xhdmVfUmVjZWl2ZV9JVCgpCisgICAgICAoKyspIEF0IHJlY2VwdGlvbiBlbmQgb2YgdHJhbnNmZXIgQHJlZiBIQUxfRk1QU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgorICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBAcmVmIEhBTF9GTVBTTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKCkKKyAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgRk1QU01CVVMgYWxlcnQgbW9kZSB1c2luZyBAcmVmIEhBTF9GTVBTTUJVU19FbmFibGVBbGVydF9JVCgpIEByZWYgSEFMX0ZNUFNNQlVTX0Rpc2FibGVBbGVydF9JVCgpCisgICAgICAoKyspIFdoZW4gRk1QU01CVVMgQWxlcnQgaXMgZ2VuZXJhdGVkIEByZWYgSEFMX0ZNUFNNQlVTX0Vycm9yQ2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfRk1QU01CVVNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgIHRvIGNoZWNrIHRoZSBBbGVydCBFcnJvciBDb2RlIHVzaW5nIGZ1bmN0aW9uIEByZWYgSEFMX0ZNUFNNQlVTX0dldEVycm9yKCkKKyAgICAgICgrKSBHZXQgSEFMIHN0YXRlIG1hY2hpbmUgb3IgZXJyb3IgdmFsdWVzIHVzaW5nIEByZWYgSEFMX0ZNUFNNQlVTX0dldFN0YXRlKCkgb3IgQHJlZiBIQUxfRk1QU01CVVNfR2V0RXJyb3IoKQorICAgICAgKCspIEluIGNhc2Ugb2YgdHJhbnNmZXIgRXJyb3IsIEByZWYgSEFMX0ZNUFNNQlVTX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KKyAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgQHJlZiBIQUxfRk1QU01CVVNfRXJyb3JDYWxsYmFjaygpCisgICAgICAgICAgIHRvIGNoZWNrIHRoZSBFcnJvciBDb2RlIHVzaW5nIGZ1bmN0aW9uIEByZWYgSEFMX0ZNUFNNQlVTX0dldEVycm9yKCkKKworICAgICAqKiogRk1QU01CVVMgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBGTVBTTUJVUyBIQUwgZHJpdmVyLgorCisgICAgICAoKykgQHJlZiBfX0hBTF9GTVBTTUJVU19FTkFCTEU6ICAgICAgRW5hYmxlIHRoZSBGTVBTTUJVUyBwZXJpcGhlcmFsCisgICAgICAoKykgQHJlZiBfX0hBTF9GTVBTTUJVU19ESVNBQkxFOiAgICAgRGlzYWJsZSB0aGUgRk1QU01CVVMgcGVyaXBoZXJhbAorICAgICAgKCspIEByZWYgX19IQUxfRk1QU01CVVNfR0VUX0ZMQUc6ICAgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGTVBTTUJVUyBmbGFnIGlzIHNldCBvciBub3QKKyAgICAgICgrKSBAcmVmIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUc6ICBDbGVhciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTIHBlbmRpbmcgZmxhZworICAgICAgKCspIEByZWYgX19IQUxfRk1QU01CVVNfRU5BQkxFX0lUOiAgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTIGludGVycnVwdAorICAgICAgKCspIEByZWYgX19IQUxfRk1QU01CVVNfRElTQUJMRV9JVDogIERpc2FibGUgdGhlIHNwZWNpZmllZCBGTVBTTUJVUyBpbnRlcnJ1cHQKKworICAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dCisgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKKyAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KKyAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9GTVBTTUJVU19SZWdpc3RlckNhbGxiYWNrKCkgb3IgQHJlZiBIQUxfRk1QU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKQorICAgICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCisgICAgWy4uXQorICAgICBGdW5jdGlvbiBAcmVmIEhBTF9GTVBTTUJVU19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CisgICAgICAgKCspIE1hc3RlclR4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBNYXN0ZXJSeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVUeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgU2xhdmVSeENwbHRDYWxsYmFjayAgOiBjYWxsYmFjayBmb3IgU2xhdmUgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KKyAgICAgICAoKykgTGlzdGVuQ3BsdENhbGxiYWNrICAgOiBjYWxsYmFjayBmb3IgZW5kIG9mIGxpc3RlbiBtb2RlLgorICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCisgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgorICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgorICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECisgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgWy4uXQorICAgICBGb3Igc3BlY2lmaWMgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfRk1QU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2suCisgICAgWy4uXQorICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfRk1QU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgd2VhayBmdW5jdGlvbi4KKyAgICAgQHJlZiBIQUxfRk1QU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICAgYW5kIHRoZSBDYWxsYmFjayBJRC4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCisgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVR4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBTbGF2ZVJ4Q3BsdENhbGxiYWNrICA6IGNhbGxiYWNrIGZvciBTbGF2ZSByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgorICAgICAgICgrKSBMaXN0ZW5DcGx0Q2FsbGJhY2sgICA6IGNhbGxiYWNrIGZvciBlbmQgb2YgbGlzdGVuIG1vZGUuCisgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgIDogY2FsbGJhY2sgZm9yIGVycm9yIGRldGVjdGlvbi4KKyAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgTXNwIEluaXQuCisgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCisgICAgWy4uXQorICAgICBGb3IgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfRk1QU01CVVNfVW5SZWdpc3RlckFkZHJDYWxsYmFjay4KKyAgICBbLi5dCisgICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9GTVBTTUJVU19Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEByZWYgSEFMX0ZNUEkyQ19TVEFURV9SRVNFVAorICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CisgICAgIGV4YW1wbGVzIEByZWYgSEFMX0ZNUFNNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCksIEByZWYgSEFMX0ZNUFNNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkuCisgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlCisgICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX0ZNUFNNQlVTX0luaXQoKS8gQHJlZiBIQUxfRk1QU01CVVNfRGVJbml0KCkgb25seSB3aGVuCisgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCisgICAgIElmIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0ZNUFNNQlVTX0luaXQoKS8gQHJlZiBIQUxfRk1QU01CVVNfRGVJbml0KCkKKyAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCisgICAgWy4uXQorICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEByZWYgSEFMX0ZNUEkyQ19TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgorICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKKyAgICAgaW4gQHJlZiBIQUxfRk1QSTJDX1NUQVRFX1JFQURZIG9yIEByZWYgSEFMX0ZNUEkyQ19TVEFURV9SRVNFVCBzdGF0ZSwKKyAgICAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KKyAgICAgVGhlbiwgdGhlIHVzZXIgZmlyc3QgcmVnaXN0ZXJzIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcworICAgICB1c2luZyBAcmVmIEhBTF9GTVBTTUJVU19SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfRk1QU01CVVNfRGVJbml0KCkKKyAgICAgb3IgQHJlZiBIQUxfRk1QU01CVVNfSW5pdCgpIGZ1bmN0aW9uLgorICAgIFsuLl0KKyAgICAgV2hlbiB0aGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgorICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKKyAgICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KKworICAgICBbLi5dCisgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIEZNUFNNQlVTIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCisgIEBlbmR2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiBAYXR0ZW50aW9uCisgICoKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICovCisKKy8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgorCisvKiogQGFkZHRvZ3JvdXAgU1RNMzJGNHh4X0hBTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTIEZNUFNNQlVTCisgICogQGJyaWVmIEZNUFNNQlVTIEhBTCBtb2R1bGUgZHJpdmVyCisgICogQHsKKyAgKi8KKworI2lmZGVmIEhBTF9GTVBTTUJVU19NT0RVTEVfRU5BQkxFRAorCisjaWYgZGVmaW5lZChGTVBJMkNfQ1IxX1BFKQorLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX1ByaXZhdGVfRGVmaW5lIEZNUFNNQlVTIFByaXZhdGUgQ29uc3RhbnRzCisgICogQHsKKyAgKi8KKyNkZWZpbmUgVElNSU5HX0NMRUFSX01BU0sgICAoMHhGMEZGRkZGRlVMKSAgICAgLyohPCBGTVBTTUJVUyBUSU1JTkcgY2xlYXIgcmVnaXN0ZXIgTWFzayAqLworI2RlZmluZSBIQUxfVElNRU9VVF9BRERSICAgICgxMDAwMFUpICAgICAgICAgICAvKiE8IDEwIHMgICovCisjZGVmaW5lIEhBTF9USU1FT1VUX0JVU1kgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfRElSICAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9SWE5FICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1NUT1BGICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgSEFMX1RJTUVPVVRfVEMgICAgICAoMjVVKSAgICAgICAgICAgICAgLyohPCAyNSBtcyAqLworI2RlZmluZSBIQUxfVElNRU9VVF9UQ1IgICAgICgyNVUpICAgICAgICAgICAgICAvKiE8IDI1IG1zICovCisjZGVmaW5lIEhBTF9USU1FT1VUX1RYSVMgICAgKDI1VSkgICAgICAgICAgICAgIC8qITwgMjUgbXMgKi8KKyNkZWZpbmUgTUFYX05CWVRFX1NJWkUgICAgICAyNTVVCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGFkZHRvZ3JvdXAgRk1QU01CVVNfUHJpdmF0ZV9GdW5jdGlvbnMgRk1QU01CVVMgUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZNUFNNQlVTX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoc3RydWN0IF9fRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGltZW91dCk7CisKK3N0YXRpYyB2b2lkIEZNUFNNQlVTX0VuYWJsZV9JUlEoc3RydWN0IF9fRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MzJfdCBJbnRlcnJ1cHRSZXF1ZXN0KTsKK3N0YXRpYyB2b2lkIEZNUFNNQlVTX0Rpc2FibGVfSVJRKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRk1QU01CVVNfTWFzdGVyX0lTUihzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQzMl90IFN0YXR1c0ZsYWdzKTsKK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTVBTTUJVU19TbGF2ZV9JU1Ioc3RydWN0IF9fRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50MzJfdCBTdGF0dXNGbGFncyk7CisKK3N0YXRpYyB2b2lkIEZNUFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7CisKK3N0YXRpYyB2b2lkIEZNUFNNQlVTX0lURXJyb3JIYW5kbGVyKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cyk7CisKK3N0YXRpYyB2b2lkIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgU2l6ZSwgdWludDMyX3QgTW9kZSwgdWludDMyX3QgUmVxdWVzdCk7CisvKioKKyAgKiBAfQorICAqLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9ucyBGTVBTTUJVUyBFeHBvcnRlZCBGdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGRlZmdyb3VwIEZNUFNNQlVTX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAqCitAdmVyYmF0aW0KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplIGFuZAorICAgICAgICAgIGRlaW5pdGlhbGl6ZSB0aGUgRk1QU01CVVN4IHBlcmlwaGVyYWw6CisKKyAgICAgICgrKSBVc2VyIG11c3QgSW1wbGVtZW50IEhBTF9GTVBTTUJVU19Nc3BJbml0KCkgZnVuY3Rpb24gaW4gd2hpY2ggaGUgY29uZmlndXJlcworICAgICAgICAgIGFsbCByZWxhdGVkIHBlcmlwaGVyYWxzIHJlc291cmNlcyAoQ0xPQ0ssIEdQSU8sIElUIGFuZCBOVklDICkuCisKKyAgICAgICgrKSBDYWxsIHRoZSBmdW5jdGlvbiBIQUxfRk1QU01CVVNfSW5pdCgpIHRvIGNvbmZpZ3VyZSB0aGUgc2VsZWN0ZWQgZGV2aWNlIHdpdGgKKyAgICAgICAgICB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbjoKKyAgICAgICAgKCsrKSBDbG9jayBUaW1pbmcKKyAgICAgICAgKCsrKSBCdXMgVGltZW91dAorICAgICAgICAoKyspIEFuYWxvZyBGaWxlciBtb2RlCisgICAgICAgICgrKykgT3duIEFkZHJlc3MgMQorICAgICAgICAoKyspIEFkZHJlc3NpbmcgbW9kZSAoTWFzdGVyLCBTbGF2ZSkKKyAgICAgICAgKCsrKSBEdWFsIEFkZHJlc3NpbmcgbW9kZQorICAgICAgICAoKyspIE93biBBZGRyZXNzIDIKKyAgICAgICAgKCsrKSBPd24gQWRkcmVzcyAyIE1hc2sKKyAgICAgICAgKCsrKSBHZW5lcmFsIGNhbGwgbW9kZQorICAgICAgICAoKyspIE5vc3RyZXRjaCBtb2RlCisgICAgICAgICgrKykgUGFja2V0IEVycm9yIENoZWNrIG1vZGUKKyAgICAgICAgKCsrKSBQZXJpcGhlcmFsIG1vZGUKKworCisgICAgICAoKykgQ2FsbCB0aGUgZnVuY3Rpb24gSEFMX0ZNUFNNQlVTX0RlSW5pdCgpIHRvIHJlc3RvcmUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgICAgIG9mIHRoZSBzZWxlY3RlZCBGTVBTTUJVU3ggcGVyaXBoZXJhbC4KKworICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIEFuYWxvZy9EaWdpdGFsIGZpbHRlcnMgd2l0aCBIQUxfRk1QU01CVVNfQ29uZmlnQW5hbG9nRmlsdGVyKCkgYW5kCisgICAgICAgICAgSEFMX0ZNUFNNQlVTX0NvbmZpZ0RpZ2l0YWxGaWx0ZXIoKS4KKworQGVuZHZlcmJhdGltCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBGTVBTTUJVUyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICogICAgICAgICBpbiB0aGUgRk1QU01CVVNfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfSW5pdChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpCit7CisgIC8qIENoZWNrIHRoZSBGTVBTTUJVUyBoYW5kbGUgYWxsb2NhdGlvbiAqLworICBpZiAoaGZtcHNtYnVzID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX0FMTF9JTlNUQU5DRShoZm1wc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19BTkFMT0dfRklMVEVSKGhmbXBzbWJ1cy0+SW5pdC5BbmFsb2dGaWx0ZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX09XTl9BRERSRVNTMShoZm1wc21idXMtPkluaXQuT3duQWRkcmVzczEpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX0FERFJFU1NJTkdfTU9ERShoZm1wc21idXMtPkluaXQuQWRkcmVzc2luZ01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX0RVQUxfQUREUkVTUyhoZm1wc21idXMtPkluaXQuRHVhbEFkZHJlc3NNb2RlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19PV05fQUREUkVTUzIoaGZtcHNtYnVzLT5Jbml0Lk93bkFkZHJlc3MyKSk7CisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19PV05fQUREUkVTUzJfTUFTSyhoZm1wc21idXMtPkluaXQuT3duQWRkcmVzczJNYXNrcykpOworICBhc3NlcnRfcGFyYW0oSVNfRk1QU01CVVNfR0VORVJBTF9DQUxMKGhmbXBzbWJ1cy0+SW5pdC5HZW5lcmFsQ2FsbE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX05PX1NUUkVUQ0goaGZtcHNtYnVzLT5Jbml0Lk5vU3RyZXRjaE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX1BFQyhoZm1wc21idXMtPkluaXQuUGFja2V0RXJyb3JDaGVja01vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX1BFUklQSEVSQUxfTU9ERShoZm1wc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUpKTsKKworICBpZiAoaGZtcHNtYnVzLT5TdGF0ZSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfUkVTRVQpCisgIHsKKyAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCisgICAgaGZtcHNtYnVzLT5Mb2NrID0gSEFMX1VOTE9DS0VEOworCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGZtcHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayA9IEhBTF9GTVBTTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgKi8KKyAgICBoZm1wc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrID0gSEFMX0ZNUFNNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJSeENwbHRDYWxsYmFjayAqLworICAgIGhmbXBzbWJ1cy0+U2xhdmVUeENwbHRDYWxsYmFjayAgPSBIQUxfRk1QU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIFNsYXZlVHhDcGx0Q2FsbGJhY2sgICovCisgICAgaGZtcHNtYnVzLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrICA9IEhBTF9GTVBTTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgU2xhdmVSeENwbHRDYWxsYmFjayAgKi8KKyAgICBoZm1wc21idXMtPkxpc3RlbkNwbHRDYWxsYmFjayAgID0gSEFMX0ZNUFNNQlVTX0xpc3RlbkNwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBMaXN0ZW5DcGx0Q2FsbGJhY2sgICAqLworICAgIGhmbXBzbWJ1cy0+RXJyb3JDYWxsYmFjayAgICAgICAgPSBIQUxfRk1QU01CVVNfRXJyb3JDYWxsYmFjazsgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgaGZtcHNtYnVzLT5BZGRyQ2FsbGJhY2sgICAgICAgICA9IEhBTF9GTVBTTUJVU19BZGRyQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQWRkckNhbGxiYWNrICAgICAgICAgKi8KKworICAgIGlmIChoZm1wc21idXMtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhmbXBzbWJ1cy0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0ZNUFNNQlVTX01zcEluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgICovCisgICAgfQorCisgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWC4uLmV0YyAqLworICAgIGhmbXBzbWJ1cy0+TXNwSW5pdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZWxzZQorICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDICovCisgICAgSEFMX0ZNUFNNQlVTX01zcEluaXQoaGZtcHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICB9CisKKyAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEZNUFNNQlVTIHBlcmlwaGVyYWwgKi8KKyAgX19IQUxfRk1QU01CVVNfRElTQUJMRShoZm1wc21idXMpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGTVBTTUJVU3ggVElNSU5HUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBGTVBTTUJVU3g6IEZyZXF1ZW5jeSByYW5nZSAqLworICBoZm1wc21idXMtPkluc3RhbmNlLT5USU1JTkdSID0gaGZtcHNtYnVzLT5Jbml0LlRpbWluZyAmIFRJTUlOR19DTEVBUl9NQVNLOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGTVBTTUJVU3ggVElNRU9VVFIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBDb25maWd1cmUgRk1QU01CVVN4OiBCdXMgVGltZW91dCAgKi8KKyAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+VElNRU9VVFIgJj0gfkZNUEkyQ19USU1FT1VUUl9USU1PVVRFTjsKKyAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+VElNRU9VVFIgJj0gfkZNUEkyQ19USU1FT1VUUl9URVhURU47CisgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPlRJTUVPVVRSID0gaGZtcHNtYnVzLT5Jbml0LlNNQnVzVGltZW91dDsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRk1QU01CVVN4IE9BUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBGTVBTTUJVU3g6IE93biBBZGRyZXNzMSBhbmQgYWNrIG93biBhZGRyZXNzMSBtb2RlICovCisgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPk9BUjEgJj0gfkZNUEkyQ19PQVIxX09BMUVOOworCisgIGlmIChoZm1wc21idXMtPkluaXQuT3duQWRkcmVzczEgIT0gMFVMKQorICB7CisgICAgaWYgKGhmbXBzbWJ1cy0+SW5pdC5BZGRyZXNzaW5nTW9kZSA9PSBGTVBTTUJVU19BRERSRVNTSU5HTU9ERV83QklUKQorICAgIHsKKyAgICAgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPk9BUjEgPSAoRk1QSTJDX09BUjFfT0ExRU4gfCBoZm1wc21idXMtPkluaXQuT3duQWRkcmVzczEpOworICAgIH0KKyAgICBlbHNlIC8qIEZNUFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUICovCisgICAgeworICAgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+T0FSMSA9IChGTVBJMkNfT0FSMV9PQTFFTiB8IEZNUEkyQ19PQVIxX09BMU1PREUgfCBoZm1wc21idXMtPkluaXQuT3duQWRkcmVzczEpOworICAgIH0KKyAgfQorCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGTVBTTUJVU3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIEZNUFNNQlVTeDogQWRkcmVzc2luZyBNYXN0ZXIgbW9kZSAqLworICBpZiAoaGZtcHNtYnVzLT5Jbml0LkFkZHJlc3NpbmdNb2RlID09IEZNUFNNQlVTX0FERFJFU1NJTkdNT0RFXzEwQklUKQorICB7CisgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+Q1IyID0gKEZNUEkyQ19DUjJfQUREMTApOworICB9CisgIC8qIEVuYWJsZSB0aGUgQVVUT0VORCBieSBkZWZhdWx0LCBhbmQgZW5hYmxlIE5BQ0sgKHNob3VsZCBiZSBkaXNhYmxlIG9ubHkgZHVyaW5nIFNsYXZlIHByb2Nlc3MpICovCisgIC8qIEFVVE9FTkQgYW5kIE5BQ0sgYml0IHdpbGwgYmUgbWFuYWdlIGR1cmluZyBUcmFuc2ZlciBwcm9jZXNzICovCisgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSAoRk1QSTJDX0NSMl9BVVRPRU5EIHwgRk1QSTJDX0NSMl9OQUNLKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRk1QU01CVVN4IE9BUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIC8qIENvbmZpZ3VyZSBGTVBTTUJVU3g6IER1YWwgbW9kZSBhbmQgT3duIEFkZHJlc3MyICovCisgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPk9BUjIgPSAoaGZtcHNtYnVzLT5Jbml0LkR1YWxBZGRyZXNzTW9kZSB8IGhmbXBzbWJ1cy0+SW5pdC5Pd25BZGRyZXNzMiB8IChoZm1wc21idXMtPkluaXQuT3duQWRkcmVzczJNYXNrcyA8PCA4VSkpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGTVBTTUJVU3ggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogQ29uZmlndXJlIEZNUFNNQlVTeDogR2VuZXJhbGNhbGwgYW5kIE5vU3RyZXRjaCBtb2RlICovCisgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPkNSMSA9IChoZm1wc21idXMtPkluaXQuR2VuZXJhbENhbGxNb2RlIHwgaGZtcHNtYnVzLT5Jbml0Lk5vU3RyZXRjaE1vZGUgfCBoZm1wc21idXMtPkluaXQuUGFja2V0RXJyb3JDaGVja01vZGUgfCBoZm1wc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUgfCBoZm1wc21idXMtPkluaXQuQW5hbG9nRmlsdGVyKTsKKworICAvKiBFbmFibGUgU2xhdmUgQnl0ZSBDb250cm9sIG9ubHkgaW4gY2FzZSBvZiBQYWNrZXQgRXJyb3IgQ2hlY2sgaXMgZW5hYmxlZCBhbmQgRk1QU01CVVMgUGVyaXBoZXJhbCBpcyBzZXQgaW4gU2xhdmUgbW9kZSAqLworICBpZiAoKGhmbXBzbWJ1cy0+SW5pdC5QYWNrZXRFcnJvckNoZWNrTW9kZSA9PSBGTVBTTUJVU19QRUNfRU5BQkxFKQorICAgICAgJiYgKChoZm1wc21idXMtPkluaXQuUGVyaXBoZXJhbE1vZGUgPT0gRk1QU01CVVNfUEVSSVBIRVJBTF9NT0RFX0ZNUFNNQlVTX1NMQVZFKSB8fCAoaGZtcHNtYnVzLT5Jbml0LlBlcmlwaGVyYWxNb2RlID09IEZNUFNNQlVTX1BFUklQSEVSQUxfTU9ERV9GTVBTTUJVU19TTEFWRV9BUlApKSkKKyAgeworICAgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPkNSMSB8PSBGTVBJMkNfQ1IxX1NCQzsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgRk1QU01CVVMgcGVyaXBoZXJhbCAqLworICBfX0hBTF9GTVBTTUJVU19FTkFCTEUoaGZtcHNtYnVzKTsKKworICBoZm1wc21idXMtPkVycm9yQ29kZSA9IEhBTF9GTVBTTUJVU19FUlJPUl9OT05FOworICBoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBEZUluaXRpYWxpemUgdGhlIEZNUFNNQlVTIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19EZUluaXQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICAvKiBDaGVjayB0aGUgRk1QU01CVVMgaGFuZGxlIGFsbG9jYXRpb24gKi8KKyAgaWYgKGhmbXBzbWJ1cyA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoaGZtcHNtYnVzLT5JbnN0YW5jZSkpOworCisgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfQlVTWTsKKworICAvKiBEaXNhYmxlIHRoZSBGTVBTTUJVUyBQZXJpcGhlcmFsIENsb2NrICovCisgIF9fSEFMX0ZNUFNNQlVTX0RJU0FCTEUoaGZtcHNtYnVzKTsKKworI2lmIChVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGZtcHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQorICB7CisgICAgaGZtcHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9GTVBTTUJVU19Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KKyAgfQorCisgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBHUElPLCBDTE9DSywgTlZJQyAqLworICBoZm1wc21idXMtPk1zcERlSW5pdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZWxzZQorICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KKyAgSEFMX0ZNUFNNQlVTX01zcERlSW5pdChoZm1wc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKKyAgaGZtcHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfRk1QU01CVVNfRVJST1JfTk9ORTsKKyAgaGZtcHNtYnVzLT5QcmV2aW91c1N0YXRlID0gIEhBTF9GTVBTTUJVU19TVEFURV9SRVNFVDsKKyAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9SRVNFVDsKKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIEZNUFNNQlVTIE1TUC4KKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0ZNUFNNQlVTX01zcEluaXQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZm1wc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRk1QU01CVVNfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBGTVBTTUJVUyBNU1AuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9GTVBTTUJVU19Nc3BEZUluaXQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZm1wc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRk1QU01CVVNfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIEFuYWxvZyBub2lzZSBmaWx0ZXIuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcGFyYW0gIEFuYWxvZ0ZpbHRlciBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0FOQUxPR0ZJTFRFUl9FTkFCTEUKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBGTVBTTUJVU19BTkFMT0dGSUxURVJfRElTQUJMRQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX0NvbmZpZ0FuYWxvZ0ZpbHRlcihGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQzMl90IEFuYWxvZ0ZpbHRlcikKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX0FMTF9JTlNUQU5DRShoZm1wc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19BTkFMT0dfRklMVEVSKEFuYWxvZ0ZpbHRlcikpOworCisgIGlmIChoZm1wc21idXMtPlN0YXRlID09IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRk1QU01CVVMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0RJU0FCTEUoaGZtcHNtYnVzKTsKKworICAgIC8qIFJlc2V0IEFOT0ZGIGJpdCAqLworICAgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPkNSMSAmPSB+KEZNUEkyQ19DUjFfQU5GT0ZGKTsKKworICAgIC8qIFNldCBhbmFsb2cgZmlsdGVyIGJpdCovCisgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEFuYWxvZ0ZpbHRlcjsKKworICAgIF9fSEFMX0ZNUFNNQlVTX0VOQUJMRShoZm1wc21idXMpOworCisgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGZtcHNtYnVzKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29uZmlndXJlIERpZ2l0YWwgbm9pc2UgZmlsdGVyLgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHBhcmFtICBEaWdpdGFsRmlsdGVyIENvZWZmaWNpZW50IG9mIGRpZ2l0YWwgbm9pc2UgZmlsdGVyIGJldHdlZW4gTWluX0RhdGE9MHgwMCBhbmQgTWF4X0RhdGE9MHgwRi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19Db25maWdEaWdpdGFsRmlsdGVyKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDMyX3QgRGlnaXRhbEZpbHRlcikKK3sKKyAgdWludDMyX3QgdG1wcmVnOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19BTExfSU5TVEFOQ0UoaGZtcHNtYnVzLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRk1QU01CVVNfRElHSVRBTF9GSUxURVIoRGlnaXRhbEZpbHRlcikpOworCisgIGlmIChoZm1wc21idXMtPlN0YXRlID09IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9CVVNZOworCisgICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRk1QU01CVVMgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0RJU0FCTEUoaGZtcHNtYnVzKTsKKworICAgIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovCisgICAgdG1wcmVnID0gaGZtcHNtYnVzLT5JbnN0YW5jZS0+Q1IxOworCisgICAgLyogUmVzZXQgRk1QSTJDIERORiBiaXRzIFsxMTo4XSAqLworICAgIHRtcHJlZyAmPSB+KEZNUEkyQ19DUjFfRE5GKTsKKworICAgIC8qIFNldCBGTVBJMkN4IERORiBjb2VmZmljaWVudCAqLworICAgIHRtcHJlZyB8PSBEaWdpdGFsRmlsdGVyIDw8IEZNUEkyQ19DUjFfRE5GX1BvczsKKworICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8KKyAgICBoZm1wc21idXMtPkluc3RhbmNlLT5DUjEgPSB0bXByZWc7CisKKyAgICBfX0hBTF9GTVBTTUJVU19FTkFCTEUoaGZtcHNtYnVzKTsKKworICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICByZXR1cm4gSEFMX09LOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiBIQUxfQlVTWTsKKyAgfQorfQorCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisvKioKKyAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBGTVBTTUJVUyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZNUFNNQlVTX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTVBTTUJVU19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRk1QU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTVBTTUJVU19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZNUFNNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZNUFNNQlVTX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTVBTTUJVU19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZNUFNNQlVTX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCBIQUxfRk1QU01CVVNfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcEZNUFNNQlVTX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhmbXBzbWJ1cyk7CisKKyAgaWYgKEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWSA9PSBoZm1wc21idXMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0ZNUFNNQlVTX01BU1RFUl9UWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhmbXBzbWJ1cy0+TWFzdGVyVHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19NQVNURVJfUlhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoZm1wc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRk1QU01CVVNfU0xBVkVfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoZm1wc21idXMtPlNsYXZlVHhDcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19TTEFWRV9SWF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhmbXBzbWJ1cy0+U2xhdmVSeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZNUFNNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhmbXBzbWJ1cy0+TGlzdGVuQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRk1QU01CVVNfRVJST1JfQ0JfSUQgOgorICAgICAgICBoZm1wc21idXMtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGZtcHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoZm1wc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIGlmIChIQUxfRk1QU01CVVNfU1RBVEVfUkVTRVQgPT0gaGZtcHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGZtcHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoZm1wc21idXMtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYW4gRk1QU01CVVMgQ2FsbGJhY2sKKyAgKiAgICAgICAgIEZNUFNNQlVTIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjaworICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRk1QU01CVVNfTUFTVEVSX1RYX0NPTVBMRVRFX0NCX0lEIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZNUFNNQlVTX01BU1RFUl9SWF9DT01QTEVURV9DQl9JRCBNYXN0ZXIgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9GTVBTTUJVU19TTEFWRV9UWF9DT01QTEVURV9DQl9JRCBTbGF2ZSBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZNUFNNQlVTX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIFNsYXZlIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRk1QU01CVVNfTElTVEVOX0NPTVBMRVRFX0NCX0lEIExpc3RlbiBDb21wbGV0ZSBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRk1QU01CVVNfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0ZNUFNNQlVTX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfRk1QU01CVVNfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX1VuUmVnaXN0ZXJDYWxsYmFjayhGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIEhBTF9GTVBTTUJVU19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgIGlmIChIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFkgPT0gaGZtcHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKKyAgICB7CisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19NQVNURVJfVFhfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoZm1wc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrID0gSEFMX0ZNUFNNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBNYXN0ZXJUeENwbHRDYWxsYmFjayAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRk1QU01CVVNfTUFTVEVSX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGZtcHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayA9IEhBTF9GTVBTTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgTWFzdGVyUnhDcGx0Q2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZNUFNNQlVTX1NMQVZFX1RYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGZtcHNtYnVzLT5TbGF2ZVR4Q3BsdENhbGxiYWNrID0gSEFMX0ZNUFNNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgU2xhdmVUeENwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZNUFNNQlVTX1NMQVZFX1JYX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGZtcHNtYnVzLT5TbGF2ZVJ4Q3BsdENhbGxiYWNrID0gSEFMX0ZNUFNNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgU2xhdmVSeENwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZNUFNNQlVTX0xJU1RFTl9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhmbXBzbWJ1cy0+TGlzdGVuQ3BsdENhbGxiYWNrID0gSEFMX0ZNUFNNQlVTX0xpc3RlbkNwbHRDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIExpc3RlbkNwbHRDYWxsYmFjayAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19FUlJPUl9DQl9JRCA6CisgICAgICAgIGhmbXBzbWJ1cy0+RXJyb3JDYWxsYmFjayA9IEhBTF9GTVBTTUJVU19FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9GTVBTTUJVU19NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGZtcHNtYnVzLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRk1QU01CVVNfTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0ZNUFNNQlVTX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhmbXBzbWJ1cy0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfRk1QU01CVVNfTXNwRGVJbml0OyAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBTTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKEhBTF9GTVBTTUJVU19TVEFURV9SRVNFVCA9PSBoZm1wc21idXMtPlN0YXRlKQorICB7CisgICAgc3dpdGNoIChDYWxsYmFja0lEKQorICAgIHsKKyAgICAgIGNhc2UgSEFMX0ZNUFNNQlVTX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoZm1wc21idXMtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9GTVBTTUJVU19Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0ICAgICAgICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRk1QU01CVVNfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGZtcHNtYnVzLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9GTVBTTUJVU19Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0ICAgICAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX0ZNUFNNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX0ZNUFNNQlVTX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisKKyAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIFJlbGVhc2UgTG9jayAqLworICBfX0hBTF9VTkxPQ0soaGZtcHNtYnVzKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBSZWdpc3RlciB0aGUgU2xhdmUgQWRkcmVzcyBNYXRjaCBGTVBTTUJVUyBDYWxsYmFjaworICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIEhBTF9GTVBTTUJVU19BZGRyQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBBZGRyZXNzIE1hdGNoIENhbGxiYWNrIGZ1bmN0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCBwRk1QU01CVVNfQWRkckNhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgIGlmIChIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFkgPT0gaGZtcHNtYnVzLT5TdGF0ZSkKKyAgeworICAgIGhmbXBzbWJ1cy0+QWRkckNhbGxiYWNrID0gcENhbGxiYWNrOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBTTUJVU19FUlJPUl9JTlZBTElEX0NBTExCQUNLOworCisgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgIH0KKworICAvKiBSZWxlYXNlIExvY2sgKi8KKyAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICAqIEBicmllZiAgVW5SZWdpc3RlciB0aGUgU2xhdmUgQWRkcmVzcyBNYXRjaCBGTVBTTUJVUyBDYWxsYmFjaworICAqICAgICAgICAgSW5mbyBSZWFkeSBGTVBTTUJVUyBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIEhBTF9GTVBTTUJVU19BZGRyQ2FsbGJhY2soKSBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19VblJlZ2lzdGVyQWRkckNhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cykKK3sKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworCisgIC8qIFByb2Nlc3MgbG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGZtcHNtYnVzKTsKKworICBpZiAoSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZID09IGhmbXBzbWJ1cy0+U3RhdGUpCisgIHsKKyAgICBoZm1wc21idXMtPkFkZHJDYWxsYmFjayA9IEhBTF9GTVBTTUJVU19BZGRyQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEFkZHJDYWxsYmFjayAgKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKworICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICB9CisKKyAgLyogUmVsZWFzZSBMb2NrICovCisgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworICByZXR1cm4gc3RhdHVzOworfQorCisjZW5kaWYgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqIEBkZWZncm91cCBGTVBTTUJVU19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFsuLl0KKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgRk1QU01CVVMgZGF0YQorICAgIHRyYW5zZmVycy4KKworICAgICgjKSBCbG9ja2luZyBtb2RlIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGRldmljZSBpcyByZWFkeSBmb3IgdXNhZ2UgaXMgOgorICAgICAgICAoKyspIEhBTF9GTVBTTUJVU19Jc0RldmljZVJlYWR5KCkKKworICAgICgjKSBUaGVyZSBpcyBvbmx5IG9uZSBtb2RlIG9mIHRyYW5zZmVyOgorICAgICAgICgrKykgTm9uLUJsb2NraW5nIG1vZGUgOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cy4KKyAgICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIgc3RhcnR1cC4KKyAgICAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgZGVkaWNhdGVkIEZNUFNNQlVTIElSUSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlLgorCisgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIGZ1bmN0aW9ucyB3aXRoIEludGVycnVwdCBhcmUgOgorICAgICAgICAoKyspIEhBTF9GTVBTTUJVU19NYXN0ZXJfVHJhbnNtaXRfSVQoKQorICAgICAgICAoKyspIEhBTF9GTVBTTUJVU19NYXN0ZXJfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0ZNUFNNQlVTX1NsYXZlX1RyYW5zbWl0X0lUKCkKKyAgICAgICAgKCsrKSBIQUxfRk1QU01CVVNfU2xhdmVfUmVjZWl2ZV9JVCgpCisgICAgICAgICgrKykgSEFMX0ZNUFNNQlVTX0VuYWJsZUxpc3Rlbl9JVCgpIG9yIGFsaWFzIEhBTF9GTVBTTUJVU19FbmFibGVMaXN0ZW5fSVQoKQorICAgICAgICAoKyspIEhBTF9GTVBTTUJVU19EaXNhYmxlTGlzdGVuX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfRk1QU01CVVNfRW5hYmxlQWxlcnRfSVQoKQorICAgICAgICAoKyspIEhBTF9GTVBTTUJVU19EaXNhYmxlQWxlcnRfSVQoKQorCisgICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gbm9uLUJsb2NraW5nIG1vZGU6CisgICAgICAgICgrKykgSEFMX0ZNUFNNQlVTX01hc3RlclR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfRk1QU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9GTVBTTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfRk1QU01CVVNfU2xhdmVSeENwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0ZNUFNNQlVTX0FkZHJDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0ZNUFNNQlVTX0xpc3RlbkNwbHRDYWxsYmFjaygpCisgICAgICAgICgrKykgSEFMX0ZNUFNNQlVTX0Vycm9yQ2FsbGJhY2soKQorCitAZW5kdmVyYmF0aW0KKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIFRyYW5zbWl0IGluIG1hc3Rlci9ob3N0IEZNUFNNQlVTIG1vZGUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAorICAqIEBwYXJhbSAgWGZlck9wdGlvbnMgT3B0aW9ucyBvZiBUcmFuc2ZlciwgdmFsdWUgb2YgQHJlZiBGTVBTTUJVU19YZmVyT3B0aW9uc19kZWZpbml0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfTWFzdGVyX1RyYW5zbWl0X0lUKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoZm1wc21idXMtPlN0YXRlID09IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWDsKKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSA9IEhBTF9GTVBTTUJVU19FUlJPUl9OT05FOworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhmbXBzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoZm1wc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogSW4gY2FzZSBvZiBRdWljayBjb21tYW5kLCByZW1vdmUgYXV0b2VuZCBtb2RlICovCisgICAgLyogTWFuYWdlIHRoZSBzdG9wIGdlbmVyYXRpb24gYnkgc29mdHdhcmUgKi8KKyAgICBpZiAoaGZtcHNtYnVzLT5wQnVmZlB0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgJj0gfkZNUFNNQlVTX0FVVE9FTkRfTU9ERTsKKyAgICB9CisKKyAgICBpZiAoU2l6ZSA+IE1BWF9OQllURV9TSVpFKQorICAgIHsKKyAgICAgIGhmbXBzbWJ1cy0+WGZlclNpemUgPSBNQVhfTkJZVEVfU0laRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGhmbXBzbWJ1cy0+WGZlclNpemUgPSBTaXplOworICAgIH0KKworICAgIC8qIFNlbmQgU2xhdmUgQWRkcmVzcyAqLworICAgIC8qIFNldCBOQllURVMgdG8gd3JpdGUgYW5kIHJlbG9hZCBpZiBzaXplID4gTUFYX05CWVRFX1NJWkUgYW5kIGdlbmVyYXRlIFJFU1RBUlQgKi8KKyAgICBpZiAoKGhmbXBzbWJ1cy0+WGZlclNpemUgPCBoZm1wc21idXMtPlhmZXJDb3VudCkgJiYgKGhmbXBzbWJ1cy0+WGZlclNpemUgPT0gTUFYX05CWVRFX1NJWkUpKQorICAgIHsKKyAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGZtcHNtYnVzLT5YZmVyU2l6ZSwgRk1QU01CVVNfUkVMT0FEX01PREUgfCAoaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyAmIEZNUFNNQlVTX1NFTkRQRUNfTU9ERSksIEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRyYW5zZmVyIGRpcmVjdGlvbiBub3QgY2hhbmdlLCBkbyBub3QgZ2VuZXJhdGUgUmVzdGFydCBDb25kaXRpb24gKi8KKyAgICAgIC8qIE1lYW4gUHJldmlvdXMgc3RhdGUgaXMgc2FtZSBhcyBjdXJyZW50IHN0YXRlICovCisKKyAgICAgIC8qIFN0b3JlIGN1cnJlbnQgdm9sYXRpbGUgWGZlck9wdGlvbnMsIG1pc3JhIHJ1bGUgKi8KKyAgICAgIHRtcCA9IGhmbXBzbWJ1cy0+WGZlck9wdGlvbnM7CisKKyAgICAgIGlmICgoaGZtcHNtYnVzLT5QcmV2aW91c1N0YXRlID09IEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkgJiYgKElTX0ZNUFNNQlVTX1RSQU5TRkVSX09USEVSX09QVElPTlNfUkVRVUVTVCh0bXApID09IDApKQorICAgICAgeworICAgICAgICBGTVBTTUJVU19UcmFuc2ZlckNvbmZpZyhoZm1wc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhmbXBzbWJ1cy0+WGZlclNpemUsIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMsIEZNUFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICB9CisgICAgICAvKiBFbHNlIHRyYW5zZmVyIGRpcmVjdGlvbiBjaGFuZ2UsIHNvIGdlbmVyYXRlIFJlc3RhcnQgd2l0aCBuZXcgdHJhbnNmZXIgZGlyZWN0aW9uICovCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIENvbnZlcnQgT1RIRVJfeHh4IFhmZXJPcHRpb25zIGlmIGFueSAqLworICAgICAgICBGTVBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoZm1wc21idXMpOworCisgICAgICAgIC8qIEhhbmRsZSBUcmFuc2ZlciAqLworICAgICAgICBGTVBTTUJVU19UcmFuc2ZlckNvbmZpZyhoZm1wc21idXMsIERldkFkZHJlc3MsICh1aW50OF90KWhmbXBzbWJ1cy0+WGZlclNpemUsIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMsIEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUX1dSSVRFKTsKKyAgICAgIH0KKworICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IG1hbmFnZSBieSBTVyBwYXJ0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgLyogUEVDIGJ5dGUgaXMgYXV0b21hdGljYWxseSBzZW50IGJ5IEhXIGJsb2NrLCBubyBuZWVkIHRvIG1hbmFnZSBpdCBpbiBUcmFuc21pdCBwcm9jZXNzICovCisgICAgICBpZiAoRk1QU01CVVNfR0VUX1BFQ19NT0RFKGhmbXBzbWJ1cykgIT0gMFVMKQorICAgICAgeworICAgICAgICBoZm1wc21idXMtPlhmZXJTaXplLS07CisgICAgICAgIGhmbXBzbWJ1cy0+WGZlckNvdW50LS07CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBGTVBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEZNUFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgRk1QU01CVVNfRW5hYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX1RYKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgUmVjZWl2ZSBpbiBtYXN0ZXIvaG9zdCBGTVBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgRk1QU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX01hc3Rlcl9SZWNlaXZlX0lUKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFhmZXJPcHRpb25zKQoreworICB1aW50MzJfdCB0bXA7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmIChoZm1wc21idXMtPlN0YXRlID09IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWDsKKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSA9IEhBTF9GTVBTTUJVU19FUlJPUl9OT05FOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGZtcHNtYnVzLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhmbXBzbWJ1cy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoZm1wc21idXMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisKKyAgICAvKiBJbiBjYXNlIG9mIFF1aWNrIGNvbW1hbmQsIHJlbW92ZSBhdXRvZW5kIG1vZGUgKi8KKyAgICAvKiBNYW5hZ2UgdGhlIHN0b3AgZ2VuZXJhdGlvbiBieSBzb2Z0d2FyZSAqLworICAgIGlmIChoZm1wc21idXMtPnBCdWZmUHRyID09IE5VTEwpCisgICAgeworICAgICAgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyAmPSB+Rk1QU01CVVNfQVVUT0VORF9NT0RFOworICAgIH0KKworICAgIGlmIChTaXplID4gTUFYX05CWVRFX1NJWkUpCisgICAgeworICAgICAgaGZtcHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGZtcHNtYnVzLT5YZmVyU2l6ZSA9IFNpemU7CisgICAgfQorCisgICAgLyogU2VuZCBTbGF2ZSBBZGRyZXNzICovCisgICAgLyogU2V0IE5CWVRFUyB0byB3cml0ZSBhbmQgcmVsb2FkIGlmIHNpemUgPiBNQVhfTkJZVEVfU0laRSBhbmQgZ2VuZXJhdGUgUkVTVEFSVCAqLworICAgIGlmICgoaGZtcHNtYnVzLT5YZmVyU2l6ZSA8IGhmbXBzbWJ1cy0+WGZlckNvdW50KSAmJiAoaGZtcHNtYnVzLT5YZmVyU2l6ZSA9PSBNQVhfTkJZVEVfU0laRSkpCisgICAgeworICAgICAgRk1QU01CVVNfVHJhbnNmZXJDb25maWcoaGZtcHNtYnVzLCBEZXZBZGRyZXNzLCAodWludDhfdCloZm1wc21idXMtPlhmZXJTaXplLCBGTVBTTUJVU19SRUxPQURfTU9ERSAgfCAoaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyAmIEZNUFNNQlVTX1NFTkRQRUNfTU9ERSksIEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBjaGFuZ2UsIGRvIG5vdCBnZW5lcmF0ZSBSZXN0YXJ0IENvbmRpdGlvbiAqLworICAgICAgLyogTWVhbiBQcmV2aW91cyBzdGF0ZSBpcyBzYW1lIGFzIGN1cnJlbnQgc3RhdGUgKi8KKworICAgICAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBYZmVyT3B0aW9ucywgTWlzcmEgcnVsZSAqLworICAgICAgdG1wID0gaGZtcHNtYnVzLT5YZmVyT3B0aW9uczsKKworICAgICAgaWYgKChoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKSAmJiAoSVNfRk1QU01CVVNfVFJBTlNGRVJfT1RIRVJfT1BUSU9OU19SRVFVRVNUKHRtcCkgPT0gMCkpCisgICAgICB7CisgICAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGZtcHNtYnVzLT5YZmVyU2l6ZSwgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucywgRk1QU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgIH0KKyAgICAgIC8qIEVsc2UgdHJhbnNmZXIgZGlyZWN0aW9uIGNoYW5nZSwgc28gZ2VuZXJhdGUgUmVzdGFydCB3aXRoIG5ldyB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgICAgIEZNUFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKGhmbXBzbWJ1cyk7CisKKyAgICAgICAgLyogSGFuZGxlIFRyYW5zZmVyICovCisgICAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGZtcHNtYnVzLT5YZmVyU2l6ZSwgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucywgRk1QU01CVVNfR0VORVJBVEVfU1RBUlRfUkVBRCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBGTVBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEZNUFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgRk1QU01CVVNfRW5hYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX1JYKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgQWJvcnQgYSBtYXN0ZXIvaG9zdCBGTVBTTUJVUyBwcm9jZXNzIGNvbW11bmljYXRpb24gd2l0aCBJbnRlcnJ1cHQuCisgICogQG5vdGUgICBUaGlzIGFib3J0IGNhbiBiZSBjYWxsZWQgb25seSBpZiBzdGF0ZSBpcyByZWFkeQorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHBhcmFtICBEZXZBZGRyZXNzIFRhcmdldCBkZXZpY2UgYWRkcmVzczogVGhlIGRldmljZSA3IGJpdHMgYWRkcmVzcyB2YWx1ZQorICAqICAgICAgICAgaW4gZGF0YXNoZWV0IG11c3QgYmUgc2hpZnRlZCB0byB0aGUgbGVmdCBiZWZvcmUgY2FsbGluZyB0aGUgaW50ZXJmYWNlCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfTWFzdGVyX0Fib3J0X0lUKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcykKK3sKKyAgaWYgKGhmbXBzbWJ1cy0+U3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICAvKiBLZWVwIHRoZSBzYW1lIHN0YXRlIGFzIHByZXZpb3VzICovCisgICAgLyogdG8gcGVyZm9ybSBhcyB3ZWxsIHRoZSBjYWxsIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVuZCBvZiB0cmFuc2ZlciBjYWxsYmFjayAqLworICAgIGlmIChoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgIHsKKyAgICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFg7CisgICAgfQorICAgIGVsc2UgaWYgKGhmbXBzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgeworICAgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9SWDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdyb25nIHVzYWdlIG9mIGFib3J0IGZ1bmN0aW9uICovCisgICAgICAvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgaW4gY2FzZSBvZiBhYm9ydCBtb25pdG9yZWQgYnkgbWFzdGVyIGRldmljZSAqLworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfRk1QU01CVVNfRVJST1JfTk9ORTsKKworICAgIC8qIFNldCBOQllURVMgdG8gMSB0byBnZW5lcmF0ZSBhIGR1bW15IHJlYWQgb24gRk1QU01CVVMgcGVyaXBoZXJhbCAqLworICAgIC8qIFNldCBBVVRPRU5EIG1vZGUsIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIE5BQ0sgdGhlbiBTVE9QIGNvbmRpdGlvbiB0byBhYm9ydCB0aGUgY3VycmVudCB0cmFuc2ZlciAqLworICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgRGV2QWRkcmVzcywgMSwgRk1QU01CVVNfQVVUT0VORF9NT0RFLCBGTVBTTUJVU19OT19TVEFSVFNUT1ApOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBGTVBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEZNUFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgaWYgKGhmbXBzbWJ1cy0+U3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgIHsKKyAgICAgIEZNUFNNQlVTX0VuYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9UWCk7CisgICAgfQorICAgIGVsc2UgaWYgKGhmbXBzbWJ1cy0+U3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIEZNUFNNQlVTX0VuYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9SWCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBUcmFuc21pdCBpbiBzbGF2ZS9kZXZpY2UgRk1QU01CVVMgbW9kZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50CisgICogQHBhcmFtICBYZmVyT3B0aW9ucyBPcHRpb25zIG9mIFRyYW5zZmVyLCB2YWx1ZSBvZiBAcmVmIEZNUFNNQlVTX1hmZXJPcHRpb25zX2RlZmluaXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19TbGF2ZV9UcmFuc21pdF9JVChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBYZmVyT3B0aW9ucykKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX1RSQU5TRkVSX09QVElPTlNfUkVRVUVTVChYZmVyT3B0aW9ucykpOworCisgIGlmICgoaGZtcHNtYnVzLT5TdGF0ZSAmIEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4pID09IEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4pCisgIHsKKyAgICBpZiAoKHBEYXRhID09IE5VTEwpIHx8IChTaXplID09IDBVTCkpCisgICAgeworICAgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfRk1QU01CVVNfRVJST1JfSU5WQUxJRF9QQVJBTTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHRzLCB0byBwcmV2ZW50IHByZWVtcHRpb24gZHVyaW5nIHRyZWF0bWVudCBpbiBjYXNlIG9mIG11bHRpY2FsbCAqLworICAgIEZNUFNNQlVTX0Rpc2FibGVfSVJRKGhmbXBzbWJ1cywgRk1QU01CVVNfSVRfQUREUiB8IEZNUFNNQlVTX0lUX1RYKTsKKworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IChIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCB8IEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4pOworICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX0ZNUFNNQlVTX0VSUk9SX05PTkU7CisKKyAgICAvKiBTZXQgU0JDIGJpdCB0byBtYW5hZ2UgQWNrbm93bGVkZ2UgYXQgZWFjaCBiaXQgKi8KKyAgICBoZm1wc21idXMtPkluc3RhbmNlLT5DUjEgfD0gRk1QSTJDX0NSMV9TQkM7CisKKyAgICAvKiBFbmFibGUgQWRkcmVzcyBBY2tub3dsZWRnZSAqLworICAgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPkNSMiAmPSB+Rk1QSTJDX0NSMl9OQUNLOworCisgICAgLyogUHJlcGFyZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgaGZtcHNtYnVzLT5wQnVmZlB0ciA9IHBEYXRhOworICAgIGhmbXBzbWJ1cy0+WGZlckNvdW50ID0gU2l6ZTsKKyAgICBoZm1wc21idXMtPlhmZXJPcHRpb25zID0gWGZlck9wdGlvbnM7CisKKyAgICAvKiBDb252ZXJ0IE9USEVSX3h4eCBYZmVyT3B0aW9ucyBpZiBhbnkgKi8KKyAgICBGTVBTTUJVU19Db252ZXJ0T3RoZXJYZmVyT3B0aW9ucyhoZm1wc21idXMpOworCisgICAgaWYgKFNpemUgPiBNQVhfTkJZVEVfU0laRSkKKyAgICB7CisgICAgICBoZm1wc21idXMtPlhmZXJTaXplID0gTUFYX05CWVRFX1NJWkU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoZm1wc21idXMtPlhmZXJTaXplID0gU2l6ZTsKKyAgICB9CisKKyAgICAvKiBTZXQgTkJZVEVTIHRvIHdyaXRlIGFuZCByZWxvYWQgaWYgc2l6ZSA+IE1BWF9OQllURV9TSVpFIGFuZCBnZW5lcmF0ZSBSRVNUQVJUICovCisgICAgaWYgKChoZm1wc21idXMtPlhmZXJTaXplIDwgaGZtcHNtYnVzLT5YZmVyQ291bnQpICYmIChoZm1wc21idXMtPlhmZXJTaXplID09IE1BWF9OQllURV9TSVpFKSkKKyAgICB7CisgICAgICBGTVBTTUJVU19UcmFuc2ZlckNvbmZpZyhoZm1wc21idXMsIDAsICh1aW50OF90KWhmbXBzbWJ1cy0+WGZlclNpemUsIEZNUFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgJiBGTVBTTUJVU19TRU5EUEVDX01PREUpLCBGTVBTTUJVU19OT19TVEFSVFNUT1ApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IE5CWVRFIHRvIHRyYW5zbWl0ICovCisgICAgICBGTVBTTUJVU19UcmFuc2ZlckNvbmZpZyhoZm1wc21idXMsIDAsICh1aW50OF90KWhmbXBzbWJ1cy0+WGZlclNpemUsIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMsIEZNUFNNQlVTX05PX1NUQVJUU1RPUCk7CisKKyAgICAgIC8qIElmIFBFQyBtb2RlIGlzIGVuYWJsZSwgc2l6ZSB0byB0cmFuc21pdCBzaG91bGQgYmUgU2l6ZS0xIGJ5dGUsIGNvcnJlc3BvbmRpbmcgdG8gUEVDIGJ5dGUgKi8KKyAgICAgIC8qIFBFQyBieXRlIGlzIGF1dG9tYXRpY2FsbHkgc2VudCBieSBIVyBibG9jaywgbm8gbmVlZCB0byBtYW5hZ2UgaXQgaW4gVHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgaWYgKEZNUFNNQlVTX0dFVF9QRUNfTU9ERShoZm1wc21idXMpICE9IDBVTCkKKyAgICAgIHsKKyAgICAgICAgaGZtcHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICBoZm1wc21idXMtPlhmZXJDb3VudC0tOworICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgSE9TVCAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FERFIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBGTVBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEZNUFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIEZNUFNNQlVTX0VuYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9UWCB8IEZNUFNNQlVTX0lUX0FERFIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBSZWNlaXZlIGluIHNsYXZlL2RldmljZSBGTVBTTUJVUyBtb2RlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQKKyAgKiBAcGFyYW0gIFhmZXJPcHRpb25zIE9wdGlvbnMgb2YgVHJhbnNmZXIsIHZhbHVlIG9mIEByZWYgRk1QU01CVVNfWGZlck9wdGlvbnNfZGVmaW5pdGlvbgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX1NsYXZlX1JlY2VpdmVfSVQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgWGZlck9wdGlvbnMpCit7CisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19UUkFOU0ZFUl9PUFRJT05TX1JFUVVFU1QoWGZlck9wdGlvbnMpKTsKKworICBpZiAoKGhmbXBzbWJ1cy0+U3RhdGUgJiBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOKSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaWYgKChwRGF0YSA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVUwpKQorICAgIHsKKyAgICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlID0gSEFMX0ZNUFNNQlVTX0VSUk9SX0lOVkFMSURfUEFSQU07CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIERpc2FibGUgSW50ZXJydXB0cywgdG8gcHJldmVudCBwcmVlbXB0aW9uIGR1cmluZyB0cmVhdG1lbnQgaW4gY2FzZSBvZiBtdWx0aWNhbGwgKi8KKyAgICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX0FERFIgfCBGTVBTTUJVU19JVF9SWCk7CisKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGZtcHNtYnVzKTsKKworICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSAoSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlggfCBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOKTsKKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSA9IEhBTF9GTVBTTUJVU19FUlJPUl9OT05FOworCisgICAgLyogU2V0IFNCQyBiaXQgdG8gbWFuYWdlIEFja25vd2xlZGdlIGF0IGVhY2ggYml0ICovCisgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEZNUEkyQ19DUjFfU0JDOworCisgICAgLyogRW5hYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICBoZm1wc21idXMtPkluc3RhbmNlLT5DUjIgJj0gfkZNUEkyQ19DUjJfTkFDSzsKKworICAgIC8qIFByZXBhcmUgdHJhbnNmZXIgcGFyYW1ldGVycyAqLworICAgIGhmbXBzbWJ1cy0+cEJ1ZmZQdHIgPSBwRGF0YTsKKyAgICBoZm1wc21idXMtPlhmZXJTaXplID0gU2l6ZTsKKyAgICBoZm1wc21idXMtPlhmZXJDb3VudCA9IFNpemU7CisgICAgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyA9IFhmZXJPcHRpb25zOworCisgICAgLyogQ29udmVydCBPVEhFUl94eHggWGZlck9wdGlvbnMgaWYgYW55ICovCisgICAgRk1QU01CVVNfQ29udmVydE90aGVyWGZlck9wdGlvbnMoaGZtcHNtYnVzKTsKKworICAgIC8qIFNldCBOQllURSB0byByZWNlaXZlICovCisgICAgLyogSWYgWGZlclNpemUgZXF1YWwgIjEiLCBvciBYZmVyU2l6ZSBlcXVhbCAiMiIgd2l0aCBQRUMgcmVxdWVzdGVkIChtZWFuIDEgZGF0YSBieXRlICsgMSBQRUMgYnl0ZSAqLworICAgIC8qIG5vIG5lZWQgdG8gc2V0IFJFTE9BRCBiaXQgbW9kZSwgYSBBQ0sgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBpbiB0aGF0IGNhc2UgKi8KKyAgICAvKiBlbHNlIG5lZWQgdG8gc2V0IFJFTE9BRCBiaXQgbW9kZSB0byBnZW5lcmF0ZSBhbiBhdXRvbWF0aWMgQUNLIGF0IGVhY2ggYnl0ZSBSZWNlaXZlZCAqLworICAgIC8qIFRoaXMgUkVMT0FEIGJpdCB3aWxsIGJlIHJlc2V0IGZvciBsYXN0IEJZVEUgdG8gYmUgcmVjZWl2ZSBpbiBGTVBTTUJVU19TbGF2ZV9JU1IgKi8KKyAgICBpZiAoKChGTVBTTUJVU19HRVRfUEVDX01PREUoaGZtcHNtYnVzKSAhPSAwVUwpICYmIChoZm1wc21idXMtPlhmZXJTaXplID09IDJVKSkgfHwgKGhmbXBzbWJ1cy0+WGZlclNpemUgPT0gMVUpKQorICAgIHsKKyAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgMCwgKHVpbnQ4X3QpaGZtcHNtYnVzLT5YZmVyU2l6ZSwgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucywgRk1QU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgMCwgMSwgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyB8IEZNUFNNQlVTX1JFTE9BRF9NT0RFLCBGTVBTTUJVU19OT19TVEFSVFNUT1ApOworICAgIH0KKworICAgIC8qIENsZWFyIEFERFIgZmxhZyBhZnRlciBwcmVwYXJlIHRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzICovCisgICAgLyogVGhpcyBhY3Rpb24gd2lsbCBnZW5lcmF0ZSBhbiBhY2tub3dsZWRnZSB0byB0aGUgSE9TVCAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FERFIpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgLyogTm90ZSA6IFRoZSBGTVBTTUJVUyBpbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBhZnRlciB1bmxvY2tpbmcgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICAgIHRvIGF2b2lkIHRoZSByaXNrIG9mIEZNUFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSBjdXJyZW50CisgICAgICAgICAgICAgIHByb2Nlc3MgdW5sb2NrICovCisgICAgLyogUkVuYWJsZSBBRERSIGludGVycnVwdCAqLworICAgIEZNUFNNQlVTX0VuYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9SWCB8IEZNUFNNQlVTX0lUX0FERFIpOworCisgICAgcmV0dXJuIEhBTF9PSzsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBFbmFibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19FbmFibGVMaXN0ZW5fSVQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICBoZm1wc21idXMtPlN0YXRlID0gSEFMX0ZNUFNNQlVTX1NUQVRFX0xJU1RFTjsKKworICAvKiBFbmFibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgIEZNUFNNQlVTX0VuYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9BRERSKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIEFkZHJlc3MgbGlzdGVuIG1vZGUgd2l0aCBJbnRlcnJ1cHQuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19EaXNhYmxlTGlzdGVuX0lUKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cykKK3sKKyAgLyogRGlzYWJsZSBBZGRyZXNzIGxpc3RlbiBtb2RlIG9ubHkgaWYgYSB0cmFuc2ZlciBpcyBub3Qgb25nb2luZyAqLworICBpZiAoaGZtcHNtYnVzLT5TdGF0ZSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOKQorICB7CisgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWTsKKworICAgIC8qIERpc2FibGUgdGhlIEFkZHJlc3MgTWF0Y2ggaW50ZXJydXB0ICovCisgICAgRk1QU01CVVNfRGlzYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9BRERSKTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBGTVBTTUJVUyBhbGVydCBtb2RlIHdpdGggSW50ZXJydXB0LgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVN4IHBlcmlwaGVyYWwuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRk1QU01CVVNfRW5hYmxlQWxlcnRfSVQoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICAvKiBFbmFibGUgU01CdXMgYWxlcnQgKi8KKyAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+Q1IxIHw9IEZNUEkyQ19DUjFfQUxFUlRFTjsKKworICAvKiBDbGVhciBBTEVSVCBmbGFnICovCisgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FMRVJUKTsKKworICAvKiBFbmFibGUgQWxlcnQgSW50ZXJydXB0ICovCisgIEZNUFNNQlVTX0VuYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9BTEVSVCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgRk1QU01CVVMgYWxlcnQgbW9kZSB3aXRoIEludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTeCBwZXJpcGhlcmFsLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0ZNUFNNQlVTX0Rpc2FibGVBbGVydF9JVChGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpCit7CisgIC8qIEVuYWJsZSBTTUJ1cyBhbGVydCAqLworICBoZm1wc21idXMtPkluc3RhbmNlLT5DUjEgJj0gfkZNUEkyQ19DUjFfQUxFUlRFTjsKKworICAvKiBEaXNhYmxlIEFsZXJ0IEludGVycnVwdCAqLworICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX0FMRVJUKTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRhcmdldCBkZXZpY2UgaXMgcmVhZHkgZm9yIGNvbW11bmljYXRpb24uCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3MgVGFyZ2V0IGRldmljZSBhZGRyZXNzOiBUaGUgZGV2aWNlIDcgYml0cyBhZGRyZXNzIHZhbHVlCisgICogICAgICAgICBpbiBkYXRhc2hlZXQgbXVzdCBiZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcmZhY2UKKyAgKiBAcGFyYW0gIFRyaWFscyBOdW1iZXIgb2YgdHJpYWxzCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9GTVBTTUJVU19Jc0RldmljZVJlYWR5KEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDE2X3QgRGV2QWRkcmVzcywgdWludDMyX3QgVHJpYWxzLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQ7CisKKyAgX19JTyB1aW50MzJfdCBGTVBTTUJVU19UcmlhbHMgPSAwVUw7CisKKyAgRmxhZ1N0YXR1cyB0bXAxOworICBGbGFnU3RhdHVzIHRtcDI7CisKKyAgaWYgKGhmbXBzbWJ1cy0+U3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZKQorICB7CisgICAgaWYgKF9fSEFMX0ZNUFNNQlVTX0dFVF9GTEFHKGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19CVVNZKSAhPSBSRVNFVCkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0JVU1k7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgICBfX0hBTF9MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICBoZm1wc21idXMtPlN0YXRlID0gSEFMX0ZNUFNNQlVTX1NUQVRFX0JVU1k7CisgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgPSBIQUxfRk1QU01CVVNfRVJST1JfTk9ORTsKKworICAgIGRvCisgICAgeworICAgICAgLyogR2VuZXJhdGUgU3RhcnQgKi8KKyAgICAgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPkNSMiA9IEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUKGhmbXBzbWJ1cy0+SW5pdC5BZGRyZXNzaW5nTW9kZSwgRGV2QWRkcmVzcyk7CisKKyAgICAgIC8qIE5vIG5lZWQgdG8gQ2hlY2sgVEMgZmxhZywgd2l0aCBBVVRPRU5EIG1vZGUgdGhlIHN0b3AgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKi8KKyAgICAgIC8qIFdhaXQgdW50aWwgU1RPUEYgZmxhZyBpcyBzZXQgb3IgYSBOQUNLIGZsYWcgaXMgc2V0Ki8KKyAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CisKKyAgICAgIHRtcDEgPSBfX0hBTF9GTVBTTUJVU19HRVRfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpOworICAgICAgdG1wMiA9IF9fSEFMX0ZNUFNNQlVTX0dFVF9GTEFHKGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19BRik7CisKKyAgICAgIHdoaWxlICgodG1wMSA9PSBSRVNFVCkgJiYgKHRtcDIgPT0gUkVTRVQpKQorICAgICAgeworICAgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVUwpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERldmljZSBpcyByZWFkeSAqLworICAgICAgICAgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogVXBkYXRlIEZNUFNNQlVTIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBTTUJVU19FUlJPUl9IQUxUSU1FT1VUOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGZtcHNtYnVzKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wMSA9IF9fSEFMX0ZNUFNNQlVTX0dFVF9GTEFHKGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19TVE9QRik7CisgICAgICAgIHRtcDIgPSBfX0hBTF9GTVBTTUJVU19HRVRfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfQUYpOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgTkFDS0YgZmxhZyBoYXMgbm90IGJlZW4gc2V0ICovCisgICAgICBpZiAoX19IQUxfRk1QU01CVVNfR0VUX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FGKSA9PSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChGTVBTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBTVE9QIEZsYWcgKi8KKyAgICAgICAgX19IQUxfRk1QU01CVVNfQ0xFQVJfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAgIC8qIERldmljZSBpcyByZWFkeSAqLworICAgICAgICBoZm1wc21idXMtPlN0YXRlID0gSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogV2FpdCB1bnRpbCBTVE9QRiBmbGFnIGlzIHJlc2V0ICovCisgICAgICAgIGlmIChGTVBTTUJVU19XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19TVE9QRiwgUkVTRVQsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgICAgX19IQUxfRk1QU01CVVNfQ0xFQVJfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfQUYpOworCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZywgYXV0byBnZW5lcmF0ZWQgd2l0aCBhdXRvZW5kKi8KKyAgICAgICAgX19IQUxfRk1QU01CVVNfQ0xFQVJfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiB0cmlhbHMgaGFzIGJlZW4gcmVhY2hlZCAqLworICAgICAgaWYgKEZNUFNNQlVTX1RyaWFscyA9PSBUcmlhbHMpCisgICAgICB7CisgICAgICAgIC8qIEdlbmVyYXRlIFN0b3AgKi8KKyAgICAgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IEZNUEkyQ19DUjJfU1RPUDsKKworICAgICAgICAvKiBXYWl0IHVudGlsIFNUT1BGIGZsYWcgaXMgcmVzZXQgKi8KKyAgICAgICAgaWYgKEZNUFNNQlVTX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX1NUT1BGLCBSRVNFVCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgICBfX0hBTF9GTVBTTUJVU19DTEVBUl9GTEFHKGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19TVE9QRik7CisgICAgICB9CisKKyAgICAgIC8qIEluY3JlbWVudCBUcmlhbHMgKi8KKyAgICAgIEZNUFNNQlVTX1RyaWFscysrOworICAgIH0KKyAgICB3aGlsZSAoRk1QU01CVVNfVHJpYWxzIDwgVHJpYWxzKTsKKworICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBVcGRhdGUgRk1QU01CVVMgZXJyb3IgY29kZSAqLworICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBTTUJVU19FUlJPUl9IQUxUSU1FT1VUOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gSEFMX0JVU1k7CisgIH0KK30KKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfSVJRX0hhbmRsZXJfYW5kX0NhbGxiYWNrcyBJUlEgSGFuZGxlciBhbmQgQ2FsbGJhY2tzCisgKiBAeworICovCisKKy8qKgorICAqIEBicmllZiAgSGFuZGxlIEZNUFNNQlVTIGV2ZW50IGludGVycnVwdCByZXF1ZXN0LgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9GTVBTTUJVU19FVl9JUlFIYW5kbGVyKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cykKK3sKKyAgLyogVXNlIGEgbG9jYWwgdmFyaWFibGUgdG8gc3RvcmUgdGhlIGN1cnJlbnQgSVNSIGZsYWdzICovCisgIC8qIFRoaXMgYWN0aW9uIHdpbGwgYXZvaWQgYSB3cm9uZyB0cmVhdG1lbnQgZHVlIHRvIElTUiBmbGFncyBjaGFuZ2UgZHVyaW5nIGludGVycnVwdCBoYW5kbGVyICovCisgIHVpbnQzMl90IHRtcGlzcnZhbHVlID0gUkVBRF9SRUcoaGZtcHNtYnVzLT5JbnN0YW5jZS0+SVNSKTsKKyAgdWludDMyX3QgdG1wY3IxdmFsdWUgPSBSRUFEX1JFRyhoZm1wc21idXMtPkluc3RhbmNlLT5DUjEpOworCisgIC8qIEZNUFNNQlVTIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKChGTVBTTUJVU19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIChGTVBTTUJVU19JVF9UQ0kgfCBGTVBTTUJVU19JVF9TVE9QSSB8IEZNUFNNQlVTX0lUX05BQ0tJIHwgRk1QU01CVVNfSVRfVFhJKSkgIT0gUkVTRVQpICYmICgoRk1QU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgRk1QU01CVVNfRkxBR19UWElTKSAhPSBSRVNFVCkgfHwgKEZNUFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIEZNUFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkgfHwgKEZNUFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIEZNUFNNQlVTX0ZMQUdfVEMpICE9IFJFU0VUKSB8fCAoRk1QU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgRk1QU01CVVNfRkxBR19TVE9QRikgIT0gUkVTRVQpIHx8IChGTVBTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBGTVBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkpKQorICB7CisgICAgLyogU2xhdmUgbW9kZSBzZWxlY3RlZCAqLworICAgIGlmICgoaGZtcHNtYnVzLT5TdGF0ZSAmIEhBTF9GTVBTTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkKKyAgICB7CisgICAgICAodm9pZClGTVBTTUJVU19TbGF2ZV9JU1IoaGZtcHNtYnVzLCB0bXBpc3J2YWx1ZSk7CisgICAgfQorICAgIC8qIE1hc3RlciBtb2RlIHNlbGVjdGVkICovCisgICAgZWxzZSBpZiAoKGhmbXBzbWJ1cy0+U3RhdGUgJiBIQUxfRk1QU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfVFgpID09IEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICAodm9pZClGTVBTTUJVU19NYXN0ZXJfSVNSKGhmbXBzbWJ1cywgdG1waXNydmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorCisgIC8qIEZNUFNNQlVTIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoRk1QU01CVVNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCAoRk1QU01CVVNfSVRfVENJIHwgRk1QU01CVVNfSVRfU1RPUEkgfCBGTVBTTUJVU19JVF9OQUNLSSB8IEZNUFNNQlVTX0lUX1JYSSkpICE9IFJFU0VUKSAmJiAoKEZNUFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIEZNUFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpIHx8IChGTVBTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBGTVBTTUJVU19GTEFHX1RDUikgIT0gUkVTRVQpIHx8IChGTVBTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBGTVBTTUJVU19GTEFHX1RDKSAhPSBSRVNFVCkgfHwgKEZNUFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKSB8fCAoRk1QU01CVVNfQ0hFQ0tfRkxBRyh0bXBpc3J2YWx1ZSwgRk1QU01CVVNfRkxBR19BRikgIT0gUkVTRVQpKSkKKyAgeworICAgIC8qIFNsYXZlIG1vZGUgc2VsZWN0ZWQgKi8KKyAgICBpZiAoKGhmbXBzbWJ1cy0+U3RhdGUgJiBIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpCisgICAgeworICAgICAgKHZvaWQpRk1QU01CVVNfU2xhdmVfSVNSKGhmbXBzbWJ1cywgdG1waXNydmFsdWUpOworICAgIH0KKyAgICAvKiBNYXN0ZXIgbW9kZSBzZWxlY3RlZCAqLworICAgIGVsc2UgaWYgKChoZm1wc21idXMtPlN0YXRlICYgSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgeworICAgICAgKHZvaWQpRk1QU01CVVNfTWFzdGVyX0lTUihoZm1wc21idXMsIHRtcGlzcnZhbHVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKworICAvKiBGTVBTTUJVUyBpbiBtb2RlIExpc3RlbmVyIE9ubHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChGTVBTTUJVU19DSEVDS19JVF9TT1VSQ0UodG1wY3IxdmFsdWUsIEZNUFNNQlVTX0lUX0FERFJJKSAhPSBSRVNFVCkgfHwgKEZNUFNNQlVTX0NIRUNLX0lUX1NPVVJDRSh0bXBjcjF2YWx1ZSwgRk1QU01CVVNfSVRfU1RPUEkpICE9IFJFU0VUKSB8fCAoRk1QU01CVVNfQ0hFQ0tfSVRfU09VUkNFKHRtcGNyMXZhbHVlLCBGTVBTTUJVU19JVF9OQUNLSSkgIT0gUkVTRVQpKSAmJiAoKEZNUFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIEZNUFNNQlVTX0ZMQUdfQUREUikgIT0gUkVTRVQpIHx8IChGTVBTTUJVU19DSEVDS19GTEFHKHRtcGlzcnZhbHVlLCBGTVBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgfHwgKEZNUFNNQlVTX0NIRUNLX0ZMQUcodG1waXNydmFsdWUsIEZNUFNNQlVTX0ZMQUdfQUYpICE9IFJFU0VUKSkpCisgIHsKKyAgICBpZiAoKGhmbXBzbWJ1cy0+U3RhdGUgJiBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOKSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOKQorICAgIHsKKyAgICAgICh2b2lkKUZNUFNNQlVTX1NsYXZlX0lTUihoZm1wc21idXMsIHRtcGlzcnZhbHVlKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgRk1QU01CVVMgZXJyb3IgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3ZvaWQgSEFMX0ZNUFNNQlVTX0VSX0lSUUhhbmRsZXIoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICBGTVBTTUJVU19JVEVycm9ySGFuZGxlcihoZm1wc21idXMpOworfQorCisvKioKKyAgKiBAYnJpZWYgIE1hc3RlciBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9GTVBTTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhmbXBzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9GTVBTTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEBicmllZiAgTWFzdGVyIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0ZNUFNNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZtcHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZNUFNNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqIEBicmllZiAgU2xhdmUgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfRk1QU01CVVNfU2xhdmVUeENwbHRDYWxsYmFjayhGTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMpCit7CisgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KKyAgVU5VU0VEKGhmbXBzbWJ1cyk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9GTVBTTUJVU19TbGF2ZVR4Q3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBTbGF2ZSBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9GTVBTTUJVU19TbGF2ZVJ4Q3BsdENhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cykKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZtcHNtYnVzKTsKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisgICAgICAgICAgICB0aGUgSEFMX0ZNUFNNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soKSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLworfQorCisvKioKKyAgKiBAYnJpZWYgIFNsYXZlIEFkZHJlc3MgTWF0Y2ggY2FsbGJhY2suCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcGFyYW0gIFRyYW5zZmVyRGlyZWN0aW9uIE1hc3RlciByZXF1ZXN0IFRyYW5zZmVyIERpcmVjdGlvbiAoV3JpdGUvUmVhZCkKKyAgKiBAcGFyYW0gIEFkZHJNYXRjaENvZGUgQWRkcmVzcyBNYXRjaCBDb2RlCisgICogQHJldHZhbCBOb25lCisgICovCitfX3dlYWsgdm9pZCBIQUxfRk1QU01CVVNfQWRkckNhbGxiYWNrKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDhfdCBUcmFuc2ZlckRpcmVjdGlvbiwgdWludDE2X3QgQWRkck1hdGNoQ29kZSkKK3sKKyAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLworICBVTlVTRUQoaGZtcHNtYnVzKTsKKyAgVU5VU0VEKFRyYW5zZmVyRGlyZWN0aW9uKTsKKyAgVU5VU0VEKEFkZHJNYXRjaENvZGUpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRk1QU01CVVNfQWRkckNhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBMaXN0ZW4gQ29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fd2VhayB2b2lkIEhBTF9GTVBTTUJVU19MaXN0ZW5DcGx0Q2FsbGJhY2soRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZm1wc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRk1QU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKCkgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQorICAgKi8KK30KKworLyoqCisgICogQGJyaWVmICBGTVBTTUJVUyBlcnJvciBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX0ZNUFNNQlVTX0Vycm9yQ2FsbGJhY2soRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChoZm1wc21idXMpOworCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKyAgICAgICAgICAgIHRoZSBIQUxfRk1QU01CVVNfRXJyb3JDYWxsYmFjaygpIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgRk1QU01CVVNfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zCisgKiAgQGJyaWVmICAgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucworICoKK0B2ZXJiYXRpbQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXQorICAgIFRoaXMgc3Vic2VjdGlvbiBwZXJtaXRzIHRvIGdldCBpbiBydW4tdGltZSB0aGUgc3RhdHVzIG9mIHRoZSBwZXJpcGhlcmFsCisgICAgYW5kIHRoZSBkYXRhIGZsb3cuCisKK0BlbmR2ZXJiYXRpbQorICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBGTVBTTUJVUyBoYW5kbGUgc3RhdGUuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0ZQorICAqLwordWludDMyX3QgSEFMX0ZNUFNNQlVTX0dldFN0YXRlKEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cykKK3sKKyAgLyogUmV0dXJuIEZNUFNNQlVTIGhhbmRsZSBzdGF0ZSAqLworICByZXR1cm4gaGZtcHNtYnVzLT5TdGF0ZTsKK30KKworLyoqCisqIEBicmllZiAgUmV0dXJuIHRoZSBGTVBTTUJVUyBlcnJvciBjb2RlLgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorKiBAcmV0dmFsIEZNUFNNQlVTIEVycm9yIENvZGUKKyovCit1aW50MzJfdCBIQUxfRk1QU01CVVNfR2V0RXJyb3IoRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICByZXR1cm4gaGZtcHNtYnVzLT5FcnJvckNvZGU7Cit9CisKKy8qKgorICAqIEB9CisgICovCisKKy8qKgorICAqIEB9CisgICovCisKKy8qKiBAYWRkdG9ncm91cCBGTVBTTUJVU19Qcml2YXRlX0Z1bmN0aW9ucyBGTVBTTUJVUyBQcml2YXRlIEZ1bmN0aW9ucworICogIEBicmllZiAgIERhdGEgdHJhbnNmZXJzIFByaXZhdGUgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgTWFzdGVyIE1vZGUuCisgICogQHBhcmFtICBoZm1wc21idXMgUG9pbnRlciB0byBhIEZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBGTVBTTUJVUy4KKyAgKiBAcGFyYW0gIFN0YXR1c0ZsYWdzIFZhbHVlIG9mIEludGVycnVwdCBGbGFncy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBGTVBTTUJVU19NYXN0ZXJfSVNSKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDMyX3QgU3RhdHVzRmxhZ3MpCit7CisgIHVpbnQxNl90IERldkFkZHJlc3M7CisKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhoZm1wc21idXMpOworCisgIGlmIChGTVBTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBGTVBTTUJVU19GTEFHX0FGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENsZWFyIE5BQ0sgRmxhZyAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FGKTsKKworICAgIC8qIFNldCBjb3JyZXNwb25kaW5nIEVycm9yIENvZGUgKi8KKyAgICAvKiBObyBuZWVkIHRvIGdlbmVyYXRlIFNUT1AsIGl0IGlzIGF1dG9tYXRpY2FsbHkgZG9uZSAqLworICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBTTUJVU19FUlJPUl9BQ0tGOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgLyogQ2FsbCB0aGUgRXJyb3IgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGZtcHNtYnVzLT5FcnJvckNhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZWxzZQorICAgIEhBTF9GTVBTTUJVU19FcnJvckNhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlIGlmIChGTVBTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBGTVBTTUJVU19GTEFHX1NUT1BGKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIENoZWNrIGFuZCB0cmVhdCBlcnJvcnMgaWYgZXJyb3JzIG9jY3VycyBkdXJpbmcgU1RPUCBwcm9jZXNzICovCisgICAgRk1QU01CVVNfSVRFcnJvckhhbmRsZXIoaGZtcHNtYnVzKTsKKworICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworICAgIGlmIChoZm1wc21idXMtPlN0YXRlID09IEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgRk1QU01CVVNfRGlzYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfRk1QU01CVVNfQ0xFQVJfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICAgIEZNUFNNQlVTX1JFU0VUX0NSMihoZm1wc21idXMpOworCisgICAgICAvKiBGbHVzaCByZW1haW5pbmcgZGF0YSBpbiBGaWZvIHJlZ2lzdGVyIGluIGNhc2Ugb2YgZXJyb3Igb2NjdXJzIGJlZm9yZSBUWEVtcHR5ICovCisgICAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBGTVBTTUJVUyBwZXJpcGhlcmFsICovCisgICAgICBfX0hBTF9GTVBTTUJVU19ESVNBQkxFKGhmbXBzbWJ1cyk7CisKKyAgICAgIGhmbXBzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWTsKKyAgICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgICAvKiBSRWVuYWJsZSB0aGUgc2VsZWN0ZWQgRk1QU01CVVMgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfRk1QU01CVVNfRU5BQkxFKGhmbXBzbWJ1cyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGZtcHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayhoZm1wc21idXMpOworI2Vsc2UKKyAgICAgIEhBTF9GTVBTTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhoZm1wc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UgaWYgKGhmbXBzbWJ1cy0+U3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgIHsKKyAgICAgIC8qIFN0b3JlIExhc3QgcmVjZWl2ZSBkYXRhIGlmIGFueSAqLworICAgICAgaWYgKEZNUFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIEZNUFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICAgKmhmbXBzbWJ1cy0+cEJ1ZmZQdHIgPSAodWludDhfdCkoaGZtcHNtYnVzLT5JbnN0YW5jZS0+UlhEUik7CisKKyAgICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGhmbXBzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgICAgICBpZiAoKGhmbXBzbWJ1cy0+WGZlclNpemUgPiAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBoZm1wc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgaGZtcHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIEludGVycnVwdCAqLworICAgICAgRk1QU01CVVNfRGlzYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9SWCk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfRk1QU01CVVNfQ0xFQVJfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyAgICAgIEZNUFNNQlVTX1JFU0VUX0NSMihoZm1wc21idXMpOworCisgICAgICBoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisgICAgICBoZm1wc21idXMtPlN0YXRlID0gSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGZtcHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICBoZm1wc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZWxzZQorICAgICAgSEFMX0ZNUFNNQlVTX01hc3RlclJ4Q3BsdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoRk1QU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgRk1QU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAqaGZtcHNtYnVzLT5wQnVmZlB0ciA9ICh1aW50OF90KShoZm1wc21idXMtPkluc3RhbmNlLT5SWERSKTsKKworICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgIGhmbXBzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgIC8qIEluY3JlbWVudCBTaXplIGNvdW50ZXIgKi8KKyAgICBoZm1wc21idXMtPlhmZXJTaXplLS07CisgICAgaGZtcHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgfQorICBlbHNlIGlmIChGTVBTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBGTVBTTUJVU19GTEFHX1RYSVMpICE9IFJFU0VUKQorICB7CisgICAgLyogV3JpdGUgZGF0YSB0byBUWERSICovCisgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+VFhEUiA9ICpoZm1wc21idXMtPnBCdWZmUHRyOworCisgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgaGZtcHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgLyogSW5jcmVtZW50IFNpemUgY291bnRlciAqLworICAgIGhmbXBzbWJ1cy0+WGZlclNpemUtLTsKKyAgICBoZm1wc21idXMtPlhmZXJDb3VudC0tOworICB9CisgIGVsc2UgaWYgKEZNUFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIEZNUFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkKKyAgeworICAgIGlmICgoaGZtcHNtYnVzLT5YZmVyQ291bnQgIT0gMFUpICYmIChoZm1wc21idXMtPlhmZXJTaXplID09IDBVKSkKKyAgICB7CisgICAgICBEZXZBZGRyZXNzID0gKHVpbnQxNl90KShoZm1wc21idXMtPkluc3RhbmNlLT5DUjIgJiBGTVBJMkNfQ1IyX1NBREQpOworCisgICAgICBpZiAoaGZtcHNtYnVzLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgIHsKKyAgICAgICAgRk1QU01CVVNfVHJhbnNmZXJDb25maWcoaGZtcHNtYnVzLCBEZXZBZGRyZXNzLCBNQVhfTkJZVEVfU0laRSwgKEZNUFNNQlVTX1JFTE9BRF9NT0RFIHwgKGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgJiBGTVBTTUJVU19TRU5EUEVDX01PREUpKSwgRk1QU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgaGZtcHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBoZm1wc21idXMtPlhmZXJTaXplID0gaGZtcHNtYnVzLT5YZmVyQ291bnQ7CisgICAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgRGV2QWRkcmVzcywgKHVpbnQ4X3QpaGZtcHNtYnVzLT5YZmVyU2l6ZSwgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucywgRk1QU01CVVNfTk9fU1RBUlRTVE9QKTsKKyAgICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgICAvKiBQRUMgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHNlbnQgYnkgSFcgYmxvY2ssIG5vIG5lZWQgdG8gbWFuYWdlIGl0IGluIFRyYW5zbWl0IHByb2Nlc3MgKi8KKyAgICAgICAgaWYgKEZNUFNNQlVTX0dFVF9QRUNfTU9ERShoZm1wc21idXMpICE9IDBVTCkKKyAgICAgICAgeworICAgICAgICAgIGhmbXBzbWJ1cy0+WGZlclNpemUtLTsKKyAgICAgICAgICBoZm1wc21idXMtPlhmZXJDb3VudC0tOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoZm1wc21idXMtPlhmZXJDb3VudCA9PSAwVSkgJiYgKGhmbXBzbWJ1cy0+WGZlclNpemUgPT0gMFUpKQorICAgIHsKKyAgICAgIC8qIENhbGwgVHhDcGx0Q2FsbGJhY2soKSBpZiBubyBzdG9wIG1vZGUgaXMgc2V0ICovCisgICAgICBpZiAoRk1QU01CVVNfR0VUX1NUT1BfTU9ERShoZm1wc21idXMpICE9IEZNUFNNQlVTX0FVVE9FTkRfTU9ERSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisgICAgICAgIGlmIChoZm1wc21idXMtPlN0YXRlID09IEhBTF9GTVBTTUJVU19TVEFURV9NQVNURVJfQlVTWV9UWCkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgSW50ZXJydXB0ICovCisgICAgICAgICAgRk1QU01CVVNfRGlzYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9UWCk7CisgICAgICAgICAgaGZtcHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaGZtcHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoZm1wc21idXMtPlN0YXRlID0gSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaGZtcHNtYnVzLT5NYXN0ZXJUeENwbHRDYWxsYmFjayhoZm1wc21idXMpOworI2Vsc2UKKyAgICAgICAgICBIQUxfRk1QU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soaGZtcHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhmbXBzbWJ1cy0+U3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1JYKQorICAgICAgICB7CisgICAgICAgICAgRk1QU01CVVNfRGlzYWJsZV9JUlEoaGZtcHNtYnVzLCBGTVBTTUJVU19JVF9SWCk7CisgICAgICAgICAgaGZtcHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaGZtcHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgICBoZm1wc21idXMtPlN0YXRlID0gSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgICAgaGZtcHNtYnVzLT5NYXN0ZXJSeENwbHRDYWxsYmFjayhoZm1wc21idXMpOworI2Vsc2UKKyAgICAgICAgICBIQUxfRk1QU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soaGZtcHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKyAgfQorICBlbHNlIGlmIChGTVBTTUJVU19DSEVDS19GTEFHKFN0YXR1c0ZsYWdzLCBGTVBTTUJVU19GTEFHX1RDKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChoZm1wc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBTcGVjaWZpYyB1c2UgY2FzZSBmb3IgUXVpY2sgY29tbWFuZCAqLworICAgICAgaWYgKGhmbXBzbWJ1cy0+cEJ1ZmZQdHIgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogR2VuZXJhdGUgYSBTdG9wIGNvbW1hbmQgKi8KKyAgICAgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+Q1IyIHw9IEZNUEkyQ19DUjJfU1RPUDsKKyAgICAgIH0KKyAgICAgIC8qIENhbGwgVHhDcGx0Q2FsbGJhY2soKSBpZiBubyBzdG9wIG1vZGUgaXMgc2V0ICovCisgICAgICBlbHNlIGlmIChGTVBTTUJVU19HRVRfU1RPUF9NT0RFKGhmbXBzbWJ1cykgIT0gRk1QU01CVVNfQVVUT0VORF9NT0RFKQorICAgICAgeworICAgICAgICAvKiBObyBHZW5lcmF0ZSBTdG9wLCB0byBwZXJtaXQgcmVzdGFydCBtb2RlICovCisgICAgICAgIC8qIFRoZSBzdG9wIHdpbGwgYmUgZG9uZSBhdCB0aGUgZW5kIG9mIHRyYW5zZmVyLCB3aGVuIEZNUFNNQlVTX0FVVE9FTkRfTU9ERSBlbmFibGUgKi8KKworICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyAgICAgICAgaWYgKGhmbXBzbWJ1cy0+U3RhdGUgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX01BU1RFUl9CVVNZX1RYKQorICAgICAgICB7CisgICAgICAgICAgLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX1RYKTsKKyAgICAgICAgICBoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPSBoZm1wc21idXMtPlN0YXRlOworICAgICAgICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoZm1wc21idXMtPk1hc3RlclR4Q3BsdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZWxzZQorICAgICAgICAgIEhBTF9GTVBTTUJVU19NYXN0ZXJUeENwbHRDYWxsYmFjayhoZm1wc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaGZtcHNtYnVzLT5TdGF0ZSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfTUFTVEVSX0JVU1lfUlgpCisgICAgICAgIHsKKyAgICAgICAgICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX1JYKTsKKyAgICAgICAgICBoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPSBoZm1wc21idXMtPlN0YXRlOworICAgICAgICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICAgICAgICAvKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciBvZiBFbmQgb2YgVHJhbnNmZXIgKi8KKyNpZiAoVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICBoZm1wc21idXMtPk1hc3RlclJ4Q3BsdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZWxzZQorICAgICAgICAgIEhBTF9GTVBTTUJVU19NYXN0ZXJSeENwbHRDYWxsYmFjayhoZm1wc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGZtcHNtYnVzKTsKKworICByZXR1cm4gSEFMX09LOworfQorLyoqCisgICogQGJyaWVmICBJbnRlcnJ1cHQgU3ViLVJvdXRpbmUgd2hpY2ggaGFuZGxlIHRoZSBJbnRlcnJ1cHQgRmxhZ3MgU2xhdmUgTW9kZS4KKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorICAqIEBwYXJhbSAgU3RhdHVzRmxhZ3MgVmFsdWUgb2YgSW50ZXJydXB0IEZsYWdzLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIEZNUFNNQlVTX1NsYXZlX0lTUihzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQzMl90IFN0YXR1c0ZsYWdzKQoreworICB1aW50OF90IFRyYW5zZmVyRGlyZWN0aW9uOworICB1aW50MTZfdCBTbGF2ZUFkZHJDb2RlOworCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGZtcHNtYnVzKTsKKworICBpZiAoRk1QU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgRk1QU01CVVNfRkxBR19BRikgIT0gUkVTRVQpCisgIHsKKyAgICAvKiBDaGVjayB0aGF0IEZNUFNNQlVTIHRyYW5zZmVyIGZpbmlzaGVkICovCisgICAgLyogaWYgeWVzLCBub3JtYWwgdXNlY2FzZSwgYSBOQUNLIGlzIHNlbnQgYnkgdGhlIEhPU1Qgd2hlbiBUcmFuc2ZlciBpcyBmaW5pc2hlZCAqLworICAgIC8qIE1lYW4gWGZlckNvdW50ID09IDAqLworICAgIC8qIFNvIGNsZWFyIEZsYWcgTkFDS0Ygb25seSAqLworICAgIGlmIChoZm1wc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICB7CisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FGKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBpZiBubywgZXJyb3IgdXNlY2FzZSwgYSBOb24tQWNrbm93bGVkZ2Ugb2YgbGFzdCBEYXRhIGlzIGdlbmVyYXRlZCBieSB0aGUgSE9TVCovCisgICAgICAvKiBDbGVhciBOQUNLIEZsYWcgKi8KKyAgICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FGKTsKKworICAgICAgLyogU2V0IEhBTCBTdGF0ZSB0byAiSWRsZSIgU3RhdGUsIG1lYW4gdG8gTElTVEVOIHN0YXRlICovCisgICAgICAvKiBTbyByZXNldCBTbGF2ZSBCdXN5IHN0YXRlICovCisgICAgICBoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPSBoZm1wc21idXMtPlN0YXRlOworICAgICAgaGZtcHNtYnVzLT5TdGF0ZSAmPSB+KCh1aW50MzJfdClIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCk7CisgICAgICBoZm1wc21idXMtPlN0YXRlICY9IH4oKHVpbnQzMl90KUhBTF9GTVBTTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKTsKKworICAgICAgLyogRGlzYWJsZSBSWC9UWCBJbnRlcnJ1cHRzLCBrZWVwIG9ubHkgQUREUiBJbnRlcnJ1cHQgKi8KKyAgICAgIEZNUFNNQlVTX0Rpc2FibGVfSVJRKGhmbXBzbWJ1cywgRk1QU01CVVNfSVRfUlggfCBGTVBTTUJVU19JVF9UWCk7CisKKyAgICAgIC8qIFNldCBFcnJvckNvZGUgY29ycmVzcG9uZGluZyB0byBhIE5vbi1BY2tub3dsZWRnZSAqLworICAgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX0ZNUFNNQlVTX0VSUk9SX0FDS0Y7CisKKyAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgICAvKiBDYWxsIHRoZSBFcnJvciBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgKi8KKyNpZiAoVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgIGhmbXBzbWJ1cy0+RXJyb3JDYWxsYmFjayhoZm1wc21idXMpOworI2Vsc2UKKyAgICAgIEhBTF9GTVBTTUJVU19FcnJvckNhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoRk1QU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgRk1QU01CVVNfRkxBR19BRERSKSAhPSBSRVNFVCkKKyAgeworICAgIFRyYW5zZmVyRGlyZWN0aW9uID0gKHVpbnQ4X3QpKEZNUFNNQlVTX0dFVF9ESVIoaGZtcHNtYnVzKSk7CisgICAgU2xhdmVBZGRyQ29kZSA9ICh1aW50MTZfdCkoRk1QU01CVVNfR0VUX0FERFJfTUFUQ0goaGZtcHNtYnVzKSk7CisKKyAgICAvKiBEaXNhYmxlIEFERFIgaW50ZXJydXB0IHRvIHByZXZlbnQgbXVsdGlwbGUgQUREUkludGVycnVwdCovCisgICAgLyogT3RoZXIgQUREUkludGVycnVwdCB3aWxsIGJlIHRyZWF0IGluIG5leHQgTGlzdGVuIHVzZWNhc2UgKi8KKyAgICBfX0hBTF9GTVBTTUJVU19ESVNBQkxFX0lUKGhmbXBzbWJ1cywgRk1QU01CVVNfSVRfQUREUkkpOworCisgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgLyogQ2FsbCBTbGF2ZSBBZGRyIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaGZtcHNtYnVzLT5BZGRyQ2FsbGJhY2soaGZtcHNtYnVzLCBUcmFuc2ZlckRpcmVjdGlvbiwgU2xhdmVBZGRyQ29kZSk7CisjZWxzZQorICAgIEhBTF9GTVBTTUJVU19BZGRyQ2FsbGJhY2soaGZtcHNtYnVzLCBUcmFuc2ZlckRpcmVjdGlvbiwgU2xhdmVBZGRyQ29kZSk7CisjZW5kaWYgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgfQorICBlbHNlIGlmICgoRk1QU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgRk1QU01CVVNfRkxBR19SWE5FKSAhPSBSRVNFVCkgfHwgKEZNUFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIEZNUFNNQlVTX0ZMQUdfVENSKSAhPSBSRVNFVCkpCisgIHsKKyAgICBpZiAoKGhmbXBzbWJ1cy0+U3RhdGUgJiBIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpCisgICAgeworICAgICAgLyogUmVhZCBkYXRhIGZyb20gUlhEUiAqLworICAgICAgKmhmbXBzbWJ1cy0+cEJ1ZmZQdHIgPSAodWludDhfdCkoaGZtcHNtYnVzLT5JbnN0YW5jZS0+UlhEUik7CisKKyAgICAgIC8qIEluY3JlbWVudCBCdWZmZXIgcG9pbnRlciAqLworICAgICAgaGZtcHNtYnVzLT5wQnVmZlB0cisrOworCisgICAgICBoZm1wc21idXMtPlhmZXJTaXplLS07CisgICAgICBoZm1wc21idXMtPlhmZXJDb3VudC0tOworCisgICAgICBpZiAoaGZtcHNtYnVzLT5YZmVyQ291bnQgPT0gMVUpCisgICAgICB7CisgICAgICAgIC8qIFJlY2VpdmUgbGFzdCBCeXRlLCBjYW4gYmUgUEVDIGJ5dGUgaW4gY2FzZSBvZiBQRUMgQllURSBlbmFibGVkICovCisgICAgICAgIC8qIG9yIG9ubHkgdGhlIGxhc3QgQnl0ZSBvZiBUcmFuc2ZlciAqLworICAgICAgICAvKiBTbyByZXNldCB0aGUgUkVMT0FEIGJpdCBtb2RlICovCisgICAgICAgIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgJj0gfkZNUFNNQlVTX1JFTE9BRF9NT0RFOworICAgICAgICBGTVBTTUJVU19UcmFuc2ZlckNvbmZpZyhoZm1wc21idXMsIDAsIDEsIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMsIEZNUFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChoZm1wc21idXMtPlhmZXJDb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogTGFzdCBCeXRlIGlzIHJlY2VpdmVkLCBkaXNhYmxlIEludGVycnVwdCAqLworICAgICAgICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX1JYKTsKKworICAgICAgICAvKiBSZW1vdmUgSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgsIGtlZXAgb25seSBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOICovCisgICAgICAgIGhmbXBzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhmbXBzbWJ1cy0+U3RhdGU7CisgICAgICAgIGhmbXBzbWJ1cy0+U3RhdGUgJj0gfigodWludDMyX3QpSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfUlgpOworCisgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICAgICAgLyogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgRW5kIG9mIFRyYW5zZmVyICovCisjaWYgKFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGhmbXBzbWJ1cy0+U2xhdmVSeENwbHRDYWxsYmFjayhoZm1wc21idXMpOworI2Vsc2UKKyAgICAgICAgSEFMX0ZNUFNNQlVTX1NsYXZlUnhDcGx0Q2FsbGJhY2soaGZtcHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBTZXQgUmVsb2FkIGZvciBuZXh0IEJ5dGVzICovCisgICAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgMCwgMSwgRk1QU01CVVNfUkVMT0FEX01PREUgIHwgKGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgJiBGTVBTTUJVU19TRU5EUEVDX01PREUpLCBGTVBTTUJVU19OT19TVEFSVFNUT1ApOworCisgICAgICAgIC8qIEFjayBsYXN0IEJ5dGUgUmVhZCAqLworICAgICAgICBoZm1wc21idXMtPkluc3RhbmNlLT5DUjIgJj0gfkZNUEkyQ19DUjJfTkFDSzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGhmbXBzbWJ1cy0+U3RhdGUgJiBIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpCisgICAgeworICAgICAgaWYgKChoZm1wc21idXMtPlhmZXJDb3VudCAhPSAwVSkgJiYgKGhmbXBzbWJ1cy0+WGZlclNpemUgPT0gMFUpKQorICAgICAgeworICAgICAgICBpZiAoaGZtcHNtYnVzLT5YZmVyQ291bnQgPiBNQVhfTkJZVEVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKGhmbXBzbWJ1cywgMCwgTUFYX05CWVRFX1NJWkUsIChGTVBTTUJVU19SRUxPQURfTU9ERSB8IChoZm1wc21idXMtPlhmZXJPcHRpb25zICYgRk1QU01CVVNfU0VORFBFQ19NT0RFKSksIEZNUFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICAgICAgaGZtcHNtYnVzLT5YZmVyU2l6ZSA9IE1BWF9OQllURV9TSVpFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGhmbXBzbWJ1cy0+WGZlclNpemUgPSBoZm1wc21idXMtPlhmZXJDb3VudDsKKyAgICAgICAgICBGTVBTTUJVU19UcmFuc2ZlckNvbmZpZyhoZm1wc21idXMsIDAsICh1aW50OF90KWhmbXBzbWJ1cy0+WGZlclNpemUsIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMsIEZNUFNNQlVTX05PX1NUQVJUU1RPUCk7CisgICAgICAgICAgLyogSWYgUEVDIG1vZGUgaXMgZW5hYmxlLCBzaXplIHRvIHRyYW5zbWl0IHNob3VsZCBiZSBTaXplLTEgYnl0ZSwgY29ycmVzcG9uZGluZyB0byBQRUMgYnl0ZSAqLworICAgICAgICAgIC8qIFBFQyBieXRlIGlzIGF1dG9tYXRpY2FsbHkgc2VudCBieSBIVyBibG9jaywgbm8gbmVlZCB0byBtYW5hZ2UgaXQgaW4gVHJhbnNtaXQgcHJvY2VzcyAqLworICAgICAgICAgIGlmIChGTVBTTUJVU19HRVRfUEVDX01PREUoaGZtcHNtYnVzKSAhPSAwVUwpCisgICAgICAgICAgeworICAgICAgICAgICAgaGZtcHNtYnVzLT5YZmVyU2l6ZS0tOworICAgICAgICAgICAgaGZtcHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoRk1QU01CVVNfQ0hFQ0tfRkxBRyhTdGF0dXNGbGFncywgRk1QU01CVVNfRkxBR19UWElTKSAhPSBSRVNFVCkKKyAgeworICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiBvbmx5IGlmIFhmZXJDb3VudCBub3QgcmVhY2ggIjAiICovCisgICAgLyogQSBUWElTIGZsYWcgY2FuIGJlIHNldCwgZHVyaW5nIFNUT1AgdHJlYXRtZW50ICAgICAgKi8KKyAgICAvKiBDaGVjayBpZiBhbGwgRGF0YSBoYXZlIGFscmVhZHkgYmVlbiBzZW50ICovCisgICAgLyogSWYgaXQgaXMgdGhlIGNhc2UsIHRoaXMgbGFzdCB3cml0ZSBpbiBUWERSIGlzIG5vdCBzZW50LCBjb3JyZXNwb25kIHRvIGEgZHVtbXkgVFhJUyBldmVudCAqLworICAgIGlmIChoZm1wc21idXMtPlhmZXJDb3VudCA+IDBVKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIGRhdGEgdG8gVFhEUiAqLworICAgICAgaGZtcHNtYnVzLT5JbnN0YW5jZS0+VFhEUiA9ICpoZm1wc21idXMtPnBCdWZmUHRyOworCisgICAgICAvKiBJbmNyZW1lbnQgQnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIGhmbXBzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgICAgaGZtcHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgIGhmbXBzbWJ1cy0+WGZlclNpemUtLTsKKyAgICB9CisKKyAgICBpZiAoaGZtcHNtYnVzLT5YZmVyQ291bnQgPT0gMFUpCisgICAgeworICAgICAgLyogTGFzdCBCeXRlIGlzIFRyYW5zbWl0dGVkICovCisgICAgICAvKiBSZW1vdmUgSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgsIGtlZXAgb25seSBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOICovCisgICAgICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX1RYKTsKKyAgICAgIGhmbXBzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhmbXBzbWJ1cy0+U3RhdGU7CisgICAgICBoZm1wc21idXMtPlN0YXRlICY9IH4oKHVpbnQzMl90KUhBTF9GTVBTTUJVU19TVEFURV9TTEFWRV9CVVNZX1RYKTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhmbXBzbWJ1cyk7CisKKyAgICAgIC8qIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgdG8gaW5mb3JtIHVwcGVyIGxheWVyIG9mIEVuZCBvZiBUcmFuc2ZlciAqLworI2lmIChVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGZtcHNtYnVzLT5TbGF2ZVR4Q3BsdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZWxzZQorICAgICAgSEFMX0ZNUFNNQlVTX1NsYXZlVHhDcGx0Q2FsbGJhY2soaGZtcHNtYnVzKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KKworICAvKiBDaGVjayBpZiBTVE9QRiBpcyBzZXQgKi8KKyAgaWYgKEZNUFNNQlVTX0NIRUNLX0ZMQUcoU3RhdHVzRmxhZ3MsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpICE9IFJFU0VUKQorICB7CisgICAgaWYgKChoZm1wc21idXMtPlN0YXRlICYgSEFMX0ZNUFNNQlVTX1NUQVRFX0xJU1RFTikgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBTdG9yZSBMYXN0IHJlY2VpdmUgZGF0YSBpZiBhbnkgKi8KKyAgICAgIGlmIChfX0hBTF9GTVBTTUJVU19HRVRfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfUlhORSkgIT0gUkVTRVQpCisgICAgICB7CisgICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KKyAgICAgICAgKmhmbXBzbWJ1cy0+cEJ1ZmZQdHIgPSAodWludDhfdCkoaGZtcHNtYnVzLT5JbnN0YW5jZS0+UlhEUik7CisKKyAgICAgICAgLyogSW5jcmVtZW50IEJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGhmbXBzbWJ1cy0+cEJ1ZmZQdHIrKzsKKworICAgICAgICBpZiAoKGhmbXBzbWJ1cy0+WGZlclNpemUgPiAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICBoZm1wc21idXMtPlhmZXJTaXplLS07CisgICAgICAgICAgaGZtcHNtYnVzLT5YZmVyQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBEaXNhYmxlIFJYIGFuZCBUWCBJbnRlcnJ1cHRzICovCisgICAgICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX1JYIHwgRk1QU01CVVNfSVRfVFgpOworCisgICAgICAvKiBEaXNhYmxlIEFERFIgSW50ZXJydXB0ICovCisgICAgICBGTVBTTUJVU19EaXNhYmxlX0lSUShoZm1wc21idXMsIEZNUFNNQlVTX0lUX0FERFIpOworCisgICAgICAvKiBEaXNhYmxlIEFkZHJlc3MgQWNrbm93bGVkZ2UgKi8KKyAgICAgIGhmbXBzbWJ1cy0+SW5zdGFuY2UtPkNSMiB8PSBGTVBJMkNfQ1IyX05BQ0s7CisKKyAgICAgIC8qIENsZWFyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworICAgICAgRk1QU01CVVNfUkVTRVRfQ1IyKGhmbXBzbWJ1cyk7CisKKyAgICAgIC8qIENsZWFyIFNUT1AgRmxhZyAqLworICAgICAgX19IQUxfRk1QU01CVVNfQ0xFQVJfRkxBRyhoZm1wc21idXMsIEZNUFNNQlVTX0ZMQUdfU1RPUEYpOworCisgICAgICAvKiBDbGVhciBBRERSIGZsYWcgKi8KKyAgICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FERFIpOworCisgICAgICBoZm1wc21idXMtPlhmZXJPcHRpb25zID0gMDsKKyAgICAgIGhmbXBzbWJ1cy0+UHJldmlvdXNTdGF0ZSA9IGhmbXBzbWJ1cy0+U3RhdGU7CisgICAgICBoZm1wc21idXMtPlN0YXRlID0gSEFMX0ZNUFNNQlVTX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGZtcHNtYnVzKTsKKworICAgICAgLyogQ2FsbCB0aGUgTGlzdGVuIENvbXBsZXRlIGNhbGxiYWNrLCB0byBpbmZvcm0gdXBwZXIgbGF5ZXIgb2YgdGhlIGVuZCBvZiBMaXN0ZW4gdXNlY2FzZSAqLworI2lmIChVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgaGZtcHNtYnVzLT5MaXN0ZW5DcGx0Q2FsbGJhY2soaGZtcHNtYnVzKTsKKyNlbHNlCisgICAgICBIQUxfRk1QU01CVVNfTGlzdGVuQ3BsdENhbGxiYWNrKGhmbXBzbWJ1cyk7CisjZW5kaWYgLyogVVNFX0hBTF9GTVBTTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgIH0KKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgIHJldHVybiBIQUxfT0s7Cit9CisvKioKKyAgKiBAYnJpZWYgIE1hbmFnZSB0aGUgZW5hYmxpbmcgb2YgSW50ZXJydXB0cy4KKyAgKiBAcGFyYW0gIGhmbXBzbWJ1cyBQb2ludGVyIHRvIGEgRk1QU01CVVNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEZNUFNNQlVTLgorICAqIEBwYXJhbSAgSW50ZXJydXB0UmVxdWVzdCBWYWx1ZSBvZiBAcmVmIEZNUFNNQlVTX0ludGVycnVwdF9jb25maWd1cmF0aW9uX2RlZmluaXRpb24uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgdm9pZCBGTVBTTUJVU19FbmFibGVfSVJRKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdCkKK3sKKyAgdWludDMyX3QgdG1waXNyID0gMFVMOworCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEZNUFNNQlVTX0lUX0FMRVJUKSA9PSBGTVBTTUJVU19JVF9BTEVSVCkKKyAgeworICAgIC8qIEVuYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IEZNUFNNQlVTX0lUX0VSUkk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBGTVBTTUJVU19JVF9BRERSKSA9PSBGTVBTTUJVU19JVF9BRERSKQorICB7CisgICAgLyogRW5hYmxlIEFERFIsIFNUT1AgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IEZNUFNNQlVTX0lUX0FERFJJIHwgRk1QU01CVVNfSVRfU1RPUEkgfCBGTVBTTUJVU19JVF9OQUNLSSB8IEZNUFNNQlVTX0lUX0VSUkk7CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBGTVBTTUJVU19JVF9UWCkgPT0gRk1QU01CVVNfSVRfVFgpCisgIHsKKyAgICAvKiBFbmFibGUgRVJSLCBUQywgU1RPUCwgTkFDSywgUlhJIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBGTVBTTUJVU19JVF9FUlJJIHwgRk1QU01CVVNfSVRfVENJIHwgRk1QU01CVVNfSVRfU1RPUEkgfCBGTVBTTUJVU19JVF9OQUNLSSB8IEZNUFNNQlVTX0lUX1RYSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEZNUFNNQlVTX0lUX1JYKSA9PSBGTVBTTUJVU19JVF9SWCkKKyAgeworICAgIC8qIEVuYWJsZSBFUlIsIFRDLCBTVE9QLCBOQUNLLCBUWEkgaW50ZXJydXB0ICovCisgICAgdG1waXNyIHw9IEZNUFNNQlVTX0lUX0VSUkkgfCBGTVBTTUJVU19JVF9UQ0kgfCBGTVBTTUJVU19JVF9TVE9QSSB8IEZNUFNNQlVTX0lUX05BQ0tJIHwgRk1QU01CVVNfSVRfUlhJOworICB9CisKKyAgLyogRW5hYmxlIGludGVycnVwdHMgb25seSBhdCB0aGUgZW5kICovCisgIC8qIHRvIGF2b2lkIHRoZSByaXNrIG9mIEZNUFNNQlVTIGludGVycnVwdCBoYW5kbGUgZXhlY3V0aW9uIGJlZm9yZSAqLworICAvKiBhbGwgaW50ZXJydXB0cyByZXF1ZXN0ZWQgZG9uZSAqLworICBfX0hBTF9GTVBTTUJVU19FTkFCTEVfSVQoaGZtcHNtYnVzLCB0bXBpc3IpOworfQorLyoqCisgICogQGJyaWVmICBNYW5hZ2UgdGhlIGRpc2FibGluZyBvZiBJbnRlcnJ1cHRzLgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHBhcmFtICBJbnRlcnJ1cHRSZXF1ZXN0IFZhbHVlIG9mIEByZWYgRk1QU01CVVNfSW50ZXJydXB0X2NvbmZpZ3VyYXRpb25fZGVmaW5pdGlvbi4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK3N0YXRpYyB2b2lkIEZNUFNNQlVTX0Rpc2FibGVfSVJRKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgdWludDMyX3QgSW50ZXJydXB0UmVxdWVzdCkKK3sKKyAgdWludDMyX3QgdG1waXNyID0gMFVMOworICB1aW50MzJfdCB0bXBzdGF0ZSA9IGhmbXBzbWJ1cy0+U3RhdGU7CisKKyAgaWYgKCh0bXBzdGF0ZSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFkpICYmICgoSW50ZXJydXB0UmVxdWVzdCAmIEZNUFNNQlVTX0lUX0FMRVJUKSA9PSBGTVBTTUJVU19JVF9BTEVSVCkpCisgIHsKKyAgICAvKiBEaXNhYmxlIEVSUiBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gRk1QU01CVVNfSVRfRVJSSTsKKyAgfQorCisgIGlmICgoSW50ZXJydXB0UmVxdWVzdCAmIEZNUFNNQlVTX0lUX1RYKSA9PSBGTVBTTUJVU19JVF9UWCkKKyAgeworICAgIC8qIERpc2FibGUgVEMsIFNUT1AsIE5BQ0sgYW5kIFRYSSBpbnRlcnJ1cHQgKi8KKyAgICB0bXBpc3IgfD0gRk1QU01CVVNfSVRfVENJIHwgRk1QU01CVVNfSVRfVFhJOworCisgICAgaWYgKChGTVBTTUJVU19HRVRfQUxFUlRfRU5BQkxFRChoZm1wc21idXMpID09IDBVTCkKKyAgICAgICAgJiYgKCh0bXBzdGF0ZSAmIEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4pICE9IEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4pKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgRVJSIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IEZNUFNNQlVTX0lUX0VSUkk7CisgICAgfQorCisgICAgaWYgKCh0bXBzdGF0ZSAmIEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4pICE9IEhBTF9GTVBTTUJVU19TVEFURV9MSVNURU4pCisgICAgeworICAgICAgLyogRGlzYWJsZSBTVE9QIGFuZCBOQUNLIGludGVycnVwdCAqLworICAgICAgdG1waXNyIHw9IEZNUFNNQlVTX0lUX1NUT1BJIHwgRk1QU01CVVNfSVRfTkFDS0k7CisgICAgfQorICB9CisKKyAgaWYgKChJbnRlcnJ1cHRSZXF1ZXN0ICYgRk1QU01CVVNfSVRfUlgpID09IEZNUFNNQlVTX0lUX1JYKQorICB7CisgICAgLyogRGlzYWJsZSBUQywgU1RPUCwgTkFDSyBhbmQgUlhJIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBGTVBTTUJVU19JVF9UQ0kgfCBGTVBTTUJVU19JVF9SWEk7CisKKyAgICBpZiAoKEZNUFNNQlVTX0dFVF9BTEVSVF9FTkFCTEVEKGhmbXBzbWJ1cykgPT0gMFVMKQorICAgICAgICAmJiAoKHRtcHN0YXRlICYgSEFMX0ZNUFNNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX0ZNUFNNQlVTX1NUQVRFX0xJU1RFTikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gRk1QU01CVVNfSVRfRVJSSTsKKyAgICB9CisKKyAgICBpZiAoKHRtcHN0YXRlICYgSEFMX0ZNUFNNQlVTX1NUQVRFX0xJU1RFTikgIT0gSEFMX0ZNUFNNQlVTX1NUQVRFX0xJU1RFTikKKyAgICB7CisgICAgICAvKiBEaXNhYmxlIFNUT1AgYW5kIE5BQ0sgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gRk1QU01CVVNfSVRfU1RPUEkgfCBGTVBTTUJVU19JVF9OQUNLSTsKKyAgICB9CisgIH0KKworICBpZiAoKEludGVycnVwdFJlcXVlc3QgJiBGTVBTTUJVU19JVF9BRERSKSA9PSBGTVBTTUJVU19JVF9BRERSKQorICB7CisgICAgLyogRGlzYWJsZSBBRERSLCBTVE9QIGFuZCBOQUNLIGludGVycnVwdCAqLworICAgIHRtcGlzciB8PSBGTVBTTUJVU19JVF9BRERSSSB8IEZNUFNNQlVTX0lUX1NUT1BJIHwgRk1QU01CVVNfSVRfTkFDS0k7CisKKyAgICBpZiAoRk1QU01CVVNfR0VUX0FMRVJUX0VOQUJMRUQoaGZtcHNtYnVzKSA9PSAwVUwpCisgICAgeworICAgICAgLyogRGlzYWJsZSBFUlIgaW50ZXJydXB0ICovCisgICAgICB0bXBpc3IgfD0gRk1QU01CVVNfSVRfRVJSSTsKKyAgICB9CisgIH0KKworICAvKiBEaXNhYmxlIGludGVycnVwdHMgb25seSBhdCB0aGUgZW5kICovCisgIC8qIHRvIGF2b2lkIGEgYnJlYWtpbmcgc2l0dWF0aW9uIGxpa2UgYXQgInQiIHRpbWUgKi8KKyAgLyogYWxsIGRpc2FibGUgaW50ZXJydXB0cyByZXF1ZXN0IGFyZSBub3QgZG9uZSAqLworICBfX0hBTF9GTVBTTUJVU19ESVNBQkxFX0lUKGhmbXBzbWJ1cywgdG1waXNyKTsKK30KKworLyoqCisgICogQGJyaWVmICBGTVBTTUJVUyBpbnRlcnJ1cHRzIGVycm9yIGhhbmRsZXIuCisgICogQHBhcmFtICBoZm1wc21idXMgRk1QU01CVVMgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgRk1QU01CVVNfSVRFcnJvckhhbmRsZXIoc3RydWN0IF9fRk1QU01CVVNfSGFuZGxlVHlwZURlZiAqaGZtcHNtYnVzKQoreworICB1aW50MzJfdCBpdGZsYWdzICAgPSBSRUFEX1JFRyhoZm1wc21idXMtPkluc3RhbmNlLT5JU1IpOworICB1aW50MzJfdCBpdHNvdXJjZXMgPSBSRUFEX1JFRyhoZm1wc21idXMtPkluc3RhbmNlLT5DUjEpOworICB1aW50MzJfdCB0bXBzdGF0ZTsKKyAgdWludDMyX3QgdG1wZXJyb3I7CisKKyAgLyogRk1QU01CVVMgQnVzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgRk1QU01CVVNfRkxBR19CRVJSKSA9PSBGTVBTTUJVU19GTEFHX0JFUlIpICYmICgoaXRzb3VyY2VzICYgRk1QU01CVVNfSVRfRVJSSSkgPT0gRk1QU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfQkVSUjsKKworICAgIC8qIENsZWFyIEJFUlIgZmxhZyAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0JFUlIpOworICB9CisKKyAgLyogRk1QU01CVVMgT3Zlci1SdW4vVW5kZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIEZNUFNNQlVTX0ZMQUdfT1ZSKSA9PSBGTVBTTUJVU19GTEFHX09WUikgJiYgKChpdHNvdXJjZXMgJiBGTVBTTUJVU19JVF9FUlJJKSA9PSBGTVBTTUJVU19JVF9FUlJJKSkKKyAgeworICAgIGhmbXBzbWJ1cy0+RXJyb3JDb2RlIHw9IEhBTF9GTVBTTUJVU19FUlJPUl9PVlI7CisKKyAgICAvKiBDbGVhciBPVlIgZmxhZyAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX09WUik7CisgIH0KKworICAvKiBGTVBTTUJVUyBBcmJpdHJhdGlvbiBMb3NzIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICBpZiAoKChpdGZsYWdzICYgRk1QU01CVVNfRkxBR19BUkxPKSA9PSBGTVBTTUJVU19GTEFHX0FSTE8pICYmICgoaXRzb3VyY2VzICYgRk1QU01CVVNfSVRfRVJSSSkgPT0gRk1QU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfQVJMTzsKKworICAgIC8qIENsZWFyIEFSTE8gZmxhZyAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FSTE8pOworICB9CisKKyAgLyogRk1QU01CVVMgVGltZW91dCBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgaWYgKCgoaXRmbGFncyAmIEZNUFNNQlVTX0ZMQUdfVElNRU9VVCkgPT0gRk1QU01CVVNfRkxBR19USU1FT1VUKSAmJiAoKGl0c291cmNlcyAmIEZNUFNNQlVTX0lUX0VSUkkpID09IEZNUFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX0ZNUFNNQlVTX0VSUk9SX0JVU1RJTUVPVVQ7CisKKyAgICAvKiBDbGVhciBUSU1FT1VUIGZsYWcgKi8KKyAgICBfX0hBTF9GTVBTTUJVU19DTEVBUl9GTEFHKGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19USU1FT1VUKTsKKyAgfQorCisgIC8qIEZNUFNNQlVTIEFsZXJ0IGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBGTVBTTUJVU19GTEFHX0FMRVJUKSA9PSBGTVBTTUJVU19GTEFHX0FMRVJUKSAmJiAoKGl0c291cmNlcyAmIEZNUFNNQlVTX0lUX0VSUkkpID09IEZNUFNNQlVTX0lUX0VSUkkpKQorICB7CisgICAgaGZtcHNtYnVzLT5FcnJvckNvZGUgfD0gSEFMX0ZNUFNNQlVTX0VSUk9SX0FMRVJUOworCisgICAgLyogQ2xlYXIgQUxFUlQgZmxhZyAqLworICAgIF9fSEFMX0ZNUFNNQlVTX0NMRUFSX0ZMQUcoaGZtcHNtYnVzLCBGTVBTTUJVU19GTEFHX0FMRVJUKTsKKyAgfQorCisgIC8qIEZNUFNNQlVTIFBhY2tldCBFcnJvciBDaGVjayBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGl0ZmxhZ3MgJiBGTVBTTUJVU19GTEFHX1BFQ0VSUikgPT0gRk1QU01CVVNfRkxBR19QRUNFUlIpICYmICgoaXRzb3VyY2VzICYgRk1QU01CVVNfSVRfRVJSSSkgPT0gRk1QU01CVVNfSVRfRVJSSSkpCisgIHsKKyAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfUEVDRVJSOworCisgICAgLyogQ2xlYXIgUEVDIGVycm9yIGZsYWcgKi8KKyAgICBfX0hBTF9GTVBTTUJVU19DTEVBUl9GTEFHKGhmbXBzbWJ1cywgRk1QU01CVVNfRkxBR19QRUNFUlIpOworICB9CisKKyAgLyogU3RvcmUgY3VycmVudCB2b2xhdGlsZSBoZm1wc21idXMtPlN0YXRlLCBtaXNyYSBydWxlICovCisgIHRtcGVycm9yID0gaGZtcHNtYnVzLT5FcnJvckNvZGU7CisKKyAgLyogQ2FsbCB0aGUgRXJyb3IgQ2FsbGJhY2sgaW4gY2FzZSBvZiBFcnJvciBkZXRlY3RlZCAqLworICBpZiAoKHRtcGVycm9yICE9IEhBTF9GTVBTTUJVU19FUlJPUl9OT05FKSAmJiAodG1wZXJyb3IgIT0gSEFMX0ZNUFNNQlVTX0VSUk9SX0FDS0YpKQorICB7CisgICAgLyogRG8gbm90IFJlc2V0IHRoZSBIQUwgc3RhdGUgaW4gY2FzZSBvZiBBTEVSVCBlcnJvciAqLworICAgIGlmICgodG1wZXJyb3IgJiBIQUxfRk1QU01CVVNfRVJST1JfQUxFUlQpICE9IEhBTF9GTVBTTUJVU19FUlJPUl9BTEVSVCkKKyAgICB7CisgICAgICAvKiBTdG9yZSBjdXJyZW50IHZvbGF0aWxlIGhmbXBzbWJ1cy0+U3RhdGUsIG1pc3JhIHJ1bGUgKi8KKyAgICAgIHRtcHN0YXRlID0gaGZtcHNtYnVzLT5TdGF0ZTsKKworICAgICAgaWYgKCgodG1wc3RhdGUgJiBIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9UWCkgPT0gSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfVFgpCisgICAgICAgICAgfHwgKCh0bXBzdGF0ZSAmIEhBTF9GTVBTTUJVU19TVEFURV9TTEFWRV9CVVNZX1JYKSA9PSBIQUxfRk1QU01CVVNfU1RBVEVfU0xBVkVfQlVTWV9SWCkpCisgICAgICB7CisgICAgICAgIC8qIFJlc2V0IG9ubHkgSEFMX0ZNUFNNQlVTX1NUQVRFX1NMQVZFX0JVU1lfWFggKi8KKyAgICAgICAgLyoga2VlcCBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOIGlmIHNldCAqLworICAgICAgICBoZm1wc21idXMtPlByZXZpb3VzU3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfUkVBRFk7CisgICAgICAgIGhmbXBzbWJ1cy0+U3RhdGUgPSBIQUxfRk1QU01CVVNfU1RBVEVfTElTVEVOOworICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGwgdGhlIEVycm9yIGNhbGxiYWNrIHRvIGluZm9ybSB1cHBlciBsYXllciAqLworI2lmIChVU0VfSEFMX0ZNUFNNQlVTX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIGhmbXBzbWJ1cy0+RXJyb3JDYWxsYmFjayhoZm1wc21idXMpOworI2Vsc2UKKyAgICBIQUxfRk1QU01CVVNfRXJyb3JDYWxsYmFjayhoZm1wc21idXMpOworI2VuZGlmIC8qIFVTRV9IQUxfRk1QU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgRk1QU01CVVMgQ29tbXVuaWNhdGlvbiBUaW1lb3V0LgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIFBvaW50ZXIgdG8gYSBGTVBTTUJVU19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgRk1QU01CVVMuCisgICogQHBhcmFtICBGbGFnIFNwZWNpZmllcyB0aGUgRk1QU01CVVMgZmxhZyB0byBjaGVjay4KKyAgKiBAcGFyYW0gIFN0YXR1cyBUaGUgbmV3IEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgRk1QU01CVVNfV2FpdE9uRmxhZ1VudGlsVGltZW91dChzdHJ1Y3QgX19GTVBTTUJVU19IYW5kbGVUeXBlRGVmICpoZm1wc21idXMsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaW1lb3V0KQoreworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCisgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KKyAgd2hpbGUgKChGbGFnU3RhdHVzKShfX0hBTF9GTVBTTUJVU19HRVRfRkxBRyhoZm1wc21idXMsIEZsYWcpKSA9PSBTdGF0dXMpCisgIHsKKyAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIHsKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFVMKSkKKyAgICAgIHsKKyAgICAgICAgaGZtcHNtYnVzLT5QcmV2aW91c1N0YXRlID0gaGZtcHNtYnVzLT5TdGF0ZTsKKyAgICAgICAgaGZtcHNtYnVzLT5TdGF0ZSA9IEhBTF9GTVBTTUJVU19TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBVcGRhdGUgRk1QU01CVVMgZXJyb3IgY29kZSAqLworICAgICAgICBoZm1wc21idXMtPkVycm9yQ29kZSB8PSBIQUxfRk1QU01CVVNfRVJST1JfSEFMVElNRU9VVDsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoZm1wc21idXMpOworCisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBIYW5kbGUgRk1QU01CVVN4IGNvbW11bmljYXRpb24gd2hlbiBzdGFydGluZyB0cmFuc2ZlciBvciBkdXJpbmcgdHJhbnNmZXIgKFRDIG9yIFRDUiBmbGFnIGFyZSBzZXQpLgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIEZNUFNNQlVTIGhhbmRsZS4KKyAgKiBAcGFyYW0gIERldkFkZHJlc3Mgc3BlY2lmaWVzIHRoZSBzbGF2ZSBhZGRyZXNzIHRvIGJlIHByb2dyYW1tZWQuCisgICogQHBhcmFtICBTaXplIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2dyYW1tZWQuCisgICogICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuCisgICogQHBhcmFtICBNb2RlIE5ldyBzdGF0ZSBvZiB0aGUgRk1QU01CVVMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgRk1QU01CVVNfUkVMT0FEX01PREUgRW5hYmxlIFJlbG9hZCBtb2RlLgorICAqICAgICBAYXJnIEByZWYgRk1QU01CVVNfQVVUT0VORF9NT0RFIEVuYWJsZSBBdXRvbWF0aWMgZW5kIG1vZGUuCisgICogICAgIEBhcmcgQHJlZiBGTVBTTUJVU19TT0ZURU5EX01PREUgRW5hYmxlIFNvZnR3YXJlIGVuZCBtb2RlIGFuZCBSZWxvYWQgbW9kZS4KKyAgKiAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX1NFTkRQRUNfTU9ERSBFbmFibGUgUGFja2V0IEVycm9yIENhbGN1bGF0aW9uIG1vZGUuCisgICogQHBhcmFtICBSZXF1ZXN0IE5ldyBzdGF0ZSBvZiB0aGUgRk1QU01CVVMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uCisgICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICBAYXJnIEByZWYgRk1QU01CVVNfTk9fU1RBUlRTVE9QIERvbid0IEdlbmVyYXRlIHN0b3AgYW5kIHN0YXJ0IGNvbmRpdGlvbi4KKyAgKiAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0dFTkVSQVRFX1NUT1AgR2VuZXJhdGUgc3RvcCBjb25kaXRpb24gKFNpemUgc2hvdWxkIGJlIHNldCB0byAwKS4KKyAgKiAgICAgQGFyZyBAcmVmIEZNUFNNQlVTX0dFTkVSQVRFX1NUQVJUX1JFQUQgR2VuZXJhdGUgUmVzdGFydCBmb3IgcmVhZCByZXF1ZXN0LgorICAqICAgICBAYXJnIEByZWYgRk1QU01CVVNfR0VORVJBVEVfU1RBUlRfV1JJVEUgR2VuZXJhdGUgUmVzdGFydCBmb3Igd3JpdGUgcmVxdWVzdC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZNUFNNQlVTX1RyYW5zZmVyQ29uZmlnKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cywgIHVpbnQxNl90IERldkFkZHJlc3MsIHVpbnQ4X3QgU2l6ZSwgdWludDMyX3QgTW9kZSwgdWludDMyX3QgUmVxdWVzdCkKK3sKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX0FMTF9JTlNUQU5DRShoZm1wc21idXMtPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19GTVBTTUJVU19UUkFOU0ZFUl9NT0RFKE1vZGUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUFNNQlVTX1RSQU5TRkVSX1JFUVVFU1QoUmVxdWVzdCkpOworCisgIC8qIHVwZGF0ZSBDUjIgcmVnaXN0ZXIgKi8KKyAgTU9ESUZZX1JFRyhoZm1wc21idXMtPkluc3RhbmNlLT5DUjIsICgoRk1QSTJDX0NSMl9TQUREIHwgRk1QSTJDX0NSMl9OQllURVMgfCBGTVBJMkNfQ1IyX1JFTE9BRCB8IEZNUEkyQ19DUjJfQVVUT0VORCB8IChGTVBJMkNfQ1IyX1JEX1dSTiAmICh1aW50MzJfdCkoUmVxdWVzdCA+PiAoMzFVTCAtIEZNUEkyQ19DUjJfUkRfV1JOX1BvcykpKSB8IEZNUEkyQ19DUjJfU1RBUlQgfCBGTVBJMkNfQ1IyX1NUT1AgIHwgRk1QSTJDX0NSMl9QRUNCWVRFKSksIFwKKyAgICAgICAgICAgICAodWludDMyX3QpKCgodWludDMyX3QpRGV2QWRkcmVzcyAmIEZNUEkyQ19DUjJfU0FERCkgfCAoKCh1aW50MzJfdClTaXplIDw8IEZNUEkyQ19DUjJfTkJZVEVTX1BvcykgJiBGTVBJMkNfQ1IyX05CWVRFUykgfCAodWludDMyX3QpTW9kZSB8ICh1aW50MzJfdClSZXF1ZXN0KSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgQ29udmVydCBGTVBTTUJVU3ggT1RIRVJfeHh4IFhmZXJPcHRpb25zIHRvIGZ1bmN0aW9ubmFsIFhmZXJPcHRpb25zLgorICAqIEBwYXJhbSAgaGZtcHNtYnVzIEZNUFNNQlVTIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIEZNUFNNQlVTX0NvbnZlcnRPdGhlclhmZXJPcHRpb25zKHN0cnVjdCBfX0ZNUFNNQlVTX0hhbmRsZVR5cGVEZWYgKmhmbXBzbWJ1cykKK3sKKyAgLyogaWYgdXNlciBzZXQgWGZlck9wdGlvbnMgdG8gRk1QU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDICAgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIEZNUFNNQlVTX0ZJUlNUX0ZSQU1FICAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgPT0gRk1QU01CVVNfT1RIRVJfRlJBTUVfTk9fUEVDKQorICB7CisgICAgaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyA9IEZNUFNNQlVTX0ZJUlNUX0ZSQU1FOworICB9CisgIC8qIGVsc2UgaWYgdXNlciBzZXQgWGZlck9wdGlvbnMgdG8gRk1QU01CVVNfT1RIRVJfRlJBTUVfV0lUSF9QRUMgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgICAqLworICAvKiBzZXQgWGZlck9wdGlvbnMgdG8gRk1QU01CVVNfRklSU1RfRlJBTUUgfCBGTVBTTUJVU19TRU5EUEVDX01PREUgICovCisgIGVsc2UgaWYgKGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgPT0gRk1QU01CVVNfT1RIRVJfRlJBTUVfV0lUSF9QRUMpCisgIHsKKyAgICBoZm1wc21idXMtPlhmZXJPcHRpb25zID0gRk1QU01CVVNfRklSU1RfRlJBTUUgfCBGTVBTTUJVU19TRU5EUEVDX01PREU7CisgIH0KKyAgLyogZWxzZSBpZiB1c2VyIHNldCBYZmVyT3B0aW9ucyB0byBGTVBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgICAgICAgICAgKi8KKyAgLyogdGhlbiBnZW5lcmF0ZSBhIHN0b3AgY29uZGl0aW9uIGF0IHRoZSBlbmQgb2YgdHJhbnNmZXIgICAgICAgICAgICAgKi8KKyAgLyogc2V0IFhmZXJPcHRpb25zIHRvIEZNUFNNQlVTX0ZJUlNUX0FORF9MQVNUX0ZSQU1FX05PX1BFQyAgICAgICAgICAgICAgKi8KKyAgZWxzZSBpZiAoaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBGTVBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9OT19QRUMpCisgIHsKKyAgICBoZm1wc21idXMtPlhmZXJPcHRpb25zID0gRk1QU01CVVNfRklSU1RfQU5EX0xBU1RfRlJBTUVfTk9fUEVDOworICB9CisgIC8qIGVsc2UgaWYgdXNlciBzZXQgWGZlck9wdGlvbnMgdG8gRk1QU01CVVNfT1RIRVJfQU5EX0xBU1RfRlJBTUVfV0lUSF9QRUMgKi8KKyAgLyogaXQgcmVxdWVzdCBpbXBsaWNpdGx5IHRvIGdlbmVyYXRlIGEgcmVzdGFydCBjb25kaXRpb24gICAgICAgICAgICAgICAqLworICAvKiB0aGVuIGdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gYXQgdGhlIGVuZCBvZiB0cmFuc2ZlciAgICAgICAgICAgICAgICovCisgIC8qIHNldCBYZmVyT3B0aW9ucyB0byBGTVBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQyAgICAgICAgICAgICAgKi8KKyAgZWxzZSBpZiAoaGZtcHNtYnVzLT5YZmVyT3B0aW9ucyA9PSBGTVBTTUJVU19PVEhFUl9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQykKKyAgeworICAgIGhmbXBzbWJ1cy0+WGZlck9wdGlvbnMgPSBGTVBTTUJVU19GSVJTVF9BTkRfTEFTVF9GUkFNRV9XSVRIX1BFQzsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgIH0KK30KKy8qKgorICAqIEB9CisgICovCisKKyNlbmRpZiAvKiBGTVBJMkNfQ1IxX1BFICovCisjZW5kaWYgLyogSEFMX0ZNUFNNQlVTX01PRFVMRV9FTkFCTEVEICovCisvKioKKyAgKiBAfQorICAqLworCisvKioKKyAgKiBAfQorICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjR4eF9oYWxfaGNkLmMgYi9TcmMvc3RtMzJmNHh4X2hhbF9oY2QuYwppbmRleCA2ZDkwZmRjLi4xZTM4NGQ2IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmNHh4X2hhbF9oY2QuYworKysgYi9TcmMvc3RtMzJmNHh4X2hhbF9oY2QuYwpAQCAtMzczLDE0ICszNzMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkb19waW5nKQogewotICBVTlVTRUQoZG9fcGluZyk7Ci0KICAgaGhjZC0+aGNbY2hfbnVtXS5lcF9pc19pbiA9IGRpcmVjdGlvbjsKICAgaGhjZC0+aGNbY2hfbnVtXS5lcF90eXBlICA9IGVwX3R5cGU7CiAKICAgaWYgKHRva2VuID09IDBVKQogICB7CiAgICAgaGhjZC0+aGNbY2hfbnVtXS5kYXRhX3BpZCA9IEhDX1BJRF9TRVRVUDsKKyAgICBoaGNkLT5oY1tjaF9udW1dLmRvX3BpbmcgPSBkb19waW5nOwogICB9CiAgIGVsc2UKICAgewpAQCAtNTM0LDIwICs1MzMsMTkgQEAKICAgICAvKiBIYW5kbGUgSG9zdCBEaXNjb25uZWN0IEludGVycnVwdHMgKi8KICAgICBpZiAoX19IQUxfSENEX0dFVF9GTEFHKGhoY2QsIFVTQl9PVEdfR0lOVFNUU19ESVNDSU5UKSkKICAgICB7CisgICAgICBfX0hBTF9IQ0RfQ0xFQVJfRkxBRyhoaGNkLCBVU0JfT1RHX0dJTlRTVFNfRElTQ0lOVCk7CiAKLSAgICAgIC8qIENsZWFudXAgSFBSVCAqLwotICAgICAgVVNCeF9IUFJUMCAmPSB+KFVTQl9PVEdfSFBSVF9QRU5BIHwgVVNCX09UR19IUFJUX1BDREVUIHwgXAotICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFBSVF9QRU5DSE5HIHwgVVNCX09UR19IUFJUX1BPQ0NITkcpOwotCi0gICAgICAvKiBIYW5kbGUgSG9zdCBQb3J0IERpc2Nvbm5lY3QgSW50ZXJydXB0ICovCisgICAgICBpZiAoKFVTQnhfSFBSVDAgJiBVU0JfT1RHX0hQUlRfUENTVFMpID09IDBVKQorICAgICAgeworICAgICAgICAvKiBIYW5kbGUgSG9zdCBQb3J0IERpc2Nvbm5lY3QgSW50ZXJydXB0ICovCiAjaWYgKFVTRV9IQUxfSENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKLSAgICAgIGhoY2QtPkRpc2Nvbm5lY3RDYWxsYmFjayhoaGNkKTsKKyAgICAgICAgaGhjZC0+RGlzY29ubmVjdENhbGxiYWNrKGhoY2QpOwogI2Vsc2UKLSAgICAgIEhBTF9IQ0RfRGlzY29ubmVjdF9DYWxsYmFjayhoaGNkKTsKKyAgICAgICAgSEFMX0hDRF9EaXNjb25uZWN0X0NhbGxiYWNrKGhoY2QpOwogI2VuZGlmIC8qIFVTRV9IQUxfSENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogCi0gICAgICAodm9pZClVU0JfSW5pdEZTTFNQQ2xrU2VsKGhoY2QtPkluc3RhbmNlLCBIQ0ZHXzQ4X01IWik7Ci0gICAgICBfX0hBTF9IQ0RfQ0xFQVJfRkxBRyhoaGNkLCBVU0JfT1RHX0dJTlRTVFNfRElTQ0lOVCk7CisgICAgICAgICh2b2lkKVVTQl9Jbml0RlNMU1BDbGtTZWwoaGhjZC0+SW5zdGFuY2UsIEhDRkdfNDhfTUhaKTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKiBIYW5kbGUgSG9zdCBQb3J0IEludGVycnVwdHMgKi8KQEAgLTEwMDksNiArMTAwNyw3IEBACiAgIF9fSEFMX0hDRF9FTkFCTEUoaGhjZCk7CiAgICh2b2lkKVVTQl9Ecml2ZVZidXMoaGhjZC0+SW5zdGFuY2UsIDFVKTsKICAgX19IQUxfVU5MT0NLKGhoY2QpOworCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKQEAgLTEwMjMsNiArMTAyMiw3IEBACiAgIF9fSEFMX0xPQ0soaGhjZCk7CiAgICh2b2lkKVVTQl9TdG9wSG9zdChoaGNkLT5JbnN0YW5jZSk7CiAgIF9fSEFMX1VOTE9DSyhoaGNkKTsKKwogICByZXR1cm4gSEFMX09LOwogfQogCkBAIC0xMTcwLDYgKzExNzAsMTMgQEAKICAgICBfX0hBTF9IQ0RfQ0xFQVJfSENfSU5UKGNoX251bSwgVVNCX09UR19IQ0lOVF9BSEJFUlIpOwogICAgIF9fSEFMX0hDRF9VTk1BU0tfSEFMVF9IQ19JTlQoY2hfbnVtKTsKICAgfQorICBlbHNlIGlmICgoVVNCeF9IQyhjaF9udW0pLT5IQ0lOVCAmIFVTQl9PVEdfSENJTlRfQkJFUlIpID09IFVTQl9PVEdfSENJTlRfQkJFUlIpCisgIHsKKyAgICBfX0hBTF9IQ0RfQ0xFQVJfSENfSU5UKGNoX251bSwgVVNCX09UR19IQ0lOVF9CQkVSUik7CisgICAgaGhjZC0+aGNbY2hfbnVtXS5zdGF0ZSA9IEhDX0JCTEVSUjsKKyAgICBfX0hBTF9IQ0RfVU5NQVNLX0hBTFRfSENfSU5UKGNoX251bSk7CisgICAgKHZvaWQpVVNCX0hDX0hhbHQoaGhjZC0+SW5zdGFuY2UsICh1aW50OF90KWNoX251bSk7CisgIH0KICAgZWxzZSBpZiAoKFVTQnhfSEMoY2hfbnVtKS0+SENJTlQgJiBVU0JfT1RHX0hDSU5UX0FDSykgPT0gVVNCX09UR19IQ0lOVF9BQ0spCiAgIHsKICAgICBfX0hBTF9IQ0RfQ0xFQVJfSENfSU5UKGNoX251bSwgVVNCX09UR19IQ0lOVF9BQ0spOwpAQCAtMTIzMSw2ICsxMjM4LDE3IEBACiAgICAgICBIQUxfSENEX0hDX05vdGlmeVVSQkNoYW5nZV9DYWxsYmFjayhoaGNkLCAodWludDhfdCljaF9udW0sIGhoY2QtPmhjW2NoX251bV0udXJiX3N0YXRlKTsKICNlbmRpZiAvKiBVU0VfSEFMX0hDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICB9CisgICAgZWxzZSBpZiAoaGhjZC0+aGNbY2hfbnVtXS5lcF90eXBlID09IEVQX1RZUEVfSVNPQykKKyAgICB7CisgICAgICBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSA9IFVSQl9ET05FOworICAgICAgaGhjZC0+aGNbY2hfbnVtXS50b2dnbGVfaW4gXj0gMVU7CisKKyNpZiAoVVNFX0hBTF9IQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaGhjZC0+SENfTm90aWZ5VVJCQ2hhbmdlQ2FsbGJhY2soaGhjZCwgKHVpbnQ4X3QpY2hfbnVtLCBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSk7CisjZWxzZQorICAgICAgSEFMX0hDRF9IQ19Ob3RpZnlVUkJDaGFuZ2VfQ2FsbGJhY2soaGhjZCwgKHVpbnQ4X3QpY2hfbnVtLCBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSk7CisjZW5kaWYgLyogVVNFX0hBTF9IQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAvKiAuLi4gKi8KQEAgLTEyNzksNiArMTI5NywxMSBAQAogICAgICAgdG1wcmVnIHw9IFVTQl9PVEdfSENDSEFSX0NIRU5BOwogICAgICAgVVNCeF9IQyhjaF9udW0pLT5IQ0NIQVIgPSB0bXByZWc7CiAgICAgfQorICAgIGVsc2UgaWYgKGhoY2QtPmhjW2NoX251bV0uc3RhdGUgPT0gSENfQkJMRVJSKQorICAgIHsKKyAgICAgIGhoY2QtPmhjW2NoX251bV0uRXJyQ250Kys7CisgICAgICBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSA9IFVSQl9FUlJPUjsKKyAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIC8qIC4uLiAqLwpAQCAtMTU1NSw4ICsxNTc4LDYgQEAKICAgewogICAgIGlmICgoaHBydDAgJiBVU0JfT1RHX0hQUlRfUENTVFMpID09IFVTQl9PVEdfSFBSVF9QQ1NUUykKICAgICB7Ci0gICAgICBVU0JfTUFTS19JTlRFUlJVUFQoaGhjZC0+SW5zdGFuY2UsIFVTQl9PVEdfR0lOVFNUU19ESVNDSU5UKTsKLQogI2lmIChVU0VfSEFMX0hDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICBoaGNkLT5Db25uZWN0Q2FsbGJhY2soaGhjZCk7CiAjZWxzZQpAQCAtMTU5MywxMCArMTYxNCw4IEBACiAgICAgICB9CiAjaWYgKFVTRV9IQUxfSENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgIGhoY2QtPlBvcnRFbmFibGVkQ2FsbGJhY2soaGhjZCk7Ci0gICAgICBoaGNkLT5Db25uZWN0Q2FsbGJhY2soaGhjZCk7CiAjZWxzZQogICAgICAgSEFMX0hDRF9Qb3J0RW5hYmxlZF9DYWxsYmFjayhoaGNkKTsKLSAgICAgIEhBTF9IQ0RfQ29ubmVjdF9DYWxsYmFjayhoaGNkKTsKICNlbmRpZiAvKiBVU0VfSEFMX0hDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KIAogICAgIH0KQEAgLTE2MDcsMTIgKzE2MjYsNiBAQAogI2Vsc2UKICAgICAgIEhBTF9IQ0RfUG9ydERpc2FibGVkX0NhbGxiYWNrKGhoY2QpOwogI2VuZGlmIC8qIFVTRV9IQUxfSENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotCi0gICAgICAvKiBDbGVhbnVwIEhQUlQgKi8KLSAgICAgIFVTQnhfSFBSVDAgJj0gfihVU0JfT1RHX0hQUlRfUEVOQSB8IFVTQl9PVEdfSFBSVF9QQ0RFVCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICBVU0JfT1RHX0hQUlRfUEVOQ0hORyB8IFVTQl9PVEdfSFBSVF9QT0NDSE5HKTsKLQotICAgICAgVVNCX1VOTUFTS19JTlRFUlJVUFQoaGhjZC0+SW5zdGFuY2UsIFVTQl9PVEdfR0lOVFNUU19ESVNDSU5UKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjR4eF9oYWxfaTJzLmMgYi9TcmMvc3RtMzJmNHh4X2hhbF9pMnMuYwppbmRleCAyMGEwZTk1Li4zNWUyOWY4IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmNHh4X2hhbF9pMnMuYworKysgYi9TcmMvc3RtMzJmNHh4X2hhbF9pMnMuYwpAQCAtODgsNiArODgsMTAgQEAKICAgICAgKCspIFBhdXNlIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX0kyU19ETUFQYXVzZSgpCiAgICAgICgrKSBSZXN1bWUgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfSTJTX0RNQVJlc3VtZSgpCiAgICAgICgrKSBTdG9wIHRoZSBETUEgVHJhbnNmZXIgdXNpbmcgSEFMX0kyU19ETUFTdG9wKCkKKyAgICAgICAgIEluIFNsYXZlIG1vZGUsIGlmIEhBTF9JMlNfRE1BU3RvcCBpcyB1c2VkIHRvIHN0b3AgdGhlIGNvbW11bmljYXRpb24sIGFuIGVycm9yCisgICAgICAgICBIQUxfSTJTX0VSUk9SX0JVU1lfTElORV9SWCBpcyByYWlzZWQgYXMgdGhlIG1hc3RlciBjb250aW51ZSB0byB0cmFuc21pdCBkYXRhLgorICAgICAgICAgSW4gdGhpcyBjYXNlIF9fSEFMX0kyU19GTFVTSF9SWF9EUiBtYWNybyBtdXN0IGJlIHVzZWQgdG8gZmx1c2ggdGhlIHJlbWFpbmluZyBkYXRhIAorICAgICAgICAgaW5zaWRlIERSIHJlZ2lzdGVyIGFuZCBhdm9pZCB1c2luZyBEZUluaXQvSW5pdCBwcm9jZXNzIGZvciB0aGUgbmV4dCB0cmFuc2Zlci4KIAogICAgKioqIEkyUyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEwMCw2ICsxMDQsNyBAQAogICAgICAgKCspIF9fSEFMX0kyU19ESVNBQkxFX0lUIDogRGlzYWJsZSB0aGUgc3BlY2lmaWVkIEkyUyBpbnRlcnJ1cHRzCiAgICAgICAoKykgX19IQUxfSTJTX0dFVF9GTEFHOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJTIGZsYWcgaXMgc2V0IG9yIG5vdAogCisgICAgICAoKykgX19IQUxfSTJTX0ZMVVNIX1JYX0RSOiBSZWFkIERSIFJlZ2lzdGVyIHRvIEZsdXNoIFJYIERhdGEKICAgICBbLi5dCiAgICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgSTJTIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcwogCkBAIC0xOTQsNiArMTk5LDcgQEAKIAogLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEkyU19USU1FT1VUX0ZMQUcgICAgICAgICAgMTAwVSAgICAgICAgIC8qITwgVGltZW91dCAxMDAgbXMgICAgICAgICAgICAqLwogLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTQ1NCw2ICsxNDYwLDkgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9JMlNfRE1BU3RvcChJMlNfSGFuZGxlVHlwZURlZiAqaGkycykKIHsKKyNpZiBkZWZpbmVkIChTUElfSTJTX0ZVTExEVVBMRVhfU1VQUE9SVCkKKyAgdWludDMyX3QgdGlja3N0YXJ0OworI2VuZGlmIC8qIFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUICovCiAgIEhBTF9TdGF0dXNUeXBlRGVmIGVycm9yY29kZSA9IEhBTF9PSzsKICAgLyogVGhlIExvY2sgaXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgQVBJIHRvIGFsbG93IHRoZSB1c2VyIGFwcGxpY2F0aW9uCiAgICAgIHRvIGNhbGwgdGhlIEhBTCBTUEkgQVBJIHVuZGVyIGNhbGxiYWNrcyBIQUxfSTJTX1R4Q3BsdENhbGxiYWNrKCkgb3IgSEFMX0kyU19SeENwbHRDYWxsYmFjaygpCkBAIC0xNDYxLDQ2ICsxNDcwLDE4MCBAQAogICAgICBhbmQgdGhlIGNvcnJlc3BvbmQgY2FsbCBiYWNrIGlzIGV4ZWN1dGVkIEhBTF9JMlNfVHhDcGx0Q2FsbGJhY2soKSBvciBIQUxfSTJTX1J4Q3BsdENhbGxiYWNrKCkKICAgICAgKi8KIAotICAvKiBEaXNhYmxlIHRoZSBJMlMgVHgvUnggRE1BIHJlcXVlc3RzICovCi0gIENMRUFSX0JJVChoaTJzLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOwotICBDTEVBUl9CSVQoaGkycy0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKLQotICAvKiBBYm9ydCB0aGUgSTJTIERNQSB0eCBTdHJlYW0vQ2hhbm5lbCAqLwotICBpZiAoaGkycy0+aGRtYXR4ICE9IE5VTEwpCisgIGlmICgoaGkycy0+SW5pdC5Nb2RlID09IEkyU19NT0RFX01BU1RFUl9UWCkgfHwgKGhpMnMtPkluaXQuTW9kZSA9PSBJMlNfTU9ERV9TTEFWRV9UWCkpCiAgIHsKLSAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIHR4IFN0cmVhbS9DaGFubmVsICovCi0gICAgaWYgKEhBTF9PSyAhPSBIQUxfRE1BX0Fib3J0KGhpMnMtPmhkbWF0eCkpCisgICAgLyogQWJvcnQgdGhlIEkyUyBETUEgdHggU3RyZWFtL0NoYW5uZWwgKi8KKyAgICBpZiAoaGkycy0+aGRtYXR4ICE9IE5VTEwpCiAgICAgewotICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfRE1BKTsKLSAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICAgIC8qIERpc2FibGUgdGhlIEkyUyBETUEgdHggU3RyZWFtL0NoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hdHgpKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9ETUEpOworICAgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgICB9CiAgICAgfQotICB9CiAKLSAgLyogQWJvcnQgdGhlIEkyUyBETUEgcnggU3RyZWFtL0NoYW5uZWwgKi8KLSAgaWYgKGhpMnMtPmhkbWFyeCAhPSBOVUxMKQotICB7Ci0gICAgLyogRGlzYWJsZSB0aGUgSTJTIERNQSByeCBTdHJlYW0vQ2hhbm5lbCAqLwotICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hcngpKQorICAgIC8qIFdhaXQgdW50aWwgVFhFIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKEkyU19XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhpMnMsIEkyU19GTEFHX1RYRSwgU0VULCBJMlNfVElNRU9VVF9GTEFHKSAhPSBIQUxfT0spCiAgICAgewotICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfRE1BKTsKLSAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVElNRU9VVCk7CisgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgICAgICBlcnJvcmNvZGUgICA9IEhBTF9FUlJPUjsKICAgICB9Ci0gIH0KKworICAgIC8qIFdhaXQgdW50aWwgQlNZIGZsYWcgaXMgUmVzZXQgKi8KKyAgICBpZiAoSTJTX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaGkycywgSTJTX0ZMQUdfQlNZLCBSRVNFVCwgSTJTX1RJTUVPVVRfRkxBRykgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfVElNRU9VVCk7CisgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgICAgICBlcnJvcmNvZGUgICA9IEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0RJU0FCTEUoaGkycyk7CisKKyAgICAvKiBDbGVhciBVRFIgZmxhZyAqLworICAgIF9fSEFMX0kyU19DTEVBUl9VRFJGTEFHKGhpMnMpOworCisgICAgLyogRGlzYWJsZSB0aGUgSTJTIFR4IERNQSByZXF1ZXN0cyAqLworICAgIENMRUFSX0JJVChoaTJzLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4pOworCiAjaWYgZGVmaW5lZCAoU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQpCi0gIC8qIEluIGNhc2Ugb2YgRnVsbC1EdXBsZXgsIGRpc2FibGUgdGhlIEkyU3hFWFQgVHgvUnggRE1BIHJlcXVlc3RzKi8KLSAgaWYgKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9UWF9SWCkKLSAgewotICAgIC8qIERpc2FibGUgdGhlIEkyU3hFWFQgRE1BIHJlcXVlc3RzICovCi0gICAgQ0xFQVJfQklUKEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7Ci0gICAgQ0xFQVJfQklUKEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CiAKLSAgICAvKiBEaXNhYmxlIEkyU2V4dCBwZXJpcGhlcmFsICovCi0gICAgX19IQUxfSTJTRVhUX0RJU0FCTEUoaGkycyk7CisgICAgaWYgKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9UWF9SWCkKKyAgICB7CisgICAgICAvKiBBYm9ydCB0aGUgSTJTIERNQSByeCBTdHJlYW0vQ2hhbm5lbCAqLworICAgICAgaWYgKGhpMnMtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIHJ4IFN0cmVhbS9DaGFubmVsICovCisgICAgICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hcngpKQorICAgICAgICB7CisgICAgICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfRE1BKTsKKyAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBJMlNleHQgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfSTJTRVhUX0RJU0FCTEUoaGkycyk7CisKKyAgICAgIC8qIENsZWFyIE9WUiBmbGFnICovCisgICAgICBfX0hBTF9JMlNFWFRfQ0xFQVJfT1ZSRkxBRyhoaTJzKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgSTJTeEVYVCBETUEgcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKKyAgICAgIGlmIChoaTJzLT5Jbml0Lk1vZGUgPT0gSTJTX01PREVfU0xBVkVfVFgpCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9CVVNZX0xJTkVfUlgpOworCisgICAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKyAgICAgICAgZXJyb3Jjb2RlID0gSEFMX0VSUk9SOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBSZWFkIERSIHRvIEZsdXNoIFJYIERhdGEgKi8KKyAgICAgICAgUkVBRF9SRUcoSTJTeEVYVChoaTJzLT5JbnN0YW5jZSktPkRSKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogU1BJX0kyU19GVUxMRFVQTEVYX1NVUFBPUlQgKi8KICAgfQorCisgIGVsc2UgaWYgKChoaTJzLT5Jbml0Lk1vZGUgPT0gSTJTX01PREVfTUFTVEVSX1JYKSB8fCAoaGkycy0+SW5pdC5Nb2RlID09IEkyU19NT0RFX1NMQVZFX1JYKSkKKyAgeworICAgIC8qIEFib3J0IHRoZSBJMlMgRE1BIHJ4IFN0cmVhbS9DaGFubmVsICovCisgICAgaWYgKGhpMnMtPmhkbWFyeCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIEkyUyBETUEgcnggU3RyZWFtL0NoYW5uZWwgKi8KKyAgICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hcngpKQorICAgICAgeworICAgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9ETUEpOworICAgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgICB9CisgICAgfQorI2lmIGRlZmluZWQgKFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUKQorCisgICAgaWYgKGhpMnMtPlN0YXRlID09IEhBTF9JMlNfU1RBVEVfQlVTWV9UWF9SWCkKKyAgICB7CisgICAgICAvKiBBYm9ydCB0aGUgSTJTIERNQSB0eCBTdHJlYW0vQ2hhbm5lbCAqLworICAgICAgaWYgKGhpMnMtPmhkbWF0eCAhPSBOVUxMKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBJMlMgRE1BIHR4IFN0cmVhbS9DaGFubmVsICovCisgICAgICAgIGlmIChIQUxfT0sgIT0gSEFMX0RNQV9BYm9ydChoaTJzLT5oZG1hdHgpKQorICAgICAgICB7CisgICAgICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfRE1BKTsKKyAgICAgICAgICBlcnJvcmNvZGUgPSBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgICAgLyogV2FpdCB1bnRpbCBUWEUgZmxhZyBpcyBzZXQgKi8KKyAgICAgIHdoaWxlIChfX0hBTF9JMlNFWFRfR0VUX0ZMQUcoaGkycywgSTJTX0ZMQUdfVFhFKSAhPSBTRVQpCisgICAgICB7CisgICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSTJTX1RJTUVPVVRfRkxBRykpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICBTRVRfQklUKGhpMnMtPkVycm9yQ29kZSwgSEFMX0kyU19FUlJPUl9USU1FT1VUKTsKKworICAgICAgICAgIC8qIFNldCB0aGUgSTJTIFN0YXRlIHJlYWR5ICovCisgICAgICAgICAgaGkycy0+U3RhdGUgPSBIQUxfSTJTX1NUQVRFX1JFQURZOworICAgICAgICAgIGVycm9yY29kZSAgID0gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFdhaXQgdW50aWwgQlNZIGZsYWcgaXMgUmVzZXQgKi8KKyAgICAgIHdoaWxlIChfX0hBTF9JMlNFWFRfR0VUX0ZMQUcoaGkycywgSTJTX0ZMQUdfQlNZKSAhPSBSRVNFVCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBJMlNfVElNRU9VVF9GTEFHKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICAgIFNFVF9CSVQoaGkycy0+RXJyb3JDb2RlLCBIQUxfSTJTX0VSUk9SX1RJTUVPVVQpOworCisgICAgICAgICAgLyogU2V0IHRoZSBJMlMgU3RhdGUgcmVhZHkgKi8KKyAgICAgICAgICBoaTJzLT5TdGF0ZSA9IEhBTF9JMlNfU1RBVEVfUkVBRFk7CisgICAgICAgICAgZXJyb3Jjb2RlICAgPSBIQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogRGlzYWJsZSBJMlNleHQgcGVyaXBoZXJhbCAqLworICAgICAgX19IQUxfSTJTRVhUX0RJU0FCTEUoaGkycyk7CisKKyAgICAgIC8qIENsZWFyIFVEUiBmbGFnICovCisgICAgICBfX0hBTF9JMlNFWFRfQ0xFQVJfVURSRkxBRyhoaTJzKTsKKworICAgICAgLyogRGlzYWJsZSB0aGUgSTJTeEVYVCBETUEgcmVxdWVzdCAqLworICAgICAgQ0xFQVJfQklUKEkyU3hFWFQoaGkycy0+SW5zdGFuY2UpLT5DUjIsIFNQSV9DUjJfVFhETUFFTik7CisgICAgfQogI2VuZGlmIC8qIFNQSV9JMlNfRlVMTERVUExFWF9TVVBQT1JUICovCiAKLSAgLyogRGlzYWJsZSBJMlMgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9JMlNfRElTQUJMRShoaTJzKTsKKyAgICAvKiBEaXNhYmxlIEkyUyBwZXJpcGhlcmFsICovCisgICAgX19IQUxfSTJTX0RJU0FCTEUoaGkycyk7CisKKyAgICAvKiBDbGVhciBPVlIgZmxhZyAqLworICAgIF9fSEFMX0kyU19DTEVBUl9PVlJGTEFHKGhpMnMpOworCisgICAgLyogRGlzYWJsZSB0aGUgSTJTIFJ4IERNQSByZXF1ZXN0ICovCisgICAgQ0xFQVJfQklUKGhpMnMtPkluc3RhbmNlLT5DUjIsIFNQSV9DUjJfUlhETUFFTik7CisKKyAgICBpZiAoaGkycy0+SW5pdC5Nb2RlID09IEkyU19NT0RFX1NMQVZFX1JYKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgZXJyb3IgY29kZSAqLworICAgICAgU0VUX0JJVChoaTJzLT5FcnJvckNvZGUsIEhBTF9JMlNfRVJST1JfQlVTWV9MSU5FX1JYKTsKKworICAgICAgLyogU2V0IHRoZSBJMlMgU3RhdGUgcmVhZHkgKi8KKyAgICAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKKyAgICAgIGVycm9yY29kZSA9IEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlYWQgRFIgdG8gRmx1c2ggUlggRGF0YSAqLworICAgICAgUkVBRF9SRUcoKGhpMnMtPkluc3RhbmNlKS0+RFIpOworICAgIH0KKyAgfQogCiAgIGhpMnMtPlN0YXRlID0gSEFMX0kyU19TVEFURV9SRUFEWTsKIApkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjR4eF9oYWxfaTJzX2V4LmMgYi9TcmMvc3RtMzJmNHh4X2hhbF9pMnNfZXguYwppbmRleCAxMWNmYjgyLi43OTFjMjE5IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmNHh4X2hhbF9pMnNfZXguYworKysgYi9TcmMvc3RtMzJmNHh4X2hhbF9pMnNfZXguYwpAQCAtNTIsNiArNTIsMTAgQEAKICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9JMlNfVHhSeENwbHRDYWxsYmFjawogICAgICAoKykgSW4gY2FzZSBvZiB0cmFuc2ZlciBFcnJvciwgSEFMX0kyU19FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCiAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfSTJTX0Vycm9yQ2FsbGJhY2sKKyAgICAgKCspIF9fSEFMX0kyU0VYVF9GTFVTSF9SWF9EUjogSW4gRnVsbC1EdXBsZXggU2xhdmUgbW9kZSwgaWYgSEFMX0kyU19ETUFTdG9wIGlzIHVzZWQgdG8gc3RvcCB0aGUKKyAgICAgICAgIGNvbW11bmljYXRpb24sIGFuIGVycm9yIEhBTF9JMlNfRVJST1JfQlVTWV9MSU5FX1JYIGlzIHJhaXNlZCBhcyB0aGUgbWFzdGVyIGNvbnRpbnVlIHRvIHRyYW5zbWl0IGRhdGEuCisgICAgICAgICBJbiB0aGlzIGNhc2UgX19IQUxfSTJTRVhUX0ZMVVNIX1JYX0RSIG1hY3JvIG11c3QgYmUgdXNlZCB0byBmbHVzaCB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICAgICAgIGluc2lkZSBJMlN4IGFuZCBJMlN4X2V4dCBEUiByZWdpc3RlcnMgYW5kIGF2b2lkIHVzaW5nIERlSW5pdC9Jbml0IHByb2Nlc3MgZm9yIHRoZSBuZXh0IHRyYW5zZmVyLgogICBAZW5kdmVyYmF0aW0KIAogIEFkZGl0aW9uYWwgRmlndXJlOiBUaGUgRXh0ZW5kZWQgYmxvY2sgdXNlcyB0aGUgc2FtZSBjbG9jayBzb3VyY2VzIGFzIGl0cyBtYXN0ZXIuCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmNHh4X2hhbF9wY2QuYyBiL1NyYy9zdG0zMmY0eHhfaGFsX3BjZC5jCmluZGV4IGNjNTA4MWYuLmNkYTk1YmUgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY0eHhfaGFsX3BjZC5jCisrKyBiL1NyYy9zdG0zMmY0eHhfaGFsX3BjZC5jCkBAIC0xMDU4LDYgKzEwNTgsMzggQEAKICAgICAgIF9fSEFMX1BDRF9DTEVBUl9GTEFHKGhwY2QsIFVTQl9PVEdfR0lOVFNUU19NTUlTKTsKICAgICB9CiAKKyAgICAgLyogSGFuZGxlIFJ4UUxldmVsIEludGVycnVwdCAqLworICAgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX09UR19HSU5UU1RTX1JYRkxWTCkpCisgICAgeworICAgICAgVVNCX01BU0tfSU5URVJSVVBUKGhwY2QtPkluc3RhbmNlLCBVU0JfT1RHX0dJTlRTVFNfUlhGTFZMKTsKKworICAgICAgdGVtcCA9IFVTQngtPkdSWFNUU1A7CisKKyAgICAgIGVwID0gJmhwY2QtPk9VVF9lcFt0ZW1wICYgVVNCX09UR19HUlhTVFNQX0VQTlVNXTsKKworICAgICAgaWYgKCgodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9QS1RTVFMpID4+IDE3KSA9PSAgU1RTX0RBVEFfVVBEVCkKKyAgICAgIHsKKyAgICAgICAgaWYgKCh0ZW1wICYgVVNCX09UR19HUlhTVFNQX0JDTlQpICE9IDBVKQorICAgICAgICB7CisgICAgICAgICAgKHZvaWQpVVNCX1JlYWRQYWNrZXQoVVNCeCwgZXAtPnhmZXJfYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKCh0ZW1wICYgVVNCX09UR19HUlhTVFNQX0JDTlQpID4+IDQpKTsKKworICAgICAgICAgIGVwLT54ZmVyX2J1ZmYgKz0gKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfQkNOVCkgPj4gNDsKKyAgICAgICAgICBlcC0+eGZlcl9jb3VudCArPSAodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSA+PiA0OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmICgoKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfUEtUU1RTKSA+PiAxNykgPT0gIFNUU19TRVRVUF9VUERUKQorICAgICAgeworICAgICAgICAodm9pZClVU0JfUmVhZFBhY2tldChVU0J4LCAodWludDhfdCAqKWhwY2QtPlNldHVwLCA4VSk7CisgICAgICAgIGVwLT54ZmVyX2NvdW50ICs9ICh0ZW1wICYgVVNCX09UR19HUlhTVFNQX0JDTlQpID4+IDQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIC4uLiAqLworICAgICAgfQorICAgICAgVVNCX1VOTUFTS19JTlRFUlJVUFQoaHBjZC0+SW5zdGFuY2UsIFVTQl9PVEdfR0lOVFNUU19SWEZMVkwpOworICAgIH0KKwogICAgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX09UR19HSU5UU1RTX09FUElOVCkpCiAgICAgewogICAgICAgZXBudW0gPSAwVTsKQEAgLTEwNzksOSArMTExMSw5IEBACiAKICAgICAgICAgICBpZiAoKGVwaW50ICYgVVNCX09UR19ET0VQSU5UX1NUVVApID09IFVTQl9PVEdfRE9FUElOVF9TVFVQKQogICAgICAgICAgIHsKKyAgICAgICAgICAgIENMRUFSX09VVF9FUF9JTlRSKGVwbnVtLCBVU0JfT1RHX0RPRVBJTlRfU1RVUCk7CiAgICAgICAgICAgICAvKiBDbGFzcyBCIHNldHVwIHBoYXNlIGRvbmUgZm9yIHByZXZpb3VzIGRlY29kZWQgc2V0dXAgKi8KICAgICAgICAgICAgICh2b2lkKVBDRF9FUF9PdXRTZXR1cFBhY2tldF9pbnQoaHBjZCwgZXBudW0pOwotICAgICAgICAgICAgQ0xFQVJfT1VUX0VQX0lOVFIoZXBudW0sIFVTQl9PVEdfRE9FUElOVF9TVFVQKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBpZiAoKGVwaW50ICYgVVNCX09UR19ET0VQSU5UX09URVBESVMpID09IFVTQl9PVEdfRE9FUElOVF9PVEVQRElTKQpAQCAtMTA5MiwxMCArMTEyNCw2IEBACiAgICAgICAgICAgLyogQ2xlYXIgU3RhdHVzIFBoYXNlIFJlY2VpdmVkIGludGVycnVwdCAqLwogICAgICAgICAgIGlmICgoZXBpbnQgJiBVU0JfT1RHX0RPRVBJTlRfT1RFUFNQUikgPT0gVVNCX09UR19ET0VQSU5UX09URVBTUFIpCiAgICAgICAgICAgewotICAgICAgICAgICAgaWYgKGhwY2QtPkluaXQuZG1hX2VuYWJsZSA9PSAxVSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKHZvaWQpVVNCX0VQMF9PdXRTdGFydChocGNkLT5JbnN0YW5jZSwgMVUsICh1aW50OF90ICopaHBjZC0+U2V0dXApOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgQ0xFQVJfT1VUX0VQX0lOVFIoZXBudW0sIFVTQl9PVEdfRE9FUElOVF9PVEVQU1BSKTsKICAgICAgICAgICB9CiAKQEAgLTExMzMsMTYgKzExNjEsNyBAQAogICAgICAgICAgICAgaWYgKGhwY2QtPkluaXQuZG1hX2VuYWJsZSA9PSAxVSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgaHBjZC0+SU5fZXBbZXBudW1dLnhmZXJfYnVmZiArPSBocGNkLT5JTl9lcFtlcG51bV0ubWF4cGFja2V0OwotICAgICAgICAgICAgfQogCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKLSAgICAgICAgICAgIGhwY2QtPkRhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgKHVpbnQ4X3QpZXBudW0pOwotI2Vsc2UKLSAgICAgICAgICAgIEhBTF9QQ0RfRGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCAodWludDhfdCllcG51bSk7Ci0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0KLSAgICAgICAgICAgIGlmIChocGNkLT5Jbml0LmRtYV9lbmFibGUgPT0gMVUpCi0gICAgICAgICAgICB7CiAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgWkxQLCBzbyBwcmVwYXJlIEVQMCBmb3IgbmV4dCBzZXR1cCAqLwogICAgICAgICAgICAgICBpZiAoKGVwbnVtID09IDBVKSAmJiAoaHBjZC0+SU5fZXBbZXBudW1dLnhmZXJfbGVuID09IDBVKSkKICAgICAgICAgICAgICAgewpAQCAtMTE1MCw2ICsxMTY5LDEyIEBACiAgICAgICAgICAgICAgICAgKHZvaWQpVVNCX0VQMF9PdXRTdGFydChocGNkLT5JbnN0YW5jZSwgMVUsICh1aW50OF90ICopaHBjZC0+U2V0dXApOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCAodWludDhfdCllcG51bSk7CisjZWxzZQorICAgICAgICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsICh1aW50OF90KWVwbnVtKTsKKyNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKChlcGludCAmIFVTQl9PVEdfRElFUElOVF9UT0MpID09IFVTQl9PVEdfRElFUElOVF9UT0MpCiAgICAgICAgICAgewpAQCAtMTI1NSw4ICsxMjgwLDEwIEBACiAgICAgICB7CiAgICAgICAgIFVTQnhfSU5FUChpKS0+RElFUElOVCA9IDB4RkI3RlU7CiAgICAgICAgIFVTQnhfSU5FUChpKS0+RElFUENUTCAmPSB+VVNCX09UR19ESUVQQ1RMX1NUQUxMOworICAgICAgICBVU0J4X0lORVAoaSktPkRJRVBDVEwgfD0gVVNCX09UR19ESUVQQ1RMX1NOQUs7CiAgICAgICAgIFVTQnhfT1VURVAoaSktPkRPRVBJTlQgPSAweEZCN0ZVOwogICAgICAgICBVU0J4X09VVEVQKGkpLT5ET0VQQ1RMICY9IH5VU0JfT1RHX0RPRVBDVExfU1RBTEw7CisgICAgICAgIFVTQnhfT1VURVAoaSktPkRPRVBDVEwgfD0gVVNCX09UR19ET0VQQ1RMX1NOQUs7CiAgICAgICB9CiAgICAgICBVU0J4X0RFVklDRS0+REFJTlRNU0sgfD0gMHgxMDAwMVU7CiAKQEAgLTEzMTMsMzggKzEzNDAsNiBAQAogICAgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX09UR19HSU5UU1RTX0VOVU1ETkUpOwogICAgIH0KIAotICAgIC8qIEhhbmRsZSBSeFFMZXZlbCBJbnRlcnJ1cHQgKi8KLSAgICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9PVEdfR0lOVFNUU19SWEZMVkwpKQotICAgIHsKLSAgICAgIFVTQl9NQVNLX0lOVEVSUlVQVChocGNkLT5JbnN0YW5jZSwgVVNCX09UR19HSU5UU1RTX1JYRkxWTCk7Ci0KLSAgICAgIHRlbXAgPSBVU0J4LT5HUlhTVFNQOwotCi0gICAgICBlcCA9ICZocGNkLT5PVVRfZXBbdGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9FUE5VTV07Ci0KLSAgICAgIGlmICgoKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfUEtUU1RTKSA+PiAxNykgPT0gIFNUU19EQVRBX1VQRFQpCi0gICAgICB7Ci0gICAgICAgIGlmICgodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSAhPSAwVSkKLSAgICAgICAgewotICAgICAgICAgICh2b2lkKVVTQl9SZWFkUGFja2V0KFVTQngsIGVwLT54ZmVyX2J1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KSgodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSA+PiA0KSk7Ci0KLSAgICAgICAgICBlcC0+eGZlcl9idWZmICs9ICh0ZW1wICYgVVNCX09UR19HUlhTVFNQX0JDTlQpID4+IDQ7Ci0gICAgICAgICAgZXAtPnhmZXJfY291bnQgKz0gKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfQkNOVCkgPj4gNDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoKCh0ZW1wICYgVVNCX09UR19HUlhTVFNQX1BLVFNUUykgPj4gMTcpID09ICBTVFNfU0VUVVBfVVBEVCkKLSAgICAgIHsKLSAgICAgICAgKHZvaWQpVVNCX1JlYWRQYWNrZXQoVVNCeCwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCwgOFUpOwotICAgICAgICBlcC0+eGZlcl9jb3VudCArPSAodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSA+PiA0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiAuLi4gKi8KLSAgICAgIH0KLSAgICAgIFVTQl9VTk1BU0tfSU5URVJSVVBUKGhwY2QtPkluc3RhbmNlLCBVU0JfT1RHX0dJTlRTVFNfUlhGTFZMKTsKLSAgICB9Ci0KICAgICAvKiBIYW5kbGUgU09GIEludGVycnVwdCAqLwogICAgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX09UR19HSU5UU1RTX1NPRikpCiAgICAgewpAQCAtMjA3MSwxNiArMjA2Niw2IEBACiAgICAgICB7CiAgICAgICAgIENMRUFSX09VVF9FUF9JTlRSKGVwbnVtLCBVU0JfT1RHX0RPRVBJTlRfU1RQS1RSWCk7CiAgICAgICB9Ci0KLSAgICAgIC8qIEluZm9ybSB0aGUgdXBwZXIgbGF5ZXIgdGhhdCBhIHNldHVwIHBhY2tldCBpcyBhdmFpbGFibGUgKi8KLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQotICAgICAgaHBjZC0+U2V0dXBTdGFnZUNhbGxiYWNrKGhwY2QpOwotI2Vsc2UKLSAgICAgIEhBTF9QQ0RfU2V0dXBTdGFnZUNhbGxiYWNrKGhwY2QpOwotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotCi0gICAgICAodm9pZClVU0JfRVAwX091dFN0YXJ0KGhwY2QtPkluc3RhbmNlLCAxVSwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCk7Ci0gICAgICBDTEVBUl9PVVRfRVBfSU5UUihlcG51bSwgVVNCX09UR19ET0VQSU5UX1NUVVApOwogICAgIH0KICAgICBlbHNlIGlmICgoRG9lcGludFJlZyAmIFVTQl9PVEdfRE9FUElOVF9PVEVQU1BSKSA9PSBVU0JfT1RHX0RPRVBJTlRfT1RFUFNQUikgLyogQ2xhc3MgRSAqLwogICAgIHsKQEAgLTIxMDMsMTcgKzIwODgsMTYgQEAKIAogICAgICAgICBocGNkLT5PVVRfZXBbZXBudW1dLnhmZXJfYnVmZiArPSBocGNkLT5PVVRfZXBbZXBudW1dLm1heHBhY2tldDsKIAotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCi0gICAgICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsICh1aW50OF90KWVwbnVtKTsKLSNlbHNlCi0gICAgICAgIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgKHVpbnQ4X3QpZXBudW0pOwotI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotCiAgICAgICAgIGlmICgoZXBudW0gPT0gMFUpICYmIChocGNkLT5PVVRfZXBbZXBudW1dLnhmZXJfbGVuID09IDBVKSkKICAgICAgICAgewogICAgICAgICAgIC8qIHRoaXMgaXMgWkxQLCBzbyBwcmVwYXJlIEVQMCBmb3IgbmV4dCBzZXR1cCAqLwogICAgICAgICAgICh2b2lkKVVTQl9FUDBfT3V0U3RhcnQoaHBjZC0+SW5zdGFuY2UsIDFVLCAodWludDhfdCAqKWhwY2QtPlNldHVwKTsKICAgICAgICAgfQorI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsICh1aW50OF90KWVwbnVtKTsKKyNlbHNlCisgICAgICAgIEhBTF9QQ0RfRGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgKHVpbnQ4X3QpZXBudW0pOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0yMTQ2LDYgKzIxMzAsMTIgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyAgICAgIGlmICgoZXBudW0gPT0gMFUpICYmIChocGNkLT5PVVRfZXBbZXBudW1dLnhmZXJfbGVuID09IDBVKSkKKyAgICAgIHsKKyAgICAgICAgLyogdGhpcyBpcyBaTFAsIHNvIHByZXBhcmUgRVAwIGZvciBuZXh0IHNldHVwICovCisgICAgICAgICh2b2lkKVVTQl9FUDBfT3V0U3RhcnQoaHBjZC0+SW5zdGFuY2UsIDBVLCAodWludDhfdCAqKWhwY2QtPlNldHVwKTsKKyAgICAgIH0KKwogI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICBocGNkLT5EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCAodWludDhfdCllcG51bSk7CiAjZWxzZQpAQCAtMjE3MSwyMiArMjE2MSwxMCBAQAogICB1aW50MzJfdCBnU05QU2lEID0gKihfX0lPIHVpbnQzMl90ICopKCZVU0J4LT5DSUQgKyAweDFVKTsKICAgdWludDMyX3QgRG9lcGludFJlZyA9IFVTQnhfT1VURVAoZXBudW0pLT5ET0VQSU5UOwogCi0gIGlmIChocGNkLT5Jbml0LmRtYV9lbmFibGUgPT0gMVUpCisgIGlmICgoZ1NOUFNpRCA+IFVTQl9PVEdfQ09SRV9JRF8zMDBBKSAmJgorICAgICAgKChEb2VwaW50UmVnICYgVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpID09IFVTQl9PVEdfRE9FUElOVF9TVFBLVFJYKSkKICAgewotICAgIC8qIFN0dXBQa3RSY3ZkID0gMSBwZW5kaW5nIHNldHVwIHBhY2tldCBpbnQgKi8KLSAgICBpZiAoKGdTTlBTaUQgPiBVU0JfT1RHX0NPUkVfSURfMzAwQSkgJiYKLSAgICAgICAgKChEb2VwaW50UmVnICYgVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpID09IFVTQl9PVEdfRE9FUElOVF9TVFBLVFJYKSkKLSAgICB7Ci0gICAgICBDTEVBUl9PVVRfRVBfSU5UUihlcG51bSwgVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZiAoKGdTTlBTaUQgPT0gVVNCX09UR19DT1JFX0lEXzMxMEEpICYmCi0gICAgICAgICgoRG9lcGludFJlZyAmIFVTQl9PVEdfRE9FUElOVF9TVFBLVFJYKSA9PSBVU0JfT1RHX0RPRVBJTlRfU1RQS1RSWCkpCi0gICAgewotICAgICAgQ0xFQVJfT1VUX0VQX0lOVFIoZXBudW0sIFVTQl9PVEdfRE9FUElOVF9TVFBLVFJYKTsKLSAgICB9CisgICAgQ0xFQVJfT1VUX0VQX0lOVFIoZXBudW0sIFVTQl9PVEdfRE9FUElOVF9TVFBLVFJYKTsKICAgfQogCiAgIC8qIEluZm9ybSB0aGUgdXBwZXIgbGF5ZXIgdGhhdCBhIHNldHVwIHBhY2tldCBpcyBhdmFpbGFibGUgKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY0eHhfaGFsX3FzcGkuYyBiL1NyYy9zdG0zMmY0eHhfaGFsX3FzcGkuYwppbmRleCBiMTQzZTM1Li4wMmFiNjJhIDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmNHh4X2hhbF9xc3BpLmMKKysrIGIvU3JjL3N0bTMyZjR4eF9oYWxfcXNwaS5jCkBAIC0zLDcgKzMsNyBAQAogICAqIEBmaWxlICAgIHN0bTMyZjR4eF9oYWxfcXNwaS5jCiAgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAgKiBAYnJpZWYgICBRU1BJIEhBTCBtb2R1bGUgZHJpdmVyLgotICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCisgICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZwogICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgUXVhZFNQSSBpbnRlcmZhY2UgKFFTUEkpLgogICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICAgKiAgICAgICAgICAgKyBJbmRpcmVjdCBmdW5jdGlvbmFsIG1vZGUgbWFuYWdlbWVudApAQCAtMjQsMTQgKzI0LDE0IEBACiAgICAgWy4uXQogICAgICAgKCMpIEFzIHByZXJlcXVpc2l0ZSwgZmlsbCBpbiB0aGUgSEFMX1FTUElfTXNwSW5pdCgpIDoKICAgICAgICAgKCsrKSBFbmFibGUgUXVhZFNQSSBjbG9jayBpbnRlcmZhY2Ugd2l0aCBfX0hBTF9SQ0NfUVNQSV9DTEtfRU5BQkxFKCkuCi0gICAgICAgICgrKykgUmVzZXQgUXVhZFNQSSBJUCB3aXRoIF9fSEFMX1JDQ19RU1BJX0ZPUkNFX1JFU0VUKCkgYW5kIF9fSEFMX1JDQ19RU1BJX1JFTEVBU0VfUkVTRVQoKS4KKyAgICAgICAgKCsrKSBSZXNldCBRdWFkU1BJIFBlcmlwaGVyYWwgd2l0aCBfX0hBTF9SQ0NfUVNQSV9GT1JDRV9SRVNFVCgpIGFuZCBfX0hBTF9SQ0NfUVNQSV9SRUxFQVNFX1JFU0VUKCkuCiAgICAgICAgICgrKykgRW5hYmxlIHRoZSBjbG9ja3MgZm9yIHRoZSBRdWFkU1BJIEdQSU9TIHdpdGggX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKS4KICAgICAgICAgKCsrKSBDb25maWd1cmUgdGhlc2UgUXVhZFNQSSBwaW5zIGluIGFsdGVybmF0ZSBtb2RlIHVzaW5nIEhBTF9HUElPX0luaXQoKS4KICAgICAgICAgKCsrKSBJZiBpbnRlcnJ1cHQgbW9kZSBpcyB1c2VkLCBlbmFibGUgYW5kIGNvbmZpZ3VyZSBRdWFkU1BJIGdsb2JhbAogICAgICAgICAgICAgaW50ZXJydXB0IHdpdGggSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkuCi0gICAgICAgICgrKykgSWYgRE1BIG1vZGUgaXMgdXNlZCwgZW5hYmxlIHRoZSBjbG9ja3MgZm9yIHRoZSBRdWFkU1BJIERNQSBjaGFubmVsIAotICAgICAgICAgICAgd2l0aCBfX0hBTF9SQ0NfRE1BeF9DTEtfRU5BQkxFKCksIGNvbmZpZ3VyZSBETUEgd2l0aCBIQUxfRE1BX0luaXQoKSwgCi0gICAgICAgICAgICBsaW5rIGl0IHdpdGggUXVhZFNQSSBoYW5kbGUgdXNpbmcgX19IQUxfTElOS0RNQSgpLCBlbmFibGUgYW5kIGNvbmZpZ3VyZSAKKyAgICAgICAgKCsrKSBJZiBETUEgbW9kZSBpcyB1c2VkLCBlbmFibGUgdGhlIGNsb2NrcyBmb3IgdGhlIFF1YWRTUEkgRE1BIGNoYW5uZWwKKyAgICAgICAgICAgIHdpdGggX19IQUxfUkNDX0RNQXhfQ0xLX0VOQUJMRSgpLCBjb25maWd1cmUgRE1BIHdpdGggSEFMX0RNQV9Jbml0KCksCisgICAgICAgICAgICBsaW5rIGl0IHdpdGggUXVhZFNQSSBoYW5kbGUgdXNpbmcgX19IQUxfTElOS0RNQSgpLCBlbmFibGUgYW5kIGNvbmZpZ3VyZQogICAgICAgICAgICAgRE1BIGNoYW5uZWwgZ2xvYmFsIGludGVycnVwdCB3aXRoIEhBTF9OVklDX1NldFByaW9yaXR5KCkgYW5kIEhBTF9OVklDX0VuYWJsZUlSUSgpLgogICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgZmxhc2ggc2l6ZSwgdGhlIGNsb2NrIHByZXNjYWxlciwgdGhlIGZpZm8gdGhyZXNob2xkLCB0aGUKICAgICAgICAgICBjbG9jayBtb2RlLCB0aGUgc2FtcGxlIHNoaWZ0aW5nIGFuZCB0aGUgQ1MgaGlnaCB0aW1lIHVzaW5nIHRoZSBIQUxfUVNQSV9Jbml0KCkgZnVuY3Rpb24uCkBAIC0zOSw0NyArMzksNDcgQEAKICAgICAqKiogSW5kaXJlY3QgZnVuY3Rpb25hbCBtb2RlICoqKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgWy4uXQotICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgY29tbWFuZCBzZXF1ZW5jZSB1c2luZyB0aGUgSEFMX1FTUElfQ29tbWFuZCgpIG9yIEhBTF9RU1BJX0NvbW1hbmRfSVQoKSAKKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbW1hbmQgc2VxdWVuY2UgdXNpbmcgdGhlIEhBTF9RU1BJX0NvbW1hbmQoKSBvciBIQUxfUVNQSV9Db21tYW5kX0lUKCkKICAgICAgICAgICBmdW5jdGlvbnMgOgogICAgICAgICAgKCsrKSBJbnN0cnVjdGlvbiBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KICAgICAgICAgICgrKykgQWRkcmVzcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhZGRyZXNzIHZhbHVlLgotICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlIAorICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlCiAgICAgICAgICAgICAgYnl0ZXMgdmFsdWVzLgogICAgICAgICAgKCsrKSBEdW1teS1jeWNsZXMgcGhhc2UgOiB0aGUgbnVtYmVyIG9mIGR1bW15IGN5Y2xlcyAobW9kZSB1c2VkIGlzIHNhbWUgYXMgZGF0YSBwaGFzZSkuCiAgICAgICAgICAoKyspIERhdGEgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICAgICAoKyspIERvdWJsZSBEYXRhIFJhdGUgKEREUikgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZSBhbmQgdGhlIGRlbGF5IAorICAgICAgICAgKCsrKSBEb3VibGUgRGF0YSBSYXRlIChERFIpIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUgYW5kIHRoZSBkZWxheQogICAgICAgICAgICAgIGlmIGFjdGl2YXRlZC4KICAgICAgICAgICgrKykgU2VuZGluZyBJbnN0cnVjdGlvbiBPbmx5IE9uY2UgKFNJT08pIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUuCiAgICAgICAoIykgSWYgbm8gZGF0YSBpcyByZXF1aXJlZCBmb3IgdGhlIGNvbW1hbmQsIGl0IGlzIHNlbnQgZGlyZWN0bHkgdG8gdGhlIG1lbW9yeSA6CiAgICAgICAgICAoKyspIEluIHBvbGxpbmcgbW9kZSwgdGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gaXMgZG9uZSB3aGVuIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KICAgICAgICAgICgrKykgSW4gaW50ZXJydXB0IG1vZGUsIEhBTF9RU1BJX0NtZENwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgotICAgICAgKCMpIEZvciB0aGUgaW5kaXJlY3Qgd3JpdGUgbW9kZSwgdXNlIEhBTF9RU1BJX1RyYW5zbWl0KCksIEhBTF9RU1BJX1RyYW5zbWl0X0RNQSgpIG9yIAorICAgICAgKCMpIEZvciB0aGUgaW5kaXJlY3Qgd3JpdGUgbW9kZSwgdXNlIEhBTF9RU1BJX1RyYW5zbWl0KCksIEhBTF9RU1BJX1RyYW5zbWl0X0RNQSgpIG9yCiAgICAgICAgICAgSEFMX1FTUElfVHJhbnNtaXRfSVQoKSBhZnRlciB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIDoKICAgICAgICAgICgrKykgSW4gcG9sbGluZyBtb2RlLCB0aGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBpcyBkb25lIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgotICAgICAgICAgKCsrKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1FTUElfRmlmb1RocmVzaG9sZENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZmlmbyB0aHJlc2hvbGQgCisgICAgICAgICAoKyspIEluIGludGVycnVwdCBtb2RlLCBIQUxfUVNQSV9GaWZvVGhyZXNob2xkQ2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWZvIHRocmVzaG9sZAogICAgICAgICAgICAgIGlzIHJlYWNoZWQgYW5kIEhBTF9RU1BJX1R4Q3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCi0gICAgICAgICAoKyspIEluIERNQSBtb2RlLCBIQUxfUVNQSV9UeEhhbGZDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgaGFsZiB0cmFuc2ZlciBhbmQgCisgICAgICAgICAoKyspIEluIERNQSBtb2RlLCBIQUxfUVNQSV9UeEhhbGZDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCBhdCB0aGUgaGFsZiB0cmFuc2ZlciBhbmQKICAgICAgICAgICAgICBIQUxfUVNQSV9UeENwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgotICAgICAgKCMpIEZvciB0aGUgaW5kaXJlY3QgcmVhZCBtb2RlLCB1c2UgSEFMX1FTUElfUmVjZWl2ZSgpLCBIQUxfUVNQSV9SZWNlaXZlX0RNQSgpIG9yIAorICAgICAgKCMpIEZvciB0aGUgaW5kaXJlY3QgcmVhZCBtb2RlLCB1c2UgSEFMX1FTUElfUmVjZWl2ZSgpLCBIQUxfUVNQSV9SZWNlaXZlX0RNQSgpIG9yCiAgICAgICAgICAgSEFMX1FTUElfUmVjZWl2ZV9JVCgpIGFmdGVyIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gOgogICAgICAgICAgKCsrKSBJbiBwb2xsaW5nIG1vZGUsIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIGlzIGRvbmUgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCi0gICAgICAgICAoKyspIEluIGludGVycnVwdCBtb2RlLCBIQUxfUVNQSV9GaWZvVGhyZXNob2xkQ2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWZvIHRocmVzaG9sZCAKKyAgICAgICAgICgrKykgSW4gaW50ZXJydXB0IG1vZGUsIEhBTF9RU1BJX0ZpZm9UaHJlc2hvbGRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGZpZm8gdGhyZXNob2xkCiAgICAgICAgICAgICAgaXMgcmVhY2hlZCBhbmQgSEFMX1FTUElfUnhDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KLSAgICAgICAgICgrKykgSW4gRE1BIG1vZGUsIEhBTF9RU1BJX1J4SGFsZkNwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIGF0IHRoZSBoYWxmIHRyYW5zZmVyIGFuZCAKKyAgICAgICAgICgrKykgSW4gRE1BIG1vZGUsIEhBTF9RU1BJX1J4SGFsZkNwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIGF0IHRoZSBoYWxmIHRyYW5zZmVyIGFuZAogICAgICAgICAgICAgIEhBTF9RU1BJX1J4Q3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCiAKICAgICAqKiogQXV0by1wb2xsaW5nIGZ1bmN0aW9uYWwgbW9kZSAqKioKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBbLi5dCi0gICAgICAoIykgQ29uZmlndXJlIHRoZSBjb21tYW5kIHNlcXVlbmNlIGFuZCB0aGUgYXV0by1wb2xsaW5nIGZ1bmN0aW9uYWwgbW9kZSB1c2luZyB0aGUgCisgICAgICAoIykgQ29uZmlndXJlIHRoZSBjb21tYW5kIHNlcXVlbmNlIGFuZCB0aGUgYXV0by1wb2xsaW5nIGZ1bmN0aW9uYWwgbW9kZSB1c2luZyB0aGUKICAgICAgICAgICBIQUxfUVNQSV9BdXRvUG9sbGluZygpIG9yIEhBTF9RU1BJX0F1dG9Qb2xsaW5nX0lUKCkgZnVuY3Rpb25zIDoKICAgICAgICAgICgrKykgSW5zdHJ1Y3Rpb24gcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCiAgICAgICAgICAoKyspIEFkZHJlc3MgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWRkcmVzcyB2YWx1ZS4KLSAgICAgICAgICgrKykgQWx0ZXJuYXRlLWJ5dGVzIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgaWYgcHJlc2VudCB0aGUgc2l6ZSBhbmQgdGhlIGFsdGVybmF0ZSAKKyAgICAgICAgICgrKykgQWx0ZXJuYXRlLWJ5dGVzIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgaWYgcHJlc2VudCB0aGUgc2l6ZSBhbmQgdGhlIGFsdGVybmF0ZQogICAgICAgICAgICAgIGJ5dGVzIHZhbHVlcy4KICAgICAgICAgICgrKykgRHVtbXktY3ljbGVzIHBoYXNlIDogdGhlIG51bWJlciBvZiBkdW1teSBjeWNsZXMgKG1vZGUgdXNlZCBpcyBzYW1lIGFzIGRhdGEgcGhhc2UpLgogICAgICAgICAgKCsrKSBEYXRhIHBoYXNlIDogdGhlIG1vZGUgdXNlZC4KLSAgICAgICAgICgrKykgRG91YmxlIERhdGEgUmF0ZSAoRERSKSBtb2RlIDogdGhlIGFjdGl2YXRpb24gKG9yIG5vdCkgb2YgdGhpcyBtb2RlIGFuZCB0aGUgZGVsYXkgCisgICAgICAgICAoKyspIERvdWJsZSBEYXRhIFJhdGUgKEREUikgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZSBhbmQgdGhlIGRlbGF5CiAgICAgICAgICAgICAgaWYgYWN0aXZhdGVkLgogICAgICAgICAgKCsrKSBTZW5kaW5nIEluc3RydWN0aW9uIE9ubHkgT25jZSAoU0lPTykgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZS4KICAgICAgICAgICgrKykgVGhlIHNpemUgb2YgdGhlIHN0YXR1cyBieXRlcywgdGhlIG1hdGNoIHZhbHVlLCB0aGUgbWFzayB1c2VkLCB0aGUgbWF0Y2ggbW9kZSAoT1IvQU5EKSwKQEAgLTkyLDMxICs5MiwzMSBAQAogICAgICoqKiBNZW1vcnktbWFwcGVkIGZ1bmN0aW9uYWwgbW9kZSAqKioKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgWy4uXQotICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgY29tbWFuZCBzZXF1ZW5jZSBhbmQgdGhlIG1lbW9yeS1tYXBwZWQgZnVuY3Rpb25hbCBtb2RlIHVzaW5nIHRoZSAKKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbW1hbmQgc2VxdWVuY2UgYW5kIHRoZSBtZW1vcnktbWFwcGVkIGZ1bmN0aW9uYWwgbW9kZSB1c2luZyB0aGUKICAgICAgICAgICBIQUxfUVNQSV9NZW1vcnlNYXBwZWQoKSBmdW5jdGlvbnMgOgogICAgICAgICAgKCsrKSBJbnN0cnVjdGlvbiBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KICAgICAgICAgICgrKykgQWRkcmVzcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIHRoZSBzaXplLgotICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlIAorICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlCiAgICAgICAgICAgICAgYnl0ZXMgdmFsdWVzLgogICAgICAgICAgKCsrKSBEdW1teS1jeWNsZXMgcGhhc2UgOiB0aGUgbnVtYmVyIG9mIGR1bW15IGN5Y2xlcyAobW9kZSB1c2VkIGlzIHNhbWUgYXMgZGF0YSBwaGFzZSkuCiAgICAgICAgICAoKyspIERhdGEgcGhhc2UgOiB0aGUgbW9kZSB1c2VkLgotICAgICAgICAgKCsrKSBEb3VibGUgRGF0YSBSYXRlIChERFIpIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUgYW5kIHRoZSBkZWxheSAKKyAgICAgICAgICgrKykgRG91YmxlIERhdGEgUmF0ZSAoRERSKSBtb2RlIDogdGhlIGFjdGl2YXRpb24gKG9yIG5vdCkgb2YgdGhpcyBtb2RlIGFuZCB0aGUgZGVsYXkKICAgICAgICAgICAgICBpZiBhY3RpdmF0ZWQuCiAgICAgICAgICAoKyspIFNlbmRpbmcgSW5zdHJ1Y3Rpb24gT25seSBPbmNlIChTSU9PKSBtb2RlIDogdGhlIGFjdGl2YXRpb24gKG9yIG5vdCkgb2YgdGhpcyBtb2RlLgogICAgICAgICAgKCsrKSBUaGUgdGltZW91dCBhY3RpdmF0aW9uIGFuZCB0aGUgdGltZW91dCBwZXJpb2QuCi0gICAgICAoIykgQWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24sIHRoZSBRdWFkU1BJIHdpbGwgYmUgdXNlZCBhcyBzb29uIGFzIGFuIGFjY2VzcyBvbiB0aGUgQUhCIGlzIGRvbmUgb24gCisgICAgICAoIykgQWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24sIHRoZSBRdWFkU1BJIHdpbGwgYmUgdXNlZCBhcyBzb29uIGFzIGFuIGFjY2VzcyBvbiB0aGUgQUhCIGlzIGRvbmUgb24KICAgICAgICAgICB0aGUgYWRkcmVzcyByYW5nZS4gSEFMX1FTUElfVGltZU91dENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZW91dCBleHBpcmVzLgogCiAgICAgKioqIEVycm9ycyBtYW5hZ2VtZW50IGFuZCBhYm9ydCBmdW5jdGlvbmFsaXR5ICoqKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0KICAgICAgICgjKSBIQUxfUVNQSV9HZXRFcnJvcigpIGZ1bmN0aW9uIGdpdmVzIHRoZSBlcnJvciByYWlzZWQgZHVyaW5nIHRoZSBsYXN0IG9wZXJhdGlvbi4KLSAgICAgICgjKSBIQUxfUVNQSV9BYm9ydCgpIGFuZCBIQUxfUVNQSV9BYm9ydElUKCkgZnVuY3Rpb25zIGFib3J0cyBhbnkgb24tZ29pbmcgb3BlcmF0aW9uIGFuZCAKKyAgICAgICgjKSBIQUxfUVNQSV9BYm9ydCgpIGFuZCBIQUxfUVNQSV9BYm9ydElUKCkgZnVuY3Rpb25zIGFib3J0cyBhbnkgb24tZ29pbmcgb3BlcmF0aW9uIGFuZAogICAgICAgICAgIGZsdXNoZXMgdGhlIGZpZm8gOgotICAgICAgICAgKCsrKSBJbiBwb2xsaW5nIG1vZGUsIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIGlzIGRvbmUgd2hlbiB0aGUgdHJhbnNmZXIgCisgICAgICAgICAoKyspIEluIHBvbGxpbmcgbW9kZSwgdGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gaXMgZG9uZSB3aGVuIHRoZSB0cmFuc2ZlcgogICAgICAgICAgICAgICBjb21wbGV0ZSBiaXQgaXMgc2V0IGFuZCB0aGUgYnVzeSBiaXQgY2xlYXJlZC4KLSAgICAgICAgICgrKykgSW4gaW50ZXJydXB0IG1vZGUsIEhBTF9RU1BJX0Fib3J0Q3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiAKLSAgICAgICAgICAgICAgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGJpIGlzIHNldC4KKyAgICAgICAgICgrKykgSW4gaW50ZXJydXB0IG1vZGUsIEhBTF9RU1BJX0Fib3J0Q3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbgorICAgICAgICAgICAgICB0aGUgdHJhbnNmZXIgY29tcGxldGUgYml0IGlzIHNldC4KIAogICAgICoqKiBDb250cm9sIGZ1bmN0aW9ucyAqKioKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMjUsNiArMTI1LDcgQEAKICAgICAgICgjKSBIQUxfUVNQSV9TZXRUaW1lb3V0KCkgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgdGltZW91dCB2YWx1ZSB1c2VkIGluIHRoZSBkcml2ZXIuCiAgICAgICAoIykgSEFMX1FTUElfU2V0Rmlmb1RocmVzaG9sZCgpIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHRocmVzaG9sZCBvbiB0aGUgRmlmbyBvZiB0aGUgUVNQSSBJUC4KICAgICAgICgjKSBIQUxfUVNQSV9HZXRGaWZvVGhyZXNob2xkKCkgZnVuY3Rpb24gZ2l2ZXMgdGhlIGN1cnJlbnQgb2YgdGhlIEZpZm8ncyB0aHJlc2hvbGQKKyAgICAgICgjKSBIQUxfUVNQSV9TZXRGbGFzaElEKCkgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgaW5kZXggb2YgdGhlIGZsYXNoIG1lbW9yeSB0byBiZSBhY2Nlc3NlZC4KIAogICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xOTUsMTMgKzE5NiwxMyBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICAqCiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCi0gICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICogICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICAqCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqLwpAQCAtMjA5LDYgKzIxMCw4IEBACiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInN0bTMyZjR4eF9oYWwuaCIKIAorI2lmIGRlZmluZWQoUVVBRFNQSSkKKwogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgICogQHsKICAgKi8KQEAgLTIxOSwxMiArMjIyLDEwIEBACiAgICovCiAjaWZkZWYgSEFMX1FTUElfTU9EVUxFX0VOQUJMRUQKIAotI2lmIGRlZmluZWQoU1RNMzJGNDQ2eHgpIHx8IGRlZmluZWQoU1RNMzJGNDY5eHgpIHx8IGRlZmluZWQoU1RNMzJGNDc5eHgpIHx8IGRlZmluZWQoU1RNMzJGNDEyWngpIHx8IGRlZmluZWQoU1RNMzJGNDEyVngpIHx8IFwKLSAgICBkZWZpbmVkKFNUTTMyRjQxMlJ4KSB8fCBkZWZpbmVkKFNUTTMyRjQxM3h4KSB8fCBkZWZpbmVkKFNUTTMyRjQyM3h4KQotICAgIAogLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKiBAYWRkdG9ncm91cCBRU1BJX1ByaXZhdGVfQ29uc3RhbnRzIAorLyoqIEBkZWZncm91cCBRU1BJX1ByaXZhdGVfQ29uc3RhbnRzIFFTUEkgUHJpdmF0ZSBDb25zdGFudHMKICAgKiBAewogICAqLwogI2RlZmluZSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITxJbmRpcmVjdCB3cml0ZSBtb2RlKi8KQEAgLTIzNCw5ICsyMzUsOSBAQAogLyoqCiAgICogQH0KICAgKi8KLSAgCisKIC8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGFkZHRvZ3JvdXAgUVNQSV9Qcml2YXRlX01hY3JvcyBRU1BJIFByaXZhdGUgTWFjcm9zCisvKiogQGRlZmdyb3VwIFFTUElfUHJpdmF0ZV9NYWNyb3MgUVNQSSBQcml2YXRlIE1hY3JvcwogICAqIEB7CiAgICovCiAjZGVmaW5lIElTX1FTUElfRlVOQ1RJT05BTF9NT0RFKE1PREUpICgoKE1PREUpID09IFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1dSSVRFKSB8fCBcCkBAIC0yNDYsMzQgKzI0NywyOSBAQAogLyoqCiAgICogQH0KICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIC8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKIC8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGFkZHRvZ3JvdXAgUVNQSV9Qcml2YXRlX0Z1bmN0aW9ucyBRU1BJIFByaXZhdGUgRnVuY3Rpb25zCi0gICogQHsKLSAgKi8KIHN0YXRpYyB2b2lkIFFTUElfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKIHN0YXRpYyB2b2lkIFFTUElfRE1BVHhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKIHN0YXRpYyB2b2lkIFFTUElfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CiBzdGF0aWMgdm9pZCBRU1BJX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwotc3RhdGljIHZvaWQgUVNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7IAorc3RhdGljIHZvaWQgUVNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CiBzdGF0aWMgdm9pZCBRU1BJX0RNQUFib3J0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Ci1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdGUsIHVpbnQzMl90IHRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdGUsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CiBzdGF0aWMgdm9pZCBRU1BJX0NvbmZpZyhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIHVpbnQzMl90IEZ1bmN0aW9uYWxNb2RlKTsKLS8qKgotICAqIEB9Ci0gICovCi0gIAotLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qKiBAZGVmZ3JvdXAgUVNQSV9FeHBvcnRlZF9GdW5jdGlvbnMgUVNQSSBFeHBvcnRlZCBGdW5jdGlvbnMKICAgKiBAewogICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCi0gICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgCisvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICAqCi1AdmVyYmF0aW0gICAgCitAdmVyYmF0aW0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTI4MSwyMiArMjc3LDIyIEBACiAgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byA6CiAgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgUXVhZFNQSS4KICAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBRdWFkU1BJLgotICAgICAgCisKIEBlbmR2ZXJiYXRpbQogICAqIEB7CiAgICovCiAKIC8qKgotICAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgUVNQSSBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKLSAgKiAgICAgICAgaW4gdGhlIFFTUElfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZXMgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgotICAqIEBwYXJhbSBocXNwaSBxc3BpIGhhbmRsZQorICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBRU1BJIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAqICAgICAgICBpbiB0aGUgUVNQSV9Jbml0VHlwZURlZiBhbmQgaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX0luaXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CiAgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIAorCiAgIC8qIENoZWNrIHRoZSBRU1BJIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgIGlmKGhxc3BpID09IE5VTEwpCiAgIHsKQEAgLTMxNyw5ICszMTMsOSBAQAogICB7CiAgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRkxBU0hfSUQoaHFzcGktPkluaXQuRmxhc2hJRCkpOwogICB9Ci0gIAorCiAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRVNFVCkKLSAgeyAKKyAgewogICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KICAgICBocXNwaS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKIApAQCAtMzQ5LDM1ICszNDUsMzggQEAKICNlbmRpZgogCiAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIHRoZSBRU1BJIG1lbW9yeSBhY2Nlc3MgKi8KLSAgICBIQUxfUVNQSV9TZXRUaW1lb3V0KGhxc3BpLCBIQUxfUVBTSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUpOworICAgIEhBTF9RU1BJX1NldFRpbWVvdXQoaHFzcGksIEhBTF9RU1BJX1RJTUVPVVRfREVGQVVMVF9WQUxVRSk7CiAgIH0KLSAgCisKICAgLyogQ29uZmlndXJlIFFTUEkgRklGTyBUaHJlc2hvbGQgKi8KLSAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0ZUSFJFUywgKChocXNwaS0+SW5pdC5GaWZvVGhyZXNob2xkIC0gMVUpIDw8IDhVKSk7CisgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GVEhSRVMsCisgICAgICAgICAgICAgKChocXNwaS0+SW5pdC5GaWZvVGhyZXNob2xkIC0gMVUpIDw8IFFVQURTUElfQ1JfRlRIUkVTX1BvcykpOwogCiAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSwgUkVTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOwogCiAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCiAgIHsKLSAgICAgICAgICAgICAgICAKICAgICAvKiBDb25maWd1cmUgUVNQSSBDbG9jayBQcmVzY2FsZXIgYW5kIFNhbXBsZSBTaGlmdCAqLwotICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwoUVVBRFNQSV9DUl9QUkVTQ0FMRVIgfCBRVUFEU1BJX0NSX1NTSElGVCB8IFFVQURTUElfQ1JfRlNFTCB8IFFVQURTUElfQ1JfREZNKSwgKChocXNwaS0+SW5pdC5DbG9ja1ByZXNjYWxlciA8PCAyNFUpfCBocXNwaS0+SW5pdC5TYW1wbGVTaGlmdGluZyB8IGhxc3BpLT5Jbml0LkZsYXNoSUR8IGhxc3BpLT5Jbml0LkR1YWxGbGFzaCApKTsKLSAgICAgICAgCisgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCAoUVVBRFNQSV9DUl9QUkVTQ0FMRVIgfCBRVUFEU1BJX0NSX1NTSElGVCB8IFFVQURTUElfQ1JfRlNFTCB8IFFVQURTUElfQ1JfREZNKSwKKyAgICAgICAgICAgICAgICgoaHFzcGktPkluaXQuQ2xvY2tQcmVzY2FsZXIgPDwgUVVBRFNQSV9DUl9QUkVTQ0FMRVJfUG9zKSB8CisgICAgICAgICAgICAgICAgaHFzcGktPkluaXQuU2FtcGxlU2hpZnRpbmcgIHwgaHFzcGktPkluaXQuRmxhc2hJRCB8IGhxc3BpLT5Jbml0LkR1YWxGbGFzaCkpOworCiAgICAgLyogQ29uZmlndXJlIFFTUEkgRmxhc2ggU2l6ZSwgQ1MgSGlnaCBUaW1lIGFuZCBDbG9jayBNb2RlICovCi0gICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRDUiwgKFFVQURTUElfRENSX0ZTSVpFIHwgUVVBRFNQSV9EQ1JfQ1NIVCB8IFFVQURTUElfRENSX0NLTU9ERSksIAotICAgICAgICAgICAgICAgKChocXNwaS0+SW5pdC5GbGFzaFNpemUgPDwgMTZVKSB8IGhxc3BpLT5Jbml0LkNoaXBTZWxlY3RIaWdoVGltZSB8IGhxc3BpLT5Jbml0LkNsb2NrTW9kZSkpOwotICAgIAorICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5EQ1IsIChRVUFEU1BJX0RDUl9GU0laRSB8IFFVQURTUElfRENSX0NTSFQgfCBRVUFEU1BJX0RDUl9DS01PREUpLAorICAgICAgICAgICAgICAgKChocXNwaS0+SW5pdC5GbGFzaFNpemUgPDwgUVVBRFNQSV9EQ1JfRlNJWkVfUG9zKSB8CisgICAgICAgICAgICAgICAgaHFzcGktPkluaXQuQ2hpcFNlbGVjdEhpZ2hUaW1lIHwgaHFzcGktPkluaXQuQ2xvY2tNb2RlKSk7CisKICAgICAvKiBFbmFibGUgdGhlIFFTUEkgcGVyaXBoZXJhbCAqLwogICAgIF9fSEFMX1FTUElfRU5BQkxFKGhxc3BpKTsKLSAgCisKICAgICAvKiBTZXQgUVNQSSBlcnJvciBjb2RlIHRvIG5vbmUgKi8KLSAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsgIAorICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOwogCiAgICAgLyogSW5pdGlhbGl6ZSB0aGUgUVNQSSBzdGF0ZSAqLwogICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwogICB9Ci0gIAorCiAgIC8qIFJlbGVhc2UgTG9jayAqLwogICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCkBAIC0zODYsOCArMzg1LDggQEAKIH0KIAogLyoqCi0gICogQGJyaWVmIERlSW5pdGlhbGl6ZXMgdGhlIFFTUEkgcGVyaXBoZXJhbCAKLSAgKiBAcGFyYW0gaHFzcGkgcXNwaSBoYW5kbGUKKyAgKiBAYnJpZWYgRGUtSW5pdGlhbGl6ZSB0aGUgUVNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9EZUluaXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKQEAgLTQyNyw0NyArNDI2LDQ3IEBACiB9CiAKIC8qKgotICAqIEBicmllZiBRU1BJIE1TUCBJbml0Ci0gICogQHBhcmFtIGhxc3BpIFFTUEkgaGFuZGxlCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFFTUEkgTVNQLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCi0gX193ZWFrIHZvaWQgSEFMX1FTUElfTXNwSW5pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQorX193ZWFrIHZvaWQgSEFMX1FTUElfTXNwSW5pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAKIC8qKgotICAqIEBicmllZiBRU1BJIE1TUCBEZUluaXQKLSAgKiBAcGFyYW0gaHFzcGkgUVNQSSBoYW5kbGUKKyAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBRU1BJIE1TUC4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotIF9fd2VhayB2b2lkIEhBTF9RU1BJX01zcERlSW5pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQorX193ZWFrIHZvaWQgSEFMX1FTUElfTXNwRGVJbml0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhxc3BpKTsKLSAgCisKICAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9RU1BJX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gCisgICAqLwogfQogCiAvKioKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zIAotICAqICBAYnJpZWYgUVNQSSBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucyAKKy8qKiBAZGVmZ3JvdXAgUVNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElucHV0IGFuZCBPdXRwdXQgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqICBAYnJpZWYgUVNQSSBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucwogICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgIFsuLl0KKyAgICBbLi5dCiAgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byA6CiAgICAgICAoKykgSGFuZGxlIHRoZSBpbnRlcnJ1cHRzLgogICAgICAgKCspIEhhbmRsZSB0aGUgY29tbWFuZCBzZXF1ZW5jZS4KQEAgLTQ4MSw5ICs0ODAsOSBAQAogICAqLwogCiAvKioKLSAgKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFFTUEkgaW50ZXJydXB0IHJlcXVlc3QuCi0gICogQHBhcmFtIGhxc3BpIFFTUEkgaGFuZGxlCi0gICogQHJldHZhbCBOb25lLgorICAqIEBicmllZiBIYW5kbGUgUVNQSSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQogICAqLwogdm9pZCBIQUxfUVNQSV9JUlFIYW5kbGVyKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCiB7CkBAIC00OTIsMTkgKzQ5MSwyMCBAQAogICB1aW50MzJfdCBpdHNvdXJjZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IpOwogCiAgIC8qIFFTUEkgRmlmbyBUaHJlc2hvbGQgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfRlQpIT0gUkVTRVQpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX0ZUKSE9IFJFU0VUKSkKKyAgaWYoKChmbGFnICYgUVNQSV9GTEFHX0ZUKSAhPSAwVSkgJiYgKChpdHNvdXJjZSAmIFFTUElfSVRfRlQpICE9IDBVKSkKICAgewogICAgIGRhdGFfcmVnID0gJmhxc3BpLT5JbnN0YW5jZS0+RFI7CiAKICAgICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9UWCkKICAgICB7CiAgICAgICAvKiBUcmFuc21pc3Npb24gcHJvY2VzcyAqLwotICAgICAgd2hpbGUoX19IQUxfUVNQSV9HRVRfRkxBRyhocXNwaSwgUVNQSV9GTEFHX0ZUKSAhPSAwVSkKKyAgICAgIHdoaWxlKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIFFTUElfRkxBR19GVCkgIT0gUkVTRVQpCiAgICAgICB7CiAgICAgICAgIGlmIChocXNwaS0+VHhYZmVyQ291bnQgPiAwVSkKICAgICAgICAgewotICAgICAgICAgIC8qIEZpbGwgdGhlIEZJRk8gdW50aWwgaXQgaXMgZnVsbCAqLwotICAgICAgICAgICooX19JTyB1aW50OF90ICopZGF0YV9yZWcgPSAqaHFzcGktPnBUeEJ1ZmZQdHIrKzsKKyAgICAgICAgICAvKiBGaWxsIHRoZSBGSUZPIHVudGlsIHRoZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCAqLworICAgICAgICAgICooKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnKSA9ICpocXNwaS0+cFR4QnVmZlB0cjsKKyAgICAgICAgICBocXNwaS0+cFR4QnVmZlB0cisrOwogICAgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudC0tOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKQEAgLTUxOSwxMiArNTE5LDEzIEBACiAgICAgZWxzZSBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9SWCkKICAgICB7CiAgICAgICAvKiBSZWNlaXZpbmcgUHJvY2VzcyAqLwotICAgICAgd2hpbGUoX19IQUxfUVNQSV9HRVRfRkxBRyhocXNwaSwgUVNQSV9GTEFHX0ZUKSAhPSAwVSkKKyAgICAgIHdoaWxlKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIFFTUElfRkxBR19GVCkgIT0gUkVTRVQpCiAgICAgICB7CiAgICAgICAgIGlmIChocXNwaS0+UnhYZmVyQ291bnQgPiAwVSkKICAgICAgICAgewotICAgICAgICAgIC8qIFJlYWQgdGhlIEZJRk8gdW50aWwgaXQgaXMgZW1wdHkgKi8KLSAgICAgICAgICAqaHFzcGktPnBSeEJ1ZmZQdHIrKyA9ICooX19JTyB1aW50OF90ICopZGF0YV9yZWc7CisgICAgICAgICAgLyogUmVhZCB0aGUgRklGTyB1bnRpbCB0aGUgdGhyZXNob2xkIGlzIHJlYWNoZWQgKi8KKyAgICAgICAgICAqaHFzcGktPnBSeEJ1ZmZQdHIgPSAqKChfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZyk7CisgICAgICAgICAgaHFzcGktPnBSeEJ1ZmZQdHIrKzsKICAgICAgICAgICBocXNwaS0+UnhYZmVyQ291bnQtLTsKICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC01MzYsNyArNTM3LDExIEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKICAgICAvKiBGSUZPIFRocmVzaG9sZCBjYWxsYmFjayAqLwogI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgaHFzcGktPkZpZm9UaHJlc2hvbGRDYWxsYmFjayhocXNwaSk7CkBAIC01NDYsMjkgKzU1MSwyOSBAQAogICB9CiAKICAgLyogUVNQSSBUcmFuc2ZlciBDb21wbGV0ZSBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGVsc2UgaWYoKChmbGFnICYgUVNQSV9GTEFHX1RDKSE9IFJFU0VUKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9UQykhPSBSRVNFVCkpCisgIGVsc2UgaWYoKChmbGFnICYgUVNQSV9GTEFHX1RDKSAhPSAwVSkgJiYgKChpdHNvdXJjZSAmIFFTUElfSVRfVEMpICE9IDBVKSkKICAgewogICAgIC8qIENsZWFyIGludGVycnVwdCAqLwogICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkZDUiwgUVNQSV9GTEFHX1RDKTsKIAogICAgIC8qIERpc2FibGUgdGhlIFFTUEkgRklGTyBUaHJlc2hvbGQsIFRyYW5zZmVyIEVycm9yIGFuZCBUcmFuc2ZlciBjb21wbGV0ZSBJbnRlcnJ1cHRzICovCiAgICAgX19IQUxfUVNQSV9ESVNBQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RDIHwgUVNQSV9JVF9URSB8IFFTUElfSVRfRlQpOwotICAgIAorCiAgICAgLyogVHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KICAgICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9UWCkKICAgICB7Ci0gICAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSE9IFJFU0VUKQorICAgICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikgIT0gMFUpCiAgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBieSBjbGVhcmluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCiAgICAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKLSAgICAgICAgCisKICAgICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KICAgICAgICAgX19IQUxfRE1BX0RJU0FCTEUoaHFzcGktPmhkbWEpOwogICAgICAgfQogCiAgICAgICAvKiBDbGVhciBCdXN5IGJpdCAqLwogICAgICAgSEFMX1FTUElfQWJvcnRfSVQoaHFzcGkpOwotICAgICAgCisKICAgICAgIC8qIENoYW5nZSBzdGF0ZSBvZiBRU1BJICovCiAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKIApAQCAtNTgxLDExICs1ODYsMTEgQEAKICAgICB9CiAgICAgZWxzZSBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9SWCkKICAgICB7Ci0gICAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSE9IFJFU0VUKQorICAgICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikgIT0gMFUpCiAgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBieSBjbGVhcmluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCiAgICAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKLSAgICAgICAgCisKICAgICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KICAgICAgICAgX19IQUxfRE1BX0RJU0FCTEUoaHFzcGktPmhkbWEpOwogICAgICAgfQpAQCAtNTk3LDcgKzYwMiw4IEBACiAgICAgICAgICAgaWYgKGhxc3BpLT5SeFhmZXJDb3VudCA+IDBVKQogICAgICAgICAgIHsKICAgICAgICAgICAgIC8qIFJlYWQgdGhlIGxhc3QgZGF0YSByZWNlaXZlZCBpbiB0aGUgRklGTyB1bnRpbCBpdCBpcyBlbXB0eSAqLwotICAgICAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyKysgPSAqKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnOworICAgICAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyID0gKigoX19JTyB1aW50OF90ICopZGF0YV9yZWcpOworICAgICAgICAgICAgaHFzcGktPnBSeEJ1ZmZQdHIrKzsKICAgICAgICAgICAgIGhxc3BpLT5SeFhmZXJDb3VudC0tOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCkBAIC02MDcsOSArNjEzLDEwIEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CisKICAgICAgIC8qIFdvcmthcm91bmQgLSBFeHRyYSBkYXRhIHdyaXR0ZW4gaW4gdGhlIEZJRk8gYXQgdGhlIGVuZCBvZiBhIHJlYWQgdHJhbnNmZXIgKi8KICAgICAgIEhBTF9RU1BJX0Fib3J0X0lUKGhxc3BpKTsKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLwogICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAKQEAgLTYzNCw2ICs2NDEsOSBAQAogICAgIH0KICAgICBlbHNlIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9BQk9SVCkKICAgICB7CisgICAgICAvKiBSZXNldCBmdW5jdGlvbmFsIG1vZGUgY29uZmlndXJhdGlvbiB0byBpbmRpcmVjdCB3cml0ZSBtb2RlIGJ5IGRlZmF1bHQgKi8KKyAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNDUiwgUVVBRFNQSV9DQ1JfRk1PREUpOworCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLwogICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAKQEAgLTY0OCw3ICs2NTgsNyBAQAogICAgICAgICBIQUxfUVNQSV9BYm9ydENwbHRDYWxsYmFjayhocXNwaSk7CiAjZW5kaWYKICAgICAgIH0KLSAgICAgIGVsc2UgCisgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIC8qIEFib3J0IGR1ZSB0byBhbiBlcnJvciAoZWcgOiAgRE1BIGVycm9yKSAqLwogCkBAIC02NjAsMTQgKzY3MCwxOCBAQAogI2VuZGlmCiAgICAgICB9CiAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CiAgIH0KIAogICAvKiBRU1BJIFN0YXR1cyBNYXRjaCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfU00pIT0gUkVTRVQpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX1NNKSE9IFJFU0VUKSkKKyAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfU00pICE9IDBVKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9TTSkgIT0gMFUpKQogICB7CiAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCiAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RkNSLCBRU1BJX0ZMQUdfU00pOwotICAgCisKICAgICAvKiBDaGVjayBpZiB0aGUgYXV0b21hdGljIHBvbGwgbW9kZSBzdG9wIGlzIGFjdGl2YXRlZCAqLwogICAgIGlmKFJFQURfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfQVBNUykgIT0gMFUpCiAgICAgewpAQCAtNjg3LDIyICs3MDEsMjIgQEAKICAgfQogCiAgIC8qIFFTUEkgVHJhbnNmZXIgRXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBlbHNlIGlmKCgoZmxhZyAmIFFTUElfRkxBR19URSkhPSBSRVNFVCkgJiYgKChpdHNvdXJjZSAmIFFTUElfSVRfVEUpIT0gUkVTRVQpKQorICBlbHNlIGlmKCgoZmxhZyAmIFFTUElfRkxBR19URSkgIT0gMFUpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX1RFKSAhPSAwVSkpCiAgIHsKICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5GQ1IsIFFTUElfRkxBR19URSk7Ci0gICAgCisKICAgICAvKiBEaXNhYmxlIGFsbCB0aGUgUVNQSSBJbnRlcnJ1cHRzICovCiAgICAgX19IQUxfUVNQSV9ESVNBQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1NNIHwgUVNQSV9JVF9UQyB8IFFTUElfSVRfVEUgfCBRU1BJX0lUX0ZUKTsKIAogICAgIC8qIFNldCBlcnJvciBjb2RlICovCiAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9UUkFOU0ZFUjsKLSAgICAKLSAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSE9IFJFU0VUKQorCisgICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikgIT0gMFUpCiAgICAgewogICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGJ5IGNsZWFyaW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KICAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKLSAgICAgIAorCiAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgY2hhbm5lbCAqLwogICAgICAgaHFzcGktPmhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gUVNQSV9ETUFBYm9ydENwbHQ7CiAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChocXNwaS0+aGRtYSkgIT0gSEFMX09LKQpAQCAtNzI1LDcgKzczOSw3IEBACiAgICAgewogICAgICAgLyogQ2hhbmdlIHN0YXRlIG9mIFFTUEkgKi8KICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwotICAgICAgCisKICAgICAgIC8qIEVycm9yIGNhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgIGhxc3BpLT5FcnJvckNhbGxiYWNrKGhxc3BpKTsKQEAgLTczNiw3ICs3NTAsNyBAQAogICB9CiAKICAgLyogUVNQSSBUaW1lb3V0IGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGVsc2UgaWYoKChmbGFnICYgUVNQSV9GTEFHX1RPKSE9IFJFU0VUKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9UTykhPSBSRVNFVCkpCisgIGVsc2UgaWYoKChmbGFnICYgUVNQSV9GTEFHX1RPKSAhPSAwVSkgJiYgKChpdHNvdXJjZSAmIFFTUElfSVRfVE8pICE9IDBVKSkKICAgewogICAgIC8qIENsZWFyIGludGVycnVwdCAqLwogICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkZDUiwgUVNQSV9GTEFHX1RPKTsKQEAgLTc0OCwyMSArNzYyLDI2IEBACiAgICAgSEFMX1FTUElfVGltZU91dENhbGxiYWNrKGhxc3BpKTsKICNlbmRpZgogICB9CisKKyAgIGVsc2UKKyAgeworICAgLyogTm90aGluZyB0byBkbyAqLworICB9CiB9CiAKIC8qKgotICAqIEBicmllZiBTZXRzIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24uIAotICAqIEBwYXJhbSBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSBjbWQgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgKiBAcGFyYW0gVGltZW91dCAgVGltZSBvdXQgZHVyYXRpb24KKyAgKiBAYnJpZWYgU2V0IHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24uCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSBUaW1lb3V0IDogVGltZW91dCBkdXJhdGlvbgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgUmVhZCBvciBXcml0ZSBNb2RlcwogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1FTUElfQ29tbWFuZChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKKwogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlKSk7CiAgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCkBAIC03ODgsNTIgKzgwNyw1MSBAQAogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9ERFJfTU9ERShjbWQtPkRkck1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX0hIQyhjbWQtPkRkckhvbGRIYWxmQ3ljbGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7CiAKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgUVNQSSBzdGF0ZSAqLwotICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1k7ICAgCi0gICAgCisgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWTsKKwogICAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKLSAgICAKKwogICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgIHsKICAgICAgIC8qIENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi8KICAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1dSSVRFKTsKLSAgICAgIAorCiAgICAgICBpZiAoY21kLT5EYXRhTW9kZSA9PSBRU1BJX0RBVEFfTk9ORSkKICAgICAgIHsKLSAgICAgICAgLyogV2hlbiB0aGVyZSBpcyBubyBkYXRhIHBoYXNlLCB0aGUgdHJhbnNmZXIgc3RhcnQgYXMgc29vbiBhcyB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lIAorICAgICAgICAvKiBXaGVuIHRoZXJlIGlzIG5vIGRhdGEgcGhhc2UsIHRoZSB0cmFuc2ZlciBzdGFydCBhcyBzb29uIGFzIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmUKICAgICAgICAgc28gd2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KICAgICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfVEMsIFNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKIAogICAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgICAgewogICAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCi0gICAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7ICAgCisgICAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCi0gICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOyAgIAorICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAgIH0KLSAgCisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCkBAIC04NDIsMTcgKzg2MCwxNyBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgU2V0cyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluIGludGVycnVwdCBtb2RlLiAKLSAgKiBAcGFyYW0gaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gY21kICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgICogQGJyaWVmIFNldCB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtIGNtZCA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFJlYWQgb3IgV3JpdGUgTW9kZXMKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX0NvbW1hbmRfSVQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgUVNQSV9Db21tYW5kVHlwZURlZiAqY21kKQogewotICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7Ci0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKLSAgCisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKKyAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKwogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlKSk7CiAgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCkBAIC04NzgsMzAgKzg5NiwyMCBAQAogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9ERFJfTU9ERShjbWQtPkRkck1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX0hIQyhjbWQtPkRkckhvbGRIYWxmQ3ljbGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7CiAKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgUVNQSSBzdGF0ZSAqLwotICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1k7ICAgCi0gICAgCisgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWTsKKwogICAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KLSAgIGNvdW50ID0gKGhxc3BpLT5UaW1lb3V0KSAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAxNlUgLyAxMDAwVSk7Ci0gICBkbyAKLSAgIHsKLSAgICAgaWYgKGNvdW50LS0gPT0gMFUpCi0gICAgIHsgCi0gICAgICAgIGhxc3BpLT5TdGF0ZSAgICAgPSBIQUxfUVNQSV9TVEFURV9FUlJPUjsKLSAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9USU1FT1VUOwotICAgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKLSAgICAgfQotICAgfSAKLSAgIHdoaWxlICgoX19IQUxfUVNQSV9HRVRfRkxBRyhocXNwaSwgUVNQSV9GTEFHX0JVU1kpKSAhPSBSRVNFVCk7Ci0gICAKKyAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBocXNwaS0+VGltZW91dCk7CisKICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICB7CiAgICAgICBpZiAoY21kLT5EYXRhTW9kZSA9PSBRU1BJX0RBVEFfTk9ORSkKQEAgLTkwOSwxMyArOTE3LDEzIEBACiAgICAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLwogICAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19URSB8IFFTUElfRkxBR19UQyk7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLyogQ2FsbCB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAqLwogICAgICAgUVNQSV9Db25maWcoaHFzcGksIGNtZCwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEUpOwotICAgICAgCisKICAgICAgIGlmIChjbWQtPkRhdGFNb2RlID09IFFTUElfREFUQV9OT05FKQogICAgICAgewotICAgICAgICAvKiBXaGVuIHRoZXJlIGlzIG5vIGRhdGEgcGhhc2UsIHRoZSB0cmFuc2ZlciBzdGFydCBhcyBzb29uIGFzIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmUgCisgICAgICAgIC8qIFdoZW4gdGhlcmUgaXMgbm8gZGF0YSBwaGFzZSwgdGhlIHRyYW5zZmVyIHN0YXJ0IGFzIHNvb24gYXMgdGhlIGNvbmZpZ3VyYXRpb24gaXMgZG9uZQogICAgICAgICBzbyBhY3RpdmF0ZSBUQyBhbmQgVEUgaW50ZXJydXB0cyAqLwogICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CkBAIC05MjYsNyArOTM0LDcgQEAKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KLSAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7ICAgCisgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwogCiAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKQEAgLTk0MCwyNyArOTQ4LDI3IEBACiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAKICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKICAgfQotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgotICAqIEBicmllZiBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLiAKLSAgKiBAcGFyYW0gaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgotICAqIEBwYXJhbSBUaW1lb3V0ICBUaW1lIG91dCBkdXJhdGlvbgorICAqIEBicmllZiBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSBUaW1lb3V0IDogVGltZW91dCBkdXJhdGlvbgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgV3JpdGUgTW9kZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1FTUElfVHJhbnNtaXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKICAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgX19JTyB1aW50MzJfdCAqZGF0YV9yZWcgPSAmaHFzcGktPkluc3RhbmNlLT5EUjsKIApAQCAtOTc1LDEyICs5ODMsMTIgQEAKICAgICB7CiAgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfVFg7Ci0gICAgICAKKwogICAgICAgLyogQ29uZmlndXJlIGNvdW50ZXJzIGFuZCBzaXplIG9mIHRoZSBoYW5kbGUgKi8KICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudCA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOwogICAgICAgaHFzcGktPlR4WGZlclNpemUgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVTsKICAgICAgIGhxc3BpLT5wVHhCdWZmUHRyID0gcERhdGE7Ci0gICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBmdW5jdGlvbmFsIGFzIGluZGlyZWN0IHdyaXRlICovCiAgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEUpOwogCkBAIC05OTAsMTQgKzk5OCwxNSBAQAogICAgICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19GVCwgU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOwogCiAgICAgICAgIGlmIChzdGF0dXMgIT0gSEFMX09LKQotICAgICAgICB7IAorICAgICAgICB7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICAqKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnID0gKmhxc3BpLT5wVHhCdWZmUHRyKys7CisgICAgICAgICooKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnKSA9ICpocXNwaS0+cFR4QnVmZlB0cjsKKyAgICAgICAgaHFzcGktPnBUeEJ1ZmZQdHIrKzsKICAgICAgICAgaHFzcGktPlR4WGZlckNvdW50LS07CiAgICAgICB9Ci0gICAgCisKICAgICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgICAgewogICAgICAgICAvKiBXYWl0IHVudGlsIFRDIGZsYWcgaXMgc2V0IHRvIGdvIGJhY2sgaW4gaWRsZSBzdGF0ZSAqLwpAQCAtMTAwNywxNCArMTAxNiwxNCBAQAogICAgICAgICB7CiAgICAgICAgICAgLyogQ2xlYXIgVHJhbnNmZXIgQ29tcGxldGUgYml0ICovCiAgICAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEMpOwotICAgICAgICAgIAorCiAgICAgICAgICAgLyogQ2xlYXIgQnVzeSBiaXQgKi8KICAgICAgICAgICBzdGF0dXMgPSBIQUxfUVNQSV9BYm9ydChocXNwaSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAKKwogICAgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KLSAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOyAgICAKKyAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTAzNSwxMCArMTA0NCwxMCBAQAogCiAKIC8qKgotICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgCi0gICogQHBhcmFtIGhxc3BpIFFTUEkgaGFuZGxlCi0gICogQHBhcmFtIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKLSAgKiBAcGFyYW0gVGltZW91dCAgVGltZSBvdXQgZHVyYXRpb24KKyAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBwYXJhbSBUaW1lb3V0IDogVGltZW91dCBkdXJhdGlvbgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgUmVhZCBNb2RlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0xMDUxLDE1ICsxMDYwLDE2IEBACiAKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7Ci0gIAorCiAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKICAgewogICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOworCiAgICAgaWYocERhdGEgIT0gTlVMTCApCiAgICAgewogICAgICAgLyogVXBkYXRlIHN0YXRlICovCiAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1JYOwotICAgIAorCiAgICAgICAvKiBDb25maWd1cmUgY291bnRlcnMgYW5kIHNpemUgb2YgdGhlIGhhbmRsZSAqLwogICAgICAgaHFzcGktPlJ4WGZlckNvdW50ID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CiAgICAgICBocXNwaS0+UnhYZmVyU2l6ZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOwpAQCAtMTA3MCwyMSArMTA4MCwyMiBAQAogCiAgICAgICAvKiBTdGFydCB0aGUgdHJhbnNmZXIgYnkgcmUtd3JpdGluZyB0aGUgYWRkcmVzcyBpbiBBUiByZWdpc3RlciAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+QVIsIGFkZHJfcmVnKTsKLSAgICAgIAorCiAgICAgICB3aGlsZShocXNwaS0+UnhYZmVyQ291bnQgPiAwVSkKICAgICAgIHsKICAgICAgICAgLyogV2FpdCB1bnRpbCBGVCBvciBUQyBmbGFnIGlzIHNldCB0byByZWFkIHJlY2VpdmVkIGRhdGEgKi8KICAgICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCAoUVNQSV9GTEFHX0ZUIHwgUVNQSV9GTEFHX1RDKSwgU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOwogCiAgICAgICAgIGlmICAoc3RhdHVzICE9IEhBTF9PSykKLSAgICAgICAgeyAKKyAgICAgICAgewogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyKysgPSAqKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnOworICAgICAgICAqaHFzcGktPnBSeEJ1ZmZQdHIgPSAqKChfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZyk7CisgICAgICAgIGhxc3BpLT5wUnhCdWZmUHRyKys7CiAgICAgICAgIGhxc3BpLT5SeFhmZXJDb3VudC0tOwogICAgICAgfQotICAgIAorCiAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgIHsKICAgICAgICAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KQEAgLTEwOTQsMTQgKzExMDUsMTQgQEAKICAgICAgICAgewogICAgICAgICAgIC8qIENsZWFyIFRyYW5zZmVyIENvbXBsZXRlIGJpdCAqLwogICAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKLSAgICAgICAgICAKLSAgICAgICAgIC8qIFdvcmthcm91bmQgLSBFeHRyYSBkYXRhIHdyaXR0ZW4gaW4gdGhlIEZJRk8gYXQgdGhlIGVuZCBvZiBhIHJlYWQgdHJhbnNmZXIgKi8KLSAgICAgICAgIHN0YXR1cyA9IEhBTF9RU1BJX0Fib3J0KGhxc3BpKTsKKworICAgICAgICAgIC8qIFdvcmthcm91bmQgLSBFeHRyYSBkYXRhIHdyaXR0ZW4gaW4gdGhlIEZJRk8gYXQgdGhlIGVuZCBvZiBhIHJlYWQgdHJhbnNmZXIgKi8KKyAgICAgICAgICBzdGF0dXMgPSBIQUxfUVNQSV9BYm9ydChocXNwaSk7CiAgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KLSAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOyAgICAKKyAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTExMyw3ICsxMTI0LDcgQEAKICAgewogICAgIHN0YXR1cyA9IEhBTF9CVVNZOwogICB9Ci0gIAorCiAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKIApAQCAtMTEyMSwyMiArMTEzMiwyMyBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUgCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgV3JpdGUgTW9kZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1FTUElfVHJhbnNtaXRfSVQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDhfdCAqcERhdGEpCi17ICAKK3sKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICAKKwogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhxc3BpKTsKIAogICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCiAgIHsKICAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKKwogICAgIGlmKHBEYXRhICE9IE5VTEwgKQogICAgIHsKICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLwpAQCAtMTE0NiwxOSArMTE1OCwxOCBAQAogICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CiAgICAgICBocXNwaS0+VHhYZmVyU2l6ZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOwogICAgICAgaHFzcGktPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKLSAgICAKLSAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBmdW5jdGlvbmFsIGFzIGluZGlyZWN0IHdyaXRlICovCi0gICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEUpOwotICAgIAorCiAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1RDKTsKIAorICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3Qgd3JpdGUgKi8KKyAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7CisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7Ci0gICAgICAKKwogICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yLCBGSUZPIHRocmVzaG9sZCBhbmQgdHJhbnNmZXIgY29tcGxldGUgSW50ZXJydXB0cyAqLwogICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEUgfCBRU1BJX0lUX0ZUIHwgUVNQSV9JVF9UQyk7Ci0gICAgICAKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTExODEsOSArMTE5Miw5IEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBuby1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0Ci0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgUmVhZCBNb2RlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0xMTkxLDMzICsxMjAyLDMzIEBACiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKICAgdWludDMyX3QgYWRkcl9yZWcgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSKTsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7CiAKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICBpZihwRGF0YSAhPSBOVUxMICkKICAgICB7CiAgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlg7Ci0gICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBhbmQgc2l6ZSBvZiB0aGUgaGFuZGxlICovCiAgICAgICBocXNwaS0+UnhYZmVyQ291bnQgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVTsKICAgICAgIGhxc3BpLT5SeFhmZXJTaXplID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CiAgICAgICBocXNwaS0+cFJ4QnVmZlB0ciA9IHBEYXRhOwogCisgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1RDKTsKKwogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3QgcmVhZCAqLwogICAgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgUVVBRFNQSV9DQ1JfRk1PREUsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1JFQUQpOwogCiAgICAgICAvKiBTdGFydCB0aGUgdHJhbnNmZXIgYnkgcmUtd3JpdGluZyB0aGUgYWRkcmVzcyBpbiBBUiByZWdpc3RlciAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+QVIsIGFkZHJfcmVnKTsKIAotICAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCi0gICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19URSB8IFFTUElfRkxBR19UQyk7Ci0KICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CiAKQEAgLTEyMzUsNyArMTI0Niw3IEBACiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAKICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKQEAgLTEyNDUsMjAgKzEyNTYsMTkgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBTZW5kcyBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4gCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBicmllZiAgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgV3JpdGUgTW9kZQotICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQsIHRoZSBudW1iZXIgCisgICogQG5vdGUgICBJZiBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgaXMgY29uZmlndXJlZCBhcyBoYWxmd29yZCwgdGhlIG51bWJlcgogICAqICAgICAgICAgb2YgZGF0YSBhbmQgdGhlIGZpZm8gdGhyZXNob2xkIHNob3VsZCBiZSBhbGlnbmVkIG9uIGhhbGZ3b3JkCi0gICogQG5vdGUgICBJZiBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgaXMgY29uZmlndXJlZCBhcyB3b3JkLCB0aGUgbnVtYmVyIAorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgd29yZCwgdGhlIG51bWJlcgogICAqICAgICAgICAgb2YgZGF0YSBhbmQgdGhlIGZpZm8gdGhyZXNob2xkIHNob3VsZCBiZSBhbGlnbmVkIG9uIHdvcmQKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1RyYW5zbWl0X0RNQShRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50OF90ICpwRGF0YSkKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICB1aW50MzJfdCAqdG1wOwogICB1aW50MzJfdCBkYXRhX3NpemUgPSAoUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVUpOwogCiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCkBAIC0xMjY2LDEwICsxMjc2LDEwIEBACiAKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7Ci0gICAgLyogQ2xlYXIgdGhlIGVycm9yIGNvZGUgKi8gICAgICAgICAgICAgICAgCisgICAgLyogQ2xlYXIgdGhlIGVycm9yIGNvZGUgKi8KICAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKIAotICAgIGlmKHBEYXRhICE9IE5VTEwgKSAKKyAgICBpZihwRGF0YSAhPSBOVUxMICkKICAgICB7CiAgICAgICAvKiBDb25maWd1cmUgY291bnRlcnMgb2YgdGhlIGhhbmRsZSAqLwogICAgICAgaWYgKGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgPT0gRE1BX1BEQVRBQUxJR05fQllURSkKQEAgLTEyODAsNyArMTI5MCw3IEBACiAgICAgICB7CiAgICAgICAgIGlmICgoKGRhdGFfc2l6ZSAlIDJVKSAhPSAwVSkgfHwgKChocXNwaS0+SW5pdC5GaWZvVGhyZXNob2xkICUgMlUpICE9IDBVKSkKICAgICAgICAgewotICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgZGF0YSBvciB0aGUgZmlmbyB0aHJlc2hvbGQgaXMgbm90IGFsaWduZWQgb24gaGFsZndvcmQgCisgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiBoYWxmd29yZAogICAgICAgICAgID0+IG5vIHRyYW5zZmVyIHBvc3NpYmxlIHdpdGggRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQgKi8KICAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfUEFSQU07CiAgICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwpAQCAtMTI5MCwxNCArMTMwMCwxNCBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudCA9IChkYXRhX3NpemUgPj4gMSk7CisgICAgICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gKGRhdGFfc2l6ZSA+PiAxVSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UgaWYgKGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgPT0gRE1BX1BEQVRBQUxJR05fV09SRCkKICAgICAgIHsKICAgICAgICAgaWYgKCgoZGF0YV9zaXplICUgNFUpICE9IDBVKSB8fCAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgJSA0VSkgIT0gMFUpKQogICAgICAgICB7Ci0gICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiB3b3JkIAorICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgZGF0YSBvciB0aGUgZmlmbyB0aHJlc2hvbGQgaXMgbm90IGFsaWduZWQgb24gd29yZAogICAgICAgICAgID0+IG5vIHRyYW5zZmVyIHBvc3NpYmxlIHdpdGggRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGNvbmZpZ3VyZWQgYXMgd29yZCAqLwogICAgICAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9QQVJBTTsKICAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CkBAIC0xMzEwLDc5ICsxMzIwLDkxIEBACiAgICAgICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gKGRhdGFfc2l6ZSA+PiAyVSk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQogCiAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgIHsKLSAgICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLwotICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9UWDsKKyAgICAgICAgLyogVXBkYXRlIHN0YXRlICovCisgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfVFg7CiAKLSAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLwotICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCAoUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1RDKSk7CisgICAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLworICAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIChRU1BJX0ZMQUdfVEUgfCBRU1BJX0ZMQUdfVEMpKTsKIAotICAgICAgLyogQ29uZmlndXJlIHNpemUgYW5kIHBvaW50ZXIgb2YgdGhlIGhhbmRsZSAqLwotICAgICAgaHFzcGktPlR4WGZlclNpemUgPSBocXNwaS0+VHhYZmVyQ291bnQ7Ci0gICAgICBocXNwaS0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgICAgICAvKiBDb25maWd1cmUgc2l6ZSBhbmQgcG9pbnRlciBvZiB0aGUgaGFuZGxlICovCisgICAgICAgIGhxc3BpLT5UeFhmZXJTaXplID0gaHFzcGktPlR4WGZlckNvdW50OworICAgICAgICBocXNwaS0+cFR4QnVmZlB0ciA9IHBEYXRhOwogCi0gICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBtb2RlIGFzIGluZGlyZWN0IHdyaXRlICovCi0gICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEUpOworICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBtb2RlIGFzIGluZGlyZWN0IHdyaXRlICovCisgICAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7CiAKLSAgICAgIC8qIFNldCB0aGUgUVNQSSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KLSAgICAgIGhxc3BpLT5oZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gUVNQSV9ETUFUeENwbHQ7CisgICAgICAgIC8qIFNldCB0aGUgUVNQSSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgICAgaHFzcGktPmhkbWEtPlhmZXJDcGx0Q2FsbGJhY2sgPSBRU1BJX0RNQVR4Q3BsdDsKIAotICAgICAgLyogU2V0IHRoZSBRU1BJIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0gICAgICBocXNwaS0+aGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBRU1BJX0RNQVR4SGFsZkNwbHQ7CisgICAgICAgIC8qIFNldCB0aGUgUVNQSSBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworICAgICAgICBocXNwaS0+aGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBRU1BJX0RNQVR4SGFsZkNwbHQ7CiAKLSAgICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCi0gICAgICBocXNwaS0+aGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBRU1BJX0RNQUVycm9yOworICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBocXNwaS0+aGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBRU1BJX0RNQUVycm9yOwogCi0gICAgICAvKiBDbGVhciB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCi0gICAgICBocXNwaS0+aGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAvKiBDbGVhciB0aGUgRE1BIGFib3J0IGNhbGxiYWNrICovCisgICAgICAgIGhxc3BpLT5oZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CiAKICNpZiBkZWZpbmVkIChRU1BJMV9WMl8xTCkKLSAgICAgIC8qIEJ1ZyAiRVMwMzA1IHNlY3Rpb24gMi4xLjggSW4gc29tZSBzcGVjaWZpYyBjYXNlcywgRE1BMiBkYXRhIGNvcnJ1cHRpb24gb2NjdXJzIHdoZW4gbWFuYWdpbmcKLSAgICAgICAgIEFIQiBhbmQgQVBCMiBwZXJpcGhlcmFscyBpbiBhIGNvbmN1cnJlbnQgd2F5IiBXb3JrYXJvdW5kIEltcGxlbWVudGF0aW9uOgotICAgICAgICAgQ2hhbmdlIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBvZiBETUEgcGVyaXBoZXJhbAotICAgICAgICAgICAtIEVuYWJsZSBwZXJpcGhlcmFsIGluY3JlbWVudAotICAgICAgICAgICAtIERpc2FibGUgbWVtb3J5IGluY3JlbWVudAotICAgICAgICAgICAtIFNldCBETUEgZGlyZWN0aW9uIGFzIHBlcmlwaGVyYWwgdG8gbWVtb3J5IG1vZGUgKi8KKyAgICAgICAgLyogQnVnICJFUzAzMDUgc2VjdGlvbiAyLjEuOCBJbiBzb21lIHNwZWNpZmljIGNhc2VzLCBETUEyIGRhdGEgY29ycnVwdGlvbiBvY2N1cnMgd2hlbiBtYW5hZ2luZworICAgICAgICAgICBBSEIgYW5kIEFQQjIgcGVyaXBoZXJhbHMgaW4gYSBjb25jdXJyZW50IHdheSIgV29ya2Fyb3VuZCBJbXBsZW1lbnRhdGlvbjoKKyAgICAgICAgICAgQ2hhbmdlIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBvZiBETUEgcGVyaXBoZXJhbAorICAgICAgICAgICAgIC0gRW5hYmxlIHBlcmlwaGVyYWwgaW5jcmVtZW50CisgICAgICAgICAgICAgLSBEaXNhYmxlIG1lbW9yeSBpbmNyZW1lbnQKKyAgICAgICAgICAgICAtIFNldCBETUEgZGlyZWN0aW9uIGFzIHBlcmlwaGVyYWwgdG8gbWVtb3J5IG1vZGUgKi8KIAogICAgICAgICAvKiBFbmFibGUgcGVyaXBoZXJhbCBpbmNyZW1lbnQgbW9kZSBvZiB0aGUgRE1BICovCiAgICAgICAgIGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaEluYyA9IERNQV9QSU5DX0VOQUJMRTsKIAogICAgICAgICAvKiBEaXNhYmxlIG1lbW9yeSBpbmNyZW1lbnQgbW9kZSBvZiB0aGUgRE1BICovCiAgICAgICAgIGhxc3BpLT5oZG1hLT5Jbml0Lk1lbUluYyA9IERNQV9NSU5DX0RJU0FCTEU7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIFVwZGF0ZSBwZXJpcGhlcmFsL21lbW9yeSBpbmNyZW1lbnQgbW9kZSBiaXRzICovCiAgICAgICAgIE1PRElGWV9SRUcoaHFzcGktPmhkbWEtPkluc3RhbmNlLT5DUiwgKERNQV9TeENSX01JTkMgfCBETUFfU3hDUl9QSU5DKSwgKGhxc3BpLT5oZG1hLT5Jbml0Lk1lbUluYyB8IGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaEluYykpOwogCiAgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBETUEgKi8KICAgICAgICAgaHFzcGktPmhkbWEtPkluaXQuRGlyZWN0aW9uID0gRE1BX1BFUklQSF9UT19NRU1PUlk7Ci0jZWxzZSAgICAgICAgCi0gICAgICAvKiBDb25maWd1cmUgdGhlIGRpcmVjdGlvbiBvZiB0aGUgRE1BICovCi0gICAgICBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24gPSBETUFfTUVNT1JZX1RPX1BFUklQSDsKKyNlbHNlCisgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBETUEgKi8KKyAgICAgICAgaHFzcGktPmhkbWEtPkluaXQuRGlyZWN0aW9uID0gRE1BX01FTU9SWV9UT19QRVJJUEg7CiAjZW5kaWYgLyogUVNQSTFfVjJfMUwgKi8KIAotICAgICAgLyogVXBkYXRlIGRpcmVjdGlvbiBtb2RlIGJpdCAqLwotICAgICAgTU9ESUZZX1JFRyhocXNwaS0+aGRtYS0+SW5zdGFuY2UtPkNSLCBETUFfU3hDUl9ESVIsIGhxc3BpLT5oZG1hLT5Jbml0LkRpcmVjdGlvbik7CisgICAgICAgIC8qIFVwZGF0ZSBkaXJlY3Rpb24gbW9kZSBiaXQgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+aGRtYS0+SW5zdGFuY2UtPkNSLCBETUFfU3hDUl9ESVIsIGhxc3BpLT5oZG1hLT5Jbml0LkRpcmVjdGlvbik7CiAKLSAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSB0cmFuc21pdCBETUEgQ2hhbm5lbCAqLwotICAgICAgdG1wID0gKHVpbnQzMl90KikmcERhdGE7Ci0gICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhxc3BpLT5oZG1hLCAqKHVpbnQzMl90Kil0bXAsICh1aW50MzJfdCkmaHFzcGktPkluc3RhbmNlLT5EUiwgaHFzcGktPlR4WGZlclNpemUpOworICAgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgdHJhbnNtaXQgRE1BIENoYW5uZWwgKi8KKyAgICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHFzcGktPmhkbWEsICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KSZocXNwaS0+SW5zdGFuY2UtPkRSLCBocXNwaS0+VHhYZmVyU2l6ZSkgPT0gSEFMX09LKQorICAgICAgICB7CisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgICAgCisgICAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yIEludGVycnVwdCAqLworICAgICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBieSBzZXR0aW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKKyAgICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwotICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKLQotICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yIEludGVycnVwdCAqLwotICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEUpOwotCi0gICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBieSBzZXR0aW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KLSAgICAgIFNFVF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7Ci0gICAgICB9CisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgIH0KKyAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNOwotCiAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KQEAgLTEzOTEsNyArMTQxMyw3IEBACiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAKICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKQEAgLTE0MDEsMjAgKzE0MjMsMTkgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBSZWNlaXZlcyBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24gYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4gCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSA6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCiAgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBJbmRpcmVjdCBSZWFkIE1vZGUKLSAgKiBAbm90ZSAgIElmIERNQSBwZXJpcGhlcmFsIGFjY2VzcyBpcyBjb25maWd1cmVkIGFzIGhhbGZ3b3JkLCB0aGUgbnVtYmVyIAorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQsIHRoZSBudW1iZXIKICAgKiAgICAgICAgIG9mIGRhdGEgYW5kIHRoZSBmaWZvIHRocmVzaG9sZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBoYWxmd29yZAotICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgd29yZCwgdGhlIG51bWJlciAKKyAgKiBAbm90ZSAgIElmIERNQSBwZXJpcGhlcmFsIGFjY2VzcyBpcyBjb25maWd1cmVkIGFzIHdvcmQsIHRoZSBudW1iZXIKICAgKiAgICAgICAgIG9mIGRhdGEgYW5kIHRoZSBmaWZvIHRocmVzaG9sZCBzaG91bGQgYmUgYWxpZ25lZCBvbiB3b3JkCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9SZWNlaXZlX0RNQShRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50OF90ICpwRGF0YSkKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICB1aW50MzJfdCAqdG1wOwogICB1aW50MzJfdCBhZGRyX3JlZyA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+QVIpOwogICB1aW50MzJfdCBkYXRhX3NpemUgPSAoUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVUpOwogCkBAIC0xNDIzLDkgKzE0NDQsMTAgQEAKIAogICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCiAgIHsKKyAgICAvKiBDbGVhciB0aGUgZXJyb3IgY29kZSAqLwogICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOwogCi0gICAgaWYocERhdGEgIT0gTlVMTCApIAorICAgIGlmKHBEYXRhICE9IE5VTEwgKQogICAgIHsKICAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBvZiB0aGUgaGFuZGxlICovCiAgICAgICBpZiAoaHFzcGktPmhkbWEtPkluaXQuUGVyaXBoRGF0YUFsaWdubWVudCA9PSBETUFfUERBVEFBTElHTl9CWVRFKQpAQCAtMTQzNiw4ICsxNDU4LDggQEAKICAgICAgIHsKICAgICAgICAgaWYgKCgoZGF0YV9zaXplICUgMlUpICE9IDBVKSB8fCAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgJSAyVSkgIT0gMFUpKQogICAgICAgICB7Ci0gICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiBoYWxmd29yZCAKLSAgICAgICAgICA9PiBubyB0cmFuc2ZlciBwb3NzaWJsZSB3aXRoIERNQSBwZXJpcGhlcmFsIGFjY2VzcyBjb25maWd1cmVkIGFzIGhhbGZ3b3JkICovCisgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiBoYWxmd29yZAorICAgICAgICAgICAgID0+IG5vIHRyYW5zZmVyIHBvc3NpYmxlIHdpdGggRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQgKi8KICAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfUEFSQU07CiAgICAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogCkBAIC0xNDUzLDggKzE0NzUsOCBAQAogICAgICAgewogICAgICAgICBpZiAoKChkYXRhX3NpemUgJSA0VSkgIT0gMFUpIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDRVKSAhPSAwVSkpCiAgICAgICAgIHsKLSAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIHdvcmQgCi0gICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyB3b3JkICovCisgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiB3b3JkCisgICAgICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyB3b3JkICovCiAgICAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNOwogICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKIApAQCAtMTQ2Niw2ICsxNDg4LDEwIEBACiAgICAgICAgICAgaHFzcGktPlJ4WGZlckNvdW50ID0gKGRhdGFfc2l6ZSA+PiAyVSk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgICAgfQogCiAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgIHsKQEAgLTE1MTMsNTYgKzE1MzksNDMgQEAKICAgICAgICAgLyogQ29uZmlndXJlIHRoZSBkaXJlY3Rpb24gb2YgdGhlIERNQSAqLwogICAgICAgICBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24gPSBETUFfTUVNT1JZX1RPX1BFUklQSDsKIAotICAgICAgICAvKiA0IEV4dHJhIHdvcmRzICgzMi1iaXRzKSBhcmUgbmVlZGVkIGZvciByZWFkIG9wZXJhdGlvbiB0byBndWFyYW50ZWUgCisgICAgICAgIC8qIDQgRXh0cmEgd29yZHMgKDMyLWJpdHMpIGFyZSBuZWVkZWQgZm9yIHJlYWQgb3BlcmF0aW9uIHRvIGd1YXJhbnRlZQogICAgICAgICB0aGUgbGFzdCBkYXRhIGlzIHRyYW5zZmVycmVkIGZyb20gRE1BIEZJRk8gdG8gUkFNIG1lbW9yeSAqLwogICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIsIChkYXRhX3NpemUgLSAxVSArIDE2VSkpOwotCi0JCS8qIFVwZGF0ZSBkaXJlY3Rpb24gbW9kZSBiaXQgKi8KLSAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+aGRtYS0+SW5zdGFuY2UtPkNSLCBETUFfU3hDUl9ESVIsIGhxc3BpLT5oZG1hLT5Jbml0LkRpcmVjdGlvbik7Ci0KLSAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3QgcmVhZCAqLwotICAgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfUkVBRCk7Ci0KLSAgICAgICAgLyogU3RhcnQgdGhlIHRyYW5zZmVyIGJ5IHJlLXdyaXRpbmcgdGhlIGFkZHJlc3MgaW4gQVIgcmVnaXN0ZXIgKi8KLSAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+QVIsIGFkZHJfcmVnKTsKLQotICAgICAgICAvKiBFbmFibGUgdGhlIERNQSBDaGFubmVsICovCi0gICAgICAgIHRtcCA9ICh1aW50MzJfdCopJnBEYXRhOwotICAgICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhxc3BpLT5oZG1hLCAodWludDMyX3QpJmhxc3BpLT5JbnN0YW5jZS0+RFIsICoodWludDMyX3QqKXRtcCwgaHFzcGktPlJ4WGZlclNpemUpOwotCi0gICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGJ5IHNldHRpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwotICAgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOwotCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KLSAgICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKLQotICAgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgdHJhbnNmZXIgZXJyb3IgSW50ZXJydXB0ICovCi0gICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFKTsKICNlbHNlCiAgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBETUEgKi8KICAgICAgICAgaHFzcGktPmhkbWEtPkluaXQuRGlyZWN0aW9uID0gRE1BX1BFUklQSF9UT19NRU1PUlk7Ci0KKyNlbmRpZgorICAgICAgICAvKiBVcGRhdGUgZGlyZWN0aW9uIG1vZGUgYml0ICovCiAgICAgICAgIE1PRElGWV9SRUcoaHFzcGktPmhkbWEtPkluc3RhbmNlLT5DUiwgRE1BX1N4Q1JfRElSLCBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24pOwogCiAgICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KLSAgICAgICAgdG1wID0gKHVpbnQzMl90KikmcERhdGE7Ci0gICAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHFzcGktPmhkbWEsICh1aW50MzJfdCkmaHFzcGktPkluc3RhbmNlLT5EUiwgKih1aW50MzJfdCopdG1wLCBocXNwaS0+UnhYZmVyU2l6ZSk7CisgICAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhxc3BpLT5oZG1hLCAodWludDMyX3QpJmhxc3BpLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdClwRGF0YSwgaHFzcGktPlJ4WGZlclNpemUpID09IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBmdW5jdGlvbmFsIGFzIGluZGlyZWN0IHJlYWQgKi8KKyAgICAgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfUkVBRCk7CiAKLSAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3QgcmVhZCAqLwotICAgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfUkVBRCk7CisgICAgICAgICAgLyogU3RhcnQgdGhlIHRyYW5zZmVyIGJ5IHJlLXdyaXRpbmcgdGhlIGFkZHJlc3MgaW4gQVIgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgYWRkcl9yZWcpOwogCi0gICAgICAgIC8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSByZS13cml0aW5nIHRoZSBhZGRyZXNzIGluIEFSIHJlZ2lzdGVyICovCi0gICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSLCBhZGRyX3JlZyk7CisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgICAgCisgICAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yIEludGVycnVwdCAqLworICAgICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBieSBzZXR0aW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKKyAgICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCi0gICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7Ci0KLSAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yIEludGVycnVwdCAqLwotICAgICAgICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9URSk7Ci0KLSAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgc2V0dGluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCi0gICAgICAgIFNFVF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7Ci0jZW5kaWYgLyogUVNQSTFfVjJfMUwgKi8KKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0xNTc2LDcgKzE1ODksNyBAQAogICB9CiAgIGVsc2UKICAgewotICAgIHN0YXR1cyA9IEhBTF9CVVNZOyAKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKIAogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwpAQCAtMTU4Niw5MCArMTU5OSw4OSBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUVNQSSBBdXRvbWF0aWMgUG9sbGluZyBNb2RlIGluIGJsb2NraW5nIG1vZGUuIAotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gIGNtZCBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAqIEBwYXJhbSAgY2ZnIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBwb2xsaW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICogQHBhcmFtICBUaW1lb3V0ICBUaW1lIG91dCBkdXJhdGlvbgorICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBRU1BJIEF1dG9tYXRpYyBQb2xsaW5nIE1vZGUgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIGNtZCA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQHBhcmFtICBjZmcgOiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgcG9sbGluZyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAqIEBwYXJhbSAgVGltZW91dCA6IFRpbWVvdXQgZHVyYXRpb24KICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEF1dG9tYXRpYyBQb2xsaW5nIE1vZGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX0F1dG9Qb2xsaW5nKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCwgUVNQSV9BdXRvUG9sbGluZ1R5cGVEZWYgKmNmZywgdWludDMyX3QgVGltZW91dCkKIHsKLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CiAgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIAorCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OX01PREUoY21kLT5JbnN0cnVjdGlvbk1vZGUpKTsKICAgaWYgKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlICE9IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkKICAgewogICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OKGNtZC0+SW5zdHJ1Y3Rpb24pKTsKICAgfQotICAKKwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BRERSRVNTX01PREUoY21kLT5BZGRyZXNzTW9kZSkpOwogICBpZiAoY21kLT5BZGRyZXNzTW9kZSAhPSBRU1BJX0FERFJFU1NfTk9ORSkKICAgewogICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FERFJFU1NfU0laRShjbWQtPkFkZHJlc3NTaXplKSk7CiAgIH0KLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUxURVJOQVRFX0JZVEVTX01PREUoY21kLT5BbHRlcm5hdGVCeXRlTW9kZSkpOwogICBpZiAoY21kLT5BbHRlcm5hdGVCeXRlTW9kZSAhPSBRU1BJX0FMVEVSTkFURV9CWVRFU19OT05FKQogICB7CiAgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUxURVJOQVRFX0JZVEVTX1NJWkUoY21kLT5BbHRlcm5hdGVCeXRlc1NpemUpKTsKICAgfQotICAKKwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EVU1NWV9DWUNMRVMoY21kLT5EdW1teUN5Y2xlcykpOwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EQVRBX01PREUoY21kLT5EYXRhTW9kZSkpOwotICAKKwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9ERFJfTU9ERShjbWQtPkRkck1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX0hIQyhjbWQtPkRkckhvbGRIYWxmQ3ljbGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfSU5URVJWQUwoY2ZnLT5JbnRlcnZhbCkpOwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9TVEFUVVNfQllURVNfU0laRShjZmctPlN0YXR1c0J5dGVzU2l6ZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9NQVRDSF9NT0RFKGNmZy0+TWF0Y2hNb2RlKSk7Ci0gIAorCiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaHFzcGkpOwotICAKKwogICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCiAgIHsKLSAgICAKICAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKLSAgICAKKwogICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLwogICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfQVVUT19QT0xMSU5HOwotICAgIAorCiAgICAgLyogV2FpdCB0aWxsIEJVU1kgZmxhZyByZXNldCAqLwogICAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX0JVU1ksIFJFU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOwotICAgIAorCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgewogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IFBTTUFSIHJlZ2lzdGVyIHdpdGggdGhlIHN0YXR1cyBtYXRjaCB2YWx1ZSAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UFNNQVIsIGNmZy0+TWF0Y2gpOwotICAgICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBQU01LUiByZWdpc3RlciB3aXRoIHRoZSBzdGF0dXMgbWFzayB2YWx1ZSAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UFNNS1IsIGNmZy0+TWFzayk7Ci0gICAgICAKKwogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IFBJUiByZWdpc3RlciB3aXRoIHRoZSBpbnRlcnZhbCB2YWx1ZSAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UElSLCBjZmctPkludGVydmFsKTsKLSAgICAgIAotICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggTWF0Y2ggbW9kZSBhbmQgQXV0b21hdGljIHN0b3AgZW5hYmxlZCAKKworICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggTWF0Y2ggbW9kZSBhbmQgQXV0b21hdGljIHN0b3AgZW5hYmxlZAogICAgICAgKG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGFuIGluZmluaXRlIGxvb3AgaW4gYmxvY2tpbmcgbW9kZSkgKi8KLSAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgKFFVQURTUElfQ1JfUE1NIHwgUVVBRFNQSV9DUl9BUE1TKSwgCisgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIChRVUFEU1BJX0NSX1BNTSB8IFFVQURTUElfQ1JfQVBNUyksCiAgICAgICAgICAgICAgICAoY2ZnLT5NYXRjaE1vZGUgfCBRU1BJX0FVVE9NQVRJQ19TVE9QX0VOQUJMRSkpOwotICAgICAgCisKICAgICAgIC8qIENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi8KICAgICAgIGNtZC0+TmJEYXRhID0gY2ZnLT5TdGF0dXNCeXRlc1NpemU7CiAgICAgICBRU1BJX0NvbmZpZyhocXNwaSwgY21kLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9BVVRPX1BPTExJTkcpOwotICAgICAgCisKICAgICAgIC8qIFdhaXQgdW50aWwgU00gZmxhZyBpcyBzZXQgdG8gZ28gYmFjayBpbiBpZGxlIHN0YXRlICovCiAgICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19TTSwgU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOwogCiAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgIHsKICAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfU00pOwotICAgICAgICAKKwogICAgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAgICAgICB9CkBAIC0xNjc3LDEwNyArMTY4OSw5OCBAQAogICB9CiAgIGVsc2UKICAgewotICAgIHN0YXR1cyA9IEhBTF9CVVNZOyAgIAorICAgIHN0YXR1cyA9IEhBTF9CVVNZOwogICB9CisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHFzcGkpOwotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gIHJldHVybiBzdGF0dXM7ICAKKyAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqCi0gICogQGJyaWVmICBDb25maWd1cmUgdGhlIFFTUEkgQXV0b21hdGljIFBvbGxpbmcgTW9kZSBpbiBub24tYmxvY2tpbmcgbW9kZS4gCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgY21kIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICogQHBhcmFtICBjZmcgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIHBvbGxpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUVNQSSBBdXRvbWF0aWMgUG9sbGluZyBNb2RlIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcGFyYW0gIGNmZyA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBwb2xsaW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCiAgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBBdXRvbWF0aWMgUG9sbGluZyBNb2RlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BdXRvUG9sbGluZ19JVChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfQXV0b1BvbGxpbmdUeXBlRGVmICpjZmcpCiB7Ci0gIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICAKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOworICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOworCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OX01PREUoY21kLT5JbnN0cnVjdGlvbk1vZGUpKTsKICAgaWYgKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlICE9IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkKICAgewogICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OKGNtZC0+SW5zdHJ1Y3Rpb24pKTsKICAgfQotICAKKwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BRERSRVNTX01PREUoY21kLT5BZGRyZXNzTW9kZSkpOwogICBpZiAoY21kLT5BZGRyZXNzTW9kZSAhPSBRU1BJX0FERFJFU1NfTk9ORSkKICAgewogICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FERFJFU1NfU0laRShjbWQtPkFkZHJlc3NTaXplKSk7CiAgIH0KLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUxURVJOQVRFX0JZVEVTX01PREUoY21kLT5BbHRlcm5hdGVCeXRlTW9kZSkpOwogICBpZiAoY21kLT5BbHRlcm5hdGVCeXRlTW9kZSAhPSBRU1BJX0FMVEVSTkFURV9CWVRFU19OT05FKQogICB7CiAgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUxURVJOQVRFX0JZVEVTX1NJWkUoY21kLT5BbHRlcm5hdGVCeXRlc1NpemUpKTsKICAgfQotICAKKwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EVU1NWV9DWUNMRVMoY21kLT5EdW1teUN5Y2xlcykpOwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9EQVRBX01PREUoY21kLT5EYXRhTW9kZSkpOwotICAKKwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9ERFJfTU9ERShjbWQtPkRkck1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX0hIQyhjbWQtPkRkckhvbGRIYWxmQ3ljbGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfSU5URVJWQUwoY2ZnLT5JbnRlcnZhbCkpOwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9TVEFUVVNfQllURVNfU0laRShjZmctPlN0YXR1c0J5dGVzU2l6ZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9NQVRDSF9NT0RFKGNmZy0+TWF0Y2hNb2RlKSk7CiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FVVE9NQVRJQ19TVE9QKGNmZy0+QXV0b21hdGljU3RvcCkpOwotICAKKwogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhxc3BpKTsKLSAgCisKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0FVVE9fUE9MTElORzsKIAogICAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KLSAgICBjb3VudCA9IChocXNwaS0+VGltZW91dCkgKiAoU3lzdGVtQ29yZUNsb2NrIC8gMTZVIC8gMTAwMFUpOwotICAgIGRvIAotICAgIHsKLSAgICAgIGlmIChjb3VudC0tID09IDBVKQotICAgICAgeyAKLSAgICAgICAgaHFzcGktPlN0YXRlICAgICA9IEhBTF9RU1BJX1NUQVRFX0VSUk9SOwotICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOwotICAgICAgfQotICAgIH0gCi0gICAgd2hpbGUgKChfX0hBTF9RU1BJX0dFVF9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSkpICE9IFJFU0VUKTsKLSAgICAKKyAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBocXNwaS0+VGltZW91dCk7CisKICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICB7CiAgICAgICAvKiBDb25maWd1cmUgUVNQSTogUFNNQVIgcmVnaXN0ZXIgd2l0aCB0aGUgc3RhdHVzIG1hdGNoIHZhbHVlICovCiAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5QU01BUiwgY2ZnLT5NYXRjaCk7Ci0gICAgICAKKwogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IFBTTUtSIHJlZ2lzdGVyIHdpdGggdGhlIHN0YXR1cyBtYXNrIHZhbHVlICovCiAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5QU01LUiwgY2ZnLT5NYXNrKTsKLSAgICAgIAorCiAgICAgICAvKiBDb25maWd1cmUgUVNQSTogUElSIHJlZ2lzdGVyIHdpdGggdGhlIGludGVydmFsIHZhbHVlICovCiAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5QSVIsIGNmZy0+SW50ZXJ2YWwpOwotICAgICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDUiByZWdpc3RlciB3aXRoIE1hdGNoIG1vZGUgYW5kIEF1dG9tYXRpYyBzdG9wIG1vZGUgKi8KLSAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgKFFVQURTUElfQ1JfUE1NIHwgUVVBRFNQSV9DUl9BUE1TKSwgCisgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIChRVUFEU1BJX0NSX1BNTSB8IFFVQURTUElfQ1JfQVBNUyksCiAgICAgICAgICAgICAgICAoY2ZnLT5NYXRjaE1vZGUgfCBjZmctPkF1dG9tYXRpY1N0b3ApKTsKLSAgICAgIAorCiAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1NNKTsKLSAgICAgIAorCiAgICAgICAvKiBDYWxsIHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uICovCiAgICAgICBjbWQtPk5iRGF0YSA9IGNmZy0+U3RhdHVzQnl0ZXNTaXplOwogICAgICAgUVNQSV9Db25maWcoaHFzcGksIGNtZCwgUVNQSV9GVU5DVElPTkFMX01PREVfQVVUT19QT0xMSU5HKTsKIAogICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKLSAgCisKICAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSBUcmFuc2ZlciBFcnJvciBhbmQgc3RhdHVzIG1hdGNoIEludGVycnVwdCAqLwogICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIChRU1BJX0lUX1NNIHwgUVNQSV9JVF9URSkpOwogCkBAIC0xNzkwLDI5ICsxNzkzLDI5IEBACiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAKICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKICAgfQotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gIHJldHVybiBzdGF0dXM7ICAKKyAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqCi0gICogQGJyaWVmICBDb25maWd1cmUgdGhlIE1lbW9yeSBNYXBwZWQgbW9kZS4gCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgY21kIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICogQHBhcmFtICBjZmcgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIG1lbW9yeSBtYXBwZWQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgTWVtb3J5IE1hcHBlZCBtb2RlLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcGFyYW0gIGNmZyA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBtZW1vcnkgbWFwcGVkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCiAgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBNZW1vcnkgbWFwcGVkIE1vZGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX01lbW9yeU1hcHBlZChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfTWVtb3J5TWFwcGVkVHlwZURlZiAqY2ZnKQogewotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKICAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgCisKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfSU5TVFJVQ1RJT05fTU9ERShjbWQtPkluc3RydWN0aW9uTW9kZSkpOwogICBpZiAoY21kLT5JbnN0cnVjdGlvbk1vZGUgIT0gUVNQSV9JTlNUUlVDVElPTl9OT05FKQpAQCAtMTg0MCwyMCArMTg0MywyMCBAQAogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9TSU9PX01PREUoY21kLT5TSU9PTW9kZSkpOwogCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX1RJTUVPVVRfQUNUSVZBVElPTihjZmctPlRpbWVPdXRBY3RpdmF0aW9uKSk7Ci0gIAorCiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaHFzcGkpOwotICAKKwogICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCiAgIHsKICAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKLSAgICAKKwogICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLwogICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfTUVNX01BUFBFRDsKLSAgICAKKwogICAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBocXNwaS0+VGltZW91dCk7Ci0gICAgCisKICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICB7CiAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ1IgcmVnaXN0ZXIgd2l0aCB0aW1lb3V0IGNvdW50ZXIgZW5hYmxlICovCkBAIC0xODYyLDUxICsxODY1LDUxIEBACiAgICAgaWYgKGNmZy0+VGltZU91dEFjdGl2YXRpb24gPT0gUVNQSV9USU1FT1VUX0NPVU5URVJfRU5BQkxFKQogICAgICAgewogICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9USU1FT1VUX1BFUklPRChjZmctPlRpbWVPdXRQZXJpb2QpKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IExQVFIgcmVnaXN0ZXIgd2l0aCB0aGUgbG93LXBvd2VyIHRpbWVvdXQgdmFsdWUgKi8KICAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+TFBUUiwgY2ZnLT5UaW1lT3V0UGVyaW9kKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCiAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RPKTsKIAogICAgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgVGltZU91dCBJbnRlcnJ1cHQgKi8KICAgICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVE8pOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8qIENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi8KICAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQpOwogICAgIH0KICAgfQogICBlbHNlCiAgIHsKLSAgICBzdGF0dXMgPSBIQUxfQlVTWTsgICAKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKICAgfQogCiAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgotICAqIEBicmllZiAgVHJhbnNmZXIgRXJyb3IgY2FsbGJhY2tzCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgVHJhbnNmZXIgRXJyb3IgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfUVNQSV9FcnJvckNhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhxc3BpKTsKLSAgCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX1FTUElfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwogfQogCiAvKioKICAgKiBAYnJpZWYgIEFib3J0IGNvbXBsZXRlZCBjYWxsYmFjay4KLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfUVNQSV9BYm9ydENwbHRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQpAQCAtMTkyMSwxMjAgKzE5MjQsMTIwIEBACiAKIC8qKgogICAqIEBicmllZiAgQ29tbWFuZCBjb21wbGV0ZWQgY2FsbGJhY2suCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1FTUElfQ21kQ3BsdENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhxc3BpKTsKLSAgCi0gIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX1FTUElfQ21kQ3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrcy4KLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisgICogQGJyaWVmICBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfUVNQSV9SeENwbHRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAotICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9RU1BJX1J4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrcy4KLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisgICogQGJyaWVmICBUeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCi0gX193ZWFrIHZvaWQgSEFMX1FTUElfVHhDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK19fd2VhayB2b2lkIEhBTF9RU1BJX1R4Q3BsdENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhxc3BpKTsKLSAgCi0gIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX1FTUElfVHhDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gCisgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFJ4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrcy4KLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisgICogQGJyaWVmICBSeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9RU1BJX1J4SGFsZkNwbHRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAotICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9RU1BJX1J4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrcy4KLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisgICogQGJyaWVmICBUeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSBfX3dlYWsgdm9pZCBIQUxfUVNQSV9UeEhhbGZDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK19fd2VhayB2b2lkIEhBTF9RU1BJX1R4SGFsZkNwbHRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAotICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9RU1BJX1R4SGFsZkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgRklGTyBUaHJlc2hvbGQgY2FsbGJhY2tzCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgRklGTyBUaHJlc2hvbGQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfUVNQSV9GaWZvVGhyZXNob2xkQ2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHFzcGkpOwotICAKLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9GSUZPVGhyZXNob2xkQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBTdGF0dXMgTWF0Y2ggY2FsbGJhY2tzCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgU3RhdHVzIE1hdGNoIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1FTUElfU3RhdHVzTWF0Y2hDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gICAgCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX1FTUElfU3RhdHVzTWF0Y2hDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFRpbWVvdXQgY2FsbGJhY2tzCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgVGltZW91dCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9RU1BJX1RpbWVPdXRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9RU1BJX1RpbWVPdXRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwogfQpAQCAtMjI2NCwyNiArMjI2NywyNyBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBhbmQgU3RhdGUgZnVuY3Rpb25zIAotICAqICBAYnJpZWYgICBRU1BJIGNvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucyAKKy8qKiBAZGVmZ3JvdXAgUVNQSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBhbmQgU3RhdGUgZnVuY3Rpb25zCisgICogIEBicmllZiAgIFFTUEkgY29udHJvbCBhbmQgU3RhdGUgZnVuY3Rpb25zCiAgICoKLUB2ZXJiYXRpbSAgIAorQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGFuZCBTdGF0ZSBmdW5jdGlvbnMgIyMjIyMKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgWy4uXQogICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgotICAgICAgKCspIENoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZiB0aGUgZHJpdmVyLiAKKyAgICAgICgrKSBDaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUgb2YgdGhlIGRyaXZlci4KICAgICAgICgrKSBDaGVjayB0aGUgZXJyb3IgY29kZSBzZXQgZHVyaW5nIGxhc3Qgb3BlcmF0aW9uLgogICAgICAgKCspIEFib3J0IGFueSBvcGVyYXRpb24uCiAKKwogQGVuZHZlcmJhdGltCiAgICogQHsKICAgKi8KIAogLyoqCiAgICogQGJyaWVmICBSZXR1cm4gdGhlIFFTUEkgaGFuZGxlIHN0YXRlLgotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0ZQogICAqLwogSEFMX1FTUElfU3RhdGVUeXBlRGVmIEhBTF9RU1BJX0dldFN0YXRlKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCkBAIC0yMjkzLDggKzIyOTcsOCBAQAogfQogCiAvKioKLSogQGJyaWVmICBSZXR1cm4gdGhlIFFTUEkgZXJyb3IgY29kZQotKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisqIEBicmllZiAgUmV0dXJuIHRoZSBRU1BJIGVycm9yIGNvZGUuCisqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogKiBAcmV0dmFsIFFTUEkgRXJyb3IgQ29kZQogKi8KIHVpbnQzMl90IEhBTF9RU1BJX0dldEVycm9yKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCkBAIC0yMzAzLDUwICsyMzA3LDUzIEBACiB9CiAKIC8qKgotKiBAYnJpZWYgIEFib3J0IHRoZSBjdXJyZW50IHRyYW5zbWlzc2lvbgotKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisqIEBicmllZiAgQWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNtaXNzaW9uLgorKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKICogQHJldHZhbCBIQUwgc3RhdHVzCiAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1FTUElfQWJvcnQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKKwogICAvKiBDaGVjayBpZiB0aGUgc3RhdGUgaXMgaW4gb25lIG9mIHRoZSBidXN5IHN0YXRlcyAqLwotICBpZiAoKGhxc3BpLT5TdGF0ZSAmIDB4MlUpICE9IDBVKQorICBpZiAoKCh1aW50MzJfdClocXNwaS0+U3RhdGUgJiAweDJVKSAhPSAwVSkKICAgewogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCi0gICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikhPSBSRVNFVCkKKyAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSAhPSAwVSkKICAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwogICAgICAgQ0xFQVJfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOwotICAgICAgCisKICAgICAgIC8qIEFib3J0IERNQSBjaGFubmVsICovCiAgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhxc3BpLT5oZG1hKTsKICAgICAgIGlmKHN0YXR1cyAhPSBIQUxfT0spCiAgICAgICB7CiAgICAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfRE1BOwogICAgICAgfQotICAgIH0gIAotICAgIAorICAgIH0KKwogICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDUiByZWdpc3RlciB3aXRoIEFib3J0IHJlcXVlc3QgKi8KICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfQUJPUlQpOwotICAgIAorCiAgICAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19UQywgU0VULCB0aWNrc3RhcnQsIGhxc3BpLT5UaW1lb3V0KTsKIAotICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgewogICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEMpOwotICAgICAgCisKICAgICAgIC8qIFdhaXQgdW50aWwgQlVTWSBmbGFnIGlzIHJlc2V0ICovCiAgICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBocXNwaS0+VGltZW91dCk7CiAgICAgfQotICAgIAorCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgeworICAgICAgLyogUmVzZXQgZnVuY3Rpb25hbCBtb2RlIGNvbmZpZ3VyYXRpb24gdG8gaW5kaXJlY3Qgd3JpdGUgbW9kZSBieSBkZWZhdWx0ICovCisgICAgICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFKTsKKwogICAgICAgLyogVXBkYXRlIHN0YXRlICovCiAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKICAgICB9CkBAIC0yMzU3LDMwICsyMzY0LDMwIEBACiAKIC8qKgogKiBAYnJpZWYgIEFib3J0IHRoZSBjdXJyZW50IHRyYW5zbWlzc2lvbiAobm9uLWJsb2NraW5nIGZ1bmN0aW9uKQotKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogKiBAcmV0dmFsIEhBTCBzdGF0dXMKICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BYm9ydF9JVChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAorCiAgIC8qIENoZWNrIGlmIHRoZSBzdGF0ZSBpcyBpbiBvbmUgb2YgdGhlIGJ1c3kgc3RhdGVzICovCi0gIGlmICgoaHFzcGktPlN0YXRlICYgMHgyVSkgIT0gMFUpCisgIGlmICgoKHVpbnQzMl90KWhxc3BpLT5TdGF0ZSAmIDB4MlUpICE9IDBVKQogICB7CiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgUVNQSSBzdGF0ZSAqLwotICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0FCT1JUOyAgIAotICAgIAorICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0FCT1JUOworCiAgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwogICAgIF9fSEFMX1FTUElfRElTQUJMRV9JVChocXNwaSwgKFFTUElfSVRfVE8gfCBRU1BJX0lUX1NNIHwgUVNQSV9JVF9GVCB8IFFTUElfSVRfVEMgfCBRU1BJX0lUX1RFKSk7Ci0gICAgCi0gICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikhPSBSRVNFVCkKKworICAgIGlmICgoaHFzcGktPkluc3RhbmNlLT5DUiAmIFFVQURTUElfQ1JfRE1BRU4pICE9IDBVKQogICAgIHsKICAgICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBieSBjbGVhcmluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCiAgICAgICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7Ci0gICAgICAKKwogICAgICAgLyogQWJvcnQgRE1BIGNoYW5uZWwgKi8KICAgICAgIGhxc3BpLT5oZG1hLT5YZmVyQWJvcnRDYWxsYmFjayA9IFFTUElfRE1BQWJvcnRDcGx0OwogICAgICAgaWYgKEhBTF9ETUFfQWJvcnRfSVQoaHFzcGktPmhkbWEpICE9IEhBTF9PSykKQEAgLTI0MDAsMjEgKzI0MDcsMjAgQEAKICAgICB7CiAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKLSAgICAgIAorCiAgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0ICovCiAgICAgICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9UQyk7Ci0gICAgICAKKwogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggQWJvcnQgcmVxdWVzdCAqLwogICAgICAgU0VUX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0FCT1JUKTsKICAgICB9CiAgIH0KLQogICByZXR1cm4gc3RhdHVzOwogfQogCi0vKiogQGJyaWVmIFNldCBRU1BJIHRpbWVvdXQKLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlLgotICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGZvciB0aGUgUVNQSSBtZW1vcnkgYWNjZXNzLgorLyoqIEBicmllZiBTZXQgUVNQSSB0aW1lb3V0LgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgOiBUaW1lb3V0IGZvciB0aGUgUVNQSSBtZW1vcnkgYWNjZXNzLgogICAqIEByZXR2YWwgTm9uZQogICAqLwogdm9pZCBIQUxfUVNQSV9TZXRUaW1lb3V0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IFRpbWVvdXQpCkBAIC0yNDIzLDggKzI0MjksOCBAQAogfQogCiAvKiogQGJyaWVmIFNldCBRU1BJIEZpZm8gdGhyZXNob2xkLgotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUuCi0gICogQHBhcmFtICBUaHJlc2hvbGQgVGhyZXNob2xkIG9mIHRoZSBGaWZvICh2YWx1ZSBiZXR3ZWVuIDEgYW5kIDE2KS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUuCisgICogQHBhcmFtICBUaHJlc2hvbGQgOiBUaHJlc2hvbGQgb2YgdGhlIEZpZm8gKHZhbHVlIGJldHdlZW4gMSBhbmQgMTYpLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1FTUElfU2V0Rmlmb1RocmVzaG9sZChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBUaHJlc2hvbGQpCkBAIC0yNDM4LDE2ICsyNDQ0LDE2IEBACiAgIHsKICAgICAvKiBTeW5jaHJvbml6ZSBpbml0IHN0cnVjdHVyZSB3aXRoIG5ldyBGSUZPIHRocmVzaG9sZCB2YWx1ZSAqLwogICAgIGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgPSBUaHJlc2hvbGQ7Ci0gICAgCisKICAgICAvKiBDb25maWd1cmUgUVNQSSBGSUZPIFRocmVzaG9sZCAqLwotICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GVEhSRVMsIAorICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GVEhSRVMsCiAgICAgICAgICAgICAgICAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgLSAxVSkgPDwgUVVBRFNQSV9DUl9GVEhSRVNfUG9zKSk7CiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAgIH0KLSAgCisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCkBAIC0yNDU2LDcgKzI0NjIsNyBAQAogfQogCiAvKiogQGJyaWVmIEdldCBRU1BJIEZpZm8gdGhyZXNob2xkLgotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlLgogICAqIEByZXR2YWwgRmlmbyB0aHJlc2hvbGQgKHZhbHVlIGJldHdlZW4gMSBhbmQgMTYpCiAgICovCiB1aW50MzJfdCBIQUxfUVNQSV9HZXRGaWZvVGhyZXNob2xkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCkBAIC0yNDY0LDQ4ICsyNDcwLDkxIEBACiAgIHJldHVybiAoKFJFQURfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRlRIUkVTKSA+PiBRVUFEU1BJX0NSX0ZUSFJFU19Qb3MpICsgMVUpOwogfQogCisvKiogQGJyaWVmICBTZXQgRmxhc2hJRC4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUuCisgICogQHBhcmFtICBGbGFzaElEIDogSW5kZXggb2YgdGhlIGZsYXNoIG1lbW9yeSB0byBiZSBhY2Nlc3NlZC4KKyAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfRmxhc2hfU2VsZWN0LgorICAqIEBub3RlICAgVGhlIEZsYXNoSUQgaXMgaWdub3JlZCB3aGVuIGR1YWwgZmxhc2ggbW9kZSBpcyBlbmFibGVkLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1FTUElfU2V0Rmxhc2hJRChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBGbGFzaElEKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9GTEFTSF9JRChGbGFzaElEKSk7CisKKyAgLyogUHJvY2VzcyBsb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhocXNwaSk7CisKKyAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQorICB7CisgICAgLyogU3luY2hyb25pemUgaW5pdCBzdHJ1Y3R1cmUgd2l0aCBuZXcgRmxhc2hJRCB2YWx1ZSAqLworICAgIGhxc3BpLT5Jbml0LkZsYXNoSUQgPSBGbGFzaElEOworCisgICAgLyogQ29uZmlndXJlIFFTUEkgRmxhc2hJRCAqLworICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GU0VMLCBGbGFzaElEKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKworICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKIC8qKgogICAqIEB9CiAgICovCiAKLS8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gCiAvKioKLSAgKiBAYnJpZWYgIERNQSBRU1BJIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4gCi0gICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAfQorICAqLworCisvKiogQGRlZmdyb3VwIFFTUElfUHJpdmF0ZV9GdW5jdGlvbnMgUVNQSSBQcml2YXRlIEZ1bmN0aW9ucworICAqIEB7CisgICovCisKKy8qKgorICAqIEBicmllZiAgRE1BIFFTUEkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSA6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXN0YXRpYyB2b2lkIFFTUElfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgCitzdGF0aWMgdm9pZCBRU1BJX0RNQVJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9ICggUVNQSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoUVNQSV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKICAgaHFzcGktPlJ4WGZlckNvdW50ID0gMFU7Ci0gIAorCiAgIC8qIEVuYWJsZSB0aGUgUVNQSSB0cmFuc2ZlciBjb21wbGV0ZSBJbnRlcnJ1cHQgKi8KICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIERNQSBRU1BJIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suIAotICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQGJyaWVmICBETUEgUVNQSSB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSA6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXN0YXRpYyB2b2lkIFFTUElfRE1BVHhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgICAgCitzdGF0aWMgdm9pZCBRU1BJX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9ICggUVNQSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoUVNQSV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKICAgaHFzcGktPlR4WGZlckNvdW50ID0gMFU7Ci0gIAorCiAgIC8qIEVuYWJsZSB0aGUgUVNQSSB0cmFuc2ZlciBjb21wbGV0ZSBJbnRlcnJ1cHQgKi8KICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIERNQSBRU1BJIHJlY2VpdmUgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIAotICAqIEBwYXJhbSAgaGRtYSAgRE1BIGhhbmRsZQorICAqIEBicmllZiAgRE1BIFFTUEkgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogc3RhdGljIHZvaWQgUVNQSV9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKFFTUElfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKKyAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9IChRU1BJX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOwogCiAjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgaHFzcGktPlJ4SGFsZkNwbHRDYWxsYmFjayhocXNwaSk7CkBAIC0yNTE1LDEzICsyNTY0LDEzIEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgRE1BIFFTUEkgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIAotICAqIEBwYXJhbSAgaGRtYSAgRE1BIGhhbmRsZQorICAqIEBicmllZiAgRE1BIFFTUEkgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaGRtYSA6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIFFTUElfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9IChRU1BJX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoUVNQSV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKIAogI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgIGhxc3BpLT5UeEhhbGZDcGx0Q2FsbGJhY2soaHFzcGkpOwpAQCAtMjUzMiwzNiArMjU4MSwzNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIERNQSBRU1BJIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCi0gICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGhkbWEgOiBETUEgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgdm9pZCBRU1BJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAorc3RhdGljIHZvaWQgUVNQSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9ICggUVNQSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7Ci0gIAorICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKCBRU1BJX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKKwogICAvKiBpZiBETUEgZXJyb3IgaXMgRklGTyBlcnJvciBpZ25vcmUgaXQgKi8KICAgaWYoSEFMX0RNQV9HZXRFcnJvcihoZG1hKSAhPSBIQUxfRE1BX0VSUk9SX0ZFKQogICB7Ci0gICAgaHFzcGktPlJ4WGZlckNvdW50ID0gMFU7Ci0gICAgaHFzcGktPlR4WGZlckNvdW50ID0gMFU7Ci0gICAgaHFzcGktPkVycm9yQ29kZSAgIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKLSAgICAKLSAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwotICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKLSAgICAKLSAgICAvKiBBYm9ydCB0aGUgUVNQSSAqLwotICAgIEhBTF9RU1BJX0Fib3J0X0lUKGhxc3BpKTsKKyAgaHFzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhxc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICBocXNwaS0+RXJyb3JDb2RlICAgfD0gSEFMX1FTUElfRVJST1JfRE1BOworCisgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBieSBjbGVhcmluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKKworICAvKiBBYm9ydCB0aGUgUVNQSSAqLworICAodm9pZClIQUxfUVNQSV9BYm9ydF9JVChocXNwaSk7CisKICAgfQogfQogCiAvKioKICAgKiBAYnJpZWYgIERNQSBRU1BJIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrLgotICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotc3RhdGljIHZvaWQgUVNQSV9ETUFBYm9ydENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCitzdGF0aWMgdm9pZCBRU1BJX0RNQUFib3J0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9ICggUVNQSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoIFFTUElfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOwogCiAgIGhxc3BpLT5SeFhmZXJDb3VudCA9IDBVOwogICBocXNwaS0+VHhYZmVyQ291bnQgPSAwVTsKQEAgLTI1NzEsMTAgKzI2MjEsMTAgQEAKICAgICAvKiBETUEgQWJvcnQgY2FsbGVkIGJ5IFFTUEkgYWJvcnQgKi8KICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19UQyk7Ci0gICAgCisKICAgICAvKiBFbmFibGUgdGhlIFFTUEkgVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0ICovCiAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOwotICAgIAorCiAgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggQWJvcnQgcmVxdWVzdCAqLwogICAgIFNFVF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9BQk9SVCk7CiAgIH0KQEAgLTI1ODMsMzQgKzI2MzMsMzkgQEAKICAgICAvKiBETUEgQWJvcnQgY2FsbGVkIGR1ZSB0byBhIHRyYW5zZmVyIGVycm9yIGludGVycnVwdCAqLwogICAgIC8qIENoYW5nZSBzdGF0ZSBvZiBRU1BJICovCiAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7Ci0gICAgCisKICAgICAvKiBFcnJvciBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgaHFzcGktPkVycm9yQ2FsbGJhY2soaHFzcGkpOworI2Vsc2UKICAgICBIQUxfUVNQSV9FcnJvckNhbGxiYWNrKGhxc3BpKTsKKyNlbmRpZgogICB9CiB9CisKIC8qKgogICAqIEBicmllZiAgV2FpdCBmb3IgYSBmbGFnIHN0YXRlIHVudGlsIHRpbWVvdXQuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgRmxhZyBGbGFnIGNoZWNrZWQKLSAgKiBAcGFyYW0gIFN0YXRlIFZhbHVlIG9mIHRoZSBmbGFnIGV4cGVjdGVkCi0gICogQHBhcmFtICBUaW1lb3V0IER1cmF0aW9uIG9mIHRoZSB0aW1lIG91dAotICAqIEBwYXJhbSAgdGlja3N0YXJ0IHRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIEZsYWcgOiBGbGFnIGNoZWNrZWQKKyAgKiBAcGFyYW0gIFN0YXRlIDogVmFsdWUgb2YgdGhlIGZsYWcgZXhwZWN0ZWQKKyAgKiBAcGFyYW0gIFRpY2tzdGFydCA6IFRpY2sgc3RhcnQgdmFsdWUKKyAgKiBAcGFyYW0gIFRpbWVvdXQgOiBEdXJhdGlvbiBvZiB0aGUgdGltZW91dAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBGbGFnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1N0YXR1cyBTdGF0ZSwgdWludDMyX3QgdGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQorc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnU3RhdHVzIFN0YXRlLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBpbiBleHBlY3RlZCBzdGF0ZSAqLyAgICAKLSAgd2hpbGUoKEZsYWdTdGF0dXMpKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIEZsYWcpKSAhPSBTdGF0ZSkKKyAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIGluIGV4cGVjdGVkIHN0YXRlICovCisgIHdoaWxlKChfX0hBTF9RU1BJX0dFVF9GTEFHKGhxc3BpLCBGbGFnKSkgIT0gU3RhdGUpCiAgIHsKICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgIHsKLSAgICAgIGlmKChUaW1lb3V0ID09IDBVKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpCisgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgewogICAgICAgICBocXNwaS0+U3RhdGUgICAgID0gSEFMX1FTUElfU1RBVEVfRVJST1I7CiAgICAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfVElNRU9VVDsKLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9CkBAIC0yNjIwLDkgKzI2NzUsOSBAQAogCiAvKioKICAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgY29tbXVuaWNhdGlvbiByZWdpc3RlcnMuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgY21kIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgKiBAcGFyYW0gIEZ1bmN0aW9uYWxNb2RlIGZ1bmN0aW9uYWwgbW9kZSB0byBjb25maWd1cmVkCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBjbWQgOiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgICogQHBhcmFtICBGdW5jdGlvbmFsTW9kZSA6IGZ1bmN0aW9uYWwgbW9kZSB0byBjb25maWd1cmVkCiAgICogICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1dSSVRFOiBJbmRpcmVjdCB3cml0ZSBtb2RlCiAgICogICAgICAgICAgICBAYXJnIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1JFQUQ6IEluZGlyZWN0IHJlYWQgbW9kZQpAQCAtMjYzOSw3ICsyNjk0LDcgQEAKICAgICAvKiBDb25maWd1cmUgUVNQSTogRExSIHJlZ2lzdGVyIHdpdGggdGhlIG51bWJlciBvZiBkYXRhIHRvIHJlYWQgb3Igd3JpdGUgKi8KICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIsIChjbWQtPk5iRGF0YSAtIDFVKSk7CiAgIH0KLSAgICAgIAorCiAgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCiAgIHsKICAgICBpZiAoY21kLT5BbHRlcm5hdGVCeXRlTW9kZSAhPSBRU1BJX0FMVEVSTkFURV9CWVRFU19OT05FKQpAQCAtMjY1Miw5ICsyNzA3LDEwIEBACiAgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggaW5zdHJ1Y3Rpb24sIGFkZHJlc3MgYW5kIGFsdGVybmF0ZSBieXRlcyAtLS0tKi8KICAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGFsbCBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCiAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+RGRySG9sZEhhbGZDeWNsZSB8IGNtZC0+U0lPT01vZGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgMThVKSB8IGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKIAogICAgICAgICBpZiAoRnVuY3Rpb25hbE1vZGUgIT0gUVNQSV9GVU5DVElPTkFMX01PREVfTUVNT1JZX01BUFBFRCkKICAgICAgICAgewpAQCAtMjY2Nyw4ICsyNzIzLDkgQEAKICAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBpbnN0cnVjdGlvbiBhbmQgYWx0ZXJuYXRlIGJ5dGVzIC0tLS0qLwogICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggYWxsIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KICAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCAoY21kLT5EZHJNb2RlIHwgY21kLT5EZHJIb2xkSGFsZkN5Y2xlIHwgY21kLT5TSU9PTW9kZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCAxOFUpIHwgY21kLT5BbHRlcm5hdGVCeXRlc1NpemUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCBRVUFEU1BJX0NDUl9EQ1lDX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSB8IGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKICAgICAgIH0KICAgICB9CkBAIC0yNjc5LDkgKzI3MzYsOSBAQAogICAgICAgICAvKi0tLS0gQ29tbWFuZCB3aXRoIGluc3RydWN0aW9uIGFuZCBhZGRyZXNzIC0tLS0qLwogICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggYWxsIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KICAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCAoY21kLT5EZHJNb2RlIHwgY21kLT5EZHJIb2xkSGFsZkN5Y2xlIHwgY21kLT5TSU9PTW9kZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCAxOFUpIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NTaXplIHwgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+SW5zdHJ1Y3Rpb24gfCBGdW5jdGlvbmFsTW9kZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKIAogICAgICAgICBpZiAoRnVuY3Rpb25hbE1vZGUgIT0gUVNQSV9GVU5DVElPTkFMX01PREVfTUVNT1JZX01BUFBFRCkKICAgICAgICAgewpAQCAtMjY5NCw5ICsyNzUxLDkgQEAKICAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBvbmx5IGluc3RydWN0aW9uIC0tLS0qLwogICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggYWxsIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KICAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCAoY21kLT5EZHJNb2RlIHwgY21kLT5EZHJIb2xkSGFsZkN5Y2xlIHwgY21kLT5TSU9PTW9kZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCAxOFUpIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBjbWQtPkluc3RydWN0aW9uICB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbmFsTW9kZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc01vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkluc3RydWN0aW9uTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb24gfCBGdW5jdGlvbmFsTW9kZSkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjcxMiw4ICsyNzY5LDkgQEAKICAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBhZGRyZXNzIGFuZCBhbHRlcm5hdGUgYnl0ZXMgLS0tLSovCiAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLwogICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPkRkckhvbGRIYWxmQ3ljbGUgfCBjbWQtPlNJT09Nb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IDE4VSkgfCBjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfCBjbWQtPkFkZHJlc3NTaXplIHwgY21kLT5BZGRyZXNzTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCBRVUFEU1BJX0NDUl9EQ1lDX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSB8IGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NTaXplIHwgY21kLT5BZGRyZXNzTW9kZSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgRnVuY3Rpb25hbE1vZGUpKTsKIAogICAgICAgICBpZiAoRnVuY3Rpb25hbE1vZGUgIT0gUVNQSV9GVU5DVElPTkFMX01PREVfTUVNT1JZX01BUFBFRCkKQEAgLTI3MjcsOSArMjc4NSw5IEBACiAgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggb25seSBhbHRlcm5hdGUgYnl0ZXMgLS0tLSovCiAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLwogICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPkRkckhvbGRIYWxmQ3ljbGUgfCBjbWQtPlNJT09Nb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IDE4VSkgfCBjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfCBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25hbE1vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8IEZ1bmN0aW9uYWxNb2RlKSk7CiAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTI3MzksOSArMjc5Nyw5IEBACiAgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggb25seSBhZGRyZXNzIC0tLS0qLwogICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggYWxsIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KICAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCAoY21kLT5EZHJNb2RlIHwgY21kLT5EZHJIb2xkSGFsZkN5Y2xlIHwgY21kLT5TSU9PTW9kZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCAxOFUpIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NTaXplIHwgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWxNb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCBRVUFEU1BJX0NDUl9EQ1lDX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwgY21kLT5BZGRyZXNzU2l6ZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8IEZ1bmN0aW9uYWxNb2RlKSk7CiAKICAgICAgICAgaWYgKEZ1bmN0aW9uYWxNb2RlICE9IFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQpCiAgICAgICAgIHsKQEAgLTI3NTYsMTggKzI4MTQsMjIgQEAKICAgICAgICAgewogICAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLwogICAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+RGRySG9sZEhhbGZDeWNsZSB8IGNtZC0+U0lPT01vZGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCAxOFUpIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8IEZ1bmN0aW9uYWxNb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc01vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgRnVuY3Rpb25hbE1vZGUpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQorCiAvKioKICAgKiBAfQogICAqLwotI2VuZGlmIC8qIFNUTTMyRjQ0Nnh4IHx8IFNUTTMyRjQ2OXh4IHx8IFNUTTMyRjQ3OXh4IHx8IFNUTTMyRjQxMlp4IHx8IFNUTTMyRjQxMlZ4IHx8IFNUTTMyRjQxMlJ4IAotICAgICAgICAgIFNUTTMyRjQxM3h4IHx8IFNUTTMyRjQyM3h4ICovCisKKy8qKgorICAqIEB9CisgICovCiAKICNlbmRpZiAvKiBIQUxfUVNQSV9NT0RVTEVfRU5BQkxFRCAqLwogLyoqCkBAIC0yNzc4LDQgKzI4NDAsNiBAQAogICAqIEB9CiAgICovCiAKKyNlbmRpZiAvKiBkZWZpbmVkKFFVQURTUEkpIHx8IGRlZmluZWQoUVVBRFNQSTEpIHx8IGRlZmluZWQoUVVBRFNQSTIpICovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmNHh4X2hhbF9yY2MuYyBiL1NyYy9zdG0zMmY0eHhfaGFsX3JjYy5jCmluZGV4IDE4NTdkZjIuLjc2NDBiNjUgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY0eHhfaGFsX3JjYy5jCisrKyBiL1NyYy9zdG0zMmY0eHhfaGFsX3JjYy5jCkBAIC01MzksNyArNTM5LDcgQEAKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgLyogRG8gbm90IHJldHVybiBIQUxfRVJST1IgaWYgcmVxdWVzdCByZXBlYXRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KLSAgICAgICAgcGxsX2NvbmZpZyA9IFJDQy0+Q0ZHUjsKKyAgICAgICAgcGxsX2NvbmZpZyA9IFJDQy0+UExMQ0ZHUjsKICAgICAgICAgaWYoKFJFQURfQklUKHBsbF9jb25maWcsIFJDQ19QTExDRkdSX1BMTFNSQykgIT0gUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExTb3VyY2UpIHx8CiAgICAgICAgICAgIChSRUFEX0JJVChwbGxfY29uZmlnLCBSQ0NfUExMQ0ZHUl9QTExNKSAhPSBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE0pIHx8CiAgICAgICAgICAgIChSRUFEX0JJVChwbGxfY29uZmlnLCBSQ0NfUExMQ0ZHUl9QTExOKSAhPSBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTE4pIHx8CmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmNHh4X2hhbF9zcGkuYyBiL1NyYy9zdG0zMmY0eHhfaGFsX3NwaS5jCmluZGV4IGQxNjY2NzQuLjk5NTMxZjcgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY0eHhfaGFsX3NwaS5jCisrKyBiL1NyYy9zdG0zMmY0eHhfaGFsX3NwaS5jCkBAIC0yNzEwLDggKzI3MTAsMTcgQEAKICAgICB9CiAjZW5kaWYgLyogVVNFX1NQSV9DUkMgKi8KIAotICAgIC8qIERpc2FibGUgUngvVHggRE1BIFJlcXVlc3QgKGRvbmUgYnkgZGVmYXVsdCB0byBoYW5kbGUgdGhlIGNhc2UgbWFzdGVyIHJ4IGRpcmVjdGlvbiAyIGxpbmVzKSAqLwotICAgIENMRUFSX0JJVChoc3BpLT5JbnN0YW5jZS0+Q1IyLCBTUElfQ1IyX1RYRE1BRU4gfCBTUElfQ1IyX1JYRE1BRU4pOworICAgIC8qIENoZWNrIGlmIHdlIGFyZSBpbiBNYXN0ZXIgUlggMiBsaW5lIG1vZGUgKi8KKyAgICBpZiAoKGhzcGktPkluaXQuRGlyZWN0aW9uID09IFNQSV9ESVJFQ1RJT05fMkxJTkVTKSAmJiAoaHNwaS0+SW5pdC5Nb2RlID09IFNQSV9NT0RFX01BU1RFUikpCisgICAgeworICAgICAgLyogRGlzYWJsZSBSeC9UeCBETUEgUmVxdWVzdCAoZG9uZSBieSBkZWZhdWx0IHRvIGhhbmRsZSB0aGUgY2FzZSBtYXN0ZXIgcnggZGlyZWN0aW9uIDIgbGluZXMpICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9UWERNQUVOIHwgU1BJX0NSMl9SWERNQUVOKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vcm1hbCBjYXNlICovCisgICAgICBDTEVBUl9CSVQoaHNwaS0+SW5zdGFuY2UtPkNSMiwgU1BJX0NSMl9SWERNQUVOKTsKKyAgICB9CiAKICAgICAvKiBDaGVjayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLwogICAgIGlmIChTUElfRW5kUnhUcmFuc2FjdGlvbihoc3BpLCBTUElfREVGQVVMVF9USU1FT1VULCB0aWNrc3RhcnQpICE9IEhBTF9PSykKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY0eHhfbGxfZm1waTJjLmMgYi9TcmMvc3RtMzJmNHh4X2xsX2ZtcGkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkN2FlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9TcmMvc3RtMzJmNHh4X2xsX2ZtcGkyYy5jCkBAIC0wLDAgKzEsMjIwIEBACisvKioKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGZpbGUgICAgc3RtMzJmNHh4X2xsX2ZtcGkyYy5jCisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBGTVBJMkMgTEwgbW9kdWxlIGRyaXZlci4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICogQGF0dGVudGlvbgorICAqCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQorICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqLworI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorCisjaWYgZGVmaW5lZChGTVBJMkNfQ1IxX1BFKQorLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJzdG0zMmY0eHhfbGxfZm1waTJjLmgiCisjaW5jbHVkZSAic3RtMzJmNHh4X2xsX2J1cy5oIgorI2lmZGVmICBVU0VfRlVMTF9BU1NFUlQKKyNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKKyNlbHNlCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZW5kaWYKKworLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9MTF9Ecml2ZXIKKyAgKiBAeworICAqLworCisjaWYgZGVmaW5lZCAoRk1QSTJDMSkKKworLyoqIEBkZWZncm91cCBGTVBJMkNfTEwgRk1QSTJDCisgICogQHsKKyAgKi8KKworLyogUHJpdmF0ZSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBGTVBJMkNfTExfUHJpdmF0ZV9NYWNyb3MKKyAgKiBAeworICAqLworCisjZGVmaW5lIElTX0xMX0ZNUEkyQ19QRVJJUEhFUkFMX01PREUoX19WQUxVRV9fKSAgICAoKChfX1ZBTFVFX18pID09IExMX0ZNUEkyQ19NT0RFX0kyQykgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19WQUxVRV9fKSA9PSBMTF9GTVBJMkNfTU9ERV9TTUJVU19IT1NUKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRk1QSTJDX01PREVfU01CVVNfREVWSUNFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0ZNUEkyQ19NT0RFX1NNQlVTX0RFVklDRV9BUlApKQorCisjZGVmaW5lIElTX0xMX0ZNUEkyQ19BTkFMT0dfRklMVEVSKF9fVkFMVUVfXykgICAgICAoKChfX1ZBTFVFX18pID09IExMX0ZNUEkyQ19BTkFMT0dGSUxURVJfRU5BQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0ZNUEkyQ19BTkFMT0dGSUxURVJfRElTQUJMRSkpCisKKyNkZWZpbmUgSVNfTExfRk1QSTJDX0RJR0lUQUxfRklMVEVSKF9fVkFMVUVfXykgICAgICgoX19WQUxVRV9fKSA8PSAweDAwMDAwMDBGVSkKKworI2RlZmluZSBJU19MTF9GTVBJMkNfT1dOX0FERFJFU1MxKF9fVkFMVUVfXykgICAgICAgKChfX1ZBTFVFX18pIDw9IDB4MDAwMDAzRkZVKQorCisjZGVmaW5lIElTX0xMX0ZNUEkyQ19UWVBFX0FDS05PV0xFREdFKF9fVkFMVUVfXykgICAoKChfX1ZBTFVFX18pID09IExMX0ZNUEkyQ19BQ0spIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVkFMVUVfXykgPT0gTExfRk1QSTJDX05BQ0spKQorCisjZGVmaW5lIElTX0xMX0ZNUEkyQ19PV05fQUREUlNJWkUoX19WQUxVRV9fKSAgICAgICAoKChfX1ZBTFVFX18pID09IExMX0ZNUEkyQ19PV05BRERSRVNTMV83QklUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1ZBTFVFX18pID09IExMX0ZNUEkyQ19PV05BRERSRVNTMV8xMEJJVCkpCisvKioKKyAgKiBAfQorICAqLworCisvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoqIEBhZGR0b2dyb3VwIEZNUEkyQ19MTF9FeHBvcnRlZF9GdW5jdGlvbnMKKyAgKiBAeworICAqLworCisvKiogQGFkZHRvZ3JvdXAgRk1QSTJDX0xMX0VGX0luaXQKKyAgKiBAeworICAqLworCisvKioKKyAgKiBAYnJpZWYgIERlLWluaXRpYWxpemUgdGhlIEZNUEkyQyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcmV0dmFsIEFuIEVycm9yU3RhdHVzIGVudW1lcmF0aW9uIHZhbHVlOgorICAqICAgICAgICAgIC0gU1VDQ0VTUzogRk1QSTJDIHJlZ2lzdGVycyBhcmUgZGUtaW5pdGlhbGl6ZWQKKyAgKiAgICAgICAgICAtIEVSUk9SOiBGTVBJMkMgcmVnaXN0ZXJzIGFyZSBub3QgZGUtaW5pdGlhbGl6ZWQKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0ZNUEkyQ19EZUluaXQoRk1QSTJDX1R5cGVEZWYgKkZNUEkyQ3gpCit7CisgIEVycm9yU3RhdHVzIHN0YXR1cyA9IFNVQ0NFU1M7CisKKyAgLyogQ2hlY2sgdGhlIEZNUEkyQyBJbnN0YW5jZSBGTVBJMkN4ICovCisgIGFzc2VydF9wYXJhbShJU19GTVBJMkNfQUxMX0lOU1RBTkNFKEZNUEkyQ3gpKTsKKworICBpZiAoRk1QSTJDeCA9PSBGTVBJMkMxKQorICB7CisgICAgLyogRm9yY2UgcmVzZXQgb2YgRk1QSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX0ZvcmNlUmVzZXQoTExfQVBCMV9HUlAxX1BFUklQSF9GTVBJMkMxKTsKKworICAgIC8qIFJlbGVhc2UgcmVzZXQgb2YgRk1QSTJDIGNsb2NrICovCisgICAgTExfQVBCMV9HUlAxX1JlbGVhc2VSZXNldChMTF9BUEIxX0dSUDFfUEVSSVBIX0ZNUEkyQzEpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEVSUk9SOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBGTVBJMkMgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gRk1QSTJDX0luaXRTdHJ1Y3QuCisgICogQHBhcmFtICBGTVBJMkN4IEZNUEkyQyBJbnN0YW5jZS4KKyAgKiBAcGFyYW0gIEZNUEkyQ19Jbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX0ZNUEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICogQHJldHZhbCBBbiBFcnJvclN0YXR1cyBlbnVtZXJhdGlvbiB2YWx1ZToKKyAgKiAgICAgICAgICAtIFNVQ0NFU1M6IEZNUEkyQyByZWdpc3RlcnMgYXJlIGluaXRpYWxpemVkCisgICogICAgICAgICAgLSBFUlJPUjogTm90IGFwcGxpY2FibGUKKyAgKi8KK0Vycm9yU3RhdHVzIExMX0ZNUEkyQ19Jbml0KEZNUEkyQ19UeXBlRGVmICpGTVBJMkN4LCBMTF9GTVBJMkNfSW5pdFR5cGVEZWYgKkZNUEkyQ19Jbml0U3RydWN0KQoreworICAvKiBDaGVjayB0aGUgRk1QSTJDIEluc3RhbmNlIEZNUEkyQ3ggKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0ZNUEkyQ19BTExfSU5TVEFOQ0UoRk1QSTJDeCkpOworCisgIC8qIENoZWNrIHRoZSBGTVBJMkMgcGFyYW1ldGVycyBmcm9tIEZNUEkyQ19Jbml0U3RydWN0ICovCisgIGFzc2VydF9wYXJhbShJU19MTF9GTVBJMkNfUEVSSVBIRVJBTF9NT0RFKEZNUEkyQ19Jbml0U3RydWN0LT5QZXJpcGhlcmFsTW9kZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRk1QSTJDX0FOQUxPR19GSUxURVIoRk1QSTJDX0luaXRTdHJ1Y3QtPkFuYWxvZ0ZpbHRlcikpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRk1QSTJDX0RJR0lUQUxfRklMVEVSKEZNUEkyQ19Jbml0U3RydWN0LT5EaWdpdGFsRmlsdGVyKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9GTVBJMkNfT1dOX0FERFJFU1MxKEZNUEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyZXNzMSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRk1QSTJDX1RZUEVfQUNLTk9XTEVER0UoRk1QSTJDX0luaXRTdHJ1Y3QtPlR5cGVBY2tub3dsZWRnZSkpOworICBhc3NlcnRfcGFyYW0oSVNfTExfRk1QSTJDX09XTl9BRERSU0laRShGTVBJMkNfSW5pdFN0cnVjdC0+T3duQWRkclNpemUpKTsKKworICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBGTVBJMkN4IFBlcmlwaGVyYWwgKi8KKyAgTExfRk1QSTJDX0Rpc2FibGUoRk1QSTJDeCk7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZNUEkyQ3ggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIENvbmZpZ3VyZSB0aGUgYW5hbG9nIGFuZCBkaWdpdGFsIG5vaXNlIGZpbHRlcnMgd2l0aCBwYXJhbWV0ZXJzIDoKKyAgICogLSBBbmFsb2dGaWx0ZXI6IEZNUEkyQ19DUjFfQU5GT0ZGIGJpdAorICAgKiAtIERpZ2l0YWxGaWx0ZXI6IEZNUEkyQ19DUjFfRE5GWzM6MF0gYml0cworICAgKi8KKyAgTExfRk1QSTJDX0NvbmZpZ0ZpbHRlcnMoRk1QSTJDeCwgRk1QSTJDX0luaXRTdHJ1Y3QtPkFuYWxvZ0ZpbHRlciwgRk1QSTJDX0luaXRTdHJ1Y3QtPkRpZ2l0YWxGaWx0ZXIpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGTVBJMkN4IFRJTUlOR1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBDb25maWd1cmUgdGhlIFNEQSBzZXR1cCwgaG9sZCB0aW1lIGFuZCB0aGUgU0NMIGhpZ2gsIGxvdyBwZXJpb2Qgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIFRpbWluZzogRk1QSTJDX1RJTUlOR1JfUFJFU0NbMzowXSwgRk1QSTJDX1RJTUlOR1JfU0NMREVMWzM6MF0sIEZNUEkyQ19USU1JTkdSX1NEQURFTFszOjBdLAorICAgKiAgICAgICAgICAgRk1QSTJDX1RJTUlOR1JfU0NMSFs3OjBdIGFuZCBGTVBJMkNfVElNSU5HUl9TQ0xMWzc6MF0gYml0cworICAgKi8KKyAgTExfRk1QSTJDX1NldFRpbWluZyhGTVBJMkN4LCBGTVBJMkNfSW5pdFN0cnVjdC0+VGltaW5nKTsKKworICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEZNUEkyQ3ggUGVyaXBoZXJhbCAqLworICBMTF9GTVBJMkNfRW5hYmxlKEZNUEkyQ3gpOworCisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGTVBJMkN4IE9BUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiBEaXNhYmxlLCBDb25maWd1cmUgYW5kIEVuYWJsZSBGTVBJMkN4IGRldmljZSBvd24gYWRkcmVzcyAxIHdpdGggcGFyYW1ldGVycyA6CisgICAqIC0gT3duQWRkcmVzczE6ICBGTVBJMkNfT0FSMV9PQTFbOTowXSBiaXRzCisgICAqIC0gT3duQWRkclNpemU6ICBGTVBJMkNfT0FSMV9PQTFNT0RFIGJpdAorICAgKi8KKyAgTExfRk1QSTJDX0Rpc2FibGVPd25BZGRyZXNzMShGTVBJMkN4KTsKKyAgTExfRk1QSTJDX1NldE93bkFkZHJlc3MxKEZNUEkyQ3gsIEZNUEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyZXNzMSwgRk1QSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJTaXplKTsKKworICAvKiBPd25BZHJlc3MxID09IDAgaXMgcmVzZXJ2ZWQgZm9yIEdlbmVyYWwgQ2FsbCBhZGRyZXNzICovCisgIGlmIChGTVBJMkNfSW5pdFN0cnVjdC0+T3duQWRkcmVzczEgIT0gMFUpCisgIHsKKyAgICBMTF9GTVBJMkNfRW5hYmxlT3duQWRkcmVzczEoRk1QSTJDeCk7CisgIH0KKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRk1QSTJDeCBNT0RFIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiBDb25maWd1cmUgRk1QSTJDeCBwZXJpcGhlcmFsIG1vZGUgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIFBlcmlwaGVyYWxNb2RlOiBGTVBJMkNfQ1IxX1NNQkRFTiBhbmQgRk1QSTJDX0NSMV9TTUJIRU4gYml0cworICAgKi8KKyAgTExfRk1QSTJDX1NldE1vZGUoRk1QSTJDeCwgRk1QSTJDX0luaXRTdHJ1Y3QtPlBlcmlwaGVyYWxNb2RlKTsKKworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRk1QSTJDeCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogQ29uZmlndXJlIHRoZSBBQ0tub3dsZWRnZSBvciBOb24gQUNLbm93bGVkZ2UgY29uZGl0aW9uCisgICAqIGFmdGVyIHRoZSBhZGRyZXNzIHJlY2VpdmUgbWF0Y2ggY29kZSBvciBuZXh0IHJlY2VpdmVkIGJ5dGUgd2l0aCBwYXJhbWV0ZXIgOgorICAgKiAtIFR5cGVBY2tub3dsZWRnZTogRk1QSTJDX0NSMl9OQUNLIGJpdAorICAgKi8KKyAgTExfRk1QSTJDX0Fja25vd2xlZGdlTmV4dERhdGEoRk1QSTJDeCwgRk1QSTJDX0luaXRTdHJ1Y3QtPlR5cGVBY2tub3dsZWRnZSk7CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICAqIEBicmllZiAgU2V0IGVhY2ggQHJlZiBMTF9GTVBJMkNfSW5pdFR5cGVEZWYgZmllbGQgdG8gZGVmYXVsdCB2YWx1ZS4KKyAgKiBAcGFyYW0gIEZNUEkyQ19Jbml0U3RydWN0IFBvaW50ZXIgdG8gYSBAcmVmIExMX0ZNUEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0ZNUEkyQ19TdHJ1Y3RJbml0KExMX0ZNUEkyQ19Jbml0VHlwZURlZiAqRk1QSTJDX0luaXRTdHJ1Y3QpCit7CisgIC8qIFNldCBGTVBJMkNfSW5pdFN0cnVjdCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgRk1QSTJDX0luaXRTdHJ1Y3QtPlBlcmlwaGVyYWxNb2RlICA9IExMX0ZNUEkyQ19NT0RFX0kyQzsKKyAgRk1QSTJDX0luaXRTdHJ1Y3QtPlRpbWluZyAgICAgICAgICA9IDBVOworICBGTVBJMkNfSW5pdFN0cnVjdC0+QW5hbG9nRmlsdGVyICAgID0gTExfRk1QSTJDX0FOQUxPR0ZJTFRFUl9FTkFCTEU7CisgIEZNUEkyQ19Jbml0U3RydWN0LT5EaWdpdGFsRmlsdGVyICAgPSAwVTsKKyAgRk1QSTJDX0luaXRTdHJ1Y3QtPk93bkFkZHJlc3MxICAgICA9IDBVOworICBGTVBJMkNfSW5pdFN0cnVjdC0+VHlwZUFja25vd2xlZGdlID0gTExfRk1QSTJDX05BQ0s7CisgIEZNUEkyQ19Jbml0U3RydWN0LT5Pd25BZGRyU2l6ZSAgICAgPSBMTF9GTVBJMkNfT1dOQUREUkVTUzFfN0JJVDsKK30KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEZNUEkyQzEgKi8KKworLyoqCisgICogQH0KKyAgKi8KKworI2VuZGlmIC8qIEZNUEkyQ19DUjFfUEUgKi8KKyNlbmRpZiAvKiBVU0VfRlVMTF9MTF9EUklWRVIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY0eHhfbGxfdXNiLmMgYi9TcmMvc3RtMzJmNHh4X2xsX3VzYi5jCmluZGV4IDkyNjNmYzMuLjhlN2M3NDcgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY0eHhfbGxfdXNiLmMKKysrIGIvU3JjL3N0bTMyZjR4eF9sbF91c2IuYwpAQCAtMjkwLDYgKzI5MCw4IEBACiAgIC8qIFZCVVMgU2Vuc2luZyBzZXR1cCAqLwogICBpZiAoY2ZnLnZidXNfc2Vuc2luZ19lbmFibGUgPT0gMFUpCiAgIHsKKyAgICBVU0J4X0RFVklDRS0+RENUTCB8PSBVU0JfT1RHX0RDVExfU0RJUzsKKwogICAgIC8qIERlYWN0aXZhdGUgVkJVUyBTZW5zaW5nIEIgKi8KICAgICBVU0J4LT5HQ0NGRyAmPSB+VVNCX09UR19HQ0NGR19WQkRFTjsKIApAQCAtMzEwLDYgKzMxMiw3IEBACiAgICAgICogRGlzYWJsZSBIVyBWQlVTIHNlbnNpbmcuIFZCVVMgaXMgaW50ZXJuYWxseSBjb25zaWRlcmVkIHRvIGJlIGFsd2F5cwogICAgICAqIGF0IFZCVVMtVmFsaWQgbGV2ZWwgKDVWKS4KICAgICAgKi8KKyAgICBVU0J4X0RFVklDRS0+RENUTCB8PSBVU0JfT1RHX0RDVExfU0RJUzsKICAgICBVU0J4LT5HQ0NGRyB8PSBVU0JfT1RHX0dDQ0ZHX05PVkJVU1NFTlM7CiAgICAgVVNCeC0+R0NDRkcgJj0gflVTQl9PVEdfR0NDRkdfVkJVU0JTRU47CiAgICAgVVNCeC0+R0NDRkcgJj0gflVTQl9PVEdfR0NDRkdfVkJVU0FTRU47CkBAIC0zMTcsNyArMzIwLDcgQEAKICAgZWxzZQogICB7CiAgICAgLyogRW5hYmxlIEhXIFZCVVMgc2Vuc2luZyAqLwotICAgIFVTQngtPkdPVEdDVEwgJj0gflVTQl9PVEdfR0NDRkdfTk9WQlVTU0VOUzsKKyAgICBVU0J4LT5HQ0NGRyAmPSB+VVNCX09UR19HQ0NGR19OT1ZCVVNTRU5TOwogICAgIFVTQngtPkdDQ0ZHIHw9IFVTQl9PVEdfR0NDRkdfVkJVU0JTRU47CiAgIH0KICNlbmRpZiAvKiBkZWZpbmVkKFNUTTMyRjQ0Nnh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ2OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQ3OXh4KSB8fCBkZWZpbmVkKFNUTTMyRjQxMlp4KSB8fCBkZWZpbmVkKFNUTTMyRjQxMlZ4KSB8fCBkZWZpbmVkKFNUTTMyRjQxMlJ4KSB8fCBkZWZpbmVkKFNUTTMyRjQxMkN4KSB8fCBkZWZpbmVkKFNUTTMyRjQxM3h4KSB8fCBkZWZpbmVkKFNUTTMyRjQyM3h4KSAqLwpAQCAtNDA5LDE3ICs0MTIsNiBAQAogCiAgIFVTQnhfREVWSUNFLT5ESUVQTVNLICY9IH4oVVNCX09UR19ESUVQTVNLX1RYRlVSTSk7CiAKLSAgaWYgKGNmZy5kbWFfZW5hYmxlID09IDFVKQotICB7Ci0gICAgLypTZXQgdGhyZXNob2xkIHBhcmFtZXRlcnMgKi8KLSAgICBVU0J4X0RFVklDRS0+RFRIUkNUTCA9IFVTQl9PVEdfRFRIUkNUTF9UWFRIUkxFTl82IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRFRIUkNUTF9SWFRIUkxFTl82OwotCi0gICAgVVNCeF9ERVZJQ0UtPkRUSFJDVEwgfD0gVVNCX09UR19EVEhSQ1RMX1JYVEhSRU4gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRFRIUkNUTF9JU09USFJFTiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19EVEhSQ1RMX05PTklTT1RIUkVOOwotICB9Ci0KICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cy4gKi8KICAgVVNCeC0+R0lOVE1TSyA9IDBVOwogCkBAIC02NDEsNiArNjMzLDEyIEBACiAgIC8qIFJlYWQgREVQQ1RMbiByZWdpc3RlciAqLwogICBpZiAoZXAtPmlzX2luID09IDFVKQogICB7CisgICAgaWYgKChVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICYgVVNCX09UR19ESUVQQ1RMX0VQRU5BKSA9PSBVU0JfT1RHX0RJRVBDVExfRVBFTkEpCisgICAgeworICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCB8PSBVU0JfT1RHX0RJRVBDVExfU05BSzsKKyAgICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gVVNCX09UR19ESUVQQ1RMX0VQRElTOworICAgIH0KKwogICAgIFVTQnhfREVWSUNFLT5ERUFDSE1TSyAmPSB+KFVTQl9PVEdfREFJTlRNU0tfSUVQTSAmICh1aW50MzJfdCkoMVVMIDw8IChlcC0+bnVtICYgRVBfQUREUl9NU0spKSk7CiAgICAgVVNCeF9ERVZJQ0UtPkRBSU5UTVNLICY9IH4oVVNCX09UR19EQUlOVE1TS19JRVBNICYgKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpKTsKICAgICBVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICY9IH4oVVNCX09UR19ESUVQQ1RMX1VTQkFFUCB8CkBAIC02NTEsNiArNjQ5LDEyIEBACiAgIH0KICAgZWxzZQogICB7CisgICAgaWYgKChVU0J4X09VVEVQKGVwbnVtKS0+RE9FUENUTCAmIFVTQl9PVEdfRE9FUENUTF9FUEVOQSkgPT0gVVNCX09UR19ET0VQQ1RMX0VQRU5BKQorICAgIHsKKyAgICAgIFVTQnhfT1VURVAoZXBudW0pLT5ET0VQQ1RMIHw9IFVTQl9PVEdfRE9FUENUTF9TTkFLOworICAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgfD0gVVNCX09UR19ET0VQQ1RMX0VQRElTOworICAgIH0KKwogICAgIFVTQnhfREVWSUNFLT5ERUFDSE1TSyAmPSB+KFVTQl9PVEdfREFJTlRNU0tfT0VQTSAmICgodWludDMyX3QpKDFVTCA8PCAoZXAtPm51bSAmIEVQX0FERFJfTVNLKSkgPDwgMTYpKTsKICAgICBVU0J4X0RFVklDRS0+REFJTlRNU0sgJj0gfihVU0JfT1RHX0RBSU5UTVNLX09FUE0gJiAoKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpIDw8IDE2KSk7CiAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgJj0gfihVU0JfT1RHX0RPRVBDVExfVVNCQUVQIHwKQEAgLTY3NiwxMSArNjgwLDIzIEBACiAgIC8qIFJlYWQgREVQQ1RMbiByZWdpc3RlciAqLwogICBpZiAoZXAtPmlzX2luID09IDFVKQogICB7CisgICAgaWYgKChVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICYgVVNCX09UR19ESUVQQ1RMX0VQRU5BKSA9PSBVU0JfT1RHX0RJRVBDVExfRVBFTkEpCisgICAgeworICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCAgfD0gVVNCX09UR19ESUVQQ1RMX1NOQUs7CisgICAgICBVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICB8PSBVU0JfT1RHX0RJRVBDVExfRVBESVM7CisgICAgfQorCiAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCAmPSB+IFVTQl9PVEdfRElFUENUTF9VU0JBRVA7CiAgICAgVVNCeF9ERVZJQ0UtPkRBSU5UTVNLICY9IH4oVVNCX09UR19EQUlOVE1TS19JRVBNICYgKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpKTsKICAgfQogICBlbHNlCiAgIHsKKyAgICBpZiAoKFVTQnhfT1VURVAoZXBudW0pLT5ET0VQQ1RMICYgVVNCX09UR19ET0VQQ1RMX0VQRU5BKSA9PSBVU0JfT1RHX0RPRVBDVExfRVBFTkEpCisgICAgeworICAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgIHw9IFVTQl9PVEdfRE9FUENUTF9TTkFLOworICAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgIHw9IFVTQl9PVEdfRE9FUENUTF9FUERJUzsKKyAgICB9CisKICAgICBVU0J4X09VVEVQKGVwbnVtKS0+RE9FUENUTCAmPSB+VVNCX09UR19ET0VQQ1RMX1VTQkFFUDsKICAgICBVU0J4X0RFVklDRS0+REFJTlRNU0sgJj0gfihVU0JfT1RHX0RBSU5UTVNLX09FUE0gJiAoKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpIDw8IDE2KSk7CiAgIH0KQEAgLTEyNDcsMTMgKzEyNjMsOSBAQAogewogICB1aW50MzJfdCBVU0J4X0JBU0UgPSAodWludDMyX3QpVVNCeDsKIAotICAvKiBTZXQgdGhlIE1QUyBvZiB0aGUgSU4gRVAgYmFzZWQgb24gdGhlIGVudW1lcmF0aW9uIHNwZWVkICovCisgIC8qIFNldCB0aGUgTVBTIG9mIHRoZSBJTiBFUDAgdG8gNjQgYnl0ZXMgKi8KICAgVVNCeF9JTkVQKDBVKS0+RElFUENUTCAmPSB+VVNCX09UR19ESUVQQ1RMX01QU0laOwogCi0gIGlmICgoVVNCeF9ERVZJQ0UtPkRTVFMgJiBVU0JfT1RHX0RTVFNfRU5VTVNQRCkgPT0gRFNUU19FTlVNU1BEX0xTX1BIWV82TUhaKQotICB7Ci0gICAgVVNCeF9JTkVQKDBVKS0+RElFUENUTCB8PSAzVTsKLSAgfQogICBVU0J4X0RFVklDRS0+RENUTCB8PSBVU0JfT1RHX0RDVExfQ0dJTkFLOwogCiAgIHJldHVybiBIQUxfT0s7CkBAIC0xMzY3LDcgKzEzNzksNyBAQAogCiAgIGlmICgoVVNCeC0+Q0lEICYgKDB4MVUgPDwgOCkpICE9IDBVKQogICB7Ci0gICAgaWYgKGNmZy5zcGVlZCA9PSBVU0JfT1RHX1NQRUVEX0ZVTEwpCisgICAgaWYgKGNmZy5zcGVlZCA9PSBVU0JIX0ZTTFNfU1BFRUQpCiAgICAgewogICAgICAgLyogRm9yY2UgRGV2aWNlIEVudW1lcmF0aW9uIHRvIEZTL0xTIG1vZGUgb25seSAqLwogICAgICAgVVNCeF9IT1NULT5IQ0ZHIHw9IFVTQl9PVEdfSENGR19GU0xTUzsKQEAgLTE5MzYsNyArMTk0OCw2IEBACiAgIHVpbnQzMl90IHZhbHVlOwogICB1aW50MzJfdCBpOwogCi0KICAgKHZvaWQpVVNCX0Rpc2FibGVHbG9iYWxJbnQoVVNCeCk7CiAKICAgLyogRmx1c2ggRklGTyAqLwpAQCAtMTk3NSw2ICsxOTg2LDcgQEAKICAgLyogQ2xlYXIgYW55IHBlbmRpbmcgSG9zdCBpbnRlcnJ1cHRzICovCiAgIFVTQnhfSE9TVC0+SEFJTlQgPSAweEZGRkZGRkZGVTsKICAgVVNCeC0+R0lOVFNUUyA9IDB4RkZGRkZGRkZVOworCiAgICh2b2lkKVVTQl9FbmFibGVHbG9iYWxJbnQoVVNCeCk7CiAKICAgcmV0dXJuIEhBTF9PSzsK