TmFtZSBTdHJpbmdzCgogICAgY2xfZXh0X2F0b21pY19jb3VudGVyc18zMgoKICAgICNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTiBjbF9leHRfYXRvbWljX2NvdW50ZXJzXzMyIDogZW5hYmxlCgpDb250cmlidXRvcnMKCiAgICBCZW5lZGljdCBHYXN0ZXIsIEFNRAogICAgR2VybWFuIEFuZHJ5ZXlldiwgQU1ECiAgICBPZmVyIFJvc2VuYmVyZywgQU1ECiAgICBBYWZ0YWIgTXVuc2hpLCBBcHBsZQogICAgUm9iZXJ0IEVsbGlvdHQsIEFSTQoKQ29udGFjdAoKICAgIEJlbmVkaWN0IEdhc3RlciwgYmVuZWRpY3QgJ2RvdCcgZ2FzdGVyICdhdCcgYW1kICdkb3QnIGNvbQoKSVAgU3RhdHVzCgogICAgTm8ga25vd24gSVAgaXNzdWVzCgpWZXJzaW9uCgogICAgVmVyc2lvbiA1LCBNYXkgMjYsIDIwMTEKCk51bWJlcgoKICAgIE9wZW5DTCBFeHRlbnNpb24gIzEyCgpTdGF0dXMKCiAgICBBcHByb3ZlZCBieSBjb250cmlidXRpbmcgbWVtYmVycwoKRXh0ZW5zaW9uIFR5cGUKCiAgICBPcGVuQ0wgZGV2aWNlIGV4dGVuc2lvbnMKCkRlcGVuZGVuY2llcwoKICAgIE5vbmUKCk92ZXJ2aWV3CgogICAgVGhpcyBleHRlbnNpb24gYWRkcyBzdXBwb3J0IGluIHRoZSBPcGVuQ0wgQyBsYW5ndWFnZSBmb3IgMzItYml0IGF0b21pYwogICAgY291bnRlcnMuCiAgICBBdG9taWMgY291bnRlciBpcyBhIGRldmljZS1sZXZlbCBjb3VudGVyIHRoYXQgY2FuIGJlIGFkZGVkIC8gZGVjcmVtZW50ZWQKICAgIGJ5IHdvcmstaXRlbXMgaW4gYSB3b3JrLWdyb3VwIG9yIGFjcm9zcyB3b3JrLWdyb3VwcyBleGVjdXRpbmcgYSBrZXJuZWwsCiAgICB3aGVyZSB0aGUgYXRvbWljaXR5IG9mIHRoZSBvcGVyYXRpb24gaXMgZ3VhcmFudGVlZC4KICAgIFRoZSBhY2Nlc3MgdG8gdGhlIGNvdW50ZXIgaXMgZG9uZSBvbmx5IHZpYSBhZGQvZGVjIGJ1aWx0LWluIGZ1bmN0aW9ucywKICAgIGFuZCBhcyBzdWNoIG5vIHR3byB3b3JraXRlbXMgd2lsbCBzZWUgdGhlIHNhbWUgdmFsdWUgcmV0dXJuZWQgaW4gdGhlIGNhc2UKICAgIHRoYXQgYSBnaXZlbiBrZXJuZWwgb25seSBpbmNyZW1lbnRzIG9yIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIuCgogICAgVGhpcyBmZWF0dXJlIGlzIGhpZ2hseSB1c2VmdWwgZm9yIHByb2R1Y2UvY29uc3VtZSB0byB1bm9yZGVyZWQgcXVldWVzLgoKSGVhZGVyIEZpbGUKCiAgICBOb25lCgpOZXcgUHJvY2VkdXJlcyBhbmQgRnVuY3Rpb25zCgogICAgTm9uZQoKTmV3IFRva2VucwoKICAgIENMX0RFVklDRV9NQVhfQVRPTUlDX0NPVU5URVJTX0VYVCA9IDB4NDAzMgoKCkFkZGl0aW9ucyB0byBDaGFwdGVyIDQuMiBvZiB0aGUgT3BlbkNMIDEuMSBTcGVjaWZpY2F0aW9uCgogICAgQW4gYWRkaXRpb25hbCBkZXZpY2UgcXVlcnkgaXMgYWRkZWQgdG8gdGFibGUgNC4zIChPcGVuQ0wgRGV2aWNlIFF1ZXJpZXMpCiAgICBhbmQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgoKICAgIENMX0RFVklDRV9JTkZPICAgICAgICAgICAgICAgICAgICB8IFJldHVybiBUeXBlIHwgIERlc2NyaXB0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ0xfREVWSUNFX01BWF9BVE9NSUNfQ09VTlRFUlNfRVhUIHwgY2xfdWludCAgICAgfCBNYXggbnVtYmVyIG9mIGF0b21pYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb3VudGVycyB0aGF0IGNhbiBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2VkIGJ5IGEga2VybmVsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgbWluaW11bSB2YWx1ZSBpcyA4LgoKCgpBZGRpdGlvbnMgdG8gQ2hhcHRlciA2LjEuMyBvZiB0aGUgT3BlbkNMIDEuMSBTcGVjaWZpY2F0aW9uCgogICAgQW4gYWRkaXRpb25hbCBkYXRhIHR5cGUgaXMgYWRkZWQgdG8gdGFibGUgNi4zIChPdGhlciBCdWlsdC1pbiBEYXRhIFR5cGVzKQogICAgYW5kIGlzIGRlZmluZWQgYXMgZm9sbG93czoKCiAgICBUeXBlICAgICAgICAgfCBEZXNjcmlwdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBjb3VudGVyMzJfdCAgfCBBIDMyLWJpdCBhdG9taWMgY291bnRlci4gUmVmZXIgdG8gc2VjdGlvbiA2LjExLlhYIChBdG9taWMgCgkgICAgICAgICAgICAgfCBDb3VudGVyIEZ1bmN0aW9ucykgYmVsb3cgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcwogICAgICAgICAgICAgICAgIHwgdHlwZS4KCiAgICBWYXJpYWJsZXMgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBjb3VudGVyMzJfdCBjYW4gb25seSBiZSBzcGVjaWZpZWQgYXMKICAgIGFyZ3VtZW50cyB0byBhIGtlcm5lbCBvciBhIG5vbi1rZXJuZWwgZnVuY3Rpb24uIFRoZXNlIHR5cGVzIGNhbm5vdCBiZQogICAgdXNlZCBpbiBhbnkgZXhwcmVzc2lvbiBldmFsdWF0aW9uLCBvciBoYXZlIHZhbHVlcyBhc3NpZ25lZCB0byBpdCBpbnNpZGUKICAgIGEga2VybmVsIG9yIGEgZnVuY3Rpb24uIFRoZXNlIHR5cGVzIGNhbm5vdCBiZSB1c2VkIHRvIGRlY2xhcmUgbG9jYWwKICAgIHZhcmlhYmxlcyBvciBhcyB0aGUgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbi4KICAgIEEgY291bnRlcjMyX3QgYXJndW1lbnQgdG8gYSBmdW5jdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQuCgoKQWRkaXRpb25zIHRvIENoYXB0ZXIgNi4xMSBvZiB0aGUgT3BlbkNMIDEuMSBTcGVjaWZpY2F0aW9uCgogICAgQWRkIGEgbmV3IHNlY3Rpb24gbmFtZWQgk0F0b21pYyBDb3VudGVyIEZ1bmN0aW9uc5QsIGFzIGZvbGxvd3M6CgogICAgNi4xMS5YWCBBdG9taWMgQ291bnRlciBGdW5jdGlvbnMKICAgIEF0b21pYyBjb3VudGVyIGlzIGEgZGV2aWNlLWxldmVsIGNvdW50ZXIgdGhhdCBjYW4gYmUgYWRkZWQgLyBkZWNyZW1lbnRlZAogICAgYnkgZGlmZmVyZW50IHdvcmtpdGVtcywgd2hlcmUgdGhlIGF0b21pY2l0eSBvZiB0aGUgb3BlcmF0aW9uIGlzCiAgICBndWFyYW50ZWVkLgoKICAgIFRoZSBhY2Nlc3MgdG8gdGhlIGNvdW50ZXIgaXMgZG9uZSBvbmx5IHZpYSBhdG9taWMgaW5jL2RlYyBidWlsdC1pbgogICAgZnVuY3Rpb25zLCB3aGljaCByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgY291bnRlci4gVGhlIGluYy9kZWMKICAgIG9wZXJhdGlvbiBoYXMgYSBnbG9iYWwgc2NvcGUgYWNyb3NzIGFsbCB3b3JraXRlbXMsIGFuZCBhcyBzdWNoIG5vIHR3bwogICAgd29ya2l0ZW1zIHdpbGwgc2VlIHRoZSBzYW1lIHZhbHVlIHJldHVybmVkIGluIHRoZSBjYXNlIHRoYXQgYSBnaXZlbiBrZXJuZWwKICAgIG9ubHkgaW5jcmVtZW50cyBvciBkZWNyZW1lbnRzIHRoZSBjb3VudGVyLCB1bmxlc3MgdGhlIGNvdW50ZXIgb3ZlcmZsb3dzCiAgICBhbmQgdGhlbiB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgoKICAgIEF0b21pYyBjb3VudGVyIGNhbm5vdCBiZSBhc3NpZ25lZCBkaXJlY3RseSB0byBhIHZhcmlhYmxlIG9yIGEgcG9pbnRlciwgb3IKICAgIHVzZWQgaW4gYW55IGV4cHJlc3Npb24gZXZhbHVhdGlvbi4gSW4gYWRkaXRpb24sIHRoZSBzYW1lIGNvdW50ZXIgY2Fubm90IGJlCiAgICBpbmNyZW1lbnRlZCBhbmQgZGVjcmVtZW50ZWQgaW5zaWRlIGEgc2luZ2xlIGtlcm5lbC4KCiAgICBUaGUgSG9zdCBpbml0aWFsaXplcyB0aGUgYXRvbWljIGNvdW50ZXIgYnkgcGFzc2luZyBhIGJ1ZmZlciBvYmplY3QgYXMgYW4KICAgIGFyZ3VtZW50IHRvIHRoZSBrZXJuZWwuIFRoZSBjb3VudGVyIGluaXRpYWwgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUgZmlyc3QKICAgIDQgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBvYmplY3QuIER1cmluZyB0aGUgcnVuIG9mIHRoZSBrZXJuZWwsIHRoZSBnbG9iYWwKICAgIGJ1ZmZlciBpcyBub3QgdXBkYXRlZCBieSB0aGUgYXRvbWljIG9wZXJhdGlvbnMgZG9uZSBvbiB0aGUgY291bnRlci4gQXQgdGhlCiAgICBlbmQgb2YgdGhlIGtlcm5lbJJzIHJ1biwgdGhlIHVwZGF0ZWQgdmFsdWUgb2YgdGhlIGNvdW50ZXIgaXMgd3JpdHRlbiB0bwogICAgdGhlIGJ1ZmZlciBvYmplY3QuCgogICAgVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGxpc3Qgb2YgYnVpbHQtaW4gYXRvbWljIGNvdW50ZXIKICAgIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGEgdmFsdWUgb2YgdHlwZQogICAgY291bnRlcjY0X3QuCgoKICAgIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdWludCBhdG9taWNfaW5jKGNvdW50ZXIzMl90IGNvdW50ZXIpIHwgUmVhZCB0aGUgdmFsdWUgKHJlZmVycmVkIHRvIGFzIG9sZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mIGNvdW50ZXIuIENvbXB1dGUgKG9sZCArIDEpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlIGNvdW50ZXIgdG8gdGhpcyB2YWx1ZS4gVGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiByZXR1cm5zIG9sZC4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB1aW50IGF0b21pY19kZWMoY291bnRlcjMyX3QgY291bnRlcikgfCBSZWFkIHRoZSB2YWx1ZSAocmVmZXJyZWQgdG8gYXMgb2xkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2YgY291bnRlci4gQ29tcHV0ZSAob2xkIC0gMSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1cGRhdGUgY291bnRlciB0byB0aGlzIHZhbHVlLiBUaGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHJldHVybnMgb2xkCgoKCgpJbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBleHRlbnNpb25zCgogICAgTm9uZQo=