CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNSBhbmQgMC45LjYgIFtYWCBYWFggMjAwMF0KCiAgKikgSW4gdXRpbC9ta2Vyci5wbCAod2hpY2ggaW1wbGVtZW50cyAnbWFrZSBlcnJvcnMnKSwgcHJlc2VydmUKICAgICByZWFzb24gc3RyaW5ncyBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSAuYyBmaWxlLCBhcwogICAgIHRoZSBkZWZhdWx0IHRvIGhhdmUgb25seSBkb3duY2FzZSBsZXR0ZXJzIChhbmQgZGlnaXRzKSBpbgogICAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHJlYXNvbnMgY29kZXMgaXMgbm90IGFsd2F5cyBhcHByb3ByaWF0ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBFUlJfbG9hZF9FUlJfc3RyaW5ncygpLCBidWlsZCBhbiBFUlJfTElCX1NZUyBlcnJvciByZWFzb24gdGFibGUKICAgICB1c2luZyBzdHJlcnJvci4gIFByZXZpb3VzbHksIEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKCkgcmV0dXJuZWQKICAgICBsaWJyYXJ5IG5hbWVzIGFzIHJlYXNvbiBzdHJpbmdzIGZvciBTWVNlcnI7IGJ1dCBTWVNlcnIgaXMgYSBzcGVjaWFsCiAgICAgY2FzZSB3aGVyZSBzbWFsbCBudW1iZXJzIGFyZSBlcnJubyB2YWx1ZXMsIG5vdCBsaWJyYXJ5IG51bWJlcnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkICctZHNhcGFyYW0nIG9wdGlvbiB0byAnb3BlbnNzbCBkaHBhcmFtJyBhcHBsaWNhdGlvbi4gIFRoaXMKICAgICBjb252ZXJ0cyBEU0EgcGFyYW1ldGVycyBpbnRvIERIIHBhcmFtZXRlcnMuIChXaGVuIGNyZWF0aW5nIHBhcmFtZXRlcnMsCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgaXMgdXNlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSAnbGVuZ3RoJyAocmVjb21tZW5kZWQgZXhwb25lbnQgbGVuZ3RoKSBpbiBDIGNvZGUgZ2VuZXJhdGVkCiAgICAgYnkgJ29wZW5zc2wgZGhwYXJhbSAtQycuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRfbGFiZWwgaW4gcGVybGFzbSB3YXMgYWxyZWFkeSBiZWluZyB1c2VkCiAgICAgc28gY291bGRuJ3QgYmUgdXNlZCBhcyBhICJmaWxlIHNjb3BlIiBmbGFnLiBNb3ZlZCB0byB0aGlyZCBhcmd1bWVudAogICAgIHdoaWNoIHdhcyBmcmVlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIFBFTV9BU04xX3dyaXRlX2JpbyBhbmQgc29tZSBvdGhlciBmdW5jdGlvbnMsIHVzZSBSQU5EX3BzZXVkb19ieXRlcwogICAgIGluc3RlYWQgb2YgUkFORF9ieXRlcyBmb3IgZW5jcnlwdGlvbiBJVnMgYW5kIHNhbHRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgUkFORF9zdGF0dXMoKSBpbnRvIFJBTkRfTUVUSE9EIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nCiAgICAgaXQgb25seSBmb3IgbWRfcmFuZC5jICBPdGhlcndpc2UgcmVwbGFjaW5nIHRoZSBQUk5HIGJ5IGNhbGxpbmcKICAgICBSQU5EX3NldF9yYW5kX21ldGhvZCB3b3VsZCBiZSBpbXBvc3NpYmxlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IGxldCBEU0FfZ2VuZXJhdGVfa2V5KCkgZW50ZXIgYW4gaW5maW5pdGUgbG9vcCBpZiB0aGUgcmFuZG9tCiAgICAgbnVtYmVyIGdlbmVyYXRpb24gZmFpbHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICdyYW5kJyBhcHBsaWNhdGlvbiBmb3IgY3JlYXRpbmcgcHNldWRvLXJhbmRvbSBvdXRwdXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkZWQgY29uZmlndXJhdGlvbiBzdXBwb3J0IGZvciBMaW51eC9JQTY0CiAgICAgW1JvbGYgSGFiZXJyZWNrZXIgPHJvbGZAc3VzZS5kZT5dCgogICopIEFzc2VtYmxlciBtb2R1bGUgc3VwcG9ydCBmb3IgTWluZ3czMi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgSFBVWCAoaW4gc2hsaWIvKS4KICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT4gYW5kIEFub255bW91c10KCiAgKikgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgU29sYXJpcyBnY2MuCiAgICAgW0x1dHogQmVobmtlIDxiZWhua2VAdHJ1c3RjZW50ZXIuZGU+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNCBhbmQgMC45LjUgIFsyOCBGZWIgMjAwMF0KCiAgKikgUEtDUzdfZW5jcnlwdCgpIHdhcyBhZGRpbmcgdGV4dCBNSU1FIGhlYWRlcnMgdHdpY2UgYmVjYXVzZSB0aGV5CiAgICAgd2VyZSBhZGRlZCBtYW51YWxseSBhbmQgYnkgU01JTUVfY3JsZl9jb3B5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gYm50ZXN0LmMgZG9uJ3QgY2FsbCBCTl9yYW5kIHdpdGggemVybyBiaXRzIGFyZ3VtZW50LgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IEFuZHJldyBXLiBHcmF5IDxhZ3JheUBpY29uc2luYy5jb20+XQoKICAqKSBCTl9tdWwgYnVnZml4OiBJbiBibl9tdWxfcGFydF9yZWN1cnNpb24oKSBvbmx5IHRoZSBhPmFbbl0gJiYgYj5iW25dCiAgICAgY2FzZSB3YXMgaW1wbGVtZW50ZWQuIFRoaXMgY2F1c2VkIEJOX2Rpdl9yZWNwKCkgdG8gZmFpbCBvY2Nhc2lvbmFsbHkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHNldF9sYWJlbCgpIGluIHRoZSBwZXJsCiAgICAgYXNzZW1ibHkgbGFuZ3VhZ2UgYnVpbGRlci4gSWYgdGhpcyBhcmd1bWVudCBleGlzdHMgYW5kIGlzIHNldAogICAgIHRvIDEgaXQgc2lnbmFscyB0aGF0IHRoZSBhc3NlbWJsZXIgc2hvdWxkIHVzZSBhIHN5bWJvbCB3aG9zZSAKICAgICBzY29wZSBpcyB0aGUgZW50aXJlIGZpbGUsIG5vdCBqdXN0IHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGlzCiAgICAgaXMgbmVlZGVkIHdpdGggTUFTTSB3aGljaCB1c2VzIHRoZSBmb3JtYXQgbGFiZWw6OiBmb3IgdGhpcyBzY29wZS4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBQZXRlciBSdW5lc3RpZyA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQ2hhbmdlIHRoZSBBU04xIHR5cGVzIHNvIHRoZXkgYXJlIHR5cGVkZWZzIGJ5IGRlZmF1bHQuIEJlZm9yZQogICAgIGFsbW9zdCBhbGwgdHlwZXMgd2VyZSAjZGVmaW5lJ2QgdG8gQVNOMV9TVFJJTkcgd2hpY2ggd2FzIGNhdXNpbmcKICAgICBTVEFDS19PRigpIHByb2JsZW1zOiB5b3UgY291bGRuJ3QgZGVjbGFyZSBTVEFDS19PRihBU04xX1VURjhTVFJJTkcpCiAgICAgZm9yIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIG5hbWVzIG9mIG5ldyBmdW5jdGlvbnMgdG8gdGhlIG5ldyBnZXQxL2dldDAgbmFtaW5nCiAgICAgY29udmVudGlvbjogQWZ0ZXIgJ2dldDEnLCB0aGUgY2FsbGVyIG93bnMgYSByZWZlcmVuY2UgY291bnQKICAgICBhbmQgaGFzIHRvIGNhbGwgLi4uX2ZyZWU7ICdnZXQwJyByZXR1cm5zIGEgcG9pbnRlciB0byBzb21lCiAgICAgZGF0YSBzdHJ1Y3R1cmUgd2l0aG91dCBpbmNyZW1lbnRpbmcgcmVmZXJlbmNlIGNvdW50ZXJzLgogICAgIChTb21lIG9mIHRoZSBleGlzdGluZyAnZ2V0JyBmdW5jdGlvbnMgaW5jcmVtZW50IGEgcmVmZXJlbmNlCiAgICAgY291bnRlciwgc29tZSBkb24ndC4pCiAgICAgU2ltaWxhcmx5LCAnc2V0MScgYW5kICdhZGQxJyBmdW5jdGlvbnMgaW5jcmVhc2UgcmVmZXJlbmNlCiAgICAgY291bnRlcnMgb3IgZHVwbGljYXRlIG9iamVjdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSBvZiB0ZW1wIFJTQSBrZXkgZ2VuZXJhdGlvbiBmYWlsdXJlOgogICAgIHRoZSBjb2RlIHVzZWQgdG8gYXNzdW1lIGl0IGFsd2F5cyB3b3JrZWQgYW5kIGNyYXNoZWQgb24gZmFpbHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVuIHByb2JsZW0gaW4gQklPX3ByaW50ZigpLgogICAgIFtVbGYgTfZsbGVyLCB1c2luZyBwdWJsaWMgZG9tYWluIGNvZGUgYnkgUGF0cmljayBQb3dlbGw7IHByb2JsZW0KICAgICAgcG9pbnRlZCBvdXQgYnkgRGF2aWQgU2FjZXJkb3RlIDxkYXMzM0Bjb3JuZWxsLmVkdT5dCgogICopIFN1cHBvcnQgRUdEIDxodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vPi4gIE5ldyBmdW5jdGlvbnMKICAgICBSQU5EX2VnZCgpIGFuZCBSQU5EX3N0YXR1cygpLiAgSW4gdGhlIGNvbW1hbmQgbGluZSBhcHBsaWNhdGlvbiwKICAgICB0aGUgRUdEIHNvY2tldCBjYW4gYmUgc3BlY2lmaWVkIGxpa2UgYSBzZWVkIGZpbGUgdXNpbmcgUkFOREZJTEUKICAgICBvciAtcmFuZC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWxsb3cgdGhlIHN0cmluZyBDRVJUSUZJQ0FURSB0byBiZSB0b2xlcmF0ZWQgaW4gUEtDUyM3IHN0cnVjdHVyZXMuCiAgICAgU29tZSBDQXMgKGUuZy4gVmVyaXNpZ24pIGRpc3RyaWJ1dGUgY2VydGlmaWNhdGVzIGluIHRoaXMgZm9ybS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgdGhlIFNTTF9BTExPV19BREggY29tcGlsZSBvcHRpb24gYW5kIHNldCB0aGUgZGVmYXVsdCBjaXBoZXIKICAgICBsaXN0IHRvIGV4Y2x1ZGUgdGhlbS4gVGhpcyBtZWFucyB0aGF0IG5vIHNwZWNpYWwgY29tcGlsYXRpb24gb3B0aW9uCiAgICAgaXMgbmVlZGVkIHRvIHVzZSBhbm9ueW1vdXMgREg6IGl0IGp1c3QgbmVlZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCiAgICAgY2lwaGVyIGxpc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBFVlBfTURfQ1RYX3R5cGUgbWFjcm8gc28gaXRzIG1lYW5pbmcgY29uc2lzdGVudCB3aXRoCiAgICAgRVZQX01EX3R5cGUuIFRoZSBvbGQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gYSBuZXcgbWFjcm8gY2FsbGVkCiAgICAgRVZQX01EX21kKCkuIENoYW5nZSBjb2RlIHRoYXQgdXNlcyBpdCBhbmQgdXBkYXRlIGRvY3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgLi4uX2N0cmwgZnVuY3Rpb25zIG5vdyBoYXZlIGNvcnJlc3BvbmRpbmcgLi4uX2NhbGxiYWNrX2N0cmwgZnVuY3Rpb25zCiAgICAgd2hlcmUgdGhlICd2b2lkIConIGFyZ3VtZW50IGlzIHJlcGxhY2VkIGJ5IGEgZnVuY3Rpb24gcG9pbnRlciBhcmd1bWVudC4KICAgICBQcmV2aW91c2x5ICd2b2lkIConIHdhcyBhYnVzZWQgdG8gcG9pbnQgdG8gZnVuY3Rpb25zLCB3aGljaCB3b3JrcyBvbgogICAgIG1hbnkgcGxhdGZvcm1zLCBidXQgaXMgbm90IGNvcnJlY3QuICBBcyB0aGVzZSBmdW5jdGlvbnMgYXJlIHVzdWFsbHkKICAgICBjYWxsZWQgYnkgbWFjcm9zIGRlZmluZWQgaW4gT3BlblNTTCBoZWFkZXIgZmlsZXMsIG1vc3Qgc291cmNlIGNvZGUKICAgICBzaG91bGQgd29yayB3aXRob3V0IGNoYW5nZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4gKHdoaWNoIGlzIGNyZWF0ZWQgYnkgQ29uZmlndXJlKSBub3cgY29udGFpbnMKICAgICBzZWN0aW9ucyB3aXRoIGluZm9ybWF0aW9uIG9uIC1ELi4uIGNvbXBpbGVyIHN3aXRjaGVzIHVzZWQgZm9yCiAgICAgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBzZWUgdGhlbS4gIFRvIGVuYWJsZQogICAgIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgYSBwcmUtcHJvY2Vzc29yIHN5bWJvbCBPUEVOU1NMXy4uLl9ERUZJTkVTCiAgICAgbXVzdCBiZSBkZWZpbmVkLiAgRS5nLiwKICAgICAgICAjZGVmaW5lIE9QRU5TU0xfQUxHT1JJVEhNX0RFRklORVMKICAgICAgICAjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgogICAgIGRlZmluZXMgYWxsIHBlcnRpbmVudCBOT188YWxnbz4gc3ltYm9scywgc3VjaCBhcyBOT19JREVBLCBOT19SU0EsIGV0Yy4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBVbGYgYW5kIEJvZG8gTfZsbGVyXQoKICAqKSBCdWdmaXg6IFRvbGVyYXRlIGZyYWdtZW50YXRpb24gYW5kIGludGVybGVhdmluZyBpbiB0aGUgU1NMIDMvVExTCiAgICAgcmVjb3JkIGxheWVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgJ290aGVyJyB0eXBlIGluIGNlcnRpZmljYXRlIGF1eCBpbmZvIHRvIGEgU1RBQ0tfT0YKICAgICBYNTA5X0FMR09SLiBBbHRob3VnaCBub3QgYW4gQWxnb3JpdGhtSWRlbnRpZmllciBhcyBzdWNoIGl0IGhhcwogICAgIHRoZSByZXF1aXJlZCBBU04xIGZvcm1hdDogYXJiaXRyYXJ5IHR5cGVzIGRldGVybWluZWQgYnkgYW4gT0lELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIFBFTV93cml0ZV9YNTA5X1JFUV9ORVcoKSBmdW5jdGlvbnMgYW5kIGEgY29tbWFuZCBsaW5lCiAgICAgYXJndW1lbnQgdG8gJ3JlcScuIFRoaXMgaXMgbm90IGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzIG5ld2VyIG9yCiAgICAgYmV0dGVyIHRoYW4gb3RoZXJzIGl0IGp1c3QgdXNlcyB0aGUgd29yayAnTkVXJyBpbiB0aGUgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IGhlYWRlciBsaW5lcy4gU29tZSBzb2Z0d2FyZSBuZWVkcyB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2UgcGFzc3dvcmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50czogbm93IHBhc3N3b3JkcyBjYW4gYmUKICAgICBvYnRhaW5lZCBmcm9tIHZhcmlvdXMgc291cmNlcy4gRGVsZXRlIHRoZSBQRU1fY2IgZnVuY3Rpb24gYW5kIG1ha2UKICAgICBpdCB0aGUgZGVmYXVsdCBiZWhhdmlvdXI6IGkuZS4gaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwgYW5kIHRoZQogICAgIHVzcmRhdGEgYXJndW1lbnQgaXMgbm90IE5VTEwgaW50ZXJwcmV0IGl0IGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHBhc3MKICAgICBwaHJhc2UuIElmIHVzcmRhdGEgYW5kIHRoZSBjYWxsYmFjayBhcmUgTlVMTCB0aGVuIHRoZSBwYXNzIHBocmFzZQogICAgIGlzIHByb21wdGVkIGZvciBhcyB1c3VhbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIENvbXBhcSBBdGFsbGEgY3J5cHRvIGFjY2VsZXJhdG9yLiBJZiBpdCBpcyBpbnN0YWxsZWQsCiAgICAgdGhlIHN1cHBvcnQgaXMgYXV0b21hdGljYWxseSBlbmFibGVkLiBUaGUgcmVzdWx0aW5nIGJpbmFyaWVzIHdpbGwKICAgICBhdXRvZGV0ZWN0IHRoZSBjYXJkIGFuZCB1c2UgaXQgaWYgcHJlc2VudC4KICAgICBbQmVuIExhdXJpZSBhbmQgQ29tcGFxIEluYy5dCgogICopIFdvcmsgYXJvdW5kIGZvciBOZXRzY2FwZSBoYW5nIGJ1Zy4gVGhpcyBzZW5kcyBjZXJ0aWZpY2F0ZSByZXF1ZXN0CiAgICAgYW5kIHNlcnZlciBkb25lIGluIG9uZSByZWNvcmQuIFNpbmNlIHRoaXMgaXMgcGVyZmVjdGx5IGxlZ2FsIGluIHRoZQogICAgIFNTTC9UTFMgcHJvdG9jb2wgaXQgaXNuJ3QgYSAiYnVnIiBvcHRpb24gYW5kIGlzIG9uIGJ5IGRlZmF1bHQuIFNlZQogICAgIHRoZSBidWdzL1NTTHYzIGVudHJ5IGZvciBtb3JlIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSFAtVVggdHVuZS11cDogbmV3IHVuaWZpZWQgY29uZmlncywgSFAgQyBjb21waWxlciBidWcgd29ya2Fyb3VuZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIC1yYW5kIGFyZ3VtZW50IHRvIHNtaW1lIGFuZCBwa2NzMTIgYXBwbGljYXRpb25zIGFuZCByZWFkL3dyaXRlCiAgICAgb2Ygc2VlZCBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAncGFzc3dkJyB0b29sIGZvciBjcnlwdCgzKSBhbmQgYXByMSBwYXNzd29yZCBoYXNoZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGNvbW1hbmQgbGluZSBwYXNzd29yZCBvcHRpb25zIHRvIHRoZSByZW1haW5pbmcgYXBwbGljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1ZyBmaXggZm9yIEJOX2Rpdl9yZWNwKCkgZm9yIG51bWVyYXRvcnMgd2l0aCBhbiBldmVuIG51bWJlciBvZgogICAgIGJpdHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE1vcmUgdGVzdHMgaW4gYm50ZXN0LmMsIGFuZCBjaGFuZ2VkIHRlc3RfYm4gb3V0cHV0LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSAuL2NvbmZpZyByZWNvZ25pemVzIE1hY09TIFggbm93LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBCdWcgZml4IGZvciBCTl9kaXYoKSB3aGVuIHRoZSBmaXJzdCB3b3JkcyBvZiBudW0gYW5kIGRpdnNvciBhcmUKICAgICBlcXVhbCAoaXQgZ2F2ZSB3cm9uZyByZXN1bHRzIGlmIChyZW09KG4xLXEqZDApJkJOX01BU0syKSA8IGQwKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHZhcmlvdXMgYnJva2VuIFBLQ1MjOCBmb3JtYXRzLCBhbmQgY29tbWFuZCBsaW5lCiAgICAgb3B0aW9ucyB0byBwcm9kdWNlIHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBCTl9DVFhfc3RhcnQoKSwgQk5fQ1RYX2dldCgpIGFuZCBCVF9DVFhfZW5kKCkgdG8KICAgICBnZXQgdGVtcG9yYXJ5IEJJR05VTXMgZnJvbSBhIEJOX0NUWC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ29ycmVjdCByZXR1cm4gdmFsdWVzIGluIEJOX21vZF9leHBfbW9udCgpIGFuZCBCTl9tb2RfZXhwMl9tb250KCkKICAgICBmb3IgcCA9PSAwLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIFNTTGVheV9hZGRfYWxsXyooKSBmdW5jdGlvbnMgdG8gT3BlblNTTF9hZGRfYWxsXyooKSBhbmQKICAgICBpbmNsdWRlIGEgI2RlZmluZSBmcm9tIHRoZSBvbGQgbmFtZSB0byB0aGUgbmV3LiBUaGUgb3JpZ2luYWwgaW50ZW50CiAgICAgd2FzIHRoYXQgc3RhdGljYWxseSBsaW5rZWQgYmluYXJpZXMgY291bGQgZm9yIGV4YW1wbGUganVzdCBjYWxsCiAgICAgU1NMZWF5X2FkZF9hbGxfY2lwaGVycygpIHRvIGp1c3QgYWRkIGNpcGhlcnMgdG8gdGhlIHRhYmxlIGFuZCBub3QKICAgICBsaW5rIHdpdGggZGlnZXN0cy4gVGhpcyBuZXZlciB3b3JrZWQgYmVjYXlzZSBTU0xlYXlfYWRkX2FsbF9kaWdlc3RzKCkKICAgICBhbmQgU1NMZWF5X2FkZF9hbGxfY2lwaGVycygpIHdlcmUgaW4gdGhlIHNhbWUgc291cmNlIGZpbGUgc28gY2FsbGluZwogICAgIG9uZSB3b3VsZCBsaW5rIHdpdGggdGhlIG90aGVyLiBUaGV5IGFyZSBub3cgaW4gc2VwYXJhdGUgc291cmNlIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyAtbm90ZXh0IG9wdGlvbiB0byAnY2EnIGFuZCBhIC1wdWJrZXkgb3B0aW9uIHRvICdzcGthYycuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGEgbGVzcyB1bnVzdWFsIGZvcm0gb2YgdGhlIE1pbGxlci1SYWJpbiBwcmltYWxpdHkgdGVzdCAoaXQgdXNlZAogICAgIGEgYmluYXJ5IGFsZ29yaXRobSBmb3IgZXhwb25lbnRpYXRpb24gaW50ZWdyYXRlZCBpbnRvIHRoZSBNaWxsZXItUmFiaW4KICAgICBsb29wLCBvdXIgc3RhbmRhcmQgbW9kZXhwIGFsZ29yaXRobXMgYXJlIGZhc3RlcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3VwcG9ydCBmb3IgdGhlIEVCQ0RJQyBjaGFyYWN0ZXIgc2V0IGNvbXBsZXRlZC4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+XQoKICAqKSBTb3VyY2UgY29kZSBjbGVhbnVwczogdXNlIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlLCBlbGltaW5hdGUgY2FzdHMsCiAgICAgdXNlIHZvaWQgKiBpbnN0ZWFkIG9mIGNoYXIgKiBpbiBsaGFzaC4KICAgICBbVWxmIE32bGxlcl0gCgogICopIEJ1Z2ZpeDogc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2Ugd2FzIG5vdCByZXN0YXJ0YWJsZQogICAgICh0aGUgc3RhdGUgd2FzIG5vdCBjaGFuZ2VkIHRvIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQiwgYW5kIGJlY2F1c2Ugb2YKICAgICB0aGlzIHRoZSBzZXJ2ZXIgY291bGQgb3ZlcndyaXRlIGVwaGVtZXJhbCBrZXlzIHRoYXQgdGhlIGNsaWVudAogICAgIGhhcyBhbHJlYWR5IHNlZW4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFR1cm4gRFNBX2lzX3ByaW1lIGludG8gYSBtYWNybyB0aGF0IGNhbGxzIEJOX2lzX3ByaW1lLAogICAgIHVzaW5nIDUwIGl0ZXJhdGlvbnMgb2YgdGhlIFJhYmluLU1pbGxlciB0ZXN0LgoKICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBub3cgdXNlcyBCTl9pc19wcmltZV9mYXN0dGVzdCAod2l0aCA1MAogICAgIGl0ZXJhdGlvbnMgb2YgdGhlIFJhYmluLU1pbGxlciB0ZXN0IGFzIHJlcXVpcmVkIGJ5IHRoZSBhcHBlbmRpeAogICAgIHRvIEZJUFMgUFVCIDE4NlstMV0pIGluc3RlYWQgb2YgRFNBX2lzX3ByaW1lLgogICAgIEFzIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0IGluY2x1ZGVzIHRyaWFsIGRpdmlzaW9uLCBEU0EgcGFyYW1ldGVyCiAgICAgZ2VuZXJhdGlvbiBiZWNvbWVzIG11Y2ggZmFzdGVyLgoKICAgICBUaGlzIGltcGxpZXMgYSBjaGFuZ2UgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgaW4gRFNBX2lzX3ByaW1lCiAgICAgYW5kIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UKICAgICBmb3IgZWFjaCBwb3NpdGl2ZSB3aXRuZXNzIGluIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCwgbm90IGp1c3QKICAgICBvY2Nhc2lvbmFsbHkgaW4gdGhlIGlubmVyIGxvb3A7IGFuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUKICAgICBjYWxsYmFjayBmdW5jdGlvbiBub3cgcHJvdmlkZSBhbiBpdGVyYXRpb24gY291bnQgZm9yIHRoZSBvdXRlcgogICAgIGxvb3AgcmF0aGVyIHRoYW4gZm9yIHRoZSBjdXJyZW50IGludm9jYXRpb24gb2YgdGhlIGlubmVyIGxvb3AuCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgYWRkaXRpb25hbGx5IGNhbiBjYWxsIHRoZSBjYWxsYmFjawogICAgIGZ1bmN0aW9uIHdpdGggYW4gJ2l0ZXJhdGlvbiBjb3VudCcgb2YgLTEsIG1lYW5pbmcgdGhhdCBhCiAgICAgY2FuZGlkYXRlIGhhcyBwYXNzZWQgdGhlIHRyaWFsIGRpdmlzaW9uIHRlc3QgKHdoZW4gcSBpcyBnZW5lcmF0ZWQgCiAgICAgZnJvbSBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBzZWVkLCB0cmlhbCBkaXZpc2lvbiBpcyBza2lwcGVkKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5faXNfcHJpbWVfZmFzdHRlc3QgdGhhdCBvcHRpb25hbGx5IGRvZXMgdHJpYWwKICAgICBkaXZpc2lvbiBiZWZvcmUgc3RhcnRpbmcgdGhlIFJhYmluLU1pbGxlciB0ZXN0IGFuZCBoYXMKICAgICBhbiBhZGRpdGlvbmFsIEJOX0NUWCAqIGFyZ3VtZW50ICh3aGVyZWFzIEJOX2lzX3ByaW1lIGFsd2F5cwogICAgIGhhcyB0byBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgQk5fQ1RYKS4KICAgICAnY2FsbGJhY2soMSwgLTEsIGNiX2FyZyknIGlzIGNhbGxlZCB3aGVuIGEgbnVtYmVyIGhhcyBwYXNzZWQgdGhlCiAgICAgdHJpYWwgZGl2aXNpb24gc3RhZ2UuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBidWcgaW4gQ1JMIGVuY29kaW5nLiBUaGUgdmFsaWRpdHkgZGF0ZXMgd2VyZW4ndCBiZWluZyBoYW5kbGVkCiAgICAgYXMgQVNOMV9USU1FLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtcGtjczEyIG9wdGlvbiB0byBDQS5wbCBzY3JpcHQgdG8gd3JpdGUgb3V0IGEgUEtDUyMxMiBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBCTl9wc2V1ZG9fcmFuZCgpLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDbGVhbiB1cCBCTl9tb2RfbXVsX21vbnRnb21lcnkoKTogcmVwbGFjZSB0aGUgYnJva2VuIChhbmQgdW5yZWFkYWJsZSkKICAgICBiaWdudW0gdmVyc2lvbiBvZiBCTl9mcm9tX21vbnRnb21lcnkoKSB3aXRoIHRoZSB3b3JraW5nIGNvZGUgZnJvbQogICAgIFNTTGVheSAwLjkuMCAodGhlIHdvcmQgYmFzZWQgdmVyc2lvbiBpcyBmYXN0ZXIgYW55d2F5KSwgYW5kIGNsZWFuIHVwCiAgICAgdGhlIGNvbW1lbnRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIHMyX2NsbnQuYyAoZnVuY3Rpb24gZ2V0X3NlcnZlcl9oZWxsbykgdGhhdAogICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB1c2UgdGhlIHNhbWUgU1NMX1NFU1NJT04gZGF0YSBzdHJ1Y3R1cmUgaW4KICAgICBTU0wyIGNsaWVudHMgaW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgcmV0dXJuIHZhbHVlIG9mIFJBTkRfbG9hZF9maWxlKCkgbm8gbG9uZ2VyIGNvdW50cyBieXRlcyBvYnRhaW5lZAogICAgIGJ5IHN0YXQoKS4gIFJBTkRfbG9hZF9maWxlKC4uLiwgLTEpIGlzIG5ldyBhbmQgdXNlcyB0aGUgY29tcGxldGUgZmlsZQogICAgIHRvIHNlZWQgdGhlIFBSTkcgKHByZXZpb3VzbHkgYW4gZXhwbGljaXQgYnl0ZSBjb3VudCB3YXMgcmVxdWlyZWQpLgogICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KCiAgKikgQ2xlYW4gdXAgQ1JZUFRPX0VYX0RBVEEgZnVuY3Rpb25zLCBzb21lIG9mIHRoZXNlIGRpZG4ndCBoYXZlIHByb3RvdHlwZXMKICAgICB1c2VkIChjaGFyICopIGluc3RlYWQgb2YgKHZvaWQgKikgYW5kIGhhZCBjYXN0cyBhbGwgb3ZlciB0aGUgcGxhY2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBCTl9nZW5lcmF0ZV9wcmltZSgpIHJldHVybiBOVUxMIG9uIGVycm9yIGlmIHJldCE9TlVMTC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUmV0YWluIHNvdXJjZSBjb2RlIGNvbXBhdGliaWxpdHkgZm9yIEJOX3ByaW1lX2NoZWNrcyBtYWNybzoKICAgICBCTl9pc19wcmltZSguLi4sIEJOX3ByaW1lX2NoZWNrcywgLi4uKSBub3cgdXNlcwogICAgIEJOX3ByaW1lX2NoZWNrc19mb3Jfc2l6ZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZgogICAgIFJhYmluLU1pbGxlciBpdGVyYXRpb25zLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEaWZmaWUtSGVsbG1hbiB1c2VzICJzYWZlIiBwcmltZXM6IERIX2NoZWNrKCkgcmV0dXJuIGNvZGUgcmVuYW1lZCB0bwogICAgIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUuCiAgICAgKENoZWNrIGlmIHRoaXMgaXMgdHJ1ZT8gT3BlblBHUCBjYWxscyB0aGVtICJzdHJvbmciLikKICAgICBbVWxmIE32bGxlcl0KCiAgKikgTWVyZ2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgImRoIiBhbmQgImdlbmRoIiBwcm9ncmFtcyBpbnRvIGEgbmV3IHByb2dyYW0KICAgICAiZGhwYXJhbSIuIFRoZSBvbGQgcHJvZ3JhbXMgYXJlIHJldGFpbmVkIGZvciBub3cgYnV0IHdpbGwgaGFuZGxlIERIIGtleXMKICAgICAoaW5zdGVhZCBvZiBwYXJhbWV0ZXJzKSBpbiBmdXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgY2lwaGVycywgc19zZXJ2ZXIgYW5kIHNfY2xpZW50IHByb2dyYW1zIGNoZWNrIHRoZSByZXR1cm4gdmFsdWVzCiAgICAgd2hlbiBhIG5ldyBjaXBoZXIgbGlzdCBpcyBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSB0aGUgU1NML1RMUyBjaXBoZXIgbWVjaGFuaXNtIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIFRMUyA1NmJpdAogICAgIGNpcGhlcnMuIEJlZm9yZSB3aGVuIHRoZSA1NmJpdCBjaXBoZXJzIHdlcmUgZW5hYmxlZCB0aGUgc29ydGluZyB3YXMKICAgICB3cm9uZy4KCiAgICAgVGhlIHN5bnRheCBmb3IgdGhlIGNpcGhlciBzb3J0aW5nIGhhcyBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgc29ydGluZyBieQogICAgIGNpcGhlci1zdHJlbmd0aCAodXNpbmcgdGhlIHN0cmVuZ3RoX2JpdHMgaGFyZCBjb2RlZCBpbiB0aGUgdGFibGVzKS4KICAgICBUaGUgbmV3IGNvbW1hbmQgaXMgIkBTVFJFTkdUSCIgKHNlZSBhbHNvIGRvYy9hcHBzL2NpcGhlcnMucG9kKS4KCiAgICAgRml4IGEgYnVnIGluIHRoZSBjaXBoZXItY29tbWFuZCBwYXJzZXI6IHdoZW4gc3VwcGx5aW5nIGEgY2lwaGVyIGNvbW1hbmQKICAgICBzdHJpbmcgd2l0aCBhbiAidW5kZWZpbmVkIiBzeW1ib2wgKG5laXRoZXIgY29tbWFuZCBub3IgYWxwaGFudW1lcmljCiAgICAgW0EtWmEtejAtOV0sIHNzbF9zZXRfY2lwaGVyX2xpc3QgdXNlZCB0byBoYW5nIGluIGFuIGVuZGxlc3MgbG9vcC4gTm93CiAgICAgYW4gZXJyb3IgaXMgZmxhZ2dlZC4KCiAgICAgRHVlIHRvIHRoZSBzdHJlbmd0aC1zb3J0aW5nIGV4dGVuc2lvbiwgdGhlIGNvZGUgb2YgdGhlCiAgICAgc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpIGZ1bmN0aW9uIHdhcyBjb21wbGV0ZWx5IHJlYXJyYW5nZWQuIEkgaG9wZSB0aGF0CiAgICAgdGhlIHJlYWRhYmlsaXR5IHdhcyBhbHNvIGluY3JlYXNlZCA6LSkKICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT5dCgogICopIE1pbm9yIGNoYW5nZSB0byAneDUwOScgdXRpbGl0eS4gVGhlIC1DQWNyZWF0ZXNlcmlhbCBvcHRpb24gbm93IHVzZXMgMQogICAgIGZvciB0aGUgZmlyc3Qgc2VyaWFsIG51bWJlciBhbmQgcGxhY2VzIDIgaW4gdGhlIHNlcmlhbCBudW1iZXIgZmlsZS4gVGhpcwogICAgIGF2b2lkcyBwcm9ibGVtcyB3aGVuIHRoZSByb290IENBIGlzIGNyZWF0ZWQgd2l0aCBzZXJpYWwgbnVtYmVyIHplcm8gYW5kCiAgICAgdGhlIGZpcnN0IHVzZXIgY2VydGlmaWNhdGUgaGFzIHRoZSBzYW1lIGlzc3VlciBuYW1lIGFuZCBzZXJpYWwgbnVtYmVyCiAgICAgYXMgdGhlIHJvb3QgQ0EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gWDUwOV9BVFRSSUJVVEUgdXRpbGl0aWVzLCBjaGFuZ2UgdGhlICdyZXEnIHByb2dyYW0gc28gaXQgdXNlcwogICAgIHRoZSBuZXcgY29kZS4gQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3R1ZmYuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyB0byBYNTA5X0FUVFJJQlVURSB1dGlsaXRpZXMuIFRoZXNlIGhhdmUgYmVlbiByZW5hbWVkIGZyb20KICAgICBYNTA5XyooKSB0byBYNTA5YXRfKigpIG9uIHRoZSBncm91bmRzIHRoYXQgdGhleSBkb24ndCBoYW5kbGUgWDUwOQogICAgIHN0cnVjdHVyZXMgYW5kIGJlaGF2ZSBpbiBhbiBhbmFsYWdvdXMgd2F5IHRvIHRoZSBYNTA5djMgZnVuY3Rpb25zOgogICAgIHRoZXkgc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBidXQgd3JhcHBlciBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQKICAgICBpbnN0ZWFkLgoKICAgICBTbyB3ZSBhbHNvIG5vdyBoYXZlIHNvbWUgd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoZSBYNTA5YXQgZnVuY3Rpb25zCiAgICAgd2hlbiBwYXNzZWQgY2VydGlmaWNhdGUgcmVxdWVzdHMuIChUTyBETzogc2ltaWxhciB0aGluZ3MgY2FuIGJlIGRvbmUgd2l0aAogICAgIFBLQ1MjNyBzaWduZWQgYW5kIHVuc2lnbmVkIGF0dHJpYnV0ZXMsIFBLQ1MjMTIgYXR0cmlidXRlcyBhbmQgYSBmZXcgb3RoZXIKICAgICB0aGluZ3MuIFNvbWUgb2YgdGhlc2UgbmVlZCBzb21lIGQyaSBvciBpMmQgYW5kIHByaW50IGZ1bmN0aW9uYWxpdHkKICAgICBiZWNhdXNlIHRoZXkgaGFuZGxlIG1vcmUgY29tcGxleCBzdHJ1Y3R1cmVzLikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbWlzc2luZyAjaWZuZGVmcyB0aGF0IGNhdXNlZCBtaXNzaW5nIHN5bWJvbHMgd2hlbiBidWlsZGluZyBsaWJzc2wKICAgICBhcyBhIHNoYXJlZCBsaWJyYXJ5IHdpdGhvdXQgUlNBLiAgVXNlICNpZm5kZWYgTk9fU1NMMiBpbnN0ZWFkIG9mCiAgICAgTk9fUlNBIGluIHNzbC9zMiouYy4gCiAgICAgW0tyaXMgS2VubmF3YXkgPGtyaXNAaHViLmZyZWVic2Qub3JnPiwgbW9kaWZpZWQgYnkgVWxmIE32bGxlcl0KCiAgKikgUHJlY2F1dGlvbnMgYWdhaW5zdCB1c2luZyB0aGUgUFJORyB1bmluaXRpYWxpemVkOiBSQU5EX2J5dGVzKCkgbm93CiAgICAgaGFzIGEgcmV0dXJuIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGUgcXVhbGl0eSBvZiB0aGUgcmFuZG9tIGRhdGEKICAgICAoMSA9IG9rLCAwID0gbm90IHNlZWRlZCkuICBBbHNvIGFuIGVycm9yIGlzIHJlY29yZGVkIG9uIHRoZSB0aHJlYWQncwogICAgIGVycm9yIHF1ZXVlLiBOZXcgZnVuY3Rpb24gUkFORF9wc2V1ZG9fYnl0ZXMoKSBnZW5lcmF0ZXMgb3V0cHV0IHRoYXQgaXMKICAgICBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBidXQgbm90IHVucHJlZGljdGFibGUuIFJBTkRfYWRkIGlzIGxpa2UKICAgICBSQU5EX3NlZWQsIGJ1dCB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCBmb3IgYW4gZW50cm9weSBlc3RpbWF0ZQogICAgIChSQU5EX3NlZWQgYWx3YXlzIGFzc3VtZXMgZnVsbCBlbnRyb3B5KS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRG8gbW9yZSBpdGVyYXRpb25zIG9mIFJhYmluLU1pbGxlciBwcm9iYWJsZSBwcmltZSB0ZXN0IChzcGVjaWZpY2FsbHksCiAgICAgMyBmb3IgMTAyNC1iaXQgcHJpbWVzLCA2IGZvciA1MTItYml0IHByaW1lcywgMTIgZm9yIDI1Ni1iaXQgcHJpbWVzCiAgICAgaW5zdGVhZCBvZiBvbmx5IDIgZm9yIGFsbCBsZW5ndGhzOyBzZWUgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIGRlZmluaXRpb24KICAgICBpbiBjcnlwdG8vYm4vYm5fcHJpbWUuYyBmb3IgdGhlIGNvbXBsZXRlIHRhYmxlKS4gIFRoaXMgZ3VhcmFudGVlcyBhCiAgICAgZmFsc2UtcG9zaXRpdmUgcmF0ZSBvZiBhdCBtb3N0IDJeLTgwIGZvciByYW5kb20gaW5wdXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSBzc2wzX3JlYWRfbiAoc3NsL3MzX3BrdC5jKSBhdm9pZGluZyBhIGNvdXBsZSBvZiBidWdzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X0NUWF9yZ2V0X2NoYWluKCkgKHJlbmFtZWQgdG8gWDUwOV9DVFhfZ2V0MV9jaGFpbgogICAgIGluIHRoZSAwLjkuNSByZWxlYXNlKSwgdGhpcyByZXR1cm5zIHRoZSBjaGFpbgogICAgIGZyb20gYW4gWDUwOV9DVFggc3RydWN0dXJlIHdpdGggYSBkdXAgb2YgdGhlIHN0YWNrIGFuZCBhbGwKICAgICB0aGUgWDUwOSByZWZlcmVuY2UgY291bnRzIHVwcGVkOiBzbyB0aGUgc3RhY2sgd2lsbCBleGlzdAogICAgIGFmdGVyIFg1MDlfQ1RYX2NsZWFudXAoKSBoYXMgYmVlbiBjYWxsZWQuIE1vZGlmeSBwa2NzMTIuYwogICAgIHRvIHVzZSB0aGlzLgoKICAgICBBbHNvIG1ha2UgU1NMX1NFU1NJT05fcHJpbnQoKSBwcmludCBvdXQgdGhlIHZlcmlmeSByZXR1cm4KICAgICBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBtYW5wYWdlIGZvciB0aGUgcGtjczEyIGNvbW1hbmQuIEFsc28gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgYmVoYXZpb3VyIHNvIE1BQyBpdGVyYXRpb24gY291bnRzIGFyZSB1c2VkIHVubGVzcyB0aGUgbmV3CiAgICAgLW5vbWFjaXRlciBvcHRpb24gaXMgdXNlZC4gVGhpcyBpbXByb3ZlcyBmaWxlIHNlY3VyaXR5IGFuZAogICAgIG9ubHkgb2xkZXIgdmVyc2lvbnMgb2YgTVNJRSAoNC4wIGZvciBleGFtcGxlKSBuZWVkIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhvbm9yIHRoZSBuby14eHggQ29uZmlndXJlIG9wdGlvbnMgd2hlbiBjcmVhdGluZyAuREVGIGZpbGVzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgUEtDUyMxMCBhdHRyaWJ1dGVzIHRvIGZpZWxkIHRhYmxlOiBjaGFsbGVuZ2VQYXNzd29yZCwgCiAgICAgdW5zdHJ1Y3R1cmVkTmFtZSBhbmQgdW5zdHJ1Y3R1cmVkQWRkcmVzcy4gVGhlc2UgYXJlIHRha2VuIGZyb20KICAgICBkcmFmdCBQS0NTIzkgdjIuMCBidXQgYXJlIGNvbXBhdGlibGUgd2l0aCB2MS4yIHByb3ZpZGVkIG5vIAogICAgIGludGVybmF0aW9uYWwgY2hhcmFjdGVycyBhcmUgdXNlZC4KCiAgICAgTW9yZSBjaGFuZ2VzIHRvIFg1MDlfQVRUUklCVVRFIGNvZGU6IGFsbG93IHRoZSBzZXR0aW5nIG9mIHR5cGVzCiAgICAgYmFzZWQgb24gc3RyaW5ncy4gUmVtb3ZlIHRoZSAnbG9jJyBwYXJhbWV0ZXIgd2hlbiBhZGRpbmcKICAgICBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhlc2Ugd2lsbCBiZSBhIFNFVCBPRiBlbmNvZGluZyB3aGljaCBpcyBzb3J0ZWQKICAgICBpbiBBU04xIG9yZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgY2hhbmdlcyB0byB0aGUgJ3JlcScgdXRpbGl0eSB0byBhbGxvdyByZXF1ZXN0IGdlbmVyYXRpb24KICAgICBhdXRvbWF0aW9uLiBUaGlzIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8ganVzdCBnZW5lcmF0ZSBhIHRlbXBsYXRlCiAgICAgZmlsZSBjb250YWluaW5nIGFsbCB0aGUgZmllbGQgdmFsdWVzIGFuZCBoYXZlIHJlcSBjb25zdHJ1Y3QgdGhlCiAgICAgcmVxdWVzdC4KCiAgICAgSW5pdGlhbCBzdXBwb3J0IGZvciBYNTA5X0FUVFJJQlVURSBoYW5kbGluZy4gU3RhY2tzIG9mIHRoZXNlIGFyZQogICAgIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlIGluY2x1ZGluZyBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyBhbmQgUEtDUyM3CiAgICAgc3RydWN0dXJlcy4gVGhleSBhcmUgY3VycmVudGx5IGhhbmRsZWQgbWFudWFsbHkgd2hlcmUgbmVjZXNzYXJ5IHdpdGgKICAgICBzb21lIHByaW1pdGl2ZSB3cmFwcGVycyBmb3IgUEtDUyM3LiBUaGUgbmV3IGZ1bmN0aW9ucyBiZWhhdmUgaW4gYQogICAgIG1hbm5lciBhbmFsb2dvdXMgdG8gdGhlIFg1MDkgZXh0ZW5zaW9uIGZ1bmN0aW9uczogdGhleSBhbGxvdwogICAgIGF0dHJpYnV0ZXMgdG8gYmUgbG9va2VkIHVwIGJ5IE5JRCBhbmQgYWRkZWQuCgogICAgIExhdGVyIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBYNTA5VjMgY29kZSB3b3VsZCBiZSBkZXNpcmFibGUgdG8KICAgICBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0aGUgZW5jb2RpbmcsIGRlY29kaW5nIGFuZCBwcmludGluZyBvZiB0aGUKICAgICBtb3JlIGNvbXBsZXggdHlwZXMuIFRoZSBzdHJpbmcgdHlwZXMgbGlrZSBjaGFsbGVuZ2VQYXNzd29yZCBjYW4KICAgICBiZSBoYW5kbGVkIGJ5IHRoZSBzdHJpbmcgdGFibGUgZnVuY3Rpb25zLgoKICAgICBBbHNvIG1vZGlmaWVkIHRoZSBtdWx0aSBieXRlIHN0cmluZyB0YWJsZSBoYW5kbGluZy4gTm93IHRoZXJlIGlzCiAgICAgYSAnZ2xvYmFsIG1hc2snIHdoaWNoIG1hc2tzIG91dCBjZXJ0YWluIHR5cGVzLiBUaGUgdGFibGUgaXRzZWxmCiAgICAgY2FuIHVzZSB0aGUgZmxhZyBTVEFCTEVfTk9fTUFTSyB0byBpZ25vcmUgdGhlIG1hc2sgc2V0dGluZzogdGhpcwogICAgIGlzIHVzZWZ1bCB3aGVuIGZvciBleGFtcGxlIHRoZXJlIGlzIG9ubHkgb25lIHBlcm1pc3NpYmxlIHR5cGUKICAgICAoYXMgaW4gY291bnRyeU5hbWUpIGFuZCB1c2luZyB0aGUgbWFzayBtaWdodCByZXN1bHQgaW4gbm8gdmFsaWQKICAgICB0eXBlcyBhdCBhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW4gdXAgJ0ZpbmlzaGVkJyBoYW5kbGluZywgYW5kIGFkZCBmdW5jdGlvbnMgU1NMX2dldF9maW5pc2hlZCBhbmQKICAgICBTU0xfZ2V0X3BlZXJfZmluaXNoZWQgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIG9idGFpbiB0aGUgbGF0ZXN0CiAgICAgRmluaXNoZWQgbWVzc2FnZXMgc2VudCB0byB0aGUgcGVlciBvciBleHBlY3RlZCBmcm9tIHRoZSBwZWVyLAogICAgIHJlc3BlY3RpdmVseS4gIChTU0xfZ2V0X3BlZXJfZmluaXNoZWQgaXMgdXN1YWxseSB0aGUgRmluaXNoZWQgbWVzc2FnZQogICAgIGFjdHVhbGx5IHJlY2VpdmVkIGZyb20gdGhlIHBlZXIsIG90aGVyd2lzZSB0aGUgcHJvdG9jb2wgd2lsbCBiZSBhYm9ydGVkLikKCiAgICAgQXMgdGhlIEZpbmlzaGVkIG1lc3NhZ2UgYXJlIG1lc3NhZ2UgZGlnZXN0cyBvZiB0aGUgY29tcGxldGUgaGFuZHNoYWtlCiAgICAgKHdpdGggYSB0b3RhbCBvZiAxOTIgYml0cyBmb3IgVExTIDEuMCBhbmQgbW9yZSBmb3IgU1NMIDMuMCksIHRoZXkgY2FuCiAgICAgYmUgdXNlZCBmb3IgZXh0ZXJuYWwgYXV0aGVudGljYXRpb24gcHJvY2VkdXJlcyB3aGVuIHRoZSBhdXRoZW50aWNhdGlvbgogICAgIHByb3ZpZGVkIGJ5IFNTTC9UTFMgaXMgbm90IGRlc2lyZWQgb3IgaXMgbm90IGVub3VnaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBFbmhhbmNlZCBzdXBwb3J0IGZvciBBbHBoYSBMaW51eCBpcyBhZGRlZC4gTm93IC4vY29uZmlnIGNoZWNrcyBpZgogICAgIHRoZSBob3N0IHN1cHBvcnRzIEJXWCBleHRlbnNpb24gYW5kIGlmIENvbXBhcSBDIGlzIHByZXNlbnQgb24gdGhlCiAgICAgJFBBVEguIEp1c3QgZXhwbG9pdGluZyBvZiB0aGUgQldYIGV4dGVuc2lvbiByZXN1bHRzIGluIDIwLTMwJQogICAgIHBlcmZvcm1hbmNlIGtpY2sgZm9yIHNvbWUgYWxnb3JpdGhtcywgZS5nLiBERVMgYW5kIFJDNCB0byBtZW50aW9uCiAgICAgYSBjb3VwbGUuIENvbXBhcSBDIGluIHR1cm4gZ2VuZXJhdGVzIH4yMCUgZmFzdGVyIGNvZGUgZm9yIE1ENSBhbmQKICAgICBTSEExLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgTVMgImZhc3QgU0dDIi4gVGhpcyBpcyBhcmd1YWJseSBhIHZpb2xhdGlvbiBvZiB0aGUKICAgICBTU0wzL1RMUyBwcm90b2NvbC4gTmV0c2NhcGUgU0dDIGRvZXMgdHdvIGhhbmRzaGFrZXM6IHRoZSBmaXJzdCB3aXRoCiAgICAgd2VhayBjcnlwdG8gYW5kIGFmdGVyIGNoZWNraW5nIHRoZSBjZXJ0aWZpY2F0ZSBpcyBTR0MgYSBzZWNvbmQgb25lCiAgICAgd2l0aCBzdHJvbmcgY3J5cHRvLiBNUyBTR0Mgc3RvcHMgdGhlIGZpcnN0IGhhbmRzaGFrZSBhZnRlciByZWNlaXZpbmcKICAgICB0aGUgc2VydmVyIGNlcnRpZmljYXRlIG1lc3NhZ2UgYW5kIHNlbmRzIGEgc2Vjb25kIGNsaWVudCBoZWxsby4gU2luY2UKICAgICBhIHNlcnZlciB3aWxsIHR5cGljYWxseSBkbyBhbGwgdGhlIHRpbWUgY29uc3VtaW5nIG9wZXJhdGlvbnMgYmVmb3JlCiAgICAgZXhwZWN0aW5nIGFueSBmdXJ0aGVyIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCAoc2VydmVyIGtleSBleGNoYW5nZQogICAgIGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSkgdGhlcmUgaXMgbGl0dGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvLgoKICAgICBUbyBnZXQgT3BlblNTTCB0byBzdXBwb3J0IE1TIFNHQyB3ZSBoYXZlIHRvIHBlcm1pdCBhIHNlY29uZCBjbGllbnQKICAgICBoZWxsbyBtZXNzYWdlIGFmdGVyIHdlIGhhdmUgc2VudCBzZXJ2ZXIgZG9uZS4gSW4gYWRkaXRpb24gd2UgaGF2ZSB0bwogICAgIHJlc2V0IHRoZSBNQUMgaWYgd2UgZG8gZ2V0IHRoaXMgc2Vjb25kIGNsaWVudCBoZWxsby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBmdW5jdGlvbiAnZDJpX0F1dG9Qcml2YXRlS2V5KCknIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGRlY2lkZQogICAgIGlmIGEgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXkgaXMgUlNBIG9yIERTQSB0cmFkaXRpb25hbCBmb3JtYXQuIENoYW5nZWQKICAgICBkMmlfUHJpdmF0ZUtleV9iaW8oKSB0byB1c2UgaXQuIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZSAidHJhZGl0aW9uYWwiCiAgICAgZm9ybWF0IERFUiBlbmNvZGVkIHByaXZhdGUga2V5LiBOZXdlciBjb2RlIHNob3VsZCB1c2UgUEtDUyM4IGZvcm1hdCB3aGljaAogICAgIGhhcyB0aGUga2V5IHR5cGUgZW5jb2RlZCBpbiB0aGUgQVNOMSBzdHJ1Y3R1cmUuIEFkZGVkIERFUiBwcml2YXRlIGtleQogICAgIHN1cHBvcnQgdG8gcGtjczggYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMIDMvVExTIDEgc2VydmVycyBub3cgZG9uJ3QgcmVxdWVzdCBjZXJ0aWZpY2F0ZXMgd2hlbiBhbiBhbm9ueW1vdXMKICAgICBjaXBoZXJzdWl0ZXMgaGFzIGJlZW4gc2VsZWN0ZWQgKGFzIHJlcXVpcmVkIGJ5IHRoZSBTU0wgMy9UTFMgMQogICAgIHNwZWNpZmljYXRpb25zKS4gIEV4Y2VwdGlvbjogV2hlbiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUCiAgICAgaXMgc2V0LCB3ZSBpbnRlcnByZXQgdGhpcyBhcyBhIHJlcXVlc3QgdG8gdmlvbGF0ZSB0aGUgc3BlY2lmaWNhdGlvbgogICAgICh0aGUgd29yc3QgdGhhdCBjYW4gaGFwcGVuIGlzIGEgaGFuZHNoYWtlIGZhaWx1cmUsIGFuZCAnY29ycmVjdCcKICAgICBiZWhhdmlvdXIgd291bGQgcmVzdWx0IGluIGEgaGFuZHNoYWtlIGZhaWx1cmUgYW55d2F5KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBTU0xfQ1RYX2FkZF9zZXNzaW9uLCB0YWtlIGludG8gYWNjb3VudCB0aGF0IHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlcyB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgKGUuZy4gd2hlbiB0d28gdGhyZWFkcwogICAgIGNvbmN1cnJlbnRseSBvYnRhaW4gdGhlbSBmcm9tIGFuIGV4dGVybmFsIGNhY2hlKS4KICAgICBUaGUgaW50ZXJuYWwgY2FjaGUgY2FuIGhhbmRsZSBvbmx5IG9uZSBTU0xfU0VTU0lPTiB3aXRoIGEgZ2l2ZW4gSUQsCiAgICAgc28gaWYgdGhlcmUncyBhIGNvbmZsaWN0LCB3ZSBub3cgdGhyb3cgb3V0IHRoZSBvbGQgb25lIHRvIGFjaGlldmUKICAgICBjb25zaXN0ZW5jeS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgT0lEcyBmb3IgaWRlYSBhbmQgYmxvd2Zpc2ggaW4gQ0JDIG1vZGUuIFRoaXMgd2lsbCBhbGxvdyBib3RoCiAgICAgdG8gYmUgdXNlZCBpbiBQS0NTIzUgdjIuMCBhbmQgUy9NSU1FLiAgQWxzbyBhZGQgY2hlY2tpbmcgdG8KICAgICBzb21lIHJvdXRpbmVzIHRoYXQgdXNlIGNpcGhlciBPSURzOiBzb21lIGNpcGhlcnMgZG8gbm90IGhhdmUgT0lEcwogICAgIGRlZmluZWQgYW5kIHNvIHRoZXkgY2Fubm90IGJlIHVzZWQgZm9yIFMvTUlNRSBhbmQgUEtDUyM1IHYyLjAgZm9yCiAgICAgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTaW1wbGlmeSB0aGUgdHJ1c3Qgc2V0dGluZyBzdHJ1Y3R1cmUgYW5kIGNvZGUuIE5vdyB3ZSBqdXN0IGhhdmUKICAgICB0d28gc2VxdWVuY2VzIG9mIE9JRHMgZm9yIHRydXN0ZWQgYW5kIHJlamVjdGVkIHNldHRpbmdzLiBUaGVzZSB3aWxsCiAgICAgdHlwaWNhbGx5IGhhdmUgdmFsdWVzIHRoZSBzYW1lIGFzIHRoZSBleHRlbmRlZCBrZXkgdXNhZ2UgZXh0ZW5zaW9uCiAgICAgYW5kIGFueSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwdXJwb3Nlcy4KCiAgICAgVGhlIHRydXN0IGNoZWNraW5nIGNvZGUgbm93IGhhcyBhIGRlZmF1bHQgYmVoYXZpb3VyOiBpdCB3aWxsIGp1c3QKICAgICBjaGVjayBmb3IgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgTklEIGFzIHRoZSBwYXNzZWQgaWQuIEZ1bmN0aW9ucyBjYW4KICAgICBiZSBwcm92aWRlZCB0byBvdmVycmlkZSBlaXRoZXIgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9yIHRoZSBiZWhhdmlvdXIKICAgICBmb3IgYSBnaXZlbiBpZC4gU1NMIGNsaWVudCwgc2VydmVyIGFuZCBlbWFpbCBhbHJlYWR5IGhhdmUgZnVuY3Rpb25zCiAgICAgaW4gcGxhY2UgZm9yIGNvbXBhdGliaWxpdHk6IHRoZXkgY2hlY2sgdGhlIE5JRCBhbmQgYWxzbyByZXR1cm4gInRydXN0ZWQiCiAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHNlbGYgc2lnbmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBkMmksaTJkIGJpby9mcCBmdW5jdGlvbnMgZm9yIFByaXZhdGVLZXk6IHRoZXNlIGNvbnZlcnQgdGhlCiAgICAgdHJhZGl0aW9uYWwgZm9ybWF0IGludG8gYW4gRVZQX1BLRVkgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHBhc3N3b3JkIGNhbGxiYWNrIGZ1bmN0aW9uIFBFTV9jYigpIHdoaWNoIGVpdGhlciBwcm9tcHRzIGZvcgogICAgIGEgcGFzc3dvcmQgaWYgdXNyX2RhdGEgaXMgTlVMTCBvciBvdGhlcndpc2UgYXNzdW1lcyBpdCBpcyBhIG51bGwKICAgICB0ZXJtaW5hdGVkIHBhc3N3b3JkLiBBbGxvdyBwYXNzd29yZHMgdG8gYmUgcGFzc2VkIG9uIGNvbW1hbmQgbGluZQogICAgIGVudmlyb25tZW50IG9yIGNvbmZpZyBmaWxlcyBpbiBhIGZldyBtb3JlIHV0aWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBERVIgYW5kIFBFTSBmdW5jdGlvbnMgdG8gaGFuZGxlIFBLQ1MjOCBmb3JtYXQgcHJpdmF0ZQogICAgIGtleXMuIEFkZCBzb21lIHNob3J0IG5hbWVzIGZvciBQS0NTIzggUEJFIGFsZ29yaXRobXMgYW5kIGFsbG93IHRoZW0KICAgICB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhlIHBrY3M4IGFuZCBwa2NzMTIgdXRpbGl0aWVzLgogICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIEFTTjEgIk5VTEwiIHR5cGUuIFRoaXMgY291bGQgYmUgaGFuZGxlZCBiZWZvcmUgYnkgdXNpbmcKICAgICBBU04xX1RZUEUgYnV0IHRoZXJlIHdhc24ndCBhbnkgZnVuY3Rpb24gdGhhdCB3b3VsZCB0cnkgdG8gcmVhZCBhIE5VTEwKICAgICBhbmQgcHJvZHVjZSBhbiBlcnJvciBpZiBpdCBjb3VsZG4ndC4gRm9yIGNvbXBhdGliaWxpdHkgd2UgYWxzbyBoYXZlCiAgICAgQVNOMV9OVUxMX25ldygpIGFuZCBBU04xX05VTExfZnJlZSgpIGZ1bmN0aW9ucyBidXQgdGhlc2UgYXJlIGZha2VkIGFuZAogICAgIGRvbid0IGFsbG9jYXRlIGFueXRoaW5nIGJlY2F1c2UgdGhleSBkb24ndCBuZWVkIHRvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgTWFjT1MgaXMgbm93IHByb3ZpZGVkLiBFeGFtaW5lIElOU1RBTEwuTWFjT1MKICAgICBmb3IgZGV0YWlscy4KICAgICBbQW5keSBQb2x5YWtvdiwgUm95IFdvb2RzIDxyb3lAY2VudGljc3lzdGVtcy5jYT5dCgogICopIFJlYnVpbGQgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHVzZWQgYnkgT3BlblNTTCBjb2RlIGFuZAogICAgIHBvc3NpYmx5IG90aGVycyBhcyB3ZWxsLiAgVGhlIHB1cnBvc2UgaXMgdG8gbWFrZSBhbiBpbnRlcmZhY2UgdGhhdAogICAgIHByb3ZpZGUgaG9va3Mgc28gYW55b25lIGNhbiBidWlsZCBhIHNlcGFyYXRlIHNldCBvZiBhbGxvY2F0aW9uIGFuZAogICAgIGRlYWxsb2NhdGlvbiByb3V0aW5lcyB0byBiZSB1c2VkIGJ5IE9wZW5TU0wsIGZvciBleGFtcGxlIG1lbW9yeQogICAgIHBvb2wgaW1wbGVtZW50YXRpb25zLCBvciBzb21ldGhpbmcgZWxzZSwgd2hpY2ggd2FzIHByZXZpb3VzbHkgaGFyZAogICAgIHNpbmNlIE1hbGxvYygpLCBSZWFsbG9jKCkgYW5kIEZyZWUoKSB3ZXJlIGRlZmluZWQgYXMgbWFjcm9zIGhhdmluZwogICAgIHRoZSB2YWx1ZXMgbWFsbG9jLCByZWFsbG9jIGFuZCBmcmVlLCByZXNwZWN0aXZlbHkgKGV4Y2VwdCBmb3IgV2luMzIKICAgICBjb21waWxhdGlvbnMpLiAgVGhlIHNhbWUgaXMgcHJvdmlkZWQgZm9yIG1lbW9yeSBkZWJ1Z2dpbmcgY29kZS4KICAgICBPcGVuU1NMIGFscmVhZHkgY29tZXMgd2l0aCBmdW5jdGlvbmFsaXR5IHRvIGZpbmQgbWVtb3J5IGxlYWtzLCBidXQKICAgICB0aGlzIGdpdmVzIHBlb3BsZSBhIGNoYW5jZSB0byBkZWJ1ZyBvdGhlciBtZW1vcnkgcHJvYmxlbXMuCgogICAgIFdpdGggdGhlc2UgY2hhbmdlcywgYSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGhhdmUgYXBwZWFyZWQ6CgogICAgICAgQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkJCVtGXQogICAgICAgQ1JZUFRPX2dldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkJCVtGXQogICAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucygpCQkJW0ZdCiAgICAgICBDUllQVE9fZGJnX2dldF9vcHRpb25zKCkJCQlbRl0KICAgICAgIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpCQlbTV0KCiAgICAgVGhlIG1lbW9yeSBkZWJ1ZyBmdW5jdGlvbnMgYXJlIE5VTEwgYnkgZGVmYXVsdCwgdW5sZXNzIHRoZSBsaWJyYXJ5CiAgICAgaXMgY29tcGlsZWQgd2l0aCBDUllQVE9fTURFQlVHIG9yIGZyaWVuZHMgaXMgZGVmaW5lZC4gIElmIHNvbWVvbmUKICAgICB3YW50cyB0byBkZWJ1ZyBtZW1vcnkgYW55d2F5LCBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKSAod2hpY2gKICAgICBnaXZlcyB0aGUgc3RhbmRhcmQgZGVidWdnaW5nIGZ1bmN0aW9ucyB0aGF0IGNvbWUgd2l0aCBPcGVuU1NMKSBvcgogICAgIENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpICh0ZWxscyBPcGVuU1NMIHRvIHVzZSBmdW5jdGlvbnMKICAgICBwcm92aWRlZCBieSB0aGUgbGlicmFyeSB1c2VyKSBtdXN0IGJlIHVzZWQuICBXaGVuIHRoZSBzdGFuZGFyZAogICAgIGRlYnVnZ2luZyBmdW5jdGlvbnMgYXJlIHVzZWQsIENSWVBUT19kYmdfc2V0X29wdGlvbnMgY2FuIGJlIHVzZWQgdG8KICAgICByZXF1ZXN0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb246CiAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyhWX0NZUlBUT19NREVCVUdfeHh4KSBjb3JyZXNwb25kcyB0byBzZXR0aW5nCiAgICAgdGhlIENSWVBUT19NREVCVUdfeHh4IG1hY3JvIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5LiAgIAoKICAgICBBbHNvLCB0aGluZ3MgbGlrZSBDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMgd2lsbCBhbHdheXMgZ2l2ZSB0aGUKICAgICBleHBlY3RlZCByZXN1bHQgKHRoZSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBhbGxvY2F0aW9uCiAgICAgYW5kIGRlYWxsb2NhdGlvbikgYXQgYWxsIHRpbWVzLCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtIGFuZCBjb21waWxlcgogICAgIG9wdGlvbnMuCgogICAgIFRvIGZpbmlzaCBpdCB1cCwgc29tZSBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHVzZSBpbiBhbnkgb3RoZXIKICAgICB3YXkgdGhhbiB0aHJvdWdoIG1hY3JvcyBoYXZlIGEgbmV3IEFQSSBhbmQgbmV3IHNlbWFudGljOgoKICAgICAgIENSWVBUT19kYmdfbWFsbG9jKCkKICAgICAgIENSWVBUT19kYmdfcmVhbGxvYygpCiAgICAgICBDUllQVE9fZGJnX2ZyZWUoKQoKICAgICBBbGwgbWFjcm9zIG9mIHZhbHVlIGhhdmUgcmV0YWluZWQgdGhlaXIgb2xkIHN5bnRheC4KICAgICBbUmljaGFyZCBMZXZpdHRlIGFuZCBCb2RvIE1vZWxsZXJdCgogICopIFNvbWUgUy9NSU1FIGZpeGVzLiBUaGUgT0lEIGZvciBTTUlNRUNhcGFiaWxpdGllcyB3YXMgd3JvbmcsIHRoZQogICAgIG9yZGVyaW5nIG9mIFNNSU1FQ2FwYWJpbGl0aWVzIHdhc24ndCBpbiAic3RyZW5ndGggb3JkZXIiIGFuZCB0aGVyZQogICAgIHdhcyBhIG1pc3NpbmcgTlVMTCBpbiB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBmb3IgdGhlIFNIQTEgc2lnbmF0dXJlCiAgICAgYWxnb3JpdGhtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNvbWUgQVNOMSB0eXBlcyB3aXRoIGlsbGVnYWwgemVybyBsZW5ndGggZW5jb2RpbmcgKElOVEVHRVIsCiAgICAgRU5VTUVSQVRFRCBhbmQgT0JKRUNUIElERU5USUZJRVIpIGNob2tlZCB0aGUgQVNOMSByb3V0aW5lcy4KICAgICBbRnJhbnMgSGV5bWFucyA8ZmhleW1hbnNAaXNhc2VydmVyLmJlPiwgbW9kaWZpZWQgYnkgU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZSBpbiBteSBTL01JTUUgbGlicmFyeSBmb3IgT3BlblNTTC4gVGhpcyBwcm92aWRlcyBhIHNpbXBsZQogICAgIFMvTUlNRSBBUEkgb24gdG9wIG9mIHRoZSBQS0NTIzcgY29kZSwgYSBNSU1FIHBhcnNlciAod2l0aCBlbm91Z2gKICAgICBmdW5jdGlvbmFsaXR5IHRvIGhhbmRsZSBtdWx0aXBhcnQvc2lnbmVkIHByb3Blcmx5KSBhbmQgYSB1dGlsaXR5CiAgICAgY2FsbGVkICdzbWltZScgdG8gY2FsbCBhbGwgdGhpcyBzdHVmZi4gVGhpcyBpcyBiYXNlZCBvbiBjb2RlIEkKICAgICBvcmlnaW5hbGx5IHdyb3RlIGZvciBDZWxvIHdobyBoYXZlIGtpbmRseSBhbGxvd2VkIGl0IHRvIGJlCiAgICAgaW5jbHVkZWQgaW4gT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdmFyaWFudHMgZGVzX3NldF9rZXlfY2hlY2tlZCBhbmQgZGVzX3NldF9rZXlfdW5jaGVja2VkIG9mCiAgICAgZGVzX3NldF9rZXkgKGFrYSBkZXNfa2V5X3NjaGVkKS4gIEdsb2JhbCB2YXJpYWJsZSBkZXNfY2hlY2tfa2V5CiAgICAgZGVjaWRlcyB3aGljaCBvZiB0aGVzZSBpcyBjYWxsZWQgYnkgZGVzX3NldF9rZXk7IHRoaXMgd2F5CiAgICAgZGVzX2NoZWNrX2tleSBiZWhhdmVzIGFzIGl0IGFsd2F5cyBkaWQsIGJ1dCBhcHBsaWNhdGlvbnMgYW5kCiAgICAgdGhlIGxpYnJhcnkgaXRzZWxmLCB3aGljaCB3YXMgYnVnZ3kgZm9yIGRlc19jaGVja19rZXkgPT0gMSwKICAgICBoYXZlIGEgY2xlYW5lciB3YXkgdG8gcGljayB0aGUgdmVyc2lvbiB0aGV5IG5lZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFBLQ1MxMl9uZXdwYXNzKCkgd2hpY2ggY2hhbmdlcyB0aGUgcGFzc3dvcmQgb2YgYQogICAgIFBLQ1MxMiBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFg1MDlfVFJVU1QgYW5kIFg1MDlfUFVSUE9TRSBzbyBpdCBhbHNvIHVzZXMgYSBzdGF0aWMgYW5kCiAgICAgZHluYW1pYyBtaXguIEluIGJvdGggY2FzZXMgdGhlIGlkcyBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleCBpbnRvIHRoZQogICAgIHRhYmxlLiBBbHNvIG1vZGlmaWVkIHRoZSBYNTA5X1RSVVNUX2FkZCgpIGFuZCBYNTA5X1BVUlBPU0VfYWRkKCkKICAgICBmdW5jdGlvbnMgc28gdGhleSBhY2NlcHQgYSBsaXN0IG9mIHRoZSBmaWVsZCB2YWx1ZXMgYW5kIHRoZQogICAgIGFwcGxpY2F0aW9uIGRvZXNuJ3QgbmVlZCB0byBkaXJlY3RseSBtYW5pcHVsYXRlIHRoZSBYNTA5X1RSVVNUCiAgICAgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgQVNOMV9TVFJJTkdfVEFCTEUgc3R1ZmYgc28gaXQgYWxzbyB1c2VzIGJzZWFyY2ggYW5kIGRvZXNuJ3QKICAgICBuZWVkIGluaXRpYWxpc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIHdheSB0aGUgVjMgZXh0ZW5zaW9uIGNvZGUgbG9va3MgdXAgZXh0ZW5zaW9ucy4gVGhpcyBub3cKICAgICB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSBvYmplY3QgY29kZTogd2UgaGF2ZSBzb21lICJzdGFuZGFyZCIKICAgICBleHRlbnNpb25zIGluIGEgc3RhdGljIHRhYmxlIHdoaWNoIGlzIHNlYXJjaGVkIHdpdGggT0JKX2JzZWFyY2goKQogICAgIGFuZCB0aGUgYXBwbGljYXRpb24gY2FuIGFkZCBkeW5hbWljIG9uZXMgaWYgbmVlZGVkLiBUaGUgZmlsZQogICAgIGNyeXB0by94NTA5djMvZXh0X2RhdC5oIG5vdyBoYXMgdGhlIGluZm86IHRoaXMgZmlsZSBuZWVkcyB0byBiZQogICAgIHVwZGF0ZWQgd2hlbmV2ZXIgYSBuZXcgZXh0ZW5zaW9uIGlzIGFkZGVkIHRvIHRoZSBjb3JlIGNvZGUgYW5kIGtlcHQKICAgICBpbiBleHRfbmlkIG9yZGVyLiBUaGVyZSBpcyBhIHNpbXBsZSBwcm9ncmFtICd0YWJ0ZXN0LmMnIHdoaWNoIGNoZWNrcwogICAgIHRoaXMuIE5ldyBleHRlbnNpb25zIGFyZSBub3QgYWRkZWQgdG9vIG9mdGVuIHNvIHRoaXMgZmlsZSBjYW4gcmVhZGlseQogICAgIGJlIG1haW50YWluZWQgbWFudWFsbHkuCgogICAgIFRoZXJlIGFyZSB0d28gYmlnIGFkdmFudGFnZXMgaW4gZG9pbmcgdGhpbmdzIHRoaXMgd2F5LiBUaGUgZXh0ZW5zaW9ucwogICAgIGNhbiBiZSBsb29rZWQgdXAgaW1tZWRpYXRlbHkgYW5kIG5vIGxvbmdlciBuZWVkIHRvIGJlICJhZGRlZCIgdXNpbmcKICAgICBYNTA5VjNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMoKTogdGhpcyBmdW5jdGlvbiBub3cgZG9lcyBub3RoaW5nLgogICAgIFtTaWRlIG5vdGU6IEkgZ2V0ICpsb3RzKiBvZiBlbWFpbCBzYXlpbmcgdGhlIGV4dGVuc2lvbiBjb2RlIGRvZXNuJ3QKICAgICAgd29yayBiZWNhdXNlIHBlb3BsZSBmb3JnZXQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXQogICAgIEFsc28gbm8gZHluYW1pYyBhbGxvY2F0aW9uIGlzIGRvbmUgdW5sZXNzIG5ldyBleHRlbnNpb25zIGFyZSBhZGRlZDoKICAgICBzbyBpZiB3ZSBkb24ndCBhZGQgY3VzdG9tIGV4dGVuc2lvbnMgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsCiAgICAgWDUwOVYzX0VYVF9jbGVhbnVwKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGVuYyB1dGlsaXR5J3Mgc2FsdGluZyBhcyBmb2xsb3dzOiBtYWtlIHNhbHRpbmcgdGhlIGRlZmF1bHQuIEFkZCBhCiAgICAgbWFnaWMgaGVhZGVyLCBzbyB1bnNhbHRlZCBmaWxlcyBmYWlsIGdyYWNlZnVsbHkgaW5zdGVhZCBvZiBqdXN0IGRlY3J5cHRpbmcKICAgICB0byBnYXJiYWdlLiBUaGlzIGlzIGJlY2F1c2Ugbm90IHNhbHRpbmcgaXMgYSBiaWcgc2VjdXJpdHkgaG9sZSwgc28gcGVvcGxlCiAgICAgc2hvdWxkIGJlIGRpc2NvdXJhZ2VkIGZyb20gZG9pbmcgaXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlICd4NTA5JyB1dGlsaXR5LiBJdCBhbGxvd2VkIGEgbWVzc2FnZQogICAgIGRpZ2VzdCB0byBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBidXQgaXQgb25seSB1c2VkIHRoaXMKICAgICBwYXJhbWV0ZXIgd2hlbiBzaWduaW5nIGEgY2VydGlmaWNhdGUuIE1vZGlmaWVkIHNvIGFsbCByZWxldmFudAogICAgIG9wZXJhdGlvbnMgYXJlIGFmZmVjdGVkIGJ5IHRoZSBkaWdlc3QgcGFyYW1ldGVyIGluY2x1ZGluZyB0aGUKICAgICAtZmluZ2VycHJpbnQgYW5kIC14NTA5dG9yZXEgb3B0aW9ucy4gQWxzbyAteDUwOXRvcmVxIGNob2tlZCBpZiBhCiAgICAgRFNBIGtleSB3YXMgdXNlZCBiZWNhdXNlIGl0IGRpZG4ndCBmaXggdGhlIGRpZ2VzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmeSBjb2RlLiBDdXJyZW50bHkgdGVzdHMgdGhlIHVudHJ1c3RlZAogICAgIGNlcnRpZmljYXRlcyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2UgKHdoaWNoIGlzIHNldAogICAgIHdoZW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZSBpcyBzZXQgdXApIGFuZCBjaGVja3MgdGhlIHBhdGhsZW5ndGguCgogICAgIFRoZXJlIGlzIGEgTk9fQ0hBSU5fVkVSSUZZIGNvbXBpbGF0aW9uIG9wdGlvbiB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyOgogICAgIHRoaXMgaXMgYmVjYXVzZSBpdCB3aWxsIHJlamVjdCBjaGFpbnMgd2l0aCBpbnZhbGlkIGV4dGVuc2lvbnMgd2hlcmVhcwogICAgIGV2ZXJ5IHByZXZpb3VzIHZlcnNpb24gb2YgT3BlblNTTCBhbmQgU1NMZWF5IG1hZGUgbm8gY2hlY2tzIGF0IGFsbC4KCiAgICAgVHJ1c3QgY29kZTogY2hlY2tzIHRoZSByb290IENBIGZvciB0aGUgcmVsZXZhbnQgdHJ1c3Qgc2V0dGluZ3MuIFRydXN0CiAgICAgc2V0dGluZ3MgaGF2ZSBhbiBpbml0aWFsIHZhbHVlIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2U6IGUuZy4KICAgICBpZiB0aGUgdmVyaWZ5IHB1cnBvc2UgaXMgZm9yIFNTTCBjbGllbnQgdXNlIGl0IGV4cGVjdHMgdGhlIENBIHRvIGJlCiAgICAgdHJ1c3RlZCBmb3IgU1NMIGNsaWVudCB1c2UuIEhvd2V2ZXIgdGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgdG8KICAgICBwZXJtaXQgY3VzdG9tIHRydXN0IHNldHRpbmdzOiBvbmUgZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIHRvIG9ubHkgdHJ1c3QKICAgICBjZXJ0aWZpY2F0ZXMgZnJvbSBhIHNwZWNpZmljICJzZWN1cmUiIHNldCBvZiBDQXMuCgogICAgIEFsc28gYWRkZWQgWDUwOV9TVE9SRV9DVFhfbmV3KCkgYW5kIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoKSBmdW5jdGlvbnMKICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IgdmVyc2lvbiBwb3J0YWJpbGl0eTogZXNwZWNpYWxseSBzaW5jZSB0aGUKICAgICB2ZXJpZnkgc3RydWN0dXJlIGlzIGxpa2VseSB0byBjaGFuZ2UgbW9yZSBvZnRlbiBub3cuCgogICAgIFNTTCBpbnRlZ3JhdGlvbi4gQWRkIHB1cnBvc2UgYW5kIHRydXN0IHRvIFNTTF9DVFggYW5kIFNTTCBhbmQgZnVuY3Rpb25zCiAgICAgdG8gc2V0IHRoZW0uIElmIG5vdCBzZXQgdGhlbiBhc3N1bWUgU1NMIGNsaWVudHMgd2lsbCB2ZXJpZnkgU1NMIHNlcnZlcnMKICAgICBhbmQgdmljZSB2ZXJzYS4KCiAgICAgVHdvIG5ldyBvcHRpb25zIHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbTogLXVudHJ1c3RlZCBhbGxvd3MgYSBzZXQgb2YKICAgICB1bnRydXN0ZWQgY2VydGlmaWNhdGVzIHRvIGJlIHBhc3NlZCBpbiBhbmQgLXB1cnBvc2Ugd2hpY2ggc2V0cyB0aGUKICAgICBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSBjZXJ0aWZpY2F0ZS4gSWYgYSBwdXJwb3NlIGlzIHNldCB0aGVuIHRoZQogICAgIG5ldyBjaGFpbiB2ZXJpZnkgY29kZSBpcyB1c2VkIHRvIGNoZWNrIGV4dGVuc2lvbiBjb25zaXN0ZW5jeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgYXV0aG9yaXR5IGluZm9ybWF0aW9uIGFjY2VzcyBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFJTQSBhbmQgRFNBIFBFTSByZWFkIHJvdXRpbmVzIHRvIHRyYW5zcGFyZW50bHkgaGFuZGxlCiAgICAgUEtDUyM4IGZvcm1hdCBwcml2YXRlIGtleXMuIE5ldyAqX1BVQktFWV8qIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZQogICAgIHB1YmxpYyBrZXlzIGluIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBjZXJ0aWZpY2F0ZQogICAgIFN1YmplY3RQdWJsaWNLZXlJbmZvIHN0cnVjdHVyZXMuIFVuZm9ydHVuYXRlbHkgdGhlcmUgd2VyZSBhbHJlYWR5CiAgICAgZnVuY3Rpb25zIGNhbGxlZCAqX1B1YmxpY0tleV8qIHdoaWNoIHVzZWQgdmFyaW91cyBvZGQgZm9ybWF0cyBzbwogICAgIHRoZXNlIGFyZSByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eTogaG93ZXZlciB0aGUgRFNBIHZhcmlhbnRzIHdlcmUKICAgICBuZXZlciBpbiBhIHB1YmxpYyByZWxlYXNlIHNvIHRoZXkgaGF2ZSBiZWVuIGRlbGV0ZWQuIENoYW5nZWQgZHNhL3JzYQogICAgIHV0aWxpdGllcyB0byBoYW5kbGUgdGhlIG5ldyBmb3JtYXQ6IG5vdGUgbm8gcmVsZWFzZXMgZXZlciBoYW5kbGVkIHB1YmxpYwogICAgIGtleXMgc28gd2Ugc2hvdWxkIGJlIE9LLgoKICAgICBUaGUgcHJpbWFyeSBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBhdm9pZCB0aGUgc2FtZSBmaWFzY28KICAgICB0aGF0IGRvZ3MgcHJpdmF0ZSBrZXlzOiB0aGVyZSBhcmUgc2V2ZXJhbCBpbmNvbXBhdGlibGUgcHJpdmF0ZSBrZXkKICAgICBmb3JtYXRzIHNvbWUgb2Ygd2hpY2ggYXJlIHN0YW5kYXJkIGFuZCBzb21lIE9wZW5TU0wgc3BlY2lmaWMgYW5kCiAgICAgcmVxdWlyZSB2YXJpb3VzIGV2aWwgaGFja3MgdG8gYWxsb3cgcGFydGlhbCB0cmFuc3BhcmVudCBoYW5kbGluZyBhbmQKICAgICBldmVuIHRoZW4gaXQgZG9lc24ndCB3b3JrIHdpdGggREVSIGZvcm1hdHMuIEdpdmVuIHRoZSBvcHRpb24gYW55dGhpbmcKICAgICBvdGhlciB0aGFuIFBLQ1MjOCBzaG91bGQgYmUgZHVtcGVkOiBidXQgdGhlIG90aGVyIGZvcm1hdHMgaGF2ZSB0bwogICAgIHN0YXkgaW4gdGhlIG5hbWUgb2YgY29tcGF0aWJpbGl0eS4KCiAgICAgV2l0aCBwdWJsaWMga2V5cyBhbmQgdGhlIGJlbmVmaXQgb2YgaGluZHNpZ2h0IG9uZSBzdGFuZGFyZCBmb3JtYXQgCiAgICAgaXMgdXNlZCB3aGljaCB3b3JrcyB3aXRoIEVWUF9QS0VZLCBSU0Egb3IgRFNBIHN0cnVjdHVyZXM6IHRob3VnaAogICAgIGl0IGNsZWFybHkgcmV0dXJucyBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgdGhlIHdyb25nIGtpbmQgb2Yga2V5LgoKICAgICBBZGRlZCBhIC1wdWJrZXkgb3B0aW9uIHRvIHRoZSAneDUwOScgdXRpbGl0eSB0byBvdXRwdXQgdGhlIHB1YmxpYyBrZXkuCiAgICAgQWxzbyByZW5hbWUgdGhlIEVWUF9QS0VZX2dldF8qKCkgdG8gRVZQX1BLRVlfcmdldF8qKCkKICAgICAocmVuYW1lZCB0byBFVlBfUEtFWV9nZXQxXyooKSBpbiB0aGUgT3BlblNTTCAwLjkuNSByZWxlYXNlKSBhbmQgYWRkCiAgICAgRVZQX1BLRVlfcnNldF8qKCkgZnVuY3Rpb25zIChyZW5hbWVkIHRvIEVWUF9QS0VZX3NldDFfKigpKQogICAgIHRoYXQgZG8gdGhlIHNhbWUgYXMgdGhlIEVWUF9QS0VZX2Fzc2lnbl8qKCkgZXhjZXB0IHRoZXkgdXAgdGhlCiAgICAgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBhZGRlZCBrZXkgKHRoZXkgZG9uJ3QgInN3YWxsb3ciIHRoZQogICAgIHN1cHBsaWVkIGtleSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gY3J5cHRvL3g1MDkvYnlfZmlsZS5jIHRoZSBjb2RlIHRvIHJlYWQgaW4gY2VydGlmaWNhdGVzIGFuZAogICAgIENSTHMgd291bGQgZmFpbCBpZiB0aGUgZmlsZSBjb250YWluZWQgbm8gY2VydGlmaWNhdGVzIG9yIG5vIENSTHM6CiAgICAgYWRkZWQgYSBuZXcgZnVuY3Rpb24gdG8gcmVhZCBpbiBib3RoIHR5cGVzIGFuZCByZXR1cm4gdGhlIG51bWJlcgogICAgIHJlYWQ6IHRoaXMgbWVhbnMgdGhhdCBpZiBub25lIGFyZSByZWFkIGl0IHdpbGwgYmUgYW4gZXJyb3IuIFRoZQogICAgIERFUiB2ZXJzaW9ucyBvZiB0aGUgY2VydGlmaWNhdGUgYW5kIENSTCByZWFkZXIgd291bGQgYWx3YXlzIGZhaWwKICAgICBiZWNhdXNlIGl0IGlzbid0IHBvc3NpYmxlIHRvIG1peCBjZXJ0aWZpY2F0ZXMgYW5kIENSTHMgaW4gREVSIGZvcm1hdAogICAgIHdpdGhvdXQgY2hva2luZyBvbmUgb3IgdGhlIG90aGVyIHJvdXRpbmUuIENoYW5nZWQgdGhpcyB0byBqdXN0IHJlYWQKICAgICBhIGNlcnRpZmljYXRlOiB0aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4gQWxzbyBtb2RpZmllZCB0aGUgY29kZQogICAgIGluIGFwcHMvdmVyaWZ5LmMgdG8gdGFrZSBub3RpY2Ugb2YgcmV0dXJuIGNvZGVzOiBpdCB3YXMgcHJldmlvdXNseQogICAgIGF0dGVtcHRpbmcgdG8gcmVhZCBpbiBjZXJ0aWZpY2F0ZXMgZnJvbSBOVUxMIHBvaW50ZXJzIGFuZCBpZ25vcmluZwogICAgIGFueSBlcnJvcnM6IHRoaXMgaXMgb25lIHJlYXNvbiB3aHkgdGhlIGNlcnQgYW5kIENSTCByZWFkZXIgc2VlbWVkCiAgICAgdG8gd29yay4gSXQgZG9lc24ndCBjaGVjayByZXR1cm4gY29kZXMgZnJvbSB0aGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZQogICAgIHJvdXRpbmVzOiB0aGVzZSBtYXkgd2VsbCBmYWlsIGlmIHRoZSBjZXJ0aWZpY2F0ZXMgYXJlbid0IGluc3RhbGxlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb2RlIHRvIHN1cHBvcnQgb3RoZXJOYW1lIG9wdGlvbiBpbiBHZW5lcmFsTmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXJzdCB1cGRhdGUgdG8gdmVyaWZ5IGNvZGUuIENoYW5nZSB0aGUgdmVyaWZ5IHV0aWxpdHkKICAgICBzbyBpdCB3YXJucyBpZiBpdCBpcyBwYXNzZWQgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZToKICAgICBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgbm9ybWFsIGJlaGF2aW91ci4gWDUwOV92ZXJpZnkKICAgICBoYXMgYmVlbiBtb2RpZmllZCB0byBpdCB3aWxsIG5vdyB2ZXJpZnkgYSBzZWxmIHNpZ25lZAogICAgIGNlcnRpZmljYXRlIGlmICpleGFjdGx5KiB0aGUgc2FtZSBjZXJ0aWZpY2F0ZSBhcHBlYXJzCiAgICAgaW4gdGhlIHN0b3JlOiBpdCB3YXMgcHJldmlvdXNseSBpbXBvc3NpYmxlIHRvIHRydXN0IGEKICAgICBzaW5nbGUgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUuIFRoaXMgbWVhbnMgdGhhdDoKICAgICBvcGVuc3NsIHZlcmlmeSBzcy5wZW0KICAgICBub3cgZ2l2ZXMgYSB3YXJuaW5nIGFib3V0IGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgYnV0CiAgICAgb3BlbnNzbCB2ZXJpZnkgLUNBZmlsZSBzcy5wZW0gc3MucGVtCiAgICAgaXMgT0suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIHNlcnZlcnMsIHN0b3JlIHZlcmlmeV9yZXN1bHQgaW4gU1NMX1NFU1NJT04gZGF0YSBzdHJ1Y3R1cmUKICAgICAoYW5kIGFkZCBpdCB0byBleHRlcm5hbCBzZXNzaW9uIHJlcHJlc2VudGF0aW9uKS4KICAgICBUaGlzIGlzIG5lZWRlZCB3aGVuIGNsaWVudCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb25zIGZhaWxzLAogICAgIGJ1dCBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCB2ZXJpZmljYXRpb24gY2FsbGJhY2sgKHNldCBieQogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKSBhbGxvd3MgYWNjZXB0aW5nIHRoZSBzZXNzaW9uCiAgICAgYW55d2F5IChpLmUuIGxlYXZlcyB4NTA5X3N0b3JlX2N0eC0+ZXJyb3IgIT0gWDUwOV9WX09LCiAgICAgYnV0IHJldHVybnMgMSk6IFdoZW4gdGhlIHNlc3Npb24gaXMgcmV1c2VkLCB3ZSBoYXZlIHRvIHNldAogICAgIHNzbC0+dmVyaWZ5X3Jlc3VsdCB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSB0byBhdm9pZAogICAgIHNlY3VyaXR5IGhvbGVzLgogICAgIFtCb2RvIE1vZWxsZXIsIHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGEgYnVnIGluIHRoZSBuZXcgUEtDUyM3IGNvZGU6IGl0IGRpZG4ndCBjb25zaWRlciB0aGUKICAgICBjYXNlIGluIFBLQ1M3X2RhdGFJbml0KCkgd2hlcmUgdGhlIHNpZ25lZCBQS0NTNyBzdHJ1Y3R1cmUKICAgICBkaWRuJ3QgY29udGFpbiBhbnkgZXhpc3RpbmcgZGF0YSBiZWNhdXNlIGl0IHdhcyBiZWluZyBjcmVhdGVkLgogICAgIFtQby1DaGVuZyBDaGVuIDxwb2NoZW5nQG5zdC5jb20udHc+LCBzbGlnaHRseSBtb2RpZmllZCBieSBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHNhbHQgdG8gdGhlIGtleSBkZXJpdmF0aW9uIHJvdXRpbmVzIGluIGVuYy5jLiBUaGlzCiAgICAgZm9ybXMgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBmaWxlLiBBbHNvIGFkZCBhCiAgICAgLVMgb3B0aW9uIHRvIGFsbG93IGEgc2FsdCB0byBiZSBpbnB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X2NtcCgpLiBPZGRseSBlbm91Z2ggdGhlcmUgd2Fzbid0IGEgZnVuY3Rpb24KICAgICB0byBjb21wYXJlIHR3byBjZXJ0aWZpY2F0ZXMuIFdlIGRvIHRoaXMgYnkgd29ya2luZyBvdXQgdGhlIFNIQTEKICAgICBoYXNoIGFuZCBjb21wYXJpbmcgdGhhdC4gWDUwOV9jbXAoKSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgdHJ1c3QKICAgICBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTF9nZXQxX3Nlc3Npb24oKSBpcyBsaWtlIFNTTF9nZXRfc2Vzc2lvbigpLCBidXQgaW5jcmVtZW50cwogICAgIHRoZSByZWZlcmVuY2UgY291bnQgaW4gdGhlIFNTTF9TRVNTSU9OIHJldHVybmVkLgogICAgIFtHZW9mZiBUaG9ycGUgPGdlb2ZmQGV1LmMyLm5ldD5dCgogICopIEZpeCBmb3IgJ3JlcSc6IGl0IHdhcyBhZGRpbmcgYSBudWxsIHRvIHJlcXVlc3QgYXR0cmlidXRlcy4KICAgICBBbHNvIGNoYW5nZSB0aGUgWDUwOV9MT09LVVAgYW5kIFg1MDlfSU5GTyBjb2RlIHRvIGhhbmRsZQogICAgIGNlcnRpZmljYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgNDAgYW5kIDY0IGJpdCBSQzIgYW5kIFJDNCBhbGdvcml0aG1zOiBkb2N1bWVudAogICAgIHRoZSAnZW5jJyBjb21tYW5kLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBtZW1vcnkgbGVhawogICAgIGRldGVjdGluZyBvdXRwdXQsIHRvIGZvcm0gdHJhY2ViYWNrcywgc2hvd2luZyBmcm9tIHdoZXJlIGVhY2gKICAgICBhbGxvY2F0aW9uIHdhcyBvcmlnaW5hdGVkOiBDUllQVE9fcHVzaF9pbmZvKCJjb25zdGFudCBzdHJpbmciKSBhZGRzCiAgICAgdGhlIHN0cmluZyBwbHVzIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB0byBhIHBlci10aHJlYWQKICAgICBzdGFjaywgQ1JZUFRPX3BvcF9pbmZvKCkgZG9lcyB0aGUgb2J2aW91cywgQ1JZUFRPX3JlbW92ZV9hbGxfaW5mbygpCiAgICAgaXMgbGlrZSBjYWxsaW5nIENZUlBUT19wb3BfaW5mbygpIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eS4KICAgICBBbHNvIHVwZGF0ZWQgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGNvZGUgdG8gYmUgbXVsdGktdGhyZWFkLXNhZmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIG9wdGlvbnMgLXRleHQgYW5kIC1ub291dCB0byBwa2NzNyB1dGlsaXR5IGFuZCBkZWxldGUgdGhlCiAgICAgZW5jcnlwdGlvbiBvcHRpb25zIHdoaWNoIG5ldmVyIGRpZCBhbnl0aGluZy4gVXBkYXRlIGRvY3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbnMgdG8gc29tZSBvZiB0aGUgdXRpbGl0aWVzIHRvIGFsbG93IHRoZSBwYXNzIHBocmFzZQogICAgIHRvIGJlIGluY2x1ZGVkIG9uIGVpdGhlciB0aGUgY29tbWFuZCBsaW5lIChub3QgcmVjb21tZW5kZWQgb24KICAgICBPU2VzIGxpa2UgVW5peCkgb3IgcmVhZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4gVXBkYXRlIHRoZQogICAgIG1hbnBhZ2VzIGFuZCBmaXggYSBmZXcgYnVncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBmZXcgbWFucGFnZXMgZm9yIHNvbWUgb2YgdGhlIG9wZW5zc2wgY29tbWFuZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSAtcmV2b2tlIG9wdGlvbiBpbiBjYS4gSXQgd2FzIGZyZWVpbmcgdXAgbWVtb3J5IHR3aWNlLAogICAgIGxlYWtpbmcgYW5kIG5vdCBmaW5kaW5nIGFscmVhZHkgcmV2b2tlZCBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIGNoYW5nZXMgdG8gc3VwcG9ydCBjZXJ0aWZpY2F0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uCiAgICAgVGhpcyBpbnZvbHZlcyB0aGUgdXNlIG9mIFg1MDlfQ0VSVF9BVVggc3RydWN0dXJlIGFuZCBYNTA5X0FVWAogICAgIGZ1bmN0aW9ucy4gQW4gWDUwOV9BVVggZnVuY3Rpb24gc3VjaCBhcyBQRU1fcmVhZF9YNTA5X0FVWCgpCiAgICAgY2FuIHN0aWxsIHJlYWQgaW4gYSBjZXJ0aWZpY2F0ZSBmaWxlIGluIHRoZSB1c3VhbCB3YXkgYnV0IGl0CiAgICAgd2lsbCBhbHNvIHJlYWQgaW4gYW55IGFkZGl0aW9uYWwgImF1eGlsaWFyeSBpbmZvcm1hdGlvbiIuIEJ5CiAgICAgZG9pbmcgdGhpbmdzIHRoaXMgd2F5IGEgZmFpciBkZWdyZWUgb2YgY29tcGF0aWJpbGl0eSBjYW4gYmUKICAgICByZXRhaW5lZDogZXhpc3RpbmcgY2VydGlmaWNhdGVzIGNhbiBoYXZlIHRoaXMgaW5mb3JtYXRpb24gYWRkZWQKICAgICB1c2luZyB0aGUgbmV3ICd4NTA5JyBvcHRpb25zLiAKCiAgICAgQ3VycmVudCBhdXhpbGlhcnkgaW5mb3JtYXRpb24gaW5jbHVkZXMgYW4gImFsaWFzIiBhbmQgc29tZSB0cnVzdAogICAgIHNldHRpbmdzLiBUaGUgdHJ1c3Qgc2V0dGluZ3Mgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgaW4gZW5oYW5jZWQKICAgICBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gcm91dGluZXM6IGN1cnJlbnRseSBhIGNlcnRpZmljYXRlCiAgICAgY2FuIG9ubHkgYmUgdHJ1c3RlZCBpZiBpdCBpcyBzZWxmIHNpZ25lZCBhbmQgdGhlbiBpdCBpcyB0cnVzdGVkCiAgICAgZm9yIGFsbCBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYXNzZW1ibGVyIGZvciBBbHBoYSAodGVzdGVkIG9ubHkgb24gREVDIE9TRiBub3QgTGludXggb3IgKkJTRCkuCiAgICAgVGhlIHByb2JsZW0gd2FzIHRoYXQgb25lIG9mIHRoZSByZXBsYWNlbWVudCByb3V0aW5lcyBoYWQgbm90IGJlZW4gd29ya2luZwogICAgIHNpbmNlIFNTTGVheSByZWxlYXNlcy4gIEZvciBub3cgdGhlIG9mZmVuZGluZyByb3V0aW5lIGhhcyBiZWVuIHJlcGxhY2VkCiAgICAgd2l0aCBub24tb3B0aW1pc2VkIGFzc2VtYmxlci4gIEV2ZW4gc28sIHRoaXMgbm93IGdpdmVzIGFyb3VuZCA5NSUKICAgICBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmb3IgMTAyNCBiaXQgUlNBIHNpZ25zLgogICAgIFtNYXJrIENveF0KCiAgKikgSGFjayB0byBmaXggUEtDUyM3IGRlY3J5cHRpb24gd2hlbiB1c2VkIHdpdGggc29tZSB1bm9ydGhvZG94IFJDMiAKICAgICBoYW5kbGluZy4gTW9zdCBjbGllbnRzIGhhdmUgdGhlIGVmZmVjdGl2ZSBrZXkgc2l6ZSBpbiBiaXRzIGVxdWFsIHRvCiAgICAgdGhlIGtleSBsZW5ndGggaW4gYml0czogc28gYSA0MCBiaXQgUkMyIGtleSB1c2VzIGEgNDAgYml0ICg1IGJ5dGUpIGtleS4KICAgICBBIGZldyBob3dldmVyIGRvbid0IGRvIHRoaXMgYW5kIGluc3RlYWQgdXNlIHRoZSBzaXplIG9mIHRoZSBkZWNyeXB0ZWQga2V5CiAgICAgdG8gZGV0ZXJtaW5lIHRoZSBSQzIga2V5IGxlbmd0aCBhbmQgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lCiAgICAgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoLiBJbiB0aGlzIGNhc2UgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIGNhbiBzdGlsbAogICAgIGJlIDQwIGJpdHMgYnV0IHRoZSBrZXkgbGVuZ3RoIGNhbiBiZSAxNjggYml0cyBmb3IgZXhhbXBsZS4gVGhpcyBpcyBmaXhlZAogICAgIGJ5IG1hbnVhbGx5IGZvcmNpbmcgYW4gUkMyIGtleSBpbnRvIHRoZSBFVlBfUEtFWSBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGUKICAgICBFVlAgY29kZSBjYW4ndCBjdXJyZW50bHkgaGFuZGxlIHVudXN1YWwgUkMyIGtleSBzaXplczogaXQgYWx3YXlzIGFzc3VtZXMKICAgICB0aGUga2V5IGxlbmd0aCBhbmQgZWZmZWN0aXZlIGtleSBsZW5ndGggYXJlIGVxdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgCiAgICAgWDUwOV9OQU1FIHN0cnVjdHVyZXMuIE5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZG86CiAgICAgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQobm0sICJDTiIsIE1CU1RSSU5HX0FTQywgIlN0ZXZlIiwgLTEsIC0xLCAwKTsKICAgICBhbmQgaGF2ZSBpdCBhdXRvbWF0aWNhbGx5IHdvcmsgb3V0IHRoZSBjb3JyZWN0IGZpZWxkIHR5cGUgYW5kIGZpbGwgaW4KICAgICB0aGUgc3RydWN0dXJlcy4gVGhlIG1vcmUgYWR2ZW50dXJvdXMgY2FuIHRyeToKICAgICBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChubSwgZmllbGQsIE1CU1RSSU5HX1VURjgsIHN0ciwgLTEsIC0xLCAwKTsKICAgICBhbmQgaXQgd2lsbCAoaG9wZWZ1bGx5KSB3b3JrIG91dCB0aGUgY29ycmVjdCBtdWx0aWJ5dGUgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSAncmVxJyB1dGlsaXR5IHRvIHVzZSB0aGUgbmV3IGZpZWxkIGhhbmRsaW5nIGFuZCBtdWx0aWJ5dGUKICAgICBjb3B5IHJvdXRpbmVzLiBCZWZvcmUgdGhlIEROIGZpZWxkIGNyZWF0aW9uIHdhcyBoYW5kbGVkIGluIGFuIGFkIGhvYwogICAgIHdheSBpbiByZXEsIGNhLCBhbmQgeDUwOSB3aGljaCB3YXMgcmF0aGVyIGJyb2tlbiBhbmQgZGlkbid0IHN1cHBvcnQKICAgICBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzLiBTaW5jZSBzb21lIHNvZnR3YXJlIGRvZXNuJ3QgaW1wbGVtZW50CiAgICAgQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncyB5ZXQsIHRoZXkgY2FuIGJlIGVuYWJsZWQgdXNpbmcgdGhlIGNvbmZpZyBmaWxlCiAgICAgdXNpbmcgdGhlIGRpcnN0cmluZ190eXBlIG9wdGlvbi4gU2VlIHRoZSBuZXcgY29tbWVudCBpbiB0aGUgZGVmYXVsdAogICAgIG9wZW5zc2wuY25mIGZvciBtb3JlIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBjcnlwdG8vcmFuZC9tZF9yYW5kLmMgbW9yZSByb2J1c3Q6CiAgICAgLSBBc3N1cmUgdW5pcXVlIHJhbmRvbSBudW1iZXJzIGFmdGVyIGZvcmsoKS4KICAgICAtIE1ha2Ugc3VyZSB0aGF0IGNvbmN1cnJlbnQgdGhyZWFkcyBhY2Nlc3MgdGhlIGdsb2JhbCBjb3VudGVyIGFuZAogICAgICAgbWQgc2VyaWFsaXphYmx5IHNvIHRoYXQgd2UgbmV2ZXIgbG9zZSBlbnRyb3B5IGluIHRoZW0KICAgICAgIG9yIHVzZSBleGFjdGx5IHRoZSBzYW1lIHN0YXRlIGluIG11bHRpcGxlIHRocmVhZHMuCiAgICAgICBBY2Nlc3MgdG8gdGhlIGxhcmdlIHN0YXRlIGlzIG5vdCBhbHdheXMgc2VyaWFsaXphYmxlIGJlY2F1c2UKICAgICAgIHRoZSBhZGRpdGlvbmFsIGxvY2tpbmcgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBraWxsZXIsIGFuZAogICAgICAgbWQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCBhbnl3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZpbGUgYXBwcy9hcHBfcmFuZC5jIHdpdGggY29tbW9ubHkgbmVlZGVkIGZ1bmN0aW9uYWxpdHkKICAgICBmb3IgaGFuZGxpbmcgdGhlIHJhbmRvbSBzZWVkIGZpbGUuCgogICAgIFVzZSB0aGUgcmFuZG9tIHNlZWQgZmlsZSBpbiBzb21lIGFwcGxpY2F0aW9ucyB0aGF0IHByZXZpb3VzbHkgZGlkIG5vdDoKICAgICAgICAgIGNhLAogICAgICAgICAgZHNhcGFyYW0gLWdlbmtleSAod2hpY2ggYWxzbyBpZ25vcmVkIGl0cyAnLXJhbmQnIG9wdGlvbiksIAogICAgICAgICAgc19jbGllbnQsCiAgICAgICAgICBzX3NlcnZlciwKICAgICAgICAgIHg1MDkgKHdoZW4gc2lnbmluZykuCiAgICAgRXhjZXB0IG9uIHN5c3RlbXMgd2l0aCAvZGV2L3VyYW5kb20sIGl0IGlzIGNydWNpYWwgdG8gaGF2ZSBhIHJhbmRvbQogICAgIHNlZWQgZmlsZSBhdCBsZWFzdCBmb3Iga2V5IGNyZWF0aW9uLCBEU0Egc2lnbmluZywgYW5kIGZvciBESCBleGNoYW5nZXM7CiAgICAgZm9yIFJTQSBzaWduYXR1cmVzIHdlIGNvdWxkIGRvIHdpdGhvdXQgb25lLgoKICAgICBnZW5kaCBhbmQgZ2VuZHNhICh1bmxpa2UgZ2VucnNhKSB1c2VkIHRvIHJlYWQgb25seSB0aGUgZmlyc3QgYnl0ZQogICAgIG9mIGVhY2ggZmlsZSBsaXN0ZWQgaW4gdGhlICctcmFuZCcgb3B0aW9uLiAgVGhlIGZ1bmN0aW9uIGFzIHByZXZpb3VzbHkKICAgICBmb3VuZCBpbiBnZW5yc2EgaXMgbm93IGluIGFwcF9yYW5kLmMgYW5kIGlzIHVzZWQgYnkgYWxsIHByb2dyYW1zCiAgICAgdGhhdCBzdXBwb3J0ICctcmFuZCcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gUkFORF93cml0ZV9maWxlLCB1c2UgbW9kZSAwNjAwIGZvciBjcmVhdGluZyBmaWxlczsKICAgICBkb24ndCBqdXN0IGNobW9kIHdoZW4gaXQgbWF5IGJlIHRvbyBsYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlcG9ydCBhbiBlcnJvciBmcm9tIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMKICAgICB3aGVuIFg1MDlfTE9PS1VQX2xvYWRfZmlsZSBvciBYNTA5X0xPT0tVUF9hZGRfZGlyIGZhaWxlZC4KICAgICBbQmlsbCBQZXJyeV0KCiAgKikgTmV3IGZ1bmN0aW9uIEFTTjFfbWJzdHJpbmdfY29weSgpIHRoaXMgY29waWVzIGEgc3RyaW5nIGluIGVpdGhlcgogICAgIEFTQ0lJLCBVbmljb2RlLCBVbml2ZXJzYWwgKDQgYnl0ZXMgcGVyIGNoYXJhY3Rlcikgb3IgVVRGOCBmb3JtYXQKICAgICBpbnRvIGFuIEFTTjFfU1RSSU5HIHR5cGUuIEEgbWFzayBvZiBwZXJtaXNzaWJsZSB0eXBlcyBpcyBwYXNzZWQKICAgICBhbmQgaXQgY2hvb3NlcyB0aGUgIm1pbmltYWwiIHR5cGUgdG8gdXNlIG9yIGFuIGVycm9yIGlmIG5vdCB0eXBlCiAgICAgaXMgc3VpdGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9uIGVxdWl2YWxlbnRzIHRvIHRoZSB2YXJpb3VzIG1hY3JvcyBpbiBhc24xLmguIFRoZSBvbGQKICAgICBtYWNyb3MgYXJlIHJldGFpbmVkIHdpdGggYW4gTV8gcHJlZml4LiBDb2RlIGluc2lkZSB0aGUgbGlicmFyeSBjYW4KICAgICB1c2UgdGhlIE1fIG1hY3Jvcy4gRXh0ZXJuYWwgY29kZSAoaW5jbHVkaW5nIHRoZSBvcGVuc3NsIHV0aWxpdHkpCiAgICAgc2hvdWxkICpOT1QqIGluIG9yZGVyIHRvIGJlICJzaGFyZWQgbGlicmFyeSBmcmllbmRseSIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgY2FuIGNoZWNrIGEgY2VydGlmaWNhdGUncyBleHRlbnNpb25zCiAgICAgdG8gc2VlIGlmIGl0IHVzYWJsZSBmb3IgdmFyaW91cyBwdXJwb3NlcyBzdWNoIGFzIFNTTCBjbGllbnQsCiAgICAgc2VydmVyIG9yIFMvTUlNRSBhbmQgQ0FzIG9mIHRoZXNlIHR5cGVzLiBUaGlzIGlzIGN1cnJlbnRseSAKICAgICBWRVJZIEVYUEVSSU1FTlRBTCBidXQgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgZm9yIGNlcnRpZmljYXRlIGNoYWluCiAgICAgdmVyaWZpY2F0aW9uLiBBbHNvIGFkZGVkIGEgLXB1cnBvc2UgZmxhZyB0byB4NTA5IHV0aWxpdHkgdG8KICAgICBwcmludCBvdXQgYWxsIHRoZSBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBDUllQVE9fRVhfREFUQSB0byBYNTA5IGNlcnRpZmljYXRlIHN0cnVjdHVyZSBhbmQgYXNzb2NpYXRlZAogICAgIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgWDUwOVYzX3tYNTA5LENSTCxSRVZPS0VEfV9nZXRfZDJpKCkgZnVuY3Rpb25zLiBUaGVzZSB3aWxsIHNlYXJjaAogICAgIGZvciwgb2J0YWluIGFuZCBkZWNvZGUgYW5kIGV4dGVuc2lvbiBhbmQgb2J0YWluIGl0cyBjcml0aWNhbCBmbGFnLgogICAgIFRoaXMgYWxsb3dzIGFsbCB0aGUgbmVjZXNzYXJ5IGV4dGVuc2lvbiBjb2RlIHRvIGJlIGhhbmRsZWQgaW4gYQogICAgIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJDNCB0dW5lLXVwIGZlYXR1cmluZyAzMC00MCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gbW9zdCBSSVNDCiAgICAgcGxhdGZvcm1zLiBTZWUgY3J5cHRvL3JjNC9yYzRfZW5jLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IC1ub291dCBvcHRpb24gdG8gYXNuMXBhcnNlLiBUaGlzIGNhdXNlcyBubyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQKICAgICBpdHMgbWFpbiB1c2UgaXMgd2hlbiBjb21iaW5lZCB3aXRoIC1zdHJwYXJzZSBhbmQgLW91dCB0byBleHRyYWN0IGRhdGEKICAgICBmcm9tIGEgZmlsZSAod2hpY2ggbWF5IG5vdCBiZSBpbiBBU04uMSBmb3JtYXQpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgcGtjczEyIHByb2dyYW0uIEl0IHdhcyBoYXNoaW5nIGFuIGludmFsaWQgY2VydGlmaWNhdGUgcG9pbnRlcgogICAgIHdoZW4gcHJvZHVjaW5nIHRoZSBsb2NhbCBrZXkgaWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIE5ldyBvcHRpb24gLWRocGFyYW0gaW4gc19zZXJ2ZXIuIFRoaXMgYWxsb3dzIGEgREggcGFyYW1ldGVyIGZpbGUgdG8gYmUKICAgICBzdGF0ZWQgZXhwbGljaXRseS4gSWYgaXQgaXMgbm90IHN0YXRlZCB0aGVuIGl0IHRyaWVzIHRoZSBmaXJzdCBzZXJ2ZXIKICAgICBjZXJ0aWZpY2F0ZSBmaWxlLiBUaGUgcHJldmlvdXMgYmVoYXZpb3VyIGhhcmQgY29kZWQgdGhlIGZpbGVuYW1lCiAgICAgInNlcnZlci5wZW0iLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtcHViaW4gYW5kIC1wdWJvdXQgb3B0aW9ucyB0byB0aGUgcnNhIGFuZCBkc2EgY29tbWFuZHMuIFRoZXNlIGFsbG93CiAgICAgYSBwdWJsaWMga2V5IHRvIGJlIGlucHV0IG9yIG91dHB1dC4gRm9yIGV4YW1wbGU6CiAgICAgb3BlbnNzbCByc2EgLWluIGtleS5wZW0gLXB1Ym91dCAtb3V0IHB1YmtleS5wZW0KICAgICBBbHNvIGFkZGVkIG5lY2Vzc2FyeSBEU0EgcHVibGljIGtleSBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHNvIFBLQ1M3X2RhdGFWZXJpZnkoKSBkb2Vzbid0IGNyYXNoIGlmIG5vIGNlcnRpZmljYXRlcyBhcmUgY29udGFpbmVkCiAgICAgaW4gdGhlIG1lc3NhZ2UuIFRoaXMgd2FzIGhhbmRsZWQgYnkgYWxsb3dpbmcKICAgICBYNTA5X2ZpbmRfYnlfaXNzdWVyX2FuZF9zZXJpYWwoKSB0byB0b2xlcmF0ZSBhIE5VTEwgcGFzc2VkIHRvIGl0LgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFNhbXBvIEtlbGxvbWFraSA8c2FtcG9AbWFpbC5uZXVyb25pby5wdD5dCgogICopIEZpeCBmb3IgYnVnIGluIGQyaV9BU04xX2J5dGVzKCk6IG90aGVyIEFTTjEgZnVuY3Rpb25zIGFkZCBhbiBleHRyYSBudWxsCiAgICAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5ncyB3aGVyZWFzIHRoaXMgZGlkbid0LiBUaGlzIHdvdWxkIGNhdXNlIHByb2JsZW1zCiAgICAgaWYgc3RyaW5ncyByZWFkIHdpdGggZDJpX0FTTjFfYnl0ZXMoKSB3ZXJlIGxhdGVyIG1vZGlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEFybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEZpeCBmb3IgYmFzZTY0IGRlY29kZSBidWcuIFdoZW4gYSBiYXNlNjQgYmlvIHJlYWRzIG9ubHkgb25lIGxpbmUgb2YKICAgICBkYXRhIGFuZCBpdCBjb250YWlucyBFT0YgaXQgd2lsbCBlbmQgdXAgcmV0dXJuaW5nIGFuIGVycm9yLiBUaGlzIGlzCiAgICAgY2F1c2VkIGJ5IGlucHV0IDQ2IGJ5dGVzIGxvbmcuIFRoZSBjYXVzZSBpcyBkdWUgdG8gdGhlIHdheSBiYXNlNjQKICAgICBCSU9zIGZpbmQgdGhlIHN0YXJ0IG9mIGJhc2U2NCBlbmNvZGVkIGRhdGEuIFRoZXkgZG8gdGhpcyBieSB0cnlpbmcgYQogICAgIHRyaWFsIGRlY29kZSBvbiBlYWNoIGxpbmUgdW50aWwgdGhleSBmaW5kIG9uZSB0aGF0IHdvcmtzLiBXaGVuIHRoZXkKICAgICBkbyBhIGZsYWcgaXMgc2V0IGFuZCBpdCBzdGFydHMgYWdhaW4ga25vd2luZyBpdCBjYW4gcGFzcyBhbGwgdGhlCiAgICAgZGF0YSBkaXJlY3RseSB0aHJvdWdoIHRoZSBkZWNvZGVyLiBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3QgcmVzZXQKICAgICB0aGUgY29udGV4dCBpdCB1c2VzLiBUaGlzIG1lYW5zIHRoYXQgaWYgRU9GIGlzIHJlYWNoZWQgYW4gYXR0ZW1wdAogICAgIGlzIG1hZGUgdG8gcGFzcyB0d28gRU9GcyB0aHJvdWdoIHRoZSBjb250ZXh0IGFuZCB0aGlzIGNhdXNlcyB0aGUKICAgICByZXN1bHRpbmcgZXJyb3IuIFRoaXMgY2FuIGFsc28gY2F1c2Ugb3RoZXIgcHJvYmxlbXMgYXMgd2VsbC4gQXMgaXMKICAgICB1c3VhbCB3aXRoIHRoZXNlIHByb2JsZW1zIGl0IHRha2VzICphZ2VzKiB0byBmaW5kIGFuZCB0aGUgZml4IGlzCiAgICAgdHJpdmlhbDogbW92ZSBvbmUgbGluZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBpYW5AdW5zLm5zLmFjLnl1IChJdmFuIE5lamdlYmF1ZXIpIF0KCiAgKikgVWdseSB3b3JrYXJvdW5kIHRvIGdldCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgd29ya2luZyB1bmRlciBXaW5kb3dzLiBUaGUKICAgICBvbGQgY29kZSB3b3VsZG4ndCB3b3JrIGJlY2F1c2UgaXQgbmVlZGVkIHRvIHNlbGVjdCgpIG9uIHNvY2tldHMgYW5kIHRoZQogICAgIHR0eSAoZm9yIGtleXByZXNzZXMgYW5kIHRvIHNlZSBpZiBkYXRhIGNvdWxkIGJlIHdyaXR0ZW4pLiBXaW4zMiBvbmx5CiAgICAgc3VwcG9ydHMgc2VsZWN0KCkgb24gc29ja2V0cyBzbyB3ZSBzZWxlY3QoKSB3aXRoIGEgMXMgdGltZW91dCBvbiB0aGUKICAgICBzb2NrZXRzIGFuZCB0aGVuIHNlZSBpZiBhbnkgY2hhcmFjdGVycyBhcmUgd2FpdGluZyB0byBiZSByZWFkLCBpZiBub25lCiAgICAgYXJlIHByZXNlbnQgdGhlbiB3ZSByZXRyeSwgd2UgYWxzbyBhc3N1bWUgd2UgY2FuIGFsd2F5cyB3cml0ZSBkYXRhIHRvCiAgICAgdGhlIHR0eS4gVGhpcyBpc24ndCBuaWNlIGJlY2F1c2UgdGhlIGNvZGUgdGhlbiBibG9ja3MgdW50aWwgd2UndmUKICAgICByZWNlaXZlZCBhIGNvbXBsZXRlIGxpbmUgb2YgZGF0YSBhbmQgaXQgaXMgZWZmZWN0aXZlbHkgcG9sbGluZyB0aGUKICAgICBrZXlib2FyZCBhdCAxcyBpbnRlcnZhbHM6IGhvd2V2ZXIgaXQncyBxdWl0ZSBhIGJpdCBiZXR0ZXIgdGhhbiBub3QKICAgICB3b3JraW5nIGF0IGFsbCA6LSkgQSBkZWRpY2F0ZWQgV2luZG93cyBhcHBsaWNhdGlvbiBtaWdodCBoYW5kbGUgdGhpcwogICAgIHdpdGggYW4gZXZlbnQgbG9vcCBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIFJTQV9NRVRIT0Qgc3RydWN0dXJlLiBOb3cgdGhlcmUgYXJlIHR3byBleHRyYSBtZXRob2RzLCByc2Ffc2lnbgogICAgIGFuZCByc2FfdmVyaWZ5LiBXaGVuIHRoZSBSU0FfRkxBR1NfU0lHTl9WRVIgb3B0aW9uIGlzIHNldCB0aGVzZSBmdW5jdGlvbnMKICAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIFJTQV9zaWduKCkgYW5kIFJTQV92ZXJpZnkoKSBhcmUgdXNlZC4gVGhpcyBpcyB1c2VmdWwKICAgICBpZiByc2FfcHViX2RlYygpIGFuZCByc2FfcHJpdl9lbmMoKSBlcXVpdmFsZW50cyBhcmUgbm90IGF2YWlsYWJsZS4KICAgICBGb3IgdGhpcyB0byB3b3JrIHByb3Blcmx5IFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkKICAgICBzaG91bGQgKm5vdCogYmUgdXNlZDogUlNBX3NpZ24oKSBhbmQgUlNBX3ZlcmlmeSgpIG11c3QgYmUgdXNlZCBpbnN0ZWFkLgogICAgIFRoaXMgbmVjZXNzaXRhdGVkIHRoZSBzdXBwb3J0IG9mIGFuIGV4dHJhIHNpZ25hdHVyZSB0eXBlIE5JRF9tZDVfc2hhMQogICAgIGZvciBTU0wgc2lnbmF0dXJlcyBhbmQgbW9kaWZpY2F0aW9ucyB0byB0aGUgU1NMIGxpYnJhcnkgdG8gdXNlIGl0IGluc3RlYWQKICAgICBvZiBjYWxsaW5nIFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAtdmVyaWZ5IC1DQWZpbGUgYW5kIC1DQXBhdGggb3B0aW9ucyB0byB0aGUgY3JsIHByb2dyYW0sIHRoZXNlCiAgICAgd2lsbCBsb29rdXAgYSBDUkwgaXNzdWVycyBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZ5IHRoZSBzaWduYXR1cmUgaW4gYQogICAgIHNpbWlsYXIgd2F5IHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbS4gVGlkeSB1cCB0aGUgY3JsIHByb2dyYW0gc28gaXQKICAgICBubyBsb25nZXIgYWNjZXNzZXMgc3RydWN0dXJlcyBkaXJlY3RseS4gTWFrZSB0aGUgQVNOMSBDUkwgcGFyc2luZyBhIGJpdAogICAgIGxlc3Mgc3RyaWN0LiBJdCB3aWxsIG5vdyBwZXJtaXQgQ1JMIGV4dGVuc2lvbnMgZXZlbiBpZiBpdCBpcyBub3QKICAgICBhIFYyIENSTDogdGhpcyB3aWxsIGFsbG93IGl0IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbGl6ZSBhbGwgbm9uLWF1dG9tYXRpYyB2YXJpYWJsZXMgZWFjaCB0aW1lIG9uZSBvZiB0aGUgb3BlbnNzbAogICAgIHN1Yi1wcm9ncmFtcyBpcyBzdGFydGVkICh0aGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGV5IG1heSBiZSBzdGFydGVkCiAgICAgbXVsdGlwbGUgdGltZXMgZnJvbSB0aGUgIk9wZW5TU0w+IiBwcm9tcHQpLgogICAgIFtMZW5uYXJ0IEJhbmcsIEJvZG8gTW9lbGxlcl0KCiAgKikgUHJlbGltaW5hcnkgY29tcGlsYXRpb24gb3B0aW9uIFJTQV9OVUxMIHdoaWNoIGRpc2FibGVzIFJTQSBjcnlwdG8gd2l0aG91dAogICAgIHJlbW92aW5nIGFsbCBvdGhlciBSU0EgZnVuY3Rpb25hbGl0eSAodGhpcyBpcyB3aGF0IE5PX1JTQSBkb2VzKS4gVGhpcwogICAgIGlzIHNvIChmb3IgZXhhbXBsZSkgdGhvc2UgaW4gdGhlIFVTIGNhbiBkaXNhYmxlIHRob3NlIG9wZXJhdGlvbnMgY292ZXJlZAogICAgIGJ5IHRoZSBSU0EgcGF0ZW50IHdoaWxlIGFsbG93aW5nIHN0b3JhZ2UgYW5kIHBhcnNpbmcgb2YgUlNBIGtleXMgYW5kIFJTQQogICAgIGtleSBnZW5lcmF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5vbi1jb3B5aW5nIGludGVyZmFjZSB0byBCSU8gcGFpcnMuCiAgICAgKHN0aWxsIGxhcmdlbHkgdW50ZXN0ZWQpCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEFOUzFfdGFnMnN0cigpIHRvIGNvbnZlcnQgYW4gQVNOMSB0YWcgdG8gYSBkZXNjcmlwdGl2ZQogICAgIEFTQ0lJIHN0cmluZy4gVGhpcyB3YXMgaGFuZGxlZCBpbmRlcGVuZGVudGx5IGluIHZhcmlvdXMgcGxhY2VzIGJlZm9yZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIFVURjhfZ2V0YygpIGFuZCBVVEY4X3B1dGMoKSB0aGF0IHBhcnNlIGFuZCBnZW5lcmF0ZQogICAgIFVURjggc3RyaW5ncyBhIGNoYXJhY3RlciBhdCBhIHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGNsaWVudF92ZXJzaW9uIGZyb20gY2xpZW50IGhlbGxvIHRvIHNlbGVjdCB0aGUgcHJvdG9jb2wKICAgICAoczIzX3NydnIuYykgYW5kIGZvciBSU0EgY2xpZW50IGtleSBleGNoYW5nZSB2ZXJpZmljYXRpb24KICAgICAoczNfc3J2ci5jKSwgYXMgcmVxdWlyZWQgYnkgdGhlIFNTTCAzLjAvVExTIDEuMCBzcGVjaWZpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgU1BLQUNzLCB0aGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICBoYW5kbGVkIGJ5IHBva2luZyByb3VuZCBpbiB0aGUgc3RydWN0dXJlIGludGVybmFscy4gQWRkZWQgbmV3IGZ1bmN0aW9uCiAgICAgTkVUU0NBUEVfU1BLSV9wcmludCgpIHRvIHByaW50IG91dCBTUEtBQyBhbmQgYSBuZXcgdXRpbGl0eSAnc3BrYWMnIHRvCiAgICAgcHJpbnQsIHZlcmlmeSBhbmQgZ2VuZXJhdGUgU1BLQUNzLiBCYXNlZCBvbiBhbiBvcmlnaW5hbCBpZGVhIGZyb20KICAgICBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0PiBidXQgZXh0ZW5zaXZlbHkgbW9kaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUklQRU1EMTYwIGlzIG9wZXJhdGlvbmFsIG9uIGFsbCBwbGF0Zm9ybXMgYW5kIGlzIGJhY2sgaW4gJ21ha2UgdGVzdCcuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFsbG93IHRoZSBjb25maWcgZmlsZSBleHRlbnNpb24gc2VjdGlvbiB0byBiZSBvdmVyd3JpdHRlbiBvbiB0aGUKICAgICBjb21tYW5kIGxpbmUuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgZnJvbSBNYXNzaW1pbGlhbm8gUGFsYQogICAgIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+LiBUaGUgbmV3IG9wdGlvbiBpcyBjYWxsZWQgLWV4dGVuc2lvbnMKICAgICBhbmQgY2FuIGJlIGFwcGxpZWQgdG8gY2EsIHJlcSBhbmQgeDUwOS4gQWxzbyAtcmVxZXh0cyB0byBvdmVycmlkZQogICAgIHRoZSByZXF1ZXN0IGV4dGVuc2lvbnMgaW4gcmVxIGFuZCAtY3JsZXh0cyB0byBvdmVycmlkZSB0aGUgY3JsIGV4dGVuc2lvbnMKICAgICBpbiBjYS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZlYXR1cmUgdG8gdGhlIFNQS0FDIGhhbmRsaW5nIGluIGNhLiAgTm93IHlvdSBjYW4gaW5jbHVkZQogICAgIHRoZSBzYW1lIGZpZWxkIG11bHRpcGxlIHRpbWVzIGJ5IHByZWNlZGluZyBpdCBieSAiWFhYWC4iIGZvciBleGFtcGxlOgogICAgIDEuT1U9IlVuaXQgbmFtZSAxIgogICAgIDIuT1U9IlVuaXQgbmFtZSAyIgogICAgIHRoaXMgaXMgdGhlIHNhbWUgc3ludGF4IGFzIHVzZWQgaW4gdGhlIHJlcSBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIGNlcnRpZmljYXRlIHJlcXVlc3RzLiBUaGVzZQogICAgIGFyZSBzcGVjaWZpZWQgaW4gYSAncmVxX2V4dGVuc2lvbnMnIG9wdGlvbiBvZiB0aGUgcmVxIHNlY3Rpb24gb2YgdGhlCiAgICAgY29uZmlnIGZpbGUuIFRoZXkgY2FuIGJlIHByaW50ZWQgb3V0IHdpdGggdGhlIC10ZXh0IG9wdGlvbiB0byByZXEgYnV0CiAgICAgYXJlIG90aGVyd2lzZSBpZ25vcmVkIGF0IHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGEgaG9ycmlibGUgYnVnIGluIGVuY19yZWFkKCkgaW4gY3J5cHRvL2V2cC9iaW9fZW5jLmM6IGlmIHRoZSBmaXJzdAogICAgIGRhdGEgcmVhZCBjb25zaXN0cyBvZiBvbmx5IHRoZSBmaW5hbCBibG9jayBpdCB3b3VsZCBub3QgZGVjcnlwdGVkIGJlY2F1c2UKICAgICBFVlBfQ2lwaGVyVXBkYXRlKCkgd291bGQgY29ycmVjdGx5IHJlcG9ydCB6ZXJvIGJ5dGVzIGhhZCBiZWVuIGRlY3J5cHRlZC4KICAgICBBIG1pc3BsYWNlZCAnYnJlYWsnIGFsc28gbWVhbnQgdGhlIGRlY3J5cHRlZCBmaW5hbCBibG9jayBtaWdodCBub3QgYmUKICAgICBjb3BpZWQgdW50aWwgdGhlIG5leHQgcmVhZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIERIX01FVEhPRC4gQWdhaW4gYmFzZWQgb24gUlNBX01FVEhPRC4gQWxzbyBhZGRlZAogICAgIGEgZmV3IGV4dHJhIHBhcmFtZXRlcnMgdG8gdGhlIERIIHN0cnVjdHVyZTogdGhlc2Ugd2lsbCBiZSB1c2VmdWwgaWYKICAgICBmb3IgZXhhbXBsZSB3ZSB3YW50IHRoZSB2YWx1ZSBvZiAncScgb3IgaW1wbGVtZW50IFg5LjQyIERILgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgRFNBX01FVEhPRC4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgUlNBX01FVEhPRCBhbmQKICAgICBwcm92aWRlcyBob29rcyB0aGF0IGFsbG93IHRoZSBkZWZhdWx0IERTQSBmdW5jdGlvbnMgb3IgZnVuY3Rpb25zIG9uIGEKICAgICAicGVyIGtleSIgYmFzaXMgdG8gYmUgcmVwbGFjZWQuIFRoaXMgYWxsb3dzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBhbmQKICAgICBoYXJkd2FyZSBrZXkgc3RvcmFnZSB0byBiZSBoYW5kbGVkIHdpdGhvdXQgbWFqb3IgbW9kaWZpY2F0aW9uIHRvIHRoZQogICAgIGxpYnJhcnkuIEFsc28gYWRkZWQgbG93IGxldmVsIG1vZGV4cCBob29rcyBhbmQgQ1JZUFRPX0VYIHN0cnVjdHVyZSBhbmQgCiAgICAgYXNzb2NpYXRlZCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IGZsYWcgdG8gbWVtb3J5IEJJT3MsIEJJT19GTEFHX01FTV9SRE9OTFkuIFRoaXMgbWFya3MgdGhlIEJJTwogICAgIGFzICJyZWFkIG9ubHkiOiBpdCBjYW4ndCBiZSB3cml0dGVuIHRvIGFuZCB0aGUgYnVmZmVyIGl0IHBvaW50cyB0byB3aWxsCiAgICAgbm90IGJlIGZyZWVkLiBSZWFkaW5nIGZyb20gYSByZWFkIG9ubHkgQklPIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbgogICAgIGEgbm9ybWFsIG1lbW9yeSBCSU8uIFRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHNldmVyYWwgdGltZXMgd2hlbgogICAgIGFuIGFyZWEgb2YgbWVtb3J5IG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBhIEJJTy4gVGhlIHByZXZpb3VzIG1ldGhvZCB3YXMKICAgICB0byBjcmVhdGUgYSBtZW1vcnkgQklPIGFuZCB3cml0ZSB0aGUgZGF0YSB0byBpdCwgdGhpcyByZXN1bHRzIGluIHR3bwogICAgIGNvcGllcyBvZiB0aGUgZGF0YSBhbmQgYW4gTyhuXjIpIHJlYWRpbmcgYWxnb3JpdGhtLiBUaGVyZSBpcyBhIG5ldwogICAgIGZ1bmN0aW9uIEJJT19uZXdfbWVtX2J1ZigpIHdoaWNoIGNyZWF0ZXMgYSByZWFkIG9ubHkgbWVtb3J5IEJJTyBmcm9tCiAgICAgYW4gYXJlYSBvZiBtZW1vcnkuIEFsc28gbW9kaWZpZWQgdGhlIFBLQ1MjNyByb3V0aW5lcyB0byB1c2UgcmVhZCBvbmx5CiAgICAgbWVtb3J5IEJJT3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4OiBzc2wyM19nZXRfY2xpZW50X2hlbGxvIGRpZCBub3Qgd29yayBwcm9wZXJseSB3aGVuIGNhbGxlZCBpbgogICAgIHN0YXRlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQiwgaS5lLiB3aGVuIHRoZSBmaXJzdCA3IGJ5dGVzIG9mCiAgICAgYSBTU0x2Mi1jb21wYXRpYmxlIGNsaWVudCBoZWxsbyBmb3IgU1NMdjMgb3IgVExTdjEgY291bGQgYmUgcmVhZCwKICAgICBidXQgYSByZXRyeSBjb25kaXRpb24gb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgcmVzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgUEtDUzdfRU5DX0NPTlRFTlRfbmV3KCkgZnVuY3Rpb24gd2FzIHNldHRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhcwogICAgIE5JRF9wa2NzN19lbmNyeXB0ZWQgYnkgZGVmYXVsdDogdGhpcyB3YXMgd3Jvbmcgc2luY2UgdGhpcyBzaG91bGQgYWxtb3N0CiAgICAgYWx3YXlzIGJlIE5JRF9wa2NzN19kYXRhLiBBbHNvIG1vZGlmaWVkIHRoZSBQS0NTN19zZXRfdHlwZSgpIHRvIGhhbmRsZQogICAgIHRoZSBlbmNyeXB0ZWQgZGF0YSB0eXBlOiB0aGlzIGlzIGEgbW9yZSBzZW5zaWJsZSBwbGFjZSB0byBwdXQgaXQgYW5kIGl0CiAgICAgYWxsb3dzIHRoZSBQS0NTIzEyIGNvZGUgdG8gYmUgdGlkaWVkIHVwIHRoYXQgZHVwbGljYXRlZCB0aGlzCiAgICAgZnVuY3Rpb25hbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VkIG9ial9kYXQucGwgc2NyaXB0IHNvIGl0IHRha2VzIGl0cyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG9uCiAgICAgdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBzaG91bGQgYXZvaWQgc2hlbGwgZXNjYXBlIHJlZGlyZWN0aW9uIHByb2JsZW1zCiAgICAgdW5kZXIgV2luMzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBleHRlbnNpb24gcmVxdWVzdHMsIHRoZXNlIGFyZSBpbmNsdWRlZAogICAgIGluIHRoaW5ncyBsaWtlIFhlbnJvbGwgY2VydGlmaWNhdGUgcmVxdWVzdHMuIEluY2x1ZGVkIGZ1bmN0aW9ucyB0byBhbGxvdwogICAgIGV4dGVuc2lvbnMgdG8gYmUgb2J0YWluZWQgYW5kIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIC1jcmxmIG9wdGlvbiB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgZm9yIHNlbmRpbmcgbmV3bGluZXMgYXMKICAgICBDUkxGIChhcyByZXF1aXJlZCBieSBtYW55IHByb3RvY29scykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjNhIGFuZCAwLjkuNCAgWzA5IEF1ZyAxOTk5XQogIAogICopIEluc3RhbGwgbGliUlNBZ2x1ZS5hIHdoZW4gT3BlblNTTCBpcyBidWlsdCB3aXRoIFJTQXJlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQSBmZXcgbW9yZSBgYCNpZm5kZWYgTk9fRlBfQVBJIC8gI2VuZGlmJycgcGFpcnMgZm9yIGNvbnNpc3RlbmN5LgogICAgIFtBbmRyaWphIEFudG9uaWpldmljIDxUaGVBbnRvbnkyQGJpZ2Zvb3QuY29tPl0KCiAgKikgRml4IC1zdGFydGRhdGUgYW5kIC1lbmRkYXRlICh3aGljaCB3YXMgbWlzc2luZykgYXJndW1lbnRzIHRvICdjYScKICAgICBwcm9ncmFtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBEU0FfZHVwX0RILCB3aGljaCBkdXBsaWNhdGVzIERTQSBwYXJhbWV0ZXJzL2tleXMgYXMKICAgICBESCBwYXJhbWV0ZXJzL2tleXMgKHEgaXMgbG9zdCBkdXJpbmcgdGhhdCBjb252ZXJzaW9uLCBidXQgdGhlIHJlc3VsdGluZwogICAgIERIIHBhcmFtZXRlcnMgY29udGFpbiBpdHMgbGVuZ3RoKS4KCiAgICAgRm9yIDEwMjQtYml0IHAsIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGZvbGxvd2VkIGJ5IERTQV9kdXBfREggaXMKICAgICBtdWNoIGZhc3RlciB0aGFuIERIX2dlbmVyYXRlX3BhcmFtZXRlcnMgKHdoaWNoIGNyZWF0ZXMgcGFyYW1ldGVycwogICAgIHdoZXJlIHAgPSAyKnEgKyAxKSwgYW5kIGFsc28gdGhlIHNtYWxsZXIgcSBtYWtlcyBESCBjb21wdXRhdGlvbnMKICAgICBtdWNoIG1vcmUgZWZmaWNpZW50ICgxNjAtYml0IGV4cG9uZW50aWF0aW9uIGluc3RlYWQgb2YgMTAyNC1iaXQKICAgICBleHBvbmVudGlhdGlvbik7IHNvIHRoaXMgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBzdXBwb3J0IERIRQogICAgIGNpcGhlcnN1aXRlcyBpbiBTU0wvVExTIHNlcnZlcnMgKHNlZSBzc2wvc3NsdGVzdC5jKS4gIEl0IGlzIG9mCiAgICAgdXR0ZXIgaW1wb3J0YW5jZSB0byB1c2UKICAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIG9yCiAgICAgICAgIFNTTF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIHdoZW4gc3VjaCBESCBwYXJhbWV0ZXJzIGFyZSB1c2VkLCBiZWNhdXNlIG90aGVyd2lzZSBzbWFsbCBzdWJncm91cAogICAgIGF0dGFja3MgbWF5IGJlY29tZSBwb3NzaWJsZSEKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBtZW1vcnkgbGVhayBpbiBpMmRfREhwYXJhbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWxsb3cgdGhlIC1rIG9wdGlvbiB0byBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBlbmMgcHJvZ3JhbToKICAgICB0aGlzIGFsbG93cyB0aGUgc2FtZSBlbmNyeXB0ZWQgbWVzc2FnZSB0byBiZSByZWFkIGJ5IG11bHRpcGxlIHJlY2lwaWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9CSl9vYmoydHh0KGJ1ZiwgYnVmX2xlbiwgYSwgbm9fbmFtZSksIHRoaXMgY29udmVydHMKICAgICBhbiBBU04xX09CSkVDVCB0byBhIHRleHQgc3RyaW5nLiBJZiB0aGUgIm5vX25hbWUiIHBhcmFtZXRlciBpcyBzZXQgdGhlbgogICAgIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbnVtZXJpY2FsIGZvcm0gb2YgdGhlIE9JRCwgZXZlbiBpZiBpdCBoYXMgYSBzaG9ydAogICAgIG9yIGxvbmcgbmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBhbiBleHRyYSBSU0EgZmxhZzogUlNBX0ZMQUdfRVhUX1BLRVkuIFByZXZpb3VzbHkgdGhlIHJzYV9tb2RfZXhwCiAgICAgbWV0aG9kIG9ubHkgZ290IGNhbGxlZCBpZiBwLHEsZG1wMSxkbXExLGlxbXAgY29tcG9uZW50cyB3ZXJlIHByZXNlbnQsCiAgICAgb3RoZXJ3aXNlIGJuX21vZF9leHAgd2FzIGNhbGxlZC4gSW4gdGhlIGNhc2Ugb2YgaGFyZHdhcmUga2V5cyBmb3IgZXhhbXBsZQogICAgIG5vIHByaXZhdGUga2V5IGNvbXBvbmVudHMgbmVlZCBiZSBwcmVzZW50IGFuZCBpdCBtaWdodCBzdG9yZSBleHRyYSBkYXRhCiAgICAgaW4gdGhlIFJTQSBzdHJ1Y3R1cmUsIHdoaWNoIGNhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIGJuX21vZF9leHAuCiAgICAgQnkgc2V0dGluZyBSU0FfRkxBR19FWFRfUEtFWSByc2FfbW9kX2V4cCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZm9yCiAgICAgcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBTUEFSQyBMaW51eC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgcGVtX3Bhc3N3b3JkX2NiIGZ1bmN0aW9uIHR5cGUgaW5jb21wYXRpYmx5IGNoYW5nZWQgZnJvbQogICAgICAgICAgdHlwZWRlZiBpbnQgcGVtX3Bhc3N3b3JkX2NiKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcpOwogICAgIHRvCiAgICAgICAgICAuLi4uKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKTsKICAgICBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gcGFzcyBkYXRhIHRvIHRoZWlyIGNhbGxiYWNrczoKICAgICBUaGUgUEVNW19BU04xXV97cmVhZCx3cml0ZX0uLi4gZnVuY3Rpb25zIGFuZCBtYWNyb3Mgbm93IHRha2UgYW4KICAgICBhZGRpdGlvbmFsIHZvaWQgKiBhcmd1bWVudCwgd2hpY2ggaXMganVzdCBoYW5kZWQgdGhyb3VnaCB3aGVuZXZlcgogICAgIHRoZSBwYXNzd29yZCBjYWxsYmFjayBpcyBjYWxsZWQuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRtaWxsZXJAaWxvZ2ljLmNvbS5hdT47IHRpbnkgY2hhbmdlcyBieSBCb2RvIE1vZWxsZXJdCgogICAgIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YS4KCiAgICAgQ29tcGF0aWJpbGl0eSBub3RlOiBBcyBtYW55IEMgaW1wbGVtZW50YXRpb25zIHB1c2ggZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgb250byB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlciwgdGhlIG5ldyBsaWJyYXJ5IHZlcnNpb24gaXMgbGlrZWx5IHRvCiAgICAgaW50ZXJvcGVyYXRlIHdpdGggcHJvZ3JhbXMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCB0aGUgb2xkCiAgICAgcGVtX3Bhc3N3b3JkX2NiIGRlZmluaXRpb24gKFBFTV93aGF0ZXZlciB0YWtlcyBzb21lIGRhdGEgdGhhdAogICAgIGhhcHBlbnMgdG8gYmUgb24gdGhlIHN0YWNrIGFzIGl0cyBsYXN0IGFyZ3VtZW50LCBhbmQgdGhlIGNhbGxiYWNrCiAgICAganVzdCBpZ25vcmVzIHRoaXMgZ2FyYmFnZSk7IGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgd2hhdHNvZXZlciB0aGF0CiAgICAgdGhpcyB3aWxsIHdvcmsuCgogICopIFRoZSAtRFBMQVRGT1JNPSJcIiQoUExBVEZPUk0pXCIiIGRlZmluaXRpb24gYW5kIHRoZSBzaW1pbGFyIC1EQ0ZMQUdTPS4uLgogICAgIChib3RoIGluIGNyeXB0by9NYWtlZmlsZS5zc2wgZm9yIHVzZSBieSBjcnlwdG8vY3ZlcnNpb24uYykgY2F1c2VkCiAgICAgcHJvYmxlbXMgbm90IG9ubHkgb24gV2luZG93cywgYnV0IGFsc28gb24gc29tZSBVbml4IHBsYXRmb3Jtcy4KICAgICBUbyBhdm9pZCBwcm9ibGVtYXRpYyBjb21tYW5kIGxpbmVzLCB0aGVzZSBkZWZpbml0aW9ucyBhcmUgbm93IGluIGFuCiAgICAgYXV0by1nZW5lcmF0ZWQgZmlsZSBjcnlwdG8vYnVpbGRpbmYuaCAoY3JlYXRlZCBieSBjcnlwdG8vTWFrZWZpbGUuc3NsCiAgICAgZm9yIHN0YW5kYXJkICJtYWtlIiBidWlsZHMsIGJ5IHV0aWwvbWsxbWYucGwgZm9yICJtazFtZiIgYnVpbGRzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNSVBTIElJSS9JViBhc3NlbWJsZXIgbW9kdWxlIGlzIHJlaW1wbGVtZW50ZWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vcmUgREVTIGxpYnJhcnkgY2xlYW51cHM6IHJlbW92ZSByZWZlcmVuY2VzIHRvIHNyYW5kL3JhbmQgYW5kCiAgICAgZGVsZXRlIGFuIHVudXNlZCBmaWxlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIHRoZSBmcmVlIE5ldHdpZGUgYXNzZW1ibGVyIChOQVNNKSB1bmRlciBXaW4zMiwKICAgICBzaW5jZSBub3QgbWFueSBwZW9wbGUgaGF2ZSBNQVNNIChtbCkgYW5kIGl0IGNhbiBiZSBoYXJkIHRvIG9idGFpbi4KICAgICBUaGlzIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgT0sgYW5kIHBhc3MgYWxsCiAgICAgdGhlIHRlc3RzLiBDaGVjayBvdXQgSU5TVEFMTC5XMzIgZm9yIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBzM19jbG50LmM6IEFsbCBub24tYW5vbnltb3VzIFNTTDMvVExTMSBjb25uZWN0aW9ucwogICAgIHdpdGhvdXQgdGVtcG9yYXJ5IGtleXMga2VwdCBhbiBleHRyYSBjb3B5IG9mIHRoZSBzZXJ2ZXIga2V5LAogICAgIGFuZCBjb25uZWN0aW9ucyB3aXRoIHRlbXBvcmFyeSBrZXlzIGRpZCBub3QgZnJlZSBldmVyeXRoaW5nIGluIGNhc2UKICAgICBvZiBhbiBlcnJvci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gUlNBX2NoZWNrX2tleSBhbmQgbmV3IG9wZW5zc2wgcnNhIG9wdGlvbiAtY2hlY2sKICAgICBmb3IgdmVyaWZ5aW5nIHRoZSBjb25zaXN0ZW5jeSBvZiBSU0Ega2V5cy4KICAgICBbVWxmIE1vZWxsZXIsIEJvZG8gTW9lbGxlcl0KCiAgKikgVmFyaW91cyBjaGFuZ2VzIHRvIG1ha2UgV2luMzIgY29tcGlsZSB3b3JrOiAKICAgICAxLiBDYXN0cyB0byBhdm9pZCAibG9zcyBvZiBkYXRhIiB3YXJuaW5ncyBpbiBwNV9jcnB0Mi5jCiAgICAgMi4gQ2hhbmdlIHVuc2lnbmVkIGludCB0byBpbnQgaW4gYl9kdW1wLmMgdG8gYXZvaWQgInNpZ25lZC91bnNpZ25lZAogICAgICAgIGNvbXBhcmlzb24iIHdhcm5pbmdzLgogICAgIDMuIEFkZCBza188VFlQRT5fc29ydCB0byBERUYgZmlsZSBnZW5lcmF0b3IgYW5kIGRvIG1ha2UgdXBkYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGRlYnVnZ2luZyBvcHRpb24gdG8gUEtDUyM1IHYyIGtleSBnZW5lcmF0aW9uIGZ1bmN0aW9uOiB3aGVuCiAgICAgeW91ICNkZWZpbmUgREVCVUdfUEtDUzVWMiBwYXNzd29yZHMsIHNhbHRzLCBpdGVyYXRpb24gY291bnRzIGFuZAogICAgIGRlcml2ZWQga2V5cyBhcmUgcHJpbnRlZCB0byBzdGRlcnIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29weSB0aGUgZmxhZ3MgaW4gQVNOMV9TVFJJTkdfZHVwKCkuCiAgICAgW1JvbWFuIEUuIFBhdmxvdiA8cHJlQG1vLm1zay5ydT5dCgogICopIFRoZSB4NTA5IGFwcGxpY2F0aW9uIG1pc2hhbmRsZWQgc2lnbmluZyByZXF1ZXN0cyBjb250YWluaW5nIERTQQogICAgIGtleXMgd2hlbiB0aGUgc2lnbmluZyBrZXkgd2FzIGFsc28gRFNBIGFuZCB0aGUgcGFyYW1ldGVycyBkaWRuJ3QgbWF0Y2guCgogICAgIEl0IHdhcyBzdXBwb3NlZCB0byBvbWl0IHRoZSBwYXJhbWV0ZXJzIHdoZW4gdGhleSBtYXRjaGVkIHRoZSBzaWduaW5nIGtleToKICAgICB0aGUgdmVyaWZ5aW5nIHNvZnR3YXJlIHdhcyB0aGVuIHN1cHBvc2VkIHRvIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBDQSdzCiAgICAgcGFyYW1ldGVycyBpZiB0aGV5IHdlcmUgYWJzZW50IGZyb20gdGhlIGVuZCB1c2VyIGNlcnRpZmljYXRlLgoKICAgICBPbWl0dGluZyBwYXJhbWV0ZXJzIGlzIG5vIGxvbmdlciByZWNvbW1lbmRlZC4gVGhlIHRlc3Qgd2FzIGFsc28KICAgICB0aGUgd3Jvbmcgd2F5IHJvdW5kISBUaGlzIHdhcyBwcm9iYWJseSBkdWUgdG8gdW51c3VhbCBiZWhhdmlvdXIgaW4KICAgICBFVlBfY21wX3BhcmFtZXRlcnMoKSB3aGljaCByZXR1cm5zIDEgaWYgdGhlIHBhcmFtZXRlcnMgbWF0Y2guIAogICAgIFRoaXMgbWVhbnQgdGhhdCBwYXJhbWV0ZXJzIHdlcmUgb21pdHRlZCB3aGVuIHRoZXkgKmRpZG4ndCogbWF0Y2ggYW5kCiAgICAgdGhlIGNlcnRpZmljYXRlIHdhcyB1c2VsZXNzLiBDZXJ0aWZpY2F0ZXMgc2lnbmVkIHdpdGggJ2NhJyBkaWRuJ3QgaGF2ZQogICAgIHRoaXMgYnVnLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IERvdWcgRXJpY2tzb24gPERvdWcuRXJpY2tzb25AUGFydC5ORVQ+XQoKICAqKSBNZW1vcnkgbGVhayBjaGVja2luZyAoLURDUllQVE9fTURFQlVHKSBoYWQgc29tZSBwcm9ibGVtcy4KICAgICBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CiAgICAgQXBwbGljYXRpb25zIGNhbiB1c2UKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pIGFrYSBNZW1DaGVja19zdGFydCgpLAogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PRkYpIGFrYSBNZW1DaGVja19zdG9wKCk7CiAgICAgIm9mZiIgaXMgbm93IHRoZSBkZWZhdWx0LgogICAgIFRoZSBsaWJyYXJ5IGludGVybmFsbHkgdXNlcwogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19ESVNBQkxFKSBha2EgTWVtQ2hlY2tfb2ZmKCksCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0VOQUJMRSkgYWthIE1lbUNoZWNrX29uKCkKICAgICB0byBkaXNhYmxlIG1lbW9yeS1jaGVja2luZyB0ZW1wb3JhcmlseS4KCiAgICAgU29tZSBpbmNvbnNpc3RlbnQgc3RhdGVzIHRoYXQgcHJldmlvdXNseSB3ZXJlIHBvc3NpYmxlIChhbmQgd2VyZQogICAgIGV2ZW4gdGhlIGRlZmF1bHQpIGFyZSBub3cgYXZvaWRlZC4KCiAgICAgLURDUllQVE9fTURFQlVHX1RJTUUgaXMgbmV3IGFuZCBhZGRpdGlvbmFsbHkgc3RvcmVzIHRoZSBjdXJyZW50IHRpbWUKICAgICB3aXRoIGVhY2ggbWVtb3J5IGNodW5rIGFsbG9jYXRlZDsgdGhpcyBpcyBvY2Nhc2lvbmFsbHkgbW9yZSBoZWxwZnVsCiAgICAgdGhhbiBqdXN0IGhhdmluZyBhIGNvdW50ZXIuCgogICAgIC1EQ1JZUFRPX01ERUJVR19USFJFQUQgaXMgYWxzbyBuZXcgYW5kIGFkZHMgdGhlIHRocmVhZCBJRC4KCiAgICAgLURDUllQVE9fTURFQlVHX0FMTCBlbmFibGVzIGFsbCBvZiB0aGUgYWJvdmUsIHBsdXMgYW55IGZ1dHVyZQogICAgIGV4dGVuc2lvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlICJtb2RlIiBmb3IgU1NMIHN0cnVjdHVyZXMgKHdpdGggZGVmYXVsdHMgaW4gU1NMX0NUWCksCiAgICAgd2hpY2ggbGFyZ2VseSBwYXJhbGxlbHMgIm9wdGlvbnMiLCBidXQgaXMgZm9yIGNoYW5naW5nIEFQSSBiZWhhdmlvdXIsCiAgICAgd2hlcmVhcyAib3B0aW9ucyIgYXJlIGFib3V0IHByb3RvY29sIGJlaGF2aW91ci4KICAgICBJbml0aWFsICJtb2RlIiBmbGFncyBhcmU6CgogICAgIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFICAgQWxsb3cgU1NMX3dyaXRlIHRvIHJlcG9ydCBzdWNjZXNzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2luZ2xlIHJlY29yZCBoYXMgYmVlbiB3cml0dGVuLgogICAgIFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSICBEb24ndCBpbnNpc3QgdGhhdCBTU0xfd3JpdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMgdXNlIHRoZSBzYW1lIGJ1ZmZlciBsb2NhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXQgYWxsIG9mIHRoZSBjb250ZW50cyBtdXN0IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQhKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogU1NMX3NldF9tb2RlIGlnbm9yZWQgaXRzIHBhcmFtZXRlciwgb25seSBTU0xfQ1RYX3NldF9tb2RlCiAgICAgd29ya2VkLgoKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBuby1obWFjIGV0Yy4KICAgICBbVWxmIE32bGxlciwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gV2VsbGluZ3RvbiA8YndlbGxpbmdAdGlzbGFicy5jb20+XQoKICAqKSBOZXcgZnVuY3Rpb25zIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSwgUlNBX3NldF9tZXRob2QoKSBhbmQKICAgICBSU0FfZ2V0X21ldGhvZCgpLiBUaGVzZSBhbGxvd3MgcmVwbGFjZW1lbnQgb2YgUlNBX01FVEhPRHMgd2l0aG91dCBoYXZpbmcKICAgICB0byBtZXNzIGFyb3VuZCB3aXRoIHRoZSBpbnRlcm5hbHMgb2YgYW4gUlNBIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIERTQV9kb19zaWduIGFuZCBEU0FfaXNfcHJpbWUuCiAgICAgQWxzbyByZWFsbHkgZW5hYmxlIG1lbW9yeSBsZWFrIGNoZWNrcyBpbiBvcGVuc3NsLmMgYW5kIGluIHNvbWUKICAgICB0ZXN0IHByb2dyYW1zLgogICAgIFtDaGFkIEMuIE11bGxpZ2FuLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBkMmlfQVNOMV9JTlRFR0VSKCkgYW5kIGkyZF9BU04xX0lOVEVHRVIoKSB3aGljaCBjYW4gbWVzcwogICAgIHVwIHRoZSBsZW5ndGggb2YgbmVnYXRpdmUgaW50ZWdlcnMuIFRoaXMgaGFzIG5vdyBiZWVuIHNpbXBsaWZpZWQgdG8ganVzdAogICAgIHN0b3JlIHRoZSBsZW5ndGggd2hlbiBpdCBpcyBmaXJzdCBkZXRlcm1pbmVkIGFuZCB1c2UgaXQgbGF0ZXIsIHJhdGhlcgogICAgIHRoYW4gdHJ5aW5nIHRvIGtlZXAgdHJhY2sgb2Ygd2hlcmUgZGF0YSBpcyBjb3BpZWQgYW5kIHVwZGF0aW5nIGl0IHRvCiAgICAgcG9pbnQgdG8gdGhlIGVuZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBCcmllbiBXaGVlbGVyCiAgICAgIDxid2hlZWxlckBhdXRoZW50aWNhLXNlY3VyaXR5LmNvbT5dCgogICopIEFkZCBhIG5ldyBmdW5jdGlvbiBQS0NTN19zaWduYXR1cmVWZXJpZnkuIFRoaXMgYWxsb3dzIHRoZSB2ZXJpZmljYXRpb24KICAgICBvZiBhIFBLQ1MjNyBzaWduYXR1cmUgYnV0IHdpdGggdGhlIHNpZ25pbmcgY2VydGlmaWNhdGUgcGFzc2VkIHRvIHRoZQogICAgIGZ1bmN0aW9uIGl0c2VsZi4gVGhpcyBjb250cmFzdHMgd2l0aCBQS0NTN19kYXRhVmVyaWZ5IHdoaWNoIGFzc3VtZXMgdGhlCiAgICAgY2VydGlmaWNhdGUgaXMgcHJlc2VudCBpbiB0aGUgUEtDUyM3IHN0cnVjdHVyZS4gVGhpcyBpc24ndCBhbHdheXMgdGhlCiAgICAgY2FzZTogY2VydGlmaWNhdGVzIGNhbiBiZSBvbWl0dGVkIGZyb20gYSBQS0NTIzcgc3RydWN0dXJlIGFuZCBiZQogICAgIGRpc3RyaWJ1dGVkIGJ5ICJvdXQgb2YgYmFuZCIgbWVhbnMgKHN1Y2ggYXMgYSBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29tcGxldGUgdGhlIFBFTV8qIG1hY3JvcyB3aXRoIERFQ0xBUkVfUEVNIHZlcnNpb25zIHRvIHJlcGxhY2UgdGhlCiAgICAgZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBwZW0uaCwgYWxzbyBjaGFuZ2UgdXRpbC9ta2RlZi5wbCB0byBhZGQgdGhlCiAgICAgbmVjZXNzYXJ5IGZ1bmN0aW9uIG5hbWVzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBtazFtZi5wbCAodXNlZCBieSBXaW5kb3dzIGJ1aWxkcykgZGlkIG5vdCBwcm9wZXJseSByZWFkIHRoZQogICAgIG9wdGlvbnMgc2V0IGJ5IENvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIE1ha2VmaWxlLCBhbmQgQ29uZmlndXJlCiAgICAgd2FzIG5vdCBldmVuIGFibGUgdG8gd3JpdGUgbW9yZSB0aGFuIG9uZSBvcHRpb24gY29ycmVjdGx5LgogICAgIEZpeGVkLCBub3cgIm5vLWlkZWEgbm8tcmM1IC1EQ1JZUFRPX01ERUJVRyIgZXRjLiB3b3JrcyBhcyBpbnRlbmRlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zIENPTkZfbG9hZF9iaW8oKSBhbmQgQ09ORl9sb2FkX2ZwKCkgdG8gYWxsb3cgYSBjb25maWcKICAgICBmaWxlIHRvIGJlIGxvYWRlZCBmcm9tIGEgQklPIG9yIEZJTEUgcG9pbnRlci4gVGhlIEJJTyB2ZXJzaW9uIHdpbGwKICAgICBmb3IgZXhhbXBsZSBhbGxvdyBtZW1vcnkgQklPcyB0byBjb250YWluIGNvbmZpZyBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiAiQ1JZUFRPX251bV9sb2NrcyIgdGhhdCByZXR1cm5zIENSWVBUT19OVU1fTE9DS1MuCiAgICAgV2hvZXZlciBob3BlcyB0byBhY2hpZXZlIHNoYXJlZC1saWJyYXJ5IGNvbXBhdGliaWxpdHkgYWNyb3NzIHZlcnNpb25zCiAgICAgbXVzdCB1c2UgdGhpcywgbm90IHRoZSBjb21waWxlLXRpbWUgbWFjcm8uCiAgICAgKEV4ZXJjaXNlIDAuOS40OiBXaGljaCBpcyB0aGUgbWluaW11bSBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZWQgYnkKICAgICBzdWNoIHByb2dyYW1zPykKICAgICBOb3RlOiBBbGwgdGhpcyBhcHBsaWVzIG9ubHkgdG8gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMsIG90aGVycyBkb24ndAogICAgIG5lZWQgbG9ja3MuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG1pc3NpbmcgY2FzZSB0byBzM19jbG50LmMgc3RhdGUgbWFjaGluZSAtLSBvbmUgb2YgdGhlIG5ldyBTU0wgdGVzdHMKICAgICB0aHJvdWdoIGEgQklPIHBhaXIgdHJpZ2dlcmVkIHRoZSBkZWZhdWx0IGNhc2UsIGkuZS4KICAgICBTU0xlcnIoLi4uLFNTTF9SX1VOS05PV05fU1RBVEUpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiQklPIHBhaXIiIGNvbmNlcHQgKGNyeXB0by9iaW8vYnNzX2Jpby5jKSBzbyB0aGF0IGFwcGxpY2F0aW9ucwogICAgIGNhbiB1c2UgdGhlIFNTTCBsaWJyYXJ5IGV2ZW4gaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWMgQklPcyBpcwogICAgIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBpMmRfRFNBUHVibGljS2V5KCkgd2hpY2ggbWVhbnQgaXQgcmV0dXJuZWQgdGhlIHdyb25nIHZhbHVlCiAgICAgZm9yIHRoZSBlbmNvZGVkIGxlbmd0aC4KICAgICBbSmVvbiBLeW91bmdIbyA8a2hqZW9uQHNkcy5zYW1zdW5nLmNvLmtyPl0KCiAgKikgQWRkIGluaXRpYWwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgWDUwOVYzIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgcGFpciBvZiBmdW5jdGlvbnMgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleSgpIGFuZCAKICAgICBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleSgpIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8KICAgICBQRU1fd3JpdGVfUHJpdmF0ZUtleSgpIGFuZCBQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoKSBidXQgdXNlIHRoZSBtb3JlCiAgICAgc2VjdXJlIFBLQ1MjOCBwcml2YXRlIGtleSBmb3JtYXQgd2l0aCBhIGhpZ2ggaXRlcmF0aW9uIGNvdW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZXRlcm1pbmF0aW9uIG9mIFBlcmwgaW50ZXJwcmV0ZXI6IEEgcGVybCBvciBwZXJsNQogICAgIF9kaXJlY3RvcnlfIGluICRQQVRIIHdhcyBhbHNvIGFjY2VwdGVkIGFzIHRoZSBpbnRlcnByZXRlci4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGRlbW9zL3NpZ24vc2lnbi5jOiB3ZWxsIHRoZXJlIHdhc24ndCBhbnl0aGluZyBzdHJpY3RseSBzcGVha2luZwogICAgIHdyb25nIHdpdGggaXQgYnV0IGl0IHdhcyB2ZXJ5IG9sZCBhbmQgZGlkIHRoaW5ncyBsaWtlIGNhbGxpbmcKICAgICBQRU1fQVNOMV9yZWFkKCkgZGlyZWN0bHkgYW5kIHVzZWQgTUQ1IGZvciB0aGUgaGFzaCBub3QgdG8gbWVudGlvbiBzb21lCiAgICAgdW51c3VhbCBmb3JtYXR0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZW1vcy9zZWxmc2lnbi5jOiBpdCB1c2VkIG9ic29sZXRlIGFuZCBkZWxldGVkIGZ1bmN0aW9ucywgY2hhbmdlZAogICAgIHRvIHVzZSB0aGUgbmV3IGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgUEVNX3JlYWQvUEVNX3dyaXRlIGZ1bmN0aW9ucyBpbiBjcnlwdG8vcGVtL3BlbV9hbGwuYwogICAgIHdpdGggbWFjcm9zLiBUaGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBjaGFuZ2UgdGhlaXIgZm9ybSwgYWRkIGV4dHJhCiAgICAgYXJndW1lbnRzIGV0Yy4gRml4IGEgZmV3IFBFTSBwcm90b3R5cGVzIHdoaWNoIGRpZG4ndCBoYXZlIGNpcGhlciBhcyBhCiAgICAgY29uc3RhbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRvIGNvbmZpZ3VyYXRpb24gdGFibGUgYSBuZXcgZW50cnkgdGhhdCBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZQogICAgIG5hbWUgZm9yIHVuaXN0ZC5oIChmb3IgcHJlLVBPU0lYIHN5c3RlbXMpOyB3ZSBuZWVkIHRoaXMgZm9yIE5lWFRzdGVwLAogICAgIGFjY29yZGluZyB0byBNYXJrIENyaXNwaW4gPE1SQ0BQYW5kYS5DT00+LgogICAgIFtCb2RvIE1vZWxsZXJdCgojaWYgMAogICopIERFUyBDQkMgZGlkIG5vdCB1cGRhdGUgdGhlIElWLiBXZWlyZC4KICAgICBbQmVuIExhdXJpZV0KI2Vsc2UKICAgICBkZXNfY2JjX2VuY3J5cHQgZG9lcyBub3QgdXBkYXRlIHRoZSBJViwgYnV0IGRlc19uY2JjX2VuY3J5cHQgZG9lcy4KICAgICBDaGFuZ2luZyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBmb3JtZXIgbWlnaHQgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgLS0KICAgICB3aGVyZSBJViB1cGRhdGluZyBpcyBuZWVkZWQsIGRlc19uY2JjX2VuY3J5cHQgY2FuIGJlIHVzZWQuCiNlbmRpZgoKICAqKSBXaGVuIGJudGVzdCBpcyBydW4gZnJvbSAibWFrZSB0ZXN0IiBpdCBkcml2ZXMgYmMgdG8gY2hlY2sgaXRzCiAgICAgY2FsY3VsYXRpb25zLCBhcyB3ZWxsIGFzIGludGVybmFsbHkgY2hlY2tpbmcgdGhlbS4gSWYgYW4gaW50ZXJuYWwgY2hlY2sKICAgICBmYWlscywgaXQgbmVlZHMgdG8gY2F1c2UgYmMgdG8gZ2l2ZSBhIG5vbi16ZXJvIHJlc3VsdCBvciBtYWtlIHRlc3QgY2FycmllcwogICAgIG9uIHdpdGhvdXQgbm90aWNpbmcgdGhlIGZhaWx1cmUuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBERVMgbGlicmFyeSBjbGVhbnVwcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIFBCRSBhbGdvcml0aG1zLiBUaGlzIHdpbGwgcGVybWl0IFBLQ1MjOCB0byBiZQogICAgIHVzZWQgd2l0aCBhbnkgY2lwaGVyIHVubGlrZSBQS0NTIzUgdjEuNSB3aGljaCBjYW4gYXQgbW9zdCBoYW5kbGUgNjQgYml0CiAgICAgY2lwaGVycy4gTk9URTogYWx0aG91Z2ggdGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkCiAgICAgYWdhaW5zdCBzb21lIHB1Ymxpc2hlZCB0ZXN0IHZlY3RvcnMgaXQgaGFzIG5vdCBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZAogICAgIHlldC4gQWRkZWQgYSAtdjIgImNpcGhlciIgb3B0aW9uIHRvIHBrY3M4IGFwcGxpY2F0aW9uIHRvIGFsbG93IHRoZSB1c2UKICAgICBvZiB2Mi4wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluc3RlYWQgb2YgIm1rZGlyIC1wIiwgd2hpY2ggaXMgbm90IGZ1bGx5IHBvcnRhYmxlLCB1c2UgbmV3CiAgICAgUGVybCBzY3JpcHQgInV0aWwvbWtkaXItcC5wbCIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSB0aGUgd2F5IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gKFBCRSkgaXMgaGFuZGxlZC4gSXQgdXNlZCB0bwogICAgIGFzc3VtZSB0aGF0IHRoZSBBU04xIEFsZ29yaXRobUlkZW50aWZpZXIgcGFyYW1ldGVyIHdhcyBhIFBCRVBhcmFtZXRlcgogICAgIHN0cnVjdHVyZS4gVGhpcyB3YXMgdHJ1ZSBmb3IgdGhlIFBLQ1MjNSB2MS41IGFuZCBQS0NTIzEyIFBCRSBhbGdvcml0aG1zCiAgICAgYnV0IGRvZXNuJ3QgYXBwbHkgdG8gUEtDUyM1IHYyLjAgd2hlcmUgaXQgY2FuIGJlIHNvbWV0aGluZyBlbHNlLiBOb3cKICAgICB0aGUgJ3BhcmFtZXRlcicgZmllbGQgb2YgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgaXMgcGFzc2VkIHRvIHRoZQogICAgIHVuZGVybHlpbmcga2V5IGdlbmVyYXRpb24gZnVuY3Rpb24gc28gaXQgbXVzdCBkbyBpdHMgb3duIEFTTjEgcGFyc2luZy4KICAgICBUaGlzIGhhcyBhbHNvIGNoYW5nZWQgdGhlIEVWUF9QQkVfQ2lwaGVySW5pdCgpIGZ1bmN0aW9uIHdoaWNoIG5vdyBoYXMgYQogICAgICdwYXJhbWV0ZXInIGFyZ3VtZW50IGluc3RlYWQgb2YgbGl0ZXJhbCBzYWx0IGFuZCBpdGVyYXRpb24gY291bnQgdmFsdWVzCiAgICAgYW5kIHRoZSBmdW5jdGlvbiBFVlBfUEJFX0FMR09SX0NpcGhlckluaXQoKSBoYXMgYmVlbiBkZWxldGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFBLQ1MjNSB2MS41IGNvbXBhdGlibGUgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBhbGdvcml0aG1zCiAgICAgYW5kIFBLQ1MjOCBmdW5jdGlvbmFsaXR5LiBOZXcgJ3BrY3M4JyBhcHBsaWNhdGlvbiBsaW5rZWQgdG8gb3BlbnNzbC4KICAgICBOZWVkZWQgdG8gY2hhbmdlIHRoZSBQRU1fU1RSSU5HX0VWUF9QS0VZIHZhbHVlIHdoaWNoIHdhcyBqdXN0ICJQUklWQVRFCiAgICAgS0VZIiBiZWNhdXNlIHRoaXMgY2xhc2hlZCB3aXRoIFBLQ1MjOCB1bmVuY3J5cHRlZCBzdHJpbmcuIFNpbmNlIHRoaXMKICAgICB2YWx1ZSB3YXMganVzdCB1c2VkIGFzIGEgIm1hZ2ljIHN0cmluZyIgYW5kIG5vdCB1c2VkIGRpcmVjdGx5IGl0cwogICAgIHZhbHVlIGRvZXNuJ3QgbWF0dGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSBzb21lIHNlbWJsYW5jZSBvZiBjb25zdCBjb3JyZWN0bmVzcyB0byBCTi4gU2hhbWUgQyBkb2Vzbid0CiAgICAgc3VwcG9ydCBtdXRhYmxlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSAibGludXgtc3BhcmM2NCIgY29uZmlndXJhdGlvbiAodWx0cmFwZW5ndWluKS4KICAgICBbUmF5IE1pbGxlciA8cmF5Lm1pbGxlckBvdWNzLm94LmFjLnVrPl0KICAgICAibGludXgtc3BhcmMiIGNvbmZpZ3VyYXRpb24uCiAgICAgW0NocmlzdGlhbiBGb3JzdGVyIDxmb0BoYXdvLnN0dy51bmktZXJsYW5nZW4uZGU+XQoKICAqKSBjb25maWcgbm93IGdlbmVyYXRlcyBuby14eHggb3B0aW9ucyBmb3IgbWlzc2luZyBjaXBoZXJzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCAod29yayBpbiBwcm9ncmVzcykuCiAgICAgRmlsZSBlYmNkaWMuYyBub3QgeWV0IGluY2x1ZGVkIGJlY2F1c2UgaXQgaGFzIGEgZGlmZmVyZW50IGxpY2Vuc2UuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBTdXBwb3J0IEJTMjAwMC9PU0QtUE9TSVguCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBNYWtlIGNhbGxiYWNrcyBmb3Iga2V5IGdlbmVyYXRpb24gdXNlIHZvaWQgKiBpbnN0ZWFkIG9mIGNoYXIgKi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBTL01JTUUgc2FtcGxlcyBjb21waWxlIChub3QgeWV0IHRlc3RlZCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZGl0aW9uYWwgdHlwZXNhZmUgc3RhY2tzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiB2YXJpYW50cyAiYnNkaS1lbGYtZ2NjIiAoQlNEL09TIDQueCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4zIGFuZCAwLjkuM2EgIFsyOSBNYXkgMTk5OV0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gdmFyaWFudCAic2NvNS1nY2MiLgoKICAqKSBVcGRhdGVkIHNvbWUgZGVtb3MuCiAgICAgW1NlYW4gTyBSaW9yZGFpbiwgV2FkZSBTY2hvbGluZV0KCiAgKikgQWRkIG1pc3NpbmcgQklPX2ZyZWUgYXQgZXhpdCBvZiBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1d1IFpoaWdhbmddCgogICopIEZpeCBtZW1vcnkgbGVhayBpbiBjb25mLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlcyBmb3IgV2luMzIgdG8gYXNzZW1ibGVyIHZlcnNpb24gb2YgTUQ1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNldCAjISBwYXRoIHRvIHBlcmwgaW4gYXBwcy9kZXJfY2hvcCB0byB3aGVyZSB3ZSBmb3VuZCBpdAogICAgIGluc3RlYWQgb2YgdXNpbmcgYSBmaXhlZCBwYXRoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNIQSBsaWJyYXJ5IGNoYW5nZXMgZm9yIGlyaXg2NC1taXBzNC1jYy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgSW1wcm92ZW1lbnRzIGZvciBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjJiIGFuZCAwLjkuMyAgWzI0IE1heSAxOTk5XQoKICAqKSBCaWdudW0gbGlicmFyeSBidWcgZml4LiBJUklYIDYgcGFzc2VzICJtYWtlIHRlc3QiIG5vdyEKICAgICBUaGlzIGFsc28gYXZvaWRzIHRoZSBwcm9ibGVtcyB3aXRoIFNDNC4yIGFuZCB1bnBhdGNoZWQgU0M1LiAgCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBza19udW0sIHNrX3ZhbHVlIGFuZCBza19zZXQgdG8gcmVwbGFjZSB0aGUgcHJldmlvdXMgbWFjcm9zLgogICAgIFRoZXNlIGFyZSByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSB0eXBlc2FmZSBzdGFjayB3b3VsZCBvdGhlcndpc2UgYnJlYWsgCiAgICAgZXhpc3RpbmcgY29kZS4gSWYgb2xkIGNvZGUgdXNlZCBhIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggdXNlZCB0byBiZSBTVEFDSwogICAgIGFuZCBpcyBub3cgU1RBQ0tfT0YgKGZvciBleGFtcGxlIGNlcnQgaW4gYSBQS0NTN19TSUdORUQgc3RydWN0dXJlKSB3aXRoCiAgICAgc2tfbnVtIG9yIHNrX3ZhbHVlIGl0IHdvdWxkIHByb2R1Y2UgYW4gZXJyb3IgYmVjYXVzZSB0aGUgbnVtLCBkYXRhIG1lbWJlcnMKICAgICBhcmUgbm90IHByZXNlbnQgaW4gU1RBQ0tfT0YuIE5vdyBpdCBqdXN0IHByb2R1Y2VzIGEgd2FybmluZy4gc2tfc2V0CiAgICAgcmVwbGFjZXMgdGhlIG9sZCBtZXRob2Qgb2YgYXNzaWduaW5nIGEgdmFsdWUgdG8gc2tfdmFsdWUKICAgICAoZS5nLiBza192YWx1ZSh4LCBpKSA9IHkpIHdoaWNoIHRoZSBsaWJyYXJ5IHVzZWQgaW4gYSBmZXcgY2FzZXMuIEFueSBjb2RlCiAgICAgdGhhdCBkb2VzIHRoaXMgd2lsbCBubyBsb25nZXIgd29yayAoYW5kIHNob3VsZCB1c2Ugc2tfc2V0IGluc3RlYWQpIGJ1dAogICAgIHRoaXMgY291bGQgYmUgcmVnYXJkZWQgYXMgYSAicXVlc3Rpb25hYmxlIiBiZWhhdmlvdXIgYW55d2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtb3N0IG9mIHRoZSBvdGhlciBQS0NTIzcgYnVncy4gVGhlICJleHBlcmltZW50YWwiIGNvZGUgY2FuIG5vdwogICAgIGNvcnJlY3RseSBoYW5kbGUgZW5jcnlwdGVkIFMvTUlNRSBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0eXBlIG9mIHZhcmlvdXMgREVTIGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIGRlc19jYmxvY2sKICAgICAod2hpY2ggbWVhbnMsIGluIGZ1bmN0aW9uIGFyZ3VtZW50IGRlY2xhcmF0aW9ucywgcG9pbnRlciB0byBjaGFyKQogICAgIHRvIGRlc19jYmxvY2sgKiAobWVhbmluZyBwb2ludGVyIHRvIGFycmF5IHdpdGggOCBjaGFyIGVsZW1lbnRzKSwKICAgICB3aGljaCBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGRvIG1vcmUgdHlwZWNoZWNraW5nOyBpdCB3YXMgbGlrZQogICAgIHRoYXQgYmFjayBpbiBTU0xlYXksIGJ1dCB3aXRoIGxvdHMgb2YgdWdseSBjYXN0cy4KCiAgICAgSW50cm9kdWNlIG5ldyB0eXBlIGNvbnN0X2Rlc19jYmxvY2suCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVvcmdhbmlzZSB0aGUgUEtDUyM3IGxpYnJhcnkgYW5kIGdldCByaWQgb2Ygc29tZSBvZiB0aGUgbW9yZSBvYnZpb3VzCiAgICAgcHJvYmxlbXM6IGZpbmQgUmVjaXBpZW50SW5mbyBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHJlY2lwaWVudCBjZXJ0aWZpY2F0ZQogICAgIGFuZCBpbml0aWFsaXNlIHRoZSBBU04xIHN0cnVjdHVyZXMgcHJvcGVybHkgYmFzZWQgb24gcGFzc2VkIGNpcGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZWxhdGVkbHkgbWFrZSB0aGUgQk4gdGVzdHMgYWN0dWFsbHkgY2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIG5lZ2F0aXZlIEFTTjEgSU5URUdFUlMgYW5kIGNvbnZlcnNpb24KICAgICB0byBhbmQgZnJvbSBCTnM6IGl0IHdhcyBjb21wbGV0ZWx5IGJyb2tlbi4gTmV3IGNvbXBpbGF0aW9uIG9wdGlvbgogICAgIE5FR19QVUJLRVlfQlVHIHRvIGFsbG93IGZvciBzb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgdGhhdCBlbmNvZGUgcHVibGljCiAgICAga2V5IGVsZW1lbnRzIGFzIG5lZ2F0aXZlIGludGVnZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pemUgYW5kIHNwZWVkIHVwIE1ENS4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPl0KCiAgKikgTmV3IG9wdGlvbiAtb3V0IHRvIGFzbjFwYXJzZSB0byBhbGxvdyB0aGUgcGFyc2VkIHN0cnVjdHVyZSB0byBiZQogICAgIG91dHB1dCB0byBhIGZpbGUuIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSAtc3RycGFyc2UKICAgICBvcHRpb24gdG8gZXhhbWluZSB0aGUgb3V0cHV0IG9mIHRoaW5ncyBsaWtlIE9DVEVUIFNUUklOR1MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBTU0wgbGlicmFyeSBhIGxpdHRsZSBtb3JlIGZvb2wtcHJvb2YgYnkgbm90IHJlcXVpcmluZyBhbnkgbG9uZ2VyCiAgICAgdGhhdCBTU0xfc2V0X3thY2NlcHQsY29ubmVjdH1fc3RhdGUgYmUgY2FsbGVkIGJlZm9yZQogICAgIFNTTF97YWNjZXB0LGNvbm5lY3R9IG1heSBiZSB1c2VkIChTU0xfc2V0Xy4uLl9zdGF0ZSBpcyBvbWl0dGVkCiAgICAgaW4gbWFueSBhcHBsaWNhdGlvbnMgYmVjYXVzZSB1c3VhbGx5IGV2ZXJ5dGhpbmcgKmFwcGVhcmVkKiB0byB3b3JrIGFzCiAgICAgaW50ZW5kZWQgYW55d2F5IC0tIG5vdyBpdCByZWFsbHkgd29ya3MgYXMgaW50ZW5kZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgb3BlbnNzbC5jbmYgb3V0IG9mIGxpYi8uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCB2YXJpb3VzIHRoaW5ncyB0byBsZXQgT3BlblNTTCBldmVuIHBhc3MgYGBlZ2NjIC1waXBlIC1PMiAtV2FsbAogICAgIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtV2Nhc3QtYWxpZ24gLVdtaXNzaW5nLXByb3RvdHlwZXMKICAgICAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbmVzdGVkLWV4dGVybnMgLVdpbmxpbmUnJyB3aXRoIEVHQ1MgMS4xLjIrIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHRoZSBFVlAgYW5kIFBLQ1MjNyBjb2RlLiBJdCBtYXkgbm93IGJlIGFibGUgdG8KICAgICBoYW5kbGUgUEtDUyM3IGVudmVsb3BlZCBkYXRhIHByb3Blcmx5LgogICAgIFtTZWJhc3RpYW4gQWtlcm1hbiA8c2FrQHBhcmFsbGVsY29uc3VsdGluZy5jb20+LCBtb2RpZmllZCBieSBTdGV2ZV0KCiAgKikgQ3JlYXRlIGEgZHVwbGljYXRlIG9mIHRoZSBTU0xfQ1RYJ3MgQ0VSVCBpbiBTU0xfbmV3IGluc3RlYWQgb2YKICAgICBjb3B5aW5nIHBvaW50ZXJzLiAgVGhlIGNlcnRfc3QgaGFuZGxpbmcgaXMgY2hhbmdlZCBieSB0aGlzIGluCiAgICAgdmFyaW91cyB3YXlzIChhbmQgdGh1cyB3aGF0IHVzZWQgdG8gYmUga25vd24gYXMgY3R4LT5kZWZhdWx0X2NlcnQKICAgICBpcyBub3cgY2FsbGVkIGN0eC0+Y2VydCwgc2luY2Ugd2UgZG9uJ3QgcmVzb3J0IHRvIHMtPmN0eC0+W2RlZmF1bHRfXWNlcnQKICAgICBhbnkgbG9uZ2VyIHdoZW4gcy0+Y2VydCBkb2VzIG5vdCBnaXZlIHVzIHdoYXQgd2UgbmVlZCkuCiAgICAgc3NsX2NlcnRfaW5zdGFudGlhdGUgYmVjb21lcyBvYnNvbGV0ZSBieSB0aGlzIGNoYW5nZS4KICAgICBBcyBzb29uIGFzIHdlJ3ZlIGdvdCB0aGUgbmV3IGNvZGUgcmlnaHQgKHBvc3NpYmx5IGl0IGFscmVhZHkgaXM/KSwKICAgICB3ZSBoYXZlIHNvbHZlZCBhIGNvdXBsZSBvZiBidWdzIG9mIHRoZSBlYXJsaWVyIGNvZGUgd2hlcmUgcy0+Y2VydAogICAgIHdhcyB1c2VkIGFzIGlmIGl0IGNvdWxkIG5vdCBoYXZlIGJlZW4gc2hhcmVkIHdpdGggb3RoZXIgU1NMIHN0cnVjdHVyZXMuCgogICAgIE5vdGUgdGhhdCB1c2luZyB0aGUgU1NMIEFQSSBpbiBjZXJ0YWluIGRpcnR5IHdheXMgbm93IHdpbGwgcmVzdWx0CiAgICAgaW4gZGlmZmVyZW50IGJlaGF2aW91ciB0aGFuIG9ic2VydmVkIHdpdGggZWFybGllciBsaWJyYXJ5IHZlcnNpb25zOgogICAgIENoYW5naW5nIHNldHRpbmdzIGZvciBhbiBTU0xfQ1RYICpjdHggYWZ0ZXIgaGF2aW5nIGRvbmUgcyA9IFNTTF9uZXcoY3R4KQogICAgIGRvZXMgbm90IGluZmx1ZW5jZSBzIGFzIGl0IHVzZWQgdG8uCiAgICAgCiAgICAgSW4gb3JkZXIgdG8gY2xlYW4gdXAgdGhpbmdzIG1vcmUgdGhvcm91Z2hseSwgaW5zaWRlIFNTTF9TRVNTSU9OCiAgICAgd2UgZG9uJ3QgdXNlIENFUlQgYW55IGxvbmdlciwgYnV0IGEgbmV3IHN0cnVjdHVyZSBTRVNTX0NFUlQKICAgICB0aGF0IGhvbGRzIHBlci1zZXNzaW9uIGRhdGEgKGlmIGF2YWlsYWJsZSk7IGN1cnJlbnRseSwgdGhpcyBpcwogICAgIHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgY2hhaW4gYW5kLCBmb3IgY2xpZW50cywgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlCiAgICAgYW5kIHRlbXBvcmFyeSBrZXkuICBDRVJUIGhvbGRzIG9ubHkgdGhvc2UgdmFsdWVzIHRoYXQgY2FuIGhhdmUKICAgICBtZWFuaW5nZnVsIGRlZmF1bHRzIGluIGFuIFNTTF9DVFguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlWM19FWFRfaTJkKCkgdG8gY3JlYXRlIGFuIFg1MDlfRVhURU5TSU9OIHN0cnVjdHVyZQogICAgIGZyb20gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBWYXJpb3VzIFBLQ1MjNyBmaXhlczogcmVtb3ZlIHNvbWUKICAgICBldmlsIGNhc3RzIGFuZCBzZXQgdGhlIGVuY19kaWdfYWxnIGZpZWxkIHByb3Blcmx5IGJhc2VkIG9uIHRoZSBzaWduaW5nCiAgICAga2V5IHR5cGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgUEtDUyMxMiBwYXNzd29yZCB0byBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHRoZQogICAgIGVudmlyb25tZW50LiBMZXQgJ2NhJyBnZXQgaXRzIGNvbmZpZyBmaWxlIG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQKICAgICB2YXJpYWJsZXMgIk9QRU5TU0xfQ09ORiIgb3IgIlNTTEVBWV9DT05GIiAoZm9yIGNvbnNpc3RlbmN5IHdpdGggJ3JlcScKICAgICBhbmQgJ3g1MDknKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBwb2xpY2llcyBleHRlbnNpb24gdG8gdXNlIGFuIElBNVNUUklORyBmb3IgdGhlCiAgICAgb3JnYW5pemF0aW9uIGZpZWxkLiBUaGlzIGlzIGNvbnRyYXJ5IHRvIHRoZSBQS0lYIGRlZmluaXRpb24gYnV0CiAgICAgVmVyaVNpZ24gdXNlcyBpdCBhbmQgSUU1IG9ubHkgcmVjb2duaXNlcyB0aGlzIGZvcm0uIERvY3VtZW50ICd4NTA5JwogICAgIGV4dGVuc2lvbiBvcHRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFBFREFOVElDIGNvbXBpbGVyIGZsYWcgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBnY2MgLXBlZGFudGljLAogICAgIHdpdGhvdXQgZGlzYWxsb3dpbmcgaW5saW5lIGFzc2VtYmxlciBhbmQgdGhlIGxpa2UgZm9yIG5vbi1wZWRhbnRpYyBidWlsZHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFN1cHBvcnQgQm9ybGFuZCBDKysgYnVpbGRlci4KICAgICBbSmFuZXogSmVyZSA8ampAdm9pZC5zaT4sIG1vZGlmaWVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgTWluZ3czMi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU0hBLTEgY2xlYW51cHMgYW5kIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cy4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBTcGFyYyB2OHBsdXMgYXNzZW1ibGVyIGZvciB0aGUgYmlnbnVtIGxpYnJhcnkuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgQWNjZXB0IGFueSAteHh4IGFuZCAreHh4IGNvbXBpbGVyIG9wdGlvbnMgaW4gQ29uZmlndXJlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBVcGRhdGUgSFBVWCBjb25maWd1cmF0aW9uLgogICAgIFtBbm9ueW1vdXNdCiAgCiAgKikgQWRkIG1pc3Npbmcgc2tfPHR5cGU+X3Vuc2hpZnQoKSBmdW5jdGlvbiB0byBzYWZlc3RhY2suaAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSB0aGF0IHNldHMgdGhlCiAgICAgImV4dHJhX2NlcnQicyBpbiBhZGRpdGlvbiB0byB0aGUgY2VydGlmaWNhdGUuICAoVGhpcyBtYWtlcyBzZW5zZQogICAgIG9ubHkgZm9yICJQRU0iIGZvcm1hdCBmaWxlcywgYXMgY2hhaW5zIGFzIGEgd2hvbGUgYXJlIG5vdAogICAgIERFUi1lbmNvZGVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IHZlcmlmeV9kZXB0aCBmcm9tIHRoZSBTU0wgQVBJLgogICAgIHg1MDlfdmZ5LmMgaGFkIHdoYXQgY2FuIGJlIGNvbnNpZGVyZWQgYW4gb2ZmLWJ5LW9uZS1lcnJvcjoKICAgICBJdHMgZGVwdGggKHdoaWNoIHdhcyBub3QgcGFydCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlKQogICAgIHdhcyBhY3R1YWxseSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGNlcnRpZmljYXRlcyBpbiBhIGNoYWluOwogICAgIG5vdyBpdCByZWFsbHkgY291bnRzIHRoZSBkZXB0aC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXggaW4gY3J5cHRvL3g1MDkveDUwOV9jbXAuYzogVGhlIFNTTGVyciBtYWNybyB3YXMgdXNlZAogICAgIGluc3RlYWQgb2YgWDUwOWVyciwgd2hpY2ggb2Z0ZW4gcmVzdWx0ZWQgaW4gY29uZnVzaW5nIGVycm9yCiAgICAgbWVzc2FnZXMgc2luY2UgdGhlIGVycm9yIGNvZGVzIGFyZSBub3QgZ2xvYmFsbHkgdW5pcXVlCiAgICAgKGUuZy4gYW4gYWxsZWdlZCBlcnJvciBpbiBzc2wzX2FjY2VwdCB3aGVuIGEgY2VydGlmaWNhdGUKICAgICBkaWRuJ3QgbWF0Y2ggdGhlIHByaXZhdGUga2V5KS4KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCB0aGF0IGFsbG93cyB0byBzZXQgYSBkZWZhdWx0CiAgICAgdmFsdWUgKHNvIHRoYXQgeW91IGRvbid0IG5lZWQgU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQgZm9yIGVhY2gKICAgICBjb25uZWN0aW9uIHVzaW5nIHRoZSBTU0xfQ1RYKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPQUVQIGRlY29kaW5nIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgSU5TVEFMTF9QUkVGSVggZm9yIHBhY2thZ2UgYnVpbGRlcnMsIGFzIHByb3Bvc2VkIGJ5CiAgICAgRGF2aWQgSGFycmlzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9ucyAidGhyZWFkcyIgYW5kICJuby10aHJlYWRzIi4gIEZvciBzeXN0ZW1zCiAgICAgd2hlcmUgdGhlIHByb3BlciBjb21waWxlciBvcHRpb25zIGFyZSBrbm93biAoY3VycmVudGx5IFNvbGFyaXMKICAgICBhbmQgTGludXgpLCAidGhyZWFkcyIgaXMgdGhlIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IHNjcmlwdCB1dGlsL21rbGluay5wbCBhcyBhIGZhc3RlciBzdWJzdGl0dXRlIGZvciB1dGlsL21rbGluay5zaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnN0YWxsIHZhcmlvdXMgc2NyaXB0cyB0byAkKE9QRU5TU0xESVIpL21pc2MsIG5vdCB0bwogICAgICQoSU5TVEFMTFRPUCkvYmluIC0tIHRoZXkgc2hvdWxkbid0IGNsdXR0ZXIgZGlyZWN0b3JpZXMKICAgICBzdWNoIGFzIC91c3IvbG9jYWwvYmluLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopICJtYWtlIGxpbnV4LXNoYXJlZCIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KICAgICBbTmllbHMgUG9wcGUgPG5pZWxzQG5ldGJveC5vcmc+XQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiBuby08Y2lwaGVyPiAocnNhLCBpZGVhLCByYzUsIC4uLikuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCB0aGUgUEtDUyMxMiBBUEkgZG9jdW1lbnRhdGlvbiB0byBvcGVuc3NsLnR4dC4gUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IKICAgICBleHRlbnNpb24gYWRkaW5nIGluIHg1MDkgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgTk9QUk9UTyBzZWN0aW9ucyBhbmQgZXJyb3IgY29kZSBjb21tZW50cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUGFydGlhbCByZXdyaXRlIG9mIHRoZSBERUYgZmlsZSBnZW5lcmF0b3IgdG8gbm93IHBhcnNlIHRoZSBBTlNJCiAgICAgcHJvdG90eXBlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbnMgLS1wcmVmaXg9RElSIGFuZCAtLW9wZW5zc2xkaXI9RElSLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBlcnJvciBjb2RlIHNjcmlwdChzKS4gSXQgaXMgYWxsIG5vdyBoYW5kbGVkCiAgICAgYnkgb25lIHNjcmlwdCBhdCB0aGUgdG9wIGxldmVsIHdoaWNoIGhhbmRsZXMgZXJyb3IgY29kZSBnYXRoZXJpbmcsCiAgICAgaGVhZGVyIHJld3JpdGluZyBhbmQgQyBzb3VyY2UgZmlsZSBnZW5lcmF0aW9uLiBJdCBzaG91bGQgYmUgbXVjaCBiZXR0ZXIKICAgICB0aGFuIHRoZSBvbGQgbWV0aG9kOiBpdCBub3cgdXNlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgVWxmJ3MgcGFyc2VyIHRvCiAgICAgcmVhZCB0aGUgQU5TSSBwcm90b3R5cGVzIGluIGFsbCBoZWFkZXIgZmlsZXMgKHRodXMgdGhlIG9sZCBLJlIgZGVmaW5pdGlvbnMKICAgICBhcmVuJ3QgbmVlZGVkIGZvciBlcnJvciBjcmVhdGlvbiBhbnkgbW9yZSkgYW5kIGRvIGEgYmV0dGVyIGpvYiBvZgogICAgIHRyYW5zbGF0aW5nIGZ1bmN0aW9uIGNvZGVzIGludG8gbmFtZXMuIFRoZSBvbGQgJ0FTTjEgZXJyb3IgY29kZSBpbWJlZGRlZAogICAgIGluIGEgY29tbWVudCcgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBhbmQgaXQgZG9lc24ndCB1c2UgLmVyciBmaWxlcyB3aGljaAogICAgIGhhdmUgbm93IGJlZW4gZGVsZXRlZC4gQWxzbyB0aGUgZXJyb3IgY29kZSBjYWxsIGRvZXNuJ3QgaGF2ZSB0byBhcHBlYXIgYWxsCiAgICAgb24gb25lIGxpbmUgKHdoaWNoIHJlc3VsdGVkIGluIHNvbWUgbGFyZ2UgbGluZXMuLi4pLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSAjaW5jbHVkZSBmaWxlbmFtZXMgZnJvbSA8Zm9vLmg+IHRvIDxvcGVuc3NsL2Zvby5oPi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgYmVoYXZpb3VyIG9mIHNzbDJfcmVhZCB3aGVuIGZhY2luZyBsZW5ndGgtMCBwYWNrZXRzOiBEb24ndCByZXR1cm4KICAgICAwICh3aGljaCB1c3VhbGx5IGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uKSwgYnV0IGNvbnRpbnVlIHJlYWRpbmcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNvbWUgcmFjZSBjb25kaXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBleHRlbnNpb24uIEFkZCBDZXJ0aWZpY2F0ZQogICAgIFBvbGljaWVzIGFuZCBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBkb2N1bWVudGF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdGhlIGF1dG9nZW5lcmF0ZWQgaGVhZGVyIGZpbGUgcGFydHMgdG8gY3J5cHRvL29wZW5zc2xjb25mLmguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBuZXcgNTYtYml0IERFUyBleHBvcnQgY2lwaGVyc3VpdGVzOiB0aGV5IHdlcmUgdXNpbmcgNyBieXRlcyBpbnN0ZWFkIG9mCiAgICAgOCBvZiBrZXlpbmcgbWF0ZXJpYWwuIE1lcmxpbiBoYXMgYWxzbyBjb25maXJtZWQgaW50ZXJvcCB3aXRoIHRoaXMgZml4CiAgICAgYmV0d2VlbiBPcGVuU1NMIGFuZCBCYWx0aW1vcmUgQy9TU0wgMi4wIGFuZCBKL1NTTCAyLjAuCiAgICAgW01lcmxpbiBIdWdoZXMgPG1lcmxpbkBiYWx0aW1vcmUuaWU+XQoKICAqKSBGaXggbG90cyBvZiB3YXJuaW5ncy4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEluIGFkZF9jZXJ0X2RpcigpIGluIGNyeXB0by94NTA5L2J5X2Rpci5jLCBicmVhayBvdXQgb2YgdGhlIGxvb3AgaWYKICAgICB0aGUgZGlyZWN0b3J5IHNwZWMgZGlkbid0IGVuZCB3aXRoIGEgTElTVF9TRVBBUkFUT1JfQ0hBUi4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEZpeCBwcm9ibGVtcyB3aXRoIHNpemVvZihsb25nKSA9PSA4LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIENoYW5nZSBmdW5jdGlvbnMgdG8gQU5TSSBDLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggdHlwb3MgaW4gZXJyb3IgY29kZXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+LCBVbGYgTfZsbGVyXQoKICAqKSBSZW1vdmUgZGVmdW5jdCBhc3NlbWJsZXIgZmlsZXMgZnJvbSBDb25maWd1cmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNQQVJDIHY4IGFzc2VtYmxlciBCSUdOVU0gaW1wbGVtZW50YXRpb24uCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgU3VwcG9ydCBmb3IgQ2VydGlmaWNhdGUgUG9saWNpZXMgZXh0ZW5zaW9uOiBib3RoIHByaW50IGFuZCBzZXQuCiAgICAgVmFyaW91cyBhZGRpdGlvbnMgdG8gc3VwcG9ydCB0aGUgcjJpIG1ldGhvZCB0aGlzIHVzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQSBsb3Qgb2YgY29uc3RpZmljYXRpb24sIGFuZCBmaXggYSBidWcgaW4gWDUwOV9OQU1FX29uZWxpbmUoKSB0aGF0IGNvdWxkCiAgICAgcmV0dXJuIGEgY29uc3Qgc3RyaW5nIHdoZW4geW91IGFyZSBleHBlY3RpbmcgYW4gYWxsb2NhdGVkIGJ1ZmZlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEFTTjEgdHlwZXMgVVRGOFN0cmluZyBhbmQgVklTSUJMRVNUUklORywgYWxzbyB0aGUgQ0hPSUNFCiAgICAgdHlwZXMgRGlyZWN0b3J5U3RyaW5nIGFuZCBEaXNwbGF5VGV4dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29kZSB0byBhbGxvdyByMmkgZXh0ZW5zaW9ucyB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UsCiAgICAgYWRkIGFuIExIQVNIIGRhdGFiYXNlIGRyaXZlciBhbmQgYWRkIHNldmVyYWwgY3R4IGhlbHBlciBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGFuIGV2aWwgYnVnIGluIGJuX2V4cGFuZDIoKSB3aGljaCBjYXVzZWQgdmFyaW91cyBCTiBmdW5jdGlvbnMgdG8KICAgICBmYWlsIHdoZW4gdGhleSBleHRlbmRlZCB0aGUgc2l6ZSBvZiBhIEJJR05VTS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBTWE5ldCBleHRlbnNpb24uIE1vZGlmeSBta2RlZi5wbCB0bwogICAgIHN1cHBvcnQgdHlwZXNhZmUgc3RhY2suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHR5cG8gaW4gU1NMX1tnc11ldF9vcHRpb25zKCkuCiAgICAgW05pbHMgRnJvc3RiZXJnIDxuaWxzQG1lZGNvbS5zZT5dCgogICopIERlbGV0ZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgZmlsZXMgdGhhdCBiZWxvbmdlZCB0byB0aGUgKG5vdyBvYnNvbGV0ZSkKICAgICBvbGQgWDUwOVYzIGhhbmRsaW5nIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb24gInJzYXJlZiIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERvbid0IGF1dG8tZ2VuZXJhdGUgcGVtLmguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlIHR5cGUtc2FmZSBBU04uMSBTRVRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb252ZXJ0IHZhcmlvdXMgYWRkaXRpb25hbCBjYXN0ZWQgc3RhY2tzIHRvIHR5cGUtc2FmZSBTVEFDS19PRigpIHZhcmlhbnRzLgogICAgIFtCZW4gTGF1cmllLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSB0eXBlLXNhZmUgU1RBQ0tzLiBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhayBsb3RzIG9mIGNvZGUKICAgICB0aGF0IGxpbmtzIHdpdGggT3BlblNTTCAod2VsbCBhdCBsZWFzdCBjYXVzZSBsb3RzIG9mIHdhcm5pbmdzKSwgYnV0IGZlYXIKICAgICBub3Q6IHRoZSBjb252ZXJzaW9uIGlzIHRyaXZpYWwsIGFuZCBpdCBlbGltaW5hdGVzIGxvYWRzIG9mIGV2aWwgY2FzdHMuIEEKICAgICBmZXcgU1RBQ0tlZCB0aGluZ3MgaGF2ZSBiZWVuIGNvbnZlcnRlZCBhbHJlYWR5LiBGZWVsIGZyZWUgdG8gY29udmVydCBtb3JlLgogICAgIEluIHRoZSBmdWxsbmVzcyBvZiB0aW1lLCBJJ2xsIGRvIGF3YXkgd2l0aCB0aGUgU1RBQ0sgdHlwZSBhbHRvZ2V0aGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYG9wZW5zc2wgY2EgLXJldm9rZSA8Y2VydGZpbGU+JyBmYWNpbGl0eSB3aGljaCByZXZva2VzIGEgY2VydGlmaWNhdGUKICAgICBzcGVjaWZpZWQgaW4gPGNlcnRmaWxlPiBieSB1cGRhdGluZyB0aGUgZW50cnkgaW4gdGhlIGluZGV4LnR4dCBmaWxlLgogICAgIFRoaXMgd2F5IG9uZSBubyBsb25nZXIgaGFzIHRvIGVkaXQgdGhlIGluZGV4LnR4dCBmaWxlIG1hbnVhbGx5IGZvcgogICAgIHJldm9raW5nIGEgY2VydGlmaWNhdGUuIFRoZSAtcmV2b2tlIG9wdGlvbiBkb2VzIHRoZSBnb3J5IGRldGFpbHMgbm93LgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBvcGVuY2Eub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGBvcGVuc3NsIGNybCAtbm9vdXQgLXRleHQnIGNvbWJpbmF0aW9uIHdoZXJlIGAtbm9vdXQnIGtpbGxlZCB0aGUKICAgICBgLXRleHQnIG9wdGlvbiBhdCBhbGwgYW5kIHRoaXMgd2F5IHRoZSBgLW5vb3V0IC10ZXh0JyBjb21iaW5hdGlvbiB3YXMKICAgICBpbmNvbnNpc3RlbnQgaW4gYG9wZW5zc2wgY3JsJyB3aXRoIHRoZSBmcmllbmRzIGluIGBvcGVuc3NsIHg1MDl8cnNhfGRzYScuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2Ugc3VyZSBhIGNvcnJlc3BvbmRpbmcgcGxhaW4gdGV4dCBlcnJvciBtZXNzYWdlIGV4aXN0cyBmb3IgdGhlCiAgICAgWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQvMjMgZXJyb3IgbnVtYmVyIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGEKICAgICB2ZXJpZnkgY2FsbGJhY2sgZnVuY3Rpb24gZGV0ZXJtaW5lZCB0aGF0IGEgY2VydGlmaWNhdGUgd2FzIHJldm9rZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEJ1Z2ZpeDogSW4gdGVzdC90ZXN0ZW5jLCBkb24ndCB0ZXN0ICJvcGVuc3NsIDxjaXBoZXI+IiBmb3IKICAgICBjaXBoZXJzIHRoYXQgd2VyZSBleGNsdWRlZCwgZS5nLiBieSAtRE5PX0lERUEuICBBbHNvLCB0ZXN0CiAgICAgYWxsIGF2YWlsYWJsZSBjaXBlcnMgaW5jbHVkaW5nIHJjNSwgd2hpY2ggd2FzIGZvcmdvdHRlbiB1bnRpbCBub3cuCiAgICAgSW4gb3JkZXIgdG8gbGV0IHRoZSB0ZXN0aW5nIHNoZWxsIHNjcmlwdCBrbm93IHdoaWNoIGFsZ29yaXRobXMKICAgICBhcmUgYXZhaWxhYmxlLCBhIG5ldyAodXAgdG8gbm93IHVuZG9jdW1lbnRlZCkgY29tbWFuZAogICAgICJvcGVuc3NsIGxpc3QtY2lwaGVyLWNvbW1hbmRzIiBpcyB1c2VkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogc19jbGllbnQgb2NjYXNpb25hbGx5IHdvdWxkIHNsZWVwIGluIHNlbGVjdCgpIHdoZW4KICAgICBpdCBzaG91bGQgaGF2ZSBjaGVja2VkIFNTTF9wZW5kaW5nKCkgZmlyc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBEU0FfZG9fc2lnbiBhbmQgRFNBX2RvX3ZlcmlmeSB0byBwcm92aWRlIGFjY2VzcyB0bwogICAgIHRoZSByYXcgRFNBIHZhbHVlcyBwcmlvciB0byBBU04uMSBlbmNvZGluZy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgVHdlYWtzIHRvIENvbmZpZ3VyZQogICAgIFtOaWVscyBQb3BwZSA8bmllbHNAbmV0Ym94Lm9yZz5dCgogICopIEFkZCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBBU04xIFBCRVMyIHN0cnVjdHVyZXMuIE5vIG90aGVyIHN1cHBvcnQsCiAgICAgeWV0Li4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHZhcmlhYmxlcyAkKFJBTkxJQikgYW5kICQoUEVSTCkgaW4gdGhlIE1ha2VmaWxlcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IGNvbmZpZyBvcHRpb24gdG8gYXZvaWQgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGlsbGVnYWwgb24gdGhlIDgwMzg2LgogICAgIFRoZSBkZWZhdWx0IGNvZGUgaXMgZmFzdGVyLCBidXQgcmVxdWlyZXMgYXQgbGVhc3QgYSA0ODYuCiAgICAgW1VsZiBN9mxsZXJdCiAgCiAgKikgR290IHJpZCBvZiBvbGQgU1NMMl9DTElFTlRfVkVSU0lPTiAoaW5jb25zaXN0ZW50bHkgdXNlZCkgYW5kCiAgICAgU1NMMl9TRVJWRVJfVkVSU0lPTiAobm90IHVzZWQgYXQgYWxsKSBtYWNyb3MsIHdoaWNoIGFyZSBub3cgdGhlCiAgICAgc2FtZSBhcyBTU0wyX1ZFUlNJT04gYW55d2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiLXNob3djZXJ0cyIgb3B0aW9uIGZvciBzX2NsaWVudC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdGlsbCBtb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBwa2NzMTIgYXBwbGljYXRpb24gdG8gb3BlbnNzbAogICAgIGFwcGxpY2F0aW9uLiBWYXJpb3VzIGNsZWFudXBzIGFuZCBmaXhlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBuZXcgcGtjczEyIGRpcmVjdG9yeSB3aXRoIE1ha2VmaWxlLnNzbCBhbmQKICAgICBtb2RpZnkgZXJyb3Igcm91dGluZXMgdG8gd29yayBpbnRlcm5hbGx5LiBBZGQgZXJyb3IgY29kZXMgYW5kIFBCRSBpbml0CiAgICAgdG8gbGlicmFyeSBzdGFydHVwIHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1cnRoZXIgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkZWQgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiwgUEtDUyM4IGFuZAogICAgIHBhY2tpbmcgZnVuY3Rpb25zIHRvIGFzbjEgYW5kIGV2cC4gQ2hhbmdlZCBmdW5jdGlvbiBuYW1lcyBhbmQgZXJyb3IKICAgICBjb2RlcyBhbG9uZyB0aGUgd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBLQ1MxMiBpbnRlZ3JhdGlvbjogYW5kIHNvIGl0IGJlZ2lucy4uLiBGaXJzdCBvZiBzZXZlcmFsIHBhdGNoZXMgdG8KICAgICBzbG93bHkgaW50ZWdyYXRlIFBLQ1MjMTIgZnVuY3Rpb25hbGl0eSBpbnRvIE9wZW5TU0wuIEFkZCBQS0NTIzEyCiAgICAgb2JqZWN0cyB0byBvYmplY3RzLmgKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgJ2luZGVudCcgb3B0aW9uIHRvIHNvbWUgWDUwOVYzIGV4dGVuc2lvbiBjb2RlLiBJbml0aWFsIEFTTjEKICAgICBhbmQgZGlzcGxheSBzdXBwb3J0IGZvciBUaGF3dGUgc3Ryb25nIGV4dHJhbmV0IGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgTGludXhQUEMgc3VwcG9ydC4KICAgICBbSmVmZiBEdWJydWxlIDxpZ29yQHBvYm94Lm9yZz5dCgogICopIEdldCByaWQgb2YgcmVkdW5kYW50IEJOIGZpbGUgYm5fbXVsdy5jLCBhbmQgcmVuYW1lIGJuX2RpdjY0IHRvCiAgICAgYm5fZGl2X3dvcmRzIGluIGFscGhhLnMuCiAgICAgW0hhbm5lcyBSZWluZWNrZSA8SC5SZWluZWNrZUBody5hYy51az4gYW5kIEJlbiBMYXVyaWVdCgogICopIE1ha2Ugc3VyZSB0aGUgUlNBIE9BRVAgdGVzdCBpcyBza2lwcGVkIHVuZGVyIC1EUlNBcmVmIGJlY2F1c2UKICAgICBPQUVQIGlzbid0IHN1cHBvcnRlZCB3aGVuIE9wZW5TU0wgaXMgYnVpbHQgd2l0aCBSU0FyZWYuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBNb3ZlIGRlZmluaXRpb25zIG9mIElTX1NFVC9JU19TRVFVRU5DRSBpbnNpZGUgY3J5cHRvL2FzbjEvYXNuMS5oIAogICAgIHNvIHRoZXkgbm8gbG9uZ2VyIGFyZSBtaXNzaW5nIHVuZGVyIC1ETk9QUk9UTy4gCiAgICAgW1NvcmVuIFMuIEpvcnZhbmcgPHNvcmVuQHQuZGs+XQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjFjIGFuZCAwLjkuMmIgIFsyMiBNYXIgMTk5OV0KCiAgKikgTWFrZSBTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbigpIHdvcmsgaW4gc2VydmVycy4gVW5mb3J0dW5hdGVseSwgaXQgc3RpbGwKICAgICBkb2Vzbid0IHdvcmsgd2hlbiB0aGUgc2Vzc2lvbiBpcyByZXVzZWQuIENvbWluZyBzb29uIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYSBzZWN1cml0eSBob2xlLCB0aGF0IGFsbG93cyBzZXNzaW9ucyB0byBiZSByZXVzZWQgaW4gdGhlIHdyb25nCiAgICAgY29udGV4dCB0aHVzIGJ5cGFzc2luZyBjbGllbnQgY2VydCBwcm90ZWN0aW9uISBBbGwgc29mdHdhcmUgdGhhdCB1c2VzCiAgICAgY2xpZW50IGNlcnRzIGFuZCBzZXNzaW9uIGNhY2hlcyBpbiBtdWx0aXBsZSBjb250ZXh0cyBORUVEUyBQQVRDSElORyB0bwogICAgIGFsbG93IHNlc3Npb24gcmV1c2UhIEEgZnVsbGVyIHNvbHV0aW9uIGlzIGluIHRoZSB3b3Jrcy4KICAgICBbQmVuIExhdXJpZSwgcHJvYmxlbSBwb2ludGVkIG91dCBieSBIb2xnZXIgUmVpZiwgQm9kbyBNb2VsbGVyIChhbmQgPz8/KV0KCiAgKikgU29tZSBtb3JlIHNvdXJjZSB0cmVlIGNsZWFudXBzIChyZW1vdmVkIG9ic29sZXRlIGZpbGVzCiAgICAgY3J5cHRvL2JmL2FzbS9iZjU4Ni5wbCwgdGVzdC90ZXN0LnR4dCBhbmQgY3J5cHRvL3NoYS9hc20vZi5zOyBjaGFuZ2VkCiAgICAgcGVybWlzc2lvbiBvbiAiY29uZmlnIiBzY3JpcHQgdG8gYmUgZXhlY3V0YWJsZSkgYW5kIGEgZml4IGZvciB0aGUgSU5TVEFMTAogICAgIGRvY3VtZW50LgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgUmVtb3ZlIHNvbWUgbGVnYWN5IGFuZCBlcnJvbmVvdXMgdXNlcyBvZiBtYWxsb2MsIGZyZWUgaW5zdGVhZCBvZgogICAgIE1hbGxvYywgRnJlZS4KICAgICBbTGVubmFydCBCYW5nIDxsb2JAbmV0c3RyZWFtLnNlPiwgd2l0aCBtaW5vciBjaGFuZ2VzIGJ5IFN0ZXZlXQoKICAqKSBNYWtlIHJzYV9vYWVwX3Rlc3QgcmV0dXJuIG5vbi16ZXJvIG9uIGVycm9yLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBTb2xhcmlzIHNoYXJlZCBsaWJyYXJpZXMuIENvbmZpZ3VyZQogICAgIHNvbGFyaXMtc3BhcmMtc2M0LXBpYywgbWFrZSwgdGhlbiBydW4gc2hsaWIvc29sYXJpcy1zYzQuc2guIEl0J2QgYmUgbmljZQogICAgIGlmIHNvbWVvbmUgd291bGQgbWFrZSB0aGF0IGxhc3Qgc3RlcCBhdXRvbWF0aWMuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQEFkTm92dW0uQ0g+XQoKICAqKSBjdHhfc2l6ZSB3YXMgbm90IGJ1aWx0IHdpdGggdGhlIHJpZ2h0IGNvbXBpbGVyIGR1cmluZyAibWFrZSBsaW5rcyIuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgdGhlIG1lYW5pbmcgb2YgJ0FMTCcgaW4gdGhlIGNpcGhlciBsaXN0LiBJdCBub3cgbWVhbnMgImV2ZXJ5dGhpbmcKICAgICBleGNlcHQgTlVMTCBjaXBoZXJzIi4gVGhpcyBtZWFucyB0aGUgZGVmYXVsdCBjaXBoZXIgbGlzdCB3aWxsIG5vIGxvbmdlcgogICAgIGVuYWJsZSBOVUxMIGNpcGhlcnMuIFRoZXkgbmVlZCB0byBiZSBzcGVjaWZpY2FsbHkgZW5hYmxlZCBlLmcuIHdpdGgKICAgICB0aGUgc3RyaW5nICJERUZBVUxUOmVOVUxMIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdG8gUlNBIHByaXZhdGUgZW5jcnlwdGlvbiByb3V0aW5lczogaWYgcCA8IHEgdGhlbiBpdCB3b3VsZAogICAgIG9jY2FzaW9uYWxseSBwcm9kdWNlIGFuIGludmFsaWQgcmVzdWx0LiBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2l0aAogICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGtleXMgYmVjYXVzZSBPcGVuU1NMIChhbmQgU1NMZWF5KSBlbnN1cmUgcCA+IHEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmUgbGVzcyByZXN0cmljdGl2ZSBhbmQgYWxsb3cgYWxzbyBgcGVybCB1dGlsL3BlcmxwYXRoLnBsCiAgICAgL3BhdGgvdG8vYmluL3BlcmwnIGluIGFkZGl0aW9uIHRvIGBwZXJsIHV0aWwvcGVybHBhdGgucGwgL3BhdGgvdG8vYmluJywKICAgICBiZWNhdXNlIHRoaXMgd2F5IG9uZSBjYW4gYWxzbyB1c2UgYW4gaW50ZXJwcmV0ZXIgbmFtZWQgYHBlcmw1JyAod2hpY2ggaXMKICAgICB1c3VhbGx5IHRoZSBuYW1lIG9mIFBlcmwgNS54eHggb24gcGxhdGZvcm1zIHdoZXJlIGFuIFBlcmwgNC54IGlzIHN0aWxsCiAgICAgaW5zdGFsbGVkIGFzIGBwZXJsJykuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBMZXQgdXRpbC9jbGVhbi1kZXBlbmQucGwgd29yayBhbHNvIHdpdGggb2xkZXIgUGVybCA1LjAweCB2ZXJzaW9ucy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIEZpeCBNYWtlZmlsZS5vcmcgc28gQ0MsQ0ZMQUcgZXRjIGFyZSBwYXNzZWQgdG8gJ21ha2UgbGlua3MnIGFkZAogICAgIGFkdmFwaTMyLmxpYiB0byBXaW4zMiBidWlsZCBhbmQgY2hhbmdlIHRoZSBwZW0gdGVzdCBjb21wYXJpc2lvbgogICAgIHRvIGZjLmV4ZSAodGhhbmtzIHRvIFVscmljaCBLcm9lbmVyIDxrcm9uZXJ1QHlhaG9vLmNvbT4gZm9yIHRoZQogICAgIHN1Z2dlc3Rpb24pLiBGaXggbWlzcGxhY2VkIEFTTkkgcHJvdG90eXBlcyBhbmQgZGVjbGFyYXRpb25zIGluIGV2cC5oCiAgICAgYW5kIGNyeXB0by9kZXMvZWRlX2NiY21fZW5jLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgREVTIHF1YWQgY2hlY2tzdW0gd2FzIGJyb2tlbiBvbiBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb21tZW50IG91dCB0d28gZnVuY3Rpb25zIGluIGJpby5oIHRoYXQgYXJlbid0IGltcGxlbWVudGVkLiBGaXggdXAgdGhlCiAgICAgV2luMzIgdGVzdCBiYXRjaCBmaWxlIHNvIGl0IChtaWdodCkgd29yayBhZ2Fpbi4gVGhlIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZQogICAgIGlzIGhvcnJpYmxlOiBJIGZlZWwgaWxsLi4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdmFyaW91cyAjaWZkZWZzIGFyb3VuZCBzbyBOT19TWVNMT0csIE5PX0RJUkVOVCBldGMgYXJlIG5vdyBzZWxlY3RlZAogICAgIGluIGVfb3MuaC4gQXVkaXQgb2YgaGVhZGVyIGZpbGVzIHRvIGNoZWNrIEFOU0kgYW5kIG5vbiBBTlNJCiAgICAgc2VjdGlvbnM6IDEwIGZ1bmN0aW9ucyB3ZXJlIGFic2VudCBmcm9tIG5vbiBBTlNJIHNlY3Rpb24gYW5kIG5vdCBleHBvcnRlZAogICAgIGZyb20gV2luZG93cyBETExzLiBGaXhlZCB1cCBsaWJlYXkubnVtIGZvciBuZXcgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYG9wZW5zc2wgdmVyc2lvbicgb3V0cHV0IGxpbmVzIGNvbnNpc3RlbnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBXaW4zMiBzeW1ib2wgZXhwb3J0IGxpc3RzIGZvciBCSU8gZnVuY3Rpb25zOiBBZGRlZAogICAgIEJJT19nZXRfZXhfbmV3X2luZGV4LCBCSU9fZ2V0X2V4X251bSwgQklPX2dldF9leF9kYXRhIGFuZCBCSU9fc2V0X2V4X2RhdGEKICAgICB0byBtcy9saWJlYXl7MTYsMzJ9LmRlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU2Vjb25kIHJvdW5kIG9mIGZpeGluZyB0aGUgT3BlblNTTCBwZXJsLyBzdHVmZi4gSXQgbm93IGF0IGxlYXN0IGNvbXBpbGVkCiAgICAgZmluZSB1bmRlciBVbml4IGFuZCBwYXNzZXMgc29tZSB0cml2aWFsIHRlc3RzIEkndmUgbm93IGFkZGVkLiBCdXQgdGhlCiAgICAgd2hvbGUgc3R1ZmYgaXMgaG9ycmlibHkgaW5jb21wbGV0ZSwgc28gYSBSRUFETUUuMVNUIHdpdGggYSBkaXNjbGFpbWVyIHdhcwogICAgIGFkZGVkIHRvIG1ha2Ugc3VyZSBubyBvbmUgZXhwZWN0cyB0aGF0IHRoaXMgc3R1ZmYgcmVhbGx5IHdvcmtzIGluIHRoZQogICAgIE9wZW5TU0wgMC45LjIgcmVsZWFzZS4gIEFkZGl0aW9uYWxseSBJJ3ZlIHN0YXJ0ZWQgdG8gY2xlYW4gdGhlIFhTIHNvdXJjZXMKICAgICB1cCBhbmQgZml4ZWQgYSBmZXcgbGl0dGxlIGJ1Z3MgYW5kIGluY29uc2lzdGVuY2llcyBpbiBPcGVuU1NMLntwbSx4c30gYW5kCiAgICAgb3BlbnNzbF9iaW8ueHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgZ2VuZXJhdGlvbiBvZiB0d28gcGFydCBhZGRyZXNzZXMgaW4gcGVybC4KICAgICBbS2VuamkgTWl5YWtlIDxrZW5qaUBtaXlha2Uub3JnPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgY29uZmlnIGVudHJ5IGZvciBMaW51eCBvbiBNSVBTLgogICAgIFtKb2huIFRvYmV5IDxqdG9iZXlAY2hhbm5lbDEuY29tPl0KCiAgKikgTWFrZSBsaW5rcyB3aGVuZXZlciBDb25maWd1cmUgaXMgcnVuLCB1bmxlc3Mgd2UgYXJlIG9uIFdpbmRvemUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFBlcm1pdCBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIENSTHMgdXNpbmcgY3JsX3NlY3Rpb24gaW4gb3BlbnNzbC5jbmYuCiAgICAgQ3VycmVudGx5IG9ubHkgaXNzdWVyQWx0TmFtZSBhbmQgQXV0aG9yaXR5S2V5SWRlbnRpZmllciBtYWtlIGFueSBzZW5zZQogICAgIGluIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgdXNlZnVsIGtsdWRnZSB0byBhbGxvdyBwYWNrYWdlIG1haW50YWluZXJzIHRvIHNwZWNpZnkgY29tcGlsZXIgYW5kCiAgICAgb3RoZXIgcGxhdGZvcm1zIGRldGFpbHMgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRob3V0IGhhdmluZyB0byBwYXRjaCB0aGUKICAgICBDb25maWd1cmUgc2NyaXB0IGV2ZXJ5dGltZTogT25lIG5vdyBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUKICAgICA8aWQ+OjxkZXRhaWxzPicnLCBpLmUuIHBsYXRmb3JtIGlkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGRldGFpbHMgYXBwZW5kZWQKICAgICB0byB0aGVtIChzZXBlcmF0ZWQgYnkgY29sb25zKS4gVGhpcyBpcyB0cmVhdGVkIGFzIHRoZXJlIHdvdWxkIGJlIGEgc3RhdGljCiAgICAgcHJlLWNvbmZpZ3VyZWQgZW50cnkgaW4gQ29uZmlndXJlJ3MgJXRhYmxlIHVuZGVyIGtleSA8aWQ+IHdpdGggdmFsdWUKICAgICA8ZGV0YWlscz4gYW5kIGBgcGVybCBDb25maWd1cmUgPGlkPicnIGlzIGNhbGxlZC4gIFNvLCB3aGVuIHlvdSB3YW50IHRvCiAgICAgcGVyZm9ybSBhIHF1aWNrIHRlc3QtY29tcGlsZSB1bmRlciBGcmVlQlNEIDMuMSB3aXRoIHBnY2MgYW5kIHdpdGhvdXQKICAgICBhc3NlbWJsZXIgc3R1ZmYgeW91IGNhbiB1c2UgYGBwZXJsIENvbmZpZ3VyZSAiRnJlZUJTRC1lbGY6cGdjYzotTzY6OjoiJycKICAgICBub3csIHdoaWNoIG92ZXJyaWRlcyB0aGUgRnJlZUJTRC1lbGYgZW50cnkgb24tdGhlLWZseS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRGlzYWJsZSBuZXcgVExTMSBjaXBoZXJzdWl0ZXMgYnkgZGVmYXVsdDogdGhleSBhcmVuJ3Qgb2ZmaWNpYWwgeWV0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBEU08gZmxhZ3MgbGlrZSAtZnBpYywgLWZQSUMsIC1LUElDIGV0Yy4gdG8gYmUgc3BlY2lmaWVkCiAgICAgb24gdGhlIGBwZXJsIENvbmZpZ3VyZSAuLi4nIGNvbW1hbmQgbGluZS4gVGhpcyB3YXkgb25lIGNhbiBjb21waWxlCiAgICAgT3BlblNTTCBsaWJyYXJpZXMgd2l0aCBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHdoaWNoIGlzIG5lZWRlZAogICAgIGZvciBsaW5raW5nIGl0IGludG8gRFNPcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtYXJrYWJseSwgZXhwb3J0IGNpcGhlcnMgd2VyZSB0b3RhbGx5IGJyb2tlbiBhbmQgbm8tb25lIGhhZCBub3RpY2VkIQogICAgIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDbGVhbmVkIHVwIHRoZSBMSUNFTlNFIGRvY3VtZW50OiBUaGUgb2ZmaWNpYWwgY29udGFjdCBmb3IgYW55IGxpY2Vuc2UKICAgICBxdWVzdGlvbnMgbm93IGlzIHRoZSBPcGVuU1NMIGNvcmUgdGVhbSB1bmRlciBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCiAgICAgQW5kIGFkZCBhIHBhcmFncmFwaCBhYm91dCB0aGUgZHVhbC1saWNlbnNlIHNpdHVhdGlvbiB0byBtYWtlIHN1cmUgcGVvcGxlCiAgICAgcmVjb2duaXplIHRoYXQgX0JPVEhfIHRoZSBPcGVuU1NMIGxpY2Vuc2UgX0FORF8gdGhlIFNTTGVheSBsaWNlbnNlIGFwcGx5CiAgICAgdG8gdGhlIE9wZW5TU0wgdG9vbGtpdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgR2VuZXJhbCBzb3VyY2UgdHJlZSBtYWtlZmlsZSBjbGVhbnVwczogTWFkZSBgbWFraW5nIHh4eCBpbiB5eXkuLi4nCiAgICAgZGlzcGxheSBjb25zaXN0ZW50IGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgcmVwbGFjZWQgYC9iaW4vcm0nIGJ5IGBybScuCiAgICAgQWRkaXRvbmFsbHkgY2xlYW5lZCB1cCB0aGUgYG1ha2UgbGlua3MnIHRhcmdldDogUmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgc2VtaWNvbG9ucywgc3Vic2VxdWVudCByZWR1bmRhbnQgcmVtb3ZlcywgaW5saW5lIHBvaW50LnNoIGludG8gbWtsaW5rLnNoCiAgICAgdG8gc3BlZWQgcHJvY2Vzc2luZyBhbmQgbm8gbG9uZ2VyIGNsdXR0ZXIgdGhlIGRpc3BsYXkgd2l0aCBjb25mdXNpbmcKICAgICBzdHVmZi4gSW5zdGVhZCBvbmx5IHRoZSBhY3R1YWxseSBkb25lIGxpbmtzIGFyZSBkaXNwbGF5ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBlcm1pdCBudWxsIGVuY3J5cHRpb24gY2lwaGVyc3VpdGVzLCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBvbmx5LiBJdCB1c2VkCiAgICAgdG8gYmUgbmVjZXNzYXJ5IHRvIHNldCB0aGUgcHJlcHJvY2Vzc29yIGRlZmluZSBTU0xfQUxMT1dfRU5VTEwgdG8gZG8gdGhpcy4KICAgICBJdCBpcyBub3cgbmVjZXNzYXJ5IHRvIHNldCBTU0xfRk9SQklEX0VOVUxMIHRvIHByZXZlbnQgdGhlIHVzZSBvZiBudWxsCiAgICAgZW5jcnlwdGlvbi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZml4ZXMgdG8gdGhlIFBLQ1MjNyBzdHVmZi4gSXQgdXNlZCB0byBzb21ldGltZXMgcmVvcmRlcgogICAgIHNpZ25lZCBhdHRyaWJ1dGVzIHdoZW4gdmVyaWZ5aW5nIHNpZ25hdHVyZXMgKHRoaXMgd291bGQgYnJlYWsgdGhlbSksIAogICAgIHRoZSBkZXRhY2hlZCBkYXRhIGVuY29kaW5nIHdhcyB3cm9uZyBhbmQgcHVibGljIGtleXMgb2J0YWluZWQgdXNpbmcKICAgICBYNTA5X2dldF9wdWJrZXkoKSB3ZXJlbid0IGZyZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIHRoZSBCVUZGRVIgZnVuY3Rpb25zLiBBbHNvIGFkZGVkIGEgd29yayBhcm91bmQKICAgICB0byBhIFdpbjk1IGNvbnNvbGUgYnVnLiBUaGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHBhc3N3b3JkIHJlYWQgc3R1ZmY6IHRoZQogICAgIGxhc3QgY2hhcmFjdGVyIHR5cGVkIGdldHMgY2FycmllZCBvdmVyIHRvIHRoZSBuZXh0IGZyZWFkKCkuIElmIHlvdSB3ZXJlIAogICAgIGdlbmVyYXRpbmcgYSBuZXcgY2VydCByZXF1ZXN0IHVzaW5nICdyZXEnIGZvciBleGFtcGxlIHRoZW4gdGhlIGxhc3QKICAgICBjaGFyYWN0ZXIgb2YgdGhlIHBhc3NwaHJhc2Ugd291bGQgYmUgQ1Igd2hpY2ggd291bGQgdGhlbiBlbnRlciB0aGUgZmlyc3QKICAgICBmaWVsZCBhcyBibGFuay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgbmV3IGBJbmNsdWRlcyBPcGVuU1NMIENyeXB0b2dyYXBoeSBTb2Z0d2FyZScgYnV0dG9uIGFzCiAgICAgZG9jL29wZW5zc2xfYnV0dG9uLntnaWYsaHRtbH0gd2hpY2ggaXMgc2ltaWxhciBpbiBzdHlsZSB0byB0aGUgb2xkIFNTTGVheQogICAgIGJ1dHRvbiBhbmQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGJhc2VkIG9uIE9wZW5TU0wgdG8gc2hvdyB0aGUKICAgICByZWxhdGlvbnNoaXAgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4gIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmUgY29uZnVzaW5nIHZhcmlhYmxlcyBpbiBmdW5jdGlvbiBzaWduYXR1cmVzIGluIGZpbGVzCiAgICAgc3NsL3NzbF9saWIuYyBhbmQgc3NsL3NzbC5oLgogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaW5zdGFsbCBic3NfZmlsZS5jIHVuZGVyIFBSRUZJWC9pbmNsdWRlLwogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgR2V0IHRoZSBXaW4zMiBjb21waWxlIHdvcmtpbmcgYWdhaW4uIE1vZGlmeSBta2RlZi5wbCBzbyBpdCBjYW4gaGFuZGxlCiAgICAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBoYXMgc3VwcG9ydCBmb3IgTlQgc3BlY2lmaWMKICAgICBzdHVmZi4gRml4IG1rMW1mLnBsIGFuZCBWQy0zMi5wbCB0byBzdXBwb3J0IE5UIGRpZmZlcmVuY2VzIGFsc28uIFZhcmlvdXMKICAgICAjaWZkZWYgV0lOMzIgYW5kIFdJTk5UcyBzcHJpbmtsZWQgYWJvdXQgdGhlIHBsYWNlIGFuZCBzb21lIGNoYW5nZXMgZnJvbQogICAgIHVuc2lnbmVkIHRvIHNpZ25lZCB0eXBlczogdGhpcyB3YXMga2lsbGluZyB0aGUgV2luMzIgY29tcGlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGNlcnRpZmljYXRlIGZpbGUgdG8gc3RhY2sgZnVuY3Rpb25zLAogICAgIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKSBhbmQKICAgICBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjaygpLiAgVGhlc2UgbGFyZ2VseSBzdXBwbGFudAogICAgIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKCksIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgbXVsdGlwbGUgY2VydHMgZWFzaWx5CiAgICAgdG8gYSBzdGFjayAodXN1YWxseSB0aGlzIGlzIHRoZW4gaGFuZGVkIHRvIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KCkpLgogICAgIFRoaXMgbWVhbnMgdGhhdCBBcGFjaGUtU1NMIGFuZCBzaW1pbGFyIHBhY2thZ2VzIGRvbid0IGhhdmUgdG8gbWVzcyBhcm91bmQKICAgICB0byBhZGQgYXMgbWFueSBDQXMgYXMgdGhleSB3YW50IHRvIHRoZSBwcmVmZXJyZWQgbGlzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRXhwZXJpbWVudCB3aXRoIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gQ3VycmVudGx5IG9ubHkgcGFydGlhbGx5IGFwcGxpZWQgdG8KICAgICBzc2wvc3NsX2xpYi5jLgogICAgIFNlZSBodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4vaW5kZXguaHRtbCwgYW5kIHJ1biBkb3h5Z2VuIHdpdGgKICAgICBvcGVuc3NsLmRveHkgYXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBbQmVuIExhdXJpZV0KICAKICAqKSBHZXQgcmlkIG9mIHJlbWFpbmluZyBDKystc3R5bGUgY29tbWVudHMgd2hpY2ggc3RyaWN0IEMgY29tcGlsZXJzIGhhdGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIHBvaW50ZWQgb3V0IGJ5IENhcmxvcyBBbWVuZ3VhbF0KCiAgKikgQ2hhbmdlZCBCTl9SRUNVUlNJT04gaW4gYm5fbW9udC5jIHRvIEJOX1JFQ1VSU0lPTl9NT05UIHNvIGl0IGlzIG5vdAogICAgIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQ6IGl0IGhhcyBwcm9ibGVtcyB3aXRoIGxhcmdlIGtleXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgU1NMX3h4eCgpIGZ1bmN0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHRlbXBvcmFyeSBSU0EgYW5kCiAgICAgREggcHJpdmF0ZSBrZXlzIGFuZC9vciBjYWxsYmFjayBmdW5jdGlvbnMgd2hpY2ggZGlyZWN0bHkgY29ycmVzcG9uZCB0bwogICAgIHRoZWlyIFNTTF9DVFhfeHh4KCkgY291bnRlcnBhcnRzIGJ1dCB3b3JrIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMuIFRoaXMKICAgICBpcyBuZWVkZWQgZm9yIGFwcGxpY2F0aW9ucyB3aGljaCBoYXZlIHRvIGNvbmZpZ3VyZSBjZXJ0aWZpY2F0ZXMgb24gYQogICAgIHBlci1jb25uZWN0aW9uIGJhc2lzIChlLmcuIEFwYWNoZSttb2Rfc3NsKSBpbnN0ZWFkIG9mIGEgcGVyLWNvbnRleHQgYmFzaXMKICAgICAoZS5nLiBzX3NlcnZlcikuIAogICAgICAgIEZvciB0aGUgUlNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiBpcyBtYWtlcyBubyBkaWZmZXJlbmNlLCBidXQKICAgICBmb3IgdGhlIERTQSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gdGhpcyBmaXhlcyB0aGUgIm5vIHNoYXJlZCBjaXBoZXIiCiAgICAgcHJvYmxlbSB3aGVyZSB0aGUgT3BlblNTTCBjaXBoZXIgc2VsZWN0aW9uIHByb2NlZHVyZSBmYWlsZWQgYmVjYXVzZSB0aGUKICAgICB0ZW1wb3Jhcnkga2V5cyB3ZXJlIG5vdCBvdmVydGFrZW4gZnJvbSB0aGUgY29udGV4dCBhbmQgdGhlIEFQSSBwcm92aWRlZAogICAgIG5vIHdheSB0byByZWNvbmZpZ3VyZSB0aGVtLiAKICAgICAgICBUaGUgbmV3IGZ1bmN0aW9ucyBub3cgbGV0IGFwcGxpY2F0aW9ucyByZWNvbmZpZ3VyZSB0aGUgc3R1ZmYgYW5kIHRoZXkKICAgICBhcmUgaW4gZGV0YWlsOiBTU0xfbmVlZF90bXBfUlNBLCBTU0xfc2V0X3RtcF9yc2EsIFNTTF9zZXRfdG1wX2RoLAogICAgIFNTTF9zZXRfdG1wX3JzYV9jYWxsYmFjayBhbmQgU1NMX3NldF90bXBfZGhfY2FsbGJhY2suICBBZGRpdGlvbmFsbHkgYSBuZXcKICAgICBub24tcHVibGljLUFQSSBmdW5jdGlvbiBzc2xfY2VydF9pbnN0YW50aWF0ZSgpIGlzIHVzZWQgYXMgYSBoZWxwZXIKICAgICBmdW5jdGlvbiBhbmQgYWxzbyB0byByZWR1Y2UgY29kZSByZWR1bmRhbmN5IGluc2lkZSBzc2xfcnNhLmMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vdmUgc19zZXJ2ZXIgLWRjZXJ0IGFuZCAtZGtleSBvcHRpb25zIG91dCBvZiB0aGUgdW5kb2N1bWVudGVkIGZlYXR1cmUKICAgICBhcmVhIGJlY2F1c2UgdGhleSBhcmUgdXNlZnVsIGZvciB0aGUgRFNBIHNpdHVhdGlvbiBhbmQgc2hvdWxkIGJlCiAgICAgcmVjb2duaXplZCBieSB0aGUgdXNlcnMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgY2lwaGVyIGRlY2lzaW9uIHNjaGVtZSBmb3IgZXhwb3J0IGNpcGhlcnM6IHRoZSBleHBvcnQgYml0cyBhcmUKICAgICAqbm90KiB3aXRoaW4gU1NMX01LRVlfTUFTSyBvciBTU0xfQVVUSF9NQVNLLCB0aGV5IGFyZSB3aXRoaW4KICAgICBTU0xfRVhQX01BU0suICBTbywgdGhlIG9yaWdpbmFsIHZhcmlhYmxlIGhhcyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlCiAgICAgYWxyZWFkeSBtYXNrZWQgdmFyaWFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIEZpeCAncG9ydCcgdmFyaWFibGUgZnJvbSBgaW50JyB0byBgdW5zaWduZWQgaW50JyBpbiBjcnlwdG8vYmlvL2Jfc29jay5jCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIENoYW5nZSB0eXBlIG9mIGFub3RoZXIgbWRfbGVuIHZhcmlhYmxlIGluIHBrN19kb2l0LmM6UEtDUzdfZGF0YUZpbmFsKCkKICAgICBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGJlY2F1c2UgaXQncyBhIGxlbmd0aCBhbmQgaW5pdGlhbGl6ZWQgYnkKICAgICBFVlBfRGlnZXN0RmluYWwoKSB3aGljaCBleHBlY3RzIGFuIGB1bnNpZ25lZCBpbnQgKicuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIERvbid0IGhhcmQtY29kZSBwYXRoIHRvIFBlcmwgaW50ZXJwcmV0ZXIgb24gc2hlYmFuZyBsaW5lIG9mIENvbmZpZ3VyZQogICAgIHNjcmlwdC4gSW5zdGVhZCB1c2UgdGhlIHVzdWFsIFNoZWxsLT5QZXJsIHRyYW5zaXRpb24gdHJpY2suCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2UgYG9wZW5zc2wgeDUwOSAtbm9vdXQgLW1vZHVsdXMnIGZ1bmN0aW9uYWwgYWxzbyBmb3IgRFNBIGNlcnRpZmljYXRlcwogICAgIChpbiBhZGRpdGlvbiB0byBSU0EgY2VydGlmaWNhdGVzKSB0byBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIGBvcGVuc3NsIGRzYQogICAgIC1ub291dCAtbW9kdWx1cycgYXMgaXQncyBhbHJlYWR5IHRoZSBjYXNlIGZvciBgb3BlbnNzbCByc2EgLW5vb3V0CiAgICAgLW1vZHVsdXMnLiAgRm9yIFJTQSB0aGUgLW1vZHVsdXMgaXMgdGhlIHJlYWwgIm1vZHVsdXMiIHdoaWxlIGZvciBEU0EKICAgICBjdXJyZW50bHkgdGhlIHB1YmxpYyBrZXkgaXMgcHJpbnRlZCAoYSBkZWNpc2lvbiB3aGljaCB3YXMgYWxyZWFkeSBkb25lIGJ5CiAgICAgYG9wZW5zc2wgZHNhIC1tb2R1bHVzJyBpbiB0aGUgcGFzdCkgd2hpY2ggc2VydmVzIGEgc2ltaWxhciBwdXJwb3NlLgogICAgIEFkZGl0aW9uYWxseSB0aGUgTk9fUlNBIG5vIGxvbmdlciBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHdob2xlIC1tb2R1bHVzCiAgICAgb3B0aW9uOyBpdCBub3cgb25seSBhdm9pZHMgdXNpbmcgdGhlIFJTQSBzdHVmZi4gU2FtZSBhcHBsaWVzIHRvIE5PX0RTQQogICAgIG5vdywgdG9vLgogICAgIFtSYWxmIFMuICBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIEFybmUgQW5zcGVyJ3MgcmVsaWFibGUgQklPIC0gdGhpcyBpcyBhbiBlbmNyeXB0ZWQsIGJsb2NrLWRpZ2VzdGVkCiAgICAgQklPLiBTZWUgdGhlIHNvdXJjZSAoY3J5cHRvL2V2cC9iaW9fb2suYykgZm9yIG1vcmUgaW5mby4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRHVtcCB0aGUgb2xkIHl1Y2t5IHJlcSBjb2RlIHRoYXQgdHJpZWQgKGFuZCBmYWlsZWQpIHRvIGFsbG93IHJhdyBPSURzCiAgICAgdG8gYmUgYWRkZWQuIE5vdyBib3RoICdyZXEnIGFuZCAnY2EnIGNhbiB1c2UgbmV3IG9iamVjdHMgZGVmaW5lZCBpbiB0aGUKICAgICBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29vbCBCSU8gdGhhdCBkb2VzIHN5c2xvZyAob3IgZXZlbnQgbG9nIG9uIE5UKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmV3IFRMUyBjaXBoZXJzdWl0ZXMsIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzRfNTZfTUQ1LAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzJfQ0JDXzU2X01ENSBhbmQKICAgICBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfREVTX0NCQ19TSEEsIGFzIHNwZWNpZmllZCBpbiAiNTYtYml0IEV4cG9ydCBDaXBoZXIKICAgICBTdWl0ZXMgRm9yIFRMUyIsIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDAudHh0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgcHJlbGltaW5hcnkgY29uZmlnIGluZm8gZm9yIG5ldyBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFJTQV9OT19QQURESU5HIHJlYWxseSB1c2Ugbm8gcGFkZGluZy4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEdlbmVyYXRlIGVycm9ycyB3aGVuIHByaXZhdGUvcHVibGljIGtleSBjaGVjayBpcyBkb25lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBPdmVyaGF1bCBmb3IgJ2NybCcgdXRpbGl0eS4gTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX3ByaW50LiBQYXJ0aWFsIHN1cHBvcnQKICAgICBmb3Igc29tZSBDUkwgZXh0ZW5zaW9ucyBhbmQgbmV3IG9iamVjdHMgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVhbGx5IGZpeCB0aGUgQVNOMSBJTVBMSUNJVCBidWcgdGhpcyB0aW1lLi4uIFBhcnRpYWwgc3VwcG9ydCBmb3IgcHJpdmF0ZQogICAgIGtleSB1c2FnZSBleHRlbnNpb24gYW5kIGZ1bGxlciBzdXBwb3J0IGZvciBhdXRob3JpdHkga2V5IGlkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBPQUVQIGVuY3J5cHRpb24gZm9yIHRoZSBPcGVuU1NMIGNyeXB0byBsaWJyYXJ5LiBPQUVQIGlzIHRoZSBpbXByb3ZlZAogICAgIHBhZGRpbmcgbWV0aG9kIGZvciBSU0EsIHdoaWNoIGlzIHJlY29tbWVuZGVkIGZvciBuZXcgYXBwbGljYXRpb25zIGluIFBLQ1MKICAgICAjMSB2Mi4wIChSRkMgMjQzNywgT2N0b2JlciAxOTk4KS4KICAgICBPQUVQIChPcHRpbWFsIEFzeW1tZXRyaWMgRW5jcnlwdGlvbiBQYWRkaW5nKSBoYXMgYmV0dGVyIHRoZW9yZXRpY2FsCiAgICAgZm91bmRhdGlvbnMgdGhhbiB0aGUgYWQtaG9jIHBhZGRpbmcgdXNlZCBpbiBQS0NTICMxIHYxLjUuIEl0IGlzIHNlY3VyZQogICAgIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFJTQS4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT4sIHJlZm9ybWF0dGVkLCBjb3JyZWN0ZWQgYW5kIGludGVncmF0ZWQgYnkKICAgICAgQmVuIExhdXJpZV0KCiAgKikgVXBkYXRlcyB0byB0aGUgbmV3IFNTTCBjb21wcmVzc2lvbiBjb2RlCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgRml4IHNvIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBtYXN0ZXIgc2VjcmV0LCB3aGVuIHBhc3NlZAogICAgIHZpYSBSU0EsIGNoZWNrcyB0aGF0IGlmIFRMUyB3YXMgcHJvcG9zZWQsIGJ1dCB3ZSByb2xsIGJhY2sgdG8gU1NMdjMKICAgICAoYmVjYXVzZSB0aGUgc2VydmVyIHdpbGwgbm90IGFjY2VwdCBoaWdoZXIpLCB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGlzIDB4MDMsMHgwMSwgbm90IDB4MDMsMHgwMAogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIFJ1biBleHRlbnNpdmUgbWVtb3J5IGxlYWsgY2hlY2tzIG9uIFNTTCBhcHBzLiBGaXhlZCAqbG90cyogb2YgbWVtb3J5CiAgICAgbGVha3MgaW4gc3NsLyByZWxhdGluZyB0byBuZXcgWDUwOV9nZXRfcHVia2V5KCkgYmVoYXZpb3VyLiBBbHNvIGZpeGVzCiAgICAgaW4gYXBwcy8gYW5kIGFuIHVucmVsYXRlZCBsZWFrIGluIGNyeXB0by9kc2EvZHNhX3ZyZi5jCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUkFXIGV4dGVuc2lvbnMgd2hlcmUgYW4gYXJiaXRyYXJ5IGV4dGVuc2lvbiBjYW4gYmUKICAgICBjcmVhdGVkIGJ5IGluY2x1ZGluZyBpdHMgREVSIGVuY29kaW5nLiBTZWUgYXBwcy9vcGVuc3NsLmNuZiBmb3IKICAgICBhbiBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSBsYXRlc3QgUGVybCB2ZXJzaW9ucyBkb24ndCBpbnRlcnByZXQgc29tZSBnZW5lcmF0ZWQgQyBhcnJheQogICAgIGNvZGUgYXMgUGVybCBhcnJheSBjb2RlIGluIHRoZSBjcnlwdG8vZXJyL2Vycl9nZW5jLnBsIHNjcmlwdC4KICAgICBbTGFycyBXZWJlciA8M3dlYmVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBNb2RpZnkgbXMvZG9fbXMuYmF0IHRvIG5vdCBnZW5lcmF0ZSBhc3NlbWJseSBsYW5ndWFnZSBtYWtlZmlsZXMgc2luY2UKICAgICBub3QgbWFueSBwZW9wbGUgaGF2ZSB0aGUgYXNzZW1ibGVyLiBWYXJpb3VzIFdpbjMyIGNvbXBpbGF0aW9uIGZpeGVzIGFuZAogICAgIHVwZGF0ZSB0byB0aGUgSU5TVEFMTC5XMzIgZmlsZSB3aXRoIChob3BlZnVsbHkpIG1vcmUgYWNjdXJhdGUgV2luMzIKICAgICBidWlsZCBpbnN0cnVjdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNvbmZpZ3VyZSBzY3JpcHQgJ0NvbmZpZ3VyZScgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgY3J5cHRvL2RhdGUuaAogICAgIGZpbGUgdW5kZXIgV2luMzIgYW5kIGFsc28gYnVpbGQgcGVtLmggZnJvbSBwZW0ub3JnLiBOZXcgc2NyaXB0CiAgICAgdXRpbC9ta2ZpbGVzLnBsIHRvIGNyZWF0ZSB0aGUgTUlORk8gZmlsZSBvbiBlbnZpcm9ubWVudHMgdGhhdCBjYW4ndCBkbyBhCiAgICAgJ21ha2UgZmlsZXMnOiBwZXJsIHV0aWwvbWtmaWxlcy5wbCA+TUlORk8gc2hvdWxkIHdvcmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFqb3IgcmV3b3JrIG9mIERFUyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGluIHRoZSBwdXJzdWl0IG9mIGNvcnJlY3RuZXNzCiAgICAgYW5kIHB1cml0eS4gQXMgYSByZXN1bHQsIG1hbnkgZXZpbCBjYXN0cyBldmFwb3JhdGVkLCBhbmQgc29tZSB3ZWlyZG5lc3MsCiAgICAgdG9vLiBZb3UgbWF5IGZpbmQgdGhpcyBjYXVzZXMgd2FybmluZ3MgaW4geW91ciBjb2RlLiBaYXBwaW5nIHlvdXIgZXZpbAogICAgIGNhc3RzIHdpbGwgcHJvYmFibHkgZml4IHRoZW0uIE1vc3RseS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGZvciBhIHR5cG8gaW4gYXNuMS5oLiBCdWcgZml4IHRvIG9iamVjdCBjcmVhdGlvbiBzY3JpcHQKICAgICBvYmpfZGF0LnBsLiBJdCBjb25zaWRlcmVkIGEgemVybyBpbiBhbiBvYmplY3QgZGVmaW5pdGlvbiB0byBtZWFuCiAgICAgImVuZCBvZiBvYmplY3QiOiBub25lIG9mIHRoZSBvYmplY3RzIGluIG9iamVjdHMuaCBoYXZlIGFueSB6ZXJvcwogICAgIHNvIGl0IHdhc24ndCBzcG90dGVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEVyd2FubiBBQkFMRUEgPGVhYmFsZWFAY2VydHBsdXMuY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRyaXBsZSBERVMgQ2lwaGVyIEJsb2NrIENoYWluaW5nIHdpdGggT3V0cHV0IEZlZWRiYWNrCiAgICAgTWFza2luZyAoQ0JDTSkuIEluIHRoZSBhYnNlbmNlIG9mIHRlc3QgdmVjdG9ycywgdGhlIGJlc3QgSSBoYXZlIGJlZW4gYWJsZQogICAgIHRvIGRvIGlzIGNoZWNrIHRoYXQgdGhlIGRlY3J5cHQgdW5kb2VzIHRoZSBlbmNyeXB0LCBzbyBmYXIuIFNlbmQgbWUgdGVzdAogICAgIHZlY3RvcnMgaWYgeW91IGhhdmUgdGhlbS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29ycmVjdCBjYWxjdWxhdGlvbiBvZiBrZXkgbGVuZ3RoIGZvciBleHBvcnQgY2lwaGVycyAodG9vIG11Y2ggc3BhY2Ugd2FzCiAgICAgYWxsb2NhdGVkIGZvciBudWxsIGNpcGhlcnMpLiBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1vZGlmaWNhdGlvbnMgdG8gdGhlIG1rZGVmLnBsIGZvciBXaW4zMiBERUYgZmlsZSBjcmVhdGlvbi4gVGhlIHVzYWdlCiAgICAgbWVzc2FnZSBpcyBub3cgY29ycmVjdCAoaXQgdW5kZXJzdGFuZHMgImNyeXB0byIgYW5kICJzc2wiIG9uIGl0cwogICAgIGNvbW1hbmQgbGluZSkuIFRoZXJlIGlzIGFsc28gbm93IGFuICJ1cGRhdGUiIG9wdGlvbi4gVGhpcyB3aWxsIHVwZGF0ZQogICAgIHRoZSB1dGlsL3NzbGVheS5udW0gYW5kIHV0aWwvbGliZWF5Lm51bSBmaWxlcyB3aXRoIGFueSBuZXcgZnVuY3Rpb25zLgogICAgIElmIHlvdSBkbyBhOiAKICAgICBwZXJsIHV0aWwvbWtkZWYucGwgY3J5cHRvIHNzbCB1cGRhdGUKICAgICBpdCB3aWxsIHVwZGF0ZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE92ZXJoYXVsZWQgdGhlIFBlcmwgaW50ZXJmYWNlIChwZXJsLyopOgogICAgIC0gcG9ydGVkIEJOIHN0dWZmIHRvIE9wZW5TU0wncyBkaWZmZXJlbnQgQk4gbGlicmFyeQogICAgIC0gbWFkZSB0aGUgcGVybC8gc291cmNlIHRyZWUgQ1ZTLWF3YXJlCiAgICAgLSByZW5hbWVkIHRoZSBwYWNrYWdlIGZyb20gU1NMZWF5IHRvIE9wZW5TU0wgKHRoZSBmaWxlcyBzdGlsbCBjb250YWluCiAgICAgICB0aGVpciBoaXN0b3J5IGJlY2F1c2UgSSd2ZSBjb3BpZWQgdGhlbSBpbiB0aGUgcmVwb3NpdG9yeSkKICAgICAtIHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMgKHRoZSB0ZXN0IHNjcmlwdHMgd2lsbCBiZSByZXBsYWNlZAogICAgICAgYnkgYmV0dGVyIFRlc3Q6Okhhcm5lc3MgdmFyaWFudHMgaW4gdGhlIGZ1dHVyZSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRmlyc3QgY3V0IGZvciBhIHZlcnkgY29uc2VydmF0aXZlIHNvdXJjZSB0cmVlIGNsZWFudXA6CiAgICAgMS4gbWVyZ2UgdmFyaW91cyBvYnNvbGV0ZSByZWFkbWUgdGV4dHMgaW50byBkb2Mvc3NsZWF5LnR4dAogICAgIHdoZXJlIHdlIGNvbGxlY3QgdGhlIG9sZCBkb2N1bWVudHMgYW5kIHJlYWRtZSB0ZXh0cy4KICAgICAyLiByZW1vdmUgdGhlIGZpcnN0IHBhcnQgb2YgZmlsZXMgd2hlcmUgSSdtIGFscmVhZHkgc3VyZSB0aGF0IHdlIG5vCiAgICAgbG9uZ2VyIG5lZWQgdGhlbSBiZWNhdXNlIG9mIHRocmVlIHJlYXNvbnM6IGVpdGhlciB0aGV5IGFyZSBqdXN0IHRlbXBvcmFyeQogICAgIGZpbGVzIHdoaWNoIHdlcmUgbGVmdCBieSBFcmljIG9yIHRoZXkgYXJlIHByZXNlcnZlZCBvcmlnaW5hbCBmaWxlcyB3aGVyZQogICAgIEkndmUgdmVyaWZpZWQgdGhhdCB0aGUgZGlmZiBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIHZpYSAiY3ZzIGRpZmYKICAgICAtclNTTGVheV8wXzhfMWIiIG9yIHRoZXkgd2VyZSByZW5hbWVkIChhcyBpdCB3YXMgZGVmaW5pdGVseSB0aGUgY2FzZSBmb3IKICAgICB0aGUgY3J5cHRvL21kLyBzdHVmZikuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vcmUgZXh0ZW5zaW9uIGNvZGUuIEluY29tcGxldGUgc3VwcG9ydCBmb3Igc3ViamVjdCBhbmQgaXNzdWVyIGFsdAogICAgIG5hbWUsIGlzc3VlciBhbmQgYXV0aG9yaXR5IGtleSBpZC4gQ2hhbmdlIHRoZSBpMnYgZnVuY3Rpb24gcGFyYW1ldGVycwogICAgIGFuZCBhZGQgYW4gZXh0cmEgJ2NybCcgcGFyYW1ldGVyIGluIHRoZSBYNTA5VjNfQ1RYIHN0cnVjdHVyZTogZ3Vlc3MKICAgICB3aGF0IHRoYXQncyBmb3IgOi0pIEZpeCB0byBBU04xIG1hY3JvIHdoaWNoIG1lc3NlZCB1cAogICAgIElNUExJQ0lUIHRhZyBhbmQgYWRkIGZfZW51bS5jIHdoaWNoIGFkZHMgYTJpLCBpMmEgZm9yIEVOVU1FUkFURUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgRU5VTUVSQVRFRCB0eXBlLiBUaGlzIGlzIGxhcmdlbHkgY29waWVkIGZyb20gdGhlCiAgICAgSU5URUdFUiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb24sIEVWUF9NRF9DVFhfY29weSgpIHRvIHJlcGxhY2UgZnJlcXVlbnQgdXNlIG9mIG1lbWNweS4KICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBNYWtlIHN1cmUgYG1ha2UgcmVoYXNoJyB0YXJnZXQgcmVhbGx5IGZpbmRzIHRoZSBgb3BlbnNzbCcgcHJvZ3JhbS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIFNxdWVlemUgYW5vdGhlciA3JSBvZiBzcGVlZCBvdXQgb2YgTUQ1IGFzc2VtYmxlciwgYXQgbGVhc3Qgb24gYSBQMi4gSSdkCiAgICAgbGlrZSB0byBoZWFyIGFib3V0IGl0IGlmIHRoaXMgc2xvd3MgZG93biBvdGhlciBwcm9jZXNzb3JzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgQ3lnV2luMzIgcGxhdGZvcm0gaW5mb3JtYXRpb24gdG8gQ29uZmlndXJlIHNjcmlwdC4KICAgICBbQWxhbiBCYXRpZSA8YmF0aWVAYWFoei5qZi5pbnRlbC5jb20+XQoKICAqKSBGaXhlZCBtcy8zMmFsbC5iYXQgc2NyaXB0OiBgbm9fYXNtJyAtPiBgbm8tYXNtJwogICAgIFtSYWluZXIgVy4gR2VybGluZyA8Z2VybGluZ0BtcGctZ3YubXBnLmRlPl0KICAKICAqKSBOZXcgcHJvZ3JhbSBuc2VxIHRvIG1hbmlwdWxhdGUgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNybDJwa2NzNyBzbyBpdCBzdXBwb3J0cyBtdWx0aXBsZSAtY2VydGZpbGUgYXJndW1lbnRzLiBGaXggYQogICAgIGZldyB0eXBvcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBCTiBjb2RlLiAgUHJldmlvdXNseSB0aGUgZGVmYXVsdCB3YXMgdG8gZGVmaW5lIEJOX1JFQ1VSU0lPTgogICAgIGJ1dCB0aGUgQk4gY29kZSBoYWQgc29tZSBwcm9ibGVtcyB0aGF0IHdvdWxkIGNhdXNlIGZhaWx1cmVzIHdoZW4KICAgICBkb2luZyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQVNOMSBhbmQgUEVNIGNvZGUgdG8gc3VwcG9ydCBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNldmVyYWwgUEtJWCBhbmQgcHJpdmF0ZSBleHRlbmRlZCBrZXkgdXNhZ2UgT0lEcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlICdjYScgcHJvZ3JhbSB0byBoYW5kbGUgdGhlIG5ldyBleHRlbnNpb24gY29kZS4gTW9kaWZ5CiAgICAgb3BlbnNzbC5jbmYgZm9yIG5ldyBleHRlbnNpb24gZm9ybWF0LCBhZGQgY29tbWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBYNTA5IFYzIGNoYW5nZXMuIEZpeCB0eXBvIGluIHYzX2JpdHN0ci5jLiBBZGQgc3VwcG9ydCB0byAncmVxJwogICAgIGFuZCBhZGQgYSBzYW1wbGUgdG8gb3BlbnNzbC5jbmYgc28gcmVxIC14NTA5IG5vdyBhZGRzIGFwcHJvcHJpYXRlCiAgICAgQ0EgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51ZWQgWDUwOSBWMyBjaGFuZ2VzLiBBZGQgdG8gb3RoZXIgbWFrZWZpbGVzLCBpbnRlZ3JhdGUgd2l0aCB0aGUKICAgICBlcnJvciBjb2RlLCBhZGQgaW5pdGlhbCBzdXBwb3J0IHRvIFg1MDlfcHJpbnQoKSBhbmQgeDUwOSBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUYWtlcyBhIGRlZXAgYnJlYXRoIGFuZCBzdGFydCBhZGRkaW5nIFg1MDkgVjMgZXh0ZW5zaW9uIHN1cHBvcnQgY29kZS4gQWRkCiAgICAgZmlsZXMgaW4gY3J5cHRvL3g1MDl2My4gTW92ZSBvcmlnaW5hbCBzdHVmZiB0byBjcnlwdG8veDUwOXYzL29sZC4gQWxsIHRoaXMKICAgICBzdHVmZiBpcyBjdXJyZW50bHkgaXNvbGF0ZWQgYW5kIGlzbid0IGV2ZW4gY29tcGlsZWQgeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVpbmcgcGF0Y2hlcyBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBGaXggdXAgY2VydGlmaWNhdGUgYW5kIENSTAogICAgIEFTTjEgdG8gdXNlIEFTTjFfVElNRSBhbmQgbW9kaWZ5IHByaW50IHJvdXRpbmVzIHRvIHVzZSBBU04xX1RJTUVfcHJpbnQuCiAgICAgUmVtb3ZlZCB0aGUgdmVyc2lvbnMgY2hlY2sgZnJvbSBYNTA5IHJvdXRpbmVzIHdoZW4gbG9hZGluZyBleHRlbnNpb25zOgogICAgIHRoaXMgYWxsb3dzIGNlcnRhaW4gYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGRvbid0IHNldCB0aGUgdmVyc2lvbgogICAgIHByb3Blcmx5IHRvIGJlIHByb2Nlc3NlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEZWFsIHdpdGggaXJyaXRhdGluZyBzaGl0IHRvIGRvIHdpdGggZGVwZW5kZW5jaWVzLCBpbiBZQUFIVyAoWWV0IEFub3RoZXIKICAgICBBZCBIb2MgV2F5KSAtIE1ha2VmaWxlLnNzbHMgbm93IGFsbCBjb250YWluIGxvY2FsIGRlcGVuZGVuY2llcywgd2hpY2gKICAgICBjYW4gc3RpbGwgYmUgcmVnZW5lcmF0ZWQgd2l0aCAibWFrZSBkZXBlbmQiLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTcGVsbGluZyBtaXN0YWtlIGluIEMgdmVyc2lvbiBvZiBDQVNULTEyOC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgSmVyZW15IEh5bHRvbiA8amVyZW15QGNucmkucmVzdG9uLnZhLnVzPl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgZXJyb3IgZ2VuZXJhdGlvbiBjb2RlLiBUaGUgcGVybCBzY3JpcHQgZXJyLWNvZGUucGwgCiAgICAgbm93IHJlYWRzIGluIHRoZSBvbGQgZXJyb3IgY29kZXMgYW5kIHJldGFpbnMgdGhlIG9sZCBudW1iZXJzLCBvbmx5CiAgICAgYWRkaW5nIG5ldyBvbmVzIGlmIG5lY2Vzc2FyeS4gSXQgYWxzbyBvbmx5IGNoYW5nZXMgdGhlIC5lcnIgZmlsZXMgaWYgbmV3CiAgICAgY29kZXMgYXJlIGFkZGVkLiBUaGUgbWFrZWZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBvbmx5IGluc2VydCBlcnJvcnMKICAgICB3aGVuIG5lZWRlZCAodG8gYXZvaWQgbmVlZGxlc3NseSBtb2RpZnlpbmcgaGVhZGVyIGZpbGVzKS4gVGhpcyBpcyBkb25lCiAgICAgYnkgb25seSBpbnNlcnRpbmcgZXJyb3JzIGlmIHRoZSAuZXJyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgYXV0byBnZW5lcmF0ZWQKICAgICBDIGZpbGUuIFRvIHJlYnVpbGQgYWxsIHRoZSBlcnJvciBjb2RlcyBmcm9tIHNjcmF0Y2ggKHRoZSBvbGQgYmVoYXZpb3VyKQogICAgIGVpdGhlciBtb2RpZnkgY3J5cHRvL01ha2VmaWxlLnNzbCB0byBwYXNzIHRoZSAtcmVnZW4gZmxhZyB0byBlcnJfY29kZS5wbAogICAgIG9yIGRlbGV0ZSBhbGwgdGhlIC5lcnIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ0FTVC0xMjggd2FzIGluY29ycmVjdGx5IGltcGxlbWVudGVkIGZvciBzaG9ydCBrZXlzLiBUaGUgQyB2ZXJzaW9uIGhhcwogICAgIGJlZW4gZml4ZWQsIGJ1dCBpcyB1bnRlc3RlZC4gVGhlIGFzc2VtYmxlciB2ZXJzaW9ucyBhcmUgYWxzbyBmaXhlZCwgYnV0CiAgICAgbmV3IGFzc2VtYmxlciBIQVMgTk9UIEJFRU4gR0VORVJBVEVEIEZPUiBXSU4zMiAtIHRoZSBNYWtlZmlsZSBuZWVkcyBmaXhpbmcKICAgICB0byByZWdlbmVyYXRlIGl0IGlmIG5lZWRlZC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgKHdpdGggZml4IGZvciBDIHZlcnNpb24pIGJ5IEp1bi1pY2hpcm8gaXRvanVuCiAgICAgIEhhZ2lubyA8aXRvanVuQGthbWUubmV0Pl0KCiAgKikgRmlsZSB3YXMgb3BlbmVkIGluY29ycmVjdGx5IGluIHJhbmRmaWxlLmMuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEJlZ2lubmluZyBvZiBzdXBwb3J0IGZvciBHZW5lcmFsaXplZFRpbWUuIGQyaSwgaTJkLCBjaGVjayBhbmQgcHJpbnQKICAgICBmdW5jdGlvbnMuIEFsc28gQVNOMV9USU1FIHN1aXRlIHdoaWNoIGlzIGEgQ0hPSUNFIG9mIFVUQ1RpbWUgb3IKICAgICBHZW5lcmFsaXplZFRpbWUuIEFTTjFfVElNRSBpcyB0aGUgcHJvcGVyIHR5cGUgdXNlZCBpbiBjZXJ0aWZpY2F0ZXMgZXQKICAgICBhbDogaXQncyBqdXN0IGFsbW9zdCBhbHdheXMgYSBVVENUaW1lLiBOb3RlIHRoaXMgcGF0Y2ggYWRkcyBuZXcgZXJyb3IKICAgICBjb2RlcyBzbyBkbyBhICJtYWtlIGVycm9ycyIgaWYgdGhlcmUgYXJlIHByb2JsZW1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3QgTGludXggMSByZWNvZ25pdGlvbiBpbiBjb25maWcuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIFJlbW92ZSBwb2ludGxlc3MgTUQ1IGhhc2ggd2hlbiB1c2luZyBEU0Ega2V5cyBpbiBjYS4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEdlbmVyYXRlIGFuIGVycm9yIGlmIGdpdmVuIGFuIGVtcHR5IHN0cmluZyBhcyBhIGNlcnQgZGlyZWN0b3J5LiBBbHNvCiAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgaGFuZGVkIE5VTEwgKHByZXZpb3VzbHkgcmV0dXJuZWQgMCB0byBpbmRpY2F0ZSBhbgogICAgIGVycm9yLCBidXQgZGlkbid0IHNldCBvbmUpLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZXMgdG8gU1NMIG1ldGhvZHMuIE1ha2UgU1NMX3dyaXRlJ3MgYnVmZmVyIGNvbnN0LCBhdCBsYXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIGR1bW15IGZ1bmN0aW9uIEJOX3JlZl9tb2RfZXhwKCkgaW4gcnNhcmVmLmMgdG8gaGF2ZSB0aGUgY29ycmVjdAogICAgIHBhcmFtZXRlcnMuIFRoaXMgd2FzIGNhdXNpbmcgYSB3YXJuaW5nIHdoaWNoIGtpbGxlZCBvZmYgdGhlIFdpbjMyIGNvbXBpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIEMrKyBzdHlsZSBjb21tZW50cyBmcm9tIGNyeXB0by9ibi9ibl9sb2NhbC5oLgogICAgIFtOZWlsIENvc3RpZ2FuIDxuZWlsLmNvc3RpZ2FuQGNlbG9jb20uY29tPl0KCiAgKikgVGhlIGZ1bmN0aW9uIE9CSl90eHQybmlkIHdhcyBicm9rZW4uIEl0IHdhcyBzdXBwb3NlZCB0byByZXR1cm4gYSBuaWQKICAgICBiYXNlZCBvbiBhIHRleHQgc3RyaW5nLCBsb29raW5nIHVwIHNob3J0IGFuZCBsb25nIG5hbWVzIGFuZCBmaW5hbGx5CiAgICAgImRvdCIgZm9ybWF0LiBUaGUgImRvdCIgZm9ybWF0IHN0dWZmIGRpZG4ndCB3b3JrLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBPQkpfdHh0Mm9iaiB0byBkbyB0aGUgc2FtZSBidXQgcmV0dXJuIGFuIEFTTjFfT0JKRUNUIGFuZCByZXdyb3RlIAogICAgIE9CSl90eHQybmlkIHRvIHVzZSBpdC4gT0JKX3R4dDJvYmogY2FuIGFsc28gcmV0dXJuIG9iamVjdHMgZXZlbiBpZiB0aGUKICAgICBPSUQgaXMgbm90IHBhcnQgb2YgdGhlIHRhYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFg1MDkgbG9va3VwL3ZlcmlmeSBtZXRob2RzLCBmaXhpbmcgYSBidWcgaW4KICAgICBYNTA5X0xPT0tVUF9ieV9hbGlhcygpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTb3J0IG9wZW5zc2wgZnVuY3Rpb25zIGJ5IG5hbWUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEdldCB0aGUgZ2VuZHNhIHByb2dyYW0gd29ya2luZyAoaG9wZWZ1bGx5KSBhbmQgYWRkIGl0IHRvIGFwcCBsaXN0LiBSZW1vdmUKICAgICBlbmNyeXB0aW9uIGZyb20gc2FtcGxlIERTQSBrZXlzIChpbiBjYXNlIGFueW9uZSBpcyBpbnRlcmVzdGVkIHRoZSBwYXNzd29yZAogICAgIHdhcyAiMTIzNCIpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgX2FsbF8gKl9mcmVlIGZ1bmN0aW9ucyBhY2NlcHQgYSBOVUxMIHBvaW50ZXIuCiAgICAgW0ZyYW5zIEhleW1hbnMgPGZoZXltYW5zQGlzYXNlcnZlci5iZT5dCgogICopIElmIGEgREgga2V5IGlzIGdlbmVyYXRlZCBpbiBzM19zcnZyLmMsIGRvbid0IGJsb3cgaXQgYnkgdHJ5aW5nIHRvIHVzZQogICAgIE5VTEwgcG9pbnRlcnMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBzX3NlcnZlciBzaG91bGQgc2VuZCB0aGUgQ0FmaWxlIGFzIGFjY2VwdGFibGUgQ0FzLCBub3QgaXRzIG93biBjZXJ0LgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBEb24ndCBibG93IGl0IGZvciBudW1lcmljIC1uZXdrZXkgYXJndW1lbnRzIHRvIGFwcHMvcmVxLgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBUZW1wIGtleSAiZm9yIGV4cG9ydCIgdGVzdHMgd2VyZSB3cm9uZyBpbiBzM19zcnZyLmMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBBZGQgcHJvdG90eXBlIGZvciB0ZW1wIGtleSBjYWxsYmFjayBmdW5jdGlvbnMKICAgICBTU0xfQ1RYX3NldF90bXBfe3JzYSxkaH1fY2FsbGJhY2soKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBESF9mcmVlKCkgdG9sZXJhdGUgYmVpbmcgcGFzc2VkIGEgTlVMTCBwb2ludGVyIChsaWtlIFJTQV9mcmVlKCkgYW5kCiAgICAgRFNBX2ZyZWUoKSkuIE1ha2UgWDUwOV9QVUJLRVlfc2V0KCkgY2hlY2sgZm9yIGVycm9ycyBpbiBkMmlfUHVibGljS2V5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgWDUwOV9uYW1lX2FkZF9lbnRyeSgpIGZyZWVkIHRoZSB3cm9uZyB0aGluZyBhZnRlciBhbiBlcnJvci4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgcnNhX2VheS5jIHdvdWxkIGF0dGVtcHQgdG8gZnJlZSBhIE5VTEwgY29udGV4dC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgQklPX3Nfc29ja2V0KCkgaGFkIGEgYnJva2VuIHNob3VsZF9yZXRyeSgpIG9uIFdpbmRvemUuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19mX2J1ZmZlcigpIGRpZG4ndCBwYXNzIG9uIEJJT19DVFJMX0ZMVVNILgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBNYWtlIHN1cmUgdGhlIGFscmVhZHkgZXhpc3RpbmcgWDUwOV9TVE9SRS0+ZGVwdGggdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQKICAgICBpbiBYNTA5X1NUT1JFX25ldygpLCBidXQgZG9jdW1lbnQgdGhlIGZhY3QgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHN0aWxsCiAgICAgdW51c2VkIGluIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSB2YXJpb3VzIGxpYnJhcnkgYW5kIGFwcHMgZmlsZXMgdG8gZnJlZSB1cCBwa2V5cyBvYnRhaW5lZCBmcm9tCiAgICAgWDUwOV9QVUJLRVlfZ2V0KCkgZXQgYWwuIEFsc28gYWxsb3cgeDUwOS5jIHRvIGhhbmRsZSBuZXRzY2FwZSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCByZWZlcmVuY2UgY291bnRpbmcgaW4gWDUwOV9QVUJLRVlfZ2V0KCkuIFRoaXMgbWFrZXMKICAgICBkZW1vcy9tYXVyaWNlL2V4YW1wbGUyLmMgd29yaywgYW1vbmdzdCBvdGhlcnMsIHByb2JhYmx5LgogICAgIFtTdGV2ZSBIZW5zb24gYW5kIEJlbiBMYXVyaWVdCgogICopIEZpcnN0IGN1dCBvZiBhIGNsZWFudXAgZm9yIGFwcHMvLiBGaXJzdCB0aGUgYHNzbGVheScgcHJvZ3JhbSBpcyBub3cgbmFtZWQKICAgICBgb3BlbnNzbCcgYW5kIHNlY29uZCwgdGhlIHNob3J0Y3V0IHN5bWxpbmtzIGZvciB0aGUgYG9wZW5zc2wgPGNvbW1hbmQ+JwogICAgIGFyZSBubyBsb25nZXIgY3JlYXRlZC4gVGhpcyB3YXkgd2UgaGF2ZSBhIHNpbmdsZSBhbmQgY29uc2lzdGVudCBjb21tYW5kCiAgICAgbGluZSBpbnRlcmZhY2UgYG9wZW5zc2wgPGNvbW1hbmQ+Jywgc2ltaWxhciB0byBgY3ZzIDxjb21tYW5kPicuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIFBhdWwgU3V0dG9uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBjYS5jOiBtb3ZlIHRlc3QgZm9yIERTQSBrZXlzIGluc2lkZSAjaWZuZGVmIE5PX0RTQS4gTWFrZSBwdWJrZXkKICAgICBCSVQgU1RSSU5HIHdyYXBwZXIgYWx3YXlzIGhhdmUgemVybyB1bnVzZWQgYml0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQ0EucGwsIHBlcmwgdmVyc2lvbiBvZiBDQS5zaCwgYWRkIGV4dGVuZGVkIGtleSB1c2FnZSBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnRhdGlvbiBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KICAgICBbUGF1bCBTdXR0b25dCgogICopIE1ha2VmaWxlcyB1cGRhdGVkIHRvIGV4aXQgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgc3ViLWRpcmVjdG9yeQogICAgIG1ha2UgKGluY2x1ZGluZyBpZiB1c2VyIHByZXNzZXMgXkMpIFtQYXVsIFN1dHRvbl0KCiAgKikgTWFrZSBNb250Z29tZXJ5IGNvbnRleHQgc3R1ZmYgZXhwbGljaXQgaW4gUlNBIGRhdGEgc3RydWN0dXJlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYnVpbGQgb3JkZXIgb2YgcGVtIGFuZCBlcnIgdG8gYWxsb3cgZm9yIGdlbmVyYXRlZCBwZW0uaC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHJlbnVtYmVyaW5nIGJ1ZyBpbiBYNTA5X05BTUVfZGVsZXRlX2VudHJ5KCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEVuaGFuY2VkIHRoZSBlcnItaW5zLnBsIHNjcmlwdCBzbyBpdCBtYWtlcyB0aGUgZXJyb3IgbGlicmFyeSBudW1iZXIgCiAgICAgZ2xvYmFsIGFuZCBjYW4gYWRkIGEgbGlicmFyeSBuYW1lLiBUaGlzIGlzIG5lZWRlZCBmb3IgZXh0ZXJuYWwgQVNOMSBhbmQKICAgICBvdGhlciBlcnJvciBsaWJyYXJpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgc2tfaW5zZXJ0IHdoaWNoIG5ldmVyIHdvcmtlZCBwcm9wZXJseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQVNOMSBtYWNyb3Mgc28gdGhleSBjYW4gaGFuZGxlIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnV0ZWQgCiAgICAgRVhQTElDSVQgdGFncy4gU29tZSBub24gc3RhbmRhcmQgY2VydGlmaWNhdGVzIHVzZSB0aGVzZTogdGhleSBjYW4gbm93CiAgICAgYmUgcmVhZCBpbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZWQgdGhlIHZhcmlvdXMgb2xkL29ic29sZXRlIFNTTGVheSBkb2N1bWVudGF0aW9uIGZpbGVzIChkb2MveHh4LmRvYykKICAgICBpbnRvIGEgc2luZ2xlIGRvYy9zc2xlYXkudHh0IGJ1bmRsZS4gVGhpcyB3YXkgdGhlIGluZm9ybWF0aW9uIGlzIHN0aWxsCiAgICAgcHJlc2VydmVkIGJ1dCBubyBsb25nZXIgbWVzc2VzIHVwIHRoaXMgZGlyZWN0b3J5LiBOb3cgaXQncyBuZXcgcm9vbSBmb3IKICAgICB0aGUgbmV3IHNldCBvZiBkb2N1bWVuYXRpb24gZmlsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNFVHMgd2VyZSBpbmNvcnJlY3RseSBERVIgZW5jb2RlZC4gVGhpcyB3YXMgYSBtYWpvciBwYWluLCBiZWNhdXNlIHRoZXkKICAgICBzaGFyZWQgY29kZSB3aXRoIFNFUVVFTkNFcywgd2hpY2ggYXJlbid0IGNvZGVkIHRoZSBzYW1lLiBUaGlzIG1lYW5zIHRoYXQKICAgICBhbG1vc3QgZXZlcnl0aGluZyB0byBkbyB3aXRoIFNFVHMgb3IgU0VRVUVOQ0VzIGhhcyBlaXRoZXIgY2hhbmdlZCBuYW1lIG9yCiAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICBbQmVuIExhdXJpZSwgYmFzZWQgb24gYSBwYXJ0aWFsIGZpeCBieSBHUCBKYXlhbiA8Z3BAbnNqLmNvLmpwPl0KCiAgKikgRml4IHRlc3QgZGF0YSB0byB3b3JrIHdpdGggdGhlIGFib3ZlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIFJTQSBoZWFkZXIgZGVjbGFyYXRpb25zIHRoYXQgaGlkIGEgYnVnIEkgZml4ZWQgaW4gMC45LjBiIGJ1dAogICAgIHdhcyBhbHJlYWR5IGZpeGVkIGJ5IEVyaWMgZm9yIDAuOS4xIGl0IHNlZW1zLgogICAgIFtCZW4gTGF1cmllIC0gcG9pbnRlZCBvdXQgYnkgVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQXV0b2RldGVjdCBGcmVlQlNEMy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHZhcmlvdXMgYnVncyBpbiBDb25maWd1cmUuIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczoKICAgICBuZXh0c3RlcAogICAgIG5jci1zY2RlCiAgICAgdW5peHdhcmUtMi4wCiAgICAgdW5peHdhcmUtMi4wLXBlbnRpdW0KICAgICBzY281LWNjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgZ2VuZXJhdGVkIGZpbGVzIGZyb20gQ1ZTLiBSZW9yZGVyIHRlc3RzIHRvIHJlZ2VuZXJhdGUgZmlsZXMKICAgICBiZWZvcmUgdGhleSBhcmUgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZW5lcmF0ZSBNYWtlZmlsZS5zc2wgZnJvbSBNYWtlZmlsZS5vcmcgKHRvIGtlZXAgQ1ZTIGhhcHB5KS4KICAgICBbQmVuIExhdXJpZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYiBhbmQgMC45LjFjICBbMjMtRGVjLTE5OThdCgogICopIEFkZGVkIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdG8gY3J5cHRvL2NyeXB0by5oIGFuZCAKICAgICBjaGFuZ2VkIFNTTGVheSB0byBPcGVuU1NMIGluIHZlcnNpb24gc3RyaW5ncy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAKICAqKSBTb21lIGZpeHVwcyB0byB0aGUgdG9wLWxldmVsIGRvY3VtZW50cy4KICAgICBbUGF1bCBTdXR0b25dCgogICopIEZpeGVkIHRoZSBuYXN0eSBidWcgd2hlcmUgcnNhcmVmLmggd2FzIG5vdCBmb3VuZCB1bmRlciBjb21waWxlLXRpbWUKICAgICBiZWNhdXNlIHRoZSBzeW1saW5rIHRvIGluY2x1ZGUvIHdhcyBtaXNzaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJbmNvcnBvcmF0ZWQgdGhlIHBvcHVsYXIgbm8tUlNBL0RTQS1vbmx5IHBhdGNoZXMgCiAgICAgd2hpY2ggYWxsb3cgdG8gY29tcGlsZSBhIFJTQS1mcmVlIFNTTGVheS4KICAgICBbQW5kcmV3IENvb2tlIC8gSW50ZXJyYWRlciBMZHQuLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBuYXN0eSByZWhhc2ggcHJvYmxlbSB1bmRlciBgbWFrZSAtZiBNYWtlZmlsZS5zc2wgbGlua3MnCiAgICAgd2hlbiAic3NsZWF5IiBpcyBzdGlsbCBub3QgZm91bmQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIG1vcmUgcGxhdGZvcm1zIHRvIENvbmZpZ3VyZTogQ3JheSBUM0UsIEhQVVggMTEsIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBCZWNrbWFubiA8YmVja21hbkBhY2wubGFubC5nb3Y+XQoKICAqKSBVcGRhdGVkIHRoZSBSRUFETUUgZmlsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyAuY3ZzaWdub3JlIGZpbGVzIGluIHRoZSBDVlMgcmVwb3NpdG9yeSBzdWJkaXJzCiAgICAgdG8gbWFrZSBhICJjdnMgdXBkYXRlIiByZWFsbHkgc2lsZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWNvbXBpbGVkIHRoZSBlcnJvci1kZWZpbml0aW9uIGhlYWRlciBmaWxlcyBhbmQgYWRkZWQKICAgICBtaXNzaW5nIHN5bWJvbHMgdG8gdGhlIFdpbjMyIGxpbmtlciB0YWJsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFuZWQgdXAgdGhlIHRvcC1sZXZlbCBkb2N1bWVudHM7CiAgICAgbyBuZXcgZmlsZXM6IENIQU5HRVMgYW5kIExJQ0VOU0UKICAgICBvIG1lcmdlZCBWRVJTSU9OLCBISVNUT1JZKiBhbmQgUkVBRE1FKiBmaWxlcyBhIENIQU5HRVMuU1NMZWF5IAogICAgIG8gbWVyZ2VkIENPUFlSSUdIVCBpbnRvIExJQ0VOU0UKICAgICBvIHJlbW92ZWQgb2Jzb2xldGUgVE9ETyBmaWxlCiAgICAgbyByZW5hbWVkIE1JQ1JPU09GVCB0byBJTlNUQUxMLlczMgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmVkIGR1bW15IGZpbGVzIGZyb20gdGhlIDAuOS4xYiBzb3VyY2UgdHJlZTogCiAgICAgY3J5cHRvL2FzbjEveCBjcnlwdG8vYmlvL2NkIGNyeXB0by9iaW8vZmcgY3J5cHRvL2Jpby9ncmVwIGNyeXB0by9iaW8vdmkKICAgICBjcnlwdG8vYm4vYXNtLy4uLi4uLmFkZC5jIGNyeXB0by9ibi9hc20vYS5vdXQgY3J5cHRvL2RzYS9mIGNyeXB0by9tZDUvZgogICAgIGNyeXB0by9wZW0vZ21vbi5vdXQgY3J5cHRvL3Blcmxhc20vZiBjcnlwdG8vcGtjczcvYnVpbGQgY3J5cHRvL3JzYS9mCiAgICAgY3J5cHRvL3NoYS9hc20vZiBjcnlwdG8vdGhyZWFkcy9mIG1zL3p6eiBzc2wvZiBzc2wvZi5tYWsgdGVzdC9mCiAgICAgdXRpbC9mLm1hayB1dGlsL3BsL2YgdXRpbC9wbC9mLm1hayBjcnlwdG8vYmYvYmZfbG9jbC5vbGQgYXBwcy9mCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgcGxhdGZvcm0gcG9ydGFiaWxpdHkgZml4ZXMuCiAgICAgW01hcmsgSi4gQ294XQoKICAqKSBUaGUgR2VuZXNpcyBvZiB0aGUgT3BlblNTTCBycGplY3Q6CiAgICAgV2Ugc3RhcnQgd2l0aCB0aGUgbGF0ZXN0ICh1bnJlbGVhc2VkKSBTU0xlYXkgdmVyc2lvbiAwLjkuMWIgd2hpY2ggRXJpYyBBLgogICAgIFlvdW5nIGFuZCBUaW0gSi4gSHVkc29uIGNyZWF0ZWQgd2hpbGUgdGhleSB3ZXJlIHdvcmtpbmcgZm9yIEMyTmV0IHVudGlsCiAgICAgc3VtbWVyIDE5OTguCiAgICAgW1RoZSBPcGVuU1NMIFByb2plY3RdCiAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjBiIGFuZCAwLjkuMWIgIFtub3QgcmVsZWFzZWRdCgogICopIFVwZGF0ZWQgYSBmZXcgQ0EgY2VydGlmaWNhdGVzIHVuZGVyIGNlcnRzLwogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIHNvbWUgQklHTlVNIGFwaSBzdHVmZi4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgVmFyaW91cyBwbGF0Zm9ybSBwb3J0czogT3BlbkJTRCwgVWx0cml4LCBJUklYIDY0Yml0LCBOZXRCU0QsIAogICAgIERHVVggeDg2LCBMaW51eCBBbHBoYSwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOZXcgQ09NUCBsaWJyYXJ5IFtjcnlwdG8vY29tcC9dIGZvciBTU0wgUmVjb3JkIExheWVyIENvbXByZXNzaW9uOiAKICAgICBSTEUgKGR1bW15IGltcGxlbWVudGVkKSBhbmQgWkxJQiAocmVhbGx5IGltcGxlbWVudGVkIHdoZW4gWkxJQiBpcwogICAgIGF2YWlsYWJsZSkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZCAtc3RycGFyc2Ugb3B0aW9uIHRvIGFzbjFwYXJzIHByb2dyYW0gd2hpY2ggcGFyc2VzIG5lc3RlZCAKICAgICBiaW5hcnkgc3RydWN0dXJlcyAKICAgICBbRHIgU3RlcGhlbiBIZW5zb24gPHNoZW5zb25AYmlnZm9vdC5jb20+XQoKICAqKSBBZGRlZCAib2lkX2ZpbGUiIHRvIHNzbGVheS5jbmYgZm9yICJjYSIgYW5kICJyZXEiIHByb2dyYW1zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBEU0EgZml4IGZvciAiY2EiIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkICItZ2Vua2V5IiBvcHRpb24gdG8gImRzYXBhcmFtIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBSSVBFIE1EMTYwIChybWQxNjApIG1lc3NhZ2UgZGlnZXN0LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAtYSAoYWxsKSBvcHRpb24gdG8gInNzbGVheSB2ZXJzaW9uIiBjb21tYW5kLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBQTEFURk9STSBkZWZpbmUgd2hpY2ggaXMgdGhlIGlkIGdpdmVuIHRvIENvbmZpZ3VyZS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgTWVtQ2hlY2tfWFhYWCBmdW5jdGlvbnMgdG8gY3J5cHRvL21lbS5jIGZvciBtZW1vcnkgY2hlY2tpbmcuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIHRoZSBBU04uMSBwYXJzZXIgcm91dGluZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIEJJTyByb3V0aW5lcyB0byBzdXBwb3J0IFJFVVNFQUREUiwgc2VlaywgdGVsbCwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBhIEJOX0NUWCB0byB0aGUgQk4gbGlicmFyeS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdGhlIHdlYWsga2V5IHZhbHVlcyBpbiBERVMgbGlicmFyeQogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIEFQSSBpbiBFVlAgbGlicmFyeSBmb3IgY2lwaGVyIGFsaWFzZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFJDMi82NGJpdCBjaXBoZXIuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENvbnZlcnRlZCB0aGUgbGhhc2ggbGlicmFyeSB0byB0aGUgY3J5cHRvL21lbS5jIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSByZWNvZ25pemVkIEFTTi4xIG9iamVjdCBpZHMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgUlNBIHBhZGRpbmcgY2hlY2tzIGZvciBTU0wvVExTLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBCSU8gcHJveHkvZmlsdGVyIGZ1bmN0aW9uYWxpdHkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGV4dHJhX2NlcnRzIHRvIFNTTF9DVFggd2hpY2ggY2FuIGJlIHVzZWQKICAgICBzZW5kIGV4dHJhIENBIGNlcnRpZmljYXRlcyB0byB0aGUgY2xpZW50IGluIHRoZSBDQSBjZXJ0IGNoYWluIHNlbmRpbmcKICAgICBwcm9jZXNzLiBJdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTm93IEZvcnRlenphIGlzIGRlbmllZCBpbiB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UgYmVjYXVzZQogICAgIHRoaXMgaXMga2V5IGV4Y2hhbmdlIG1lY2hhbmlzbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNTTGVheSBhdCBhbGwuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGl0aW9uYWwgUEtDUzEgY2hlY2tzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBTdXBwb3J0IHRoZSBzdHJpbmcgIlRMU3YxIiBmb3IgYWxsIFRMUyB2MSBjaXBoZXJzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBmdW5jdGlvbiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgd2hpY2ggZ2l2ZXMgdGhlCiAgICAgZXhfZGF0YSBpbmRleCBvZiB0aGUgU1NMIGNvbnRleHQgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIGV4X2RhdGEuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdmFyaW91cyBjb2RlIGFuZCBjb21tZW50IHR5cG9zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBIG1pbm9yIGJ1ZyBpbiBzc2wvczNfY2xudC5jIHdoZXJlIHRoZXJlIHdvdWxkIGFsd2F5cyBiZSA0IDAgCiAgICAgYnl0ZXMgc2VudCBpbiB0aGUgY2xpZW50IHJhbmRvbS4KICAgICBbRWR3YXJkIEJpc2hvcCA8ZWJpc2hvcEBzcHlnbGFzcy5jb20+XQoK