V2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYzEKWFhYIFJlbGVhc2UgZGF0ZTogPz8tRGVjLTIwMDEgWFhYCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVHlwZS9jbGFzcyB1bmlmaWNhdGlvbiBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKCkNvcmUgYW5kIGJ1aWx0aW5zCgpFeHRlbnNpb24gbW9kdWxlcwoKLSBnYy5nZXRfcmVmZXJlbnRzIHdhcyByZW5hbWVkIHRvIGdjLmdldF9yZWZlcnJlcnMuCgpMaWJyYXJ5CgotIHdlYmJyb3dzZXIgZGVmYXVsdHMgdG8gbmV0c2NhcGUuZXhlIG9uIE9TLzIgbm93LgoKLSBUaXguUmVzaXplSGFuZGxlIGV4cG9zZXMgZGV0YWNoX3dpZGdldCwgaGlkZSwgYW5kIHNob3cuCgotIFRoZSBjaGFyc2V0IGFsaWFzIHdpbmRvd3NfMTI1MiBoYXMgYmVlbiBhZGRlZC4KClRvb2xzL0RlbW9zCgpCdWlsZAoKQyBBUEkKCi0gUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCkgcmVxdWlyZXMgdGhhdCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KICB0aGUga2V5d29yZCBsaXN0IGVxdWFscyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHNwZWNpZmllcnMuICBUaGlzCiAgd2Fzbid0IGNoZWNrZWQgY29ycmVjdGx5LCBhbmQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIGNvdWxkIGV2ZW4KICBkdW1wIGNvcmUgaW4gc29tZSBiYWQgY2FzZXMuICBUaGlzIGhhcyBiZWVuIHJlcGFpcmVkLiAgQXMgYSByZXN1bHQsCiAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIG1heSByYWlzZSBSdW50aW1lRXJyb3IgaW4gYmFkIGNhc2VzIHRoYXQKICBwcmV2aW91c2x5IHdlbnQgdW5jaGFsbGVuZ2VkLgoKTmV3IHBsYXRmb3JtcwoKVGVzdHMKCldpbmRvd3MKCk1hYwoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmIyPwpSZWxlYXNlIGRhdGU6IDE2LU5vdi0yMDAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVHlwZS9jbGFzcyB1bmlmaWNhdGlvbiBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKCi0gTXVsdGlwbGUgaW5oZXJpdGFuY2UgbWl4aW5nIG5ldy1zdHlsZSBhbmQgY2xhc3NpYyBjbGFzc2VzIGluIHRoZQogIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIGlzIG5vdyBhbGxvd2VkLCBzbyB0aGlzIHdvcmtzIG5vdzoKCiAgICAgIGNsYXNzIENsYXNzaWM6IHBhc3MKICAgICAgY2xhc3MgTWl4ZWQoQ2xhc3NpYywgb2JqZWN0KTogcGFzcwoKICBUaGUgTVJPIChtZXRob2QgcmVzb2x1dGlvbiBvcmRlcikgZm9yIGVhY2ggYmFzZSBjbGFzcyBpcyByZXNwZWN0ZWQKICBhY2NvcmRpbmcgdG8gaXRzIGtpbmQsIGJ1dCB0aGUgTVJPIGZvciB0aGUgZGVyaXZlZCBjbGFzcyBpcyBjb21wdXRlZAogIHVzaW5nIG5ldy1zdHlsZSBNUk8gcnVsZXMgaWYgYW55IGJhc2UgY2xhc2UgaXMgYSBuZXctc3R5bGUgY2xhc3MuCiAgVGhpcyBuZWVkcyB0byBiZSBkb2N1bWVudGVkLgoKLSBUaGUgbmV3IGJ1aWx0aW4gZGljdGlvbmFyeSgpIGNvbnN0cnVjdG9yLCBhbmQgZGljdGlvbmFyeSB0eXBlLCBoYXZlCiAgYmVlbiByZW5hbWVkIHRvIGRpY3QuICBUaGlzIHJlZmxlY3RzIGEgZGVjYWRlIG9mIGNvbW1vbiB1c2FnZS4KCi0gZGljdCgpIG5vdyBhY2NlcHRzIGFuIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgMi1zZXF1ZW5jZXMuICBGb3IKICBleGFtcGxlLCBkaWN0KGQuaXRlbXMoKSkgPT0gZCBmb3IgYW55IGRpY3Rpb25hcnkgZC4gIFRoZSBhcmd1bWVudCwKICBhbmQgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcmd1bWVudCwgY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3RzLgoKLSBOZXctc3R5bGUgY2xhc3NlcyBjYW4gbm93IGhhdmUgYSBfX2RlbF9fIG1ldGhvZCwgd2hpY2ggaXMgY2FsbGVkCiAgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVsZXRlZCAoanVzdCBsaWtlIGZvciBjbGFzc2ljIGNsYXNzZXMpLgoKLSBBc3NpZ25tZW50IHRvIG9iamVjdC5fX2RpY3RfXyBpcyBub3cgcG9zc2libGUsIGZvciBvYmplY3RzIHRoYXQgYXJlCiAgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzIHRoYXQgaGF2ZSBhIF9fZGljdF9fICh1bmxlc3MgdGhlIGJhc2UKICBjbGFzcyBmb3JiaWRzIGl0KS4KCi0gTWV0aG9kcyBvZiBidWlsdC1pbiB0eXBlcyBub3cgcHJvcGVybHkgY2hlY2sgZm9yIGtleXdvcmQgYXJndW1lbnRzCiAgKGZvcm1lcmx5IHRoZXNlIHdlcmUgc2lsZW50bHkgaWdub3JlZCkuICBUaGUgb25seSBidWlsdC1pbiBtZXRob2RzCiAgdGhhdCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIGFyZSBfX2NhbGxfXywgX19pbml0X18gYW5kIF9fbmV3X18uCgotIFRoZSBzb2NrZXQgZnVuY3Rpb24gaGFzIGJlZW4gY29udmVydGVkIHRvIGEgdHlwZTsgc2VlIGJlbG93LgoKQ29yZSBhbmQgYnVpbHRpbnMKCi0gQXNzaWdubWVudCB0byBfX2RlYnVnX18gcmFpc2VzIFN5bnRheEVycm9yIGF0IGNvbXBpbGUtdGltZS4gIFRoaXMKICB3YXMgcHJvbWlzZWQgd2hlbiAyLjFjMSB3YXMgcmVsZWFzZWQgYXMgIldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMWMxIgogIChzZWUgYmVsb3cpIHNheXMuCgotIENsYXJpZmllZCB0aGUgZXJyb3IgbWVzc2FnZXMgZm9yIHVuc3VwcG9ydGVkIG9wZXJhbmRzIHRvIGFuIG9wZXJhdG9yCiAgKGxpa2UgMSArICcnKS4KCkV4dGVuc2lvbiBtb2R1bGVzCgotIG1tYXAgaGFzIGEgbmV3IGtleXdvcmQgYXJndW1lbnQsICJhY2Nlc3MiLCBhbGxvd2luZyBhIHVuaWZvcm0gd2F5IGZvcgogIGJvdGggV2luZG93cyBhbmQgVW5peCB1c2VycyB0byBjcmVhdGUgcmVhZC1vbmx5LCB3cml0ZS10aHJvdWdoIGFuZAogIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcHBpbmdzLiAgVGhpcyB3YXMgcHJldmlvdXNseSBwb3NzaWJsZSBvbmx5IG9uCiAgVW5peC4gIEEgbmV3IGtleXdvcmQgYXJndW1lbnQgd2FzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhpcyBpbiBhCiAgdW5pZm9ybSB3YXkgYmVjYXVzZSB0aGUgbW1hcCgpIHNpZ251YXR1cmVzIGhhZCBkaXZlcmdlZCBhY3Jvc3MKICBwbGF0Zm9ybXMuICBUaGFua3MgdG8gSmF5IFQgTWlsbGVyIGZvciByZXBhaXJpbmcgdGhpcyEKCi0gQnkgZGVmYXVsdCwgdGhlIGdjLmdhcmJhZ2UgbGlzdCBub3cgY29udGFpbnMgb25seSB0aG9zZSBpbnN0YW5jZXMgaW4KICB1bnJlYWNoYWJsZSBjeWNsZXMgdGhhdCBoYXZlIF9fZGVsX18gbWV0aG9kczsgaW4gMi4xIGl0IGNvbnRhaW5lZCBhbGwKICBpbnN0YW5jZXMgaW4gdW5yZWFjaGFibGUgY3ljbGVzLiAgIkluc3RhbmNlcyIgaGVyZSBoYXMgYmVlbiBnZW5lcmFsaXplZAogIHRvIGluY2x1ZGUgaW5zdGFuY2VzIG9mIGJvdGggbmV3LXN0eWxlIGFuZCBvbGQtc3R5bGUgY2xhc3Nlcy4KCi0gVGhlIHNvY2tldCBtb2R1bGUgZGVmaW5lcyBhIG5ldyBtZXRob2QgZm9yIHNvY2tldCBvYmplY3RzLAogIHNlbmRhbGwoKS4gIFRoaXMgaXMgbGlrZSBzZW5kKCkgYnV0IG1heSBtYWtlIG11bHRpcGxlIGNhbGxzIHRvCiAgc2VuZCgpIHVudGlsIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQuICBBbHNvLCB0aGUgc29ja2V0IGZ1bmN0aW9uIGhhcwogIGJlZW4gY29udmVydGVkIHRvIGEgc3ViY2xhc3NhYmxlIHR5cGUsIGxpa2UgbGlzdCBhbmQgdHVwbGUgKGV0Yy4pCiAgYmVmb3JlIGl0OyBzb2NrZXQgYW5kIFNvY2tldFR5cGUgYXJlIG5vdyB0aGUgc2FtZSB0aGluZy4KCi0gVmFyaW91cyBidWdmaXhlcyB0byB0aGUgY3Vyc2VzIG1vZHVsZS4gIFRoZXJlIGlzIG5vdyBhIHRlc3Qgc3VpdGUKICBmb3IgdGhlIGN1cnNlcyBtb2R1bGUgKHlvdSBoYXZlIHRvIHJ1biBpdCBtYW51YWxseSkuCgotIGJpbmFzY2lpLmIyYV9iYXNlNjQgbm8gbG9uZ2VyIHBsYWNlcyBhbiBhcmJpdHJhcnkgcmVzdHJpY3Rpb24gb2YgNTcKICBieXRlcyBvbiBpdHMgaW5wdXQuCgpMaWJyYXJ5CgotIHRrRmlsZURpYWxvZyBleHBvc2VzIGEgRGlyZWN0b3J5IGNsYXNzIGFuZCBhc2tkaXJlY3RvcnkKICBjb252ZW5pZW5jZSBmdW5jdGlvbi4KCi0gU3ltYm9saWMgZ3JvdXAgbmFtZXMgaW4gcmVndWxhciBleHByZXNzaW9ucyBtdXN0IGJlIHVuaXF1ZS4gIEZvcgogIGV4YW1wbGUsIHRoZSByZWdleHAgcicoP1A8YWJjPikoP1A8YWJjPiknIGlzIG5vdCBhbGxvd2VkLCBiZWNhdXNlIGEKICBzaW5nbGUgbmFtZSBjYW4ndCBtZWFuIGJvdGggImdyb3VwIDEiIGFuZCAiZ3JvdXAgMiIgc2ltdWx0YW5lb3VzbHkuCiAgUHl0aG9uIDIuMiBkZXRlY3RzIHRoaXMgZXJyb3IgYXQgcmVnZXhwIGNvbXBpbGF0aW9uIHRpbWU7CiAgcHJldmlvdXNseSwgdGhlIGVycm9yIHdlbnQgdW5kZXRlY3RlZCwgYW5kIHJlc3VsdHMgd2VyZQogIHVucHJlZGljdGFibGUuICBBbHNvIGluIHNyZSwgdGhlIHBhdHRlcm4uc3BsaXQoKSwgcGF0dGVybi5zdWIoKSwgYW5kCiAgcGF0dGVybi5zdWJuKCkgbWV0aG9kcyBoYXZlIGJlZW4gcmV3cml0dGVuIGluIEMuICBBbHNvLCBhbgogIGV4cGVyaW1lbnRhbCBmdW5jdGlvbi9tZXRob2QgZmluZGl0ZXIoKSBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggd29ya3MKICBsaWtlIGZpbmRhbGwoKSBidXQgcmV0dXJucyBhbiBpdGVyYXRvci4KCi0gVGl4IGV4cG9zZXMgbW9yZSBjb21tYW5kcyB0aHJvdWdoIHRoZSBjbGFzc2VzIERpclNlbGVjdEJveCwKICBEaXJTZWxlY3REaWFsb2csIExpc3ROb3RlQm9vaywgTWV0ZXIsIENoZWNrTGlzdCwgYW5kIHRoZQogIG1ldGhvZHMgdGl4X2FkZGJpdG1hcGRpciwgdGl4X2NnZXQsIHRpeF9jb25maWd1cmUsIHRpeF9maWxlZGlhbG9nLAogIHRpeF9nZXRiaXRtYXAsIHRpeF9nZXRpbWFnZSwgdGl4X29wdGlvbl9nZXQsIGFuZCB0aXhfcmVzZXRvcHRpb25zLgoKLSBUcmFjZWJhY2sgb2JqZWN0cyBhcmUgbm93IHNjYW5uZWQgYnkgY3ljbGljIGdhcmJhZ2UgY29sbGVjdGlvbiwgc28KICBjeWNsZXMgY3JlYXRlZCBieSBjYXN1YWwgdXNlIG9mIHN5cy5leGNfaW5mbygpIG5vIGxvbmdlciBjYXVzZQogIHBlcm1hbmVudCBtZW1vcnkgbGVha3MgKHByb3ZpZGVkIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBlbmFibGVkKS4KCi0gb3MuZXh0c2VwIC0tIGEgbmV3IHZhcmlhYmxlIG5lZWRlZCBieSB0aGUgUklTQ09TIHN1cHBvcnQuICBJdCBpcyB0aGUKICBzZXBhcmF0b3IgdXNlZCBieSBleHRlbnNpb25zLCBhbmQgaXMgJy4nIG9uIGFsbCBwbGF0Zm9ybXMgZXhjZXB0CiAgUklTQ09TLCB3aGVyZSBpdCBpcyAnLycuICBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGlzIHZhcmlhYmxlCiAgdW5sZXNzIHlvdSBoYXZlIGEgbWFzb2NoaXN0aWMgZGVzaXJlIHRvIHBvcnQgeW91ciBjb2RlIHRvIFJJU0NPUy4KCi0gbWltZXR5cGVzLnB5IGhhcyBvcHRpb25hbCBzdXBwb3J0IGZvciBub24tc3RhbmRhcmQsIGJ1dCBjb21tb25seQogIGZvdW5kIHR5cGVzLiAgZ3Vlc3NfdHlwZSgpIGFuZCBndWVzc19leHRlbnNpb24oKSBub3cgYWNjZXB0IGFuCiAgb3B0aW9uYWwgYHN0cmljdCcgZmxhZywgZGVmYXVsdGluZyB0byB0cnVlLCB3aGljaCBjb250cm9scyB3aGV0aGVyCiAgcmVjb2duaXplIG5vbi1zdGFuZGFyZCB0eXBlcyBvciBub3QuICBBIGZldyBub24tc3RhbmRhcmQgdHlwZXMgd2UKICBrbm93IGFib3V0IGhhdmUgYmVlbiBhZGRlZC4gIEFsc28sIHdoZW4gcnVuIGFzIGEgc2NyaXB0LCB0aGVyZSBhcmUKICBuZXcgLWwgYW5kIC1lIG9wdGlvbnMuCgotIHN0YXRjYWNoZSBpcyBub3cgZGVwcmVjYXRlZC4KCi0gZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZSgpIG5vdyBwcm9kdWNlcyB0aGUgcHJlZmVycmVkIFJGQyAyODIyIHN0eWxlCiAgZGF0ZXMgd2l0aCBudW1lcmljIHRpbWV6b25lcyAoaXQgdXNlZCB0byBwcm9kdWNlIG9ic29sZXRlIGRhdGVzCiAgaGFyZCBjb2RlZCB0byAiR01UIiB0aW1lem9uZSkuICBBbiBvcHRpb25hbCBgbG9jYWx0aW1lJyBmbGFnIGlzCiAgYWRkZWQgdG8gcHJvZHVjZSBkYXRlcyBpbiB0aGUgbG9jYWwgdGltZXpvbmUsIHdpdGggZGF5bGlnaHQgc2F2aW5ncwogIHRpbWUgcHJvcGVybHkgdGFrZW4gaW50byBhY2NvdW50LgoKLSBJbiBwaWNrbGUgYW5kIGNQaWNrbGUsIGluc3RlYWQgb2YgbWFza2luZyBlcnJvcnMgaW4gbG9hZCgpIGJ5CiAgdHJhbnNmb3JtaW5nIHRoZW0gaW50byBTeXN0ZW1FcnJvciwgd2UgbGV0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24KICBwcm9wYWdhdGUgb3V0LiAgQWxzbywgaW1wbGVtZW50IHN1cHBvcnQgZm9yIF9fc2FmZV9mb3JfdW5waWNrbGluZ19fCiAgaW4gcGlja2xlLCBhcyBpdCBhbHJlYWR5IHdhcyBzdXBwb3J0ZWQgaW4gY1BpY2tsZS4KClRvb2xzL0RlbW9zCgpCdWlsZAoKLSBUaGUgZGJtIG1vZHVsZSBpcyBidWlsdCB1c2luZyBsaWJkYjEgaWYgYXZhaWxhYmxlLiAgVGhlIGJzZGRiIG1vZHVsZQogIGlzIGJ1aWx0IHdpdGggbGliZGIzIGlmIGF2YWlsYWJsZS4KCi0gTWlzYy9NYWtlZmlsZS5wcmUuaW4gaGFzIGJlZW4gcmVtb3ZlZCBieSBCREZMIHByb25vdW5jZW1lbnQuCgpDIEFQSQoKLSBOZXcgZnVuY3Rpb24gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKCkgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG5vbi0KICBOVUxMIHJlc3VsdCBmcm9tIFB5U2VxdWVuY2VfRmFzdCgpLCBtb3JlIHF1aWNrbHkgdGhhbiBjYWxsaW5nCiAgUHlTZXF1ZW5jZV9TaXplKCkuCgotIE5ldyBhcmd1bWVudCB1bnBhY2tpbmcgZnVuY3Rpb24gUHlBcmdfVW5wYWNrVHVwbGUoKSBhZGRlZC4KCi0gTmV3IGZ1bmN0aW9ucyBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKCkgYW5kCiAgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoKSBoYXZlIGJlZW4gYWRkZWQgdG8gbWFrZSBpdCBtb3JlCiAgY29udmVuaWVudCBhbmQgZWZmaWNpZW50IHRvIGNhbGwgZnVuY3Rpb25zIGFuZCBtZXRob2RzIGZyb20gQy4KCi0gUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCkgbm8gbG9uZ2VyIG1hc2tzIGVycm9ycywgc28gaXQncwogIHBvc3NpYmxlIHRoYXQgdGhpcyB3aWxsIHByb3BhZ2F0ZSBlcnJvcnMgaXQgZGlkbid0IGJlZm9yZS4KCi0gTmV3IGZ1bmN0aW9uIFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcigpLCB3aGljaCByZXR1cm5zIHRydWUgaWYgaXRzCiAgYXJndW1lbnQgc3VwcG9ydHMgdGhlIHNpbmdsZS1zZWdtZW50IHJlYWRhYmxlIGJ1ZmZlciBpbnRlcmZhY2UuCgpOZXcgcGxhdGZvcm1zCgotIFdlJ3ZlIGZpbmFsbHkgY29uZmlybWVkIHRoYXQgdGhpcyByZWxlYXNlIGJ1aWxkcyBvbiBIUC1VWCAxMS4wMCwKICAqd2l0aCogdGhyZWFkcywgYW5kIHBhc3NlcyB0aGUgdGVzdCBzdWl0ZS4KCi0gVGhhbmtzIHRvIGEgc2VyaWVzIG9mIHBhdGNoZXMgZnJvbSBNaWNoYWVsIE11bGxlciwgUHl0aG9uIG1heSBidWlsZAogIGFnYWluIHVuZGVyIE9TLzIgVmlzdWFsIEFnZSBDKysuCgotIFVwZGF0ZWQgUklTQ09TIHBvcnQgYnkgRGlldG1hciBTY2h3ZXJ0YmVyZ2VyLgoKVGVzdHMKCi0gQWRkZWQgYSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGN1cnNlcyBtb2R1bGUuICBJdCBpc24ndCBydW4gYXV0b21hdGljYWxseTsKICByZWdydGVzdC5weSBtdXN0IGJlIHJ1biB3aXRoICctdSBjdXJzZXMnIHRvIGVuYWJsZSBpdC4KCldpbmRvd3MKCk1hYwoKLSBQeXRob25TY3JpcHQgaGFzIGJlZW4gbW92ZWQgdG8gdW5zdXBwb3J0ZWQgYW5kIGlzIHNsYXRlZCB0byBiZQogIHJlbW92ZWQgY29tcGxldGVseSBpbiB0aGUgbmV4dCByZWxlYXNlLgoKLSBJdCBzaG91bGQgbm93IGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGFwcGxldHMgdGhhdCB3b3JrIG9uIGJvdGggT1M5IGFuZAogIE9TWC4KCi0gVGhlIGNvcmUgaXMgbm93IGxpbmtlZCB3aXRoIENvcmVTZXJ2aWNlcyBub3QgQ2FyYm9uOyBhcyBhIHNpZGUKICByZXN1bHQsIGRlZmF1bHQgOGJpdCBlbmNvZGluZyBvbiBPU1ggaXMgbm93IEFTQ0lJLgoKLSBQeXRob24gc2hvdWxkIG5vdyBidWlsZCBvbiBPU1ggMTAuMS4xCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYjE/ClJlbGVhc2UgZGF0ZTogMTktT2N0LTIwMDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwoKLSBOZXctc3R5bGUgY2xhc3NlcyBhcmUgbm93IGFsd2F5cyBkeW5hbWljIChleGNlcHQgZm9yIGJ1aWx0LWluIGFuZAogIGV4dGVuc2lvbiB0eXBlcykuICBUaGVyZSBpcyBubyBsb25nZXIgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LCBhbmQgSQogIG5vIGxvbmdlciBzZWUgYW5vdGhlciByZWFzb24gdG8ga2VlcCB0aGlzIGJhZ2dhZ2UgYXJvdW5kLiAgT25lIHJlbGljCiAgcmVtYWluczogdGhlIF9fZGljdF9fIG9mIGEgbmV3LXN0eWxlIGNsYXNzIGlzIGEgcmVhZC1vbmx5IHByb3h5OyB5b3UKICBtdXN0IHNldCB0aGUgY2xhc3MncyBhdHRyaWJ1dGUgdG8gbW9kaWZ5IGl0LiAgQXMgYSBjb25zZXF1ZW5jZSwgdGhlCiAgX19kZWZpbmVkX18gYXR0cmlidXRlIG9mIG5ldy1zdHlsZSB0eXBlcyBubyBsb25nZXIgZXhpc3RzLCBmb3IgbGFjawogIG9mIG5lZWQ6IHRoZXJlIGlzIG9uY2UgYWdhaW4gb25seSBvbmUgX19kaWN0X18gKGFsdGhvdWdoIGluIHRoZQogIGZ1dHVyZSBhIF9fY2FjaGVfXyBtYXkgYmUgcmVzdXJyZWN0ZWQgd2l0aCBhIHNpbWlsYXIgZnVuY3Rpb24sIGlmIEkKICBjYW4gcHJvdmUgdGhhdCBpdCBhY3R1YWxseSBzcGVlZHMgdGhpbmdzIHVwKS4KCi0gQy5fX2RvY19fIG5vdyB3b3JrcyBhcyBleHBlY3RlZCBmb3IgbmV3LXN0eWxlIGNsYXNzZXMgKGluIDIuMmE0IGl0CiAgYWx3YXlzIHJldHVybmVkIE5vbmUsIGV2ZW4gd2hlbiB0aGVyZSB3YXMgYSBjbGFzcyBkb2NzdHJpbmcpLgoKLSBkb2N0ZXN0IG5vdyBmaW5kcyBhbmQgcnVucyBkb2NzdHJpbmdzIGF0dGFjaGVkIHRvIG5ldy1zdHlsZSBjbGFzc2VzLAogIGNsYXNzIG1ldGhvZHMsIHN0YXRpYyBtZXRob2RzLCBhbmQgcHJvcGVydGllcy4KCkNvcmUgYW5kIGJ1aWx0aW5zCgotIEEgdmVyeSBzdWJ0bGUgc3ludGFjdGljYWwgcGl0ZmFsbCBpbiBsaXN0IGNvbXByZWhlbnNpb25zIHdhcyBmaXhlZC4KICBGb3IgZXhhbXBsZTogW2ErYiBmb3IgYSBpbiAnYWJjJywgZm9yIGIgaW4gJ2RlZiddLiAgVGhlIGNvbW1hIGluCiAgdGhpcyBleGFtcGxlIGlzIGEgbWlzdGFrZS4gIFByZXZpb3VzbHksIHRoaXMgd291bGQgc2lsZW50bHkgbGV0ICdhJwogIGl0ZXJhdGUgb3ZlciB0aGUgc2luZ2xldG9uIHR1cGxlICgnYWJjJywpLCB5aWVsZGluZyBbJ2FiY2QnLCAnYWJjZScsCiAgJ2FiY2YnXSByYXRoZXIgdGhhbiB0aGUgaW50ZW5kZWQgWydhZCcsICdhZScsICdhZicsICdiZCcsICdiZScsCiAgJ2JmJywgJ2NkJywgJ2NlJywgJ2NmJ10uICBOb3csIHRoaXMgaXMgZmxhZ2dlZCBhcyBhIHN5bnRheCBlcnJvci4KICBOb3RlIHRoYXQgW2EgZm9yIGEgaW4gPHNpbmdsZXRvbj5dIGlzIGEgY29udm9sdXRlZCB3YXkgdG8gc2F5CiAgWzxzaW5nbGV0b24+XSBhbnl3YXksIHNvIGl0J3Mgbm90IGxpa2UgYW55IGV4cHJlc3NpdmVuZXNzIGlzIGxvc3QuCgotIGdldGF0dHIob2JqLCBuYW1lLCBkZWZhdWx0KSBub3cgb25seSBjYXRjaGVzIEF0dHJpYnV0ZUVycm9yLCBhcwogIGRvY3VtZW50ZWQsIHJhdGhlciB0aGFuIHJldHVybmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsCiAgZXhjZXB0aW9ucyAod2hpY2ggY291bGQgbWFzayBidWdzIGluIGEgX19nZXRhdHRyX18gaG9vaywgZm9yCiAgZXhhbXBsZSkuCgotIFdlYWsgcmVmZXJlbmNlIG9iamVjdHMgYXJlIG5vdyBwYXJ0IG9mIHRoZSBjb3JlIGFuZCBvZmZlciBhIEMgQVBJLgogIEEgYnVnIHdoaWNoIGNvdWxkIGFsbG93IGEgY29yZSBkdW1wIHdoZW4gYmluYXJ5IG9wZXJhdGlvbnMgaW52b2x2ZWQKICBwcm94eSByZWZlcmVuY2UgaGFzIGJlZW4gZml4ZWQuICB3ZWFrcmVmLlJlZmVyZW5jZUVycm9yIGlzIG5vdyBhCiAgYnVpbHQtaW4gZXhjZXB0aW9uLgoKLSB1bmljb2RlKG9iaikgbm93IGJlaGF2ZXMgbW9yZSBsaWtlIHN0cihvYmopLCBhY2NlcHRpbmcgYXJiaXRyYXJ5CiAgb2JqZWN0cywgYW5kIGNhbGxpbmcgYSBfX3VuaWNvZGVfXyBtZXRob2QgaWYgaXQgZXhpc3RzLgogIHVuaWNvZGUob2JqLCBlbmNvZGluZykgYW5kIHVuaWNvZGUob2JqLCBlbmNvZGluZywgZXJyb3JzKSBzdGlsbAogIHJlcXVpcmUgYW4gOC1iaXQgc3RyaW5nIG9yIGNoYXJhY3RlciBidWZmZXIgYXJndW1lbnQuCgotIGlzaW5zdGFuY2UoKSBub3cgYWxsb3dzIGFueSBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBhCiAgY2xhc3MsIGEgdHlwZSBvciBzb21ldGhpbmcgd2l0aCBhIF9fYmFzZXNfXyB0dXBsZSBhdHRyaWJ1dGUgZm9yIHRoZQogIHNlY29uZCBhcmd1bWVudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbWF5IGFsc28gYmUgYSB0dXBsZSBvZiBhCiAgY2xhc3MsIHR5cGUsIG9yIHNvbWV0aGluZyB3aXRoIF9fYmFzZXNfXywgaW4gd2hpY2ggY2FzZSBpc2luc3RhbmNlKCkKICB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBhbnkgb2YgdGhlCiAgdGhpbmdzIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHR1cGxlLiAgRS5nLgoKICBpc2luc3RhbmNlKHgsIChBLCBCKSkKCiAgcmV0dXJucyB0cnVlIGlmIHggaXMgYW4gaW5zdGFuY2Ugb2YgQSBvciBCLgoKRXh0ZW5zaW9uIG1vZHVsZXMKCi0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoKSBub3cgcmV0dXJucyB0aGUgdGhyZWFkIElEIChwcmV2aW91c2x5IE5vbmUpLgoKLSBiaW5hc2NpaSBoYXMgbm93IHR3byBxdW9wcmkgc3VwcG9ydCBmdW5jdGlvbnMsIGEyYl9xcCBhbmQgYjJhX3FwLgoKLSByZWFkbGluZSBub3cgc3VwcG9ydHMgc2V0dGluZyB0aGUgc3RhcnR1cF9ob29rIGFuZCB0aGUKICBwcmVfZXZlbnRfaG9vaywgYW5kIGFkZHMgdGhlIGFkZF9oaXN0b3J5KCkgZnVuY3Rpb24uCgotIG9zIGFuZCBwb3NpeCBzdXBwb3J0cyBjaHJvb3QoKSwgc2V0Z3JvdXBzKCkgYW5kIHVuc2V0ZW52KCkgd2hlcmUKICBhdmFpbGFibGUuICBUaGUgc3RhdCgpLCBmc3RhdCgpLCBzdGF0dmZzKCkgYW5kIGZzdGF0dmZzKCkgZnVuY3Rpb25zCiAgbm93IHJldHVybiAicHNldWRvLXNlcXVlbmNlcyIgLS0gdGhlIHZhcmlvdXMgZmllbGRzIGNhbiBub3cgYmUKICBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIChlLmcuIG9zLnN0YXQoIi8iKS5zdF9tdGltZSkgYnV0IGZvcgogIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHRoZXkgYWxzbyBiZWhhdmUgYXMgYSBmaXhlZC1sZW5ndGggc2VxdWVuY2UuCiAgU29tZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWVsZHMgKGUuZy4gc3RfcmRldikgYXJlIG9ubHkgYWNjZXNzaWJsZSBhcwogIGF0dHJpYnV0ZXMuCgotIHRpbWU6IGxvY2FsdGltZSgpLCBnbXRpbWUoKSBhbmQgc3RycHRpbWUoKSBub3cgcmV0dXJuIGEKICBwc2V1ZG8tc2VxdWVuY2Ugc2ltaWxhciB0byB0aGUgb3Muc3RhdCgpIHJldHVybiB2YWx1ZSwgd2l0aAogIGF0dHJpYnV0ZXMgbGlrZSB0bV95ZWFyIGV0Yy4KCi0gRGVjb21wcmVzc2lvbiBvYmplY3RzIGluIHRoZSB6bGliIG1vZHVsZSBub3cgYWNjZXB0IGFuIG9wdGlvbmFsCiAgc2Vjb25kIHBhcmFtZXRlciB0byBkZWNvbXByZXNzKCkgdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50CiAgb2YgbWVtb3J5IHRvIHVzZSBmb3IgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgoKLSBvcHRpb25hbCBTU0wgc3VwcG9ydCBpbiB0aGUgc29ja2V0IG1vZHVsZSBub3cgZXhwb3J0cyBPcGVuU1NMCiAgZnVuY3Rpb25zIFJBTkRfYWRkKCksIFJBTkRfZWdkKCksIGFuZCBSQU5EX3N0YXR1cygpLiAgVGhlc2UgY2FsbHMKICBhcmUgdXNlZnVsIG9uIHBsYXRmb3JtcyBsaWtlIFNvbGFyaXMgd2hlcmUgT3BlblNTTCBkb2VzIG5vdAogIGF1dG9tYXRpY2FsbHkgc2VlZCBpdHMgUFJORy4gIEFsc28sIHRoZSBrZXlmaWxlIGFuZCBjZXJ0ZmlsZQogIGFyZ3VtZW50cyB0byBzb2NrZXQuc3NsKCkgYXJlIG5vdyBvcHRpb25hbC4KCi0gcG9zaXhtb2R1bGUgKGFuZCBieSBleHRlbnNpb24sIHRoZSBvcyBtb2R1bGUgb24gUE9TSVggcGxhdGZvcm1zKSBub3cKICBleHBvcnRzIE9fTEFSR0VGSUxFLCBPX0RJUkVDVCwgT19ESVJFQ1RPUlksIGFuZCBPX05PRk9MTE9XLgoKTGlicmFyeQoKLSBkb2N0ZXN0IG5vdyBleGNsdWRlcyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgbm90IGRlZmluZWQgYnkgdGhlIG1vZHVsZQogIGJlaW5nIHRlc3RlZCwgdGhhbmtzIHRvIFRpbSBIb2NoYmVyZy4KCi0gSG90U2hvdCwgYSBuZXcgcHJvZmlsZXIgaW1wbGVtZW50ZWQgdXNpbmcgYSBDLWJhc2VkIGNhbGxiYWNrLCBoYXMKICBiZWVuIGFkZGVkLiAgVGhpcyBzdWJzdGFudGlhbGx5IHJlZHVjZXMgdGhlIG92ZXJoZWFkIG9mIHByb2ZpbGluZywKICBidXQgaXQgaXMgc3RpbGwgcXVpdGUgcHJlbGltaW5hcnkuICBTdXBwb3J0IG1vZHVsZXMgYW5kCiAgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIGluIHVwY29taW5nIHJlbGVhc2VzIChiZWZvcmUgMi4yIGZpbmFsKS4KCi0gcHJvZmlsZSBub3cgcHJvZHVjZXMgY29ycmVjdCBvdXRwdXQgaW4gc2l0dWF0aW9ucyB3aGVyZSBhbiBleGNlcHRpb24KICByYWlzZWQgaW4gUHl0aG9uIGlzIGNsZWFyZWQgYnkgQyBjb2RlIChlLmcuIGhhc2F0dHIoKSkuICBUaGlzIHVzZWQKICB0byBjYXVzZSB3cm9uZyBvdXRwdXQsIGluY2x1ZGluZyBzcHVyaW91cyBjbGFpbXMgb2YgcmVjdXJzaXZlCiAgZnVuY3Rpb25zIGFuZCBhdHRyaWJ1dGlvbiBvZiB0aW1lIHNwZW50IHRvIHRoZSB3cm9uZyBmdW5jdGlvbi4KCiAgVGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZm9yIHRoZSBkZXJpdmVkIE9sZFByb2ZpbGUgYW5kIEhvdFByb2ZpbGUKICBwcm9maWxpbmcgY2xhc3NlcyB3YXMgcmVtb3ZlZC4gIFRoZSBjb2RlIGhhc24ndCB3b3JrZWQgZm9yIHllYXJzIChpZgogIHlvdSB0cmllZCB0byB1c2UgdGhlbSwgdGhleSByYWlzZWQgZXhjZXB0aW9ucykuICBPbGRQcm9maWxlCiAgaW50ZW5kZWQgdG8gcmVwcm9kdWNlIHRoZSBiZWhhdmlvciBvZiB0aGUgcHJvZmlsZXIgUHl0aG9uIHVzZWQgbW9yZQogIHRoYW4gNyB5ZWFycyBhZ28sIGFuZCBpc24ndCBpbnRlcmVzdGluZyBhbnltb3JlLiAgSG90UHJvZmlsZSBpbnRlbmRlZAogIHRvIHByb3ZpZGUgYSBmYXN0ZXIgcHJvZmlsZXIgKGJ1dCBwcm9kdWNpbmcgbGVzcyBpbmZvcm1hdGlvbiksIGFuZAogIHRoYXQncyBhIHdvcnRoeSBnb2FsIHdlIGludGVuZCB0byBtZWV0IHZpYSBhIGRpZmZlcmVudCBhcHByb2FjaCAoYnV0CiAgd2l0aG91dCBsb3NpbmcgaW5mb3JtYXRpb24pLgoKLSBQcm9maWxlLmNhbGlicmF0ZSgpIGhhcyBhIG5ldyBpbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBkZWxpdmVyCiAgYSBtdWNoIGJldHRlciBzeXN0ZW0tc3BlY2lmaWMgY2FsaWJyYXRpb24gY29uc3RhbnQuICBUaGUgY29uc3RhbnQgY2FuCiAgbm93IGJlIHNwZWNpZmllZCBpbiBhbiBpbnN0YW5jZSBjb25zdHJ1Y3Rvciwgb3IgYXMgYSBQcm9maWxlIGNsYXNzIG9yCiAgaW5zdGFuY2UgdmFyaWFibGUsIGluc3RlYWQgb2YgYnkgZWRpdGluZyBwcm9maWxlLnB5J3Mgc291cmNlIGNvZGUuCiAgQ2FsaWJyYXRpb24gbXVzdCBzdGlsbCBiZSBkb25lIG1hbnVhbGx5IChzZWUgdGhlIGRvY3MgZm9yIHRoZSBwcm9maWxlCiAgbW9kdWxlKS4KCiAgTm90ZSB0aGF0IFByb2ZpbGUuY2FsaWJyYXRlKCkgbXVzdCBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3Nlcy4KICBJbXByb3ZpbmcgdGhlIGFjY3VyYWN5IHJlcXVpcmVkIGV4cGxvaXRpbmcgZGV0YWlsZWQga25vd2xlZGdlIG9mCiAgcHJvZmlsZXIgaW50ZXJuYWxzOyB0aGUgZWFybGllciBtZXRob2QgYWJzdHJhY3RlZCBhd2F5IHRoZSBkZXRhaWxzCiAgYW5kIG1lYXN1cmVkIGEgc2ltcGxpZmllZCBtb2RlbCBpbnN0ZWFkLCBidXQgY29uc2VxdWVudGx5IGNvbXB1dGVkCiAgYSBjb25zdGFudCB0b28gc21hbGwgYnkgYSBmYWN0b3Igb2YgMiBvbiBzb21lIG1vZGVybiBtYWNoaW5lcy4KCi0gcXVvcHJpJ3MgZW5jb2RlIGFuZCBkZWNvZGUgbWV0aG9kcyB0YWtlIGFuIG9wdGlvbmFsIGhlYWRlciBwYXJhbWV0ZXIsCiAgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgb3V0cHV0IGlzIGludGVuZGVkIGZvciB0aGUgaGVhZGVyICdRJwogIGVuY29kaW5nLgoKLSBUaGUgU29ja2V0U2VydmVyLlRocmVhZGluZ01peEluIGNsYXNzIG5vdyBjbG9zZXMgdGhlIHJlcXVlc3QgYWZ0ZXIKICBmaW5pc2hfcmVxdWVzdCgpIHJldHVybnMuICAoTm90IHdoZW4gaXQgZXJyb3JzIG91dCB0aG91Z2guKQoKLSBUaGUgbm50cGxpYiBtb2R1bGUncyBOTlRQLmJvZHkoKSBtZXRob2QgaGFzIGdyb3duIGEgYGZpbGUnIGFyZ3VtZW50CiAgdG8gYWxsb3cgc2F2aW5nIHRoZSBtZXNzYWdlIGJvZHkgdG8gYSBmaWxlLgoKLSBUaGUgZW1haWwgcGFja2FnZSBoYXMgYWRkZWQgYSBjbGFzcyBlbWFpbC5QYXJzZXIuSGVhZGVyUGFyc2VyIHdoaWNoCiAgb25seSBwYXJzZXMgaGVhZGVycyBhbmQgZG9lcyBub3QgcmVjdXJzZSBpbnRvIHRoZSBtZXNzYWdlJ3MgYm9keS4KICBBbHNvLCB0aGUgbW9kdWxlL2NsYXNzIE1JTUVBdWRpbyBoYXMgYmVlbiBhZGRlZCBmb3IgcmVwcmVzZW50aW5nCiAgYXVkaW8gZGF0YSAoY29udHJpYnV0ZWQgYnkgQW50aG9ueSBCYXh0ZXIpLgoKLSBmdHBsaWIgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGZpbGVzID4gMkdCLgoKLSBDb25maWdQYXJzZXIuZ2V0Ym9vbGVhbigpIG5vdyBhbHNvIGludGVycHJldHMgVFJVRSwgRkFMU0UsIFlFUywgTk8sCiAgT04sIGFuZCBPRkYuCgotIHhtbC5kb20ubWluaWRvbSBOb2RlTGlzdCBvYmplY3RzIG5vdyBzdXBwb3J0IHRoZSBsZW5ndGggYXR0cmlidXRlCiAgYW5kIGl0ZW0oKSBtZXRob2QgYXMgcmVxdWlyZWQgYnkgdGhlIERPTSBzcGVjaWZpY2F0aW9ucy4KClRvb2xzL0RlbW9zCgotIERlbW8vZG5zIHdhcyByZW1vdmVkLiAgSXQgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgcHVycG9zZTsgYSBwYWNrYWdlCiAgZGVyaXZlZCBmcm9tIGl0IGlzIG5vdyBtYWludGFpbmVkIGJ5IEFudGhvbnkgQmF4dGVyLCBzZWUKICBodHRwOi8vUHlETlMuU291cmNlRm9yZ2UubmV0LgoKLSBUaGUgZnJlZXplIHRvb2wgaGFzIGJlZW4gbWFkZSBtb3JlIHJvYnVzdCwgYW5kIHR3byBuZXcgb3B0aW9ucyBoYXZlCiAgYmVlbiBhZGRlZDogLVggYW5kIC1FLgoKQnVpbGQKCi0gY29uZmlndXJlIHdpbGwgdXNlIENYWCBpbiBMSU5LQ0MgaWYgQ1hYIGlzIHVzZWQgdG8gYnVpbGQgbWFpbigpIGFuZAogIHRoZSBzeXN0ZW0gcmVxdWlyZXMgdG8gbGluayBhIEMrKyBtYWluIHVzaW5nIHRoZSBDKysgY29tcGlsZXIuCgpDIEFQSQoKLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHRwX2NvbXBhcmUgc2xvdCBpcyB1cGRhdGVkIHRvIHJlcXVpcmUgdGhhdAogIHRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSAtMSwgMCwgMTsgYW4gYXJiaXRyYXJ5IG51bWJlciA8MCBvciA+MCBpcwogIG5vdCBjb3JyZWN0LiAgVGhpcyBpcyBub3QgeWV0IGVuZm9yY2VkIGJ1dCB3aWxsIGJlIGVuZm9yY2VkIGluCiAgUHl0aG9uIDIuMzsgZXZlbiBsYXRlciwgd2UgbWF5IHVzZSAtMiB0byBpbmRpY2F0ZSBlcnJvcnMgYW5kICsyIGZvcgogICJOb3RJbXBsZW1lbnRlZCIuICBSaWdodCBub3csIC0xIHNob3VsZCBiZSB1c2VkIGZvciBhbiBlcnJvciByZXR1cm4uCgotIFB5TG9uZ19Bc0xvbmdMb25nKCkgbm93IGFjY2VwdHMgaW50IChhcyB3ZWxsIGFzIGxvbmcpIGFyZ3VtZW50cy4KICBDb25zZXF1ZW50bHksIFB5QXJnX1BhcnNlVHVwbGUncyAnTCcgY29kZSBhbHNvIGFjY2VwdHMgaW50IChhcyB3ZWxsCiAgYXMgbG9uZykgYXJndW1lbnRzLgoKLSBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCkgbm93IHJldHVybnMgYSBsb25nIGludCBnaXZpbmcgdGhlIHRocmVhZAogIElELCBpZiBvbmUgY2FuIGJlIGNhbGN1bGF0ZWQ7IGl0IHJldHVybnMgLTEgZm9yIGVycm9yLCAwIGlmIG5vCiAgdGhyZWFkIElEIGlzIGNhbGN1bGF0ZWQgKHRoaXMgaXMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSwgYnV0IG9ubHkKICB0aGUgdGhyZWFkIG1vZHVsZSB1c2VkIHRoaXMgQVBJKS4gIFRoaXMgY29kZSBoYXMgb25seSByZWFsbHkgYmVlbgogIHRlc3RlZCBvbiBMaW51eCBhbmQgV2luZG93czsgb3RoZXIgcGxhdGZvcm1zIHBsZWFzZSBiZXdhcmUgKGFuZAogIHJlcG9ydCBhbnkgYnVncyBvciBzdHJhbmdlIGJlaGF2aW9yKS4KCi0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KCkgbm8gbG9uZ2VyIGFjY2VwdHMgVW5pY29kZSBvYmplY3RzIGFzCiAgaW5wdXQuCgpOZXcgcGxhdGZvcm1zCgpUZXN0cwoKV2luZG93cwoKLSBJbnN0YWxsZXI6ICBJZiB5b3UgaW5zdGFsbCBJRExFLCBhbmQgZG9uJ3QgZGlzYWJsZSBmaWxlLWV4dGVuc2lvbgogIHJlZ2lzdHJhdGlvbiwgYSBuZXcgIkVkaXQgd2l0aCBJRExFIiBjb250ZXh0IChyaWdodC1jbGljaykgbWVudSBlbnRyeQogIGlzIGNyZWF0ZWQgZm9yIC5weSBhbmQgLnB5dyBmaWxlcy4KCi0gVGhlIHNpZ25hbCBtb2R1bGUgbm93IHN1cHBvcnRzIFNJR0JSRUFLIG9uIFdpbmRvd3MsIHRoYW5rcyB0byBTdGV2ZW4KICBTY290dC4gIE5vdGUgdGhhdCBTSUdCUkVBSyBpcyB1bmlxdWUgdG8gV2luZG93cy4gIFRoZSBkZWZhdWx0IFNJR0JSRUFLCiAgYWN0aW9uIHJlbWFpbnMgdG8gY2FsbCBXaW4zMiBFeGl0UHJvY2VzcygpLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEKICBzaWduYWwuc2lnbmFsKCkuICBGb3IgZXhhbXBsZToKCiAgIyBNYWtlIEN0cmwrQnJlYWsgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQsIGxpa2UgUHl0aG9uJ3MgZGVmYXVsdCBDdHJsK0MKICAjIChTSUdJTlQpIGJlaGF2aW9yLgogIGltcG9ydCBzaWduYWwKICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdCUkVBSywKICAgICAgICAgICAgICAgIHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyKQoKICB0cnk6CiAgICAgIHdoaWxlIDE6CiAgICAgICAgICBwYXNzCiAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAjIFdlIGdldCBoZXJlIG9uIEN0cmwrQyBvciBDdHJsK0JyZWFrIG5vdzsgaWYgd2UgaGFkIG5vdCBjaGFuZ2VkCiAgICAgICMgU0lHQlJFQUssIG9ubHkgb24gQ3RybCtDIChhbmQgQ3RybCtCcmVhayB3b3VsZCB0ZXJtaW5hdGUgdGhlCiAgICAgICMgcHJvZ3JhbSB3aXRob3V0IHRoZSBwb3NzaWJpbGl0eSBmb3IgYW55IFB5dGhvbi1sZXZlbCBjbGVhbnVwKS4KICAgICAgcHJpbnQgIkNsZWFuIGV4aXQiCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTQ/ClJlbGVhc2UgZGF0ZTogMjgtU2VwLTIwMDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwoKLSBweWRvYyBhbmQgaW5zcGVjdCBhcmUgbm93IGF3YXJlIG9mIG5ldy1zdHlsZSBjbGFzc2VzOwogIGUuZy4gaGVscChsaXN0KSBhdCB0aGUgaW50ZXJhY3RpdmUgcHJvbXB0IG5vdyBzaG93cyBwcm9wZXIKICBkb2N1bWVudGF0aW9uIGZvciBhbGwgb3BlcmF0aW9ucyBvbiBsaXN0IG9iamVjdHMuCgotIEFwcGxpY2F0aW9ucyB1c2luZyBKaW0gRnVsdG9uJ3MgRXh0ZW5zaW9uQ2xhc3MgbW9kdWxlIGNhbiBub3cgc2FmZWx5CiAgYmUgdXNlZCB3aXRoIFB5dGhvbiAyLjIuICBJbiBwYXJ0aWN1bGFyLCBab3BlIDIuNC4xIG5vdyB3b3JrcyB3aXRoCiAgUHl0aG9uIDIuMiAoYXMgd2VsbCBhcyB3aXRoIFB5dGhvbiAyLjEuMSkuICBUaGUgRGVtby9tZXRhY2xhc3MKICBleGFtcGxlcyBhbHNvIHdvcmsgYWdhaW4uICBJdCBpcyBob3BlZCB0aGF0IEd0ayBhbmQgQm9vc3QgYWxzbyB3b3JrCiAgd2l0aCAyLjJhNCBhbmQgYmV5b25kLiAgKElmIHlvdSBjYW4gY29uZmlybSB0aGlzLCBwbGVhc2Ugd3JpdGUKICB3ZWJtYXN0ZXJAcHl0aG9uLm9yZzsgaWYgdGhlcmUgYXJlIHN0aWxsIHByb2JsZW1zLCBwbGVhc2Ugb3BlbiBhIGJ1ZwogIHJlcG9ydCBvbiBTb3VyY2VGb3JnZS4pCgotIHByb3BlcnR5KCkgbm93IHRha2VzIDQga2V5d29yZCBhcmd1bWVudHM6ICBmZ2V0LCBmc2V0LCBmZGVsIGFuZCBkb2MuCiAgVGhlc2UgbWFwIHRvIHJlYWRvbmx5IGF0dHJpYnV0ZXMgJ2ZnZXQnLCAnZnNldCcsICdmZGVsJywgYW5kICdfX2RvY19fJwogIGluIHRoZSBjb25zdHJ1Y3RlZCBwcm9wZXJ0eSBvYmplY3QuICBmZ2V0LCBmc2V0IGFuZCBmZGVsIHdlcmVuJ3QKICBkaXNjb3ZlcmFibGUgZnJvbSBQeXRob24gaW4gMi4yYTMuICBfX2RvY19fIGlzIG5ldywgYW5kIGFsbG93cyB0bwogIGFzc29jaWF0ZSBhIGRvY3N0cmluZyB3aXRoIGEgcHJvcGVydHkuCgotIENvbXBhcmlzb24gb3ZlcmxvYWRpbmcgaXMgbm93IG1vcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZC4gIEZvcgogIGV4YW1wbGUsIGEgc3RyIHN1YmNsYXNzIGluc3RhbmNlIGNhbiBwcm9wZXJseSBiZSBjb21wYXJlZCB0byBhIHN0cgogIGluc3RhbmNlLCBhbmQgaXQgY2FuIHByb3Blcmx5IG92ZXJsb2FkIGNvbXBhcmlzb24uICBEaXR0byBmb3IgbW9zdAogIG90aGVyIGJ1aWx0LWluIG9iamVjdCB0eXBlcy4KCi0gVGhlIHJlcHIoKSBvZiBuZXctc3R5bGUgY2xhc3NlcyBoYXMgY2hhbmdlZDsgaW5zdGVhZCBvZiA8dHlwZQogICdNLkZvbyc+IGEgbmV3LXN0eWxlIGNsYXNzIGlzIG5vdyByZW5kZXJlZCBhcyA8Y2xhc3MgJ00uRm9vJz4sCiAgKmV4Y2VwdCogZm9yIGJ1aWx0LWluIHR5cGVzLCB3aGljaCBhcmUgc3RpbGwgcmVuZGVyZWQgYXMgPHR5cGUKICAnRm9vJz4gKHRvIGF2b2lkIHVwc2V0dGluZyBleGlzdGluZyBjb2RlIHRoYXQgbWlnaHQgcGFyc2Ugb3IKICBvdGhlcndpc2UgcmVseSBvbiByZXByKCkgb2YgY2VydGFpbiB0eXBlIG9iamVjdHMpLgoKLSBUaGUgcmVwcigpIG9mIG5ldy1zdHlsZSBvYmplY3RzIGlzIG5vdyBhbHdheXMgPEZvbyBvYmplY3QgYXQgWFhYPjsKICBwcmV2aW91c2x5LCBpdCB3YXMgc29tZXRpbWVzIDxGb28gaW5zdGFuY2UgYXQgWFhYPi4KCi0gRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCB3aGF0IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBfX2dldGF0dHJfXyBpcyBub3cKICBjYWxsZWQgX19nZXRhdHRyaWJ1dGVfXy4gIFRoaXMgbWV0aG9kLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZm9yCiAgKmV2ZXJ5KiBhdHRyaWJ1dGUgYWNjZXNzLiAgQSBuZXcgX19nZXRhdHRyX18gaG9vayBtb3JlIHNpbWlsYXIgdG8gdGhlCiAgb25lIGluIGNsYXNzaWMgY2xhc3NlcyBpcyBkZWZpbmVkIHdoaWNoIGlzIGNhbGxlZCBvbmx5IGlmIHJlZ3VsYXIKICBhdHRyaWJ1dGUgYWNjZXNzIHJhaXNlcyBBdHRyaWJ1dGVFcnJvcjsgdG8gY2F0Y2ggKmFsbCogYXR0cmlidXRlCiAgYWNjZXNzLCB5b3UgY2FuIHVzZSBfX2dldGF0dHJpYnV0ZV9fIChmb3IgbmV3LXN0eWxlIGNsYXNzZXMpLiAgSWYKICBib3RoIGFyZSBkZWZpbmVkLCBfX2dldGF0dHJpYnV0ZV9fIGlzIGNhbGxlZCBmaXJzdCwgYW5kIGlmIGl0IHJhaXNlcwogIEF0dHJpYnV0ZUVycm9yLCBfX2dldGF0dHJfXyBpcyBjYWxsZWQuCgotIFRoZSBfX2NsYXNzX18gYXR0cmlidXRlIG9mIG5ldy1zdHlsZSBvYmplY3RzIGNhbiBiZSBhc3NpZ25lZCB0by4KICBUaGUgbmV3IGNsYXNzIG11c3QgaGF2ZSB0aGUgc2FtZSBDLWxldmVsIG9iamVjdCBsYXlvdXQgYXMgdGhlIG9sZAogIGNsYXNzLgoKLSBUaGUgYnVpbHRpbiBmaWxlIHR5cGUgY2FuIGJlIHN1YmNsYXNzZWQgbm93LiAgSW4gdGhlIHVzdWFsIHBhdHRlcm4sCiAgImZpbGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBidWlsdGluIHR5cGUsIGFuZCBmaWxlKCkgaXMgYSBuZXcgYnVpbHRpbgogIGNvbnN0cnVjdG9yLCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgYnVpbHRpbiBvcGVuKCkgZnVuY3Rpb24uCiAgZmlsZSgpIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBvcGVuIGEgZmlsZS4KCi0gUHJldmlvdXNseSwgX19uZXdfXyB3b3VsZCBvbmx5IHNlZSBzZXF1ZW50aWFsIGFyZ3VtZW50cyBwYXNzZWQgdG8KICB0aGUgdHlwZSBpbiBhIGNvbnN0cnVjdG9yIGNhbGw7IF9faW5pdF9fIHdvdWxkIHNlZSBib3RoIHNlcXVlbnRpYWwKICBhbmQga2V5d29yZCBhcmd1bWVudHMuICBUaGlzIG1hZGUgbm8gc2Vuc2Ugd2hhdHNvZXZlciBhbnkgbW9yZSwgc28KICBub3cgYm90aCBfX25ld19fIGFuZCBfX2luaXRfXyBzZWUgYWxsIGFyZ3VtZW50cy4KCi0gUHJldmlvdXNseSwgaGFzaCgpIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBzdHIgb3IKICB1bmljb2RlIGFsd2F5cyByZXR1cm5lZCAwLiAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4KCi0gUHJldmlvdXNseSwgYW4gb3BlcmF0aW9uIG9uIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgYW4KICBpbW11dGFibGUgdHlwZSAoaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgdHVwbGUsIHN0ciwgdW5pY29kZSksCiAgd2hlcmUgdGhlIHN1YnR5cGUgZGlkbid0IG92ZXJyaWRlIHRoZSBvcGVyYXRpb24gKGFuZCBzbyB0aGUKICBvcGVyYXRpb24gd2FzIGhhbmRsZWQgYnkgdGhlIGJ1aWx0aW4gdHlwZSksIGNvdWxkIHJldHVybiB0aGF0CiAgaW5zdGFuY2UgaW5zdGVhZCBhIHZhbHVlIG9mIHRoZSBiYXNlIHR5cGUuICBGb3IgZXhhbXBsZSwgaWYgcyB3YXMgb2YKICBhIHN0ciBzdWJsYXNzIHR5cGUsIHNbOl0gcmV0dXJuZWQgcyBhcy1pcy4gIE5vdyBpdCByZXR1cm5zIGEgc3RyCiAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyBzLgoKLSBQcm92aXNpb25hbCBzdXBwb3J0IGZvciBwaWNrbGluZyBuZXctc3R5bGUgb2JqZWN0cyBoYXMgYmVlbiBhZGRlZC4KCkNvcmUKCi0gZmlsZS53cml0ZWxpbmVzKCkgbm93IGFjY2VwdHMgYW55IGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncy4KCi0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KCkgbm93IHdvcmtzIHZlcnkgbXVjaCBsaWtlCiAgUHlPYmplY3RfU3RyKG9iaikgaW4gdGhhdCBpdCB0cmllcyB0byB1c2UgX19zdHJfXy90cF9zdHIKICBvbiB0aGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaXMgbm90IGEgc3RyaW5nIG9yIGJ1ZmZlci4gVGhpcwogIG1ha2VzIHVuaWNvZGUoKSBiZWhhdmUgbGlrZSBzdHIoKSB3aGVuIGFwcGxpZWQgdG8gbm9uLXN0cmluZy9idWZmZXIKICBvYmplY3RzLgoKLSBQeUZpbGVfV3JpdGVPYmplY3Qgbm93IHBhc3NlcyBVbmljb2RlIG9iamVjdHMgdG8gdGhlIGZpbGUncyB3cml0ZQogIG1ldGhvZC4gQXMgYSByZXN1bHQsIGFsbCBmaWxlLWxpa2Ugb2JqZWN0cyB3aGljaCBtYXkgYmUgdGhlIHRhcmdldAogIG9mIGEgcHJpbnQgc3RhdGVtZW50IG11c3Qgc3VwcG9ydCBVbmljb2RlIG9iamVjdHMsIGkuZS4gdGhleSBtdXN0CiAgYXQgbGVhc3QgY29udmVydCB0aGVtIGludG8gQVNDSUkgc3RyaW5ncy4KCi0gVGhyZWFkIHNjaGVkdWxpbmcgb24gU29sYXJpcyBzaG91bGQgYmUgaW1wcm92ZWQ7IGl0IGlzIG5vIGxvbmdlcgogIG5lY2Vzc2FyeSB0byBpbnNlcnQgYSBzbWFsbCBzbGVlcCBhdCB0aGUgc3RhcnQgb2YgYSB0aHJlYWQgaW4gb3JkZXIKICB0byBsZXQgb3RoZXIgcnVubmFibGUgdGhyZWFkcyBiZSBzY2hlZHVsZWQuCgpMaWJyYXJ5CgotIFN0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBhbmQgY1N0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBzdXBwb3J0CiAgcmVhZCBjaGFyYWN0ZXIgYnVmZmVyIGNvbXBhdGlibGUgb2JqZWN0cyBmb3IgdGhlaXIgLndyaXRlKCkgbWV0aG9kcy4KICBUaGVzZSBvYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgdGhlbiBoYW5kbGVkIGFzIHN1Y2gKICBieSB0aGUgaW5zdGFuY2VzLgoKLSBUaGUgImVtYWlsIiBwYWNrYWdlIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBpcyBiYXNpY2FsbHkgYSBwb3J0IG9mIHRoZQogIG1pbWVsaWIgcGFja2FnZSA8aHR0cDovL3NmLm5ldC9wcm9qZWN0cy9taW1lbGliPiB3aXRoIEFQSSBjaGFuZ2VzCiAgYW5kIHNvbWUgaW1wbGVtZW50YXRpb25zIHVwZGF0ZWQgdG8gdXNlIGl0ZXJhdG9ycyBhbmQgZ2VuZXJhdG9ycy4KCi0gZGlmZmxpYi5uZGlmZigpIGFuZCBkaWZmbGliLkRpZmZlci5jb21wYXJlKCkgYXJlIGdlbmVyYXRvcnMgbm93LiAgVGhpcwogIHJlc3RvcmVzIHRoZSBhYmlsaXR5IG9mIFRvb2xzL3NjcmlwdHMvbmRpZmYucHkgdG8gc3RhcnQgcHJvZHVjaW5nIG91dHB1dAogIGJlZm9yZSB0aGUgZW50aXJlIGNvbXBhcmlzb24gaXMgY29tcGxldGUuCgotIFN0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBhbmQgY1N0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBzdXBwb3J0CiAgaXRlcmF0aW9uIGp1c3QgbGlrZSBmaWxlIG9iamVjdHMgKGkuZS4gdGhlaXIgLnJlYWRsaW5lKCkgbWV0aG9kIGlzCiAgY2FsbGVkIGZvciBlYWNoIGl0ZXJhdGlvbiB1bnRpbCBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZykuCgotIFRoZSBjb2RlY3MgbW9kdWxlIGhhcyBncm93biBmb3VyIG5ldyBoZWxwZXIgQVBJcyB0byBhY2Nlc3MKICBidWlsdGluIGNvZGVjczogZ2V0ZW5jb2RlcigpLCBnZXRkZWNvZGVyKCksIGdldHJlYWRlcigpLAogIGdldHdyaXRlcigpLgoKLSBTaW1wbGVYTUxSUENTZXJ2ZXI6IGEgbmV3IG1vZHVsZSAoYmFzZWQgdXBvbiBTaW1wbGVIVE1MU2VydmVyKQogIHNpbXBsaWZpZXMgd3JpdGluZyBYTUwgUlBDIHNlcnZlcnMuCgotIG9zLnBhdGgucmVhbHBhdGgoKTogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRobmFtZQogIGFmdGVyIGludGVycHJldGF0aW9uIG9mIHN5bWJvbGljIGxpbmtzLiAgT24gbm9uLVVuaXggc3lzdGVtcywgdGhpcwogIGlzIGFuIGFsaWFzIGZvciBvcy5wYXRoLmFic3BhdGgoKS4KCi0gb3BlcmF0b3IuaW5kZXhPZigpIChQeVNlcXVlbmNlX0luZGV4KCkgaW4gdGhlIEMgQVBJKSBub3cgd29ya3Mgd2l0aCBhbnkKICBpdGVyYWJsZSBvYmplY3QuCgotIHNtdHBsaWIgbm93IHN1cHBvcnRzIHZhcmlvdXMgYXV0aGVudGljYXRpb24gYW5kIHNlY3VyaXR5IGZlYXR1cmVzIG9mCiAgdGhlIFNNVFAgcHJvdG9jb2wgdGhyb3VnaCB0aGUgbmV3IGxvZ2luKCkgYW5kIHN0YXJ0dGxzKCkgbWV0aG9kcy4KCi0gaG1hYzogYSBuZXcgbW9kdWxlIGltcGxlbWVudGluZyBrZXllZCBoYXNoaW5nIGZvciBtZXNzYWdlCiAgYXV0aGVudGljYXRpb24uCgotIG1pbWV0eXBlcyBub3cgcmVjb2duaXplcyBtb3JlIGV4dGVuc2lvbnMgYW5kIGZpbGUgdHlwZXMuICBBdCB0aGUKICBzYW1lIHRpbWUsIHNvbWUgbWFwcGluZ3Mgbm90IHNhbmN0aW9uZWQgYnkgSUFOQSB3ZXJlIHJlbW92ZWQuCgotIFRoZSAiY29tcGlsZXIiIHBhY2thZ2UgaGFzIGJlZW4gYnJvdWdodCB1cCB0byBkYXRlIHRvIHRoZSBzdGF0ZSBvZgogIFB5dGhvbiAyLjIgYnl0ZWNvZGUgZ2VuZXJhdGlvbi4gIEl0IGhhcyBhbHNvIGJlZW4gcHJvbW90ZWQgZnJvbSBhCiAgVG9vbCB0byBhIHN0YW5kYXJkIGxpYnJhcnkgcGFja2FnZS4gIChUb29scy9jb21waWxlciBzdGlsbCBleGlzdHMgYXMKICBhIHNhbXBsZSBkcml2ZXIuKQoKVG9vbHMKCkJ1aWxkCgotIExhcmdlIGZpbGUgc3VwcG9ydCAoTEZTKSBpcyBub3cgYXV0b21hdGljIHdoZW4gdGhlIHBsYXRmb3JtIHN1cHBvcnRzCiAgaXQ7IG5vIG1vcmUgbWFudWFsIGNvbmZpZ3VyYXRpb24gdHdlYWtzIGFyZSBuZWVkZWQuICBPbiBMaW51eCwgYXQKICBsZWFzdCwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGEgc3lzdGVtIHdob3NlIEMgbGlicmFyeSBzdXBwb3J0cyBsYXJnZQogIGZpbGVzIGJ1dCB3aG9zZSBrZXJuZWwgZG9lc24ndDsgaW4gdGhpcyBjYXNlLCBsYXJnZSBmaWxlIHN1cHBvcnQgaXMKICBzdGlsbCBlbmFibGVkIGJ1dCBkb2Vzbid0IGRvIHlvdSBhbnkgZ29vZCB1bmxlc3MgeW91IHVwZ3JhZGUgeW91cgogIGtlcm5lbCBvciBzaGFyZSB5b3VyIFB5dGhvbiBleGVjdXRhYmxlIHdpdGggYW5vdGhlciBzeXN0ZW0gd2hvc2UKICBrZXJuZWwgaGFzIGxhcmdlIGZpbGUgc3VwcG9ydC4KCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHN1cHBsaWVzIHBsYXVzaWJsZSBkZWZhdWx0cyBpbiBhCiAgY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnQuICBUaGlzIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBzdXBwbGllZAogIHZhbHVlcyBhcmUgYWx3YXlzIGNvcnJlY3QsIG9yIHRoYXQgY3Jvc3MtY29tcGlsYXRpb24gbm93IHdvcmtzCiAgZmxhd2xlc3NseSAtLSBidXQgaXQncyBhIGZpcnN0IHN0ZXAgKGFuZCBpdCBzaHV0cyB1cCBtb3N0IG9mCiAgYXV0b2NvbmYncyB3YXJuaW5ncyBhYm91dCBBQ19UUllfUlVOKS4KCi0gVGhlIFVuaXggYnVpbGQgaXMgbm93IGEgYml0IGxlc3MgY2hhdHR5LCBjb3VydGVzeSBvZiB0aGUgcGFyc2VyCiAgZ2VuZXJhdG9yLiAgVGhlIGJ1aWxkIGlzIGNvbXBsZXRlbHkgc2lsZW50IChleGNlcHQgZm9yIGVycm9ycykgd2hlbgogIHVzaW5nICJtYWtlIC1zIiwgdGhhbmtzIHRvIGEgLXEgb3B0aW9uIHRvIHNldHVwLnB5LgoKQyBBUEkKCi0gVGhlICJzdHJ1Y3RtZW1iZXIiIEFQSSBub3cgc3VwcG9ydHMgc29tZSBuZXcgZmxhZyBiaXRzIHRvIGRlbnkgcmVhZAogIGFuZC9vciB3cml0ZSBhY2Nlc3MgdG8gYXR0cmlidXRlcyBpbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlLgoKTmV3IHBsYXRmb3JtcwoKLSBDb21wYXEncyBpUEFRIGhhbmRoZWxkLCBydW5uaW5nIHRoZSAiZmFtaWxpYXIiIExpbnV4IGRpc3RyaWJ1dGlvbgogIChodHRwOi8vZmFtaWxpYXIuaGFuZGhlbGRzLm9yZykuCgpUZXN0cwoKLSBUaGUgImNsYXNzaWMiIHN0YW5kYXJkIHRlc3RzLCB3aGljaCB3b3JrIGJ5IGNvbXBhcmluZyBzdGRvdXQgdG8KICBhbiBleHBlY3RlZC1vdXRwdXQgZmlsZSB1bmRlciBMaWIvdGVzdC9vdXRwdXQvLCBubyBsb25nZXIgc3RvcCBhdAogIHRoZSBmaXJzdCBtaXNtYXRjaC4gIEluc3RlYWQgdGhlIHRlc3QgaXMgcnVuIHRvIGNvbXBsZXRpb24sIGFuZCBhCiAgdmFyaWFudCBvZiBuZGlmZi1zdHlsZSBjb21wYXJpc29uIGlzIHVzZWQgdG8gcmVwb3J0IGFsbCBkaWZmZXJlbmNlcy4KICBUaGlzIGlzIG11Y2ggZWFzaWVyIHRvIHVuZGVyc3RhbmQgdGhhbiB0aGUgcHJldmlvdXMgc3R5bGUgb2YgcmVwb3J0aW5nLgoKLSBUaGUgdW5pdHRlc3QtYmFzZWQgc3RhbmRhcmQgdGVzdHMgbm93IHVzZSByZWdydGVzdCdzIHRlc3RfbWFpbigpCiAgY29udmVudGlvbiwgaW5zdGVhZCBvZiBydW5uaW5nIGFzIGEgc2lkZS1lZmZlY3Qgb2YgbWVyZWx5IGJlaW5nCiAgaW1wb3J0ZWQuICBUaGlzIGFsbG93cyB0aGVzZSB0ZXN0cyB0byBiZSBydW4gaW4gbW9yZSBuYXR1cmFsIGFuZAogIGZsZXhpYmxlIHdheXMgYXMgdW5pdHRlc3RzLCBvdXRzaWRlIHRoZSByZWdydGVzdCBmcmFtZXdvcmsuCgotIHJlZ3J0ZXN0LnB5IGlzIG11Y2ggYmV0dGVyIGludGVncmF0ZWQgd2l0aCB1bml0dGVzdCBhbmQgZG9jdGVzdCBub3csCiAgZXNwZWNpYWxseSBpbiByZWdhcmQgdG8gcmVwb3J0aW5nIGVycm9ycy4KCldpbmRvd3MKCi0gTGFyZ2UgZmlsZSBzdXBwb3J0IG5vdyBhbHNvIHdvcmtzIGZvciBmaWxlcyA+IDRHQiwgb24gZmlsZXN5c3RlbXMKICB0aGF0IHN1cHBvcnQgaXQgKE5URlMgdW5kZXIgV2luZG93cyAyMDAwKS4gIFNlZSAiV2hhdCdzIE5ldyBpbgogIFB5dGhvbiAyLjJhMyIgZm9yIG1vcmUgZGV0YWlsLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEzPwpSZWxlYXNlIERhdGU6IDA3LVNlcC0yMDAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZQoKLSBDb252ZXJzaW9uIG9mIGxvbmcgdG8gZmxvYXQgbm93IHJhaXNlcyBPdmVyZmxvd0Vycm9yIGlmIHRoZSBsb25nIGlzIHRvbwogIGJpZyB0byByZXByZXNlbnQgYXMgYSBDIGRvdWJsZS4KCi0gVGhlIDMtYXJndW1lbnQgYnVpbHRpbiBwb3coKSBubyBsb25nZXIgYWxsb3dzIGEgdGhpcmQgbm9uLU5vbmUgYXJndW1lbnQKICBpZiBlaXRoZXIgb2YgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgaXMgYSBmbG9hdCwgb3IgaWYgYm90aCBhcmUgb2YKICBpbnRlZ2VyIHR5cGVzIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIChpbiB3aGljaCBsYXR0ZXIgY2FzZQogIHRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBmbG9hdCwgc28gdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUKICByZXN0cmljdGlvbikuCgotIFRoZSBidWlsdGluIGRpcigpIG5vdyByZXR1cm5zIG1vcmUgaW5mb3JtYXRpb24sIGFuZCBzb21ldGltZXMgbXVjaAogIG1vcmUsIGdlbmVyYWxseSBuYW1pbmcgYWxsIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0LCBhbmQgYWxsIGF0dHJpYnV0ZXMKICByZWFjaGFibGUgZnJvbSB0aGUgb2JqZWN0IHZpYSBpdHMgY2xhc3MsIGFuZCBmcm9tIGl0cyBjbGFzcydzIGJhc2UKICBjbGFzc2VzLCBhbmQgc28gb24gZnJvbSB0aGVtIHRvby4gIEV4YW1wbGU6ICBpbiAyLjJhMiwgZGlyKFtdKSByZXR1cm5lZAogIGFuIGVtcHR5IGxpc3QuICBJbiAyLjJhMywKCiAgPj4+IGRpcihbXSkKICBbJ19fYWRkX18nLCAnX19jbGFzc19fJywgJ19fY29udGFpbnNfXycsICdfX2RlbGF0dHJfXycsICdfX2RlbGl0ZW1fXycsCiAgICdfX2VxX18nLCAnX19nZV9fJywgJ19fZ2V0YXR0cl9fJywgJ19fZ2V0aXRlbV9fJywgJ19fZ2V0c2xpY2VfXycsCiAgICdfX2d0X18nLCAnX19oYXNoX18nLCAnX19pYWRkX18nLCAnX19pbXVsX18nLCAnX19pbml0X18nLCAnX19sZV9fJywKICAgJ19fbGVuX18nLCAnX19sdF9fJywgJ19fbXVsX18nLCAnX19uZV9fJywgJ19fbmV3X18nLCAnX19yZXByX18nLAogICAnX19ybXVsX18nLCAnX19zZXRhdHRyX18nLCAnX19zZXRpdGVtX18nLCAnX19zZXRzbGljZV9fJywgJ19fc3RyX18nLAogICAnYXBwZW5kJywgJ2NvdW50JywgJ2V4dGVuZCcsICdpbmRleCcsICdpbnNlcnQnLCAncG9wJywgJ3JlbW92ZScsCiAgICdyZXZlcnNlJywgJ3NvcnQnXQoKICBkaXIobW9kdWxlKSBjb250aW51ZXMgdG8gcmV0dXJuIG9ubHkgdGhlIG1vZHVsZSdzIGF0dHJpYnV0ZXMsIHRob3VnaC4KCi0gT3ZlcmZsb3dpbmcgb3BlcmF0aW9ucyBvbiBwbGFpbiBpbnRzIG5vdyByZXR1cm4gYSBsb25nIGludCByYXRoZXIKICB0aGFuIHJhaXNpbmcgT3ZlcmZsb3dFcnJvci4gIFRoaXMgaXMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIFBFUAogIDIzNy4gIFlvdSBjYW4gdXNlIC1XZGVmYXVsdDo6T3ZlcmZsb3dXYXJuaW5nIHRvIGVuYWJsZSBhIHdhcm5pbmcgZm9yCiAgdGhpcyBzaXR1YXRpb24sIGFuZCAtV2Vycm9yOjpPdmVyZmxvd1dhcm5pbmcgdG8gcmV2ZXJ0IHRvIHRoZSBvbGQKICBPdmVyZmxvd0Vycm9yIGV4Y2VwdGlvbi4KCi0gQSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiwgLVE8YXJnPiwgaXMgYWRkZWQgdG8gY29udHJvbCBydW4tdGltZQogIHdhcm5pbmdzIGZvciB0aGUgdXNlIG9mIGNsYXNzaWMgZGl2aXNpb24uICAoU2VlIFBFUCAyMzguKSAgUG9zc2libGUKICB2YWx1ZXMgYXJlIC1Rb2xkLCAtUXdhcm4sIC1Rd2FybmFsbCwgYW5kIC1RbmV3LiAgVGhlIGRlZmF1bHQgaXMKICAtUW9sZCwgbWVhbmluZyB0aGUgLyBvcGVyYXRvciBoYXMgaXRzIGNsYXNzaWMgbWVhbmluZyBhbmQgbm8KICB3YXJuaW5ncyBhcmUgaXNzdWVkLiAgVXNpbmcgLVF3YXJuIGlzc3VlcyBhIHJ1bi10aW1lIHdhcm5pbmcgYWJvdXQKICBhbGwgdXNlcyBvZiBjbGFzc2ljIGRpdmlzaW9uIGZvciBpbnQgYW5kIGxvbmcgYXJndW1lbnRzOyAtUXdhcm5hbGwKICBhbHNvIHdhcm5zIGFib3V0IGNsYXNzaWMgZGl2aXNpb24gZm9yIGZsb2F0IGFuZCBjb21wbGV4IGFyZ3VtZW50cwogIChmb3IgdXNlIHdpdGggZml4ZGl2LnB5KS4gIFVzaW5nIC1RbmV3IGlzIHF1ZXN0aW9uYWJsZTsgaXQgdHVybnMgb24KICBuZXcgZGl2aXNpb24gYnkgZGVmYXVsdCwgYnV0IG9ubHkgaW4gdGhlIF9fbWFpbl9fIG1vZHVsZS4gIFlvdSBjYW4KICB1c2VmdWxseSBjb21iaW5lIC1Rd2FybiBvciAtUXdhcm5hbGwgYW5kIC1RbmV3OiB0aGlzIGdpdmVzIHRoZQogIF9fbWFpbl9fIG1vZHVsZSBuZXcgZGl2aXNpb24sIGFuZCB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uCiAgZXZlcnl3aGVyZSBlbHNlLgoKLSBNYW55IGJ1aWx0LWluIHR5cGVzIGNhbiBub3cgYmUgc3ViY2xhc3NlZC4gIFRoaXMgYXBwbGllcyB0byBpbnQsCiAgbG9uZywgZmxvYXQsIHN0ciwgdW5pY29kZSwgYW5kIHR1cGxlLiAgKFRoZSB0eXBlcyBjb21wbGV4LCBsaXN0IGFuZAogIGRpY3Rpb25hcnkgY2FuIGFsc28gYmUgc3ViY2xhc3NlZDsgdGhpcyB3YXMgaW50cm9kdWNlZCBlYXJsaWVyLikKICBOb3RlIHRoYXQgcmVzdHJpY3Rpb25zIGFwcGx5IHdoZW4gc3ViY2xhc3NpbmcgaW1tdXRhYmxlIGJ1aWx0LWluCiAgdHlwZXM6IHlvdSBjYW4gb25seSBhZmZlY3QgdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBieSBvdmVybG9hZGluZwogIF9fbmV3X18uICBZb3UgY2FuIGFkZCBtdXRhYmxlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgc3ViY2xhc3MgaW5zdGFuY2VzCiAgd2lsbCBoYXZlIGEgX19kaWN0X18gYXR0cmlidXRlLCBidXQgeW91IGNhbm5vdCBjaGFuZ2UgdGhlICJ2YWx1ZSIKICAoYXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MpIG9mIGFuIGltbXV0YWJsZSBzdWJjbGFzcyBpbnN0YW5jZQogIG9uY2UgaXQgaXMgY3JlYXRlZC4KCi0gVGhlIGRpY3Rpb25hcnkgY29uc3RydWN0b3Igbm93IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCBhCiAgbWFwcGluZy1saWtlIG9iamVjdCwgYW5kIGluaXRpYWxpemVzIHRoZSBkaWN0aW9uYXJ5IGZyb20gaXRzCiAgKGtleSwgdmFsdWUpIHBhaXJzLgoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBzdXBlciwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGZhY2lsaXRhdGVzIG1ha2luZwogICJjb29wZXJhdGl2ZSBzdXBlciBjYWxscyIgaW4gYSBtdWx0aXBsZSBpbmhlcml0YW5jZSBzZXR0aW5nLiAgRm9yIGFuCiAgZXhwbGFuYXRpb24sIHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNjb29wZXJhdGlvbgoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBwcm9wZXJ0eSwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGVuYWJsZXMgdGhlCiAgY3JlYXRpb24gb2YgInByb3BlcnRpZXMiLiAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgaW1wbGVtZW50ZWQgYnkKICBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMgKG9yIG9ubHkgb25lIG9mIHRoZXNlIGZvciByZWFkLW9ubHkgb3IKICB3cml0ZS1vbmx5IGF0dHJpYnV0ZXMpLCB3aXRob3V0IHRoZSBuZWVkIHRvIG92ZXJyaWRlIF9fZ2V0YXR0cl9fLgogIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNwcm9wZXJ0eQoKLSBUaGUgc3ludGF4IG9mIGZsb2F0aW5nLXBvaW50IGFuZCBpbWFnaW5hcnkgbGl0ZXJhbHMgaGFzIGJlZW4KICBsaWJlcmFsaXplZCwgdG8gYWxsb3cgbGVhZGluZyB6ZXJvZXMuICBFeGFtcGxlcyBvZiBsaXRlcmFscyBub3cKICBsZWdhbCB0aGF0IHdlcmUgU3ludGF4RXJyb3JzIGJlZm9yZToKCiAgICAgIDAwLjAgICAgMGUzICAgMDEwMGogICAwNy41ICAgMDAwMDAwMDAwMDAwMDAwMDAwMDguCgotIEFuIG9sZCB0b2tlbml6ZXIgYnVnIGFsbG93ZWQgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgd2l0aCBhbiBpbmNvbXBsZXRlCiAgZXhwb25lbnQsIHN1Y2ggYXMgMWUgYW5kIDMuMWUtLiAgU3VjaCBsaXRlcmFscyBub3cgcmFpc2UgU3ludGF4RXJyb3IuCgpMaWJyYXJ5CgotIHRlbG5ldGxpYiBpbmNsdWRlcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG9wdGlvbnMsIGFuZCBzdXBwb3J0IGZvcgogIHNldHRpbmcgYW4gb3B0aW9uIG5lZ290aWF0aW9uIGNhbGxiYWNrLgoKLSBUaGUgbmV3IEMgc3RhbmRhcmQgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoYXQgbWF0aCBsaWJyYXJpZXMgc2V0IGVycm5vIHRvCiAgRVJBTkdFIG9uIG92ZXJmbG93LiAgRm9yIHBsYXRmb3JtIGxpYnJhcmllcyB0aGF0IGV4cGxvaXQgdGhpcyBuZXcKICBmcmVlZG9tLCBQeXRob24ncyBvdmVyZmxvdy1jaGVja2luZyB3YXMgd2hvbGx5IGJyb2tlbi4gIEEgbmV3IG92ZXJmbG93LQogIGNoZWNraW5nIHNjaGVtZSBhdHRlbXB0cyB0byByZXBhaXIgdGhhdCwgYnV0IG1heSBub3QgYmUgcmVsaWFibGUgb24gYWxsCiAgcGxhdGZvcm1zIChDIGRvZXNuJ3Qgc2VlbSB0byBwcm92aWRlIGFueXRoaW5nIGJvdGggdXNlZnVsIGFuZCBwb3J0YWJsZQogIGluIHRoaXMgYXJlYSBhbnltb3JlKS4KCi0gQXN5bmNocm9ub3VzIHRpbWVvdXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIG5ldyBjbGFzcwogIHRocmVhZGluZy5UaW1lci4KCi0gbWF0aC5sb2cgYW5kIG1hdGgubG9nMTAgbm93IHJldHVybiBzZW5zaWJsZSByZXN1bHRzIGZvciBldmVuIGh1Z2UKICBsb25nIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBtYXRoLmxvZzEwKDEwICoqIDEwMDAwKSB+PSAxMDAwMC4wLgoKLSBBIG5ldyBmdW5jdGlvbiwgaW1wLmxvY2tfaGVsZCgpLCByZXR1cm5zIDEgd2hlbiB0aGUgaW1wb3J0IGxvY2sgaXMKICBjdXJyZW50bHkgaGVsZC4gIFNlZSB0aGUgZG9jcyBmb3IgdGhlIGltcCBtb2R1bGUuCgotIHBpY2tsZSwgY1BpY2tsZSBhbmQgbWFyc2hhbCBvbiAzMi1iaXQgcGxhdGZvcm1zIGNhbiBub3cgY29ycmVjdGx5IHJlYWQKICBkdW1wcyBjb250YWluaW5nIGludHMgd3JpdHRlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIGludHMgYXJlIDggYnl0ZXMuCiAgV2hlbiByZWFkIG9uIGEgYm94IHdoZXJlIFB5dGhvbiBpbnRzIGFyZSA0IGJ5dGVzLCBzdWNoIHZhbHVlcyBhcmUKICBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmdzLgoKLSBJbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlICh1c2luZyB0aGUgcmV4ZWMgbW9kdWxlKSwgdW5tYXJzaGFsbGluZwogIGNvZGUgb2JqZWN0cyBpcyBubyBsb25nZXIgYWxsb3dlZC4gIFRoaXMgcGx1Z3MgYSBzZWN1cml0eSBob2xlLgoKLSB1bml0dGVzdC5UZXN0UmVzdWx0IGluc3RhbmNlcyBubyBsb25nZXIgc3RvcmUgcmVmZXJlbmNlcyB0byB0cmFjZWJhY2tzCiAgZ2VuZXJhdGVkIGJ5IHRlc3QgZmFpbHVyZXMuIFRoaXMgcHJldmVudHMgdW5leHBlY3RlZCBkYW5nbGluZyByZWZlcmVuY2VzCiAgdG8gb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCBiZXR3ZWVuIHRlc3RzLgoKVG9vbHMKCi0gVG9vbHMvc2NyaXB0cy9maXhkaXYucHkgaGFzIGJlZW4gYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZml4CiAgZGl2aXNpb24gb3BlcmF0b3JzIGFzIHBlciBQRVAgMjM4LgoKQnVpbGQKCi0gSWYgeW91IGFyZSBhbiBhZHZlbnR1cm91cyBwZXJzb24gdXNpbmcgTWFjIE9TIFggeW91IG1heSB3YW50IHRvIGxvb2sgYXQKICBNYWMvT1NYLiBUaGVyZSBpcyBhIE1ha2VmaWxlIHRoZXJlIHRoYXQgd2lsbCBidWlsZCBQeXRob24gYXMgYSByZWFsIE1hYwogIGFwcGxpY2F0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXhwZXJpbWVudGluZyB3aXRoIENhcmJvbiBvciBDb2NvYS4KICBEaXNjdXNzaW9uIG9mIHRoaXMgb24gcHl0aG9ubWFjLXNpZywgcGxlYXNlLgoKQyBBUEkKCi0gTmV3IGZ1bmN0aW9uIFB5T2JqZWN0X0RpcihvYmopLCBsaWtlIFB5dGhvbiBfX2J1aWx0aW5fXy5kaXIob2JqKS4KCi0gTm90ZSB0aGF0IFB5TG9uZ19Bc0RvdWJsZSBjYW4gZmFpbCEgIFRoaXMgaGFzIGFsd2F5cyBiZWVuIHRydWUsIGJ1dCBubwogIGNhbGxlcnMgY2hlY2tlZCBmb3IgaXQuICBJdCdzIG1vcmUgbGlrZWx5IHRvIGZhaWwgbm93LCBiZWNhdXNlIG92ZXJmbG93CiAgZXJyb3JzIGFyZSBwcm9wZXJseSBkZXRlY3RlZCBub3cuICBUaGUgcHJvcGVyIHdheSB0byBjaGVjazoKCiAgZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoc29tZV9sb25nX29iamVjdCk7CiAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAvKiBUaGUgY29udmVyc2lvbiBmYWlsZWQuICovCiAgfQoKLSBUaGUgR0MgQVBJIGhhcyBiZWVuIGNoYW5nZWQuICBFeHRlbnNpb25zIHRoYXQgdXNlIHRoZSBvbGQgQVBJIHdpbGwgc3RpbGwKICBjb21waWxlIGJ1dCB3aWxsIG5vdCBwYXJ0aWNpcGF0ZSBpbiBHQy4gIFRvIHVwZ3JhZGUgYW4gZXh0ZW5zaW9uCiAgbW9kdWxlOgoKICAgIC0gcmVuYW1lIFB5X1RQRkxBR1NfR0MgdG8gUHlUUEZMQUdTX0hBVkVfR0MKCiAgICAtIHVzZSBQeU9iamVjdF9HQ19OZXcgb3IgUHlPYmplY3RfR0NfTmV3VmFyIHRvIGFsbG9jYXRlIG9iamVjdHMgYW5kCiAgICAgIFB5T2JqZWN0X0dDX0RlbCB0byBkZWFsbG9jYXRlIHRoZW0KCiAgICAtIHJlbmFtZSBQeU9iamVjdF9HQ19Jbml0IHRvIFB5T2JqZWN0X0dDX1RyYWNrIGFuZCBQeU9iamVjdF9HQ19GaW5pCiAgICAgIHRvIFB5T2JqZWN0X0dDX1VuVHJhY2sKCiAgICAtIHJlbW92ZSBQeUdDX0hFQURfU0laRSBmcm9tIG9iamVjdCBzaXplIGNhbGN1bGF0aW9ucwoKICAgIC0gcmVtb3ZlIGNhbGxzIHRvIFB5T2JqZWN0X0FTX0dDIGFuZCBQeU9iamVjdF9GUk9NX0dDCgotIFR3byBuZXcgZnVuY3Rpb25zOiBQeVN0cmluZ19Gcm9tRm9ybWF0KCkgYW5kIFB5U3RyaW5nX0Zyb21Gb3JtYXRWKCkuCiAgVGhlc2UgY2FuIGJlIHVzZWQgc2FmZWx5IHRvIGNvbnN0cnVjdCBzdHJpbmcgb2JqZWN0cyBmcm9tIGEKICBzcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcgKHNpbWlsYXIgdG8gdGhlIGZvcm1hdCBzdHJpbmcgc3VwcG9ydGVkCiAgYnkgUHlFcnJfRm9ybWF0KCkpLgoKTmV3IHBsYXRmb3JtcwoKLSBTdGVwaGVuIEhhbnNlbiBjb250cmlidXRlZCBwYXRjaGVzIHN1ZmZpY2llbnQgdG8gZ2V0IGEgY2xlYW4gY29tcGlsZQogIHVuZGVyIEJvcmxhbmQgQyAoV2luZG93cyksIGJ1dCBoZSByZXBvcnRzIHByb2JsZW1zIHJ1bm5pbmcgaXQgYW5kIHJhbgogIG91dCBvZiB0aW1lIHRvIGNvbXBsZXRlIHRoZSBwb3J0LiAgVm9sdW50ZWVycz8gIEV4cGVjdCBhIE1lbW9yeUVycm9yCiAgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGVzIG1vZHVsZTsgdGhpcyBpcyBwcm9iYWJseSBzaGFsbG93LCBhbmQKICBjYXVzaW5nIGxhdGVyIGZhaWx1cmVzIHRvby4KClRlc3RzCgpXaW5kb3dzCgotIExhcmdlIGZpbGUgc3VwcG9ydCBpcyBub3cgZW5hYmxlZCBvbiBXaW4zMiBwbGF0Zm9ybXMgYXMgd2VsbCBhcyBvbgogIFdpbjY0LiAgVGhpcyBtZWFucyB0aGF0LCBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgZi50ZWxsKCkgYW5kIGYuc2VlaygpCiAgdG8gbWFuaXB1bGF0ZSBmaWxlcyBsYXJnZXIgdGhhbiAyIGdpZ2FieXRlcyAocHJvdmlkZWQgeW91IGhhdmUgZW5vdWdoCiAgZGlzayBzcGFjZSwgYW5kIGFyZSB1c2luZyBhIFdpbmRvd3MgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIGxhcmdlCiAgcGFydGl0aW9ucykuICBXaW5kb3dzIGZpbGVzeXN0ZW0gbGltaXRzOiAgRkFUIGhhcyBhIDJHQiAoZ2lnYWJ5dGUpCiAgZmlsZXNpemUgbGltaXQsIGFuZCBsYXJnZSBmaWxlIHN1cHBvcnQgbWFrZXMgbm8gZGlmZmVyZW5jZSB0aGVyZS4KICBGQVQzMidzIGxpbWl0IGlzIDRHQiwgYW5kIGZpbGVzID49IDJHQiBhcmUgZWFzaWVyIHRvIHVzZSBmcm9tIFB5dGhvbiBub3cuCiAgTlRGUyBoYXMgbm8gcHJhY3RpY2FsIGxpbWl0IG9uIGZpbGUgc2l6ZSwgYW5kIGZpbGVzIG9mIGFueSBzaXplIGNhbiBiZQogIHVzZWQgZnJvbSBQeXRob24gbm93LgoKLSBUaGUgdzl4cG9wZW4gaGFjayBpcyBub3cgdXNlZCBvbiBXaW5kb3dzIE5UIGFuZCAyMDAwIHRvbyB3aGVuIENPTVBTUEVDCiAgcG9pbnRzIHRvIGNvbW1hbmQuY29tIChwYXRjaCBmcm9tIEJyaWFuIFF1aW5sYW4pLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEyPwpSZWxlYXNlIERhdGU6IDIyLUF1Zy0yMDAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQnVpbGQKCi0gVGltIFBldGVycyBkZXZlbG9wZWQgYSBicmFuZCBuZXcgV2luZG93cyBpbnN0YWxsZXIgdXNpbmcgV2lzZSA4LjEsCiAgZ2VuZXJvdXNseSBkb25hdGVkIHRvIHVzIGJ5IFdpc2UgU29sdXRpb25zLgoKLSBjb25maWd1cmUgc3VwcG9ydHMgYSBuZXcgb3B0aW9uIC0tZW5hYmxlLXVuaWNvZGUsIHdpdGggdGhlIHZhbHVlcwogIHVjczIgYW5kIHVjczQgKG5ldyBpbiAyLjJhMSkuIFdpdGggLS1kaXNhYmxlLXVuaWNvZGUsIHRoZSBVbmljb2RlCiAgdHlwZSBhbmQgc3VwcG9ydGluZyBjb2RlIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcnByZXRlci4KCi0gQSBuZXcgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1mcmFtZXdvcmsgYnVpbGRzIGEgTWFjIE9TIFggZnJhbWV3b3JrLAogIHdoaWNoICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHdpbGwgaW5zdGFsbC4gVGhpcyBwcm92aWRlcyBhIHN0YXJ0aW5nCiAgcG9pbnQgZm9yIG1vcmUgbWFjLWxpa2UgZnVuY3Rpb25hbGl0eSwgam9pbiBweXRob25tYWMtc2lnQHB5dGhvbi5vcmcKICBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaGVscGluZy4KCi0gVGhlIE5lWFQgcGxhdGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KCi0gVGhlIGBuZXcnIG1vZHVsZSBpcyBub3cgc3RhdGljYWxseSBsaW5rZWQuCgpUb29scwoKLSBUaGUgbmV3IFRvb2xzL3NjcmlwdHMvY2xlYW5mdXR1cmUucHkgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseQogIGVkaXQgb3V0IG9ic29sZXRlIGZ1dHVyZSBzdGF0ZW1lbnRzIGZyb20gUHl0aG9uIHNvdXJjZSBjb2RlLiAgU2VlCiAgdGhlIG1vZHVsZSBkb2NzdHJpbmcgZm9yIGRldGFpbHMuCgpUZXN0cwoKLSByZWdydGVzdC5weSBub3cga25vd3Mgd2hpY2ggdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNraXBwZWQgb24gc29tZQogIHBsYXRmb3JtcywgYWxsb3dpbmcgdG8gZ2l2ZSBjbGVhcmVyIHRlc3QgcmVzdWx0IG91dHB1dC4gIHJlZ3J0ZXN0CiAgYWxzbyBoYXMgb3B0aW9uYWwgLS11c2UvLXUgc3dpdGNoIHRvIHJ1biBub3JtYWxseSBkaXNhYmxlZCB0ZXN0cwogIHdoaWNoIHJlcXVpcmUgbmV0d29yayBhY2Nlc3Mgb3IgY29uc3VtZSBzaWduaWZpY2FudCBkaXNrIHJlc291cmNlcy4KCi0gU2V2ZXJhbCBuZXcgdGVzdHMgaW4gdGhlIHN0YW5kYXJkIHRlc3Qgc3VpdGUsIHdpdGggc3BlY2lhbCB0aGFua3MgdG8KICBOaWNrIE1hdGhld3Nvbi4KCkNvcmUKCi0gVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yIC8vIGhhcyBiZWVuIGFkZGVkIGFzIG91dGxpbmVkIGluIFBFUAogIDIzOC4gIFRoZSAvIG9wZXJhdG9yIHN0aWxsIHByb3ZpZGVzIGNsYXNzaWMgZGl2aXNpb24gKGFuZCB3aWxsIHVudGlsCiAgUHl0aG9uIDMuMCkgdW5sZXNzICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIiBpcyBpbmNsdWRlZCwgaW4KICB3aGljaCBjYXNlIHRoZSAvIG9wZXJhdG9yIHdpbGwgcHJvdmlkZSB0cnVlIGRpdmlzaW9uLiAgVGhlIG9wZXJhdG9yCiAgbW9kdWxlIHByb3ZpZGVzIHRydWVkaXYoKSBhbmQgZmxvb3JkaXYoKSBmdW5jdGlvbnMuICBBdWdtZW50ZWQKICBhc3NpZ25tZW50IHZhcmlhbnRzIGFyZSBpbmNsdWRlZCwgYXMgYXJlIHRoZSBlcXVpdmFsZW50IG92ZXJsb2FkYWJsZQogIG1ldGhvZHMgYW5kIEMgQVBJIG1ldGhvZHMuICBTZWUgdGhlIFBFUCBmb3IgYSBmdWxsIGRpc2N1c3Npb246CiAgPGh0dHA6Ly9weXRob24uc2YubmV0L3BlcHMvcGVwLTAyMzguaHRtbD4KCi0gRnV0dXJlIHN0YXRlbWVudHMgYXJlIG5vdyBlZmZlY3RpdmUgaW4gc2ltdWxhdGVkIGludGVyYWN0aXZlIHNoZWxscwogIChsaWtlIElETEUpLiAgVGhpcyBzaG91bGQgImp1c3Qgd29yayIgYnkgbWFnaWMsIGJ1dCByZWFkIE1pY2hhZWwKICBIdWRzb24ncyAiRnV0dXJlIHN0YXRlbWVudHMgaW4gc2ltdWxhdGVkIHNoZWxscyIgUEVQIDI2NCBmb3IgZnVsbAogIGRldGFpbHM6ICA8aHR0cDovL3B5dGhvbi5zZi5uZXQvcGVwcy9wZXAtMDI2NC5odG1sPi4KCi0gVGhlIHR5cGUvY2xhc3MgdW5pZmljYXRpb24gKFBFUCAyNTItMjUzKSB3YXMgaW50ZWdyYXRlZCBpbnRvIHRoZQogIHRydW5rIGFuZCBpcyBub3Qgc28gdGVudGF0aXZlIGFueSBtb3JlICh0aGUgZXhhY3Qgc3BlY2lmaWNhdGlvbiBvZgogIHNvbWUgZmVhdHVyZXMgaXMgc3RpbGwgdGVudGF0aXZlKS4gIEEgbG90IG9mIHdvcmsgaGFzIGRvbmUgb24gZml4aW5nCiAgYnVncyBhbmQgYWRkaW5nIHJvYnVzdG5lc3MgYW5kIGZlYXR1cmVzIChwZXJmb3JtYW5jZSBzdGlsbCBoYXMgdG8KICBjb21lIGEgbG9uZyB3YXkpLgoKLSBXYXJuaW5ncyBhYm91dCBhIG1pc21hdGNoIGluIHRoZSBQeXRob24gQVBJIGR1cmluZyBleHRlbnNpb24gaW1wb3J0CiAgbm93IHVzZSB0aGUgUHl0aG9uIHdhcm5pbmcgZnJhbWV3b3JrICh3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0bwogIHdyaXRlIGZpbHRlcnMgZm9yIHRoZXNlIHdhcm5pbmdzKS4KCi0gQSBmdW5jdGlvbidzIF9fZGljdF9fIChha2EgZnVuY19kaWN0KSB3aWxsIG5vdyBhbHdheXMgYmUgYQogIGRpY3Rpb25hcnkuICBJdCB1c2VkIHRvIGJlIHBvc3NpYmxlIHRvIGRlbGV0ZSBpdCBvciBzZXQgaXQgdG8gTm9uZSwKICBidXQgbm93IGJvdGggYWN0aW9ucyByYWlzZSBUeXBlRXJyb3JzLiAgSXQgaXMgc3RpbGwgbGVnYWwgdG8gc2V0IGl0CiAgdG8gYSBkaWN0aW9uYXJ5IG9iamVjdC4gIEdldHRpbmcgZnVuYy5fX2RpY3RfXyBiZWZvcmUgYW55IGF0dHJpYnV0ZXMKICBoYXZlIGJlZW4gYXNzaWduZWQgbm93IHJldHVybnMgYW4gZW1wdHkgZGljdGlvbmFyeSBpbnN0ZWFkIG9mIE5vbmUuCgotIEEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24sIC1FLCB3YXMgYWRkZWQgd2hpY2ggZGlzYWJsZXMgdGhlIHVzZSBvZgogIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIG9yIGF0IGxlYXN0IHRob3NlIHRoYXQgYXJlIHNwZWNpZmljYWxseQogIHNpZ25pZmljYW50IHRvIFB5dGhvbi4gIFVzdWFsbHkgdGhvc2UgaGF2ZSBhIG5hbWUgc3RhcnRpbmcgd2l0aAogICJQWVRIT04iLiAgVGhpcyB3YXMgdXNlZCB0byBmaXggYSBwcm9ibGVtIHdoZXJlIHRoZSB0ZXN0cyBmYWlsIGlmCiAgdGhlIHVzZXIgaGFwcGVucyB0byBoYXZlIFBZVEhPTkhPTUUgb3IgUFlUSE9OUEFUSCBwb2ludGluZyB0byBhbgogIG9sZGVyIGRpc3RyaWJ1dGlvbi4KCkxpYnJhcnkKCi0gTmV3IGNsYXNzIERpZmZlciBhbmQgbmV3IGZ1bmN0aW9ucyBuZGlmZigpIGFuZCByZXN0b3JlKCkgaW4gZGlmZmxpYi5weS4KICBUaGVzZSBwYWNrYWdlIHRoZSBhbGdvcml0aG1zIHVzZWQgYnkgdGhlIHBvcHVsYXIgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSwKICBmb3IgcHJvZ3JhbW1hdGljIHJldXNlLgoKLSBOZXcgZnVuY3Rpb24geG1sLnNheC5zYXh1dGlscy5xdW90ZWF0dHIoKTogIFF1b3RlIGFuIFhNTCBhdHRyaWJ1dGUKICB2YWx1ZSB1c2luZyB0aGUgbWluaW1hbCBxdW90aW5nIHJlcXVpcmVkIGZvciB0aGUgdmFsdWU7IG1vcmUKICByZWxpYWJsZSB0aGFuIHVzaW5nIHhtbC5zYXguc2F4dXRpbHMuZXNjYXBlKCkgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMuCgotIFJlYWRsaW5lIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY21kLkNtZCB3YXMgYWRkZWQuCgotIENhbGxpbmcgb3MudGVtcG5hbSgpIG9yIG9zLnRtcG5hbSgpIGdlbmVyYXRlIFJ1bnRpbWVXYXJuaW5ncy4KCi0gQWRkZWQgZnVuY3Rpb24gdGhyZWFkaW5nLkJvdW5kZWRTZW1hcGhvcmUoKQoKLSBBZGRlZCBLYS1QaW5nIFllZSdzIGNnaXRiLnB5IG1vZHVsZS4KCi0gVGhlIGBuZXcnIG1vZHVsZSBub3cgZXhwb3NlcyB0aGUgQ09feHh4IGZsYWdzLgoKLSBUaGUgZ2MgbW9kdWxlIG9mZmVycyB0aGUgZ2V0X3JlZmVyZW50cyBmdW5jdGlvbi4KCk5ldyBwbGF0Zm9ybXMKCkMgQVBJCgotIFR3byBuZXcgQVBJcyBQeU9TX3NucHJpbnRmKCkgYW5kIFB5T1NfdnNucHJpbnRmKCkgd2VyZSBhZGRlZAogIHdoaWNoIHByb3ZpZGUgYSBjcm9zcy1wbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZQogIHJlbGF0aXZlbHkgbmV3IHNucHJpbnRmKCkvdnNucHJpbnRmKCkgQyBsaWIgQVBJcy4gSW4gY29udHJhc3QgdG8KICB0aGUgc3RhbmRhcmQgc3ByaW50ZigpIGFuZCB2c3ByaW50ZigpIEMgbGliIEFQSXMsIHRoZXNlIHZlcnNpb25zCiAgYXBwbHkgYm91bmRzIGNoZWNraW5nIG9uIHRoZSB1c2VkIGJ1ZmZlciB3aGljaCBlbmhhbmNlcyBwcm90ZWN0aW9uCiAgYWdhaW5zdCBidWZmZXIgb3ZlcnJ1bnMuCgotIFVuaWNvZGUgQVBJcyBub3cgdXNlIG5hbWUgbWFuZ2xpbmcgdG8gYXNzdXJlIHRoYXQgbWl4aW5nIGludGVycHJldGVycwogIGFuZCBleHRlbnNpb25zIHVzaW5nIGRpZmZlcmVudCBVbmljb2RlIHdpZHRocyBpcyByZW5kZXJlZCBuZXh0IHRvCiAgaW1wb3NzaWJsZS4gVHJ5aW5nIHRvIGltcG9ydCBhbiBpbmNvbXBhdGlibGUgVW5pY29kZS1hd2FyZSBleHRlbnNpb24KICB3aWxsIHJlc3VsdCBpbiBhbiBJbXBvcnRFcnJvci4gIFVuaWNvZGUgZXh0ZW5zaW9ucyB3cml0ZXJzIG11c3QgbWFrZQogIHN1cmUgdG8gY2hlY2sgdGhlIFVuaWNvZGUgd2lkdGggY29tcGF0aWJpbGl0eSBpbiB0aGVpciBleHRlbnNpb25zIGJ5CiAgdXNpbmcgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYW5nbGVkIFVuaWNvZGUgQVBJcyBpbiB0aGUgZXh0ZW5zaW9uLgoKLSBUd28gbmV3IGZsYWdzIE1FVEhfTk9BUkdTIGFuZCBNRVRIX08gYXJlIGF2YWlsYWJsZSBpbiBtZXRob2QgZGVmaW5pdGlvbgogIHRhYmxlcyB0byBzaW1wbGlmeSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIHdpdGggbm8gYXJndW1lbnRzIGFuZCBhCiAgc2luZ2xlIHVudHlwZWQgYXJndW1lbnQuIENhbGxpbmcgc3VjaCBtZXRob2RzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KICBjYWxsaW5nIGNvcnJlc3BvbmRpbmcgTUVUSF9WQVJBUkdTIG1ldGhvZHMuIE1FVEhfT0xEQVJHUyBpcyBub3cKICBkZXByZWNhdGVkLgoKV2luZG93cwoKLSAiaW1wb3J0IG1vZHVsZSIgbm93IGNvbXBpbGVzIG1vZHVsZS5weXcgaWYgaXQgZXhpc3RzIGFuZCBub3RoaW5nIGVsc2UKICByZWxldmFudCBpcyBmb3VuZC4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhMT8KUmVsZWFzZSBkYXRlOiAxOC1KdWwtMjAwMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUKCi0gVEVOVEFUSVZFTFksIGEgbGFyZ2UgYW1vdW50IG9mIGNvZGUgaW1wbGVtZW50aW5nIG11Y2ggb2Ygd2hhdCdzCiAgZGVzY3JpYmVkIGluIFBFUCAyNTIgKE1ha2luZyBUeXBlcyBMb29rIE1vcmUgTGlrZSBDbGFzc2VzKSBhbmQgUEVQCiAgMjUzIChTdWJ0eXBpbmcgQnVpbHQtaW4gVHlwZXMpIHdhcyBhZGRlZC4gIFRoaXMgd2lsbCBiZSByZWxlYXNlZAogIHdpdGggUHl0aG9uIDIuMmExLiAgRG9jdW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkKICB0aHJvdWdoIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvLiAgVGhlIHB1cnBvc2Ugb2YgcmVsZWFzaW5nIHRoaXMKICB3aXRoIFB5dGhvbiAyLjJhMSBpcyB0byB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXQgaXMKICBwb3NzaWJsZSwgdGhvdWdoIG5vdCBsaWtlbHksIHRoYXQgYSBkZWNpc2lvbiBpcyBtYWRlIG5vdCB0byByZWxlYXNlCiAgdGhpcyBjb2RlIGFzIHBhcnQgb2YgMi4yIGZpbmFsLCBpZiBhbnkgc2VyaW91cyBiYWNrd2FyZHMKICBpbmNvbXBhcGF0aWJpbGl0aWVzIGFyZSBmb3VuZCBkdXJpbmcgYWxwaGEgdGVzdGluZyB0aGF0IGNhbm5vdCBiZQogIHJlcGFpcmVkLgoKLSBHZW5lcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBuZXcgd2F5IHRvIGNyZWF0ZSBhbiBpdGVyYXRvciAoc2VlCiAgYmVsb3cpIHVzaW5nIHdoYXQgbG9va3MgbGlrZSBhIHNpbXBsZSBmdW5jdGlvbiBjb250YWluaW5nIG9uZSBvcgogIG1vcmUgJ3lpZWxkJyBzdGF0ZW1lbnRzLiAgU2VlIFBFUCAyNTUuICBTaW5jZSB0aGlzIGFkZHMgYSBuZXcKICBrZXl3b3JkIHRvIHRoZSBsYW5ndWFnZSwgdGhpcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCBieSBpbmNsdWRpbmcgYQogIGZ1dHVyZSBzdGF0ZW1lbnQ6ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMiIChzZWUgUEVQIDIzNikuCiAgR2VuZXJhdG9ycyB3aWxsIGJlY29tZSBhIHN0YW5kYXJkIGZlYXR1cmUgaW4gYSBmdXR1cmUgcmVsZWFzZQogIChwcm9iYWJseSAyLjMpLiAgV2l0aG91dCB0aGlzIGZ1dHVyZSBzdGF0ZW1lbnQsICd5aWVsZCcgcmVtYWlucyBhbgogIG9yZGluYXJ5IGlkZW50aWZpZXIsIGJ1dCBhIHdhcm5pbmcgaXMgaXNzdWVkIGVhY2ggdGltZSBpdCBpcyB1c2VkLgogIChUaGVzZSB3YXJuaW5ncyBjdXJyZW50bHkgZG9uJ3QgY29uZm9ybSB0byB0aGUgd2FybmluZ3MgZnJhbWV3b3JrIG9mCiAgUEVQIDIzMDsgd2UgaW50ZW5kIHRvIGZpeCB0aGlzIGluIDIuMmEyLikKCi0gVGhlIFVURi0xNiBjb2RlYyB3YXMgbW9kaWZpZWQgdG8gYmUgbW9yZSBSRkMgY29tcGxpYW50LiBJdCB3aWxsIG5vdwogIG9ubHkgcmVtb3ZlIEJPTSBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIGFuZCB0aGVuCiAgb25seSBpZiBydW5uaW5nIGluIG5hdGl2ZSBtb2RlIChVVEYtMTYtTEUgYW5kIC1CRSB3b24ndCByZW1vdmUgYQogIGxlYWRpbmcgQk1PIGNoYXJhY3RlcikuCgotIFN0cmluZ3Mgbm93IGhhdmUgYSBuZXcgbWV0aG9kIC5kZWNvZGUoKSB0byBjb21wbGVtZW50IHRoZSBhbHJlYWR5CiAgZXhpc3RpbmcgLmVuY29kZSgpIG1ldGhvZC4gVGhlc2UgdHdvIG1ldGhvZHMgcHJvdmlkZSBkaXJlY3QgYWNjZXNzCiAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVjb2RlcnMgYW5kIGVuY29kZXJzIG9mIHRoZSByZWdpc3RlcmVkIGNvZGVjcy4KCiAgVG8gZW5oYW5jZSB0aGUgdXNhYmlsaXR5IG9mIHRoZSAuZW5jb2RlKCkgbWV0aG9kLCB0aGUgc3BlY2lhbAogIGNhc2luZyBvZiBVbmljb2RlIG9iamVjdCByZXR1cm4gdmFsdWVzIHdhcyBkcm9wcGVkIChVbmljb2RlIG9iamVjdHMKICB3ZXJlIGF1dG8tbWFnaWNhbGx5IGNvbnZlcnRlZCB0byBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgoKICBCb3RoIG1ldGhvZHMgd2lsbCBub3cgcmV0dXJuIHdoYXRldmVyIHRoZSBjb2RlYyBpbiBjaGFyZ2Ugb2YgdGhlCiAgcmVxdWVzdGVkIGVuY29kaW5nIHJldHVybnMgYXMgb2JqZWN0LCBlLmcuIFVuaWNvZGUgY29kZWNzIHdpbGwKICByZXR1cm4gVW5pY29kZSBvYmplY3RzIHdoZW4gZGVjb2RpbmcgaXMgcmVxdWVzdGVkICgi5Pb8Ii5kZWNvZGUoImxhdGluLTEiKQogIHdpbGwgcmV0dXJuIHUi5Pb8IikuIFRoaXMgZW5hYmxlcyBjb2RlYyB3cml0ZXIgdG8gY3JlYXRlIGNvZGVjcwogIGZvciB2YXJpb3VzIHNpbXBsZSB0byB1c2UgY29udmVyc2lvbnMuCgogIE5ldyBjb2RlY3Mgd2VyZSBhZGRlZCB0byBkZW1vbnN0cmF0ZSB0aGVzZSBuZXcgZmVhdHVyZXMgKHRoZSAuZW5jb2RlKCkKICBhbmQgLmRlY29kZSgpIGNvbHVtbnMgaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIG9iamVjdHMpOgoKICBOYW1lICAgICB8IC5lbmNvZGUoKSB8IC5kZWNvZGUoKSB8IERlc2NyaXB0aW9uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHV1ICAgICAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgVVUgY29kZWMgKGUuZy4gZm9yIGVtYWlsKQogIGJhc2U2NCAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgYmFzZTY0IGNvZGVjCiAgcXVvcHJpICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBxdW90ZWQtcHJpbnRhYmxlIGNvZGVjCiAgemxpYiAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCB6bGliIGNvbXByZXNzaW9uCiAgaGV4ICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCAyLWJ5dGUgaGV4IGNvZGVjCiAgcm90LTEzICAgfCBzdHJpbmcgICAgfCBVbmljb2RlICAgfCBST1QtMTMgVW5pY29kZSBjaGFybWFwIGNvZGVjCgotIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgbm93IHN1cHBvcnQgdGhlIGNvbmNlcHQgb2YgYSBkZWZhdWx0IFVuaWNvZGUKICBlbmNvZGluZyBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4gIE5vdGFibHksIFdpbmRvd3Mgc3VwcG9ydHMgJ21iY3MnCiAgYXMgdGhlIGRlZmF1bHQuICBUaGUgTWFjaW50b3NoIHdpbGwgYWxzbyBhZG9wdCB0aGlzIGNvbmNlcHQgaW4gdGhlIG1lZGl1bQogIHRlcm0sIGFsdGhvdWdoIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGF0IHBsYXRmb3JtIHdpbGwgYmUgb3RoZXIgdGhhbgogICdtYmNzJy4KCiAgT24gb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHN1cHBvcnQgbm9uLUFTQ0lJIGZpbGVuYW1lcywgaXQgaXMgY29tbW9uIGZvcgogIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmaWxlbmFtZXMgKHN1Y2ggYXMgb3MubGlzdGRpcigpKSB0byByZXR1cm4gUHl0aG9uCiAgc3RyaW5nIG9iamVjdHMgcHJlLWVuY29kZWQgdXNpbmcgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgZm9yCiAgdGhlIHBsYXRmb3JtLiAgQXMgdGhpcyBlbmNvZGluZyBpcyBsaWtlbHkgdG8gYmUgZGlmZmVyZW50IGZyb20gUHl0aG9uJ3MKICBkZWZhdWx0IGVuY29kaW5nLCBjb252ZXJ0aW5nIHRoaXMgbmFtZSB0byBhIFVuaWNvZGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nCiAgaXQgYmFjayB0byB0aGUgT3BlcmF0aW5nIFN5c3RlbSB3b3VsZCByZXN1bHQgaW4gYSBVbmljb2RlIGVycm9yLCBhcyBQeXRob24KICB3b3VsZCBhdHRlbXB0IHRvIHVzZSBpdHMgZGVmYXVsdCBlbmNvZGluZyAoZ2VuZXJhbGx5IEFTQ0lJKSByYXRoZXIgdGhhbgogIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0uCgogIEluIGdlbmVyYWwsIHRoaXMgY2hhbmdlIHNpbXBseSByZW1vdmVzIHN1cnByaXNlcyB3aGVuIHdvcmtpbmcgd2l0aAogIFVuaWNvZGUgYW5kIHRoZSBmaWxlIHN5c3RlbSwgbWFraW5nIHRoZXNlIG9wZXJhdGlvbnMgd29yayBhcyB5b3UgZXhwZWN0LAogIGluY3JlYXNpbmcgdGhlIHRyYW5zcGFyZW5jeSBvZiBVbmljb2RlIG9iamVjdHMgaW4gdGhpcyBjb250ZXh0LgogIFNlZSBbPz8/P10gZm9yIG1vcmUgZGV0YWlscywgaW5jbHVkaW5nIGV4YW1wbGVzLgoKLSBGbG9hdCAoYW5kIGNvbXBsZXgpIGxpdGVyYWxzIGluIHNvdXJjZSBjb2RlIHdlcmUgZXZhbHVhdGVkIHRvIGZ1bGwKICBwcmVjaXNpb24gb25seSB3aGVuIHJ1bm5pbmcgZnJvbSBhIC5weSBmaWxlOyB0aGUgc2FtZSBjb2RlIGxvYWRlZCBmcm9tIGEKICAucHljIChvciAucHlvKSBmaWxlIGNvdWxkIHN1ZmZlciBudW1lcmljIGRpZmZlcmVuY2VzIHN0YXJ0aW5nIGF0IGFib3V0IHRoZQogIDEydGggc2lnbmlmaWNhbnQgZGVjaW1hbCBkaWdpdC4gIEZvciBleGFtcGxlLCBvbiBhIG1hY2hpbmUgd2l0aCBJRUVFLTc1NAogIGZsb2F0aW5nIGFyaXRobWV0aWMsCgogICAgICB4ID0gOTAwNzE5OTI1NDc0MDk5Mi4wCiAgICAgIHByaW50IGxvbmcoeCkKCiAgcHJpbnRlZCA5MDA3MTk5MjU0NzQwOTkyIGlmIHJ1biBkaXJlY3RseSBmcm9tIC5weSwgYnV0IDkwMDcxOTkyNTQ3NDAwMDAKICBpZiBmcm9tIGEgY29tcGlsZWQgKC5weWMgb3IgLnB5bykgZmlsZS4gIFRoaXMgd2FzIGR1ZSB0byBtYXJzaGFsIHVzaW5nCiAgc3RyKGZsb2F0KSBpbnN0ZWFkIG9mIHJlcHIoZmxvYXQpIHdoZW4gYnVpbGRpbmcgY29kZSBvYmplY3RzLiAgbWFyc2hhbAogIG5vdyB1c2VzIHJlcHIoZmxvYXQpIGluc3RlYWQsIHdoaWNoIHNob3VsZCByZXByb2R1Y2UgZmxvYXRzIHRvIGZ1bGwKICBtYWNoaW5lIHByZWNpc2lvbiAoYXNzdW1pbmcgdGhlIHBsYXRmb3JtIEMgZmxvYXQ8LT5zdHJpbmcgSS9PIGNvbnZlcnNpb24KICBmdW5jdGlvbnMgYXJlIG9mIGdvb2QgcXVhbGl0eSkuCgogIFRoaXMgbWF5IGNhdXNlIGZsb2F0aW5nLXBvaW50IHJlc3VsdHMgdG8gY2hhbmdlIGluIHNvbWUgY2FzZXMsIGFuZAogIHVzdWFsbHkgZm9yIHRoZSBiZXR0ZXIsIGJ1dCBtYXkgYWxzbyBjYXVzZSBudW1lcmljYWxseSB1bnN0YWJsZQogIGFsZ29yaXRobXMgdG8gYnJlYWsuCgotIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkaWN0cyBzdWZmZXJzIGZld2VyIGNvbGxpc2lvbnMsIHdoaWNoIGhhcyBzcGVlZAogIGJlbmVmaXRzLiAgSG93ZXZlciwgdGhlIG9yZGVyIGluIHdoaWNoIGRpY3QgZW50cmllcyBhcHBlYXIgaW4gZGljdC5rZXlzKCksCiAgZGljdC52YWx1ZXMoKSBhbmQgZGljdC5pdGVtcygpIG1heSBkaWZmZXIgZnJvbSBwcmV2aW91cyByZWxlYXNlcyBmb3IgYQogIGdpdmVuIGRpY3QuICBOb3RoaW5nIGlzIGRlZmluZWQgYWJvdXQgdGhpcyBvcmRlciwgc28gbm8gcHJvZ3JhbSBzaG91bGQKICByZWx5IG9uIGl0LiAgTmV2ZXJ0aGVsZXNzLCBpdCdzIGVhc3kgdG8gd3JpdGUgdGVzdCBjYXNlcyB0aGF0IHJlbHkgb24gdGhlCiAgb3JkZXIgYnkgYWNjaWRlbnQsIHR5cGljYWxseSBiZWNhdXNlIG9mIHByaW50aW5nIHRoZSBzdHIoKSBvciByZXByKCkgb2YgYQogIGRpY3QgdG8gYW4gImV4cGVjdGVkIHJlc3VsdHMiIGZpbGUuICBTZWUgTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5J3MgbmV3CiAgc29ydGRpY3QoZGljdCkgZnVuY3Rpb24gZm9yIGEgc2ltcGxlIHdheSB0byBkaXNwbGF5IGEgZGljdCBpbiBzb3J0ZWQKICBvcmRlci4KCi0gTWFueSBvdGhlciBzbWFsbCBjaGFuZ2VzIHRvIGRpY3RzIHdlcmUgbWFkZSwgcmVzdWx0aW5nIGluIGZhc3RlcgogIG9wZXJhdGlvbiBhbG9uZyB0aGUgbW9zdCBjb21tb24gY29kZSBwYXRocy4KCi0gRGljdGlvbmFyeSBvYmplY3RzIG5vdyBzdXBwb3J0IHRoZSAiaW4iIG9wZXJhdG9yOiAieCBpbiBkaWN0IiBtZWFucwogIHRoZSBzYW1lIGFzIGRpY3QuaGFzX2tleSh4KS4KCi0gVGhlIHVwZGF0ZSgpIG1ldGhvZCBvZiBkaWN0aW9uYXJpZXMgbm93IGFjY2VwdHMgZ2VuZXJpYyBtYXBwaW5nCiAgb2JqZWN0cy4gIFNwZWNpZmljYWxseSB0aGUgYXJndW1lbnQgb2JqZWN0IG11c3Qgc3VwcG9ydCB0aGUgLmtleXMoKQogIGFuZCBfX2dldGl0ZW1fXygpIG1ldGhvZHMuICBUaGlzIGFsbG93cyB5b3UgdG8gc2F5LCBmb3IgZXhhbXBsZSwKICB7fS51cGRhdGUoVXNlckRpY3QoKSkKCi0gSXRlcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBnZW5lcmFsaXplZCB3YXkgb2YgcHJvdmlkaW5nIHZhbHVlcwogIHRvIGEgZm9yIGxvb3AuICBTZWUgUEVQIDIzNC4gIFRoZXJlJ3MgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gaXRlcigpCiAgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgdGhlIG5leHQgdmFsdWUKICBmcm9tIGFuIGl0ZXJhdG9yIHVzaW5nIHRoZSBuZXh0KCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZQogIHRwX2l0ZXJuZXh0IHNsb3QgKGluIEMpLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgaXRlcmF0b3JzCiAgdXNpbmcgdGhlIF9faXRlcl9fKCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZSB0cF9pdGVyIHNsb3QgKGluIEMpLgogIEl0ZXJhdGluZyAoaS5lLiBhIGZvciBsb29wKSBvdmVyIGEgZGljdGlvbmFyeSBnZW5lcmF0ZXMgaXRzIGtleXMuCiAgSXRlcmF0aW5nIG92ZXIgYSBmaWxlIGdlbmVyYXRlcyBpdHMgbGluZXMuCgotIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdlcmUgZ2VuZXJhbGl6ZWQgdG8gd29yayBuaWNlbHkgd2l0aCBpdGVyYXRvcgogIGFyZ3VtZW50czoKICAgIG1hcCgpLCBmaWx0ZXIoKSwgcmVkdWNlKCksIHppcCgpCiAgICBsaXN0KCksIHR1cGxlKCkgKFB5U2VxdWVuY2VfVHVwbGUoKSBhbmQgUHlTZXF1ZW5jZV9GYXN0KCkgaW4gQyBBUEkpCiAgICBtYXgoKSwgbWluKCkKICAgIGpvaW4oKSBtZXRob2Qgb2Ygc3RyaW5ncwogICAgZXh0ZW5kKCkgbWV0aG9kIG9mIGxpc3RzCiAgICAneCBpbiB5JyBhbmQgJ3ggbm90IGluIHknIChQeVNlcXVlbmNlX0NvbnRhaW5zKCkgaW4gQyBBUEkpCiAgICBvcGVyYXRvci5jb3VudE9mKCkgKFB5U2VxdWVuY2VfQ291bnQoKSBpbiBDIEFQSSkKICAgIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgd2l0aCBtdWx0aXBsZSB0YXJnZXRzLCBzdWNoIGFzCiAgICAgICAgeCwgeSwgeiA9IHNvbWVfaXRlcmFibGVfb2JqZWN0X3JldHVybmluZ19leGFjdGx5XzNfdmFsdWVzCgotIEFjY2Vzc2luZyBtb2R1bGUgYXR0cmlidXRlcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciAoZm9yIGV4YW1wbGUsCiAgcmFuZG9tLnJhbmRvbSBvciBvcy5wYXRoIG9yIHlvdXJQeXRob25Nb2R1bGUueW91ckF0dHJpYnV0ZSkuCgotIENvbXBhcmluZyBkaWN0aW9uYXJ5IG9iamVjdHMgdmlhID09IGFuZCAhPSBpcyBmYXN0ZXIsIGFuZCBub3cgd29ya3MgZXZlbgogIGlmIHRoZSBrZXlzIGFuZCB2YWx1ZXMgZG9uJ3Qgc3VwcG9ydCBjb21wYXJpc29ucyBvdGhlciB0aGFuID09LgoKLSBDb21wYXJpbmcgZGljdGlvbmFyaWVzIGluIHdheXMgb3RoZXIgdGhhbiA9PSBhbmQgIT0gaXMgc2xvd2VyOiAgdGhlcmUgd2VyZQogIGluc2VjdXJpdGllcyBpbiB0aGUgZGljdCBjb21wYXJpc29uIGltcGxlbWVudGF0aW9uIHRoYXQgY291bGQgY2F1c2UgUHl0aG9uCiAgdG8gY3Jhc2ggaWYgdGhlIGVsZW1lbnQgY29tcGFyaXNvbiByb3V0aW5lcyBmb3IgdGhlIGRpY3Qga2V5cyBhbmQvb3IKICB2YWx1ZXMgbXV0YXRlZCB0aGUgZGljdHMuICBNYWtpbmcgdGhlIGNvZGUgYnVsbGV0cHJvb2Ygc2xvd2VkIGl0IGRvd24uCgotIENvbGxpc2lvbnMgaW4gZGljdHMgYXJlIHJlc29sdmVkIHZpYSBhIG5ldyBhcHByb2FjaCwgd2hpY2ggY2FuIGhlbHAKICBkcmFtYXRpY2FsbHkgaW4gYmFkIGNhc2VzLiAgRm9yIGV4YW1wbGUsIGxvb2tpbmcgdXAgZXZlcnkga2V5IGluIGEgZGljdAogIGQgd2l0aCBkLmtleXMoKSA9PSBbaSA8PCAxNiBmb3IgaSBpbiByYW5nZSgyMDAwMCldIGlzIGFwcHJveGltYXRlbHkgNTAweAogIGZhc3RlciBub3cuICBUaGFua3MgdG8gQ2hyaXN0aWFuIFRpc21lciBmb3IgcG9pbnRpbmcgb3V0IHRoZSBjYXVzZSBhbmQKICB0aGUgbmF0dXJlIG9mIGFuIGVmZmVjdGl2ZSBjdXJlIChsYXN0IERlY2VtYmVyISBiZXR0ZXIgbGF0ZSB0aGFuIG5ldmVyKS4KCi0gcmVwcigpIGlzIG11Y2ggZmFzdGVyIGZvciBsYXJnZSBjb250YWluZXJzIChkaWN0LCBsaXN0LCB0dXBsZSkuCgoKTGlicmFyeQoKLSBUaGUgY29uc3RhbnRzIGFzY2lpX2xldHRlcnMsIGFzY2lpX2xvd2VyY2FzZS4gYW5kIGFzY2lpX3VwcGVyY2FzZQogIHdlcmUgYWRkZWQgdG8gdGhlIHN0cmluZyBtb2R1bGUuICBUaGVzZSBhIGxvY2FsZS1pbmRlbnBlbmRlbnQKICBjb25zdGFudHMsIHVubGlrZSBsZXR0ZXJzLCBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2UuICBUaGVzZSBhcmUgbm93CiAgdXNlIGluIGFwcHJvcHJpYXRlIGxvY2F0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KCi0gVGhlIGZsYWdzIHVzZWQgaW4gZGxvcGVuIGNhbGxzIGNhbiBub3cgYmUgY29uZmlndXJlZCB1c2luZwogIHN5cy5zZXRkbG9wZW5mbGFncyBhbmQgcXVlcmllZCB1c2luZyBzeXMuZ2V0ZGxvcGVuZmxhZ3MuCgotIEZyZWRyaWsgTHVuZGgncyB4bWxycGNsaWIgaXMgbm93IGEgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGUuICBUaGlzCiAgcHJvdmlkZXMgZnVsbCBjbGllbnQtc2lkZSBYTUwtUlBDIHN1cHBvcnQuICBJbiBhZGRpdGlvbiwKICBEZW1vL3htbHJwYy8gY29udGFpbnMgdHdvIHNlcnZlciBmcmFtZXdvcmtzIChvbmUgU29ja2V0U2VydmVyLWJhc2VkLAogIG9uZSBhc3luY29yZS1iYXNlZCkuICBUaGFua3MgdG8gRXJpYyBSYXltb25kIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4KCi0gVGhlIHhyYW5nZSgpIG9iamVjdCBpcyBzaW1wbGlmaWVkOiBpdCBubyBsb25nZXIgc3VwcG9ydHMgc2xpY2luZywKICByZXBldGl0aW9uLCBjb21wYXJpc29ucywgZWZmaWNpZW50ICdpbicgY2hlY2tpbmcsIHRoZSB0b2xpc3QoKQogIG1ldGhvZCwgb3IgdGhlIHN0YXJ0LCBzdG9wIGFuZCBzdGVwIGF0dHJpYnV0ZXMuICBTZWUgUEVQIDI2MC4KCi0gQSBuZXcgZnVuY3Rpb24gZm5tYXRjaC5maWx0ZXIgdG8gZmlsdGVyIGxpc3RzIG9mIGZpbGUgbmFtZXMgd2FzIGFkZGVkLgoKLSBjYWxlbmRhci5weSB1c2VzIG1vbnRoIGFuZCBkYXkgbmFtZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgoKLSBzdHJvcCBpcyBub3cgKnJlYWxseSogb2Jzb2xldGUgKHRoaXMgd2FzIGFubm91bmNlZCBiZWZvcmUgd2l0aCAxLjYpLAogIGFuZCBpc3N1ZXMgRGVwcmVjYXRpb25XYXJuaW5nIHdoZW4gdXNlZCAoZXhjZXB0IGZvciB0aGUgZm91ciBpdGVtcwogIHRoYXQgYXJlIHN0aWxsIGltcG9ydGVkIGludG8gc3RyaW5nLnB5KS4KCi0gQ29va2llLnB5IG5vdyBzb3J0cyBrZXkrdmFsdWUgcGFpcnMgYnkga2V5IGluIG91dHB1dCBzdHJpbmdzLgoKLSBwcHJpbnQuaXNyZWN1cnNpdmUob2JqZWN0KSBkaWRuJ3QgY29ycmVjdGx5IGlkZW50aWZ5IHJlY3Vyc2l2ZSBvYmplY3RzLgogIE5vdyBpdCBkb2VzLgoKLSBwcHJpbnQgZnVuY3Rpb25zIG5vdyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAodHVwbGUsIGxpc3QsIGRpY3QpLgoKLSBOZXcgJ3EnIGFuZCAnUScgZm9ybWF0IGNvZGVzIGluIHRoZSBzdHJ1Y3QgbW9kdWxlLCBjb3JyZXNwb25kaW5nIHRvIEMKICB0eXBlcyAibG9uZyBsb25nIiBhbmQgInVuc2lnbmVkIGxvbmcgbG9uZyIgKG9uIFdpbmRvd3MsIF9faW50NjQpLiAgSW4KICBuYXRpdmUgbW9kZSwgdGhlc2UgY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZSBwbGF0Zm9ybSBDIGNvbXBpbGVyIHN1cHBvcnRzCiAgdGhlc2UgdHlwZXMgKHdoZW4gSEFWRV9MT05HX0xPTkcgaXMgI2RlZmluZSdkIGJ5IHRoZSBQeXRob24gY29uZmlnCiAgcHJvY2VzcyksIGFuZCB0aGVuIHRoZXkgaW5oZXJpdCB0aGUgc2l6ZXMgYW5kIGFsaWdubWVudHMgb2YgdGhlIEMgdHlwZXMuCiAgSW4gc3RhbmRhcmQgbW9kZSwgJ3EnIGFuZCAnUScgYXJlIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgYXJlCiAgOC1ieXRlIGludGVncmFsIHR5cGVzLgoKLSBUaGUgc2l0ZSBtb2R1bGUgaW5zdGFsbHMgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gJ2hlbHAnIHRoYXQgaW52b2tlcwogIHB5ZG9jLmhlbHAuICBJdCBtdXN0IGJlIGludm9rZWQgYXMgJ2hlbHAoKSc7IHdoZW4gaW52b2tlZCBhcyAnaGVscCcsCiAgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHJlbWluZGluZyB0aGUgdXNlciB0byB1c2UgJ2hlbHAoKScgb3IKICAnaGVscChvYmplY3QpJy4KClRlc3RzCgotIE5ldyB0ZXN0X211dGFudHMucHkgcnVucyBkaWN0IGNvbXBhcmlzb25zIHdoZXJlIHRoZSBrZXkgYW5kIHZhbHVlCiAgY29tcGFyaXNvbiBvcGVyYXRvcnMgbXV0dXRlIHRoZSBkaWN0cyByYW5kb21seSBkdXJpbmcgY29tcGFyaXNvbi4gIFRoaXMKICByYXBpZGx5IGNhdXNlcyBQeXRob24gdG8gY3Jhc2ggdW5kZXIgZWFybGllciByZWxlYXNlcyAobm90IGZvciB0aGUgZmFpbnQKICBvZiBoZWFydDogIGl0IGNhbiBhbHNvIGNhdXNlIFdpbjl4IHRvIGZyZWV6ZSBvciByZWJvb3QhKS4KCi0gTmV3IHRlc3RfcHByaW50LnB5IHZlcmZpZXMgdGhhdCBwcHJpbnQuaXNyZWN1cnNpdmUoKSBhbmQKICBwcHJpbnQuaXNyZWFkYWJsZSgpIHJldHVybiBzZW5zaWJsZSByZXN1bHRzLiAgQWxzbyB2ZXJpZmllcyB0aGF0IHNpbXBsZQogIGNhc2VzIHByb2R1Y2UgY29ycmVjdCBvdXRwdXQuCgpDIEFQSQoKLSBSZW1vdmVkIHRoZSB1bnVzZWQgbGFzdF9pc19zdGlja3kgYXJndW1lbnQgZnJvbSB0aGUgaW50ZXJuYWwKICBfUHlUdXBsZV9SZXNpemUoKS4gIElmIHRoaXMgYWZmZWN0cyB5b3UsIHlvdSB3ZXJlIGNoZWF0aW5nLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgKGZpbmFsKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXZSBvbmx5IGNoYW5nZWQgYSBmZXcgdGhpbmdzIHNpbmNlIHRoZSBsYXN0IHJlbGVhc2UgY2FuZGlkYXRlLCBhbGwgaW4KUHl0aG9uIGxpYnJhcnkgY29kZToKCi0gQSBidWcgaW4gdGhlIGxvY2FsZSBtb2R1bGUgd2FzIGZpeGVkIHRoYXQgYWZmZWN0ZWQgbG9jYWxlcyB3aGljaAogIGRlZmluZSBubyBncm91cGluZyBmb3IgbnVtZXJpYyBmb3JtYXR0aW5nLgoKLSBBIGZldyBidWdzIGluIHRoZSB3ZWFrcmVmIG1vZHVsZSdzIGltcGxlbWVudGF0aW9ucyBvZiB3ZWFrCiAgZGljdGlvbmFyaWVzIChXZWFrVmFsdWVEaWN0aW9uYXJ5IGFuZCBXZWFrS2V5RGljdGlvbmFyeSkgd2VyZSBmaXhlZCwKICBhbmQgdGhlIHRlc3Qgc3VpdGUgd2FzIHVwZGF0ZWQgdG8gY2hlY2sgZm9yIHRoZXNlIGJ1Z3MuCgotIEFuIG9sZCBidWcgaW4gdGhlIG9zLnBhdGgud2FsaygpIGZ1bmN0aW9uIChpbnRyb2R1Y2VkIGluIFB5dGhvbgogIDIuMCEpIHdhcyBmaXhlZDogYSBub24tZXhpc3RlbnQgZmlsZSB3b3VsZCBjYXVzZSBhbiBleGNlcHRpb24KICBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuCgotIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlIG5ldyBzeW10YWJsZSBtb2R1bGUgZm91bmQgYnkgTmVpbCBOb3J3aXR6J3MKICBQeUNoZWNrZXIuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xYzI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQSBmbHVycnkgb2Ygc21hbGwgY2hhbmdlcywgYW5kIG9uZSBzaG93c3RvcHBlciBmaXhlZCBpbiB0aGUgbmljayBvZgp0aW1lIG1hZGUgaXQgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgYW5vdGhlciByZWxlYXNlIGNhbmRpZGF0ZS4gIFRoZSBsaXN0CmhlcmUgaXMgdGhlICpjb21wbGV0ZSogbGlzdCBvZiBwYXRjaGVzIChleGNlcHQgdmVyc2lvbiB1cGRhdGVzKToKCkNvcmUKCi0gVGltIGRpc2NvdmVyZWQgYSBuYXN0eSBidWcgaW4gdGhlIGRpY3Rpb25hcnkgY29kZSwgY2F1c2VkIGJ5CiAgUHlEaWN0X05leHQoKSBjYWxsaW5nIGRpY3RfcmVzaXplKCksIGFuZCB0aGUgR0MgY29kZSdzIHVzZSBvZgogIFB5RGljdF9OZXh0KCkgdmlvbGF0aW5nIGFuIGFzc3VtcHRpb24gaW4gZGljdF9pdGVtcygpLiAgVGhpcyB3YXMKICBmaXhlZCB3aXRoIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIGJhbmQtYWlkLCBidXQgdGhlIG5ldCBlZmZlY3QgaXMgYQogIHNhbmVyIGFuZCBtb3JlIHJvYnVzdCBpbXBsZW1lbnRhdGlvbi4KCi0gTWFkZSBhIGJ1bmNoIG9mIHN5bWJvbHMgc3RhdGljIHRoYXQgd2VyZSBhY2NpZGVudGFsbHkgZ2xvYmFsLgoKQnVpbGQgYW5kIFBvcnRzCgotIFRoZSBzZXR1cC5weSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhIG5ldyBlbm91Z2ggdmVyc2lvbiBvZiB6bGliCiAgKDEuMS4zIGlzIG5lZWRlZCkuICBOb3cgaXQgZG9lcy4KCi0gQ2hhbmdlZCAibWFrZSBjbGVhbiIgdGFyZ2V0IHRvIGFsc28gcmVtb3ZlIHNoYXJlZCBsaWJyYXJpZXMuCgotIEFkZGVkIGEgbW9yZSBnZW5lcmFsIHdhcm5pbmcgYWJvdXQgdGhlIFNHSSBJcml4IG9wdGltaXplciB0byBSRUFETUUuCgpMaWJyYXJ5CgotIEZpeCBhIGJ1ZyBpbiB1cmxsaWIuYmFzZWpvaW4oImh0dHA6Ly9ob3N0IiwgIi4uL2ZpbGUuaHRtbCIpIHdoaWNoCiAgb21pdHRlZCB0aGUgc2xhc2ggYmV0d2VlbiBob3N0IGFuZCBmaWxlLmh0bWwuCgotIFRoZSBtYWlsYm94IG1vZHVsZSdzIF9NYWlsYm94IGNsYXNzIGNvbnRhaW5lZCBhIGNvbXBsZXRlbHkgYnJva2VuCiAgYW5kIHVuZG9jdW1lbnRlZCBzZWVrKCkgbWV0aG9kLiAgUmlwcGVkIGl0IG91dC4KCi0gRml4ZWQgYSBidW5jaCBvZiB0eXBvcyBpbiB2YXJpb3VzIGxpYnJhcnkgbW9kdWxlcyAodXJsbGliMiwgc210cGQsCiAgc2dtbGxpYiwgbmV0cmMsIGNodW5rKSBmb3VuZCBieSBOZWlsIE5vcndpdHoncyBQeUNoZWNrZXIuCgotIEZpeGVkIGEgZmV3IGxhc3QtbWludXRlIGJ1Z3MgaW4gdW5pdHRlc3QuCgpFeHRlbnNpb25zCgotIFJldmVydGVkIHRoZSBwYXRjaCB0byB0aGUgT3BlblNTTCBjb2RlIGluIHNvY2tldG1vZHVsZS5jIHRvIHN1cHBvcnQKICBSQU5EX3N0YXR1cygpIGFuZCB0aGUgRUdELCBhbmQgdGhlIHN1YnNlcXVlbnQgcGF0Y2ggdGhhdCB0cmllZCB0bwogIGZpeCBpdCBmb3IgcHJlLTAuOS41IHZlcnNpb25zOyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBwYXRjaCBpcyB0aGF0IG9uCiAgc29tZSBzeXN0ZW1zIGl0IGlzc3VlcyBhIHdhcm5pbmcgd2hlbmV2ZXIgc29ja2V0IGlzIGltcG9ydGVkLCBhbmQKICB0aGF0J3MgdW5hY2NlcHRhYmxlLgoKVGVzdHMKCi0gRml4ZWQgdGhlIHBpY2tsZSB0ZXN0cyB0byB3b3JrIHdpdGggImltcG9ydCB0ZXN0LnRlc3RfcGlja2xlIi4KCi0gVHdlYWtlZCB0ZXN0X2xvY2FsZS5weSB0byBhY3R1YWxseSBydW4gdGhlIHRlc3QgV2luZG93cy4KCi0gSW4gZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weSwgY2FsbCB6aXBmaWxlLlppcEZpbGUoKSB3aXRoIG1vZGUgInciLAogIG5vdCAid2IiICh3aGljaCBpcyBub3QgYSB2YWxpZCBtb2RlIGF0IGFsbCkuCgotIEZpeCBwc3RhdHMgYnJvd3NlciBjcmFzaGVzLiAgSW1wb3J0IHJlYWRsaW5lIGlmIGl0IGV4aXN0cyB0byBtYWtlCiAgdGhlIHVzZXIgaW50ZXJmYWNlIG5pY2VyLgoKLSBBZGQgImltcG9ydCB0aHJlYWQiIHRvIHRoZSB0b3Agb2YgdGVzdCBtb2R1bGVzIHRoYXQgaW1wb3J0IHRoZQogIHRocmVhZGluZyBtb2R1bGUgKHRlc3RfYXN5bmNoYXQgYW5kIHRlc3RfdGhyZWFkZWR0ZW1wZmlsZSkuICBUaGlzCiAgcHJldmVudHMgdGVzdCBmYWlsdXJlcyBjYXVzZWQgYnkgYSBicm9rZW4gdGhyZWFkaW5nIG1vZHVsZSByZXN1bHRpbmcKICBmcm9tIGEgcHJldmlvdXNseSBjYXVnaHQgZmFpbGVkIGltcG9ydC4KCi0gQ2hhbmdlZCB0ZXN0X2FzeW5jaGF0LnB5IHRvIHNldCB0aGUgU09fUkVVU0VBRERSIG9wdGlvbjsgdGhpcyB3YXMKICBuZWVkZWQgb24gc29tZSBwbGF0Zm9ybXMgKGUuZy4gU29sYXJpcyA4KSB3aGVuIHRoZSB0ZXN0cyBhcmUgcnVuCiAgdHdpY2UgaW4gc3VjY2Vzc2lvbi4KCi0gU2tpcCByYXRoZXIgdGhhbiBmYWlsIHRlc3Rfc3VuYXVkaW9kZXYgaWYgbm8gYXVkaW8gZGV2aWNlIGlzIGZvdW5kLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMWMxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgbGlzdCB3YXMgc2lnbmlmaWNhbnRseSB1cGRhdGVkIHdoZW4gMi4xYzIgd2FzIHJlbGVhc2VkOyB0aGUgMi4xYzEKcmVsZWFzZSBkaWRuJ3QgbWVudGlvbiBtb3N0IGNoYW5nZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHBhcnQgb2YgMi4xYzE6CgpMZWdhbAoKLSBDb3B5cmlnaHQgd2FzIGFzc2lnbmVkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiAoUFNGKSBhbmQgYQogIFBTRiBsaWNlbnNlICh2ZXJ5IHNpbWlsYXIgdG8gdGhlIENOUkkgbGljZW5zZSkgd2FzIGFkZGVkLgoKLSBUaGUgQ05SSSBjb3B5cmlnaHQgbm90aWNlIHdhcyB1cGRhdGVkIHRvIGluY2x1ZGUgMjAwMS4KCkNvcmUKCi0gQWZ0ZXIgYSBwdWJsaWMgb3V0Y3J5LCBhc3NpZ25tZW50IHRvIF9fZGVidWdfXyBpcyBubyBsb25nZXIgaWxsZWdhbDsKICBpbnN0ZWFkLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgSXQgd2lsbCBiZWNvbWUgaWxsZWdhbCBpbiAyLjIuCgotIEZpeGVkIGEgY29yZSBkdW1wIHdpdGggIiUjeCIgJSAwLCBhbmQgY2hhbmdlZCB0aGUgc2VtYW50aWNzIHNvIHRoYXQKICAiJSN4IiBub3cgYWx3YXlzIHByZXBlbmRzICIweCIsIGV2ZW4gaWYgdGhlIHZhbHVlIGlzIHplcm8uCgotIEZpeGVkIHNvbWUgbml0cyBpbiB0aGUgYnl0ZWNvZGUgY29tcGlsZXIuCgotIEZpeGVkIGNvcmUgZHVtcHMgd2hlbiBjYWxsaW5nIGNlcnRhaW4ga2luZHMgb2Ygbm9uLWZ1bmN0aW9ucy4KCi0gRml4ZWQgdmFyaW91cyBjb3JlIGR1bXBzIGNhdXNlZCBieSByZWZlcmVuY2UgY291bnQgYnVncy4KCkJ1aWxkIGFuZCBQb3J0cwoKLSBVc2UgSU5TVEFMTF9TQ1JJUFQgdG8gaW5zdGFsbCBzY3JpcHQgZmlsZXMuCgotIE5ldyBwb3J0OiBTQ08gVW5peHdhcmUgNywgYnkgQmlsbHkgRy4gQWxsaWUuCgotIFVwZGF0ZWQgUklTQ09TIHBvcnQuCgotIFVwZGF0ZWQgQmVPUyBwb3J0IGFuZCBub3Rlcy4KCi0gVmFyaW91cyBvdGhlciBwb3J0aW5nIHByb2JsZW1zIHJlc29sdmVkLgoKTGlicmFyeQoKLSBUaGUgVEVSTUlPUyBhbmQgU09DS0VUIG1vZHVsZXMgYXJlIG5vdyB0cnVseSBvYnNvbGV0ZSBhbmQKICB1bm5lY2Vzc2FyeS4gIFRoZWlyIHN5bWJvbHMgYXJlIGluY29ycG9yYXRlZCBpbiB0aGUgdGVybWlvcyBhbmQKICBzb2NrZXQgbW9kdWxlcy4KCi0gRml4ZWQgc29tZSA2NC1iaXQgYnVncyBpbiBwaWNrbGUsIGNQaWNrbGUsIGFuZCBzdHJ1Y3QsIGFuZCBhZGRlZAogIGJldHRlciB0ZXN0cyBmb3IgcGlja2xpbmcuCgotIHRocmVhZGluZzogbWFrZSBDb25kaXRpb24ud2FpdCgpIHJvYnVzdCBhZ2FpbnN0IEtleWJvYXJkSW50ZXJydXB0LgoKLSB6aXBmaWxlOiBhZGQgc3VwcG9ydCB0byB6aXBmaWxlIHRvIHN1cHBvcnQgb3BlbmluZyBhbiBhcmNoaXZlCiAgcmVwcmVzZW50ZWQgYnkgYW4gb3BlbiBmaWxlIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLiAgRml4IGJ1ZyB3aGVyZQogIHRoZSBhcmNoaXZlIHdhcyBub3QgcHJvcGVybHkgY2xvc2VkLiAgRml4ZWQgYSBidWcgaW4gdGhpcyBidWdmaXgKICB3aGVyZSBmbHVzaCgpIHdhcyBjYWxsZWQgZm9yIGEgcmVhZC1vbmx5IGZpbGUuCgotIGltcHV0aWw6IGFkZGVkIGFuIHVuaW5zdGFsbCgpIG1ldGhvZCB0byB0aGUgSW1wb3J0TWFuYWdlci4KCi0gQ2FudmFzOiBmaXhlZCBidWdzIGluIGxvd2VyKCkgYW5kIHRrcmFpc2UoKSBtZXRob2RzLgoKLSBTb2NrZXRTZXJ2ZXI6IEFQSSBjaGFuZ2UgKGFkZGVkIG92ZXJyaWRhYmxlIGNsb3NlX3JlcXVlc3QoKSBtZXRob2QpCiAgc28gdGhhdCB0aGUgVENQIHNlcnZlciBjYW4gZXhwbGljaXRseSBjbG9zZSB0aGUgcmVxdWVzdC4KCi0gcHN0YXRzOiBFcmljIFJheW1vbmQgYWRkZWQgYSBzaW1wbGUgaW50ZXJhY3RpdmUgc3RhdGlzdGljcyBicm93c2VyLAogIGludm9rZWQgd2hlbiB0aGUgbW9kdWxlIGlzIHJ1biBhcyBhIHNjcmlwdC4KCi0gbG9jYWxlOiBmaXhlZCBhIHByb2JsZW0gaW4gZm9ybWF0KCkuCgotIHdlYmJyb3dzZXI6IG1hZGUgaXQgd29yayB3aGVuIHRoZSBCUk9XU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBhCiAgdmFsdWUgbGlrZSAiL3Vzci9iaW4vbmV0c2NhcGUiLiAgTWFkZSBpdCBhdXRvLWRldGVjdCBLb25xdWVyb3IgZm9yCiAgS0RFIDIuICBGaXhlZCBzb21lIG90aGVyIG5pdHMuCgotIHVuaXR0ZXN0OiBjaGFuZ2VzIHRvIGFsbG93IHVzaW5nIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0aGFuCiAgQXNzZXJ0aW9uRXJyb3IsIGFuZCBhZGRlZCBhIGZldyBtb3JlIGZ1bmN0aW9uIGFsaWFzZXMuICBTb21lIG90aGVyCiAgc21hbGwgY2hhbmdlcy4KCi0gdXJsbGliLCB1cmxsaWIyOiBmaXhlZCByZWRpcmVjdCBwcm9ibGVtcyBhbmQgYSBjb3VwbGVvZiBvdGhlciBuaXRzLgoKLSBhc3luY2hhdDogZml4ZWQgYSBjcml0aWNhbCBidWcgaW4gYXN5bmNoYXQgdGhhdCBzbGlwcGVkIHRocm91Z2ggdGhlCiAgMi4xYjIgcmVsZWFzZS4gIEZpeGVkIGFub3RoZXIgcmFyZSBidWcuCgotIEZpeCBzb21lIHVucXVhbGlmaWVkIGV4Y2VwdDogY2xhdXNlcyAoYWx3YXlzIGEgYmFkIGNvZGUgZXhhbXBsZSkuCgpYTUwKCi0gcHlleHBhdDogbmV3IEFQSSBnZXRfdmVyc2lvbl9zdHJpbmcoKS4KCi0gRml4ZWQgc29tZSBtaW5pZG9tIGJ1Z3MuCgpFeHRlbnNpb25zCgotIEZpeGVkIGEgY29yZSBkdW1wIGluIF93ZWFrcmVmLiAgUmVtb3ZlZCB0aGUgd2Vha3JlZi5tYXBwaW5nKCkKICBmdW5jdGlvbiAoaXQgYWRkcyBub3RoaW5nIHRvIHRoZSBBUEkpLgoKLSBSYXRpb25hbGl6ZWQgdGhlIHVzZSBvZiBoZWFkZXIgZmlsZXMgaW4gdGhlIHJlYWRsaW5lIG1vZHVsZSwgdG8gbWFrZQogIGl0IGNvbXBpbGUgKGFsYmVpdCB3aXRoIHNvbWUgd2FybmluZ3MpIHdpdGggdGhlIHZlcnkgcmVjZW50IHJlYWRsaW5lCiAgNC4yLCB3aXRob3V0IGJyZWFraW5nIGZvciBlYXJsaWVyIHZlcnNpb25zLgoKLSBIb3BlZnVsbHkgZml4ZWQgYSBidWZmZXJpbmcgcHJvYmxlbSBpbiBsaW51eGF1ZGlvZGV2LgoKLSBBdHRlbXB0ZWQgYSBmaXggdG8gbWFrZSB0aGUgT3BlblNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQgbW9kdWxlCiAgd29yayBhZ2FpbiB3aXRoIHByZS0wLjkuNSB2ZXJzaW9ucyBvZiBPcGVuU1NMLgoKVGVzdHMKCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGFzeW5jaGF0IGFuZCBhc3luY29yZS4KCi0gUmVtb3ZlZCBjb3VwbGluZyBiZXR3ZWVuIHRlc3RzIHdoZXJlIG9uZSB0ZXN0IGZhaWxpbmcgY291bGQgYnJlYWsKICBhbm90aGVyLgoKVG9vbHMKCi0gUGluZyBhZGRlZCBhbiBpbnRlcmFjdGl2ZSBoZWxwIGJyb3dzZXIgdG8gcHlkb2MsIGZpeGVkIHNvbWUgbml0cwogIGluIHRoZSByZXN0IG9mIHRoZSBweWRvYyBjb2RlLCBhbmQgYWRkZWQgc29tZSBmZWF0dXJlcyB0byBoaXMKICBpbnNwZWN0IG1vZHVsZS4KCi0gQW4gdXBkYXRlZCBweXRob24tbW9kZS5lbCB2ZXJzaW9uIDQuMSB3aGljaCBpbnRlZ3JhdGVzIEtlbgogIE1hbmhlaW1lcidzIHBkYnRyYWNrLmVsLiAgVGhpcyBtYWtlcyBkZWJ1Z2dpbmcgUHl0aG9uIGNvZGUgdmlhIHBkYgogIG11Y2ggbmljZXIgaW4gWEVtYWNzIGFuZCBFbWFjcy4gIFdoZW4gc3RlcHBpbmcgdGhyb3VnaCB5b3VyIHByb2dyYW0KICB3aXRoIHBkYiwgaW4gZWl0aGVyIHRoZSBzaGVsbCB3aW5kb3cgb3IgdGhlICpQeXRob24qIHdpbmRvdywgdGhlCiAgc291cmNlIGZpbGUgYW5kIGxpbmUgd2lsbCBiZSB0cmFja2VkIGJ5IGFuIGFycm93LiAgVmVyeSBjb29sIQoKLSBJRExFOiBzeW50YXggd2FybmluZ3MgaW4gaW50ZXJhY3RpdmUgbW9kZSBhcmUgY2hhbmdlZCBpbnRvIGVycm9ycy4KCi0gU29tZSBpbXByb3ZlbWVudHMgdG8gVG9vbHMvd2ViY2hlY2tlciAoaWdub3JlIHNvbWUgbW9yZSBVUkwgdHlwZXMsCiAgZm9sbG93IHNvbWUgbW9yZSBsaW5rcykuCgotIEJyb3VnaHQgdGhlIFRvb2xzL2NvbXBpbGVyIHBhY2thZ2UgdXAgdG8gZGF0ZS4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYmV0YSAyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKFVubGlzdGVkIGFyZSBtYW55IGZpeGVkIGJ1Z3MsIG1vcmUgZG9jdW1lbnRhdGlvbiwgZXRjLikKCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gVGhlIG5lc3RlZCBzY29wZXMgd29yayAoZW5hYmxlZCBieSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydAogIG5lc3RlZF9zY29wZXMiKSBpcyBjb21wbGV0ZWQ7IGluIHBhcnRpY3VsYXIsIHRoZSBmdXR1cmUgbm93IGV4dGVuZHMKICBpbnRvIGNvZGUgZXhlY3V0ZWQgdGhyb3VnaCBleGVjLCBldmFsKCkgYW5kIGV4ZWNmaWxlKCksIGFuZCBpbnRvIHRoZQogIGludGVyYWN0aXZlIGludGVycHJldGVyLgoKLSBXaGVuIGNhbGxpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCAoZS5nLiBCYXNlQ2xhc3MuX19pbml0X18oc2VsZikpLAogIHRoaXMgaXMgbm93IGFsbG93ZWQgZXZlbiBpZiBzZWxmIGlzIG5vdCBzdHJpY3RseSBzcG9rZW4gYSBjbGFzcwogIGluc3RhbmNlIChlLmcuIHdoZW4gdXNpbmcgbWV0YWNsYXNzZXMgb3IgdGhlIERvbiBCZWF1ZHJ5IGhvb2spLgoKLSBTbGljZSBvYmplY3RzIGFyZSBub3cgY29tcGFyYWJsZSBidXQgbm90IGhhc2hhYmxlOyB0aGlzIHByZXZlbnRzCiAgZGljdFs6XSBmcm9tIGJlaW5nIGFjY2VwdGVkIGJ1dCBtZWFuaW5nbGVzcy4KCi0gQ29tcGxleCBkaXZpc2lvbiBpcyBub3cgY2FsY3VsYXRlZCB1c2luZyBsZXNzIGJyYWluZGVhZCBhbGdvcml0aG1zLgogIFRoaXMgZG9lc24ndCBjaGFuZ2Ugc2VtYW50aWNzIGV4Y2VwdCBpdCdzIG1vcmUgbGlrZWx5IHRvIGdpdmUgdXNlZnVsCiAgcmVzdWx0cyBpbiBleHRyZW1lIGNhc2VzLiAgQ29tcGxleCByZXByKCkgbm93IHVzZXMgZnVsbCBwcmVjaXNpb24KICBsaWtlIGZsb2F0IHJlcHIoKS4KCi0gc2dtbGxpYi5weSBub3cgY2FsbHMgaGFuZGxlX2RlY2woKSBmb3Igc2ltcGxlIDwhLi4uPiBkZWNsYXJhdGlvbnMuCgotIEl0IGlzIGlsbGVnYWwgdG8gYXNzaWduIHRvIHRoZSBuYW1lIF9fZGVidWdfXywgd2hpY2ggaXMgc2V0IHdoZW4gdGhlCiAgaW50ZXJwcmV0ZXIgc3RhcnRzLiAgSXQgaXMgZWZmZWN0aXZlbHkgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCgotIEEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCBpZiBhIGdsb2JhbCBzdGF0ZW1lbnQgZm9yIGEgdmFyaWFibGUKICBmb2xsb3dzIGEgdXNlIG9yIGFzc2lnbm1lbnQgb2YgdGhhdCB2YXJpYWJsZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gdW5pdHRlc3QucHksIGEgdW5pdCB0ZXN0aW5nIGZyYW1ld29yayBieSBTdGV2ZSBQdXJjZWxsIChQeVVOSVQsCiAgaW5zcGlyZWQgYnkgSlVuaXQpLCBpcyBub3cgcGFydCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFlvdSBub3cKICBoYXZlIGEgY2hvaWNlIG9mIHR3byB0ZXN0aW5nIGZyYW1ld29ya3M6IHVuaXR0ZXN0IHJlcXVpcmVzIHlvdSB0bwogIHdyaXRlIHRlc3RjYXNlcyBhcyBzZXBhcmF0ZSBjb2RlLCBkb2N0ZXN0IGdhdGhlcnMgdGhlbSBmcm9tCiAgZG9jc3RyaW5ncy4gIEJvdGggYXBwcm9hY2hlcyBoYXZlIHRoZWlyIGFkdmFudGFnZXMgYW5kCiAgZGlzYWR2YW50YWdlcy4KCi0gQSBuZXcgbW9kdWxlIFRpeCB3YXMgYWRkZWQsIHdoaWNoIHdyYXBzIHRoZSBUaXggZXh0ZW5zaW9uIGxpYnJhcnkKICBmb3IgVGsuICBXaXRoIHRoYXQgbW9kdWxlLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHN0YXRpY2FsbHkgbGluawogIFRpeCB3aXRoIF90a2ludGVyLCBzaW5jZSBUaXggd2lsbCBiZSBsb2FkZWQgd2l0aCBUY2wncyAicGFja2FnZQogIHJlcXVpcmUiIGNvbW1hbmQuICBTZWUgRGVtby90aXgvLgoKLSB0enBhcnNlLnB5IGlzIG5vdyBvYnNvbGV0ZS4KCi0gSW4gZ3ppcC5weSwgdGhlIHNlZWsoKSBhbmQgdGVsbCgpIG1ldGhvZHMgYXJlIHJlbW92ZWQgLS0gdGhleSB3ZXJlCiAgbm9uLWZ1bmN0aW9uYWwgYW55d2F5LCBhbmQgaXQncyBiZXR0ZXIgaWYgY2FsbGVycyBjYW4gdGVzdCBmb3IgdGhlaXIKICBleGlzdGVuY2Ugd2l0aCBoYXNhdHRyKCkuCgpQeXRob24vQyBBUEkKCi0gUHlEaWN0X05leHQoKTogaXQgaXMgbm93IHNhZmUgdG8gY2FsbCBQeURpY3RfU2V0SXRlbSgpIHdpdGggYSBrZXkKICB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgZGljdGlvbmFyeSBkdXJpbmcgYSBQeURpY3RfTmV4dCgpIGl0ZXJhdGlvbi4KICBUaGlzIHVzZWQgdG8gZmFpbCBvY2Nhc2lvbmFsbHkgd2hlbiBhIGRpY3Rpb25hcnkgcmVzaXplIG9wZXJhdGlvbgogIGNvdWxkIGJlIHRyaWdnZXJlZCB0aGF0IHdvdWxkIHJlaGFzaCBhbGwgdGhlIGtleXMuICBBbGwgb3RoZXIKICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5IGFyZSBzdGlsbCBvZmYtbGltaXRzIGR1cmluZyBhCiAgUHlEaWN0X05leHQoKSBpdGVyYXRpb24hCgotIE5ldyBleHRlbmRlZCBBUElzIHJlbGF0ZWQgdG8gcGFzc2luZyBjb21waWxlciB2YXJpYWJsZXMgYXJvdW5kLgoKLSBOZXcgYWJzdHJhY3QgQVBJcyBQeU9iamVjdF9Jc0luc3RhbmNlKCksIFB5T2JqZWN0X0lzU3ViY2xhc3MoKQogIGltcGxlbWVudCBpc2luc3RhbmNlKCkgYW5kIGlzc3ViY2xhc3MoKS4KCi0gUHlfQnVpbGRWYWx1ZSgpIG5vdyBoYXMgYSAiRCIgY29udmVyc2lvbiB0byBjcmVhdGUgYSBQeXRob24gY29tcGxleAogIG51bWJlciBmcm9tIGEgUHlfY29tcGxleCBDIHZhbHVlLgoKLSBFeHRlbnNpb25zIHR5cGVzIHdoaWNoIHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIG11c3Qgbm93IHNldCB0aGUKICBmaWVsZCBhbGxvY2F0ZWQgZm9yIHRoZSB3ZWFrIHJlZmVyZW5jZSBtYWNoaW5lcnkgdG8gTlVMTCB0aGVtc2VsdmVzOwogIHRoaXMgaXMgZG9uZSB0byBhdm9pZCB0aGUgY29zdCBvZiBjaGVja2luZyBlYWNoIG9iamVjdCBmb3IgaGF2aW5nIGEKICB3ZWFrbHkgcmVmZXJlbmNhYmxlIHR5cGUgaW4gUHlPYmplY3RfSU5JVCgpLCBzaW5jZSBtb3N0IHR5cGVzIGFyZQogIG5vdCB3ZWFrbHkgcmVmZXJlbmNhYmxlLgoKLSBQeUZyYW1lX0Zhc3RUb0xvY2FscygpIGFuZCBQeUZyYW1lX0xvY2Fsc1RvRmFzdCgpIGNvcHkgYmluZGluZ3MgZm9yCiAgZnJlZSB2YXJpYWJsZXMgYW5kIGNlbGwgdmFyaWFibGVzIHRvIGFuZCBmcm9tIHRoZSBmcmFtZSdzIGZfbG9jYWxzLgoKLSBWYXJpYW50cyBvZiBzZXZlcmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHB5dGhvbnJ1bi5oIGhhdmUgYmVlbiBhZGRlZAogIHRvIHN1cHBvcnQgdGhlIG5lc3RlZF9zY29wZXMgZnV0dXJlIHN0YXRlbWVudC4gIFRoZSB2YXJpYW50cyBhbGwgZW5kCiAgaW4gRmxhZ3MgYW5kIHRha2UgYW4gZXh0cmEgYXJndW1lbnQsIGEgUHlDb21waWxlckZsYWdzICo7IGV4YW1wbGVzOgogIFB5UnVuX0FueUZpbGVFeEZsYWdzKCksIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKCkuICBUaGVzZQogIHZhcmlhbnRzIG1heSBiZSByZW1vdmVkIGluIFB5dGhvbiAyLjIsIHdoZW4gbmVzdGVkIHNjb3BlcyBhcmUKICBtYW5kYXRvcnkuCgpEaXN0dXRpbHMKCi0gdGhlIHNkaXN0IGNvbW1hbmQgbm93IHdyaXRlcyBhIFBLRy1JTkZPIGZpbGUsIGFzIGRlc2NyaWJlZCBpbiBQRVAgMjQxLAogIGludG8gdGhlIHJlbGVhc2UgdHJlZS4KCi0gc2V2ZXJhbCBlbmhhbmNlbWVudHMgdG8gdGhlIGJkaXN0X3dpbmluc3QgY29tbWFuZCBmcm9tIFRob21hcyBIZWxsZXIKICAoYW4gdW5pbnN0YWxsZXIsIG1vcmUgY3VzdG9taXphdGlvbiBvZiB0aGUgaW5zdGFsbGVyJ3MgZGlzcGxheSkKCi0gZnJvbSBKYWNrIEphbnNlbjogYWRkZWQgTWFjLXNwZWNpZmljIGNvZGUgdG8gZ2VuZXJhdGUgYSBkaWFsb2cgZm9yCiAgdXNlcnMgdG8gc3BlY2lmeSB0aGUgY29tbWFuZC1saW5lIChiZWNhdXNlIHByb3ZpZGluZyBhIGNvbW1hbmQtbGluZSB3aXRoCiAgTWFjUHl0aG9uIGlzIGF3a3dhcmQpLiAgSmFjayBhbHNvIG1hZGUgdmFyaW91cyBmaXhlcyBmb3IgdGhlIE1hYwogIGFuZCB0aGUgTWV0cm93ZXJrcyBjb21waWxlci4KCi0gYWRkZWQgJ3BsYXRmb3JtcycgYW5kICdrZXl3b3JkcycgdG8gdGhlIHNldCBvZiBtZXRhZGF0YSB0aGF0IGNhbiBiZQogIHNwZWNpZmllZCBmb3IgYSBkaXN0cmlidXRpb24uCgotIGFwcGxpZWQgcGF0Y2hlcyBmcm9tIEphc29uIFRpc2hsZXIgdG8gbWFrZSB0aGUgY29tcGlsZXIgY2xhc3Mgd29yayB3aXRoCiAgQ3lnd2luLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBiZXRhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIEZvbGxvd2luZyBhbiBvdXRjcnkgZnJvbSB0aGUgY29tbXVuaXR5IGFib3V0IHRoZSBhbW91bnQgb2YgY29kZQogIGJyb2tlbiBieSB0aGUgbmVzdGVkIHNjb3BlcyBmZWF0dXJlIGludHJvZHVjZWQgaW4gMi4xYTIsIHdlIGRlY2lkZWQKICB0byBtYWtlIHRoaXMgZmVhdHVyZSBvcHRpb25hbCwgYW5kIHRvIHdhaXQgdW50aWwgUHl0aG9uIDIuMiAob3IgYXQKICBsZWFzdCA2IG1vbnRocykgdG8gbWFrZSBpdCBzdGFuZGFyZC4gIFRoZSBvcHRpb24gY2FuIGJlIGVuYWJsZWQgb24gYQogIHBlci1tb2R1bGUgYmFzaXMgYnkgYWRkaW5nICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMiIGF0CiAgdGhlIGJlZ2lubmluZyBvZiBhIG1vZHVsZSAoYmVmb3JlIGFueSBvdGhlciBzdGF0ZW1lbnRzLCBidXQgYWZ0ZXIKICBjb21tZW50cyBhbmQgYW4gb3B0aW9uYWwgZG9jc3RyaW5nKS4gIFNlZSBQRVAgMjM2IChCYWNrIHRvIHRoZQogIF9fZnV0dXJlX18pIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBfX2Z1dHVyZV9fIHN0YXRlbWVudC4gIFBFUCAyMjcKICAoU3RhdGljYWxseSBOZXN0ZWQgU2NvcGVzKSBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UsCiAgYW5kIHRvIGNsYXJpZnkgdGhlIHNlbWFudGljcyBpbiBhIG51bWJlciBvZiBlbmRjYXNlcy4KCi0gVGhlIG5lc3RlZCBzY29wZXMgY29kZSwgd2hlbiBlbmFibGVkLCBoYXMgYmVlbiBoYXJkZW5lZCwgYW5kIG1vc3QKICBidWdzIGFuZCBtZW1vcnkgbGVha3MgaW4gaXQgaGF2ZSBiZWVuIGZpeGVkLgoKLSBDb21waWxlLXRpbWUgd2FybmluZ3MgYXJlIG5vdyBnZW5lcmF0ZWQgZm9yIGEgbnVtYmVyIG9mIGNvbmRpdGlvbnMKICB0aGF0IHdpbGwgYnJlYWsgb3IgY2hhbmdlIGluIG1lYW5pbmcgd2hlbiBuZXN0ZWQgc2NvcGVzIGFyZSBlbmFibGVkOgoKICAtIFVzaW5nICJmcm9tLi4uaW1wb3J0ICoiIG9yICJleGVjIiB3aXRob3V0IGluLWNsYXVzZSBpbiBhIGZ1bmN0aW9uCiAgICBzY29wZSB0aGF0IGFsc28gZGVmaW5lcyBhIGxhbWJkYSBvciBuZXN0ZWQgZnVuY3Rpb24gd2l0aCBvbmUgb3IKICAgIG1vcmUgZnJlZSAobm9uLWxvY2FsKSB2YXJpYWJsZXMuICBUaGUgcHJlc2VuY2Ugb2YgdGhlIGltcG9ydCogb3IKICAgIGJhcmUgZXhlYyBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciB0aGUgY29tcGlsZXIgdG8gZGV0ZXJtaW5lIHRoZQogICAgZXhhY3Qgc2V0IG9mIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIG1ha2VzIGl0CiAgICBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgYmluZGluZ3MgZm9yIGZyZWUgdmFyaWFibGVzIGluIHRoZQogICAgaW5uZXIgc2NvcGUuICBUbyBhdm9pZCB0aGUgd2FybmluZyBhYm91dCBpbXBvcnQgKiwgY2hhbmdlIGl0IGludG8KICAgIGFuIGltcG9ydCBvZiBleHBsaWNpdGx5IG5hbWUgb2JqZWN0LCBvciBtb3ZlIHRoZSBpbXBvcnQqIHN0YXRlbWVudAogICAgdG8gdGhlIGdsb2JhbCBzY29wZTsgdG8gYXZvaWQgdGhlIHdhcm5pbmcgYWJvdXQgYmFyZSBleGVjLCB1c2UKICAgIGV4ZWMuLi5pbi4uLiAoYSBnb29kIGlkZWEgYW55d2F5IC0tIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB0aGF0CiAgICBiYXJlIGV4ZWMgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUpLgoKICAtIFVzZSBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiBhIG5lc3RlZCBzY29wZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYQogICAgbG9jYWwgdmFyaWFibGUgaW4gYSBzdXJyb3VuZGluZyBzY29wZS4gIFRoaXMgd2lsbCBjaGFuZ2UgaW4KICAgIG1lYW5pbmcgd2l0aCBuZXN0ZWQgc2NvcGVzOiB0aGUgbmFtZSBpbiB0aGUgaW5uZXIgc2NvcGUgd2lsbAogICAgcmVmZXJlbmNlIHRoZSB2YXJpYWJsZSBpbiB0aGUgb3V0ZXIgc2NvcGUgcmF0aGVyIHRoYW4gdGhlIGdsb2JhbAogICAgb2YgdGhlIHNhbWUgbmFtZS4gIFRvIGF2b2lkIHRoZSB3YXJuaW5nLCBlaXRoZXIgcmVuYW1lIHRoZSBvdXRlcgogICAgdmFyaWFibGUsIG9yIHVzZSBhIGdsb2JhbCBzdGF0ZW1lbnQgaW4gdGhlIGlubmVyIGZ1bmN0aW9uLgoKLSBBbiBvcHRpb25hbCBvYmplY3QgYWxsb2NhdG9yIGhhcyBiZWVuIGluY2x1ZGVkLiAgVGhpcyBhbGxvY2F0b3IgaXMKICBvcHRpbWl6ZWQgZm9yIFB5dGhvbiBvYmplY3RzIGFuZCBzaG91bGQgYmUgZmFzdGVyIGFuZCB1c2UgbGVzcyBtZW1vcnkKICB0aGFuIHRoZSBzdGFuZGFyZCBzeXN0ZW0gYWxsb2NhdG9yLiAgSXQgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdAogIGJlY2F1c2Ugb2YgcG9zc2libGUgdGhyZWFkIHNhZmV0eSBwcm9ibGVtcy4gIFRoZSBhbGxvY2F0b3IgaXMgb25seQogIHByb3RlY3RlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyIGxvY2sgYW5kIGl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZQogIGV4dGVuc2lvbiBtb2R1bGVzIHJlcXVpcmUgYSB0aHJlYWQgc2FmZSBhbGxvY2F0b3IuICBUaGUgb2JqZWN0CiAgYWxsb2NhdG9yIGNhbiBiZSBlbmFibGVkIGJ5IHByb3ZpZGluZyB0aGUgIi0td2l0aC1weW1hbGxvYyIgb3B0aW9uIHRvCiAgY29uZmlndXJlLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBweWV4cGF0IG5vdyBkZXRlY3RzIHRoZSBleHBhdCB2ZXJzaW9uIGlmIGV4cGF0LmggZGVmaW5lcyBpdC4gQQogIG51bWJlciBvZiBhZGRpdGlvbmFsIGhhbmRsZXJzIGFyZSBwcm92aWRlZCwgd2hpY2ggYXJlIG9ubHkgYXZhaWxhYmxlCiAgc2luY2UgZXhwYXQgMS45NS4gSW4gYWRkaXRpb24sIHRoZSBtZXRob2RzIFNldFBhcmFtRW50aXR5UGFyc2luZyBhbmQKICBHZXRJbnB1dENvbnRleHQgb2YgUGFyc2VyIG9iamVjdHMgYXJlIGF2YWlsYWJsZSB3aXRoIDEuOTUueAogIG9ubHkuIFBhcnNlciBvYmplY3RzIG5vdyBwcm92aWRlIHRoZSBvcmRlcmVkX2F0dHJpYnV0ZXMgYW5kCiAgc3BlY2lmaWVkX2F0dHJpYnV0ZXMgYXR0cmlidXRlcy4gQSBuZXcgbW9kdWxlIGV4cGF0Lm1vZGVsIHdhcyBhZGRlZCwKICB3aGljaCBvZmZlcnMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBjb25zdGFudHMgaWYgMS45NS54IGlzIHVzZWQuCgotIHhtbC5kb20gb2ZmZXJzIHRoZSBuZXcgZnVuY3Rpb25zIHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24gYW5kCiAgZ2V0RE9NSW1wbGVtZW50YXRpb24uCgotIHhtbC5kb20ubWluaWRvbSBvZmZlcnMgYSB0b3ByZXR0eXhtbCBtZXRob2QuIEEgbnVtYmVyIG9mIERPTQogIGNvbmZvcm1hbmNlIGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQuIEluIHBhcnRpY3VsYXIsIEVsZW1lbnQgbm93CiAgaGFzIGFuIGhhc0F0dHJpYnV0ZXMgbWV0aG9kLCBhbmQgdGhlIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgd2FzCiAgaW1wcm92ZWQuCgotIEthLVBpbmcgWWVlIGNvbnRyaWJ1dGVkIHR3byBuZXcgbW9kdWxlczogaW5zcGVjdC5weSwgYSBtb2R1bGUgZm9yCiAgZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCBsaXZlIFB5dGhvbiBjb2RlLCBhbmQgcHlkb2MucHksIGEgbW9kdWxlCiAgZm9yIGludGVyYWN0aXZlbHkgY29udmVydGluZyBkb2NzdHJpbmdzIHRvIEhUTUwgb3IgdGV4dC4KICBUb29scy9zY3JpcHRzL3B5ZG9jLCB3aGljaCBpcyBub3cgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgaW50bwogIDxwcmVmaXg+L2JpbiwgdXNlcyBweWRvYy5weSB0byBkaXNwbGF5IGRvY3VtZW50YXRpb247IHRyeSBydW5uaW5nCiAgInB5ZG9jIC1oIiBmb3IgaW5zdHJ1Y3Rpb25zLiAgInB5ZG9jIC1nIiBwb3BzIHVwIGEgc21hbGwgR1VJIHRoYXQKICBsZXRzIHlvdSBicm93c2UgdGhlIG1vZHVsZSBkb2NzdHJpbmdzIHVzaW5nIGEgd2ViIGJyb3dzZXIuCgotIE5ldyBsaWJyYXJ5IG1vZHVsZSBkaWZmbGliLnB5LCBwcmltYXJpbHkgcGFja2FnaW5nIHRoZSBTZXF1ZW5jZU1hdGNoZXIKICBjbGFzcyBhdCB0aGUgaGVhcnQgb2YgdGhlIHBvcHVsYXIgbmRpZmYucHkgZmlsZS1jb21wYXJpc29uIHRvb2wuCgotIGRvY3Rlc3QucHkgKGEgZnJhbWV3b3JrIGZvciB2ZXJpZnlpbmcgUHl0aG9uIGNvZGUgZXhhbXBsZXMgaW4gZG9jc3RyaW5ncykKICBpcyBub3cgcGFydCBvZiB0aGUgc3RkIGxpYnJhcnkuCgpXaW5kb3dzIGNoYW5nZXMKCi0gQSBuZXcgZW50cnkgaW4gdGhlIFN0YXJ0IG1lbnUsICJNb2R1bGUgRG9jcyIsIHJ1bnMgInB5ZG9jIC1nIiAtLSBhCiAgc21hbGwgR1VJIHRoYXQgbGV0cyB5b3UgYnJvd3NlIHRoZSBtb2R1bGUgZG9jc3RyaW5ncyB1c2luZyB5b3VyCiAgZGVmYXVsdCB3ZWIgYnJvd3Nlci4KCi0gSW1wb3J0IGlzIG5vdyBjYXNlLXNlbnNpdGl2ZS4gIFBFUCAyMzUgKEltcG9ydCBvbiBDYXNlLUluc2Vuc2l0aXZlCiAgUGxhdGZvcm1zKSBpcyBpbXBsZW1lbnRlZC4gIFNlZQoKICAgICAgaHR0cDovL3B5dGhvbi5zb3VyY2Vmb3JnZS5uZXQvcGVwcy9wZXAtMDIzNS5odG1sCgogIGZvciBmdWxsIGRldGFpbHMsIGVzcGVjaWFsbHkgdGhlICJDdXJyZW50IExvd2VyLUxlZnQgU2VtYW50aWNzIiBzZWN0aW9uLgogIFRoZSBuZXcgV2luZG93cyBpbXBvcnQgcnVsZXMgYXJlIHNpbXBsZXIgdGhhbiBiZWZvcmU6CgogIEEuIElmIHRoZSBQWVRIT05DQVNFT0sgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzLCBzYW1lIGFzCiAgICAgYmVmb3JlOiAgc2lsZW50bHkgYWNjZXB0IHRoZSBmaXJzdCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIG9mIGFueQogICAgIGtpbmQ7IHJhaXNlIEltcG9ydEVycm9yIGlmIG5vbmUgZm91bmQuCgogIEIuIEVsc2Ugc2VhcmNoIHN5cy5wYXRoIGZvciB0aGUgZmlyc3QgY2FzZS1zZW5zaXRpdmUgbWF0Y2g7IHJhaXNlCiAgICAgSW1wb3J0RXJyb3IgaWYgbm9uZSBmb3VuZC4KCiAgVGhlIHNhbWUgcnVsZXMgaGF2ZSBiZWVuIGltcGxlbnRlZCBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjYXNlLQogIGluc2Vuc2l0aXZlIGJ1dCBjYXNlLXByZXNlcnZpbmcgZmlsZXN5c3RlbXMgdG9vIChpbmNsdWRpbmcgQ3lnd2luLCBhbmQKICBzZXZlcmFsIGZsYXZvcnMgb2YgTWFjaW50b3NoIG9wZXJhdGluZyBzeXN0ZW1zKS4KCi0gd2luc291bmQgbW9kdWxlOiAgVW5kZXIgV2luOXgsIHdpbnNvdW5kLkJlZXAoKSBub3cgYXR0ZW1wdHMgdG8gc2ltdWxhdGUKICB3aGF0IGl0J3Mgc3VwcG9zZWQgdG8gZG8gKGFuZCBkb2VzIGRvIHVuZGVyIE5UIGFuZCAyMDAwKSB2aWEgZGlyZWN0CiAgcG9ydCBtYW5pcHVsYXRpb24uICBJdCdzIHVua25vd24gd2hldGhlciB0aGlzIHdpbGwgd29yayBvbiBhbGwgc3lzdGVtcywKICBidXQgaXQgZG9lcyB3b3JrIG9uIG15IFdpbjk4U0Ugc3lzdGVtcyBub3cgYW5kIHdhcyBrbm93biB0byBiZSB1c2VsZXNzIG9uCiAgYWxsIFdpbjl4IHN5c3RlbXMgYmVmb3JlLgoKLSBCdWlsZDogIFN1YnByb2plY3QgX3Rlc3QgKGVmZmVjdGl2ZWx5KSByZW5hbWVkIHRvIF90ZXN0Y2FwaS4KCk5ldyBwbGF0Zm9ybXMKCi0gMi4xIHNob3VsZCBjb21waWxlIGFuZCBydW4gb3V0IG9mIHRoZSBib3ggdW5kZXIgTWFjT1MgWCwgZXZlbiB1c2luZyBIRlMrLgogIFRoYW5rcyB0byBTdGV2ZW4gTWFqZXdza2khCgotIDIuMSBzaG91bGQgY29tcGlsZSBhbmQgcnVuIG91dCBvZiB0aGUgYm94IG9uIEN5Z3dpbi4gIFRoYW5rcyB0byBKYXNvbgogIFRpc2hsZXIhCgotIDIuMSBjb250YWlucyBuZXcgZmlsZXMgYW5kIHBhdGNoZXMgZm9yIFJJU0NPUywgdGhhbmtzIHRvIERpZXRtYXIKICBTY2h3ZXJ0YmVyZ2VyISAgU2VlIFJJU0NPUy9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24gLS0gaXQgc2VlbXMKICB0aGF0IGJlY2F1c2Ugb2YgdGhlIGJpemFycmUgZmlsZW5hbWUgY29udmVudGlvbnMgb24gUklTQ09TLCBubyBwb3J0CiAgdG8gdGhhdCBwbGF0Zm9ybSBpcyBlYXN5LgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBhbHBoYSAyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gU2NvcGVzIG5lc3QuICBJZiBhIG5hbWUgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzLCBidXQgaXMgbm90CiAgbG9jYWwsIHRoZSBkZWZpbml0aW9uIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZSB3aWxsCiAgYmUgdXNlZC4gIE9uZSBjb25zZXF1ZW5jZSBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IGxhbWJkYSBzdGF0ZW1lbnRzCiAgY291bGQgcmVmZXJlbmNlIHZhcmlhYmxlcyBpbiB0aGUgbmFtZXNwYWNlcyB3aGVyZSB0aGUgbGFtYmRhIGlzCiAgZGVmaW5lZC4gIEluIHNvbWUgdW51c3VhbCBjYXNlcywgdGhpcyBjaGFuZ2Ugd2lsbCBicmVhayBjb2RlLgoKICBJbiBhbGwgcHJldmlvdXMgdmVyc2lvbiBvZiBQeXRob24sIG5hbWVzIHdlcmUgcmVzb2x2ZWQgaW4gZXhhY3RseQogIHRocmVlIG5hbWVzcGFjZXMgLS0gdGhlIGxvY2FsIG5hbWVzcGFjZSwgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGFuZAogIHRoZSBidWlsdGluIG5hbWVzcGFjZS4gIEFjY29yZGluZyB0byB0aGlzIG9sZCBkZWZpbml0aW9uLCBpZiBhCiAgZnVuY3Rpb24gQSBpcyBkZWZpbmVkIHdpdGhpbiBhIGZ1bmN0aW9uIEIsIHRoZSBuYW1lcyBib3VuZCBpbiBCIGFyZQogIG5vdCB2aXNpYmxlIGluIEEuICBUaGUgbmV3IHJ1bGVzIG1ha2UgbmFtZXMgYm91bmQgaW4gQiB2aXNpYmxlIGluIEEsCiAgdW5sZXNzIEEgY29udGFpbnMgYSBuYW1lIGJpbmRpbmcgdGhhdCBoaWRlcyB0aGUgYmluZGluZyBpbiBCLgoKICBTZWN0aW9uIDQuMSBvZiB0aGUgcmVmZXJlbmNlIG1hbnVhbCBkZXNjcmliZXMgdGhlIG5ldyBzY29waW5nIHJ1bGVzCiAgaW4gZGV0YWlsLiAgVGhlIHRlc3Qgc2NyaXB0IGluIExpYi90ZXN0L3Rlc3Rfc2NvcGUucHkgZGVtb25zdHJhdGVzCiAgc29tZSBvZiB0aGUgZWZmZWN0cyBvZiB0aGUgY2hhbmdlLgoKICBUaGUgbmV3IHJ1bGVzIHdpbGwgY2F1c2UgZXhpc3RpbmcgY29kZSB0byBicmVhayBpZiBpdCBkZWZpbmVzIG5lc3RlZAogIGZ1bmN0aW9ucyB3aGVyZSBhbiBvdXRlciBmdW5jdGlvbiBoYXMgbG9jYWwgdmFyaWFibGVzIHdpdGggdGhlIHNhbWUKICBuYW1lIGFzIGdsb2JhbHMgb3IgYnVpbHRpbnMgdXNlZCBieSB0aGUgaW5uZXIgZnVuY3Rpb24uICBFeGFtcGxlOgoKICAgIGRlZiBtdW5nZShzdHIpOgogICAgICAgIGRlZiBoZWxwZXIoeCk6CiAgICAgICAgICAgIHJldHVybiBzdHIoeCkKICAgICAgICBpZiB0eXBlKHN0cikgIT0gdHlwZSgnJyk6CiAgICAgICAgICAgIHN0ciA9IGhlbHBlcihzdHIpCiAgICAgICAgcmV0dXJuIHN0ci5zdHJpcCgpCgogIFVuZGVyIHRoZSBvbGQgcnVsZXMsIHRoZSBuYW1lIHN0ciBpbiBoZWxwZXIoKSBpcyBib3VuZCB0byB0aGUKICBidWlsdGluIGZ1bmN0aW9uIHN0cigpLiAgVW5kZXIgdGhlIG5ldyBydWxlcywgaXQgd2lsbCBiZSBib3VuZCB0bwogIHRoZSBhcmd1bWVudCBuYW1lZCBzdHIgYW5kIGFuIGVycm9yIHdpbGwgb2NjdXIgd2hlbiBoZWxwZXIoKSBpcwogIGNhbGxlZC4KCi0gVGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgU3ludGF4RXJyb3IgaWYgImZyb20gLi4uIGltcG9ydCAqIiBvY2N1cnMKICBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIHNjb3BlLiAgVGhlIGxhbmd1YWdlIHJlZmVyZW5jZSBoYXMgZG9jdW1lbnRlZAogIHRoYXQgdGhpcyBjYXNlIGlzIGlsbGVnYWwsIGJ1dCB0aGUgY29tcGlsZXIgbmV2ZXIgY2hlY2tlZCBmb3IgaXQuCiAgVGhlIHJlY2VudCBpbnRyb2R1Y3Rpb24gb2YgbmVzdGVkIHNjb3BlIG1ha2VzIHRoZSBtZWFuaW5nIG9mIHRoaXMKICBmb3JtIG9mIG5hbWUgYmluZGluZyBhbWJpZ3VvdXMuICBJbiBhIGZ1dHVyZSByZWxlYXNlLCB0aGUgY29tcGlsZXIKICBtYXkgYWxsb3cgdGhpcyBmb3JtIHdoZW4gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YgYW1iaWd1aXR5LgoKLSByZXByKHN0cmluZykgaXMgZWFzaWVyIHRvIHJlYWQsIG5vdyB1c2luZyBoZXggZXNjYXBlcyBpbnN0ZWFkIG9mIG9jdGFsLAogIGFuZCB1c2luZyBcdCwgXG4gYW5kIFxyIGluc3RlYWQgb2YgXDAxMSwgXDAxMiBhbmQgXDAxNSAocmVzcGVjdGl2ZWx5KToKCiAgPj4+ICJcdGV4YW1wbGUgXHJcbiIgKyBjaHIoMCkgKyBjaHIoMjU1KQogICdcdGV4YW1wbGUgXHJcblx4MDBceGZmJyAgICAgICAgICMgaW4gMi4xCiAgJ1wwMTFleGFtcGxlIFwwMTVcMDEyXDAwMFwzNzcnICAgIyBpbiAyLjAKCi0gRnVuY3Rpb25zIGFyZSBub3cgY29tcGFyZWQgYW5kIGhhc2hlZCBieSBpZGVudGl0eSwgbm90IGJ5IHZhbHVlLCBzaW5jZQogIHRoZSBmdW5jX2NvZGUgYXR0cmlidXRlIGlzIHdyaXRhYmxlLgoKLSBXZWFrIHJlZmVyZW5jZXMgKFBFUCAyMDUpIGhhdmUgYmVlbiBhZGRlZC4gIFRoaXMgaW52b2x2ZXMgYSBmZXcKICBjaGFuZ2VzIGluIHRoZSBjb3JlLCBhbiBleHRlbnNpb24gbW9kdWxlIChfd2Vha3JlZiksIGFuZCBhIFB5dGhvbgogIG1vZHVsZSAod2Vha3JlZikuICBUaGUgd2Vha3JlZiBtb2R1bGUgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuICBJdAogIGluY2x1ZGVzIHN1cHBvcnQgZm9yICJleHBsaWNpdCIgd2VhayByZWZlcmVuY2VzLCBwcm94eSBvYmplY3RzLCBhbmQKICBtYXBwaW5ncyB3aXRoIHdlYWtseSBoZWxkIHZhbHVlcy4KCi0gQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gbm93IGFwcGVhciBpbiBhIHRyeSBibG9jayB3aXRoaW4gdGhlIGJvZHkKICBvZiBhIGxvb3AuICBJdCBpcyBzdGlsbCBub3QgcG9zc2libGUgdG8gdXNlIGNvbnRpbnVlIGluIGEgZmluYWxseQogIGNsYXVzZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gbWFpbGJveC5weSBub3cgaGFzIGEgbmV3IGNsYXNzLCBQb3J0YWJsZVVuaXhNYWlsYm94IHdoaWNoIGlzCiAgaWRlbnRpY2FsIHRvIFVuaXhNYWlsYm94IGJ1dCB1c2VzIGEgbW9yZSBwb3J0YWJsZSBzY2hlbWUgZm9yCiAgZGV0ZXJtaW5pbmcgRnJvbV8gc2VwYXJhdG9ycy4gIEFsc28sIHRoZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCB0aGUKICBjbGFzc2VzIGluIHRoaXMgbW9kdWxlIGhhdmUgYSBuZXcgb3B0aW9uYWwgYGZhY3RvcnknIGFyZ3VtZW50LCB3aGljaAogIGlzIGEgY2FsbGFibGUgdXNlZCB3aGVuIG5ldyBtZXNzYWdlIGNsYXNzZXMgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkKICB0aGUgbmV4dCgpIG1ldGhvZC4KCi0gcmFuZG9tLnB5IGlzIG5vdyBzZWxmLWNvbnRhaW5lZCwgYW5kIG9mZmVycyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YKICB0aGUgbm93LWRlcHJlY2F0ZWQgd2hyYW5kb20ucHkuICBTZWUgdGhlIGRvY3MgZm9yIGRldGFpbHMuICByYW5kb20ucHkKICBhbHNvIHN1cHBvcnRzIG5ldyBmdW5jdGlvbnMgZ2V0c3RhdGUoKSBhbmQgc2V0c3RhdGUoKSwgZm9yIHNhdmluZwogIGFuZCByZXN0b3JpbmcgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3I7IGFuZCBqdW1wYWhlYWQobiksCiAgZm9yIHF1aWNrbHkgZm9yY2luZyB0aGUgaW50ZXJuYWwgc3RhdGUgdG8gYmUgdGhlIHNhbWUgYXMgaWYgbiBjYWxscyB0bwogIHJhbmRvbSgpIGhhZCBiZWVuIG1hZGUuICBUaGUgbGF0dGVyIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIG11bHRpLQogIHRocmVhZGVkIHByb2dyYW1zLCBjcmVhdGluZyBvbmUgaW5zdGFuY2Ugb2YgdGhlIHJhbmRvbS5SYW5kb20oKSBjbGFzcyBmb3IKICBlYWNoIHRocmVhZCwgdGhlbiB1c2luZyAuanVtcGFoZWFkKCkgdG8gZm9yY2UgZWFjaCBpbnN0YW5jZSB0byB1c2UgYQogIG5vbi1vdmVybGFwcGluZyBzZWdtZW50IG9mIHRoZSBmdWxsIHBlcmlvZC4KCi0gcmFuZG9tLnB5J3Mgc2VlZCgpIGZ1bmN0aW9uIGlzIG5ldy4gIEZvciBiaXQtZm9yLWJpdCBjb21wYXRpYmlsaXR5IHdpdGgKICBwcmlvciByZWxlYXNlcywgdXNlIHRoZSB3aHNlZWQgZnVuY3Rpb24gaW5zdGVhZC4gIFRoZSBuZXcgc2VlZCBmdW5jdGlvbgogIGFkZHJlc3NlcyB0d28gcHJvYmxlbXM6ICAoMSkgVGhlIG9sZCBmdW5jdGlvbiBjb3VsZG4ndCBwcm9kdWNlIG1vcmUgdGhhbgogIGFib3V0IDIqKjI0IGRpc3RpbmN0IGludGVybmFsIHN0YXRlczsgdGhlIG5ldyBvbmUgYWJvdXQgMioqNDUgKHRoZSBiZXN0CiAgdGhhdCBjYW4gYmUgZG9uZSBpbiB0aGUgV2ljaG1hbm4tSGlsbCBnZW5lcmF0b3IpLiAgKDIpIFRoZSBvbGQgZnVuY3Rpb24KICBzb21ldGltZXMgcHJvZHVjZWQgaWRlbnRpY2FsIGludGVybmFsIHN0YXRlcyB3aGVuIHBhc3NlZCBkaXN0aW5jdAogIGludGVnZXJzLCBhbmQgdGhlcmUgd2FzIG5vIHNpbXBsZSB3YXkgdG8gcHJlZGljdCB3aGVuIHRoYXQgd291bGQgaGFwcGVuOwogIHRoZSBuZXcgb25lIGd1YXJhbnRlZXMgdG8gcHJvZHVjZSBkaXN0aW5jdCBpbnRlcm5hbCBzdGF0ZXMgZm9yIGFsbAogIGFyZ3VtZW50cyBpbiBbMCwgMjc4MTQ0MzE0ODY1NzZMKS4KCi0gVGhlIHNvY2tldCBtb2R1bGUgbm93IHN1cHBvcnRzIHJhdyBwYWNrZXRzIG9uIExpbnV4LiAgVGhlIHNvY2tldAogIGZhbWlseSBpcyBBRl9QQUNLRVQuCgotIHRlc3RfY2FwaS5weSBpcyBhIHN0YXJ0IGF0IHJ1bm5pbmcgdGVzdHMgb2YgdGhlIFB5dGhvbiBDIEFQSS4gIFRoZSB0ZXN0cwogIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgbmV3IE1vZHVsZXMvX3Rlc3Rtb2R1bGUuYy4KCi0gQSBuZXcgZXh0ZW5zaW9uIG1vZHVsZSwgX3N5bXRhYmxlLCBwcm92aWRlcyBwcm92aXNpb25hbCBhY2Nlc3MgdG8gdGhlCiAgaW50ZXJuYWwgc3ltYm9sIHRhYmxlIHVzZWQgYnkgdGhlIFB5dGhvbiBjb21waWxlci4gIEEgaGlnaGVyLWxldmVsCiAgaW50ZXJmYWNlIHdpbGwgYmUgYWRkZWQgb24gdG9wIG9mIF9zeW10YWJsZSBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKLSBSZW1vdmVkIHRoZSBvYnNvbGV0ZSBzb3VuZGV4IG1vZHVsZS4KCi0geG1sLmRvbS5taW5pZG9tIG5vdyB1c2VzIHRoZSBzdGFuZGFyZCBET00gZXhjZXB0aW9ucy4gTm9kZSBzdXBwb3J0cwogIHRoZSBpc1NhbWVOb2RlIG1ldGhvZDsgTmFtZWROb2RlTWFwIHRoZSBnZXQgbWV0aG9kLgoKLSB4bWwuc2F4LmV4cGF0cmVhZGVyIHN1cHBvcnRzIHRoZSBsZXhpY2FsIGhhbmRsZXIgcHJvcGVydHk7IGl0CiAgZ2VuZXJhdGVzIGNvbW1lbnQsIHN0YXJ0Q0RBVEEsIGFuZCBlbmRDREFUQSBldmVudHMuCgpXaW5kb3dzIGNoYW5nZXMKCi0gQnVpbGQgcHJvY2VkdXJlOiAgdGhlIHpsaWIgcHJvamVjdCBpcyBidWlsdCBpbiBhIGRpZmZlcmVudCB3YXkgdGhhdAogIGVuc3VyZXMgdGhlIHpsaWIgaGVhZGVyIGZpbGVzIHVzZWQgY2FuIG5vIGxvbmdlciBnZXQgb3V0IG9mIHN5bmNoIHdpdGgKICB0aGUgemxpYiBiaW5hcnkgdXNlZC4gIFNlZSBQQ2J1aWxkXHJlYWRtZS50eHQgZm9yIGRldGFpbHMuICBZb3VyIG9sZAogIHpsaWItcmVsYXRlZCBkaXJlY3RvcmllcyBjYW4gYmUgZGVsZXRlZDsgeW91J2xsIG5lZWQgdG8gZG93bmxvYWQgZnJlc2gKICBzb3VyY2UgZm9yIHpsaWIgYW5kIHVucGFjayBpdCBpbnRvIGEgbmV3IGRpcmVjdG9yeS4KCi0gQnVpbGQ6ICBOZXcgc3VicHJvamVjdCBfdGVzdCBmb3IgdGhlIGJlbmVmaXQgb2YgdGVzdF9jYXBpLnB5IChzZWUgYWJvdmUpLgoKLSBCdWlsZDogIE5ldyBzdWJwcm9qZWN0IF9zeW10YWJsZSwgZm9yIG5ldyBETEwgX3N5bXRhYmxlLnB5ZCAoYSBuYXNjZW50CiAgaW50ZXJmYWNlIHRvIHNvbWUgUHl0aG9uIGNvbXBpbGVyIGludGVybmFscykuCgotIEJ1aWxkOiAgU3VicHJvamVjdCB1Y25oYXNoIGlzIGdvbmUsIHNpbmNlIHRoZSBjb2RlIHdhcyBmb2xkZWQgaW50byB0aGUKICB1bmljb2RlZGF0YSBzdWJwcm9qZWN0LgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xIGFscGhhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBUaGVyZSBpcyBhIG5ldyBVbmljb2RlIGNvbXBhbmlvbiB0byB0aGUgUHlPYmplY3RfU3RyKCkgQVBJCiAgY2FsbGVkIFB5T2JqZWN0X1VuaWNvZGUoKS4gSXQgYmVoYXZlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlCiAgZm9ybWVyLCBidXQgYXNzdXJlcyB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbiBVbmljb2RlIG9iamVjdAogIChhcHBseWluZyB0aGUgdXN1YWwgY29lcmNpb24gaWYgbmVjZXNzYXJ5KS4KCi0gVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIHN1cHBvcnQgInJpY2ggY29tcGFyaXNvbiBvdmVybG9hZGluZyIgKFBFUAogIDIwNykuICBDIGV4dGVuc2lvbiB0eXBlcyBjYW4gcHJvdmlkZSBhIHJpY2ggY29tcGFyaXNvbiBmdW5jdGlvbiBpbgogIHRoZSBuZXcgdHBfcmljaGNvbXBhcmUgc2xvdCBpbiB0aGUgdHlwZSBvYmplY3QuICBUaGUgY21wKCkgZnVuY3Rpb24KICBhbmQgdGhlIEMgZnVuY3Rpb24gUHlPYmplY3RfQ29tcGFyZSgpIGZpcnN0IHRyeSB0aGUgbmV3IHJpY2gKICBjb21wYXJpc29uIG9wZXJhdG9ycyBiZWZvcmUgdHJ5aW5nIHRoZSBvbGQgMy13YXkgY29tcGFyaXNvbi4gIFRoZXJlCiAgaXMgYWxzbyBhIG5ldyBDIEFQSSBQeU9iamVjdF9SaWNoQ29tcGFyZSgpICh3aGljaCBhbHNvIGZhbGxzIGJhY2sgb24KICB0aGUgb2xkIDMtd2F5IGNvbXBhcmlzb24sIGJ1dCBkb2VzIG5vdCBjb25zdHJhaW4gdGhlIG91dGNvbWUgb2YgdGhlCiAgcmljaCBjb21wYXJpc29uIHRvIGEgQm9vbGVhbiByZXN1bHQpLgoKICBUaGUgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uIHRha2VzIHR3byBvYmplY3RzIChhdCBsZWFzdCBvbmUgb2YKICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHR5cGUgdGhhdCBwcm92aWRlZCB0aGUgZnVuY3Rpb24pIGFuZAogIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3Bjb2RlLCB3aGljaCBjYW4gYmUgUHlfTFQsIFB5X0xFLCBQeV9FUSwKICBQeV9ORSwgUHlfR1QsIFB5X0dFIChmb3IgPCwgPD0sID09LCAhPSwgPiwgPj0pLCBhbmQgcmV0dXJucyBhIFB5dGhvbgogIG9iamVjdCwgd2hpY2ggbWF5IGJlIE5vdEltcGxlbWVudGVkIChpbiB3aGljaCBjYXNlIHRoZSB0cF9jb21wYXJlCiAgc2xvdCBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgZmFsbGJhY2ssIGlmIGRlZmluZWQpLgoKICBDbGFzc2VzIGNhbiBvdmVybG9hZCBpbmRpdmlkdWFsIGNvbXBhcmlzb24gb3BlcmF0b3JzIGJ5IGRlZmluaW5nIG9uZQogIG9yIG1vcmUgb2YgdGhlIG1ldGhvZHNfX2x0X18sIF9fbGVfXywgX19lcV9fLCBfX25lX18sIF9fZ3RfXywKICBfX2dlX18uICBUaGVyZSBhcmUgbm8gZXhwbGljaXQgInJlZmxlY3RlZCBhcmd1bWVudCIgdmVyc2lvbnMgb2YKICB0aGVzZTsgaW5zdGVhZCwgX19sdF9fIGFuZCBfX2d0X18gYXJlIGVhY2ggb3RoZXIncyByZWZsZWN0aW9uLAogIGxpa2V3aXNlIGZvcl9fbGVfXyBhbmQgX19nZV9fOyBfX2VxX18gYW5kIF9fbmVfXyBhcmUgdGhlaXIgb3duCiAgcmVmbGVjdGlvbiAoc2ltaWxhciBhdCB0aGUgQyBsZXZlbCkuICBObyBvdGhlciBpbXBsaWNhdGlvbnMgYXJlCiAgbWFkZTsgaW4gcGFydGljdWxhciwgUHl0aG9uIGRvZXMgbm90IGFzc3VtZSB0aGF0ID09IGlzIHRoZSBCb29sZWFuCiAgaW52ZXJzZSBvZiAhPSwgb3IgdGhhdCA8IGlzIHRoZSBCb29sZWFuIGludmVyc2Ugb2YgPj0uICBUaGlzIG1ha2VzCiAgaXQgcG9zc2libGUgdG8gZGVmaW5lIHR5cGVzIHdpdGggcGFydGlhbCBvcmRlcmluZ3MuCgogIENsYXNzZXMgb3IgdHlwZXMgdGhhdCB3YW50IHRvIGltcGxlbWVudCAoaW4pZXF1YWxpdHkgdGVzdHMgYnV0IG5vdAogIHRoZSBvcmRlcmluZyBvcGVyYXRvcnMgKGkuZS4gdW5vcmRlcmVkIHR5cGVzKSBzaG91bGQgaW1wbGVtZW50ID09CiAgYW5kICE9LCBhbmQgcmFpc2UgYW4gZXJyb3IgZm9yIHRoZSBvcmRlcmluZyBvcGVyYXRvcnMuCgogIEl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSB0eXBlcyB3aG9zZSByaWNoIGNvbXBhcmlzb24gcmVzdWx0cyBhcmUgbm90CiAgQm9vbGVhbjsgZS5nLiBhIG1hdHJpeCB0eXBlIG1pZ2h0IHdhbnQgdG8gcmV0dXJuIGEgbWF0cml4IG9mIGJpdHMKICBmb3IgQSA8IEIsIGdpdmluZyBlbGVtZW50d2lzZSBjb21wYXJpc29ucy4gIFN1Y2ggdHlwZXMgc2hvdWxkIGVuc3VyZQogIHRoYXQgYW55IGludGVycHJldGF0aW9uIG9mIHRoZWlyIHZhbHVlIGluIGEgQm9vbGVhbiBjb250ZXh0IHJhaXNlcwogIGFuIGV4Y2VwdGlvbiwgZS5nLiBieSBkZWZpbmluZyBfX25vbnplcm9fXyAob3IgdGhlIHRwX25vbnplcm8gc2xvdAogIGF0IHRoZSBDIGxldmVsKSB0byBhbHdheXMgcmFpc2UgYW4gZXhjZXB0aW9uLgoKLSBDb21wbGV4IG51bWJlcnMgdXNlIHJpY2ggY29tcGFyaXNvbnMgdG8gZGVmaW5lID09IGFuZCAhPSBidXQgcmFpc2UKICBhbiBleGNlcHRpb24gZm9yIDwsIDw9LCA+IGFuZCA+PS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBtZWFucwogIHRoYXQgY21wKCkgb2YgdHdvIGNvbXBsZXggbnVtYmVycyByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIHR3bwogIG51bWJlcnMgZGlmZmVyLiAgU2luY2UgaXQgaXMgbm90IG1hdGhlbWF0aWNhbGx5IG1lYW5pbmdmdWwgdG8gY29tcGFyZQogIGNvbXBsZXggbnVtYmVycyBleGNlcHQgZm9yIGVxdWFsaXR5LCBJIGhvcGUgdGhhdCB0aGlzIGRvZXNuJ3QgYnJlYWsKICB0b28gbXVjaCBjb2RlLgoKLSBUaGUgb3V0Y29tZSBvZiBjb21wYXJpbmcgbm9uLW51bWVyaWMgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgaXMKICBub3QgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UsIG90aGVyIHRoYW4gdGhhdCBpdCdzIGFyYml0cmFyeSBidXQKICBjb25zaXN0ZW50IChzZWUgdGhlIFJlZmVyZW5jZSBNYW51YWwpLiAgQW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGNoYW5nZWQKICBpbiAyLjFhMSBzdWNoIHRoYXQgTm9uZSBub3cgY29tcGFyZXMgbGVzcyB0aGFuIGFueSBvdGhlciBvYmplY3QuICBDb2RlCiAgcmVseWluZyBvbiB0aGlzIG5ldyBiZWhhdmlvciAobGlrZSBjb2RlIHRoYXQgcmVsaWVkIG9uIHRoZSBwcmV2aW91cwogIGJlaGF2aW9yKSBkb2VzIHNvIGF0IGl0cyBvd24gcmlzay4KCi0gRnVuY3Rpb25zIGFuZCBtZXRob2RzIG5vdyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJpbHkKICBuYW1lZCBhdHRyaWJ1dGVzIChQRVAgMjMyKS4gIEZ1bmN0aW9ucyBoYXZlIGEgbmV3IF9fZGljdF9fCiAgKGEuay5hLiBmdW5jX2RpY3QpIHdoaWNoIGhvbGQgdGhlIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICBNZXRob2RzIGdldAogIGFuZCBzZXQgYXR0cmlidXRlcyBvbiB0aGVpciB1bmRlcmx5aW5nIGltX2Z1bmMuICBJdCBpcyBhIFR5cGVFcnJvcgogIHRvIHNldCBhbiBhdHRyaWJ1dGUgb24gYSBib3VuZCBtZXRob2QuCgotIFRoZSB4cmFuZ2UoKSBvYmplY3QgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gaW1wcm92ZWQgc28gdGhhdAogIHhyYW5nZShzeXMubWF4aW50KSBjYW4gYmUgdXNlZCBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgVGhlcmUncyBzdGlsbCBhCiAgbGltaXRhdGlvbiB0aGF0IGluIHRoaXMgY2FzZSBsZW4oeHJhbmdlKHN5cy5tYXhpbnQpKSBjYW4ndCBiZQogIGNhbGN1bGF0ZWQsIGJ1dCB0aGUgY29tbW9uIGlkaW9tICJmb3IgaSBpbiB4cmFuZ2Uoc3lzLm1heGludCkiIHdpbGwKICB3b3JrIGZpbmUgYXMgbG9uZyBhcyB0aGUgaW5kZXggaSBkb2Vzbid0IGFjdHVhbGx5IHJlYWNoIDIqKjMxLgogIChQeXRob24gdXNlcyByZWd1bGFyIGludHMgZm9yIHNlcXVlbmNlIGFuZCBzdHJpbmcgaW5kaWNlczsgZml4aW5nCiAgdGhhdCBpcyBtdWNoIG1vcmUgd29yay4pCgotIFR3byBjaGFuZ2VzIHRvIGZyb20uLi5pbXBvcnQ6CgogIDEpICJmcm9tIE0gaW1wb3J0IFgiIG5vdyB3b3JrcyBldmVuIGlmIChhZnRlciBsb2FkaW5nIG1vZHVsZSBNKQogICAgIHN5cy5tb2R1bGVzWydNJ10gaXMgbm90IGEgcmVhbCBtb2R1bGU7IGl0J3MgYmFzaWNhbGx5IGEgZ2V0YXR0cigpCiAgICAgb3BlcmF0aW9uIHdpdGggQXR0cmlidXRlRXJyb3IgZXhjZXB0aW9ucyBjaGFuZ2VkIGludG8gSW1wb3J0RXJyb3IuCgogIDIpICJmcm9tIE0gaW1wb3J0ICoiIG5vdyBsb29rcyBmb3IgTS5fX2FsbF9fIHRvIGRlY2lkZSB3aGljaCBuYW1lcyB0bwogICAgIGltcG9ydDsgaWYgTS5fX2FsbF9fIGRvZXNuJ3QgZXhpc3QsIGl0IHVzZXMgTS5fX2RpY3RfXy5rZXlzKCkgYnV0CiAgICAgZmlsdGVycyBvdXQgbmFtZXMgc3RhcnRpbmcgd2l0aCAnXycgYXMgYmVmb3JlLiAgV2hldGhlciBvciBub3QKICAgICBfX2FsbF9fIGV4aXN0cywgdGhlcmUncyBubyByZXN0cmljdGlvbiBvbiB0aGUgdHlwZSBvZiBNLgoKLSBGaWxlIG9iamVjdHMgaGF2ZSBhIG5ldyBtZXRob2QsIHhyZWFkbGluZXMoKS4gIFRoaXMgaXMgdGhlIGZhc3Rlc3QKICB3YXkgdG8gaXRlcmF0ZSBvdmVyIGFsbCBsaW5lcyBpbiBhIGZpbGU6CgogIGZvciBsaW5lIGluIGZpbGUueHJlYWRsaW5lcygpOgogICAgICAuLi5kbyBzb21ldGhpbmcgdG8gbGluZS4uLgoKICBTZWUgdGhlIHhyZWFkbGluZXMgbW9kdWxlIChtZW50aW9uZWQgYmVsb3cpIGZvciBob3cgdG8gZG8gdGhpcyBmb3IKICBvdGhlciBmaWxlLWxpa2Ugb2JqZWN0cy4KCi0gRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIGZpbGUueHJlYWRsaW5lcygpLCB5b3UgbWF5IGV4cGVjdCBhIHNwZWVkdXAgb24KICBsaW5lLWJ5LWxpbmUgaW5wdXQuICBUaGUgZmlsZS5yZWFkbGluZSgpIG1ldGhvZCBoYXMgYmVlbiBvcHRpbWl6ZWQKICBxdWl0ZSBhIGJpdCBpbiBwbGF0Zm9ybS1zcGVjaWZpYyB3YXlzOiAgb24gc3lzdGVtcyAobGlrZSBMaW51eCkgdGhhdAogIHN1cHBvcnQgZmxvY2tmaWxlKCksIGdldGNfdW5sb2NrZWQoKSwgYW5kIGZ1bmxvY2tmaWxlKCksIHRob3NlIGFyZQogIHVzZWQgYnkgZGVmYXVsdC4gIE9uIHN5c3RlbXMgKGxpa2UgV2luZG93cykgd2l0aG91dCBnZXRjX3VubG9ja2VkKCksCiAgYSBjb21wbGljYXRlZCAoYnV0IHN0aWxsIHRocmVhZC1zYWZlKSBtZXRob2QgdXNpbmcgZmdldHMoKSBpcyB1c2VkIGJ5CiAgZGVmYXVsdC4KCiAgWW91IGNhbiBmb3JjZSB1c2Ugb2YgdGhlIGZnZXRzKCkgbWV0aG9kIGJ5ICNkZWZpbmUnaW5nCiAgVVNFX0ZHRVRTX0lOX0dFVExJTkUgYXQgYnVpbGQgdGltZSAoaXQgbWF5IGJlIGZhc3RlciB0aGFuCiAgZ2V0Y191bmxvY2tlZCgpKS4KCiAgWW91IGNhbiBmb3JjZSBmZ2V0cygpIG5vdCB0byBiZSB1c2VkIGJ5ICNkZWZpbmUnaW5nCiAgRE9OVF9VU0VfRkdFVFNfSU5fR0VUTElORSAodGhpcyBpcyB0aGUgZmlyc3QgdGhpbmcgdG8gdHJ5IGlmIHN0ZCB0ZXN0CiAgdGVzdF9idWZpby5weSBmYWlscyAtLSBhbmQgbGV0IHVzIGtub3cgaWYgaXQgZG9lcyEpLgoKLSBJbiBhZGRpdGlvbiwgdGhlIGZpbGVpbnB1dCBtb2R1bGUsIHdoaWxlIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBvdGhlcgogIG1ldGhvZHMgb24gbW9zdCBwbGF0Zm9ybXMsIGhhcyBiZWVuIHNwZWQgdXAgdG9vLCBieSB1c2luZwogIGZpbGUucmVhZGxpbmVzKHNpemVoaW50KS4KCi0gU3VwcG9ydCBmb3IgcnVuLXRpbWUgd2FybmluZ3MgaGFzIGJlZW4gYWRkZWQsIGluY2x1ZGluZyBhIG5ldwogIGNvbW1hbmQgbGluZSBvcHRpb24gKC1XKSB0byBzcGVjaWZ5IHRoZSBkaXNwb3NpdGlvbiBvZiB3YXJuaW5ncy4KICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB3YXJuaW5ncyBtb2R1bGUgYmVsb3cuCgotIEV4dGVuc2l2ZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBjb2VyY2lvbiBjb2RlLiAgVGhpcyBtb3N0bHkKICBhZmZlY3RzIGV4dGVuc2lvbiBtb2R1bGVzICh3aGljaCBjYW4gbm93IGltcGxlbWVudCBtaXhlZC10eXBlCiAgbnVtZXJpY2FsIG9wZXJhdG9ycyB3aXRob3V0IGhhdmluZyB0byB1c2UgY29lcmNpb24pLCBidXQKICBvY2Nhc2lvbmFsbHksIGluIGJvdW5kYXJ5IGNhc2VzIHRoZSBjb2VyY2lvbiBzZW1hbnRpY3MgaGF2ZSBjaGFuZ2VkCiAgc3VidGx5LiAgU2luY2UgdGhpcyB3YXMgYSB0ZXJyaWJsZSBncmF5IGFyZWEgb2YgdGhlIGxhbmd1YWdlLCB0aGlzCiAgaXMgY29uc2lkZXJlZCBhbiBpbXByb3ZlbWVudC4gIEFsc28gbm90ZSB0aGF0IF9fcmNtcF9fIGlzIG5vIGxvbmdlcgogIHN1cHBvcnRlZCAtLSBpbnN0ZWFkIG9mIGNhbGxpbmcgX19yY21wX18sIF9fY21wX18gaXMgY2FsbGVkIHdpdGgKICByZWZsZWN0ZWQgYXJndW1lbnRzLgoKLSBJbiBjb25uZWN0aW9uIHdpdGggdGhlIGNvZXJjaW9uIGNoYW5nZXMsIGEgbmV3IGJ1aWx0LWluIHNpbmdsZXRvbgogIG9iamVjdCwgTm90SW1wbGVtZW50ZWQgaXMgZGVmaW5lZC4gIFRoaXMgY2FuIGJlIHJldHVybmVkIGZvcgogIG9wZXJhdGlvbnMgdGhhdCB3aXNoIHRvIGluZGljYXRlIHRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZCBmb3IgYQogIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLiAgRnJvbSBDLCB0aGlzIGlzCiAgUHlfTm90SW1wbGVtZW50ZWQuCgotIFRoZSBpbnRlcnByZXRlciBhY2NlcHRzIG5vdyBieXRlY29kZSBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lIGV2ZW4KICBpZiB0aGV5IGRvIG5vdCBoYXZlIGEgLnB5YyBvciAucHlvIGV4dGVuc2lvbi4gT24gTGludXgsIGFmdGVyIGV4ZWN1dGluZwoKaW1wb3J0IGltcCxzeXMsc3RyaW5nCm1hZ2ljID0gc3RyaW5nLmpvaW4oWyJcXHglLjJ4IiAlIG9yZChjKSBmb3IgYyBpbiBpbXAuZ2V0X21hZ2ljKCldLCIiKQpyZWcgPSAnOnB5YzpNOjolczo6JXM6JyAlIChtYWdpYywgc3lzLmV4ZWN1dGFibGUpCm9wZW4oIi9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9yZWdpc3RlciIsIndiIikud3JpdGUocmVnKQoKICBhbnkgYnl0ZSBjb2RlIGZpbGUgY2FuIGJlIHVzZWQgYXMgYW4gZXhlY3V0YWJsZSAoaS5lLiBhcyBhbiBhcmd1bWVudAogIHRvIGV4ZWN2ZSgyKSkuCgotICVbeFhvXSBmb3JtYXRzIG9mIG5lZ2F0aXZlIFB5dGhvbiBsb25ncyBub3cgcHJvZHVjZSBhIHNpZ24KICBjaGFyYWN0ZXIuICBJbiAxLjYgYW5kIGVhcmxpZXIsIHRoZXkgbmV2ZXIgcHJvZHVjZWQgYSBzaWduLAogIGFuZCByYWlzZWQgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIG9mIHRoZSBsb25nIHdhcyB0b28gbGFyZ2UKICB0byBmaXQgaW4gYSBQeXRob24gaW50LiAgSW4gMi4wLCB0aGV5IHByb2R1Y2VkIGEgc2lnbiBpZiBhbmQKICBvbmx5IGlmIHRvbyBsYXJnZSB0byBmaXQgaW4gYW4gaW50LiAgVGhpcyB3YXMgaW5jb25zaXN0ZW50CiAgYWNyb3NzIHBsYXRmb3JtcyAoYmVjYXVzZSB0aGUgc2l6ZSBvZiBhbiBpbnQgdmFyaWVzIGFjcm9zcwogIHBsYXRmb3JtcyksIGFuZCBpbmNvbnNpc3RlbnQgd2l0aCBoZXgoKSBhbmQgb2N0KCkuICBFeGFtcGxlOgoKICA+Pj4gIiV4IiAlIC0weDQyTAogICctNDInICAgICAgIyBpbiAyLjEKICAnZmZmZmZmYmUnICMgaW4gMi4wIGFuZCBiZWZvcmUsIG9uIDMyLWJpdCBtYWNoaW5lcwogID4+PiBoZXgoLTB4NDJMKQogICctMHg0MkwnICAgIyBpbiBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uCgogIFRoZSBiZWhhdmlvciBvZiAlZCBmb3JtYXRzIGZvciBuZWdhdGl2ZSBQeXRob24gbG9uZ3MgcmVtYWlucwogIHRoZSBzYW1lIGFzIGluIDIuMCAoYWx0aG91Z2ggaW4gMS42IGFuZCBiZWZvcmUsIHRoZXkgcmFpc2VkCiAgYW4gZXJyb3IgaWYgdGhlIGxvbmcgZGlkbid0IGZpdCBpbiBhIFB5dGhvbiBpbnQpLgoKICAldSBmb3JtYXRzIGRvbid0IG1ha2Ugc2Vuc2UgZm9yIFB5dGhvbiBsb25ncywgYnV0IGFyZSBhbGxvd2VkCiAgYW5kIHRyZWF0ZWQgdGhlIHNhbWUgYXMgJWQgaW4gMi4xLiAgSW4gMi4wLCBhIG5lZ2F0aXZlIGxvbmcKICBmb3JtYXR0ZWQgdmlhICV1IHByb2R1Y2VkIGEgc2lnbiBpZiBhbmQgb25seSBpZiB0b28gbGFyZ2UgdG8KICBmaXQgaW4gYW4gaW50LiAgSW4gMS42IGFuZCBlYXJsaWVyLCBhIG5lZ2F0aXZlIGxvbmcgZm9ybWF0dGVkCiAgdmlhICV1IHJhaXNlZCBhbiBlcnJvciBpZiBpdCB3YXMgdG9vIGJpZyB0byBmaXQgaW4gYW4gaW50LgoKLSBEaWN0aW9uYXJ5IG9iamVjdHMgaGF2ZSBhbiBvZGQgbmV3IG1ldGhvZCwgcG9waXRlbSgpLiAgVGhpcyByZW1vdmVzCiAgYW4gYXJiaXRyYXJ5IGl0ZW0gZnJvbSB0aGUgZGljdGlvbmFyeSBhbmQgcmV0dXJucyBpdCAoaW4gdGhlIGZvcm0gb2YKICBhIChrZXksIHZhbHVlKSBwYWlyKS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYWxnb3JpdGhtcyB0aGF0IHVzZSBhCiAgZGljdGlvbmFyeSBhcyBhIGJhZyBvZiAidG8gZG8iIGl0ZW1zIGFuZCByZXBlYXRlZGx5IG5lZWQgdG8gcGljayBvbmUKICBpdGVtLiAgU3VjaCBhbGdvcml0aG1zIG5vcm1hbGx5IGVuZCB1cCBydW5uaW5nIGluIHF1YWRyYXRpYyB0aW1lOwogIHVzaW5nIHBvcGl0ZW0oKSB0aGV5IGNhbiB1c3VhbGx5IGJlIG1hZGUgdG8gcnVuIGluIGxpbmVhciB0aW1lLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBJbiB0aGUgdGltZSBtb2R1bGUsIHRoZSB0aW1lIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbnMgc3RyZnRpbWUsCiAgbG9jYWx0aW1lLCBnbXRpbWUsIGFzY3RpbWUgYW5kIGN0aW1lIGlzIG5vdyBvcHRpb25hbCwgZGVmYXVsdGluZyB0bwogIHRoZSBjdXJyZW50IHRpbWUgKGluIHRoZSBsb2NhbCB0aW1lem9uZSkuCgotIFRoZSBmdHBsaWIgbW9kdWxlIG5vdyBkZWZhdWx0cyB0byBwYXNzaXZlIG1vZGUsIHdoaWNoIGlzIGRlZW1lZCBhCiAgbW9yZSB1c2VmdWwgZGVmYXVsdCBnaXZlbiB0aGF0IGNsaWVudHMgYXJlIG9mdGVuIGluc2lkZSBmaXJld2FsbHMKICB0aGVzZSBkYXlzLiAgTm90ZSB0aGF0IHRoaXMgY291bGQgYnJlYWsgaWYgZnRwbGliIGlzIHVzZWQgdG8gY29ubmVjdAogIHRvIGEgKnNlcnZlciogdGhhdCBpcyBpbnNpZGUgYSBmaXJld2FsbCwgZnJvbSBvdXRzaWRlOyB0aGlzIGlzCiAgZXhwZWN0ZWQgdG8gYmUgYSB2ZXJ5IHJhcmUgc2l0dWF0aW9uLiAgVG8gZml4IHRoYXQsIHlvdSBjYW4gY2FsbAogIGZ0cC5zZXRfcGFzdigwKS4KCi0gVGhlIG1vZHVsZSBzaXRlIG5vdyB0cmVhdHMgLnB0aCBmaWxlcyBub3Qgb25seSBmb3IgcGF0aCBjb25maWd1cmF0aW9uLAogIGJ1dCBhbHNvIHN1cHBvcnRzIGV4dGVuc2lvbnMgdG8gdGhlIGluaXRpYWxpemF0aW9uIGNvZGU6IExpbmVzIHN0YXJ0aW5nCiAgd2l0aCBpbXBvcnQgYXJlIGV4ZWN1dGVkLgoKLSBUaGVyZSdzIGEgbmV3IG1vZHVsZSwgd2FybmluZ3MsIHdoaWNoIGltcGxlbWVudHMgYSBtZWNoYW5pc20gZm9yCiAgaXNzdWluZyBhbmQgZmlsdGVyaW5nIHdhcm5pbmdzLiAgVGhlcmUgYXJlIHNvbWUgbmV3IGJ1aWx0LWluCiAgZXhjZXB0aW9ucyB0aGF0IHNlcnZlIGFzIHdhcm5pbmcgY2F0ZWdvcmllcywgYW5kIGEgbmV3IGNvbW1hbmQgbGluZQogIG9wdGlvbiwgLVcsIHRvIGNvbnRyb2wgd2FybmluZ3MgKGUuZy4gLVdpIGlnbm9yZXMgYWxsIHdhcm5pbmdzLCAtV2UKICB0dXJucyB3YXJuaW5ncyBpbnRvIGVycm9ycykuICB3YXJuaW5ncy53YXJuKG1lc3NhZ2VbLCBjYXRlZ29yeV0pCiAgaXNzdWVzIGEgd2FybmluZyBtZXNzYWdlOyB0aGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIEMgYXMKICBQeUVycl9XYXJuKGNhdGVnb3J5LCBtZXNzYWdlKS4KCi0gQSBuZXcgbW9kdWxlIHhyZWFkbGluZXMgd2FzIGFkZGVkLiAgVGhpcyBleHBvcnRzIGEgc2luZ2xlIGZhY3RvcnkKICBmdW5jdGlvbiwgeHJlYWRsaW5lcygpLiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHRoaXMgY29kZSBpcyB0aGUKICBhYnNvbHV0ZWx5IGZhc3Rlc3Qgd2F5IHRvIGl0ZXJhdGUgb3ZlciBhbGwgbGluZXMgaW4gYW4gb3BlbgogIGZpbGUoLWxpa2UpIG9iamVjdDoKCiAgaW1wb3J0IHhyZWFkbGluZXMKICBmb3IgbGluZSBpbiB4cmVhZGxpbmVzLnhyZWFkbGluZXMoZmlsZSk6CiAgICAgIC4uLmRvIHNvbWV0aGluZyB0byBsaW5lLi4uCgogIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcHJldmlvdXMgdGhlIHNwZWVkIHJlY29yZCBob2xkZXIgdXNpbmcKICBmaWxlLnJlYWRsaW5lcyhzaXplaGludCkuICBOb3RlIHRoYXQgaWYgZmlsZSBpcyBhIHJlYWwgZmlsZSBvYmplY3QKICAoYXMgb3Bwb3NlZCB0byBhIGZpbGUtbGlrZSBvYmplY3QpLCB0aGlzIGlzIGVxdWl2YWxlbnQ6CgogIGZvciBsaW5lIGluIGZpbGUueHJlYWRsaW5lcygpOgogICAgICAuLi5kbyBzb21ldGhpbmcgdG8gbGluZS4uLgoKLSBUaGUgYmlzZWN0IG1vZHVsZSBoYXMgbmV3IGZ1bmN0aW9ucyBiaXNlY3RfbGVmdCwgaW5zb3J0X2xlZnQsCiAgYmlzZWN0X3JpZ2h0IGFuZCBpbnNvcnRfcmlnaHQuICBUaGUgb2xkIG5hbWVzIGJpc2VjdCBhbmQgaW5zb3J0CiAgYXJlIG5vdyBhbGlhc2VzIGZvciBiaXNlY3RfcmlnaHQgYW5kIGluc29ydF9yaWdodC4gIFhYWF9yaWdodAogIGFuZCBYWFhfbGVmdCBtZXRob2RzIGRpZmZlciBpbiB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgbmV3IGVsZW1lbnQKICBjb21wYXJlcyBlcXVhbCB0byBvbmUgb3IgbW9yZSBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBsaXN0OiAgdGhlCiAgWFhYX2xlZnQgbWV0aG9kcyBpbnNlcnQgdG8gdGhlIGxlZnQsIHRoZSBYWFhfcmlnaHQgbWV0aG9kcyB0byB0aGUKICByaWdodC4gIENvZGUgdGhhdCBkb2Vzbid0IGNhcmUgd2hlcmUgZXF1YWwgZWxlbWVudHMgZW5kIHVwIHNob3VsZAogIGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkLCBzaG9ydCBuYW1lcyAoImJpc2VjdCIgYW5kICJpbnNvcnQiKS4KCi0gVGhlIG5ldyBjdXJzZXMucGFuZWwgbW9kdWxlIHdyYXBzIHRoZSBwYW5lbCBsaWJyYXJ5IHRoYXQgZm9ybXMgcGFydAogIG9mIFNZU1YgY3Vyc2VzIGFuZCBuY3Vyc2VzLiAgQ29udHJpYnV0ZWQgYnkgVGhvbWFzIEdlbGxla3VtLgoKLSBUaGUgU29ja2V0U2VydmVyIG1vZHVsZSBub3cgc2V0cyB0aGUgYWxsb3dfcmV1c2VfYWRkcmVzcyBmbGFnIGJ5CiAgZGVmYXVsdCBpbiB0aGUgVENQU2VydmVyIGNsYXNzLgoKLSBBIG5ldyBmdW5jdGlvbiwgc3lzLl9nZXRmcmFtZSgpLCByZXR1cm5zIHRoZSBzdGFjayBmcmFtZSBwb2ludGVyIG9mCiAgdGhlIGNhbGxlci4gIFRoaXMgaXMgaW50ZW5kZWQgb25seSBhcyBhIGJ1aWxkaW5nIGJsb2NrIGZvcgogIGhpZ2hlci1sZXZlbCBtZWNoYW5pc21zIHN1Y2ggYXMgc3RyaW5nIGludGVycG9sYXRpb24uCgotIFRoZSBweWV4cGF0IG1vZHVsZSBzdXBwb3J0cyBhIG51bWJlciBvZiBuZXcgaGFuZGxlcnMsIHdoaWNoIGFyZQogIGF2YWlsYWJsZSBvbmx5IGluIGV4cGF0IDEuMi4gSWYgaW52b2NhdGlvbiBvZiBhIGNhbGxiYWNrIGZhaWxzLCBpdAogIHdpbGwgcmVwb3J0IGFuIGFkZGl0aW9uYWwgZnJhbWUgaW4gdGhlIHRyYWNlYmFjay4gUGFyc2VyIG9iamVjdHMKICBwYXJ0aWNpcGF0ZSBub3cgaW4gZ2FyYmFnZSBjb2xsZWN0aW9uLiBJZiBleHBhdCByZXBvcnRzIGFuIHVua25vd24KICBlbmNvZGluZywgcHlleHBhdCB3aWxsIHRyeSB0byB1c2UgYSBQeXRob24gY29kZWM7IHRoYXQgd29ya3Mgb25seQogIGZvciBzaW5nbGUtYnl0ZSBjaGFyc2V0cy4gVGhlIHBhcnNlciB0eXBlIG9iamVjdHMgaXMgZXhwb3NlZCBhcwogIFhNTFBhcnNlck9iamVjdC4KCi0geG1sLmRvbSBub3cgb2ZmZXJzIHN0YW5kYXJkIGRlZmluaXRpb25zIGZvciBzeW1ib2xpYyBub2RlIHR5cGUgYW5kCiAgZXhjZXB0aW9uIGNvZGUgY29uc3RhbnRzLCBhbmQgYSBoaWVyYXJjaHkgb2YgRE9NIGV4Y2VwdGlvbnMuIG1pbmlkb20KICB3YXMgYWRqdXN0ZWQgdG8gdXNlIHRoZW0uCgotIFRoZSBjb25mb3JtYW5jZSBvZiB4bWwuZG9tLm1pbmlkb20gdG8gdGhlIERPTSBzcGVjaWZpY2F0aW9uIHdhcwogIGltcHJvdmVkLiBJdCBkZXRlY3RzIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZXJyb3IgY2FzZXM7IHRoZQogIHByZXZpb3VzL25leHQgcmVsYXRpb25zaGlwIHdvcmtzIGV2ZW4gd2hlbiB0aGUgdHJlZSBpcyBtb2RpZmllZDsKICBOb2RlIHN1cHBvcnRzIHRoZSBub3JtYWxpemUoKSBtZXRob2Q7IE5hbWVkTm9kZU1hcCwgRG9jdW1lbnRUeXBlIGFuZAogIERPTUltcGxlbWVudGF0aW9uIGNsYXNzZXMgd2VyZSBhZGRlZDsgRWxlbWVudCBzdXBwb3J0cyB0aGUKICBoYXNBdHRyaWJ1dGUgYW5kIGhhc0F0dHJpYnV0ZU5TIG1ldGhvZHM7IGFuZCBUZXh0IHN1cHBvcnRzIHRoZSBzcGxpdFRleHQKICBtZXRob2QuCgpCdWlsZCBpc3N1ZXMKCi0gRm9yIFVuaXggKGFuZCBVbml4LWNvbXBhdGlibGUpIGJ1aWxkcywgY29uZmlndXJhdGlvbiBhbmQgYnVpbGRpbmcgb2YKICBleHRlbnNpb24gbW9kdWxlcyBpcyBub3cgZ3JlYXRseSBhdXRvbWF0ZWQuICBSYXRoZXIgdGhhbiBoYXZpbmcgdG8KICBlZGl0IHRoZSBNb2R1bGVzL1NldHVwIGZpbGUgdG8gaW5kaWNhdGUgd2hpY2ggbW9kdWxlcyBzaG91bGQgYmUKICBidWlsdCBhbmQgd2hlcmUgdGhlaXIgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzIGFyZSwgYQogIGRpc3R1dGlscy1iYXNlZCBzZXR1cC5weSBzY3JpcHQgbm93IHRha2VzIGNhcmUgb2YgYnVpbGRpbmcgbW9zdAogIGV4dGVuc2lvbiBtb2R1bGVzLiAgQWxsIGV4dGVuc2lvbiBtb2R1bGVzIGJ1aWx0IHRoaXMgd2F5IGFyZSBidWlsdAogIGFzIHNoYXJlZCBsaWJyYXJpZXMuICBPbmx5IGEgZmV3IG1vZHVsZXMgdGhhdCBtdXN0IGJlIGxpbmtlZAogIHN0YXRpY2FsbHkgYXJlIHN0aWxsIGxpc3RlZCBpbiB0aGUgU2V0dXAgZmlsZTsgeW91IHdvbid0IG5lZWQgdG8KICBlZGl0IHRoZWlyIGNvbmZpZ3VyYXRpb24uCgotIFB5dGhvbiBzaG91bGQgbm93IGJ1aWxkIG91dCBvZiB0aGUgYm94IG9uIEN5Z3dpbi4gIElmIGl0IGRvZXNuJ3QsCiAgbWFpbCB0byBKYXNvbiBUaXNobGVyIChqbHQ2MyBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpLgoKLSBQeXRob24gbm93IGFsd2F5cyB1c2VzIGl0cyBvd24gKHJlbmFtZWQpIGltcGxlbWVudGF0aW9uIG9mIGdldG9wdCgpCiAgLS0gdGhlcmUncyB0b28gbXVjaCB2YXJpYXRpb24gYW1vbmcgQyBsaWJyYXJ5IGdldG9wdCgpCiAgaW1wbGVtZW50YXRpb25zLgoKLSBDKysgY29tcGlsZXJzIGFyZSBiZXR0ZXIgc3VwcG9ydGVkOyB0aGUgQ1hYIG1hY3JvIGlzIGFsd2F5cyBzZXQgdG8gYQogIEMrKyBjb21waWxlciBpZiBvbmUgaXMgZm91bmQuCgpXaW5kb3dzIGNoYW5nZXMKCi0gc2VsZWN0IG1vZHVsZTogIEJ5IGRlZmF1bHQgdW5kZXIgV2luZG93cywgYSBzZWxlY3QoKSBjYWxsCiAgY2FuIHNwZWNpZnkgbm8gbW9yZSB0aGFuIDY0IHNvY2tldHMuICBQeXRob24gbm93IGJvb3N0cwogIHRoaXMgTWljcm9zb2Z0IGRlZmF1bHQgdG8gNTEyLiAgSWYgeW91IG5lZWQgZXZlbiBtb3JlIHRoYW4KICB0aGF0LCBzZWUgdGhlIE1TIGRvY3MgKHlvdSdsbCBuZWVkIHRvICNkZWZpbmUgRkRfU0VUU0laRQogIGFuZCByZWNvbXBpbGUgUHl0aG9uIGZyb20gc291cmNlKS4KCi0gU3VwcG9ydCBmb3IgV2luZG93cyAzLjEsIERPUyBhbmQgT1MvMiBpcyBnb25lLiAgVGhlIExpYi9kb3MtOHgzCiAgc3ViZGlyZWN0b3J5IGlzIG5vIG1vcmUhCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4wPwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpCZWxvdyBpcyBhIGxpc3Qgb2YgYWxsIHJlbGV2YW50IGNoYW5nZXMgc2luY2UgcmVsZWFzZSAxLjYuICBPbGRlcgpjaGFuZ2VzIGFyZSBpbiB0aGUgZmlsZSBISVNUT1JZLiAgSWYgeW91IGFyZSBtYWtpbmcgdGhlIGp1bXAgZGlyZWN0bHkKZnJvbSBQeXRob24gMS41LjIgdG8gMi4wLCBtYWtlIHN1cmUgdG8gcmVhZCB0aGUgc2VjdGlvbiBmb3IgMS42IGluIHRoZQpISVNUT1JZIGZpbGUhICBNYW55IGltcG9ydGFudCBjaGFuZ2VzIGxpc3RlZCB0aGVyZS4KCkFsdGVybmF0aXZlbHksIGEgZ29vZCBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyBiZXR3ZWVuIDEuNS4yIGFuZCAyLjAgaXMKdGhlIGRvY3VtZW50ICJXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjAiIGJ5IEt1Y2hsaW5nIGFuZCBNb3NoZSBaYWRrYToKaHR0cDovL3N0YXJzaGlwLnB5dGhvbi5uZXQvY3Jldy9hbWsvcHl0aG9uL3dyaXRpbmcvbmV3LXB5dGhvbi8uCgotLUd1aWRvIHZhbiBSb3NzdW0gKGhvbWUgcGFnZTogaHR0cDovL3d3dy5weXRob25sYWJzLmNvbS9+Z3VpZG8vKQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2hhdCdzIG5ldyBpbiAyLjAgKHNpbmNlIHJlbGVhc2UgY2FuZGlkYXRlIDEpPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTdGFuZGFyZCBsaWJyYXJ5CgotIFRoZSBjb3B5X3JlZyBtb2R1bGUgd2FzIG1vZGlmaWVkIHRvIGNsYXJpZnkgaXRzIGludGVuZGVkIHVzZTogdG8KICByZWdpc3RlciBwaWNrbGUgc3VwcG9ydCBmb3IgZXh0ZW5zaW9uIHR5cGVzLCBub3QgZm9yIGNsYXNzZXMuCiAgcGlja2xlKCkgd2lsbCByYWlzZSBhIFR5cGVFcnJvciBpZiBpdCBpcyBwYXNzZWQgYSBjbGFzcy4KCi0gRml4ZWQgYSBidWcgaW4gZ2V0dGV4dCdzICJub3JtYWxpemUgYW5kIGV4cGFuZCIgY29kZSB0aGF0IHByZXZlbnRlZAogIGl0IGZyb20gZmluZGluZyBhbiBleGlzdGluZyAubW8gZmlsZS4KCi0gUmVzdG9yZWQgc3VwcG9ydCBmb3IgSFRUUC8wLjkgc2VydmVycyBpbiBodHRwbGliLgoKLSBUaGUgbWF0aCBtb2R1bGUgd2FzIGNoYW5nZWQgdG8gc3RvcCByYWlzaW5nIE92ZXJmbG93RXJyb3IgaW4gY2FzZSBvZgogIHVuZGVyZmxvdywgYW5kIHJldHVybiAwIGluc3RlYWQgaW4gdW5kZXJmbG93IGNhc2VzLiAgV2hldGhlciBQeXRob24KICB1c2VkIHRvIHJhaXNlIE92ZXJmbG93RXJyb3IgaW4gY2FzZSBvZiB1bmRlcmZsb3cgd2FzIHBsYXRmb3JtLQogIGRlcGVuZGVudCAoaXQgZGlkIHdoZW4gdGhlIHBsYXRmb3JtIG1hdGggbGlicmFyeSBzZXQgZXJybm8gdG8gRVJBTkdFCiAgb24gdW5kZXJmbG93KS4KCi0gRml4ZWQgYSBidWcgaW4gU3RyaW5nSU8gdGhhdCBvY2N1cnJlZCB3aGVuIHRoZSBmaWxlIHBvc2l0aW9uIHdhcyBub3QKICBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB3cml0ZSgpIHdhcyBjYWxsZWQgd2l0aCBlbm91Z2ggZGF0YSB0bwogIGV4dGVuZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCgotIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIFRraW50ZXIgZXJyb3IgbWVzc2FnZXMgdG8gZ2V0IGxvc3Qgb24KICBXaW5kb3dzLiAgVGhlIGJ1ZyB3YXMgZml4ZWQgYnkgcmVwbGFjaW5nIGRpcmVjdCB1c2Ugb2YKICBpbnRlcnAtPnJlc3VsdCB3aXRoIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKS4KCi0gRml4ZWQgYnVnIGluIHVybGxpYjIgdGhhdCBjYXVzZWQgaXQgdG8gZmFpbCB3aGVuIGl0IHJlY2VpdmVkIGFuIEhUVFAKICByZWRpcmVjdCByZXNwb25zZS4KCi0gU2V2ZXJhbCBjaGFuZ2VzIHdlcmUgbWFkZSB0byBkaXN0dXRpbHM6IFNvbWUgZGVidWdnaW5nIGNvZGUgd2FzCiAgcmVtb3ZlZCBmcm9tIHV0aWwuICBGaXhlZCB0aGUgaW5zdGFsbGVyIHVzZWQgd2hlbiBhbiBleHRlcm5hbCB6aXAKICBwcm9ncmFtIChsaWtlIFdpblppcCkgaXMgbm90IGZvdW5kOyB0aGUgc291cmNlIGNvZGUgZm9yIHRoaXMKICBpbnN0YWxsZXIgaXMgaW4gTWlzYy9kaXN0dXRpbHMuICBjaGVja19saWIoKSB3YXMgbW9kaWZpZWQgdG8gYmVoYXZlCiAgbW9yZSBsaWtlIEFDX0NIRUNLX0xJQiBieSBhZGQgb3RoZXJfbGlicmFyaWVzKCkgYXMgYSBwYXJhbWV0ZXIuICBUaGUKICB0ZXN0IGZvciB3aGV0aGVyIGluc3RhbGxlZCBtb2R1bGVzIGFyZSBvbiBzeXMucGF0aCB3YXMgY2hhbmdlZCB0bwogIHVzZSBib3RoIG5vcm1jYXNlKCkgYW5kIG5vcm1wYXRoKCkuCgotIFNldmVyYWwgbWlub3IgYnVncyB3ZXJlIGZpeGVkIGluIHRoZSB4bWwgcGFja2FnZSAodGhlIG1pbmlkb20sCiAgcHVsbGRvbSwgZXhwYXRyZWFkZXIsIGFuZCBzYXh1dGlscyBtb2R1bGVzKS4KCi0gVGhlIHJlZ3Jlc3Npb24gdGVzdCBkcml2ZXIgKHJlZ3J0ZXN0LnB5KSBiZWhhdmlvciB3aGVuIGludm9rZWQgd2l0aAogIC1sIGNoYW5nZWQ6IEl0IG5vdyByZXBvcnRzIGEgY291bnQgb2Ygb2JqZWN0cyB0aGF0IGFyZSByZWNvZ25pemVkIGFzCiAgZ2FyYmFnZSBidXQgbm90IGZyZWVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KCi0gVGhlIHJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhlIG1hdGggbW9kdWxlIHdhcyBjaGFuZ2VkIHRvIHRlc3QKICBleGNlcHRpb25hbCBiZWhhdmlvciB3aGVuIHRoZSB0ZXN0IGlzIHJ1biBpbiB2ZXJib3NlIG1vZGUuICBQeXRob24KICBjYW5ub3QgeWV0IGd1YXJhbnRlZSBjb25zaXN0ZW50IGV4Y2VwdGlvbiBiZWhhdmlvciBhY3Jvc3MgcGxhdGZvcm1zLAogIHNvIHRoZSBleGNlcHRpb24gcGFydCBvZiB0ZXN0X21hdGggaXMgcnVuIG9ubHkgaW4gdmVyYm9zZSBtb2RlLCBhbmQKICBtYXkgZmFpbCBvbiB5b3VyIHBsYXRmb3JtLgoKSW50ZXJuYWxzCgotIFB5T1NfQ2hlY2tTdGFjaygpIGhhcyBiZWVuIGRpc2FibGVkIG9uIFdpbjY0LCB3aGVyZSBpdCBjYXVzZWQKICB0ZXN0X3NyZSB0byBmYWlsLgoKQnVpbGQgaXNzdWVzCgotIENoYW5nZWQgY29tcGlsZXIgZmxhZ3MsIHNvIHRoYXQgZ2NjIGlzIGFsd2F5cyBpbnZva2VkIHdpdGggLVdhbGwgYW5kCiAgLVdzdHJpY3QtcHJvdG90eXBlcy4gIFVzZXJzIGNvbXBpbGluZyBQeXRob24gd2l0aCBHQ0Mgc2hvdWxkIHNlZQogIGV4YWN0bHkgb25lIHdhcm5pbmcsIGV4Y2VwdCBpZiB0aGV5IGhhdmUgcGFzc2VkIGNvbmZpZ3VyZSB0aGUKICAtLXdpdGgtcHlkZWJ1ZyBmbGFnLiAgVGhlIGV4cGVjdGVkIHdhcm5pbmcgaXMgZm9yIGdldG9wdCgpIGluCiAgTW9kdWxlcy9tYWluLmMuICBUaGlzIHdhcm5pbmcgd2lsbCBiZSBmaXhlZCBmb3IgUHl0aG9uIDIuMS4KCi0gRml4ZWQgY29uZmlndXJlIHRvIGFkZCAtdGhyZWFkcyBhcmd1bWVudCBkdXJpbmcgbGlua2luZyBvbiBPU0YxLgoKVG9vbHMgYW5kIG90aGVyIG1pc2NlbGxhbnkKCi0gVGhlIGNvbXBpbGVyIGluIFRvb2xzL2NvbXBpbGVyIHdhcyB1cGRhdGVkIHRvIHN1cHBvcnQgdGhlIG5ldwogIGxhbmd1YWdlIGZlYXR1cmVzIGludHJvZHVjZWQgaW4gMi4wOiBleHRlbmRlZCBwcmludCBzdGF0ZW1lbnQsIGxpc3QKICBjb21wcmVoZW5zaW9ucywgYW5kIGF1Z21lbnRlZCBhc3NpZ25tZW50cy4gIFRoZSBuZXcgY29tcGlsZXIgc2hvdWxkCiAgYWxzbyBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAxLjUuMjsgdGhlIGNvbXBpbGVyIHdpbGwKICBhbHdheXMgZ2VuZXJhdGUgY29kZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIGludGVycHJldGVyIGl0IHJ1bnMKICB1bmRlci4KCldoYXQncyBuZXcgaW4gMi4wIHJlbGVhc2UgY2FuZGlkYXRlIDEgKHNpbmNlIGJldGEgMik/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGF0IGlzIHJlbGVhc2UgY2FuZGlkYXRlIDE/CgpXZSBiZWxpZXZlIHRoYXQgcmVsZWFzZSBjYW5kaWRhdGUgMSB3aWxsIGZpeCBhbGwga25vd24gYnVncyB0aGF0IHdlCmludGVuZCB0byBmaXggZm9yIHRoZSAyLjAgZmluYWwgcmVsZWFzZS4gIFRoaXMgcmVsZWFzZSBzaG91bGQgYmUgYSBiaXQKbW9yZSBzdGFibGUgdGhhbiB0aGUgcHJldmlvdXMgYmV0YXMuICBXZSB3b3VsZCBsaWtlIHRvIHNlZSBldmVuIG1vcmUKd2lkZXNwcmVhZCB0ZXN0aW5nIGJlZm9yZSB0aGUgZmluYWwgcmVsZWFzZSwgc28gd2UgYXJlIHByb2R1Y2luZyB0aGlzCnJlbGVhc2UgY2FuZGlkYXRlLiAgVGhlIGZpbmFsIHJlbGVhc2Ugd2lsbCBiZSBleGFjdGx5IHRoZSBzYW1lIHVubGVzcwphbnkgc2hvdy1zdG9wcGluZyAob3IgYnJvd24gYmFnKSBidWdzIGFyZSBmb3VuZCBieSB0ZXN0ZXJzIG9mIHRoZQpyZWxlYXNlIGNhbmRpZGF0ZS4KCkFsbCB0aGUgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCBiZXRhIHJlbGVhc2UgYXJlIGJ1ZyBmaXhlcyBvciBjaGFuZ2VzCnRvIHN1cHBvcnQgYnVpbGRpbmcgUHl0aG9uIGZvciBzcGVjaWZpYyBwbGF0Zm9ybXMuCgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIEEgYnVnIHRoYXQgY2F1c2VkIGNyYXNoZXMgd2hlbiBfX2NvZXJjZV9fIHdhcyB1c2VkIHdpdGggYXVnbWVudGVkCiAgYXNzaWdubWVudCwgZS5nLiArPSwgd2FzIGZpeGVkLgoKLSBSYWlzZSBaZXJvRGl2aXNpb25FcnJvciB3aGVuIHJhaXNpbmcgemVybyB0byBhIG5lZ2F0aXZlIG51bWJlciwKICBlLmcuIDAuMCAqKiAtMi4wLiAgTm90ZSB0aGF0IG1hdGgucG93IGlzIHVucmVsYXRlZCB0byB0aGUgYnVpbHRpbgogIHBvd2VyIG9wZXJhdG9yIGFuZCB0aGUgcmVzdWx0IG9mIG1hdGgucG93KDAuMCwgLTIuMCkgd2lsbCB2YXJ5IGJ5CiAgcGxhdGZvcm0uICBPbiBMaW51eCwgaXQgcmFpc2VzIGEgVmFsdWVFcnJvci4KCi0gQSBidWcgaW4gVW5pY29kZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiB3YXMgZml4ZWQgdGhhdCBvY2Nhc2lvbmFsbHkKICBjYXVzZWQgZXJyb3JzIHdpdGggZm9ybWF0cyBpbmNsdWRpbmcgIiUlIi4gIEZvciBleGFtcGxlLCB0aGUKICBmb2xsb3dpbmcgZXhwcmVzc2lvbiAiJSUgJXMiICUgdSJhYmMiIG5vIGxvbmdlciByYWlzZXMgYSBUeXBlRXJyb3IuCgotIENvbXBpbGF0aW9uIG9mIGRlZXBseSBuZXN0ZWQgZXhwcmVzc2lvbnMgcmFpc2VzIE1lbW9yeUVycm9yIGluc3RlYWQKICBvZiBTeW50YXhFcnJvciwgZS5nLiBldmFsKCJbIiAqIDUwICsgIl0iICogNTApLgoKLSBJbiAyLjBiMiBvbiBXaW5kb3dzLCB0aGUgaW50ZXJwcmV0ZXIgd3JvdGUgLnB5YyBmaWxlcyBpbiB0ZXh0IG1vZGUsCiAgcmVuZGVyaW5nIHRoZW0gdXNlbGVzcy4gIFRoZXkgYXJlIG5vdyB3cml0dGVuIGluIGJpbmFyeSBtb2RlIGFnYWluLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBLZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm93IGFjY2VwdGVkIGZvciBtb3N0IHBhdHRlcm4gYW5kIG1hdGNoIG9iamVjdAogIG1ldGhvZHMgaW4gU1JFLCB0aGUgc3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZS4KCi0gSW4gU1JFLCBmaXhlZCBlcnJvciB3aXRoIG5lZ2F0aXZlIGxvb2thaGVhZCBhbmQgbG9va2JlaGluZCB0aGF0CiAgbWFuaWZlc3RlZCBpdHNlbGYgYXMgYSBydW50aW1lIGVycm9yIGluIHBhdHRlcm5zIGxpa2UgIig/PCFhYmMpKGRlZikiLgoKLSBTZXZlcmFsIGJ1Z3MgaW4gdGhlIFVuaWNvZGUgaGFuZGxpbmcgYW5kIGVycm9yIGhhbmRsaW5nIGluIF90a2ludGVyCiAgd2VyZSBmaXhlZC4KCi0gRml4IG1lbW9yeSBtYW5hZ2VtZW50IGVycm9ycyBpbiBNZXJnZSgpIGFuZCBUa2FwcF9DYWxsKCkgcm91dGluZXMuCgotIFNldmVyYWwgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gY1N0cmluZ0lPIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoCiAgdGhlIGZpbGUtbGlrZSBvYmplY3QgaW50ZXJmYWNlIGFuZCB3aXRoIFN0cmluZ0lPLiAgSWYgb3BlcmF0aW9ucyBhcmUKICBwZXJmb3JtZWQgb24gYSBjbG9zZWQgb2JqZWN0LCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLiAgVGhlIHRydW5jYXRlCiAgbWV0aG9kIG5vdyBhY2NlcHRzIGEgcG9zaXRpb24gYXJndW1lbnQgYW5kIHJlYWRsaW5lIGFjY2VwdHMgYSBzaXplCiAgYXJndW1lbnQuCgotIFRoZXJlIHdlcmUgbWFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGxpbnV4YXVkaW9kZXYgbW9kdWxlIGFuZCBpdHMKICB0ZXN0IHN1aXRlOyBhcyBhIHJlc3VsdCwgYSBzaG9ydCwgdW5leHBlY3RlZCBhdWRpbyBzYW1wbGUgc2hvdWxkIG5vdwogIHBsYXkgd2hlbiB0aGUgcmVncmVzc2lvbiB0ZXN0IGlzIHJ1bi4KCiAgTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIG5hbWVkIHBvb3JseSwgYmVjYXVzZSBpdCBzaG91bGQgd29yawogIGNvcnJlY3RseSBvbiBhbnkgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0KICAoT1NTKS4KCiAgVGhlIG1vZHVsZSBub3cgcmFpc2VzIGV4Y2VwdGlvbnMgd2hlbiBlcnJvcnMgb2NjdXIgaW5zdGVhZCBvZgogIGNyYXNoaW5nLiAgSXQgYWxzbyBkZWZpbmVzIHRoZSBBRk1UX0FfTEFXIGZvcm1hdCAobG9nYXJpdGhtaWMgQS1sYXcKICBhdWRpbykgYW5kIGRlZmluZXMgYSBnZXRwdHIoKSBtZXRob2QgdGhhdCBjYWxscyB0aGUKICBTTkRDVExfRFNQX0dFVHhQVFIgaW9jdGwgZGVmaW5lZCBpbiB0aGUgT1NTIFByb2dyYW1tZXIncyBHdWlkZS4KCi0gVGhlIGxpYnJhcnlfdmVyc2lvbiBhdHRyaWJ1dGUsIGludHJvZHVjZWQgaW4gYW4gZWFybGllciBiZXRhLCB3YXMKICByZW1vdmVkIGJlY2F1c2UgaXQgY2FuIG5vdCBiZSBzdXBwb3J0ZWQgd2l0aCBlYXJseSB2ZXJzaW9ucyBvZiB0aGUgQwogIHJlYWRsaW5lIGxpYnJhcnksIHdoaWNoIHByb3ZpZGVzIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gYXQKICBjb21waWxlLXRpbWUuCgotIFRoZSBiaW5hc2NpaSBtb2R1bGUgaXMgbm93IGVuYWJsZWQgb24gV2luNjQuCgotIHRva2VuaXplLnB5IG5vIGxvbmdlciBzdWZmZXJzICJyZWN1cnNpb24gZGVwdGgiIGVycm9ycyB3aGVuIHBhcnNpbmcKICBwcm9ncmFtcyB3aXRoIHZlcnkgbG9uZyBzdHJpbmcgbGl0ZXJhbHMuCgpJbnRlcm5hbHMKCi0gRml4ZWQgc2V2ZXJhbCBidWZmZXIgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0aWVzIGluIGNhbGN1bGF0ZV9wYXRoKCksCiAgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIGludGVycHJldGVyIHN0YXJ0cyB1cCB0byBkZXRlcm1pbmUgd2hlcmUKICB0aGUgc3RhbmRhcmQgbGlicmFyeSBpcyBpbnN0YWxsZWQuICBUaGVzZSB2dWxuZXJhYmlsaXRpZXMgYWZmZWN0IGFsbAogIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbiBhbmQgY2FuIGJlIGV4cGxvaXRlZCBieSBzZXR0aW5nIHZlcnkKICBsb25nIHZhbHVlcyBmb3IgUFlUSE9OSE9NRSBvciBhcmd2WzBdLiAgVGhlIHJpc2sgaXMgZ3JlYXRlc3QgZm9yIGEKICBzZXR1aWQgUHl0aG9uIHNjcmlwdCwgYWx0aG91Z2ggdXNlIG9mIHRoZSB3cmFwcGVyIGluCiAgTWlzYy9zZXR1aWQtcHJvZy5jIHdpbGwgZWxpbWluYXRlIHRoZSB2dWxuZXJhYmlsaXR5LgoKLSBGaXhlZCBnYXJiYWdlIGNvbGxlY3Rpb24gYnVncyBpbiBpbnN0YW5jZSBjcmVhdGlvbiB0aGF0IHdlcmUKICB0cmlnZ2VyZWQgd2hlbiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAgVGhlIHNvbHV0aW9uLAogIGFwcGxpZWQgaW4gY1BpY2tsZSBhbmQgaW4gUHlJbnN0YW5jZV9OZXcoKSwgaXMgdG8gY2FsbAogIFB5T2JqZWN0X0dDX0luaXQoKSBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG9iamVjdCdzCiAgY29udGFpbmVyIGF0dHJpYnV0ZXMgaXMgY29tcGxldGUuCgotIHB5ZXhwYXQgYWRkcyBkZWZpbml0aW9ucyBvZiBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudCBhbmQKICBQeU1vZHVsZV9BZGRPYmplY3QgaWYgdGhlIFB5dGhvbiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiAyLjAsIHdoaWNoCiAgcHJvdmlkZXMgY29tcGF0aWJpbGl0eSB3aXRoIFB5WE1MIG9uIFB5dGhvbiAxLjUuMi4KCi0gSWYgdGhlIHBsYXRmb3JtIGhhcyBhIGJvZ3VzIGRlZmluaXRpb24gZm9yIExPTkdfQklUICh0aGUgbnVtYmVyIG9mCiAgYml0cyBpbiBhIGxvbmcpLCBhbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS4KCi0gRml4IGJ1Z3MgaW4gX1B5VHVwbGVfUmVzaXplKCkgd2hpY2ggY2F1c2VkIGhhcmQtdG8taW50ZXJwcmV0IGdhcmJhZ2UKICBjb2xsZWN0aW9uIGNyYXNoZXMgYW5kIHBvc3NpYmx5IG90aGVyLCB1bnJlcG9ydGVkIGNyYXNoZXMuCgotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gX1B5VW5pY29kZV9GaW5pKCkuCgpCdWlsZCBpc3N1ZXMKCi0gY29uZmlndXJlIG5vdyBhY2NlcHRzIGEgLS13aXRoLXN1ZmZpeCBvcHRpb24gdGhhdCBzcGVjaWZpZXMgdGhlCiAgZXhlY3V0YWJsZSBzdWZmaXguICBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRzIG9uIEN5Z3dpbiBhbmQgTWFjIE9TCiAgWCwgZm9yIGV4YW1wbGUuCgotIFRoZSBtbWFwLlBBR0VTSVpFIGNvbnN0YW50IGlzIG5vdyBpbml0aWFsaXplZCB1c2luZyBzeXNjb25mIHdoZW4KICBwb3NzaWJsZSwgd2hpY2ggZWxpbWluYXRlcyBhIGRlcGVuZGVuY3kgb24gLWx1Y2IgZm9yIFJlbGlhbnQgVU5JWC4KCi0gVGhlIG1kNSBmaWxlIHNob3VsZCBub3cgY29tcGlsZSBvbiBhbGwgcGxhdGZvcm1zLgoKLSBUaGUgc2VsZWN0IG1vZHVsZSBub3cgY29tcGlsZXMgb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IGRlZmluZQogIFBPTExSRE5PUk0gYW5kIHJlbGF0ZWQgY29uc3RhbnRzLgoKLSBEYXJ3aW4gKE1hYyBPUyBYKTogIEluaXRpYWwgc3VwcG9ydCBmb3Igc3RhdGljIGJ1aWxkcyBvbiB0aGlzCiAgcGxhdGZvcm0uCgotIEJlT1M6IEEgbnVtYmVyIG9mIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBidWlsZCBhbmQgaW5zdGFsbGF0aW9uCiAgcHJvY2Vzcy4gIGFyLWZha2Ugbm93IG9wZXJhdGVzIG9uIGEgZGlyZWN0b3J5IG9mIG9iamVjdCBmaWxlcy4KICBkbF9leHBvcnQuaCBpcyBnb25lLCBhbmQgaXRzIG1hY3JvcyBub3cgYXBwZWFyIG9uIHRoZSBtd2NjIGNvbW1hbmQKICBsaW5lIGR1cmluZyBidWlsZCBvbiBQUEMgQmVPUy4KCi0gUGxhdGZvcm0gZGlyZWN0b3J5IGluIGxpYi9weXRob24yLjAgaXMgInBsYXQtYmVvczUiIChvcgogICJwbGF0LWJlb3M0IiwgaWYgYnVpbGRpbmcgb24gQmVPUyA0LjUpLCByYXRoZXIgdGhhbiAicGxhdC1iZW9zIi4KCi0gQ3lnd2luOiBTdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzLCBUa2ludGVyLCBhbmQgc29ja2V0cy4KCi0gU3VuT1MgNC4xLjRfSkw6IEZpeCB0ZXN0IGZvciBkaXJlY3RvcnkgZXhpc3RlbmNlIGluIGNvbmZpZ3VyZS4KClRvb2xzIGFuZCBvdGhlciBtaXNjZWxsYW55CgotIFJlbW92ZWQgZGVidWdnaW5nIHByaW50cyBmcm9tIG1haW4gdXNlZCB3aXRoIGZyZWV6ZS4KCi0gSURMRSBhdXRvLWluZGVudCBubyBsb25nZXIgY3Jhc2hlcyB3aGVuIGl0IGVuY291bnRlcnMgVW5pY29kZQogIGNoYXJhY3RlcnMuCgpXaGF0J3MgbmV3IGluIDIuMCBiZXRhIDIgKHNpbmNlIGJldGEgMSk/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gQWRkIHN1cHBvcnQgZm9yIHVuYm91bmRlZCBpbnRzIGluICVkLGksdSx4LFgsbyBmb3JtYXRzOyBmb3IgZXhhbXBsZQogICIlZCIgJSAyTCoqNjQgPT0gIjE4NDQ2NzQ0MDczNzA5NTUxNjE2Ii4KCi0gQWRkIC1oIGFuZCAtViBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBwcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQKICBQeXRob24gdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQgaW1tZWRpYXRlbHkuCgotIGV2YWwoKSBhbmQgZXhlYyBhY2NlcHQgVW5pY29kZSBvYmplY3RzIGFzIGNvZGUgcGFyYW1ldGVycy4KCi0gZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgbm93IGFsc28gYWNjZXB0IFVuaWNvZGUgb2JqZWN0cyBmb3IgdGhlCiAgYXR0cmlidXRlIG5hbWUsIHdoaWNoIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdAogIGVuY29kaW5nIGJlZm9yZSBsb29rdXAuCgotIE11bHRpcGxpY2F0aW9uIG9uIHN0cmluZyBhbmQgVW5pY29kZSBub3cgZG9lcyBwcm9wZXIgYm91bmRzCiAgY2hlY2tpbmc7IGUuZy4gJ2EnICogNjU1MzYgKiA2NTUzNiB3aWxsIHJhaXNlIFZhbHVlRXJyb3IsICJyZXBlYXRlZAogIHN0cmluZyBpcyB0b28gbG9uZy4iCgotIEJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gY29udGludWUgaXMgZm91bmQgaW4gdHJ5IHN0YXRlbWVudCBpbiBhCiAgbG9vcC4KCgpTdGFuZGFyZCBsaWJyYXJ5IGFuZCBleHRlbnNpb25zCgotIHNvY2tldCBtb2R1bGU6IHRoZSBPcGVuU1NMIGNvZGUgbm93IGFkZHMgc3VwcG9ydCBmb3IgUkFORF9zdGF0dXMoKQogIGFuZCBFR0QgKEVudHJvcHkgR2F0aGVyaW5nIERldmljZSkuCgotIGFycmF5OiByZXZlcnNlKCkgbWV0aG9kIG9mIGFycmF5IG5vdyB3b3Jrcy4gIGJ1ZmZlcl9pbmZvKCkgbm93IGRvZXMKICBhcmd1bWVudCBjaGVja2luZzsgaXQgc3RpbGwgdGFrZXMgbm8gYXJndW1lbnRzLgoKLSBhc3luY29yZS9hc3luY2hhdDogSW5jbHVkZWQgbW9zdCByZWNlbnQgdmVyc2lvbiBmcm9tIFNhbSBSdXNoaW5nLgoKLSBjZ2k6IEFjY2VwdCAnJicgb3IgJzsnIGFzIHNlcGFyYXRvciBjaGFyYWN0ZXJzIHdoZW4gcGFyc2luZyBmb3JtIGRhdGEuCgotIENHSUhUVFBTZXJ2ZXI6IE5vdyB3b3JrcyBvbiBXaW5kb3dzIChhbmQgcGVyaGFwcyBldmVuIE1hYykuCgotIENvbmZpZ1BhcnNlcjogV2hlbiByZWFkaW5nIHRoZSBmaWxlLCBvcHRpb25zIHNwZWxsZWQgaW4gdXBwZXIgY2FzZQogIGxldHRlcnMgYXJlIG5vdyBjb3JyZWN0bHkgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KCi0gY29weTogQ29weSBVbmljb2RlIG9iamVjdHMgYXRvbWljYWxseS4KCi0gY1BpY2tsZTogRmFpbCBncmFjZWZ1bGx5IHdoZW4gY29weV9yZWcgY2FuJ3QgYmUgaW1wb3J0ZWQuCgotIGNTdHJpbmdJTzogSW1wbGVtZW50ZWQgcmVhZGxpbmVzKCkgbWV0aG9kLgoKLSBkYm06IEFkZCBnZXQoKSBhbmQgc2V0ZGVmYXVsdCgpIG1ldGhvZHMgdG8gZGJtIG9iamVjdC4gIEFkZCBjb25zdGFudAogIGBsaWJyYXJ5JyB0byBtb2R1bGUgdGhhdCBuYW1lcyB0aGUgbGlicmFyeSB1c2VkLiAgQWRkZWQgZG9jIHN0cmluZ3MKICBhbmQgbWV0aG9kIG5hbWVzIHRvIGVycm9yIG1lc3NhZ2VzLiAgVXNlcyBjb25maWd1cmUgdG8gZGV0ZXJtaW5lCiAgd2hpY2ggbmRibS5oIGZpbGUgdG8gaW5jbHVkZTsgQmVya2VsZXkgREIncyBuYmRtIGFuZCBHREJNJ3MgbmRibSBpcwogIG5vdyBhdmFpbGFibGUgb3B0aW9ucy4KCi0gZGlzdHV0aWxzOiBVcGRhdGUgdG8gdmVyc2lvbiAwLjkuMy4KCi0gZGw6IEFkZCBzZXZlcmFsIGRsLlJUTERfIGNvbnN0YW50cy4KCi0gZnBlY3RsOiBOb3cgc3VwcG9ydGVkIG9uIEZyZWVCU0QuCgotIGdjOiBBZGQgREVCVUdfU0FWRUFMTCBvcHRpb24uICBXaGVuIGVuYWJsZWQgYWxsIGdhcmJhZ2Ugb2JqZWN0cwogIGZvdW5kIGJ5IHRoZSBjb2xsZWN0b3Igd2lsbCBiZSBzYXZlZCBpbiBnYy5nYXJiYWdlLiAgVGhpcyBpcyB1c2VmdWwKICBmb3IgZGVidWdnaW5nIGEgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMgcmVmZXJlbmNlIGN5Y2xlcy4KCi0gaHR0cGxpYjogVGhyZWUgY2hhbmdlczogUmVzdG9yZSBzdXBwb3J0IGZvciBzZXRfZGVidWdsZXZlbCBmZWF0dXJlCiAgb2YgSFRUUCBjbGFzcy4gIERvIG5vdCBjbG9zZSBzb2NrZXQgb24gemVyby1sZW5ndGggcmVzcG9uc2UuICBEbyBub3QKICBjcmFzaCB3aGVuIHNlcnZlciBzZW5kcyBpbnZhbGlkIGNvbnRlbnQtbGVuZ3RoIGhlYWRlci4KCi0gbWFpbGJveDogTWFpbGJveCBjbGFzcyBjb25mb3JtcyBiZXR0ZXIgdG8gcW1haWwgc3BlY2lmaWNhdGlvbnMuCgotIG1hcnNoYWw6IFdoZW4gcmVhZGluZyBhIHNob3J0LCBzaWduLWV4dGVuZCBvbiBwbGF0Zm9ybXMgd2hlcmUgc2hvcnRzCiAgYXJlIGJpZ2dlciB0aGFuIDE2IGJpdHMuICBXaGVuIHJlYWRpbmcgYSBsb25nLCByZXBhaXIgdGhlIHVucG9ydGFibGUKICBzaWduIGV4dGVuc2lvbiB0aGF0IHdhcyBiZWluZyBkb25lIGZvciA2NC1iaXQgbWFjaGluZXMuICAoSXQgYXNzdW1lZAogIHRoYXQgc2lnbmVkIHJpZ2h0IHNoaWZ0IHNpZ24tZXh0ZW5kcy4pCgotIG9wZXJhdG9yOiBBZGQgY29udGFpbnMoKSwgaW52ZXJ0KCksIF9faW52ZXJ0X18oKSBhcyBhbGlhc2VzIGZvcgogIF9fY29udGFpbnNfXygpLCBpbnYoKSwgYW5kIF9faW52X18oKSByZXNwZWN0aXZlbHkuCgotIG9zOiBBZGQgc3VwcG9ydCBmb3IgcG9wZW4yKCkgYW5kIHBvcGVuMygpIG9uIGFsbCBwbGF0Zm9ybXMgd2hlcmUKICBmb3JrKCkgZXhpc3RzLiAgKHBvcGVuNCgpIGlzIHN0aWxsIGluIHRoZSB3b3Jrcy4pCgotIG9zOiAoV2luZG93cyBvbmx5OikgQWRkIHN0YXJ0ZmlsZSgpIGZ1bmN0aW9uIHRoYXQgYWN0cyBsaWtlIGRvdWJsZS0KICBjbGlja2luZyBvbiBhIGZpbGUgaW4gRXhwbG9yZXIgKG9yIHBhc3NpbmcgdGhlIGZpbGUgbmFtZSB0byB0aGUKICBET1MgInN0YXJ0IiBjb21tYW5kKS4KCi0gb3MucGF0aDogKFdpbmRvd3MsIERPUzopIFRyZWF0IHRyYWlsaW5nIGNvbG9uIGNvcnJlY3RseSBpbgogIG9zLnBhdGguam9pbi4gIG9zLnBhdGguam9pbigiYToiLCAiYiIpIHlpZWxkcyAiYTpiIi4KCi0gcGlja2xlOiBOb3cgcmFpc2VzIFZhbHVlRXJyb3Igd2hlbiBhbiBpbnZhbGlkIHBpY2tsZSB0aGF0IGNvbnRhaW5zCiAgYSBub24tc3RyaW5nIHJlcHIgd2hlcmUgYSBzdHJpbmcgcmVwciB3YXMgZXhwZWN0ZWQuICBUaGlzIGJlaGF2aW9yCiAgbWF0Y2hlcyBjUGlja2xlLgoKLSBwb3NpeGZpbGU6IFJlbW92ZSBicm9rZW4gX19kZWxfXygpIG1ldGhvZC4KCi0gcHlfY29tcGlsZTogc3VwcG9ydCBDUitMRiBsaW5lIHRlcm1pbmF0b3JzIGluIHNvdXJjZSBmaWxlLgoKLSByZWFkbGluZTogRG9lcyBub3QgaW1tZWRpYXRlbHkgZXhpdCB3aGVuIF5DIGlzIGhpdCB3aGVuIHJlYWRsaW5lIGFuZAogIHRocmVhZHMgYXJlIGNvbmZpZ3VyZWQuICBBZGRzIGRlZmluaXRpb24gb2YgcmxfbGlicmFyeV92ZXJzaW9uLiAgKFRoZQogIGxhdHRlciBhZGRpdGlvbiByZXF1aXJlcyBHTlUgcmVhZGxpbmUgMi4yIG9yIGxhdGVyLikKCi0gcmZjODIyOiBEb21haW4gbGl0ZXJhbHMgcmV0dXJuZWQgYnkgQWRkcmxpc3RDbGFzcyBtZXRob2QKICBnZXRkb21haW5saXRlcmFsKCkgYXJlIG5vdyBwcm9wZXJseSB3cmFwcGVkIGluIGJyYWNrZXRzLgoKLSBzaXRlOiBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGNhc2UgdGhlCiAgc3RhbmRhcmQgZGVmYXVsdCBlbmNvZGluZyAoImFzY2lpIikgaXMgY2hhbmdlZC4gVGhpcyBzYXZlcyBxdWl0ZSBhCiAgZmV3IGN5Y2xlcyBkdXJpbmcgc3RhcnR1cCBzaW5jZSB0aGUgZmlyc3QgY2FsbCB0bwogIHNldGRlZmF1bHRlbmNvZGluZygpIHdpbGwgaW5pdGlhbGl6ZSB0aGUgY29kZWMgcmVnaXN0cnkgYW5kIHRoZQogIGVuY29kaW5ncyBwYWNrYWdlLgoKLSBzb2NrZXQ6IFN1cHBvcnQgZm9yIHNpemUgaGludCBpbiByZWFkbGluZXMoKSBtZXRob2Qgb2Ygb2JqZWN0IHJldHVybmVkCiAgYnkgbWFrZWZpbGUoKS4KCi0gc3JlOiBBZGRlZCBleHBlcmltZW50YWwgZXhwYW5kKCkgbWV0aG9kIHRvIG1hdGNoIG9iamVjdHMuICBEb2VzIG5vdAogIHVzZSBidWZmZXIgaW50ZXJmYWNlIG9uIFVuaWNvZGUgc3RyaW5ncy4gIERvZXMgbm90IGhhbmcgaWYgZ3JvdXAgaWQKICBpcyBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLgoKLSBTdHJpbmdJTzogU2l6ZSBoaW50IGluIHJlYWRsaW5lcygpIGlzIG5vdyBzdXBwb3J0ZWQgYXMgZG9jdW1lbnRlZC4KCi0gc3RydWN0OiBDaGVjayByYW5nZXMgZm9yIGJ5dGVzIGFuZCBzaG9ydHMuCgotIHVybGxpYjogSW1wcm92ZWQgaGFuZGxpbmcgb2Ygd2luMzIgcHJveHkgc2V0dGluZ3MuIEZpeGVkIHF1b3RlIGFuZAogIHF1b3RlX3BsdXMgZnVuY3Rpb25zIHNvIHRoYXQgdGhlIGFsd2F5cyBlbmNvZGUgYSBjb21tYS4KCi0gVGtpbnRlcjogSW1hZ2Ugb2JqZWN0cyBhcmUgbm93IGd1YXJhbnRlZWQgdG8gaGF2ZSB1bmlxdWUgaWRzLiAgU2V0CiAgZXZlbnQuZGVsdGEgdG8gemVybyBpZiBUayB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBtb3VzZXdoZWVsLgogIFJlbW92ZWQgc29tZSBkZWJ1Z2dpbmcgcHJpbnRzLgoKLSBVc2VyTGlzdDogbm93IGltcGxlbWVudHMgX19jb250YWluc19fKCkuCgotIHdlYmJyb3dzZXI6IE9uIFdpbmRvd3MsIHVzZSBvcy5zdGFydGZpbGUoKSBpbnN0ZWFkIG9mIG9zLnBvcGVuKCksCiAgd2hpY2ggd29ya3MgYXJvdW5kIGEgYnVnIGluIE5vcnRvbiBBbnRpVmlydXMgMjAwMCB0aGF0IGxlYWRzIGRpcmVjdGx5CiAgdG8gYSBCbHVlIFNjcmVlbiBmcmVlemUuCgotIHhtbDogTmV3IHZlcnNpb24gZGV0ZWN0aW9uIGNvZGUgYWxsb3dzIFB5WE1MIHRvIG92ZXJyaWRlIHN0YW5kYXJkCiAgWE1MIHBhY2thZ2UgaWYgUHlYTUwgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gMC42LjEuCgotIHhtbC5kb206IERPTSBsZXZlbCAxIHN1cHBvcnQgZm9yIGJhc2ljIFhNTC4gIEluY2x1ZGVzIHhtbC5kb20ubWluaWRvbQogIChjb252ZW50aW9uYWwgRE9NKSwgYW5kIHhtbC5kb20ucHVsbGRvbSwgd2hpY2ggYWxsb3dzIGJ1aWxkaW5nIHRoZSBET00KICB0cmVlIG9ubHkgZm9yIG5vZGVzIHdoaWNoIGFyZSBzdWZmaWNpZW50bHkgaW50ZXJlc3RpbmcgdG8gYSBzcGVjaWZpYwogIGFwcGxpY2F0aW9uLiAgRG9lcyBub3QgcHJvdmlkZSB0aGUgSFRNTC1zcGVjaWZpYyBleHRlbnNpb25zLiAgU3RpbGwKICB1bmRvY3VtZW50ZWQuCgotIHhtbC5zYXg6IFNBWCAyIHN1cHBvcnQgZm9yIFB5dGhvbiwgaW5jbHVkaW5nIGFsbCB0aGUgaGFuZGxlcgogIGludGVyZmFjZXMgbmVlZGVkIHRvIHByb2Nlc3MgWE1MIDEuMCBjb21wbGlhbnQgWE1MLiAgU29tZQogIGRvY3VtZW50YXRpb24gaXMgYWxyZWFkeSBhdmFpbGFibGUuCgotIHB5ZXhwYXQ6IFJlbmFtZWQgdG8geG1sLnBhcnNlcnMuZXhwYXQgc2luY2UgdGhpcyBpcyBwYXJ0IG9mIHRoZSBuZXcsCiAgcGFja2FnaXplZCBYTUwgc3VwcG9ydC4KCgpDIEFQSQoKLSBBZGQgdGhyZWUgbmV3IGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgbW9kdWxlIGluaXRpYWxpemF0aW9uIC0tCiAgUHlNb2R1bGVfQWRkT2JqZWN0KCksIFB5TW9kdWxlX0FkZEludENvbnN0YW50KCksIGFuZAogIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KCkuCgotIENsZWFuZWQgdXAgZGVmaW5pdGlvbiBvZiBOVUxMIGluIEMgc291cmNlIGNvZGU7IGFsbCBkZWZpbml0aW9ucyB3ZXJlCiAgcmVtb3ZlZCBhbmQgYWRkICNlcnJvciB0byBQeXRob24uaCBpZiBOVUxMIGlzbid0IGRlZmluZWQgYWZ0ZXIKICAjaW5jbHVkZSBvZiBzdGRpby5oLgoKLSBQeV9QUk9UTygpIG1hY3JvcyB0aGF0IHdlcmUgcmVtb3ZlZCBpbiAyLjBiMSBoYXZlIGJlZW4gcmVzdG9yZWQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGF0IHRoZSBzb3VyY2UgbGV2ZWwpIHdpdGggb2xkIGV4dGVuc2lvbnMuCgotIEEgd3JhcHBlciBBUEkgd2FzIGFkZGVkIGZvciBzaWduYWwoKSBhbmQgc2lnYWN0aW9uKCkuICBJbnN0ZWFkIG9mCiAgZWl0aGVyIGZ1bmN0aW9uLCBhbHdheXMgdXNlIFB5T1NfZ2V0c2lnKCkgdG8gZ2V0IGEgc2lnbmFsIGhhbmRsZXIKICBhbmQgUHlPU19zZXRzaWcoKSB0byBzZXQgb25lLiAgQSBuZXcgY29udmVuaWVuY2UgdHlwZWRlZgogIFB5T1Nfc2lnaGFuZGxlcl90IGlzIGRlZmluZWQgZm9yIHRoZSB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4KCi0gQWRkIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSgpIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQogIGludGVybmFsIGRhdGEgYnVmZmVyIGFuZCBzaXplIG9mIGEgc3RyaW5nIG9iamVjdCAtLSBvciB0aGUgZGVmYXVsdAogIGVuY29kZWQgdmVyc2lvbiBvZiBhIFVuaWNvZGUgb2JqZWN0LgoKLSBQeVN0cmluZ19TaXplKCkgYW5kIFB5U3RyaW5nX0FzU3RyaW5nKCkgYWNjZXB0IFVuaWNvZGUgb2JqZWN0cy4KCi0gVGhlIHN0YW5kYXJkIGhlYWRlciA8bGltaXRzLmg+IGlzIG5vdyBpbmNsdWRlZCBieSBQeXRob24uaCAoaWYgaXQKICBleGlzdHMpLiAgSU5UX01BWCBhbmQgTE9OR19NQVggd2lsbCBhbHdheXMgYmUgZGVmaW5lZCwgZXZlbiBpZgogIDxsaW1pdHMuaD4gaXMgbm90IGF2YWlsYWJsZS4KCi0gUHlGbG9hdF9Gcm9tU3RyaW5nIHRha2VzIGEgc2Vjb25kIGFyZ3VtZW50LCBwZW5kLCB0aGF0IHdhcwogIGVmZmVjdGl2ZWx5IHVzZWxlc3MuICBJdCBpcyBub3cgb2ZmaWNpYWxseSB1c2VsZXNzIGJ1dCBwcmVzZXJ2ZWQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBJZiB0aGUgcGVuZCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKnBlbmQgaXMKICBzZXQgdG8gTlVMTC4KCi0gUHlPYmplY3RfR2V0QXR0cigpIGFuZCBQeU9iamVjdF9TZXRBdHRyKCkgbm93IGFjY2VwdCBVbmljb2RlIG9iamVjdHMKICBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lLiAgU2VlIG5vdGUgb24gZ2V0YXR0cigpIGFib3ZlLgoKLSBBIGZldyBidWcgZml4ZXMgdG8gYXJndW1lbnQgcHJvY2Vzc2luZyBmb3IgVW5pY29kZS4KICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSBub3cgYWNjZXB0cyAiZXMjIiBhbmQgImVzIi4KICBQeUFyZ19QYXJzZSgpIHNwZWNpYWwgY2FzZXMgInMjIiBmb3IgVW5pY29kZSBvYmplY3RzOyBpdCByZXR1cm5zIGEKICBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGVuY29kZWQgc3RyaW5nIGRhdGEgaW5zdGVhZCBvZiB0byB0aGUgcmF3CiAgVVRGLTE2LgoKLSBQeV9CdWlsZFZhbHVlIGFjY2VwdHMgQiBmb3JtYXQgKGZvciBiZ2VuLWdlbmVyYXRlZCBjb2RlKS4KCgpJbnRlcm5hbHMKCi0gT24gVW5peCwgZml4IGNvZGUgZm9yIGZpbmRpbmcgUHl0aG9uIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgc28gdGhhdAogIGl0IHdvcmtzIHdoZW4gYXJndlswXSBpcyBhIHJlbGF0aXZlIHBhdGguCgotIEFkZGVkIGEgdHJ1ZSB1bmljb2RlX2ludGVybmFsX2VuY29kZSgpIGZ1bmN0aW9uIGFuZCBmaXhlZCB0aGUKICB1bmljb2RlX2ludGVybmFsX2RlY29kZSBmdW5jdGlvbigpIHRvIHN1cHBvcnQgVW5pY29kZSBvYmplY3RzIGRpcmVjdGx5CiAgcmF0aGVyIHRoYW4gYnkgZ2VuZXJhdGluZyBhIGNvcHkgb2YgdGhlIG9iamVjdC4KCi0gU2V2ZXJhbCBvZiB0aGUgaW50ZXJuYWwgVW5pY29kZSB0YWJsZXMgYXJlIG11Y2ggc21hbGxlciBub3csIGFuZAogIHRoZSBzb3VyY2UgY29kZSBzaG91bGQgYmUgbXVjaCBmcmllbmRsaWVyIHRvIHdlYWtlciBjb21waWxlcnMuCgotIEluIHRoZSBnYXJiYWdlIGNvbGxlY3RvcjogRml4ZWQgYnVnIGluIGNvbGxlY3Rpb24gb2YgdHVwbGVzLiAgRml4ZWQKICBidWcgdGhhdCBjYXVzZWQgc29tZSBpbnN0YW5jZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb250YWluZXIgc2V0CiAgd2hpbGUgdGhleSB3ZXJlIHN0aWxsIGxpdmUuICBGaXhlZCBwYXJzaW5nIGluIGdjLnNldF9kZWJ1ZygpIGZvcgogIHBsYXRmb3JtcyB3aGVyZSBzaXplb2YobG9uZykgPiBzaXplb2YoaW50KS4KCi0gRml4ZWQgcmVmY291bnQgcHJvYmxlbSBpbiBpbnN0YW5jZSBkZWFsbG9jYXRpb24gdGhhdCBvbmx5IG9jY3VycmVkCiAgd2hlbiBQeV9SRUZfREVCVUcgd2FzIGRlZmluZWQgYW5kIFB5X1RSQUNFX1JFRlMgd2FzIG5vdC4KCi0gT24gV2luZG93cywgZ2V0cHl0aG9ucmVncGF0aCBpcyBub3cgcHJvdGVjdGVkIGFnYWluc3QgbnVsbCBkYXRhIGluCiAgcmVnaXN0cnkga2V5LgoKLSBPbiBVbml4LCBjcmVhdGUgLnB5Yy8ucHlvIGZpbGVzIHdpdGggT19FWENMIGZsYWcgdG8gYXZvaWQgYSByYWNlCiAgY29uZGl0aW9uLgoKCkJ1aWxkIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYyBpc3N1ZXMKCi0gQmV0dGVyIHN1cHBvcnQgb2YgR05VIFB0aCB2aWEgLS13aXRoLXB0aCBjb25maWd1cmUgb3B0aW9uLgoKLSBQeXRob24vQyBBUEkgbm93IHByb3Blcmx5IGV4cG9zZWQgdG8gZHluYW1pY2FsbHktbG9hZGVkIGV4dGVuc2lvbgogIG1vZHVsZXMgb24gUmVsaWFudCBVTklYLgoKLSBDaGFuZ2VzIGZvciB0aGUgYmVuZWZpdCBvZiBTdW5PUyA0LjEuNCAocmVhbGx5ISkuICBtbWFwbW9kdWxlLmM6CiAgRG9uJ3QgZGVmaW5lIE1TX1NZTkMgdG8gYmUgemVybyB3aGVuIGl0IGlzIHVuZGVmaW5lZC4gIEFkZGVkIG1pc3NpbmcKICBwcm90b3R5cGVzIGluIHBvc2l4bW9kdWxlLmMuCgotIEltcHJvdmVkIHN1cHBvcnQgZm9yIEhQLVVYIGJ1aWxkLiAgVGhyZWFkcyBzaG91bGQgbm93IGJlIGNvcnJlY3RseQogIGNvbmZpZ3VyZWQgKG9uIEhQLVVYIDEwLjIwIGFuZCAxMS4wMCkuCgotIEZpeCBsYXJnZWZpbGUgc3VwcG9ydCBvbiBvbGRlciBOZXRCU0Qgc3lzdGVtcyBhbmQgT3BlbkJTRCBieSBhZGRpbmcKICBkZWZpbmUgZm9yIFRFTEw2NC4KCgpUb29scyBhbmQgb3RoZXIgbWlzY2VsbGFueQoKLSBmdHBtaXJyb3I6IENhbGwgdG8gbWFpbigpIGlzIHdyYXBwZWQgaW4gaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIi4KCi0gZnJlZXplOiBUaGUgbW9kdWxlZmluZGVyIG5vdyB3b3JrcyB3aXRoIDIuMCBvcGNvZGVzLgoKLSBJRExFOgogIE1vdmUgaGFja2VyeSBvZiBzeXMuYXJndiB1bnRpbCBhZnRlciB0aGUgVGsgaW5zdGFuY2UgaGFzIGJlZW4KICBjcmVhdGVkLCB3aGljaCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIFRraW50ZXIKICBpbml0aWFsaXphdGlvbiB0byBiZSBleGVjdXRlZCBpZiBwcmVzZW50OyBhbHNvIHBhc3MgYW4gZXhwbGljaXQKICBjbGFzc05hbWUgcGFyYW1ldGVyIHRvIHRoZSBUaygpIGNvbnN0cnVjdG9yLgoKCldoYXQncyBuZXcgaW4gMi4wIGJldGEgMT8KPT09PT09PT09PT09PT09PT09PT09PT09PQoKU291cmNlIEluY29tcGF0aWJpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTm9uZS4gIE5vdGUgdGhhdCAxLjYgaW50cm9kdWNlZCBzZXZlcmFsIGluY29tcGF0aWJpbGl0aWVzIHdpdGggMS41LjIsCnN1Y2ggYXMgc2luZ2xlLWFyZ3VtZW50IGFwcGVuZCgpLCBjb25uZWN0KCkgYW5kIGJpbmQoKSwgYW5kIGNoYW5nZXMgdG8Kc3RyKGxvbmcpIGFuZCByZXByKGZsb2F0KS4KCgpCaW5hcnkgSW5jb21wYXRpYmlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIFRoaXJkIHBhcnR5IGV4dGVuc2lvbnMgYnVpbHQgZm9yIFB5dGhvbiAxLjUueCBvciAxLjYgY2Fubm90IGJlIHVzZWQKd2l0aCBQeXRob24gMi4wOyB0aGVzZSBleHRlbnNpb25zIHdpbGwgaGF2ZSB0byBiZSByZWJ1aWx0IGZvciBQeXRob24KMi4wLgoKLSBPbiBXaW5kb3dzLCBhdHRlbXB0aW5nIHRvIGltcG9ydCBhIHRoaXJkIHBhcnR5IGV4dGVuc2lvbiBidWlsdCBmb3IKUHl0aG9uIDEuNS54IG9yIDEuNiByZXN1bHRzIGluIGFuIGltbWVkaWF0ZSBjcmFzaDsgdGhlcmUncyBub3QgbXVjaCB3ZQpjYW4gZG8gYWJvdXQgdGhpcy4gIENoZWNrIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCi0gUHl0aG9uIGJ5dGVjb2RlIGZpbGVzICgqLnB5YyBhbmQgKi5weW8pIGFyZSBub3QgY29tcGF0aWJsZSBiZXR3ZWVuCnJlbGVhc2VzLgoKCk92ZXJ2aWV3IG9mIENoYW5nZXMgU2luY2UgMS42Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVyZSBhcmUgbWFueSBuZXcgbW9kdWxlcyAoaW5jbHVkaW5nIGJyYW5kIG5ldyBYTUwgc3VwcG9ydCB0aHJvdWdoCnRoZSB4bWwgcGFja2FnZSwgYW5kIGkxOG4gc3VwcG9ydCB0aHJvdWdoIHRoZSBnZXR0ZXh0IG1vZHVsZSk7IGEgbGlzdApvZiBhbGwgbmV3IG1vZHVsZXMgaXMgaW5jbHVkZWQgYmVsb3cuICBMb3RzIG9mIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkLgoKVGhlIHByb2Nlc3MgZm9yIG1ha2luZyBtYWpvciBuZXcgY2hhbmdlcyB0byB0aGUgbGFuZ3VhZ2UgaGFzIGNoYW5nZWQKc2luY2UgUHl0aG9uIDEuNi4gIEVuaGFuY2VtZW50cyBtdXN0IG5vdyBiZSBkb2N1bWVudGVkIGJ5IGEgUHl0aG9uCkVuaGFuY2VtZW50IFByb3Bvc2FsIChQRVApIGJlZm9yZSB0aGV5IGNhbiBiZSBhY2NlcHRlZC4KClRoZXJlIGFyZSBzZXZlcmFsIGltcG9ydGFudCBzeW50YXggZW5oYW5jZW1lbnRzLCBkZXNjcmliZWQgaW4gbW9yZQpkZXRhaWwgYmVsb3c6CgogIC0gQXVnbWVudGVkIGFzc2lnbm1lbnQsIGUuZy4geCArPSAxCgogIC0gTGlzdCBjb21wcmVoZW5zaW9ucywgZS5nLiBbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldCgogIC0gRXh0ZW5kZWQgaW1wb3J0IHN0YXRlbWVudCwgZS5nLiBpbXBvcnQgTW9kdWxlIGFzIE5hbWUKCiAgLSBFeHRlbmRlZCBwcmludCBzdGF0ZW1lbnQsIGUuZy4gcHJpbnQgPj4gZmlsZSwgIkhlbGxvIgoKT3RoZXIgaW1wb3J0YW50IGNoYW5nZXM6CgogIC0gT3B0aW9uYWwgY29sbGVjdGlvbiBvZiBjeWNsaWNhbCBnYXJiYWdlCgpQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpQRVAgc3RhbmRzIGZvciBQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWwuICBBIFBFUCBpcyBhIGRlc2lnbgpkb2N1bWVudCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdGhlIFB5dGhvbiBjb21tdW5pdHksIG9yIGRlc2NyaWJpbmcKYSBuZXcgZmVhdHVyZSBmb3IgUHl0aG9uLiAgVGhlIFBFUCBzaG91bGQgcHJvdmlkZSBhIGNvbmNpc2UgdGVjaG5pY2FsCnNwZWNpZmljYXRpb24gb2YgdGhlIGZlYXR1cmUgYW5kIGEgcmF0aW9uYWxlIGZvciB0aGUgZmVhdHVyZS4KCldlIGludGVuZCBQRVBzIHRvIGJlIHRoZSBwcmltYXJ5IG1lY2hhbmlzbXMgZm9yIHByb3Bvc2luZyBuZXcKZmVhdHVyZXMsIGZvciBjb2xsZWN0aW5nIGNvbW11bml0eSBpbnB1dCBvbiBhbiBpc3N1ZSwgYW5kIGZvcgpkb2N1bWVudGluZyB0aGUgZGVzaWduIGRlY2lzaW9ucyB0aGF0IGhhdmUgZ29uZSBpbnRvIFB5dGhvbi4gIFRoZSBQRVAKYXV0aG9yIGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyBjb25zZW5zdXMgd2l0aGluIHRoZSBjb21tdW5pdHkgYW5kCmRvY3VtZW50aW5nIGRpc3NlbnRpbmcgb3BpbmlvbnMuCgpUaGUgUEVQcyBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly9weXRob24uc291cmNlZm9yZ2UubmV0L3BlcHMvLgoKQXVnbWVudGVkIEFzc2lnbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgbXVzdCBoYXZlIGJlZW4gdGhlIG1vc3QtcmVxdWVzdGVkIGZlYXR1cmUgb2YgdGhlIHBhc3QgeWVhcnMhCkVsZXZlbiBuZXcgYXNzaWdubWVudCBvcGVyYXRvcnMgd2VyZSBhZGRlZDoKCiAgICArPSAtPSAqPSAvPSAlPSAqKj0gPDw9ID4+PSAmPSBePSB8PQoKRm9yIGV4YW1wbGUsCgogICAgQSArPSBCCgppcyBzaW1pbGFyIHRvCgogICAgQSA9IEEgKyBCCgpleGNlcHQgdGhhdCBBIGlzIGV2YWx1YXRlZCBvbmx5IG9uY2UgKHJlbGV2YW50IHdoZW4gQSBpcyBzb21ldGhpbmcKbGlrZSBkaWN0W2luZGV4XS5hdHRyKS4KCkhvd2V2ZXIsIGlmIEEgaXMgYSBtdXRhYmxlIG9iamVjdCwgQSBtYXkgYmUgbW9kaWZpZWQgaW4gcGxhY2UuICBUaHVzLAppZiBBIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLCBBICs9IEIgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBBID0gQStCCihleGNlcHQgQSBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlKTsgYnV0IGlmIGEgaXMgYSBsaXN0LCBBICs9IEIgaGFzIHRoZQpzYW1lIGVmZmVjdCBhcyBBLmV4dGVuZChCKSEKCkNsYXNzZXMgYW5kIGJ1aWx0LWluIG9iamVjdCB0eXBlcyBjYW4gb3ZlcnJpZGUgdGhlIG5ldyBvcGVyYXRvcnMgaW4Kb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBpbi1wbGFjZSBiZWhhdmlvcjsgdGhlIG5vdC1pbi1wbGFjZSBiZWhhdmlvciBpcwp1c2VkIGF1dG9tYXRpY2FsbHkgYXMgYSBmYWxsYmFjayB3aGVuIGFuIG9iamVjdCBkb2Vzbid0IGltcGxlbWVudCB0aGUKaW4tcGxhY2UgYmVoYXZpb3IuICBGb3IgY2xhc3NlcywgdGhlIG1ldGhvZCBuYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUKbWV0aG9kIG5hbWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG5vdC1pbi1wbGFjZSBvcGVyYXRvciBieSBpbnNlcnRpbmcKYW4gJ2knIGluIGZyb250IG9mIHRoZSBuYW1lLCBlLmcuIF9faWFkZF9fIGltcGxlbWVudHMgaW4tcGxhY2UKX19hZGRfXy4KCkF1Z21lbnRlZCBhc3NpZ25tZW50IHdhcyBpbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4KCgpMaXN0IENvbXByZWhlbnNpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgaXMgYSBmbGV4aWJsZSBuZXcgbm90YXRpb24gZm9yIGxpc3RzIHdob3NlIGVsZW1lbnRzIGFyZSBjb21wdXRlZApmcm9tIGFub3RoZXIgbGlzdCAob3IgbGlzdHMpLiAgVGhlIHNpbXBsZXN0IGZvcm0gaXM6CgogICAgWzxleHByZXNzaW9uPiBmb3IgPHZhcmlhYmxlPiBpbiA8c2VxdWVuY2U+XQoKRm9yIGV4YW1wbGUsIFtpKioyIGZvciBpIGluIHJhbmdlKDQpXSB5aWVsZHMgdGhlIGxpc3QgWzAsIDEsIDQsIDldLgpUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gYSBmb3IgbG9vcCB3aXRoIGEgbGlzdC5hcHBlbmQoKSBjYWxsLgoKWW91IGNhbiBhbHNvIGFkZCBhIGNvbmRpdGlvbjoKCiAgICBbPGV4cHJlc3Npb24+IGZvciA8dmFyaWFibGU+IGluIDxzZXF1ZW5jZT4gaWYgPGNvbmRpdGlvbj5dCgpGb3IgZXhhbXBsZSwgW3cgZm9yIHcgaW4gd29yZHMgaWYgdyA9PSB3Lmxvd2VyKCldIHdvdWxkIHlpZWxkIHRoZSBsaXN0Cm9mIHdvcmRzIHRoYXQgY29udGFpbiBubyB1cHBlcmNhc2UgY2hhcmFjdGVycy4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQKdGhhbiBhIGZvciBsb29wIHdpdGggYW4gaWYgc3RhdGVtZW50IGFuZCBhIGxpc3QuYXBwZW5kKCkgY2FsbC4KCllvdSBjYW4gYWxzbyBoYXZlIG5lc3RlZCBmb3IgbG9vcHMgYW5kIG1vcmUgdGhhbiBvbmUgJ2lmJyBjbGF1c2UuICBGb3IKZXhhbXBsZSwgaGVyZSdzIGEgZnVuY3Rpb24gdGhhdCBmbGF0dGVucyBhIHNlcXVlbmNlIG9mIHNlcXVlbmNlczo6CgogICAgZGVmIGZsYXR0ZW4oc2VxKToKICAgICAgICByZXR1cm4gW3ggZm9yIHN1YnNlcSBpbiBzZXEgZm9yIHggaW4gc3Vic2VxXQoKICAgIGZsYXR0ZW4oW1swXSwgWzEsMiwzXSwgWzQsNV0sIFs2LDcsOCw5XSwgW11dKQoKVGhpcyBwcmludHMKCiAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KCkxpc3QgY29tcHJlaGVuc2lvbnMgb3JpZ2luYXRlZCBhcyBhIHBhdGNoIHNldCBmcm9tIEdyZWcgRXdpbmc7IFNraXAKTW9udGFuYXJvIGFuZCBUaG9tYXMgV291dGVycyBhbHNvIGNvbnRyaWJ1dGVkLiAgRGVzY3JpYmVkIGJ5IFBFUCAyMDIuCgoKRXh0ZW5kZWQgSW1wb3J0IFN0YXRlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNYW55IHBlb3BsZSBoYXZlIGFza2VkIGZvciBhIHdheSB0byBpbXBvcnQgYSBtb2R1bGUgdW5kZXIgYSBkaWZmZXJlbnQKbmFtZS4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBsaWtlIHRoaXM6CgogICAgaW1wb3J0IGZvbwogICAgYmFyID0gZm9vCiAgICBkZWwgZm9vCgpidXQgdGhpcyBjb21tb24gaWRpb20gZ2V0cyBvbGQgcXVpY2tseS4gIEEgc2ltcGxlIGV4dGVuc2lvbiBvZiB0aGUKaW1wb3J0IHN0YXRlbWVudCBub3cgYWxsb3dzIHRoaXMgdG8gYmUgd3JpdHRlbiBhcyBmb2xsb3dzOgoKICAgIGltcG9ydCBmb28gYXMgYmFyCgpUaGVyZSdzIGFsc28gYSB2YXJpYW50IGZvciAnZnJvbSAuLi4gaW1wb3J0JzoKCiAgICBmcm9tIGZvbyBpbXBvcnQgYmFyIGFzIHNwYW0KClRoaXMgYWxzbyB3b3JrcyB3aXRoIHBhY2thZ2VzOyBlLmcuIHlvdSBjYW4gd3JpdGUgdGhpczoKCiAgICBpbXBvcnQgdGVzdC5yZWdydGVzdCBhcyByZWdydGVzdAoKTm90ZSB0aGF0ICdhcycgaXMgbm90IGEgbmV3IGtleXdvcmQgLS0gaXQgaXMgcmVjb2duaXplZCBvbmx5IGluIHRoaXMKY29udGV4dCAodGhpcyBpcyBvbmx5IHBvc3NpYmxlIGJlY2F1c2UgdGhlIHN5bnRheCBmb3IgdGhlIGltcG9ydApzdGF0ZW1lbnQgZG9lc24ndCBpbnZvbHZlIGV4cHJlc3Npb25zKS4KCkltcGxlbWVudGVkIGJ5IFRob21hcyBXb3V0ZXJzLiAgRGVzY3JpYmVkIGJ5IFBFUCAyMjEuCgoKRXh0ZW5kZWQgUHJpbnQgU3RhdGVtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRWFzaWx5IHRoZSBtb3N0IGNvbnRyb3ZlcnNpYWwgbmV3IGZlYXR1cmUsIHRoaXMgZXh0ZW5zaW9uIHRvIHRoZSBwcmludApzdGF0ZW1lbnQgYWRkcyBhbiBvcHRpb24gdG8gbWFrZSB0aGUgb3V0cHV0IGdvIHRvIGEgZGlmZmVyZW50IGZpbGUKdGhhbiB0aGUgZGVmYXVsdCBzeXMuc3Rkb3V0LgoKRm9yIGV4YW1wbGUsIHRvIHdyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gc3lzLnN0ZGVyciwgeW91IGNhbiBub3cKd3JpdGU6CgogICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkVycm9yOiBiYWQgZG9nISIKCkFzIGEgc3BlY2lhbCBmZWF0dXJlLCBpZiB0aGUgZXhwcmVzc2lvbiB1c2VkIHRvIGluZGljYXRlIHRoZSBmaWxlCmV2YWx1YXRlcyB0byBOb25lLCB0aGUgY3VycmVudCB2YWx1ZSBvZiBzeXMuc3Rkb3V0IGlzIHVzZWQuICBUaHVzOgoKICAgIHByaW50ID4+IE5vbmUsICJIZWxsbyB3b3JsZCIKCmlzIGVxdWl2YWxlbnQgdG8KCiAgICBwcmludCAiSGVsbG8gd29ybGQiCgpEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5IEJhcnJ5IFdhcnNhdy4gIERlc2NyaWJlZCBieSBQRVAgMjE0LgoKCk9wdGlvbmFsIENvbGxlY3Rpb24gb2YgQ3ljbGljYWwgR2FyYmFnZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClB5dGhvbiBpcyBub3cgZXF1aXBwZWQgd2l0aCBhIGdhcmJhZ2UgY29sbGVjdG9yIHRoYXQgY2FuIGh1bnQgZG93bgpjeWNsaWNhbCByZWZlcmVuY2VzIGJldHdlZW4gUHl0aG9uIG9iamVjdHMuICBJdCdzIG5vIHJlcGxhY2VtZW50IGZvcgpyZWZlcmVuY2UgY291bnRpbmc7IGluIGZhY3QsIGl0IGRlcGVuZHMgb24gdGhlIHJlZmVyZW5jZSBjb3VudHMgYmVpbmcKY29ycmVjdCwgYW5kIGRlY2lkZXMgdGhhdCBhIHNldCBvZiBvYmplY3RzIGJlbG9uZyB0byBhIGN5Y2xlIGlmIGFsbAp0aGVpciByZWZlcmVuY2UgY291bnRzIGNhbiBiZSBhY2NvdW50ZWQgZm9yIGZyb20gdGhlaXIgcmVmZXJlbmNlcyB0bwplYWNoIG90aGVyLiAgVGhpcyBkZXZpb3VzIHNjaGVtZSB3YXMgZmlyc3QgcHJvcG9zZWQgYnkgRXJpYyBUaWVkZW1hbm4sCmFuZCBicm91Z2h0IHRvIGltcGxlbWVudGF0aW9uIGJ5IE5laWwgU2NoZW1lbmF1ZXIuCgpUaGVyZSdzIGEgbW9kdWxlICJnYyIgdGhhdCBsZXRzIHlvdSBjb250cm9sIHNvbWUgcGFyYW1ldGVycyBvZiB0aGUKZ2FyYmFnZSBjb2xsZWN0aW9uLiAgVGhlcmUncyBhbHNvIGFuIG9wdGlvbiB0byB0aGUgY29uZmlndXJlIHNjcmlwdAp0aGF0IGxldHMgeW91IGVuYWJsZSBvciBkaXNhYmxlIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24uICBJbiAyLjBiMSwKaXQncyBvbiBieSBkZWZhdWx0LCBzbyB0aGF0IHdlIChob3BlZnVsbHkpIGNhbiBjb2xsZWN0IGRlY2VudCB1c2VyCmV4cGVyaWVuY2Ugd2l0aCB0aGlzIG5ldyBmZWF0dXJlLiAgVGhlcmUgYXJlIHNvbWUgcXVlc3Rpb25zIGFib3V0IGl0cwpwZXJmb3JtYW5jZS4gIElmIGl0IHByb3ZlcyB0byBiZSB0b28gbXVjaCBvZiBhIHByb2JsZW0sIHdlJ2xsIHR1cm4gaXQKb2ZmIGJ5IGRlZmF1bHQgaW4gdGhlIGZpbmFsIDIuMCByZWxlYXNlLgoKClNtYWxsZXIgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KCkEgbmV3IGZ1bmN0aW9uIHppcCgpIHdhcyBhZGRlZC4gIHppcChzZXExLCBzZXEyLCAuLi4pIGlzIGVxdWl2YWxlbnQgdG8KbWFwKE5vbmUsIHNlcTEsIHNlcTIsIC4uLikgd2hlbiB0aGUgc2VxdWVuY2VzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoOwppLmUuIHppcChbMSwyLDNdLCBbMTAsMjAsMzBdKSByZXR1cm5zIFsoMSwxMCksICgyLDIwKSwgKDMsMzApXS4gIFdoZW4KdGhlIGxpc3RzIGFyZSBub3QgYWxsIHRoZSBzYW1lIGxlbmd0aCwgdGhlIHNob3J0ZXN0IGxpc3Qgd2luczoKemlwKFsxLDIsM10sIFsxMCwyMF0pIHJldHVybnMgWygxLDEwKSwgKDIsMjApXS4gIFNlZSBQRVAgMjAxLgoKc3lzLnZlcnNpb25faW5mbyBpcyBhIHR1cGxlIChtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsKS4KCkRpY3Rpb25hcmllcyBoYXZlIGFuIG9kZCBuZXcgbWV0aG9kLCBzZXRkZWZhdWx0KGtleSwgZGVmYXVsdCkuCmRpY3Quc2V0ZGVmYXVsdChrZXksIGRlZmF1bHQpIHJldHVybnMgZGljdFtrZXldIGlmIGl0IGV4aXN0czsgaWYgbm90LAppdCBzZXRzIGRpY3Rba2V5XSB0byBkZWZhdWx0IGFuZCByZXR1cm5zIHRoYXQgdmFsdWUuICBUaHVzOgoKICAgIGRpY3Quc2V0ZGVmYXVsdChrZXksIFtdKS5hcHBlbmQoaXRlbSkKCmRvZXMgdGhlIHNhbWUgd29yayBhcyB0aGlzIGNvbW1vbiBpZGlvbToKCiAgICBpZiBub3QgZGljdC5oYXNfa2V5KGtleSk6CiAgICAgICAgZGljdFtrZXldID0gW10KICAgIGRpY3Rba2V5XS5hcHBlbmQoaXRlbSkKClRoZXJlIGFyZSB0d28gbmV3IHZhcmlhbnRzIG9mIFN5bnRheEVycm9yIHRoYXQgYXJlIHJhaXNlZCBmb3IKaW5kZW50YXRpb24tcmVsYXRlZCBlcnJvcnM6IEluZGVudGF0aW9uRXJyb3IgYW5kIFRhYkVycm9yLgoKQ2hhbmdlZCBceCB0byBjb25zdW1lIGV4YWN0bHkgdHdvIGhleCBkaWdpdHM7IHNlZSBQRVAgMjIzLiAgQWRkZWQgXFUKZXNjYXBlIHRoYXQgY29uc3VtZXMgZXhhY3RseSBlaWdodCBoZXggZGlnaXRzLgoKVGhlIGxpbWl0cyBvbiB0aGUgc2l6ZSBvZiBleHByZXNzaW9ucyBhbmQgZmlsZSBpbiBQeXRob24gc291cmNlIGNvZGUKaGF2ZSBiZWVuIHJhaXNlZCBmcm9tIDIqKjE2IHRvIDIqKjMyLiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uCndlcmUgbGltaXRlZCBiZWNhdXNlIHRoZSBtYXhpbXVtIGFyZ3VtZW50IHNpemUgdGhlIFB5dGhvbiBWTSBhY2NlcHRlZAp3YXMgMioqMTYuICBUaGlzIGxpbWl0ZWQgdGhlIHNpemUgb2Ygb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb25zLAplLmcuIFsxLDIsM10gb3IgeydhJzoxLCAnYic6Mn0sIGFuZCB0aGUgc2l6ZSBvZiBzb3VyY2UgZmlsZXMuICBUaGlzCmxpbWl0IHdhcyByYWlzZWQgdGhhbmtzIHRvIGEgcGF0Y2ggYnkgQ2hhcmxlcyBXYWxkbWFuIHRoYXQgZWZmZWN0aXZlbHkKZml4ZXMgdGhlIHByb2JsZW0uICBJdCBpcyBub3cgbXVjaCBtb3JlIGxpa2VseSB0aGF0IHlvdSB3aWxsIGJlCmxpbWl0ZWQgYnkgYXZhaWxhYmxlIG1lbW9yeSB0aGFuIGJ5IGFuIGFyYml0cmFyeSBsaW1pdCBpbiBQeXRob24uCgpUaGUgaW50ZXJwcmV0ZXIncyBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBjYW4gYmUgbW9kaWZpZWQgYnkgUHl0aG9uCnByb2dyYW1zIHVzaW5nIHN5cy5nZXRyZWN1cnNpb25saW1pdCBhbmQgc3lzLnNldHJlY3Vyc2lvbmxpbWl0LiAgVGhpcwpsaW1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVjdXJzaXZlIGNhbGxzIHRoYXQgY2FuIGJlIG1hZGUgYnkKUHl0aG9uIGNvZGUuICBUaGUgbGltaXQgZXhpc3RzIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGZyb20Kb3ZlcmZsb3dpbmcgdGhlIEMgc3RhY2sgYW5kIGNhdXNpbmcgYSBjb3JlIGR1bXAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwoxMDAwLiAgVGhlIG1heGltdW0gc2FmZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtIGNhbiBiZSBmb3VuZApieSBydW5uaW5nIE1pc2MvZmluZF9yZWN1cnNpb25saW1pdC5weS4KCk5ldyBNb2R1bGVzIGFuZCBQYWNrYWdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmF0ZXhpdCAtIGZvciByZWdpc3RlcmluZyBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHdoZW4gUHl0aG9uIGV4aXRzLgoKaW1wdXRpbCAtIEdyZWcgU3RlaW4ncyBhbHRlcm5hdGl2ZSBBUEkgZm9yIHdyaXRpbmcgY3VzdG9tIGltcG9ydApob29rcy4KCnB5ZXhwYXQgLSBhbiBpbnRlcmZhY2UgdG8gdGhlIEV4cGF0IFhNTCBwYXJzZXIsIGNvbnRyaWJ1dGVkIGJ5IFBhdWwKUHJlc2NvZC4KCnhtbCAtIGEgbmV3IHBhY2thZ2Ugd2l0aCBYTUwgc3VwcG9ydCBjb2RlIG9yZ2FuaXplZCAoc28gZmFyKSBpbiB0aHJlZQpzdWJwYWNrYWdlczogeG1sLmRvbSwgeG1sLnNheCwgYW5kIHhtbC5wYXJzZXJzLiAgRGVzY3JpYmluZyB0aGVzZQp3b3VsZCBmaWxsIGEgdm9sdW1lLiAgVGhlcmUncyBhIHNwZWNpYWwgZmVhdHVyZSB3aGVyZWJ5IGEKdXNlci1pbnN0YWxsZWQgcGFja2FnZSBuYW1lZCBfeG1scGx1cyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkCnhtbHBhY2thZ2U7IHRoaXMgaXMgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgWE1MIFNJRyBhIGhvb2sgdG8gZGlzdHJpYnV0ZQpiYWNrd2FyZHMtY29tcGF0aWJsZSB1cGRhdGVzIHRvIHRoZSBzdGFuZGFyZCB4bWwgcGFja2FnZS4KCndlYmJyb3dzZXIgLSBhIHBsYXRmb3JtLWluZGVwZW5kZW50IEFQSSB0byBsYXVuY2ggYSB3ZWIgYnJvd3Nlci4KCgpDaGFuZ2VkIE1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tCgphcnJheSAtLSBuZXcgbWV0aG9kcyBmb3IgYXJyYXkgb2JqZWN0czogY291bnQsIGV4dGVuZCwgaW5kZXgsIHBvcCwgYW5kCnJlbW92ZQoKYmluYXNjaWkgLS0gbmV3IGZ1bmN0aW9ucyBiMmFfaGV4IGFuZCBhMmJfaGV4IHRoYXQgY29udmVydCBiZXR3ZWVuCmJpbmFyeSBkYXRhIGFuZCBpdHMgaGV4IHJlcHJlc2VudGF0aW9uCgpjYWxlbmRhciAtLSBNYW55IG5ldyBmdW5jdGlvbnMgdGhhdCBzdXBwb3J0IGZlYXR1cmVzIGluY2x1ZGluZyBjb250cm9sCm92ZXIgd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGlzIHRoZSBmaXJzdCBkYXksIHJldHVybmluZyBzdHJpbmdzIGluc3RlYWQKb2YgcHJpbnRpbmcgdGhlbS4gIEFsc28gbmV3IHN5bWJvbGljIGNvbnN0YW50cyBmb3IgZGF5cyBvZiB3ZWVrLAplLmcuIE1PTkRBWSwgLi4uLCBTVU5EQVkuCgpjZ2kgLS0gRmllbGRTdG9yYWdlIG9iamVjdHMgaGF2ZSBhIGdldHZhbHVlIG1ldGhvZCB0aGF0IHdvcmtzIGxpa2UgYQpkaWN0aW9uYXJ5J3MgZ2V0IG1ldGhvZCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgYXR0cmlidXRlIG9mIHRoZSBvYmplY3QuCgpDb25maWdQYXJzZXIgLS0gVGhlIHBhcnNlciBvYmplY3QgaGFzIG5ldyBtZXRob2RzIGhhc19vcHRpb24sCnJlbW92ZV9zZWN0aW9uLCByZW1vdmVfb3B0aW9uLCBzZXQsIGFuZCB3cml0ZS4gIFRoZXkgYWxsb3cgdGhlIG1vZHVsZQp0byBiZSB1c2VkIGZvciB3cml0aW5nIGNvbmZpZyBmaWxlcyBhcyB3ZWxsIGFzIHJlYWRpbmcgdGhlbS4KCmZ0cGxpYiAtLSBudHJhbnNmZXJjbWQoKSwgdHJhbnNmZXJjbWQoKSwgYW5kIHJldHJiaW5hcnkoKSBhbGwgbm93Cm9wdGlvbmFsbHkgc3VwcG9ydCB0aGUgUkZDIDk1OSBSRVNUIGNvbW1hbmQuCgpnemlwIC0tIHJlYWRsaW5lIGFuZCByZWFkbGluZXMgbm93IGFjY2VwdCBvcHRpb25hbCBzaXplIGFyZ3VtZW50cwoKaHR0cGxpYiAtLSBOZXcgaW50ZXJmYWNlcyBhbmQgc3VwcG9ydCBmb3IgSFRUUC8xLjEgYnkgR3JlZyBTdGVpbi4gIFNlZQp0aGUgbW9kdWxlIGRvYyBzdHJpbmdzIGZvciBkZXRhaWxzLgoKbG9jYWxlIC0tIGltcGxlbWVudCBnZXRkZWZhdWx0bG9jYWxlIGZvciBXaW4zMiBhbmQgTWFjaW50b3NoCgptYXJzaGFsIC0tIG5vIGxvbmdlciBkdW1wcyBjb3JlIHdoZW4gbWFyc2hhbGluZyBkZWVwbHkgbmVzdGVkIG9yCnJlY3Vyc2l2ZSBkYXRhIHN0cnVjdHVyZXMKCm9zIC0tIG5ldyBmdW5jdGlvbnMgaXNhdHR5LCBzZXRldWlkLCBzZXRlZ2lkLCBzZXRyZXVpZCwgc2V0cmVnaWQKCm9zL3BvcGVuMiAtLSBwb3BlbjIvcG9wZW4zL3BvcGVuNCBzdXBwb3J0IHVuZGVyIFdpbmRvd3MuICBwb3BlbjIvcG9wZW4zCnN1cHBvcnQgdW5kZXIgVW5peC4KCm9zL3B0eSAtLSBzdXBwb3J0IGZvciBvcGVucHR5IGFuZCBmb3JrcHR5Cgpvcy5wYXRoIC0tIGZpeCBzZW1hbnRpY3Mgb2Ygb3MucGF0aC5jb21tb25wcmVmaXgKCnNtdHBsaWIgLS0gc3VwcG9ydCBmb3Igc2VuZGluZyB2ZXJ5IGxvbmcgbWVzc2FnZXMKCnNvY2tldCAtLSBuZXcgZnVuY3Rpb24gZ2V0ZnFkbigpCgpyZWFkbGluZSAtLSBuZXcgZnVuY3Rpb25zIHRvIHJlYWQsIHdyaXRlIGFuZCB0cnVuY2F0ZSBoaXN0b3J5IGZpbGVzLgpUaGUgcmVhZGxpbmUgc2VjdGlvbiBvZiB0aGUgbGlicmFyeSByZWZlcmVuY2UgbWFudWFsIGNvbnRhaW5zIGFuCmV4YW1wbGUuCgpzZWxlY3QgLS0gYWRkIGludGVyZmFjZSB0byBwb2xsIHN5c3RlbSBjYWxsCgpzaHV0aWwgLS0gbmV3IGNvcHlmaWxlb2JqIGZ1bmN0aW9uCgpTaW1wbGVIVFRQU2VydmVyLCBDR0lIVFRQU2VydmVyIC0tIEZpeCBwcm9ibGVtcyB3aXRoIGJ1ZmZlcmluZyBpbiB0aGUKSFRUUCBzZXJ2ZXIuCgpUa2ludGVyIC0tIG9wdGltaXphdGlvbiBvZiBmdW5jdGlvbiBmbGF0dGVuCgp1cmxsaWIgLS0gc2NhbnMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBwcm94eSBjb25maWd1cmF0aW9uLAplLmcuIGh0dHBfcHJveHkuCgp3aGljaGRiIC0tIHJlY29nbml6ZXMgZHVtYmRibSBmb3JtYXQKCgpPYnNvbGV0ZSBNb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0KCk5vbmUuICBIb3dldmVyIG5vdGUgdGhhdCAxLjYgbWFkZSBhIHdob2xlIHNsZXcgb2YgbW9kdWxlcyBvYnNvbGV0ZToKc3Rkd2luLCBzb3VuZGV4LCBjbWwsIGNtcGNhY2hlLCBkaXJjYWNoZSwgZHVtcCwgZmluZCwgZ3JlcCwgcGFja21haWwsCnBvbHksIHptb2QsIHN0cm9wLCB1dGlsLCB3aGF0c291bmQuCgoKQ2hhbmdlZCwgTmV3LCBPYnNvbGV0ZSBUb29scwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpOb25lLgoKCkMtbGV2ZWwgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KClNldmVyYWwgY2xlYW51cCBqb2JzIHdlcmUgY2FycmllZCBvdXQgdGhyb3VnaG91dCB0aGUgc291cmNlIGNvZGUuCgpBbGwgQyBjb2RlIHdhcyBjb252ZXJ0ZWQgdG8gQU5TSSBDOyB3ZSBnb3QgcmlkIG9mIGFsbCB1c2VzIG9mIHRoZQpQeV9QUk9UTygpIG1hY3JvLCB3aGljaCBtYWtlcyB0aGUgaGVhZGVyIGZpbGVzIGEgbG90IG1vcmUgcmVhZGFibGUuCgpNb3N0IG9mIHRoZSBwb3J0YWJpbGl0eSBoYWNrcyB3ZXJlIG1vdmVkIHRvIGEgbmV3IGhlYWRlciBmaWxlLApweXBvcnQuaDsgc2V2ZXJhbCBvdGhlciBuZXcgaGVhZGVyIGZpbGVzIHdlcmUgYWRkZWQgYW5kIHNvbWUgb2xkCmhlYWRlciBmaWxlcyB3ZXJlIHJlbW92ZWQsIGluIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgbW9yZSByYXRpb25hbCBzZXQKb2YgaGVhZGVyIGZpbGVzLiAgKEZldyBvZiB0aGVzZSBldmVyIG5lZWQgdG8gYmUgaW5jbHVkZWQgZXhwbGljaXRseTsKdGhleSBhcmUgYWxsIGluY2x1ZGVkIGJ5IFB5dGhvbi5oLikKClRyZW50IE1pY2sgZW5zdXJlZCBwb3J0YWJpbGl0eSB0byA2NC1iaXQgcGxhdGZvcm1zLCB1bmRlciBib3RoIExpbnV4CmFuZCBXaW42NCwgZXNwZWNpYWxseSBmb3IgdGhlIG5ldyBJbnRlbCBJdGFuaXVtIHByb2Nlc3Nvci4gIE1pY2sgYWxzbwphZGRlZCBsYXJnZSBmaWxlIHN1cHBvcnQgZm9yIExpbnV4NjQgYW5kIFdpbjY0LgoKVGhlIEMgQVBJcyB0byByZXR1cm4gYW4gb2JqZWN0J3Mgc2l6ZSBoYXZlIGJlZW4gdXBkYXRlIHRvIGNvbnNpc3RlbnRseQp1c2UgdGhlIGZvcm0gUHlYWFhfU2l6ZSwgZS5nLiBQeVNlcXVlbmNlX1NpemUgYW5kIFB5RGljdF9TaXplLiAgSW4KcHJldmlvdXMgdmVyc2lvbnMsIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHVzZWQgUHlYWFhfTGVuZ3RoIGFuZCB0aGUKY29uY3JldGUgaW50ZXJmYWNlcyB1c2VkIFB5WFhYX1NpemUuICBUaGUgb2xkIG5hbWVzLAplLmcuIFB5T2JqZWN0X0xlbmd0aCwgYXJlIHN0aWxsIGF2YWlsYWJsZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKYXQgdGhlIEFQSSBsZXZlbCwgYnV0IGFyZSBkZXByZWNhdGVkLgoKVGhlIFB5T1NfQ2hlY2tTdGFjayBmdW5jdGlvbiBoYXMgYmVlbiBpbXBsZW1lbnRlZCBvbiBXaW5kb3dzIGJ5CkZyZWRyaWsgTHVuZGguICBJdCBwcmV2ZW50cyBQeXRob24gZnJvbSBmYWlsaW5nIHdpdGggYSBzdGFjayBvdmVyZmxvdwpvbiBXaW5kb3dzLgoKVGhlIEdDIGNoYW5nZXMgcmVzdWx0ZWQgaW4gY3JlYXRpb24gb2YgdHdvIG5ldyBzbG90cyBvbiBvYmplY3QsCnRwX3RyYXZlcnNlIGFuZCB0cF9jbGVhci4gIFRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBjaGFuZ2VzIHJlc3VsdCBpbgp0aGUgY3JlYXRpb24gb2YgYSBuZXcgc2xvdCBmb3IgZWFjaCBpbi1wbGFjZSBvcGVyYXRvci4KClRoZSBHQyBBUEkgY3JlYXRlcyBuZXcgcmVxdWlyZW1lbnRzIGZvciBjb250YWluZXIgdHlwZXMgaW1wbGVtZW50ZWQgaW4KQyBleHRlbnNpb24gbW9kdWxlcy4gIFNlZSBJbmNsdWRlL29iamltcGwuaCBmb3IgZGV0YWlscy4KClB5RXJyX0Zvcm1hdCBoYXMgYmVlbiB1cGRhdGVkIHRvIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlIHRoZSBzaXplIG9mCnRoZSBidWZmZXIgbmVlZGVkIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCByZXN1bHQgc3RyaW5nLiAgVGhpcyBjaGFuZ2UKcHJldmVudHMgY3Jhc2hlcyBjYXVzZWQgYnkgcHJvZ3JhbW1lciBlcnJvci4KCk5ldyBDIEFQSSBjYWxsczogUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciwgUHlFcnJfV3JpdGVVbnJhaXNhYmxlLgoKUHlSdW5fQW55RmlsZUV4LCBQeVJ1bl9TaW1wbGVGaWxlRXgsIFB5UnVuX0ZpbGVFeCAtLSBOZXcgZnVuY3Rpb25zCnRoYXQgYXJlIHRoZSBzYW1lIGFzIHRoZWlyIG5vbi1FeCBjb3VudGVycGFydHMgZXhjZXB0IHRoZXkgdGFrZSBhbgpleHRyYSBmbGFnIGFyZ3VtZW50IHRoYXQgdGVsbHMgdGhlbSB0byBjbG9zZSB0aGUgZmlsZSB3aGVuIGRvbmUuCgpYWFggVGhlcmUgd2VyZSBvdGhlciBBUEkgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmbGVzaGVkIG91dCBoZXJlLgoKCldpbmRvd3MgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0KCk5ldyBwb3BlbjIvcG9wZW4zL3Blb3BlbjQgaW4gb3MgbW9kdWxlIChzZWUgQ2hhbmdlZCBNb2R1bGVzIGFib3ZlKS4KCm9zLnBvcGVuIGlzIG11Y2ggbW9yZSB1c2FibGUgb24gV2luZG93cyA5NSBhbmQgOTguICBTZWUgTWljcm9zb2Z0Cktub3dsZWRnZSBCYXNlIGFydGljbGUgUTE1MDk1Ni4gIFRoZSBXaW45eCB3b3JrYXJvdW5kIGRlc2NyaWJlZCB0aGVyZQppcyBpbXBsZW1lbnRlZCBieSB0aGUgbmV3IHc5eHBvcGVuLmV4ZSBoZWxwZXIgaW4gdGhlIHJvb3Qgb2YgeW91cgpQeXRob24gaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IFB5dGhvbiB1c2VzIHRoaXMgaW50ZXJuYWxseTsgaXQgaXMgbm90CmEgc3RhbmRhbG9uZSBwcm9ncmFtLgoKQWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQgdG8gaW5zdGFsbCBQeXRob24Kb24gV2luZG93cyBOVCBvciBXaW5kb3dzIDIwMDAuICBJZiB5b3UgaGF2ZSBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMsClB5dGhvbidzIHJlZ2lzdHJ5IGluZm8gd2lsbCBiZSB3cml0dGVuIHVuZGVyIEhLRVlfTE9DQUxfTUFDSElORS4KT3RoZXJ3aXNlIHRoZSBpbnN0YWxsZXIgYmFja3Mgb2ZmIHRvIHdyaXRpbmcgUHl0aG9uJ3MgcmVnaXN0cnkgaW5mbwp1bmRlciBIS0VZX0NVUlJFTlRfVVNFUi4gIFRoZSBsYXR0ZXIgaXMgc3VmZmljaWVudCBmb3IgYWxsICJub3JtYWwiCnVzZXMgb2YgUHl0aG9uLCBidXQgd2lsbCBwcmV2ZW50IHNvbWUgYWR2YW5jZWQgdXNlcyBmcm9tIHdvcmtpbmcKKGZvciBleGFtcGxlLCBydW5uaW5nIGEgUHl0aG9uIHNjcmlwdCBhcyBhbiBOVCBzZXJ2aWNlLCBvciBwb3NzaWJseQpmcm9tIENHSSkuCgpbVGhpcyB3YXMgbmV3IGluIDEuNl0gVGhlIGluc3RhbGxlciBubyBsb25nZXIgcnVucyBhIHNlcGFyYXRlIFRjbC9UawppbnN0YWxsZXI7IGluc3RlYWQsIGl0IGluc3RhbGxzIHRoZSBuZWVkZWQgVGNsL1RrIGZpbGVzIGRpcmVjdGx5IGluIHRoZQpQeXRob24gZGlyZWN0b3J5LiAgSWYgeW91IGFscmVhZHkgaGF2ZSBhIFRjbC9UayBpbnN0YWxsYXRpb24sIHRoaXMKd2FzdGVzIHNvbWUgZGlzayBzcGFjZSAoYWJvdXQgNCBNZWdzKSBidXQgYXZvaWRzIHByb2JsZW1zIHdpdGgKY29uZmxpY3RpbmcgVGNsL1RrIGluc3RhbGxhdGlvbnMsIGFuZCBtYWtlcyBpdCBtdWNoIGVhc2llciBmb3IgUHl0aG9uCnRvIGVuc3VyZSB0aGF0IFRjbC9UayBjYW4gZmluZCBhbGwgaXRzIGZpbGVzLgoKW1RoaXMgd2FzIG5ldyBpbiAxLjZdIFRoZSBXaW5kb3dzIGluc3RhbGxlciBub3cgaW5zdGFsbHMgYnkgZGVmYXVsdCBpbgpcUHl0aG9uMjBcIG9uIHRoZSBkZWZhdWx0IHZvbHVtZSwgaW5zdGVhZCBvZiBcUHJvZ3JhbSBGaWxlc1xQeXRob24tMi4wXC4KCgpVcGRhdGVzIHRvIHRoZSBjaGFuZ2VzIGJldHdlZW4gMS41LjIgYW5kIDEuNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIDEuNiBORVdTIGZpbGUgY2FuJ3QgYmUgY2hhbmdlZCBhZnRlciB0aGUgcmVsZWFzZSBpcyBkb25lLCBzbyBoZXJlCmlzIHNvbWUgbGF0ZS1icmVha2luZyBuZXdzOgoKTmV3IEFQSXMgaW4gbG9jYWxlLnB5OiBub3JtYWxpemUoKSwgZ2V0ZGVmYXVsdGxvY2FsZSgpLCByZXNldGxvY2FsZSgpLAphbmQgY2hhbmdlcyB0byBnZXRsb2NhbGUoKSBhbmQgc2V0bG9jYWxlKCkuCgpUaGUgbmV3IG1vZHVsZSBpcyBub3cgZW5hYmxlZCBwZXIgZGVmYXVsdC4KCkl0IGlzIG5vdCB0cnVlIHRoYXQgdGhlIGVuY29kaW5ncyBjb2RlY3MgY2Fubm90IGJlIHVzZWQgZm9yIG5vcm1hbApzdHJpbmdzOiB0aGUgc3RyaW5nLmVuY29kZSgpICh3aGljaCBpcyBhbHNvIHByZXNlbnQgb24gOC1iaXQgc3RyaW5ncwohKSBhbGxvd3MgdXNpbmcgdGhlbSBmb3IgOC1iaXQgc3RyaW5ncyB0b28sIGUuZy4gdG8gY29udmVydCBmaWxlcyBmcm9tCmNwMTI1MiAoV2luZG93cykgdG8gbGF0aW4tMSBvciB2aWNlLXZlcnNhLgoKSmFwYW5lc2UgY29kZWNzIGFyZSBhdmFpbGFibGUgZnJvbSBUYW1pdG8gS0FKSVlBTUE6Cmh0dHA6Ly9wc2V1ZG8uZ3JhZC5zY2NzLmNodWt5by11LmFjLmpwL35rYWppeWFtYS9weXRob24vCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo=