U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIENIQU5HRVMuY3VycmVudCBmb3IgY3VycmVudCB2ZXJzaW9uLgoKVmVyc2lvbiAxLjMuMzQgKDI3IEZlYnJ1YXJ5IDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlciB2YXJpYWJsZXMuCgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGZvciB1c2Ugd2l0aGluICVleGNlcHRpb246CiAgICAgICAgICAgICAgJHdyYXBuYW1lIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgd3JhcHBlciBuYW1lCiAgICAgICAgICAgICAgJG92ZXJuYW1lIC0gaWYgYSBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0aGlzIGNvbnRhaW5zIHRoZSBleHRyYSBtYW5nbGluZyB1c2VkIG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdmVybG9hZGVkIG1ldGhvZAogICAgICAgICAgICAgICRkZWNsICAgICAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICAgICAgJGZ1bGxkZWNsIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSByZXR1cm4gdHlwZQoKMDIvMTIvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIE5vdyBzZXR0aW5nIFM0IGZsYWcgaW4gU1dJRyBjcmVhdGVkIG9iamVjdHMuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIFItU1dJRyBmb3IgMi42IGFuZCB3YXJuaW5nIGZvciAyLjYgZmFpbHVyZSBoYXMgYmVlbiByZW1vdmVkLgoKMDIvMTEvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBwYXRjaCBieSBUb3JzdGVuIExhbmRzY2hvZmYgdG8gZml4IHRoZSB1bmFyeSBtaW51cyBpc3N1ZQogICAgICAgICAgICBSYW4gJ2FzdHlsZSAtLXN0eWxlPWtyIC0yJyBhY3Jvc3MgbHVhLmN4eCB0byBuZWF0ZW4gaXQgdXAKCjAyLzEwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1bXAgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gNC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIEFQSSAKICAgICAgICAgICAgY2hhbmdlIGluIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucywgaWUgY2hhbmdlIGluIGRlZmluaXRpb24gb2Ygc3dpZ19jb252ZXJ0ZXJfZnVuYy4KICAgICAgICAgICAgQW55b25lIGNhbGxpbmcgU1dJR19UeXBlQ2FzdCBtdXN0IHBhc3MgaW4gYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIG5ldyBhZGRpdGlvbmFsCiAgICAgICAgICAgICh0aGlyZCkgcGFyYW1ldGVyIGFuZCB0aGVuIGhhbmRsZSB0aGUgbmV3bHkgY3JlYXRlZCBtZW1vcnkgaWYgdGhlIHJldHVybmVkIHZhbHVlCiAgICAgICAgICAgIGlzIHNldCB0byBTV0lHX0NBU1RfTkVXX01FTU9SWSBlbHNlIGEgbWVtb3J5IGxlYWsgd2lsbCBlbnN1ZS4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkLiBVc2FnZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVjZW50bHkKICAgICAgICAgICAgYWRkZWQgSmF2YSBhbmQgQyMgc2hhcmVkX3B0ciB0eXBlbWFwcy4gVHdvIG1hY3JvcyBhcmUgYXZhaWxhYmxlLCBhbHRob3VnaCB0aGVzZQogICAgICAgICAgICBtYXkgd2VsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKCiAgICAgICAgICAgIEZvciBiYXNlIGNsYXNzZXMgb3IgY2xhc3NlcyBub3QgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW46CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgIEZvciBkZXJpdmVkIGNsYXNzZXM6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKCiAgICAgICAgICAgIFRoZSBQUk9YWUNMQVNTIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm94eSBjbGFzcywgYnV0IGlzIG9ubHkgcmVxdWlyZWQgZm9yIEphdmEvQyMuCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVpbmNsdWRlICJib29zdF9zaGFyZWRfcHRyLmkiCgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihLbGFzcywgU3BhY2U6OktsYXNzKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKEtsYXNzRGVyaXZlZCwgU3BhY2U6OktsYXNzLCBTcGFjZTo6S2xhc3NEZXJpdmVkKQoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3NEZXJpdmVkIDogS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGdXJ0aGVyIGRldGFpbHMgdG8gZm9sbG93IGluIGZ1dHVyZSBkb2N1bWVudGF0aW9uLCBidXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlcwogICAgICAgICAgICBzaG91bGQgYmUgbm90ZWQ6CgogICAgICAgICAgICAtIE5vdCByZXN0cmljdGVkIHRvIGJvb3N0OjpzaGFyZWRfcHRyLCBlZyBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZSB1c2VkLgogICAgICAgICAgICAtIEF2YWlsYWJsZSB0eXBlbWFwIGdyb3VwczoKICAgICAgICAgICAgICAoYSkgVHlwZW1hcHMgZm9yIHNoYXJlZF9wdHIgcGFzc2VkIGJ5IHZhbHVlLCByZWZlcmVuY2UsIHBvaW50ZXIgYW5kIHBvaW50ZXIgCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4KICAgICAgICAgICAgLSAoYikgVHlwZW1hcHMgZm9yIHBhc3NpbmcgYnkgcmF3IHZhbHVlLCByYXcgcG9pbnRlciwgcmF3IHJlZmVyZW5jZSwgcmF3IHBvaW50ZXIKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLiAKICAgICAgICAgICAgLSBUaGUgY29kZSBiZWluZyB3cmFwcGVkIGRvZXMgbm90IGV2ZW4gaGF2ZSB0byB1c2Ugc2hhcmVkX3B0ciwgU1dJRyBjYW4gdXNlCiAgICAgICAgICAgICAgc2hhcmVkX3B0ciBhcyB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBpbnN0ZWFkIG9mIGEgcmF3IHBvaW50ZXIgZHVlIHRvIAogICAgICAgICAgICAgIHRoZSB0eXBlbWFwcyBpbiBncm91cCAoYikgYWJvdmUuCiAgICAgICAgICAgIC0gTm8gYXJyYXkgc3VwcG9ydCBhcyBzaGFyZWRfcHRyIGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzLgogICAgICAgICAgICAtIFRoaXMgd29ya3MgcXVpdGUgZGlmZmVyZW50bHkgdG8gdGhlIHVzdWFsIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IHdoZW4KICAgICAgICAgICAgICBvcGVyYXRvci0+IGlzIHBhcnNlZCBieSBTV0lHOgogICAgICAgICAgICAgIC0gQW4gYWRkaXRpb25hbCBzbWFydCBwb2ludGVyIGNsYXNzIGlzIG5vdCBnZW5lcmF0ZWQgcmVkdWNpbmcgY29kZSBibG9hdCBpbgogICAgICAgICAgICAgICAgdGhlIHdyYXBwZXJzLgogICAgICAgICAgICAgIC0gVXNpbmcgc21hcnQgcG9pbnRlcnMgYW5kIHJhdyBwb2ludGVycyBjYW4gYmUgbWl4ZWQgc2VhbWxlc3NseS4KICAgICAgICAgICAgICAtIE1pc3NpbmcgY29uc3RydWN0b3JzIGZvciB0aGUgc21hcnQgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIGEgcHJvYmxlbSBhbmQgc28KICAgICAgICAgICAgICAgIHNlcGFyYXRlIGZhY3RvcnkgdHlwZSBmdW5jdGlvbnMgZG8gbm90IGhhdmUgdG8gYmUgd3JpdHRlbiBhbmQgd3JhcHBlZC4KICAgICAgICAgICAgICAtIFRoZSBpbXBsaWNpdCBDKysgc2hhcmVkX3B0cjwgZGVyaXZlZCBjbGFzcyA+IHRvIHNoYXJlZF9wdHI8IGJhc2UgY2xhc3MgPgogICAgICAgICAgICAgICAgY2FzdCBhbHNvIHdvcmtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgbmVnYXRlcyB0aGUgbmVjZXNzaXR5IHRvIHdyaXRlCiAgICAgICAgICAgICAgICBhbiBleHBsaWNpdCBoZWxwZXIgY2FzdCBmdW5jdGlvbiBwcm92aWRpbmcgdGhlIHVwY2FzdCB3aGljaCB3b3VsZCBuZWVkCiAgICAgICAgICAgICAgICBjYWxsaW5nIHByaW9yIHRvIHBhc3NpbmcgYSBkZXJpdmVkIGNsYXNzIHRvIGEgbWV0aG9kIHRha2luZyBhIHNoYXJlZF9wdHIgdG8KICAgICAgICAgICAgICAgIGEgYmFzZSBjbGFzcy4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBjbGFzcyByZWdpc3RyYXRpb24gZnVuY3Rpb24gdmlhIGEgbmV3CiAgICAgICAgICAgICJzbWFydHB0ciIgZmVhdHVyZS4gVGhpcyBpcyBhIHZlcnkgbG93IGxldmVsIG9mIGN1c3RvbWlzYXRpb24gbW9zdCB1c2VycwogICAgICAgICAgICB3b3VsZCBuZXZlciBuZWVkIHRvIGtub3cuIFRoZSBmZWF0dXJlIHdpbGwgdHlwaWNhbGx5IGJlIHVzZWQgZm9yIGludHJ1c2l2ZSAKICAgICAgICAgICAgc21hcnQgcG9pbnRlcnMgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIHR5cGVtYXBzLiBFeGFtcGxlIHVzYWdlIG9mIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPTEpIEZvbyB7IGJvb3N0OjpzaGFyZWRfcHRyPCBGb28gPiB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBGb29fc3dpZ3JlZ2lzdGVyIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWdpc3RlciBib29zdDo6c2hhcmVkIDwgRm9vID4KICAgICAgICAgICAgKFNXSUdUWVBFX3BfYm9vc3RfX3NoYXJlZF9wdHJURm9vX3QgaW5zdGVhZCBvZiBTV0lHVFlQRV9wX0ZvbykgYXMgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgdHlwZSBmb3IgaW5zdGFudGlhdGlvbnMgb2YgRm9vLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRmVhdHVyZXMgbm93IHN1cHBvcnRzIHRoZSBvcHRpb25hbCAnbm9ibG9jaycgYXR0cmlidXRlIGZvciBhbGwgdXNhZ2Ugb2YgJWZlYXR1cmUuIAogICAgICAgICAgICBXaGVuIHNwZWNpZmllZCwgdGhlIHsgfSBicmFjZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZmVhdHVyZSBjb2RlLiBUaGlzIGlzIGlkZW50aWNhbAogICAgICAgICAgICBpbiBiZWhhdmlvdXIgdG8gdXNhZ2Ugb2YgJ25vYmxvY2snIGluIHR5cGVtYXBzIGFuZCBpcyB1c2VkIHdoZW4gdGhlIHByZXByb2Nlc3NvcgogICAgICAgICAgICBpcyByZXF1aXJlZCB0byBvcGVyYXRlIG9uIHRoZSBjb2RlIGluIHRoZSBmZWF0dXJlIGFuZCB0aGUgZW5jbG9zaW5nIHsgfSBicmFjZXMKICAgICAgICAgICAgYXJlIG5vdCByZXF1aXJlZC4gRXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBGT08gZm9vCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0iMSIpIHsgRk9POjpiYXIgfQoKICAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciB0aGVuIHJlZHVjZXMgdGhpcyBhcyBpZiB0aGlzIGhhZCBiZWVuIHVzZWQgaW5zdGVhZDoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIikgImZvbzo6YmFyIgoKMDIvMDEvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBmb3JtYXQgc3RyaW5nIGJ1ZyAoU0YjMTg4MjIyMCkuCgowMS8zMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbnMgdG8gdGhlICV0eXBlcyBkaXJlY3RpdmUuIE5vdyB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBjYW4gYmUKICAgICAgICAgICAgb3ZlcnJpZGRlbiB0byBzb21lIGN1c3RvbSBjb2RlIGluIHRoZSAldHlwZXMgZGlyZWN0aXZlLCBsaWtlIHNvOgoKICAgICAgICAgICAgICAldHlwZXMoZnJvbXR5cGUgPSB0b3R5cGUpICV7CiAgICAgICAgICAgICAgICAuLi4gY29kZSB0byBjb252ZXJ0IGZyb210eXBlIHRvIHRvdHlwZSBhbmQgcmV0dXJuIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgc3BlY2lhbCB2YXJpYWJsZSAkZnJvbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgb2YgdGhlCiAgICAgICAgICAgIHR5cGUgYmVpbmcgY29udmVydGVkIGZyb20uIFRoZSBjb2RlIG11c3QgcmV0dXJuIHRoZSB0b3R5cGUgY2FzdCB0byB2b2lkICouIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFRpbWU7CiAgICAgICAgICAgICAgY2xhc3MgRGF0ZTsKICAgICAgICAgICAgICBEYXRlICZUaW1lOjpkYXRlRnJvbVRpbWUoKTsKCiAgICAgICAgICAgICAgJXR5cGVzKFRpbWUgPSBEYXRlKSAlewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopJGZyb207CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIHJlc3VsdGluZyBpbiB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBsb29raW5nIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICBzdGF0aWMgdm9pZCAqX3BfVGltZVRvX3BfRGF0ZSh2b2lkICp4KSB7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKil4OwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaXMgYWR2YW5jZWQgdXNhZ2UsIHBsZWFzZSB1c2Ugb25seSBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4KCjAxLzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgU21hbGwgdXBkYXRlIHRvIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbCwgdG8gd2FybiBhYm91dCB1c2Ugb2YgbG9jYWwgCgkgICAgdmFyaWFibGVzIGluIHR5cGVtYXBzIGZvciBtdWx0aXBsZSB0eXBlcy4KCjAxLzI1LzIwMDg6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCBidWcgcmVwb3J0ZWQgYnkgS2V2aW4gTWlsbHMgaW4gQVJSQVlTT0ZDTEFTU0VTIHR5cGVtYXBzIHdoZXJlIGFueQogICAgICAgICAgICBjaGFuZ2VzIG1hZGUgdG8gYW4gYXJyYXkgZWxlbWVudCBwYXNzZWQgZnJvbSBKYXZhIHRvIEMgYXJlIG5vdCByZWZsZWN0ZWQgYmFjawogICAgICAgICAgICBpbnRvIEphdmEuCgowMS8yNC8yMDA4OiBtZ29zc2FnZQoJICAgIE1vcmUgdXBkYXRlcyB0byB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICBBbHNvIGxvb2tzIGluIC91c3IvaW5jbHVkZS9sdWEqCgkgICAgQWxzbyBjaGFuZ2VkIHR5cGVtYXBzLmkgbm90IHRvIGNoZWNrIGZvciBOVUxMIGJlZm9yZSBmcmVlaW5nIGEgcG9pbnRlcgoKMDEvMjEvMjAwODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGb3IgU1RMIGNvbnRhaW5lcnMsIFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIGNvbnZlcnQgZnJvbSBvbmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lciB0byBhbm90aGVyLCBlZyBmcm9tIHN0ZDo6dmVjdG9yPGludD4gdG8gc3RkOjp2ZWN0b3I8ZG91YmxlPgogICAgICAgICAgICBvciBzdGQ6Omxpc3Q8aW50PiB0byBzdGQ6OnZlY3RvcjxpbnQ+IG9yIGV2ZW4gc3RkOjp2ZWN0b3I8Rm9vPiB0bwogICAgICAgICAgICBzdGQ6OnZlY3RvcjxCYXI+IGFzIGl0IHByZXZpb3VzbHkgZGlkLiBJbiBmYWN0IFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvCiAgICAgICAgICAgIGNvbnZlcnQgYW55IFNXSUcgd3JhcHBlZCBDKysgcHJveHkgY2xhc3MgdGhhdCBpcyBhbHNvIGEgUHl0aG9uIHNlcXVlbmNlLAogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQuIEFueSBub24tU1dJRyBQeXRob24gc2VxdWVuY2Ugd2lsbCBzdGlsbCBiZQogICAgICAgICAgICBhY2NlcHRlZCB3aGVyZXZlciBhbiBTVEwgY29udGFpbmVyIGlzIGFjY2VwdGVkLiBPdmVybG9hZGVkIG1ldGhvZHMgdXNpbmcKICAgICAgICAgICAgY29udGFpbmVycyBzaG91bGQgYmUgZmFzdGVyLgoKMDEvMTgvMjAwODogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAnZGlyZWN0b3JpbmF0dHJpYnV0ZXMnIGFuZCAnZGlyZWN0b3JvdXRhdHRyaWJ1dGVzJyB0eXBlbWFwIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZm9yIHRoZSBpbXR5cGUgdHlwZW1hcC4gVGhlc2Ugc2hvdWxkIGNvbnRhaW4gQyMgYXR0cmlidXRlcyB3aGljaCB3aWxsCiAgICAgICAgICAgIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSBDIyBkaXJlY3RvciBkZWxlZ2F0ZSBtZXRob2RzLgoKMDEvMTgvMjAwODogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBieXRlIHZhbHVlIDI1NSBpbiBpbnB1dCBmaWxlcyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBjaGFyIGlzIHNpZ25lZCAoaXQgd2FzIGdldHRpbmcgbWFwcGVkIHRvIEVPRikuICBGaXhlcyBTRiMxNTE4MjE5LgoKMDEvMTYvMjAwODogd3NmdWx0b24KCSAgICBGaXggdGVtcGxhdGUgbWVtYmVyIHZhcmlhYmxlcyB3cmFwcGVkIGJ5IGEgc21hcnQgcG9pbnRlci4gQnVnIHJlcG9ydGVkIAogICAgICAgICAgICBieSBSb2JlcnQgTHVwdG9uLgoKMDEvMTQvMjAwODogbWdvc3NhZ2UKCSAgICBTdWJzdGFudGlhbCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgICBDb2RlIGNhbiBub3cgbGluayB0byBsaWJsdWEuYSwgbGlibHVhNTAuYSBvciBsaWJsdWE1MS5hCgkgICAgICBJdCdzIGFsc28gYSBsb3QgbmVhdGVyIG5vdy4KCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEJhY2tlZCBvdXQgIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICoKCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODMyNjEzIC0gVGVtcGxhdGVzIGFuZCBzb21lIHR5cGVkZWZzIGludm9sdmluZyBwb2ludGVycyBvciBmdW5jdGlvbiBwb2ludGVycwoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMxNjMyNjI1IC0gQ29tcGlsYXRpb24gZXJyb3JzIG9uIFZpc3VhbCBDKysgNiB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKi4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODE5ODQ3ICV0ZW1wbGF0ZSB3aXRoIGp1c3Qgb25lIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVyIAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gaW50PiBjbGFzcyBGb28gey4uLn07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0RlZmF1bHQpIEZvbzw+OwoKMTIvMTIvMjAwNzogbWdvc3NhZ2UKCSAgICBbTHVhXSBTbWFsbCBjb3JyZWN0aW9uIG9uIEx1YS5odG1sCgoxMi8wOS8yMDA3OiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMxODM4MjQ4IGZyb20gTW9udHkgVGF5bG9yIGZvciB2cGF0aCBidWlsZHMgb2YgU1dJRy4KCjEyLzA4LzIwMDc6IHdzZnVsdG9uCgkgICAgW0x1YV0gRml4ZXMgdG8gcmVtb3ZlIGdjYy00LjIgd2FybmluZ3MKCjEyLzA2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxNzM0NDE1IC0gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIHRfaXRlbSwgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIHRfYWxsb2MgPSBwZmM6OmFsbG9jX2Zhc3QgPgogICAgICAgICAgICAgICAgY2xhc3MgbGlzdF90IDogcHVibGljIGxpc3RfaW1wbF90PHRfaXRlbSxwZmM6OmFycmF5X3Q8dF9pdGVtLHRfYWxsb2M+ID4geyAuLi4gfTsKCjEyLzA0LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gRml4IGEgYnVnIGluIHRoZSBjbGFzcyBoaWVyYWNoeSBjb2RlLCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG5vdCBwcm9wYWdhdGVkLCAKCSAgICBpZiB0aGUgbmFtZSBvcmRlcmluZyB3YXMgaW4gYSBjZXJ0YWluIG9yZGVyLgoJICAgIEFkZGVkIG5ldyBleGFtcGxlIHByb2dyYW1zIChkdWFsLCBlbWJlZCkgYW5kIHJ1bnRpbWUgdGVzdHMgZm9yIHRlc3Qtc3VpdGUuCgoxMS8zMC8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCB1c2luZyBzdGF0ZW1lbnRzIHVzaW5nIGEgYmFzZSBjbGFzcyBtZXRob2Qgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBvdmVybG9hZGVkLgogICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZSB1c2luZyBzdGF0ZW1lbnRzIGFuZCBtZXRob2QgZGVjbGFyYXRpb25zLCB0aGVzZQogICAgICAgICAgICB3ZXJlIHByZXZpb3VzbHkgZ2VuZXJhdGluZyB1bmNvbXBpbGVhYmxlIHdyYXBwZXJzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmdW5rKCk7CiAgICAgICAgICAgICAgICB1c2luZyBCYXNlOjpmdW5rOwogICAgICAgICAgICAgIH07CgpWZXJzaW9uIDEuMy4zMyAoTm92ZW1iZXIgMjMsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjEvMjAwNzogbWlrZWwKCSAgICBbYWxsZWdyb2NsXSBvbWl0IHByaXZhdGUgc2xvdCB0eXBlIGluZm8gaW4gdGhlIGNsYXNzZXMvdHlwZXMKCSAgICBkZWZpbmVkIG9uIHRoZSBsaXNwIHNpZGUuIEZpeCBidWcgaW4gbWFwcGluZyBvZiBDLysrIHR5cGVzCgkgICAgdG8gbGlzcCB0eXBlcy4gRml4IHR5cG8gaW4gbW9kdWxlcyBnZW5lcmF0ZWQgZGVmcGFja2FnZSBmb3JtLgoJICAgIEhhdmUgc3RkOjpzdHJpbmcgKidzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBiZXR3ZWVuIGZvcmVpZ24KCSAgICBhbmQgbGlzcCBzdHJpbmdzLgoJCjExLzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaWxsIGluIFB5dGhvbiBEaWN0aW9uYXJ5IGZ1bmN0aW9ucyBsaXN0IChwYXRjaCBmcm9tCgkgICAgSmVsbWVyIFZlcm5vb2lqIHBvc3RlZCB0byBzd2lnLWRldmVsKS4KCjExLzIwLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIEMgc2Nhbm5lciByZWxhdGVkIHRvIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLgoKMTEvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IGJyb2tlbiBjb21waWxhdGlvbiBvZiBDKysgd3JhcHBlcnMgb24gc29tZSBjb21waWxlcnMuCgoxMS8xNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgcGFzcyBQeV9zc2l6ZV90IGZvciBhICVkIHByaW50Zi1saWtlIGZvcm1hdCBhcwoJICAgIHRoYXQncyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2l6ZW9mKFB5X3NzaXplX3QpICE9IHNpemVvZihpbnQpLgoKVmVyc2lvbiAxLjMuMzIgKE5vdmVtYmVyIDE1LCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUGFja2FnZSBuYW1lIGFuZCBkbGwgbmFtZSBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgIG5hbWUuIEl0IHVzZWQgdG8gYmUgdGhlIG1vZHVsZSBuYW1lIHdpdGggX3dyYXAgYXMgYSBzdWZmaXguIFRoZSBwYWNrYWdlCiAgICAgICAgICAgIGFuZCBkbGwgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSAtcGFja2FnZSBhbmQgLWRsbCBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8xMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIFdpbmRvd3MgKFZpc3VhbCBDKysgOCB0ZXN0ZWQpCgoxMS8xMC8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IG1ha2VmaWxlIGdlbmVyYXRlZCBieSAtbWFrZSAoU0YjMTYzMzY3OSkuICBVcGRhdGUKCSAgICBkb2N1bWVudGF0aW9uIHRvIG1hcmsgIi1tYWtlIiBhcyBkZXByZWNhdGVkIChub25lIG9mIHRoZSBvdGhlcgoJICAgIFNXSUcgYmFja2VuZHMgc2VlbSB0byBvZmZlciBzdWNoIGEgZmVhdHVyZSwgaXQgY2FuJ3QgcmVhbGlzdGljYWxseQoJICAgIGdlbmVyYXRlIGEgZnVsbHkgcG9ydGFibGUgbWFrZWZpbGUsIGFuZCB0aGUgY29tbWFuZHMgdG8gYnVpbGQgYW4KCSAgICBleHRlbnNpb24gYXJlIGVhc3kgZW5vdWdoIHRvIHdyaXRlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBidWlsZAoJICAgIHRvb2wpLiAgQWxzbyByZWNvbW1lbmQgYWdhaW5zdCB0aGUgdXNlIG9mICItcGhwZnVsbCIgKGl0J3Mgb25seQoJICAgIHJlYWxseSB1c2VmdWwgd2hlbiBzdGF0aWMgbGlua2luZywgYW5kIGEgZHluYW1pY2FsbHkgbG9hZGFibGUKCSAgICBtb2R1bGUgaXMgdmlydHVhbGx5IGFsd2F5cyB0aGUgYmV0dGVyIGFwcHJvYWNoKS4KCjExLzA5LzIwMDc6IG9sbHkKCSAgICBGaXggLS1oZWxwIG91dHB1dCB0byBub3RlIHRoYXQgYGV4cG9ydCBTV0lHX0ZFQVRVUkVTJyBpcyByZXF1aXJlZC4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggc2VnIGZhdWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgW1JdIEV4YW1wbGVzIFIgc2NyaXB0cyBhcmUgbm93IHBsYXRmb3JtIGluZGVwZW5kZW50CgoxMC8zMC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBjbGFzc2VzIHdoaWNoIGNhc2VzIHRlbXBsYXRlX2RlZmF1bHQyCgkgICAgYW5kIHRlbXBsYXRlX3NwZWNpYWxpemF0aW9uX2RlZmFyZyB0byBmYWlsLgoJICAgIEFkZGVkIHNldmVyYWwgd2FybmluZyBmaWx0ZXJzIGludG8gdGhlIG92ZXJsb2FkJ3MgdGVzdCBjYXNlcy4KCSAgICBBZGRlZCBydW50aW1lIHRlc3RzIGZvciBzZXZlcmFsIGNvZGVzLgoJICAgIFlvdSBjYW4gbm93IG1ha2UgY2hlY2stbHVhLXRlc3Qtc3VpdGUgd2l0aCBubyBlcnJvcnMgYW5kIG9ubHkgYSBmZXcgd2FybmluZ3MuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGNvbmZpZ3VyZSB0ZXN0IHRvIHB1dCBHVUlMRUxJTksgaW4gTElCUyBub3QgTERGTEFHUwoJICAgIChTRiMxODIyNDMwKS4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgZ3VpbGUgZXhhbXBsZXMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBzd2lnX2x1YV9jbGFzcyBpbnN0YW5jZXMgdG8gYmUgc3RhdGljIHRvIGFsbG93IG11bHRpcGxlCgkgICAgU1dJRyB3cmFwcGVycyB0byBiZSBjb21waWxlZCBpbnRvIHRoZSBzYW1lIGV4ZWN1dGFibGUgc3RhdGljYWxseS4KCSAgICBQYXRjaCBmcm9tIEFuZHJlYXMgRnJlZHJpa3Nzb24gKHBvc3RlZCB0byB0aGUgc3dpZyBtYWlsaW5nIGxpc3QpLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBFeGFtcGxlcy9sdWEgdG8gcGFzcyBTUkNTIGZvciBDIHRlc3RzIHJhdGhlciB0aGFuIENYWFNSQ1MuCgkgICAgVGhlIGNvZGUgYXMgaXQgd2FzIGhhcHBlbmVkIHRvIHdvcmsgb24geDg2LCBidXQgYnJva2Ugb24geDg2XzY0IChhbmQKCSAgICBwcm9iYWJseSBhbnkgb3RoZXIgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUgLWZQSUMpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgYXBwcm9hY2ggZm9yIGZpeGluZyB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yCiAgICAgICAgICAgIG1ldGhvZHMgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZWQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gU3dpZ1ZhbHVlSW5pdCgpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFVzZSBtb3JlIGVmZmljaWVudCBTdlBWX25vbGVuKHgpIGluc3RlYWQgb2YgU3ZQVih4LFBMX25hKSBpZiBTdlBWX25vbGVuIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4KCjEwLzI2LzIwMDc6IHd1enplYgoJICAgIFtDaGlja2VuXSBGaXggZ2xvYmFsIHZhcmlhYmxlcyBvZiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgkgICAgT3RoZXIgbWlub3IgZml4ZXMsIHNvIGFsbCB0ZXN0cyBpbiB0aGUgY2hpY2tlbiB0ZXN0IHN1aXRlIG5vdyBwYXNzCgoxMC8yNS8yMDA3OiBvbGx5CgkgICAgRml4IFVUTCB0eXBlY2hlY2sgbWFjcm8gZm9yIGEgZnVuY3Rpb24gdGFraW5nIGNoYXJbXSBvciBjb25zdAoJICAgIGNoYXJbXSAoU0YjMTgyMDEzMikuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaWx0ZXIgb3V0IC1hbnNpIC1wZWRhbnRpYyBmcm9tIENGTEFHUyB3aGlsZSBjb21waWxpbmcgdGVzdCBwcm9ncmFtcyBmb3IgR3VpbGUKCSAgICBpbiBjb25maWd1cmUuICBUaGlzIGVuYWJsZXMgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgR3VpbGUgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZAoJICAgIHVzYWJsZS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gRml4IHRlc3RjYXNlcyBhcHBseV9zaWduZWRfY2hhciBhbmQgYXBwbHlfc3RyaW5ncwoJICAgIGJ5IGFkZGluZyBleHBsaWNpdCBjYXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgJGx0eXBlLgoKMTAvMjIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvciBtZXRob2RzLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBCdWcgIzE3OTQyNDcgLSBmaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGNzYmFzZSBvciBqYXZhYmFzZQogICAgICAgICAgICB0eXBlbWFwcyBhcmUgdXNlZCB3aXRoIHRoZSByZXBsYWNlPSIxIiBhdHRyaWJ1dGUuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBEb2NzIHVwZGF0ZWQgdG8gc3VnZ2VzdCB1c2luZyBkaXN0dXRpbHMuIFBhdGNoICMxNzk2NjgxIGZyb20gQ2hyaXN0b3BoZXIgQmFya2VyLgoKMTAvMTkvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxzIHRvIHN0cnRvbCgpLCBzdHJ0b3VsKCksIHN0cnRvbGwoKQoJICAgIGFuZCBzdHJ0b3VsbCgpIHdoaWNoIHdlIGNoZWNrIGVycm5vIGFmdGVyIHRvIGF2b2lkIHNlZWluZyBhIGp1bmsKCSAgICB2YWx1ZSBvZiBlcnJubyBpZiB0aGVyZSBpc24ndCBhbiBlcnJvciBpbiB0aGUgY2FsbC4KCjEwLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSAlYXR0cmlidXRlX3JlZiBhbmQgcmVwbGFjZSB3aXRoICVhdHRyaWJ1dGVyZWYuIFRoZXJlIGlzIGp1c3QgYW4gYXJndW1lbnQKICAgICAgICAgICAgb3JkZXIgY2hhbmdlIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggJWF0dHJpYnV0ZSwgZnJvbToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEFjY2Vzc29yTWV0aG9kLCBBdHRyaWJ1dGVOYW1lKQogICAgICAgICAgICB0bwogICAgICAgICAgICAgICVhdHRyaWJ1dGVyZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEF0dHJpYnV0ZU5hbWUsIEFjY2Vzc29yTWV0aG9kKQoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtUY2xdIEZpeCBzZXZlcmFsIG9jdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbgoJICAgIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysKCSAgICBjb2RlLgoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtQSFBdIEZpeCBtYW55IG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbQoJICAgIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrIGNvZGUKCSAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGEgbmV3IGVub3VnaCB2ZXJzaW9uIG9mIFBIUCA1ICh0ZXN0ZWQgd2l0aAoJICAgIFBIUCA1LjIuMywgYnV0IFBIUCA1LjIuMSBpcyBwcm9iYWJseSB0aGUgbWluaW11bSByZXF1aXJlbWVudCkuCgoxMC8xNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMTc5NzEzMyBmcm9tIERhdmlkIFBpZXBncmFzcyBmaXhlcyAlYXR0cmlidXRlIHdoZW4gdGhlIGdldHRlciBoYXMgdGhlIHNhbWUgbmFtZQogICAgICAgICAgICBhcyB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIG5vIGxvbmdlciBnZW5lcmF0ZSBub24tZnVuY3Rpb25hbCBzZXR0ZXIgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgoKMTAvMTUvMjAwNzogb2xseQoJICAgIFtUY2xdIFByZXZlbnQgU1dJR19UY2xfQ29udmVydFB0ciBmcm9tIGNhbGxpbmcgdGhlIHVua25vd24gcHJvYy4KCSAgICBBZGQgRXhhbXBsZXMvdGNsL3N0ZF92ZWN0b3IvIHdoaWNoIHRoaXMgY2hhbmdlIGZpeGVzLiAgUGF0Y2gKCSAgICBpcyBmcm9tICJDbGlmZiBDIiBpbiBTRiMxODA5ODE5LgoKMTAvMTIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBEZXRhY2hDdXJyZW50VGhyZWFkIGJhY2sgaW4gZm9yIGRpcmVjdG9ycy4gU2VlIGVudHJ5IGRhdGVkIDA4LzExLzIwMDYgYW5kCiAgICAgICAgICAgIHNlYXJjaCBmb3IgRGV0YWNoQ3VycmVudFRocmVhZCBvbiB0aGUgbWFpbGluZyBsaXN0cyBmb3IgZGV0YWlscy4gVGhlIGNyYXNoZXMgb24gU29sYXJpcwogICAgICAgICAgICBzZWVtIHRvIGJlIG9ubHkgcHJlc2VudCBpbiBqZGstMS40LjIgYW5kIGxvd2VyIChqZGstMS41LjAgYW5kIGpkay0xLjYuMCBhcmUgb2theSksIHNvCiAgICAgICAgICAgIGFueW9uZSB1c2luZyBkaXJlY3RvcnMgc2hvdWxkIHVzZSBhIHJlY2VudCBqZGsgb24gU29sYXJpcywgb3IgZGVmaW5lIChzZWUgZGlyZWN0b3Iuc3dnKQogICAgICAgICAgICBTV0lHX0pBVkFfTk9fREVUQUNIX0NVUlJFTlRfVEhSRUFEIHRvIHRoZSBDKysgY29tcGlsZXIgdG8gZ2V0IG9sZCBiZWhhdmlvdXIuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlbiB0aGVyZSBhcmUgQyBjb21tZW50cyBpbiB0aGUganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcy4KCjEwLzEyLzIwMDc6IHd1enplYgoJICAgIEFkZGVkIGEgdGVzdHN1aXRlIGVudHJ5IGZvciBCdWcgIzE3MzU5MzEKCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBdXRvbWF0aWNhbGx5IHJlcnVuIGF1dG9nZW4uc2ggaWYgY29uZmlndXJlLmluIGlzIG1vZGlmaWVkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEVuaGFuY2UgY2hlY2stJS10ZXN0LXN1aXRlIHJ1bGUgYW5kIGZyaWVuZHMgdG8gZ2l2ZSBhIG1vcmUgaGVscGZ1bAoJICAgIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0aGVtIGZvciBhIGxhbmd1YWdlIHdoaWNoIGRvZXNuJ3QgZXhpc3QKCSAgICAoZS5nLiAibWFrZSBjaGVjay1waHAtdGVzdC1zdWl0ZSIgcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKCSAgICAibWFrZSBjaGVjay1waHA0LXRlc3Qtc3VpdGUiKS4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBBZGQgbWFrZSBydWxlIHRvIHJlZ2VuZXJhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbiBpZiBpdCBoYXMKCSAgICBjaGFuZ2VkLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBsb25nLXN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIHdyYXBwZWQgY29uc3RydWN0b3JzIGFuZAoJICAgIHdyYXBwZWQgZnVuY3Rpb25zL21ldGhvZHMgd2hpY2ggcmV0dXJuIGFuIG9iamVjdC4KCjEwLzA4LzIwMDc6IG9sbHkKCSAgICBGaXggTWFrZWZpbGUuaW4gdG8gcmVhZCBjaGVjay5saXN0IGZpbGVzIGNvcnJlY3RseSBpbiBhIFZQQVRICgkgICAgYnVpbGQuCgoxMC8wNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkCgowOS8yNy8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGFkZGVkIG1vcmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IHR5cGVjaGVja3MuCgkgICAgQWRkZWQgYSByb3V0aW5lIHdoaWNoIGNoZWNrcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGEgZnVuY3Rpb24KCSAgICAoYnJlYWtzIG9wZXJhdG9yX292ZXJsb2FkaW5nIGZvciB1bmFyeSBtaW51cyBvcGVyYXRvciwgY3VycmVudGx5IGRpc2FibGVkKS4KCSAgICBSZW9yZ2FuaXNlZCB0aGUgbHVhdHlwZW1hcHMuc3dnIHRvIHRpZHkgaXQgdXAuCgkgICAgQWRkZWQgYSBsb3Qgb2YgJWlnbm9yZXMgb24gdGhlIG9wZXJhdG9ycyBub3Qgc3VwcG9ydGVkIGJ5IGx1YS4KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBjb25zdGFudCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgJiBydW50ZXN0IGZvciBtZW1iZXJfcG9pbnRlci5pCgkgICAgQWRkZWQgZmlyc3QgdmVyc2lvbiBvZiB3Y2hhci5pCgowOS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIHRocm93cyB0eXBlbWFwcyBmb3Igc3RkOjp3c3RyaW5nIHVzaW5nIEMjIHBhdGNoICMxNzk5MDY0IGZyb20gRGF2aWQgUGllcGdyYXNzCgowOS8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSAjMTc3MTMxMyB0byBmaXggYnVnICMxNjUwMjI5IC0gZml4ZXMgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcKICAgICAgICAgICAgaGFuZGxpbmcuCgowOS8yMC8yMDA3OiBvbGx5CgkgICAgW0phdmFdIEVsaW1pbmF0ZSBzb21lIHVubmVjZXNzYXJ5IHVzZXMgb2YgYSB0ZW1wb3JhcnkgYnVmZmVyCgkgICAgYWxsb2NhdGVkIHVzaW5nIG5ld1tdLiAgU0YjMTc5NjYwOS4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgY2FuIGJlIHVzZWQgaW4gdGhlIGNzdmFyaW4gdHlwZW1hcCB3aGVyZSBpdCBpcyBhbHdheXMKICAgICAgICAgICAgZXhwYW5kZWQgdG8gJ3ZhbHVlJy4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGJ1ZyByZXBvcnRlZCBieSBHbGVubiBBIFdhdHNvbiBhbmQgIzE3OTUyNjAgd2hlcmUgdGhlIGNzdHlwZSB0eXBlbWFwIHVzZWQgdGhlICdyZWYnCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIHR5cGVtYXAgYm9keSwgaXQgcHJvZHVjZWQgdW5jb21waWxhYmxlIEMjIHByb3BlcnRpZXMgKHZhcmlhYmxlIHdyYXBwZXJzKS4KICAgICAgICAgICAgVGhlIHR5cGUgZm9yIHRoZSBwcm9wZXJ0eSBub3cgY29ycmVjdGx5IGNvbWVzIGZyb20gdGhlICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgY3N0eXBlIHR5cGVtYXAuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGNvbnN0IHN0ZDo6d3N0cmluZyYgdHlwZW1hcHMKCjA5LzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVyZSBhIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcG9pbnRlciByZWZlcmVuY2UsIGVnIGluIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlIHBnY3BwCiAgICAgICAgICAgIGlzIGFsc28gZ2VuZXJhdGVkIG5vdyB3aGVuIHVzZXIncyBjdXN0b20gdHlwZW1hcHMgdXNlIGEgcHJveHkgY2xhc3MgaW4gdGhlIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFuZCBhICdsb25nJyBpbiB0aGUganR5cGUgdHlwZW1hcC4KCjA5LzE4LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlcnMgb2YgdHlwZSBzdGQ6OnN0cmluZyAmCgkgICAgd2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNwbGl0IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5nIGxpdGVyYWxzIHRvIGF2b2lkIGhpdHRpbmcKCSAgICBNU1ZDJ3MgbG93IGZpeGVkIGxpbWl0IG9uIHN0cmluZyBsaXRlcmFsIGxlbmd0aCAtIHBhdGNoIGZyb20KCSAgICBTRiMxNzIzNzcwLCBhbHNvIHJlcG9ydGVkIGFzIFNGIzE2MzA4NTUuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW29jYW1sXSBGaXggcmVuYW1pbmcgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBtZXRob2RfdGFibGUgLQoJICAgIG15IHBhdGNoIGZyb20gU0YjOTQwMzk5LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtweXRob25dIFNpbXBsZXIgY29kZSBmb3IgU1dJR19Bc1ZhbF9ib29sKCkgd2hpY2ggZml4ZXMgYSAic3RyaWN0CgkgICAgYWxpYXNpbmciIHdhcm5pbmcgZnJvbSBHQ0MgLSBwYXRjaCBmcm9tIFNGIzE3MjQ1ODEgYnkgQW5kcmV3CgkgICAgQmF1bWFubi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIFVzZSBzdl9zZXRwdm4oKSB0byBzZXQgYSBzY2FsYXIgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aAoJICAgIC0gcGF0Y2ggZnJvbSBTRiMxNzQ0NjAgYnkgIm1hdHN1YmFyYXkiLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFdoZW4gd3JhcHBpbmcgQysrIGNvZGUsIGdlbmVyYXRlIGNvZGUgd2hpY2ggdXNlcwoJICAgIHN0ZDo6c3RyaW5nOjphc3NpZ24oUFRSLCBMRU4pIHJhdGhlciB0aGFuIGFzc2lnbmluZwoJICAgIHN0ZDo6c3RyaW5nKFBUUiwgTEVOKS4gIFVzaW5nIGFzc2lnbiBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZQoJICAgICh0ZXN0ZWQgd2l0aCBHQ0MgNC4xLjIpLgoKMDkvMDcvMjAwNzogd3NmdWx0b24KCSAgICBGaXggJWlnbm9yZSBvbiBjb25zdHJ1Y3RvcnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IGRlY2xhcmVkIFtTRiAjMTc3NzcxMl0KCjA5LzA1LzIwMDc6IHd1enplYiAoSm9obiBMZW56KQoJICAgIC0gQ2hhbmdlIHJfbHR5cGUgaW4gdHlwZXN5cy5jIHRvIHN0b3JlIGEgaGFzaHRhYmxlIGluc3RlYWQgb2YgYSBzaW5nbGUgdmFsdWUuCgkgICAgICBzZXZlcmFsIHZlcnkgc3VidGxlIGJ1Z3Mgd2VyZSBiZWluZyBjYXVzZWQgYnkgbXVsdGlwbGUgbHR5cGVzIGJlaW5nIG1hcHBlZAoJICAgICAgdG8gYSBzaW5nbGUgbWFuZ2xlZCB0eXBlLCBtb3N0bHkgd2hlbiB1c2luZyB0eXBlZGVmZWQgdGVtcGxhdGUgcGFyYW1ldGVycy4KCSAgICAgIE5vdywgcl9sdHlwZSBzdG9yZXMgYSBoYXNodGFibGUgb2YgcG9zc2libGUgbHR5cGVzLCBhbmQgd2hlbiBnZW5lcmF0aW5nIHRoZQoJICAgICAgdHlwZSB0YWJsZSwgYWxsIHRoZSBsdHlwZXMgYXJlIGFkZGVkIGludG8gdGhlIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZS4KCjA4LzMxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxNzU0OTY3IGZyb20gSmFtZXMgQmlnbGVyLgogICAgICAgICAgICAtIEZpeCBidWcgaW4gdHVybmluZyBvbiB3YXJuaW5ncyB0aGF0IHdlcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBFZyAnc3dpZyAtdyszMDknIHdpbGwgbm93CiAgICAgICAgICAgICAgdHVybiBvbiB0aGUgbm9ybWFsbHkgc3VwcHJlc3NlZCB3YXJuaW5nIDMwOS4KCiAgICAgICAgICAgIC0gTmV3IC1XZXh0cmEgY29tbWFuZGxpbmUgb3B0aW9uIHdoaWNoIGVuYWJsZXMgdGhlIGV4dHJhIHdhcm5pbmcgbnVtYmVyczoKICAgICAgICAgICAgICAyMDIsMzA5LDQwMyw1MTIsMzIxLDMyMiAodGhpcyBpcyB0aGUgbGlzdCBvZiB3YXJuaW5ncyB0aGF0IGhhdmUgYWx3YXlzIGJlZW4gc3VwcHJlc3NlZCBieQogICAgICAgICAgICAgIGRlZmF1bHQpLiBCeSBzcGVjaWZ5aW5nIC1XZXh0cmEsIGFsbCB3YXJuaW5ncyB3aWxsIGJlIHR1cm5lZCBvbiwgYnV0IHVubGlrZSAtV2FsbCwKICAgICAgICAgICAgICB3YXJuaW5ncyBjYW4gc3RpbGwgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9uL29mZiB1c2luZyAld2FybmZpbHRlciwKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuIG9yIGZ1cnRoZXIgLXcgY29tbWFuZGxpbmUgb3B0aW9ucywgZWc6CiAgICAgICAgICAgICAgICBzd2lnIC1XZXh0cmEgLXczMDkKICAgICAgICAgICAgICB3aWxsIHR1cm4gb24gYWxsIHdhcm5pbmdzIGV4Y2VwdCAzMDkuCgowOC8yOC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICAtIE5ldyBkZWJ1Z2dpbmcgb3B0aW9ucywgLWRlYnVnLW1vZHVsZSA8bj4gYW5kIC1kZWJ1Zy10b3AgPG4+IHRvIGRpc3BsYXkgdGhlIHBhcnNlIHRyZWUgYXQKICAgICAgICAgICAgICB2YXJpb3VzIHN0YWdlcywgd2hlcmUgPG4+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RhZ2VzIDEtNC5Gb3IgZXhhbXBsZSwgdG8KICAgICAgICAgICAgICBkaXNwbGF5IHRvcCBvZiBwYXJzZSB0cmVlIGF0IHN0YWdlcyAxIGFuZCAzOgogICAgICAgICAgICAgICAgc3dpZyAtZGVidWctdG9wIDEsMwoKICAgICAgICAgICAgLSBEZXByZWNhdGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIHdoaWNoIGhhdmUgZXF1aXZhbGVudHMgYmVsb3c6CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfbW9kdWxlICAgID0+ICAgLWRlYnVnLW1vZHVsZSAxCiAgICAgICAgICAgICAgLWR1bXBfbW9kdWxlICAgICAgICAgID0+ICAgLWRlYnVnLW1vZHVsZSA0CiAgICAgICAgICAgICAgLWR1bXBfcGFyc2VfdG9wICAgICAgID0+ICAgLWRlYnVnLXRvcCAxCiAgICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgICAgICAgID0+ICAgLWRlYnVnLXRvcCA0CgogICAgICAgICAgICAtIFJlbmFtZWQgc29tZSBjb21tYW5kbGluZSBvcHRpb25zIGZvciBuYW1pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAgPT4gICAtZGVidWctdGVtcGxhdGUKICAgICAgICAgICAgICAtZGVidWdfdHlwZW1hcCAgID0+ICAgLWRlYnVnLXR5cGVtYXAKICAgICAgICAgICAgICAtZHVtcF9jbGFzc2VzICAgID0+ICAgLWRlYnVnLWNsYXNzZXMKICAgICAgICAgICAgICAtZHVtcF90YWdzICAgICAgID0+ICAgLWRlYnVnLXRhZ3MKICAgICAgICAgICAgICAtZHVtcF90eXBlZGVmICAgID0+ICAgLWRlYnVnLXR5cGVkZWYKICAgICAgICAgICAgICAtZHVtcF9tZW1vcnkgICAgID0+ICAgLWRlYnVnLW1lbW9yeQoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggaGFuZGxpbmcgb2YgZG91YmxlIG9yIGZsb2F0IHBhcmFtZXRlcnMgd2l0aCBhbiBpbnRlZ2VyCgkgICAgZGVmYXVsdCB2YWx1ZS4KCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gR2VuZXJhdGUgX19pc3NldCgpIG1ldGhvZHMgZm9yIHNldHRlcnMgZm9yIFBIUCA1LjEgYW5kIGxhdGVyLgoKMDgvMjAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBkaXJlY3RvciBidWcgIzE3NzY2NTEgcmVwb3J0ZWQgYnkgU3RlcGhhbmUgUm91dGVsb3VzIHdoaWNoIG9jY3VycmVkIHdoZW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IG9mIHNvbWUgb3RoZXIgc3ltYm9scyB1c2VkIHdpdGhpbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MuCgowOC8xNy8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBDb3JyZWN0IGJlaGF2aW91ciBmb3IgdGVtcGxhdGVkIG1ldGhvZHMgdXNlZCB3aXRoICVyZW5hbWUgb3IgJWlnbm9yZSBhbmQgdGhlIGVtcHR5CiAgICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9uIC0gJXRlbXBsYXRlKCkuIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgdGhlIG1ldGhvZCBoYXMgbm90IGJlZW4KICAgICAgICAgICAgcmVuYW1lZC4KCjA4LzE2LzIwMDc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBOYW1lIGdlbmVyYXRlZCBjbCBmaWxlIGJhc2VkIG9uIGlucHV0IGZpbGUgcmF0aGVyIHRoYW4gYnkKCSAgICBtb2R1bGUgbmFtZS4gSXQgd2FzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgbXlwYWNrYWdlLmNsIGFuZCBhIHRlc3Rfd3JhcC5jCgkgICAgd2hlbiBwYXJzaW5nIGEgdGVzdC5pIGlucHV0IGZpbGUuIENvbmZ1c2luZy4gQWxzbywgaW5jbHVkZSBleHRlcm5hbC1mb3JtYXQKCSAgICB0ZW1wbGF0ZXMgZm9yIDpmYXQgYW5kIDpmYXQtbGUgYXV0b21hdGljYWxseSB0byBhdm9pZCB0aGVzZSBiZWluZyBjb21waWxlZAoJICAgIGF0IHJ1bnRpbWUuCgowOC8xNS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIEFwcGx5IHBhdGNoICMxNzY2MDc2IGZyb20gTGVpZ2ggU21pdGggYWRkaW5nIHN1cHBvcnQgZm9yIG5ld2x5IGludHJvZHVjZWQKICAgICAgICAgICAgaW4gY2ZmaSA6bG9uZy1sb25nIGFuZCA6dW5zaWduZWQtbG9uZy1sb25nLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBkb2N1bWVudGF0aW9uIHBhdGNoICMxNzQzNTczIGZyb20gSmVmZnJleSBTb3JlbnNlbi4gSXQgY29udGFpbnMgYSBuZWF0CiAgICAgICAgICAgIGlkZWEgd2l0aCByZXNwZWN0IHRvIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudCBieSB0aGUgSlZNIG9mIEMrKyBhbGxvY2F0ZWQgbWVtb3J5LgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGx5IHBhdGNoICMxNzcxNDEwIGZyb20gV2FkZSBCcmFpbmVyZCB0byBmaXggdHlwZWRlZiBYUyhTd2lnUGVybFdyYXBwZXIpIGluCiAgICAgICAgICAgIHBlcmxydW4uc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsIGJ1aWxkIDgyMiBhbmQgUGVybCA1LjguOSBhbmQgNS4xMCBicmFuY2hlcy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIGNvbnN0IGVudW0gcmVmZXJlbmNlIHR5cGVtYXBzIGZpeGVkLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIEMrKyBjbGFzcyBtZW1iZXIgcG9pbnRlcnMuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBzdXBwb3J0IGZvciAkb3duZXIgaW4gdGhlICJvdXQiIHR5cGVtYXBzIGxpa2UgaW4gdGhlIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gTm90ZSB0aGF0ICRvd25lciBoYXMgYWx3YXlzIGJlZW4gc3VwcG9ydGVkIGluIHRoZSAiamF2YW91dCIgLyAiY3NvdXQiCiAgICAgICAgICAgIHR5cGVtYXBzLgoKMDgvMDEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNtYXJ0IHBvaW50ZXIgaGFuZGxpbmcgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIHRlbXBsYXRlZCBtZXRob2RzIHdpdGhpbiB0aGUgc21hcnQKICAgICAgICAgICAgcG9pbnRlciB0eXBlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IGNyYWlnZG8gYXQgZWUud2FzaGluZ3Rvbi5lZHUuCgowNy8zMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIGZpeGVkIG1lbW9yeSBhY2Nlc3MgYWZ0ZXIgYmVpbmcgZnJlZWQgYnVnLiB0aGFua3MgdG8gTWFydGluIFBlcmNvc3NpLgogICAgICAgICAgICBwYWNrYWdlIG5hbWUgY2xvcyBjaGFuZ2VkIHRvIGNsLiB0aGFua3MgdG8gUmFsZiBNYXR0ZXMKCjA3LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhcmFsbGVsIG1ha2Ugc3VwcG9ydCBhZGRlZCBmb3IgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIGZvciBkZXZlbG9wZXJzIHdobyBoYXZlCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgQ1BVLiBOb3cgcGFyYWxsZWwgbWFrZSBjYW4gYmUgdXNlZCBmb3IgY2hlY2tpbmcgaW4gYWRkaXRpb24gdG8gYnVpbGRpbmcKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZS4gU29tZSB0eXBpY2FsIGNoZWNraW5nIGV4YW1wbGVzOgoKICAgICAgICAgICAgICBtYWtlIC1qOCAtayBjaGVjawogICAgICAgICAgICAgIG1ha2UgLWo0IGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgLWoyIGNoZWNrLWphdmEtZXhhbXBsZXMKCjA3LzE5LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIEZpeGVkIGJ1ZyB0aGF0IHN0b3BwZWQgY29uZmlndXJlIHdvcmtpbmcgb24gbWluZ3cgKGFwcGxpZWQgZG9zMnVuaXggdG8gY29uZmlndXJlLmluKQoKMDcvMTAvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRXh0cmEgY29tcGF0aWJpbGl0eSB3aXRoIEx1YSA1LjEgKHVwZGF0ZWQgU1dJR19pbml0LCBkb2NzLCBleGFtcGxlcywgdGVzdCBzdWl0ZSkKCSAgICBSZW1vdmVkIG5hbWUgY2xhc2ggZm9yIHN0YXRpYyBsaW5rIG9mIG11bHRpcGxlIG1vZHVsZXMKCjA3LzA1LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiBTV0lHX0FMTE9DX0FSUkFZKCkKICAgICAgICAgICAgaW1wcm92ZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgYXJndW1lbnRzLgogICAgICAgICAgICBDaGFuZ2VkIHRoZSBvdXRwdXQgb2Ygc3dpZ190eXBlKCkgdG8gdXNlIHRoZSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoZSB0eXBlLAoJICAgIHJhdGhlciB0aGFuIHRoZSByYXcgc3dpZyB0eXBlLgoKMDcvMDMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3JzIGZvciBzb21lIG92ZXJsb2FkZWQgbWV0aG9kcyB3aGVyZSB0aGUgaW10eXBlIHJlc3VsdGVkIGluIGlkZW50aWNhbAogICAgICAgICAgICBtZXRob2RzIGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgQyMgZGlyZWN0b3IgY2xhc3MsIGVnIHZvaWQgZm9vKGludCAqKSBhbmQgdm9pZCBmb28oZG91YmxlICopCiAgICAgICAgICAgIHVzZWQgdG8gZ2VuZXJhdGVkIHR3byBvZiB0aGVzZToKCiAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIFN3aWdEaXJlY3RvcmZvbyhJbnRQdHIgcCkgeyAuLi4gfQoKMDYvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIHBhcmFtZXRlciBuYW1lIGNoYW5nZXMgaW4gc3RkX3ZlY3Rvci5pIGFsbG93aW5nIGJldHRlciB0YXJnZXRpbmcKICAgICAgICAgICAgb2YgdHlwZW1hcHMgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb2YgY29udGFpbmVycyBvZiBwb2ludGVycykuCgowNi8wNy8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggZm9yZWlnbi10eXBlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGxvb2sgZm9yIGZmaXR5cGUgdHlwZW1hcAoJICAgIGJpbmRpbmdzLiBmaXggaW5vdXRfdHlwZW1hcHMuaSBmb3Igc3RyaW5ncy4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUnVieV0KCSAgICBVc2Ugd2hpY2hldmVyIG9mICJsb25nIiBvciAibG9uZyBsb25nIiBpcyB0aGUgc2FtZSBzaXplIGFzICJ2b2lkKiIKCSAgICB0byBob2xkIHBvaW50ZXJzIGFzIGludGVnZXJzLCByYXRoZXIgdGhhbiB3aGljaGV2ZXIgbWF0Y2hlcyBvZmZfdC4KCSAgICBGaXhlcyBjb21waWxhdGlvbiBvbiBPUyBYIGFuZCBHQ0Mgd2FybmluZ3Mgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgc2l6ZW9mKHZvaWQqKSA8IHNpemVvZihvZmZfdCkgKFNGIHBhdGNoICMxNzMxOTc5KS4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggaGFuZGxpbmcgb2YgYSBwYXJ0aWN1bGFyIGNhc2UgaW52b2x2aW5nIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuCgowNi8wNS8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggY2FzZSB3aGVyZSB3ZSdkIHBhc3MgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXJzCgkgICAgKGkuZS4gTlMxOjpOUzI6OkZPTykgdG8gc3dpZy1pbnNlcnQtaWQuIEFsbCBuYW1lc3BhY2VzCgkgICAgc2hvdWxkIGJlIHN0cmlwcGVkLgoKCSAgICBGaXggYnVnIGluIFR5cGVkZWZIYW5kbGVyIGludHJvZHVjZWQgYnkgbGFzdCBmaXguCgowNi8wNS8yMDA3OiBvbGx5CgkgICAgRml4IHJlcG9ydGluZyBvZiBmaWxlbmFtZXMgaW4gZXJyb3JzIGFmdGVyICVpbmNsdWRlIChwYXRjaCBmcm9tCgkgICAgTGVpZ2ggU21pdGggaW4gIzE3MzEwNDA7IGFsc28gcmVwb3J0ZWQgYXMgIzE2OTk5NDApLgoKMDUvMzEvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4ICJtaXNzaW5nIGluaXRpYWxpc2VyIiB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgY29kZSB3aXRoIFB5dGhvbiAyLjUgd2l0aCB3YXJuaW5ncyBlbmFibGVkIChwYXRjaCBmcm9tCgkgICAgYnVnIzE3Mjc2NjggZnJvbSBMdWtlIE1vb3JlKS4KCjA1LzI5LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIFNwbGl0IGRvY3N0cmluZ3MgaW50byBzZXBhcmF0ZSBzdHJpbmcgbGl0ZXJhbHMgYXQgZWFjaCBuZXdsaW5lIHdoZW4KCSAgICBnZW5lcmF0aW5nIEMvQysrIHdyYXBwZXIgY29kZSAodGhlIEMvQysrIGNvbXBpbGVyIHdpbGwganVzdCBjb21iaW5lCgkgICAgdGhlbSBiYWNrIGludG8gYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwpLiAgVGhpcyBhdm9pZHMgTVNWQwoJICAgIGNvbXBsYWluaW5nIHRoYXQgdGhlIHN0cmluZ3MgYXJlIHRvbyBsb25nIChwcm9ibGVtIHJlcG9ydGVkIGJ5CgkgICAgQm8gUGVuZyBvbiB0aGUgbWFpbGluZyBsaXN0KS4KCjA1LzI4LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEVzY2FwZSBiYWNrc2xhc2hlcyBpbiBkb2NzdHJpbmdzLgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4IGF1dG9kb2MgZ2VuZXJhdGlvbiBvZiBlbnVtcyB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlCgkgICAgZW51bXMgYXJlIHdyYXBwZWQgLSBwYXRjaCAjMTY5NzIyNiBmcm9tIEpvc2ggQ2hlcnJ5LgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCB3cmFwcGluZyBvZiBtZXRob2RzIGFuZCBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB0byBhCgkgICAgY2xhc3MgKGJ1ZyMxNzAwNzg4KSBhbmQgdGhvc2Ugd2hpY2ggaGF2ZSBvdmVybG9hZGVkIGZvcm1zIHJldHVybmluZwoJICAgIGJvdGggY2xhc3NlcyBhbmQgbm9uLWNsYXNzZXMgKGJ1ZyMxNzEyNzE3LCB0aGFua3MgdG8gU2ltb24KCSAgICBCZXJ0aGlhdW1lIGZvciB0aGUgcGF0Y2gpLgoKMDUvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXJlbmFtZSBpbmNvbnNpc3RlbmN5IGluIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFzIHJlcG9ydGVkIGJ5IFpob25nIFJlbi4gVGhlIG1hdGNoaW5nCiAgICAgICAgICAgIGlzIG5vdyBkb25lIG9uIHRoZSBvcGVyYXRvciBuYW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdCBpcyBkb25lIGZvciBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgQUJDKCkgY29uc3Q7CiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChBQkMgYSkgY29uc3Q7CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEFCQyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZChBQkMgYSkgY29uc3Qge30KICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBBQkMoKSBjb25zdCB7IEFCQyBhOyByZXR1cm4gYTsgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlIHRoYXQgcXVhbGlmeWluZyB0aGUgY29udmVyc2lvbiBvcGVyYXRvciBwcmV2aW91c2x5IG1heSBvciBtYXkgbm90IGhhdmUgbWF0Y2hlZC4KICAgICAgICAgICAgTm93IGl0IGRlZmluaXRlbHkgd29uJ3QsIHNvIHRoaXMgd2lsbCBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIFNwYWNlOjpBQkMoKSBjb25zdDsKCiAgICAgICAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoaXMgZG9lcyBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoU3BhY2U6OkFCQyBhKSBjb25zdDsKCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkIHdpdGggcmVzcGVjdCB0byAlcmVuYW1lLCBuYW1lc3BhY2VzIGFuZCB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIENvbnZlcnNpb24gb3BlcmF0b3JzIGRvY3VtZW50YXRpb24gdG9vLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNS8xNi8yMDA3OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJhZCBnZW5lcmF0aW9uIG9mIGxvY2FsIHZhciBsdHlwZSdzIGluIGZ1bmN0aW9uV3JhcHBlcigpLgoJICAgIFRyeSB0byB3b3JrIGJldHRlciB3aXRoIHRoZSBiYWNrd2FyZCBvcmRlciBpbiB3aGljaCBzd2lnCgkgICAgdW5yb2xscyBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMuCgkgICAgY2xlYW5lZCB1cCBhIGxpdHRsZSB1bm5lY2Vzc2FyeSBjb2RlL2RlYnVnIHByaW50ZidzLgoJICAgIFJlbW92ZSB3YXJuaW5nIHdoZW4gcmVwbGFjaW5nICRsZGVzdHJ1Y3RvciBmb3IgZmY6Zm9yZWlnbi1wb2ludGVyCgowNS8xMi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBzd2lnIC1weXRob24gLXRocmVhZHMgbm93IGdlbmVyYXRlcyBDL0MrKyBjb2RlIHdoaWNoIHVzZXMgUHl0aG9uJ3MKCSAgICBvd24gdGhyZWFkaW5nIGFic3RyYWN0aW9uIChmcm9tIHB5dGhyZWFkLmgpIHJhdGhlciB0aGFuIE9TIHNwZWNpZmljCgkgICAgY29kZS4gIFRoZSBvbGQgY29kZSBmYWlsZWQgdG8gY29tcGlsZSBvbiBNUyBXaW5kb3dzLiAgKFNlZSBTRiBwYXRjaAoJICAgIHRyYWNrZXIgIzE3MTAzNDEpLgoKMDUvMDQvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBTVEwgcmVuYW1lcyB0byBiZSBnbG9iYWwgcmVuYW1lcy4gIFRoaXMgZml4ZXMKCSAgICBTVEwgZnVuY3Rpb25zIG5vdCBiZWluZyByZW5hbWVkIHdoZW4gYXV0b3JlbmFtZSBpcyBvbi4KICAgICAgICAgICAgVGhpcyBpcyBhIG5vdCBhIHRvdGFsbHkgcGVyZmVjdCB3b3JrLWFyb3VuZCwgYnV0IGJldHRlci4KCSAgICBTb21lb25lIHJlYWxseSBuZWVkcyB0byBmaXggdGhlIHRlbXBsYXRlIHJlbmFtaW5nIGNvZGUuCgkgICAgKFNlZSBidWcgIzE1NDU2MzQpCgowNS8wNC8yMDA3ICBnZ2EKCSAgICBbQWxsXQogICAgICAgICAgICBDaGFuZ2VkICVyZW5hbWUoIiUodW5kZXJjYXNlKXMiKSBhIGxpdHRsZSBzbyB0aGF0IHNpbmdsZQoJICAgIG51bWJlcnMgYXQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBub3QgdW5kZXJjYXNlZC4gIFRoYXQgaXM6CgkJZ2V0U29tZXRoaW5nIC0+IGdldF9zb21ldGhpbmcKCQlnZXQyRAkgICAgIC0+IGdldF8yZAoJCWdldDIzNAkgICAgIC0+IGdldF8yMzQKCSAgICBCVVQ6CgkJYXNGbG9hdDIgICAgIC0+IGFzX2Zsb2F0MgoJICAgIChCdWcgIzE2OTk3MTQpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIF9fc3dpZ3R5cGVfXyA9PiBAX19zd2lndHlwZV9fIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZAoJICAgIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSAoYW5kIGZvbGxvd3MgUnVieSdzIG9mZmljaWFsCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGp1c3QgaW4gY2FzZSkuCgkgICAgTWFkZSB0cmFja2luZyA9PiBAX190cmFja2luZ3NfXyBmb3Igc2FtZSByZWFzb24uCgkgICAgQ3VycmVudGx5IHN0b3JpbmcgaXZhcnMgd2l0aG91dCB0aGUgQCBzZWVtcyB2YWxpZCwgYnV0CgkgICAgdGhlIFBpY2tBeGUgc2F5cyB0aGlzIGlzIG5vdCBjb3JyZWN0LCBzbyBqdXN0IGluIGNhc2UuLi4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFwcGxpZWQgcGF0Y2ggZm9yIC1taW5oZXJpdCBidWcgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzLgoJICAgIFRoaXMgaXNzdWUgc2hvdWxkIGJlIHJldmlzaXRlZCBtb3JlIGNsb3NlbHksIGFzIE11bHRpcGxlCgkgICAgSW5oZXJpdGFuY2UgaW4gUnVieSBpcyBzdGlsbCBwcm9ibGVtYXRpYy4KCSAgICAocGF0Y2gvYnVnICMxNjA0ODc4KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMgaW4gcnVieSB3aWxsIG5vdyByZXBvcnQgdG8gdGhlIHVzZXIKICAgICAgICAgICAgdGhlIHBvc3NpYmxlIHByb3RvdHlwZXMgd2hlbiB0aGUgdXNlciBtaXN0eXBlcyB0aGUgbnVtYmVyIG9yCiAgICAgICAgICAgIHR5cGUgb2YgYSBwYXJhbWV0ZXIuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGb3Jnb3QgdG8gZG9jdW1lbnQgdGhlIGJ1ZyBmaXhpbmcgb2YgYW4gb2xkIGJ1ZyByZWdhcmRpbmcKCSAgICBleGNlcHRpb25zLgoJICAgIChidWcgIzE0NTgyNDcpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBSdWJ5IGRvY3VtZW50YXRpb24gdG8gdXNlIHRoZSBwcm9wZXIgY3NzIHN0eWxlcyBmb3IKCSAgICBlYWNoIHNlY3Rpb24uIEFkZGVkIGF1dG9kb2Mgc2VjdGlvbiB0byBSdWJ5J3MgZG9jcyB0bwoJICAgIGRvY3VtZW50IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgUnVieSBpbiBkb2N1bWVudGluZyBpdHMgbW9kdWxlcy4KCSAgICBNYWRlIHJkb2MgZG9jdW1lbnRhdGlvbiBzcGl0IG91dCB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyArCgkgICAgbWV0aG9kIG5hbWUuICBBbGJlaXQgdGhpcyB3aWxsIG1ha2UgdGhlIGN1cnJlbnQgcmRvYyBub3QgcmVjb2duaXplCiAgICAgICAgICAgIHRoZSBtZXRob2QsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGRpZmZlcmVudAogICAgICAgICAgICBjbGFzc2VzIHdpdGggc2ltaWxhciBtZXRob2RzIChyZG9jIHdhcyBjcmVhdGVkIHRvIGRvY3VtZW50IHRoZQoJICAgIHJ1Ynkgc291cmNlIHdoaWNoIG9ubHkgY29udGFpbnMgb25lIGNsYXNzIHBlciBjIGZpbGUsIHVubGlrZSBzd2lnKQogICAgICAgICAgICBJIGhhdmUgcGF0Y2hlZCByZG9jIHRvIG1ha2UgaXQgbW9yZSBmcmllbmRseSB0byBzd2lnLiAgVGhpcwogICAgICAgICAgICBwYXRjaCBuZWVkcyB0byBiZSBtZXJnZWQgaW4gdGhlIHJ1Ynkgc3RkIGxpYnJhcnkgbm93LgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBmbGFnIC1mZWF0dXJlIHRvIGJlIC1pbml0X25hbWUgdG8gYmV0dGVyIHJlZmxlY3QgaXRzCgkgICAgcHVycG9zZSBhbmQgYXZvaWQgY29uZnVzaW9uIHdpdGggLWZlYXR1cmVzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgYXV0b2RvYyBnZW5lcmF0aW9uLgoJICAgIEFkZGVkIGF1dG9kb2MgLnN3ZyBmaWxlcyB0byBSdWJ5IGxpYnJhcnkgZm9yIGVhc2lseSBhZGRpbmcKCSAgICBkb2N1bWVudGF0aW9uIHRvIGNvbW1vbiBSdWJ5IG1ldGhvZHMgYW5kIFNUTCBtZXRob2RzLgoJICAgIEZpeGVkIGF1dG9kb2MgZG9jdW1lbnRpbmcgb2YgZ2V0dGVycyBhbmQgc2V0dGVycyBhbmQgbW9kdWxlLgoJICAgIE1hZGUgdGVzdCBzdWl0ZSBhbHdheXMgZ2VuZXJhdGUgYXV0b2RvY3MuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHNvbWUgd2FybmluZ3MgZnJvbSBTVEwgYW5kIHRlc3Qgc3VpdGUuCgowNS8wMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBpc3N1ZXMgd2l0aCBDKysgY2xhc3NlcyBhbmQgaGllcmFjaGllcyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBzb3VyY2UgZmlsZXMuIEZpeGVkIGltcG9ydHMgdGVzdCBjYXNlICYgYWRkZWQgcnVuIHRlc3QuCgkgICAgQWRkZWQgRXhhbXBsZXMvaW1wb3J0cy4KCSAgICBBZGRlZCB0eXBlbmFtZSBmb3IgcmF3IGx1YV9TdGF0ZSoKCSAgICBBZGRlZCBkb2N1bWVudGF0aW9uIG9uIG5hdGl2ZSBmdW5jdGlvbnMuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBEb2NzdHJpbmdzIGFyZSBub3cgc3VwcG9ydGVkLgoJICAgICVmZWF0dXJlKCJhdXRvZG9jIikgYW5kICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93CgkgICAgcHJvcGVybHkgc3VwcG9ydGVkIGluIFJ1YnkuICBUaGVzZSBmZWF0dXJlcyB3aWxsIGdlbmVyYXRlCgkgICAgYSBfd3JhcC5jeHggZmlsZSB3aXRoIHJkb2MgY29tbWVudHMgaW4gdGhlbS4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFNUTCBmaWxlcyBoYXZlIGJlZW4gdXBncmFkZWQgdG8gZm9sbG93IHRoZSBuZXcgc3dpZy9weXRob24KCSAgICBMaWIvc3RkIGNvbnZlbnRpb25zLgoJICAgIFRoaXMgbWVhbnMgc3RkOjp2ZWN0b3IsIHN0ZDo6c2V0LCBzdGQ6Om1hcCwgc2V0OjptdWx0aW1hcCwKCSAgICBzdGQ6Om11bHRpc2V0LCBzdGQ6OmRlcXVlIGFuZCBzdGQ6OnN0cmluZyBhcmUgbm93IHByb3Blcmx5CgkgICAgc3VwcG9ydGVkLCBpbmNsdWRpbmcgdGhlaXIgaXRlcmF0b3JzLCBzdXBwb3J0IGZvciBjb250YWluaW5nCgkgICAgcnVieSBvYmplY3RzIChzd2lnOjpHQ19WQUxVRSkgYW5kIHNldmVyYWwgb3RoZXIgcnVieQoJICAgIGVuaGFuY2VtZW50cy4KCSAgICBzdGQ6OmNvbXBsZXgsIHN0ZDo6aW9zLCBzdGQ6Omlvc3RyZWFtLCBzdGQ6Omlvc3RyZWFtYnVmIGFuZAoJICAgIHN0ZDo6c3N0cmVhbSBhcmUgbm93IGFsc28gc3VwcG9ydGVkLgoJICAgIHN0ZDo6d3N0cmluZywgc3RkOjp3aW9zLCBzdGQ6Ondpb3N0cmVhbSwgc3RkOjp3aW9zdHJlYW1idWYKCSAgICBhbmQgc3RkOjp3c3N0cmVhbSBhcmUgc3VwcG9ydGVkIHZlcmJhdGltIHdpdGggbm8gdW5pY29kZQoJICAgIGNvbnZlcnNpb24uCgoJICAgIHN0ZF92ZWN0b3IuaSBub3cgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBSdWJ5IEFycmF5cyBtdWNoIG1vcmUKCSAgICBjbG9zZWx5LCBzdXBwb3J0aW5nIHNsaWNpbmcsIHNoaWZ0aW5nLCB1bnNoaWZ0aW5nLAogICAgICAgICAgICBtdWx0aXBsZSBpbmRleGluZyBhbmQgcHJvcGVyIHJldHVybiB2YWx1ZXMgb24gYXNzaWdubWVudC4KCgkgICAgQ09NUEFUQUJJTElUWSBOT1RFOiB0aGlzIGNoYW5nZXMgdGhlIG9sZGVyIGFwaSBhIGxpdHRsZSBiaXQgaW4KCSAgICB0aGF0IGltcHJvcGVyIGluZGV4aW5nIHdvdWxkIHByZXZpb3VzbHkgKGluY29ycmVjdGx5KSByYWlzZQoJICAgIGV4Y2VwdGlvbnMuICBOb3csIG5pbCBpcyByZXR1cm5lZCBpbnN0ZWFkLCBmb2xsb3dpbmcgcnVieSdzCgkgICAgc3RhbmRhcmQgQXJyYXkgYmVoYXZpb3IuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIHRoZSB2YWx1ZSBvZiBTV0lHX1RZUEVDSEVDS19CT09MIHRvIGJlIDEwMDAwIChpZS4gaGlnaGVyCgkgICAgdGhhbiB0aGF0IG9mIGFsbCBpbnRlZ2VycykuCgkgICAgVGhpcyBpcyBiZWNhdXNlIFJ1YnkgYWxsb3dzIHR5cGVjYXN0aW5nCgkgICAgaW50ZWdlcnMgZG93biB0byBib29sZWFucyB3aGljaCBjYW4gbWFrZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBvbgoJICAgIGJvb2xzIGFuZCBpbnRlZ2VycyB0byBmYWlsLgoJICAgIChidWcjIDE0ODgxNDIpCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBhIHN1YnRsZSBidWcgaW4gbXVsdGlwbGUgYXJnb3V0cyB0aGF0IGNvdWxkIGdldCB0cmlnZ2VyZWQgaWYKCSAgICB0aGUgdXNlciByZXR1cm5lZCB0d28gb3IgbW9yZSBhcmd1bWVudHMgYW5kIHRoZSBmaXJzdCBvbmUgd2FzIGFuCgkgICAgYXJyYXkuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGUgbmV3IGZlYXR1cmVzCiAgICAgICAgICAgIGFkZGVkLCBhZGQgZGlyZWN0b3Jpbi9vdXQvYXJnb3V0IHR5cGVtYXBzLCBldGMuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBZGRlZCAlaW5pdHN0YWNrIGFuZCAlaWdub3Jlc3RhY2sgZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3IKCSAgICBmdW5jdGlvbnMuICBUaGVzZSBhbGxvdyB5b3UgdG8gY29udHJvbCB3aGV0aGVyIGEgZGlyZWN0b3IKCSAgICBmdW5jdGlvbiBzaG91bGQgcmUtaW5pdCB0aGUgUnVieSBzdGFjay4KCSAgICBUaGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgZm9yIGFuIGVtYmVkZGVkIFJ1Ynkgd2hlcmUgdGhlCgkgICAgZGlyZWN0b3IgbWV0aG9kIGlzIHVzZWQgYXMgYSBDKysgY2FsbGJhY2sgYW5kIG5vdCBjYWxsZWQKICAgICAgICAgICAgYnkgdGhlIHVzZXIgZnJvbSBydWJ5IGNvZGUuCgkgICAgRXhwbGFuYXRpb246CgkgICAgUnVieSdzIEdDIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHRoZSBydW5uaW5nIE9TIHN0YWNrIGluIG9yZGVyIHRvCgkgICAgbWFyayBhbnkgVkFMVUUgKFJ1Ynkgb2JqZWN0cykgaXQgZmluZHMgdGhlcmUgdG8gYXZvaWQgY29sbGVjdGlvbgoJICAgIG9mIHRoZW0uICBUaGlzIGFsbG93cyB0aGUgcnVieSBBUEkgdG8gYmUgdmVyeSBzaW1wbGUgYW5kIGFsbG93cwoJICAgIHlvdSB0byB3cml0ZSBjb2RlIGxpa2UgIlZBTFVFIGEgPSBzdGgiIGFueXdoZXJlIHdpdGhvdXQgbmVlZGluZwoJICAgIHRvIGRvIHRoaW5ncyBsaWtlIHJlZmNvdW50aW5nIGxpa2UgcHl0aG9uLgoJICAgIEJ5IGRlZmF1bHQsIHRoZSBzdGFydCBvZiB0aGUgc3RhY2sgaXMgc2V0IHdoZW4gcnVieV9pbml0KCkgaXMKCSAgICBjYWxsZWQuICAgSWYgcnVieSBpcyBpbml0ZWQgd2l0aGluIG1haW4oKSwgYXMgaXQgdXN1YWxseSBpcyB0aGUKCSAgICBjYXNlIHdpdGggdGhlIG1haW4gcnVieSBleGVjdXRhYmxlLCBydWJ5IHdpbGwgYmUgYWJsZSB0byBjYWxjdWxhdGUKCSAgICBpdHMgc3RhY2sgcHJvcGVybHkuICBIb3dldmVyLCB3aGVuIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhcyB3aGVuCgkgICAgcnVieSBpcyBlbWJlZGRlZCBhcyBhIHBsdWdpbiB0byBhbiBhcHBsaWNhdGlvbiB3aGVyZSBtYWluIGlzIG5vdAoJICAgIGF2YWlsYWJsZSwgcnVieV9pbml0KCkgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIHdyb25nIHBsYWNlLCBhbmQKCSAgICBydWJ5IHdpbGwgYmUgaW5jb3JyZWN0bHkgdHJhY2tpbmcgdGhlIHN0YWNrIGZyb20gdGhlIGZ1bmN0aW9uCgkgICAgdGhhdCBjYWxsZWQgcnVieV9pbml0KCkgZm9yd2FyZHMgb25seSwgd2hpY2ggY2FuIGxlYWQgdG8KCSAgICBhbGwgc29ydHMgb2Ygd2VpcmQgY3Jhc2hlcyBvciB0byBydWJ5IHRoaW5raW5nIGl0IGhhcyBydW4gb3V0IG9mCgkgICAgc3RhY2sgc3BhY2UgaW5jb3JyZWN0bHkuCgkgICAgVG8gYXZvaWQgdGhpcywgZGlyZWN0b3IgKGNhbGxiYWNrKSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB0YWdnZWQKCSAgICB0byB0cnkgdG8gcmVzZXQgdGhlIHJ1Ynkgc3RhY2ssIHdoaWNoIHdpbGwgc29sdmUgdGhlIGlzc3Vlcy4KCSAgICBOT1RFOiBydWJ5MS44LjYgc3RpbGwgY29udGFpbnMgYSBidWcgaW4gaXQgaW4gdGhhdCBpdHMgZnVuY3Rpb24KCSAgICB0byByZXNldCB0aGUgc3RhY2sgd2lsbCBub3QgYWx3YXlzIGRvIHNvLiAgVGhpcyBidWcgaXMgdHJpZ2dlcmVkCgkgICAgdmVyeSByYXJlbHksIHdoZW4gcnVieSBpcyBjYWxsZWQgZnJvbSB0d28gdmVyeSBkaXN0aW5jdCBwbGFjZXMKCSAgICBpbiBtZW1vcnksIGxpa2UgYSBicmFuY2ggb2YgbWFpbigpIGFuZCBhbm90aGVyIGRzby4gIFRoaXMgYnVnCgkgICAgaGFzIG5vdyBiZWVuIHJlcG9ydGVkIHRvIHJ1YnktY29yZSBhbmQgaXMgcGVuZGluZyBmdXJ0aGVyCgkgICAgaW52ZXN0aWdhdGlvbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzMwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTcwNzU4MiAtIFJlc3RvcmUgYnVpbGRpbmcgZnJvbSByZWFkLW9ubHkgc291cmNlIGRpcmVjdG9yaWVzLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSB3aWxsIG5vdyByZXBvcnQgdGhlIHBhcmFtZXRlciBpbmRleCBwcm9wZXJseSBvbiB0eXBlCgkgICAgZXJyb3JzIGFzIHdlbGwgYXMgdGhlIGNsYXNzIGFuZCB2YWx1ZSBvZiB0aGUgaW5jb3JyZWN0CgkgICAgYXJndW1lbnQgcGFzc2VkLgoJICAgIChmZWF0dXJlIHJlcXVlc3QgIzE2OTk2NzApCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IG5vIGxvbmdlciBjcmVhdGVzIHRoZSBmcmVlX0NsYXNzIGZ1bmN0aW9uIGlmIHRoZSBjbGFzcwoJICAgIGNvbnRhaW5zIGl0cyBvd24gdXNlciBkZWZpbmVkIGZyZWUgZnVuY3Rpb24gKCVmcmVlZnVuYykuCgkgICAgKGJ1ZyAjMTcwMjg4MikKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgZGlyZWN0b3JzIHJhaXNlIGEgcnVieSBleGNlcHRpb24gZm9yIGluY29ycmVjdCBhcmdvdXQKCSAgICByZXR1cm5lZCB2YWx1ZXMgaWYgUlVCWV9FTUJFRERFRCBpcyBzZXQsIGluc3RlYWQgb2YgdGhyb3dpbmcKCSAgICBhbiBhY3R1YWwgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCSAgICBUaGlzIHdpbGwgcHJldmVudCBjcmFzaGVzIHdoZW4gcnVieSBpcyBlbWJlZGRlZCBhbmQgdW5hd2FyZQoJICAgIG9mIHRoZSBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCB0aGUgbmVlZCBmb3IgLURTV0lHRVhURVJOLgoJICAgIENoYW5nZWQgc3dpZ19ydWJ5X3RyYWNraW5ncyB0byBiZSBhIHN0YXRpYyB2YXJpYWJsZSwgYnV0IGFsc28KCSAgICBiZSBrZXB0IHdpdGhpbiBhIGhpZGRlbiBpbnN0YW5jZSB2YXJpYWJsZSBpbiB0aGUgU1dJRyBtb2R1bGUuCgkgICAgVGhpcyBhbGxvd3MgcHJvcGVybHkgZGVhbGluZyB3aXRoIHRyYWNraW5ncyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBEU09zLCB3aGljaCB3YXMgcHJldmlvdXNseSBicm9rZW4uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgaW1wcm92ZW1lbnQgdG8gcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0gRml4ZWQgR0MgbWVtb3J5IGlzc3VlcyB3aXRoIHRyYWNraW5ncyB0aGF0IGNvdWxkIGxlYWQKCSAgICB0byBzZWdmYXVsdHMgd2hlbiBkZWFsaW5nLCBtYWlubHksIHdpdGggc3RhdGljIHZhcmlhYmxlcy4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFN0cmluZyBjb252ZXJzaW9uIHVzaW5nIG9sZCBydWJ5MS42IG1hY3Jvcy4gIE5vdwoJICAgIFN0cmluZ1ZhbHVlUHRyKCkgaXMgdXNlZCBpZiBhdmFpbGFibGUuICBUaGlzIHJlbW92ZXMgd2FybmluZ3MKCSAgICB3aGVuIGNvbnZlcnRpbmcgc3RyaW5ncyB3aXRoIFwwIGluIHRoZW0uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCB0aGUgYXJnb3V0IGNvdW50IGluIGRpcmVjdG9ycyBmb3IgUnVieS4gIFByZXZpb3VzbHksCgkgICAgaWdub3JlZCBvciAibnVtaW5wdXRzPTAiIHR5cGVtYXBzIHdvdWxkIGluY29ycmVjdGx5IG5vdCBnZXQKCSAgICBjb3VudGVkIHRvd2FyZHMgdGhlIGFyZ291dCBjb3VudC4KCSAgICAoYnVnL3BhdGNoICMxNTQ1NTg1KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgVXBncmFkZWQgUnVieSBjb252ZXJ0ZXIgdG8gcmVjb2duaXplICJudW1pbnB1dHM9MCIuICBQcmV2aW91c2x5LAoJICAgIG9ubHkgdGhlIG9sZCAiaWdub3JlIiBmbGFnIHdhcyBjaGVja2VkICh3aGljaCB3b3VsZCBjdXJyZW50bHkKCSAgICBzdGlsbCB3b3JrIHByb3Blcmx5LCBidXQgaXMgZGVwcmVjYXRlZCkuCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieSAtIGJ1dCBzaG91bGQgYmUgbWFkZSBnZW5lcmljXQoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSBhZGRlZC4KCgkgICAgVGhpcyBmZWF0dXJlIGFsbG93cyB5b3UgdG8gaWdub3JlIHRoZSBvdXRwdXQgb2YgYSBmdW5jdGlvbiBzbwoJICAgIHRoYXQgaXQgaXMgbm90IGFkZGVkIHRvIGEgbGlzdCBvZiBvdXRwdXQgdmFsdWVzCgkgICAgKCBpZS4gYXJnb3V0cyApLgoJICAgIFRoaXMgc2hvdWxkIGFsc28gYmVjb21lIGEgZmVhdHVyZSBvZiAldHlwZW1hcChkaXJlY3Rvcm91dCkKCSAgICBhcyAibnVtb3V0cHV0cyI9MCwganVzdCBsaWtlICJudW1pbnB1dHMiPTAgZXhpc3RzLgoKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3JzIj0xKQoKCSAgICAlaW5jbHVkZSA8dHlwZW1hcHMuaT4KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgeyBDbGFzczo6bWVtYmVyX2Z1bmN0aW9uMSB9OwoJICAgICV0eXBlbWFwKG91dCkgTVN0YXR1cyB7IC8vIHNvbWUgY29kZSwgbGlrZSBjaGVjayBtc3RhdHVzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJhaXNlIGV4Y2VwdGlvbiBpZiB3cm9uZyB9OwoKCSAgICAlaW5saW5lICV7CgkgICAgICB0eXBlZGVmIGludCBNU3RhdHVzOwoJICAgICAgY2xhc3MgQ2xhc3MgewoKCSAgICAgIC8vIG9uZSBhcmd1bWVudCByZXR1cm5lZCwgYnV0IGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIGRpc2NhcmRlZCBhcyBhIHJldHVybiAob3V0KSBwYXJhbWV0ZXIuCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMSggaW50JiBPVVRQVVQgKTsKCgkgICAgICAvLyB0d28gYXJndW1lbnRzIHJldHVybmVkLCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBub3QgZGlzY2FyZGVkCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMiggaW50JiBPVVRQVVQgKTsKCSAgICAgIH07CiAgICAgICAgICAgICV9CgoKMDQvMjEvMjAwNzogb2xseQoJICAgIEZpeCBwYXJzaW5nIG9mIGZsb2F0IGNvbnN0YW50cyB3aXRoIGFuIGV4cG9uZW50IChlLmcuIDFlLTAyZikKCSAgICAoYnVnICMxNjk5NjQ2KS4KCjA0LzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggbGFjayBvZiBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3Mgd2hlbiAtTyBpcyB1c2VkLgoJICAgIEFsc28sIGZpeCBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3MgY29udGFpbmluZyBhIGRvdWJsZSBxdW90ZQoJICAgIGNoYXJhY3Rlci4gIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIGJ1ZyMxNzAwMTQ2LgoKMDQvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTdXBwb3J0IGZvciBhZGRpbmcgaW4gSmF2YS9DIyBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGludGVybWVkaWFyeSBjYWxsLAogICAgICAgICAgICBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbWFyc2hhbGxpbmcgb2YgdGhlIHByb3h5IHR5cGUgdG8gdGhlIGludGVybWVkaWFyeSB0eXBlLgogICAgICAgICAgICBUaGUgamF2YWluL2NzaW4gdHlwZW1hcCBub3cgc3VwcG9ydHMgdGhlICdwcmUnIGFuZCAncG9zdCcgYXR0cmlidXRlcyB0byBhY2hpZXZlIHRoaXMuCiAgICAgICAgICAgIFRoZSBqYXZhaW4gdHlwZW1hcCBhbHNvIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdwZ2NwcG5hbWUnIGF0dHJpYnV0ZSBmb3IgcHJlbWF0dXJlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciBuYW1pbmcgYW5kIHRoZSBjc2luIHR5cGVtYXAgc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ2NzaGluJwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSB1c2VkIGluIGEgY29uc3RydWN0b3IgaGVscGVyIGdlbmVyYXRlZCB3aGVuIHRoZSB0eXBlIGlzIHVzZWQKICAgICAgICAgICAgaW4gYSBjb25zdHJ1Y3Rvci4gRGV0YWlscyBpbiB0aGUgSmF2YS5odG1sIGFuZCBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIERvbid0IHRyZWF0IGByZXN0cmljdCcgYXMgYSByZXNlcnZlZCBpZGVudGlmaWVyIGluIEMrKyBtb2RlCgkgICAgKGJ1ZyMxNjg1NTM0KS4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhvdyB6ZW5kX3Rocm93X2V4Y2VwdGlvbigpIGlzIGNhbGxlZCAoYnVnICMxNzAwNzg1KS4KCjA0LzEwLzIwMDc6IG9sbHkKCSAgICBEZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0byB0ZW1wbGF0ZSBmb3IgYUNDIChyZXBvcnRlZCBvbgoJICAgIHN3aWctdXNlciB0aGF0IHRoaXMgaXMgbmVlZGVkKS4KCjA0LzA0LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gSWYgWlRTIGlzIGVuYWJsZWQsIHJlbGVhc2UgPG1vZHVsZT5fZ2xvYmFsc19pZCBpbiBNU0hVVERPV04KCSAgICB0byBhdm9pZCBQSFAgaW50ZXJwcmV0ZXIgY3Jhc2ggb24gc2h1dGRvd24uICBUaGlzIHNvbHV0aW9uIHdhcwoJICAgIHN1Z2dlc3RlZCBoZXJlOiBodHRwOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9NDA5ODUKCjA0LzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNF0gQWRkIG1pc3NpbmcgWlRTIGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBDKysgd3JhcHBlciBjb2RlCgkgICAgdG8gZml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIHdoZW4gdXNpbmcgWlRTIGVuYWJsZWQgU1dJRyAoTGludXgKCSAgICBkaXN0cmlidXRpb25zIHRlbmQgdG8gZGlzYWJsZSBaVFMsIGJ1dCBub3RhYmx5IHRoZSBXaW5kb3dzIGJ1aWxkCgkgICAgdXNlcyBpdCBieSBkZWZhdWx0KS4KCjA0LzAxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2ODQyNjE6IGZpeGVzIGhhbmRsaW5nIG9mIHVuc2lnbmVkIGludCBsaXRlcmFscywgdGhhbmtzIExlaWdoIFNtaXRoLgogICAgICAgICAgICBBbHNvLCBpbXByb3ZlZCBkb2N1bWVudGF0aW9uLgoKMDMvMzAvMjAwNzogb2xseQoJICAgIEF2b2lkIGdlbmVyYXRpbmcgJzw6JyB0b2tlbiB3aGVuIHVzaW5nIFN3aWdWYWx1ZVdyYXBwZXI8PiBvbiBhIHR5cGUKCSAgICB3aGljaCBzdGFydHMgd2l0aCAnOjonIChwYXRjaCAjMTY5MDk0OCkuCgowMy8yNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbcGVybDVdIEFkZCBTV0lHX2ZhaWwgdG8gdGhlIFNXSUdfZXhjZXB0aW9uIG1hY3JvLiAgRml4ZXMgYSBmZXcgcHJvYmxlbXMgcmVwb3J0ZWQKCSAgICBvbiB0aGUgbWFpbGluZyBsaXN0LgoKMDMvMjMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU3RyaW5nIGNvcHlpbmcgcGF0Y2ggZnJvbSBKb3NoIENoZXJyeSByZWR1Y2luZyBtZW1vcnkgY29uc3VtcHRpb24gYnkgYWJvdXQgMjUlLgoKMDMvMjEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxNjMxOTg3IGZyb20gVWxyaWsgUGV0ZXJzb24gLSBib29sIElOT1VUIHR5cGVtYXBzCiAgICAgICAgICAgIGZhaWwgb24gYmlnIGVuZGlhbiBtYWNoaW5lcy4KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgZ2l2ZW4gZG9kZ3kgQysrIGNvZGU6IG5hbWVzcGFjZSBhYmM6OmRlZiB7IH0KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBzbyB0aGF0IEFSUkFZU09GQ0xBU1NFUyBhbmQgQVJSQVlTT0ZFTlVNUyBpbiBhcnJheXNfamF2YS5pIGNhbiBiZSBhcHBsaWVkCiAgICAgICAgICAgIHRvIHBvaW50ZXIgdHlwZXMuCgowMy8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIFdoZW4gd2Uga25vdyB0aGUgbGl0ZXJhbCBudW1lcmljIHZhbHVlIGZvciBhIGNvbnN0YW50LCB1c2UKCSAgICB0aGF0IHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgUEhQIHdyYXBwZXIgY2xhc3MuCgowMy8wMi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBQSFAgd3JhcHBlciBjb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBjYXNlcyBvZgoJICAgIG92ZXJsb2FkZWQgZm9ybXMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4KCjAyLzI2LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2NTYzOTU6IGZpeGVkIGhleCBhbmQgb2N0YWwgdmFsdWVzIGJ1ZywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuCgowMi8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBidWcgaW4gdHlwZW1hcHMgd2hpY2ggY2F1c2VkIGRlcml2ZWRfYnl2YWx1ZSBhbmQgcm5hbWUgdGVzdCBjYXNlcyB0byBmYWlsLgoJICAgIFVwZGF0ZWQgZGVyaXZlZF9ieXZhbHVlLmkgdG8gZXhwbGFpbiBob3cgdG8gZmluZCBhbmQgZml4IHRoZSBwcm9ibGVtCgowMS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1Mzg1MjIgYW5kICMxMzM4NTI3LCBmb3J3YXJkIHRlbXBsYXRlZCBjbGFzcyBkZWNsYXJhdGlvbnMgd2l0aG91dCBhCiAgICAgICAgICAgIG5hbWUgZm9yIHRoZSB0ZW1wbGF0ZWQgY2xhc3MgcGFyYW1ldGVycywgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCBjbGFzcz4gY2xhc3MgWDsKCjAxLzIzLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMxNjQwODYyOiA8bWFsbG9jLmg+IHJlcGxhY2VkIGJ5IDxzdGRsaWIuaD4KCSAgICBQYXRjaCAjMTU5ODA2MyBUeXBvIGluIHR5cGVtYXBzLmkKCjAxLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgbHVhIHNwZWNpZmljIGNhcnJheXMuaSB3aGljaCBhZGRzIHRoZSBvcGVyYXRvcltdIHN1cHBvcnQuCgkgICAgbW9kaWZpZWQgdGhlIG1haW4gY29kZSB0byBtYWtlIGl0IG5vdCBlbWl0IGFsbCB0aGUgY2xhc3MgbWVtYmVyIGZ1bmN0aW9ucyAmIGFjY2Vzc29ycwoJICAgIE5vdGU6IEMgc3RydWN0cyBhcmUgY3JlYXRlZCB1c2luZyBuZXdfWFhYKCkgd2hpbGUgQysrIGNsYXNzZXMgdXNlIFhYWCgpIChzaG91bGQgYmUgc3RhbmRhcmRpc2VkKQoJICAgIFVwZGF0ZWQgdGVzdCBjYXNlOiBsaV9jYXJyYXlzCgkgICAgVXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbi4KCjAxLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZCBzdXBwb3J0IGZvciBuZXdmcmVlIHR5cGVtYXBzIChzb21ldGltZXMgdXNlZCBieSAlbmV3b2JqZWN0KQoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtbWFjcm9lcnJvcnMuICAgV2hlbiBzdXBwbGllZCwgdGhpcyB3aWxsIGZvcmNlCiAgICAgICAgICAgIHRoZSBDIHNjYW5uZXIvcGFyc2VyIHRvIHJlcG9ydCBwcm9wZXIgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGNvZGUgY29udGFpbmVkCiAgICAgICAgICAgIGluc2lkZSBTV0lHIG1hY3JvcyAoZGVmaW5lZCB3aXRoICVkZWZpbmUpLiAgQnkgZGVmYXVsdCwgU1dJRyBtZXJlbHkgcmVwb3J0cwogICAgICAgICAgICBlcnJvcnMgb24gdGhlIGxpbmUgYXQgd2hpY2ggYSBtYWNybyBpcyB1c2VkLiAgV2l0aCB0aGlzIG9wdGlvbiwgeW91CiAgICAgICAgICAgIGNhbiBleHBhbmQgdGhlIGVycm9yIGJhY2sgdG8gaXRzIHNvdXJjZS0tLXNvbWV0aGluZyB3aGljaCBtYXkgc2ltcGxpZnkKICAgICAgICAgICAgZGVidWdnaW5nLgoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXSBNYWpvciBvdmVyaGF1bCBvZiBDL0MrKyBzY2FubmluZyBpbXBsZW1lbnRhdGlvbi4gIEZvciBxdWl0ZQogICAgICAgICAgICBzb21lIHRpbWUsIFNXSUcgY29udGFpbmVkIHR3byBjb21wbGV0ZWx5IGluZGVwZW5kZW50IEMvQysrIHRva2VuaXplcnMtLQogICAgICAgICAgICB0aGUgbGVnYWN5IHNjYW5uZXIgaW4gQ1BhcnNlL2NzY2FubmVyLmMgYW5kIGEgZ2VuZXJhbCBwdXJwb3NlIHNjYW5uZXIKICAgICAgICAgICAgaW4gU3dpZy9zY2FubmVyLmMuIFNXSUcgc3RpbGwgaGFzIHR3byBzY2FubmluZyBtb2R1bGVzLCBidXQgdGhlIEMgcGFyc2VyCiAgICAgICAgICAgIHNjYW5uZXIgKENQYXJzZS9jc2Nhbm5lci5jKSBub3cgcmVsaWVzIHVwb24gdGhlIGdlbmVyYWwgcHVycG9zZQogICAgICAgICAgICBzY2FubmVyIGZvdW5kIGluIFN3aWcvc2Nhbm5lci5jLiAgQXMgYSByZXN1bHQsIGl0IGlzIG11Y2ggc21hbGxlciBhbmQKICAgICAgICAgICAgbGVzcyBjb21wbGljYXRlZC4gIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gbWFpbnRhaW4gYWxsCiAgICAgICAgICAgIG9mIHRoZSBsb3ctbGV2ZWwgQyB0b2tlbml6aW5nIGluIG9uZSBjZW50cmFsIGxvY2F0aW9uIGluc3RlYWQgb2YgdHdvCiAgICAgICAgICAgIHBsYWNlcyBhcyBiZWZvcmUuCgogICAgICAgICAgICAqKipQT1RFTlRJQUwgRkxBS0lORVNTKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBjYXVzZSBwcm9ibGVtcyB3aXRoIGFjY3VyYXRlIGxpbmUgbnVtYmVyIHJlcG9ydGluZwogICAgICAgICAgICBhcyB3ZWxsIGFzIGVycm9yIHJlcG9ydGluZyBtb3JlIGdlbmVyYWxseS4gSSBoYXZlIHRyaWVkIHRvIHJlc29sdmUgdGhpcwogICAgICAgICAgICBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgdGhlcmUgbWlnaHQgYmUgc29tZSBjb3JuZXIgY2FzZXMuCgowMS8xMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCB0eXBlbWFwIHRocm93cyBmb3Igc3RkOjpzdHJpbmcqLCB0eXBlbWFwIGZvciBTV0lHVFlQRSBEWU5BTUlDLAoJICAgIGNoYW5nZWQgdGhlIGV4aXN0aW5nIHRocm93cyB0eXBlbWFwIHRvIHRocm93IGEgc3RyaW5nIGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBvZgoJICAgIHRoZSBvYmplY3QgKHVwZGF0aW5nIGEgZmV3IHRlc3QgY2FzZXMgdG8gZGVhbCB3aXRoIHRoZSBjaGFuZ2UpLgoJICAgIGZpeGVkIHRlc3QgY2FzZTogZHluYW1pY19jYXN0cywgZXhjZXB0aW9uX3BhcnRpYWxfaW5mbywgbGlfc3RkX3N0cmluZywgc2l6ZV90CgowMS8wMy8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdLiAgVXNlIG9mIHN3aWdrZXlzLmMvLmggdmFyaWFibGVzIGlzIHJldm9rZWQuICBQbGVhc2UgdXNlCiAgICAgICAgICAgIHNpbXBsZSBzdHJpbmdzIGZvciBhdHRyaWJ1dGUgbmFtZXMuCgoxMi8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIEFQSSBmdW5jdGlvbnMgSGFzaEdldEF0dHIoKSBhbmQgSGFzaENoZWNrQXR0cigpIGhhdmUgYmVlbiByZXZva2VkLgogICAgICAgICAgICBQbGVhc2UgdXNlIEdldGF0dHIoKSB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzLiAgVGhlIGZ1bmN0aW9uIENoZWNrYXR0cigpIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIGNoZWNrIGF0dHJpYnV0ZXMuICBOb3RlOiAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiByZXZva2VkCiAgICAgICAgICAgIGJlY2F1c2UgdGhleSBvbmx5IGFkZGVkIGEgbWFyZ2luYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYXQgdGhlIGV4cGVuc2UKICAgICAgICAgICAgY29kZSBjbGFyaXR5LgoKMTIvMjYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbW9yZSBTVEwgKG1vcmUgZXhjZXB0aW9ucywgbWFwLCBzaXplX3QpLAoJICAgIGZpeGVkIHRlc3QgY2FzZTogY29udmVyc2lvbl9uc190ZW1wbGF0ZS4KCjEyLzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZSB0byB0aHJvdyBlcnJvcnMgd2hlbiBzZXR0aW5nIGltbXV0YWJsZXMsCgkgICAgYW5kIGFsbG93aW5nIHVzZXIgYWRkaXRpb24gb2YgbW9kdWxlIHZhcmlhYmxlcy4KCjEyLzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlZGVmJ2QgdmFyaWFibGUgd3JhcHBlcnMgdGhhdCB1c2UgJW5hdHVyYWx2YXIsIGVnLCBzdGQ6OnN0cmluZy4KCjEyLzE0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCB0eXBlbWFwcwoKMTIvMTQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCBidWcgIzE2MTM2NzMgKGJhZCBQSFA1IGNvZGUgZ2VuZXJhdGVkIGZvciBnZXR0ZXJzIGFuZAoJICAgIHNldHRlcnMpLgoKMTIvMDIvMjAwNjogd3NmdWx0b24sIEpvaG4gTGVueiwgRGF2ZSBCZWF6bGV5CiAgICAgICAgICAgIE1vdmUgZnJvbSBjdnMgdG8gU3VidmVyc2lvbiBmb3Igc291cmNlIGNvbnRyb2wKCjExLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgQ2xlYW5lZCB1cCBzd2lnd2FybmluZ3Muc3dnIGZpbGUgbm90IHRvIHVzZSBuZXN0ZWQgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbnMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBmb3IgJWV4dGVuZCB0byB3b3JrIGZvciBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4KClZlcnNpb24gMS4zLjMxIChOb3ZlbWJlciAyMCwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogTHVpZ2kgQmFsbGFiaW8KICAgICAgICAgICAgW1B5dGhvbl0gQWx0ZXJuYXRlIGZpeCBmb3IgUHl0aG9uIGV4Y2VwdGlvbnMgYnVnICMxNTc4MzQ2ICh0aGUgcHJldmlvdXMgb25lIGJyb2tlIFB5dGhvbgogICAgICAgICAgICBwcm9wZXJ0aWVzIGluIG1vZGVybiBjbGFzc2VzKQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgLWZha2V2ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBub3cgZ2VuZXJhdGVzIHRoZSBmYWtlIHZlcnNpb24gaW50byB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZGlzcGxheWluZyBpdCB3aGVuIHRoZSAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gaXMgdXNlZC4KCjE0LzExLzIwMDY6IG1nb3NzYWdlCgkgICAgW2x1YV0gdXBkYXRlIHRvIHR5cGVtYXAgZm9yIG9iamVjdCBieSB2YWx1ZSwgdG8gbWFrZSBpdCBjODkgY29tcGxpYW50CgpWZXJzaW9uIDEuMy4zMCAoTm92ZW1iZXIgMTMsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW2phdmFdIFJlbW92ZSBEZXRhY2hDdXJyZW50VGhyZWFkIHBhdGNoIGZyb20gIDA4LzExLzIwMDYgLSBpdCBjYXVzZXMgc2VnZmF1bHRzCiAgICAgICAgICAgIG9uIHNvbWUgc3lzdGVtcy4KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtweXRob25dIEZpeCAjMTU3ODM0NiAtIFB5dGhvbiBleGNlcHRpb25zIHdpdGggLW1vZGVybgoKMTEvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTkzMjkxIC0gU21hcnQgcG9pbnRlcnMgYW5kIGluaGVyaXRpbmcgZnJvbSB0ZW1wbGF0ZXMgCgoxMS8wOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3Igb3BlcmF0b3IgcG9pbnRlci9yZWZlcmVuY2UgY2FzdHMgLSAjMTU5MjE3My4KCjExLzA3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkc2VsZiBzcGVjaWFsIHZhcmlhYmxlIGZvciAlZXh0ZW5kIG1ldGhvZHMuIFBsZWFzZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgJ3NlbGYnCiAgICAgICAgICAgIGFzIHRoZSBDKysgJ3RoaXMnIHBvaW50ZXIuCgoxMS8wNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdIAoJICAgIGFsbGVncm9jbC5zd2c6IHN3aWctZGVmdmFyIHVwZGF0ZWQgdG8gYWxsb3cgc3BlY2lmeWluZyBvZgoJICAgIAkJICAgbm9uLWRlZmF1bHQgZm9yZWlnbiB0eXBlICh2aWEgOmZ0eXBlIGtleXdvcmQgYXJnKS4KCSAgICBhbGxlZ3JvY2wuY3h4OiBTcGVjaWZ5IHByb3BlciBhY2Nlc3MgdHlwZSBmb3IgZW51bSB2YWx1ZXMuCgoxMS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YS9DI10gRml4IGNvbnN0IHN0ZDo6c3RyaW5nJiByZXR1cm4gdHlwZXMgZm9yIGRpcmVjdG9ycyBhcyByZXBvcnRlZCBieQogICAgICAgICAgICBNYXJrIERvbnNlbHptYW5uCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIERlbGV0ZUxvY2FsUmVmIGZyb20gZW5kIG9mIGRpcmVjdG9yIG1ldGhvZHMgZm9yIG5vdyBhcyBpdCBpcyBjYXVzaW5nIGEKICAgICAgICAgICAgc2VnIGZhdWx0IHdoZW4gcnVuIG9uIFNvbGFyaXMgOC4KCjEwLzI5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gUGF0Y2ggZnJvbSBDaHJpcyBTaG9lbWFrZXIgdG8gY2xlYW4gdXAgc29tZSB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuCgoxMC8yOS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSW1wb3J0YW50IGZpeCB0byBwcmV2ZW50IGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbiBvZiB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGluIGEgbmF0aXZlIG1ldGhvZC4gVGhlIGZpbmFsaXplciBjb3VsZCBkZXN0cm95IHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIEMrKyBvYmplY3Qgd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQuIFRoZSBwcm9ibGVtIG9jY3VycyB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBubwogICAgICAgICAgICBsb25nZXIgc3Ryb25nbHkgcmVhY2hhYmxlIGFmdGVyIGEgbmF0aXZlIGNhbGwuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBvY2N1ciBpbgogICAgICAgICAgICBtZW1vcnkgc3RyZXNzIHNpdHVhdGlvbnMgb24gc29tZSBKVk1zLiBJdCBkb2VzIG5vdCBzZWVtIHRvIG9jY3VyIG9uIHRoZQogICAgICAgICAgICBTdW4gY2xpZW50IEpWTSB1cCB0byBqZGsgMS41LiBIb3dldmVyIHRoZSAxLjYgY2xpZW50IGpkayBoYXMgYSBtb3JlIGFnZ3Jlc3NpdmUgZ2FyYmFnZQogICAgICAgICAgICBjb2xsZWN0b3IgYW5kIHNvIHRoZSBwcm9ibGVtIGRvZXMgb2NjdXIuIEl0IGRvZXMgb2NjdXIgb24gdGhlIFN1biBzZXJ2ZXIKICAgICAgICAgICAgSlZNcyAoY2VydGFpbmx5IDEuNCBvbndhcmRzKS4gVGhlIGZpeCBlbnRhaWxzIHBhc3NpbmcgdGhlIHByb3h5IGNsYXNzIGludG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gYWRkaXRpb24gdG8gdGhlIEMrKyBwb2ludGVyIGluIHRoZSBsb25nIHBhcmFtZXRlciwgYXMgSmF2YSBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgICAgY29sbGVjdGVkIHdoZW4gdGhleSBhcmUgcGFzc2VkIGludG8gSk5JIG1ldGhvZHMuIFRoZSBleHRyYSBwYXJhbWV0ZXIgY2FuIGJlIHN1cHByZXNzZWQKICAgICAgICAgICAgYnkgc2V0dGluZyB0aGUgbm9wZ2NwcCBhdHRyaWJ1dGUgaW4gdGhlIGp0eXBlIHR5cGVtYXAgdG8gIjEiIG9yIHVzaW5nIHRoZSBuZXcgLW5vcGdjcHAKICAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgU2VlIEphdmEuaHRtbCNqYXZhX3BnY3BwIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyB0b3BpYy4KCjEwLzI0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMuIFRoZSB2aXJ0dWFsL292ZXJyaWRlL25ldyBrZXl3b3JkIGlzIG5vdCBnZW5lcmF0ZWQKICAgICAgICAgICAgZm9yIGVhY2ggbWV0aG9kIGFzIHRoZSBzbWFydCBwb2ludGVyIGNsYXNzIGRvZXMgbm90IG1pcnJvciB0aGUgdW5kZXJseWluZyBwb2ludGVyCiAgICAgICAgICAgIGNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gU0YgIzE0OTY1MzUKCjEwLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIG5hdGl2ZSBtZXRob2RzICYgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgogICAgICAgICAgICBmaXhlZCB0ZXN0IGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzICYgY3BwX2Jhc2ljLiBBZGRlZCBuZXcgZXhhbXBsZSAoZnVuY3RvcikuCiAgICAgICAgICAgIHRpZGllZCB1cCBhIGxpdHRsZSBvZiB0aGUgY29kZSAoYXJvdW5kIGNsYXNzSGFuZGxlcikuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIGRpcmVjdG9yb3V0IHR5cGVtYXAgY2hhbmdlcyB0byBmYWxsIGluIGxpbmUgd2l0aCB0aGUgb3RoZXIgZGlyZWN0b3IKICAgICAgICAgICAgbGFuZ3VhZ2VzLiAkcmVzdWx0IGlzIG5vdyB1c2VkIHdoZXJlICQxIHVzZWQgdG8gYmUgdXNlZC4gUGxlYXNlIGNoYW5nZSB5b3VyIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIHlvdSBoYXZlIGEgY3VzdG9tIGRpcmVjdG9yb3V0IHR5cGVtYXAuCgoxMC8xOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBTb21lIGZpeGVzIGZvciBhcHBseWluZyB0aGUgY2hhciBhcnJheSB0eXBlbWFwcyB0byB1bnNpZ25lZCBjaGFyIGFycmF5cy4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIGluIGNvbnN0IHNpemVfdCYgYW5kIGNvbnN0IHN0ZDo6c2l6ZV90JiB0eXBlbWFwcy4KCjEwLzE1LzIwMDY6IGVmdXp6eW9uZSAKICAgICAgICAgICAgW0NGRkldIFN1cHByZXNzIGdlbmVyYXRpbmcgZGVmY3R5cGUgZm9yIGVudW1zLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcy4gUGF0Y2ggMTU2MDk4My4gCgoxMC8xNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIE1pbm9yIGZpeCB0byBtYWtlIFNXSUcgd29yayB3aXRoIHRoZSAoYXMgeWV0IHVucmVsZWFzZWQpIGNoaWNrZW4gMi41CgogICAgICAgICAgICBbR3VpbGUsQ2hpY2tlbl0gRml4IFNGIEJ1ZyAxNTczODkyLiAgQWRkZWQgYW4gZXh0X3Rlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgdG8gdGVzdAogICAgICAgICAgICB0aGlzIGJ1ZywgYnV0IHRoaXMgdGVzdCBjYW4gbm90IHJlYWxseSBiZSBtYWRlIGdlbmVyaWMgYmVjYXVzZSB0aGUgZXh0ZXJuYWwgY29kZSBtdXN0CiAgICAgICAgICAgIHBsdWcgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGludGVycHJldGVyIGRpcmVjdGx5LgogICAgICAgICAgICBTZWUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9jaGlja2VuL2V4dF90ZXN0LmkgYW5kIGV4dF90ZXN0X2V4dGVybmFsLmN4eAoKICAgICAgICAgICAgQWRkZWQgYSAlLmV4dGVybmFsdGVzdCB0byBjb21tb24ubWssIGFuZCBhbnkgaW50ZXJlc3RlZCBsYW5ndWFnZSBtb2R1bGVzIGNhbgogICAgICAgICAgICBjb3B5IGFuZCBzbGlnaHRseSBtb2RpZnkgZWl0aGVyIHRoZSBjaGlja2VuIG9yIHRoZSBndWlsZSBleHRfdGVzdC5pCgoxMC8xNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBhZGRlZCBPVVRQVVQmIGZvciBhbGwgbnVtYmVyIHR5cGVzLCBhZGRlZCBhIGxvbmcgbG9uZyB0eXBlCiAgICAgICAgICAgIGZpeGVkIHNldmVyYWwgdGVzdCBjYXNlcy4KICAgICAgICAgICAgdXBkYXRlOiBjaGFuZ2VkIHR5cGVtYXBzIHRvIHVzZSBTV0lHX0NvbnZlcnRQdHIgcmF0aGVyIHRoYW4gU1dJR19NdXN0R2V0UG9pbnRlcgogICAgICAgICAgICBzdGFydGVkIHNwbGl0aW5nIGx1YS5zd2cgaW50byBzbWFsbGVyIHBhcnRzIHRvIG1ha2UgaXQgbmVhdGVyCgoxMC8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIE1hcmdpbmFsbHkgYmV0dGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlIG9ubHkgaW4gdGhhdCB5b3UgY2FuCiAgICAgICAgICAgIGNvbnRyb2wgd2hhdCB0aGUgYmFzZSBjbGFzcyBpcy4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBuZXcgJ3JlcGxhY2UnIGF0dHJpYnV0ZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwLCBlZyBpbiB0aGUgZm9sbG93aW5nLCAnTWUnIHdpbGwgYmUgdGhlIGJhc2UgY2xhc3MsCiAgICAgICAgICAgIG5vIG1hdHRlciB3aGF0IEZvbyBpcyByZWFsbHkgZGVyaXZlZCBmcm9tIGluIHRoZSBDKysgbGF5ZXIuCgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlLCByZXBsYWNlPSIxIikgRm9vICJNZSI7CgogICAgICAgICAgICBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgZm9yIHRoZSBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcHMgdG8gb3ZlcnJpZGUgdGhlIEMrKyBiYXNlLgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBkZWxldGUoKSBtZXRob2QgCiAgICAgICAgICAgIChpdCBpcyBub3cgYSBzeW5jaHJvbml6ZWQgbWV0aG9kLCBidXQgaXMgbm93IGN1c3RvbWlzYWJsZSBieSBjaGFuZ2luZyB0aGUgCiAgICAgICAgICAgIG1ldGhvZG1vZGlmaWVycyBhdHRyaWJ1dGUgaW4gdGhlIHRoZSBqYXZhZGVzdHJ1Y3Qgb3IgamF2YWRlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcCkKCiAgICAgICAgICAgIFtDI10gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIERpc3Bvc2UoKSBtZXRob2QsIAogICAgICAgICAgICBzaW1pbGFyIHRvIEphdmEncyBkZWxldGUoKSBhYm92ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gUmVtb3ZlIHJlZHVuZGFudCBkaXJlY3RvciBjb2RlIGluICVleHRlbmQgbWV0aG9kcyAoJWV4dGVuZAogICAgICAgICAgICBtZXRob2RzIGNhbm5vdCBiZSBkaXJlY3RvciBtZXRob2RzKQoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gRml4ICMxNTA1NTk0IC0gZGlyZWN0b3Igb2JqZWN0cyBub3QgcmV0dXJuZWQgYXMgZGlyZWN0b3Igb2JqZWN0cwogICAgICAgICAgICBpbiAlZXh0ZW5kIG1ldGhvZHMuCgoxMC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ICMxMjM4Nzk4IC0gRGlyZWN0b3JzIHVzaW5nIHVuc2lnbmVkIGxvbmcgbG9uZyBvciBhbnkgb3RoZXIgdHlwZQogICAgICAgICAgICBtYXJzaGFsbGVkIGFjcm9zcyB0aGUgSk5JIGJvdW5kYXJ5IHVzaW5nIGEgSmF2YSBjbGFzcyAod2hlcmUgdGhlIGpuaSB0eXBlbWFwIAogICAgICAgICAgICBjb250YWlucyBqb2JqZWN0KS4KCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTE2MjE5NCAtICNpbmNsdWRlLyVpbmNsdWRlIHdpdGhpbiBhIHN0cnVjdHVyZQoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDUwNjYxLCBzdHJpbmcgdHJ1bmNhdGlvbiBpbiBTdHJpbmdfc2VlayB0cnVuY2F0aW5nIEphdmEvQyMgZW51bXMuCgoxMC8wNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXggIzE1Njk1ODcuIFRoZSBuYW1lIGlzIG5vdyBjb3JyZWN0LgoKMTAvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3IgZml4ZXMgZm9yIHZpcnR1YWwgY29udmVyc2lvbiBvcGVyYXRvcnMKCjEwLzA0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggIzE1Njk1ODcgZm9yIFBIUC4gIERvbid0IHVzZSBzaXplb2YoKSBleGNlcHQgd2l0aCBzdHJpbmcKCSAgICBsaXRlcmFscy4gIENoYW5nZSBzb21lICIvLyIgY29tbWVudHMgdG8gIi8qICovIiBmb3IgcG9ydGFiaWxpdHkuCgoxMC8wNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXJ0aWFsIEZpeCAjMTU2OTU4Ny4gVGhlIHR5cGUgaXMgbm93IGNvcnJlY3QsIGJ1dCB0aGUgbmFtZSBpcyBzdGlsbCBub3QgY29ycmVjdC4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzE1Mjc4ODUgLSBPdmVybG9hZGVkIGRpcmVjdG9yIHZpcnR1YWwgbWV0aG9kcyBzb21ldGltZXMgcHJvZHVjZWQKICAgICAgICAgICAgdW5jb21waWxlYWJsZSBjb2RlIHdoZW4gdXNlZCB3aXRoIHRoZSBkaXJlY3RvcjpleGNlcHQgZmVhdHVyZS4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yczogRGlyZWN0b3JzIGFyZSBvdXRwdXQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIAogICAgICAgICAgICB0aGUgQysrIGNsYXNzIHJhdGhlciB0aGFuIGluIHNvbWUgcHNldWRvLXJhbmRvbSBvcmRlci4KCjEwLzAzLzIwMDY6IG1tYXR1cwogICAgICAgICAgICBGaXggIzE0ODYyODEgYW5kICMxNDcxMDM5LgoKMTAvMDMvMjAwNjogb2xseQoJICAgIFtQZXJsXSBGaXggZm9yIGhhbmRsaW5nIHN0cmluZ3Mgd2l0aCB6ZXJvIGJ5dGVzIGZyb20gU3RlcGhlbiBIdXRzYWwuCgowOS8zMC8yMDA2OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIEJpdGZpZWxkIHN1cHBvcnQgYW5kIHZhcmFyZyBzdXBwb3J0IGR1ZSB0byBBcnRodXIgU215bGVzLgogICAgICAgICAgICBDIGV4cHJlc3Npb24gdG8gTGlzcCBjb252ZXJzaW9uLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcyBmb3IgdGhlIGluaXRpYWwKICAgICAgICAgICAgaWRlYSwgaXQgbm93IHN1cHBvcnRzIGNvbnZlcnNpb24gZm9yIGEgd2hvbGUgcmFuZ2Ugb2YgQyBleHByZXNzaW9ucy4gCgowOS8yOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1MDgzMjcgLSBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIGhpZGRlbiB3aGVuIHVzaW5nIC1mdmlydHVhbCBvcHRpbWlzYXRpb24uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIGNhbmRpZGF0ZXMgZm9yIGVsaW1pbmF0aW9uIC0gdGhpcyBtaW1pY3MKICAgICAgICAgICAgQysrIGJlaGF2aW91ciB3aGVyZSBhbGwgb3ZlcmxvYWRlZCBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBhbmQgaW1wbGVtZW50ZWQKICAgICAgICAgICAgaW4gYSBkZXJpdmVkIGNsYXNzIGluIG9yZGVyIGZvciB0aGVtIHRvIGJlIGF2YWlsYWJsZS4KCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob24sIE9jYW1sXSBGaXggIzE1MDU1OTEgVGhyb3dpbmcgZXhjZXB0aW9ucyBpbiBleHRlbmRlZCBkaXJlY3RvcnMKCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA1NjEwMCAtIHZpcnR1YWwgb3BlcmF0b3JzLiAKCjA5LzI0LzIwMDY6IG9sbHkKCSAgICBEb24ndCBhY2NpZGVudGFsbHkgY3JlYXRlIGEgIjw6IiB0b2tlbiAod2hpY2ggaXMgdGhlIHNhbWUgYXMgIlsiIGluIEMrKykuCgkgICAgRml4ZXMgYnVnICMgMTUyMTc4OC4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBbUnVieV0gU3VwcG9ydCBidWlsZGluZyB3aXRoIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgUnVieSAxLjkKCSAgICBkZXZlbG9wbWVudCBicmFuY2guICBGaXhlcyBidWcgIzE1NjAwOTIuCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgVGVtcGxhdGVzIGNhbiBub3cgYmUgaW5zdGFudGlhdGVkIHVzaW5nIG5lZ2F0aXZlIG51bWJlcnMgYW5kCgkgICAgY29uc3RhbnQgZXhwcmVzc2lvbnMsIGUuZy46CgoJICAgIHRlbXBsYXRlPGludCBxPiBjbGFzcyB4IHt9OwoJICAgICV0ZW1wbGF0ZSh4X21pbnVzMSkgeDwtMT47CgkgICAgJXRlbXBsYXRlKHhfMXBsdXMyKSB4PDErMj47CgoJICAgIEFsc28sIGNvbnN0YW50IGV4cHJlc3Npb25zIGNhbiBub3cgaW5jbHVkZSBjb21wYXJpc29ucyAoPiwgPCwgPj0sCgkgICAgPD0sICE9LCA9PSksIG1vZHVsdXMgKCUpLCBhbmQgdGVybmFyeSBjb25kaXRpb25hbHMgKGEgPyBiIDogYykuCgoJICAgIEZpeGVzIGJ1Z3MgIzY0NjI3NSwgIzkyNTU1NSwgIzk1NjI4MiwgIzk5NDMwMS4KCjA5LzIyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIG1ldGhvZHMgLSBCdWdzICMxNTQ2MjU0LCAjMTU0MzUzMwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgY29uc3RydWN0b3JzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0cyBhbmQgYXNzZXJ0cyB3aGVuIGRpcmVjdG9yIG1ldGhvZHMgYXJlIGlnbm9yZWQgKCMxNTQzNTMzKQoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IG91dCBvZiBzb3VyY2UgYnVpbGRzIC0gYnVnICMxNTQ0NzE4CgowOS8yMC8yMDA2OiBvbGx5CgkgICAgVHJlYXQgYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbiBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gcmF0aGVyCgkgICAgdGhhbiBpZ25vcmluZyBpdCBjb21wbGV0ZWx5LCBzbyB0aGF0IHdlIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IKCSAgICBwYXNzaW5nIG9wYXF1ZSBwb2ludGVycyB0byB0aGUgbmVzdGVkIGNsYXNzIChmaXhlcyBTRiBidWcgIzkwOTM4NykuCgowOS8yMC8yMDA2OiBvbGx5CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIFtwaHBdIE92ZXJsb2FkIHJlc29sdXRpb24gbm93IHdvcmtzLiAgSG93ZXZlciB0byBhbGxvdyB0aGlzLCBTV0lHCgkgICAgZ2VuZXJhdGVkIHdyYXBwZXJzIG5vIGxvbmdlciBjb2VyY2UgUEhQIHR5cGVzICh3aGljaCByZXZlcnRzIGEgY2hhbmdlCgkgICAgbWFkZSBpbiAxLjMuMjYpLiAgU28gZm9yIGV4YW1wbGUsIGlmIGEgbWV0aG9kIHRha2VzIGEgc3RyaW5nLCB5b3UKCSAgICBjYW4gbm8gbG9uZ2VyIHBhc3MgYSBudW1iZXIgd2l0aG91dCBleHBsaWNpdGx5IGNvbnZlcnRpbmcgaXQgdG8gYQoJICAgIHN0cmluZyBpbiBQSFAgdXNpbmc6IChzdHJpbmcpeAoKMDkvMTgvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gZml4IG9uIHN3aWdpbml0LnN3ZywgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gY3Jhc2ggb24gc2V2ZXJhbCB0ZXN0IGNhc2VzCgkgICAgZm91bmQgYW5kIGZpeGVkIHByb2JsZW0gaW4gaW1wb3J0cyB1bmRlciBweXRob24gKG1pbmd3KQoKMDkvMTYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggZnJvbSBNaWNoYWwgTWFyZWsgZm9yIFB5dGhvbiAyLjUgdG8gZml4IDY0IGJpdCBhcnJheSBpbmRleGVzIG9uCiAgICAgICAgICAgIDY0IGJpdCBtYWNoaW5lcy4KCjA5LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBoYXMgYmVlbiBzY3JhcHBlZC4gVGhpcyBmZWF0dXJlIHdhcyBpbnRyb2R1Y2VkIHByaW1hcmlseQogICAgICAgICAgICB0byBzb2x2ZSByZWN1cnNpdmUgZGlyZWN0b3IgbWV0aG9kIGNhbGxzLiBEaXJlY3RvciB1cGNhbGwgaW1wcm92ZW1lbnRzIG1hZGUgaW5zdGVhZDoKCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBUaGUgc3dpZ191cCBmbGFnIGlzIG5vIGxvbmdlciB1c2VkLiBUaGUgcmVxdWlyZWQgbXV0ZXhlcwogICAgICAgICAgICB3cmFwcGluZyB0aGlzIGZsYWcgYXJlIGFsc28gbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIHJlY3Vyc2l2ZSBjYWxscyBnb2luZyBmcm9tIEMrKwogICAgICAgICAgICB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGFuZCBiYWNrIGFnYWluIGV0YyBhcmUgbm93IGF2b2lkZWQgYnkgYSBzdWJ0bGVseSBkaWZmZXJlbnQKICAgICAgICAgICAgYXBwcm9hY2guIEluc3RlYWQgb2YgdXNpbmcgdGhlIHN3aWdfdXAgZmxhZyBpbiBlYWNoIGRpcmVjdG9yIG1ldGhvZCB0byBpbmRpY2F0ZQogICAgICAgICAgICB3aGV0aGVyIHRoZSBleHBsaWNpdCBDKysgY2FsbCB0byB0aGUgYXBwcm9wcmlhdGUgYmFzZSBjbGFzcyBtZXRob2Qgb3IgYSBub3JtYWwKICAgICAgICAgICAgcG9seW1vcnBoaWMgQysrIGNhbGwgc2hvdWxkIGJlIG1hZGUsIHRoZSBuZXcgYXBwcm9hY2ggbWFrZXMgb25lIG9mIHRoZXNlIGNhbGxzCiAgICAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIHdyYXBwZXIgbWV0aG9kLgoKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgcmVjdXJzaXZlIGNhbGwgcHJvYmxlbSB3aGVuIGNhbGxpbmcgYSBDKysgYmFzZSBjbGFzcyBtZXRob2QgZnJvbQogICAgICAgICAgICBKYXZhL0MjIGlzIG5vdyBmaXhlZC4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIGFzIHRoZSBkZXRlY3Rpb24gYXMgdG8gd2hldGhlciB0aGUgZXhwbGljaXQgY2FsbCBvciBhIG5vcm1hbCBwb2x5bW9ycGhpYyBjYWxsIGlzIG1hZGUKICAgICAgICAgICAgaW4gdGhlIEphdmEvQyMgbGF5ZXIgcmF0aGVyIHRoYW4gaW4gdGhlIEMrKyBsYXllci4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIHVwZGF0ZWQgc3dpZ2luaXQuc3dnIHRvIGFsbG93IG11bHRpcGxlIGludGVycHJldGVycyB0byB1c2UgbXVsdGlwbGUKCSAgICBzd2lnIG1vZHVsZXMgYXQgb25jZS4gVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgaW4gTHVhIChtaW5ndyAmIGxpbnV4KSwKCSAgICBwZXJsNSAmIHB5dGhvbiAobGludXgpIG9ubHkuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBwYXNzaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIHdlbGwgYXMgbmF0aXZlIGx1YSBvYmplY3QKICAgICAgICAgICAgaW50byB3cmFwcGVyZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIEFkZGVkIGV4YW1wbGUgZnVuY3B0cjMgdG8gZGVtb25zdHJhdGUgdGhpcyBmZWF0dXJlCgowOS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVuYW1lIEVycm9yQ29kZSBhbmQgRXJyb3JNc2cgI2RlZmluZS1zIHRvIFNXSUdfRXJyb3JDb2RlCgkgICAgYW5kIFNXSUdfRXJyb3JNc2cgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIGNvZGUgdGhlIHVzZXIgbWlnaHQgYmUKCSAgICB3cmFwcGluZyAocGF0Y2ggZnJvbSBEYXJyZW4gV2FybmVyIGluIFNGIGJ1ZyAjMTQ2NjA4NikuICBBbnkKCSAgICB1c2VyIHR5cGVtYXBzIHdoaWNoIHVzZSBFcnJvckNvZGUgYW5kL29yIEVycm9yTXNnIGRpcmVjdGx5IHdpbGwKCSAgICBuZWVkIGFkanVzdGluZyAtIHlvdSBjYW4gZWFzaWx5IGZpeCB0aGVtIHRvIHdvcmsgd2l0aCBib3RoIG9sZAoJICAgIGFuZCBuZXcgU1dJRyBieSBjaGFuZ2luZyB0byB1c2UgU1dJR19FcnJvck1zZyBhbmQgYWRkaW5nOgoKCQkjaWZuZGVmIFNXSUdfRXJyb3JNc2cKCQkjZGVmaW5lIFNXSUdfRXJyb3JNc2coKSBFcnJvck1zZygpCgkJI2VuZGlmCgowOC8yOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gTW92ZSBjb25zdGFudCBpbml0aWFsaXNhdGlvbiBmcm9tIFJJTklUIHRvIE1JTklUIHRvIGZpeCBhCgkgICAgd2FybmluZyB3aGVuIHVzaW5nIEFwYWNoZSBhbmQgbW9kX3BocC4gIFdlIG9ubHkgbmVlZCB0byBjcmVhdGUKCSAgICBQSFAgY29uc3RhbnRzIG9uY2Ugd2hlbiB3ZSdyZSBmaXJzdCBpbml0aWFsaXNlZCwgbm90IGZvciBldmVyeSBIVFRQCgkgICAgcmVxdWVzdC4KCjA4LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTQyNDY2IGFkZGVkIGNvZGUgdG8gYWxsb3cgbWFwcGluZyBMdWEgbmlsJ3MgPC0+IEMvQysrIE5VTEwncwoJICAgIHVwZGF0ZWQgdmFyaW91cyB0eXBlbWFwcyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBjaGFuZ2VzCgkgICAgYWRkZWQgdm9pZHRlc3RfcnVubWUubHVhIHRvIHNob3cgdGhlIGZlYXR1cmVzIHdvcmtpbmcKCjA4LzE5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gQWRkIGZlYXR1cmU6Y29uc3Rhc3ZhciB0byBleHBvcnQgY29uc3RhbnRzIGFzIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUuCgowOC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGV0YWNoQ3VycmVudFRocmVhZCBjYWxscyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCBuYXRpdmVseSBjcmVhdGVkIHRocmVhZHMKICAgICAgICAgICAgbm8gbG9uZ2VyIHByZXZlbnQgdGhlIEpWTSBmcm9tIGV4aXRpbmcuIEJ1ZyByZXBvcnRlZCBieSBUaG9tYXMgRHVkemlhayBhbmQKICAgICAgICAgICAgUGF1bCBOb2xsLgoKMDgvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMgc28gdGhleSB3b3JrCgowNy8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbW9yZSBhZGRpdGlvbnMgdG8gc3RkOjpzdHJpbmcsIHNvbWUgdHdlYWtzIGFuZCBzbWFsbCBidWcgZml4ZXMKCSAgICAtbm9jd3JhcCBtb2RlLgoKMDcvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1MjYwMjIgcGRhdGVkIHN0ZDo6c3RyaW5nIHRvIHN1cHBvcnQgc3RyaW5ncyB3aXRoICdcMCcgaW5zaWRlIHRoZW0KCSAgICB1cGRhdGVkIHR5cGVtYXBzLmkgdG8gYWRkIHN1cHBvcnQgZm9yIHBvaW50ZXIgdG8gcG9pbnRlcnMKCjA3LzE5LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEFkZCBzdGRfc3RyaW5nLmkgc3VwcG9ydC4KCSAgICAtIEFkZCBuZXdvYmplY3QgcGF0Y2ggc3VibWl0dGVkIGJ5IG1rb2VwcGUgKHRoYW5rcyEpCgkgICAgLSBGaXggdHlwZSBuYW1lIG1pc21hdGNoIGlzc3VlIGZvciBuZXN0ZWQgdHlwZSBkZWZpbml0aW9ucy4KCSAgICAgIHNwZWNpZmljYWxseSB0eXBlZGVmcyBpbiB0ZW1wbGF0ZWQgY2xhc3MgZGVmbnMuCgowNy8xOC8yMDA2OiBtZ29zc2FnZQoJICAgIEJ1Z2ZpeCAjMTUyMjg1OAoJICAgIHVwZGF0ZWQgbHVhLmN4eCB0byBzdXBwb3J0IC1leHRlcm5hbC1ydW50aW1lIGNvbW1hbmQKCjA3LzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEluY3JlbWVudCB0aGUgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gMywgYmVjYXVzZSBvZiB0aGUKCSAgICBhZGRpdGlvbiBvZiB0aGUgb3duZGF0YSBtZW1iZXIgaW4gc3dpZ190eXBlX2luZm8uCgkgICAgUmVwb3J0ZWQgYnk6IFByYWJodSBSYW1hY2hhbmRyYW4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlYXJjaCBwYXRoIGZpeGVzOgogICAgICAgICAgICAtIEZpeCBzZWFyY2ggcGF0aCBmb3IgbGlicmFyeSBmaWxlcyB0byBiZWhhdmUgYXMgZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwuCiAgICAgICAgICAgIC0gRml4IG1pbmd3L21zeXMgYnVpbGRzIHdoaWNoIGRpZCBub3QgZmluZCB0aGUgU1dJRyBsaWJyYXJ5IHdoZW4gaW5zdGFsbGVkLgogICAgICAgICAgICAtIFdpbmRvd3MgYnVpbGRzIGFsc28gb3V0cHV0IHRoZSBtaW5ndy9tc3lzIGluc3RhbGwgbG9jYXRpb24gd2hlbiBydW5uaW5nCiAgICAgICAgICAgICAgc3dpZyAtc3dpZ2xpYi4KICAgICAgICAgICAgLSBUaGUgbm9uLWV4aXN0ZW50IGFuZCB1bmRvY3VtZW50ZWQgY29uZmlnIGRpcmVjdG9yeSBpbiB0aGUgc2VhcmNoIHBhdGggaGFzCiAgICAgICAgICAgICAgYmVlbiByZW1vdmVkLgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRzeW1uYW1lIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uLgoKMDcvMDQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgQWRkICVmZWF0dXJlKCJjb25zdGFzdmFyIiksIHdoaWNoIGluc3RlYWQgb2YgZXhwb3J0aW5nIGEgY29uc3RhbnQgYXMgYQoJICAgIHNjaGVtZSBmdW5jdGlvbiwgZXhwb3J0cyB0aGUgY29uc3RhbnQgYXMgYSBzY2hlbWUgdmFyaWFibGUuICBVcGRhdGUgdGhlCgkgICAgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsLgoKMDcvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1NlZSBlbnRyeSBvZiAwOS8xMy8yMDA2IC0gZXhwbGljaXRjYWxsIGZlYXR1cmUgYW5kIGRvY3VtZW50YXRpb24gdG8gaXQgcmVtb3ZlZF0KICAgICAgICAgICAgTmV3IGV4cGxpY2l0Y2FsbCBmZWF0dXJlIHdoaWNoIGdlbmVyYXRlcyBhZGRpdGlvbmFsIHdyYXBwZXJzIGZvciB2aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgdGhhdCBjYWxsIHRoZSBtZXRob2QgZXhwbGljaXRseSwgbm90IHJlbHlpbmcgb24gcG9seW1vcnBoaXNtIHRvIG1ha2UgdGhlIG1ldGhvZAogICAgICAgICAgICBjYWxsLiBUaGUgZmVhdHVyZSBpcyBhIGZlYXR1cmUgZmxhZyBhbmQgaXMgZW5hYmxlZCBsaWtlIGFueSBvdGhlciBmZWF0dXJlIGZsYWcuCiAgICAgICAgICAgIEl0IGFsc28gcmVjb2duaXNlcyBhbiBhdHRyaWJ1dGUsICJzdWZmaXgiIGZvciBtYW5nbGluZyB0aGUgZmVhdHVyZSBuYW1lLCBzZWUKICAgICAgICAgICAgU1dJR1BsdXMuaHRtbCNTV0lHUGx1c19leHBsaWNpdGNhbGwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaXMgYWxzbyBhIHdvcmthcm91bmQgZm9yIHNvbHZpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxscwogICAgICAgICAgICBwcm9ibGVtIHdoZW4gYSBkaXJlY3RvciBtZXRob2QgbWFrZXMgYSBjYWxsIHRvIGEgYmFzZSBjbGFzcyBtZXRob2QuIFNlZQogICAgICAgICAgICBKYXZhLmh0bWwjamF2YV9kaXJlY3RvcnNfZXhwbGljaXRjYWxsIGZvciB1cGRhdGVkIGRvY3VtZW50YXRpb24uCgowNi8yOC8yMDA2OiBqb2UgKEpvc2VwaCBXYW5nKQoJICAgIFtyXSBJbml0aWFsIHN1cHBvcnQgZm9yIFIKCjA2LzIwLzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQogICAgICAgICAgICBNaW5vciBmaXhlcyB0byBnZXQgYXBwbHlfc3RyaW5ncy5pIHRlc3RzdWl0ZSB0byBwYXNzCgkgICAgUmVtb3ZlIGludGVnZXJzX3J1bm1lLnNjbSBmcm9tIHRoZSB0ZXN0c3VpdGUsIGJlY2F1c2UgU1dJRyBhbmQgQ2hpY2tlbiBkb2VzCiAgICAgICAgICAgIGhhbmRsZSBvdmVyZmxvd3MuCgowNi8xOS8yMDA1OiBvbGx5CgkgICAgW3BocF0gQWRkIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgUEhQNSBjbGFzcyB3cmFwcGVycyBmb3IgQysrCgkgICAgY2xhc3NlcyAodXNlICJzd2lnIC1waHA1IikuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gQWRkZWQgc29tZSBtaXNzaW5nIGtleXdvcmRzIHRvIHRoZSBQSFA0IGtleXdvcmQgbGlzdCwgYW5kCgkgICAgZml4ZWQgX19MSU5FX18gYW5kIF9fRklMRV9fIHdoaWNoIHdlcmUgaW4gdGhlIHdyb25nIGNhdGVnb3J5LgoJICAgIEFsc28gYWRkZWQgYWxsIHRoZSBrZXl3b3JkcyBuZXcgaW4gUEhQNSwgYW5kIGFkZGVkIGNvbW1lbnRzCgkgICAgbm90aW5nIHRoZSBQSFA0IGtleXdvcmRzIHdoaWNoIGFyZW4ndCBrZXl3b3JkcyBpbiBQSFA1LgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCBhcyB0aGlzIHBvaW50ZXIgKGUuZy4KCSAgICBDbGFzc19tZXRob2QoTnVsbCkpIC0gZ2l2ZSBhIFBIUCBFcnJvciBpbnN0ZWFkLgoKMDYvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCBjb250YWluZXIgY2xhc3MuCgkgICAgRml4IGEgZmV3IGJ1Z3MgaW4gaGVscGVyIGZ1bmN0aW9ucy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZXBsYWNlIEpOSUVYUE9SVCB3aXRoIFNXSUdFWFBPUlQsIHRoZXJlYnkgZW5hYmxpbmcgdGhlIHBvc3NpYmlsaXR5CiAgICAgICAgICAgIG9mIHVzaW5nIGdjYyAtZnZpc2liaWxpdHk9aGlkZGVuIGZvciBwb3RlbnRpYWxseSBzbWFsbGVyIGZhc3RlciBsb2FkaW5nIHdyYXBwZXJzLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBNYWtlZmlsZXMgZm9yIGF1dG9jb25mLTIuNjAgYmV0YQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVmxhZGltaXIgTWVuc2hha292IHBhdGNoIGZvciBjb21waWxpbmcgd3JhcHBlcnMgd2l0aCBweXRob24tMi41IGFscGhhLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZmZlciBvdmVyZmxvdyBlcnJvciB3aGVuIHVzaW5nIGxhcmdlICVmZWF0dXJlKGRvY3N0cmluZykgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgSm9zZXBoIFdpbnN0b24uCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gT3BlcmF0b3Igb3ZlcmxvYWQgZml4IGZyb20gRGFuaWVsIE1vb3JlLgoKMDUvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gZ2VuZXJhdGlvbiBvZiBDTE9TIHR5cGUgZGVjbGFyYXRpb25zIGZvciB1bmlvbnMKCSAgICBhbmQgZXF1aXZhbGVudCB0eXBlcy4KCjA1LzI0LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBEb24ndCByZXF1aXJlIGEgZnVsbCBjbGFzcyBkZWZpbml0aW9uIHRvIGdlbmVyYXRlIGEgQ0xPUyB3cmFwcGVyLgoKMDUvMjAvMjAwNjogb2xseQoJICAgIFtwaHBdIEdDQyBWaXNpYmlsaXR5IHN1cHBvcnQgbm93IHdvcmtzIHdpdGggUEhQLgoKMDUvMTkvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbW92ZWQgc3VwcG9ydCBmb3IgLWRsbmFtZSAodXNlIC1tb2R1bGUgaW5zdGVhZCkuICBGaXhlZAoJICAgIG5hbWluZyBvZiBQSFAgZXh0ZW5zaW9uIG1vZHVsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggUEhQCgkgICAgY29udmVudGlvbnMgKG5vICJwaHBfIiBwcmVmaXggb24gVW5peDsgb24gUEhQID49IDQuMy4wLCBoYW5kbGUgVW5peAoJICAgIHBsYXRmb3JtcyB3aGljaCB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIi5zbyIgYXMgdGhlIGV4dGVuc2lvbi4pCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQKCjA1LzA3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgd2hlcmUgYSBDKysgcmVmZXJlbmNlCgkgICAgaXMgd2FudGVkLgoKMDUvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCB3cmFwcGVycyBnZW5lcmF0ZWQgZm9yIGdsb2JhbCAnY2hhcicgdmFyaWFibGVzIHRvIG5vdAoJICAgIGluY2x1ZGUgYSB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUgaW4gdGhlIFBIUCBzdHJpbmcuCgowNS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgdHlwZW1hcHMgc28gdGhhdCBjaGFyICogY2FuIGJlIGFwcGxpZWQgdG8gdW5zaWduZWQgY2hhciAqIG9yIHNpZ25lZCBjaGFyICoKICAgICAgICAgICAgdHlwZXMgYW5kIHZpc2EgdmVyc2EuCgowNS8wMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV1UaGFua3MgdG8gTHVrZSBKIENyb29rIGZvciB0aGlzIGlkZWEuCiAgICAgICAgICAgICAtIGEgc3RydWN0L2VudW0vdW5pb24gaXMgcmVwbGFjZWQgd2l0aCA6cG9pbnRlciBvbmx5IGlmCiAgICAgICAgICAgICAgIHRoYXQgc2xvdCBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhhdCB0eXBlLiBTbyw6IAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhX3N0cnVjdCB7IGludCB4OyB9IGFuZAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiX3N0cnVjdCB7IGFfc3RydWN0IHN0cnVjdF8xOyB9OyAKICAgICAgICAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgYXM6CiAgICAgICAgICAgICAgICAgICAoY2ZmaTpkZWZjc3RydWN0IGJfc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3RfMSBhX3N0cnVjdCkpCiAgICAgICAgICAgICAtIE90aGVyIG1pbm9yIGZpeGVzIGluIGxpc3BpZnlpbmcgbmFtZXMuCgowNS8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcG9zc2libGUgcmVkZWZpbml0aW9uIG9mIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSBmb3IgVkMrKy4KCjA0LzE0LzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQogICAgICAgICAgICBUaGFua3MgdG8gVGhvbWFzIFdlaWRuZXIgZm9yIHRoZSBwYXRjaC4KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgZXhwb3J0IGlzIHNldCAoZXhwb3J0ICdmb28pIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBmb3IgZXZlcnkgc3ltYm9sCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGlubGluZSBpcyBzZXQgKGRlY2xhaW0gKGlubGluZSBmb28pKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW50ZXJuX2Z1bmN0aW9uIGlzIHNldCAKICAgICAgICAgICAgICAjLih2YWx1ZS1vZi1pbnRlcm4tZnVuY3Rpb24gIm5hbWUiICJub2RlVHlwZSIgcGFja2FnZSkKICAgICAgICAgICAgICBpcyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlIHBsYWluIHN5bWJvbC4gQSBzYW1wbGUgc3dpZy1saXNwaWZ5IAogICAgICAgICAgICAgIGlzIHByb3ZpZGVkLgogICAgICAgICAgICAtIGV2ZXJ5IHN5bWJvbCBpcyBwcmVmaXhlZCBieSBpdCdzIHBhY2thZ2UuCgowNC8xMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KCSAgICBGaXhlZCB0aGUgZ2VuZXJhdGlvbiBvZiB3cmFwcGVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gCiAgICAgICAgICAgIEFkZGVkIHRoZSBvcHRpb24gW25vXXN3aWctbGlzcCB3aGljaCB0dXJucyBvbi9vZmYgZ2VuZXJhdGlvbiAKICAgICAgICAgICAgb2YgY29kZSBmb3Igc3dpZyBoZWxwZXIgbGlzcCBtYWNybywgZnVuY3Rpb25zLCBldGMuCgpWZXJzaW9uIDEuMy4yOSAoTWFyY2ggMjEsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggb3V0cHV0IHR5cGVtYXAgb2YgY2hhciBzbyBpdCBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbnN0ZWFkCgkgICAgb2YgYW4gaW50ZWdlci4gQWxzbyBhZGRzIGlucHV0L291dHB1dCB0eXBlbWFwcyBmb3IgJ2NoYXIgKicuCgoJICAgIGFkZCBjb21tYW5kLWxpbmUgYXJndW1lbnQgLWlzb2xhdGUgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlCgkgICAgZmlsZSB0aGF0IHdvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIFNXSUcgZ2VuZXJhdGVkIGZpbGVzIHRoYXQKCSAgICBtYXkgYmUgdXNlZCBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KCjAzLzIwLzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBNb3JlIHR3ZWFrcyB0byBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgoJICAgIEZpeCBjb25zdGFudFdyYXBwZXIgZm9yIGNoYXIgYW5kIHN0cmluZyBsaXRlcmFscy4KCgkgICAgZmluZC1kZWZpbml0aW9uIGtleWJpbmRpbmdzIHNob3VsZCB3b3JrIGluIEVMSS9TTElNRS4KCSAgICBPdXRwdXQgKGluLXBhY2thZ2UgPG1vZHVsZS1uYW1lPikgdG8gbGlzcCB3cmFwcGVyCgkgICAgaW5zdGVhZCBvZiAoaW4tcGFja2FnZSAjLipzd2lnLW1vZHVsZS1uYW1lKikuCgoJICAgIHNsaWdodCByZXdvcmsgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KCgkgICAgZG9jIHVwZGF0ZXMuCgowMy8xNy8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbWFuZ2xlIG5hbWVzIG9mIGNvbnN0YW50cyBnZW5lcmF0ZWQgdmlhIGNvbnN0YW50V3JhcHBlci4KCSAgICAKCSAgICBXaGVuIHVzaW5nIE9VVFBVVCB0eXBlbWFwcyBhbmQgdGhlIGZ1bmN0aW9uIGhhcyBhIG5vbi12b2lkCgkgICAgcmV0dXJuIHZhbHVlLCBpdCBzaG91bGQgYmUgZmlyc3QgaW4gdGhlIHZhbHVlcy1saXN0LCBmb2xsb3dlZAoJICAgIGJ5IHRoZSBPVVRQVVQgbWFwcGVkIHZhbHVlcy4KCgkgICAgRml4IGJ1ZyB3aXRoIGJvb2xlYW4gcGFyYW1ldGVycywgd2hpY2ggbmVlZGVkIHRvIGJlCgkgICAgcGFzc2VkIGluIGFzIGludCB2YWx1ZXMsIHJhdGhlciB0aGFuIFQgb3IgTklMLgoKMDMvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEdlbmVyYXRlIHdyYXBwZXJzIGZvciBjb25zdGFudHMgd2hlbiBpbiBDKysgb3IgLWN3cmFwIG1vZGUuCgkgICAgTWFrZSAtY3dyYXAgdGhlIGRlZmF1bHQsIHNpbmNlIGl0IGlzIG1vc3QgY29ycmVjdC4gVXNlcnMKCSAgICBjYW4gdXNlIHRoZSAtbm9jd3JhcCBvcHRpb24gdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGEgLmN4eAoJICAgIGZpbGUgd2hlbiBpbnRlcmZhY2luZyB0byBDIGNvZGUuCgoJICAgIFdoZW4gaW4gLW5vY3dyYXAgbW9kZSwgaW1wcm92ZSB0aGUgaGFuZGxpbmcgb2YgY29udmVydGluZwogCSAgICBpbmZpeCBsaXRlcmFscyB0byBwcmVmaXggbm90YXRpb24gZm9yIGxpc3AuIFRoaXMgaXMgdmVyeQoJICAgIGJhc2ljIGFuZCBub3QgbGlrZWx5IHRvIGJlIGltcHJvdmVkIHVwb24gc2luY2UgdGhpcyBvbmx5CgkgICAgYXBwbGllcyB0byB0aGUgLW5vY3dyYXAgY2FzZS4gTGl0ZXJhbHMgd2UgY2FuJ3QgZmlndXJlIG91dAoJICAgIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZyBhbmQgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZAoJICAgIGNvZGUuCgoJICAgIHZhbGlkSWRlbnRpZmllciBub3cgbW9yZSBjbG9zZWx5IGFwcHJveGltYXRlcyB3aGF0IG1heSBiZQoJICAgIGEgbGVnYWwgY29tbW9uIGxpc3Agc3ltYm9sLgoKCSAgICBGaXggdHlwZW1hcCBlcnJvciBpbiBhbGxlZ3JvY2wuc3dnCgkgICAgCjAzLzEyLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggdXAgSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoJICAgIEdlbmVyYXRlIGMrKyBzdHlsZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3Igc3RydWN0L3VuaW9uIG1lbWJlcnMKCSAgICB3aGVuIC1jd3JhcCBvcHRpb24gc3BlY2lmaWVkLgoKMDMvMTAvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gQyB3cmFwcGVyIGdlbmVyYXRpb24gaW50cm9kdWNlZCBieSBsYXN0IGFsbGVncm9jbAoJICAgIGNvbW1pdC4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBDb21taXQgIzE0NDczMzcgLSBEZWxldGUgTG9jYWxSZWZzIGF0IHRoZSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyB0byBmaXggcG90ZW50aWFsIGxlYWsKCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ0NDk0OSAtIGNvbmZpZ3VyZSBkb2VzIG5vdCBob25vciAtLXByb2dyYW0tcHJlZml4LgogICAgICAgICAgICBSZW1vdmVkIG5vbi1zdGFuZGFyZCBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeC4gRml4IHRoZSBhdXRvY29uZiBzdGFuZGFyZAogICAgICAgICAgICBvcHRpb25zIC0tcHJvZ3JhbS1wcmVmaXggYW5kIC0tcHJvZ3JhbS1zdWZmaXggd2hpY2ggd2VyZSBiZWluZyBzaG93biBpbiB0aGUgaGVscCwKICAgICAgICAgICAgYnV0IHdlcmUgYmVpbmcgaWdub3JlZC4gVXNlIC0tcHJvZ3JhbS1zdWZmaXggaW5zdGVhZCBvZiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggbm93LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIEZpeCAjMTQ0NjMxOSB3aXRoIHBhdGNoIGZyb20gYW5kcmVhc3RoIC0gbW9yZSB0aGFuIG9uZSB3c3RyaW5nIHBhcmFtZXRlciBpbiBkaXJlY3RvciBtZXRob2RzCgowMy8wNy8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSAKCSAgICBGaXggZm9yIG1vZHVsZSBuYW1lcyBjb250YWluaW5nIGEgIi0iIGluIG5vbi0ic2hhZG93IiBtb2RlLgoJICAgIFBhdGNoIGZyb20gQWFyb24gVmFuRGV2ZW5kZXIgKCMxNDQxNDc0KS4KCjAzLzA0LzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIC1PIHRvIHRoZSBtYWluIHByb2dyYW0sIHdoaWNoIG5vdyBlbmFibGVzIC1mYXN0ZGlzcGF0Y2gKCSAgICAKCSAgICBbUHl0aG9uXQoKCSAgICAtIEFkZCB0aGUgLWZhc3Rpbml0IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIF9faW5pdF9fCiAgICAgICAgICAgICAgbWV0aG9kcy4gU2V0dGluZyAndGhpcycgYXMgJ3NlbGYudGhpcy5hcHBlbmQodGhpcyknIGluIHRoZSBweXRob24KCSAgICAgIGNvZGUgY29uZnVzZXMgUHlMdWNlbmUuIE5vdyB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUKCSAgICAgIHRoZSBDKysgc2lkZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBhbmQgUm9iaW4uCgoJICAgIC0gQWRkIHRoZSAtZmFzdHF1ZXJ5IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIFNXSUdfVHlwZVF1ZXJ5IHZpYSBhCiAgICAgICAgICAgICAgcHl0aG9uIGRpY3QgY2FjaGUsIGFzIHByb3Bvc2VkIGJ5IEFuZGkgVmFqZGEKCgkgICAgLSBBdm9pZCB0byBjYWxsIFB5T2JqZWN0X0dldEF0dHIgaW5zaWRlIFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzLAoJICAgICAgc2luY2UgdGhpcyBjb25mdXNlcyBQeUx1Y2VuZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBWYWpkYS4KCSAgICAKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIFJlbW92ZWQgZXh0cmEgKHZvaWQgKikgY2FzdCB3aGVuIGNhc3RpbmcgcG9pbnRlcnMgdG8gYW5kIGZyb20gamxvbmcgYXMgdGhpcwogICAgICAgICAgICB3YXMgc3VwcHJlc3NpbmcgZ2NjJ3MgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZy4gVGhpcyB3YXJuaW5nIGNvdWxkIGJlIGlnbm9yZWQgaW4gdmVyc2lvbnMgb2YgZ2NjIHByaW9yIHRvIDQuMCwgYnV0IG5vdyB0aGUKICAgICAgICAgICAgd2FybmluZyBpcyB1c2VmdWwgYXMgZ2NjIC1PMiBhbmQgaGlnaGVyIG9wdGltaXNhdGlvbiBsZXZlbHMgaW5jbHVkZXMgLWZzdHJpY3QtYWxpYXNpbmcgd2hpY2gKICAgICAgICAgICAgZ2VuZXJhdGVzIGNvZGUgdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGVzZSBjYXN0cy4gVGhlIGFzc2lnbm1lbnQgaXMgc2ltcGx5IG5ldmVyIG1hZGUuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgLWZuby1zdHJpY3QtYWxpYXNpbmcgdG8gYm90aCBzdXBwcmVzcyB0aGUgd2FybmluZyBhbmQgZml4IHRoZSBiYWQgYXNzZW1ibHkKICAgICAgICAgICAgY29kZSBnZW5lcmF0ZWQuIE5vdGUgdGhhdCB0aGUgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBieSB0aGUgQyBjb21waWxlciwgYnV0IG5vdAogICAgICAgICAgICB0aGUgQysrIGNvbXBpbGVyLCB5ZXQgdGhlIEMrKyBjb21waWxlciB3aWxsIGFsc28gZ2VuZXJhdGUgYnJva2VuIGNvZGUuIEFsdGVybmF0aXZlbHkgdXNlIAogICAgICAgICAgICAtV25vLXN0cmljdC1hbGlhc2luZyB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBmb3IgZ2NjLTMueC4gVGhlIHR5cGVtYXBzIGFmZmVjdGVkCiAgICAgICAgICAgIGFyZSB0aGUgImluIiBhbmQgIm91dCIgdHlwZW1hcHMgaW4gamF2YS5zd2cgYW5kIGFycmF5c19qYXZhLnN3Zy4gVXNlcnMgb3VnaHQgdG8gZml4CiAgICAgICAgICAgIHRoZWlyIG93biB0eXBlbWFwcyB0byBkbyB0aGUgc2FtZS4gTm90ZSB0aGF0IHJlbW92YWwgb2YgdGhlIHZvaWQgKiBjYXN0IHNpbXBseSBwcmV2ZW50cwogICAgICAgICAgICBzdXBwcmVzc2lvbiBvZiB0aGUgd2FybmluZyBmb3IgdGhlIEMgY29tcGlsZXIgYW5kIG5vdGhpbmcgZWxzZS4gVHlwaWNhbCBjaGFuZ2U6CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpKHZvaWQgKikmJGlucHV0OyAlfQogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSYkaW5wdXQ7ICV9CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkodm9pZCAqKSYkcmVzdWx0ID0gJDE7ICV9IAogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpJiRyZXN1bHQgPSAkMTsgJX0gCgowMy8wMi8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dCgkgICAgQWRkIHR5cGVtYXBzIGZvciAibG9uZyBsb25nIjsgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIGhvd2V2ZXIsIGRlcGVuZHMKCSAgICBvbiB0aGUgdmVyc2lvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBHdWlsZS4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGlubmVyIGV4Y2VwdGlvbnMuIElmIGFueSBvZiB0aGUgZGVsZWdhdGVzIGFyZSBjYWxsZWQgd2hpY2ggY29uc3RydWN0CiAgICAgICAgICAgIGEgcGVuZGluZyBleGNlcHRpb24gYW5kIHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIGV4Y2VwdGlvbiwgaXQgd2lsbCBjcmVhdGUgdGhlIG5ldwogICAgICAgICAgICBleGNlcHRpb24gd2l0aCB0aGUgcGVuZGluZyBleGNlcHRpb24gYXMgYW4gaW5uZXIgZXhjZXB0aW9uLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgUGhwNSBleGNlcHRpb25zIGlmIGNvbXBpbGluZyBhZ2FpbnN0IFBocDUgKHBhdGNoIGZyb20gT2xseSBCZXR0cykuCgowMy8wMS8yMDA2OiBtbWF0dXMKCSAgICBVc2UgdGhlIEdDQyB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpbiBTV0lHRVhQT1JULgoKCSAgICBOb3cgeW91IGNhbiBjb21waWxlICh3aXRoIGdjYyAzLjQgb3IgbGF0ZXIpIHVzaW5nCgkgICAgQ0ZMQUdTPSItZnZpc2liaWxpdHk9aGlkZGVuIi4KCSAgICAKCSAgICBDaGVjayB0aGUgZGlmZmVyZW5jZSBmb3IgdGhlICdzdGRfY29udGFpbmVycy5pJyBweXRob24gCgkgICAgdGVzdCBjYXNlOgogCiAgICAgICAgICAgIFNpemVzOgoKCSAgICAgIDMzMDU0MzIgX3N0ZF9jb250YWluZXJzLnNvCgkgICAgICAyMzgzOTkyIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgRXhwb3J0ZWQgc3ltYm9scyAobm0gLUQgPGZpbGU+LnNvIHwgd2MgLWwpOgoKICAgICAgICAgICAgICA2MTQ2IF9zdGRfY29udGFpbmVycy5zbyAKICAgICAgICAgICAgICAxNzQgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4gCgoJICAgIEV4Y2VjdXRpb24gdGltZXM6CgoJICAgICAgcmVhbCAwbTAuMDUwcyB1c2VyIDBtMC4wMzlzIHN5cyAwbTAuMDA1cyAgIF9zdGRfY29udGFpbmVycy5zbwogICAgICAgICAgICAgIHJlYWwgMG0wLjAzOXMgdXNlciAwbTAuMDI2cyBzeXMgMG0wLjAwN3MgICBfc3RkX2NvbnRhaW5lcnMuc28uaGlkZGVuCgoJICAgIFJlYWQgaHR0cDovL2djYy5nbnUub3JnL3dpa2kvVmlzaWJpbGl0eSBmb3IgbW9yZSBkZXRhaWxzLgoKCjAyLzI3LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBBZGQgc3VwcG9ydCBmb3IgSU5QVVQsIE9VVFBVVCwgYW5kIElOT1VUIHR5cGVtYXBzLgoJICAgIEZvciBPVVRQVVQgdmFyaWFibGVzLCB0aGUgbGlzcCB3cmFwcGVyIHJldHVybnMgbXVsdGlwbGUKCSAgICB2YWx1ZXMuCgowMi8yNi8yMDA2OiBtbWF0dXMKCgkgICAgW1J1YnldIGFkZCBhcmdjYXJndi5pIGxpYnJhcnkgZmlsZS4KCSAgICAKCSAgICBVc2UgaXQgYXMgZm9sbG93OgoKCQklaW5jbHVkZSBhcmdjYXJndi5pCgkgICAgICAJCQkJCQkJCQkgCiAgIAkgICAgICAgICVhcHBseSAoaW50IEFSR0MsIGNoYXIgKipBUkdWKSB7IChzaXplX3QgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIH0gCgkgICAgICAJCQkJCQkJCQkgCiAgIAkgICAgICAgICVpbmxpbmUgewkJCQkKICAgCSAgICAgICAgICBpbnQgbWFpbkFwcChzaXplX3QgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIAkKICAgCSAgICAgICAgICB7CQkJCQkJCiAgIAkgICAgICAgICAgICByZXR1cm4gYXJnYzsJCQkJCQogICAJICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0JCQkJCQkJCgkgICAgICAJCQkJCQkJCiAgIAkgICAgdGhlbiBpbiB0aGUgcnVieSBzaWRlOgkJCQkJCgkgICAgICAJCQkJCQkJCQogICAJICAgICAgICBhcmdzID0gWyJhc2RmIiwgImFzZGYyIl0JCQkJCiAgIAkgICAgICAgIG4gPSBtYWluQXBwKGFyZ3MpOwoJCgoJICAgIFRoaXMgaXMgdGhlIHNpbWlsYXIgdG8gdGhlIHB5dGhvbiB2ZXJzaW9uIExpYi9weXRob24vYXJnY2FyZ3YuaQoKMDIvMjQvMjAwNjogbWdvc3NhZ2UKCgkgICAgU21hbGwgdXBkYXRlIEx1YSBkb2N1bWVudHMgb24gdHJvdWJsZXNob290aW5nIHByb2JsZW1zCgkgICAgCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgRml4IGFsbCB0aGUgZXJyb3JzIHJlcG9ydGVkIGZvciAxLjMuMjguCgkgICAgLSBmaXggYnVnICMxMTU4MTc4CgkgICAgLSBmaXggYnVnICMxMDYwNzg5CgkgICAgLSBmaXggYnVnICMxMjYzNDU3CgkgICAgLSBmaXggJ2NvbnN0ICBjaGFyKiYnIHR5cGVtYXAgaW4gdGhlIFVUTCwgcmVwb3J0ZWQgYnkgR2VvZmYgSHV0Y2hpc29uCgkgICAgLSBmaXhlcyBmb3IgcHl0aG9uIDIuMSBhbmQgdGhlIHJ1bnRpbWUgbGlicmFyeQoJICAgIC0gZml4IGNvcHljdG9yICsgdGVtcGxhdGUgYnVnICMxNDMyMTI1CgkgICAgLSBmaXggWyAxNDMyMTUyIF0gJXJlbmFtZSBmcmllbmQgb3BlcmF0b3JzIGluIG5hbWVzcGFjZQoJICAgIC0gZml4IGdjYyB3YXJuaW5nIHJlcG9ydGVkIGJ5IFIuIEJlcm5zdGVpbgoJICAgIC0gYXZvaWQgYXNzZXJ0IHdoZW4gZmluZGluZyBhIHJlY3Vyc2l2ZSBzY29wZSBpbmhlcml0YW5jZSwKCSAgICAgIGVtaXQgYSB3YXJuaW5nIGluIHRoZSB3b3JzdCBjYXNlLCByZXBvcnRlZCBieSBOaXRybyAKCSAgICAtIGZpeCBwcmVtYXR1cmUgb2JqZWN0IGRlbGV0aW9uIHJlcG9ydGVkIGJ5IFBhdWwgaW4gdGNsM2QKCSAgICAtIGZpeCB3YXJuaW5nIHJlcG9ydGVkIGJ5IE5pdHJvIGluIFZDNwoJICAgIC0gbW9yZSBmaXhlcyBmb3Igb2xkIFNvbGFyaXMgY29tcGlsZXIKCSAgICAtIGZpeCBmb3IgcHl0aG9uIDIuMyBhbmQgZ2NfcmVmcyBpc3N1ZSByZXBvcnRlZCBieSBMdWlnaQoJICAgIC0gZml4IGZhc3Rwcm94eSBmb3IgbWV0aG9kcyB1c2luZyBrd2FyZ3MKCSAgICAtIGZpeCBvdmVybG9hZCArIHByb3RlY3RlZCBtZW1iZXIgaXNzdWUgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBzZXRlcnJvcm1zZyBhcyByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IGRpcmVjdG9ycywgbm93IHRoZSB0ZXN0LXN1aXRlIHJ1bnMgYWdhaW4gdXNpbmcgLWRpcmVjdG9ycwoJICAgIC0gZml4IGZvciBmcmllbmQgb3BlcmF0b3IgYW5kIFZpc3VhbCBzdHVkaW8gYW5kIGJ1ZyAxNDMyMTUyCgkgICAgLSBmaXggYnVnICMxNDM1MDkwCgkgICAgLSBmaXggdXNpbmcgKyAlZXh0ZW5kIGFzIHJlcG9ydGVkIGJ5IFdpbGxpYW0KCSAgICAtIGZpeCBidWcgIzEwOTQ5NjQKCSAgICAtIGZpeCBmb3IgUHlfTm90SW1wbGVtZW50ZWQgYXMgcmVwb3J0ZWQgYnkgT2xseSBhbmQgQW1hdXJ5CgkgICAgLSBmaXggbmVzdGVkIG5hbWVzcGFjZSBpc3N1ZSByZXBvcnRlZCBieSBDaGFybGllCgoJICAgIGFuZCBhbHNvOgoJICAgIAoJICAgIC0gYWxsb3cgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMgYnkgZGVmYXVsdAoJICAgIC0gZGVsZXRlIGV4dHJhIG5ldyBsaW5lcyBpbiBzd2lnbWFjcm9zW1VUTF0KCSAgICAtIGNvc21ldGljIGZvciBnZW5lcmF0ZWQgcHl0aG9uIGNvZGUKCSAgICAtIGFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIFVUTAoJICAgIC0gYWRkIHN3aWdyZWdpc3RlciBwcm94eSBtZXRob2QgYW5kIG1vdmUgX19yZXByX18gdG8gYQoJICAgICAgc2luZ2xlIGdsb2JhbCBtb2R1bGUgIFtweXRob25dCgowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIFdoZW4gdXNpbmcgZGlyZWN0b3JzLCBub3cgc3dpZyB3aWxsIGVtaXQgYWxsIHRoZSB2aXJ0dWFsCgkgICAgcHJvdGVjdGVkIG1ldGhvZHMgYnkgZGVmYXVsdC4gCgoJICAgIEluIHByZXZpb3VzIHJlbGVhc2VzLCB5b3UgbmVlZGVkIHRvIHVzZSB0aGUgJ2RpcnByb3QnCgkgICAgb3B0aW9uIHRvIGFjaGVpdmUgdGhlIHNhbWUuCgoJICAgIElmIHlvdSB3YW50LCB5b3UgY2FuIGRpc2FibGUgdGhlIG5ldyBkZWZhdWx0IGJlaGF2aW91ciwKCSAgICB1c2UgdGhlICdub2RpcnByb3QnIG9wdGlvbjogCgoJICAgICAgIHN3aWcgLW5vZGlycHJvdCAuLi4KCgkgICAgYW5kL29yIHRoZSAlbm9kaXJlY3RvciBmZWF0dXJlIGZvciBzcGVjaWZpYyBtZXRob2RzLCBpLmUuOgoKCSAgICAgICAlbm9kaXJlY3RvciBGb286OmJhcjsKCgkgICAgICAgc3RydWN0IEZvbyB7CgkgICAgICAgICB2aXJ0dWFsIH5Gb28oKTsKCgkgICAgICAgcHJvdGVjdGVkOgoJICAgICAgICAgdmlydHVhbCB2b2lkIGJhcigpOwoJICAgICAgIH07CgkgICAgCgoJICAgIEFzIGJlZm9yZSwgcHVyZSBhYnN0cmFjdCBwcm90ZWN0ZWQgbWVtYmVycyBhcmUgYWxsd2F5cwoJICAgIGVtaXR0ZWQsIGluZGVwZW5kZW50IG9mIHRoZSAnZGlycHJvdC9ub2RpcnByb3QnIG9wdGlvbnMuCgoKMDIvMjIvMjAwNjogbW1hdHVzCgkgICAgQWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgbGFuZ3VhZ2VzIHVzaW5nIHRoZSBVVEwgKHB5dGhvbix0Y2wscnVieSxwZXJsKS4KCSAgICAKICAgICAgICAgICAgZmFjdG9yeS5pIGltcGxlbWVudHMgYSBtb3JlIG5hdHVyYWwgd3JhcCBmb3IgZmFjdG9yeSBtZXRob2RzLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlOgkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBHZW9tZXRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgICBlbnVtIEdlb21UeXBlewkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICAgICAgUE9JTlQsCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgICBDSVJDTEUJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgdmlydHVhbCB+R2VvbWV0cnkoKSB7fSAgICAJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgdmlydHVhbCBpbnQgZHJhdygpID0gMDsJCQkJICAgIAogIAkgICAgCSAJCQkJCQkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAJIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBhbGwgdGhlIEdlb21ldHJ5IG9iamVjdHMJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAgIHN0YXRpYyBHZW9tZXRyeSAqY3JlYXRlKEdlb21UeXBlIGkpOyAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgUG9pbnQgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDE7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHdpZHRoKCkgeyByZXR1cm4gMS4wOyB9ICAgIAkgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IENpcmNsZSA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMjsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgcmFkaXVzKCkgeyByZXR1cm4gMS41OyB9ICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICB9OyAJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJCQkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vIEZhY3RvcnkgbWV0aG9kIGZvciBhbGwgdGhlIEdlb21ldHJ5IG9iamVjdHMJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICBHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZShHZW9tVHlwZSB0eXBlKSB7CQkgICAgCiAgCSAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIFBPSU5UOiByZXR1cm4gbmV3IFBvaW50KCk7CSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBDSVJDTEU6IHJldHVybiBuZXcgQ2lyY2xlKCk7IAkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOwkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfQkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgfQkJCQkJICAgIAkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAoJICAgIFlvdSBjYW4gdXNlIHRoZSAlZmFjdG9yeSB3aXRoIHRoZSBHZW9tZXRyeTo6Y3JlYXRlIG1ldGhvZCBhcyBmb2xsb3dzOgoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICAlbmV3b2JqZWN0IEdlb21ldHJ5OjpjcmVhdGU7CQkJCSAgICAKICAJICAgICAgJWZhY3RvcnkoR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUsIFBvaW50LCBDaXJjbGUpOwkgICAgCiAgCSAgICAgICVpbmNsdWRlICJnZW9tZXRyeS5oIgkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgYW5kIEdlb21ldHJ5OjpjcmVhdGUgd2lsbCByZXR1cm4gYSAnUG9pbnQnIG9yICdDaXJjbGUnIGluc3RhbmNlICAgCiAgCSAgICBpbnN0ZWFkIG9mIHRoZSBwbGFpbiAnR2VvbWV0cnknIHR5cGUuIEZvciBleGFtcGxlLCBpbiBweXRob246CSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgY2lyY2xlID0gR2VvbWV0cnkuY3JlYXRlKEdlb21ldHJ5LkNJUkNMRSkJCQkgICAgCiAgCSAgICAgIHIgPSBjaXJjbGUucmFkaXVzKCkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICB3aGVyZSAnY2lyY2xlJyBub3cgaXMgYSBDaXJjbGUgcHJveHkgaW5zdGFuY2UuCSAgICAJCSAgICAKCgowMi8xNy8yMDA2OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBhY2NlcHQgdGhlIGZ1bGwgcmFuZ2Ugb2YgaW50ZWdyYWwKCSAgICB2YWx1ZXMsIGFuZCB0aGV5IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoJICAgIFtHdWlsZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlCgkgICAgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCjAyLzEzLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtEb2N1bWVudHNdIHVwZGF0ZWQgdGhlIGV4dGVuZGluZyBkb2N1bWVudHMgdG8gZ2l2ZSBhIHNrZWxldG9uIHN3aWdnaW5nIGNvZGUKICAgICAgICAgICAgd2l0aCBhIGZldyB0eXBlbWFwcy4KICAgICAgICAgICAgW0x1YV0gYWRkZWQgYW4gZXh0cmEgdHlwZW1hcCBmb3Igdm9pZCogW2luXSwgc28gYSBmdW5jdGlvbiB3aGljaCByZXF1aXJlcyBhIHZvaWQqCiAgICAgICAgICAgIGNhbiB0YWtlIGFueSBraW5kIG9mIHBvaW50ZXIKClZlcnNpb24gMS4zLjI4IChGZWJydWFyeSAxMiwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgRml4IG1hbnkgaXNzdWVzIHdpdGggbGluZSBjb3VudGluZyBhbmQgZXJyb3IgcmVwb3J0cy4KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEJldHRlciBzdGF0aWMgZGF0YSBtZW1iZXIgc3VwcG9ydCwgaWYgeW91IGhhdmUKCSAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGVuIG5vdyBpcyB2YWxpZCB0byBhY2Nlc3MgdGhlIHN0YXRpYyBkYXRhIG1lbWJlciwgaWU6CgogICAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgICBmLmJhciA9IDMKCgkgICAganVzdCBhcyBpbiBDKysuCgoKMDIvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdCiAgICAgICAgICAgIEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiB0byB3b3JrIGFnYWluIHdpdGggb2xkIHZlcnNpb25zIG9mIFBlcmwKICAgICAgICAgICAgKDUuMDA0IGFuZCBsYXRlciB0ZXN0ZWQpCgowMi8wNC8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGQgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlcigpIGRpcmVjdGl2ZSB0byBleHRlbmQKCSAgICBTV0lHIHNtYXJ0IHBvaW50ZXIgc3VwcG9ydCBpbiBweXRob24uIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzbWFydCBwb2ludGVyIGFzOgoJICAgIAoJICAgICAgdGVtcGxhdGUgPGNsYXNzIFR5cGU+IGNsYXNzIFJDUHRyIHsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgLi4uCgkgICAgICAgIFJDUHRyKFR5cGUgKnApOwoJCVR5cGUgKiBvcGVyYXRvci0+KCkgY29uc3Q7CgkJLi4uCgkgICAgICB9OwoJICAgICAgCgkgICAgeW91IHVzZSB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyIGRpcmVjdGl2ZSBhczoKCSAgICAKCSAgICAgICVleHRlbmRfc21hcnRfcG9pbnRlcihSQ1B0cjxBPik7CgkgICAgICAldGVtcGxhdGUoUkNQdHJfQSkgIFJDUHRyPEE+OwoJICAgIAoJICAgIHRoZW4sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIFJDUHRyPEE+IG1ha2VfcHRyKCk7CgkgICAgICBpbnQgZm9vKEEgKik7CgoJICAgIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZzoKCgkgICAgICBhID0gbWFrZV9wdHIoKTsKCSAgICAgIGIgPSBmb28oYSk7CgogICAgICAgICAgICBpZSwgc3dpZyB3aWxsIGFjY2VwdCBhIFJDUHRyPEE+IG9iamVjdCB3aGVyZSBhICdBIConIGlzCiAgICAgICAgICAgIGV4cGVjdGVkLgoKCSAgICBBbHNvLCB3aGVuIHVzaW5nIHZlY3RvcnMKCSAgICAKCSAgICAgICVleHRlbmRfc21hcnRfcG9pbnRlcihSQ1B0cjxBPik7CgkgICAgICAldGVtcGxhdGUoUkNQdHJfQSkgUkNQdHI8QT47CgkgICAgICAldGVtcGxhdGUodmVjdG9yX0EpIHN0ZDo6dmVjdG9yPFJDUHRyPEE+ID47CgkJCgkgICAgeW91IGNhbiB0eXBlCgoJICAgICAgYSA9IEEoKTsKCSAgICAgIHYgPSB2ZWN0b3JfQSgyKQoJICAgICAgdlswXSA9IGEKCiAgICAgICAgICAgIGllLCBhbiAnQSAqJyBvYmplY3QgaXMgYWNjZXB0ZWQsIHZpYSBpbXBsaWNpdCBjb252ZXJzaW9uLCAKCSAgICB3aGVyZSBhIFJDUHRyPEE+IG9iamVjdCBpcyBleHBlY3RlZC4gQWRkaXRpb25hbGx5CgoJICAgICAgeCA9IHZbMF0KCgkgICAgcmV0dXJucyAoYW5kIHNldHMgJ3gnIGFzKSBhIGNvcHkgb2YgdlswXSwgbWFraW5nIHJlZmVyZW5jZQoJICAgIGNvdW50aW5nIHBvc3NpYmxlIGFuZCBjb25zaXN0ZW50LgoKCSAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgaXMganVzdCBhIGNvbGxlY3Rpb25zIG9mIG5ldy9vbGQKCSAgICB0cmlja3MsIGluY2x1ZGluZyAldHlwZW1hcHMgYW5kIHRoZSBuZXcgJWltcGxpY2l0Y29udgoJICAgIGRpcmVjdGl2ZS4KCjAyLzAyLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIGJ1Z2ZpeCAjMTM1NjU3NywgY2hhbmdlZCBkb3VibGU9Pmx1YV9udW1iZXIgaW4gYSBmZXcgcGxhY2VzLgogICAgICAgICAgICBhZGRlZCB0aGUgc3RkOjpwYWlyIHdyYXBwaW5nCgowMS8zMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBzdGQ6OnN0cmluZyBhbmQgc3RkOjp3c3RyaW5nIG1lbWJlciB2YXJpYWJsZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgbm93IHVzZQogICAgICAgICAgICAlbmF0dXJhbHZhciBieSBkZWZhdWx0LCBtZWFuaW5nIHRoZXkgd2lsbCBub3cgYmUgd3JhcHBlZCBhcyBleHBlY3RlZCBpbiBhbGwgbGFuZ3VhZ2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZXNlIHdlcmUgd3JhcHBlZCBhcyBhIHBvaW50ZXIgcmF0aGVyIHRoYW4gYSB0YXJnZXQgbGFuZ3VhZ2Ugc3RyaW5nLgogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGFkZCB0aGUgZm9sbG93aW5nIHdvcmthcm91bmQgdG8gd3JhcCB0aGVzZSBhcyBzdHJpbmdzOgoKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgowMS8yOC8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dIAoJICAgIEFkZCB0eXBlbWFwcyBmb3IgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgoKMDEvMjQvMjAwNjogbW1hdHVzCgkgICAgLSBCZXR0ZXIgc3VwcG9ydCBmb3IgdGhlICVuYXR1cmFsdmFyIGRpcmVjdGl2ZSwgbm93IGl0CgkgICAgICB3b3JrcyB3aXRoIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGFzIHdlbGwgYXMKCSAgICAgIEphdmEvQyMuCgkgICAgICAKCSAgICAgIE5vdywgaXQgY2FuIGFsc28gYmUgYXBwbGllZCB0byBjbGFzcyB0eXBlczoKCgkgICAgICAgICVuYXR1cmFsdmFyIHN0ZDo6c3RyaW5nOwoJICAgICAgICAlaW5jbHVkZSA8c3RkX3N0cmluZy5pPgoJICAgICAgCiAgICAgICAgICAgICAgdGhhdCB3aWxsIHRlbGwgc3dpZyB0byB1c2UgdGhlIHRoZSAnbmF0dXJhbCcgd3JhcHBpbmcKICAgICAgICAgICAgICBtZWNoYW5pc20gdG8gYWxsIHN0ZDo6c3RyaW5nIGdsb2JhbCBhbmQgbWVtYmVyCiAgICAgICAgICAgICAgdmFyaWFibGVzLgoKCSAgICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgJWFsbG93ZXhjZXB0IGZlYXR1cmUgYWxvbmcgdGhlCiAgICAgICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlcywgd2hpY2ggYWxsb3dzIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSB2YXJpYWJsZSBhY2Nlc3MgbWV0aG9kcy4gQWxzbywgYWRkCiAgICAgICAgICAgICAgdGhlICVleGNlcHRpb252YXIgZGlyZWN0aXZlIHRvIHNwZWNpZnkgYSBkaXN0aW50aWMKICAgICAgICAgICAgICBleGNlcHRpb24gbWVjaGFuaXNtIG9ubHkgZm9yIHZhcmlhYmxlcy4KCSAgICAgIAoJICAgIAoJICAgIC0gQWRkIG1vcmUgZG9jcyBmb3IgdGhlICVkZWxvYmplY3QgZGlyZWN0aXZlIHRvIG1hcmsgYSBtZXRob2QgYXMgYQoJICAgICAgZGVzdHJ1Y3RvciwgJ2Rpc293bmluZycgdGhlIGZpcnN0IGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCgkgICAgICAgICVuZXdvYmplY3QgY3JlYXRlX2ZvbzsKCSAgICAgICAgJWRlbG9iamVjdCBkZXN0cm95X2ZvbzsKCgkgICAgICAgIEZvbyAqY3JlYXRlX2ZvbygpIHsgcmV0dXJuIG5ldyBGb28oKTsgfQoJICAgICAgICB2b2lkIGRlc3Ryb3lfZm9vKEZvbyAqZm9vKSB7IGRlbGV0ZSBmb287IH0KCgkgICAgICBvciBpbiBhIG1lbWJlciBtZXRob2QgYXM6CgoJICAgICAgICAlZGVsb2JqZWN0IEZvbzo6ZGVzdHJveTsKCgkgICAgICAgIGNsYXNzIEZvbyB7CgkgICAgICAgIHB1YmxpYzoKCSAgICAgICAgICB2b2lkIGRlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzO30KCgkgICAgICAgIHByaXZhdGU6CgkgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICB9OwoKCjAxLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgLSBSZW1vdmVkIHRoZSB0eXBlIHN3aWdfbHVhX2NvbW1hbmRfaW5mbyAmIHJlcGxhY2Ugd2l0aCBsdWFMX3JlZwoJICAgICAgKHdoaWNoIHRoZW4gYnJva2UgdGhlIGNvZGUpLCBmaXhlZCB0aGlzCgkgICAgLSBhZGRlZCBhbiBhZGRpdGlvbmFsIGNhc3QgaW4gdGhlIHR5cGVtYXBzIGZvciBlbnVtJ3MKCSAgICAgIGR1ZSB0byB0aGUgaXNzdWUgdGhhdCBWQy5OZXQgd2lsbCBub3QgYWxsb3cgY2FzdGluZyBvZgoJICAgICAgYSBkb3VibGUgdG8gYW4gZW51bSBkaXJlY3RseS4gVGhlcmVmb3JlIGNhc3QgdG8gaW50IHRoZW4gdG8gZW51bQoJICAgICAgKHRoYW5rcyB0byBKYXNvbiBSZWdvIGZvciB0aGlzIG9ic2VydmF0aW9uKQoKMDEvMTYvMjAwNjogbW1hdHVzIChDaGFuZ2UgZGlzYWJsZWQuLi4gd2lsbCBiZSBiYWNrIGluIENWUyBzb29uKQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHJlZ2V4cCB2aWEgdGhlIGV4dGVybmFsIGxpYnJhcnkKCSAgICBSeFNwZW5jZXIuIFNXSUcgZG9lc24ndCByZXF1aXJlIHRoaXMgbGlicmFyeSB0byBjb21waWxlCgkgICAgYW5kL29yIHJ1bi4gQnV0IGlmIHlvdSBzcGVjaWZ5IC0td2l0aC1yeHNwZW5jZXIsIGFuZCB0aGUKCSAgICBsaWJyYXJ5IGlzIGZvdW5kIGR1cmluZyBpbnN0YWxsYXRpb24sIHRoZW4gc3dpZyB3aWxsIHVzZQoJICAgIGl0IGluIHRocmVlIHBsYWNlczoKCgkgICAgLSBJbiAlcmVuYW1lcyBydWxlcywgdmlhIHRoZSBuZXcgcnhzbWF0Y2ggcnVsZXMsIGZvciBleGFtcGxlOgoJICAgIAkgIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbmFtZT0iR1NMXy4qIikgIiI7CgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRub2RlVHlwZT0iZW51bSBHU0xfLioiKSAiIjsKCSAgICAJIAogICAgICAgICAgICAgIHJ4c21hdGNoIGlzIHNpbWlsYXIgdG8gdGhlIG1hdGNoIHJ1bGUsIGl0IGp1c3QgdXNlcwogICAgICAgICAgICAgIHRoZSBSeFNwZW5jZXIgcmVnZXhwIGxpYnJhcnkgdG8gZGVjaWRlIGlmIHRoZXJlIGlzIGEKICAgICAgICAgICAgICBtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCByZWdleHAuIEFzIHdpdGggdGhlIG1hdGNoCiAgICAgICAgICAgICAgcnVsZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgbmVnYXRlIHJ1bGUgbm90cnhzbWF0Y2guCgoJICAgIC0gSW4gdGhlICVyZW5hbWUgdGFyZ2V0IG5hbWUgdmlhIHRoZSByeHN0YXJnZXQgb3B0aW9uLCBmb3IgZXhhbXBsZToKCSAgICAJCSAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c3RhcmdldD0xKSAiR1NMXy4qIjsKCgkgICAgCXdoZXJlIHRoZSB0YXJnZXQgbmFtZSAiR1NMLioiIGlzIG5vdyB1bmRlcnN0b29kIGFzIGEKCSAgICAJcmVnZXhwIHRvIGJlIG1hdGNoZWQuICAKCSAgICAJIAogICAgICAgICAgICAtIEluIHRoZSBuZXcgZW5jb2RlciAicnhzcGVuY2VyIiwgd2hpY2ggbG9va3MgbGlrZToKCgkgICAgCSAgJShyeHNwZW5jZXI6W3JlZ2V4cF1bcmVwbGFjZV0pcwoKCSAgICAJd2hlcmUgInJlZ2V4cCIgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgInJlcGxhY2UiCgkgICAgCWlzIGEgc3RyaW5nIHVzZWQgYXMgYSByZXBsYWNlbWVudCwgd2hlcmUgdGhlIEAwLEAxLC4uLixAOQoJICAgIAlwc2V1ZG8gYXJndW1lbnRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKCSAgICAJY29ycmVzcG9uZGluZyBtYXRjaGluZyBpdGVtcyBpbiB0aGUgcmVnIGV4cHJlc3Npb24uCgoJICAgIAlGb3IgZXhhbXBsZToKCSAgICAJCSAgICAgIAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEhlbGxvICAgIC0+IAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEdTTEhlbGxvIC0+IEdTTEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtAMV0pcyAgICAgPC0gR1NMSGVsbG8gLT4gSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW2dzbEAxXSlzICA8LSBHU0xIZWxsbyAtPiBnc2xIZWxsbwoKCSAgICAJQW5vdGhlciBleGFtcGxlIGNvdWxkIGJlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiUobG93ZXJjYXNlKXMiLHNvdXJjZWZtdD0iJShyeHNwZW5jZXI6W0dTTF8oLiopXVtAMV0pcyIsJSRpc2Z1bmN0aW9uKSAiIjsKCgkgICAgCXdoaWNoIHRha2Ugb3V0IHRoZSBwcmVmaXggIkdTTF8iIGFuZCByZXR1cm5zIGFsbCB0aGUKCSAgICAJZnVuY3Rpb24gbmFtZXMgaW4gbG93ZXIgY2FzZXMsIGFzIGZvbGxvd2luZzoKCgkgICAgCSAgICB2b2lkIEdTTF9IZWxsbygpOyAgIC0+ICAgaGVsbG8oKTsKCSAgICAJICAgIHZvaWQgR1NMX0hpKCk7ICAgICAgLT4gICBoaSgpOwoJICAgIAkgICAgY29uc3QgaW50IEdTTF9NQVg7ICAtPiAgIEdTTF9NQVg7ICAvLyBubyBjaGFuZ2UsIGlzIG5vdCBhIGZ1bmN0aW9uCgkKCSAgICBXZSB1c2UgdGhlIFJ4U3BlbmNlciBhcyBhbiBpbml0aWFsIHRlc3QgYmVkIHRvCiAgICAgICAgICAgIGltcGxlbWVudGlvbiB3aGlsZSB3ZSBkZWNpZGUgd2hpY2ggbGlicmFyeSB3aWxsIGJlCiAgICAgICAgICAgIGZpbmFsbHkgYWRkZWQgdG8gc3dpZy4KCiAgICAgICAgICAgIFlvdSBjYW4gb2J0YWluIHRoZSBSeFNwZW5jZXIgbGlicmFyeSBmcm9tIAoJICAgIAoJICAgICAgaHR0cDovL2FyZ2xpc3QuY29tL3JlZ2V4IChVbml4KQoKCSAgICBvcgoJICAgICAKCSAgICAgIGh0dHA6Ly9nbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQvcGFja2FnZXMuaHRtbCAoV2luZG93cykKCgkgICAgT25jZSBpbnN0YWxsZWQsIHVzZSAibWFuIHJ4c3BlbmNlciIgdG8gZ2V0IG1vcmUgaW5mbwoJICAgIGFib3V0IHRoZSByZWdleHAgZm9ybWF0LCBvciBqdXN0IGdvb2dsZSByeHNwZW5jZXIuCgoJICAgIFNpbmNlIG5vdyB5b3UgY2FuIGVuYWJsZSB0aGUgcnhzbWF0Y2ggcnVsZXMgKHNlZSBhYm92ZSksCiAgICAgICAgICAgIHRoZSBzaW1wbGUgb3IgJ3wnIHN1cHBvcnQgZm9yIHRoZSBtYXRjaCBydWxlcwogICAgICAgICAgICAoMDEvMTIvMjAwNjogbW1hdHVzKSBpcyBkaXNhYmxlZC4gU3RpbGwsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggdGhlIHJ4c3BlbmNlciBsaWJyYXJ5LCB5b3UgY2FuIHJlLWVuYWJsZQogICAgICAgICAgICB0aGUgc2ltcGxlICdtYXRjaCBvcicgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAtRFNXSUdfVVNFX1NJTVBMRV9NQVRDSE9SLgoJICAKCjAxLzE2LzIwMDY6IG1tYXR1cwoJICAgIENoYW5nZSB0aGUgJXJlbmFtZSBwcmVkaWNhdGVzIHRvIHVzZSB0aGUgcHJlZml4ICclJCcsIGFzIGluOgoJICAgIAoJICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJSRpc2Z1bmN0aW9uLCUkaXNtZW1iZXIpICIiOyAKCSAgIAkKICAgICAgICAgICAgdG8gYXZvaWQgY2xhc2hpbmdzIHdpdGggb3RoZXIgc3dpZyBtYWNyb3MvZGlyZWN0aXZlcy4KCjAxLzE0LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBBZGRlZCBzdXBwb3J0IGZvciBSdWJ5IGJhbmchIG1ldGhvZHMgdmlhIGEgbmV3ICViYW5nIGZlYXR1cmUuCgkgICAgQmFuZyBtZXRob2RzIGVuZCBpbiBleGNsYW1hdGlvbiBwb2ludHMgYW5kIGluZGljYXRlIHRoYXQgdGhlCgkgICAgb2JqZWN0IGJlaW5nIHByb2Nlc3NlZCB3aWxsIGJlIG1vZGlmaWVkIGluLXBsYWNlIGFzIAoJICAgIG9wcG9zZWQgdG8gYmVpbmcgY29waWVkLgoKMDEvMTIvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIFVwZGF0ZWQgdGhlIFJ1YnkgbW9kdWxlIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydAoJICAgIG1ldGhvZCBuYW1lcyB0byBsb3dlcl9jYXNlX3dpdGhfdW5kZXJzY29yZXMgdXNpbmcgdGhlCgkgICAgbmV3ICVyZW5hbWUgZnVuY3Rpb25hbGl0eS4KCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIGFsaWFzZXMgZm9yICdjYXNlJyBlbmNvZGVycyB1c2VkIHdpdGggJXJlbmFtZS8lbmFtZXdhcm4KCgkgICAgICAlKHVwcGVyY2FzZSlzICAgaGVsbG9fd29ybGQgLT4gSEVMTE9fV09STEQKCSAgICAgICUobG93ZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb3dvcmxkCgkgICAgICAlKGNhbWVsY2FzZSlzICAgaGVsbG9fd29ybGQgLT4gSGVsbG9Xb3JsZAoJICAgICAgJSh1bmRlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvX3dvcmxkCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlIC1kdW1wX3BhcnNlX21vZHVsZSBhbmQgLWR1bXBfcGFyc2VfdG9wIG9wdGlvbnMsCgkgICAgd2hpY2ggYXJlIHNpbWlsYXIgdG8gLWR1bXBfbW9kdWxlIGFuZCAtZHVtcF90b3AsIGJ1dCB0aGV5CgkgICAgZHVtcCB0aGUgbm9kZSB0cmVlcyBqdXN0IGFmdGVyIHBhcnNpbmcsIHNob3dpbmcgb25seSB0aGUgCgkgICAgYXR0cmlidXRlcyB2aXNpYmxlIGF0IHRoZSBwYXJzaW5nIHN0YWdlLCBhbmQgbm90IHRoZSBhZGRlZAoJICAgIGxhdGVyIGluIHR5cGVtYXAuY3h4LCBhbGxvY2F0ZS5jeHgsIGxhbmcuY3h4IG9yIGVsc2V3aGVyZS4KCSAgICAKCSAgICBCZXNpZGVzIGRlYnVnZ2luZyBwb3JwdXNlcywgdGhlc2Ugb3B0aW9ucyBhcmUgdmVyeSB1c2VmdWwKCSAgICBpZiB5b3UgcGxhbiB0byB1c2UgJXJlbmFtZSBpbiBhbiAiYWR2YW5jZSB3YXkiLCBzaW5jZSBpdAoJICAgIHNob3dzIG9ubHkgYW5kIGFsbCB0aGUgbm9kZSdzIGF0dHJpYnV0ZXMgeW91IGNhbiB1c2UKCSAgICBpbnNpZGUgdGhlIG1hdGNoIHJ1bGVzLgoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHByZWRpY2F0ZXMgdG8gJXJlbmFtZSwgc28sIHlvdSBkb24ndCBuZWVkIHRvCgkgICAgICByZW1lbWJlciwgZm9yIGV4YW1wbGUsIGhvdyB0byBtYXRjaCBhIG1lbWJlciBmdW5jdGlvbi4KCgkgICAgICBOb3cgaXQgaXMgZWFzeSwgZm9yIGV4YW1wbGUgdG8gdXNlIHRoZSAndXRpdGxlJyBlbmNvZGVyIAoJICAgICAgaW4gYWxsIHRoZSBtZW1iZXIgbWV0aG9kcywgeW91IHR5cGU6CgoJICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIiwlaXNmdW5jdGlvbiwlaXNtZW1iZXIpICIiOwoKCSAgICAgIG9yIHRvIGlnbm9yZSBhbGwgdGhlIGVudW1pdGVtcyBpbiBhIGdpdmVuIGNsYXNzOgoKCSAgICAgICAgJXJlbmFtZSgiJGlnbm9yZSIsICVpc2VudW1pdGVtLCAlY2xhc3NuYW1lPSJNeUNsYXNzIikgIiI7ICAKCgkgICAgICBBdmFpbGFibGUgcHJlZGljYXRlcyBhcmUgKHNlZSBzd2lnLnN3Zyk6CgogICAgICAgICAgICAgICAgJWlzZW51bSAgICAgICAgIAoJCSVpc2VudW1pdGVtICAgICAKCQklaXNhY2Nlc3MgICAgICAgCgkJJWlzY2xhc3MgICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzY29uc3RydWN0b3IgIAoJCSVpc2Rlc3RydWN0b3IgICAKCQklaXNuYW1lc3BhY2UgICAgCgkJJWlzdGVtcGxhdGUgICAgIAoJCSVpc2NvbnN0YW50ICAgICAKCQkJCQkKCQklaXN1bmlvbiAgICAgICAgCgkJJWlzZnVuY3Rpb24gICAgIAoJCSVpc3ZhcmlhYmxlICAgICAKCQklaXNpbW11dGFibGUgICAgCgkJCQkJCgkJJWlzc3RhdGljICAgICAgIAoJCSVpc2ZyaWVuZCAgICAgICAKCQklaXN0eXBlZGVmICAgICAgCgkJJWlzdmlydHVhbCAgICAgIAoJCSVpc2V4cGxpY2l0ICAgICAKCQklaXNleHRlcm4gICAgICAgCgkJCQkJCgkJJWlzbWVtYmVyICAgICAgIAoJCSVpc2dsb2JhbCAKCQklaW5uYW1lc3BhY2UKCgkJJWlzcHVibGljICAgIAoJCSVpc3Byb3RlY3RlZCAKCQklaXNwcml2YXRlICAgCgkJCQkgICAgIAoJCSVjbGFzc25hbWUgICAKCiAgICAgICAgICAgICAgVGhlc2UgcHJlZGljYXRlcyBjb3JyZXNwb25kIHRvIHNwZWNpZmljICdtYXRjaCcKICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMsIHdoaWNoIHNvbWV0aW1lcyBhcmUgbm90IGFzIGV2aWRlbnQgYXMgdGhlCiAgICAgICAgICAgICAgcHJlZGljYXRlcyBuYW1lcy4KCgogICAgICAgICAgICAtIEFkZCB0aGUgb3IgJ3wnIG9wZXJhdGlvbiBpbiAlcmVuYW1lIG1hdGNoLCBmb3IKICAgICAgICAgICAgICBleGFtcGxlIHRvIGNhcGl0YWxpemUgYWxsIHRoZSBjb25zdGFudHMgKCVjb25zdGFudCBvcgogICAgICAgICAgICAgIGNvbnN0IGNkZWNsKToKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSgiJSh1cHBlcilzIixtYXRjaD0iY2RlY2x8Y29uc3RhbnQiLCVpc2ltbXV0YWJsZSkgIiI7CiAgICAgICAgICAgICAgICAKCgowMS8xMi8yMDA2OiBtZ29zc2FnZQoJICAgIC0JUGFydGlhbCBmaXhlZCBvZiBlcnJvcnMgdW5kZXIgQzg5LCBidWcgIzEzNTY1NzQKCSAgICAJKGNvbnZlcnRlZCBDKysgc3R5bGUgY29tbWVudHMgdG8gQyBzdHlsZSkKCSAgICAtCUFkZGVkIHBhdGNoZXMgZnJvbSBuZW9tYW50cmFAdXNlcnMuc2YubmV0ICMxMzc5OTg4IGFuZCAjMTM4ODM0MwoJICAgIAltaXNzaW5nIGEgJ3JldHVybicgc3RhdGVtZW50IGZvciBlcnJvciBjb25kaXRpb25zCgkgICAgCWFsc28gdXBkYXRlZCB0aGUgJWluaXQgYmxvY2sgYnVnICMxMzU2NTg2CgkJIAowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgJ3V0aXRsZScgZW5jb2RlciwgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gYWRkCgkgICAgICB5b3VyIG93biBlbmNvZGVyLiBJIGFkZGVkIHRoZSBlbmNvZGVyIG1ldGhvZCBpbiBtaXNjLmMgCgkgICAgICBidXQgZGV2ZWxvcGVycyBjYW4gYWRkIG90aGVycywgdGhlIHNhbWUgd2F5LCBpbnNpZGUgYW55CgkgICAgICB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgICAKCSAgICAgIFdlbGwsICd1dGl0bGUnIGlzIHRoZSByZXZlcnNlIG9mICdjdGl0bGUnLCBpZToKCgkgICAgICAgICAlcmVuYW1lKCIlKGN0aXRsZSlzIikgY2FtZWxfY2FzZTsgIC0+IENhbWVsQ2FzZTsKCSAgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiKSBDYW1lbENhc2U7ICAgLT4gY2FtZWxfY2FzZTsKCQkgCgowMS8xMC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCiAgICAgICAgICAgIFVwZGF0ZWQgUnVieSBFeGNlcHRpb24gaGFuZGxpbmcuICBDbGFzc2VzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aHJvd3MgY2xhdXNlcywgCiAgICAgICAgICAgIG9yIGFyZSBtYXJrZWQgYXMgJWV4Y2VwdGlvbmNsYXNzLCBhcmUgbm93IGluaGVyaXRlZCBmcm9tIHJiX2VSdW50aW1lRXJyb3IuIAogICAgICAgICAgICBUaGlzIGFsbG93cyBpbnN0YW5jZXMgb2YgdGhlc2UgY2xhc3NlcyB0byBiZSByZXR1cm5lZCB0byBSdWJ5IGFzIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICBUaHVzIGlmIGEgQysrIG1ldGhvZCB0aHJvd3MgYW4gaW5zdGFuY2Ugb2YgTXlFeGNlcHRpb24sIHRoZSBjYWxsaW5nIFJ1YnkgCiAgICAgICAgICAgIG1ldGhvZCB3aWxsIGdldCBiYWNrIGEgTXlFeGNlcHRpb24gb2JqZWN0LiAgVG8gc2VlIGFuIGV4YW1wbGUsIAogICAgICAgICAgICBsb29rIGF0IHJ1YnkvZXhhbXBsZXMvZXhjZXB0aW9uX2NsYXNzLgoKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgCiAgICAgICAgICAgIC0gQWRkIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUsIHdoaWNoIGNvbXBsZW1lbnRzIHRoZSAlZXhjZXB0aW9uCgkgICAgZGlyZWN0aXZlIGluIGEgbW9yZSBhdXRvbWF0aWMgd2F5LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKCiAgICAgICAgICAgICAgICBpbnQgZm9vKCkgdGhyb3coRTEpOwoKICAgICAgICAgICAgc3dpZyBnZW5lcmF0ZXMgdGhlIHByb3BlciB0cnkvY2F0Y2ggY29kZSB0byBkaXNwYXRjaCBFMS4KCSAgICAKCSAgICBCdXQgaWYgeW91IGhhdmU6CgoKCSAgICAgICAgICBpbnQgYmFyZm9vKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgewoJICAgICAgICAgICAgICAgdGhyb3cgRTEoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICB0aHJvdyBFMigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWUsIHdoZXJlIHRoZXJlIGlzIG5vIGV4cGxpY2l0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGluIHRoZSBkZWNsLCB5b3UgCgkgICAgZW5kIHVwIGRvaW5nOgoJCSAgCiAgICAgICAgICAgICAgICVleGNlcHRpb24gYmFyZm9vIHsJCQkKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUxKSB7CS4uLiB9CQkJCSAgCgkgICAgICAgICB9IGNhdGNoKEUyKSB7CS4uLiB9CQkJCSAgCgkgICAgICAgfQkJCQkKCSAgICAKCSAgICB3aGljaCBpcyB2ZXJ5IHRlZGlvdXMuIFdlbGwsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgZGVmaW5lcwoJICAgIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdG8gY2F0Y2gsIGFuZCBmcm9tIHN3aWc6CiAJCgkgICAgICAgJWNhdGNoZXMoRTEsRTIpIGJhcmZvbyhpbnQgaSk7CgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSk7CgogICAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvIAoKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKSB0aHJvdyhFMSxFMik7CgoJICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlICVjYXRjaGVzIGxpc3QgZG9lc24ndCBoYXZlIHRvCgkgICAgY29ycmVzcG9uZCB0byB0aGUgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91CgkgICAgaGF2ZToKCgkJc3RydWN0IEUge307CgkJc3RydWN0IEUxIDogRSB7fTsKCQlzdHJ1Y3QgRTIgOiBFIHt9OwoKICAJICAgICAgICBpbnQgYmFyZm9vKGludCBpKSB0aHJvdyhFMSxFMik7CgogICAgICAgICAgICB5b3UgY2FuIGRlZmluZQoJICAgICAgICAKCQklY2F0Y2hlcyhFKSBiYXJmb28oaW50IGkpOwoJCgkgICAgYW5kIHN3aWcgd2lsbCBnZW5lcmF0ZSBhbiBhY3Rpb24gY29kZSBlcXVpdmFsZW50IHRvCgoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRSAmX2UpIHsgCgkJICAgPHJhaXNlIF9lPjsKCQkgfQkKCiAgICAgICAgICAgIE9mIGNvdXJzZSwgeW91IHN0aWxsIGhhdmUgdG8gc2F0aXNmeSB0aGUgQysrIHJlc3RyaWN0aW9ucywKCSAgICBhbmQgdGhlIGNhdGNoZXMgbGlzdCBtdXN0IGJlIGNvbXBhdGlibGUgKG5vdCB0aGUgc2FtZSkKCSAgICBhcyB0aGUgb3JpZ2luYWwgbGlzdCBvZiB0eXBlcyBpbiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCgoJICAgIEFsc28sIHlvdSBjYW4gbm93IHNwZWNpZnkgdGhhdCB5b3Ugd2FudCB0byBjYXRjaCB0aGUKCSAgICB1bmtub3duIGV4Y2VwdGlvbiAnLi4uJywgZm9yIGV4YW1wbGU6CgoJICAgICAgICVjYXRjaGVzKEUxLEUyLC4uLikgYmFyZm9vKGludCk7CgoJICAgIEluIGFueSBjYXNlLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIHdpbGwgZW1pdCB0aGUKCSAgICBjb2RlIHRvIGNvbnZlcnQgaW50byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGVycm9yL2V4Y2VwdGlvbgogICAgICAgICAgICB1c2luZyB0aGUgJ3Rocm93cycgdHlwZW1hcC4KCgkgICAgRm9yIHRoZSAnLi4uJyBjYXNlIHRvIHdvcmssIHlvdSBuZWVkIHRvCgkgICAgd3JpdGUgdGhlIHByb3BlciB0eXBlbWFwIGluIHlvdXIgdGFyZ2V0IGxhbmd1YWdlLiBJbiB0aGUKCSAgICBVVEwsIHRoaXMgbG9va3MgbGlrZToKCgkgICAgICAldHlwZW1hcCh0aHJvd3MpICguLi4pIHsKCSAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19SdW50aW1lRXJyb3IsInVua25vd24gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgfQoKMDEvMDkvMjAwNjogbXV0YW5kaXoKCSAgICBbQWxsZWdyb2NsXQoKICAgICAgICAgICAgRml4ZXMgYSBudW1iZXIgb2YgU0VHVnMgcHJpbWFyaWx5IGluIHRoZSBoYW5kbGluZyBvZgogICAgICAgICAgICB2YXJpb3VzIGFub255bW91cyB0eXBlcy4gRm91bmQgaW4gYSBwYXNzIHRocm91Z2ggdGhlCiAgICAgICAgICAgIHN3aWcgdGVzdC1zdWl0ZS4gU3RpbGwgbW9yZSB0byBkbyBoZXJlLCBidXQgdGhpcyBpcyBhCiAgICAgICAgICAgIGdvb2QgY2hlY2twb2ludC4KCiAgICAgICAgICAgIEFkZHMgLWN3cmFwIGFuZCAtbm9jd3JhcCBhcyBhbiBhbGxlZ3JvY2wgc3BlY2lmaWMKICAgICAgICAgICAgY29tbWFuZC1saW5lIGFyZ3VtZW50LiBDb250cm9scyBnZW5lcmF0aW5nIG9mIGEgQwogICAgICAgICAgICB3cmFwcGVyIGZpbGUgd2hlbiB3cmFwcGluZyBDIGNvZGUuIEJ5IGRlZmF1bHQgb25seSBhCiAgICAgICAgICAgIGxpc3AgZmlsZSBpcyBjcmVhdGVkIGZvciBDIGNvZGUgd3JhcHBpbmcuCgogICAgICAgICAgICBEb2MgdXBkYXRlcyBmb3IgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYW5kIGZpeGVzIGFzCiAgICAgICAgICAgIHBvaW50ZWQgb3V0IG9uIHN3aWctZGV2ZWwKCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdW5zaWduZWQgbG9uZyBsb25nIGFuZCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJiB0eXBlbWFwcwogICAgICAgICAgICAtIEJ1ZyAjMTM5ODM5NCAgd2l0aCBwYXRjaCBmcm9tIERyaWVzIERlY29jawoKMDEvMDYvMjAwNjogbW1hdHVzCgkgICAgQWRkICduYW1lZCcgd2FybmluZyBjb2Rlcywgbm93IGluIGFkZGl0aW9uIHRvOgoJICAgIAoJICAgICAgJXdhcm5maWx0ZXIoODEzKTsKCSAgIAoJICAgIHlvdSBjYW4gdXNlCgoJICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fSkFWQV9NVUxUSVBMRV9JTkhFUklUQU5DRSk7CgoJICAgIGp1c3QgdXNlIHRoZSBzYW1lIGNvZGUgbmFtZSBmb3VuZCBpbiAgU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaCAKCSAgICBwbHVzIHRoZSAnU1dJRycgcHJlZml4LgoKCSAgICBJZiBhIGRldmVsb3BlciBhZGRzIGEgbmV3IHdhcm5pbmcgY29kZSwgdGhlIExpYi9zd2lnd2Fybi5zd2cgZmlsZQogICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIHJ1bm5pbmcgdGhlIHRvcCBsZXZlbCBtYWtlLgoKMDEvMDUvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIFJlaW1wbGVtZW50ZWQgb2JqZWN0IHRyYWNraW5nIGZvciBSdWJ5LiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiB3b3JrcwoJICAgIGJ5IGV4cGFuZGluZyB0aGUgc3dpZ19jbGFzcyBzdHJ1Y3R1cmUgZm9yIFJ1YnkgYnkgYWRkaW5nIGEgdHJhY2tPYmplY3RzCgkgICAgZmllbGQuICBUaGlzIGZpZWxkIGNhbiBiZSBzZXQvdW5zZXQgdmlhICV0cmFja29iamVjdHMgYXMgZXhwbGFpbmVkCgkgICAgaW4gdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbi4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gaXMgbW9yZSByb2J1c3QKCSAgICBhbmQgdGFrZXMgbGVzcyBjb2RlIHRvIGltcGxlbWVudC4KCQkKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZXh0ZW5kIGFuZCBzdGF0aWMgY29uc3QgaW50ZWdyYWwgdHlwZXMsIGVnOgoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBiYXIgPSA0MjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OyAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgaW5mbyBmb3Igb2xkIGFuZCBuZXcgZGVidWcgb3B0aW9uczoKICAgICAgICAgICAgICAKICAgICAgICAgICAgLWR1bXBfdG9wICAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIGVudGlyZSBub2RlIHRyZWUsIGluY2x1ZGluZyBzeXN0ZW0gbm9kZXMgICAgCiAgICAgCSAgICAtZHVtcF9tb2R1bGUgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgbW9kdWxlIG5vZGUgdHJlZSwgYXZvaWRpbmcgc3lzdGVtIG5vZGVzICAgICAKICAgICAJICAgIC1kdW1wX2NsYXNzZXMgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbGFzc2VzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWR1bXBfdHlwZWRlZiAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGVzIGFuZCB0eXBlZGVmcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgCSAgICAtZHVtcF90YWdzICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFncyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kZWJ1Z190eXBlbWFwICAtIFByaW50IGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcgdHlwZW1hcHMJCQkgICAgICAgCiAgICAgICAgICAgIC1kZWJ1Z190ZW1wbGF0ZSAtIFByaW50IGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcgdGVtcGxhdGVzCQkJICAgICAgICAKCgkgIC0gQWRkIHRoZSBmYWtldmVyc2lvbi4gSWYgeW91IGhhdmUgYSBwcm9qZWN0IHRoYXQgdXNlcwogICAgICAgICAgICBjb25maWd1cmUvc2V0dXAucHksIG9yIGFub3RoZXIgYXV0b21hdGljIGJ1aWxkaW5nIHN5c3RlbQogICAgICAgICAgICBhbmQgcmVxdWlyZXMgYSBzcGVjaWZpYyBzd2lnIHZlcnNpb24sIGxldCBzYXkgMS4zLjIyIAoJICAgIHlvdSBjYW4gdXNlOgoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIgoKCSAgICAgb3IKIAogICAgICAgICAgICAgICBzd2lnIC1mYWtldmVyc2lvbiAxLjMuMjIKCiAgICAgICAgICAgICBhbmQgdGhlbiBzd2lnIC12ZXJzaW9uIHdpbGwgcmVwb3J0IDEuMy4yMiBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICAgY3VycmVudCB2ZXJzaW9uLgoKCSAgICAgVHlwaWNhbCB1c2Ugd291bGQgYmUKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIgLi9jb25maWd1cmUgCSAgICAgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIG9wdGlvbi9mb3JtYXQgc3VwcG9ydCB0byAlcmVuYW1lIGFuZCAlbmFtZXdhcm4uCQoJICAgIE5vdyAlbmFtZXdhcm4gY2FuIGZvcmNlIHJlbmFtaW5nLCBmb3IgZXhhbXBsZToKCgkgICAgICAlbmFtZXdhcm4oIjMxNDogaW1wb3J0IGlzIGEga2V5d29yZCIscmVuYW1lPSJfJXMiKSAiaW1wb3J0IjsKCSAgICAKCSAgICBhbmQgcmVuYW1lIGNhbiBhbHNvIHN1cHBvcnQgZm9ybWF0IGZvcm1zOgoKCSAgICAgICAlcmVuYW1lKCJzd2lnXyVzIikgaW1wb3J0OwoKCSAgICBOb3csIHNpbmNlIHRoZSBmb3JtYXQgaXMgcHJvY2Vzc2VkIHZpYSBzd2lnIFByaW50ZiwgeW91CgkgICAgY2FuIHVzZSBlbmNvZGVycyBhcyBmb2xsb3dzOgoKCSAgICAgICAlcmVuYW1lKCIlKHRpdGxlKXMiKSAgaW1wb3J0OyAgICAgLT4gSW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJSh1cHBlcilzIikgIGltcG9ydDsgICAgIC0+IElNUE9SVAoJICAgICAgICVyZW5hbWUoIiUobG93ZXIpcyIpICBJbXBvcnQ7ICAgICAtPiBpbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKGN0aXRsZSlzIikgY2FtZWxfY2FzZTsgLT4gQ2FtZWxDYXNlCgkgICAgICAgCgkgICAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGFkZCBtb3JlIGVuY29kZXJzLCBhcyB0aGUgCgkgICAgZXhwZWN0ZWQgb25lIGZvciByZWd1bGFyIGV4cHJlc3Npb25zLiAKCgkgIC0gQWRkIHRoZSBhYm92ZSAnY3RpdGxlJyBlbmNvZGVyLCB3aGljaCBkb2VzIHRoZSBjYW1lbCBjYXNlOgoKCSAgICAgICAgY2FtZWxfY2FzZSAtPiBDYW1lbENhc2UKICAKCSAgLSBBbHNvLCB3aGlsZSB3ZSBnZXQgdGhlIHJlZ2V4cCBzdXBwb3J0LCBhZGQgdGhlICdjb21tYW5kJyBlbmNvZGVyLAogICAgICAgICAgICB5b3UgY2FuIHVzZSBpdCBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6c2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCApcyIpIGltcG9ydDsgCgoJICAgIHRoZW4gc3dpZyB3aWxsIHBvcGVuIHRoZSBjb21tYW5kCgkgICAgCgkJInNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgaW1wb3J0IgoJCQogICAgICAgICAgICBzZWUgYmVsb3cgZm9yIGFub255bW91cyByZW5hbWVzIGZvciBiZXR0ZXIgZXhhbXBsZXMuCQkKCiAgICAgICAgICAtIFRoZSByZW5hbWUgZGlyZWN0aXZlIG5vdyBhbHNvIGFsbG93czoKCgkgICAgLSBzaW1wbGUgbWF0Y2g6IG9ubHkgYXBwbHkgdGhlIHJlbmFtZSBpZiBhIHR5cGUgbWF0Y2gKCSAgICAgIGhhcHBlbiwgZm9yIGV4YW1wbGUKCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoPSJlbnVtaXRlbSIpIGhlbGxvOwoKCQkgZW51bSBIZWxsbyB7CgkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAKCQkgfTsKCQkgaW50IGhlbGxvKCkgIC0+ICBoZWxsbzsgCgoJICAgIC0gZXh0ZW5kZWQgbWF0Y2g6IG9ubHkgYXBwbHkgdGhlIHJlbmFtZSBpZiB0aGUgJ2V4dGVuZGVkIGF0dHJpYnV0ZScgbWF0Y2gKCSAgICAgIG9jY3VycmVkLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gc2FtZSBhcyBzaW1wbGUgbWF0Y2ggCQkKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CgkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAKCQkgfTsKCgkgICAgICAgTm90ZSB0aGF0IHRoZSBzeW1ib2wgJyQnIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBhdHRyaWJ1dGUgbmFtZSBpbgoJICAgICAgIGEgJ3JlY3Vyc2l2ZScgd2F5LCBmb3IgZXhhbXBsZToKCgkJIC8vIG1hdGNoIG9ubHkgaGVsbG8gaW4gJ2VudW0gSGVsbG8nCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJHBhcmVudE5vZGUkdHlwZT0iZW51bSBIZWxsbyIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gICAvLyBtYXRjaAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgogICAgICAgICAgICAgICBoZXJlLCBmb3IgSGVsbG86OmhpLCB0aGUgInBhcmVudE5vZGUiIGlzICJIZWxsbyIsIGFuZCBpdHMgInR5cGUiCiAgICAgICAgICAgICAgIGlzICJlbnVtIEhlbGxvIi4KCSAgICAgICAKCSAgICAgICAKICAgICAgICAgICAgLSBBbm9ueW1vdXMgcmVuYW1lczogeW91IGNhbiB1c2UgJ2Fub255bW91cycgcmVuYW1lIGRpcmVjdGl2ZXMsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBlbnVtIGl0ZW1zIGluIEhlbGxvCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJHBhcmVudE5vZGUkdHlwZT0iZW51bSBIZWxsbyIpICIiOyAKCgkJIGVudW0gSGVsbG8gewogCQkgICBoaSwgaGVsbG8gIC0+ICBIaSwgSGVsbG8gICAvLyBtYXRjaCBib3RoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCQkgCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBlbnVtIGl0ZW1zIAoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSAiIjsgCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgaXRlbXMgaW4gZ2l2ZW4gY29tbWFuZCAoc2xvb29vdywgYnV0Li4uKQoJCSAlcmVuYW1lKCUoY29tbWFuZDo8bXkgZXh0ZXJuYWwgY21kPilzKSAiIjsgCgoJCgkgICAgICBBbm9ueW1vdXMgcmVuYW1lcyB3aXRoIGNvbW1hbmRzIGNhbiBiZSB2ZXJ5IHBvd2VyZnVsLCBzaW5jZSB5b3UKCSAgICAgIGNhbiAnb3V0c291cmNlJyBhbGwgdGhlIHJlbmFtaW5nIG1lY2hhbmlzbSAob3IgcGFydCBvZiBpdCkgdG8gYW4KCSAgICAgIGV4dGVybmFsIHByb2dyYW06CgkgICAgICAKCSAgICAgICAgLy8gVXBwZXJjYXNlIGFsbCAoYW5kIG9ubHkpIHRoZSBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggJ2knCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJy9eaS97cHJpbnQgdG91cHBlcigkMSl9JyA8PDwpcyIpICIiOyAgIAoJICAgICAgIAoJICAgICAgICBpbnQgaW1wb3J0ZWQoKSAtPiBJTVBPUlRFRDsKCSAgICAgICAgaW50IGhlbGxvKCkgICAgLT4gaGVsbG8KCgkgICAgICBOb3RlIHRoYXQgaWYgdGhlICdjb21tYW5kJyBlbmNvZGVyIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCBzd2lnCgkgICAgICB1bmRlcnN0YW5kcyB0aGF0IG5vIHJlbmFtZSBpcyBuZWNlc3NhcnkuCgoJICAgICAgQWxzbyBub3RlIHRoYXQgJXJlbmFtZSAncGFzc2VzJyB0aGUgbWF0Y2hlZCBuYW1lLiBGb3IgZXhhbXBsZSwgaW4KCSAgICAgIHRoaXMgY2FzZQoKCSAgICAgICAgbmFtZXNwYWNlIG5zMSB7CgkJICBpbnQgZm9vKCk7CgkJfQoKCSAgICAgICAgbmFtZXNwYWNlIG5zMiB7CgkJICBpbnQgYmFyKCk7CgkJfQoKCSAgICAgIHRoZSBleHRlcm5hbCBwcm9ncmFtIG9ubHkgcmVjZWl2ZXMgImZvbyIgYW5kICJiYXIiLiBJZiBuZWVkZWQsCgkgICAgICBob3dldmVyLCB5b3UgY2FuIHJlcXVlc3QgdGhlICdmdWxsbmFtZScgCgkgICAgICAgCQoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICdhd2sgJy9uczE6Oi97bD1zcGxpdCgkMSxhLCI6OiIpOyBwcmludCB0b3VwcGVyKGFbbF0pfScnIDw8PClzIixmdWxsbmFtZT0xKSAiIjsgICAKICAgICAgICAgICAgICAgIAoJCW5zMTo6Zm9vIC0+IEZPTwoJCW5zMjo6YmFyIC0+IGJhcgkKCQoJICAgIC0gTWl4aW5nIGVuY29kZXJzIGFuZCBtYXRjaGluZzogb2YgY291cnNlLCB5b3UgY2FuIGRvIG1peCBjb21tYW5kcwoJICAgICAgYW5kIG1hdGNoIGZpZWxkcywgZm9yIGV4YW1wbGU6CgoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBmbmNzPikiLG1hdGNoPSJjZGVjbCIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcz4pIixtYXRjaD0iZW51bWl0ZW0iKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXMgaW5zaWRlIGEgY2xhc3M+KSIsbWF0Y2g9ImVudW1pdGVtIiwKCQkgICAgICAgIG1hdGNoJHBhcmVudE5vZGUkcGFyZW50Tm9kZSRub2RlVHlwZT0iY2xhc3MiKSAiIjsKCQkKCSAgICAgIFVzZSAic3dpZyAtZHVtcF9wYXJzZV9tb2R1bGUiIHRvIHNlZSB0aGUgYXR0cmlidXRlIG5hbWVzIHlvdSBjYW4gdXNlIHRvCgkgICAgICBtYXRjaCBhIHNwZWNpZmljIGNhc2UuCgkKICAgICAgICAgICAgLSAnc291cmNlZm10JyBhbmQgJ3RhcmdldGZtdCc6IHNvbWV0aW1lcyB5b3UgbmVlZCB0bwogICAgICAgICAgICAgIHByb2Nlc3MgdGhlICdzb3VyY2UnIG5hbWUgYmVmb3JlIGNvbXBhcmluZywgZm9yIGV4YW1wbGUKCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIikgImVtcHR5IjsKCgkgICAgICB0aGVuIGlmIHlvdSBoYXZlCgoJICAgICAgICBpbnQgRW1wdHkoKTsgIC8vICJFbXB0eSIgaXMgdGhlIHNvdXJjZSAKCQkKCSAgICAgIHlvdSB3aWxsIGdldCB0aGUga2V5d29yZCB3YXJuaW5nIHNpbmNlICdFbXB0eScgd2lsbCBiZQoJICAgICAgbG93ZXIgY2FzZWQsIHZpYSB0aGUgc291cmNlZm10PSIlKGxvd2VyKXMiIG9wdGlvbiwKCSAgICAgIGJlZm9yZSBiZWVuIGNvbXBhcmVkIHRvIHRoZSAndGFyZ2V0JyAiZW1wdHkiLgoKCSAgICAgIFRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgJ3RhcmdldGZtdCcgb3B0aW9uIHRvIHByb2Nlc3MgdGhlCgkgICAgICAndGFyZ2V0JyBiZWZvcmUgY29tcGFyaW5nLgoKCSAgICAtIGNvbXBsZW1lbnRpbmcgJ21hdGNoJzogeW91IGNhbiB1c2UgJ25vdG1hdGNoJywgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIsbm90bWF0Y2g9Im5hbWVzcGFjZSIpICJlbXB0eSI7CgoJICAgICAgaGVyZSwgdGhlIG5hbWUgd2FybmluZyB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzeW1ib2xzIGV4Y2VwdCBuYW1lc3BhY2VzLgoJICAgIAogICAgICAJCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBnY2ogYW5kIEphdmEgLT4gPHRhcmdldCBsYW5ndWFnZT4gbWVjaGFuaXNtLgoKCSAgICBTZWUJZXhhbXBsZXMgaW46ICAKCSAgCgkJRXhhbXBsZXMvcHl0aG9uL2phdmEKCQlFeGFtcGxlcy9ydWJ5L2phdmEKCQlFeGFtcGxlcy90Y2wvamF2YQoKICAgICAgICAgICAgdG8gc2VlIGhvdyB0byB1c2UgZ2NqK3N3aWcgdG8gZXhwb3J0IGphdmEgY2xhc3NlcyBpbnRvCiAgICAgICAgICAgIHB5dGhvbi9ydWJ5L3RjbC4KCSAgICAKCSAgICBUaGUgaWRlYSBpcyB0byBwdXQgYWxsIHRoZSBjb21tb24gY29kZSBmb3IgZ2NqIGluc2lkZQoKCSAgICAgICAgICBMaWIvZ2NqCgogICAgICAgICAgICBhbmQgbG9jYWxpemUgc3BlY2lmaWMgdHlwZXMgc3VjaCBhcyBqc3RyaW5nLCBhcyBjYW4gYmUgZm91bmQKICAgICAgICAgICAgaW4KCgkgICAgICAgICBMaWIvcHl0aG9uL2pzdHJpbmcuaQoJICAgICAgICAgTGliL3J1YnkvanN0cmluZy5pCgkgICAgICAgICBMaWIvdGNsL2pzdHJpbmcuaQoKICAgICAgICAgICAgVXNpbmcgdGhlIFVUTCwgdGhpcyBpcyB2ZXJ5IGVhc3ksIGFuZCB0aGUgcGVybCB2ZXJzaW9uIGZvcgogICAgICAgICAgICBqc3RyaW5nLmkgd2lsbCBiZSBuZXh0LgoJCSAJICAgIAoKMTIvMjkvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSBjb3B5Y3RvciBmZWF0dXJlL2RpcmVjdGl2ZS9vcHRpb24gdG8gZW5hYmxlIHRoZSBhdXRvbWF0aWMKCSAgICBnZW5lcmF0aW9uIG9mIGNvcHkgY29uc3RydWN0b3JzLiBVc2UgYXMgaW46CgoJICAgICAgJWNvcHljdG9yIEE7CgoJICAgICAgc3RydWN0IEEgewoKICAgICAgICAgICAgICB9OwoKCSAgICB0aGVuIHRoaXMgd2lsbCB3b3JrCgoJICAgICAgYTEgPSBBKCk7CgkgICAgICBhMiA9IEEoYTEpOwoKCSAgICBBbHNvLCBzaW5jZSBpdCBpcyBhIGZlYXR1cmUsIGlmIHlvdSBqdXN0IHR5cGUKCgkgICAgICAlY29weWN0b3I7CgoJICAgIHRoYXQgd2lsbCAgZW5hYmxlIHRoZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBmb3IgYWxsIHRoZQoJICAgIGNsYXNzZXMuIEl0IGlzIGFsc28gZXF1aXZhbGVudCB0bwoKCSAgICAgICBzd2lnIC1jb3B5Y3RvciAtYysrIC4uLgoKCSAgICBOb3RlczogCgoJICAgIDEuLSBUaGUgZmVhdHVyZSBvbmx5IHdvcmtzIGluIEMrKyBtb2RlLgoKCSAgICAyLi0gVGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiB0aGUgY29weSBjb25zdHJ1Y3RvciB3aWxsCgkgICAgICAgIHVzdWFsbHkgcHJvZHVjZSBvdmVybG9hZGluZy4gSGVuY2UsIGlmIHRoZSB0YXJnZXQKCSAgICAgICAgbGFuZ3VhZ2UgZG9lc24ndCBzdXBwb3J0IG92ZXJsb2FkaW5nLCBhIHNwZWNpYWwgbmFtZQoJICAgICAgICB3aWxsIGJlIHVzZWQgKEFfY29weSkuCgkgICAgCgkgICAgMy4tIEZvciB0aGUgb3ZlcmxvYWRpbmcgcmVhc29ucyBhYm92ZSwgaXQgaXMgcHJvYmFibHkgbm90CiAgICAgICAgICAgICAgICBhIGdvb2QgaWRlYSB0byB1c2UgdGhlIGZsYWcgd2hlbiwgZm9yIGV4YW1wbGUsIHlvdSBhcmUKCQl1c2luZyBrZXl3b3JkcyBpbiBQeXRob24uCgogICAgICAgICAgICA0Li0gVGhlIGNvcHljdG9yIGF1dG9tYXRpYyBtZWNoYW5pc20gZm9sbG93cyBtb3JlIG9yIGxlc3MKCSAgICAgICAgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgbWVjaGFuaXNtLAoJICAgICAgICBpLmUuLCBhIGNvcHkgY29uc3RydWN0b3Igd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlCgkgICAgICAgIGNsYXNzIGlzIGFic3RyYWN0IG9yIGlmIHRoZXJlIGlzIGEgcGVydGluZW50IG5vbi1wdWJsaWMgCgkJY29weSBjdG9yIGluIHRoZSBjbGFzcyBvciBpdHMgaGllcmFyY2h5LgoKCQlIZW5jZSwgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IGZvciB5b3UgdG8gY29tcGxldGUgdGhlCgkJY2xhc3MgZGVjbGFyYXRpb24gd2l0aCB0aGUgcHJvcGVyIG5vbi1wdWJsaWMgY29weSBjdG9yCgkJdG8gYXZvaWQgYSB3cm9uZyBjb25zdHJ1Y3RvciBhZGRpdGlvbi4KCQkKICAgICAgICAgIC0gRml4IGZlYXR1cmVzL3JlbmFtZSBmb3IgdGVtcGxhdGVzIGN0b3IvZHRvciBhbmQgb3RoZXIKICAgICAgICAgICAgdGhpbmdzIGFyb3VuZCB3aGlsZSBhZGRpbmcgdGhlIGNvcHljdG9yIG1lY2hhbmlzbS4KCSAgICAKCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgJ21hdGNoJyBvcHRpb24gdG8gdHlwZW1hcHMuIEFzc3VtZSB5b3UgaGF2ZToKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAoaW50IHJlcykgey4ufQoJICAgICAgJXR5cGVtYXAoZnJlZWFyZykgU1dJR1RZUEUgKiB7IGlmIChyZXMkYXJnbnVtKSAuLi59CgoJICAgIHRoZW4gaWYgeW91IGRvCiAKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KCgkgICAgc3dpZyB3aWxsICdvdmVybG9hZCB0aGUgJ2luJyB0eXBlbWFwLCBidXQgdGhlICdmcmVlYXJnJyAKCSAgICB0eXBlbWFwIHdpbGwgYmUgYWxzbyBhcHBsaWVkLCBldmVuIHdoZW4gdGhpcyBpcyB3cm9uZy4gVGhlIG9sZAoJICAgIHNvbHV0aW9ucyBpcyB0byB3cml0ZToKCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CiAgCSAgICAgICV0eXBlbWFwKGZyZWVhZykgQSAqICIiOwoKCSAgICBvdmVybG9hZCAnZnJlZWFyZycgd2l0aCBhbiBlbXB0eSBkZWZpbml0aW9uLgoKCSAgICBUaGUgcHJvYmxlbSBpcywgaG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgeW91IG5lZWQKCSAgICB0byBkbyB0aGF0IHVudGlsIHlvdSBzdGFydCBnZXR0aW5nIGJyb2tlbiBDKysgY29kZSwgb3IKCSAgICB3b3JzZSwgYnJva2VuIHJ1bnRpbWUgY29kZS4KCgkgICAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgaW5mYW1vdXMgJ3R5cGVjaGVjaycgdHlwZW1hcCwKCSAgICB3aGljaCBhbHdheXMgY29uZnVzZXMgcGVvcGxlLCBzaW5jZSB0aGUgZmlyc3QgdGhpbmcgeW91IGRvCgkgICAgaXMgdG8ganVzdCB3cml0ZSB0aGUgJ2luJyB0eXBlbWFwLgoKCSAgICBUaGUgJ21hdGNoJyBvcHRpb24gc29sdmVzIHRoZSBwcm9ibGVtLCBhbmQgaWYgaW5zdGVhZCB5b3Ugd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcsbWF0Y2g9ImluIikgU1dJR1RZUEUgKiB7IGlmIChyZXMkYXJnbnVtKSAuLi59CgkgICAgICAldHlwZW1hcCh0eXBlY2hlY2ssbWF0Y2g9ImluIixwcmVjZWRlbmNlLi4uKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgkgICAgaXQgd2lsbCB0ZWxsIHN3aWcgdG8gYXBwbHkgdGhlICdmcmVlYXJnL3R5cGVjaGVjaycKCSAgICB0eXBlbWFwcyBvbmx5IGlmIHRoZXkgJ21hdGNoJyB0aGUgdHlwZSBvZiB0aGUgJ2luJwoJICAgIHR5cGVtYXAuIFRoZSBzYW1lIGNhbiBiZSBkb25lIHdpdGggb3RoZXIgdHlwZW1hcHMgYXM6CgoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JvdXQpIFNXSUdUWVBFICogey4uLn0KCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yZnJlZSxtYXRjaD0iZGlyZWN0b3JvdXQiKSBTV0lHVFlQRSAqIHsuLi59CgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICduYXR1cmFsdmFyJyBvcHRpb24vbW9kZS9mZWF0dXJlIHRvIHRyZWF0IG1lbWJlcgoJICAgIHZhcmlhYmxlcyBpbiBhIG1vcmUgbmF0dXJhbCB3YXksIGllLCBzaW1pbGFyIHRvIHRoZSBnbG9iYWwKCSAgICB2YXJpYWJsZSBiZWhhdmlvci4KCgkgICAgWW91IGNhbiB1c2UgaXQgaW4gYSBnbG9iYWwgd2F5IHZpYSB0aGUgY29tbWFuZCBsaW5lCgoJICAgICAgc3dpZyAtbmF0dXJhbHZhciAuLi4KCgkgICAgb3IgdGhlIG1vZHVsZSBtb2RlIG9wdGlvbgogCgkgICAgICAlbW9kdWxlKG5hdHVyYWx2YXI9MSkKCgkgICAgYm90aCBmb3JtcyBtYWtlIHN3aWcgdHJlYXQgYWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzIGluIHRoZQoJICAgIHNhbWUgd2F5IGl0IHRyZWF0cyBnbG9iYWwgdmFyaWFibGVzLiAKCgkgICAgQWxzbywgeW91IGNhbiB1c2UgaXQgaW4gYSBjYXNlIGJ5IGNhc2UgYXBwcm9hY2ggZm9yCgkgICAgc3BlY2lmaWMgbWVtYmVyIHZhcmlhYmxlcyB1c2luZyB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgJW5hdHVyYWx2YXIgQmFyOjpzOwoJICAgIAoJICAgIFRoZW4sIGluIHRoZSBmb2xsb3dpbmcgY2FzZSBmb3IgZXhhbXBsZToKCgkgICAgICAgc3RkOjpzdHJpbmcgczsKCSAgICAgICBzdHJ1Y3QgQmFyIHsKCQkgc3RkOjpzdHJpbmcgczsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHlvdSBjYW4gZG86ICAKCgkgICAgICAgYiA9IEJhcigpCgkgICAgICAgYi5zID0iaGVsbG8iCgkgICAgICAgY3Zhci5zID0gImhlbGxvIgoJICAgICAgIAoJICAgICAgIGlmIChiLnMgIT0gY3Zhci5zKToKCSAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKCgkJICAKICAgICAgICAgICAgVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCB0aGUKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gZm9yY2luZyB0aGUgdXNlIG9mIHRoZSAKICAgICAgICAgICAgY29uc3QgU1dJR1RZUEUmIChDKyspL1NXSUdUWVBFIChDKSB0eXBlbWFwcyBmb3IgdGhlCiAgICAgICAgICAgIGdldC9zZXQgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBTV0lHVFlQRSAqIHR5cGVtYXBzLgoJICAgIEhlbmNlLCBmb3IgJ25hdHVyYWx2YXInIHRvIHdvcmssIGVhY2ggdGFyZ2V0IGxhbmd1YWdlCgkgICAgbXVzdCBpbXBsZW1lbnQgJ3R5cGVtYXAoaW4vb3V0KSBjb25zdCBUeXBlJicgcHJvcGVybHkuCgoJICAgIFRoZSAnbmF0dXJhbHZhcicgb3B0aW9uIHJlcGxhY2VzIG9yIG1ha2VzIHdvcmthcm91bmRzIHN1Y2ggIGFzOgoJICAgIAoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgIHVubmVjZXNzYXJ5LgoKCSAgICBOb3RlMTogSWYgeW91ciBpbnRlcmZhY2UgaGFzIG90aGVyIGtpbmRzIG9mIHdvcmthcm91bmRzIHRvCgkgICAgZGVhbCB3aXRoIHRoZSBvbGQgJ3VubmF0dXJhbCcgd2F5IHRvIGRlYWwgd2l0aCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgKHJldHVybmluZy9leHBlY3RpbmcgcG9pbnRlcnMpLCB0aGUKCSAgICAnbmF0dXJhbHZhcicgb3B0aW9uIGNvdWxkIGJyZWFrIHRoZW0uCgkgICAgCgkgICAgTm90ZTI6IHRoZSBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB1bm5hbWVkIHR5cGVzLCBzdWNoCgkgICAgYXMgdW5uYW1lZCBuZXN0ZWQgdW5pb25zLgoJICAgIAoJICAKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIG1vcmUgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMgZm9yIHRoZSB0eXBlbWFwCiAgICAgICAgICAgIGxpYnJhcmllcy4KCgkgICAgSW4gdGhlIHBhc3QsIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB5b3Ugd291bGQgZG8gY2hlY2tpbmcgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgaWYgKENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKSAhPSAtMSkgewoJICAgICAgICAvLyBzdWNjZXNzCiAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gZXJyb3IKCSAgICAgIH0KCgkgICAgTm93IHRoZSByZXN1bHQgc3RhdGUgY2FuIGNhcnJ5IG1vcmUgaW5mb3JtYXRpb24sCgkgICAgaW5jbHVkaW5nOgoKCSAgICAgIC0gRXJyb3Igc3RhdGU6IGxpa2UgdGhlIG9sZCAtMS8wLCBidXQgd2l0aCBlcnJvciBjb2RlcyBmcm9tIHN3aWdlcnJvcnMuc3dnLgoKCSAgICAgICAgIGludCByZXMgPSBDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncyk7CgkJIGlmIChTV0lHX0lzT0socmVzKSkgewoJCSAgIC8vIHN1Y2Nlc3MgY29kZQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJICAgU1dJR19FcnJvcihyZXMpOyAvLyByZXMgY2FycmllcyB0aGUgZXJyb3IgY29kZQogICAgICAgICAgICAgICAgIH0KCgkgICAgICAtIENhc3QgcmFuazogd2hlbiByZXR1cm5pbmcgYSBzaW1wbGUgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgY29udmVyc2lvbiwgeW91IGp1c3QgcmV0dXJuIFNXSUdfT0ssIGJ1dCBpZiB5b3UgbmVlZAogICAgICAgICAgICAgICAgdG8gZG8gYSAnY2FzdCcsIHlvdSBjYW4gYWRkIHRoZSBjYXN0aW5nIHJhbmssIGllOgoJCQoJCSAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfT0s7CgkJICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSAoZG91YmxlKSBQeUludF9Bc0xvbmcob2JqKTsKCQkgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX09LKTsJCSAgICAKICAgICAgICAgICAgICAgICAgfQoJCQoJCWxhdGVyLCB0aGUgY2FzdGluZyByYW5rIGlzIHVzZWQgdG8gcHJvcGVybHkgZGlzcGF0Y2gKCQl0aGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiwgZm9yIGV4YW1wbGUuIFRoaXMgb2YgY291cnNlCgkJcmVxdWlyZXMgeW91ciBsYW5ndWFnZSB0byBzdXBwb3J0IGFuZCB1c2UgdGhlIG5ldwoJCWRpc3BhdGNoIGNhc3QvcmFuayBtZWNoYW5pc20gKE5vdyBtYWlubHkgc3VwcG9ydGVkIGluCgkJcGVybCBhbmQgcHl0aG9uLCBhbmQgZWFzaWx5IGV4cGFuZGFibGUgdG8gcnVieSBhbmQgdGNsKS4KCSAgICAgIAoJICAtIFtVVExdIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3ICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzLgoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSBDKysgaW1wbGljaXQgY29udmVyc2lvbiBtZWNoYW5pc20sIHdoaWNoCiAgICAgICAgICAgIHJlcXVpcmVkIHNvbWUgbW9kaWZpY2F0aW9ucyBpbiBwYXJzZXIueSAodG8gcmVjb2duaXplCiAgICAgICAgICAgICdleHBsaWNpdCcpIGFuZCBvdmVybG9hZC5jeHggKHRvIHJlcGxhY2UgJGltcGxpY2l0Y29udiBhcwogICAgICAgICAgICBuZWVkZWQpLgoJICAgIAoJICAgIFN0aWxsLCByZWFsIHN1cHBvcnQgaW4gZWFjaCB0YXJnZXQgbGFuZ3VhZ2UgcmVxdWlyZXMgZWFjaAoJICAgIHRhcmdldCBsYW5ndWFnZSB0byBiZSBtb2RpZmllZC4gUHl0aG9uIHByb3ZpZGVzIGFuIGV4YW1wbGUsCiAgICAgICAgICAgIHNlZSBiZWxvdy4KCgoJICAtIEFkZCBzdXBwb3J0IGZvciBuYXRpdmUgQysrIGltcGxpY2l0IGNvbnZlcnNpb25zLCBpZSwgaWYgeW91CiAgICAgICAgICAgIGhhdmUKCgkgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKCgkgICAgICAgIHN0cnVjdCBBIHsKCQkgICBpbnQgaWk7CgkJICAgQSgpIHtpaSA9IDE7fQoJCSAgIEEoaW50KSB7aWkgPSAyO30KCQkgICBBKGRvdWJsZSkge2lpID0gMzt9CgkJICAgZXhwbGljaXQgQShjaGFyICpzKSB7aWkgPSA0O30KCQl9OwoJCQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCiAgICAgICAgICAgIHlvdSBjYW4gY2FsbDoKCgkgICAgICAgIGEgPSBBKCkKCSAgICAgICAgYWkgPSBBKDEpCgkgICAgICAgIGFkID0gQSgxLjApCgkgICAgICAgIGFzID0gQSgiaGVsbG8iKQoJCQoJCSMgb2xkIGZvcm1zCgkgICAgICAgIGdldChhKSAgLT4gMQoJICAgICAgICBnZXQoYWkpIC0+IDIKCSAgICAgICAgZ2V0KGFkKSAtPiAzCgkgICAgICAgIGdldChhcykgLT4gNAoJCQoJCSNpbXBsaWNpdCBjb252ZXJzaW9ucwoJICAgICAgICBnZXQoMSkgICAgICAgLT4gMgoJICAgICAgICBnZXQoMS4wKSAgICAgLT4gMwoJICAgICAgICBnZXQoImhlbGxvIikgLT4gRXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgogICAgICAgICAgICBBbHNvLCBhcyBpbiBDKyssIG5vdyBpbXBsaWNpdCBjb252ZXJzaW9ucyBhcmUgc3VwcG9ydGVkIGluCiAgICAgICAgICAgIHZhcmlhYmxlIGFzc2lnbWVudHMsIGFuZCBpZiB5b3UgaGF2ZToKCgkgICAgICBBIGdhOwoJICAgICAgc3RydWN0IEJhciB7CgkgICAgICAgIEEgYTsKICAgICAgICAgICAgICB9OwoKCSAgICB5b3UgY2FuIGRvOgoKCSAgICAgIGN2YXIuZ2EgPSBBKDEpCgkgICAgICBjdmFyLmdhID0gMQoJICAgICAgY3Zhci5nYSA9IDEuMAoJICAgICAgY3Zhci5nYSA9IEEoImhlbGxvIikgCgkgICAgICBjdmFyLmdhID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgICBiID0gQmFyKCkKCSAgICAgIGIuYSA9IEEoImhlbGxvIikKCSAgICAgIGIuYSA9IDEKCSAgICAgIGIuYSA9IDEuMAoJICAgICAgYi5hID0gImhlbGxvIiAtPiBlcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCgkgICAgTm90ZSB0aGF0IHRoZSBsYXN0IGNhc2UsIGFzc2lnbmluZyBhIG1lbWJlciB2YXIgZGlyZWN0bHksIAoJICAgIGFsc28gcmVxdWlyZXMgdGhlICduYXR1cmFsdmFyJyBvcHRpb24uCgoJICAgIFRoaXMgc3VwcG9ydCBub3cgbWFrZXMgdGhlIG9sZCAnJWltcGxpY2l0JyBtYWNybywgd2hpY2gKCSAgICB3YXMgZm91bmQgaW4gJ2ltcGxpY2l0LmknIGFuZCBpdCB3YXMgZnJhZ2lsZSBpbiBtYW55IHdheXMsCgkgICAgb2Jzb2xldGUsIGFuZCB5b3Ugc2hvdWxkIHVzZSB0aGUgbmV3ICclaW1wbGljaXRjb252JwoJICAgIGRpcmVjdGl2ZSBpbnN0ZWFkLgoKCSAgICBOb3RlIHRoYXQgd2UgZm9sbG93IHRoZSBDKysgY29udmVudGlvbnMsIGllLCBpbiB0aGUKCSAgICBmb2xsb3dpbmcgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgYWxsb3dlZDoKCgkJaW50IGdldChBIGEpIHtyZXR1cm4gYS5paTt9CgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoJICAgIAoJICAgIGJ1dCBub3QgaW4gdGhlc2UgY2FzZXM6CgoJCWludCBnZXQoQSAqYSkge3JldHVybiBhLT5paTt9CgkJaW50IGdldChBJiBhKSB7cmV0dXJuIGEuaWk7fQoJCQoJICAgIEFsc28sIGl0IHdvcmtzIGZvciBkaXJlY3RvciBtZXRob2RzIHRoYXQgcmV0dXJuIGEgYnkgdmFsdWUKCSAgICByZXN1bHQsIGllLCB0aGUgZm9sbG93aW5nIHdpbGwgd29yazoKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEgZ2V0X2EoKSA9IDA7CgoJCWRlZiBnZXRfYShzZWxmKToKCQkgICByZXR1cm4gMQoKICAgICAgICAgICAgYnV0IG5vdCBpbiB0aGlzIGNhc2U6CgogICAgICAgICAgICAgICAgdmlydHVhbCBjb25zdCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEqIGdldF9hKCkgPSAwOwoJICAgIAoJICBOb3RlczoKCgkgIC0gdGhlIGltcGxpY2l0Y29udiBtZWNoYW5pc20gaXMgaW1wbGVtZW50ZWQgYnkgZGlyZWN0bHkKCSAgICBjYWxsaW5nL2Rpc3BhdGNoaW5nIHRoZSBweXRob24gY29uc3RydWN0b3IsIHRyaWdnZXJpbmcgYQoJICAgIGNhbGwgdG8gdGhlIF9faW5pdF9fbWV0aG9kLiBIZW5jZSwgaWYgeW91IGV4cGFuZGVkIHRoZQoJICAgIF9faW5pdF9fIG1ldGhvZCwgbGlrZSBpbjoKCgkgICAgICAgIGNsYXNzIEE6CgkJICAgZGVmIF9faW5pdF9fKHNlbGYsYXJncyk6CgkJICAgICAgPHN3aWcgY29kZT4KCQkgICAgICA8bXkgY29kZSBoZXJlPgoKICAgICAgICAgICAgdGhlbiAnbXkgY29kZScgd2lsbCBhbHNvIGJlIGV4ZWN1dGVkLgoJICAgIAoJICAtIFNpbmNlIHRoZSAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBpcyBhIFNXSUcgZmVhdHVyZSwgaWYgeW91IHR5cGU6CgkgICAgCiAgCSAgICAgICAlaW1wbGljaXRjb252OyAgCgoJICAgIHRoYXQgd2lsbCBlbmFibGUgaW1wbGljaXQgY29udmVyc2lvbiBmb3IgYWxsIHRoZSBjbGFzc2VzIGluCgkgICAgeW91ciBtb2R1bGUuCgoJICAgIEJ1dCBpZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgcGVyZm9ybWFuY2UsIG1heWJlIHRoYXQgd2lsbCBiZQoJICAgIHRvbyBtdWNoLCBlc3BlY2lhbGx5IGlmIHlvdSBoYXZlIG92ZXJsb2FkZWQgbWV0aG9kcywgc2luY2UKCSAgICB0byByZXNvbHZlIHRoZSBkaXNwYXRjaGluZyBwcm9ibGVtLCBweXRob24gd2lsbCBlZmVjdGl2ZWx5CgkgICAgdHJ5IHRvIGNhbGwgYWxsIHRoZSBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYXMgbmVlZGVkLgoKCSAgLSBGb3IgdGhlIHNhbWUgcmVhc29uLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlCiAgICAgICAgICAgIHRoZSBuZXcgJ2Nhc3Rtb2RlJyB3aGVuIG1peGluZyBpbXBsaWNpdCBjb252ZXJzaW9uIGFuZAogICAgICAgICAgICBvdmVybG9hZGluZy4KCgkgLSBbcHl0aG9uXSBUaGUgJWltcGxpY2l0IGRpcmVjdGl2ZSBpcyBkZWNsYXJlZCBvYnNvbGV0ZSwgYW5kCiAgICAgICAgICAgeW91IHNob3VsZCB1c2UgJWltcGxpY2l0Y29udiBpbnN0ZWFkLiBJZiB5b3UgaW5jbHVkZQoJICAgdGhlIGltcGxpY2l0LmkgZmlsZSwgYSB3YXJuaW5nIHdpbGwgcmVtaW5kIHlvdSBvZiB0aGlzLgoKCSAgIE5vdGU6IFNpbmNlICVpbXBsaWNpdCBpcyBmcmFnaWxlLCBqdXN0IHJlcGxhY2luZyBpdCBieQoJICAgJWltcGxpY2l0Y29udiBjb3VsZCBsZWFkIHRvIGRpZmZlcmVudCBiZWhhdmlvci4gSGVuY2UsIHdlCgkgICBkb24ndCBhdXRvbWF0aWNhbGx5IHN3aXRjaCBmcm9tIHRvIHRoZSBvdGhlciwgYW5kIHRoZSB1c2VyCgkgICBtdXN0IG1pZ3JhdGUgdG8gdGhlIG5ldyAlaW1wbGljaXRjb252IGRpcmVjdGl2ZSBtYW51YWxseS4KCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdCiAgICAgICAgICAgIE1vZGlmeSBzdGQ6OnZlY3RvciB3cmFwcGVycyB0byB1c2Ugc3RkOjp2ZWN0b3I6OnZhbHVlX3R5cGUgYXMgdGhpcyBpcwogICAgICAgICAgICBjbG9zZXIgdG8gdGhlIHJlYWwgU1RMIGRlY2xhcmF0aW9ucyBmb3Igc29tZSBtZXRob2RzLCBlZyBmb3IgcHVzaF9iYWNrKCkuCiAgICAgICAgICAgIEZpeGVzIHNvbWUgY29tcGlsYXRpb24gZXJyb3JzIGZvciBzb21lIGNvbXBpbGVycyBlZyB3aGVuIHRoZSB0ZW1wbGF0ZWQKICAgICAgICAgICAgdHlwZSBpcyBhIHBvaW50ZXIuCgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgc3RkOjp2ZWN0b3IgaW1wcm92ZW1lbnRzIC0gYSBmZXcgbW9yZSBtZXRob2RzIGFyZSB3cmFwcGVkIGFuZCBzcGVjaWFsaXphdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciByZXF1aXJlZC4gVGhlIHNwZWNpYWxpemVfc3RkX3ZlY3RvciBtYWNybyBpcyBubyBsb25nZXIgbmVlZGVkIChhCiAgICAgICAgICAgIHdhcm5pbmcgaXMgaXNzdWVkIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgaXQpLgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBBZGQgaW4gcG9pbnRlciByZWZlcmVuY2UgdHlwZW1hcHMuIFRoaXMgYWxzbyBlbmFibGVzIG9uZSB0byBlYXNpbHkgd3JhcAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB3aGVyZSBUIGlzIGEgcG9pbnRlci4KCjEyLzI0LzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gVGhlIGNmZmkgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gRnVsbHkgc3VwcG9ydHMgQywgYnV0IHByb3ZpZGVzIGxpbWl0ZWQgc3VwcG9ydHMgZm9yIEMrKywgaW4KICAgICAgICAgICAgICAgcGFydGljdWxhciBDKysgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIGFuZCBvdmVybG9hZGluZyBuZWVkcyB0bwogICAgICAgICAgICAgICBiZSB3b3JrZWQgdXBvbi4gCgoxMi8yMy8yMDA1OiBtbWF0dXMKCSAgICBbcHl0aG9uXSBBZGQgdGhlIGNhc3Rtb2RlIHRoYXQgYWxsb3dzIHRoZSBweXRob24KCSAgICB0eXBlIGNhc3RpbmcgdG8gb2NjdXIuCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAnaW50IGZvbyhpbnQpJywgbm93CgkgICAgCgkgICAgICBjbGFzcyBBaSgpOgoJICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYseCk6IAoJCSAgICBzZWxmLnggPSB4CgkgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKTogCgkJICAgIHJldHVybiBzZWxmLngKCgkgICAgICBmb28oMSkgICAvLyBPawoJICAgICAgZm9vKDEuMCkgLy8gT2sKCSAgICAgIGZvbygxLjMpIC8vIEVycm9yCgkgICAgICBhID0gQWkoNCkKICAgICAgICAgICAgICBmb28oYWkpICAvLyBPawoKICAgICAgICAgICAgVGhlIGNhc3Rtb2RlLCB3aGljaCBjYW4gYmUgZW5hYmxlZCBlaXRoZXIgd2l0aCB0aGUKICAgICAgICAgICAgJy1jYXN0bW9kZScgb3B0aW9uIG9yIHRoZSAlbW9kdWxlKCJjYXN0bW9kZSIpIG9wdGlvbiwgdXNlcwogICAgICAgICAgICB0aGUgbmV3IGNhc3QvcmFuayBkaXNwYXRjaCBtZWNoYW5pc20uIEhlbmNlLCBub3cgaWYgeW91CiAgICAgICAgICAgIGhhdmUgJ2ludCBmb28oaW50KTsgaW50IGZvbyhkb3VibGUpOycsIHRoZSBmb2xsb3dpbmcgd29ya3MKICAgICAgICAgICAgYXMgZXhwZWN0ZWQ6CgoJICAgICAgZm9vKDEpICAgLT4gZm9vKGludCkKCSAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCgkgICAgICBhaSA9IEFpKDQpCgkgICAgICBmb28oYWkpICAtPiBmb28oaW50KQoKCSAgICBOb3RlMTogdGhlICdjYXN0bW9kZScgY291bGQgZGlzcnVwdCBzb21lIHNwZWNpYWxpemVkCgkgICAgdHlwZW1hcHMuIEluIHBhcnRpY3VsYXIsIHRoZSAiaW1wbGljaXQuaSIgbGlicmFyeSBzZWVtcyB0bwoJICAgIGhhdmUgcHJvYmxlbSB3aXRoIHRoZSBjYXN0bW9kZS4gQnV0IGJlc2lkZXMgdGhhdCBvbmUsIHRoZQoJICAgIGVudGlyZSB0ZXN0LXN1aXRlIGNvbXBpbGVzIGZpbmUgd2l0aCBhbmQgd2l0aG91dCB0aGUKCSAgICBjYXN0bW9kZS4KCiAJICAgIE5vdGUyOiB0aGUgY2FzdCBtb2RlIGNhbid0IGJlIGNvbWJpbmVkIHdpdGggdGhlIGZhc3QKCSAgICBkaXNwYXRjaCBtb2RlLCBpZSwgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uIGhhcyBubyBlZmZlY3QKCSAgICB3aGVuIHRoZSBjYXN0IG1vZGUgaXMgc2VsZWN0ZWQuIFRoZSBwZW5hbHRpZXMsIGhvd2V2ZXIsCgkgICAgYXJlIG1pbmltdW0gc2luY2UgdGhlIGNhc3QgZGlzcGF0Y2ggY29kZSBpcyBhbHJlYWR5IGJhc2VkCgkgICAgb24gdGhlIHNhbWUgZmFzdCBkaXNwYXRjaCBtZWNoYW5pc20uCgoJICAgIFNlZSB0aGUgZmlsZSBvdmVybG9hZF9kaXNwYXRjaF9jYXN0X3J1bm1lLnB5IGZpbGUgZm9yCgkgICAgbmV3IGNhc2VzIGFuZCBleGFtcGxlcy4KCjEyLzIyLzIwMDU6IG1tYXR1cwoJICAgIEFkZCB0aGUgY2FzdCBhbmQgcmFuayBtZWNoYW5pc20gdG8gZGlzcGF0Y2ggb3ZlcmxvYWRpbmcKCSAgICBmdW5jdGlvbnMuIFRoZSBVVEYgc3VwcG9ydHMgaXQgbm93LCBidXQgZm9yIGVhY2ggbGFuZ3VhZ2UKCSAgICBpdCBtdXN0IGJlIGRlY2lkZWQgaG93IHRvIGltcGxlbWVudCBhbmQvb3Igd2hlbiB0byB1c2UgaXQuCgoJICAgIFtwZXJsXSBOb3cgcGVybCB1c2VzIHRoZSBuZXcgY2FzdCBhbmQgcmFuayBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgd2hpY2ggc29sdmVzIGFsbCB0aGUgcGFzdCBwcm9ibGVtcyBrbm93biAKCSAgICBpbiBwZXJsLCBzdWNoIGFzIHRoZSBvbGQgJysgMScgcHJvYmxlbToKCgkgICAgICAgIGludCBmb28oaW50KTsKCSAgICAKCQkkbiA9IDEKICAgICAgICAgICAgICAgICRuID0gJG4gKyAxCiAgICAgICAgICAgICAgICAkciA9IGZvbyhuKQoKICAgICAgICAgICAgYWxzbyB3b3JrczoKCiAgICAgICAgICAgICAgICAgZm9vKDEpOwogICAgICAgICAgICAgICAgIGZvbygiMSIpOwogICAgICAgICAgICAgICAgIGZvbygxLjApOwogICAgICAgICAgICAgICAgIGZvbygiMS4wIik7CgogICAgICAgICAgICAgYnV0IGZhaWxzCgogICAgICAgICAgICAgICAgIGZvbygibCIpOwoKICAgICAgICAgICAgIGFuZCB3aGVuIG92ZXJsb2FkaW5nICBmb28oaW50KSBhbmQgZm9vKGRvdWJsZSk7CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCJsIikgLT4gZXJyb3IKCQkgZm9vKCRuKSAtPiBmb28oaW50KSAgZm9yIGdvb2QgcGVybCB2ZXJzaW9ucwoJCSBmb28oJG4pIC0+IGZvbyhkb3VibGUpICBmb3Igb2xkIGJhZCBwZXJsIHZlcnNpb25zCgoJICAgICB3aGVuIG92ZXJsb2FkaW5nIGZvbyhpbnQpLCBmb28oY2hhciopIGFuZCBmb28oZG91YmxlKToKCiAgICAgICAgICAgICAgICAgZm9vKDEpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oIjEiKSAtPiBmb28oY2hhciopCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oY2hhciopCiAgICAgICAgICAgICAgICAgZm9vKCJsIikgLT4gZm9vKGNoYXIqKQoKICAgICAgICAgICAgIE5vdGU6IEluIHBlcmwgdGhlIG9sZCBkaXNwYXRjaCBtZWNoYW5pc20gd2FzIGJyb2tlbiwKICAgICAgICAgICAgIHNvLCB3ZSBkb24ndCBwcm92aWRlIGFuIG9wdGlvbiB0byBlbmFibGUgdGhlIG9sZCBvbmUKCSAgICAgc2luY2UsIGFnYWluLCBpdCB3YXMgcmVhbGx5IHJlYWxseSBicm9rZW4uCgoJICAgICBTZWUgJ292ZXJsb2FkX3NpbXBsZV9ydW5tZS5wbCcgZm9yIG1vcmUgY2FzZXMgYW5kIHRlc3RzLgoKCSAgICAgUFM6IGFsbCB0aGUgb2xkIGtub3duIGlzc3VlcyBhcmUgZGVjbGFyZWQgcmVzb2x2ZWQsIGFueQoJICAgICBuZXcgInByb2JsZW0iIHRoYXQgY291bGQgYmUgZGlzY292ZXJlZCBpcyBkZWNsYXJlZCwgCgkgICAgIGEgcHJpb3JpLCBhcyAiZmVhdHVyZXMiIG9mIHRoZSBuZXcgZGlzcGF0Y2ggbWVjaGFuaXNtCgkgICAgICh1bnRpbCB3ZSBmaW5kIGFub3RoZXIgc29sdXRpb24gYXQgbGVhc3QpLgoJICAgICAKCSAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCgkgICAgQXMgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBVVEYsIHNvbWUgdGhpbmdzIGNvdWxkCgkgICAgbm93IHN0YXJ0IHRvIHdvcmsgYXMgZXhwZWN0ZWQsIGFuZCBwZW9wbGUgdXNlZCB0byBkZWFsIG9yCgkgICAgd29ya2Fyb3VuZCBwcmV2aW91cyBidWdzIHJlbGF0ZWQgdG8gdGhlIGRpc3BhdGNoCgkgICAgbWVjaGFuaXNtLCBjb3VsZCBzZWUgbm93IGEgZGlmZmVyZW5jZSBpbiBwZXJsIGJlaGF2aW9yLgoKMTIvMjEvMjAwNTogbW1hdHVzCgkgIC0gVGhlICctbm9kZWZhdWx0JyBmbGFnIChwcmFnbWEgYW5kIGZlYXR1cmUpIG5vdyBnZW5lcmF0ZXMKCSAgICBhIHdhcm5pbmcsIGFuZCByZWNvbW1lbmRzIHRvIHVzZSB0aGUgZXhwbGljaXQKCSAgICAtbm9kZWZhdWx0Y3RvciBhbmQgIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCgkgICAgVGhlIHJlYXNvbiB0byBzcGxpdCB0aGUgJ25vZGVmYXVsdCcgYmVoYXZpb3IgaXMgdGhhdCwgaW4KCSAgICBnZW5lcmFsLCBpZ25vcmluZyB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yIGdlbmVyYXRlcyBtZW1vcnkKCSAgICBsZWFrcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBIZW5jZSwgaXMgdG9vIHJpc2t5IGp1c3QgdG8KCSAgICBkaXNhYmxlIGJvdGggdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKCSAgICBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICBJZiB5b3UgbmVlZCB0byBkaXNhYmxlIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IsIGl0IGlzCgkgICAgYWxzbyByZWNvbW1lbmRlZCB5b3UgdXNlIHRoZSBkaXJlY3RpdmUgZm9ybToKCgkgICAgICAgJW5vZGVmYXVsdGR0b3IgIE15VmVyeVNwZWNpYWxDbGFzczsKCiAgICAgICAgICAgIGZvciBzcGVjaWZpYyBjbGFzc2VzLCBhbmQgYWx3YXlzIGF2b2lkIHVzaW5nIHRoZSBnbG9iYWwKICAgICAgICAgICAgLW5vZGVmYXVsdCBhbmQgLW5vZGVmYXVsdGR0b3Igb3B0aW9ucy4KCSAgICAKMTIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBGaXggaW5jb3JyZWN0IGNvZGUgZ2VuZXJhdGlvbiB3aGVuIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3NuYW1lIGlzIGNoYW5nZWQKICAgICAgICAgICAgaW4gdGhlIG1vZHVsZSBkaXJlY3RpdmUgZnJvbSBpdHMgZGVmYXVsdC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVtb2R1bGUoam5pY2xhc3NuYW1lPSJteWltY2xhc3NuZXduYW1lIikgIm15bW9kdWxlIiAvLyBKYXZhCiAgICAgICAgICAgICAgJW1vZHVsZShpbWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gQyMKCiAgICAgICAgICAgIEFkZCBpbiBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUuIFNlZSBkb2NzLgoKMTIvMTcvMjAwNTogbW1hdHVzCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtYWxpYXNvYmowLy1ub2FsaWFzb2JqMCBvcHRpb25zIHRvIHVzZSB3aXRoCgkgICAgLWZhc3R1bnBhY2sgYW5kL29yIC1PIGFuZCBvbGQgdHlwZW1hcHMgdGhhdCB1c2UgJ29iajAnCgkgICAgZGlyZWN0bHkuCgoJICAgIFNvLCBpZiB5b3UgY29tcGlsZSB5b3VyIGNvZGUgdXNpbmcgLU8gYW5kIGdldCBlcnJvcnMgYWJvdXQKCSAgICB0aGUgdW5kZWNsYXJlZCAnb2JqMCcgdmFyaWFibGUsIHJ1biBhZ2FpbiB1c2luZyAKCgkJc3dpZyAtTyAtYWxpYXNvYmowIC1weXRob24gLi4uLgoJICAgIAoJICAgIEZvciBuZXcgdHlwZW1hcHMsIG5ldmVyIHVzZSAnb2JqMCcgZGlyZWN0bHksIGlmIG5lZWRlZCwKCSAgICB1c2UgdGhlICckc2VsZicgbmFtZSB0aGF0IHdpbGwgYmUgcHJvcGVybHkgIGV4cGFuZGVkIHRvCgkgICAgJ29iajAnIChub2Zhc3R1bnBhY2spIG9yICdzd2lnX29ialswXScgKGZhc3R1bnBhY2spLiAKICAKCSAgICBJZiB5b3UgaGF2ZSBubyBpZGVhIHdoYXQgSSBhbSB0YWxraW5nIGFib3V0LCBiZXR0ZXIsIHRoYXQKCSAgICBtZWFucyB5b3UgaGF2ZSBubyB0eXBlbWFwIHdpdGggdGhpcyBwcm9ibGVtLgoKCjEyLzE0LzIwMDU6IG1tYXR1cyAJIAoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWZhc3R1bnBhY2svLW5vZmFzdHVucGFjayBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIHVzZSBvZiB0aGUgaW50ZXJuYWwgVW5wYWNrVHVwbGUgbWV0aG9kLCBpbnN0ZWFkIG9mCgkgICAgY2FsbGluZyB0aGUgb25lIGZyb20gdGhlIHB5dGhvbiBDIEFQSS4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1mYXN0dW5wYWNrLgoJICAgIAoKMTIvMTEvMjAwNTogbW1hdHVzIAoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLXByb3h5ZGVsLy1ub3Byb3h5ZGVsIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICB0aGUgZ2VuZXJhdGlvbiBvZiBwcm94eS9zaGFkb3cgX19kZWxfXyBtZXRob2RzLCBldmVuCgkgICAgd2hlbiBub3cgdGhleSBhcmUgcmVkdW5kYW50LCBzaW5jZSB0aGV5IGFyZSBlbXB0eS4KCSAgICBIb3dldmVyLCBvbGQgaW50ZXJmYWNlcyBjb3VsZCByZWx5IG9uIGNhbGxpbmcgdGhlbS4KCgkgICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZ2VuZXJhdGUgdGhlIF9fZGVsX18gbWV0aG9kcwoJICAgIGFzIGluIDEuMy4yNyBvciBvbGRlciBzd2lnIHZlcnNpb25zLgoKCSAgICBUaGUgb3B0aW9uIC1PIG5vdyBhbHNvIGltcGxpZXMgLW5vcHJveHlkZWwuCgoxMi8xMC8yMDA1OiBtbWF0dXMgCgkgIFtVVEZdCiAgICAgICAgICAtIEZpeCB1bm5lY2Nlc3NhcnkgY2FsbHMgdG8gU1dJR19UeXBlUXVlcnkgZm9yICdjaGFyIConCgkgICAgYW5kICd3Y2hhcl90IConLCBwcm9ibGVtIGZvdW5kIGJ5IENsYXkgQ3VsdmVyIHdoaWxlCgkgICAgcHJvZmlsaW5nIHRoZSBQeU9ncmUgcHJvamVjdC4KCgkgIAoJICBbUHl0aG9uXSAKCSAgLSBBZGQgdGhlIC1kaXJ2dGFibGUvLW5vZGlydnRhYmxlIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgYSBwc2V1ZG8gdmlydHVhbCB0YWJsZSB1c2VkIGZvciBkaXJlY3RvcnMsIGF2b2lkaW5nCgkgICAgdGhlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgcHl0aG9uIG1ldGhvZCBhdCBlYWNoIGNhbGwuCgkgICAgCgkgIC0gQWRkIHRoZSAtc2FmZWNzdHJpbmdzLy1ub3NhZmVjc3RyaW5ncyBvcHRpb25zIHRvCgkgICAgZW5hYmxlL2Rpc2FibGUgdGhlIHVzZSBvZiBzYWZlIGNvbnZlcnNpb25zIGZyb20gUHlTdHJpbmcKCSAgICB0byBjaGFyICouIFB5dGhvbiByZXF1aXJlcyB5b3UgdG8gbmV2ZXIgY2hhbmdlIHRoZSBpbnRlcm5hbAoJICAgIGJ1ZmZlciBkaXJlY3RseSwgYW5kIGhlbmNlICdzYWZlY3RyaW5ncycgd2FycmFudGllcyB0aGF0CgkgICAgYnV0IHJldHVybmluZyBhIGNvcHkgb2YgdGhlIGludGVybmFsIHB5dGhvbiBzdHJpbmcgYnVmZmVyLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcHJldmlvdXMgcmVsZWFzZXMsIGlzIHRvIHJldHVybiBhCgkgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIChub3NhZmVjc3RyaW5ncyksIHNvLCBpdCBpcyB0aGUgdXNlcidzCgkgICAgcmVzcG9uc2liaWxpdHkgdG8gYXZvaWQgaXRzIG1vZGlmaWNhdGlvbi4KCSAgICAKCSAgLSBBZGQgdGhlIC1PIG9wdGlvbiB0byBlbmFibGUgYWxsIHRoZSBvcHRpbWl6YXRpb24gb3B0aW9ucwoJICAgIGF0IG9uY2UsIGluaXRpYWxseSBlcXVpdmFsZW50IHRvCgoJICAgIC1tb2Rlcm4gLWZhc3RkaXNwYXRjaCAtZGlydnRhYmxlIC1ub3NhZmVjc3RyaW5ncyAtZnZpcnR1YWwKCjEyLzA4LzIwMDU6IG1tYXR1cyAKCgkgIC0gQWRkIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiAoZmFzdGRpc3BhdGNoIGZlYXR1cmUpLiBUaGlzCgkgICAgZW5hYmxlcyB0aGUgImZhc3QgZGlzcGF0Y2giIG1lY2hhbmlzbSBmb3Igb3ZlcmxvYWRlZAoJICAgIG1ldGhvZHMgcHJvdmlkZWQgYnkgU2FsdmFkb3IgRmFuZGl+bm8gR2FyYydpYSAoIzkzMDU4NikuCgoJICAgIFRoZSByZXN1bHRpbmcgY29kZSBpcyBzbWFsbGVyIGFuZCBmYXN0ZXIgc2luY2UgbGVzcyB0eXBlCgkgICAgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiBIb3dldmVyLCB0aGUgZXJyb3IgbWVzc2FnZXMgeW91CgkgICAgZ2V0IHdoZW4gdGhlIG92ZXJsb2FkaW5nIGlzIG5vdCByZXNvbHZlZCBjb3VsZCBiZQoJICAgIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCByZXR1cm5zLgoKCSAgICBXaXRoIHRoZSBvbGQgbWV0aG9kIHlvdSBhbHdheXMgZ2V0IGFuIGVycm9yIHN1Y2ggYXMgCgoJICAgICAgICJObyBtYXRjaGluZyBmdW5jdGlvbiBmb3Igb3ZlcmxvYWRlZCAuLi4iCgogICAgICAgICAgICB3aXRoIHRoZSBuZXcgbWV0aG9kIHlvdSBjYW4gYWxzbyBnZXQgZXJyb3JzIHN1Y2ggYXMKCgkgICAgICAgIlR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiB0eXBlIC4uLiIKCgkgICAgU2VlIGJ1ZyByZXBvcnQgIzkzMDU4NiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgICAKICAJICAgIFNvLCB0aGlzIG9wdGltaXphdGlvbiBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBieSB1c2Vycy4KCgkgICAgVGhlIG5ldyBtZWNoYW5pc20gY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgIHN3aWcgLWZhc3RkaXNwYXRjaAoKICAgICAgICAgICAgb3IgdXNpbmcgdGhlIGZlYXR1cmUgZm9ybQoKCSAgICAgICVmZWF0dXJlKCJmYXN0ZGlzcGF0Y2giKSBtZXRob2Q7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgJWZhc3RkaXNwYXRjaCBtZXRob2Q7CgkgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMgCgogICAgICAgICAgLSBTZXZlcmFsIG1lbW9yeSBhbmQgc3BlZWQgaW1wcm92ZW1lbnRzLCBzcGVjaWFsbHkgZm9yCgkgICAgdGVtcGxhdGVzLiBOb3cgc3dpZyBpcyB1cCB0byAyMCBmYXN0ZXIgdGhhbiBiZWZvcmUgZm9yCgkgICAgbGFyZ2UgdGVtcGxhdGUgaW50ZXJmYWNlcywgc3VjaCBhcyB0aGUgc3RkX2NvbnRhaW5lcnMuaQoJICAgIGFuZCB0ZW1wbGF0ZV9tYXRyaXguaSBmaWxlcyBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUuCgoJICAgIE1lbW9yeSBmb290cHJpbnQgaXMgYWxzbyByZWR1Y2VkIGluIGNvbnNpZGVyYXRpb24gb2Ygc21hbGwKCSAgICBwY3MvYXJjaGl0ZWN0dXJlcy4KCgkgIC0gYWRkIGNvbW1hbmRsaW5lIG9wdGlvbnMgLWNwcGVycmFzd2FybiBhbmQgLW5vY3BwZXJyYXN3YXJuIiB0byBmb3JjZQogICAgICAgICAgICB0aGUgc3dpZyBwcmVwcm9jZXNzb3IgdG8gdHJlYXQgdGhlICNlcnJvciBkaXJlY3RpdmUgYXMgYSAjd2FybmluZy4KCSAgICAKCSAgICB0aGUgcHJhZ21hcwoKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0xCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MAoJICAgICAgIAoJICAgIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgbm93IG1vcmUgcG9ydGFibGUsIGVzcGVjaWFsbHkKCSAgICBmb3IgV2luZG93cy4gRm9sbG93aW5nIAoKICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS93aW5kb3dzLmh0bWwKCiAgICAgICAgICAgIFB5X05vbmUgaXMgbmV2ZXIgYWNjZXNzZWQgYXMgYSBzdHJ1Y3R1cmUsIHBsdXMgb3RoZXIKICAgICAgICAgICAgdHJpY2tzIG1lbnRpb25lZCB0aGVyZS4KCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhyZWFkcyBiYXNlZCBpbiB0aGUKCSAgICBwcm9wb3NhbCBieSBKb3NlcGggV2luc3Rvbi4KCgkgICAgVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CgoJICAgIDEuLSB0aGUgbW9kdWxlIHRocmVhZCBzdXBwb3J0IGlzIGVuYWJsZSB2aWEgdGhlICJ0aHJlYWRzIiBtb2R1bGUKICAgICAgICAgICAgICAgIG9wdGlvbiwgaS5lLgoKICAgICAgICAgICAgICAgICAgJW1vZHVsZSgidGhyZWFkcyI9MSkKCiAgICAgICAgICAgIDIuLSBFcXVpdmFsZW50IHRvIHRoYXQsIGlzIHRoZSBuZXcgJy10aHJlYWRzJyBzd2lnIG9wdGlvbgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGhyZWFkcyAtcHl0aG9uIC4uLgoKICAgICAgICAgICAgMy4tIFlvdSBjYW4gcGFydGlhbGx5IGRpc2FibGUgdGhyZWFkIHN1cHBvcnQgZm9yIGEgZ2l2ZW4KICAgICAgICAgICAgICAgIG1ldGhvZCB1c2luZzoKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZCIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWQgbWV0aG9kOwoKICAgICAgICAgICAgICAgIGFsc28sIHlvdSBjYW4gZGlzYWJsZSBzZWN0aW9ucyBvZiB0aGUgdGhyZWFkIHN1cHBvcnQsIAogICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGJsb2NrIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGJsb2NrIG1ldGhvZDsKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGFsbG93IikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGFsbG93IG1ldGhvZDsKCiAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZGlzYWJsZXMgdGhlIEMrKy9weXRob24gdGhyZWFkIHByb3RlY3Rpb24sIGFuZCB0aGUKICAgICAgICAgICAgICAgIHNlY29uZCBkaXNhYmxlcyB0aGUgcHl0aG9uL0MrKyB0aHJlYWQgcHJvdGVjdGlvbi4gCgogICAgICAgICAgICA0Li0gVGhlIGN1cnJlbnQgdGhyZWFkIHN1cHBvcnQgaXMgYmFzZWQgaW4gdGhlIFB5R0lMCiAgICAgICAgICAgICAgICBleHRlbnNpb24gcHJlc2VudCBpbiBweXRob24gdmVyc2lvbiAyLjMgb3IgbGF0ZXIsIGJ1dAogICAgICAgICAgICAgICAgeW91IGNhbiBwcm92aWRlIHRoZSB0aHJlYWQgY29kZSBmb3Igb2xkZXIgdmVyc2lvbnMgYnkKICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBtYWNyb3MgaW4gcHl0aHJlYWRzLnN3Zy4KCgkJSWYgeW91IGdldCBhIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gZm9yIG9sZGVyIHZlcnNpb25zLAoJCXBsZWFzZSBzZW5kIHVzIGEgcGF0Y2guCgogICAgICAgICAgICBGb3IgdGhlIGN1cmlvdXMgYWJvdXQgcGVyZm9ybWFuY2UsIGhlcmUgYXJlIHNvbWUgbnVtYmVycwogICAgICAgICAgICBmb3IgdGhlIHByb2ZpbGV0ZXN0LmkgdGVzdCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB0aGUgc3BlZWQKCSAgICBvZiB0aGUgd3JhcHBlZCBjb2RlOgoKCSAgICAgICAgbm90aHJlYWQgICAgICAgICAgIDkuNnMgIChubyB0aHJlYWQgY29kZSkKCQlub3RocmVhZGJsb2NrICAgICAxMi4ycyAgKG9ubHkgJ2FsbG93JyBjb2RlKQoJCW5vdGhyZWFkYWxsb3cgICAgIDEzLjZzICAob25seSAnYmxvY2snIGNvZGUpCiAgICAgICAgICAgICAgICBmdWxsIHRocmVhZCAgICAgICAxNS41cyAgKCdhbGxvdycgKyAnYmxvY2snIGNvZGUpCgkgICAgCgkgICAgaS5lLiwgZnVsbCB0aHJlYWQgY29kZSBkZWNyZWFzZXMgdGhlIHdyYXBwaW5nIHBlcmZvcm1hbmNlIGJ5CgkgICAgYXJvdW5kIDYwJS4gSWYgdGhhdCBpcyBpbXBvcnRhbnQgdG8geW91ciBhcHBsaWNhdGlvbiwgeW91CgkgICAgY2FuIHR1bmUgZWFjaCBtZXRob2QgdXNpbmcgdGhlIGRpZmZlcmVudCAnbm90aHJlYWQnLAoJICAgICdub3RocmVhZGJsb2NrJyBvciAnbm90aHJlYWRhbGxvdycgZmVhdHVyZXMgYXMKCSAgICBuZWVkZWQuIE5vdGUgdGhhdCBmb3Igc29tZSBtZXRob2RzIGRlYWN0aXZhdGluZyB0aGUKCSAgICAndGhyZWFkIGJsb2NrJyBvciAndGhyZWFkIGFsbG93JyBjb2RlIGlzIG5vdCBhbiBvcHRpb24sCgkgICAgc28sIGJlIGNhcmVmdWwuCgkgICAgCgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgdXNlIHN5c3RlbSBhbmdsZSBicmFja2V0cyBldmVyeXdoZXJlIGZvciAlaW5jbHVkZSwgZWcKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX2NvbW1vbi5pIgogICAgICAgICAgICBiZWNvbWVzCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9jb21tb24uaT4KCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcyBoYXZlIGFuIGV4dHJhIGNvbnN0cnVjdG9yIHNvIHRoYXQgZW51bSBpdGVtIHZhbHVlcyB0aGF0CiAgICAgICAgICAgIGFyZSBpbml0aWFsaXNlZCBieSBhbm90aGVyIGVudW0gaXRlbSB2YWx1ZSBjYW4gYmUgd3JhcHBlZCB3aXRob3V0IGhhdmluZyB0byB1c2UgJWphdmFjb25zdHZhbHVlLwogICAgICAgICAgICAlY3Njb25zdHZhbHVlIGZvciB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkuIFN1Z2dlc3Rpb24gYnkKICAgICAgICAgICAgQm9iIE1hcmluaWVyL0RvdWdsYXMgUGVhcnNvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB4eXosCiAgICAgICAgICAgICAgICAgbGFzdCA9IHh5egogICAgICAgICAgICAgIH0gcmVwZWF0OwoKMTEvMjEvMjAwNTogbW1hdHVzCgkgICAgW3J1YnkgKyBweXRob25dCgoJICAgIEZpeGVzIGZvciBkaXJlY3RvcnMgKyBwb2ludGVycy4gVGhpcyBpcyBhbiB1Z2x5IHByb2JsZW0gd2l0aG91dCBhbiBlYXN5CgkgICAgc29sdXRpb24uIEJlZm9yZSB3ZSBpZGVudGlmaWVkIHRoaXMgY2FzZSBhcyBwcm9ibGVtYXRpYzoKCgkgICAgICAgICAgdmlydHVhbCBjb25zdCBNeUNsYXNzJiBteV9tZXRob2QoKTsKCiAgICAgICAgICAgIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCBhbGwgdGhlIGNhc2VzIHdoZXJlIGEgcG9pbnRlciwgYXJyYXkgb3IKICAgICAgICAgICAgcmVmZXJlbmNlIGlzIHJldHVybmVkLCBhcmUgcHJvYmxlbWF0aWMsIGV2ZW4gZm9yIAoJICAgIHByaW1pdGl2ZSB0eXBlcyAoYXMgaW50LCBkb3VibGUsIGNoYXIqLCBldGMpLgoKCSAgICBUbyB0cnkgdG8gZml4IHRoZSBpc3N1ZSwgYSBuZXcgdHlwZW1hcCB3YXMgYWRkZWQsCgkgICAgJ2RpcmVjdG9yZnJlZScsIHdoaWNoIGlzIHVzZWQgdG8gJ2ZyZWUnIHRoZSByZXNvdXJjZXMKCSAgICBhbGxvY2F0ZWQgZHVyaW5nIHRoZSAnZGlyZWN0b3JvdXQnIHBoYXNlLiBBdCB0aGUgc2FtZQoJICAgIHRpbWUsIGEgcHJpbWl0aXZlIGdhcmJhZ2UgY29sbGVjdG9yIGVuZ2luZSB3YXMgYWRkZWQgdG8KCSAgICBkZWFsIHdpdGggb3JwaGFuZWQgYWRkcmVzc2VzLCB3aGVuIG5lZWRlZC4KCSAgICAKCSAgICBUaGUgc2l0dWF0aW9uIGlzIG11Y2ggYmV0dGVyIG5vdywgYnV0IHN0aWxsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKCSAgICBtZW1vcnkgZXhoYXVzdGF0aW9uIGlmIHJlY3Vyc2lvbiBpcyB1c2VkLgoKCSAgICBTbywgc3RpbGwgeW91IG5lZWQgdG8gYXZvaWQgcmV0dXJuaW5nIHBvaW50ZXJzLCBhcnJheXMgb3IKCSAgICByZWZlcmVuY2VzIHdoZW4gdXNpbmcgZGlyZWN0b3IgbWV0aG9kcy4KCgkgICAgLSBBZGRlZCBzdGRpbnQuaSAtIHR5cGVtYXBzIGZvciBsYXRlc3QgQzk5IGludGVncmFsIHR5cGVzIGZvdW5kIGluIHN0ZGludC5oLgoJICAgIAoxMS8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIHR5cGVzIGFkZGVkIHRvIHdpbmRvd3MuaSwgZWcgVUlOVDgsIFdPUkQsIEJZVEUgZXRjLiAKICAgICAgICAgICAgSW5jbHVkaW5nIHdpbmRvd3MuaSB3aWxsIGFsc28gZW5hYmxlIFNXSUcgdG8gcGFyc2UgdGhlIF9fZGVjbHNwZWMgTWljcm9zb2Z0CiAgICAgICAgICAgIGV4dGVuc2lvbiwgZWcgX19kZWNsc3BlYyhkbGxpbXBvcnQpLiBBbHNvIG90aGVyIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucwogICAgICAgICAgICBzdWNoIGFzIF9fc3RkY2FsbC4KCjExLzEwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgZm9yIFdpbmRvd3MgLSB3aW5kb3dzLmkuIFRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gdXNlZnVsIHR5cGUKICAgICAgICAgICAgaW5mb3JtYXRpb24gZm9yIHVzZXJzIHdobyBpbmNsdWRlIHdpbmRvd3MuaC4gSW5pdGlhbCBzdXBwb3J0IGlzIGZvciB0aGUKICAgICAgICAgICAgbm9uIElTTyBpbnRlZ3JhbCB0eXBlczogX19pbnQ4LCBfX2ludDE2LCBfX2ludDMyLCBfX2ludDY0IGFuZCB1bnNpZ25lZCB2ZXJzaW9ucy4KICAgICAgICAgICAgVGhlIHVuc2lnbmVkIHZlcnNpb25zIHByZXZpb3VzbHkgY291bGQgbm90IGJlIHBhcnNlZCBieSBTV0lHLiAgU0YgIzg3MjAxMy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gUG9ydGFiaWxpdHkgd2FybmluZyBmb3IgZmlsZXMgd2hpY2ggd2lsbCBvdmVyd3JpdGUgZWFjaCBvdGhlciBvbiBjYXNlCiAgICAgICAgICAgIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcyBzdWNoIGFzIEZBVDMyL05URlMuIFRoaXMgd2lsbCBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdHdvCiAgICAgICAgICAgIGNsYXNzIG5hbWVzIGFyZSB0aGUgc2FtZSBiYXJyaW5nIGNhc2UuIFRoZSB3YXJuaW5nIGlzIGlzc3VlZCBvbiBhbGwgcGxhdGZvcm1zIGFuZAogICAgICAgICAgICBjYW4gYmUgc3VwcHJlc3NlZCB3aXRoIHRoZSB1c3VhbCB3YXJuaW5nIHN1cHByZXNzaW9uIHRlY2huaXF1ZXMuIFNGIGJ1ZyAjMTA4NDUwNy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1weXRob24gLS13aXRoLXJ1YnkgLS13aXRoLXBlcmw1IGV0YyBlbmFibGUgdGhlc2UgbGFuZ3VhZ2VzLAogICAgICAgICAgICBpZSB0aGUgLS13aXRoLXh4eHggb3B0aW9ucywgd2hlcmUgbm8gcGF0aCBpcyBzcGVjaWZpZWQsIHdvcmsgdGhlIHNhbWUgYXMgaWYgCiAgICAgICAgICAgIHRoZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQgYXQgYWxsLiBCYXNlZCBvbiBwYXRjaGVzICMxMzM1MDQyICMxMzI5MDQ4ICMxMzI5MDQ3LgoKMTEvMDkvMjAwNTogZGFuY3kKCgkgICAgW0FsbGVncm9jbF0KCSAgICBBZGQgQysrIHN1cHBvcnQgdG8gdGhlIEFsbGVncm9jbCBtb2R1bGUuIEZ1cnRoZXIKCSAgICBlbmhhbmNlcyB0aGUgQyBzdXBwb3J0IGFzIHdlbGwuIFNvbWUgb2YgdGhlCgkgICAgZmVhdHVyZXM6CgoJICAgIC0gTVVDSCBiZXR0ZXIgZ2VuZXJhdGlvbiBvZiBmb3JlaWduIHR5cGVzIGJhc2VkIG9uCgkgICAgdGhlIEMvQysrIHR5cGVzIGZvciB1c2UgaW4gZGVmaW5pbmcgdGhlIEZGSSBvbgoJICAgIHRoZSBsaXNwIHNpZGUuIFdlIGRvbid0IHBhc3MgZXZlcnl0aGluZyBhcyBhICgqIDp2b2lkKQoJICAgIGFueSBsb25nZXIuCgoJICAgIC0gVXNlcyB0eXBlbWFwcyBmb3IgYmV0dGVyIGNvbnRyb2wgb2YgdHlwZSBjb252ZXJzaW9ucwoJICAgIGFuZCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBsaXNwIGFuZCBjKysgd3JhcHBlcgoJICAgIGNvZGUuCgoJICAgIC0gQ0xPUyB3cmFwcGluZyBvZiBwb2ludGVycyByZXR1cm5lZCBmcm9tIGZvcmVpZ24gc3BhY2UKCSAgICBtYWtlcyBpdCBlYXNpZXIgdG8gZGlmZmVyZW50aWF0ZSBwb2ludGVycyBpbiB1c2VyIGNvZGUuCgkgICAgVGhlIHdyYXBwaW5nIG9iamVjdHMgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSB0byBGRiBjYWxscy4KCgkgICAgLSBEZWZ1biB3cmFwcGluZyBvZiBGRiBjYWxscywgYWxsb3dpbmcgZm9yIG1vcmUgbGlzcHkKCSAgICBpbnRlcmZhY2UuIENvbnZlcnNpb24sIEdDaW5nLCBvZiBsaXNwIG9iamVjdHMgdG8gCgkgICAgZm9yZWlnbiBvYmplY3RzIGNhbiBiZSBkb25lIGluIHRoZSB3cmFwcGluZyBkZWZ1biB2aWEKCSAgICB0aGUgdXNlIG9mIHR5cGVtYXBzLgoJICAgIAoJICAgIC0gb3ZlcmxvYWQgZGlzcGF0Y2hpbmcgaW1wbGVtZW50ZWQgb24gdGhlIGxpc3Agc2lkZQoJICAgIHVzaW5nIGdlbmVyaWMgZnVuY3Rpb25zLgoKCSAgICAtIFRlbXBsYXRlcyBhbmQgc3lub255bW91cyB0eXBlcyBzdXBwb3J0ZWQuCgoxMS8wNy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIHByb3BlciBzdXBwb3J0IGZvciBtdWx0aS1pbmhlcml0YW5jZSBpbgoJICAgIHRoZSBweXRob24gc2lkZSwgaWUsIGlmIHlvdSBoYXZlIHR3byBDKysgd3JhcHBlZCBjbGFzcywgRm9vCgkgICAgYW5kIEJhciwgbm93OgoKCSAgICAgICBjbGFzcyBNeVB5dGhvbkNsYXNzKEZvbyxCYXIpOgoJICAgICAgICAgIC4uLi4KCiAgICAgICAgICAgIHdpbGwgcHJvcGVybHkgd29yaywgZXZlbiB3aXRoIGRpcmVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICBkZWFsbG9jYXRpb24gb2YgRm9vLnRoaXMgYW5kIEJhci50aGlzIHdpbGwgZm9sbG93CiAgICAgICAgICAgIGNvcnJlY3RseS4gQmVmb3JlLCBhIGNsYXNzIGNvdWxkIG9ubHkgaGF2ZSBvbmUgJ3RoaXMnCiAgICAgICAgICAgIGluc3RhbmNlICh1bmxpa2UgQysrKSwgb25seSB0aGUgbGFzdCBiYXNlIGNsYXNzIHdhcwogICAgICAgICAgICBwcm9wZXJseSBkZWxldGVkLCBvciBkZXRlY3RlZCB3aXRoIGRpcmVjdG9ycy4KCgkgICAgTm93ICdzZWxmLnRoaXMnIGNhbiBiZSBhIGxpc3QsIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgQysrCgkgICAgaW5zdGFuY2UgcG9pbnRlcnMgZm9yIGFsbCB0aGUgYmFzZSBjbGFzc2VzLgoJICAgIAoJICAgIEFsc28sIHN3aWcudGhpcyBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoZSBDKysKCSAgICBpbnN0YW5jZShzKSwgYW5kIHRoZSBfX2RlbF9fIG1ldGhvZCBpcyBub3QgZW1pdHRlZCB1bmxlc3MKCSAgICB0aGUgdXNlciBwcmVwcGVuZC9hcHBlbmQgc29tZSBjb2RlIHRvIGl0LgoKCSAgLSBTd2lnIGNhbiBub3cgZGV0ZWN0IG1lbW9yeSBsZWFrcywgaWUsIGlmIHlvdSBzdGlsbAoJICAgIGRvbid0IHVzZSBwcm94eS9zaGFkb3cgY2xhc3NlcywgYW5kIHR5cGUgc29tZXRoaW5nIGxpa2UKCSAgICAKCSAgICAgICAgIGltcG9ydCBfZXhhbXBsZQoJICAgICAgICAgZiA9IF9leGFtcGxlLm5ld19Gb28oKQoKCSAgICBhbmQgZm9yZ2V0IHRvIGNhbGwgX2V4YW1wbGUuZGVsZXRlX0ZvbyhmKSwgdGhlbiBzd2lnIHdpbGwKCSAgICB0ZWxsIHlvdSB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsuCgoJICAgIE90aGVyd2lzZSwgaWYgeW91IGFsd2F5cyB1c2UgdGhlIHByb3h5IGNsYXNzZXMsIHlvdSBwcm9iYWJseQoJICAgIHlvdSB3aWxsIG5ldmVyIGV2ZXIgc2VlIHRoaXMgd2FybmluZyB1bmxlc3MgdGhlcmUgaXMKCSAgICBzb21ldGhpbmcgd3JvbmcgaW5zaWRlIHRoZSBzd2lnIHdyYXBwaW5nIGNvZGUuCgkgICAgICAgCgkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgSWYgeW91IG92ZXJsb2FkZWQgdGhlIF9fZGVsX18gbWV0aG9kLCBhbmQgY2FsbCB0aGUgYmFzZQoJICAgIG9uZQkgd2l0aG91dCBhIHRyeSBibG9jaywgYXMgaW4KCgkgICAgICAgICAgIGNsYXNzIE15Q2xhc3MoU3dpZ0NsYXNzKToKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgCiAgICAgICAgICAgIHB5dGhvbiBjb3VsZCBjb21wbGFpbiB0aGF0IHRoZSBtZXRob2QgU3dpZ0NsYXNzLl9fZGVsX18gaXMKICAgICAgICAgICAgdW5kZWZpbmVkLiBUcnkgdG8gdXNlIGluc3RlYWQ6CgkgICAgCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIHRyeTogU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICBleGNlcHQ6IHBhc3MKCgkgICAgb3Igc2ltcGx5IAkJICAKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIG1vcmUgZnVuIHRvIFNUTC9TVEQgY29udGFpbmVycywgbm93IHlvdQoJICAgIGNhbiBkbwoKCSAgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PFB5T2JqZWN0ICo+OwkJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3RvcjxQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8UHlPYmplY3QgKixQeU9iamVjdCAqPjsKCSAgICAgICAuLi4uCgoJICAgIFRoZSBzYW1lICBhcHBsaWVzIHRvIHN0ZDo6bGlzdCwgc3RkOjpkZXF1ZSwgc3RkOjptdWx0aXNldCwgZXRjLgoKCSAgICBUaGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUgeW91IGNhbiBkbyBub3c6CgoJICAgICAgICMgQysrIHN0ZDo6dmVjdG9yIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICB2ID0gcHl2ZWN0b3IoWzEsImhlbGxvIiwoMSwyKV0pCgkgICAgICAgcHJpbnQgdlsxXQoJICAgICAgID4+ICdoZWxsbycKCSAgICAgICBwcmludCB2WzJdCgkgICAgICAgPj4gKDEsMikKCSAgICAgICAJCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6c2V0IGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBzID0gcHlzZXQoKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCgxLDIpKQkJICAgCgkgICAgICAgcy5pbnNlcnQoMSkJCQkgICAKCSAgICAgICBzLmluc2VydCgiaGVsbG8iKQoJICAgICAgIHN1bT0oKQoJICAgICAgIGZvciBpIGluIHM6CgkgICAgICAgICBzdW0gKz0oaSwpCgkgICAgICAgcHJpbnQgc3VtCgkgICAgICAgPj4+ICgxLCAnaGVsbG8nLCAoMSwgMikpCgkgICAgICAgCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6bWFwIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBtID0gcHltYXAoKQkJCSAgIAoJICAgICAgIG1bImZvbyJdID0gImhlbGxvIgkJICAgCgkgICAgICAgbVsxXSA9ICgxLDIpCgkgICAgICAgcG0gPSB7fQoJICAgICAgIGZvciBrIGluIG06CSAgICAJICAgCgkgICAgICAgICBwbVtrXSA9IG1ba10KCSAgICAgICBwcmludCBwbQoJICAgICAgID4+PiB7MTogKDEsIDIpLCAnZm9vJzogJ2hlbGxvJ30KCgkgICAgaWUsIHRoZSBTVEQvU1RMIGNvbnRhaW5lcnMgd29yayBhcyByZWFsIG5hdGl2ZSBweXRob24KCSAgICBjb250YWluZXIsIHdpdGggYXJiaXRyYXJ5IGl0ZW0gdHlwZXMgYW5kIHNvLgoKCSAgICBCdXQgc2luY2Ugbm9ybWFsIEMrKyBjb250YWluZXJzIGRvIG5vdCBwcm9wZXJseSByZWYvdW5yZWYKCSAgICB0aGVpciBpdGVtcywgeW91IHNob3VsZCB1c2UgdGhlIHNhZmVyIHZlcnNpb25zOgoJICAgIAoJICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3Rvcjxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPHN3aWc6OlB5T2JqZWN0X3B0ciwgc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8c3dpZzo6UHlPYmplY3RfcHRyLHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAuLi4uCgoJICAgIHdoZXJlIHN3aWc6OlB5T2JqZWN0X3B0ciBpcyBhIFB5T2JqZWN0ICogZW52ZWxvcGUgY2xhc3MgcHJvdmlkZWQKCSAgICB0byBzYWZlbHkgaW5jcmVmL2RlY3JlZiB0aGUgcHl0aG9uIG9iamVjdC4gCgkgICAgCgkgICAgU28sIG5vdyB5b3UgY2FuIHVzZSBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBhcyBuYXRpdmUKCSAgICBQeXRob24gY29udGFpbmVycy4gCgoJICAgIE5vdGUgMTogc3RkOjptYXAsIHN0ZDo6c2V0IGFuZCB0aGUgb3RoZXIgJ29yZGVyZWQnCgkgICAgY29udGFpbmVycyB3aWxsIHByb3Blcmx5IHVzZSBQeU9iamVjdF9Db21wYXJlIGZvciBzb3J0aW5nLAoJICAgIHdoZW4gbmVlZGVkLgoKCSAgICBOb3RlIDI6IGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGhhdmUgYSBsaW1pdCBzaXplIG9mCgkgICAgU0laRV9NQVgsIGllLCB5b3UgY2FuIGhhdmUgbWFuYWdlIGNvbnRhaW5lcnMgbGFyZ2VyIHRoYW4KCSAgICBJTlRfTUFYLCB0aGUgcHl0aG9uIGxpbWl0LgoJICAgIAoJICAgICAgCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXQoJICAgIC0gYWRkICdpdGVyYXRvcigpJyBtZXRob2QgZm9yIGFsbCBzZXF1ZW5jZXMgYW5kIGFkZGl0aW9uYWxseQoJICAgICAgJ2tleV9pdGVyYXRvcigpJyBmb3IgbWFwcy4KCgkgICAgICAnaXRlcmF0b3IoKScgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLgoJICAgICAgQWRkaXRpb25hbGx5LCBpbiBtYXBzLCAna2V5X2l0ZXJhdG9yKCknIHdpbGwgcmV0dXJuIGEgcHl0aG9uCgkgICAgICBpdGVyYXRvciB1c2luZyBvbmx5IHRoZSBtYXAga2V5cy4KCSAgICAgIAoJICAgICAgSW4gZ2VuZXJhbCB0aGUgc2VxdWVuY2UgbWV0aG9kIF9faXRlcl9fIHdpbGwgY2FsbAoJICAgICAgJ2l0ZXJhdG9yKCknLCByZXR1cm5pbmcgdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IsIGJ1dCBpbgoJICAgICAgbWFwcyBpdCB3aWxsIGNhbGwgJ2tleV9pdGVyYXRvcigpJywgbWFpbnRhaW5pbmcKCSAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJICAgICAgSGVuY2UsIGZvciBzdGQ6Om1hcHMsIHlvdSBjYW4gcGxheSB0aGVuIHdpdGggdGhlIG5hdGl2ZQoJICAgICAgQysrIGl0ZXJhdG9yLCB3aGljaCB2YWx1ZSBpcyBhIChrZXksIHZhbHVlKSBwYWlyLCBieQoJICAgICAgY2FsbGluZyBtYXAuaXRlcmF0b3IoKSwgYXMgd2l0aCBtYXAuYmVnaW4oKSwgbWFwLmVuZCgpLCBldGMuCgoJICAgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtYXAuaXRlcmF0b3IoKSByZXR1cm5zIGEgc2FmZQoJICAgICAgJ2Nsb3NlZCcgaXRlcmF0b3IsIHdoaWxlIG1hcC5iZWdpbigpIGFuZCBtYXAuZW5kKCkgYXJlCgkgICAgICAnb3BlbicgaXRlcmF0b3JzLgoKCSAgICAgIEEgJ2Nsb3NlZCcgaXRlcmF0b3Iga25vd3MgdGhlIGJlZ2luIGFuZCB0aGUgZW5kIG9mIHRoZQoJICAgICAgc2VxdWVuY2UsIGFuZCBpdCBuZXZlciBjYW4gc2VnLiBmYXVsdC4gQW4gJ29wZW4nCgkgICAgICBpdGVyYXRvciwgYXMgaW4gQysrLCBjYW4gc2VnLiBmYXVsdCBhdCB0aGUgQysrIHNpZGUuCgoJICAgICAgICAgIyBhIGNsb3NlZCBpdGVyYXRvciBpcyBzYWZlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KCQkgIyB0aGUgbmV4dCgpIG1ldGhvZCB3aWxsIHRocm93IGEgU3RvcEl0ZXJhdGlvbgoJICAgICAgICAgIyBleGNlcHRpb24gYXMgbmVlZGVkCgkKCSAgICAgICAgIGkgPSBzZXEuaXRlcmF0b3IoKQoJCSB0cnk6CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgoJCSAgICAgICAgc3VtICs9IGkubmV4dCgpCgkJIGV4Y2VwdDogcGFzcwoJCSAKCQkgIyBhbiBvcGVuIGl0ZXJhdG9yIGFsd2F5cyBuZWVkIHRvIGJlIGNoZWNrZWQsCgkJICMgb3IgaXQgd2lsbCBjcmFzaCBhdCB0aGUgQysrIHNpZGUKCgkgICAgICAgICBjdXJyZW50ID0gc2VxLmJlZ2luKCkKICAgICAgICAgICAgICAgICBlbmQgPSBzZXEuZW5kKCkKCQkgd2hpbGUgKGN1cnJlbnQgIT0gZW5kKToKCQkgICAgc3VtICs9IGN1cnJlbnQubmV4dCgpCgkgICAgICAKCSAgICAgIAoJICAgIFtQeXRob25dCgkgICAgLSBGaW5hbGx5LCB3aGVuIHdlIGNhbGwgCgoJICAgICAgICBmID0gRm9vKCkKCgkgICAgICB0aGUgY29uc3RydWN0aW9uIGlzICdvbmUtd2F5Jy4gQmVmb3JlIGNvbnN0cnVjdGlvbiAgd2FzIGRvbmUKCSAgICAgIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykgCiAgICAgICAgICAgICAgICAgIG5ld19Gb28oKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKSAKICAgICAgICAgICAgICAgICAgRm9vUHRyKCkgKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgd2FzIGRvbmUgbGlrZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pCiAgICAgICAgICAgICAgICAgIEZvb1B0cihweXRob24pIC0+IEZvbygpIChweXRob24pCiAgICAgICAgICAgICAgICAgIAkJICAKCgkgICAgICBpZSwgd2Ugd2hlbiBnb2luZyBiYWNrIGFuZCBmb3J3YXJkIGJldHdlZW4gdGhlIEMrKyBhbmQKCSAgICAgIHB5dGhvbiBzaWRlLgoKCSAgICAgIE5vdyBzaW5jZSB0aGVyZSBpcyBubyBGb29QdHIgdGhlIGNvbnN0cnVjdGlvbiBwcm9jZXNzIGlzCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykKICAgICAgICAgICAgICAgICAgX25ld19Gb28oKSAoQysrKSAtPiBOZXdQb2ludGVyT2JqKCkgKEMrKykgKG5vIHNoYWRvdyBjbGFzcykKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgaXMgZG9uZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspICh3aXRoIHNoYWRvdyBjbGFzcykgLT4gTmV3SW5zdGFjZU9iaigpIChDKyspCgoJICAgICAgd2hlcmUgTmV3SW5zdGFuY2VPYmogY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3aXRob3V0CgkgICAgICBjYWxsaW5nIF9faW5pdF9fIGFuZCBpdCBkb2Vzbid0IGdvICdiYWNrJyB0byBweXRob24sIGlzCgkgICAgICAncHVyZScgQyBBUEkuCgoJICAgICAtIFdpdGggdGhpcyBjaGFuZ2UsIGFuZCB0aGUgb3RoZXIgb25lcyBpbiB0aGUKICAgICAgICAgICAgICAgUHlTd2lnT2JqZWN0IHR5cGUsIHdoaWNoIG5vdyBjYXJyaWVzIHRoZSB0aGlzb3duIGFuZAogICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyBwb2ludGVyLCB0aGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGJlIGFzCiAgICAgICAgICAgICAgIGZhc3QgYXMgYm9vc3Q6OlB5dGhvbiBhbmQvb3IgdGhlIG90aGVyIHB5dGhvbiB3cmFwcGVycwogICAgICAgICAgICAgICBiYXNlZCBpbiBwdXJlIFB5dGhvbi9DIEFQSSBjYWxscy4KCgkgICAgICAgQXMgYSByZWZlcmVuY2UsIHRoZSBwcm9maWxldGVzdF9ydW5tZS5weSBleGFtcGxlLCB3aGljaAoJICAgICAgIGRvZXMgYSBzaW1wbGUgY2FsbCBmdW5jdGlvbiBtYW55IHRpbWVzLCBzdWNoIGFzIHRoaXMgY29kZToKCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGV0ZXN0ICAgICAgIAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJICAgIGEgPSBwcm9maWxldGVzdC5BKCkgICAgICAKCQkgICAgYiA9IHByb2ZpbGV0ZXN0LkIoKSAgICAgIAoJCSAgICBmb3IgaSBpbiByYW5nZSgwLDEwMDAwMDApCgkgICAgICAgICAgICAgIGEgPSBiLmZuKGEpICAgICAgICAgICAgCgoKCSAgICAgICB3aGVyZSBmbiBpcyBkZWZpbmVkIGFzICdBKiBCOjpmbihBICphKSB7cmV0dXJuIGE7fScsCgkgICAgICAgcHJvZHVjZXMgIHRoZSBmb2xsb3dpbmcgdGltZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub21vZGVybiAgICBtb2Rlcm4KCSAgICAgICAgIHN3aWctMS4zLjI2ICAgIDE5LjcwcyAgICAgIDUuOThzCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuOTlzICAgICAgMC45OHMKCSAgICAgICAKCgkgICAgICAgQ2xlYXJseSwgdGhlcmUgaXMgYSBsYXJnZSBpbXByb3ZlbWVudCBmb3IgdGhlIHB5dGhvbgoJICAgICAgICdub21vZGVybicgbW9kZS4gU3RpbGwsIHRoZSAnbW9kZXJuJyBtb2RlIGlzIGFyb3VuZAoJICAgICAgIDYgdGltZXMgZmFzdGVyIHRoYW4gYmVmb3JlLiBGb3IgdGhlIHNhbWUgdGVzdCwgYnV0CgkgICAgICAgdXNpbmcgdGhlIG5vbi1zaGFkb3cgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLCB3ZSBnZXQKCgkgICAgICAgICAgICAgICAgICAgICAgIF9wcm9maWxldGVzdCAobm9uLXNoYWRvdykKCSAgICAgICAgIHN3aWctMS4zLjI2ICAgICAwLjgwcyAKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC42MHMgCgoJICAgICAgIEhlbmNlLCBub3cgZm9yIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIHByb3h5IG92ZXJoZWFkCgkgICAgICAgaXMgaW5zaWduaWZpY2FudC4KCgkgICAgICAgTm90ZSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBudW1iZXJzIHdlIGFyZSBzaG93aW5nIGlzIGZvcgoJICAgICAgIGEgc2ltcGxlIG1vZHVsZSAodHdvIHR5cGVzKSBhbmQgYSBzaW1wbGUgZnVuY3Rpb24gKG9uZQoJICAgICAgIGFyZ3VtZW50KS4gRm9yIHJlYWwgc2l0dWF0aW9ucywgZm9yIG1vZHVsZXMgd2l0aCBtYW55CgkgICAgICAgbW9yZSB0eXBlcyBhbmQvb3IgZnVuY3Rpb25zIHdpdGggbWFueSBtb3JlIHBhcmFtZXRlcnMsCgkgICAgICAgeW91IHdpbGwgc2VlIGV2ZW4gYmV0dGVyIHJlc3VsdHMuCgkgICAgICAgCgkJICAJICAgICAgCjEwLzMxLzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dCgoJICAgIC0gRmluYWxseSwgbm8gbW9yZSBDbGFzc1B0ciBwcm94eSBjbGFzc2VzLiBZb3Ugd2lsbCBzZWUKCSAgICAgIG9ubHkgYSBjbGVhbiBDbGFzcyBwcm94eSBjbGFzcyBpbiB0aGUgLnB5IGZpbGUuCgoJICAgIC0gTm8gbW9yZSAncmVhbCcgdGhpc293biBhdHRyaWJ1dGUgZWl0aGVyLCB0aGUgUHlTd2lnT2JqZWN0IG5vdwogICAgICAgICAgICAgIGNhcnJpZXMgdGhlIG93bmVyc2hpcCBpbmZvLgoKCSAgICAgIFlvdSBjYW4gYWxzbyBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoJCSAgCgkJICBzZWxmLnRoaXMuZGlzb3duKCkKCQkgIHNlbGYudGhpcy5vd24oMCkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzLmFjcXVpcmUoKQoJCSAgc2VsZi50aGlzLm93bigxKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgoJICAgICAgU3RpbGwgdGhlIG9sZCB3YXksCgkgICAgICAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgoJCSAgc2VsZi50aGlzb3duID0gMAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpc293biA9IDEKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgogICAgICAgICAgICAgIGlzIHN1cHBvcnRlZCwgYW5kIHB5dGhvbiBkaXNwYXRjaGVzIHRoZSBwcm9wZXIgbWV0aG9kCiAgICAgICAgICAgICAgY2FsbHMgYXMgbmVlZGVkLiAJCSAgCgkgICAgICAgCgoJICAgIC0gU3VwcG9ydCBmb3IgaXRlcmF0b3JzIGluIFNUTC9TVEQgY29udGFpbmVycywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZTxzZXRfc3RyaW5nPiBzdGQ6OnNldDxzdGQ6OnN0cmluZz47CgkgICAgICAgICAgCiAgICAgICAgICAgICAgIHlvdSBjYW4gdXNlIHRoZSBDKysgaXRlcmF0b3JzIGFzOiAgCgogICAgICAgICAgICAgICAgICAgICBzID0gc2V0X3N0cmluZygpCgkJICAgICAgICAgICAgICAgICAgICAgCgkJICAgICBzLmFwcGVuZCgiYyIpICAgCgkJICAgICBzLmFwcGVuZCgiYSIpICAgCgkgICAgICAgICAgICAgcy5hcHBlbmQoImIiKQoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImFiYyIgCgoJCWFkdmFuY2UgdGhlIGl0ZXJhdG9yIGFzIGluIEMrKwoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgY3VycmVudCArPSAxCiAgICAgICAgICAgICAgICAgICAgIHByaW50IGN1cnJlbnQudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgCgkJbm93IHVzaW5nIHRoZSByZXZlcnNlIG9wZXJhdG9ycwoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMucmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLnJlbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCgkgICAgICAgIG9yIHRoZSAncHJldmlvdXMnIG1ldGhvZAoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGUucHJldmlvdXMoKQogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCiAgICAgICAgICAgICAgICBvciBqdXN0IGFzIGluIGEgcHl0aG9uIGZhc2hpb24KCiAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgTm90ZSAxOiBJdGVyYXRvcnMgaW4gQysrIGFyZSB2ZXJ5IHBvd2VyZnVsLCBidXQKICAgICAgICAgICAgICAgIGRhbmdlcm91cyB0b28uIEFuZCBpbiBweXRob24geW91IGNhbiBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdAogICAgICAgICAgICAgICAganVzdCBsaWtlIGluIEMrKywgc28sIGJlIGNhcmVmdWwuCgkJCgkJTm90ZSAyOiB0aGUgaXRlcmF0b3JzIGFyZSAnbGlnaHQnLCBpZSwgdGhleSBkbyBub3QKCQljb252ZXJ0IHNlcXVlbmNlIGVsZW1lbnRzIHVudGlsIHlvdSByZXF1ZXN0IHRvIGRvIHNvLCB2aWEKCQluZXh0KCksIHZhbHVlKCkgb3IgcHJldmlvdXMoKS4gSWYgeW91IGp1c3QgaW5jcmVtZW50L2RlY3JlbWVudCBvbmUKCQlubyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCSAgICAgICAgICAgICBiICs9IDEKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKCkKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKDIpCgkJICAgICBiLmRlY3IoMikKICAgICAgICAgICAgICAgICAgICAgYi5kZWNyKCkKICAgICAgICAgICAgICAgICAgICAgYiAtPSAxCgoJCSBvbmx5IHRoZSBpdGVyYXRvciBpcyBtb2RpZmllZCwgYW5kIG5vdCB2YWx1ZSB3cmFwcGVyCgkJIGlzIGdlbmVyYXRlZC4gT3RoZXIgdHlwaWNhbCBDKysgb3BlcmF0aW9ucyBhcmUgYWxzbyAKCQkgYXZhaWxhYmxlLCBzdWNoIGFzOgoKCQkgICAgIHByaW50IHMuZW5kKCkgLSBzLmJlZ2luKCkKCQkgICAgID4+PiAzCgkJICAgICBmID0gcy5iZWdpbigpICsgMQoJCSAgICAgcHJpbnQgZi52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICBsID0gcy5lbmQoKSAtIDEKCQkgICAgIHByaW50IGwudmFsdWUoKQoJCSAgICAgPj4+ICJjIgoJCSAKCQkgZXRjLiAgT2YgY291cnNlLCB0aGUgJ2ZpbmQnLCAnaW5zZXJ0JywgJ2VyYXNlJywgYW5kCgkJIHNvIG9uIG1ldGhvZHMgYWxzbyBzdXBwb3J0cyBpdGVyYXRvcnMgbm93LCBpZToKCgkJICAgICAgaSA9IHMuYmVnaW4oKQoJCSAgICAgIGkgKz0gMQoJCSAgICAgIHMuZXJhc2UoaSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaQoJCSAgICAgIHByaW50IHN1bQoJCSAgICAgID4+PiAiYWMiCgkJICAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGVyZSBpcyBubyBtb3JlICd0aGlzb3duJyBhdHRyaWJ1dGUuIElmIHlvdSB1c2UgaXQsIHB5dGhvbgoJICAgIHdpbGwgdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnRoaXNvd24pOiAgID09PiAgIGlmIChzZWxmLnRoaXMub3duKCkpOgoJCXNlbGYudGhpc293biA9IDEgICAgID09PiAgIHNlbGYudGhpcy5vd24oMSkKICAgICAgICAgICAgICAgIHNlbGYudGhpc293biA9IDAgICAgID09PiAgIHNlbGYudGhpcy5vd24oMCkKCgkgICAgU3RpbGwsIG1heWJlIGluIHNvbWUgdW51c3VhbCBjYXNlcyB0aGUgdHJhbnNsYXRpb24gd2lsbCBub3QgYmUKCSAgICAxMDAlIGNvcnJlY3QsIHNvIGlmIHlvdSBoYXZlIGEgcHJvYmxlbSwgcGxlYXNlIHJlcG9ydCBpdAoJICAgIGFuZC9vciB1c2UgdGhlIG5ldyAnc2VsZi50aGlzLm93bigpJyBhY2Nlc3Nvci4KCSAgICAKCSAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgVGhlcmUgaXMgbm8gbW9yZSBDbGFzc1B0ciBjbGFzc2VzIGluIHRoZSBweXRob24gY29kZS4gSGVuY2UsCgkgICAgaWYgaW4gdGhlIHBhc3QgeW91IG5lZWRlZCB0byByZXNvcnQgdG8gc29tZSBraW5kIG9mIHRyaWNrZXJ5CgkgICAgd2l0aCB0aGVtLCBvciBvdmVyY29tZSB0aGVpciBwcmVzZW5jZSwgaXQgaXMgbm8gbG9uZ2VyCgkgICAgcmVxdWlyZWQsIGJ1dCB0aGUgZXh0cmEgY29kZSB5b3UgYWRkZWQgY291bGQgbm93IGJyZWFrCgkgICAgdGhpbmdzLgoKCSAgICBJZiBuZWVkZWQsIHlvdSBjYW4gdXNlIHRoZSBvcHRpb24gLWNsYXNzcHRyLCBpLmUuLAoKICAgICAgICAgICAgICAgc3dpZyAtY2xhc3NwdHIgLXB5dGhvbiAuLi4KCgkgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBDbGFzc1B0ciBjbGFzc2VzLgoKCjEwLzMwLzIwMDU6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBNYWtlIGRlY2xhcmVkIGFuZCBkZWZpbmVkIGxpbmthZ2Ugb2YgU1dJR19pbml0IGNvbnNpc3RlbnQuICAKCSAgICBSZXBvcnRlZCBieSBTdGV2ZW4gRy4gSm9obnNvbiAoU0YgcGF0Y2ggMTMxNTQ5OCkuCgoxMC8yNi8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIGdsb2JhbCBsaWJyYXJ5IGRpcmVjdG9yLgoJICAgIE5vdyBpdCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCB1c2UKCSAgICB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgYXMgd2VsbC4KCgkgICAgU28sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAlaW5jbHVkZSBhdHRyaWJ1dGUuaQoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZShBLCBpbnQsIGEsIGdldF9hLCBzZXRfYSk7CgkgICAgICAgCQkJCSAgICAgIAkgIAoJICAgICAgIHN0cnVjdCBBCQkJICAgICAgCSAgCgkgICAgICAgeyAgICAJCQkJICAKCSAgICAgICAgIGludCBnZXRfYSgpIGNvbnN0OyAJCSAgCgkgICAgICAgICB2b2lkIHNldF9hKGludCBhYSk7IAkJICAKCSAgICAgICB9OwkJCQkgIAoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQiwgaW50LCBjKTsKCSAgICAgICAJCQkJCgkgICAgICAgc3RydWN0IEIJCQkKCSAgICAgICB7ICAgIAkJCQoJICAgICAgICAgaW50JiBjKCk7IAkJCgkgICAgICAgfTsgCgoJICAgIHRoZW4gaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0aGUgJ0EuYScgYW5kICdCLmMnIGF0dHJpYnV0ZXMgd2lsbAoJICAgIGJlIHZpc2libGUsIGllLCB5b3UgY2FuIGFjY2VzcyB0aGVtIGFzIHBsYWluIHZhcmlhYmxlczoKCiAgICAgICAgICAgICAgIGYgICA9IEEoKQogICAgICAgICAgICAgICBmLmEgPSAzCiAgICAgICAgICAgICAgIGcgICA9IEIoKQogICAgICAgICAgICAgICBnLmMgPSAzIAogICAgICAgICAgIAoJICAgICAgIGggICA9IGYuYSArIGcuYwoKCSAgICBhbmQgdGhlIHByb3BlciBnZXQvc2V0IG1ldGhvZHMgd2lsbCBiZSBkaXNwYXRjaGVkLiBTZWUKCSAgICBhdHRyaWJ1dGUuaSBmb3IgbW9yZSBpbmZvLgogICAKICAgICAgICAgIC0gTW9yZSBjbGVhbnVwcyBhcm91bmQgYW5kIGFkZGluZyBtb3JlIHRlc3QtY2FzZXMuIFRoZQogICAgICAgICAgICBESVNPV04gdHlwZW1hcCBub3cgaXMgdGVzdGVkIGFuZCB3b3JraW5nIGluIGFsbCB0aGUKICAgICAgICAgICAgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaWUsIHRjbCwKICAgICAgICAgICAgcnVieSwgcGVybCBhbmQgcHl0aG9uLgoJICAgIAoKMTAvMjUvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCwgY29tcGxldGUgdGhlIERJU09XTiB0eXBlbWFwLgoJICAgIAoJICAgIC0gYWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIHVuaWZpZWQgdHlwZW1hcAogICAgICAgICAgICAgIGxpYnJhcnkgKGJlZm9yZSB3YXMgb25seSB1c2FibGUgZnJvbSBweXRob24pLgoKCSAgICAtIHVuaWZ5IHRoZSBuYW1lcyBmb3IgdGhlIHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgaW4KCSAgICAgIHBlcmwsdGNsLHJ1YnkgYW5kIHB5dGhvbiwgc28sIHRoZSBhdHRyaWJ1dGUuaSBsaWJyYXJ5CgkgICAgICBjYW4gd29yayBhY3Jvc3MgdGhlbS4KCSAgICAgIAoJICAgIC0gc2VlIHRoZSBsaV9hdHRyaWJ1dGUuaSB0ZXN0LWNhc2Ugb3IgdGhlIGxpYnJhcnkgZmlsZQoKIAkgICAgICAgIExpYi90eXBlbWFwcy9hdHRyaWJ1dGUuc3dnCgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm8gYWJvdXQgaG93IHRvIHVzZSBpdC4KCiAKCSAgICAgIAoKMTAvMjQvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCBub3cgdXNlcyB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkuCgoJICAgIC0gQ2hhbmdlcyBpbiBydWJ5IHRvIHVzZSB0aGUgJHRyYWNrIG9wdGlvbiBpbiB0eXBlbWFwcy4KCgkgICAgLSBDaGFuZ2VzIGluIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSB0byBmb2xsb3cgdGhlCgkgICAgICBjb252ZW50aW9uIHRoYXQgYWxsIG1hY3JvcyB0aGF0IGFyZSBub3QgdXNlZCBpbiB0aGUKCSAgICAgIEMvQysrIHNpZGUgc3RhcnRzIHdpdGggJSwgc3VjaCBhcwoKCSAgICAgICAgICAgJWRlbGV0ZQoJCSAgICVuZXdfYXJyYXkKCiAgICAgICAgICAgICAgZXRjLgoJICAgICAgCgkgICAgLSBEb2N1bWVudGluZyBmcmFnbWVudHMsIHNlZSBmcmFnbWVudHMuc3dnLgoKCSAgICAtIENsZWFuZXIgd2F5IHRvIHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGluY2x1ZGUKCSAgICAgIGp1c3QgPHR5cGVtYXBzL3N3aWd0eXBlcy5zd2c+LgoKCSAgICAgIENoZWNrIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IHBlcmwsIHRjbCwgcnVieSwKCSAgICAgIHB5dGhvbi4KCgkgICAgICBBbHdheXMgc3RhcnQgd2l0aCB0aGUgaGVhZCBmaWxlLCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dGhvbi5zd2cKCSAgICAgICAgIHRjbC90Y2w4LnN3ZwoJICAgICAgICAgcnVieS9ydWJ5LnN3ZwoJICAgICAgICAgcGVybDUvcGVybDUuc3dnCgogICAgICAgICAgICAgIGFuZCB0aGUgcHJpbmNpcGFsIGZpbGUgdGhhdCBpbnZva2VzIHRoZSB1bmlmaWVkIGxpYnJhcnksIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgdGNsL3RjbHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBydWJ5L3J1Ynl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcGVybC9wZXJsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAKCSAgICAgIFRoZSBmaWxlIHRoYXQgcHJvdmlkZSB0aGUgc3BlY2lhbGl6YXRpb24gZm9yIGVhY2gKCSAgICAgIGxhbmd1YWdlIGFyZSB0aGUgb25lIHRoYXQgcHJvdmlkZXMgdGhlIGJhc2ljIHR5cGVzOgoKCSAgICAgICAgIHB5dGhvbi9weXByaW10eXBlcy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgdGNsL3RjbHByaW10eXBlcy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJscHJpbXR5cGVzLnN3ZwoKCSAgICAgIGFuZCB0aGUgc3RyaW5nIG1hbmlwdWxhdGlvbjogIAkgCgkgICAgCgkgICAgICAgICBweXRob24vcHlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXN0cmluZ3Muc3dnCQoJICAgICAgICAgdGNsL3RjbHN0cmluZ3Muc3dnCQoJICAgICAgICAgcGVybDUvcGVybHN0cmluZ3Muc3dnCgoJCSAKCSAgICAgIFRoZSByZXN0IG9mIHRoZSBmaWxlcywgc3VjaCBhcyBjYXJyYXkuaSwgYXJlIG1vc3RseSBvbmUgCgkgICAgICBsaW5lIGZpbGVzIHRoYXQgaW5jbHVkZSB0aGUgcHJvcGVyIHR5cGVtYXAgbGlicmFyeQoJICAgICAgdmVyc2lvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFBlcmwgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBleHBlY3RlZCBiZWhhdmlvciBpbiBQZXJsLgoKMTAvMjMvMjAwNTogd3V6emViCiAgICAgICAgICAgIENoaWNrZW46CiAgICAgICAgICAgICAgKyBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIGZpbmFsbHkgd29yayBwcm9wZXJseQogICAgICAgICAgICAgICsgYWRkIHRlc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNwcF9iYXNpYy5pCgoxMC8yMC8yMDA1OiBkYW5jeQoJICAgIFthbGxlZ3JvY2xdIEFkZGVkIEMrKyBzdXBwb3J0LiBMYXJnZSB1cGRhdGUsIG1hbnkgY2hhbmdlcy4gU2VlCgkgICAgbmV3bHkgYWRkZWQgQWxsZWdybyBDb21tb24gTGlzcCBzZWN0aW9uIGluIGxpc3AuaHRtbAoKMTAvMjAvMjAwNTogbW1hdHVzCgkgICAgUnVieSwgVGNsLCBQeXRob246CgoJICAgIC0gVW5pZm9ybSB3YXkgdG8gZmFpbCAobGFiZWwgZmFpbDopLCBub3cgZmluYWxseQoJICAgICAgU1dJR19leGNlcHRpb24gd29ya3MgYWNyb3NzIHRoZSB0aHJlZSBsYW5ndWFnZXMgYW5kIGFsbAoJICAgICAgdGhlIHR5cGVtYXBzLgoKCSAgICAtIEFkZCBwcm9wZXIgY2xlYW51cCBjb2RlIHRvIHJ1YnkKCgkgICAgLSBNb3JlIHZhbGdyaW5kIGZpeGVzCgoJICAgIC0gU2ltcGxpZnkgdGhlIGlubGluZSB1c2UsIGl0IHNlZW1zIGEgc21hbGwgaW50ZXJmYWNlIG9mCgkgICAgICAyMCwwMDAgbGluZXMgKHBsdXMgbWFueSBtYW55IHRlbXBsYXRlcykgY2FuIGJyZWFrIAoJICAgICAgZ2NjIC1PMyBlYXNpbHkuCgoJICAgIC0gRmluYWxpemUgdGhlIHR5cGVtYXBzIGxpYnJhcnkuIEFsbCB0aGUgb2xkICAqLmkgZmlsZXMKCSAgICAgIChjYXJyYXkuaSwgY3BvaW50ZXIuaSwgZXhjZXB0aW9uLmkpIGhhZCBiZWVuIGltcGxlbWVudGVkCgkgICAgICBpbiB0aGUgbmV3IHR5cGVtYXBzIGxpYnJhcnkuCgkgICAgCgoxMC8xOS8yMDA1OiB3dXp6ZWIKCSAgICBVcGRhdGUgdGhlIFJ1bnRpbWUgVHlwZW1hcCBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwKCjEwLzE4LzIwMDU6IHd1enplYgoJICAgIENoaWNrZW46CgkgICAgICAtIENvcnJlY3RseSBoYW5kbGUgJWlnbm9yZWQgY2xhc3NlcwogICAgICAgICAgICAgIC0gQ29ycmVjdGx5IGNvbnZlcnQgbG9uZywgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nLCBldGMKICAgICAgICAgICAgICAgIHRvIGNoaWNrZW4gcHJpbWl0aXZlcy4gKFRoYW5rcyB0byBGZWxpeCBXaW5rZWxtYW5uKQogICAgICAgICAgICAgIC0gVXNpbmcgYXJnb3V0IHBhcmFtZXRlcnMgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIHdhcyBhCiAgICAgICAgICAgICAgICB3cmFwcGVkIHBvaW50ZXIgY2F1c2VkIGEgbWVtb3J5IGNvcnJ1cHRpb24uICBUaGUgY2hpY2tlbgogICAgICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3IgbW92ZWQgYSBwb2ludGVyIG91dCBmcm9tIHVuZGVyIHVzLgogICAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYnkgcnVubmluZyBhbGwgdGhlIHByb3h5IGNyZWF0aW9uCiAgICAgICAgICAgICAgICBmdW5jdGlvbnMgYXMgY29udGludWF0aW9ucyBhZnRlciB0aGUgd3JhcHBlciBmdW5jdGlvbgogICAgICAgICAgICAgICAgcmV0dXJucy4gIEFzIHBhcnQgb2YgdGhpcywgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlCiAgICAgICAgICAgICAgICBjaGlja2VuZmFzdHByb3h5IGZsYWcgb24gb3V0cHV0IHR5cGVtYXBzLgogICAgICAgICAgICAgIC0gdXNpbmcgLXByb3h5IGFuZCAtbm9jb2xsZWN0aW9uIHRvZ2V0aGVyIHdvcmtzIG5vdwogICAgICAgICAgICAgICAgQmVmb3JlLCBpdCB3YXMgbm90IGV4cG9ydGluZyB0aGUgZGVzdHJ1Y3RvciBpbiB0aGUgcHJveHkKICAgICAgICAgICAgICAgIHdyYXBwZXIuCgoxMC8xOC8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBBZGRlZCB0aGUgVW5pZmllZCBUeXBlbWFwIExpYnJhcnkgKFVUTCkuIEl0IHVuaWZpZXMgdGhlIHR5cGVtYXBzIGZvcgoKIAkgICAgICAgIHB5dGhvbiwgcnVieSwgdGNsCgoJICAgIGFuZCBpbiB0aGUgcHJvY2VzcywgZml4ZXMgc2V2ZXJhbCBwcm9ibGVtcyBpbiBlYWNoIG9mIHRoZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0byB3b3JrIGluIGEgImNhbm9uaWNhbCIgd2F5IG5vdyBlc3RhYmxpc2hlZCBpbgoJICAgIHRoZSB0eXBlbWFwIGxpYnJhcnkKCSAgICAKCSAgICAgICBTV0lHL0xpYi90eXBlbXBhcwoKCSAgICBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVuaWZpY2F0aW9uIGlzIHRoYXQgZXZlcnl0aGluZwoJICAgIGNvbXBpbGVzIGFuZCBydW5zIGluc2lkZSB0aGUgdGVzdC1zdWl0ZSBhbmQgZXhhbXBsZXMKCSAgICBkaXJlY3Rvcmllcy4gQW5kIGZvciB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRoYW4gcGFzcyB0aGUgcHJpbWl0aXZlX3R5cGVzLmkgY2FzZS4KCgkgICAgQWxzbywgd2UgaGF2ZSBhIHVuaWZvcm0gd2F5IHRvIHRyZWF0IHRoZSBlcnJvcnMsIGZvciBleGFtcGxlCgkgICAgaWYgeW91IGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgPj4+IGZyb20gcHJpbWl0aXZlX3R5cGVzIGltcG9ydCAqCiAgICAgICAgICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMCkKICAgICAgICAgICAgICAxMAoJICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMDAwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToJCSAgICAgIAoJICAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CQkJICAgIAoJICAgICAgT3ZlcmZsb3dFcnJvcjogaW4gYXJndW1lbnQgMSBvZiB0eXBlICd1bnNpZ25lZCBjaGFyJwoKCSAgICB5b3UgZ2V0IHRoZSBzYW1lIGV4Y2VwdGlvbiBpbiBhbGwgdGhlIHRocmVlIGxhbmd1YWdlcy4KCSAgICAKCSAgICBBbmQgd2VsbCwgbWFueSBtb3JlIGdvb2QgdGhpbmdzIHdpbGwgY29tZSBmcm9tIHRoaXMKCSAgICB1bmlmaWNhdGlvbiwgZm9yIGV4YW1wbGUsIHByb3BlciBzdXBwb3J0IG9mIHRoZSBTVEwvU1REIGNsYXNzZXMKCSAgICBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCBob3BlZnVsbHksIHdlIGNhbiBrZWVwCgkgICAgYWRkaW5nIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgVGhlIGhhcmRlc3QgcGFydCwgd3JpdGluZyBhIGNvbW1vbiB0eXBlbWFwIGxpYnJhcnkKCSAgICB0aGF0IHN1aXRlcyB0aGUgdGhyZWUgZGlmZmVyZW50IGxhbmd1YWdlcywgaXMgZG9uZSwKCSAgICBhbmQgYWRkaW5nIGFub3RoZXIgbGFuZ3VhZ2Ugc2hvdWxkIG5vdyBiZSBlYXN5LiAKCgkgICAgU3RpbGwgdGhlIGdsb2JhbCB1bmlmaWNhdGlvbiBpcyBub3QgY29tcGxldGUsIHRoZSBTVEwvU1REIAoJICAgIHBhcnQgaXMgbmV4dCwgYW5kIHByb2JhYmx5IGFzIHdlbGwgYXMgYWRkaW5nIG9uZSBvciB0d28gbW9yZQoJICAgIGxhbmd1YWdlcy4KCgkgICAgSWYgeW91IGFyZSBjdXJpb3VzLCBsb29rIGF0IHRoZSBweXRob24sIHJ1YnkgYW5kL29yIHRjbAoJICAgIGRpcmVjdG9yaWVzIHRvIHNlZSB3aGF0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBuZXcKCSAgICBjb21tb24gdHlwZW1hcHMgbGlicmFyeS4gIFN0aWxsLCB0aGUgZmluYWwgd2F5IHRvCgkgICAgaW50ZWdyYXRlIGEgbmV3IGxhbmd1YWdlIGNvdWxkIGNoYW5nZSBhcyB3ZSBtb3ZlIHRvCgkgICAgaW50ZWdyYXRlIHRoZSBTVEQvU1RMLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUnVieS9UY2wgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBiZWhhdmlvciwgc3BlY2lhbGx5IGluIHJ1YnkgYW5kIHRjbC4KClZlcnNpb24gMS4zLjI3IChPY3RvYmVyIDE1LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHR5cGVzYWZlIGVudW0gd3JhcHBpbmcgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0bwogICAgICAgICAgICBvdmVybG9hZCBhIG1ldGhvZCB3aXRoIDIgZGlmZmVyZW50IGVudW0gdHlwZXMuCgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVmZWF0dXJlKCJpbW11dGFibGUiLCIwIikgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBzZXR0ZXJzCiAgICAgICAgICAgIGZvciBjb25zdGFudHMuCgogICAgICAgICAgICBSZXN0b3JlZCAlaW1tdXRhYmxlIGFuZCAlbWFrZWRlZmF1bHQgdG8gY2xlYXIgdGhlIGZlYXR1cmUgYXMgaXQKICAgICAgICAgICAgYmVoYXZlZCBpbiBTV0lHLTEuMy4yNSBhbmQgZWFybGllci4KCjEwLzE0LzIwMDU6IG1tYXR1cwogICAgICAgICAgICBGaXggYnVnIGluIGFub255bW91cyB0eXBlZGVmIHN0cnVjdHVyZXMgd2hpY2ggd2FzIGxlYWRpbmcgdG8KICAgICAgICAgICAgc3RyYW5nZSBiZWhhdmlvdXIuCgoxMC8xMy8yMDA1OiBtbWF0dXMKCSAgICBTZXZlcmFsIG1pbm9yIGNoYW5nZXM6CgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSB3Y2hhcl90IHR5cGUgc3VwcG9ydAoJICAgIC0gQWRkIGEgd2FybmluZyBmb3Igd2hlbiB5b3UgZGVmaW5lIHRoZSAnaW4nIHR5cGVtYXAgYnV0CgkgICAgICB5b3UgZG9uJ3QgZGVmaW5lIHRoZSAndHlwZWNoZWNrJyBvbmUuIFZlcnkgY29tbW9uIG1pc3Rha2UuCgkgICAgLSBBZGQgcHJvcGVyIGRlZmF1bHQgcnVsZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMsIG5vdyB5b3UKCSAgICAgIGNhbiBkZWZpbmUgYSB0eXBlbWFwIHN1Y2ggYXM6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICgoKikoQU5ZKSkgey4uLn0KCgkgICAgICBUaGF0IHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBwb2ludGVyIHRvIGZ1bmN0aW9ucy4gVGhlCgkgICAgICBydWxlIGluIEMrKyBhbHNvIGFwcGx5IHRvIHRoZSBmdW5jdGlvbiAncmVmZXJlbmNlJywgaWUsCgkgICAgICBpbiBib3RoIGNhc2VzCgoJICAgICAgICB0eXBlZGVmICBpbnQgKCpmcHRyKShpbnQgYSk7CgkgICAgICAgIHR5cGVkZWYgIGludCAoZnVuYykoaW50IGEpOwoKCSAgICAgIFRoaXMgd2FzIG5lZWRlZCBzaW5jZSBpdCBzZWVtcyB0byBiZSAnaWxsZWdhbCcgaW4gQysrIHRvCgkgICAgICBkbyBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgICB2b2lkICpwdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGZwdHIpOwoKCSAgICAgIGFuZCBwcm9iYWJseSwgYXMgZm9yIG1lbWJlciBmdW5jdGlvbnMsIGl0IGlzIG5vdAoJICAgICAgd2FycmFudGllZCB0aGF0IHRoZSBwb2ludGVyIHNpemVzIHdpbGwgbWF0Y2guCgoJICAgIC0gQWRkIHRoZSAjZXJyb3IvI3dhcm5pbmcgZGlyZWN0aXZlcyB0byBzd2lnJ3MgY3BwLgoKCSAgICAtIEFkZCB0aGUgbm9ibG9jayBvcHRpb24gZm9yIHR5cGVtYXBzLCB3aGljaCBpcyB1c2VkIGFzCiAgICAgICAgICAgICAgZm9sbG93czogc3VwcG9zZWQgeW91IGEgdHlwZW1hcCwgbGlrZSB0aGlzCgoJICAgICAgCgkgICAgICAldHlwZW1hcChpbixub2Jsb2NrPTEpIEhlbGxvIHsJCQkgICAKCSAgICAgICAgIC4uLi4KICAgICAgICAgICAgICB9CgoJICAgICAgdGhlbiB0aGUgdHlwZW1hcCB3aWxsIGJlIGluc2VydGVkIHdpdGhvdXQgdGhlIGJsb2NrCgkgICAgICBpbXBvc2VkIGJ5IHRoZSBicmFja2V0cywgc2ltaWxhciB0bwoKCSAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIi4uLiI7CgoJICAgICAgU28sIHdoeSB5b3UgZG9uJ3QganVzdCB1c2UgdGhlIHF1b3RlIHN0eWxlPywgYmVjYXVzZToKCSAgICAgIAoJICAgICAgICAgMS4tIFRoZSBxdW90ZSBzdHlsZSBkb2Vzbid0IGdldCBwcmVwcm9jZXNzZWQsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMT0gU1dJR19tYWNybygkMSk7IjsKCSAgICAgIAoJICAgICAgICAgICAgIGhlcmUsIFNXSUdfbWFjcm8gZG9lc24ndCBnZXQgZXhwYW5kZWQKCiAgICAgICAgICAgICAgICAgMi4tIEluc2lkZSBhIHF1b3RlIHR5cGVtYXAsIHlvdSBoYXZlIHRvIHVzZSAKICAgICAgICAgICAgICAgICAgICAgcXVvdGVzIGNhcmVmdWxseQoKCQkgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxID0gXCJoZWxsb1wiICI7CgoJCSAzLi0gWW91IGNhbid0IG1ha2UgZW1hY3MgYW5kL29yIG90aGVyIGVkaXRvcnMKCQkgICAgIHRvIGluZGVudCBpbnNpZGUgYSBzdHJpbmchLiAKCgoJICAgICAgU28sIHdoeSBkbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJsb2NrPywgYmVjYXVzZSBhbiBleHRyYQoJICAgICAgYmxvY2sgd2hlbiBub3QgbmVlZGVkIChubyBsb2NhbCB2YXJpYWJsZXMgaW4gaXQpOgoKCSAgICAgICAgICAxLi0gbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQKICAgICAgICAgICAgICAgICAgMi4tIG1ha2VzIHRoZSBjb2RlIGxhcmdlcgogICAgICAgICAgICAgICAgICAzLi0gb3IgaW4gc2hvcnQsIGZvciB0aGUgc2FtZSByZWFzb24gd2UgaGF2ZSB0aGUgcXVvdGUgc3R5bGUuCgpWZXJzaW9uIDEuMy4yNiAoT2N0b2JlciA5LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkZWQgJ3Rocm93cycgdHlwZW1hcHMuCgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlCiAgICAgICAgICAgIGZpcnN0IG5vbi1pZ25vcmVkIGNsYXNzIGluIHRoZSBwdWJsaWMgYmFzZSBjbGFzcyBsaXN0IGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlLgogICAgICAgICAgICBieSB0aGUgcHJveHkgY2xhc3MuIFByZXZpb3VzbHksIGlmIHRoZSBmaXJzdCBjbGFzcyBpbiB0aGUgbGlzdCB3YXMgaWdub3JlZCwgdGhlbgogICAgICAgICAgICB0aGUgcHJveHkgY2xhc3Mgd291bGRuJ3QgaGF2ZSBhbnkgYmFzZSBjbGFzc2VzLgoKMTAvMDcvMjAwNTogbW1hdHVzCgkgICAgIFVwZGF0ZSBtb3JlIGZlYXR1cmVzIHRvIGZvbGxvdyBuZXcgY29udmVudGlvbiwgaW5jbHVkaW5nOgoKCSAgICAgICBjYWxsYmFjawoJICAgICAgIHJlZi91bnJlZgoJICAgICAgIGV4Y2VwdAoJICAgIAoJICAgICBBbGwgb2YgdGhlbSB1c2Ugbm90IG9ubHkgdGhlIGZlYXR1cmUgYXMgYSBmbGFnLCBidXQgYWxzbwoJICAgICBhcyBjb2RlIHZhbHVlLiBUbyBkZWFsIHdpdGggdGhvc2UgZmVhdHVyZXMsIHdlIHVzZSBub3cKCSAgICAgR2V0RmxhZ0F0dHIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gR2V0RmxhZywgYnV0IGluc3RlYWQgb3IKCSAgICAgcmV0dXJuaW5nIDEgb3IgMCwgaXQgcmV0dXJucyB0aGUgYXR0ciB2YWx1ZSwgaWYgaGFwcGVucwoJICAgICB0byBiZSBkaWZmZXJlbnQgb2YgIjAiIG9mIGNvdXJzZS4KCgkgICAgIE5vdyB0aGVyZSBhcmUgYWxzbyBtb3JlIHVuaWZvcm0gZGlyZWN0aXZlIG5hbWVzIGZvciB0aGUgCgkgICAgIG9uZXMgYmFzZWQgaW4gZmVhdHVyZXMsIGZvciBleGFtcGxlLCBmb3IgdGhlIG9sZAoJICAgICAlbmV3b2JqZWN0IGRpcmVjdGl2ZSBub3cgd2UgaGF2ZSB0cmVlIGRpcmVjdGl2ZXMgZGVmaW5lZDoKCSAgICAgCgoJICAgICAjZGVmaW5lICVuZXdvYmplY3QgICAgICAgICVmZWF0dXJlKCJuZXciKQoJICAgICAjZGVmaW5lICVub25ld29iamVjdCAgICAgICVmZWF0dXJlKCJuZXciLCIwIikKCSAgICAgI2RlZmluZSAlY2xlYXJuZXdvYmplY3QgICAlZmVhdHVyZSgibmV3IiwiIikKCgkgICAgIGFuZCBzbyBvbiBmb3IgYWxsIHRoZSBvdGhlciBmZWF0dXJlIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzMwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc29tZSBmZWF0dXJlcy4gUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2FibGUgbWFueQogICAgICAgICAgICBmZWF0dXJlcyBvbmNlIHRoZXkgaGFkIGJlZW4gZW5hYmxlZC4gVGhpcyB3YXMgZm9yIG1vc3QgZmVhdHVyZXMgdGhhdCBiZWhhdmUgYXMKICAgICAgICAgICAgZmxhZ3MuIFRoZXNlIGZlYXR1cmVzIG5vdyB3b3JrIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIikgICAgICAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIxIikgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMCIpICAgICAgICAgLy8gZGlzYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIiKSAgICAgICAgICAvLyBjbGVhcnMgdGhlIGZlYXR1cmUKCiAgICAgICAgICAgIEluIGZhY3QgYW55IG5vbi1lbXB0eSB2YWx1ZSBvdGhlciB0aGFuICIwIiB3aWxsIGVuYWJsZSB0aGUgZmVhdHVyZSAobGlrZSBDIGJvb2xlYW4gbG9naWMpLgogICAgICAgICAgICBQcmV2aW91c2x5ICIxIiwgIjAiIG9yIGFueSBvdGhlciBub24tZW1wdHkgdmFsdWUgd291bGQgZW5hYmxlIHRoZSBmZWF0dXJlIGFuZCBpdCB3b3VsZAogICAgICAgICAgICBvbmx5IGJlIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUgYnkgY2xlYXJpbmcgaXQgKGFzc3VtaW5nIHRoZXJlIHdhcyBubyBnbG9iYWwgZW5hYmxlKS4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGFmZmVjdGVkOgoKICAgICAgICAgICAgICBhbGxvd2V4Y2VwdAogICAgICAgICAgICAgIGNvbXBhY3RkZWZhdWx0YXJncwogICAgICAgICAgICAgIGNsYXNzaWMgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBjczpjb25zdCAgICAgICAgICAgICAgIChDIykKICAgICAgICAgICAgICBkaXJlY3RvcgogICAgICAgICAgICAgIGV4Y2VwdGlvbmNsYXNzICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBpZ25vcmUKICAgICAgICAgICAgICBpbW11dGFibGUKICAgICAgICAgICAgICBqYXZhOmNvbnN0ICAgICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGphdmE6ZG93bmNhc3QgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAga3dhcmdzCiAgICAgICAgICAgICAgbW9kZXJuICAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5ldwogICAgICAgICAgICAgIG5vYXV0b2RvYyAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBub2RlZmF1bHQKICAgICAgICAgICAgICBub2RpcmVjdG9yCiAgICAgICAgICAgICAgbm9yZWYKICAgICAgICAgICAgICBub3RhYnN0cmFjdAogICAgICAgICAgICAgIG5vdW5yZWYKICAgICAgICAgICAgICBub3ZhbHVld3JhcHBlcgogICAgICAgICAgICAgIHB5dGhvbjptYXliZWNhbGwgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBweXRob246bm9uZHluYW1pYyAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbW9kdWxhMzptdWx0aXJldHZhbCAgICAoTW9kdWxhMykKICAgICAgICAgICAgICBwcmVkaWNhdGUgICAgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHRyYWNrb2JqZWN0cyAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdmFsdWV3cmFwcGVyCgogICAgICAgICAgICBJdCBpcyBub3cgcG9zc2libGUsIGZvciBleGFtcGxlIHRvIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzIGluIGEgaGVhZGVyIGZpbGUsIGV4Y2VwdCBmb3IgYQogICAgICAgICAgICBmZXcgdGFyZ2V0dGVkIG1ldGhvZHMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgc29tZV9mdW5jdGlvbihpbnQsIGRvdWJsZSk7IC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOyAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBDbGFzcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOjptZXRob2Q7ICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBtZXRob2QKICAgICAgICAgICAgICAlaW5jbHVkZSAiYmlnaGVhZGVyLmgiCgogICAgICAgICAgICBSZW1vdmVkICVweXRob25keW5hbWljIC0gaXQgbmV2ZXIgd29ya2VkIHByb3Blcmx5LiBVc2UgJXB5dGhvbm5vbmR5bmFtaWMgaW5zdGVhZC4KICAgICAgICAgICAgUmVtb3ZlZCAlZmVhdHVyZSgibm9rd2FyZ3MiKSAtIGl0IHdhc24ndCBmdWxseSBpbXBsZW1lbnRlZCAgLSB1c2UgJWZlYXR1cmUoImt3YXJncyIsIjAiKSBpbnN0ZWFkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8yNS8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBBZGQgInRocm93cyIgdHlwZW1hcHMuCgowOS8yNC8yMDA1OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldIEFkZHMgbmV3ICV0cmFja29iamVjdHMgZnVuY3Rpb25hbGl0eSB0aGF0IG1hcHMgQysrIG9iamVjdHMgdG8KICAgICAgICAgICAgUnVieSBvYmplY3RzLiAgVGhpcyBmdW5jdGlvbmFsaXR5IG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGltcGxlbWVudAogICAgICAgICAgICBtYXJrIGZ1bmN0aW9ucyBmb3IgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAgICAgcmVmZXIgdG8gdGhlIHVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KICAgICAgICAgICAgCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXRjaCAxMTE2NDMxIGZyb20gSm9zaCBDaGVycnkuIEZpeGVzIG5vbiBtZW1iZXIgZnVuY3Rpb25zIGluYWR2ZXJ0ZW50bHkKICAgICAgICAgICAgYmVpbmcgY2FsbGVkIGluc3RlYWQgb2YgbWVtYmVyIGZ1bmN0aW9ucy4KCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoIGZyb20gTWFyayBHb3NzYWdlIHRvIGFkZCBzdXBwb3J0IGZvciBMdWEtNS4xLCBzdGQ6OnN0cmluZywKICAgICAgICAgICAgc3RkOjp2ZWN0b3IsIHN0ZDo6ZXhjZXB0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgoKMDkvMTQvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIC1ub2NwcGNhc3QuIE5vdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwoJICAgIGFsd2F5cyB1c2UgdGhlIGNwcGNhc3Qgb3BlcmF0b3JzLiBCZWZvcmUgdGhhdCB3YXMgdGhlIGNhc2UKCSAgICBvbmx5IHdoZW4geW91IHVzZWQgdGhlIC1jcHBjYXN0IG9wdGlvbi4KCiAgICAgICAgICAgIElmIHRoaXMgc2VlbXMgdG8gYnJlYWsgeW91ciBjb2RlLi4uIHlvdXIgd2VsY29tZSEsIGl0CgkgICAgbWVhbnMgaXQgd2FzIGJyb2tlbiBiZWZvcmUsIGFuZCB5b3UgbmV2ZXIgbm90aWNlLiAKCgkgICAgSWYgeW91IHRoaW5nIHRoZSBlcnJvciBpcyBkdWUgdG8gb25lIG9mIHRoZSBTV0lHIHR5cGVtYXBzLAoJICAgIHNlbmQgdXMgYW4gZXhhbXBsZS4KCgkgICAgVXNlIC1ub2NwcGNhc3Qgb25seSB3aXRoIHZlcnkgb2xkIEMrKyBjb21waWxlcnMgdGhhdAoJICAgIGRvIG5vdCBzdXBwb3J0IHRoZSBjcHBjYXN0IG9wZXJhdGlvbnMuIAoKCSAgICBTbywgaGVyZSBhcHBsaWVzOgoKCQlUaGlzIGNoYW5nZSBkb2Vzbid0IGJyZWFrIGNvbXBhdGliaWxpdHksIGl0IHdhcyBicm9rZW4gYmVmb3JlLgoKMDkvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3IgbWV0aG9kcyB3aGVuIGEgY2xhc3MgaXMgcGFzc2VkIGJ5IHZhbHVlIGFzIGEKICAgICAgICAgICAgcGFyYW1ldGVyLgoKMDkvMTEvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEFkZGluZyB0aGUgbW9kdWxlIG9wdGlvbiB0byB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIE5vdyB5b3UKICAgICAgICAgICAgY2FuIHVzZSBpdCBhcwoKCSAgICAgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJICAgIHdoZXJlIHN1YmZpbGUgY291bGQgKG9yIG5vdCkgZGVmaW5lIHRoZSBtb2R1bGUgbmFtZSB2aWEKCSAgICB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuIFRoZSBtb2R1bGUgb3B0aW9uIHRha2UgcHJlY2VkZW5jZQoJICAgIGFuZCBpdCBoYXMgdGhlIHNhbWUgZWZmZWN0cyB0aGFuIGhhdmluZyB0aGUgZGlyZWN0aXZlIAoKCSAgICAgICAgJW1vZHVsZSBCaWdNb2R1bGUgIAoKCSAgICBpbnNpZGUgdGhlIGltcG9ydGVkIGZpbGUgZm9vLmkuCgoJICAgIFlvdSBjYW4gdXNlIHRoZSBvcHRpb24gaW4gbWFpbmx5IHR3byBjYXNlczoKCgkgICAgMS4tIFlvdSB1c2VkIHRoZSAtbW9kdWxlIG9wdGlvbiB3aGVuIHlvdSBnZW5lcmF0ZWQgdGhlCiAgICAgICAgICAgICAgICBtb2R1bGUgdG8gYmUgaW1wb3J0ZWQsIGFuZCBoZW5jZSB0aGUgbW9kdWxlIG5hbWUgaW4KICAgICAgICAgICAgICAgIHRoZSBpbXBvcnRlZCAlbW9kdWxlIGRpcmVjdGl2ZSBpcyBub3QgcmVhbGx5IHVzZWZ1bC4KCgkgICAgMi4tIFRoZSBtb2R1bGUgeW91IHdhbnQgdG8gaW1wb3J0IGlzIHZlcnkgbGFyZ2UsIGFuZCBpdAogICAgICAgICAgICAgICAgaGFzIHNldmVyYWwgLmkvLmggZmlsZXMuIFRoZW4sIGlmIHlvdSBqdXN0IG9uZSB0bwogICAgICAgICAgICAgICAgaW1wb3J0IGEgY2xhc3Mgb3Igc28gZnJvbSB0aGUgbW9kdWxlLCBzYXlzICdmb28nLCBhbmQKICAgICAgICAgICAgICAgIG5vdCB0aGUgZW50aXJlIG1vZHVsZSB2aWEgaW1wb3J0aW5nIHRoZSBtYWluCiAgICAgICAgICAgICAgICBCaWdNb2R1bGUuaSBmaWxlLCB0aGVuIHlvdSBqdXN0IGRvOgoKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaAoKICAgCSAgICAgICAgb3IKCQkKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCQl3aGVyZSBmb28uaSBjb250YWlucyB0aGUgJ2ZvbycgZGVjbGFyYXRpb24gYW5kIG1heWJlIGEKCQljb3VwbGUgb2YgZXh0cmEgJWluY2x1ZGUgZGlyZWN0aXZlcywgYXMgbmVlZGVkLgoKCSAgICAKMDkvMTEvMjAwNTogbW1hdHVzCgkgICAgRml4IGJ1ZyAjMTI4MjYzNywgYWJvdXQgdGhlIC1tb2R1bGUgb3B0aW9uIG5vdCBoYXZpbmcgZWZmZWN0CgkgICAgaW4gcGxhY2VzIHdoZXJlIGl0IHdhcyBuZWVkZWQuCgowOS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdHlwZW1hcHMgdXNlZCBmb3IgdGhlCiAgICAgICAgICAgIHNldCB3cmFwcGVycyBhcmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGdldCB3cmFwcGVycy4gSSBkb3VidCB0aGlzIHdhcyBhCiAgICAgICAgICAgIHByb2JsZW0gZm9yIGFueSBsYW5ndWFnZXMgZXhjZXB0IGZvciB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBudWxsIGF0dHJpYnV0ZQogICAgICAgICAgICBpbiB0aGUgb3V0IHR5cGVtYXAgKEMjIG9ubHkpLgoKMDkvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlcyB3aGVuIGZpbGVzIGZhaWwgdG8gb3Blbi4KCjA5LzA2LzIwMDU6IG1tYXR1cyAKCgkgICAgQWxsb3cgYSAlZGVmaW5lIGEgbWFjcm8gaW5zaWRlIGFub3RoZXIgJWRlZmluZSBtYWNybywgZm9yIGV4YW1wbGUKCgkgICAgICAlZGVmaW5lIGhlbGxvKG5hbWUsIFR5cGUpCgkgICAgICAlZGVmaW5lIG5hbWUgIyMgYShUeXBlKQoJICAgICAgJXR5cGVtYXAoaW4pIFR5cGUgImhlbGxvOyI7CgkgICAgICAlZW5kZGVmCgkgICAgICAlZW5kZGVmCgkgICAgICAKCSAgICBUbyBsZWFybiBob3cgdG8gdXNlIHRoaXMgbmV3IGZlYXR1cmVzIGluIHlvdXIgb3duIHR5cGVtYXBzIGxpYnJhcnksIHNlZQoJICAgIHB5dGhvbi9jc3RyaW5nLmksIHB5dGhvbi9jd3N0cmluZy5pIGFuZCBweXRob24vY3dzdHJiYXNlLmkuCSAgICAKCiAgICAgICAgICAgIFtQeXRob25dIE5vcm1hbGl6ZSB0aGUgY3N0cmluZy5pIGltcGxlbWVudGF0aW9uIHRvIHVzZSBmcmFnbWVudHMsIGFuZCBhZGQKICAgICAgICAgICAgY3dzdHJpbmcuaSwgd2hpY2ggaW1wbGVtZW50cyB0aGUgc2FtZSB0eXBlbWFwcyBidXQgZm9yIHdjaGFyX3Qgc3RyaW5ncy4KCgkgICAgW1B5dGhvbl0gQnVnIGZpeGVkOiAxMjQ3NDc3LCAxMjQ1NTkxLCAxMjQ5ODc4IGFuZCBvdGhlcnMuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gSW1wbGVtZW50IHN1cHBvcnQgZm9yIFNXSUdUWVBFKiBESVNPV04gdHlwZW1hcCAobGlrZSBpbiBQeXRob24pIGZvcgogICAgICAgICAgICBiZXR0ZXIgY29udHJvbCBvZiBtZW1vcnkgbWFuYWdlbWVudCwgZWcgd2hlbiBhZGRpbmcgYW4gb2JqZWN0IGNyZWF0ZWQgaW4gUnVieQogICAgICAgICAgICB0byBhIEMrKyBjb250YWluZXIuIFBhdGNoICMxMjYxNjkyIGZyb20gQ2hhcmxpZSBTYXZhZ2UuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSA2NCBiaXQgcGxhdGZvcm0gZml4ZXMgZm9yIHRoZSB2YXJhcmdzIGhhbmRsaW5nIGluIFNXSUdfR2V0QXJncy4gVGhpcyBpcyBhbgogICAgICAgICAgICBpbXByb3ZlZCBmaXggZm9yIGJ1ZyAjMTAxMTYwNCBhcyBzdWdnZXN0ZWQgYnkgSmVyZW15IExpbi4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEJ1ZyAjMTI0MDQ2OSAtICVuZXdvYmplY3Qgc3VwcG9ydCBmb3IgVGNsLiBQYXRjaCBmcm9tIEJvYiBNYXJpbmllci4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBCdWcgIzEyNTQ0OTQgLSBGaXggZm9yIGdsb2JhbCBuYW1lc3BhY2UgcG9sbHV0aW9uIGJ5IHBlcmwgaGVhZGVyIGZpbGVzCiAgICAgICAgICAgIChib29sIGRlZmluZSkgcHJldmVudGVkIFNUTCBoZWFkZXJzIGZyb20gYmVpbmcgdXNlZCBvbiBzb21lIHN5c3RlbXMsIGVnCiAgICAgICAgICAgIFdpbmRvd3Mgd2l0aCBWaXN1YWwgU3R1ZGlvLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEJ1ZyAjMTI0MDkzNyAtIFJlZGVmaW5pdGlvbiBvZiBfX2ludDY0IHR5cGVkZWYgZm9yIEludGVsIGNvbXBpbGVycy4KCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEJ1ZyAjMTI1MTgzMiAtICBDKysgdGVtcGxhdGUgbWF5IGdlbmVyYXRlIGludmFsaWQgWE1MIGZpbGUKCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFN1cHBvcnQgYWRkZWQgZm9yIEx1YS4gUGF0Y2ggIzEyNDI3NzIgZnJvbSBNYXJrIEdvc3NhZ2UuCiAgICAgICAgICAgIEl0IHN1cHBvcnRzIG1vc3QgQy9DKysgZmVhdHVyZXMgKGZ1bmN0aW9ucywgc3RydWN0LCBjbGFzc2VzLCBhcnJheXMsIHBvaW50ZXJzLAogICAgICAgICAgICBleGNlcHRpb25zKSwgYXMgd2VsbCBhcyBsb3RzIG9mIGRvY3VtZW50YXRpb24gYW5kIGEgZmV3IHRlc3QgY2FzZXMgJiBleGFtcGxlcy4KCjA4LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEZpeCBpbmNvcnJlY3QgeG1sIGVzY2FwaW5nIGluIGJhc2UgY2xhc3MgbmFtZSB3aGVuIGJhc2UgY2xhc3MgaXMgYSB0ZW1wbGF0ZS4KCjA4LzEzLzIwMDU6IGVmdXp6eW9uZQoJICAgIFtDTElTUF0gQWRkZWQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgZW51bXMuIERvZXMgbm90IGFkZHMgdGhlIHJldHVybiB0eXBlIGRlY2xhcmF0aW9uCgkgICAgdG8gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24sIGlmIGEgZnVuY3Rpb24gcmV0dXJucyB2b2lkLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIE5ldyBsYW5ndWFnZSBtb2R1bGUsIENvbW1vbiBMaXNwIHdpdGggVUZGSSwgZnJvbSBVdHotVXdlIEhhdXMuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgRml4IHRoZSBMaXNwIHMtZXhwcmVzc2lvbiBvdXRwdXQgbW9kdWxlOyBpdCBubyBsb25nZXIgY29tcGxhaW5zIGFib3V0ICJ1bmtub3duIHRhcmdldHMiLgoKMDcvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBTVEwgd3JhcHBlcnMgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSB1c2VyJ3MgJWV4Y2VwdGlvbiBkaXJlY3RpdmUKICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgU1RMIHdyYXBwZXIgbWV0aG9kcy4gUHJldmlvdXNseSB0aGUgZm9sbG93aW5nIGdsb2JhbCAlZXhjZXB0aW9uCiAgICAgICAgICAgIGRpcmVjdGl2ZSB3b3VsZCBub3QgYmUgdXNlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24geyAKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmVwbGFjaW5nICVleGNlcHRpb24gZGlyZWN0aXZlcyBmb3Igc3BlY2lmaWMgU1RMIHdyYXBwZXIKICAgICAgICAgICAgbWV0aG9kcyB3aXRoIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGRlY2xhcmVkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHMuIHRocm93cyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgbm93IHN1cHBsaWVkIGZvciBoYW5kbGluZyB0aGUgU1RMIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLiBUaGVzZSBjYW4gYWxzbyBiZSBlYXNpbHkKICAgICAgICAgICAgb3ZlcnJpZGRlbiwgZm9yIGV4YW1wbGUgdGhlIHN0ZDo6b3V0X29mX3JhbmdlIGV4Y2VwdGlvbiwgd2hpY2ggaXMgdXNlZCBhIGxvdCBpbiB0aGUgU1RMCiAgICAgICAgICAgIHdyYXBwZXJzLCBjYW4gYmUgY3VzdG9taXNlZCBlYXNpbHk6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfdmVjdG9yLmkiCiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBzdGQ6Om91dF9vZl9yYW5nZSB7CiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RJbnQpIHN0ZDo6dmVjdG9yPGludD47CgowNy8yMi8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NMSVNQXSBUaGUgY2xpc3AgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gSXQgY2FuIG9ubHkgaGFuZGxlIEMsIGNsaXNwIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0cyBmZmkgYmluZGluZ3MgdG8gQysrLgogICAgICAgICAgICAgIC0gSXQgaGFzIHR3byBvcHRpb25zLCAoYSkgLWV4dGVybi1hbGwgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzIGZvciBhbGwgZnVuY3Rpb25zCiAgICAgICAgCWFuZCB2YXJpYWJsZXN0aW9ucywgKGIpIC1nZW5lcmF0ZS10eXBlZGVmIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyAiZGVmLWMtdHlwZSIKCSAgICAgICAgd3JhcHBlcnMgZm9yIHR5cGVkZWZzCgkgICAgICAtIENhbiBoYW5kbGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLCBjb21wbGV4IHR5cGVzIHN1Y2ggYXMgbi1kaW1lbnNpb25hbCBhcnJheXMgb2YgCgkgCXBvaW50ZXJzIG9mIGRlcHRoIGQKCSAgICAgIC0gR2VuZXJhdGVzIHdyYXBwZXJzIGZvciBjb25zdGFudHMgYXMgd2VsbCBhcyB2YXJpYWJsZXMKCSAgICAgIC0gQ29ycmVjdGx5IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0aGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzIGluIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwoJICAgICAgLSBDcmVhdGVzIGEgZGVmcGFja2FnZSAiZGVjbGFyYXRpb24iIHdpdGggdGhlIG1vZHVsZSBuYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUsIHRoZSBjcmVhdGVkIAoJICAgIAlwYWNrYWdlIGV4cG9ydHMgYm90aCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcwoJICAgICAgLSB0cmllcyB0byBndWVzcyB3aGVuIHNob3VsZCBhIHBvaW50ZXIgdmFyaWFibGUgYmUgZGVjbGFyZWQgYXMgYy1wdHIgb3IgYy1wb2ludGVyCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIENoYW5nZXMgdG8gc3VwcG9ydCBDIyBzdHJ1Y3RzIHJldHVybmVkIGJ5IHZhbHVlLiBUaGUgY2hhbmdlcyByZXF1aXJlZCBhcmU6CiAgICAgICAgICAgICAgLSBVc2luZyBhbiBvcHRpb25hbCAnbnVsbCcgYXR0cmlidXRlIGluIHRoZSBvdXQgdHlwZW1hcC4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgdGhlbiBpdCBpcyB1c2VkIGZvciB0aGUgJG51bGwgc3BlY2lhbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCiAgICAgICAgICAgICAgLSBUaGUgY3R5cGUgdXNlZCBpbiB0aGUgQy9DKysgd3JhcHBlcnMgaXMgbm8gbG9uZ2VyIGluaXRpYWxpc2VkIHRvIDAgb24gZGVjbGFyYXRpb24uCiAgICAgICAgICAgIEJvdGggb2YgdGhlc2UgY2hhbmdlcyBmaXggdGhlIHNpdHVhdGlvbnMgd2hlcmUgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhc3NpZ24gMCB0byB0aGUKICAgICAgICAgICAgcmV0dXJuZWQgc3RydWN0LiBNYXJzaGFsbGluZyBzdHJ1Y3RzIGFzIHZhbHVlIHR5cGVzIHN0aWxsIHJlcXVpcmVzIHVzZXIgZGVmaW5lZCB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGFuIGV4YW1wbGUuCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBTV0lHX2V4Y2VwdGlvbiB1c2FnZSB0byB3b3JrIHdpdGggY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBlbXB0eSBtYWNybwogICAgICAgICAgICBhcmd1bWVudHMuIFVuZm9ydHVuYXRlbHkgdGhpcyBmaXggd2lsbCBzdG9wIHVzYWdlIG9mIFNXSUdfZXhjZXB0aW9uIGJlaW5nIHVzZWQgd2l0aGluIHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgdXNlICIiIG9yICV7ICV9IGRlbGltaXRlcnMsIGJ1dCBjb250aW51ZXMgdG8gd29yayB3aXRoIHR5cGVtYXBzIHVzaW5nIHt9IGRlbGltaXRlcnMuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgdGhlIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50IG9yIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIG1ldGhvZHMgaW5zdGVhZAogICAgICAgICAgICBhcyBTV0lHX2V4Y2VwdGlvbiBpcyByZWFsbHkgaW50ZW5kZWQgYXMgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYWNybyBmb3IgdGhlIFNXSUcgbGlicmFyeSB3cml0ZXJzLgoKMDcvMTYvMjAwNTogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2Ugc3BlY2lmaWMgZm9yZWlnbiB0eXBlcyByYXRoZXIgdGhhbiAoKiA6dm9pZCkuIAoJICAgIFVzZSAqc3dpZy1pZGVudGlmaWVyLWNvbnZlcnRlciouCgowNi8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGdW5jdGlvbnMgZGVjbGFyZWQgYXMgJ2V4dGVybicgbm8gbG9uZ2VyIGhhdmUgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBhZGRlZCB0byB0aGUgCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZXMuIFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIFNXSUcgZG9lcyBub3QgZ2V0IHRoaXMgcmlnaHQsIGVnIGJ1ZyAjMTIwNTg1OSAoZXh0ZXJuCiAgICAgICAgICAgIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGRlY2xhcmVkIGluIGEgbmFtZXNwYWNlKS4gQWxzbyBTV0lHIGNhbm5vdCBnZXQgbm9uLXN0YW5kYXJkCiAgICAgICAgICAgIGNhbGxpbmcgY29udmVudGlvbnMgY29ycmVjdCwgZWcgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSB1c3VhbGx5IGhhbmRsZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIERMTElNUE9SVCBleHRlcm4gU1REQ0FMTCB2b2lkIGZ1bmN0aW9uKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFNXSUcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVzOgoKICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZnVuY3Rpb24oaW50KTsKCiAgICAgICAgICAgIFRvIHdoaWNoIHRoZXJlIGlzIG5vIHNvbHV0aW9uIGFzIFNXSUcgZG9lc24ndCBoYW5kbGUgbm9uLXN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbnMuIFRoZSBleHRyYQogICAgICAgICAgICAnZXh0ZXJuJyBmdW5jdGlvbiB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlzIHN1cGVyZmx1b3VzIHVubGVzcyBhIHVzZXIgaGFzIGZvcmdvdHRlbiB0byBhZGQgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIGRlY2xhcmF0aW9uIGludG8gdGhlIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlIC1ub2V4dGVybiBjb21tYW5kbGluZSBhcmd1bWVudCBpcyBub3cgcmVkdW5kYW50IGFuZCBhIG5ldyBjb21tYW5kbGluZSBhcmd1bWVudCAtYWRkZXh0ZXJuIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyLiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdW5sZXNzIHRoZSBoZWFkZXIgZmlsZQogICAgICAgICAgICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB3YXMgaW5hZHZlcnRlbnRseSBub3QgYWRkZWQgdG8gdGhlIHdyYXBwZXJzLiBUbyBmaXggdGhpcwogICAgICAgICAgICBhZGQgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGludG8geW91ciB3cmFwcGVycywgRm9yIGV4YW1wbGUsIHJlcGxhY2U6CgogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwoKICAgICAgICAgICAgd2l0aDoKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA2LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YSwgTW9kdWxhMywgT2NhbWxdCiAgICAgICAgICAgIFRoZSBpbnRlcm1lZGlhcnkgZnVuY3Rpb24gbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgbWF0Y2ggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgc28gdGhhdCAlZXh0ZW5kIGZvciBhIG1lbWJlciB2YXJpYWJsZSB3b3JrcwogICAgICAgICAgICB1bmlmb3JtbHkgYWNyb3NzIGFsbCBsYW5ndWFnZSBtb2R1bGVzLCBlZzoKCiAgICAgICAgICAgICAgJWV4dGVuZCBFeHRlbmRNZSB7CiAgICAgICAgICAgICAgICBWYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgRXh0ZW5kTWVfVmFyX3NldChFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgRXh0ZW5kTWVfVmFyX2dldChFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbWV0aG9kcyBpbXBsZW1lbnRpbmcgdGhlIGdldC9zZXQgdXNlZCB0byBiZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgZ2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGlzIGFsc28gY2hhbmdlcyB0aGUgbmFtZSBvZiB2YXJpYWJsZSB3cmFwcGVyIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIC1ub3Byb3h5LgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgbmFtZXMgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIHRoZSAtb2xkdmFybmFtZXMgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgpWZXJzaW9uIDEuMy4yNSAoSnVuZSAxMSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xMS8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggaGFuZGxpbmcgb2YgYW5vbnltb3VzLWVudW0gdmFyaWFibGVzLgoKMDYvMTAvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGZvciBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIGJ5CgkgICAgY29weS1vZi12YWx1ZS4gIEZpeCBmb3IgZ2xvYmFsICJjb25zdCBjaGFyICoiIHZhcmlhYmxlcy4KCSAgICBGaXggdGVzdGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzLCBhcnJheXNfZ2xvYmFsLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciB3aGVuIGEgYmFzZSBjbGFzcyBkZWZpbmVzIGEgc3ltYm9sIGFzIGEgbWVtYmVyIHZhcmlhYmxlIGFuZCBhIGRlcml2ZWQgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICB0aGUgc2FtZSBzeW1ib2wgYXMgYSBtZW1iZXIgbWV0aG9kLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgLSB3aGVuIGEgbWV0aG9kIGhhcyBwcm90ZWN0ZWQgYWNjZXNzIAogICAgICAgICAgICBpbiBiYXNlIGFuZCBwdWJsaWMgYWNjZXNzIGluIGRlcml2ZWQgY2xhc3MuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNjYzNjMgLSBGb2xsb3cgY29udmVudGlvbiBvZiByZWxlYXNlIHRhcmJhbGwgbmFtZSBtYXRjaGluZyBkaXJlY3RvcnkgbmFtZS4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4ICMxMjExMzUzIC0gdHlwZXNhZmUgZW51bXMgKGFuZCBKYXZhIHByb3BlciBlbnVtcykgd3JhcHBlcnMgd2hlbiBlbnVtIHZhbHVlCiAgICAgICAgICAgIGlzIG5lZ2F0aXZlLgoKMDUvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kZXJuaXNlZCBhbmQgdGlkaWVkIHVwIFdpbmRvd3MgbWFjcm9zIC0tPiBTV0lHRVhQT1JULCBTV0lHU1REQ0FMTC4gVGhleSBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgICAgICBieSB1c2VycyB2aWEgLUQgY29tcGlsZXIgZGlyZWN0aXZlcyBpZiBuZWVkIGJlLgoKMDUvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgJWNzbWV0aG9kbW9kaWZpZXJzIGNhbiBiZSBhcHBsaWVkIHRvIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIG1ldGhvZHMgbm93LgoKICAgICAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgJ3B1YmxpYycgbW9kaWZpZXIgdGhhdCBTV0lHIGdlbmVyYXRlcywgJWNzbWV0aG9kbW9kaWZpZXJzIHdpbGwgYWxzbwogICAgICAgICAgICByZXBsYWNlIHRoZSB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgdGhhdCBTV0lHIHRoaW5rcyBpcyBhcHByb3ByaWF0ZS4gVGhpcyBmZWF0dXJlIGlzCiAgICAgICAgICAgIHVzZWZ1bCBmb3Igc29tZSBvYnNjdXJlIGNhc2VzIHdoZXJlIFNXSUcgbWlnaHQgZ2V0IHRoZSBtb2RpZmllcnMgaW5jb3JyZWN0LCBmb3IgZXhhbXBsZQogICAgICAgICAgICB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlIGFuZCBvdmVycmlkaW5nIGEgbWV0aG9kIGluIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgY29uc3RydWN0b3JzIHRvIHN0ZDo6cGFpciB3cmFwcGVycyAoc3RkX3BhaXIuaSkgZm9yIGFsbCBsYW5ndWFnZXMuCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHN0ZDo6cGFpciB3cmFwcGVycyBpbiBzdGRfcGFpci5pCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBDIyAnbmV3JyBhbmQgJ292ZXJyaWRlJyBtb2RpZmllcnMgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBhIEMrKyBjbGFzcyBpbmhlcml0cyBtZXRob2RzCiAgICAgICAgICAgIHZpYSBhIEMrKyAndXNpbmcnIGRlY2xhcmF0aW9uLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgcHJldmlvdXNseSBiZWluZyBpZ25vcmVkIGluIGNsYXNzZXMgdGhhdCBpbmhlcml0ZWQgbWV0aG9kcwogICAgICAgICAgICBmcm9tICd1c2luZycgZGVjbGFyYXRpb25zLCBlZyBjYWxscyB0byBEZXJpdmVkOjpiYXIgYmVsb3cgd2lsbCBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8KICAgICAgICAgICAgYSB0YXJnZXQgbGFuZ3VhZ2UgZXhjZXB0aW9uL2Vycm9yLCBsaWtlIGl0IGFsd2F5cyBoYXMgZG9uZSBmb3IgQmFzZTo6QmFyLgoKICAgICAgICAgICAgY2xhc3MgQmFzZSB7CiAgICAgICAgICAgICAgdmlydHVhbCBiYXIoKSB0aHJvdyAoc3RkOjpzdHJpbmcpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgewogICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmJhcjsKICAgICAgICAgICAgfTsKCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZXRlY3RpbmcgdmlydHVhbCBtZXRob2RzIGluICVleHRlbmQgZm9yIHRoZSAtZnZpcnR1YWwgb3B0aW9uIGFuZCBDIyBvdmVycmlkZSBhbmQgbmV3CiAgICAgICAgICAgIG1ldGhvZCBtb2RpZmllcnMuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAnbmV3JyBtb2RpZmllciBpcyBub3cgZ2VuZXJhdGVkIG9uIHRoZSBwcm94eSBtZXRob2Qgd2hlbiBhIG1ldGhvZCBpbiBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgaXMgbm90IHBvbHltb3JwaGljIGFuZCB0aGUgc2FtZSBtZXRob2QgZXhpc3RzIGluIHRoZSBkZXJpdmVkIGNsYXNzIChpZSBpdCBoaWRlcwogICAgICAgICAgICB0aGUgYmFzZSBjbGFzcycgbm9uLXZpcnR1YWwgbWV0aG9kKS4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ZXMgdG8gZGV0ZWN0aW9uIG9mIGNvdmFyaWFudCByZXR1cm4gdHlwZXMgLSB3aGVuIHRoZSBjbGFzcyBoaWVyYXJjaHkgaXMgbW9yZQogICAgICAgICAgICB0aGFuIDIgY2xhc3NlcyBkZWVwLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwcyBtb3ZlZCBmcm9tIHN0ZF9zdHJpbmcuaSB0byBzdGRfd3N0cmluZy5pCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGNyYXNoIGluIERvaFN0cnN0ciwgYnVnICMxMTkwOTIxCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBGaXggZm9yIG1ldGhvZHMgd2l0aCBzaW1pbGFyIG5hbWVzIHdoZW4gc2hvd2luZyBsaXN0IG9mIG5hbWVzIG9uIGVycm9yIC0gYnVnICMxMTkxODI4LgogICAgICAgICAgICBQYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gbG9uZyBsb25nIG92ZXJsb2FkaW5nIGZpeCAtIGJ1ZyAjMTE5MTgzNSwgcGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWcgIzExOTY3NTUgdG8gcmVtb3ZlIGRlYnVnIGZyb20gc3dpZ3RjbDguc3dnLgoKMDUvMTkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCAtZnZpcnR1YWwgb3B0aW9uXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyB3aGVuIGEKICAgICAgICAgICAgdmlydHVhbCBtZXRob2QncyByZXR1cm4gdHlwZSB3YXMgYSB0eXBlZGVmIGluIGVpdGhlciB0aGUgYmFzZSBvciBkZXJpdmVkIGNsYXNzLiBBbHNvIGVuc3VyZXMgdGhlCiAgICAgICAgICAgIG1ldGhvZCBpcyBlbGltaW5hdGVkIHdoZW4gdXNpbmcgdGhlIC1mdmlydHVhbCBvcHRpb24uIEZvciBleGFtcGxlLCBEZXJpdmVkLm1ldGhvZCBub3cgaGFzIHRoZSBDIwogICAgICAgICAgICBvdmVycmlkZSBrZXl3b3JkIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQqIEludGVnZXJQdHI7CgogICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgSW50ZWdlclB0ciBtZXRob2QoKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgaW50ICogbWV0aG9kKCkgY29uc3Q7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFtDI10gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IGJlaW5nIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgdmlydHVhbCBtZXRob2RzIHdoZW4gYSBiYXNlIGNsYXNzCiAgICAgICAgICAgIGlzIGlnbm9yZWQgd2l0aCAlaWdub3JlLgoKMDUvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIHJlbW92ZSAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5ncyBpbiBDIHdyYXBwZXJzIHdoZW4gY29tcGlsaW5nIEMgY29kZSB3aXRoICdnY2MgLVdhbGwgLWZzdHJpY3QtYWxpYXNpbmcnLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIE1pY2hhZWwgQ2FoaWxsLiBUaGlzIG1vZGlmaWVzIG1hbnkgb2YgdGhlIGNhc3RzIHNsaWdodGx5LCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikmamFyZzE7CiAgICAgICAgICAgIHRvCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSh2b2lkICopJmphcmcxOwoKMDUvMTIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBDIyBhdHRyaWJ1dGVzLiBDIyBhdHRyaWJ1dGVzIGNhbiBiZSBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIDEpIE9uIGEgQy9DKysgdHlwZSBiYXNpcyBieSBzcGVjaWZ5aW5nIGFuIGluYXR0cmlidXRlcyBhbmQvb3Igb3V0YXR0cmlidXRlcyB0eXBlbWFwIGF0dHJpYnV0ZQogICAgICAgICAgICAgICBpbiB0aGUgaW10eXBlIG9yIGNzdHlwZSB0eXBlbWFwcyAoZm9yIEMjIHJldHVybiB0eXBlIG9yIEMjIHBhcmFtZXRlciB0eXBlIGF0dHJpYnV0ZXMpLgogICAgICAgICAgICAyKSBPbiBhIHdyYXBwZWQgbWV0aG9kIG9yIHZhcmlhYmxlIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgZmVhdHVyZSAoJWZlYXR1cmUpLgogICAgICAgICAgICAzKSBPbiBhIHdyYXBwZWQgcHJveHkgY2xhc3Mgb3IgZW51bSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIHR5cGVtYXAuCgogICAgICAgICAgICBFeGFtcGxlcyBhcmUgaW4gdGhlIEMjIGRvY3VtZW50YXRpb24gKENTaGFycC5odG1sKS4KCjA0LzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBjb25maWd1cmUgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoZSBkZWZhdWx0IG1heGltdW0gY29tcGlsZXIgd2FybmluZyBhcwogICAgICAgICAgICB0aGV5IGNvdWxkbid0IGJlIHJlbW92ZWQgZXZlbiB3aGVuIG92ZXJyaWRpbmcgQ0ZMQUdTIGFuZCBDWFhGTEFHUyB3aXRoIGNvbmZpZ3VyZQogICAgICAgICAgICAoLi9jb25maWd1cmUgQ0ZMQUdTPSBDWFhGTEFHUz0pLiBUbyB0dXJuIHRoZSBtYXhpbXVtIHdhcm5pbmdzIG9mZiwgcnVuOiAgCgogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1tYXhpbXVtLWNvbXBpbGUtd2FybmluZ3MKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIHdoaWNoIHJld29ya3MgdGhlIEphdmEgY29uc3RydWN0b3IgYW5kIGZpbmFsaXplL2Rlc3RydWN0b3IgdHlwZW1hcHMsCiAgICAgICAgICAgIGZvciBkaXJlY3RvcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3ZlcmFsbCBKYXZhIHR5cGVtYXBzLiBBZGRlZCB0aGUgZGlyZWN0b3JfdGFrZSBhbmQgCiAgICAgICAgICAgIGRpcmVjdG9yX3JlbGVhc2UgdHlwZW1hcHMgdG8gZW11bGF0ZSBvdGhlciBtb2R1bGVzJyBfX2Rpc293bl9fIGZ1bmN0aW9uYWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeGVkIHByb2JsZW1zIGR1ZSB0byB0aGUgb3ZlciBlYWdlciBnYXJiYWdlIGNvbGxlY3Rvci4gT2NjYXNpb25hbGx5IHRoZQogICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3b3VsZCBjb2xsZWN0IGEgQyMgcHJveHkgY2xhc3MgaW5zdGFuY2Ugd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQKICAgICAgICAgICAgaW4gdW5tYW5hZ2VkIGNvZGUgaWYgdGhlIG9iamVjdCB3YXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGEgd3JhcHBlZCBmdW5jdGlvbi4KICAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5IHRoaXMgY2F1c2VkIGhhdm9jIGFzIHRoZSBDIyBwcm94eSBjbGFzcyBjYWxscyB0aGUgQysrIGRlc3RydWN0b3IKICAgICAgICAgICAgd2hlbiBpdCBpcyBjb2xsZWN0ZWQuIFByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzIG5vdyB1c2UgYSBIYW5kbGVSZWYsCiAgICAgICAgICAgIHdoaWNoIGhvbGRzIGFuIEludFB0ciwgaW5zdGVhZCBvZiBhIHBsYWluIEludFB0ciB0byBtYXJzaGFsIHRoZSBDKysgcG9pbnRlciB0byB1bm1hbmFnZWQKICAgICAgICAgICAgY29kZS4gVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoaXMKICAgICAgICAgICAgbW9kaWZpY2F0aW9uLgoKICAgICAgICAgICAgVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSBzd2lnQ1B0ciBpcyBub3cgb2YgdHlwZSBIYW5kbGVSZWYKICAgICAgICAgICAgaW5zdGVhZCBvZiBJbnRQdHIgYW5kIGNvbnNlcXVlbnRseSB0aGUgZ2V0Q1B0ciBtZXRob2QgcmV0dXJuIHR5cGUgaGFzIGFsc28gY2hhbmdlZC4gVGhlIG5ldAogICAgICAgICAgICBlZmZlY3QgaXMgdGhhdCBhbnkgY3VzdG9tIHdyaXR0ZW4gdHlwZW1hcHMgbWlnaHQgaGF2ZSB0byBiZSBtb2RpZmllZCB0byBzdWl0ZS4gQWZmZWN0ZWQgdXNlcnMKICAgICAgICAgICAgc2hvdWxkIG5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgbmV3ICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgaW10eXBlIHR5cGVtYXAgYXMgdGhlCiAgICAgICAgICAgIGlucHV0IHR5cGUgaXMgbm93IGEgSGFuZGxlUmVmIGFuZCB0aGUgb3V0cHV0IHR5cGUgaXMgc3RpbGwgYW4gSW50UHRyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgYXN5bW1ldHJpYyB0eXBlIG1hcnNoYWxsaW5nIGFkZGVkLiBTb21ldGltZXMgdGhlIG91dHB1dCB0eXBlIG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRpZmZlcmVudCB0byB0aGUgaW5wdXQgdHlwZS4gU3VwcG9ydCBmb3IgdGhpcyBjb21lcyBpbiB0aGUgZm9ybSBvZiBhIG5ldyBvcHRpb25hbCAnb3V0JwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBjdHlwZSwgaW10eXBlIGFuZCBjc3R5cGUgdHlwZW1hcHMuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgbm90CiAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgaXMgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwLCBhcyBoYXMgYWx3YXlzIHByZXZpb3VzbHkgYmVlbiB0aGUgY2FzZS4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgIHRoZW4gdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igb3V0cHV0IHR5cGVzIGFuZCB0aGUgdHlwZSBzcGVjaWZpZWQKICAgICAgICAgICAgaW4gdGhlIHR5cGVtYXAgaXRzZWxmIGlzIHVzZWQgZm9yIHRoZSBpbnB1dCB0eXBlLiBBbiBvdXRwdXQgdHlwZSBpcyBhIHJldHVybiB2YWx1ZSBmcm9tCiAgICAgICAgICAgIGEgd3JhcHBlZCBtZXRob2Qgb3Igd3JhcHBlZCBjb25zdGFudCBhbmQgYW4gaW5wdXQgdHlwZSBpcyBhIHBhcmFtZXRlciBpbiBhIHdyYXBwZWQgbWV0aG9kLgoKICAgICAgICAgICAgQW4gZXhhbXBsZSBzaG93cyB0aGF0IGNoYXIgKiBjb3VsZCBiZSBtYXJzaGFsbGVkIGluIGRpZmZlcmVudCB3YXlzLCAKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW10eXBlLCBvdXQ9IkludFB0ciIpIGNoYXIgKiAic3RyaW5nIgogICAgICAgICAgICAgIGNoYXIgKiBmdW5jdGlvbihjaGFyICopOwoKICAgICAgICAgICAgVGhlIG91dHB1dCB0eXBlIGlzIHRodXMgSW50UHRyIGFuZCB0aGUgaW5wdXQgdHlwZSBpcyBzdHJpbmcuIFRoZSByZXN1bHRpbmcgaW50ZXJtZWRpYXJ5IEMjIGNvZGUgaXM6CgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIEludFB0ciBmdW5jdGlvbihzdHJpbmcgamFyZzEpOwoKMDQvMjIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IGdlbmVyYXRpb24gb2YgImRlZmluZS1tZXRob2QiIGZvciBtZXRob2RzIG9mCgkgICAgY2xhc3NlcyB3aXRoIGEgY29uc3RydWN0b3IuICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjA0LzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgIEZvciB3cmFwcGVkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgKHVzaW5nIGFyZ291dCksCgkgICAgU1dJRyBDSElDS0VOIG5vdyByZXR1cm5zIHRoZW0gYXMgbXVsdGlwbGUgdmFsdWVzIGluc3RlYWQgb2YgYXMKCSAgICBhIGxpc3QuICBUaGV5IGNhbiB0aGVuIGJlIGFjY2Vzc2VkIHVzaW5nIChjYWxsLXdpdGgtdmFsdWVzKS4KCjA0LzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0KICAgICAgICAgICAgKyBBZGRlZCBhIHdob2xlIGJ1bmNoIG9mIG5ldyBfcnVubWUgc2NyaXB0cyBpbnRvIHRoZSBjaGlja2VuIHRlc3QKICAgICAgICAgICAgc3VpdGUuICBBbHNvIGZpeCBzb21lIGJ1Z3MgdGhlc2UgbmV3IHNjcmlwdHMgdHVybmVkIHVwLgoKICAgICAgICAgICAgKyBBZGRlZCBvcHRpbWl6YXRpb24gd2hlbiByZXR1cm5pbmcgYSB3cmFwcGVkIHByb3h5IGNsYXNzLiAgQmVmb3JlLAogICAgICAgICAgICBhIG1pbm9yIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgaW52b2tlZCBldmVyeSB0aW1lIGEgZnVuY3Rpb24gcmV0dXJuZWQuCgoJICAgICsgQWxsIHRoZSBjaGlja2VuIEV4YW1wbGVzIHNob3VsZCBub3cgcnVuIGNvcnJlY3RseQoKMDQvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB0eXBlbWFwIG1hdGNoaW5nIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBpbiBwYXJ0aWN1bGFyCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBzbyB0aGF0IHN0ZDo6c3RyaW5nIHZhcmlhYmxlcyBjYW4gYmUgZWFzaWx5IG1hcnNoYWxsZWQgd2l0aAogICAgICAgICAgICBhIEMjIHN0cmluZyBwcm9wZXJ0eSB1c2luZzoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9zdHJpbmcuaSIKICAgICAgICAgICAgICAlYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp2YXJpYWJsZV9uYW1lIH07CiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZTsKCiAgICAgICAgICAgIChSZWNhbGwgdGhhdCBhbGwgY2xhc3MgdmFyaWFibGVzIGFyZSB3cmFwcGVkIHVzaW5nIHBvaW50ZXJzKQoKMDQvMDUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBBZGRlZCBFeGFtcGxlcy9jaGlja2VuL2VnZywgYW4gZXhhbXBsZSBvbiBob3cgdG8gYnVpbGQgYSBjaGlja2VuCgkgICAgICBleHRlbnNpb24gbGlicmFyeSBpbiB0aGUgZm9ybSBvZiBhbiBlZ2cuICBBbHNvIHVwZGF0ZWQgdGhlCgkgICAgICBkb2N1bWVudGF0aW9uIG9uIHRoZSBkaWZmZXJlbnQgbGlua2luZyBvcHRpb25zLgoKCSAgICArIGNoaWNrZW4gdGVzdC1zdWl0ZSBub3cgaGFzIHN1cHBvcnQgdG8gY2hlY2sgU1dJRyB3aXRoIHRoZSAtcHJveHkKCSAgICAgIGFyZ3VtZW50IGlmIHRoZXJlIGV4aXN0cyBhIF9wcm94eV9ydW5tZS5zcyBmaWxlLgoKCSAgICArIE1vcmUgZml4ZXMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCAtcHJveHkKCjAzLzMxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFR1cm5lZCBvbiBleHRyYSB0ZW1wbGF0ZSBmZWF0dXJlcyBmb3IgYWxsIGxhbmd1YWdlcyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHByZXZpb3VzbHkgb25seSBhdmFpbGFibGUgdG8gUHl0aG9uLgoKICAgICAgICAgICAgVGhpcyBlbmFibGVzIHR5cGVtYXBzIGRlZmluZWQgd2l0aGluIGEgdGVtcGxhdGVkIGNsYXNzIHRvIGJlIHVzZWQgYXMKICAgICAgICAgICAgZXhwZWN0ZWQuIFJlcXVpcmVzICV0ZW1wbGF0ZSBvbiB0aGUgdGVtcGxhdGVkIGNsYXNzLCAldGVtcGxhdGUoKSB3aWxsCiAgICAgICAgICAgIGFsc28gcGljayB1cCB0aGUgdHlwZW1hcHMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vPFQ+ICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb19pKSBGb288aW50PjsKICAgICAgICAgICAgICAldGVtcGxhdGUoKSBGb288ZG91YmxlPjsKICAgICAgICAgICAgICAKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSB0aGUgcHJvcGVyICdpbicgdHlwZW1hcHMgd2hlcmV2ZXIgRm9vPGludD4gYW5kIEZvbzxkb3VibGU+CiAgICAgICAgICAgIGFyZSB1c2VkLgoKMDMvMzAvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gUGF0Y2ggZnJvbSBIYW5zIE9lc3RlcmhvbHQgZm9yIHN1cHBvcnRpbmcgTXpTY2hlbWUgMzB4LgoKMDMvMjkvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBSZWFsbG93IG9sZGVyIHZlcnNpb25zIG9mIGNoaWNrZW4gKDEuNDAgdG8gMS44OSkgYnkgcGFzc2luZyAtbm9jb2xsZWN0aW9uCgkgICAgICBhcmd1bWVudCB0byBTV0lHCgkgICAgKyAlaW1wb3J0IG5vdyB3b3JrcyBjb3JyZWN0bHkgd2l0aCB0aW55Y2xvcy4gIChkZWNsYXJlICh1c2VzIC4uLikpIHdpbGwgYmUKCSAgICAgIGV4cG9ydGVkIGNvcnJlY3RseS4KCSAgICArIFRpbnlDTE9TIHByb3h5IGNsYXNzZXMgbm93IHdvcmsgY29ycmVjdGx5IHdpdGggb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICAgIGFuZCBjb25zdHJ1Y3RvcnMuCgowMy8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9yb3V0IHR5cGVtYXBzLiBKYXZhIGRpcmVjdG9ycwogICAgICAgICAgICByZXF1aXJlIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwcyBsaWtlIHRoZSBvdGhlciBsYW5ndWFnZXMgbm93LiBUaGUgbmV3CiAgICAgICAgICAgIHR5cGVtYXBzIHByb3ZpZGUgZml4ZXMgZm9yIG1ldGhvZHMgd2hlcmUgdGhlIHJldHVybiB0eXBlIGlzIHJldHVybmVkCiAgICAgICAgICAgIGJ5IHJlZmVyZW5jZSAodGhpcyBjYW5ub3QgYXV0b21hdGljYWxseSBiZSBtYWRlIHRocmVhZCBzYWZlIHRob3VnaCkuCgowMy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBFbnVtIGNhc3RpbmcgZml4ZXMuIFZpc3VhbCBDKysgZGlkbid0IGxpa2UgdGhlIEMgdHlwZSBjYXN0aW5nIFNXSUcgcHJvZHVjZWQKICAgICAgICAgICAgd2hlbiB3cmFwcGluZyBDKysgZW51bSByZWZlcmVuY2VzLCBhcyByZXBvcnRlZCBieSBBZG1pcmUgS2FuZGF3YXN2aWthLgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFNGICMxMTI0NDkwLiBGaXggUGVybCBtYWNybyBjbGFzaGVzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbydzIFNUTCBzdHJpbmcsCiAgICAgICAgICAgIHNvIG5vdyBwcm9qZWN0cyBjYW4gI2luY2x1ZGUgPHN0cmluZz4uCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAldmFyYXJncyB3aGljaCBnb3QgYnJva2VuIHdpdGggdGhlIHJlY2VudCBkZWZhdWx0IGFyZ3VtZW50IGNoYW5nZXMuCiAgICAgICAgICAgIEFsc28gd29ya3MgZm9yIEphdmEgYW5kIEMjIGZvciB0aGUgZmlyc3QgdGltZSBub3cuCgowMy8xNy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICsgRml4IGEgd2hvbGUgYnVuY2ggb2YgYnVncyBpbiB0aGUgY2hpY2tlbiBtb2R1bGUuICBUaGUgZW50aXJlCiAgICAgICAgICAgICAgdGVzdCBzdWl0ZSBub3cgY29tcGlsZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgdGVzdHMgdGhhdCByZXF1aXJlCgkgICAgICBzdGRfdmVjdG9yLmksIHN0ZF9kZXF1ZS5pLCBhbmQgc28gb24sIHdoaWNoIGNoaWNrZW4gZG9lcyBub3QgaGF2ZSB5ZXQuCgoJICAgICsgQWRkIHN1cHBvcnQgZm9yICVleGNlcHRpb24gYW5kICV0eXBlbWFwKGV4Y2VwdGlvbnMpLiAgRXhjZXB0aW9ucyBhcmUKCSAgICAgIHRocm93biB3aXRoIGEgY2FsbCB0byAoYWJvcnQpIGFuZCBjYW4gYmUgaGFuZGxlZCBieSAoaGFuZGxlLWV4Y2VwdGlvbnMpCgowMy8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9ycy4gTW9kaWZpY2F0aW9ucyB0byB0aGUgdHlwZW1hcHMKICAgICAgICAgICAgZ2l2aW5nIHVzZXJzIGZpbmUgY29udHJvbCBvdmVyIG1lbW9yeSBvd25lcnNoaXAgYW5kIGxpZmV0aW1lIG9mIGRpcmVjdG9yIGNsYXNzZXMuCiAgICAgICAgICAgIERpcmVjdG9yIGNsYXNzZXMgbm8gbG9uZ2VyIGxpdmUgZm9yZXZlciBieSBkZWZhdWx0IGFzIHRoZXkgYXJlIG5vdyBjb2xsZWN0YWJsZQogICAgICAgICAgICBieSB0aGUgR0MuCgowMy8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gQWRkIHN1cHBvcnQgZm9yIGFkZGluZyBmaW5hbGl6ZXJzIGdhcmJhZ2UgY29sbGVjdGVkIG9iamVjdHMuCgkgICAgRnVuY3Rpb25zIHRoYXQgcmV0dXJuIG5ldyBvYmplY3RzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IGFuZAoJICAgIGlucHV0IGFyZ3VtZW50cyB3aGljaCBjb25zdW1lIChvciB0YWtlIG93bmVyc2hpcCkgb2YgYSBwb2ludGVyIHNob3VsZAoJICAgIGJlIG1hcmtlZCB3aXRoIHRoZSBESVNPV04gdHlwZW1hcC4KCgkgICAgQWxzbyBhZGQgc3VwcG9ydCBmb3IgY29ycmVjdGx5IGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZAoJICAgIHRvIGEgZnVuY3Rpb24sIGFuZCByYWlzaW5nIGFuIGVycm9yIGlmIHRoZSB3cm9uZyBudW1iZXIgYXJlIHBhc3NlZC4KCjAzLzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBBZGQgLS13aXRob3V0LWFsbGxhbmcgb3B0aW9uIHRvIGNvbmZpZ3VyZS5pbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKICAgICAgICAgICAgcGFzc2luZyBhbGwgdGhlIC0td2l0aG91dC1weXRob24gLS13aXRob3V0LXBlcmw1IGV0Yy4uLiB0aGF0IE1hdHRoaWFzIGFkZGVkLgoKMDMvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gTWVtb3J5IGxlYWsgZml4IGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGNsYXNzZXMvc3RydWN0cyBieSB2YWx1ZS4KCjAzLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggZm9yIFBlcmwgaW5jb3JyZWN0bHkgdGFraW5nIG1lbW9yeSBvd25lcnNoaXAgZm9yIHJldHVybiB0eXBlcyB0aGF0CiAgICAgICAgICAgIGFyZSB0eXBlZGVmcyB0byBhIHN0cnVjdC9jbGFzcyBwb2ludGVyLiBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVmFyaW91cyBleGNlcHRpb24gY2hhbmdlcyBmb3IgdGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGVzZSBub3cgbW9yZQogICAgICAgICAgICBhY2N1cmF0ZWx5IG1pcnJvciB0aGUgc2FtZSBleGNlcHRpb25zIHRoYXQgU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCB0aHJvdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgYWZ0ZXIgYW55IG9mIHRoZSBzdGQ6OnZlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHRocm93IGFuIGV4Y2VwdGlvbi4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gV2hlbiBudWxsIGlzIHBhc3NlZCBmb3IgYSBDKysgcmVmZXJlbmNlIG9yIHZhbHVlIHBhcmFtZXRlciwgdGhlIAogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duIGhhcyBiZWVuIGNvcnJlY3RlZCB0byBhbiBBcmd1bWVudE51bGxFeGNlcHRpb24gaW5zdGVhZAogICAgICAgICAgICBvZiBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIGFzIHJlY29tbWVuZGVkIGluIHRoZSAuTkVUIEZyYW1ld29yayBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIHR1cm4gYSBDKysgZXhjZXB0aW9uIGludG8gYW4gQXBwbGljYXRpb25FeGNlcHRpb24sCiAgICAgICAgICAgIG5vdCBhIFN5c3RlbUV4Y2VwdGlvbiBub3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE51bWVyb3VzIGNoYW5nZXMgaW4gQyMgZXhjZXB0aW9uIGhhbmRsaW5nIGhhdmUgYmVlbiBtYWRlIG92ZXIgdGhlIHBhc3QKICAgICAgICAgICAgZmV3IHdlZWtzLiBBIHN1bW1hcnkgZm9sbG93czoKCiAgICAgICAgICAgIFRoZSB3YXkgaW4gd2hpY2ggQysrIGV4Y2VwdGlvbnMgYXJlIG1hcHBlZCB0byBDIyBleGNlcHRpb25zIGlzIHF1aXRlIGRpZmZlcmVudC4KICAgICAgICAgICAgVGhlIGNoYW5nZSBpcyB0byBmaXggQyMgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZSBDKysgZXhjZXB0aW9uIHN0YWNrIGlzIGNvcnJlY3RseQogICAgICAgICAgICB1bndvdW5kIGFzIHByZXZpb3VzbHkgQysrIGV4Y2VwdGlvbnMgd2VyZSBiZWluZyB0aHJvd24gYWNyb3NzIHRoZSBDIFBJbnZva2UgbGF5ZXIKICAgICAgICAgICAgaW50byB0aGUgbWFuYWdlZCB3b3JsZC4KCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIGF0dHJpYnV0ZXMgKGNhbnRocm93IGFuZCBleGNvZGUpIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIHRvIGNvbnRyb2wgdGhlCiAgICAgICAgICAgIG1hcHBpbmcgb2YgQysrIHRvIEMjIGV4Y2VwdGlvbnMuIEVzc2VudGlhbGx5IGEgY2FsbGJhY2sgaW50byB0aGUgdW5tYW5hZ2VkIHdvcmxkCiAgICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcGVuZGluZyBleGNlcHRpb24uIFRoZSBleGNlcHRpb24gdG8gdGhyb3cgaXMgc3RvcmVkIGluIHRocmVhZCBsb2NhbAogICAgICAgICAgICBzdG9yYWdlIChzbyB0aGUgYXBwcm9hY2ggaXMgdGhyZWFkLXNhZmUpLiBUaGUgdHlwZW1hcHMgYXJlIGV4cGVjdGVkIHRvIHJldHVybgogICAgICAgICAgICBmcm9tIHVubWFuYWdlZCBjb2RlIGFzIHNvb24gYXMgdGhlIHBlbmRpbmcgZXhjZXB0aW9uIGlzIHNldC4gQW55IHBlbmRpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBhcmUgY2hlY2tlZCBmb3IgYW5kIHRocm93biBvbmNlIG1hbmFnZWQgY29kZSBzdGFydHMgZXhlY3V0aW5nLiBUaGVyZSBzaG91bGQKICAgICAgICAgICAgYmUgbWluaW1hbCBpbXBhY3Qgb24gZXhlY3V0aW9uIHNwZWVkIGR1cmluZyBub3JtYWwgYmVoYXZpb3VyLiBGdWxsIGRldGFpbHMgd2lsbCBiZQogICAgICAgICAgICBkb2N1bWVudGVkIGluIENTaGFycC5odG1sLgoKICAgICAgICAgICAgVGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oKSBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoIHRoZQogICAgICAgICAgICBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCgpIGFuZCBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb24oKQogICAgICAgICAgICBmdW5jdGlvbnMuIFRoZSBvcmlnaW5hbCBuYW1lIGhhcyBiZWVuIGRlbGliZXJhdGVseSBjaGFuZ2VkIHRvIGJyZWFrIG9sZCBjb2RlIGFzCiAgICAgICAgICAgIHRoZSBvbGQgYXBwcm9hY2ggd2FzIHNvbWV3aGF0IGZsYXdlZC4gQW55IHVzZXIgZGVmaW5lZCBleGNlcHRpb25zIHRoYXQgZm9sbG93IHRoZQogICAgICAgICAgICBzYW1lIHBhdHRlcm4gYXMgdGhlIG9sZCBhcHByb2FjaCBzaG91bGQgYWxzbyBiZSBmaXhlZC4KCiAgICAgICAgICAgIE51bWVyb3VzIG5ldyAuTkVUIGZyYW1ld29yayBleGNlcHRpb25zIGFyZSBub3cgYXZhaWxhYmxlIGZvciBlYXN5IHRocm93aW5nIGZyb20gCiAgICAgICAgICAgIHVubWFuYWdlZCBjb2RlLiBUaGUgY29tcGxldGUgbGlzdCBpczogCgogICAgICAgICAgICAgIEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBBcml0aG1ldGljRXhjZXB0aW9uLCBEaXZpZGVCeVplcm9FeGNlcHRpb24sIAogICAgICAgICAgICAgIEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiwgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIAogICAgICAgICAgICAgIE51bGxSZWZlcmVuY2VFeGNlcHRpb24sIE91dE9mTWVtb3J5RXhjZXB0aW9uLCBPdmVyZmxvd0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgU3lzdGVtRXhjZXB0aW9uLCBBcmd1bWVudEV4Y2VwdGlvbiwgQXJndW1lbnROdWxsRXhjZXB0aW9uIGFuZAogICAgICAgICAgICAgIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8wNS8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBGaXggc2V2ZXJhbCBtZW1vcnkgbGVha3MgYXJvdW5kLiBFdmVuIHdoZW4gd2Ugc3Vydml2ZSAga25vd25pbmcKCSAgICBzd2lnIGlzIGEgbWVtb3J5IGxlYWsgZmFjdG9yeSwgaXQgd2FzIGEgbGl0dGxlIG91dCBvZgoJICAgIGNvbnRyb2wuIFRvIHJ1biBzdGRfY29udGFpbmVycy5pIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZSwKCSAgICBzd2lnIHdhcyB1c2luZyB+MjYwTUIsIG5vdyBpdCB1c2VzICdvbmx5JyB+NDBNQiwgd2hpY2ggaXMKCSAgICB0aGUgc2FtZSBhbW1vdW50IHRoYXQgZysrIHVzZXMsIHNvLCBpcyBub3QgdGhhdCBiYWQuCgkgICAgSW4gdGhlIHByb2Nlc3MsIEkgZm91bmQgYSBjb3VwbGUgb2YgZXh0cmEgRGVsZXRlcywgd2hpY2gKCSAgICBpbiBzb21lIGNhc2VzIGNvdWxkIHRyaWdnZXIgc2VnLiBmYXVsdHMgYW5kL29yCgkgICAgRE9IL2Fzc2VydHMuCgkgICAgCgkgICAgW3B5dGhvbl0gQmV0dGVyIHN1cHBvcnQgZm9yIGRpcmVjdG9ycyArIGV4Y2VwdGlvbi4gTW9yZQoJICAgIHZlcmJvc2UgZXJyb3JzIGFuZCBhZGRlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYW5kbGVyLgoKCSAgICBbcHl0aG9uXSBGaXggbWVtb3J5IGxlYWsgZm9yIHRoZQoKCSAgICAJICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPiAKCgkgICAgY2FzZSxyZXBvcnRlZCBieSBCbyBQZW5nLgoKCSAgICBbcHl0aG9uXSBGaXggU3dpZ1B5T2JqZWN0IGNvbXBhcmUgcHJvYmxlbSByZXBvcnRlIGJ5CgkgICAgQ2FtZXJvbiBQYXRyaWNrLiAKCgkgICAgW3B5dGhvbl0gRml4IHNldmVyYWwgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIAoJICAgIGZvciBnbnUtZ2NjLCBJbnRlbCBhbmQgVkM3LjEgIGNvbXBpbGVycy4KCgowMi8yNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byB1c2UgQ1NTIGFuZCA8ZGl2PiBpbnN0ZWFkIG9mIDxibG9ja3F1b3RlPgoJICAgIEkgdXNlZCBhIHNjcmlwdCB0byBjb252ZXJ0IHRoZSBkb2NzLCBhbmQgaXQgc2V0IGFsbCB0aGUgYm94IGNsYXNzZXMKCSAgICB0byBiZSAiY29kZSIuICBUaGVyZSBhcmUgYWN0dWFsbHkgNCBkaWZmZXJlbnQgY2xhc3NlcywKCSAgICAic2hlbGwiLCAiY29kZSIsICJ0YXJnZXRsYW5nIiwgYW5kICJkaWFncmFtIi4gIFdlIG5lZWQgdG8gZ28gdGhyb3VnaAoJICAgIGFuZCBjb252ZXJ0IHRoZSBkaXZzIGRlcGVuZGluZyBvbiB3aGF0IHRoZXkgY29udGFpbi4KCjAyLzIzLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRlZCBvcHRpb24gLW5vcnR0aSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgbmF0aXZlCgkgICAgQysrIFJUVEkgd2l0aCBkaXJlY3RvcnMgKGR5bmFtaWNfY2FzdDw+IGlzIG5vdCB1c2VkKS4KCgkgICAgQWRkIG1vcmUgY29kZSBmb3IgZGlyZWN0b3JzIHRvIGRldGVjdCBhbmQgcmVwb3J0IGVycm9ycyBpbgoJICAgIHRoZSBweXRob24gc2lkZS4KCgkgICAgRXh0ZW5kIHRoZSB1c2Ugb2YgU1dJR0lOVEVSTiB3aGVuZXZlciBpcyBwb3NzaWJsZS4KCgkgICAgUmVtb3ZlIHRlbXBsYXRlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IFZDNy4xLgoKCSAgICBSZW1vdmUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgZ2NjL2crKy4gRmluYWxseSB5b3UgY2FuCgkgICAgY29tcGlsZSB1c2luZwoKCSAgICAgICBnKysgLVcgLVdhbGwgLWMgbXltb2R1bGVfd3JhcC5jeHgKCgkgICAgYW5kIG5vIHNwdXJpb3VzIGVycm9ycyB3aWxsIGJlIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlcgoJICAgIGNvZGUuCgowMi8yMy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBBZGRlZCAtZXh0ZXJuYWwtcnVudGltZSBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkdW1wCgkgICAgb3V0IGFsbCB0aGUgY29kZSBuZWVkZWQgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgcnVudGltZSBzeXN0ZW0sCgkgICAgYW5kIGl0IHJlcGxhY2VzIGluY2x1ZGluZyB0aGUgZmlsZXMgZGlyZWN0bHkuICBUaGlzIGNoYW5nZSBhZGRzCgkgICAgdHdvIG5ldyB2aXJ0dWFsIGZ1bmN0aW9ucyB0byB0aGUgTGFuZ3VhZ2UgY2xhc3MsIHdoaWNoIGFyZSB1c2VkCgkgICAgdG8gZmluZCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgcnVudGltZSBjb2RlLiAgSSBhbHNvIHVwZGF0ZWQKCSAgICBhbGwgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSBydW50aW1lIHRvIGltcGxlbWVudCB0aGVzZSB0d28gZnVuY3Rpb25zLgoKMDIvMjIvMjAwNTogbW1hdHVzIAoJICAgIEZpeCAldGVtcGxhdGUgKyBwcml2YXRlIGVycm9yIFNGIzEwOTk5NzYuCgowMi8yMS8yMDA1OiBtbWF0dXMgCgoJICAgIEZpeCBzd2lncnVuLnN3ZyB3YXJuaW5ncyByZXBvcnRlZCB3aGVuIHVzaW5nICJnY2MgLVcgLVdhbGwiCgkgICAgKHN0YXRpYy9pbmxpbmUgbm90IHVzZWQgaW4gZnJvbnQgb2YgYSBmdW5jdGlvbgoJICAgIGRlY2xhcmF0aW9uKSwgYW5kIGFkZCBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZAoJICAgIHVudXNlZCB3YXJuaW5ncyBlbHNld2hlcmUuCgoJICAgIEZpeCB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3MuCgoJICAgIFtQeXRob25dIFVzZSBuZXcgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQgd2FybmluZ3MgaW4KCSAgICBTV0lHSU5URVJOIG1ldGhvZHMuCgoJICAgIFtQeXRob25dIEZpeCBQeU9TX3NucHJpbnRmIGZvciBweXRob24gdmVyc2lvbnMgPCAyLjIgKFNGICMxMTA0OTE5KS4KCgkgICAgW1B5dGhvbl0gRml4IG1hcC9tdWx0aW1hcCB0byBhbGxvdyBlbXB0eSBtYXBzIChyZXBvcnRlZCBieQogIAkgICAgUGhpbGlwcGUgSGV0cm95KS4KCgkgICAgW0RvY3NdIEFkZCBzb21lIGRvY3VtZW50YXRpb24gdG8gUHl0aG9uLmh0bWwgYW5kCgkgICAgU1dJR1BsdXMuaHRtbCwgaW5jbHVkaW5nIGZvciBleGFtcGxlIHRoZSBmYWN0IHRoYXQKCSAgICAnZnJpZW5kcycgYXJlIG5vdyBzdXBwb3J0ZWQuCgowMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUEhQXSBQYXRjaCBmcm9tIE9sbHkgQmV0dHMsIHNvIHRoYXQgd3JhcHBlcnMgY29tcGlsZSB3aXRoIFplbmQgdGhyZWFkIHNhZmV0eSBlbmFibGVkLgoKMDIvMTcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTWVtb3J5IGxlYWsgZml4IGluIHNvbWUgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBtb2R1bGVzIHdoZW4gdXNpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgaW4gY29uc3RydWN0b3JzLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlIHdhcyBub3QgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUKICAgICAgICAgICAgQysrIG9iamVjdCBtZW1vcnkgd2hlbiBhbnkgb2YgdGhlIGNvbnN0cnVjdG9ycyB0aGF0IHVzZSBkZWZhdWx0IGFyZ3VtZW50cyB3YXMgY2FsbGVkLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzExMTUwNTU6IEZhaWxlZCBtYWtlIGluc3RhbGwuIFBhdGNoIGZyb20gUm9iIFN0b25lLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGICMxMTIzNDE2IGZyb20gUGF1bCBNb29yZS4gQ29ycmVjdCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgU1RSSU5HQVJSQVkKICAgICAgICAgICAgdHlwZW1hcHMgaW4gdmFyaW91cy5pLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRGlzYWJsZWQgdHlwZW1hcCBzZWFyY2ggY2hhbmdlcyBmb3Igbm93IChzZWUgZW50cnkgMTkvMTIvMjAwNCkuIEl0IGJyZWFrcwogICAgICAgICAgICBvbGQgdHlwZW1hcHMsIGxlbmd0aGVucyB0aGUgZXhlY3V0aW9uIHRpbWUgYnkgYWJvdXQgMjUlIGFuZCBpbnRyb2R1Y2VzCiAgICAgICAgICAgIGluY29uc2lzdGVuY2llcy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIHN3aWcgLWhlbHAgZm9sbG93cyBvdGhlciBzb2Z0d2FyZSBieSBwcmludGluZyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBzd2lnIC12ZXJzaW9uIGFsc28gZGlzcGxheXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgQmVoYXZpb3VyIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggZm9yIHRoZSBsZXNzIGNvbW1vbmx5IHVzZWQgb3JkZXJpbmcgb2YgJWluY2x1ZGUgYW5kICNpbmNsdWRlLCBzbwogICAgICAgICAgICB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcy4gQnVnIHJlcG9ydGVkIGJ5IHJlcG9ydGVkIGJ5IE1heCBCb3dzaGVyLgogICAgICAgICAgICAgICVpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV9IAoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBTV0lHX2V4Y2VwdGlvbiBtYWNybyB3aWxsIG5vdyByZXR1cm4gZnJvbSB1bm1hbmFnZWQgY29kZSAvIG5hdGl2ZSBjb2RlCiAgICAgICAgICAgIGFzIHNvb24gYXMgaXQgaXMgY2FsbGVkLiBGaXhlcyBwb3NzaWJsZSBKVk0gY3Jhc2hlcyBhbmQgb3RoZXIgY29kZSB1bmV4cGVjdGVkbHkKICAgICAgICAgICAgYmVpbmcgZXhlY3V0ZWQuIE5vdGUgU1dJR19leGNlcHRpb24gaXMgb25seSBvY2Nhc2lvbmFsbHkgdXNlZCBieSBTV0lHIGxpYnJhcnkKICAgICAgICAgICAgd3JpdGVycywgYW5kIGlzIGJlc3QgYXZvaWRlZCBieSBTV0lHIHVzZXJzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBUeXBlbWFwcyBjYW4gbm93IGJlIHRhcmdldGVkIGF0IGdsb2JhbCB2YXJpYWJsZSBuYW1lcwogICAgICAgICAgICBhbmQgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBuYW1lcy4gUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgZm9yIAogICAgICAgICAgICB0aGUgc2V0dGVycyB3ZXJlIGlnbm9yZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IGdsb2JhbGludCAiLi4uIgogICAgICAgICAgICAgIGludCBnbG9iYWxpbnQ7CgowMi8xMy8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGQgJXR5cGVjaGVjayBmb3IgU1dJR1RZUEUsIGFkZCAldHlwZWNoZWNrIGZvciBwdHJkaWZmX3QsIGZpeAoJICAgIHR5cGVtYXBzIGZvciBzaXplX3QuCgoJICAgIFtQaWtlXSBNZXJnZSBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZiBmb3IgaW1wcm92ZWQgUGlrZSBjb25maWd1cmF0aW9uLgoKMDIvMTIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBjb25maWd1cmUgc3dpdGNoZXMgLS13aXRob3V0LXRjbCwgLS13aXRob3V0LXB5dGhvbiBldGMuIGFsbG93IHRvCiAgICAgICAgICAgIGRpc2FibGUgdGhlIHNlYXJjaCBmb3IgaW5zdGFsbGVkIGxhbmd1YWdlcy4KCjAxLzMxLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIEFkZCBEb2hTb3J0TGlzdCB0byBET0gKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW06CiAgICAgICAgICAgICAgICsgU3BlZWQuIFR5cGUgbG9hZGluZyBpcyBub3cgTyhuIGxvZyBuKSBpbnN0ZWFkIG9mIE8oTl4yKSwgd2hpY2gKCSAgICAgICAgIGZvciBsYXJnZSBtb2R1bGVzIGlzIGEgaHVnZSBpbXByb3ZlbWVudC4KICAgICAgICAgICAgICAgKyBBIHdob2xlIGJ1bmNoIG9mIGZ1bmN0aW9ucyBpbiBzd2lncnVuLnN3ZyBubyBsb25nZXIgbmVlZCB0aGUgCiAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2xpc3RfaGFuZGxlIHBhc3NlZCB0byB0aGVtLiAgVGhlIG9ubHkgb25lIGxlZnQgaXMgCgkJIFR5cGVRdWVyeS4gIFRoaXMgYWxzbyBtYWtlcyBydW50aW1lLnN3ZyBhIGxvdCBzbWFsbGVyLgoJICAgICAgICsgU3BsaXQgdXAgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlIGludG8gdHdvIHN0cnVjdHVyZXMKCSAgICAgICAgIChzd2lnX3R5cGVfaW5mbyBhbmQgc3dpZ19jYXN0X2luZm8pCgkgICAgICAgKyBTdG9yZSBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbyByYXRoZXIgdGhhbiBqdXN0IHRoZSB0eXBlCgkgICAgICAgICBuYW1lIHN0cmluZyBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgY2FzdHMuIEZpcnN0IG9mZiwgdGhpcyBtYWtlcwoJICAgICAgICAgdGhlIGd1aWxlIG1vZHVsZSBhIGxpdHRsZSBmYXN0ZXIsIGFuZCBzZWNvbmQsIHRoZQoJICAgICAgICAgU1dJR19UeXBlQ2xpZW50RGF0YSgpIGZ1bmN0aW9uIGlzIGZhc3RlciB0b28uIAoJICAgICAgICsgQWRkIHRoZSBpZGVhIG9mIGEgbW9kdWxlIGludG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlLCBhbGwgdGhlCgkgICAgICAgICB0eXBlcyB3ZXJlIHN0b3JlZCBpbiBvbmUgaHVnZSBsaW5rZWQgbGlzdC4gTm93LCBhbm90aGVyIGxldmVsIGlzCgkgICAgICAgICBhZGRlZCwgYW5kIHRoZSB0eXBlIHN5c3RlbSBzdG9yZXMgYSBsaW5rZWQgbGlzdCBvZiBtb2R1bGVzLCBlYWNoCgkgICAgICAgICBvZiB3aGljaCBzdG9yZXMgYW4gYXJyYXkgb2YgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIGl0LgoJICAgICAgICsgRm9yIG1vcmUgaW5mb3JtYXRpb24gb2YgaG93IHRoZSBydW50aW1lIHR5cGUgc3lzdGVtIG5vdyB3b3JrcywKCSAgICAgICAgIHBsZWFzZSBzZWUgRG9jL01hbnVhbC90eXBlbWFwcy5odG1sIGFuZCBEb2MvRGV2ZWwvcnVudGltZS50eHQKCQkgCgkgICAgLSBVcGRhdGUgYWxsIGxhbmd1YWdlIG1vZHVsZXMgdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBUaGUgY2hhbmdlcwoJICAgICAgdG8gZWFjaCBsYW5ndWFnZSBtb2R1bGUgYXJlIG1pbm9yLiAgQWxsIGxhbmd1YWdlcyBhcmUgbm93IGFibGUgdG8KCSAgICAgIHVzZSBydW50aW1lLnN3ZyBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZQoJICAgICAgb25seSBweXRob24gYW5kIHBlcmwgZGlkLgoKCSAgICAtIFtndWlsZSwgbXpzY2hlbWUsIG9jYW1sLCBhbmQgcGhwNF0gIFRoZXNlIGxhbmd1YWdlcyBvcGVuZWQgdXAgdGhlCgkgICAgICBpbml0IGZ1bmN0aW9uIGluc2lkZSB0aGUgLmN4eCBjb2RlLCBhbmQgYW55IGNvZGUgaW4gdGhlIC5zd2cgZmlsZXMKCSAgICAgIGluIHRoZSBpbml0IHNlY3Rpb24gd2FzIGluc2lkZSB0aGlzIGZ1bmN0aW9uLiAgVGhpcyB3YXMgYSBwcm9ibGVtCgkgICAgICBmb3Igc3dpZ2luaXQuc3dnLCB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIFNXSUdfaW5pdAoJICAgICAgZnVuY3Rpb24gaXMgb3BlbmVkLiAgVGh1cyBJIGNoYW5nZWQgdGhlc2UgbGFuZ3VhZ2VzIHRvIGJlIGxpa2UKCSAgICAgIHB5dGhvbiBvciBwZXJsLCB3aGVyZSB0aGUgaW5pdCBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgLnN3ZwoJICAgICAgZmlsZS4KCSAgICAgIAoJICAgIC0gW1J1YnldIEluc3RlYWQgb2YgbW92aW5nIHRoZSBpbml0IGZ1bmN0aW9uIHRvIHRoZSAuc3dnIGZpbGUsIEkKCSAgICAgIGFkZGVkIGEgbmV3IHNlY3Rpb24gaW5pdGJlZm9yZWZ1bmMsIGFuZCB0aGVuIGFkZGVkCgkgICAgICAlaW5zZXJ0KGluaXRiZWZvcmVmdW5jKSAic3dpZ2luaXQuc3dnIgoKCSAgICAtIFtNelNjaGVtZV0gRml4IGVudW1zIGFuZCBmaXggRXhhbXBsZXMvTWFrZWZpbGUuaW4gc28gdGhhdCBpZgoJICAgICAgbXVsdGlwbGUgLUkgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIElOQ0xVREVTIHZhcmlhYmxlLCBlYWNoCgkgICAgICBnZXRzIGEgKytjY2YuCgoJICAgIC0gW0d1aWxlIEdIXSBVcGRhdGUgR3VpbGUgR0ggdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBTZWUKCSAgICAgIERvYy9NYW51YWwvR3VpbGUuaHRtbCBmb3IgaG93IHNtb2JzIGFyZSBub3cgdXNlZC4KCjAxLzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IHR5cGVtYXAgY2FsbGVkICdjc2NvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuCgogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXAgY2FsbGVkICdqYXZhY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4gQW5vdGhlciB0eXBlbWFwIG5hbWVkICdqYXZhY29uc3RydWN0X2RpcmVjdG9yJwogICAgICAgICAgICBpcyB1c2VkIGluc3RlYWQgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgYSBkaXJlY3RvciBjbGFzcy4KCiAgICAgICAgICAgIFtDIywgSmF2YV0gSWYgYSBDKysgY2xhc3MgZGlkIG5vdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgYSBwcm90ZWN0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRy4gVGhpcyBzZWVtcyBpcyB1bm5lY2Vzc2FyeSBhbmQgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICAgICBhbmQgdGhlcmVieSBnaXZpbmcgdGhlIHVzZXIgYWxtb3N0IGNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGNvZGUgYWxvbmcgd2l0aCB0aGUKICAgICAgICAgICAgbmV3IHR5cGVtYXBzIGFib3ZlLgoKMTkvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtEaXNhYmxlZCwgc2VlIGVudHJ5IDAyLzE1LzIwMDRdCiAgICAgICAgICAgIC0gRml4IHR5cGVtYXAgc2VhcmNoLCBub3cgdGhlICJvdXQiIHR5cGVtYXAgc2VhcmNoIGlzIGRvbmUgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpICAgLT4gIGludCAqRm9vOjpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqRm9vOjpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICoKCiAgICAgICAgICAgICAgIHRoZW4sIG5vdyB5b3UgY2FuIGJlIG1vcmUgc3BlY2lmaWMsIGFuZCBkZWZpbmUKCiAgICAgICAgICAgICAgLyogYXBwbHkgb25seSBmb3IgICdGb286OmZvbycgbWV0aG9kICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBGb286OmZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgLyogYXBwbHkgZm9yIGFsbCAnZm9vJyBmdW5jdGlvbnMvbWV0aG9kcyAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogZm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgaW50ICpmb28oaW50ICpiYXIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgkgIAoKMTUvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIC0gTW9yZSBmaXhlcyBmb3IgdGVtcGxhdGVzIGFuZCB0ZW1wbGF0ZSBkZWZhdWx0IGFyZ3MuCiAgICAgICAgICAgICAgU2VlIHRlbXBsYXRlX2RlZmF1bHQuaSBmb3Igc2NhcnkgY2FzZXMgdGhhdCBub3cgYXJlIAogICAgICAgICAgICAgIHN1cHBvcnRlZCwgYmVzaWRlcyB0aGUgYWxyZWFkeSB1Z2x5IFNUTC9zdGQgY2FzZXMuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC0gQ29zbWV0aWNzIGFuZCBtb3JlIHVzZSBvZiAnY29uc3QnIHdoZXJlIGl0IHdhcyBpbXBsaWNpdC4KICAgICAgICAgICAgLSBPdGhlciBmaXhlcyBmb3IgT1NTLCB3aGljaCBpcyBub3cgd29ya2luZyBhZ2FpbiB3aXRoIDEuMy4yNS4KCQpWZXJzaW9uIDEuMy4yNCAoRGVjZW1iZXIgMTQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzEyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gRml4IGEgYnVuY2ggb2YgYnVncyByZWxhdGluZyB0byAtcHJveHkgc3VwcG9ydAoJICAgICAgKyBub24tY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIG1lbWJlciBjbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgYWRkZWQgYSAtbm91bml0IGFyZ3VtZW50LCB3aGljaCBkb2VzIG5vdCBleHBvcnQgdGhlIChkZWNsYXJlICh1bml0IC4uLikpCgkgICAgICArIGNvcnJlY3RseSBpbnN0YWxsIHN3aWdjbG9zcHJlZml4LnNjbQoJICAgICAgKyBjb25zdGFudHMgKGVudW1zLCBkZWZpbmVzKSBub3cgY29ycmVjbHkgZXhwb3J0IHdoZW4gdXNpbmcgLXByb3h5CgoxMi8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25maWd1cmUgZml4IGZvciB3aGVuIG1vcmUgdGhhbiBvbmUgdmVyc2lvbiBvZiBqbmlfbWQuaCBpcyBmb3VuZAogICAgICAgICAgICBpbiB0aGUgSmF2YSBpbmNsdWRlIGRpcmVjdG9yeSAod2FzIGdlbmVyYXRpbmcgbG90cyBvZiBzZWQgZXJyb3IKICAgICAgICAgICAgbWVzc2FnZXMpLgoKMTIvMDgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIGFycmF5c19qYXZhLmkgc28gdGhhdCBvbmUgY2FuIGFwcGx5IHRoZSBhcnJheQogICAgICAgICAgICB0eXBlbWFwcyB0byBmdW5jdGlvbnMgdGFraW5nIHBvaW50ZXJzIGFzIGlucHV0LCBlZwoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgJWFwcGx5IGludFtdIHtpbnQqfTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAqYSk7CgoxMi8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgbW9kcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuIE5ldyB0eXBlbWFwcwogICAgICAgICAgICBkaXJlY3RvcmRpc2Nvbm5lY3QgYW5kIGRpcmVjdG9yZGlzY29ubmVjdF9kZXJpdmVkIGZvciB0aGUgCiAgICAgICAgICAgIHN3aWdEaXJlY3RvckRpc2Nvbm5lY3QoKSBtZXRob2QuIEFsc28gZml4IHRvIGdldCB0aGUgamF2YXBhY2thZ2UKICAgICAgICAgICAgdHlwZW1hcCB3b3JraW5nIGFnYWluLgoKMTIvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBGaW5pc2hpbmcgdGhlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzICsgc3BlY2lhbGl6YXRpb25zLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBOb3cgd2UgdXNlIHRoZSBuZXcgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyBpbiB0aGUgc3RkL1NUTCBsaWJyYXJ5LiBUaGF0IG1lYW5zIHRoZSBpbnRlcm5hbAoJICAgICAgc3dpZyBmaWxlcyBhcmUgZ2V0dGluZyB1Z2xpZXIgc2luY2Ugd2Ugbm93IHN1cHBvcnQgdGhlCgkgICAgICBvcmlnaW5hbCBkZWNsYXJhdGlvbnM6CgoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPCBfVHAgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQkuLi4uCgkJfTsKCSAgICAgIAkgICAgIAogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5ID4sCgkgICAgICAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHAgPiA+ID4KICAgICAgICAgICAgICAgIGNsYXNzIG1hcCB7CgkJLi4uLgoJCX07CiAKICAgICAgICAgICAgICBhbmQgdGhlIHVzZXIgY2FuIHVzZSB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcwoKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBzdGQ6OmFsbG9jYXRvcjxpbnQ+ID47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgTXlBbGxvY2F0b3I8aW50PiA+OwoKICAgICAgICAgICAgICBOb3cgd2UgYXJlIGNsb3NlciB0byB0aGUgY2xlYW5pbmcvcmV3cml0aW5nIG9mIHRoZQoJICAgICAgcHl0aG9uIHN0ZC9TVEwgc3VwcG9ydCwgc3VjaCB0aGF0IHdlIHJlY292ZXIgc3VwcG9ydCBmb3IKCSAgICAgIE1TVkMrKyA2LjAsIGFuZCB3ZSBjYW4gYWRkIHN1cHBvcnQgZm9yIG90aGVyIGxhbmd1YWdlcwoJICAgICAgdG9vLgoKCjEyLzAyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgdXNpbmcgYSBtZW1iZXIgZW51bQogICAgICAgICAgICBhbmQgdHlwZXNhZmUvcHJvcGVyIGVudW1zIGVuYWJsZWQuCgoxMi8wMS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0eXBlbWFwcyB0byB3b3JrIHdpdGggdGVtcGxhdGVzIGFuZCBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzLCBpZQoKCSAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQiA9IGludD4KICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CgkgICAgICAgfTsKCgkgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxpbnQ+ICp7Li4ufQoJICAgICAgICV0eXBlbWFwKG91dCkgRm9vPGludCxpbnQ+ICp7Li4ufQoKCSAgICAgICBGb288aW50PiAqIGZvbyggRm9vPGludD4gKmYxLCBGb288aW50LGludD4gKmYyKTsKCgkgICAgICBub3cgJ2YxJywgJ2YyJyBhbmQgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlIHRoZSBwcm92aWRlZAoJICAgICAgdHlwZW1hcHMgcHJvcGVybHkuCgoJICAgICAgVGhpcyBpcyBoaWdobHkgbmVlZGVkIGZvciBwcm9wZXIgU1RMIHN1cHBvcnQsIHNlZSBuZXcgCgkgICAgICBzdGRfYmFzaWNfc3RyaW5nLmksIHN0ZF9zc3RyZWFtLmksIGV0Yy4KCgkgICAgLSBBZGRlZCBzdGRfc3N0cmVhbS5pLCBhbmQgZml4IHN0ZF9iYXNpY19zdHJpbmcuaSB0byB1c2UKCSAgICAgIHRoZSBuZXcgdHlwZW1hcHMgKyB0ZW1wbGF0ZSBkZWYuIGFyZyBtZWNoYW5pc20uIEFsc28sCgkgICAgICBhZGRlZCB0aGUgbmVlZGVkIHN0ZF9hbGxvYy5pLiBOb3csIGFsbCB0aGUgY29udGFpbmVycwoJICAgICAgY2FuIGJlIG1vZGlmaWVkIHRvIHN1cHBvcnQgc3RkOjphbGxvY2F0b3IsIGxpa2UgaW46CgkgICAgICAKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQSA9IHN0ZDo6YWxsb2NhdG9yPFQgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQlwdWJsaWM6CgkJLi4uLgoJCX07CgkgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG9ubHkgY29tcGxldGVkIGJ5IG5vdyBmb3IgYmFzaWNfc3RyaW5nLgoKCSAgICAtIEZpeCBmb3Igc21hcnQgcG9pbnRlcnMgKyBtZW1iZXJzICsgZXh0ZW5zaW9uczoKCgkgICAgICAlZXh0ZW5kIEZvbyB7CgkgICAgICAgIGludCBleHRlbnNpb24oaW50IGksIGludCBqKSB7IHJldHVybiBpOyB9CgkJaW50IGV4dGVuc2lvbigpIHsgcmV0dXJuIDE7IH0KCSAgICAgIH0KCgkgICAgICAlaW5saW5lICV7CgoJICAgICAgY2xhc3MgRm9vIHsKCSAgICAgIHB1YmxpYzoKCQlpbnQgeTsKCQlzdGF0aWMgY29uc3QgaW50IHo7CgkgICAgICB9OwogIAoJICAgICAgY2xhc3MgQmFyIHsKCSAgICAgICAgRm9vICpmOwoJICAgICAgcHVibGljOgoJICAgICAgICBCYXIoRm9vICpmKSA6IGYoZikgeyB9CgkJRm9vICpvcGVyYXRvci0+KCkgewoJCSAgcmV0dXJuIGY7CgkJfQoJICAgICAgfTsKCgkgICAgICBub3cgeW91IGNhbiAKCSAgICAgCgkgICAgICBmID0gRm9vKCkKCSAgICAgIGYueSA9IDMKCSAgICAgIGEgPSBmLnoKCSAgICAgIGYtPmV4dGVuc2lvbigpCiAKCSAgICAgIGIgPSBCYXIoZikKCSAgICAgIGIueSA9IDMKCSAgICAgIGEgPSBiLnoKCSAgICAgIGItPmV4dGVuc2lvbigpCgoJICAgIC0gT3RoZXIgc21hbGwgZXJyb3JzIGZpeGVzLCBtb3N0bHkgcHl0aG9uLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGJ1ZyBmaXhlcyBzbyB0aGF0IHRoZSBjb3JyZWN0IGphdmEgdHlwZXMKICAgICAgICAgICAgYW5kIGNhbm9uaWNhbGl6ZWQgdHlwZXMgaW4gdGhlIEpOSSBjb2RlIGFyZSBlbWl0dGVkLiBVc2Ugb2YgdGhlCiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGVzIGluIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBub3cKICAgICAgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBub24tZGlyZWN0b3IgdHlwZW1hcHMuIFRoZSB0eXBlcyB1c2VkIGZvciAKICAgICAgICAgICAgdHlwZW1hcCBsb29rdXBzIGFyZSBhbHNvIGNvcnJlY3RlZCBpbiBhIGZldyBwbGFjZXMuIElmIHlvdSAKICAgICAgICAgICAgcHJldmlvdXNseSBoYWQgeW91ciBvd24gZGlyZWN0b3IgdHlwZW1hcHMsIGVuc3VyZSB0aGV5IGFyZSB1c2luZyB0aGUKICAgICAgICAgICAgY29ycmVjdCBDKysgdHlwZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbnN0IGVudW0gU1dJR1RZUEUgJiB0eXBlbWFwcyBhZGRlZC4gVGhlc2Ugd3JhcCBjb25zdCBlbnVtIHJlZmVyZW5jZXMKICAgICAgICAgICAgYXMgaWYgdGhleSB3ZXJlIHBhc3NlZCBieSB2YWx1ZS4gQ29uc3QgZW51bSByZWZlcmVuY2VzIHRodXMgd29yayB0aGUKICAgICAgICAgICAgc2FtZSBhcyBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIHN1Y2ggYXMgY29uc3QgZG91YmxlICYsIAogICAgICAgICAgICBjb25zdCBpbnQgJiBldGMuIFR5cGVtYXBzIGFkZGVkIGZvciBKYXZhLCBDIywgUnVieSwgVGNsLCBQZXJsIGFuZCBQaWtlLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgc3BlY2lhbCB2YXJpYWJsZTogJCpqYXZhY2xhc3NuYW1lLCBzaW1pbGFyIHRvICRqYXZhY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCAkJmphdmFjbGFzc25hbWUuIFRoZSBuZXcgb25lIHJlbW92ZXMgYSBwb2ludGVyIGZyb20gdGhlIEMgdHlwZSBiZWZvcmUKICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBKYXZhIGNsYXNzIG5hbWUuIE9uZSBvciBtb3JlIG9mICRqYXZhY2xhc3NuYW1lLAogICAgICAgICAgICAkJmphdmFjbGFzc25hbWUgb3IgJCpqYXZhY2xhc3NuYW1lIG1heSBub3cgYXBwZWFyIGluIGEgdHlwZW1hcC4gTGlrZXdpc2UgZm9yCiAgICAgICAgICAgIEMjIHVzaW5nIGNzY2xhc3NuYW1lIGluc3RlYWQgb2YgamF2YWNsYXNzbmFtZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBsYXN0IHZlc3RpZ2VzIG9mIGVudW1zIGJlaW5nIGhhbmRsZWQgYXMgaW50ZWdlcnMgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICBpbnRlcm5hbHMuIFRoZSB3cmFwcGVyIG1ldGhvZHMgdXNlIHRoZSBlbnVtIHR5cGUgcmF0aGVyIHRoYW4gYW4gaW50CiAgICAgICAgICAgIG5vdy4gVGhlIG5ldCByZXN1bHQgaXMgYWRkZWQgdHlwZSBzYWZldHkgZm9yIGVudW1zIHdoZW4gaGFuZGxlZCBhcwogICAgICAgICAgICBwb2ludGVycywgcmVmZXJlbmNlcyBldGMuIFByZXZpb3VzbHkgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGEgbWV0aG9kCiAgICAgICAgICAgIHRha2luZyBhIHBvaW50ZXIgdG8gYW4gZW51bSwgYSBwb2ludGVyIHRvIGFuIGludCBvciBhIHBvaW50ZXIgdG8gYW4KICAgICAgICAgICAgZW51bSBvZiBzb21lIG90aGVyIHR5cGUgY291bGQgaW5hZHZlcnRhbnRseSBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZC4KICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGVudW0gaXMgbm8gbG9uZ2VyIGJhc2VkIG9uCiAgICAgICAgICAgIGFuIGludCwgYnV0IHRoZSBlbnVtIHR5cGUgaW5zdGVhZC4gQW5vbnltb3VzIGVudW1zIGFyZSBzdGlsbCBoYW5kbGVkCiAgICAgICAgICAgIGFzIGludGVnZXJzLgoKICAgICAgICAgICAgVGhlIGNvbnNlcXVlbmNlIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2UgdXNlcnMgaW4gY29ycmVjdCB1c2FnZSBvZiBlbnVtcwogICAgICAgICAgICBzaG91bGQgbm90IGJlIG5vdGljZWFibGUuIFRoZXJlIGlzIG5vIGNoYW5nZSBmb3IgYW55IG9mIHRoZSBsYW5ndWFnZXMKICAgICAgICAgICAgd2hlcmUgZW51bXMgYXJlIHBhc3NlZCBieSB2YWx1ZSAtIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2lsbAogICAgICAgICAgICBzdGlsbCBhY2NlcHQgYW4gaW50ZWdlciBmb3IgYW4gZW51bSB2YWx1ZSBhbmQgdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgIGxhbmd1YWdlcyBzdGlsbCB1c2UgZWl0aGVyIHR5cGVzYWZlIGVudW1zLCBpbnRlZ2VycyBvciBwcm9wZXIgZW51bXMKICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHVzZXIgY29uZmlndXJlcy4gRm9yIEphdmEgYW5kIEMjIHVzZXJzIGEgY2hhbmdlCiAgICAgICAgICAgIGluIHRoZSB0eXBld3JhcHBlciBjbGFzcyBuYW1lIGhhcyBvY2N1cnJlZCAoZm9yIGVudW0gcG9pbnRlcnMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMgZXRjKS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IG9uZT0xLCB0d28gfTsKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMqIG51bWJlcigpOwoKICAgICAgICAgICAgSW4gSmF2YSBhbmQgQyMgdGhpcyBtdXN0IG5vdyBiZSBjb2RlZCBhcwoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX051bWJlcnMgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICByYXRoZXIgdGhhbgoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX2ludCBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvMjAwNDogd3NmdWx0b24vbW1hdHVzCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgZGVwcmVjYXRlZCB3YXJuaW5nIGZvciAlbmFtZSBhbmQgcmVtb3ZlIHJlbWFpbmluZyAlbmFtZQogICAgICAgICAgICB1c2FnZSBpbiB0aGUgU1dJRyBsaWJyYXJpZXMuCgoxMS8yMS8wNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgdGhlIFB5U3dpZ09iamVjdCB0byBiZSB1c2VkIGZvciBjYXJyeWluZwoJICAgICAgdGhlIGluc3RhbmNlIEMvQysrIHBvaW50ZXJzLiBUaGlzIGlzIHVzZWQgaW5zdGVhZCBvZgoJICAgICAgc3RyaW5nIGFuZCBQeUNPYmplY3RzLgoKCSAgICAgIFRoZSBuZXcgUHlTd2lnT2JqZWN0IGlzIGV2ZW4gc2FmZXIgdGhhbiBQeUNPYmplY3QsIGFuZAoJICAgICAgbW9yZSBmcmllbmRseSB0aGFuIHBsYWluIHN0cmluZ3M6CgoJICAgICAgbm93IHlvdSBjYW4gZG8KCgkgICAgICAgIHByaW50IGEudGhpcwoJCTxTd2lnIE9iamVjdCBhdCBfMDA2OTE2MDhfcF9BPgoKCQlwcmludCBzdHIoYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EKCgkJcHJpbnQgbG9uZyhhLnRoaXMpCgkJMTM1Njg2NDAwCgoJCXByaW50ICIlcyAweCV4IiAlIChhLnRoaXMsIGEudGhpcykKCQlfMDA2OTE2MDhfcF9BIDB4ODE2NjkwMAoKCSAgICAgIHRoZSBsYXN0IG9uZSBpcyB2ZXJ5IHVzZWZ1bCB3aGVuIGRlYnVnZ2luZyB0aGUgQy9DKysKCSAgICAgIHNpZGUsIHNpbmNlIGlzIHRoZSBwb2ludGVyIHZhbHVlIHlvdSB3aWxsIHVzdWFsbHkgZ2V0CgkgICAgICBmcm9tIHRoZSBkZWJ1Z2dlci4KCgkgICAgICBBbHNvLCBpZiB5b3UgaGF2ZSBzb21lIG9sZCBjb2RlIHRoYXQgdXNlcyB0aGUgc3RyaW5nCgkgICAgICByZXByZXNlbnRhdGlvbiAiXzAwNjkxNjA4X3BfQSIsIHlvdSBjYW4gdXNlIGl0IG5vdyBhZ2FpbgoJICAgICAgdXNpbmcgJ3N0cihwdHIpJywgb3IgYnkgY2FsbGluZyAnc3RyID0gUHlPYmplY3RfU3RyKG9iaiknCgkgICAgICBpbiB0aGUgQy9DKysgc2lkZS4KIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgbWFpbmx5IGZvciBub3N0YWxnaWMgc3dpZyB1c2VycyB0aGF0IG1pc3MKCSAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGJ1dCBhbHNvIGFsbG93cyB0byBzYXkgYWdhaW4KCgkgICAgICAgIGlmIGEudGhpcyA9PSBiLnRoaXM6CgkJICByZXR1cm4gImEgaXMgYiIKCgkgICAgICBhbmQgd2VsbCwgc2luY2UgdGhlIGNoYW5nZSB3ZXJlIHJlYWxseSBzaW1wbGUsIG1heWJlIGluCgkgICAgICB0aGUgZnV0dXJlIHdlIHdpbGwgYmUgYWJsZSB0byBkbwogICAKCQluZXh0ID0gYS50aGlzICsgMQoKCSAgICAgIG9yIGFkZCBuYXRpdmUgcHl0aG9uIGl0ZXJhdGlvbiBvdmVyIG5hdGl2ZSBDL0MrKyBhcnJheXMsCgkgICAgICBpZSwgbm8gbmVlZCB0byBjcmVhdGUvY29weSBuZXcgdHVwbGVzIHdoZW4gcmV0dXJuaW5nIGFuZAoJICAgICAgYXJyYXkgb3IgdmVjdG9yLgoKCSAgICAgIEFsc28sIGEgUHlTd2lnUGFja2VkIG9iamVjdCB3YXMgYWRkaW5nIHRvIGNhcnJ5IGEgbWVtYmVyCgkgICAgICBtZXRob2QgcG9pbnRlciwgYnV0IHRoaXMgaXMgcHJvYmFibHkgYSB0ZW1wb3JhbCBzb2x1dGlvbgoJICAgICAgdW50aWwgYSBtb3JlIGdlbmVyYWwgb2JqZWN0IGZvciBtZXRob2RzIGlzIGFkZGVkLgoKCSAgICAgIEJlIGF3YXJlIHRoYXQgdG8gc2ltcGxpZnkgbWFpbnRhaW5pbmcgYW5kIGNvbXBhdGliaWxpdHkKCSAgICAgIHdpdGggb3RoZXIgdG9vbHMsIHRoZSBvbGQgc3RyaW5nIGFuZCBQeUNPYmplY3RzCgkgICAgICByZXByZXNlbnRhdGlvbiBjb3VsZCBkaXNhcHBlYXIgdmVyeSBzb29uLCBhbmQgdGhlCgkgICAgICBTV0lHX0NPQkpFQ1RTX1RZUEVTIG9yIFNXSUdfTk9fT0JKRUNUX1RZUEVTIG1hY3JvcyB3aWxsCgkgICAgICBoYXZlIG5vIGVmZmVjdCBhdCBjb21waWxhdGlvbiB0aW1lLiBTdGlsbCwgdGhlIHRocmVlCgkgICAgICBtZWNoYW5pc21zIGFyZSBwcmVzZW50IGluIHRoZSBjb2RlIGp1c3QgZm9yIHRlc3RpbmcsCgkgICAgICBkZWJ1Z2dpbmcgYW5kIGNvbXBhcmlzb24gcHVycG9zZXMuCgkgICAgICAKMTEvMjEvMDQ6IG1tYXR1cwoKCSAgICAtIFtQeXRob25dIEFkZGluZyBiYWNrIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBzd2lnIHJ1bnRpbWUgY29kZQoJICAgICAgaW5zaWRlIHRoZSB1c2VyIGNvZGUuIFdlIGp1c3QgYWxsb3cgdGhlIHVzZXIgdG8gaW5jbHVkZQoJICAgICAgdGhlIG1pbmltYWwgY29kZSBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBydW50aW1lCgkgICAgICBtZWNoYW5pc20gc3RhdGljYWxseSwganVzdCBhcyBpbiBkb25lIGluIHRoZSBzd2lnCgkgICAgICBtb2R1bGVzLgoJICAgICAgCgkgICAgICBUbyB1c2UgdGhlIHN3aWcgcnVudGltZSBjb2RlLCBmb3IgZXhhbXBsZSB3aXRoIHB5dGhvbiwKCSAgICAgIHRoZSB1c2VyIG5lZWRzIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAjaW5jbHVkZSA8UHl0aG9uLmg+ICAgICAgICAgLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8c3dpZ3J1bi5zd2c+CiAgICAgICAgICAgICAgICNpbmNsdWRlIDxweXRob24vcHlydW4uc3dnPiAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxydW50aW1lLnN3Zz4KCgkgICAgICB0aGUgZmlsZXMgc3dpZ3J1bi5zd2csIHB5cnVuLnN3ZyBhbmQgcnVudGltZS5zd2cgY2FuIAoJICAgICAgYmUgY2hlY2tlZCBvdXQgYnkgdXNpbmcgc3dpZyAtY28sIG9yIHRoZXkgY2FuIHNpbXBseSAKCSAgICAgIGJlIGZvdW5kIGJ5IGFkZGluZyB0aGUgc3dpZyBsaWIgZGlyZWN0b3J5IHRvIHRoZQoJICAgICAgY29tcGlsZXIgaW5jbHVkZSBkaXJlY3RvcnkgbGlzdCwgZm9yIGV4YW1wbGUKCgkgICAgICAgU1dJR0xJQj1gc3dpZyAtc3dpZ2xpYmAKCSAgICAgICBjKysgLUkke1NXSUdMSUJ9IC4uCgoJICAgICAgb2YgYmV0dGVyLCB1c2luZyB0aGUgQ1BQRkxBR1MsIGJ1dCB0aGF0IGRlcGVuZHMgb24geW91cgoJICAgICAgZW52aXJvbm1lbnQuCgkgICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBjYW4gYmUgcG9ydGVkIHRvIHRoZSBvdGhlciBsYW5ndWFnZXMgdG9vLAoJICAgICAgeW91IGp1c3QgbmVlZCB0byBpc29sYXRlIHRoZSBuZWVkZWQgcnVudGltZSBjb2RlIGluCgkgICAgICBhIHNpbmdsZSBmaWxlIGxpa2UgJ3B5cnVuLnN3ZycsIGFuZCBwcm92aWRlIHRoZSAKCSAgICAgIFNXSUdfUnVudGltZV9HZXRUeXBlTGlzdCgpIG1ldGhvZC4gTG9vayBhdCB0aGUKCSAgICAgIExpYi9weXRob24vcHlydW4uc3dnIGZpbGUgYW5kIHRoZSBFeGFtcGxlcy9weXRob24vc3dpZ3J1bgoJICAgICAgZXhhbXBsZS4KCjExLzE1LzA0OiBtbWF0dXMKCSAgICAtIEZpeCBtaXhlZF90eXBlcy5pICsgZ2NjLTMuNCwgaWUsIGFycmF5cyArIHJlZmVyZW5jZXMgKwoJICAgICAgdHlwZWRlZnMKCgkgICAgLSBGaXggbXVsdGlkaW0gYXJyYXlzICsgdHlwZWRlZnMsaWUKCgkgICAgICAgdHlwZWRlZiBjaGFyIGNoYXJhY3RlclsxXTsKCSAgICAgICB0eXBlZGVmIGNoYXJhY3RlciB3b3JkWzY0XTsKCgkgICAgLSBQcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIGJhc2VzIGluIHRoZSBzYW1lIHdheSBiZWZvcmUKCSAgICAgIHdlIHByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgbWVtYmVycywgaWUsIHdlIGNoZWNrCgkgICAgICBmb3IgY29uc3RydWN0b3JzLCBvcGVyYXRvciBuZXcsIHZpcnR1YWwgbWVtYmVycywgZXRjLgogICAKCSAgICAtIEZpeCBSdWJ5L0phdmEgdG8gd29yayAob3IgaWdub3JlKSBtdWx0aS1pbmhlcml0YW5jZSArCiAgICAgICAgICAgICAgZGlyZWN0b3JzLiBBbGxvdyBvdGhlciBsYW5ndWFnZXMgdG8gZGVmaW5lIGlmIGl0IGlzCiAgICAgICAgICAgICAgc3VwcG9ydGVkIG9yIG5vdC4KCSAgICAKCSAgICAtIE5vdyB5b3UgY2FuIHJ1bgoKICAgICAgICAgICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1kaXJlY3RvcnMgLWRpcnByb3QiIAogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLW9jYW1sLXRlc3Qtc3VpdGUKCgkgICAgICBhbmQgeW91IHdpbGwgZ2V0IG9ubHkgJ3JlYWwnIGVycm9ycy4gcnVieSBhbmQgcHl0aG9uCgkgICAgICBjb21waWxlIHdpdGggbm8gZXJyb3JzLCBqYXZhIHNob3dzIHNvbWUgcHJvYmxlbXMuCQoKVmVyc2lvbiAxLjMuMjMgKE5vdmVtYmVyIDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5ODI3NTMgZnJvbSBGYWJyaWNlIFNhbHZhaXJlOiBBZGRzIGRlcGVuZGVuY2llcyBnZW5lcmF0aW9uIGZvcgogICAgICAgICAgICBjb25zdHJ1Y3RpbmcgbWFrZWZpbGVzLiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgLU1GIC1NRCAtTU1EIHRvIHdvcmsKICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBvcHRpb25zIC1NIGFuZCAtTU0uIFRoZXNlIG9wdGlvbnMgYXJlIG5hbWVkIHRoZSBzYW1lCiAgICAgICAgICAgIGFuZCB3b3JrIHRoZSBzYW1lIGFzIGluIGdjYy4KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVpZ25vcmUvJXJlbmFtZSBjaGFuZ2VzIGZvciBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgdG8gbWlycm9yCiAgICAgICAgICAgICVmZWF0dXJlIGJlaGF2aW91ci4gU2VlIHByZXZpb3VzIGVudHJ5LgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciBmaW5lIHR1bmluZyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgd2l0aAogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cy4gQW55ICVmZWF0dXJlIHRhcmdldGluZyBhIG1ldGhvZCB3aXRoIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcyBpZiB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZS4gSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZQogICAgICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLCB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgbWF0Y2ggdGhhdCBleGFjdAogICAgICAgICAgICB3cmFwcGVyIG1ldGhvZCBvbmx5IGFuZCBub3QgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHdpbGwgYXBwbHkgdGhlIGZlYXR1cmUgdG8gYWxsIHRocmVlIHdyYXBwZXIgbWV0aG9kcywgdGhhdCBpczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0Iikgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG9ubHkgYXBwbHkgdG8gdGhpcyB3cmFwcGVyIG1ldGhvZDoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwoKICAgICAgICAgICBhbmQgbm90IHRoZXNlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbWFrZSAlZmVhdHVyZSBtb3JlIHBvd2VyZnVsIHRvIGVhc2UgdGhlIG1pZ3JhdGlvbgogICAgICAgICAgIHRvIG5ldyBkZWZhdWx0IGFyZ3VtZW50cyB3cmFwcGluZyBhcHByb2FjaC4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgSWYgeW91IHByZXZpb3VzbHkgaGFkIGEgJWZlYXR1cmUgYW5kIGRpZG4ndCBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFyZ3VtZW50cywKICAgICAgICAgICB5b3Ugd2lsbCBoYXZlIHRvIGFkZCB0aGVtIGluIG5vdyBvciB5b3UgY2FuIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyCiAgICAgICAgICAgYnkgdXNpbmcgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpLgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwcyBmb3Igc3RkOjp2ZWN0b3IgYWRkZWQgaW50byBzdGRfdmVjdG9yLmkuIFRoZSBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIGdlbmVyYXRlZCBhcmUgbW9kZWxsZWQgb24gdGhlIC5ORVQgQXJyYXlMaXN0IGNsYXNzLiBUaGlzIGlzbid0IHF1aXRlCiAgICAgICAgICAgIHJlYWR5IGZvciBnZW5lcmFsIGNvbnN1bXB0aW9uIHlldCwgYnV0IHdpbGwgd29yayB3aXRoIHZlY3RvcnMgb2YgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIGFuZCBzb21lIGNsYXNzZXMuCgoxMC8zLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbR1VJTEVdIFRoZSAtc2NtIGludGVyZmFjZSBpcyBub3cgdGhlIGRlZmF1bHQuICBUaGUgb2xkIEdIIGludGVyZmFjZSBjYW4KCSAgICBzdGlsbCBiZSBlbmFibGVkIGJ5IHBhc3NpbmcgLWdoIHRvIFNXSUcuCgoxMC8yLzIwMDQ6IG1tYXR1cwoKCSAgICAtIE1vcmUgZml4ZXMgZm9yIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucy4KCSAgICAgIEFzIGFuIGV4dHJhIGJvbnVzLCB3ZSBnZXQgJXRlbXBsYXRlIHN1cHBvcnQgZm9yIHN0YXRpYy9tZW1iZXJzIGNsYXNzCgkgICAgICBtZXRob2RzLCBpZSwgbm93IHlvdSBjYW4gc2F5OgoKCSAgICAgICAgbmFtZXNwYWNlIHNwYWNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQQkJCSAgICAKCSAgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JICAgIAoJICAgICAgICAgICBzdGF0aWMgdm9pZCBmb29UKFkgeSkgeyB9CgkgICAgICAgICB9OwkKCQl9CQkJICAgIAoJICAgICAgCSAgICAgIAkJCSAgICAKCSAgICAgICAgc3RydWN0IEIJCQkgICAgCgkgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkJICAgIAoJICAgICAgICAgIHZvaWQgYmFyVChZIHkpIHt9IAoJICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGludD47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8Y2hhcj47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8aW50PjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGNoYXI+OwoKCSAgICAgIGFuZCBjYWxsCgoJICAgICAgICBBLmZvbygxKQoJCWIgPSBCKCkKCQliLmJhcigxKQoJICAgICAgCgkgICAgICBub3RlIHRoZSB0aGUgbWV0aG9kcyBhcmUgZW1pdHRlZCBpbnNpZGUgdGhlIGNsYXNzZXMsCgkgICAgICBhbmQgaGVuY2UsIHRoZSAldGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gdGhlICdtZW1iZXInCgkgICAgICBtZXRob2QgbmFtZSwgbm90IGEgZ2xvYmFsIG5hbWVzcGFjZSBuYW1lLgoKMTAvMzEvMjAwNDogbW1hdHVzCgkgICAgLSBTb2x2ZSBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMsIGFzIGluCgoJICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgIHN0cnVjdCBCYXI7CgkJIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHN0cnVjdCBmb286OkJhciA6IEZvbyB7CiAgICAgICAgICAgICAgIH07CgoJICAgICAgIHNlZSBuYW1lc3BhY2VfY2xhc3MuaSBmb3IgbW9yZSBleGFtcGxlcy4KCiAgICAgICAgICAgIC0gRml4ICV0ZW1wbGF0ZSBkaXJlY3RpdmUgdG8gcHJvcGVybHkgdXNlIG5hbWVzcGFjZXMsCiAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSBjYXNlOgoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewoJCSAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCQkgICAgICAgc3RydWN0IFB0ciB7fTsKICAgICAgICAgICAgICAgICAgIH0KCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsJCSAgCgkJICAgICAgIHN0cnVjdCBPYmoxIHt9OwoJCSAgICAgICB0eXBlZGVmIFB0cjxPYmoxPiBPYmoxX3B0cjsKICAJCSAgICAgICAldGVtcGxhdGUoT2JqMV9wdHIpIFB0cjxPYmoxPjsgCgkJICAgfQkJCQkgIAoJCSAgIAkJCQkgIAoJCSAgIG5hbWVzcGFjZSB0d28gIAoJCSAgIHsKCQkgICAgICAgc3RydWN0IE9iajIge307CQoJCSAgICAgICB0eXBlZGVmIG9uZTo6UHRyPE9iajI+IE9iajJfcHRyOwoJCSAgICAgICAldGVtcGxhdGUoT2JqMl9wdHIpIG9uZTo6UHRyPE9iajI+OwoJCSAgIH0KCgkgICAgICB0aGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIG5hbWVzcGFjZSBuYW1lICdvbmUnIHRvIGNyZWF0ZQogICAgICAgICAgICAgIGEgbmFtZXNwYWNlIG5vZGUgdG8gZW1pdCB0aGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICBqdXN0IGFzIGJlZm9yZSwgYnV0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSByZXNvbHZlZAogICAgICAgICAgICAgIGFuZCBxdWFsaWZpZWQgaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlICgnb25lJyBvciAndHdvJykuCiAgICAgICAgICAgICAgVGhpcyBpcyBzYW1lIHdheSB0aGF0IHR5cGVkZWYgd29ya3MuIAoKCSAgICAgIFRoaXMgcmVzb2x2ZSB0aGUgc21hcnRfcG9pbnRlcl9uYW1lc3BhY2UyLmkgY2FzZSwgYW5kIGF0CiAgICAgICAgICAgICAgdGhlIHNhbWUgdGltZSwgc2V2ZXJhbCBvdGhlciBvbmVzIHdoZXJlIGJlZm9yZSBzd2lnIHdhcwogICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlCgoJICAgICAgICAiQ2FuJ3QgaW5zdGFudGlhdGUgdGVtcGxhdGUgJ3h4JyBpbnNpZGUgbmFtZXNwYWNlICd5eSciCgkgICAgICAKCSAgICAgIGVycm9yIG1lc3NhZ2UuIEluIGZhY3QsIHRoYXQgZXJyb3IgZG9lc24ndCBleGlzdAoJICAgICAgYW55bW9yZS4gWW91IGNhbiBvbmx5IGdldCBhbiBlcnJvciBpZiB5b3UgdXNlIGEgYmFkCgkgICAgICBuYW1lc3BhY2UgbmFtZSBvciBzby4KCjEwLzMwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW3J1YnldIERpcmVjdG9ycyBmaXhlczoKCSAgICAgIC0gZW51bXMgYW5kIHN0ZDo6c3RyaW5ncyBhcmUgd29ya2luZyBub3cgKHNldmVyYWwKCSAgICAgICAgcmVwb3J0cyBpbiBidWcgdHJhY2sgc3lzdGVtKQoJICAgICAgLSBhZGRlZCBwYXRjaCAxMDI1ODYxIGZvciBkaXJlY3RvciArIGV4Y2VwdGlvbnMKCQkKICAgICAgICAgICAgICAqKiogQXR0ZW50aW9uICoqKjogcnVieSB3aXRoIGRpcmVjdG9ycyArIHByb3RlY3RlZAogICAgICAgICAgICAgIG1lbWJlcnMgd29yayB3aXRoIHZlcnNpb24gMS43Ky4gT2xkZXIgdmVyc2lvbnMgc2VlbXMgdG8KICAgICAgICAgICAgICBoYXZlIGEgYnJva2VuIHNpZ25hdHVyZSBmb3IncmJfcHJvdGVjdCcuCgkJCgkgICAgICBJZiB5b3UgbmVlZCB0byB1c2UgYW4gb2xkIHZlcnNpb24sIGxvb2sgYXQKCgkgICAgICBodHRwOi8vZXhjcnVieS5zb3VyY2Vmb3JnZS5uZXQvZG9jcy9odG1sL3J1YnlfX2hhY2tzXzhocHAtc291cmNlLmh0bWwKICAJICAgICAgZm9yIHdvcmthcm91bmRzLgoJICAgICAgCiAgICAgICAgICAgIC0gW3J1YnldIEZpeCBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIGluIHR5cGVtYXAgKGJ1ZyAxMDM3MjU5KQoKCSAgICAtIFt0Y2xdIEZpeCAoZW51bXN8Y29uc3RhbnRzKSArIG5hbWVzcGFjZSBvcHRpb24gCgkgICAgICAgICAgICAocmVwb3J0ZWQgYnkgamFzb24ubS5zdXJwcmlzZUBpbnRlbC5jb20pLgoKICAgICAgICAgICAgLSBbcGVybF0gQWRkIHBhdGNoIDk2MjE2OCBmb3IgbXVsdGlwbGUgaW5oZXJldGFuY2UKCSAgICAKCSAgICAtIEZpeCAnZGVmaW5lZCcgYXMgdmFyaWFibGUgbmFtZS4KCjEwLzI5LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGdsb2JhbCBzY29wZSBvcGVyYXRvciB1c2VkIGZvciBmcmllbmQgbWV0aG9kczoKCiAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBmcmllbmQgdm9pZCA6Omdsb2JhbHNjb3BlKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMTAvMjgvMjAwNDptbWF0dXMKCSAgICAtIEFkZGVkIG1vZHVsZSBhbmQgc3dpZyBvcHRpb24gInRlbXBsYXRlcmVkdWNlIiB0byBmb3JjZSBzd2lnCgkgICAgICB0byByZWR1Y2UgYW55IHR5cGUgbmVlZGVkIHdpdGggdGVtcGxhdGVzLCBpZSwgaW4gdGhlc2UgY2FzZXMKCiAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0ZW1wbGF0ZXJlZHVjZSIpIHRlc3QKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEEgeyB9OwoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludDsKCSAgICAgICAgJXRlbXBsYXRlKEFfSW50KSBBPEludD4gID09PiAgJXRlbXBsYXRlKEFfSW50KSBBPGludD4KCiAgICAgICAgICAgICAgICB0eXBlZGVmIEIqIEJwOwoJICAgICAgICAldGVtcGxhdGUoQV9CcCkgQTxCcD4gID09PiAgJXRlbXBsYXRlKEFfQnApIEE8Qio+CgogICAgICAgICAgICAgIHN3aWcgcmVkdWNlcyB0aGUgdHlwZXMgSW50IGFuZCBCcCB0byB0aGVpciBwcmltaXRpdmVzCiAgICAgICAgICAgICAgaW50IGFuZCBCKi4gVGhpcyBpcyBjbG9zZXIgdG8gdGhlIHVzdWFsIGNvbXBpbGVyCiAgICAgICAgICAgICAgcmVzb2x1dGlvbiBtZWNoYW5pc20sIGFuZCBpdCBpcyByZWFsbHkgbmVlZGVkIHNvbWV0aW1lcwogICAgICAgICAgICAgIHdoZW4geW91IG1peCB0ZW1wbGF0ZXMgKyB0eXBlZGVmcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgICBEb24ndCB1c2UgaXQgaWYgeW91IGRvbid0IGhhdmUgYW55IHByb2JsZW0gYWxyZWFkeSwKCSAgICAgIHNpbmNlIHRoZSB0eXBlIHJlZHVjdGlvbiBjYW4gaW50ZXJmZXJlIHdpdGggc29tZQoJICAgICAgdXNlciB0eXBlbWFwcywgc3BlY2lhbGx5IGlmIHlvdSBkZWZpbmVkIHNvbWV0aGluZyBsaWtlCgoJCSAgIHR5cGVkZWYgaW50IEludDsKCQkgICAldHlwZW1hcChpbikgSW50IC4uLjsKCiAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlLCB3aGVuIHlvdSB1c2UgdGhlICJ0ZW1wbGF0ZXJlZHVjZSIgb3B0aW9uLAoJICAgICAgc3dpZyB3aWxsIGlnbm9yZSB0aGUgdXNlciB0eXBlbWFwLCBzaW5jZSB0aGUgInR5cGVkZWYgaW50IEludCIKCSAgICAgIHdpbGwgdGFrZSBwcmVjZWRlbmNlLCBhbmQgdGhlIHVzdWFsICJpbnQiIHR5cGVtYXAgd2lsbCBiZQoJICAgICAgYXBwbGllZC4gCgoJICAgICAgTm90ZSB0aGF0IHRoZSBwcmV2aW91cyBjYXNlIGlzIG5vdCBjb21tb24sIGFuZCBzaG91bGQgYmUKCSAgICAgIGF2b2lkZWQsIGllLCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIGEgdHlwZWRlZiBhbmQgYQoJICAgICAgdHlwZW1hcCBhdCB0aGUgc2FtZSB0aW1lLCBzcGVjaWFsbHkgaWYgeW91IGFyZSBnb2luZyB0bwoJICAgICAgdXNlIHRlbXBsYXRlcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgLSBEaXJlY3RvcnM6CgoJICAgICAgICB2aXJ0dWFsIGRlc3RydWN0b3IgaXMgYWx3YXlzIGVtaXR0ZWQgbm93LCB0aGlzIGRvZXNuJ3QKCSAgICAgICAgY2F1c2UgYW55IGhhcm0sIGFuZCBjb3VsZCBzb2x2ZSBzb21lIG5hc3R5IGFuZAoJICAgICAgICBteXN0ZXJpb3VzIGVycm9ycywgbGlrZSB0aGUgb25lIG1lbnRpb25lZCBieSBTY290dC4KCgkJYWxzbyB0aGUgZGVzdHJ1Y3RvciBpcyBub3QgaW4tbGluZWQsIHNvLCB0aGF0IGNhbiBzb2x2ZQoJCXNvbWUgb3RoZXIgbXlzdGVyaW91cyBlcnJvcnMgd2hlbiBtaXhpbmcgZGlyZWN0b3JzICsKCQlpbXBvcnRzICsgZW1iZWRkZWQgYXBwbGljYXRpb25zICsgc29tZSBzcGVjaWZpYyBjb21waWxlcnMuCgkJCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUgd2l0aCBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBhZGRlZC4KCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcCBmaXhlcyBpbiBzdGRfc3RyaW5nLmkgZnJvbSBSdXNzZWxsIEtlaXRoLU1hZ2VlLgoKMTAvMjUvMjAwNDogbW1hdHVzIAoKCSAgICAtIFVzaW5nICsgbmFtZXNwYWNlIGlzIHdvcmtpbmcgbm93ICh1c2luZ19uYW1lc3BhY2UuaSkuCgoJICAgIC0gRGVyaXZlZCArIG5lc3RlZCBjbGFzc2VzIGlzIHdvcmtpbmcgbm93CgkgICAgICAoZGVyaXZlcl9uZXN0ZWQuaSksIGJ1dCBvZiBjb3Vyc2UsIHdlIGFyZSBzdGlsbCB3YWl0aW5nCgkgICAgICBmb3IgdGhlIG5lc3RlZCBjbGFzcyBzdXBwb3J0LgoJICAgIAoJICAgIC0gRGlyZWN0b3JzOgoJICAgICAgLSB1bm5hbWVkIHBhcmFtZXRlcnMgc3VwcG9ydCwKCgkgICAgICAtIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBzdXBwb3J0IChhdXRvbWF0aWMgYW5kIHdpdGgKICAgICAgICAgICAgICAgIGRpcnByb3QgbW9kZSksCgoJICAgICAgLSBkZXRlY3Rpb24gb2YgcmVhbGx5IG5lZWRlZCBwcm90ZWN0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAobWVtYmVycyBhbmQgY29uc3RydWN0b3JzKSBub3cgaXMgZG9uZSBhdXRvbWF0aWNhbGx5LgogICAgICAgICAgICAgICAgRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZSAnZGlycHJvdCcgbW9kZSwgc3dpZyB3aWxsCiAgICAgICAgICAgICAgICB3cmFwIHdoYXQgaXMgbWluaW1hbGx5IG5lZWRlZCAoYW5kIHByb3RlY3RlZCkgZm9yIHRoZQogICAgICAgICAgICAgICAgY29kZSB0byBjb21waWxlLgoJCQoJCXdoYXQgaXMgcHVibGljLCBhcyB1c3VhbCwgaXMgYWx3YXlzIHdyYXBwZWQsIGFuZCBpZgoJCXlvdSB1c2UgdGhlICdkaXJwb3J0JwoJCQoKCSAgICAtIEZpbmFsIGZpeGVzIGZvciB0aGUgT1NTIHRvIGNvbXBpbGUgd2l0aCBTV0lHIDEuMy4yMyAobXkKCSAgICAgIHZlcnkgdmVyeSB1Z2x5IEMrKyArIHRlbXBsYXRlcyArIGV2ZXJ5dGhpbmcgbW91bnRlcnMgd3JhcCkuCgoxMC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLWRsbGltcG9ydC4gVGhpcyBlbmFibGVzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBETEwgZm9yIHRoZSBEbGxJbXBvcnQgYXR0cmlidXRlLiBOb3JtYWxseSB0aGlzIG5hbWUKICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgbW9kdWxlIG5hbWUsIHNvIG5vdyBpdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGlzOgoKICAgICAgICAgICAgICBzd2lnIC1jc2hhcnAgLWRsbGltcG9ydCB4eXogZXhhbXBsZS5pCgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGZvciBhbGwgdGhlIHdyYXBwZWQgUEludm9rZSBtZXRob2RzOgoKICAgICAgICAgICAgICBbRGxsSW1wb3J0KCJ4eXoiLCBFbnRyeVBvaW50PSIuLi4iKV0KICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiAuLi4KCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmcm9tIG1hbnkgZGlmZmVyZW50IFNXSUcgaW52b2NhdGlvbnMgY2FuIHRodXMgYmUgY29tcGlsZWQKICAgICAgICAgICAgaW50byBvbmUgRExMLgoKICAgICAgICAgICAgQSBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkZGxsaW1wb3J0IGNhbiBhbHNvIGJlIHVzZWQgaW4gdHlwZW1hcHMsIHByYWdtYXMsCiAgICAgICAgICAgIGZlYXR1cmVzIGV0Yy4gVGhpcyB3aWxsIGdldCB0cmFuc2xhdGVkIGludG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieSAtZGxsaW1wb3J0CiAgICAgICAgICAgIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHRoZSBtb2R1bGUgbmFtZS4KCjEwLzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTA0OTQ5NiBmcm9tIFNjb3R0IE1pY2hlbCBmaXhlcyBkaXJlY3RvcnMgbWV0aG9kcyB3aXRoIAogICAgICAgICAgICBlbnVtcyB3aGVuIHdyYXBwZWQgd2l0aCB0eXBlc2FmZSBvciBwcm9wZXIgSmF2YSBlbnVtcy4KCjEwLzIxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyBpbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMgKFB5dGhvbiwgUnVieSwgT2NhbWwpLgoKMTAvMjEvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctY3BsdXNjYXN0JyBvcHRpb24gdG8gZW5hYmxlIHRoZSAnbmV3JwoJICAgICAgQysrIGNhc3Rpbmcgb3BlcmF0b3JzLCBzdWNoIGFzICdzdGF0aWNfY2FzdCcsIGluc2lkZSB0aGUKCSAgICAgIHR5cGVtYXBzLiBCeSBkZWZhdWx0IHN3aWcgdXNlIHRoZSBvbGQgQyBjYXN0IHN0eWxlLCBldmVuCgkgICAgICB3aGVuIHBhcnNpbmcgQysrLgoJICAgICAgCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbmV3X3Z3bScgb3B0aW9uIHRvIGVuYWJsZSB0aGUgbmV3CiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciBtb2RlLiBOb3cgdGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICB0aGF0IHRoZSB0eXBlbWFwcyBhcmUgcmVhbGx5IHNhZmUgZm9yIGFueSBmdXR1cmUKICAgICAgICAgICAgICBzb2x1dGlvbiwgYnV0IHlvdSBjYW4gdXNlIGl0IGlmIHlvdSBoYXZlIGEgdmVyeSBzdHJhbmdlCiAgICAgICAgICAgICAgZXJyb3Igd2l0aCBkZWZhdWx0IGNvc250cnVjdG9ycyBtaXNzaW5nICsgJWFwcGx5ICsKICAgICAgICAgICAgICAldHlwZW1hcCwgYW5kIGlmIGV2ZXJ5dGhpbmcgZWxzZSBmYWlscyAoc2VlCiAgICAgICAgICAgICAgdmFsdXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFsdGVybmF0aXZlIGFuZCBjdXJyZW50CiAgICAgICAgICAgICAgc29sdXRpb25zKS4gSWYgeW91IGFyZSBhIHVzZXIgdGhhdCBkb24ndCBrbm93IHdoYXQgaXMKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBkb24ndCBldmVuIHRyeSBpdC4KCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbm9oJyBvcHRpb24gdG8gYmUgdXNlZCB3aXRoIGRpcmVjdG9ycwoJICAgICAgYW5kIHdoZW4geW91IHByZWZlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQoJICAgICAgZGlyZWN0b3IgaGVhZGVyIGZpbGUuIElmIG5vdCB1c2VkLCBzd2lnIHdpbGwgd29yayBhcwoJICAgICAgdXN1YWwgZ2VuZXJhdGluZyBib3RoIHRoZSB3cmFwLmN4eCBhbmQgd3JhcC5oIGZpbGVzLiBJZgoJICAgICAgeW91IHVzZSBpdCwgc3dpZyB3aWxsIG9ubHkgZ2VuZXJhdGUgd3JhcC5jeHguCgoxMC8yMS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBJZiB5b3UgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRSB3aGVuIGNvbXBpbGluZyBhIHdyYXBwZXIgZmlsZSwKCSAgICAgIHRoZSBydW50aW1lIHR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBnaXZlbiB0eXBlIHRhYmxlIG5hbWUuCgkgICAgICBVc2luZyB0aGlzLCB5b3UgY2FuIHNlcGVyYXRlIGRpZmZlcmVudCBtb2R1bGVzIHRvIHNoYXJlIHRoZWlyCgkgICAgICBvd24gdHlwZSBzeXN0ZW1zLiAgLURTV0lHX1RZUEVfVEFCTEU9TXl0YWJsZQoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19TVEFUSUNfUlVOVElNRSB0aGVuIHRoZSB0eXBlIGluZm9ybWF0aW9uCgkgICAgICB3aWxsIGJlIHN0YXRpYyB0byB0aGlzIHdyYXBwZXIuICBOb3RoaW5nIHdpbGwgYmUgc2hhcmVkIHdpdGggYW55CgkgICAgICBvdGhlciBtb2R1bGVzCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX0xJTktfUlVOVElNRSwgdGhlbiBpbnN0ZWFkIG9mIHVzaW5nCgkgICAgICB0aGUgbmV3IHdheSBvZiBzaGFyaW5nIHR5cGUgaW5mb3JtYXRpb24sIHRoZSB3cmFwcGVyIHdpbGwgZXhwZWN0CgkgICAgICB0byBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgTGliL2xpbmtydW50aW1lLmMgZmlsZS4gIEFueSBtb2R1bGVzIGNvbXBpbGVkCgkgICAgICB3aXRoIFNXSUdfTElOS19SVU5USU1FIGFuZCBsaW5rZWQgYWdhaW5zdCBsaW5rcnVudGltZS5jIHdpbGwgYWxsCgkgICAgICBzaGFyZSB0eXBlIGluZm9ybWF0aW9uLgoKMTAvMjAvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBJbml0aWFsIGZpeCBmb3IgcHl0aG9uL2ltcG9ydCBleGFtcGxlLiBQbGVhc2UKCSAgICAgIHVwZGF0ZSB0aGUgTWFrZWZpbGUgKGF1dG9jb25mLCBjb25maWd1cmUsIGV0YywgZXhwZXJ0KSwKCSAgICAgIHNpbmNlIG5vdyBwcm9iYWJseSBpcyBvbmx5IHdvcmtpbmcgd2l0aCBnKyssIGljYyBhbmQgYQoJICAgICAgZmV3IG90aGVyIGNvbXBpbGVycyB0aGF0IGhhdmUgdGhlIC1zaGFyZWQgb3B0aW9uLgoKCSAgICAgIFdlIG5lZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlCgkgICAgICB2aXJ0dWFsIGRlc3RydWN0b3JzLiBPbGQgYW5kIHVzdWFsbHkgZm9yZ290dGVuIEMrKwoJICAgICAgcmVxdWlyZW1lbnQuCgkgICAgICAKCSAgICAgIFNhbWUgZml4IG5lZWQgdG8gYmUgdXNlZCBpbiBwZXJsLCBJIHRoaW5rLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBGaXggZ2VuZXJhdGlvbiBvZiBoZWFkZXIgZmlsZSBmb3IgZGlyZWN0b3JzLAogICAgICAgICAgICAgIG5vdyBkaXJlY3RvcnMuc3dnIGlzIGFsc28gaW5jbHVkZWQsIHNvLCBpdCBjYW4gYmUgcmVhbGx5CgkgICAgICB1c2VkIGZyb20gQysrLCBhbmQgaXQgc29sdmVzIHNvbWUgcHJvYmxlbSB3aXRoIGNvbXBpbGVyCgkgICAgICB0aGF0IHJlcXVpcmUgdGhhdCwgZXZlbiB3aXRoIHRoZSBzaW1wbGUgc3dpZyBpbmNsdXNpb24uICAKCiAgICAgICAgICAgIC0gW1B5dGhvbl0gUmVvcmRlcmluZyB0aGUgbWV0aG9kcyBhbmQgbW92aW5nIHNvbWUgYm9kaWVzCiAgICAgICAgICAgICAgb3V0c2lkZSB0aGUgY2xhc3MgZGVjbGFyYXRpb24uIFRoaXMgaXMgbmVlZGVkIGR1ZSB0bwogICAgICAgICAgICAgIHNvbWUgZ2NjLTIuOTYgaW50ZXJuYWwgY29tcGlsZXIgZXJyb3JzLiBJdCBzZWVtcyB0aGUKICAgICAgICAgICAgICBQWVRIT04gY2xhc3MgaXMgZ2V0dGluZyB0b28gbGFyZ2UgdG8gYmVlbiBkZWNsYXJlZCBhbmQKICAgICAgICAgICAgICBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIC0gQWRkIHRoZSAtb2ggb3B0aW9uIHRvIGNoYW5nZSB0aGUgb3V0cHV0IGhlYWRlciBmaWxlIG5hbWUKICAgICAgICAgICAgICBpZiBuZWVkZWQ6CgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDIC1vaCB0ZXN0LkhICgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG1haW5seSBuZWVkZWQgd2hlbiB1c2luZyBkaXJlY3RvcnMsIGFuZCBpZiB0aGUKICAgICAgICAgICAgICBjdXJyZW50IGRlZmF1bHQgaGVhZGVyIGZpbGUgbmFtZSBpcyBub3QgZ29vZCBmb3IgeW91LAogICAgICAgICAgICAgIHdoaWNoIGlzIGdlbmVyYXRlZCBhcyBmb2xsb3c6CSAgICAgIAoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgICAgICAgICAgICAgPT4gdGVzdF93cmFwLmgKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAgPT4gdGVzdC5oCgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgMSkgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBmZWF0dXJlIGFkZGVkLiBUaGlzIGZlYXR1cmUgYWxsb3dzIG9uZQogICAgICAgICAgICAgIHRvIHVzZSB0aGUgZGVmYXVsdCBhcmd1bWVudCBjb2RlIGdlbmVyYXRpb24gdGhhdCB3YXMgdXNlZCBpbgogICAgICAgICAgICAgIFNXSUctMS4zLjIyIGFuZCBlYXJsaWVyIHZlcnNpb25zLiBJdCBwcm9kdWNlcyBtb3JlIGNvbXBhY3Qgd3JhcHBlcnMKICAgICAgICAgICAgICBhcyBvbmx5IG9uZSB3cmFwcGVyIG1ldGhvZCBpcyBnZW5lcmF0ZWQgZm9yIGFueSBtZXRob2Qgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgICAgYXJndW1lbnRzLiBTbyB0aGUgYWR2YW50YWdlIGlzIGl0IGdlbmVyYXRlcyBsZXNzIGNvZGUgYnV0IGhhcyB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBsaW1pdGF0aW9ucywgbGlrZSBpdCBpdCBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGNhbm5vdCBiZSB0YWtlbiBhZHZhbnRhZ2Ugb2YgaW4gdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgICAgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkuIEl0IGlzIGltcGxlbWVudGVkIHZpYSB0aGUgdXN1YWwgJWZlYXR1cmUgbWVjaGFuaXNtOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKTsKCiAgICAgICAgICAgIDIpIEtleXdvcmQgYXJndW1lbnRzIChrd2FyZ3MpIGFyZSB3b3JraW5nIGFnYWluIGZvciBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBpbiB0aGUgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBpdCwgaWUsIFB5dGhvbiBhbmQgUnVieS4gVGhlIG5ldyBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50IHdyYXBwaW5nIGFwcHJvYWNoIHVzaW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBjYW5ub3Qgc3VwcG9ydCBrd2FyZ3MKICAgICAgICAgICAgICAgc28gdGhlIGNvbXBhY3QgZGVmYXVsdCBhcmd1bWVudCBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4KICAgICAgICAgICAgICAga3dhcmdzIGFyZSBzcGVjaWZpZWQsIGJ5ICVmZWF0dXJlKCJrd2FyZ3MiKS4KCiAgICAgICAgICAgIDMpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgYXJlIGFsc28gYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbiB3cmFwcGluZwogICAgICAgICAgICAgICBDIChub3QgQysrKSBjb2RlLiBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlIGJpemFycmUgbm90aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGZvciBDIGNvZGUuCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMgaW4gbmFtZXNwYWNlcyBhbHNvIHdvcmtpbmcgbm93LgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaW4gbmFtZXNwYWNlcyB0b28uCgoxMC8xOS8yMDA0OiBtbWF0dXMKCgkgICAgLSBBbGxvdyB0byBkaXNhYmxlIHRoZSBuZXcgU3dpZ1ZhbHVlV3JhcHBlciBtZWNoYW5pc20sCgkgICAgICBpZiB5b3UgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyIGxhbmd1YWdlIG1haW4uCgoJCSAvKiBUdXJuIG9uIHNhZmUgdmFsdWUgd3JhcHBlciB1c2UgbW9kZSAqLwogICAgICAgICAgICAgICAgIFN3aWdfdmFsdWVfd3JhcHBlcl9tb2RlKDEpOwoKCSAgICAgIAoJICAgICAgTm93IGlzIG9ubHkgYWN0aXZlIGluIHB5dGhvbi4gQWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICAgIGFyZSB1c2luZyB0aGUgb2xkIHJlc29sdXRpb24sIGJ1dCB0aGV5ICBjYW4gYWxzbyB1c2UgdGhlCgkgICAgICAidmFsdWV3cmFwcGVyIi8ibm92YWx1ZXdyYXBwZXIiIGZlYXR1cmVzIHRvIGZpeCBzb21lCgkgICAgICBvZiB0aGUgb2xkIGJyb2tlbiBjYXNlcy4gTm90ZSwgaG93ZXZlciwgIHRoYXQgbm90IGFsbCAKCSAgICAgIHRoZSBicm9rZW4gY2FzZXMgY2FuIGJlIHNvbHZlZCBpbiB0aGF0IHdheS4KCgkgICAgICBUaGUgbmV3IG1lY2hhbmlzbSBzZWVtcyB0byBiZSB3b3JraW5nIGZpbmUgaW4gcGVybCwgcnVieQoJICAgICAgYW5kIHRjbCwgYnV0IGZhaWxpbmcgaW4gc29tZSB0eXBlbWFwcyBpbiBqYXZhLgoKCSAgICAgIEhlbmNlLCBpcyB1cHRvIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRvIHRlc3QgaXQsIGFuZAoJICAgICAgZGVjaWRlIHRvIGVuYWJsZSBpdCBvciBub3QuCgoJICAgICAgTG9vayBhdCB0aGUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBleGFtcGxlcy4KCgkgICAgLSBGaXggbW9yZSBTd2lnVmFsdWVXcmFwcGVyIGNhc2VzIHdoZW4gdGhlIG5ldyBtZWNoYW5pc20KCSAgICAgIGlzIGFjdGl2ZS4gTm93IGl0IGFsc28gY2hlY2sgZm9yIGxvY2FsIHR5cGVtYXAKCSAgICAgIHZhcmlhYmxlcywgc2VlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgYW4gZXhhbXBsZSB3aGVuCgkgICAgICB0aGlzIGlzIG5lZWRlZC4gQnV0IGFnYWluLCB0aGlzIGV4dHJhIGNoZWNraW5nIHdpbGwgb25seQoJICAgICAgYmUgYWN0aXZhdGVkIHdoZW4gdXNpbmcgdGhlIG5ldyB2YWx1ZSB3cmFwcGVyIG1vZGUuCgoJICAgIC0gW1B5dGhvbl0gRml4IHZhcmlhYmxlIHdyYXBwaW5nIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlCgkgICAgICBhc3NpZ24gb3BlcmF0b3JzLiBJdCBzaG91bGQgYmUgZWFzeSB0byBmaXggaW4gYWxsIHRoZSAKCSAgICAgIG90aGVyIG1vZHVsZXMsIGluc3RlYWQgb2YgY2hlY2tpbmcKCgkgICAgICAgICBpZiAoIUdldGF0dHIobiwiaW1tdXRhYmxlIikpIC4uLgoJCgkgICAgICB5b3UgbmVlZCB0byB2ZXJpZnkKCgkgICAgICAgICBpZiAoaXNfYXNzaWduYWJsZShuKSkgLi4uCgoJICAgICAgTG9vayBhdCB0aGUgcHJpdmF0ZV9hc3NpZ24uaSBmb3IgYW4gZXhhbXBsZS4KCjEwLzE4LzIwMDQ6IG1tYXR1cwoJICAgIC0gJWZlYXR1cmVzICJkaXJlY3RvciIvIm5vZGlyZWN0b3IiIG5vdyB3b3JrIGFzIGV4cGVjdGVkLgogICAgICAgICAgICAtIEdlbmVyYWwgZml4ZXMgaW4gJWZlYXR1cmUgdG8gcmVzb2x2ZSBmdW5jdGlvbiBkZWNsCgkgICAgICBwcm9wZXJseSwKCSAgICAgIAoJICAgICAgICAlZmVhdHVyZSgiaGVsbG8iKSBmb28oKTsKCSAgICAgICAgY2hhciBmb28oKSAtPiAgZigpICAgIC8vIHdhcyB3b3JraW5nCgkgICAgICAgIGNoYXIgKmZvbygpIC0+IGYoKS5wICAvLyBpdCB3YXNuJ3QKIAoKICAgICAgICAgICAgLSBUZW1wbGF0ZSArIHNwZWNpYWxpemF0aW9uICsgZGVmYXVsdCB0ZW1wbGF0ZSBhcmdzIG5vdyBpcwoJICAgICAgd29ya2luZywgKGRvbid0IGNvbmZ1c2Ugd2l0aCB0ZW1wbGF0ZSArIGRlZmF1bHQgYXJnCgkgICAgICB2YWx1ZXMsIHRoYXQgd2FzIHNvbHZlZCBiZWZvcmUpLCBub3cgdGhpcyB1Z2x5IGNhc2UgaXMKCSAgICAgIHdvcmtpbmc6CgoJICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQSA9IEFsbG9jPFQ+ID4KCQlzdHJ1Y3QgVmVjdG9yCgkJewoJCSAgIFZlY3RvcihUIGEpe30KCQl9OwkJICAgCgoJCXRlbXBsYXRlIDw+CgkJc3RydWN0IFZlY3Rvcjxkb3VibGU+CgkJewoJCSAgVmVjdG9yKCl7fQoJCSAgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAldGVtcGxhdGUoVl9jKSBWZWN0b3I8Y2hhciwgQWxsb2M8Y2hhcj4gPjsKCSAgICAgICAgJXRlbXBsYXRlKFZfaSkgVmVjdG9yPGludD47ICAgIC8vIHBpY2tzIFZlY3RvcjxpbnQsQWxsb2M8aW50PiA+CgkgICAgICAgICV0ZW1wbGF0ZShWX2QpIFZlY3Rvcjxkb3VibGU+OyAvLyBwaWNrcyB0aGUgc3BlY2lhbGl6YXRpb24KCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbmVlZGVkIGZvciBhdXRvbWF0aWMgU1RMIHN1cHBvcnQgKGxhdGVyIHdpbGwKICAgICAgICAgICAgICBiZSkuCgoJICAgIC0gRml4IHRoZSB0ZW1wbGF0ZSArIHR5cGVkZWYgZXJyb3JzIGluIHRlc3Qtc3VpdGUsIHdoaWNoCiAgICAgICAgICAgICAgcHJvYmFibHkgd2lsbCBmaXggYW5vdGhlciBncm91cCBvZiBzdHJhbmdlIHRlbXBsYXRlICsKICAgICAgICAgICAgICBuYW1lc3BhY2VzICsgdHlwZWRlZnMgZXJyb3JzLgoKCSAgICAtICV3YXJuZmlsdGVyIGlzIHdvcmtpbmcgYmV0dGVyIG5vdywgcGFyc2VyLnkgdHJpZXMgdG8gdXNlCgkgICAgICB0aGVtIHdoZW4gbmVlZGVkLgoKCSAgICAtICoqKiogTmV3IGRlZmF1bHQgdHlwZSByZXNvbHV0aW9uIG1ldGhvZCAoc3R5cGUuYykgKioqKiogCgoJICAgICAgSXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBtaXhlZCB0eXBlcywgdGhlbiBpdCBnb2VzCgkgICAgICAnYmFja3dhcmQnIGZpcnN0IGRlbGV0aW5nIHRoZSBxdWFsaWZpZXIsIHRoZW4gdGhlIGlubmVyCgkgICAgICB0eXBlcywgZm9yIGV4YW1wbGU6CiAgICAJCSAJCQkJCQkJICAKICAgIAkJIHR5cGVkZWYgQSAqQXB0cjsJCQkJICAKICAgIAkJIGNvbnN0IEFwdHImOwkJCQkJCQogICAgCQkgci5xKGNvbnN0KS5BcHRyICAgICAgIC0+IHIucShjb25zdCkucC5TV0lHVFlQRQkJCiAgICAJCSByLnEoY29uc3QpLnAuU1dJR1RZUEUgLT4gci5wLlNXSUdUWVBFCQkJCiAgICAJCSByLnAuU1dJR1RZUEUgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGVudW0gSGVsbG8ge307CQkJCQkJCiAgICAJCSBjb25zdCBIZWxsbyYgaGk7CQkJCQkKICAgIAkJIHIucShjb25zdCkuSGVsbG8gICAgICAgICAgLT4gci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFCQogICAgCQkgci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFICAtPiByLmVudW0gU1dJR1RZUEUJCQogICAgCQkgci5lbnVtIFNXSUdUWVBFICAgICAgICAgICAtPiByLlNXSUdUWVBFCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgaW50IGFbMl1bNF07CQkJCQkJCiAgICAJCSBhKDIpLmEoNCkuaW50ICAgICAgICAgICAtPiBhKEFOWSkuYShBTlkpLlNXSUdUWVBFCQogICAgCQkgYShBTlkpLmEoQU5ZKS5TV0lHVFlQRSAgLT4gYShBTlkpLmEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuYSgpLlNXSUdUWVBFICAgICAtPiBhKEFOWSkucC5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkucC5TV0lHVFlQRSAgICAgICAtPiBhKEFOWSkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLlNXSUdUWVBFICAgICAgICAgLT4gYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoKS5TV0lHVFlQRSAgICAgICAgICAgIC0+IHAuU1dJR1RZUEUJCQkKICAgIAkJIHAuU1dJR1RZUEUgICAgICAgICAgICAgIC0+IFNXSUdUWVBFICAgICAgICAgICAgICAgICAgICAKCgkgICAgICBiZWZvcmUgaXQgYWx3YXlzIHN0b3BzIGFmdGVyIGZpbmRpbmcgcmVmL3BvaW50ZXIvZW51bS9hcnJheS9ldGMuCgkgICAgICAgCgkgICAgICBOb3csIHRoZW4sIHlvdSBjYW4gZGVmaW5lICh1c2UgYW5kIGFwcGx5KSAnaGlnaGVyJyB0eXBlbWFwcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAob3V0KSBjaGFyIEZJWFNJWkVbQU5ZXQogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgZW51bSBTV0lHVFlQRSYKCSAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFW0FOWV1bQU5ZXQoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAoJilbQU5ZXQoJICAgICAgIAoJICAgICAgSXQgaXMgcG9zc2libGUgd2l0aCB0aGlzIGNoYW5nZSB0aGF0IHByZXZpb3VzIHR5cGVtYXBzCgkgICAgICB0aGF0IHdlcmUgZGVmaW5lZCAoYnV0IGlnbm9yZWQpLCBub3cgd2lsbCBzdGFydCB0byB3b3JrLgoKCSAgICAgIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSBjaGVjayBmb3IgdGhlICcldHlwZW1hcCh2YXJpbikgU1dJR1RZUEVbXScsCgkgICAgICBiZWZvcmUgaXQgd2FzIHVzdWFsbHkgbm90IGRlZmluZWQgKGJ1dCBjaGFyW10gd2FzKSwKCSAgICAgIGFuZCB0aGF0IGNhbiBwcm9kdWNlIHNvbWUgaW5jb25zaXN0ZW5jaWVzLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICAgIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgZm9yIFNUTCwgc2luY2Ugc3RkOjp2ZWN0b3I8ZW51bSBIZWxsbz4gCgkgICAgICBzdGQ6OnZlY3RvcjxBKj4sIGV0Yywgd2lsbCBhbHdheXMgZ2VuZXJhdGUgbWV0aG9kcyB0aGF0CgkgICAgICBtaXggY29uc3QgcmVmZXJlbmNlcyB3aXRoIHRoZSB2ZWN0b3IgdHlwZS4KCgkgICAgICBOb3cgdGhhdCBpcyB3b3JraW5nLCBhbGwgdGhlIHN0ZDo6Y29udGFpbmVyPFQqPgoJICAgICAgc3BlY2lhbGl6YXRpb24gd2lsbCBub3QgYmUgbmVlZGVkIGFueW1vcmUsIHdlbGwsIGluCgkgICAgICB0aGVvcnkuIAoKCSAgICAgIEluIHRoZSBwcmFjdGljZSwgZXZlcnl0aGluIGlzIHdvcmtpbmcgYXMgYmVmb3JlIHVudGlsCgkgICAgICB0aGUgcHJvcGVyIG1peGVkIHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB0aGUgbGlicmFyaWVzCgkgICAgICBzaW1wbGlmaWVkIHRvIHVzZSB0aGVtLgoKCSAgICAtIENoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXh0ZXJuICJqYXZhIi8iZm9ydHJhbiIvImV0YyIsIAoJICAgICAgbm93IHN3aWcgcHJvZHVjZXMgYSB3YXJuaW5nLCBhbmQgdXNlIGV4dGVybiAiQyIgaW5zdGVhZC4KCSAgICAgIFRoZSB3YXJuaW5nIGNhbiBhbHNvIGJlIGRpc2FibGUgd2l0aCB0aGUgIi13IDMxMyIgZmxhZy4KCSAgICAgIChXQVJOX1BBUlNFX1VOREVGSU5FRF9FWFRFUk4pLgoKCSAgICAtIFN3aWdWYWx1ZVdyYXBwZXIgaXMgbm93IG1vcmUgc2VsZWN0aXZlIChsYW5nLmN4eCkuCgogICAgICAgICAgICBbUGVybC9UY2xdCgkgICAgLSBGaXggc29tZSB0eXBlbWFwcyAocGVybC90Y2wpIHRvIHdvcmsgcHJvcGVybHkgd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlci4gVGhpcyB3YXMgbm90IGEgcHJvYmxlbSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBidXQgd2l0aCB0aGUgdHlwZW1hcHMgdGhhdCBub3cgYXJlCgkgICAgICBzYWZlIHRvIHVzZSB3aXRoICVhcHBseS4KCgkgICAgW1B5dGhvbl0KCiAgICAgICAgICAgIC0gRml4ICVjYWxsYmFjay8lcHl0aG9uY2FsbGJhY2sgd29yayBub3cgYXMgYmVmb3JlIGFmdGVyCgkgICAgICB0aGUgZGVmIGFyZ3MgY2hhbmdlcy4gQWxzbywgJWNhbGxiYWNrIG5vdyBpcyBhbiBhbGlhcwoJICAgICAgZm9yICVweXRob25jYWxsYmFjaywgc28sIHRoZXkgZG8gdGhlIHNhbWUuCgoJICAgIFtQeXRob24vUnVieV0KCSAgICAtICVjYWxsYmFjayBpcyBtb3JlIHVzYWJsZSBhbmQgdW5pZm9ybToKCiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpIGZvbygpOyAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpOyAgICAgICAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKDEpIGZvbygpOyAgICAgICAgLy8gb25seSBpbiBweXRob24uCgoxMC8xNy8yMDA0OiBhcnR5CgkgICAgW09DQU1MXQoJICAgIC0gVHdlYWsgdG8gZW51bSB0eXBpbmcgZm9yIHNvdW5kbmVzcyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUKCSAgICAgIG1vZHVsZXMuCgkgICAgLSBnbG9iYWwgZnVuY3Rpb25zIGFyZSBub3cgdW5hbWJpZ3VvdXMgaW4gbXVsdGlwbGUgbG9hZGVkIG1vZHVsZXMuCgkgICAgLSBGaXhlZCB0ZXN0IGNhc2UgY29kZSB0byBidWlsZCBtdWx0aW1vZHVsZSB0ZXN0IGNhc2VzIGNvcnJlY3RseS4KCSAgICAtIFRoZXJlIGlzIG5vIHdheSB0byBzaGFyZSBvdmVybG9hZCByZXNvbHV0aW9uIGFjcm9zcyBtb2R1bGVzCgkgICAgICBiZWNhdXNlIG9mIHNvdW5kbmVzcyBpc3N1ZXMuICBJZiB0aGUgdXNlciB3YW50cyB0byBjYWxsIHNvbWUKCSAgICAgIGZ1bmN0aW9uIGZvbyBmcm9tIGFuIGFyYml0cmFyeSBtb2R1bGUgYmFyLCB0aGV5IHdpbGwgaGF2ZSB0bwoJICAgICAgdXNlIEJhci5fZm9vIHRvIGNhbGwgaXQgY29ycmVjdGx5LiAgTGF0ZXIgSSB3aWxsIGZpeCB0aGUgCgkgICAgICBjYW1scDQgbW9kdWxlIHRvIGRvIHNvbWV0aGluZyBjbGV2ZXIgaW4gdGhpcyBjYXNlLiAgCiAgICAgICAgICAgIC0gUHJvbWlkZWQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb2YgY2xhc3MgbWVjaGFuaXNtLgoJICAgIC0gUmVtb3ZlZCBzeW1ib2wgaGFjayBmb3Igb2NhbWwtMy4wNyBhbmQgYmVsb3cgd2hpY2ggaXMgbm90IG5lZWRlZAoJICAgICAgZm9yIG9jYW1sLTMuMDggYW5kIGFib3ZlLgoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDSElDS0VOXQoJICAgIC0gQ29tcGxldGx5IGNoYW5nZSBob3cgY2hpY2tlbi5jeHggaGFuZGxlcyBDTE9TIGFuZCBnZW5lcmljIGNvZGUuCgkgICAgICBjaGlja2VuIG5vIGxvbmdlciBleHBvcnRzIC1jbG9zLnNjbSBhbmQgLWdlbmVyaWMuc2NtLiAgVGhlIGNsb3MKCSAgICAgIGNvZGUgaXMgZXhwb3J0ZWQgZGlyZWN0bHkgaW50byB0aGUgbW9kdWxlLnNjbSBmaWxlIGlmIC1wcm94eSBpcyBwYXNzZWQuCgkgICAgLSBUaGUgY29kZSBub3cgYWx3YXlzIGV4cG9ydHMgYSB1bml0LiAgUnVubmluZyB0aGUgdGVzdC1zdWl0ZSBpcyBub3cKCSAgICAgIG1ham9ybHkgYnJva2VuLCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQuCgkgICAgLSBDTE9TIG5vdyBnZW5lcmF0ZXMgdmlydHVhbCBzbG90cyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzaW1pbGFyIHRvIGhvdwoJICAgICAgR09PUFMgc3VwcG9ydCB3b3JrcyBpbiB0aGUgZ3VpbGUgbW9kdWxlLgoJICAgIC0gY2hpY2tlbiBubyBsb25nZXIgcHJlZml4ZXMgc3ltYm9scyBieSB0aGUgbW9kdWxlIG5hbWUsIGFuZCBubyBsb25nZXIKCSAgICAgIGZvcmNlcyBhbGwgbmFtZXMgdG8gbG93ZXIgY2FzZS4gIEl0IG5vdyBoYXMgLXVzZWNsYXNzcHJlZml4IGFuZCAtY2xvc3ByZWZpeAoJICAgICAgc2ltaWxhciB0byBob3cgZ3VpbGUgaGFuZGxlcyBHT09QUyBuYW1lcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB3b3JraW5nIHdpdGggbmV3IGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgd3JhcHBpbmcgYXBwcm9hY2guIFRoZSBuZXcgYXBwcm9hY2ggbm8gbG9uZ2VyIGZhaWxzIHdpdGggdGhlIGZvbGxvd2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50IHBhdHRlcm4gKHByZXZpb3VzbHkgZmFpbGVkIHdpdGggc29tZSBwcmltaXRpdmUgdHlwZXMsIGxpa2UgCiAgICAgICAgICAgIHVuc2lnbmVkIHByaW1pdGl2ZSB0eXBlcyk6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBmb28oY29uc3QgVCYgdSA9IFQoKSk7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPHVuc2lnbmVkIGludD47CgogICAgICAgICAgICBUaGlzIHJlbGllcyBvbiB0aGUgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHN1cHBvcnQganVzdCBhZGRlZCwgc28gYWxsCiAgICAgICAgICAgIHRoZSBjb21iaW5hdGlvbnMgb2Ygb3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgbm9ybWFsIHBhcmFtZXRlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBvdmVybG9hZGluZyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyB3b3Jrcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBsYXJnZSByYW5nZSBvZiB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgdGhhdCBDKysKICAgICAgICAgICAgc3VwcG9ydHMuCgogICAgICAgICAgICAtIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucywgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCwgY29uc3QgVCAmcik7CgogICAgICAgICAgICAtIEZpeGVzIHdoZXJlIHRoZSB0ZW1wbGF0ZWQgdHlwZSBpcyBub3QgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgeHl6KCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIHh5ejxkb3VibGU+KCk7CgogICAgICAgICAgICAtIEZpeGVzIGZvciBvdmVybG9hZGluZyBvZiBwbGFpbiBmdW5jdGlvbnMgYnkgYSB0ZW1wbGF0ZWQgZnVuY3Rpb246CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwoKICAgICAgICAgICAgLSBPdmVybG9hZGluZyBieSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyBmaXhlZDoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmb28oVCB0KSB7fQogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHZvaWQgZm9vKFQgdCwgVSB1KSB7fQoKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288ZG91YmxlLCBkb3VibGU+OwoKICAgICAgICAgICAgLSBBbGwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBhbHNvIHdvcmtpbmcgaW5jbHVkaW5nIHNwZWNpYWxpemF0aW9ucywgZWc6CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmM8ZG91YmxlPihkb3VibGUgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYyhpbnQgdCk7CgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW1vdmUgdGhlIGFiaWxpdHkgdG8gc2hhcmUgdHlwZSBpbmZvcm1hdGlvbiBieSB1c2luZyBjIGxpbmtpbmcuCiAgICAgICAgICAgICAgQWxsIHR5cGUgc2hhcmluZyBoYXBwZW5zIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgICAgICsgUmVtb3ZlIFNXSUdfTk9JTVBPUlQsIFNXSUdfUlVOVElNRSwgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KICAgICAgICAgICAgICAgICsgRGVwcmVjaWF0ZSAtcnVudGltZSwgLW5vcnVudGltZSBjb21tYW5kIGxpbmUgb3B0aW9ucwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGVzdC1zdWl0ZSBjb21tb24ubWsgdG8gY29ycmVjdGx5IGJ1aWxkIG11bHRpY3BwdGVzdAogICAgICAgICAgICAgICAgKyBSZW1vdmUgcmVmZXJlbmNlIHRvIHByZWNvbW1vbi5zd2cKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRoZSBndWlsZV9naCBpbnRlcmZhY2UgdG8gc2hhcmUgZGF0YSBieSBhIGdsb2JhbCB2YXIgaW5zdGVhZAogICAgICAgICAgICAgICAgICBvZiBjIGxpbmthZ2UuCgogICAgICAgICAgICAtIFJlbW92ZSBBZHZhbmNlZC5odG1sLCBzaW5jZSBldmVyeXRoaW5nIGluIGl0IGlzIG5vdyBvYnNvbGV0ZQoKMTAvMDkvMjAwNDogbW1hdHVzCgkgICAgLSBTcGxpdCB0aGUgcHl0aG9uIHN0ZC9TVEwgQysrIGxpYnJhcnkgZmlsZXMsIG5vdwoJICAgICAgYWxsIHRoZSBsYW5ndWFnZSBpbmRlcGVuZGVudCBkZWZpbml0aW9ucyBhcmUgdW5kZXIKCSAgICAgIHRoZSBkaXJlY3RvcnkKCSAgICAgIAoJCUxpYi9zdGQKCgkgICAgICBhbmQgaGVuY2UsIGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICAtIEFkZCBtb3JlIGRvY3VtZW50YXRpb24gdG8gdGhlIFB5dGhvbiBTVEwsIGFuZAoJICAgICAgY2xlYW4gdW5uZWNlc3NhcnkgY29kZS4KCgkgICAgLSBBZGQgaW5pdGlhbCBDOTkgY29tcGxleCBzdXBwb3J0LCBhbmQgc29tZSBmaXhlcwoJICAgICAgZm9yIGxvbmcgZG91YmxlLgoKMTAvMDgvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdGhlIFN3aWdWYWx1ZVdyYXBwZXIgZm9yIG9wYXF1ZSB0eXBlcywgbm93IGl0IGlzIAoJICAgICAgYXBwbGllZCBmb3Igb3BhcXVlIHRlbXBsYXRlcyBhbmQgY2xhc3NlcywgZm9yIHdoaWNoIHdlCgkgICAgICBkb24ndCBrbm93IGlmIHRoZXJlIGlzIG9yIG5vdCBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGllCgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKGludCk7CiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgIFN0aWxsLCBpZiB5b3Uga25vdyB0aGF0IHlvdSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGFuZCBmb3Igc29tZSB2ZXJ5IHZlcnkgcGFydGljdWxhciByZWFzb24KICAgICAgICAgICAgICB5b3Ugd2FudCB0byBhdm9pZCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciwgYW5kIHlvdSBkb24ndAogICAgICAgICAgICAgIHdhbnQgb3IgY2FuJ3QgZXhwb3NlIHRoZSBjbGFzcyB0byBzd2lnLCBub3cgeW91IGNhbgogICAgICAgICAgICAgIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm92YWx1ZXdyYXBwZXIiKSBBOyAgICAKICAgICAgICAgICAgICAgICBjbGFzcyBBOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgaWYgdGhlIGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYnV0IHlvdSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgd3JhcHBlciwgeW91CiAgICAgICAgICAgICAgY2FuIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgidmFsdWV3cmFwcGVyIikgQTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQSgpOwoJCSAgIC4uLi4KICAgICAgICAgICAgICAgICB9OyAgIAogICAgICAKCSAgICAtIEZpeCBmb3IgY2hhciA+IDEyOCwgaWUKCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHRpbGRlX2EgPSAnXDM0MSc7CgogICAgICAgICAgICAtIEFkZCBwYXRjaCAxMDQxODU4IGZvciAkbGV4dHlwZSwgd2hpY2ggY2FycmllcyB0aGUgCiAgICAgICAgICAgICAgbGl0ZXJhbCB0eXBlIG9mIGEgc3ltYm9sLiBTZWUgbGV4dHlwZS5pIGluIHRoZQogICAgICAgICAgICAgIHRlc3Qtc3VpdGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAoKMTAvMDcvMjAwNDogd3NmdWx0b24KCSAgICB7UnVieSwgSmF2YV0gRml4IGRpcmVjdG9yICsgJ2VtcHR5JyB0aHJvd3MKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICBBKCkgdGhyb3coKTsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgICBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCgoxMC8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW1RDTF0KICAgICAgICAgICAgLSBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbGxpYW0gQS4gSG9mZm1hbiBwcm9wYWdhdGluZyBjbGllbnRkYXRhCiAgICAgICAgICAgIGJldHdlZW4gbW9kdWxlcy4gIEFkZGVkIGNsaWVudGRhdGFfcHJvcC5tdWx0aWNwcHRlc3QgdG8gY2hlY2sgZm9yCiAgICAgICAgICAgIHRoaXMgYnVnLiAgVGhlIGZpeCBpbnZvbHZlZCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgICArIFN3aWdUeXBlX2NsaWVudGRhdGFfY29sbGVjdCBkb2VzIG5vdCBuZWVkIHRvIGNoZWNrCiAgICAgICAgICAgICAgICB0eXBlcyBpbiByX3Jlc29sdmVkIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIHByb3BhZ2F0ZSBjbGllbnRkYXRhCiAgICAgICAgICAgICAgICB0byB0eXBlZGVmZWQgY2xhc3NlcywgYW5kIHJfbWFuZ2xlZCBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdHlwZWRlZnMuCgogICAgICAgICAgICAgICAgKyBTV0lHX1R5cGVSZWdpc3RlciBub3cgY29waWVzIHRoZSBjbGllbnRkYXRhIGZpZWxkIGNvcnJlY3RseQoKICAgICAgICAgICAgICAgICsgTW92ZSBTV0lHX0d1aWxlX1Byb3BhZ2F0ZUNsaWVudERhdGEgZnVuY3Rpb24gZnJvbSBndWlsZSBtb2R1bGUKICAgICAgICAgICAgICAgIGludG8gY29tbW9uLnN3ZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGNhbGwgaXQgZnJvbSBib3RoIGd1aWxlIGFuZCB0Y2wuCgogICAgICAgICAgICAgICAgKyBBZGQgYmFzZV9uYW1lcyB0byBzd2lnX2NsYXNzIHRvIGRlbGF5IHRoZSBsb29rdXAgb2YgYmFzZXMuICBTV0lHCiAgICAgICAgICAgICAgICBub3cgZXhwb3J0cyB0aGUgYmFzZSBuYW1lcyBhbmQgb25seSB3aGVuIHRoZSBiYXNlIHN3aWdfY2xhc3MgaXMKICAgICAgICAgICAgICAgIG5lZWRlZCBpcyBTV0lHX1R5cGVRdWVyeShuYW1lKS0+Y2xpZW50ZGF0YSBsb29rZWQgdXAuCgogICAgICAgICAgICAtIGNvbnZlcnNpb25fbnNfdGVtcGxhdGUgdGVzdHN1aXRlIHRlc3Qgd2FzIGZhaWxpbmcgYmVjYXVzZQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3YXMgbm90IGNhbGN1bGF0ZWQKICAgICAgICAgICAgY29ycmVjdGx5IGZvciBzdHJ1Y3RzLiAgRml4ZWQuCgoxMC8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgdXNlZCBpbiBkaXJlY3RvcnMgLSBpbiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMgYW5kIGRpcmVjdG9yIGNvbnN0cnVjdG9ycy4KCjEwLzA2LzIwMDQ6IG1tYXR1cwoJICAgIEZpeCB0aGUgX19jcGx1c3BsdXMgbWFjcm8sIGFuZCBidWcgMTA0MTE3MC4KCSAgICBOb3cgaXQgaXMgd29ya2luZyBhcyBzdXBwb3NlZCwgaWUsIHlvdSBjYW4gc2FmZWx5IHVzZQoKCSAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwoJICAgICAgLi4uCgkgICAgCgkgICAgYWxsIG92ZXIgc3dpZywgaW5jbHVkaW5nIGluc2lkZSAlZGVmaW5lcyBhbmQgJXsgJX0gYm9kaWVzLgoKCSAgICAKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGUgb2xkIHRyaWNrIG9mIHVzaW5nCgoJICAgICAgI2lmIF9fY3BsdXNwbHVzCgoJICAgIGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4gU28sIGlmIHlvdSBoYXZlIHlvdXIgb3duIHR5cGVtYXBzCgkgICAgdXNpbmcgdGhhdCBzeW50YXgsIHlvdSB3aWxsIG5lZWQgdG8gbWlncmF0ZSB0aGVtIHRvIHVzZQoJICAgICIjaWZkZWYgX19jcGx1c3BsdXMiLgoKMTAvMDUvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVvcmdhbml6ZSBob3cgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBhbmQgc2hhcmVkCgkgICAgYmV0d2VlbiBtb2R1bGVzLiAgRm9yIGNoaWNrZW4gYW5kIG16c2NoZW1lLCBJIHJlbW92ZWQKCSAgICB0aGUgYWJpbGl0eSB0byB1c2UgcnVudGltZSBsaWJyYXJpZXMsIHdoaWxlIHBlcmwsIHRjbCwgcHl0aG9uLCBhbmQKCSAgICBydWJ5IGRlZmF1bHQgdG8gdXNpbmcgdGhlIG5ldyBtZXRob2QgYnV0IGNhbiBnbyBiYWNrIHRvIHRoZSBvbGQKCSAgICBtZXRob2QgYnkgZGVjbGFyaW5nIFNXSUdfQUxMT1dfUlVOVElNRS4KCgkgICAgLSBsaW5lIDU4MiBpbiBtenNjaGVtZS5jeHggd2FzIGdlbmVyYXRpbmcgYSBzZWdmYXVsdCBvbiAKCSAgICBpbXBvcnRzLm11bHRpY3BwdGVzdCwgc28gSSBmaXhlZCBpdC4KCjEwLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAlZXh0ZW5kIGFuZCBvdmVybG9hZGVkIHN0YXRpYyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMuCgoxMC8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIFtweXRob25dIEZpeCBkaXJlY3RvciArIG1ldGhvZCB3aXRoICdlbXB0eScgdGhyb3csIGllCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCQkgICAgCgkgICAgICBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIGFsc28gZWFzeSB0byBmaXgsIGxvb2sgZm9yCgkgICAgICBHZXRhdHRyKG4sInRocm93IikgaW4gcHl0aG9uLmN4eC4KCgkgICAgLSBGaXggZGlyZWN0b3IgKyBkZXN0cnVjdG9yIHdpdGggJ2VtcHR5JyB0aHJvdwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICB9OwoKCSAgICAtIE5vdyBTV0lHX0ZFQVRVUkVTIHBhcnNlIGFsbCBhbmQgdGhlIHNhbWUgIG9wdGlvbnMgeW91CiAgICAgICAgICAgICAgY2FuIHBhc3MgdG8gc3dpZyBpbiB0aGUgY29tbWFuZCBsaW5lLgoJICAgICAgCgkgICAgLSBOZXcgY29tbWFuZCBsaW5lIGZsYWc6IC1mZWF0dXJlcyA8bGlzdD4sIGFzIGluCgoJICAgICAgICBzd2lnIC1mZWF0dXJlcyBhdXRvZG9jPTMsZGlyZWN0b3IKCgkgICAgICBpZSwgYW55IGdsb2JhbCBmZWF0dXJlIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIHRoZQoJICAgICAgY29tbWFuZCBsaW5lLiBUaGlzIGlzIG1haW5seSBmb3IgdGVzdGluZywgYnV0IHVzZXJzCgkgICAgICBjYW4gYWxzbyB0YWtlIGFkdmFudGFnZSBvZiBpdC4KCjEwLzA0LzIwMDQ6IG1tYXR1cwoJICAgIC0gUHJvcGVybHkgcXVhbGlmeSB0eXBlIGluIHN5bnRheCBhcyAnbG9uZygyKScgb3IgJ0ZvbygpJywKCSAgICAgIHRoaXMgc29sdmUgb2xkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3MsIGFuZCBwcm9iYWJseQoJICAgICAgb3RoZXIgcHJvYmxlbXMgYXJvdW5kLiBIb3dldmVyLCB0aGUgZGVmYXVsdCBhcmcgcHJvYmxlbQoJICAgICAgd2FzIGFsc28gYWxyZWFkeSBzb2x2ZWQgYnkgV2lsbGlhbSAoc2VlIGJlbGxvdykuCgoJICAgIC0gRml4IGZlYXR1cmVfc2V0IGFuZCBmZWF0dXJlX2dldCBtZXRob2RzLiBCZWZvcmUKCSAgICAgIHRoZXkgbG9vayBmcm9tIHBhcnRpY3VsYXIgdG8gZ2VuZXJhbCBhbmQga2VlcCB0aGUgZmlyc3QKCSAgICAgIGZlYXR1cmUgZm91bmQuIFRoaXMgZGlkbid0IHdvcmsgd2VsbCB3aXRoIHRlbXBsYXRlcy4KCSAgICAgIE5vdyB0aGUgbWV0aG9kcyBsb29rIGZyb20gZ2VuZXJhbCB0byBwYXJ0aWN1bGFyLCBhbmQKCSAgICAgIG92ZXJyaWRlIGFueSBmb3VuZCBmZWF0dXJlLgoKICAgICAgICAgICAgLSBQcmV2aW91c2x5IGEgZmVhdHVyZSBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICBvciBkZXN0cnVjdG9ycyB0aGF0IHdlcmVuJ3QgZXhwbGljaXRseSBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIEZvbygpICIuLi4iCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSB+Rm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IEZvbygpIGFuZCB+Rm9vKCkKICAgICAgICAgICAgICAgIH07CgoJICAgIC0gRml4IG1pc3NpbmcgZmVhdHVyZXMgZm9yIGRlZmF1bHQgY29uc3QvZGVzdCwgYnkgcmVhbGx5CgkgICAgICAnY3JlYXRpbmcnIHRoZSBtZXRob2RzIGFuZCBhcHBseWluZyB0aGUgZmVhdHVyZXMuCgoJICAgIC0gRml4IHJldHVybl9jb25zdF92YWx1ZS5pIGNhc2UgYnkgYWRkaW5nIFN3aWdWYWx1ZVdyYXBwZXI8Y29uc3QgVD4KCSAgICAgIHNwZWNpYWxpemF0aW9uLgoKCSAgICAtIEZpeCAlZXh0ZW5kICsgb3ZlcmxvYWQsIGluY2x1ZGluZyBvdmVybG9hZGluZyBhY3R1YWwKICAgICAgICAgICAgICBjbGFzcyBtZXRob2RzLiAKCgkgICAgLSBBZGRpbmcgbW9yZSBjYXNlcyBpbiByZWxhdGVkIGZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlLiAgCgoxMC8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSB3YXkgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHdyYXBwZWQuIFByZXZpb3VzbHkgYSBzaW5nbGUKICAgICAgICAgICAgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIGVhY2ggbWV0aG9kIHRoYXQgaGFkIGRlZmF1bHQgYXJndW1lbnRzLiBJZgogICAgICAgICAgICBhIG1ldGhvZCBoYWQgNSBhcmd1bWVudHMsIHNheSwgb2Ygd2hpY2ggMSBoYWQgYSBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHRoZW4gdGhlIGNhbGwgdG8gdGhlIHdyYXBwZWQgbWV0aG9kIHdvdWxkIHBhc3MgNSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0CiAgICAgICAgICAgIHZhbHVlIHdhcyBjb3BpZWQgaW50byB0aGUgd3JhcHBlciBtZXRob2QgYW5kIHVzZWQgaWYgdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBwYXNzZWQganVzdCA0IGFyZ3VtZW50cy4gSG93ZXZlciwgdGhpcyB3YXMgZmxhd2VkIGFzIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50IHNvbWV0aW1lcyBkb2VzIG5vdCBoYXZlIGdsb2JhbCBhY2Nlc3MsIGZvciBleGFtcGxlCiAgICAgICAgICAgIFNXSUcgd291bGQgZ2VuZXJhdGUgY29kZSB0aGF0IGNvdWxkbid0IGNvbXBpbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY2xhc3MgVHJpY2t5IHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsID0gcHJpdmF0ZXZhbHVlKTsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB2YWwgPSBUcmlja3k6OmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZW51bSB7IHByaXZhdGV2YWx1ZSA9IDIwMCB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGJ1Z3MgaW4gcmVzb2x2aW5nIHN5bWJvbHMgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAocHJvYmFibHkgZml4YWJsZSB0aG91Z2gpOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3MgewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIEtsYXNzIGNvbnN0cnVjdG9yY2FsbChjb25zdCBLbGFzcyYgayA9IEtsYXNzKCkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBhcHByb2FjaCBhbHNvIGRvZXMgbm90IHdvcmsgZm9yIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkKICAgICAgICAgICAgYXMgdGhlc2UgbGFuZ3VhZ2VzIGRvIG5vdCBhbGxvdyBtZXRob2RzIHRvIGhhdmUgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAgICAgICAgQWx0aG91Z2ggQyMgaGFzIGEgbWVjaGFuaXNtIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZXkKICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhcmUgbW9yZSBsaWtlIHZhcmFyZ3MuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHNvbHZlcyB0aGUgYWJvdmUgcHJvYmxlbXMgYW5kIHdyYXBzIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLiBTbyBTV0lHIHdpbGwgbm93IHRyZWF0CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhcyBpZiBpdCBoYWQgcGFyc2VkOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgIHZvaWQgZm9vKCk7CgogICAgICAgICAgICBUaGUgY29kZSBnZW5lcmF0ZWQgaXMgdGhlbiBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIFNXSUcgaGFkIHBhcnNlZCB0aGUgdHdvCiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgY291bnQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgYW5kIGNhbGwKICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCwganVzdCBsaWtlIG92ZXJsb2FkZWQgbWV0aG9kcy4gQyMgYW5kIEphdmEgYXJlIG5vdyBhYmxlCiAgICAgICAgICAgIHRvIHByb3Blcmx5IHdyYXAgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGJ5IGdlbmVyYXRpbmcgZXh0cmEgbWV0aG9kcywKICAgICAgICAgICAgYWdhaW4gYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZCwgc28gZm9yOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcz0iaGVsbG8iLCBkb3VibGUgZD0xMC4wLCBpbnQgaT0wKTsKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJveHkgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQsIGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzKTsKICAgICAgICAgICAgICB2b2lkIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBjb21lcyB3aXRoIGEgY291cGxlIG9mIG1pbm9yIGtub2NrIG9uIGVmZmVjdHMuCgogICAgICAgICAgICAxKSBTV0lHIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGZvciBDIChub3QgQysrKSBjb2RlIG5vIGxvbmdlciB3b3Jrcy4KICAgICAgICAgICAgUHJldmlvdXNseSB5b3UgY291bGQgaGF2ZSB0aGlzIGludGVyZmFjZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGUgd3JhcHBlZCBtZXRob2QgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgcGFzcyBubyBhcmd1bWVudHMKICAgICAgICAgICAgd2hlcmV1cG9uIHRoZSBkZWZhdWx0IG9mIDAgd2FzIHVzZWQuIFlvdSBjYW4gZ2V0IHRoZSBzYW1lIGJlaGF2aW91ciBmb3IgQwogICAgICAgICAgICBjb2RlIGJ5IHVzaW5nIHRoZSAiZGVmYXVsdCIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoZGVmYXVsdCkgaW50IHZhbCAiJDEgPSAwOyI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwoKICAgICAgICAgICAgb3IgeW91IGNvdWxkIG9mIGNvdXJzZSBjb21waWxlIHlvdXIgY29kZSBhcyBDKysgaWYgeW91IHdhbnQgQysrIGZlYXR1cmVzIDopIDoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIEEgY291cGxlIG9mIFNXSUcncyBsaWJyYXJpZXMgdXNlZCB0aGlzIEMgZXh0ZW5zaW9uIGFuZCB0aGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQKICAgICAgICAgICAgdG8gdXNlIHRoZSAiZGVmYXVsdCIgdHlwZW1hcC4gVGhlICJkZWZhdWx0IiB0eXBlbWFwIGlzIHRodXMgdW5jaGFuZ2VkIChhbmQgc3RpbGwKICAgICAgICAgICAgaXMgbm90IGFuZCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGJ5IEMjIGFuZCBKYXZhLCBhbmQgaXMgbGlrZWx5IHRvIHJlbWFpbiBzbykuCgoKICAgICAgICAgICAgMikgQWxsIGZlYXR1cmVzICglZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSBldGMpIG5vIGxvbmdlciB3b3JrIGFzIGlmIHRoZSBtZXRob2QKICAgICAgICAgICAgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpcyBqdXN0IG9uZSBtZXRob2QuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CgogICAgICAgICAgICB3b3VsZCBoYXZlIGlnbm9yZWQgdGhlIG1ldGhvZCBjb21wbGV0ZWx5LiBOb3cgaXQgd2lsbCBvbmx5IGlnbm9yZSBmb28oaW50KSBidXQKICAgICAgICAgICAgbm90IHRoZSBleHRyYSBmb28oKSBtZXRob2QuIEluc3RlYWQgdXNlOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbzsKCiAgICAgICAgICAgIHRvIGlnbm9yZSB0aGVtIGFsbC4gb3IKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwoKICAgICAgICAgICAgVGhpcyBvZiBjb3Vyc2UgYWxsb3dzIG9uZSB0byBmaW5lIHR1bmUgdGhlIHdyYXBwaW5nLCBmb3IgZXhhbXBsZSBvbmUgY291bGQgdXNlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2ludCkgZm9vKGludCk7CiAgICAgICAgICAgICAgJXJlbmFtZShmb29kZWZhdWx0cykgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZW0gZnJvbSBhbnkgbGFuZ3VhZ2UgbGlrZSBzbzoKCiAgICAgICAgICAgICAgZm9vaW50KDIwMCkKICAgICAgICAgICAgICBmb29kZWZhdWx0cygpCgogICAgICAgICAgICBvciBmb3IgZXhhbXBsZSBpZ25vcmUgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kLCBzbyB0aGUgZGVmYXVsdHMgY2Fubm90IGJlIHVzZWQ6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzIvMjAwNDogbW1hdHVzCgkgICBbUHl0aG9uXQoJICAgLSBNb3JlIGNsZWFuaW5nIHVwIGFuZCB1bmlmb3JtYXRpb24gb24gdGhlIFB5dGhvbiBMaWIKCgkgICAtIEFkZGVkIFJvYmluJ3MgZG9jc3RyaW5nIHBhdGNoLCBwbHVzIHNvbWUgZml4ZXMsIHBsdXMKCSAgICAgc29tZSBleHRlbnNpb25zLCBzZWUgYXV0b2RvYy5pIGV4YW1wbGUgaW4gdGhlIHRlc3Qtc3VpdGUsCgkgICAgIGFuZCB0cnkgdXNpbmcgJWZlYXR1cmUoImF1dG9kb2MiLCJleHRlbmRlZCIpLgoJICAgIAoJICAgICBUaGlzIHBhdGNoIGlzIG5vdCBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciB0aGUKCSAgICAgZG9jdW1lbnRhdGlvbiBwcm9ibGVtLCBqdXN0IGVub3VnaCB0byBpbmZvcm0gcHl0aG9uIGFib3V0CgkgICAgIHRoZSBwYXJhbWV0ZXIgbGlzdC4KCgkgICAgIFRoZSBleHBlY3RlZCBzd2lnIGRvY3VtZW50YXRpb24gc3VwcG9ydCBpcyBmYXIgZmFyIGF3YXkgeWV0LgoJICAgICAKCjEwLzEvMjAwNDogbW1hdHVzCgkgICAtIEZpeCB0aGUgJWNhbGxiYWNrIGZlYXR1cmUgKG9ubHkgdXNlZCBpbiBydWJ5IGFuZCBweXRob24gZXhhbXBsZXMsCgkgICAgIGJ5IG5vdywgYnV0IGl0IHNob3VsZCBiZSBnZW5lcmljKSwgbm93IG1lbWJlciBjYWxsYmFja3MKCSAgICAgYXJlIHdvcmtpbmcgYWdhaW4KCSAgICAgCgkgICAtIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbnMgcG9pbnRlcnMgbGlrZQoKCQkgc3RkOjpvc3RyZWFtJiBzdGQ6OmVuZGwoc3RkOjpvc3RyZWFtJik7CgoJICAgICBpZSwgdGhlIG9uZXMgdGhhdCByZXR1cm4gcmVmZXJlbmNlcyBvciBlbnVtcy4KCSAKCSAgIFtQeXRob25dIEFkZCB0aGUgJXB5dGhvbmNhbGxiYWNrIGRpcmVjdGl2ZSwgd2hpY2ggaXMgCgkgICBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mICVjYWxsYmFjaywgaWUsCgoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgZm9vOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFyOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFybTsKCgkgICAgIGludCBmb28oaW50IGEpIHsKCSAgICAgICAgIHJldHVybiBhOwoJICAgICB9CiAgCgkgICAgIHN0cnVjdCBBIAoJICAgICB7CgkgICAgICAgc3RhdGljIGludCBiYXIoaW50IGEpOwoJICAgICAgIGludCBiYXJtKGludCBhKTsKCgkgICAgIH07CgogICAgICAgICAgICAgaW50IGZvb2JhcihpbnQgYSwgaW50ICgqcGYpKGludCBhKSk7CgoJICAgaW4gcHl0aG9uIHlvdSBjYW4gdXNlCgogICAgICAgICAgICAgZm9vKDIpCgkgICAgIGZvb2JhcigyLGZvbykKICAgICAgICAgICAgIEEuYmFyKDIpCgkgICAgIGZvb2JhcigyLEEuYmFyKQogICAgICAgICAgCiAgICAgICAgICAgaWUsIG5vIGFkZGl0aW9uYWwgcG9pbnRlciBlbGVtZW50cyBhcmUgY3JlYXRlZCwgYW5kCgkgICB0aGUgb3JpZ2luYWwgJ2ZvbycgYW5kICdBLmJhcicgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVycy4KCgkgICBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgZnVjbnRpb24gaG93ZXZlciwgc3RpbGwgeW91IG5lZWQKCSAgIHRvIHVzZSB0aGUgc3BlY2lhbCB2YXJpYWJsZSBDbGFzczo6PGZuY19uYW1lPl9jYl9wdHIsIGllOgoKIAkgICAgIGZvb2Jhcm0oMywgYSwgQS5iYXJtX2NiX3B0cikKCSAgIAoJICAgd2Ugd2lsbCB0cnkgdG8gZml4IHRoaXMgc2l0dWF0aW9uIGFsc28sIGJ1dCBsYXRlci4gIAoKCSAgIFtQeXRob25dIEFkZCBtb3JlIGVsZW1lbnRzIGZyb20gdGhlIFNUTCBsaWJyYXJ5LCBub3cKCSAgIHlvdSBjYW4gdXNlCgoJICAgICBpbXBvcnQgc3RkCgkgICAgIHN0ZC5jb3V0IDw8ICJoZWxsbyAiIDw8IDEyMyA8PCBzdGQuZW5kbAoKCSAgIFtQeXRob25dIEZpeCBpbi9vdXQgcmV0dXJuIG1lY2hhbmlzbSwgbm93IHN3aWcgd2lsbCBiZWhhdmUKCSAgIGFzIDEuMy4yMSBidXQgdXNpbmcgYSBweXRob24gbGlzdCB3aGVuIG5lZWRlZC4gVGhlIHByb2JsZW0KCSAgIGlzIHRoYXQgdGhlIHR5cGVzIHN0ZDo6cGFpcixzdGQ6OnZlY3RvcixldGMsIHVzZSB0dXBsZXMsCgkgICBhbmQgdGhleSBpbnRlcmZlciB3aXRoIHRoZSBwcmV2aW91cyBpbm91dCB0dXBsZSB0eXBlLgoKCSAgIEJ5IHVzaW5nIGxpc3RzIHdlIHNvbHZlIHRoZSBjb25mbGljdHMsIHN3aWcgYWN0cyBhcyBiZWZvcmUsCgkgICBidXQgcmV0dXJucyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhcmUgdXNpbmcKCSAgIHRoZSBPVVQgdHlwZW1hcC4gU2VlIHRoZSBuZXcgaW5vdXQuaSBleGFtcGxlIGluIHRoZQoJICAgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJCSAgIAogICAgICAgICAgIFtQeXRob25dIE11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBiYWQgYXJndW1lbnRzLCBub3cKCSAgIHlvdSBhbHdheXMgZ2V0IHRoZSBhcmd1bWVudCBudW1iZXIgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgoKMDkvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSAtCiAgICAgICAgICAgIDEpIFdhcm5pbmcgZW1pdHRlZCB3aGVuIC1pbXBvcnRhbGwgYW5kIC1pbmNsdWRlYWxsIGlzIHVzZWQgdG9nZXRoZXIsCiAgICAgICAgICAgICAgIHdpdGggLWluY2x1ZGVhbGwgdGFraW5nIHByZWNlZGVuY2UuCiAgICAgICAgICAgIDIpIEVuc3VyZSBTV0lHSU1QT1JURUQgaXMgYWx3YXlzIGRlZmluZWQgd2hlbiBhIGZpbGUgaXMgYmVpbmcKICAgICAgICAgICAgICAgaW1wb3J0ZWQgd2l0aCAlaW1wb3J0LiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgU1dJR0lNUE9SVCwKICAgICAgICAgICAgICAgd2hpY2ggZ2V0cyBkZWZpbmVkIGluIGFsbCBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlcy4KCjA5LzI2LzIwMDQ6IG1tYXR1cwoKCSAgICAtIGFkZCAlZmVhdHVyZSgiZXhjZXB0aW9uY2xhc3MiKSB0byBpZGVudGlmeSBhIGNsYXNzIHVzZWQKCSAgICAgIGFzIGV4Y2VwdGlvbi4gQmVmb3JlIHN3aWcgaWRlbnRpZmllZCBhbmQgbWFya2VkIGEgY2xhc3MKCSAgICAgIHVzaW5nIHRoZSAiY3BsdXM6ZXhjZXB0aW9uY2xhc3MiIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlCgkgICAgICBjbGFzcyBuZWVkZWQgdG8gYXBwZWFyIG9uIGFuIHRocm93KCkgc3RhdGVtZW50LiAgTm93CgkgICAgICBzd2lnIGtlZXBzIHRyeWluZyB0byBpZGVudGlmeSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMsIGFzCgkgICAgICBiZWZvcmUsIGJ1dCBpdCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBtYXJrIGEgY2xhc3MgYnkKCSAgICAgIHVzaW5nIHRoZSAlZmVhdHVyZSBleHBsaWNpdGx5LiAobW9zdGx5IHJlbGV2YW50IGZvcgoJICAgICAgcHl0aG9uIGFuZCBjaGlja2VuKQoKCSAgICBbUHl0aG9uXQoKCSAgICAtIGZpeCAtbW9kZXJuIG9wdGlvbiArIGV4Y2VwdGlvbnMsIHdoaWNoIG1peCBvbGQgY2xhc3MKCSAgICAgIHN0eWxlIHdpdGggdGhlIG5ldyBvbmUuIFNvLCB3ZSBhbHdheXMgbmVlZCB0byBlbWl0CgkgICAgICB0aGUgIm5vbm1vZGVybiIgcHl0aG9uIGNvZGUuCgoJICAgIC0gYWRkIHRoZSAicHl0aG9uOm5vbmR5bmFtaWMiIGZlYXR1cmUgYW5kIGl0cyBoYW5kbGVyCgoJICAgICAgbm93IGlmIHlvdSBoYXZlCgkgICAgICAKCSAgICAgICVweXRob25ub25keW5hbWljKDEpIEE7CgkgICAgICAKCSAgICAgIHN0cnVjdCBBIHsKCSAgICAgICBpbnQgYTsKCSAgICAgICBpbnQgYjsKCSAgICAgIH07CgoJICAgICAgdGhlbiwgaW4gdGhlIHB5dGhvbiBzaWRlCgkgICAgICAKCSAgICAgIGFhID0gQSgpCgkgICAgICAKCSAgICAgIGFhLmEgPSAxICMgb2sKCSAgICAgIGFhLmIgPSAyICMgb2sKCSAgICAgIGFhLmMgPSAzICMgZXJyb3IsIHRoZSBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIGR5bmFtaWNhbGx5LgoKCSAgICAKCSAgICBTaW5jZSB0aGlzIGlzIGEgZmVhdHVyZSwgeW91IGNhbiB1c2UKCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYygxKTsKCiAgICAgICAgICAgIG9yIAoKCSAgICAgICVweXRob25keW5hbWljKDApOyBbIE5vdGU6ICVweXRob25keW5hbWljIHNpbmNlIGRlcHJlY2F0ZWQgXQogICAKCSAgICB0byBmb3JjZSBhbGwgdGhlIHdyYXBwZWQgY2xhc3NlcyB0byBiZSAibm9uZHluYW1pYyIgb25lcy4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHJlZ3VsYXIgcHl0aG9uLCBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZAoJICAgIGNsYXNzZXMgYXJlIGR5bmFtaWNzLiBTbywgY2FyZWZ1bCB3aXRoIHlvdXIgc3BlbGxpbmcuCgowOS8xNC8yMDA0OiBtbWF0dXMgCgkgICAgLSBTdXBwb3J0IHRoZSAtSS0gb3B0aW9uLgoKCSAgICAtIERpZmZlcmVudGlhdGUgYmV0d2VlbiAlaW5jbHVkZSA8ZmlsZT4gYW5kICVpbmNsdWRlICJmaWxlIi4KCSAgICAgIFRoaXMgZml4IHNldmVyYWwgY29ybmVyIGNhc2VzLgoKCSAgICAKCSAgICBbUHl0aG9uXSBTZXZlcmFsIHBhdGNoZXM6CgoJICAgIC0gTm9ybWFsaXplIHRoZSBMaWIgZmlsZSBuYW1lczogCgkJKi5zd2cgaW50ZXJuYWwgZmlsZXMsIAoJCSouaSAgIHVzZXIgZmlsZXMuCgoJICAgIC0gRml4IENoYXJbQU5ZXSB0eXBlbWFwcywgc28gdGhleSBhbHNvIGRlbGV0ZSBhbnkgZXh0cmEgJ1wwJyBjaGFycywKCSAgICAgIG5vdyB0aGV5IGJlaGF2ZSBhcyBiZWZvcmUgKDEuMy4yMSkuIFN0aWxsLCB5b3UgY2FuIHVzZQoJICAgICAgdGhlIFNXSUdfUFJFU0VSVkVfQ0FSUkFZX1NJWkUgbWFjcm8gaWYgeW91IG5lZWQgdG8KCSAgICAgIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzaXplIChzZWUgcHlzdHJiYXNlLnN3ZykuCgoJICAgIC0gQWRkIHRoZSBDaGFyIEZJWFNJWkVbQU5ZXSB0eXBlbWFwcywgdG8gcHJlc2VydmUgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgQyBhcnJheSBzaXplcyAoc2VlIGFib3ZlKS4gVGhvdWdoLCB5b3UgY2FuJ3QKICAgICAgICAgICAgICB1c2UgdGhlbSB5ZXQgc2luY2UgJWFwcGx5IGFuZCBhcnJheXMgYXJlIG5vdCB3b3JraW5nCiAgICAgICAgICAgICAgdG9nZXRoZXIuCgogICAgICAgICAgICAtIEFkZCBweWZyYWdtZW50cy5zd2csIG5vdyB0aGUgdXNlciBjYW4gYWRkIGZyYWdtZW50cwoJICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb25lcy4KCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2Ugd2hpY2ggZml4ZXMgc3B1cmlvdXMgcHJlcHJvY2Vzc29yIGJ1ZyB3aGljaAogICAgICAgICAgICBzaG93cyBvbiBTb2xhcmlzIGFuZCBnY2MsIGVnOgogICAgICAgICAgICAgICAgV2FybmluZygyMDIpOiBDb3VsZCBub3QgZXZhbHVhdGUgJyFkZWZpbmVkKFNXSUdKQVZBKSAmJgogICAgICAgICAgICAgICAgIShkZWZpbmVkKFNXSUdDU0hBUlApJwogICAgICAgICAgICBBbHNvIGZpeGVzIGEgYnVnIHdoZXJlICcjaWYgImEiID09ICJiIiA9PSAxJyB3b3VsZG4ndCBoYXZlIHdvcmtlZCAKCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciB0aGUgdGVzdC1zdWl0ZS4gUGF0Y2ggZnJvbQogICAgICAgICAgICBCaWxsIENsYXJrZS4KCjA5LzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBtaXNzaW5nIHJ1bnRpbWUuZHNwIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlcyBmb3IgdGhlCiAgICAgICAgICAgIGltcG9ydCBleGFtcGxlcyB0byB3b3JrLgoKClZlcnNpb24gMS4zLjIyIChTZXB0ZW1iZXIgNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHN3aWcubTQgbWFjcm8gZm9yIHVzZSB3aXRoIHRoZSBBdXRvY29uZi9BdXRvbWFrZS9MaWJ0b29sIGhhcwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBhbmQgYmV0dGVyCiAgICAgICAgICAgIG1haW50YWluZWQgdmVyc2lvbiBkZXJpdmVkIGZyb20gc3dpZy5tNCBpbiB0aGUgQXV0b2NvbmYgbWFjcm8gYXJjaGl2ZS4KICAgICAgICAgICAgU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcGtnX3N3aWcuaHRtbCBhbmQKICAgICAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19weXRob25fZGV2ZWwuaHRtbC4KCjA5LzAxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkIHBhdGNoICMxMDE5NjY5IGZyb20gQ2hyaXN0b3BoIEZsYW1tLiBBZGRzIHN1cHBvcnQKICAgICAgICAgICAgZm9yICVmZWF0dXJlKCJzaGFkb3ciKSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd29ya3MgaW4gUHl0aG9uLiBUaGlzCiAgICAgICAgICAgIGVuYWJsZXMgb25lIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgc2hhZG93L3Byb3h5IG1ldGhvZHMsIGluY2x1ZGluZwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgLyogTGV0J3MgbWFrZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIFNxdWFyZSBtb3JlIHZlcmJvc2UgKi8KCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpIFNxdWFyZShkb3VibGUgdykKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3ViIG5ldyB7CiAgICAgICAgICAgICAgICAgIG15ICRwa2cgPSBzaGlmdDsKICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgPSBleGFtcGxlYzo6bmV3X1NxdWFyZShAXyk7CiAgICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiQ29uc3RydWN0ZWQgYW4gQHtbcmVmKCRzZWxmKV19XG4iOwogICAgICAgICAgICAgICAgICBibGVzcyAkc2VsZiwgJHBrZyBpZiBkZWZpbmVkKCRzZWxmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICBjbGFzcyBTcXVhcmUgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIFNxdWFyZShkb3VibGUgdyk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMDgvMzEvMjAwNDogbW1hdHVzIAoJICAgIFtQeXRob25dIEluY29tcGF0aWJpbGl0eSByZXBvcnRlZCBieSBCaWxsIENsYXJrZSAobGxpYkBjb21wdXRlci5vcmcpOgoJICAgIAoJICAgIElmIHlvdSBhcmUgdXNpbmcgU3VuIFN0dWRpbyA4IChhbmQgcG9zc2libHkgZWFybGllcgoJICAgIHZlcnNpb25zKSB0byBjb21waWxlIHRoZSBvdXRwdXQgcHJvZHVjZWQgYnkgc3dpZwoJICAgIDEuMy4yMnJjMSwgYW5kIHlvdSBhcmUgdXNpbmcgQysrIGFuZCBTVEwgdGVtcGxhdGVzIHRoZW4KCSAgICB5b3UgbmVlZCB0byB1c2UgZWl0aGVyICItcnVudGltZSIgb3IgIi1ub3J1bnRpbWUiLiAgSWYgeW91CgkgICAgdXNlIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IGdldAoJICAgIGNvbXBpbGVyIGVycm9ycyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSB3cmFwcGVyIGZpbGU7CgkgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsaWtlIHRoaXM6IFRoZSBuYW1lCgkgICAgU1dJR19QeXRob25fQ29udmVydFB0clsuLi5dIGlzIHVudXNhYmxlIGluIHN0YXRpYwoJICAgIHN3aWdweTo6dHJhaXRzX2FzcHRyWy4uLl0gIElmIHlvdSBnZXQgdGhpcyBlcnJvciBtZXNzYWdlLAoJICAgIHlvdSBuZWVkIHRvIHJlZ2VuZXJhdGUgeW91ciB3cmFwcGVyIGZpbGUgdXNpbmcgJ3N3aWcKCSAgICAtcnVudGltZScgb3IgJ3N3aWcgLW5vcnVudGltZScuCgoJICAgIFlvdSBzaG91bGRuJ3QgZ2V0IHRoaXMgcHJvYmxlbSB3aXRoIFN1biBTdHVkaW8gOS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJICAgIAowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCAjOTMyMzMzIGZyb20gSWtlZ2FtaSBUc3V0b211LiBGaXhlcyBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICBhbmQgdW5zaWduZWQgbG9uZyBsb25nICpPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzg1NzM0NCBmcm9tIEFydCBZZXJrZXMuIFdvcmthcm91bmQgZm9yIGF1dG9jb25mIGJ1ZyB3aGVuCiAgICAgICAgICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGFydCBvZiBwYXRjaCAjOTgyNzUzIGFwcGxpZWQuIFRoaXMgaW1wbGVtZW50cyBhICVwZXJsY29kZSBkaXJlY3RpdmUuCiAgICAgICAgICAgIEl0IGFsbG93cyBvbmUgdG8gYWRkIFBlcmwgY29kZSB0byB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiBXb3JrcyB0aGUgc2FtZSAKICAgICAgICAgICAgYXMgJXB5dGhvbmNvZGUuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyB2aXJ0dWFsIG1ldGhvZHMgd2l0aCBleGNlcHRpb24KICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhdCB3ZXJlIG5vdCBzaW1wbGUgdHlwZXMuIFByZXZpb3VzbHkgY29kZSB3YXMgZ2VuZXJhdGVkIHRoYXQKICAgICAgICAgICAgZGlkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlIHdoZW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdhcyBhIHBvaW50ZXIuCgowOC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXAgZml4IGZvciBtZXRob2RzIHRoYXQgcmV0dXJuIGNoYXIgKi4gVGhlIENMUiB3b3VsZCBpbmNvcnJlY3RseQogICAgICAgICAgICBkZWxldGUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGNoYXIgKi4gQWxzbyBhcHBsaWVkIHRoZSBzYW1lIGNvcnJlY3Rpb24gdG8KICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMuCgowOC8yNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgLWZtaWNyb3NvZnQgZXJyb3Ivd2FybmluZyBtZXNzYWdlIGRpc3BsYXk6IAogICAgICAgICAgICAtIEVuZCBvZiBmaWxlIChFT0YpIHdhcm5pbmcgbWVzc2FnZXMgbm90IGRpc3BsYXlpbmcgaW4gY29ycmVjdCBmb3JtYXQKICAgICAgICAgICAgLSBTb21lIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYSBmaWxlIHBhdGggd2VyZSBkaXNwbGF5aW5nIGEgZG91YmxlIGJhY2tzbGFzaAogICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBzaW5nbGUgYmFja3NsYXNoCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICMxMDExNjA0IHN1Ym1pdHRlZCBieSBDaGFybGVzIFNjaHdpZXRlcnMuIEZpeCBmb3IgNjQgYml0IHRjbAogICAgICAgICAgICBpbnRlcnByZXRlcnMuCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGJ1ZyAjODc1NTgzIC0gZW51bSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBwcmV2aW91c2x5IGdhdmUgYSBzeW50YXggZXJyb3IuCgowOC8yMy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSB0eXBlbWFwcyAiZmZpdHlwZSIgYW5kICJsaXNwdHlwZSIgdG8gZGV0ZXJtaW5lIHRoZSBGRkkgdHlwZQoJICAgIHNwZWNpZmllcnMgZnJvbSB0aGUgQyB0eXBlLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGluc3RhbmNlLCB0byBjb250cm9sCgkgICAgd2hldGhlciBhIEMgImNoYXIiIGFyZ3VtZW50IHRha2VzIGEgTGlzcCBjaGFyYWN0ZXIgb3IgYSBMaXNwIGludGVnZXIgdmFsdWUuCgkgICAgVGhlIGRlZmF1bHQgKHRha2luZyBMaXNwIGNoYXJhY3RlcnMpIGlzIGRvbmUgYnkgdGhlc2UgYnVpbHQtaW4gdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJjaGFyYWN0ZXIiOwoJICAgIElmIGNoYXIgbWVhbnMgYW4gaW50ZWdlciBpbnN0ZWFkLCB1c2UgdGhlc2UgdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJpbnRlZ2VyIjsKCjA4LzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFzIGRpc2N1c3NlZCBpbiBidWcgIzc3MjQ1MywgdGhlIFNXSUcgbGlicmFyeSBkaXJlY3RvcnkgaXMgbm93IGluc3RhbGxlZAogICAgICAgICAgICBpbnRvIGEgZGlmZmVyZW50IGRlZmF1bHQgZGlyZWN0b3J5LiBUaGUgbGlicmFyeSB1c2VkIHRvIGJlIGluc3RhbGxlZCB0bwogICAgICAgICAgICAvdXNyL2xvY2FsL2xpYi9zd2lnMS4zLiBJdCBpcyBub3cgaW4gdGhlIG1vcmUgdXN1YWwgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50CiAgICAgICAgICAgIGRpcmVjdG9yeSBhbmQgSSBoYXZlIGFkZGl0aW9uYWxseSB1c2VkIGEgdmVyc2lvbiBzcGVjaWZpYyBzdWJkaXJlY3RvcnkgYXMKICAgICAgICAgICAgdGhlIGxpYnJhcnkgd2lsbCByYXJlbHkgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFNXSUcuIFRoaXMgcmVsZWFzZQogICAgICAgICAgICB3aWxsIHRodXMgdXNlIC91c3IvbG9jYWwvc2hhcmUvc3dpZy8xLjMuMjIgYnkgZGVmYXVsdCwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHRhaWxvcmVkIGFzIGJlZm9yZSB1c2luZyAnLi9jb25maWd1cmUgLS1zd2lnbGliZGlyJy4KCjA4LzE3LzIwMDQ6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIEFkZCBzdXBwb3J0IHRvIGNyZWF0ZSBuYXRpdmUgTXpTY2hlbWUgc3RydWN0dXJlcyBmcm9tIEMgc3RydWN0dXJlcy4KCSAgICBUbyBjb252ZXJ0IGEgQyBzdHJ1Y3R1cmUgdG8gYW4gTXpTY2hlbWUgc3RydWN0dXJlLCB1c2UgdGhlIG5ldyBydW50aW1lIG1hY3JvCgkgICAgU1dJR19OZXdTdHJ1Y3RGcm9tUHRyIGluIGEgdHlwZW1hcC4gIFBhdGNoIGZyb20gRG1pdHJpeSBaYXZpbi4gCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODM3NzE1IGZyb20gQmVuIFJlc2VyIHRvIGNvcnJlY3RseSBkZXRlY3QgUHl0aG9uIGxpYiBkaXJlY3RvcnkKICAgICAgICAgICAgb24gNjQgYml0IHN5c3RlbXMuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIEphdmFdIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIHRoZSBjYXNlIG9mIGVhcmx5IHJldHVybgogICAgICAgICAgICBmcm9tIHdyYXBwZXIgbWV0aG9kcyB1c2luZyBjb25zdCBzdGQ6OnN0cmluZyAmIHBhcmFtZXRlcnMuIE1vZGlmaWVkCiAgICAgICAgICAgIE1hcmsgVHJhdWR0IHBhdGNoICM5NTE1NjUuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgIzk0Mzc4MyB3aXRoIHBhdGNoIGZpeGVzIHBocCBjaGFyICogb3V0IHR5cGVtYXAgTlVMTCB2YWx1ZXMuCgowOC8wMy8yMDA0OiBBaG1vbiBEYW5jeSAgPGRhbmN5QGRhbmN5PgoKICAgICAgICAgICAgW2FsbGVncm9jbF0gQWRkaXRpb25hbCBjYXNlIG1vZGUgZml4ZXMuICBBbHNvLCBtYWtlIHN1cmUKCSAgICBmb3JlaWduIHR5cGVzIGFyZSBleHBvcnRlZC4KCjA3LzI0LzIwMDQ6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIFNXSUcgbW9kdWxlcyBub3cgZXhjaGFuZ2UgdGhlaXIgcG9pbnRlciB0eXBlCgkgICAgaW5mb3JtYXRpb24gdmlhIHRoZSBHdWlsZSBpbnRlcnByZXRlci4gIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYnVpbGQgYQoJICAgIHJ1bnRpbWUgbGlicmFyeSBvciB0byB1c2UgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgZXRjLgoJICAgIAoJICAgIFRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlIGNoYW5nZSBvZiAwNS8xNy8yMDA0IGlzCgkgICAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgYnVpbHQuICBJZiB5b3UgbmVlZCBpdCwgcnVuIFNXSUcgb24gdGhlIGludGVyZmFjZSBmaWxlCgkgICAgc3dpZ3J1bi5pLiAKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQnVnICM5MTc2MDEgTWFwcGluZyBDKysgYm9vbCBmaXggZnJvbSBNYXJrIFRyYXVkdAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUlBNIGZpeGVzIGZvciBsYXRlc3QgQ1ZTIHZlcnNpb24gaW5jbHVkaW5nIHJlbW92YWwgb2YgcnVudGltZQogICAgICAgICAgICBsaWJyYXJ5LgoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzkwODk1NSBmcm9tIFJvYmVydCBIIERlIFZyaWVzLgogICAgICAgICAgICBSUE0gZmlsZSBnZW5lcmF0aW9uIGZpeCBmb3IgRmVkb3JlIENvcmUgMSBhbmQgUmVkaGF0IEFTMi4xLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzg2NDY4OSBmcm9tIFJvYmluIER1bm46CgogICAgICAgICAgICBUaGlzIHBhdGNoIGNvcnJlY3RzIHR3byBwcm9ibGVtcyBpbiB0aGUgWE1MIG91dHB1dCBvZiBTV0lHOgogICAgICAgICAgICAgCiAgICAgICAgICAgICAgMS4gVGhlcmUgd2VyZSBvZnRlbiBleHRyYSAnLz5cbicgaW4gdGhlIG91dHB1dC4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAyLiB2YWx1ZSBhdHRyaWJ1dGVzIHdlcmUgb3V0cHV0IHdpdGggJ1xuJyBpbiB0aGVtIGJ1dAogICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbm90IHRlY2huaWNhbGx5IGxlZ2FsIG1vc3QgKGFsbD8pIFhNTAogICAgICAgICAgICAgIHBhcnNlcnMgd2lsbCBzdHJpcCB0aGVtIG91dC4gUmVwbGFjaW5nIHRoZSAnXG4nIHdpdGgKICAgICAgICAgICAgICB0aGUgJyYjMTA7JyBlbnRpdHkgcmVmZXJlbmNlIHNvbHZlcyB0aGlzIGFzIHRoYXQgaXMKICAgICAgICAgICAgICBsZWdhbCBhbmQgWE1MIHBhcnNlcnMgd2lsbCBjb252ZXJ0IGl0IHRvIGEgJ1xuJyB3aGVuCiAgICAgICAgICAgICAgcmVhZGluZyB0aGUgdmFsdWVzIGJhY2sgaW4uCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGFkZHMgYSBuZXcgZ2xvYmFsIGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAgICAgICAgICB0aGF0IHdpbGwgYWxsb3cgdGhlIHBhcnNlIHRyZWUgdG8gYmUgd3JpdHRlbiBvdXQgaW4gWE1MCiAgICAgICAgICAgICAgKmFmdGVyKiBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZSBoYXMgYmVlbiBydW4sIGluCiAgICAgICAgICAgICAgb3JkZXIgdG8gYmUgYWJsZSB0byBnZXQgZXh0cmEgaW5mbyB0aGF0IHRoZSBsYW5ndWFnZQogICAgICAgICAgICAgIG1vZHVsZSBwdXRzIGluIHRoZSB0cmVlLiBJbiB0aGlzIHdheSB0aGUgWE1MIGlzIGEKICAgICAgICAgICAgICBwb3N0LXByb2Nlc3NlZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIHJhdGhlciB0aGFuIGEKICAgICAgICAgICAgICBwcmUtcHJvY2Vzc2VkIHZlcnNpb24uIAogCiAgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbiBpcyAtZHVtcF94bWwgb3IgLXhtbG91dCA8ZmlsZT4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB0byBmaXggdHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcwogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEhUTUwgZG9jdW1lbnRhdGlvbiAobWFrZWNoYXAucHkpIGZpbGUgZ2VuZXJhdG9yIG1pc3NpbmcgZW5kIG9mIGxpbmUKICAgICAgICAgICAgcGF0Y2ggIzkwODk1MSBmcm9tIFJvYmVydCBkZSBWcmllcy4KCjA3LzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBkZXByZWNhdGVkIHJ1bnRpbWUgbGlicmFyeSBidWlsZCBoYXMgYmVlbiByZW1vdmVkLiBUaGlzIGFsc28gcmVtb3ZlcwogICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBvbiBMaWJ0b29sLiBMaWJ0b29sIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBidWlsZCBTV0lHLgogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCAtbGRmbGFncyBTV0lHIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYWxzbyBiZWVuIHJlbW92ZWQuCgogICAgICAgICAgICBUaGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdGVzdGNhc2VzIHRoYXQgdXNlZCB0aGUgcnVudGltZSBsaWJyYXJ5IGhhdmUKICAgICAgICAgICAgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgcmVwbGFjZW1lbnQgYXBwcm9hY2ggdG8gdXNpbmcgU1dJRyBhY3Jvc3MgCiAgICAgICAgICAgIG11bHRpcGxlIG1vZHVsZXMsIHRoYXQgaXMgdGhleSB1c2UgdGhlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMsIHNlZSBNb2R1bGVzLmh0bWwuIEVmZmVjdGl2ZWx5IHRoZXkgYnVpbGQgdGhlaXIgb3duIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyaWVzIHVzaW5nIC1ydW50aW1lLiBUaGUgZXhhbXBsZXMgYXJlIGltcG9ydCBhbmQgaW1wb3J0X3RlbXBsYXRlLgogICAgICAgICAgICBUaGUgdGVzdCBjYXNlcyBhcmUgaW4gdGhlIGltcG9ydHMgYW5kIHRlbXBsYXRlX3R5cGVkZWZfaW1wb3J0IGRpcmVjdG9yaWVzLgoKICAgICAgICAgICAgQW55b25lIHdobyB3YW50cyB0aGUgb3JpZ2luYWwgcnVudGltZSBsaWJyYXJpZXMgY2FuIGVpdGhlciBydW4gdGhlIHRlc3Qtc3VpdGUKICAgICAgICAgICAgb3IgYnVpbGQgdGhlIGV4YW1wbGVzIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBvYmplY3QvRExMIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIHdpdGggdGhlIC1ydW50aW1lIGNvbW1hbmRsaW5lIG9wdGlvbi4gRm9yIGV4YW1wbGUgbGliaW1wb3J0c19ydW50aW1lLnNvCiAgICAgICAgICAgIChQeXRob24gY2FsbHMgaXQgbGliX2ltcG9ydHNfcnVudGltZS5zbykgaXMgZ2VuZXJhdGVkIGFmdGVyIHJ1bm5pbmcgdGhlIAogICAgICAgICAgICAnbWFrZSBpbXBvcnRzLm11bHRpY3BwdGVzdCcgdGVzdGNhc2UgaW4gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvPGxhbmc+CiAgICAgICAgICAgIGRpcmVjdG9yeS4gT3IgdXNlIGxpYnJ1bnRpbWUuc28gLyBydW50aW1lLmRsbCBhZnRlciBidWlsZGluZyB0aGUgaW1wb3J0CiAgICAgICAgICAgIGV4YW1wbGVzIGluIEV4YW1wbGVzLzxsYW5nPi9pbXBvcnQuCgowNy8wNy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIENvbnZlcnQgY2hhcmFjdGVyIGFuZCBzdHJpbmcgbGl0ZXJhbHMgaW4gY29uc3RhbnRzIHRvIAoJICAgIENMIHN5bnRheC4gIEZpeCBGRjpERUYtRk9SRUlHTi1DQUxMIGZvciBtaXhlZC1jYXNlIEMgZnVuY3Rpb25zLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyBmZWF0dXJlIGZvciBKYXZhIGV4Y2VwdGlvbnMgd2l0aCBmb3JtYXQgJWphdmFleGNlcHRpb24oZXhjZXB0aW9uY2xhc3NlcykuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBhIHNsaWdodCBlbmhhbmNlbWVudCB0byAlZXhjZXB0aW9uIGFuZCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSAKICAgICAgICAgICAgYWRkaXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgaW50byBhIHRocm93cyBjbGF1c2UuCiAgICAgICAgICAgIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGFzc29jaWF0ZWQgcHJveHkgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4gVGhlICdleGNlcHRpb25jbGFzc2VzJwogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIGxpa2UgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIGluIHRoZSAndGhyb3dzJyBhdHRyaWJ1dGUgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXBzLiBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvcnJlY3RseSBoYW5kbGluZyBjaGVja2VkIGV4Y2VwdGlvbnMKICAgICAgICAgICAgdGhyb3duIGZyb20gSk5JIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWV4Y2VwdGlvbigiamF2YS5sYW5nLkV4Y2VwdGlvbiIpIHRocm93RXhjZXB0aW9uICV7CiAgICAgICAgICAgICAgICAuLi4gY29udmVydCBhIHN0ZDo6bG9naWNfZXJyb3IgaW50byBhIGphdmEubGFuZy5FeGNlcHRpb24gdXNpbmcgSk5JIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICAgICAgICAgICAgICB2b2lkIHRocm93RXhjZXB0aW9uKCkgewogICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiTG9naWMgZXJyb3IhIik7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBhIG1ldGhvZCB3aXRoIGEgdGhyb3dzIGNsYXVzZSBpbiB0aGUgbW9kdWxlIGNsYXNzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7IC4uLiB9CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyAlY3Njb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gVGhpcyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgJWphdmFjb25zdHZhbHVlLiBGb3IgQyMsIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgIGlzIHRoZSBvbmx5IHdheSB0aGF0IG9uZSBjYW4gZml4IHdyYXBwaW5nIG9mIEMvQysrIGVudW1zIHdpdGggcHJvcGVyIEMjCiAgICAgICAgICAgIGVudW1zIGlmIHRoZSBlbnVtIGl0ZW0ncyBpbml0aWFsaXNlciBjYW5ub3QgY29tcGlsZSBhcyBDIyBjb2RlLiBUaGlzIGlzCiAgICAgICAgICAgIGJlY2F1c2UgSmF2YSBlbnVtcyBjYW4gdXNlIGEgY2FsbCBpbnRvIEMgY29kZSB0byBpbml0aWFsaXNlIHRoZSBlbnVtIGl0ZW0sCiAgICAgICAgICAgIHdoZXJlYXMgaW4gQyMsIHRoZSBlbnVtIHZhbHVlIG11c3QgYmUgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuIFRoYXQgaXMsCiAgICAgICAgICAgIHVzaW5nICVjc2NvbnN0KDApIGNhbm5vdCBiZSB1c2VkIGluIEMjIHRvIGluaXRpYWxpc2UgdGhlIEMjIGVudW0gaXRlbSB2aWEKICAgICAgICAgICAgYSBQSU5WT0tFIGNhbGwuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3ICVqYXZhY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFNvbWV0aW1lcyB0aGUgdXNlIG9mICVqYXZhY29uc3QoMSkgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCB3b24ndCBjb21waWxlCiAgICAgICAgICAgIHVuZGVyIEphdmEuIElmIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IGlzIHJlcXVpcmVkLCAlamF2YWNvbnN0KDApIGlzIG5vdCBhbgogICAgICAgICAgICBvcHRpb24uIFRoZSAlamF2YWNvbnN0dmFsdWUgZGlyZWN0aXZlIGFjaGlldmVzIHRoaXMgZ29hbCBhbmQgdGhlIHZhbHVlIHNwZWNpZmllZAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQgYXMgSmF2YSBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSk7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwMDApIEJJRzsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoIm5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihcIjIwMDBcIikiKSBMQVJHRTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTApIGJhcjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgY29uc3QgaW50IGJhciA9IDEwOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgI2RlZmluZSBCSUcgMTAwMExMCiAgICAgICAgICAgICAgICAjZGVmaW5lIExBUkdFIDIwMDBVTEwKICAgICAgICAgICAgICAgIGVudW0gRm9vIHsgQkFSID0gOjpiYXIgfTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgR2VuZXJhdGVzOgoKICAgICAgICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIGV4YW1wbGVDb25zdGFudHMgewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEwMDA7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIExBUkdFID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIyMDAwIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGb28gQkFSID0gbmV3IEZvbygiQkFSIiwgMTApOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUHJldmlvdXNseSwgbm9uZSBvZiBCSUcsIExBUkdFIG9yIEJBUiB3b3VsZCBoYXZlIHByb2R1Y2VkIGNvbXBpbGVhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgZW5oYW5jZW1lbnRzLiBGZWF0dXJlcyBjYW4gbm93IHRha2UgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGluIGFkZGl0aW9uIHRvIHRoZSBmZWF0dXJlIG5hbWUgYW5kIGZlYXR1cmUgdmFsdWUuIFRoZSBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbCAKICAgICAgICAgICAgYW5kIGFyZSBtdWNoIHRoZSBzYW1lIGFzIHRoZSB0eXBlbWFwIGF0dHJpYnV0ZXMuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHNwZWNpZmllcyB0d28gb3B0aW9uYWwgYXR0cmlidXRlcywgYXR0cmliMSBhbmQgYXR0cmliMjoKCiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lICJ2YWwiOwogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIHZhbCwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lOwoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciB0aGUgc3ludGF4IHRoYXQgdGFrZXMgdGhlIGZlYXR1cmUgdmFsdWUgd2l0aGluIHRoZQogICAgICAgICAgICAlZmVhdHVyZSgpIGJyYWNrZXRzLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vIGxvbmdlciByZXN0cmljdGVkIHRvIGJlaW5nIGp1c3QKICAgICAgICAgICAgYSBzdHJpbmcuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgbm93IGFjY2VwdGFibGUKICAgICAgICAgICAgc3ludGF4OgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsMjAuMCk7CiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZCBoYXZlIHRvIGhhdmUgYmVlbjoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLCIyMC4wIik7CiAgICAgICAgICAgIFVzZWZ1bCBmb3IgZmVhdHVyZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMgYSBtYWNybywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSAlc29tZWZlYXR1cmUodmFsdWUpICAgICAgJWZlYXR1cmUoInNvbWVmZWF0dXJlIix2YWx1ZSkKICAgICAgICAgICAgVGhlc2Ugd2lsbCBub3cgd29yayBhY2NlcHRpbmcgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyOgogICAgICAgICAgICAgICVzb21lZmVhdHVyZSgiRnJlZCIpOwogICAgICAgICAgICAgICVzb21lZmVhdHVyZSg0KTsKCjA2LzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbiwgR3VpbGVdCiAgICAgICAgICAgICAtIENyZWF0ZWQgdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvc2NoZW1lcnVubWUgZGlyZWN0b3J5LCB3aGljaCBob2xkcyBhbGwgdGhlCgkgICAgICAgcnVubWUgc2NyaXB0cyBmb3IgZ3VpbGUgYW5kIGNoaWNrZW4gKGFuZCBwb3NzaWJseSBtenNjaGVtZS4uLikuICBUaGUgZ3VpbGUKCSAgICAgICBhbmQgY2hpY2tlbiBfcnVubWUgZmlsZXMgdGhlbiAobG9hZCAiLi4vc2NoZW1lcnVubWUvZm9vLnNjbSIpLgogICAgICAgICAgICAgLSBJbiBjaGlja2VuIG1vZHVsZSwgZml4IGEgZmV3IGJ1Z3MgaW52bG9sdmluZyBkeW5hbWljIGNhc3RzLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggdG8gZml4IHdyYXBwaW5nIG9mIHRlbXBsYXRlZCBtZXRob2RzLiBJU08gY29tcGxpYW50IGNvbXBpbGVycywgbGlrZQogICAgICAgICAgICBDb21lYXUgYW5kIEdDQy0zLjQuMCwgZG9uJ3QgbGlrZSB0aGUgdGVtcGxhdGUgc3BlY2lmaWVyIHRoYXQgU1dJRyB3YXMgZ2VuZXJhdGluZwogICAgICAgICAgICB3aGVuIGNhbGxpbmcgdGhlIG1ldGhvZC4gVGhpcyBmaXggbWF5IGJyZWFrIHNvbWUgbm9uIHN0YW5kYXJkIGNvbXBsaWFudCBjb21waWxlcnMsCiAgICAgICAgICAgIGZvciBleGFtcGxlLCBTdW4gd29ya3Nob3AgY29tcGlsZXJzIHByaW9yIHRvIHZlcnNpb24gNi4yLnAyLiBQYXRjaCBzdWJtaXR0ZWQKICAgICAgICAgICAgYnkgQmlsbCBDbGFya2UuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFVuZG9jdW1lbnRlZCBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZSByZW1vdmVkLgogICAgICAgICAgICBOZXcgc3BlY2lhbCB2YXJpYWJsZSAkbW9kdWxlIGlzIHJlcGxhY2VkIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYXMgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5ICVtb2R1bGUgb3IgLW1vZHVsZSBjb21tYW5kbGluZSBvcHRpb24uICRpbWNsYXNzbmFtZSBjYW4gYmUgY3JlYXRlZCBmcm9tICRtb2R1bGUuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNhbWUgYXMgZm9yIEphdmEgYmVsb3cuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5LCBuYW1lbHksCiAgICAgICAgICAgIGNzYm9keSBhbmQgY3Nib2R5X2Rlcml2ZWQuIFRoZSBkZXByZWNhdGVkIHR5cGVtYXBzIGFyZSBjc2dldGNwdHIgYW5kCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFR5cGVtYXAgY2hhbmdlcyBmb3IgdGhlIEphdmEgcHJveHkgLyB0eXBld3JhcHBlciBhbmQgZW51bSBjbGFzc2VzLiBBIG5ldwogICAgICAgICAgICB0eXBlbWFwIGNhbGxlZCBqYXZhYm9keSBjb250YWlucyB0aGUgZXNzZW50aWFsIHN1cHBvcnQgY29kZSBmb3IgZ2VuZXJhdGlvbiBpbnRvIHRoZSBib2R5CiAgICAgICAgICAgIG9mIHRoZXNlIGNsYXNzZXMuIFRoZXJlIGlzIGFsc28gYSBuZXcgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwIHdoaWNoIGlzIHVzZWQgaW5zdGVhZCBmb3IKICAgICAgICAgICAgd3JhcHBlZCBjbGFzc2VzIHRoYXQgaGF2ZSBhIHdyYXBwZWQgYmFzZSBjbGFzcy4gVGhlIGNvZGUgaXMgYmFzaWNhbGx5LCB0aGUgZ2V0Q1B0cigpCiAgICAgICAgICAgIG1ldGhvZCBhbmQgc3dpZ0NQdHIgYW5kIHN3aWdDTWVtT3duIG1lbWJlciB2YXJpYWJsZXMuIFRoZXNlIHVzZWQgdG8gYmUgaGFyZCBjb2RlZAogICAgICAgICAgICB3aXRoIG5vIHdheSB0byBtb2RpZnkgdGhlIGNvZGUuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhpcyB0eXBlbWFwIG1ha2VzIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgICB0aGUgdXNlciB0byB0YWlsb3IgbmVhcmx5IGV2ZXJ5IGFzcGVjdCBvZiB0aGUgY29kZSBnZW5lcmF0aW9uLgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIG5vdyBpcyB0aGUgY29kZSBmb3IgZGlyZWN0b3IgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciBhbmQgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIHR5cGVtYXBzIGFyZSBkZXByZWNhdGVkIGFuZCBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgdGhhdCB0aGVzZSBnZW5lcmF0ZWQgY2FuIGJlIHB1dCBpbiB0aGUgbW9yZSBmbGV4aWJsZQogICAgICAgICAgICBqYXZhYm9keSBhbmQgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbCBtYXkgaGVscCB5b3UgdXBncmFkZSBpZiB5b3UgaGF2ZSB1c2VkCiAgICAgICAgICAgIHRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwOgoKICAgICAgICAgICAgICAgIC8qIFV0aWxpdHkgbWFjcm8gZm9yIG1hbmlwdWxhdGluZyB0aGUgSmF2YSBib2R5IGNvZGUgbWV0aG9kIGF0dHJpYnV0ZXMgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgQ1RPUl9BVFRSSUIsIEdFVENQVFJfQVRUUklCKQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHkpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3dpZ0NNZW1Pd247CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN3aWdDTWVtT3duID0gY01lbW9yeU93bjsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5X2Rlcml2ZWQpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIoJG1vZHVsZUpOSS5TV0lHJGphdmFjbGFzc25hbWVVcGNhc3QoY1B0ciksIGNNZW1vcnlPd24pOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogVGhlIGRlZmF1bHQgaXMgcHJvdGVjdGVkIGdldENQdHIsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhTV0lHVFlQRSwgcHJvdGVjdGVkLCBwcm90ZWN0ZWQpCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0dFVENQVFIoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwcm90ZWN0ZWQsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHB1YmxpYyBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfQk9EWU1FVEhPRFMoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwdWJsaWMsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBtb2RpZmllciB0eXBlbWFwcyBhbmQgcHJhZ21hcyBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgIFRoZXkgbXVzdCBub3cgaW5jbHVkZSB0aGUgY2xhc3MgdHlwZS4gUHJldmlvdXNseSAnY2xhc3MnIHdhcyBoYXJkIGNvZGVkLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBlbmFibGVzIGZsZXhpYmlsaXR5IGludG8gd2hhdCB0eXBlIG9mIGNsYXNzIGlzIGdlbmVyYXRlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGUgdGhlIHByb3h5IGNsYXNzIGNvdWxkIGJlIGFuIGludGVyZmFjZSBpbnN0ZWFkIG9mIGEgY2xhc3MuCgogICAgICAgICAgICBGb3IgSmF2YSB0aGlzIGFmZmVjdHMgdGhlIGphdmFjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIEZvciBDIyB0aGlzIGFmZmVjdHMgdGhlIGNzY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIFVubGVzcyB5b3UgaGF2ZSBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IHZlcnNpb25zIG9mIHRoZXNlIHR5cGVtYXBzIG9yIHByYWdtYXMsIHlvdQogICAgICAgICAgICBzaG91bGRuJ3QgYmUgYWZmZWN0ZWQuIEhvd2V2ZXIsIGlmIHlvdSBoYXZlLCB1cGdyYWRpbmcgaXMgZWFzeSwgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIgoKICAgICAgICAgICAgbXVzdCBub3cgYmU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCBjbGFzcyIKCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gUHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBPcmVuIE1pbGxlci4gQWxzbyBpbXByb3ZlcyB0aGUgZ2VuZXJhdGVkIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhdGNoIGhhbmRsZXIgZm9yIHBvaW50ZXJzIC0gYSBwb2ludGVyIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHJlZmVyZW5jZSB0bwogICAgICAgICAgICBhIHBvaW50ZXIuIEFkZGVkIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIGZvciBTV0lHVFlQRSAmLCBTV0lHVFlQRSAqIGFuZAogICAgICAgICAgICBTV0lHVFlQRVtBTlldIChKYXZhIGFuZCBDIykuCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgbWlub3IgdHlwZXNhZmUgZW51bSBpbXByb3ZlbWVudHMsIGluY2x1ZGluZyBzdG9yaW5nIHRoZSBuYW1lIG9mCiAgICAgICAgICAgIHRoZSBlbnVtIGl0ZW0uIFRoZSB0b1NyaW5nKCkgLyBUb1N0cmluZygpIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRoaXMgbmFtZS4KCjA1LzMwLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgIC0gVXBkYXRlIGhvdyBleGFtcGxlcyBhbmQgdGhlIHRlc3Qgc3VpdGUgYXJlIGJ1aWx0LgoJICAgICAtIFN5bWJvbCBuYW1lcyBhcmUgbm8gbG9uZ2VyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlCgkgICAgIC0gQWRkZWQgdW5pb25fcnVubWUuc3MsIHdoaWNoIHdhcyBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gdGhlIGd1aWxlIG1vZHVsZQoKMDUvMjYvMjAwNDogbGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgQ29tbWl0dGVkIG9uIGJlaGFsZiBvZiBNYXJjZWxvICh3aG8gc3RpbGwgaGFzIHByb2JsZW1zIHdpdGggCgkgICAgdGhlIFNvdXJjZUZvcmdlIENWUy4pCgoJICAgIEFkZGVkIFB5dGhvbiB0eXBlbWFwcyBmb3IgRklMRSogd2l0aCAoUHl0aG9uLW9ubHkpIHRlc3QuCgo1LzI0LzIwMDQ6ICBkYW5jeQoKCSogQWxsZWdybyBDTCBtb2R1bGU6ICBOb3cgdXNpbmcgc29tZSBtYWNyb3MgKGRlZmluZWQgaW4KCUxpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZyksIHN3aWctZGVmY29uc3RhbnQgYW5kIHN3aWctZGVmdW4sIGZvcgoJZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBmb3JlaWduIGZ1bmN0aW9ucy4gIFRoaXMgbWFrZXMgdGhlCglnZW5lcmF0ZWQgZmlsZSBhIGJpdCBuZWF0ZXIuICAgIAoKCU5vdyBzdHJpcHMgYSBsYXllciBvZiBwYXJlbnRoZXNpcyBmcm9tIGNvbnN0YW50cy4KCglVc2VzICgqIDp2b2lkKSBpbnN0ZWFkIG9mIDpmb3JlaWduLWFkZHJlc3Mgbm93LgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVW5uYW1lZCBlbnVtIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgaW4gYWRkaXRpb24KICAgICAgICAgICAgdG8gdGhlIHJlY2VudGx5IGFkZGVkIHN1cHBvcnQgZm9yIHVubmFtZWQgZW51bSBtZW1iZXIgdmFyaWFibGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgZW51bSB7IGVudW0xLCBlbnVtMiB9IE1lbWJlckluc3RhbmNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMywgZW51bTQgfSBHbG9iYWxJbnN0YW5jZTsKCiAgICAgICAgICAgIFRoZSBpbnQgdHlwZW1hcHMgYXJlIHVzZWQgZm9yIHdyYXBwaW5nIHRoZSBnZXQvc2V0IGFjY2Vzc29yIG1ldGhvZHMuCiAgICAgICAgICAgIElmIHRoZSBzaXplb2YgYW4gZW51bSBpcyBub3QgdGhlIHNhbWUgc2l6ZSBhcyBhbiBpbnQgdGhlbiBzZXR0aW5nIHRoZQogICAgICAgICAgICB2YXJpYWJsZSB3aWxsIHNpbGVudGx5IGRvIG5vdGhpbmcgYXMgdGhlIGNhc3RzIGNhbm5vdCBiZSBlYXNpbHkgYW5kIHBvcnRhYmx5CiAgICAgICAgICAgIGdlbmVyYXRlZC4gSWYgeW91IG5lZWQgdG8gc29sdmUgdGhpcyBoaWdobHkgb2JzY3VyZSBzaXR1YXRpb24sIHdyaXRlCiAgICAgICAgICAgIHRoZSBhc3NpZ25tZW50IHVzaW5nIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEMjIGVudW0gd3JhcHBpbmcgbW9kcy4gU2ltaWxhciB0byB0aGUgSmF2YSBtb2R1bGUsIGVudW1zIGNhbiBiZSB3cmFwcGVkIHVzaW5nCiAgICAgICAgICAgIG9uZSBvZiAzIGFwcHJvYWNoZXM6CgogICAgICAgICAgICAxKSBQcm9wZXIgQyMgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlY3NlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgW05vIGltcGxlbWVudGF0aW9uIGRlZW1lZCBuZWNlc3NhcnkgZm9yIHR5cGUgdW5zYWZlIGVudW1zXS4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHByb3BlciBDIyBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEphdmEgZW51bSBzdXBwb3J0IGFkZGVkLiBUaGVyZSBhcmUgbm93IDQgd2F5cyBpbiB3aGljaCBlbnVtcyBjYW4gYmUgd3JhcHBlZDoKCiAgICAgICAgICAgIDEpIFByb3BlciBKYXZhIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBUeXBlIHVuc2FmZSBlbnVtcyAoY29uc3RhbnQgaW50ZWdlcnMpIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXVuc2FmZS5zd2ciCiAgICAgICAgICAgIDQpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlamF2YWVudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwcyB3aWxsIGhhbmRsZSBlbnVtcyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgc3BlY2lmaWVkIGluaXRpYWwKICAgICAgICAgICAgdmFsdWVzLCBmb3IgZXhhbXBsZSB0ZW4gaXMgc3BlY2lmaWVkOgoKICAgICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IHplcm8sIHRlbigxMCkgfTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBhbW91bnQgb2YgZ2VuZXJhdGVkIEphdmEgY29kZSBjYW4gYmUgY3V0IGRvd24sIGJ5IG1vZGlmeWluZyB0aGVzZSB0eXBlbWFwcwogICAgICAgICAgICBpZiBub25lIG9mIHRoZSBlbnVtcyBoYXZlIGluaXRpYWwgdmFsdWVzIChwcm9wZXIgSmF2YSBlbnVtcyBhbmQgdHlwZXNhZmUgZW51bXMgYXBwcm9hY2gpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgdHlwZXNhZmUgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggYnVnIHVzaW5nICVyZW5hbWUgb24gZW51bSBpdGVtcyBhbmQgd2hlbiB1c2luZwogICAgICAgICAgICAlamF2YWNvbnN0KDEpIC8gJWNzY29uc3QoMSkKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKE9iaikgT2JqZWN0OwogICAgICAgICAgICAgICAgZW51bSBHcmFtbWFyIHsgU3ViamVjdCwgT2JqZWN0IH07CgowNC8yOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE1pbm9yIGZpeGVzIHdoZW4gdXNpbmcgY29tYmluYXRpb25zIG9mIHRoZSAKICAgICAgICAgICAgamF2YWludGVyZmFjZXMsIGphdmFiYXNlLCBjc2ludGVyZmFjZXMgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCjA1LzE4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKVk0gbGluayBmYWlsdXJlIG9uIHNvbWUgc3lzdGVtcyBmaXhlZCB3aGVuIHVzaW5nIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgQWxzbyBhZGRzIGRlZmF1bHQgdmVjdG9yIGNvbnN0cnVjdG9yIGZvciB1c2UgZnJvbSBKYXZhLgoKMDUvMTcvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoKCSAgICBbR3VpbGVdIE5ldyBydW50aW1lIGZ1bmN0aW9ucyBTV0lHX1BvaW50ZXJBZGRyZXNzLAoJICAgIFNXSUdfUG9pbnRlclR5cGUsIFNXSUdfSXNQb2ludGVyT2ZUeXBlLCBTV0lHX0lzUG9pbnRlci4KCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHdyYXAgc2V2ZXJhbCBTV0lHIHJ1bnRpbWUgZnVuY3Rpb25zCgkgICAgYW5kIGV4cG9ydCB0aGVtIGludG8gdGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKS4gIFRoZQoJICAgIHJ1bnRpbWUgbW9kdWxlIGlzIG5vdyBidWlsdCB3aXRoICJtb2R1bGUiIGxpbmthZ2UuCgoJICAgIFtHdWlsZV0gR09PUFMgcHJveHkgb2JqZWN0cyBub3cgYWxzbyBwcmludCB0aGUgcG9pbnRlcgoJICAgIGFkZHJlc3Mgb2YgdGhlIEMgb2JqZWN0LgoKMDUvMTQvMjAwNDogbHlsZQogICAgICAgICAgICBBZGRlZCBLb3UncyBwYXRjaCBmb3IgdGhlIFJ1YnkgJWltcG9ydCBkaXJlY3RpdmUgc28gdGhhdCBtb2R1bGVzCiAgICAgICAgICAgIHdpdGggIm5lc3RlZCIgbmFtZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkuIENvbnNpZGVyIGFuIGludGVyZmFjZQogICAgICAgICAgICBmaWxlIGZvby5pIHRoYXQgaGFzIHRoaXMgJW1vZHVsZSBkZWNsYXJhdGlvbiBhdCBpdHMgdG9wOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIm1pc2M6OnRleHQ6OmZvbyIKCiAgICAgICAgICAgIE5vdyBjb25zaWRlciBhbm90aGVyIGludGVyZmFjZSBmaWxlIHNwYW0uaSB0aGF0IGltcG9ydHMgZm9vLmk6CgogICAgICAgICAgICAgICAgJWltcG9ydCBmb28uaQogICAgICAgICAgICAKICAgICAgICAgICAgQmVmb3JlIHRoaXMgcGF0Y2gsIHRoaXMgd291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY29kZSBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIHNwYW1fd3JhcC5jOgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2M6OnRleHQ6OmZvbyIpOwoKICAgICAgICAgICAgV2l0aCB0aGlzIHBhdGNoLCBob3dldmVyLCB5b3UnbGwgZ2V0IHRoZSBjb3JyZWN0IHBhdGggbmFtZQogICAgICAgICAgICBmb3IgdGhlIGNhbGwgdG8gcmJfcmVxdWlyZSgpLCBlLmcuCgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYy90ZXh0L2ZvbyIpOwoKICAgICAgICAgICAgU2VlIFNvdXJjZUZvcmdlIEJ1ZyAjOTI4Mjk5LgoKMDUvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZm9yIGVtaXR0aW5nIGRpcmVjdG9ycyB3aGVuICVmZWF0dXJlKCJkaXJlY3RvciIpIHNwZWNpZmllZAogICAgICAgICAgICBmb3IgYSBjbGFzcyB3aXRoIG5vIHZpcnR1YWwgbWV0aG9kcywgYnV0IGRvZXMgaGF2ZSBhIHZpcnR1YWwgZGVzdHJ1Y3Rvci4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEtldmluIFNtaXRoLgoKMDUvMDYvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBTV0lHIHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUHJldHR5TmFtZSwgd2hpY2ggCgkgICAgcmV0dXJucyBhbiB1bm1hbmdsZWQgdHlwZSBuYW1lIGZvciBhIHN3aWdfdHlwZV9pbmZvCgkgICAgb2JqZWN0LiAKCgkgICAgW0d1aWxlXTogVXNlIGl0IGZvciBwcmludGluZyBwb2ludGVyIG9iamVjdHMuCgowNS8wMy8yMDA0OiAgZGFuY3kgKEFobW9uIERhbmN5KQoKCSogTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnOiAgVXBkYXRlZCBjb21tZW50cyBhYm91dCBpZGVudGlmZXIKCWNvbnZlcnNpb24uICAKCgkqIFNvdXJjZXMvTW9kdWxlcy9hbGxlZ3JvY2wuY3h4OiAgUmVnaXN0ZXIgL2Rldi9udWxsIGZvciAiaGVhZGVyIgoJdGFyZ2V0LiAgIEFsc28sIGRpc3JlZ2FyZCAiY29uc3QiIHF1YWxpZmllcnMgZHVyaW5nIHR5cGUKCWNvbnZlcnNpb24uICAKCgkKMDUvMDIvMjAwNDogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEZpeCBidWcgNzgyNDY4LgoJICAgIFRvIGZpeCB0aGlzIGJ1ZywgdGhlIHJ1bnRpbWUgY29kZSBoYXMgYmVlbiByZXdyaXR0ZW4sIGFuZAoJICAgIHBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgYSBDX1NXSUdfUE9JTlRFUl9UWVBFLgoKCSAgICBDaGlja2VuIHZlcnNpb24gPiAxLjQwIGlzIG5vdyByZXF1aXJlZCEKCgkgICAgKiBUeXBlbWFwIGluY29tcGF0aWJpbGl0eTogIHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgY2hpY2tlbl93b3Jkcy4KCSAgICAgIElmIGEgdHlwZW1hcCBuZWVkcyBzb21lIHNwYWNlLCBpdCBzaG91bGQganVzdCBjYWxsIENfYWxsb2MKCgkgICAgKiBhcmdvdXQgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSB0aGUgLyogaWYgT05FICovIGNvbnN0cnVjdCB0bwoJICAgICAgYnVpbGQgYW4gb3V0cHV0IGxpc3QuICBBIFNXSUdfQVBQRU5EX1ZBTFVFIG1hY3JvLCBleGFjdGx5IGxpa2UKCSAgICAgIGd1aWxlIGFuZCBtenNjaGVtZSBpcyBub3cgdXNlZC4KCjA0LzI1LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIHRoZSBnZW5lcmF0ZWQgR09PUFMgY29kZSwgZG9uJ3QgY3JlYXRlIG1ldGhvZHMKCSAgICB0aGF0IHdvdWxkIG5vdCBzcGVjaWFsaXplIGFueSBhcmd1bWVudHM7IHNpbXBseSByZS1leHBvcnQKCSAgICB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucy4gIChUaGlzIGlzIGEgcGVyZm9ybWFuY2UKCSAgICBvcHRpbWl6YXRpb24gd2hpY2ggcmVkdWNlcyBsb2FkIHRpbWUgYW5kIGV4ZWN1dGlvbiB0aW1lLikKCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZml4IHRoZSAidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIiBlcnJvcgoJICAgIHdoaWNoIHdhcyBjYXVzZWQgYnkgYW4gaW5jb21wYXRpYmxlIHN3aWdfdHlwZV9pbmZvIGxheW91dC4KCgkgICAgW0d1aWxlXSBUaGUgdHlwZW1hcCBmb3IgRklMRSAqIGluIHBvcnRzLmkgbm93IGFsc28gYWNjZXB0cwoJICAgIGEgcmVndWxhciBGSUxFICogcG9pbnRlciBvYmplY3QuICBBbHNvIGEgYnVnIHdpdGggU2NoZW1lCgkgICAgZmlsZSBwb3J0cyB0aGF0IGFyZSBvcGVuIGZvciBpbnB1dCBhbmQgb3V0cHV0IGhhcyBiZWVuCgkgICAgZml4ZWQuIAoKMDQvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlIGVudHJ5IDAzLzIxLzIwMDQgcmV2b2tlZC4gVGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGFub3RoZXIKICAgICAgICAgICAgaW5jb25zaXN0ZW5jeSAocmVmZXJlbmNlIHR5cGVtYXBzIGJlaW5ncyB1c2VkIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlciB0eXBlbWFwcyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIHN0YXRpYwogICAgICAgICAgICBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIGZvciBzb21lIGxhbmd1YWdlcywKICAgICAgICAgICAgYnV0IG9ubHkgZm9yIEMrKyBhbmQgbm90IEMpLiBUaGlzIHdvdWxkIGJyZWFrIHVzZXIncyBjdXJyZW50CiAgICAgICAgICAgIHR5cGVtYXBzIGFuZCBpbnRyb2R1Y2UgZnVydGhlciBpbmNvbnNpc3RlbmNpZXMuIEFsdGVybmF0aXZlCiAgICAgICAgICAgIHNvbHV0aW9uIHJlcXVpcmVkIGFuZCBiZWluZyBkaXNjdXNzZWQuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIEFkZGVkIHRoZSAtZGlyZWN0b3JzIGZsYWcuIFRoaXMgZW5hYmxlcyB0aGUgZGlyZWN0b3IKCSAgICBtb2RlIGZvciB0aGUgaW50ZXJmYWNlIGFuZCBhbGwgdGhlIGNsYXNzZXMgdGhhdAoJICAgIGRvbid0IHNldCB0aGUgImZlYXR1cmU6bm9kaXJlY3RvciIgZXhwbGljaXRseS4KCgkgICAgWW91IGNhbiB1c2UgdGhpcyBpbiB5b3VyIG1vZHVsZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlCgkgICAgZGlyZWN0b3IgZmVhdHVyZSBpbiBhbGwgeW91ciBjbGFzc2VzLCBidXQgaXQgaXMgbW9zdAoJICAgIGludGVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBsaWtlOgoKCSAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoKCSAgICBUaGVzZSBjb21tYW5kcyB3aWxsIHJ1biB0aGUgZW50aXJlIHRlc3Qtc3VpdGUgdXNpbmcKCSAgICBkaXJlY3RvcnMsIGFuZCBub3Qgb25seSB0aGUgc3BlY2lmaWMgJ2RpcmVjdG9yc18qJwoJICAgIGNhc2VzLiBUaGlzIHNob3VsZCBiZSBkb25lIGZyb20gdGltZSB0byB0aW1lLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBBZGRlZCBzdXBwb3J0IGZvciBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QsCgkgICAgZm9yIGNvbXBpbGVyIGFuZCBweXRob24gdmVyc2lvbnMgdGhhdCBzdXBwb3J0IHRoZW0uCgkgICAgCgkgICAgV2hlbiBuZWVkZWQsIHVzZSAKCgkgICAgICVpbmxjdWRlIHN0ZF9zdHJpbmcuaSAgICAgIC8vICdjaGFyJyBzdHJpbmdzCgkgICAgICVpbmxjdWRlIHN0ZF93c3RyaW5nLmkgICAgIC8vICd3Y2hhcl90OyBzdHJpbmdzCgkgICAgCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEZpeCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgKHNlZy4gZmF1bHQpIHdoZW4gYW4KCSAgICBpbnBsYWNlIG9wZXJhdG9yICgrPSwtPSwuLi4pIHdhcyB3cmFwcGVkLCBhcyByZXBvcnRlZCBieQoJICAgIEx1Y3JpeiAobHVjcml6QHNpdGlsYW5kaWEuaXQpLCB3aGVuIHRoZSBtb3N0IGNvbW1vbgoJICAgIGZvcm0gd2FzIHVzZWQ6CgogICAgICAgICAgICAgICAgICAgQSYgIEE6Om9wZXJhdG9yKz0oaW50IGkpIHsgLi4uOyByZXR1cm4gKnRoaXM7IH0KICAgICAgICAgICAgICAgICAgXl5eXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgoJICAgIAoKCSAgICBpZSwgYW4gb2JqZWN0IGlzIHJldHVybmVkIGFuZCBpdHMgY29udGFpbnMgdGhlIHNhbWUgJ3RoaXMnCgkgICAgdmFsdWUgdGhhbiB0aGUgaW5wdXQgb2JqZWN0LCB3aGljaCBpcyBkZWxldGVkIGFmdGVyIHRoZQoJICAgIG9wZXJhdGlvbiAiYSArPSBiIiwgbGVhdmluZyB0aGUgcmVzdWx0IHdpdGggbm8gcmVhbAoJICAgIG9iamVjdCwgYnV0IGEgc2VnLiBmYXVsdC4KCgkgICAgVG8gZml4IGl0LCB3ZSBuZWVkZWQgdG8gaW50cm9kdWNlIGEgbmV3IGZlYXR1cmUgYW5kIHVzZSBhbgoJICAgIG9sZCBvbmU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IikgQTo6b3BlcmF0b3IrPTsKCSAgICAKCSAgICBoZXJlLCAic2VsZjpkaXNvd24iIGRpc2FibGUgdGhlIG93bmVyc2hpcCBvZiB0aGUgJ3NlbGYnCgkgICAgb3IgaW5wdXQgb2JqZWN0LCBhbmQgdGhlICJuZXciIGZlYXR1cmUgdHJhbnNmZXJzIHRoZQoJICAgIG93bmVyc2hpcCB0byB0aGUgcmVzdWx0IG9iamVjdC4KCSAgICAKCSAgICBUaGUgZmVhdHVyZS9zb2x1dGlvbiBjb3VsZCBhbHNvIGJlIHVzZWQgaW4gb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCB1c2UgZ2MgYW5kIGltcGxlbWVudCB0aGUgaW5wbGFjZSBvcGVyYXRvcnMsIG9yIG90aGVyCgkgICAgb3BlcmF0b3JzLCBpbiBhIHNpbWlsYXIgd2F5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFB5dGhvbiBNT0RVTEUgKioqCgoJICAgIElmIHlvdSBhbHJlYWR5IGFyZSB1c2luZyB0aGUgaW5wbGFjZSBvcGVyYXRvcnMgaW4gcHl0aG9uLAoJICAgIGFuZCB5b3UgaW1wbGVtZW50ZWQgc29tZSBraW5kIG9mIHdvcmthcm91bmQgdG8gdGhlIHByb2JsZW0KCSAgICBmaXhlZCBoZXJlLCBpdCBpcyBwb3NzaWJsZSB5b3UgY291bGQgZW5kIHdpdGggJ2ZyZWUnCgkgICAgb2JqZWN0cyB0aGF0IG5ldmVyIGdldCBkZWxldGVkLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBhbmQKCSAgICB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBjdXJyZW50IGZpeCwgdXNlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIiwiIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIsIiIpIEE6Om9wZXJhdG9yKz07CgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQysrIGVudW1zIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBpbnRlZ2VycywgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgCiAgICAgICAgICAgIEMjIGVudW1zLiBGb3IgRXhhbXBsZSwgZ2l2ZW4gQysrOgoKICAgICAgICAgICAgICAgIGVudW0gQW5FbnVtIHsgZm9vLCBiYXIgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgQW5FbnVtIEFuRW51bWVyYXRpb247CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtZXJhdGlvbiBmKTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBlbnVtIEFuRW51bSB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW0gZikgey4uLn0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBhIGdsb2JhbCBlbnVtIGxpa2UgQW5FbnVtIGFib3ZlIGlzIGdlbmVyYXRlZCBpbnRvIGl0cyBvd24KICAgICAgICAgICAgZmlsZSBjYWxsZWQgQW5FbnVtLmNzLiBFbnVtcyBkZWZpbmVkIHdpdGhpbiBhIEMrKyBjbGFzcyBhcmUgZGVmaW5lZAogICAgICAgICAgICB3aXRoaW4gdGhlIEMjIHByb3h5IGNsYXNzLiBTb21lIG9mIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nIEMjIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMgYWxzbyB3b3JrIGZvciBlbnVtcy4gRm9yIGV4YW1wbGUgZ2xvYmFsIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2ltcG9ydHMpIHRvIGFkZCBpbiBleHRyYSB1c2luZyBzdGF0ZW1lbnRzLgoKICAgICAgICAgICAgR2xvYmFsIGVudW1zIGFuZCBjbGFzcyBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgdG8gbWFrZSB0aGUgZW51bSBwcml2YXRlLCBwdWJsaWMgZXRjLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZW51bSB0eXBlIChlbnVtIGJhc2UpCgogICAgICAgICAgICBJZiB3ZSBhZGQgdGhpcyBmb3IgdGhlIGFib3ZlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgQW5FbnVtICJwcm90ZWN0ZWQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIEFuRW51bSAibG9uZyIKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByb3RlY3RlZCBlbnVtIEFuRW51bSA6IGxvbmcgewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBlbXB0eSBlbnVtcywgbGlrZQogICAgICAgICAgICAgICAgZW51bSBGb28ge307CgowMy8yMS8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW05vdGU6IHRoaXMgY2hhbmdlIHJldm9rZWQgb24gMDQvMjUvMjAwNF0KCSAgICBbUHl0aG9uXSBNYWtlcyB0aGUgZm9sbG93aW5nICd2YXInIGNhc2VzIG1vcmUgdW5pZm9ybToKCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBnYTsKIAogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2E7CiAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBub3cgdGhlIHRocmVlIHZhcmlhYmxlcyAoZ2EsIHNhLCBtYSkgY2FuIGJlIGFzc2lnbmVkIGFzOgoKCiAgICAgICAgICAgICAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBBLnNhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgYS5tYSA9ICJoZWxsbyI7CgogICAgICAgICAgICBpZSwgbm93ICdtYScgd2lsbCBhbHNvIHVzZSBhIHN0ZDo6c3RyaW5nIHR5cGVtYXAgJ2luJyBpZgogICAgICAgICAgICBkZWZpbmVkLCBiZWZvcmUgaXQgd2FzIG9ubHkgYWNjZXB0aW5nIGEgJ3Bfc3RkX3N0cmluZycKICAgICAgICAgICAgcG9pbnRlci4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgJ21hJyB3aWxsIG5vdCB1c2UgdGhlCiAgICAgICAgICAgICd2YXJpbi92YXJvdXQnIHR5cGVtYXBzICh0aGF0IHByb2JhYmx5IGNvdWxkIGJlIG1vcmUKICAgICAgICAgICAgbmF0dXJhbCksIGJ1dCBpdCB3aWxsIHBpY2sgdXAgdGhlICdpbicgdHlwZW1hcCBmb3IgY29uc3QKICAgICAgICAgICAgc3RkOjpzdHJpbmcmICh3aGljaCBpcyBlYXNpZXIpLgoKCSAgICBUaGUgY2hhbmdlcyBpbiBjd3JhcC5jIGFuZCBsYW5nLmN4eCB3aWxsIHByb2JhYmx5IGZpeCB0aGUKCSAgICBiZWhhdmlvdXIgaW4gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IG92ZXJsb2FkIHRoZQoJICAgIG1lbWJlcnZhckhhbmRsZXIgbWV0aG9kICJ0b28gbXVjaCIuCiAKICAgICAgICAgICAgCjAzLzIxLzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIERpc2FibGluZyB0aGUgZGVmYXVsdCBpbnN0YW50aWF0aW9ucyBsaWtlOgoKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxpbnQsaW50PjsKCiAgICAgICAgICAgIGZvciBhbGwgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgU1RMIGNvbnRhaW5lcnMvY2xhc3Nlcy4KCSAgICBUaGV5IGFyZSBleHBlbnNpdmUsIHNwZWNpYWxseSBmb3IgcGFpciBhbmQgbWFwLCBhbmQgdGhlCgkgICAgcHJldmlvdXMgYmVoYXZpb3VyIGFsc28gcmVxdWlyZXMgdGhlIHVzZXIgdG8gcGVyZm9ybQoJICAgIG1hbnVhbCBpbnN0YW50aWF0aW9ucy4gU3RpbGwsIGlmIHRoZSBzcGVlZCBkaWZmZXJlbmNlIGlzCgkgICAgbm90IGltcG9ydGFudCwgaXQgY2FuIGJlIHJlLWVuYWJsZWQgYnkgZGVmaW5pbmcgdGhlIG1hY3JvCgkgICAgU1dJR19TVERfREVGQVVMVF9JTlNUQU5USUFUSU9OIChzZWUgc3RkX2NvbW1vbi5pKS4KCgkgICAgQWxzbywgbm9ybWFsaXppbmcgdGhlIElOUFVUL09VVFBVVC9JTk9VVCB0eXBlbWFwcy4gTm93CgkgICAgdGhleSB1c2UgdGhlIHNhbWUgY29udmVyc29ycyB0aGFuIHRoZSByZXN0IG9mIHRoZQoJICAgIHR5cGVtYXBzLCBhbmQgeW91IGNhbiB1c2UgdGhlbSBmb3Igc3RkOjpwYWlyLCBzdGQ6OnN0cmluZwoJICAgIGFuZCBhbGwgdGhlIG90aGVyIFNUTCB0eXBlcywgbGlrZSBpbjoKCgkgICAgICB2b2lkIHBfaW5vdXRkKHN0ZDo6cGFpcjxkb3VibGUsIGRvdWJsZT4gKklOT1VUKTsKCgkgICAgQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGFuZCBpbXBsaWNpdC5pIGZpbGVzIHdpdGggbWFjcm9zIHRvCgkgICAgdHJhbnNmb3JtIGZ1bmN0aW9ucyBwYWlycyBsaWtlICdzZXRfeCcvJ2dldF94JyAKCSAgICAob3IgJ1QmIHgoKScvJ2NvbnN0IFQmIHgoKSBjb25zdCcpIGludG8gYW4gYXR0cmlidXRlLAoJICAgIGFuZCBhbGxvd2luZyB0aGUgdXNlIG9mIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBpbiB0eXBlbWFwcwoJICAgIChzZWUgdGhlIGZpbGVzIGZvciBtb3JlIGRldGFpbHMpLgoKMDMvMjEvMjAwNDogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZ3Mgb2YgZnVuY3Rpb25zIHdpdGgKCSAgICBhbm9ueW1vdXMgYXJndW1lbnRzLgoKMDMvMTgvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gTW9yZSBnZW5lcmFsIHN0ZF9zdHJpbmcuaSBpbnRlcmZhY2UuCgkgICAgTm93IHlvdSBjYW4gd3JhcCBpdCB1c2luZwoKCSAgICAgICV0ZW1wbGF0ZShzdHJpbmcpIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OwoKICAgICAgICAgICAgYW5kIHVzZSB0aGUgc3RkOjpzdHJpbmcgYXMgYSBiYXNlIGNsYXNzOgoKCSAgICAgIHN0cnVjdCBBIDogc3RkOjpzdHJpbmcgewogICAgICAgICAgICAgIH07CgoJICAgIEJ1dCBtb3JlIGltcG9ydGFudCwgc3dpZyB3aWxsIHJlY29nbml6ZSAKCSAgICBib3RoIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+IGFuZCBzdGQ6OnN0cmluZyBhcwoJICAgIHRoZSBzYW1lIHR5cGUuCgowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBQcmV2aW91c2x5IGFkZGVkLCBidXQgbm90IG1lbnRpb25lZCBiZWZvcmU6CgoJICAgIC0gZnJpZW5kIGRlY2xhcmF0aW9uIHN1cHBvcnQsIHN3aWcgbm93IGVtaXRzIGEgZ2xvYmFsCgkgICAgICBmdW5jdGlvbiBpbiB0aGUgc2FtZSBjbGFzcyBzY29wZS4KCgkgICAgLSByZWYvdW5yZWYgZmVhdHVyZXM6IHRvIG1peCByZWYgY291bnRpbmcgQysrIGNsYXNzZXMKCSAgICAgIGFuZCBuYXRpdmUgc2NyaXB0IHJlZiBjb3VudGluZyBtZWNoYW5pc21zIChsaWtlIGluIHB5dGhvbikuCgkgICAgCgkgICAgICBVc2UgaXQgbGlrZToKCiAJICAgICAgICAlZmVhdHVyZSgicmVmIikgICBSQ09iaiAiJHRoaXMtPnJlZigpOyIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ1bnJlZiIpIFJDT2JqICIkdGhpcy0+dW5yZWYoKTsiCgoJICAgICAgQW5kIHRoZSBjbGFzcyBSQ09iaiwgYW5kIGFsbCB0aGUgZGVyaXZlZCBvbmVzLCB3aWxsCgkgICAgICBwZXJmb3JtIHRoZSByaWdodCByZWYvdW5yZWYgY2FsbHMgd2hlbiBhIG5ldyBwb2ludGVyICAKCSAgICAgIGlzIHJldHVybmVkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIG9yIHdoZW4gdGhlIHRhcmdldAoJICAgICAgbGFuZ3VhZ2UgYXR0ZW1wdHMgdG8gZGVsZXRlIHRoZSBvYmplY3QuCgkgICAgICAKCSAgICAgIFNlZSB0aGUgcmVmY291bnQuaSBmaWxlIGluIHRoZSB0ZXN0LXN1aXRlIGZvciBtb3JlCgkgICAgICBkZXRhaWxzLgoKCSAgICAKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gVXNpbmcgdGhlIG5ldyAlZnJhZ21lbnQgc3VwcG9ydCwgbWFqb3IgcmV3cm90ZSAKCSAgICBvZiB0aGUgcHl0aG9uIHN3aWcgbGlicmFyeSwgaW5jbHVkaW5nOgoKCSAgICAtIEFsbW9zdCBhdXRvbWF0aWMgdGVtcGxhdGUvdHlwZW1hcCBpbnN0YW50aWF0aW9uIGZvcgoJICAgICAgdGhlIFNUTCBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSwgbm93IHlvdSBjYW4gd3JpdGU6CgoJCSAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgICAgYW5kIGEgc3BlY2lhbGl6ZWQgdmVjdG9yX2kgY2xhc3MgaXMgZW1pdHRlZCB3aXRoIGFsbAoJICAgICAgdGhlIG5lZWRlZCB0eXBlbWFwcy4gTm8gbmVlZCB0byB1c2UgdGhlIG9sZAoJICAgICAgJ3NwZWNpYWxpemVfdmVjdG9yJyBtYWNyb3MuCgoJICAgICAgTm90ZSB5b3UgY2FuIGFsc28gZGVmaW5lCgoJICAgICAgICAgICV0ZW1wbGF0ZShtYXRyaXhfaSkgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID47CgkgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9waWkpIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsaW50PiA+OwoKCSAgICAtIFRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogCSAKICAgICAgICAgICAJICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIGRlZmluZXMgdGhlIHZlY3RvciB0eXBlbWFwcywgYnV0IG5vIHByb3h5IGNsYXNzLiBGb3IgYWxsIHRoZQogICAgICAgICAgICAgIGZ1bmRhbWVudGFsIHR5cGVzLCB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBhcmUKICAgICAgICAgICAgICBkZWZpbmVkLCBzbywgeW91IGNhbiBzYXkKCgkgICAgICAlaW5jbHVkZSBzdGRfdmVjdG9yCgoJICAgICAgaW50IGZ1bmMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYSk7CgkgICAgICAKCSAgICAgIHdoZXJlIHRoZSBwcm9wZXIgdHlwZW1hcCBpcyBhcHBsaWVkIHRvICdhJywgYnV0IG5vCgkgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHByb3h5IGlzIGdlbmVyYXRlZC4KCSAgICAgIAoKICAgICAgICAgICAgLSBBbGwgdGhlIFNUTCBjb250YWluZXJzIHByZXNlbnQgYSBtb3JlIHVuaWZvcm0gYmVoYXZpb3IgYW5kCgkgICAgICBtb3JlIGNvbXBsZXRlIGludGVyZmFjZSBkZWNsYXJhdGlvbi4gVGhlIGZvbGxvd2luZyBhcmUgCgkgICAgICBub3cgc3VwcG9ydGVkOgoKCQkgIHN0ZDo6dmVjdG9yPFQ+CgkJICBzdGQ6Omxpc3Q8VD4KCQkgIHN0ZDo6ZGVxdWU8VD4KCQkgIHN0ZDo6c2V0PFQ+CgkJICBzdGQ6Om11bHRpc2V0PFQ+CgkJICBzdGQ6Om1hcDxUPgoJCSAgc3RkOjptdWx0aW1hcDxUPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIG5vdCBhIGNvbnRhaW5lciwgYnV0IGFsc28gc3VwcG9ydGVkOgoKCQkgIHN0ZDo6cGFpcjxULFU+CgogICAgICAgICAgICAgIGFsc28sIG1vcmUgdHlwZW1hcHMgYXJlIGRlZmluZWQgZm9yIGFsbCBvZiB0aGVtLAoJICAgICAgaW5jbHVkaW5nIHZhcmluLCB2YXJvdXQsIHR5cGVjaGVjaywgZXRjLgoKICAgICAgICAgICAgLSBJbml0aWFsIGF0dGVtcHQgdG8gaW1wbGVtZW50IHRoZSBTVEwgY29udGFpbmVycwogICAgICAgICAgICAgIGNvbnNpZGVyaW5nIGFsbG9jYXRvcnMsIGllOgoKCSAgICAgICAgICBzdGQ6OnZlY3RvcjxULEE+CQkJCgoJICAgICAgaXQgaXMgcGFydGlhbGx5IHdvcmtpbmcsIGJ1dCBpdCBpcyBqdXN0IGEgd29ya2Fyb3VuZAoJICAgICAgd2hpbGUgc3dpZyBpbXByb3ZlcyBpdHMgdGVtcGxhdGUgdHlwZSBzdXBwb3J0LgoJICAgICAgCgkgICAgICAKCSAgICAgUGxlYXNlIHRlc3Qgd2l0aCB5b3VyIHBhcnRpY3VsYXIgc2V0dXAuIEl0IHNlZW1zIHRvIGJlCgkgICAgIHdvcmtpbmcgd2l0aCBnKysgMy4yLjIsIGcrKyAyLjk2LCBJbnRlbCBpY2MgYW5kIFNHSSBDQwoJICAgICBjb21waWxlcnMsIHBsdXMgcHl0aG9uIDEuNS4yLCAyLjAgYW5kIDIuMywgYnV0IHNpbmNlCgkgICAgIHdlIGFyZSB1c2luZyB0ZW1wbGF0ZXMsIHRoZXJlIGlzIGEgY2hhbmNlIHlvdSBjYW4gZmluZAoJICAgICBzb21lIHByb2JsZW1zIHdoZW4gdXNpbmcgd2l0aCBhbiBvbGQgQysrIGNvbXBpbGVyLgoKMDMvMTYvMjAwNDogbW1hdHVzCgogICAgICAgICAgICAtIEFsbG93aW5nIHRoZSBlbXB0eSAldGVtcGxhdGUgZGlyZWN0aXZlLCBzdWNoIGFzCgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgdG8gcHJvY2VzcyB0aGUgY2xhc3MgInR5cGVkZWYicyBhbmQgInR5cGVtYXAicy4gQmVmb3JlCgkgICAgICBvbmx5IHRoZSBpbnRlcm5hbCAidHlwZWRlZiJzIHdlcmUgcHJvY2Vzc2VkLgoKICAgICAgICAgICAgICBUaGlzIG1ha2VzIHBvc3NpYmxlIHRvIGVtaXQgdGhlIGRlZmF1bHQgaW4vb3V0CiAgICAgICAgICAgICAgdHlwZW1hcHMgd2l0aG91dCB0aGUgbmVlZCBvZiB3cmFwcGluZyBhbiBzcGVjaWFsaXplZAogICAgICAgICAgICAgIHZlY3RvciBpbnN0YW5jZS4KCgkgICAgLSBBZGRpbmcgdGhlIHByZXByb2Nlc3NvciBleHRlbnNpb24gI0Agd2hpY2ggbWFuZ2xlcyB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgbWFjcm8gYXJndW1lbnQsIGxpa2UgaW46CgogICAgICAgICAgICAgICAgI2RlZmluZSBtYWNybyhYKSAgI0BYCiAgICAgICAgICAgICAgICBtYWNybyhpbnQpICAgICAgICAgLT4gaW50CiAgICAgICAgICAgICAgICBtYWNybyhzdGQ6OnN0cmluZykgLT4gc3RkX3Nfc19zdHJpbmcKICAgICAgICAgICAgICAgIAoJICAgIC0gRnJhZ21lbnRzIGNhbiBub3cgYmUgInR5cGUgc3BlY2lhbGl6ZWQiLCBhcyB0aGUgdHlwZW1hcHMuIFRoZQoJICAgICAgc3ludGF4IGlzIGFzIGZvbGxvd3MKIAogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiwiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogYSB0eXBlIGluZGVwZW5kZW50IGZyYWdtZW50IChvbGQgc3ludGF4KSAqLyB9CiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiIHtUeXBlfSwgImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIHRoZSBmcmFnbWVudCBpcyB0eXBlIGRlcGVuZGVudCAqL30KIAogICAgICAgICAgICAgIE5vdyBmcmFnbWVudHMgY2FuIGFsc28gYmUgdXNlZCBpbnNpZGUgdGVtcGxhdGVzOiAKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICVmcmFnbWVudCgiaW5jb2RlIntBPFQ+fSwiaGVhZGVyIikgewoJCSAgICAgIC8qICdpbmNvZGUnIHNwZWNpYWxpemVkIGZyYWdtZW50ICovCgkJICAgfQogCgkJICAgJXR5cGVtYXAoaW4sZnJhZ21lbnQ9ImluY29kZSJ7QTxUPn0pIHsKCQkgICAgICAvKgoJCSAgICAgICAgIGhlcmUgd2UgdXNlIHRoZSAndHlwZSBzcGVjaWFsaXplZCcgCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCAiaW5jb2RlIntBPFQ+fQogICAgICAgICAgICAgICAgICAgICAgKi8KCQkgICAgfQogICAgICAgICAgICAgICAgfTsKCQkJICAgICAJCgowMy8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIGJ1ZyB3aGljaCBtZWFudCB0aGF0IHNvbWUgdmlydHVhbCBmdW5jdGlvbnMgb3ZlcnJpZGRlbiBpbgogICAgICAgICAgICBKYXZhIHdlcmUgbm90IGJlaW5nIGNhbGxlZCBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiBCdWcgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgICAgICAgICAgIGJ5IFJvYmVydCBkZSBWcmllcyBhbmQgU2NvdHQgTWljaGVsLgoKMDMvMDIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2hlY2sgdGhlIHR5cGUgb2Ygc3RyaW5nIGFyZ3VtZW50cy4KCjAyLzI0LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW5hbWVzcGFjZSA8bmFtZT4uIFRoaXMgYWxsb3dzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIGEgQyMgbmFtZXNwYWNlIGludG8gd2hpY2ggYWxsIEMjIGNsYXNzZXMgYXJlIGdlbmVyYXRlZC4KCjAyLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkgCgkgICAgW016U2NoZW1lXSBVc2UgRlVOQ19OQU1FIHJhdGhlciB0aGFuIGEgYm9ndXMgdHlwZW1hcCB2YXJpYWJsZSBmb3Igc2lnbmFsbGluZwoJICAgIGVycm9ycy4gIENhbGwgc2NoZW1lX3dyb25nX3R5cGUgd2l0aCBhIHplcm8tYmFzZWQgYXJndW1lbnQgbnVtYmVyLiAgCgkgICAgUmVwb3J0ZWQgYnkgT25kcmVqIFBhY292c2t5LCBTRiAjOTAyNjIxLgoKCSAgICBbR3VpbGVdIERlZmluZSBGVU5DX05BTUUgYWxzbyBpbiB0aGUgZGlzcGF0Y2ggd3JhcHBlciBmb3Igb3ZlcmxvYWRlZAoJICAgIGZ1bmN0aW9ucy4gIFBhdGNoIGJ5IEpvaG4gTGVueiwgU0YgIzg5NjI1NS4KCjAyLzIyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgdHJ5IHRvIGludm9rZSBhIG51bGwgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KCjAyLzIwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBzbyB0aGF0IHRoZSBTV0lHIHNvdXJjZSB3aWxsIGNvbXBpbGUgdXNpbmcgdGhlIERpZ2l0YWwgTWFycyBDb21waWxlcgogICAgICAgICAgICAoZm9ybWVybHkgU3ltYW50aWMgY29tcGlsZXIpIG9uIFdpbmRvd3MuIFN1Ym1pdHRlZCBieSBTY290dCBNaWNoZWwuCgowMi8xMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBOZXcgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1ub2luaXQuICBVc2UgaXQgZm9yIGJ1aWxkaW5nCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyeSwgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIGZ1bmN0aW9ucwoJICAgIHNjaGVtZV9pbml0aWFsaXplIGV0Yy4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTc1NC4KCgkgICAgW016U2NoZW1lXSBEb24ndCBwcm9kdWNlIGludmFsaWQgQyBjb2RlIHdoZW4gaW52b2tlZCB3aXRoIHRoZQoJICAgIC1kZWNsYXJlbW9kdWxlIG9wdGlvbi4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTEwOC4KCSAgICAKCSAgICBbR3VpbGVdIEJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcnkgd2l0aCBwYXNzaXZlIGxpbmthZ2UsIHRvIHJlbmFtZQoJICAgIHRoZSBTV0lHX2luaXQgZnVuY3Rpb24gdW5pcXVlbHkuCgowMi8xMi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCBzdWJtaXR0ZWQgYnkgQmlsbCBIb2ZmbWFuIHdoaWNoIHByZXZlbnRzIFNXSUcgZnJvbSBjcmFzaGluZwogICAgICAgICAgICB3aGVuIGEgZmlsZSBmb3IgdGhlIHR5cGV3cmFwcGVyIGNsYXNzIGNhbm5vdCBiZSBvcGVuZWQuCgowMi8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBPdmVybG9hZGluZyBjaGFuZ2VzOgogICAgICAgICAgICAgIC0gTWV0aG9kcyB3aGljaCBhcmUgb3ZlcmxvYWRlZCBpbiBjb25zdCBvbmx5IG5vIGxvbmdlciBnZW5lcmF0ZSBKYXZhCiAgICAgICAgICAgICAgICBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZSAtIHRoZSBmaXJzdCBtZXRob2QgcGFyc2VkIGlzIHVzZWQgYW5kIGEKICAgICAgICAgICAgICAgIHdhcm5pbmcgaXMgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICB0byB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aGljaCBhbHdheXMgdXNlcyB0aGUgbm9uLWNvbnN0IG1ldGhvZC4KICAgICAgICAgICAgICAtIFdhcm5pbmcgbWVzc2FnZXMgNTA5IGFuZCA1MTIgcmVwbGFjZWQgYnkgbmV3IHdhcm5pbmcgbnVtYmVyIDUxNiwgd2hpY2ggCiAgICAgICAgICAgICAgICBpcyBtb3JlIHJlbGV2YW50IHRvIHRoZXNlIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIGFzIHRoZSBvdmVybG9hZGVkCiAgICAgICAgICAgICAgICBtZXRob2RzIGFyZW4ndCAnc2hhZG93ZWQnLCB0aGV5IGFyZSBpZ25vcmVkLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVwbGFjZSB0aGUgImtub3duX2NsYXNzZXMiIGhhc2ggdGFibGUgYnkgYSBub2RlCgkgICAgYXR0cmlidXRlLiAgTWV0aG9kcyBvZiBjbGFzc2VzIGluIEMrKyBuYW1lc3BhY2VzIG5vdyBnZXQKCSAgICB0aGUgcHJvcGVyIHNwZWNpYWxpemVyIGluIHRoZSBHT09QUyBkZWNsYXJhdGlvbi4KCSAgICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFVuaXF1aWZ5IHRoZSBhcmd1bWVudCBuYW1lcyBpbiBHT09QUyBzaGFkb3cgbWV0aG9kCgkgICAgZGVjbGFyYXRpb25zLiAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMS8yMDA0OiBzdW5zaGluZSAoRXJpYyBTdW5zaGluZSkKICAgICAgICAgICAgUmV2aXZlZCB0aGUgTmV4dFN0ZXAgcG9ydCBvZiBTV0lHLgoKICAgICAgICAgICAgRml4ZWQgZmF0YWwgcHJvYmxlbSBpbiBEb2hTdHJzdHIoKSBjYXVzZWQgYnkgZGlmZmVyZW5jZSBpbiBzdHJzdHIoKQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYWRlICVhcHBseSBiZWNvbWUgZW50aXJlbHkgZHlzZnVuY3Rpb25hbC4gIE9uCiAgICAgICAgICAgIE5leHRTdGVwLCBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRlcyB0byBOVUxMOyB3aGVyZWFzLCBvbiBtb2Rlcm4KICAgICAgICAgICAgcGxhdGZvcm1zLCBpdCBldmFsdWF0ZXMgdG8gImZvbyIuICAlYXBwbHkgcmVsaWVzIGV4dGVuc2l2ZWx5IHVwb24KICAgICAgICAgICAgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0aW5nIHRvIG5vbi1OVUxMLCB0aGVyZWZvcmUgaXQgZmFpbGVkCiAgICAgICAgICAgIGNhdGFzdHJvcGhpY2FsbHkgd2hlbiBmYWNlZCB3aXRoIE5leHRTdGVwJ3Mgc3Ryc3RyKCkuCgogICAgICAgICAgICBBZGRlZCBgYm9vbCcgY2hlY2sgdG8gY29uZmlndXJlLmluIHNpbmNlIE5leHRTdGVwJ3MgQysrIGNvbXBpbGVyCiAgICAgICAgICAgIGRvZXMgbm90IHN1cHBseSB0aGlzIHR5cGUuICBzd2lnLmggbm93IGZha2VzIHVwIGBib29sJyBpZiBuZWVkZWQuCgogICAgICAgICAgICBXb3JrZWQgYXJvdW5kIE5leHRTdGVwIEMrKyBjb21waWxlciBidWcgaW4gd2hpY2ggQysrIGNvZGUgaXMKICAgICAgICAgICAgZGlzYWxsb3dlZCBpbnNpZGUgZXh0ZXJuICJDIiBmdW5jdGlvbnMuICBUaGlzIHByb2JsZW0gYWZmZWN0ZWQgYWxsCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMsIHNpbmNlIHRoZXkgcHVibGlzaCBob29rIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybToKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICBGaXhlZCBieSBjcmVhdGluZyBhIEMrKyB3cmFwcGVyOgogICAgICAgICAgICAgICAgc3RhdGljIExhbmd1YWdlICpuZXdfc3dpZ19mb28oKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ld19zd2lnX2ZvbygpOyB9CgogICAgICAgICAgICBFbnN1cmVkIHRoYXQgU3dpZ19jb3B5X3N0cmluZygpIGlzIHVzZWQgaW4gcGxhY2Ugb2Ygc3RyZHVwKCkgc2luY2UKICAgICAgICAgICAgTmV4dFN0ZXAgZG9lcyBub3Qgc3VwcGx5IHN0cmR1cCgpLgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFJ1YnkgbGlicmFyeSBuYW1lIGFuZCBsb2NhdGlvbiBpbiBjb25maWd1cmUuaW4uCiAgICAgICAgICAgIFByb2JsZW0gMTogQXNzdW1lZCB0aGF0IGxpYnJhcnkgYWx3YXlzIHJlc2lkZWQgaW4gUnVieSdzICJhcmNoZGlyIiwKICAgICAgICAgICAgd2hpY2ggd2FzIGNvcnJlY3QgZm9yIFJ1YnkgMS42LngsIGJ1dCB3aGljaCBpcyBpbmNvcnJlY3QgZm9yIFJ1YnkKICAgICAgICAgICAgMS44LngsIGluIHdoaWNoIGNhc2UgdGhlIGxpYnJhcnkgbm9ybWFsbHkgcmVzaWRlcyBpbiBSdWJ5J3MKICAgICAgICAgICAgImxpYmRpciIuICBQcm9ibGVtIDI6IEFzc3VtZWQgdGhhdCB0aGUgbGlicmFyeSBjb3VsZCBhbHdheXMgYmUKICAgICAgICAgICAgbGlua2VkIHZpYSAiLWwiK1JVQllfSU5TVEFMTF9OQU1FICh3aGVyZSBSVUJZX0lOU1RBTExfTkFNRQogICAgICAgICAgICB0eXBpY2FsbHkgaXMgInJ1YnkiKSwgaG93ZXZlciB0aGlzIGZhaWxlZCBmb3IgcGxhdGZvcm1zLCBzdWNoIGFzCiAgICAgICAgICAgIE5leHRTdGVwLCB3aGljaCBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgICAgICAgc3RhdGljIGxpYnJhcnkgbmFtZSBpbiAxLjgueCBpcyBsaWJydWJ5LXN0YXRpYy5hLCB0aHVzCiAgICAgICAgICAgIC1scnVieS1zdGF0aWMgaXMgcmVxdWlyZWQuICBUaGUgbmV3IGxvZ2ljIHdvcmtzIGNvcnJlY3RseSBmb3IKICAgICAgICAgICAgc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGZvciAxLjYueCBhbmQgMS44LnguCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUGVybCBDRkxBR1MgaW4gY29uZmlndXJlLmluIGZvciBOZXh0U3RlcC4KICAgICAgICAgICAgRGV0ZWN0aW9uIGNvZGUgZXh0cmFjdGVkIENGTEFHUyBmcm9tIFBlcmwncyAlQ29uZmlnIGhhc2ggYnV0CiAgICAgICAgICAgIG5lZ2xlY3RlZCB0byBhZGQgYSBuZXdsaW5lIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdCB0aHJvdWdoCiAgICAgICAgICAgIGBzZWQnLiAgTmV4dFN0ZXAncyBhbmNpZW50IGBzZWQnIGRpc2NhcmRzIGlucHV0IHdoaWNoIGlzIG5vdAogICAgICAgICAgICB0ZXJtaW5hdGVkIHdpdGggYSBuZXdsaW5lLCB0aHVzIFBlcmwgQ0ZMQUdTIGFsd2F5cyBldmFsdWF0ZWQgdG8gdGhlCiAgICAgICAgICAgIGVtcHR5IHN0cmluZy4KCjAxLzE2LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaWR5IHVwIGluIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSB0aGF0IGlzIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgICAgIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYXJlIHdyYXBwZWQgd2l0aCB0aGUgdGhyb3dzIHR5cGVtYXAuCiAgICAgICAgICAgIFRoaXMgcmVkdW5kYW50IGNvZGUgaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdzsgCiAgICAgICAgICAgICAgICB9CgowMS8xMi8yMDA0OiB3c2Z1bHRvbiBvbiBiZWhhbGYgb2YgbW1hdHVzIChtYXJjZWxvIG1hdHVzKSAKICAgICAgICAgICAgaWYgYSBtZXRob2QgdXNlcyAlZXhjZXB0aW9uIGFuZCB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSB1c2UKICAgICAgICAgICAgb2YgdGhlIHRocm93cyB0eXBlbWFwLCB0aGUgY29kZSBpbiBhIHRocm93cyB0eXBlbWFwIHdpbGwgYmUKICAgICAgICAgICAgZ2VuZXJhdGVkIGluc2lkZSB0aGUgdHJ5IGJvZHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIG1ldGhvZCB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgRXhjZXB0ICV7CiAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBjbGFzcyBFeGNlcHQge307CiAgICAgICAgICAgICAgdm9pZCBtZXRob2QoaW50IGkpIHRocm93IChFeGNlcHQpOwoKICAgICAgICAgICAgV2lsbCBnZW5lcmF0ZToKCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0ICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBBcyBjYW4gYmUgc2VlbiwgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jayBpcyBmb3IgdGhlIHRocm93cyB0eXBlbWFwcy4KICAgICAgICAgICAgUHJldmlvdXNseSwgdGhpcyB3YXMgcmV2ZXJzZWQgc28gdGhhdCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrCiAgICAgICAgICAgIHdhcyB0aGUgJWV4Y2VwdGlvbiBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaXQgd291bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgIGltcG9zc2libGUgdG8gY2F0Y2ggRXhjZXB0IGFzIHRoZSBjYXRjaCBhbGwgKC4uLikgd291bGQgY2F0Y2ggdGhlCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpbnN0ZWFkLgoKVmVyc2lvbiAxLjMuMjEgKEphbnVhcnkgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMDEvMTAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBvdXRwdXQgZm9ybWF0IGZvciBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgY2FuIGJlIHNlbGVjdGVkIGZvcgogICAgICAgICAgICBpbnRlZ3JhdGlvbiB3aXRoIHlvdXIgZmF2b3VyaXRlIElERS9lZGl0b3IuIEVkaXRvcnMgYW5kIElERXMgY2FuIHVzdWFsbHkKICAgICAgICAgICAgcGFyc2UgZXJyb3IgbWVzc2FnZXMgYW5kIGlmIGluIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgd2lsbCBlYXNpbHkgdGFrZSB5b3UgCiAgICAgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yLiBUaGUgc3RhbmRhcmQgZm9ybWF0IGlzIHVzZWQgYnkgCiAgICAgICAgICAgIGRlZmF1bHQgZXhjZXB0IG9uIFdpbmRvd3Mgd2hlcmUgdGhlIE1pY3Jvc29mdCBmb3JtYXQgaXMgdXNlZCBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZzdGFuZGFyZCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaTo0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRm1pY3Jvc29mdCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSg0KTogU3ludGF4IGVycm9yIGluIGlucHV0LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg3MTkwOSBdIHNpbXBsZSBuYW1lc3BhY2UgcHJvYmxlbS4KICAgICAgICAgICAgVGhpcyB3YXMgYSBwcm9ibGVtIHVzaW5nIGFub255bW91cyBzdHJ1Y3R1cmVzIGluIGEgbmFtZXNwYWNlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBuOwogICAgICAgICAgICAgICAgICAgfSBTOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIGJyb2tlbiBQZXJsIGV4YW1wbGVzLgoKMTIvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhIGFuZCBDI10gRml4ZXMgZm9yIHdyYXBwaW5nIGNvdmFyaWFudCAocG9seW1vcnBoaWMpIHJldHVybiB0eXBlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXNlKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgQmFzZSogY29weSgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIERlcml2ZWQqIGNvcHkoKSBjb25zdDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgRGVyaXZlZDo6Y29weSBwcm94eSBtZXRob2QgcmV0dXJucyBCYXNlIG5vdCBEZXJpdmVkLiBBIHdhcm5pbmcgaXMgaXNzdWVkCiAgICAgICAgICAgIGFib3V0IHRoaXMuIFByZXZpb3VzbHkgdGhlIHBvaW50ZXIgdXNlZCBieSB0aGUgcHJveHkgY2xhc3Mgd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIHRyZWF0ZWQgYXMgYSBCYXNlKiBpbnN0ZWFkIG9mIGEgRGVyaXZlZCouCgoxMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IHNvIHRoYXQgV2luZG93cyBwYXRocyBhcmUgZGlzcGxheWVkIGNvcnJlY3RseSB3aGVuIHJlcG9ydGluZyBlcnJvcnMuCiAgICAgICAgICAgIEFuIGVycm9yIHByZXZpb3VzbHkgd291bGQgaGF2ZSBiZWVuIHNob3duIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICAuP3hhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgogICAgICAgICAgICBpbnN0ZWFkIG9mOgoKICAgICAgICAgICAgICAuXGV4YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKClZlcnNpb24gMS4zLjIwIChEZWNlbWJlciAxNywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBMYXN0IG1pbnV0ZSBtb2RpZmljYXRpb25zLiAgIFBlcmw1IG1vZHVsZSBub3cgZ2VuZXJhdGVzIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgIGJ5IGRlZmF1bHQgbGlrZSBhbGwgb2YgdGhlIG90aGVyIG1vZHVsZXMuICBQSFA0IHdyYXBwZXJzIG5vIGxvbmdlcgogICAgICAgICAgICBpbmNsdWRlICJjb25maWcuaCIuIAoKMTIvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBXZWFrZW5lZCB3YXJuaW5nIG1lc3NhZ2UgcmVsYXRlZCB0byBjb25zdHJ1Y3RvciBuYW1lcyBzbyB0aGF0IGFuCiAgICAgICAgICAgIHVudXN1YWwgbmVzdGVkLWNsYXNzIHdyYXBwaW5nIHRlY2huaXF1ZSB3b3VsZCB3b3JrIGFnYWluIChhcHBhcmVudGx5CiAgICAgICAgICAgIGl0IHdvcmtlZCBpbiBzb21lIG9sZGVyIFNXSUcgcmVsZWFzZXMpLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGUgewogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NBOwogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NCOwogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NBIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0IgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogIFRoZXJlIGlzIHN0aWxsIHNvbWUgb2RkIGludGVyYWN0aW9uIHdpdGggdGhlIFNXSUcgc3ltYm9sCiAgICAgICAgICAgIHRhYmxlL3R5cGUgc3lzdGVtIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGxvb2tlZCBhdCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHdXN0YXZvIE5pZW1leWVyLgoKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJvdGVjdGVkIGNsYXNzIG1ldGhvZHMgYXJlIHdyYXBwZWQgYXMgcHJvdGVjdGVkIEphdmEgbWV0aG9kcyAKICAgICAgICAgICAgd2hlbiB1c2luZyB0aGUgZGlycHJvdCBkaXJlY3RvciBmZWF0dXJlLiBUaGlzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIHRvIHNvbWV0aGluZyBlbHNlIHNob3VsZCB0aGUgbmVlZCBhcmlzZSwgZm9yCiAgICAgICAgICAgIGV4YW1wbGUsIHByaXZhdGUgb3IgcGFja2FnZSBhY2Nlc3MuCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSAKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgKEphdmEpIGFuZCAlY3NtZXRob2Rtb2RpZmllcnMgKEMjKSBvcGVyYXRlIHNsaWdodGx5IAogICAgICAgICAgICBkaWZmZXJlbnRseS4gUHJldmlvdXNseSB0aGlzIGZlYXR1cmUgaGFkIHRvIGJlIHByZXNlbnQgdG8gc2V0IHRoZSBtZXRob2QKICAgICAgICAgICAgbW9kaWZpZXJzLiBOb3cgaXQgaXMgb25seSB1c2VkIGlmIGl0IGV4aXN0cyBmb3IgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkLgogICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAicHVibGljIiBhcyBwcmV2aW91cyBob3dldmVyLCB3aGVuIHdyYXBwaW5nIHByb3RlY3RlZAogICAgICAgICAgICBkaXJlY3RvciBtZXRob2RzIGl0IGlzICJwcm90ZWN0ZWQiLiBUaGlzIGNoYW5nZSB3aWxsIG5vdCBhZmZlY3QgZXhpc3RpbmcKICAgICAgICAgICAgdXNlIG9mIHRoZSAlamF2YW1ldGhvZG1vZGlmaWVycyBvciAlY3NtZXRob2Rtb2RpZmllcnMuCgoxMi8xMS8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoaXMgZml4IHNvbWUgcmVjdXJyaW5nIHJlcG9ydHMgYWJvdXQga2V5d29yZHMgbm90IGJlZW4KCSAgICBwcm9wZXJseSBpZGVudGlmaWVkIGFuZCB3YXJuZWQsIGFuZCBpdCBzb2x2ZXMgdGhlIHByb2JsZW0KCSAgICBvZiBob3cgdG8gYWRkIGEgdGVzdCBmaWxlIHRvIHRoZSB0ZXN0LXN1aXRlIHN1Y2ggdGhhdCBpdAoJICAgIGRvZXNuJ3QgdXNlIGFueSBrZXl3b3JkIG9mIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcwoJICAgIChhbmQgZG9pbmcgaXQgd2l0aG91dCBjb21waWxpbmcgdGhlIHRlc3QgZm9yIGFsbCB0aGUKCSAgICBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCB0aGluZyB0aGF0IGlzIG5vdCBhbHdheXMgcG9zc2libGUsCgkgICAgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHlvdSB0byBrbm93IGFsbCB0aGUgc3VwcG9ydGVkCgkgICAgbGFuZ3VhZ2Uga2V5d29yZHMsIHRoaW5nIHRoYXQgaXMgYWx3YXlzIGltcG9zc2libGUpLgoKCSAgICBTbyB0aGVzZSBhcmUgdGhlIGNoYW5nZXMgZ2xvYmFsbHkgc3BlYWtpbmc6CgoJICAgIC0gVW5pZm9ybSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUga2V5d29yZCB3YXJuaW5ncyB0aHJvdWdoCgkgICAgICB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogYWxsIHRoZSBsYW5ndWFnZXMgaGFzIG5vdyBhCgkgICAgICBzZXBhcmF0ZSBmaWxlIHRoYXQgZGVmaW5lcyB0aGUga2V5d29yZHMgb3IgYmFkIG5hbWVzOgoKCQkgIHB5dGhvbi9weXRob25rdy5zd2cKCQkgIGNoaWNrZW4vY2hpY2tlbmt3LnN3ZwogICAgICAgICAgICAgICAgICAuLi4uCgoJICAgIC0gQWRkZWQga2V5d29yZCBsaXN0IGZvciBtb3N0IG9mIHRoZSBsYW5ndWFnZXMgdGhhdCBkaWRuJ3QKCSAgICAgIGhhdmUgb25lICh1c2luZyB0aGUgbmV3IHNlcGFyYXRlZCBmaWxlKS4KCQkgICAgCSAgICAKCSAgICAtIEFkZGVkIHRoZSAiQWxsIGtleXdvcmRzIiB3YXJuaW5nIHN1cHBvcnQ6IC1XYWxsa3cgb3B0aW9uLgoKICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGluY2x1ZGUgYWxsIHRoZSBrbm93biBrZXl3b3JkcwoJICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcywgYW5kIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICAgICBzd2lnIC1XYWxsa3cgLi4uLgoJICAgIAoJICAgICAgVGhpcyB3aWxsIGhlbHAgdG8gdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgdGVzdC1zdWl0ZQoJICAgICAgZmlsZSB0aGF0IGNhbiBiZSBjb21waWxlZCBpbiBhbGwgdGhlIHN3aWcgc3VwcG9ydGVkCgkgICAgICBsYW5ndWFnZXMsIGFuZCBpdCB3aWxsIGJlIGFsc28gaGVscGZ1bCBmb3IgdXNlcnMgd2hvCgkgICAgICB3YW50IHRvIGNyZWF0ZSBtdWx0aS1sYW5ndWFnZSBsaWJyYXJpZXMuCgkgICAgCgkgICAgQW5kIHRoZXNlIGFyZSB0aGUgZGV0YWlsZWQgY2hhbmdlcyAobW9zdGx5IGZpbGUgYWRkaXRpb24pOgoKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgYWxyZWFkeSBoYXZlIHNvbWUgc29ydCBvZiBrZXl3b3JkCgkgICAgICB3YXJuaW5nIGxpc3QsIG1vdmUgaXQgdG8gYW4gZXh0ZXJuYWwgbGFuZ3VhZ2Vrdy5zd2cKCSAgICAgIGZpbGUsIGllOgoJICAgIAoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHB5dGhvbi5zd2cgLT4gcHl0aG9ua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gY2hpY2tlbi5zd2cgLT4gY2hpY2tlbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHRjbDguc3dnIC0+IHRjbGt3LnN3ZwogCiAgICAgICAgICAgICAgYW5kIHJlLWluY2x1ZGUgbGFuZ3VhZ2Vrdy5zd2cgZnJvbSBsYW5ndWFnZS5zd2cuCgkgICAgCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlIHRoYXQgZGlkbid0IGhhdmUgYSBrZXl3b3JkIGxpc3QsIGFuZAoJICAgICAgZm9yIHRoZSBvbmVzIHRoYXQgSSBjb3VsZCBmaW5kIGEgbGlzdCwgYWRkIHRoZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSwgaWU6CgogICAgICAgICAgICAgICAgIGNzaGFycC9jc2hhcnBrdy5zd2cKICAgICAgICAgICAgICAgICBqYXZhL2phdmFrdy5zd2cKICAgICAgICAgICAgICAgICBwaHA0L3BocGt3LnN3ZwoJCSBwaWtlL3Bpa2Vrdy5zd2cJIAoJCSBydWJ5L3J1Ynlrdy5zd2cKCgogICAgICAgICAgICAgIGFsc28gYWRkIGEgbGluZSBpbiBsYW5ndWFnZS5zd2cgdG8gaW5jbHVkZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2csIGJ1dCBub3cgaXQgaXMgY29tbWVudGVkISEhLCBsaWtlIGluCgkgICAgICBqYXZhLnN3ZzoKCiAgICAgICAgICAgICAgICAgIC8qIGphdmEga2V5d29yZHMgKi8KICAgICAgICAgICAgICAgICAgLyogcGxlYXNlIHRlc3QgYW5kIGFjdGl2YXRlICovCiAgICAgICAgICAgICAgICAgIC8vJWluY2x1ZGUgImphdmFrdy5zd2ciCgoJICAgICAgaWUsIHRoZXJlIHdpbGwgYmUgbm8gY2hhbmdlIGluIGhvdyBzd2lnIHJ1bnMgbm9ybWFsbHkKCSAgICAgIHVudGlsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRlc3QgYW5kIHVuY29tbWVudCB0aGF0CgkgICAgICBsaW5lLgoJICAgICAgCgkgICAgICBTbywgcGxlYXNlIGNoZWNrIGVhY2ggbGFuZ3VhZ2Vrdy5zd2cgZmlsZSAoSSBsZWZ0IHRoZQoJICAgICAgbGluayB0byB0aGUga2V5d29yZCBsaXN0IHNvdXJjZSBmb3IgY2hlY2tpbmcpLCBhbmQgYWZ0ZXIKCSAgICAgIHRlc3RpbmcsIHVuY29tbWVudCB0aGUgJWluY2x1ZGUgbGluZS4KCgkgICAgLSBBZGRlZCB0aGUgZmlsZSBhbGxrdy5zd2csIHdoaWNoIGluY2x1ZGVzIGFsbCB0aGUKICAgICAgICAgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlcy4KCgkgICAgICBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGhhcyBubyBsYW5ndWFnZWt3LnN3ZyBmaWxlIHJpZ2h0CgkgICAgICBub3csIGFuZCBpZiB0aGV5IG5lZWQgb25lLCBhZGQgdGhlIGZpbGUgaW50byB0aGUKCSAgICAgIGxhbmd1YWdlIGRpcmVjdG9yeSwgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyBpbmNsdWRlCgkgICAgICBsaW5lIGludG8gdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgCgkgICAgLSBBZGRlZCB0aGUgLVdhbGxrdyB0aGF0IGluY2x1ZGVzIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIE5vdGUgdGhhdCB0aGUgb2xkIC1sYWxsa3cuc3dnIG9wdGlvbiBjb3VsZG4ndCBiZSB1c2VkCgkgICAgICBzaW5jZSBpdCBpbmNsdWRlIHRoZSBmaWxlIGFmdGVyIGl0IHdvdWxkIGJlIG5lZWRlZC4KCgoJICAgIEhvcGVmdWxseSwgdGhlIC1XYWxsa3cgb3B0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQKCSAgICBydWxlcyBpbiB0aGUgcmVsYXRlZCB0ZXN0LXN1aXRlIE1ha2VmaWxlcywgc28sIHdoZW4KCSAgICBjcmVhdGluZyBhIG5ldyB0ZXN0LCBvciBhZGRpbmcgYSBuZXcgc3dpZyBsaWJyYXJ5IGZpbGUKCSAgICAobGlrZSBfc3RkX2RlcXVlLmkpLCBzd2lnIHdpbGwgd2FybiB5b3UgaWYgeW91IGFyZSB1c2luZyBhCgkgICAgYmFkIG5hbWUsIGNvbnNpZGVyaW5nIGFsbCB0aGUgbGFuZ3VhZ2Ugd2hlcmUgaXQgbmVlZHMgdG8KCSAgICBydW4uCgkgICAgCgkgICAgUmlnaHQgbm93IHlvdSBjYW4gdGVzdCBpdCBieSB1c2luZzoKCiAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0ic3dpZyAtV2FsbGt3IgoKCSAgICBvciB1c2luZyB5b3VyIGZhdm9yaXRlIHRhcmdldCBsYW5ndWFnZSwgaXQgZG9lc24ndCBtYXR0ZXIuCgoJICAgIEFuZCB5ZXMsIHRoZXJlIGFyZSBzZXZlcmFsIGV4YW1wbGVzIHRoYXQgYXJlIHVzaW5nCgkgICAgcmVzZXJ2ZWQga2V5d29yZHMsIHNwZWNpYWxseSBmcm9tIGNzaGFycC4KICAgICAgICAgIAoJICAgICoqKiBSZW1lbWJlciAqKioqOiB0aGUgbmV3IGtleXdvcmQgd2FybmluZyBsaXN0cyBhcmUgbm90CgkgICAgaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbnkgb2YgbGFuZ3VhZ2UgdGhhdCBiZWZvcmUgZGlkbid0CgkgICAgaGF2ZSBvbmUuIFRvIGVuYWJsZSB0aGUga2V5d29yZCB3YXJuaW5ncyBhcyB0aGUgZGVmYXVsdAoJICAgIGJlaGF2aW9yLCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBsYW5ndWFnZWt3LnN3ZyBmaWxlIGhhcyB0bwoJICAgIGJlIHVuY29tbWVudGVkIGF0IGVhY2ggbGFuZ3VhZ2Uuc3dnIGZpbGUuCgoJICAgIFNvLCBhbGwgdGhlIGxhbmd1YWdlIG1haW50YWluZXJzLCBwbGVhc2UgY2hlY2sgdGhlCgkgICAga2V5d29yZHMgbGlzdC4gCgoJICAgIEFsc28sIHlvdSBjYW4gYWRkIGJ1aXQtaW4gbmFtZXMsIGFuZCBub3Qgb25seSBrZXl3b3JkcywgbGlrZQoJICAgICdUcnVlL0ZhbHNlJyBpbiBweXRob24uICBSZW1lbWJlciB0aGF0IHlvdSBjYW4gYmUgbW9yZQoJICAgIHNwZWNpZmljIGFuZCByZWZlciBvbmx5IHRvIG1lbWJlciBuYW1lcywgbGlrZSAqOjpjb25maWd1cmUKCSAgICBvciAqOjpjZ2V0IChzZWUgYW4gZXhhbXBsZSBpbiB0aGUgdGNsOC90Y2w4a3cuc3dnIGZpbGUpLAoJICAgIG9yIG9ubHkgZ2xvYmFsIG5hbWVzLCBsaWtlIDo6cmFuZ2UgKHNlZSBhbiBleGFtcGxlIGluIHRoZQoJICAgIHB5dGhvbi9weXRob25rdy5zd2cgZmlsZS4KCgkgICAgSnVzdCB0byBiZSBjb25zaXN0ZW50LCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlczoKCgkgICAgLSBVc2UgY29kZSAzMTQgZm9yIGtleXdvcmQgYW5kL29yIGZhdGFsIGJhZCBuYW1lcy4KCSAgICAtIFVzZSBjb2RlIDMyMSBmb3IgYnVpdC1pbiBhbmQvb3Igbm90IGZhdGFsIGJhZCBuYW1lcy4KICAgICAgICAgICAKICAgICAgICAgICAgc28sIHRoZXkgY2FuJ3QgYmUgZGlzYWJsZWQvZW5hYmxlZCBpbmRlcGVuZGVudGx5IChzZWUKCSAgICBweXRob24vcHlodG9ua3cuc3dnIGZvciBleGFtcGxlcykuCgoJICAgICoqKiogQW5kIGRvbid0IGFkZCBhbnkgbmV3IHRlc3QgZmlsZSB3aXRob3V0IGNoZWNraW5nIGl0CgkgICAgd2l0aCB0aGUgLVdhbGxrdyBvcHRpb24hISAodGhhdCBpbmNsdWRlcyBtZSkgKioqKiouCgkgIAoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNGIGJ1ZyAjODU0NjM0CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFjY2VwdGluZyB0aGUgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yICcvJyBvbiAKICAgICAgICAgICAgV2luZG93cyBhbmQgdGhlIE1hYyBpbiBhZGRpdGlvbiB0byB0aGUgbmF0aXZlIG9uZSAoICdcJyBvbiAKICAgICAgICAgICAgV2luZG93cykuIFRoaXMgY2FuIGJlIHVzZWQgaW4gJWltcG9ydCwgJWluY2x1ZGUgYW5kIGNvbW1hbmRsaW5lIAogICAgICAgICAgICBvcHRpb25zIHRha2luZyBhIHBhdGgsIGZvciBleGFtcGxlIC1JLiBPbiBDeWd3aW4sIGJvdGggdGhlIFdpbmRvd3MKICAgICAgICAgICAgYW5kIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciBjYW4gbm93IGJlIHVzZWQgKHdhcyAnLycgb25seSkuCiAgICAgICAgICAgIAoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgogICAgICAgICAgICBbcHl0aG9uXSBJbXBsZW1lbnRpbmcgdGhlIHJ1bnRpbWUgInJlcHJvdGVjdGVkIiBkaXJlY3RvcgoJICAgIG1lbWJlcnMsIGlmIHlvdSBoYXZlOgogICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhcigpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBoZWxsbygpIHsgcmV0dXJuIGRvX2hlbGxvKCk7KQoKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGkoKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oZWxsbygpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlCgogICAgICAgICAgICAgICAgaW1wb3J0IG15X21vZHVsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyhteV9tb2R1bGUuQmFyKToKICAgICAgICAgICAgICAgICAgZGVmIGRvX2hlbGxvKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAKCSAgICAgICAgYiA9IEJhcigpICMgUHVyZSBDKysgRGlyZWN0b3IgY2xhc3MKICAgICAgICAgICAgICAgIGYgPSBGb28oKSAjIEMrKyBEaXJlY3RvciArIHB5dGhvbiBtZXRob2RzCgogICAgICAgICAgICAgICAgYi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBDKysgQmFyOjpkb19oZWxsbygpCiAgICAgICAgICAgICAgICBmLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIFB5dGhvbiBGb286OmRvX2hlbGxvKCkKCiAgICAgICAgICAgICAgICBiLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogCiAgICAgICAgICAgICAgICBiLmRvX2hlbGxvKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hlbGxvKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGVsbG8oKSAjIE9rLCBzaW5jZSBpdCBpdHMgcmVkZWZpbmVkIGluIHB5dGhvbi4KCiAgICAgICAgICAgIEhlcmUgQmFyLmRvX2hlbGxvIGlzIGFsd2F5cyBwcm90ZWN0ZWQsIGJ1dCBGb28uZG9faGVsbG8KICAgICAgICAgICAgaXMgInB1YmxpYyIsIGJlY2F1c2UgaXQgaXMgcmVkZWZpbmVkIGluIHB5dGhvbi4gQmVmb3JlLAoJICAgIGFsbCB0aGUgJ2RvX2hlbGxvJyBtZXRob2RzIHdlcmUgcHVibGljLgoKCSAgICBUaGlzIHNlZW1zIHRvIGJlIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4gQysrIGFuZCBweXRob24KCSAgICBwaGlsb3NvcGhpZXMsIGllLCBhbGwgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIGtlZXAKCSAgICBwcm90ZWN0ZWQgYXQgdGhlIHVzZXIgc2lkZSAoQysrIHdheSkgdW50aWwgdGhleSBhcmUKCSAgICByZWRlZmluZWQgKHB5dGhvbiB3YXksIHdlcmUgYWxsIGRlZmluZWQgbWV0aG9kcyBhcmUgYWx3YXlzCgkgICAgcHVibGljKS4gQW5kIHRoaXMgaXMgbm90IG9ubHkgYSBnb29kIGNvbXByb21pc2UsIGl0IGFsc28KCSAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gZG8gaXQgOikuCgoJICAgIE5vdyBydWJ5IGhhcyBuYXRpdmUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMsIGFuZCBweXRob24KCSAgICBwdXJlIHJ1bnRpbWUgc3VwcG9ydC4gSSBndWVzcyB0aGVzZSBhcmUgdGhlIHR3byBwb3NzaWJsZQoJICAgIGV4dHJlbWUgY2FzZXMuIEFuZCBob3BlZnVsbHksIHRoZXkgY291bGQgYmUgdXNlZCBhcwoJICAgIHRlbXBsYXRlcyB0byBtb2RpZnkgdGhlIG90aGVyIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQKCSAgICBkaXJlY3RvcnMsIHNvIHRoZXkgY2FuICJyZXByb3RlY3QiIHRoZSBwcm90ZWN0ZWQgZGlyZWN0b3IKCSAgICBtZW1iZXJzIGF0IHRoZSB0YXJnZXQgbGFuZ3VhZ2Ugc2lkZS4KCgkgICAgVGhpcyBmaW5pc2hlZCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIHN1cHBvcnQgZm9yIHRoZSAKCSAgICBweXRob24gbGFuZ3VhZ2UuIE9jYWxtIHdpbGwgbmVlZCB0byBhZGQgdGhlCgkgICAgInJlcHJvdGVjdGlvbiIgbGF0ZXIuCgoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoZSBmb2xsb3dpbmcgY2FzZSAocmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uKSB3YXMgZml4ZWQ6CgoJICAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAoJICAgICAgY2xhc3MgRm9vIHsgCgkgICAgICBwdWJsaWM6CgkgICAgICAgIHZvaWQgeSgpOwoKCSAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgaW50IHg7CgkgICAgICB9OwoKCSAgIHN3aWcgd2FybmVkIHRoYXQgdGhlIHN5bWJvbCAneCcgd2FzIGFscmVhZHkgZGVmaW5lZCwgYW5kCiAgICAgICAgICAgdGhlIHJlbmFtaW5nIGZhaWxzLiAneCcgd2FzIG5vdCBlbWl0dGVkLCBzaW5jZSBpdCBpcwogICAgICAgICAgIHByb3RlY3RlZCwgYnV0IGl0IHdhcyBrZXB0IGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCB0b28KICAgICAgICAgICBtdWNoIGluZm9ybWF0aW9uLgoKCSAgIE5vdyBzd2lnIHdvcmtzIGZvciBhbGwgdGhlIGNhc2VzIChwbGFpbiwgZGlyZWN0b3IgYW5kCgkgICBkaXJwcm90KSBhZ2Fpbi4gVGhpcyB3YXMgZml4ZWQgYnkgYWxsb3dpbmcgdGhlIHBhcnNlci55IHRvCgkgICBkZWNpZGUgbXVjaCBjbG9zZXIgd2hhdCB0byBkbyB3aXRoICd4Jy4gQmVmb3JlIGFsbCB0aGUKCSAgIGRpc2NhcmRpbmcgb3IgZ2VuZXJhdGlvbiB3YXMgcmVzb2x2ZWQgYXQgdGhlIGxhbmcuY3h4CgkgICBzdGFnZS4gQWxzbyB0aGUgY2hhbmdlcyBpbiBwYXJzZXIueSB0byBpbXBsZW1lbnQgdGhlCgkgICBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZSBhcmUgbm93IG11Y2ggbW9yZSBlbmNhcHN1bGF0ZWQsIGFuZAoJICAgdGhleSBnZXQgZGlzYWJsZWQgaWYgdGhlIG1vZGUgaXMgbm90IGVuYWJsZWQuIEJlZm9yZSB0aGUKCSAgIGRlYWN0aXZhdGlvbiB3YXMgZG9uZSBhdCB0aGUgZ2VuZXJhdGlvbiBzdGFnZSAobGFuZy5jeHgpLgoKCSAgIEJ5IHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGlyZWN0b3IgbW9kZSBpcyBlbmFibGVkLCBhbmQKCSAgICVyZW5hbWUgaXMgZG9uZSwgcmV1c2luZyBhIHByb3RlY3RlZCBtZW1iZXIgbmFtZSwgdGhlcmUgaXMKCSAgIGEgcGF0aG9sb2dpY2FsIGNhc2U6CgoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCiAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQSB7CgkgICAgIHB1YmxpYzoKCSAgICAgICB2b2lkIHkoKTsKCgkgICAgIHByb3RlY3RlZDoKCSAgICAgICBpbnQgeDsgICAgICAgICAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgaW50IHg7ICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICB2b2lkIHgoKTsgLyogd29ya3MgKi8KCSAgICAgICB0eXBlZGVmIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoKCSAgICAgICB2aXJ0dWFsIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGFzIGl0IHNob3VsZCwgc2luY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9vOjp4KCkgd2lsbCBiZSBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvciAqLwoKCSAgICAgICB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBidXQgc29tZXRpbWVzIGl0IHNob3VsZG4ndCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSBGb286OngoKSB3aWxsIG5vdCBiZSBlbWl0dGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBub3QgdmlydHVhbCAqLwoKCSAgICAgfTsKCgkgICBUaGUgbGFzdCBjYXNlIGlzIG5vdCBhbHdheXMgcmlnaHQgYmVjYXVzZSBhdCB0aGUgcGFyc2VyLnB5CgkgICBzdGFnZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVjaWRlIGlmIHRoZSBwcm90ZWN0ZWQgbWVtYmVyCgkgICBGb286OngoKSBjb3VsZCBvciBub3QgY29uZmxpY3Qgd2l0aCB0aGUgcmVuYW1lZCBGb286OnkoKSwKCSAgIHNpbmNlIEZvbzo6eCgpIGNvdWxkIGJlIHZpcnR1YWwgYnkgaW5oZXJpdGFuY2UuCgoJICAgSSBndWVzcyB0aGlzIGp1c3QgYW4gaW50cmluc2ljIGxpbWl0YXRpb24sIGFuZCBubyBtdWNoIGNhbgoJICAgYmUgZG9uZSBhYm91dCBpdCB3aXRob3V0IHJlc29ydGluZyBpbnRvIGxhcmdlciBjaGFuZ2VzIHRvCgkgICBwb3N0cG9uZSwgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGUgbXVsdGlwbHkgc3ltYm9sCgkgICBkZXRlY3Rpb24gKGxhbmcuY3h4IHN0YWdlKS4KCSAgIAoJICAgU28sIGJ5IG5vdywgaXQgaXMganVzdCBjb25zaWRlcmVkIGEgd2VsbCBrbm93biAiZmVhdHVyZSIgaW4KCSAgIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZS4gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IGl0IHNlZW1zCgkgICB0byBiZSBhIHJhcmUgY2FzZSwgYW5kIGl0IGNhbiBiZSBhdm9pZGVkIGJ5IHRoZSB1c2VyIGJ5CgkgICBoaWRpbmcgJ3gnIGJlZm9yZSByZW5hbWluZyAneSc6CgoJICAgICAlcmVuYW1lKF94KSBGb286OngoKTsKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKCSAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSB2aXJ0dWFsIG1ldGhvZCBkZXRlY3Rpb25zIG5vdyBwcm9wZXJseQoJICAgIHRyZWF0cyB0aGUgZm9sbG93aW5nIGNhc2VzOgoKICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28geyB0eXBlZGVmIGludCBJbnQ7IH0KCSAgICAgc3RydWN0IEEge307CgkgICAgIHR5cGVkZWYgQSBCOwoKICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICB2aXJ0dWFsIH5Gb28oKSB7fQoKICAgICAgICAgICAgICAgdmlydHVhbCBGb28qIGNsb25lcigpID0gMDsKCSAgICAgICB2aXJ0dWFsIGludCBnZXRfdmFsdWUoKSA9IDA7CgkgICAgICAgdmlydHVhbCBBKiBnZXRfY2xhc3MoKSA9IDA7CgkgICAgICAgdmlydHVhbCB2b2lkIGp1c3RfZG9faXQoKSA9IDA7CgkgICAgIH07CgogICAgICAgICAgICAgc3RydWN0IEJhciA6IEZvbwogICAgICAgICAgICAgewogICAgICAgICAgICAgICBCYXIqIGNsb25lcigpOwogICAgICAgICAgICAgICBmb286OkludCBnZXRfdmFsdWUoKTsKICAgICAgICAgICAgICAgQiogZ2V0X2NsYXNzKCk7CiAgICAgICAgICAgICAgIHZvaWQganVzdF9kb19pdCgpOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICBBbGwgdGhlIEZvbyBhbmQgQmFyIG1ldGhvZHMgYXJlIHZpcnR1YWwuICBBIG5ldyBhdHRyaWJ1dGUKCSAgICAidmlydHVhbDp0eXBlIiByZWNvcmQgdGhlIGJhc2UgcG9seW1vcnBoaWMgdHlwZS4gSW4gdGhlCgkgICAgcHJldmlvdXMgY2FzZXMgd2UgaGF2ZToKCgkgICAgICAgdHlwZSA6IEJhciAgICAgICB2aXJ0dWFsOnR5cGUgOiBGb28KCSAgICAgICB0eXBlIDogZm9vOjpJbnQgIHZpcnR1YWw6dHlwZSA6IGludAoJICAgICAgIHR5cGUgOiBCICAgICAgICAgdmlydHVhbDp0eXBlIDogQQoJICAgICAgIHR5cGUgOiB2b2lkICAgICAgdmlydHVhbDp0eXBlIDogdm9pZAoKICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGluIGxhbmd1YWdlcyAoamF2YStkaXJlY3RvcnMpCgkgICAgdGhhdCBjb3VsZCBoYXZlIHByb2JsZW1zIHJlZGVmaW5pbmcgQmFyKiBCYXI6OmNsb25lcigpLgoKCSAgICBJZiB5b3UgbmV2ZXIgaGFkIGNvZGUgbGlrZSB0aGUgYWJvdmUsIHlvdSB3aWxsIHNlZSBubwoJICAgIGVmZmVjdHMuIEJ1dCBpZiB5b3UgaGF2ZSBzb21lIGNvZGUgbGlrZSB0aGF0LCB5b3UKCSAgICB3aWxsIHNlZSBzb21lIGVmZmVjdHMgc2luY2Ugc29tZSBtZXRob2RzIHRoYXQKCSAgICBiZWZvcmUgd2VyZSBub3QgcHJvcGVybHkgdHJlYXRlZCBhcyB2aXJ0dWFsLAoJICAgIHdpbGwgc3RhcnQgdG8gYWN0IGxpa2UgdGhhdC4gVGhpcyBjb3VsZCBlbmxhcmdlCgkgICAgeW91ciBkaXJlY3RvciBjbGFzc2VzLgoJICAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgKGRpcnByb3QpCgkgICAgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICAKCSAgICBJdCBjYW4gYmUgZW5hYmxlIGJ5IHVzaW5nICctZGlycHJvdCcgb3IgYnkgYWRkaW5nCgkgICAgdGhlIG9wdGlvbiB0byB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uLCBsaWtlOgoKICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLGRpcnByb3Q9IjEiKSBteV9tb2R1bGUKCgkgICAgVGhpcyBtb2R1bGUgb3B0aW9uIHdhcyBhZGRlZCB0byBwcm9wZXJseSBjb21waWxlIHRoZQoJICAgIGRpcmVjdG9yX3Byb3RlY3RlZC5pIGFuZCBkaXJlY3Rvcl9uZXN0ZWQuaSBleGFtcGxlcy4KCSAgICAKCSAgICBUaGUgZmVhdHVyZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob25bMi4yLDIuM10gCgkgICAgYW5kIHJ1YnlbMS42LjddLCBib3RoIGF0IGNvbXBpbGF0aW9uIGFuZCBydW50aW1lLCBhbmQgCgkgICAgamF2YVtqMnNkazEuNC4xXzAxXSwgYnV0IG9ubHkgYXQgY29tcGlsYXRpb24gKG15IGphdmEKCSAgICBpbnN0YWxsYXRpb24gZG9lc24ndCBydW4gYW55IG9mIHRoZSBkaXJlY3RvciBleGFtcGxlcywKCSAgICBvbGRzIG5vciBuZXdzKS4KCgkgICAgUGxlYXNlIHRlc3QgZm9yIG9jYW1sIGFuZCBqYXZhLgoJICAgIAoJICAgIFRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgV2lsbGlhbSBhbmQgU2NvdHQgd2VyZSBmaXhlZCwKCSAgICBleGNlcHQgZm9yIGEgd2FybmluZyBhYm91dCAgU1dJR19KYXZhVGhyb3dFeGVjcHRpb24oKQoJICAgIG11bHRpcGx5IGRlZmluZWQuIEkgY2FuJ3QgcmVwcm9kdWNlIHRoaXMgZXJyb3Igd2l0aCBteQoJICAgIGV4YW1wbGVzLiBXZSB3aWxsIHdhaXQgZm9yIFNjb3R0IHRvIHNlbmQgdXMgYSBtaW5pbWFsCgkgICAgY2FzZS4KCgoxMi8wNy8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCBoYXMgYmVlbgoJICAgIGNvbXBsZXRseSBtb3ZlZCBvdXQgZnJvbSBweXRob24uY3h4LCBhbmQgbm93CgkgICAgcmVzaWRlcyBpbiB0aGUgY29tbW9uIGxhbmcuY3h4LCBlbWl0LmN4eCBhbmQKCSAgICBhbGxvY2F0ZS5jeHggZmlsZXMuIAoKCSAgICBUaGlzIG1lYW5zIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgY3VycmVudGx5IHN1cHBvcnQgZGlyZWN0b3JzLCBpZSwgcHl0aG9uLCBqYXZhLCBvY2FsbQoJICAgIGFuZCBydWJ5LgoKCSAgICBUaGUgY2hhbmdlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvbiAoY29tcGlsYXRpb24rcnVudGltZSkKCSAgICBhbmQgamF2YSAoanVzdCBjb21waWxhdGlvbikuCgkgICAgCgkgICAgUGxlYXNlIGFkZCBydW50aW1lIHRlc3RzIGZvciB0aGUgbWlzc2luZyBsYW5ndWFnZXMgCgkgICAgYW5kIHRlc3QgaXQuCgoJICAgIFRoZSAnLW5vZGlycHJvdCcgb3B0aW9uIHdhcyBtb3ZlZCB0byB0aGUgcHJpbmNpcGFsIG1haW4sCgkgICAgYW5kIGNhbiBiZSB1c2VkIGZyb20gYWxsIHRoZSBsYW5ndWFnZXMuCgoxMi8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIGFuZCBpbXByb3ZlZCBlcnJvciBjaGVja2luZyBvZiBTVFJJTkdfT1VUIHR5cGVtYXBzIGluIAogICAgICAgICAgICB2YXJpb3VzLmkuCgoxMi8wNC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIC0gTm93IHRoZSB2aXJ0dWFsIG1lbWJlcnMgd2l0aCBubyBleHBsaWNpdCBkZWNsYXJhdG9yCgkgICAgYXJlIHByb3Blcmx5IGlkZW50aWZpZWQ6CgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7CiAgICAgICAgICAgICAgICAgIGludCBmKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBIZXJlLCBCOjpmKCkgaXMgdmlydHVhbCwgYW5kIHRoZSBkaXJlY3RvciBhbmQgdGhlCgkgICAgdmlydHVhbCBlbGltaW5hdGlvbiBtZWNoYW5pc20gbm93IHJlY29nbml6ZSB0aGF0LgoKICAgICAgICAgICAgLSBbQyNdIFRoaXMgZml4IGFsc28gZml4ZXMgdGhlIHByb2JsZW0gd2hlcmUgJ292ZXJyaWRlJyB3YXMgbm90IGJlaW5nIAogICAgICAgICAgICB1c2VkIG9uIGFueSBvdmVycmlkZGVuIHZpcnR1YWwgbWV0aG9kLCBzbyBmb3Igc3RydWN0IEIgYWJvdmUsIAogICAgICAgICAgICB0aGlzIEMjIGNvZGUgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBCIDogQSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IGYoKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoJICAgIC0gSW5pdGlhbCBzdXBwb3J0IGZvciBwcm90ZWN0ZWQgdmlydHVhbCBtZXRob2RzLiBUaGV5IGFyZSBub3cKCSAgICBwcm9wZXJseSBlbWl0dGVkIHdoZW4gdXNpbmcgd2l0aCBkaXJlY3RvciAocHl0aG9uIG9ubHkgYnkKCSAgICBub3cpLgoJICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBmMigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgVGhpcyBjYW4gYmUgZGlzc2FibGVkIGJ5IHVzaW5nIHRoZSAnLW5vZGlycHJvdCcgb3B0aW9uLgoKCSAgICAtIFRoZSBmZWF0dXJlICdub2RpcmVjdG9yJyBpcyB3b3JraW5nIG5vdyBhdCB0aGUgdG9wIGxldmVsLAoJICAgIHNvLCBpdCBtdXN0IHdvcmsgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7CiAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm9kaXJlY3RvciIpIEE6OmYyOwoKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYyKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgCgkgICAgaW4gdGhpcyBjYXNlLCBvbmx5ICdmMScgaXMgZXhwb3J0ZWQgdG8gdGhlIGRpcmVjdG9yIGNsYXNzLgoJICAgIAoJICAgIC0gQWRkZWQgZGlyZWN0b3Igc3VwcG9ydCBmb3IgY29uc3QgVFlQRSYgYXJndW1lbnRzIChweXRob24pLgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIElOT1VUIGFuZCBPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3Igd2hlbiB0aGUgSk5JIHR5cGUgCiAgICAgICAgICAgIGlzIGJpZ2dlciB0aGFuIHRoZSBDIHR5cGUuIEZvciBleGFtcGxlLCB1bnNpZ25lZCBsb25nICgzMmJpdHMgb24gbW9zdCBzeXN0ZW1zKQogICAgICAgICAgICBpcyBtYXBwZWQgdG8gamxvbmcgKDY0Yml0cykuIFJldHVybmVkIHZhbHVlIHdhcyBpbmNvcnJlY3QuIEJ1ZyByZXBvcnRlZCBieSAKICAgICAgICAgICAgQnJpYW4gSGF3bGV5LgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gQmV0dGVyIGZpeCBmb3IgZW50cnkgZGF0ZWQgMDUvMTEvMjAwMy4gRml4ZXMgdGhlIGZvbGxvd2luZwogICAgICAgICAgICB0eXBlbWFwczoKCiAgICAgICAgICAgIEphdmE6IGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCiAgICAgICAgICAgIEMjOiBjc2Jhc2UsIGNzaW50ZXJmYWNlcywgY3NpbXBvcnRzLCBjc2NsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBjc2ZpbmFsaXplLCBjc2dldGNwdHIgJiBjc2NvZGUuCgogICAgICAgICAgICBJdCBhbHNvIGZpeGVzIGJ1ZyBpbiB1c2luZyBhcnJheXMgb2YgQyBzdHJ1Y3RzIHdpdGggYXJyYXlzX2phdmEuaSAKICAgICAgICAgICAgYXMgcmVwb3J0ZWQgU2NvdHQgTWljaGVsLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybF0gRml4ZWQgWyA4NTIxMTkgXSByZWN1cnNpdmUgaW5oZXJpdGFuY2UgaW4gb3V0cHV0IC5wbSwgcGVybDUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRG93bGluZy4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgWyA3NTUzODIgXSBjYWxsaW5nIGZ1bmMoY29uc3QgdmVjdG9yPFQ+JiBwKSBldmFsdWF0ZXMgcFswXSBpbiBpbnRlcnAuCiAgICAgICAgICAgIFRoZSBUY2wgdHlwZSBjaGVja2VyIHdhcyBpbXByb3Blcmx5IGhhbmRsaW5nIHRoZSBpbnRlcnByZXRlciByZXN1bHQgd2hlbgogICAgICAgICAgICB0eXBlIHZpb2xhdGlvbnMgd2VyZSBzdXBwb3NlZCB0byBiZSBpZ25vcmVkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGF2aXUgUG9wcC1Ob3dhay4KCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDU0NTA1OCBdIGNvbmZpZ3VyZSdzIC0td2l0aC10Y2xpbmNsIGhhcyBubyBlZmZlY3QKCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA3NjY0MDkgXSBtaXNzaW5nIHN5bWJvbCBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBkdXJpbmcgbW9kdWxlIGxvYWQKICAgICAgICAgICAgU1dJR3MgaW50ZXJuYWwgZnVuY3Rpb25zIGFyZSBhbGwgc3RhdGljIGFzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGRpZmZlcmVudCBTV0lHCiAgICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzIHRvIHNoYXJlIGFueSBjb2RlIGF0IHJ1bnRpbWUuCgoxMS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgODQ4MzM1IF0gRGlyZWN0b3JzOiAjaW5jbHVkZSB3cmFwcGVyIC5oIGZpbGUgLSB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgYWRkaW5nIGEgZGlyZWN0b3J5IHRvIHRoZSBnZW5lcmF0ZWQgI2luY2x1ZGUgImZvb193cmFwLmgiIHN0YXRlbWVudAogICAgICAgICAgICBpbiBzb21lIHNpdHVhdGlvbnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgODQ5MDY0IF0gSkFWQSA6IEFjY2VzcyBtb2RpZmllciBmb3IgZGVyaXZlZCBjbGFzcyB3cm9uZy4KICAgICAgICAgICAgVGhlIGRlbGV0ZSgpIG1ldGhvZCBpcyBhbHdheXMgcHVibGljIG5vdy4gSXQgdXNlZCB0byBiZSBwcm90ZWN0ZWQgd2hlbmV2ZXIgYSAKICAgICAgICAgICAgZGVzdHJ1Y3RvciB3YXMgbm9uIHB1YmxpYy4gQW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gcnVudGltZSAKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpbnN0ZWFkIG9mIG1ha2luZyBkZWxldGUoKSBwcm90ZWN0ZWQgbm93LgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg1MDE1MSBdIFBZVkVSU0lPTiB3aXRoIHB5dGhvbjIuMyBpbiBjb25maWd1cmUgb2YgU1dJRyAxLjMuMTkgKE1heWJlKS4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgIFsgODUwNjY2IF0gI2luY2x1ZGUgZXh0cmEgbGluZSBhZGRlZC4gIAogICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggc29tZSBwcm9ibGVtcyB3aXRoIGdldHRpbmcgY29ycmVjdCBsaW5lIG51bWJlcnMgb24KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZXMuCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGFub3RoZXIgb25lIG9mIE1hcmNlbG8ncyBldmlsIHRlbXBsYXRlIGJ1Z3MgKGluZmluaXRlCiAgICAgICAgICAgIHJlY3Vyc2lvbikuIFsgODQ5NTA0IF0gdGVtcGxhdGUgYW5kIHR5cGVkZWYgLT4gaW5mLiByZWN1cnNpb24uCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6CgoJICAgICAgICAgaW50ICp4ID0gJnNvbWVhcnJheVswXTsKCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NTY1NTIgXSBtaXNzaW5nIGRlZmF1bHQgYXJndW1lbnQgY2xhc3Mgc2NvcGUgd2l0aCAifCIuCiAgICAgICAgICAgIFRoaXMgaXMgcmVhbGx5IG9ubHkgYSBiYW5kLWFpZCBmaXggZm9yIHVzZSBvZiBjbGFzcy1lbnVtcyBpbgogICAgICAgICAgICBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgZW51bSBGbGFnIHsgZmxhZzEgPSAweDEsIGZsYWcyID0gMHgyIH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB4ID0gZmxhZzEgfCBmbGFnMik7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlOiB0aGVyZSBhcmUgc3RpbGwgc29tZSAobW9yZSBzdWJ0bGUpIGNhc2VzIHRoYXQgYXJlIGJyb2tlbiwKICAgICAgICAgICAgYnV0IGhhcmQgdG8gZml4IGR1ZSB0byBhbiBpc3N1ZSB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4gV2lsbAogICAgICAgICAgICBhZGRyZXNzIGxhdGVyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEbWl0cnkgTWlyb25vdi4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgODQwODc4IF0gc3VwcG9ydCBmb3IgJWlubGluZSB7IC4uLiB9IChQQVRDSCkuCiAgICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kICVpbmxpbmUgJXsgLi4uICV9IGlzIHRoYXQgdGhlCiAgICAgICAgICAgIGVuY2xvc2VkIHRleHQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gICBUaGlzCiAgICAgICAgICAgIGFsbG93cyBzcGVjaWFsIG1hY3JvcyBhbmQgb3RoZXIgcHJvY2Vzc2luZyB0byBiZSB1c2VkIGluIAogICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoICVpbmxpbmUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgzNjkwMyBdIEMrKyBpbmNvbnNpc3RlbmN5ICh3aXRoIHZvaWQgYXJndW1lbnRzKS4KICAgICAgICAgICAgU1dJRyB3YXMgaGF2aW5nIGRpZmZpY3VsdHkgd2l0aCBmKCkgdnMgZih2b2lkKSBpbiBDKysgcHJvZ3JhbXMuCiAgICAgICAgICAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZih2b2lkKSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYoKTsgICAgLy8gTm90IG1hdGNoZWQgdG8gZih2b2lkKSBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgfTsgCgogICAgICAgICAgICBUaGUgcGFyc2VyIG5vdyBub3JtYWxpemVzIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0gZih2b2lkKSAKICAgICAgICAgICAgaW4gQysrIGNsYXNzZXMgdG8gZigpLiAgVGhpcyBzaG91bGQgZml4IGEgdmFyaWV0eSBvZiBzdWJ0bGUgCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UsIG9wdGltaXphdGlvbnMsIG92ZXJsb2FkaW5nLCBldGMuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFydGhvIEJob3dtaWNrLgogCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJbmNvcnBvcmF0ZWQgWyA4NDEwNzQgXSBiZXR0ZXIgY3JvYWtpbmcgKFBBVENIKS4gIFRoaXMgZml4ZXMgc29tZSBwcm9ibGVtcwogICAgICAgICAgICB3aXRoIHN0cmluZ3MgYW5kIHByb3ZpZGVzIHNvbWUgbmV3IGVycm9yIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgogICAgICAgICAgICAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTgzNSBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBjYXN0OiB0eHQgPSAoY2hhciAqKSJ0eHQiIHN5bnRheCBFcnJvci4KICAgICAgICAgICAgVGhlIHBhcnNlciBzaG91bGQgbm93IGFjY2VwdCB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpzID0gKGNoYXIgKikgIkhlbGxvIik7CgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENsYXVkaXVzIFNjaG5vcnIuCgoxMS8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIHByb2JsZW0gd2l0aCBjcm9zcyBtb2R1bGUgbGlua2luZy4gIFByZXZpb3VzbHkgbW9kdWxlcyByZWZlcnJlZAogICAgICAgICAgICB0byBiYXNlIGNsYXNzZXMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZS4gICBOb3csIHRoZSBtb2R1bGUgbG9va3MgdXAgYmFzZQogICAgICAgICAgICBjbGFzc2VzIHRocm91Z2ggdGhlIHR5cGUgc3lzdGVtIGl0c2VsZi0tLWF2b2lkaW5nIHRoZSBuZWVkIHRvIGxpbmsgdG8gYSBnbG9iYWwKICAgICAgICAgICAgbGlrZSBiZWZvcmUuICBDYXZlYXQ6ICBtb2R1bGVzIHdpdGggYmFzZSBjbGFzc2VzIG11c3QgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICBtb2R1bGVzIHdpdGggZGVyaXZlZCBjbGFzc2VzLgogCjExLzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgdXNlICgpIHRvIHJlcHJlc2VudCBudWxsIHBvaW50ZXJzLAoJICAgIGFzIGl0IGlzIGRvbmUgaW4gLWdoIG1vZGUuCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgQWRkIGEgZ2VuZXJhdGVkIHNjcmlwdCAicHJlaW5zdC1zd2lnIiwgd2hpY2ggY2FuIGJlIHVzZWQKCSAgICB0byBpbnZva2UgU1dJRyBiZWZvcmUgaXQgaGFzIGJlZW4gaW5zdGFsbGVkLiAgSXQgYXJyYW5nZXMKCSAgICB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZQoJICAgIHVzZWQuIAoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGRvbid0IGZvcmdldCB0byBjYWxsIFNXSUdfR3VpbGVfSW5pdC4KCSAgICBBZGQgYSBTV0lHX2NvbnRyYWN0X2Fzc2VydCBtYWNyby4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFVwZGF0ZSB0aGUgY29uZmlndXJlIGNoZWNrIGZvciB0aGUgZHluZXh0IG9iamVjdCB0byB3b3JrCgkgICAgd2l0aCBNelNjaGVtZSAyMDUuCgoxMS8yMC8yMDAzOiBtbWF0dXMKCSAgICBGaXhlZCB0aGUgaW5jbHVkZS9pbXBvcnQgZXJyb3IgcmVwb3J0ZWQgYnkgS2VyaW0gQm9yY2hhZXYsCgkgICAgd2hlcmUgdHdvIGZpbGVzIHdpdGggbmFtZXMgbGlrZQoKCSAgICAnZGlyMS9oZWxsby5pJwoJICAgICdkaXIyL2hlbGxvLmknCgkgICAgCgkgICAgY2FuIG5vdCBiZSBpbmNsdWRlIGF0IHRoZSBzYW1lIHRpbWUuIFN3aWcgd2FzIGluY2x1ZGluZwoJICAgIGp1c3QgdGhlIGZpcnN0IG9uZSwgYXNzdW1pbmcgdGhlIHNlY29uZCBvbmUgd2FzIG5vdCBhCgkgICAgZGlmZmVyZW50IG9uZSwgc2luY2UgaXQgd2FzIGNoZWNraW5nL2tlZXBpbmcganVzdCB0aGUKCSAgICBiYXNlbmFtZSAnaGVsbG8uaScuCgoxMS8xOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFNXSUcgcnVudGltZSBsaWJyYXJ5IHN1cHBvcnQuIAogICAgICAgICAgICAgIC0gIFRoZSAtYyBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gLW5vcnVudGltZQogICAgICAgICAgICAgIC0gIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtcnVudGltZS4gIFdoZW4gc3VwcGxpZWQsIHRoaXMKICAgICAgICAgICAgICAgICBpbnNlcnRzIHRoZSBzeW1ib2wgU1dJR19HTE9CQUwgaW50byB0aGUgd3JhcHBlciBjb2RlLiAgVGhpcywKICAgICAgICAgICAgICAgICBpbiB0dXJuLCBtYWtlcyBhbGwgb2YgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmdW5jdGlvbnMgZ2xvYmFsbHkKICAgICAgICAgICAgICAgICB2aXNpYmxlLgogICAgICAgICAgICAgICAtIE5ldyBsaWJyYXJ5IGZpbGU6IHN3aWdydW4uaS4gICBVc2VkIHRvIGNyZWF0ZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAgZm9yIHJ1bnRpbWUgbGlicmFyeSAoaWYgbmVlZGVkKS4KICAgIAoxMS8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgJ21ha2Ugc3JjcnBtJyBycG1idWlsZCBmaXggLSBwYXRjaCBmcm9tIEpvZSBDb29wZXIKCjExLzE4LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIENoYW5nZSBtZWFuaW5nIG9mIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWd1aWxlIHRvCgkgICAgdGhlIG5hbWUgb2YgdGhlIEd1aWxlIGV4ZWN1dGFibGUuICBUaGUgbmV3IG9wdGlvbiAtLXdpdGgtZ3VpbGUtcHJlZml4IAoJICAgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWUgd2hlcmUgR3VpbGUgaXMKCSAgICBpbnN0YWxsZWQuICAoSG93ZXZlciwgdXN1YWxseSBpdCBzdWZmaWNlcyB0byB1c2UgdGhlCgkgICAgc2luZ2xlIG9wdGlvbiAtLXdpdGgtZ3VpbGUtY29uZmlnLikgIAoJICAgIFdoZW4gcnVubmluZyB0aGUgcnVuIHRlc3RzIHRlc3Qtc3VpdGUsIG1ha2Ugc3VyZSB0byB1c2UgdGhlCgkgICAgdmVyc2lvbiBvZiBHdWlsZSB0aGF0IFNXSUcgd2FzIGNvbmZpZ3VyZWQgZm9yLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW1wcm92ZW1lbnRzIHRvIG9iamVjdC1vd25lcnNoaXAgbWFuYWdlbWVudCBpbiAKCSAgICAiLXNjbSIgbW9kZS4gIChUaGV5IGRvIG5vdCBhcHBseSB0byB0aGUgZGVmYXVsdCAiLWdoIiBtb2RlLikKCSAgICAqIFJlbmFtZWQgdGhlIHNtb2IgdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgY2FuCgkgICAgICBiZSBnYXJiYWdlIGNvbGxlY3RlZCBmcm9tICJjb2xsZWN0ZWQgc3dpZyIgdG8gImNvbGxlY3RhYmxlCgkgICAgICBzd2lnIiwgd2hpY2ggaXMgbW9yZSBwcmVjaXNlLiAgCgkgICAgKiBFeHBvcnQgdGhlIGRlc3RydWN0b3IgZnVuY3Rpb25zIGFnYWluLiAgSXQgaXMgbm93CiAJICAgICAgYWxsb3dlZCB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3RvcnMsIGV2ZW4gZm9yCgkgICAgICBnYXJiYWdlLWNvbGxlY3RlZCBwb2ludGVyIG9iamVjdHMuICBBIHBvaW50ZXIgb2JqZWN0CgkgICAgICB0aGF0IGhhcyBiZWVuIHBhc3NlZCB0byBhIGRlc3RydWN0b3IgaXMgbWFya2VkIGluIGEKCSAgICAgIHNwZWNpYWwgd2F5IHVzaW5nIGEgbmV3IHNtb2IgdHlwZSwgImRlc3Ryb3llZCBzd2lnIi4KCSAgICAgIChUaGlzIGhlbHBzIGF2b2lkIG5hc3R5IG1lbW9yeSBidWdzLCB3aGVyZSByZWZlcmVuY2VzIHRvCgkgICAgICBkZWFkIEMgb2JqZWN0cyBhcmUgc3RpbGwgaGVsZCBpbiBTY2hlbWUuIE1vcmVvdmVyLCB0aGUKCSAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgbm90IHRyeSB0byBmcmVlIGEgZGVzdHJveWVkCgkgICAgICBvYmplY3Qgb25jZSBtb3JlLikKCSAgICAqIERlc3RydWN0b3ItbGlrZSBmdW5jdGlvbnMgY2FuIGFsc28gbWFyayB0aGVpciBhcmd1bWVudHMgCgkgICAgICBhcyBkZXN0cm95ZWQgYnkgYXBwbHlpbmcgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkRFU1RST1lFRC4KCSAgICAgIChJdCBjYWxscyB0aGUgZnVuY3Rpb24gU1dJR19HdWlsZV9NYXJrUG9pbnRlckRlc3Ryb3llZC4pCgkgICAgKiBGdW5jdGlvbnMgdGhhdCAiY29uc3VtZSIgdGhlaXIgb2JqZWN0cyAob3IgdGhhdCAib3duIgoJICAgICAgdGhlbSBhZnRlciB0aGUgY2FsbCkgY2FuIG1hcmsgdGhlaXIgYXJndW1lbnRzIGFzCgkgICAgICBub3QgZ2FyYmFnZSBjb2xsZWN0YWJsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgYXBwbHlpbmcKCSAgICAgIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpDT05TVU1FRC4gIChJdCBjYWxscyB0aGUgZnVuY3Rpb24KCSAgICAgIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJOb25jb2xsZWN0YWJsZS4pCgkgICAgKiBUaGUgbWFjcm8gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVCBmcm9tIGxpYnJhcnkKCSAgICAgIHBvaW50ZXItaW4tb3V0LmkgY3JlYXRlcyBhZGRpdGlvbmFsIHR5cGVtYXBzIAoJICAgICAgUFRSVFlQRSAqSU5QVVRfQ09OU1VNRUQsIFBUUlRZUEUgKklOUFVUX0RFU1RST1lFRC4KCSAgICAgIFRoZXkgbWFyayB0aGUgcGFzc2VkIHBvaW50ZXIgb2JqZWN0IGxpa2V3aXNlLgoJICAgICAgVGhlIHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUIGNyZWF0ZXMgYSBnYXJiYWdlLWNvbGxlY3RhYmxlCgkgICAgICBwb2ludGVyIG9iamVjdCwgbGlrZSAlbmV3b2JqZWN0IGRvZXMgZm9yIGEgcmV0dXJuZWQgCgkgICAgICBwb2ludGVyLiAgVXNlIHRoZSBuZXcgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVRfTk9OQ09MTEVDVEFCTEUKCSAgICAgIHRvIGNyZWF0ZSBhIHBvaW50ZXIgb2JqZWN0IHRoYXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBIYW5kbGUgJGlucHV0IGluICJmcmVlYXJnIiB0eXBlbWFwcy4KCSAgICBOZXZlciBxdWFsaWZ5IEdPT1BTIHNsb3QgbmFtZXMgd2l0aCB0aGUgY2xhc3MgbmFtZS4gCgkgICAgSGFuZGxlIG9wdGlvbmFsIGFyZ3VtZW50cyBwcm9wZXJseSBpbiB0aGUgR09PUFMgbWV0aG9kcy4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgaW5zdGFsbGF0aW9uIHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgQXV0b21ha2UtMS44LgogICAgICAgICAgICBta2luc3RhbGxkaXJzIHdhcyBiZWluZyB1c2VkIGJ5IGEgbm9uLUF1dG9tYWtlIG1ha2VmaWxlLiAKICAgICAgICAgICAgbWtpbnN0YWxsZGlycyBpcyBiZWluZyBwaGFzZWQgb3V0IGFuZCBzbyB3YXMgbm90IGJlaW5nCiAgICAgICAgICAgIGNyZWF0ZWQgYnkgQXV0b21ha2UuIGluc3RhbGwtc2ggdXNlZCBpbnN0ZWFkLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBpbXByb3ZlbWVudHMsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzIHNpbmNlIAogICAgICAgICAgICB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBoYXZlIGJlZW4gY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuICVmZWF0dXJlKCJzaGFkb3ciKSBpcyB1c2VkIHRvIGFkZCBjb2RlIHRvIHNoYWRvdwogICAgICAgICAgICBjbGFzc2VzLCB0aGUgc3BlY2lhbCB2YXJpYWJsZSAkYWN0aW9uIGV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIHVuZGVybHlpbmcgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQgbm9ybWFsbHkuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gZ2VuZXJhdGluZyBwcm94eSBjbGFzcyBjb2RlLCBTV0lHIGVtaXRzIGEgZmV3CiAgICAgICAgICAgIGRlZmF1bHQgbWV0aG9kcyBmb3IgX19yZXByX18oKSBhbmQgb3RoZXIgUHl0aG9uIHNwZWNpYWwKICAgICAgICAgICAgbWV0aG9kcy4gIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgZW1pdHRlZCBhZnRlciBhbGwgb2YgdGhlCiAgICAgICAgICAgIGNvbnRlbnRzIG9mIGEgY2xhc3MuIEhvd2V2ZXIsIHRoaXMgbWFrZXMgaXQgaGFyZCB0byBvdmVycmlkZQogICAgICAgICAgICB0aGUgbWV0aG9kcyB1c2luZyAlcHl0aG9uY29kZSBhbmQgc29tZSBvdGhlciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgICAgYWxsb3cgY29kZSB0byBiZSBpbnNlcnRlZCBpbnRvIGEgY2xhc3MuICBUaGVzZSBzcGVjaWFsIG1ldGhvZHMKICAgICAgICAgICAgYXJlIG5vdyBlbWl0dGVkIGludG8gdGhlIGNvZGUgKmJlZm9yZSogYWxsIG9mIHRoZSBvdGhlciBtZXRob2RzLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgRXJpYyBKb25lcy4KIAoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFByZXByb2Nlc3NvciBlbmhhbmNlbWVudC4gICBGb3IgaW5jbHVkZSBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlICJmb28vYmFyLmkiCgogICAgICAgICAgICB0aGUgZGlyZWN0b3J5ICJmb28iIGlzIG5vdyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggd2hpbGUgCiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGJhci5pLiAgVGh1cywgaWYgYmFyLmkgaW5jbHVkZXMgb3RoZXIKICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGV5IHdpbGwgYmUgZm91bmQuIFByZXZpb3VzbHksCiAgICAgICAgICAgIHlvdSB3b3VsZCBoYXZlIHRvIGFkZCBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIHVzaW5nIC1JIHRvIG1ha2UgdGhpcwogICAgICAgICAgICB3b3JrIGNvcnJlY3RseS4gIE5vdGU6IHRoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBiZWhhdmUgaW4KICAgICAgICAgICAgYW4gaWRlbnRpY2FsIG1hbm5lciBvbiBtYW55IChtb3N0PyBhbGw/KSBzeXN0ZW1zLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS2VyaW0gQm9yY2hhZXYuCgoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayBvbiBNYWMgT1NYIDEwLjMueCAoUGFudGhlcikuCiAgICAgICAgICAgIFRlc3RlZCB3aXRoIFB5dGhvbiwgVGNsLCBQZXJsLCBhbmQgUnVieS0tLWFsbCBvZiB3aGljaCBzZWVtIHRvIHdvcmsuCgoxMS8wOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIHRoZSB0eXBlbWFwcyBpbiB2YXJpb3VzLmkgd2hpY2ggd2VyZSBtb3N0bHkgYnJva2VuLgogICAgICAgICAgICBjaGFyICoqU1RSSU5HX0lOIGFuZCBjaGFyICoqU1RSSU5HX1JFVCB0eXBlbWFwcyByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBTVFJJTkdfQVJSQVkuIGZsb2F0ICpGTE9BVF9BUlJBWV9SRVRVUk4gdHlwZW1hcCByZW1vdmVkLgoKMTEvMDgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBUY2wgbW9kdWxlIG5vdyBlbWl0cyBhIHNhZmUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGJ5CiAgICAgICAgICAgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmVtb3ZlZCBieSBydW5uaW5nICdzd2lnIC1ub3NhZmUnLgoKMTEvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gT25seSB1c2UgdGhlIFNDTV8gQVBJIHdoZW4gdGhlIGZ1bmN0aW9uCgkgICAgYHNjbV9zbG90X2V4aXN0c19wJyBleGlzdHMgKG5lZWRlZCBmb3IgR09PUFMgc3VwcG9ydCkuICAKCSAgICBUaGlzIGZ1bmN0aW9uIHdhcyByZW5hbWVkIGR1cmluZyB0aGUgR3VpbGUgMS41IHNlcmllcwoJICAgIGZyb20gYHNjbV9zbG90c19leGlzdHNfcCcuCgkgICAgUmVwb3J0IHRoZSByaWdodCBydW50aW1lIGxpYnJhcnkgd2hlbiBpbnZva2VkIHdpdGgKCSAgICAtc2NtIC1sZGZsYWdzLgoKMTEvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBGaXggIzc4MjA1Mi4gIFRoZSAtLXdpdGgtY2hpY2tlbmNmZyBjb25maWd1cmUKCSAgICBvcHRpb24gKGFuZCBvdGhlcnMpIHdlcmUgbm90IGFjY2VwdGVkLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTWVyZ2UgbmV3IHNldCBvZiBHT09QUyBjaGFuZ2VzIGJ5IEpvaG4gTGVuei4KCSAgICBHT09QUyBvYmplY3RzIGFyZSBub3cgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgYnkgdGhlIEMgY29kZS4KCSAgICBTb21lIGZpeGVzIHRvIHR5cGVtYXAtR09PUFMgaW50ZXJhY3Rpb24uCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZW1vdmUgdGhlIGZpbGUgYXJndW1lbnQgdG8gLXNjbXN0dWIgYW5kIC1nb29wcy4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgYWx3YXlzIGNhbGxlZCBNT0RVTEUuc2NtIG9yCgkgICAgTU9EVUxFLXByaW1pdGl2ZS5zY20sIHdoZXJlIE1PRFVMRSBpcyB0aGUgbW9kdWxlIG5hbWUgYW5kIAoJICAgICJwcmltaXRpdmUiIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSAtcHJpbXN1ZmZpeCBvcHRpb24uCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IHBsYWNlZCBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5CgkgICAgdGhlIC1vdXRkaXIgb3B0aW9uLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgkgICAgKFBhdGNoIGJ5IEpvaG4gTGVueiwgc2xpZ2h0bHkgbW9kaWZpZWQuKQoKCSAgICAqKiogSU5DT01QQVRJQklMSVRZIFtHdWlsZV0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgVW5pZnkgdGhlIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4gIFRoZSBzdGFuZGFyZAoJICAgIGZ1bmN0aW9ucyBhcmU6CgkgICAgICogU1dJR19OZXdQb2ludGVyT2JqIChQT0lOVEVSLCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gQ3JlYXRlIGFuIHNjcmlwdGluZyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgdHlwZWQKCQkgICBwb2ludGVyLiBGTEFHUyBhcmUgbGFuZ3VhZ2Ugc3BlY2lmaWMuCgkgICAgICogU1dJR19Db252ZXJ0UHRyIChJTlBVVCwgUkVTVUxULCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHN0b3JlIGl0IGluIHRoZSBwbGFjZSBSRVNVTFQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCAKCQkgICBvY2N1cnMsIHJldHVybiBub256ZXJvLgoJICAgICAqIFNXSUdfTXVzdEdldFB0ciAoSU5QVVQsIFRZUEUsIEFSR05VTSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICByZXR1cm4gaXQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCBvY2N1cnMsIHRocm93IGFuCgkJICAgZXhjZXB0aW9uLiAgSWYgQVJHTlVNID4gMCwgcmVwb3J0IGl0IGFzIHRoZSAKCQkgICBhcmd1bWVudCBudW1iZXIgdGhhdCBoYXMgdGhlIHR5cGUgbWlzbWF0Y2guCiAgICAgICAgICAgIFtHdWlsZV06ICAgIE5vIGNoYW5nZXMuCgkgICAgW016U2NoZW1lXTogTm8gY2hhbmdlcy4KCSAgICBbUGVybF06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iai4KCQkgICAgICAgIFRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgaXMga2VwdC4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgbm90CgkJCXN1cHBvcnRlZC4KCSAgICBbUHl0aG9uXTogICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbUnVieV06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbVGNsXTogICAgICBSZW1vdmUgdGhlICJpbnRlcnAiIGFyZ3VtZW50IG9mCgkJICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqLCBTV0lHX0NvbnZlcnRQdHIsCgkJICAgICAgICBTV0lHX0NvbnZlcnRQYWNrZWQsIGFuZCBTV0lHX0NvbnZlcnRQdHJGcm9tU3RyaW5nLgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSAKCQkJbm90IHN1cHBvcnRlZC4KCSAgICBObyBjaGFuZ2VzIHRvIFBpa2UgYmVjYXVzZSBpdHMgcG9pbnRlciBjb252ZXJzaW9uIGNvZGUgZGlkCgkgICAgbm90IGxvb2sgY29tcGxldGUuICBObyBjaGFuZ2VzIHRvIFBIUDQsIGJlY2F1c2UgSSBkaWQgbm90CgkgICAgdW5kZXJzdGFuZCBpdHMgcnVudGltZSBjb2RlLiAgTm8gY2hhbmdlcyB0byBDaGlja2VuCgkgICAgYmVjYXVzZSBtYWpvciBjaGFuZ2VzIGFyZSBleHBlY3RlZCBzb29uIGFueXdheS4gIE5vCgkgICAgY2hhbmdlcyB0byBKYXZhLCBPQ2FtbCwgQyMgYmVjYXVzZSB0aGV5IGRvIG5vdCBzZWVtIHRvCgkgICAgaGF2ZSBhIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4KCiAgICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW1RjbF0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW1Blcmw1LCBQSFA0LCBQaWtlLCBQeXRob24sIFJ1YnksIFRjbF06IFVzZSB0aGUKCSAgICBwcmVwcm9jZXNzb3IgdG8gcmVuYW1lIGV4dGVybmFsIGZ1bmN0aW9ucyBvZiB0aGUgU1dJRwoJICAgIHJ1bnRpbWUgQVBJIHRvIGZvbGxvdyB0aGUgbmFtaW5nIGNvbnZlbnRpb24KCSAgICBTV0lHXzxsYW5ndWFnZT5fPGZ1bmN0aW9uPi4gIFRoaXMgc2hvdWxkIGFsbG93IGxpbmtpbmcKCSAgICBtb3JlIHRoYW4gb25lIGludGVycHJldGVyIGludG8gYSBwcm9ncmFtLgoKMTAvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHNpbmNlIGludHJvZHVjaW5nIHRoZSBleGNlcHRpb24gYW5kIHN0ZDo6c3RyaW5nIGRlbGVnYXRlcy4KICAgICAgICAgICAgVGhlIGZpeCBvdmVyY29tZXMgbGlua2VyIGVycm9ycyB3aGVuIHVzaW5nIG1vcmUgdGhhbiBvbmUgU1dJRyBtb2R1bGUuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQW5kcmVhcyBTY2j2cmsuCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjMzMDIgXSBJbmNyIFRjbCBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBBbGV4ZXkgRHlhY2hlbmtvLgogICAgICAgICAgICBOb3RlOiBuZWVkcyBkb2N1bWVudGF0aW9uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzI1IF0gbmV3IFB5dGhvbiBNb2R1bGUgb3B0aW9ucyBhbmQgZmVhdHVyZXMuCiAgICAgICAgICAgIFJvYmluIER1bm4gd3JpdGVzOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBtYWtlcyBhIG51bWJlciBvZiBjaGFuZ2VzIHRvIHRoZSBTV0lHIHB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgICAxLiBBZGQgLWFwcGx5IG9wdGlvbiwgYW5kIGNoYW5nZSB0aGUgZGVmYXVsdCBjb2RlCiAgICAgICAgICAgIG91dHB1dCB0byB1c2UgdGhlIGZvbygqYXJncywgKiprdykgY2FsbGluZyBzeW50YXgKICAgICAgICAgICAgaW5zdGVhZCBvZiB1c2luZyBhcHBseSgpLiBJZiB0aGUgLWFwcGx5IG9wdGlvbiBpcwogICAgICAgICAgICBnaXZlbiB0aGVuIGNvZGUgaXMgZ2VuZXJhdGVkIGFzIGJlZm9yZS4gVGhpcyBpcyB2ZXJ5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gUGF0Y2ggIzczNzI4MSBidXQgdGhlIG5ldyAtbW9kZXJuIG9wdGlvbgogICAgICAgICAgICBtYWtlcyB0aGUgc2Vjb25kIGhhbGYgb2YgdGhhdCBwYXRjaCB1bm5lY2Vzc2FyeSBzbyBpdAogICAgICAgICAgICBpcyBub3QgaW5jbHVkZWQgaGVyZS4KCSAgICAKICAgICAgICAgICAgMi4gQWRkIC1uZXdfcmVwciBvcHRpb24uIFRoaXMgaXMgdGhlIHNhbWUgYXMgbXkgUGF0Y2gKICAgICAgICAgICAgIzc5NzAwMiB3aGljaCBJIHdpbGwgbWFyayBhcyBjbG9zZWQgc2luY2UgaXQgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIG5lZWRlZC4gV2hlbiB0aGlzIG5ldyBvcHRpb24gaXMgdXNlZCB0aGVuIHRoZQogICAgICAgICAgICBfX3JlcHJfXyBtZXRob2RzIHRoYXQgYXJlIGdlbmVyYXRlZCBmb3IgcHJveHkgY2xhc3NlcwogICAgICAgICAgICB3aWxsIGJlIG1vcmUgaW5mb3JtYXRpdmUgYW5kIGdpdmUgZGV0YWlscyBhYm91dCB0aGUKICAgICAgICAgICAgcHl0aG9uIGNsYXNzIGFuZCB0aGUgQysrIGNsYXNzLgoJICAgIAogICAgICAgICAgICAzLiBBZGQgJWZlYXR1cmUoImFkZHRvZnVuYyIpLiBJdCBhbGxvd3MgeW91IHRvIGluc2VydAogICAgICAgICAgICBvbmUgb3IgbW9yZSBsaW5lcyBvZiBjb2RlIGluc2lkZSB0aGUgc2hhZG93IG1ldGhvZCBvcgogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGlzIGFscmVhZHkgZ2VuZXJhdGVkLCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgbGlrZSAlZmVhdHVyZSgic2hhZG93IikgZG9lcy4KICAgICAgICAgICAgRm9yIF9faW5pdF9fIGl0IGdvZXMgYXQgdGhlIGVuZCwgZm9yIF9fZGVsX18gaXQgZ29lcwogICAgICAgICAgICBhdCB0aGUgYmVnaW5pbmcgYW5kIGZvciBhbGwgb3RoZXJzIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgICBpcyBleHBhbmRlZCBvdXQgdG8gYmUgbGlrZQoJICAgIAogICAgICAgICAgICBkZWYgQmFyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHZhbCA9IF9tb2R1bGUuRm9vX0JhcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHJldHVybiB2YWwKCSAgICAKICAgICAgICAgICAgYW5kIHRoZSAiYWRkdG9mdW5jIiBjb2RlIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIHRoZQogICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgdXNlZCBmb3IgYQogICAgICAgICAgICBwYXJ0aWN1bGFyIG1ldGhvZCBvciBmdW5jdGlvbiB0aGVuIHRoZSBzaG9ydGVyIGNvZGUgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGp1c3QgbGlrZSBiZWZvcmUuCgkgICAgCiAgICAgICAgICAgIDQuIEEgbGl0dGxlIGJpdCBvZiByZWZhY3RvcmluZyB0byBtYWtlIGltcGxlbWVudGluZwogICAgICAgICAgICBhZGR0b2Z1bmMgYSBsaXR0bGUgZWFzaWVyLgoJICAgIAogICAgICAgICAgICA1LiBBZGRlZCBhIC1tb2Rlcm4gY29tbWFuZC1saW5lIGZsYWcgdGhhdCB3aWxsIGNhdXNlCiAgICAgICAgICAgIFNXSUcgdG8gb21pdCB0aGUgY3J1ZnQgaW4gdGhlIHByb3h5IG1vZHVsZXMgdGhhdCBhbGxvd3MKICAgICAgICAgICAgaXQgdG8gd29yayB3aXRoIHZlcnNpb25zIG9mIFB5dGhvbiBwcmlvciB0byAyLjIuIFRoZQogICAgICAgICAgICByZXN1bHQgaXMgYSBzaW1wbGVyLCBjbGVhbmVyIGFuZCBmYXN0ZXIgcHl0aG9uIHByb3h5CiAgICAgICAgICAgIG1vZHVsZSwgYnV0IG9uZSB0aGF0IHJlcXVpcmVzIFB5dGhvbiAyLjIgb3IgZ3JlYXRlci4gCgoxMC8zMS8yMDAzOiBiZWF6bGV5IAogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE5IF0gWE1MIG1vZHVsZSB0d2Vha3MuCiAgICAgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC14bWxsaXRlIHRoYXQgCiAgICAgICAgICAgIGdyZWF0bHkgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGVtaXR0ZWQgWE1MIGNvZGUgYnkKICAgICAgICAgICAgZWxpbWluYXRpbmcgc29tZSBmaWVsZHMgbW9zdGx5IHVzZWQgaW4gU1dJRydzCiAgICAgICAgICAgIGludGVybmFsIHByb2Nlc3NpbmcuICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE3IF0gQWRkcyBEb2hTcGxpdExpbmVzIGZ1bmN0aW9uLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNzkwNyBdIGFyZ291dCBvYmplY3RzIG5vdCBiZWluZyB3cmFwcGVkIHByb3Blcmx5IChQQVRIKS4KICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgkgICAgIAoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI2OTk2IF0gcGVybCB0eXBlIGNoZWNraW5nIGlnbm9yZXMgcGVybCBzdWJjbGFzc2VzLgogICAgICAgICAgICBUaGlzIGVuaGFuY2VtZW50IG1ha2VzIGl0IHNvIHdyYXBwZWQgY2xhc3NlcyBhbmQgc3RydWN0cyBjYW4KICAgICAgICAgICAgYmUgc3ViY2xhc3NlZCBpbiBQZXJsIGFuZCB1c2VkIG5vcm1hbGx5LiAKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgoxMC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbnRQdHIgbWFyc2hhbGxlZCB3aXRoIGEgdm9pZCogaW5zdGVhZCBvZiBpbnQgaW4gQyBmdW5jdGlvbiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiBUaGUgY2FzdHMgdGh1cyBsb29rIG1vcmUgY29udmVudGlvbmFsLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAvLyBvbGQKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KGludCBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAqKFNoYXBlICoqKSZqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBuZXcKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KHZvaWQgKiBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAoU2hhcGUgKilqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoKMTAvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBzbWFydCBwb2ludGVycy4KICAgICAgICAgICAgSWYgYSBjbGFzcyBoYXMgb3ZlcmxvYWRlZCBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50IHgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgeCwgaW50IHkpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBhbmQgdGhlIGNsYXNzIGlzIHVzZWQgYXMgYSBzbWFydCBwb2ludGVyOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb1B0ciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBTV0lHIHdvdWxkIHRyeSB0byBleHBvc2UgdGhlIHN0YXRpYyBtZW1iZXIgRm9vOjpiYXIKICAgICAgICAgICAgdGhyb3VnaCBGb29QdHItLS1yZXN1bHRpbmcgYm9ndXMgd3JhcHBlciBjb2RlIGFuZCBhIGNvbXBpbGVyCiAgICAgICAgICAgIGVycm9yLgoKICAgICAgICAgICAgRHVlIHRvIHRoZSB3YXkgaW4gd2hpY2ggb3ZlcmxvYWRpbmcgaXMgaGFuZGxlZCwgaXQgaXMKICAgICAgICAgICAgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBlbGltaW5hdGUgdGhlIHN0YXRpYyBtZXRob2QgaW4KICAgICAgICAgICAgdGhpcyBjYXNlLiAgVGhlcmVmb3JlLCBpdCBpcyBzdGlsbCBleHBvc2VkLiAgSG93ZXZlciwKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIG5vdyBjb21waWxlcyBhbmQgd29ya3MuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlLCBNelNjaGVtZSwgQ2hpY2tlbl06IFJlbW92ZSBzeW1ib2wgY2xhc2hlcyBiZXR3ZWVuCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGJ5IHJlbmFtaW5nIGFsbCBleHRlcm4gY29tbW9uLnN3ZwoJICAgIGZ1bmN0aW9ucyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBiYXNpYyBHT09QUyBzdXBwb3J0LCBjb250cmlidXRlZCBieSBKb2huIExlbnouCgkgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgoJICAgIAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBOZXcgb3B0aW9uLCAtb25seS1zZXR0ZXJzLCB3aGljaCBkaXNhYmxlcwoJICAgIHRyYWRpdGlvbmFsIGdldHRlciBhbmQgc2V0dGVyIHByb2NlZHVyZXMgZm9yIHN0cnVjdHVyZSBzbG90cy4KCjEwLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIHJ1biB0ZXN0IGZvciByZWZlcmVuY2VfZ2xvYmFsX3ZhcnMgYnkgSm9obiBMZW56LgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBQYXJ0aWFsIHNvbHV0aW9uIHRvIFsgNzkyMTgwIF0gQysrIHNtYXJ0LXBvaW50ZXIvbmFtZXNwYWNlIG1peHVwIHJldmlzaXRlZC4KICAgICAgICAgICAgVGhlIHByb2JsZW0gaXMgbm90IGVhc3kgdG8gZml4IChhdCBsZWFzdCBpdCBkb2Vzbid0IHNlZW0gc28pLCBidXQgaXMKICAgICAgICAgICAgcmVsYXRlZCB0byB0aGUgaW5zdGFudGlhdGlvbiBvZiBxdWFsaWZpZWQgdGVtcGxhdGVzIGluc2lkZSBvZiBvdGhlcgogICAgICAgICAgICBuYW1lc3BhY2VzLiAgIFNXSUcgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZSByYXRoZXIKICAgICAgICAgICAgdGhhbiBnZW5lcmF0aW5nIGJyb2tlbiB3cmFwcGVycy4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MDAwMTIgXSBFTlRFUiBtYWNybyBmcm9tIENPUkUvc2NvcGUuaCBjbGFzaGVzIHdpdGggbGliYyBzZWFyY2guaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODExNTE4IF0gQ2FzdGluZyBpbnRzIHRvIGRvdWJsZXMgKHcvIHNvbHV0aW9uPykKICAgICAgICAgICAgQWRkcmVzc2VzIGEgcHJvYmxlbSB3aXRoIG92ZXJsb2FkaW5nIGluIHRoZSBQZXJsIG1vZHVsZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIERhbGxleS4KCjA5LzI4LzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGUgd2l0aCAtc2NtIG9wdGlvbl0gRml4IHR5cG8gaW4gZ2VuZXJhdGVkIGNvZGUgZm9yCgkgICAgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMuICBSZXBvcnRlZCBieSBKb2huIExlbnouCgowOS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODEyNTI4IF0gZXh0ZXJucyBub3QgY29ycmVjdCB3aGVuIHRocm93IGlzIGluIHNpZ25hdHVyZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCiAgICAgICAgICAgIAowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU1dJRyB3YXMgZ2VuZXJhdGluZyBhIG51bWJlciBvZiBzeW1ib2xzIHRoYXQgZGlkbid0IGNvbXBseSB3aXRoIAogICAgICAgICAgICB0aGUgSVNPIEMvQysrIHN0YW5kYXJkLCBpbiBwYXJ0aWN1bGFyIElTTy9JRUMgMTQ4ODI6MTk5OChFKSAxNy40LjMuMS4yCiAgICAgICAgICAgIHdoZXJlIGRvdWJsZSB1bmRlcnNjb3JlcyBhcmUgZm9yYmlkZGVuIGFzIHdlbGwgYXMgc3ltYm9scyBzdGFydGluZyB3aXRoCiAgICAgICAgICAgIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1vc3Qgb2YgdGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHJvb3RlZCBvdXQuIFNlZSBuZXcgc2VjdGlvbiBhZGRlZCB0byBpbnRlcm5hbHMuaHRtbCBkZXZlbG9wbWVudAogICAgICAgICAgICBtYW51YWwgJ1N5bWJvbCBOYW1pbmcgR3VpZGVsaW5lcyBmb3IgR2VuZXJhdGVkIEMvQysrIENvZGUnLgoKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpcmVjdG9yIHR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBpbnYgICAgID0+IGRpcmVjdG9yaW4KICAgICAgICAgICAgb3V0diAgICA9PiBkaXJlY3Rvcm91dAogICAgICAgICAgICBhcmdvdXR2ID0+IGRpcmVjdG9yYXJnb3V0CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzE5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIGNvbnN0cnVjdG9ycyBub3cgZGVmYXVsdCB0byBfX2Rpc293biA9IDAsIAoJICAgIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBhbmQgZml4ZXMgdGhlIGRpcmVjdG9yX2ZpbmFsaXplciAKCSAgICB0ZXN0IGNhc2UgdW5kZXIgcHl0aG9uLgoKMDkvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gLSBUeXBlbWFwcyBhZGRlZCBmb3Igc3RkOjpzdHJpbmcgYW5kIGNvbnN0IHN0ZDo6c3RyaW5nICYuCiAgICAgICAgICAgICAgICAgLSBOZXcgZGVsZWdhdGUgZm9yIGNyZWF0aW5nIGEgQyMgc3RyaW5nIGdpdmVuIGEgY2hhciAqLiBJdAogICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgYnkgY2FsbGluZyBTV0lHX2NzaGFycF9zdHJpbmdfY2FsbGJhY2sgYXMgc2hvd24KICAgICAgICAgICAgICAgICAgIGluIHRoZSBzdGQ6OnN0cmluZyAnb3V0JyB0eXBlbWFwLiBVc2VmdWwgaWYgdGhlIHJldHVybiB0eXBlIGlzCiAgICAgICAgICAgICAgICAgICBtYXBwZWQgdG8gYSBDIyBzdHJpbmcgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIAogICAgICAgICAgICAgICAgICAgZm9yIGNsZWFuaW5nIHVwIG1lbW9yeSBhcyB0aGUgQyMgZ2FyYmFnZSBjb2xsZWN0b3IgZG9lc24ndAogICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgbWVtb3J5IGNyZWF0ZWQgaW4gQy9DKysgYW5kIHRoZW4gcmV0dXJuZWQgYXMgYSBDIyBzdHJpbmcuCiAgICAgICAgICAgICAgICAgLSBUaGUgZXhjZXB0aW9uIGRlbGVnYXRlcyBoYXZlIG1vdmVkIGludG8gYW4gaW5uZXIgY2xhc3MgaW4gdGhlCiAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgY2xhc3MsIHRoZXJlYnkgZnJlZWluZyB1cCB0aGUgc3RhdGljIGNvbnN0cnVjdG9yLgoKMDkvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICAoSW50ZXJuYWxzKQogICAgICAgICAgICBNYWpvciByZWZhY3RvcmluZyBvZiBpdGVyYXRpb24gb3ZlciBsaXN0cyBhbmQgaGFzaGVzLiAgVGhlCiAgICAgICAgICAgIERPSCBsaWJyYXJ5IG5vdyB1c2VzIGl0ZXJhdG9ycy4gIFRoZXkgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgTGlzdCAqbCA9IChzb21lIGxpc3QpOwoKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBjb250YWlucyB0aGUgYWN0dWFsIGxpc3QgaXRlbS4KICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gaXMgTlVMTCBhdCBlbmQgb2YgbGlzdAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEhhc2ggKmggPSAoc29tZSBoYXNoKTsKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGo7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChoKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGouaXRlbSBjb250YWlucyBoYXNoIHRhYmxlIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBqLmtleSAgY29udGFpbnMgaGFzaCB0YWJsZSBrZXkKICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIGouaXRlbSBhbmQgai5rZXkgYXJlIE5VTEwgYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgVGhlIG9sZCBpdGVyYXRpb24gZnVuY3Rpb25zIEZpcnN0aXRlbSgpLCBOZXh0aXRlbSgpLCBGaXJzdGtleSgpLAogICAgICAgICAgICBhbmQgTmV4dGtleSgpIGFyZSBnb25lLiAgCgogICAgICAgICAgICBUaGUgbmV3IGl0ZXJhdG9ycyBhcmUgc2ltcGxlciwgcmVzdWx0IGluIGJldHRlciBtZW1vcnkgdXNlLAogICAgICAgICAgICBhbmQgbWF5IGJlIGZhc3Rlci4gIEFsc28sIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IHByb2JsZW1zCiAgICAgICAgICAgIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lIGxpc3QvaGFzaCBpbiBtdWx0aXBsZSBwbGFjZXMgYXQKICAgICAgICAgICAgdGhlIHNhbWUgdGltZS4gIEZvciBleGFtcGxlLCB0aGlzIGlzIGZpbmU6CgogICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGksajsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGwpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKFRoaXMgbmV2ZXIgd29ya2VkIGluIHByZXZpb3VzIHZlcnNpb25zKS4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLiAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIAogICAgICAgICAgICB0aGlyZCBwYXJ0eSBleHRlbnNpb25zIHRvIFNXSUcgKG9yIGdpdmUgdGhlbSBmdXJ0aGVyIGVuY291cmFnZW1lbnQKICAgICAgICAgICAgdG8gam9pbiB0aGUgU1dJRyBDVlMtdHJlZSA6LSkuCgowOS8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSAibGlzdC12ZWN0b3IuaSIgdHlwZW1hcHMuCgowOS8wOS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIFVzZSBDX21rX2Jvb2wgcmF0aGVyIHRoYW4gQ19ta2Jvb2wuICBUaGlzIGZpeGVzCgkgICAgdGhlIHdyYXBwaW5nIG9mIGJvb2xlYW4gdmFsdWVzIGZvciBDaGlja2VuIDEuMTAgYW5kIG5ld2VyLgoJICAgIFJlcG9ydGVkIGJ5IERhdmUgPGh1bmRvQHlhaG9vLmNvbT4gLyBGZWxpeCBXaW5rZWxtYW5uCgkgICAgPGZlbGl4QHByb3hpbWEtbXQuZGU+LgoKMDkvMDUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvcnMgaW1wbGVtZW50ZWQgZm9yIEphdmEuIEluIHN1bW1hcnkgdGhpcyBpcyBhIGJpZyBuZXcgZmVhdHVyZSAKICAgICAgICAgICAgd2hpY2ggc3VwcG9ydHMgdXBjYWxscyBmcm9tIEMrKyB0byBKYXZhLiBDb2RlIGlzIGdlbmVyYXRlZCB0byBzdXBwb3J0IEMrKyAKICAgICAgICAgICAgY2FsbGJhY2tzIHRvIGNhbGwgaW50byBKYXZhIGFuZCB0cnVlIHBvbHltb3JwaGljIGJlaGF2aW91ciBmb3IgSmF2YSBjbGFzc2VzIAogICAgICAgICAgICBkZXJpdmVkIGZyb20gQysrIGNsYXNzZXMuIFNlZSBqYXZhLmh0bWwgZm9yIGRldGFpbHMuIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBTY290dCBNaWNoZWwuCgowOS8wNS8yMDAzOiBUaWdlcgogICAgICAgICAgICBDcmVhdGVkIGNvbnRyYWN0IGV4YW1wbGUgZGlyZWN0b3J5IGF0IC9TV0lHL0V4YW1wbGVzL2NvbnRyYWN0CiAgICAgICAgICAgIEFkZGVkIHNpbXBsZSBjb250cmFjdCBleGFtcGxlcyAoc2ltcGxlX2MgJiBzaW1wbGVfY3h4KQogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBtb2R1bGUncyBvdXRwdXQgZm9ybWF0CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGVzdC1zdWl0ZSBidWlsZCBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIC0gTXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgd29ya2luZyBmb3IgdGhlIHRlc3Qgc3VpdGUsIHNvIGl0IGlzIG5vdwogICAgICAgICAgICAgIHBvc3NpYmxlIHRvIHJ1biBjb25maWd1cmUgaW4gbXVsdGlwbGUgc3ViZGlyZWN0b3JpZXMgYW5kIHJ1biB0aGUgdGVzdAogICAgICAgICAgICAgIHN1aXRlIGluIGVhY2ggb2YgdGhlc2Ugc3ViIGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtICdtYWtlIGRpc3RjbGVhbicgZml4ZWQgc28gaXQgZG9lc24ndCBib21iIG91dCBvbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgd2hlbiB1c2luZyBtdWx0aXBsZSBzdWJkaXJldG9yeSBidWlsZHMuIFJlcXVpcmVkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMKICAgICAgICAgICAgICB0byBiZSBtb3ZlZDoKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGVybCAtPiBFeGFtcGxlcy9HSUZQbG90L1Blcmw1CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BocCAgLT4gRXhhbXBsZXMvR0lGUGxvdC9QaHA0CiAgICAgICAgICAgICAgVGhlc2UgbmV3IGRpcmVjdG9yaWVzIHVzZWQgdG8gYmUgc3ltYm9saWMgbGlua3MgdG8gdGhlIG9sZCBkaXJlY3RvcnkuCiAgICAgICAgICAgICAgQWxzbyB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9QZXJsIHN5bWJvbGljIGxpbmsgaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAgICAgICAgLSBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBvdGhlciB0aGFuIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LCBzYXkKICAgICAgICAgICAgICBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL3B5dGhvbiB3aWxsIG5vdyBkaXNwbGF5IGFsbCB0aGUgY29kZSBiZWluZwogICAgICAgICAgICAgIGV4ZWN1dGVkLgogICAgICAgICAgICAtIFRoZSBmb2xsb3dpbmcgMyBDIyBjb21waWxlcnMgYXJlIGRldGVjdGVkIGR1cmluZyBjb25maWd1cmUgYW5kIHdvcmsgd2l0aCAKICAgICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZTogTW9ubywgUG9ydGFibGUuTkVUIGFuZCBNaWNyb3NvZnQuCgowOS8wMS8yMDAzOiBUaWdlcgogICAgICAgICAgICBBZGRlZCBpbmhlcml0YW5jZSBzdXBwb3J0IGZvciBkZXNpZ24gYnkgY29udHJhY3QgZmVhdHVyZS4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTQ5MTQgXSBXcm9uZyB0eXBlcyBpbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgU1dJRyB3YXMgbm90IGhhbmRsaW5nIGFyZ3VtZW50cyBjb3JyZWN0bHkgaW4gdGVtcGxhdGUgCiAgICAgICAgICAgIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb288VCAqPiB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgVCAqYmxhaCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vSW50KSBGb288aW50ICo+OwoKICAgICAgICAgICAgaW4gdGhpcyBjbGFzcywgdGhlIHJldHVybiB0eXBlIG9mIGJsYWggd2FzIHNldCB0bwogICAgICAgICAgICAnaW50ICoqJywgYnV0IGl0IHNob3VsZCByZWFsbHkgYmUgJ2ludCAqJy4gIFRoaXMgaGFzIGJlZW4KICAgICAgICAgICAgZml4ZWQsIGJ1dCBpdCB3aWxsIGFmZmVjdCBhbGwgcHJpb3IgdXNlcyBvZiBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uLgogCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODYzOTQgXSBQYXRjaCBmb3IgZ2VuZXJhdGVkIHBlcmwgY29kZSBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFJlZEhhdDkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNjb3R0IEZpbm5lcmFuLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTU3OSBdICh1bnNpZ25lZCkgbG9uZyBsb25nIGhhbmRsZWQgaW5jb3JyZWN0bHkgKFRjbCkuCiAgICAgICAgICAgIFRoaXMgd2FzIGFuIGVycm9yIGluIHRoZSBUY2wgdHlwZW1hcHMuaSBmaWxlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgS2plbGwgV29vZGluZy4KICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3MyBdIG5vIHdheSB0byByZW5hbWUgY2xhc3NlcyBjb21pbmcgZnJvbSBDIHN0cnVjdHVyZXMuCiAgICAgICAgICAgIFRoaXMgcHJvYmxlbSByZWxhdGVzIHRvIHJlbmFtaW5nIG9mIGFub255bW91cyBzdHJ1Y3R1cmVzIHdpdGggYQogICAgICAgICAgICB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6IAoKICAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KICAgICAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzYgXSAtaGVscCBzZWVtcyB0byBpbXBseSB0aGF0IG9ubHkgdGNsLXNwZWNpZmljIG9wdGlvbnMgZXhpc3QuCiAgICAgICAgICAgIEFkZGVkIGEgY29tbWVudCB0byBhbGVydCB1c2VyIHRvIG90aGVyIG9wdGlvbnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5ODIwNSBdIFNlZ2ZhdWx0IGluIFNXSUdfQ29udmVydFB0ci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUHJhYmh1IFJhbWFjaGFuZHJhbi4KCjA4LzMwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1vZGlmaWVkIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBpbiBweXRob24vc3RkX2NvbXBsZXguaSB0byB1c2UgdGhlIAoJICAgIG5ldy1zdHlsZSBtYWNybyBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMsIHdoaWNoIGVsaW1pbmF0ZWQgc29tZQoJICAgIHJlZHVuZGFudCBjb2RlLiAgRml4ZWQgYSBmZXcgYnVncyBpbiB0aGVzZSB0eXBlbWFwcyBhcyB3ZWxsLCBhbHRob3VnaAoJICAgIG1vcmUgdGVzdGluZyBpcyBuZWVkZWQuCgowOC8yOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDb21wbGV0ZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBhYnN0cmFjdCBjbGFzc2VzIHdpdGggZGlyZWN0b3JzLgoJICAgIENvbnN0cnVjdG9yIHdyYXBwZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhYnN0cmFjdCBjbGFzc2VzIHRoYXQgaGF2ZQoJICAgIGRpcmVjdG9ycywgYW5kIGluc3RhbmNlcyBvZiB0aGUgZGlyZWN0b3IgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcwoJICAgIG9mIHdoZXRoZXIgdGhlIHByb3h5IGNsYXNzIGhhcyBiZWVuIHN1YmNsYXNzZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCSAgICBObyBjaGVja3MgYXJlIG1hZGUgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgcHVyZSB2aXJ0dWFsCgkgICAgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEluc3RlYWQsIGNhbGxzIHRvCgkgICAgdW5pbXBsZW1lbnRlZCBtZXRob2RzIHdpbGwgdGhyb3cgU1dJR19ESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OCgkgICAgZXhjZXB0aW9ucyBpbiBDKysuCgoJICAgIEludGVncmF0ZWQgUHJhYmh1IFJhbWFjaGFuZHJhbidzIHR5cGVtYXAgcGF0Y2hlcywgd2hpY2ggcHJvdmlkZSBkaXJlY3RvcgoJICAgIHR5cGVtYXAgc3VwcG9ydCBmb3IgZW51bXMgYW5kIHN0ZDo6c2l6ZV90LCBhbmQgZml4IGEgY291cGxlIGJ1Z3MgaW4gdGhlIAoJICAgIGRpcmVjdG9yIHN0ZDo6dmVjdG9yPD4gdHlwZW1hcHMuCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXBsZW1lbnRlZCBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHRocm93aW5nIEMjIGV4Y2VwdGlvbnMgZnJvbSBDL0MrKyBjb2RlLgogICAgICAgICAgICBBIGZldyBkZWxlZ2F0ZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY2FsbGluZyB3aGljaCB0aGVuIHRocm93IHRoZSBDIwogICAgICAgICAgICBleGNlcHRpb24uIFVzZSB0aGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbiBmdW5jdGlvbiBmcm9tIEMvQysrIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgb3IgY3NoYXJwaGVhZC5zd2cgZm9yIGFsbCBhdmFpbGFibGUgZXhjZXB0aW9ucy4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbihTV0lHX0NTaGFycEV4Y2VwdGlvbiwgImV4Y2VwdGlvbiBkZXNjcmlwdGlvbiIpOwoKICAgICAgICAgICAgVGhlICd0aHJvd3MnIHR5cGVtYXBzIGFyZSBhbHNvIG5vdyBpbXBsZW1lbnRlZCwgc28gY29kZSBpcyBhdXRvbWF0aWNhbGx5IAogICAgICAgICAgICBnZW5lcmF0ZWQgdG8gY29udmVydCBhbnkgQysrIGV4Y2VwdGlvbiBpbnRvIGEgQyMgU3lzdGVtLkV4Y2VwdGlvbiB3aGVuIHRoZSBDKysgCiAgICAgICAgICAgIG1ldGhvZCBkZWNsYXJlcyBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBzdWNoIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEJhcik7CgogICAgICAgICAgICBBbHNvIGFueSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHJlZmVyZW5jZXMgdG8gYSBDKysgY2xhc3Mgb3IgYSBjbGFzcyBwYXNzZWQgYnkgdmFsdWUKICAgICAgICAgICAgYW5kIGFyZSBwYXNzZWQgYXMgYSBDIyBudWxsIHdpbGwgbm93IHRocm93IGEgQyMgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbi4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCB0byBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGFsbCBwaW52b2tlIG1ldGhvZHMgc28gdGhhdCB0aGV5CiAgICAgICAgICAgIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSBkZWZhdWx0IGluIHRoZSBDIyAnc3RhdGljIGV4dGVybicgZGVjbGFyYXRpb25zIAogICAgICAgICAgICAoX19zdGRjYWxsIGlzIHVzZWQgb24gV2luZG93cykuCgowOC8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJld29ya2VkIHN0ZDo6c3RyaW5nIHR5cGVtYXBzLiBGaXhlcyBhIG51bWJlciBvZiBzdHJpbmcgaW4gc3RkIG5hbWVzcGFjZSAKICAgICAgICAgICAgcHJvYmxlbXMuIEZvciBleGFtcGxlICV0ZW1wbGF0ZSB2ZWN0b3I8c3RyaW5nPi4gVGhlIHRlbXBsYXRlZCBjbGFzcycgZ2V0IG1ldGhvZCAKICAgICAgICAgICAgd2Fzbid0IHJldHVybmluZyBhIEphdmEgU3RyaW5nLCBidXQgYSBTV0lHVFlQRV9wX3N0cmluZy4gUmVwb3J0ZWQKICAgICAgICAgICAgYnkgWmFjaCBCYXVtLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzUyMiBdIDEuMy4xOSBzZWdmYXVsdCBpbiBTd2lnVHlwZV9hZGRfcG9pbnRlci9Eb2hJbnNlcnRpdGVtLgogICAgICAgICAgICBSZWxhdGVkIHRvIHByb2JsZW0gd2l0aCB1bm5hbWVkIGNsYXNzIGhhbmRsaW5nIGluIFBlcmwgbW9kdWxlLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzU2MyBdIE1pc3NpbmcgaW5kaWNhdGlvbiBvZiBvcHRpb25hbCBhcmd1bWVudHMuCiAgICAgICAgICAgIFRjbCBtb2R1bGUuICBSZXBvcnRlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NzQzMiBdIGxvbmcgcGFyYW0gaGFuZGxlZCBhcyBpbnQuICBUY2wgbW9kdWxlCiAgICAgICAgICAgIG5vdyB1c2VzIFRjbF9HZXRMb25nRnJvbU9iaiB0byBjb252ZXJ0IGludGVnZXIgdmFsdWVzLgoKMDgvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTk4OSBdIG51bWVyaWMgdGVtcGxhdGUgcGFyYW1ldGVycy4gICBUaGVyZSB3ZXJlCiAgICAgICAgICAgIHNvbWUgZXJyb3JzIGluIHRlbXBsYXRlIGV4cGFuc2lvbiByZWxhdGVkIHRvIHRoZSB1c2Ugb2YKICAgICAgICAgICAgYXJyYXlzIHdoZXJlIHRoZSBhcnJheSBkaW1lbnNpb24gd2FzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLgogICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBSZXBvcnRlZCBieSBCcnlhbiBHcmVlbi4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgZGlyZWN0b3IgdHlwZW1hcCAob3V0dikgZm9yIHJldHVybiBieSB2YWx1ZSBhbmQgY2xlYW5lZCB1cCB1cCBhIGZldyAKCSAgICBvZiB0aGUgY29tbWVudGVkIGRpcmVjdG9yIHR5cGVtYXBzLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiBmb3IgZGlyZWN0b3IgY2xhc3NlcyB0byBpZ25vcmUgcHJpdmF0ZQoJICAgIGNvbnN0cnVjdG9ycy4gIFByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYXJlIGFsc28gaWdub3JlZCBmb3Igbm93LCBwZW5kaW5nCgkgICAgYSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiB3cmFwcGluZyBjbGFzc2VzIHRoYXQgb25seSBkZWZpbmUgcHJvdGVjdGVkCgkgICAgY29uc3RydWN0b3JzLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW91dGRpciA8ZGlyPiB0byBzcGVjaWZ5IHdoZXJlIHRoZSBsYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBmaWxlcyBhcmUgdG8gYmUgZ2VuZXJhdGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGFyZ2V0IGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwKICAgICAgICAgICAgSmF2YSBldGMgd2hpY2ggZ2VuZXJhdGUgcHJveHkgZmlsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIGxhbmd1YWdlLgogICAgICAgICAgICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgQy9DKysgd3JhcHBlciBmaWxlLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE9uIFdpbmRvd3MgdGhlIGdlbmVyYXRlZCBmaWxlcyAob3RoZXIgdGhhbiB0aGUgX3dyYXAuYyBvciBfd3JhcC5jeHggZmlsZXMpCiAgICAgICAgICAgIHdlcmUgc29tZXRpbWVzIGluY29ycmVjdGx5IGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1bmxlc3MKICAgICAgICAgICAgdGhlIGlucHV0IGZpbGUgdXNlZCB0aGUgVW5peCBwYXRoIHNlcGFyYXRvci4gVGhlIFdpbmRvd3MgcGF0aCBzZXBhcmF0b3IgCiAgICAgICAgICAgIHNob3VsZCBub3cgYmUgdXNlZC4gQnVnIHJlcG9ydGVkIGJ5IFJvYmVydCBEYXZpZXMuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFycmF5IHZhcmlhYmxlIHNldCB0eXBlbWFwIHRvIFBlcmwgbW9kdWxlLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTY3NyBdIEFycmF5IGluaXQgY2F1c2VzIGNvZGVnZW4gYnVnLi4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzkwNjIgXSBDbGFzcyJcbiI6OmZvbyBub3Qgc3VwcG9ydGVkLiAgU1dJRwogICAgICAgICAgICBzaG91bGQgbm93IGNvcnJlY3RseSBoYW5kbGUgd2hpdGVzcGFjZSBpbiBiZXR3ZWVuIAogICAgICAgICAgICBuYW1lc3BhY2UgcXVhbGlmaWVycy4gIEZvciBleGFtcGxlICJBIDo6IEZvbyA6OiBCYXIiLgogICAgICAgICAgICAKMDcvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjbGFzc2VzIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSBhbmQgaGF2ZSAKICAgICAgICAgICAgYSBkZWZhdWx0IHZhbHVlLiBBIGNvcHkgY29uc3RydWN0b3IgZm9yIFN3aWdWYWx1ZVdyYXBwZXIgaXMgcmVxdWlyZWQgCiAgICAgICAgICAgIChTRiAjNzgwMDU2KS4gQWxzbyBmaXhlZCBtZW1vcnkgbGVhayBpbiB0aGVzZSBjaXJjdW1zdGFuY2VzLiBUaGVzZSBtb2RzCiAgICAgICAgICAgIGFsc28gZml4IFNGICM3ODAwNTQuCgowNy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHJ1bi10aW1lIGVycm9yIG1lc3NhZ2UgZm9yIHBvaW50ZXJzIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFpvb2tvLgoKMDcvMTAvMjAwMzogYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBbQWxtb3N0IGFsbCBsYW5ndWFnZXNdIFdyYXBwZXJzIGZvciBzdGQ6OnBhaXIgYWRkZWQuCgkgICAgVHlwZW1hcHMgZm9yIFB5dGhvbiwgUnVieSwgR3VpbGUgYW5kIE16U2NoZW1lLgoKMDcvMDEvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBIYW5kbGUgdGhlIGNhc2Ugb2YgbW9yZSB0aGFuIG9uZSBhcmdvdXQgdHlwZW1hcAoJICAgIHBlciBmdW5jdGlvbi4KCjA2LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFNGICM2NzA5NDkgcmVxdWVzdC4gVGhlIGRlc3RydWN0b3Igd3JhcHBlciBmdW5jdGlvbiBuYW1lIGlzIG5vdyAKICAgICAgICAgICAgY29uZmlndXJhYmxlLiAgQSBuZXcgYXR0cmlidXRlIGNhbGxlZCBtZXRob2RuYW1lIGluIHRoZSAKICAgICAgICAgICAgamF2YWRlc3RydWN0L2phdmFkZXN0cnVjdF9kZXJpdmVkIChKYXZhKSBvciBjc2Rlc3RydWN0L2NzZGVzdHJ1Y3RfZGVyaXZlZCAoQyMpCiAgICAgICAgICAgIHR5cGVtYXBzIHNwZWNpZmllcyB0aGUgbWV0aG9kIG5hbWUuIEZvciBleGFtcGxlIGluIEphdmEgdGhlIGRlc3RydWN0b3IgaXMgCiAgICAgICAgICAgIHdyYXBwZWQgYnkgZGVmYXVsdCB3aXRoIHRoZSBkZWxldGUgbWV0aG9kOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFkZXN0cnVjdCwgbWV0aG9kbmFtZT0iZGVsZXRlIikgU1dJR1RZUEUgey4uLn0KCjA2LzI3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSB0aHJvd3MgYXR0cmlidXRlIGZvciBhZGRpbmcgZXhjZXB0aW9uIGNsYXNzZXMgdG8gdGhlIHRocm93cwogICAgICAgICAgICBjbGF1c2UgYWxzbyBub3cgd29ya3Mgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiAKICAgICAgICAgICAgbmV3ZnJlZQogICAgICAgICAgICBqYXZhaW4sIGphdmFvdXQgKEphdmEpCiAgICAgICAgICAgIGNzaW4sIGNzb3V0IChDIykKCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgJ0FuRXhjZXB0aW9uJyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aHJvd3MgY2xhdXNlIGluIHRoZQogICAgICAgICAgICBwcm94eSBmdW5jdGlvbjoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQsIHRocm93cz0iQW5FeGNlcHRpb24iKSBpbnQgewogICAgICAgICAgICAgICAgaW50IHJldHVyblZhbHVlPSRqbmljYWxsOwogICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlPT0wKSB0aHJvdyBuZXcgQW5FeGNlcHRpb24oIlZhbHVlIG11c3Qgbm90IGJlIHplcm8iKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgfQoKMDYvMjUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgdHlwZW1hcCBtYXJzaGFsbGluZyBjaGVja3MgZm9yIG51bGwgcG9pbnRlcnMgd2hlbgoJICAgIHdhbGtpbmcgdGhlIHBhcmFtZXRlciBsaXN0IGluc3RlYWQgb2YgcmVseWluZyBzb2xleSBvbiB0aGUgcGFyYW1ldGVyCgkgICAgY291bnQuICBDdXJlcyBhIHNlZ2ZhdWx0IHRoYXQgb2NjdXJlZCBmb3IgbXVsdGlwbGUgYXJndW1lbnQgaW52IHR5cGVtYXBzLgoJICAgIFNvbWVvbmUgd2l0aCBtb3JlIFN3aWcgZXhwZXJpZW5jZSBzaG91bGQgcHJvYmFibHkgcmV2aWV3IHRoaXMgY29kZS4KCjA2LzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRG9uJ3QgZW1pdCBjYWxscyB0byAiQ19jaGVja19mb3JfaW50ZXJydXB0IiwKCSAgICB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGVuZGxlc3MgbG9vcC4gIFBhdGNoIGJ5IGZlbGl4QHByb3hpbWEtbXQuZGUuCgowNi8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaW5hbGl6ZXJzIG5vdyB1c2UgZGVzdHJ1Y3RvciBzeW50YXggYXMgdGhlIG92ZXJyaWRlIHdoaWNoIHdhcyB1c2VkIGluIAogICAgICAgICAgICB0aGUgRmluYWxpemUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgRUNNQSBzdGFuZGFyZHMsIHNwb3R0ZWQgYnkgdGhlIE1TIGNvbXBpbGVyLgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQSBudW1iZXIgb2YgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byByZW1vdmUgdGhlIEphdmEgbmFtaW5nIAogICAgICAgICAgICB0aGF0IHdhcyB1c2VkIGluIHRoZSBDIyBtb2R1bGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUeXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgam5pICAgICAgICAgICAgICAgICAgICAgICAgIC0+IGN0eXBlCiAgICAgICAgICAgIGp0eXBlICAgICAgICAgICAgICAgICAgICAgICAtPiBpbXR5cGUKICAgICAgICAgICAganN0eXBlICAgICAgICAgICAgICAgICAgICAgIC0+IGNzdHlwZQogICAgICAgICAgICBqYXZhaW4gICAgICAgICAgICAgICAgICAgICAgLT4gY3NpbgogICAgICAgICAgICBqYXZhb3V0ICAgICAgICAgICAgICAgICAgICAgLT4gY3NvdXQKICAgICAgICAgICAgamF2YWludGVyZmFjZXMgICAgICAgICAgICAgIC0+IGNzaW50ZXJmYWNlcwogICAgICAgICAgICBqYXZhYmFzZSAgICAgICAgICAgICAgICAgICAgLT4gY3NiYXNlCiAgICAgICAgICAgIGphdmFjbGFzc21vZGlmaWVycyAgICAgICAgICAtPiBjc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFjb2RlICAgICAgICAgICAgICAgICAgICAtPiBjc2NvZGUKICAgICAgICAgICAgamF2YWltcG9ydHMgICAgICAgICAgICAgICAgIC0+IGNzaW1wb3J0cwogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgLT4gY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycwogICAgICAgICAgICBqYXZhZ2V0Y3B0ciAgICAgICAgICAgICAgICAgLT4gY3NnZXRjcHRyCiAgICAgICAgICAgIGphdmFmaW5hbGl6ZSAgICAgICAgICAgICAgICAtPiBjc2ZpbmFsaXplCgogICAgICAgICAgICBGZWF0dXJlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgamF2YWNvbnN0ICAgICAgICAgICAgICAgICAgIC0+IGNzY29uc3QKICAgICAgICAgICAgamF2YW1ldGhvZG1vZGlmaWVycyAgICAgICAgIC0+IGNzbWV0aG9kbW9kaWZpZXJzCgogICAgICAgICAgICBQcmFnbWEgY2hhbmdlczoKICAgICAgICAgICAgcHJhZ21hKGphdmEpICAgICAgICAgICAgICAgIC0+IHByYWdtYShjc2hhcnApCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzICAgICAgLT4gaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzY29kZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2ltcG9ydHMgICAgICAgICAgICAgLT4gaW1jbGFzc2ltcG9ydHMKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2VzICAgICAgICAgIC0+IGltY2xhc3NpbnRlcmZhY2VzCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgICAgICAgICAgICAgIC0+ICRjc2NsYXNzbmFtZQogICAgICAgICAgICAkamF2YWlucHV0ICAgICAgICAgICAgICAgICAgLT4gJGNzaW5wdXQKICAgICAgICAgICAgJGpuaWNhbGwgICAgICAgICAgICAgICAgICAgIC0+ICRpbWNhbGwKCiAgICAgICAgICAgIFRoaXMgd2lsbCBicmVhayBTV0lHIGludGVyZmFjZSBmaWxlcyB0aGF0IHVzZSB0aGVzZSB0eXBlbWFwcywgZmVhdHVyZXMKICAgICAgICAgICAgYW5kIHByYWdtYXMuIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIG9yIHVzZSBtYWNyb3MgZm9yIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIEFwcGxpZWQgTXpTY2hlbWUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uCgogICAgICAgICAgICAtIFVwZGF0ZWQgbXpzY2hlbWUgdG8gdXNlIFNXSUcncyBjb21tb24gcnVudGltZSB0eXBlCiAgICAgICAgICAgICAgc3lzdGVtIGZyb20gY29tbW9uLnN3Zy4gCgoJICAgIC0gVGhlIExpYi9tenNjaGVtZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgdGhlIGxhbmd1YWdlIG1vZHVsZXM6CiAgICAgICAgICAgICAgbXpzY2hlbWUuaSB3YXMgbW92ZWQgdG8gbXpzY2hlbWUuc3dnLCBtenNjaGVtZS5zd2cgYW5kCiAgICAgICAgICAgICAgbXpzY2hlbWVkZWMuc3dnIGhhdmUgYmVlbiByZW1vdmVkLCBtenJ1bi5zd2cgKHdoaWNoCiAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHJ1bnRpbWUgY29kZSkgaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAtIFRoZSBzd2lnX3Byb3h5IHN0cnVjdHVyZSB3YXMgcmVuYW1lZCB0byBzd2lnX216X3Byb3h5LgogICAgICAgICAgICAgIHN3aWdfbXpfcHJveHkgbm93IGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvCiAgICAgICAgICAgICAgc3RydWN0dXJlLiAgCgoJICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kCiAgICAgICAgICAgICAgU1dJR1RZUEUgJi4KCgkgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gYnkgY2FsbGluZyBzY2hlbWVfYWRkX2ZpbmFsaXplcigpIGhhcwogICAgICAgICAgICAgIGJlZW4gYWRkZWQuCgoJICAgICoqKiBORVcgRkVBVFVSRSBbTXpTY2hlbWVdICoqKgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcHM6IGphdmFkZXN0cnVjdCBhbmQgamF2YWRlc3RydWN0X2Rlcml2ZWQKICAgICAgICAgICAgZm9yIHRoZSBDKysgZGVzdHJ1Y3RvciB3cmFwcGVyLiBUaGUgamF2YWRlc3RydWN0IHZlcnNpb24gZ2V0cyB1c2VkIGJ5CiAgICAgICAgICAgIGNsYXNzZXMgYXQgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBjaGFpbiBhbmQgdGhlIGphdmFkZXN0cnVjdF9kZXJpdmVkIAogICAgICAgICAgICB2ZXJzaW9uIGdldHMgdXNlZCBieSBvdGhlciBjbGFzc2VzLgoKICAgICAgICAgICAgW0MjXSBjaWxkaXNwb3NlIGFuZCBjaWxkaXNwb3Nlb3ZlcnJpZGUgdHlwZW1hcHMgcmVwbGFjZWQgYnkKICAgICAgICAgICAgY3NkZXN0cnVjdCBhbmQgY3NkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXBzLiBUaGUgZGVsZXRlKCkKICAgICAgICAgICAgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0cyBmdW5jdGlvbmFsaXR5IHB1dCBpbnRvIHRoZXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGRlc2lnbmVkIGZvciB0aGUgRGlzcG9zZSgpIG1ldGhvZC4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXBzIGNzaW50ZXJmYWNlcyBhbmQgY3NpbnRlcmZhY2VzX2Rlcml2ZWQgcmVwbGFjZQogICAgICAgICAgICB0aGUgamF2YWludGVyZmFjZXMgdHlwZW1hcC4gQWxzbyBmaXhlcyB0aGUgcGVjdWxpYXJpdHkgb2YgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4gaW5kaXZpZHVhbGx5IGRlcml2aW5nIGZyb20gdGhlIElEaXNwb3NhYmxlIAogICAgICAgICAgICBpbnRlcmZhY2UuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwIGNzZmluYWxpemUgZm9yIGZpbmFsaXplcnMuIEMrKyBkZXN0cnVjdG9ycyBhcmUgbm93IGNhbGxlZAogICAgICAgICAgICBieSBnYXJiYWdlIGNvbGxlY3RvciBkdXJpbmcgZmluYWxpemF0aW9uLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBBbmRyZWFzIFNjaPZyay4KCjA2LzEwLzIwMDM6IFRpZ2VyCgkgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSBmb3IgZXJyb3IgbWVzc2FnZSBvdXRwdXQuCiAgICAgICAgICAgIENvbnRyYWN0IGNvZGUgY2FuIG5vdyBwcmludCBvdXQgc2ltcGxlIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgdG8gcHJlcGFyZSBmb3IgaW5oZXJpdGFuY2UKICAgICAgICAgICAgCjA2LzAzLzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFwcGxpZWQgR3VpbGUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkgCgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LiAKCgkgICAgLSBTV0lHIGN1cnJlbnRseSB1c2VzIEd1aWxlJ3MgZ2hfIEFQSSwgd2hpY2ggaXMgbWFya2VkIGFzCgkgICAgICBkZXByZWNhdGVkIGluIEd1aWxlIDEuNiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIEd1aWxlCgkgICAgICAxLjkuICBUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGEgY29tbWFuZC1saW5lIGZsYWcgIi1zY20iCgkgICAgICB3aGljaCBjYXVzZXMgU1dJRyB0byBnZW5lcmF0ZSB3cmFwcGVycyB0aGF0IHVzZSBHdWlsZSdzCgkgICAgICBTQ00gQVBJIGluc3RlYWQ7IHRoaXMgcmVxdWlyZXMgR3VpbGUgPj0gMS42LgoJICAgIAoJICAgIC0gVGhlIExpYi9ndWlsZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgbGFuZ3VhZ2UgbW9kdWxlczogZ3VpbGVkZWMuc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlLnN3ZyBoYXZlIGJlZW4gbW92ZWQgaW50byBndWlsZV9naF9ydW4uc3dnLAogICAgICAgICAgICAgIGd1aWxlLmkgaGFzIGJlZW4gbW92ZWQgdG8gZ3VpbGVfZ2guc3dnLCBndWlsZV9zY20uc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlX3NjbV9ydW4uc3dnIHdoaWNoIGNvbnRhaW4gdGhlIFNDTSBBUEkgc3R1ZmYKICAgICAgICAgICAgICBoYXZlIGJlZW4gYWRkZWQKCgkgICAgLSBnaGludGVyZmFjZS5pLCB3aGljaCBjb250YWlucyB0aGUgZGVmaW5lcyBmcm9tIHRoZSBnaF8KICAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gdGhlIHNjbV9mdW5jdGlvbnMgaGFzIGJlZW4gYWRkZWQKCgkgICAgLSBUaGUgQVBJIGZvciBkZWFsaW5nIHdpdGggcG9pbnRlciBvYmplY3RzIGlzIG5vdwoJICAgICAgU1dJR19Db252ZXJ0UHRyLCBTV0lHX011c3RHZXRQdHIsIFNXSUdfTmV3UG9pbnRlck9iai4KCiAgICAgICAgICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kIFNXSUdUWVBFICYKCiAgICAgICAgICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFIFtHdWlsZV0gKioqCgkgICAgCQowNi8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGltZW5zaW9ubGVzcyBhcnJheXMgc3VjaCBhcyAKCiAgICAgICAgICAgICAgICBpbnQgZm9vW10gPSB7MSwgMn07CiAgICAgICAgICAgICAgICBleHRlcm4gaW50IGJhcltdOwoKICAgICAgICAgICAgcHJvZHVjZSBhIHdhcm5pbmcgdGhhdCB0aGUgdmFyaWFibGUgaXMgcmVhZC1vbmx5LiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSwgdGhpcyB1c2VkIHRvIGNhdXNlIGNvbXBpbGUgZXJyb3JzIG9yIGdlbmVyYXRlIGEgc2V0dGVyIHRoYXQKICAgICAgICAgICAgZ2VuZXJhdGVkIGEgcnVudGltZSBlcnJvci4gQSBzZXR0ZXIgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgICAgICAgICAgIGJlY2F1c2UgdGhlIGFycmF5IHNpemUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgU1dJRy4gQSB2YXJpbiwgZ2xvYmFsaW4gCiAgICAgICAgICAgIG9yIG1lbWJlcmluIHR5cGVtYXAgKGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKSBtdXN0IGJlIHdyaXR0ZW4gCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyLgoKMDUvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWZpbmVtZW50IHRvIGRlZmF1bHQgdHlwZW1hcCBtYXRjaGluZyBhbmQgYXJyYXlzLiAgV2hlbiBhbgogICAgICAgICAgICBhcnJheSBpcyBkZWNsYXJlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgIGludCBmb29bNF07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwIG5vdyByZXNvbHZlcyB0byAKCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW0FOWV0KCiAgICAgICAgICAgIElmIG5vIG1hdGNoIGlzIGZvdW5kIGZvciB0aGF0LCBpdCB0aGVuIHJlc29sdmVzIHRvCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCgogICAgICAgICAgICBJZiBubyBhcnJheSBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgdGhlIFNXSUdUWVBFIFtdIGlzIHVzZWQgcmlnaHQgYXdheS4gCgogICAgICAgICAgICBOb3RlOiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBtYWRlIHRvIHJlc29sdmUgcHJvYmxlbXMgcmVsYXRlZCB0bwogICAgICAgICAgICBhcnJheXMgd2l0aCBhbmQgd2l0aG91dCBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIHNvbWV0aW1lcyBTV0lHCiAgICAgICAgICAgIHdhcyBnZW5lcmF0aW5nIHNldHRlciBmdW5jdGlvbnMgZm9yIGFycmF5IHZhcmlhYmxlcyB3aXRoIG5vIGRpbWVuc2lvbnMKICAgICAgICAgICAgKGFuIGVycm9yKS4gTGlrZXdpc2UsIFNXSUcgc29tZXRpbWVzIG1hZGUgYXJyYXlzIHdpdGggZGltZW5zaW9ucwogICAgICAgICAgICByZWFkLW9ubHkgKGFsc28gYW4gZXJyb3IpLiAgVGhpcyBmaXhlcyB0aGUgYXJyYXlzX2dsb2JhbCB0ZXN0CiAgICAgICAgICAgIHByb2JsZW0uCiAgICAgICAgICAgICAgICAgICAgICAgIAowNS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0eXBlIGhhbmRsaW5nIGJ1ZyB3aXRoIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzLgogICAgICAgICAgICBJZiB5b3UgaGFkIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICAgICAgICBGb28gKmZ1bmMxKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgZnVuYzIoQmFyICZ4KTsKCiAgICAgICAgICAgIFRoZW4gZnVuYzIoKSB3b3VsZG4ndCBhY2NlcHQgb2JqZWN0cyByZXR1cm5lZCBieSBmdW5jMSgpCiAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB0eXBlIGVycm9yLiAgIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpYW4gWWFuZy4KCjA1LzIxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyB0byBzb21lIG9mIHRoZSBWaXN1YWwgQysrIGV4YW1wbGUgcHJvamVjdCBmaWxlcyB3aGljaCB3b3VsZCBub3QgCiAgICAgICAgICAgIHdvcmsgd2l0aCBzcGFjZXMgaW4gdGhlIHBhdGhzIGhlbGQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIHRvIAogICAgICAgICAgICBwb2ludCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlJ3MgbGlicmFyeSAvIGluY2x1ZGUgZGlyZWN0b3J5LgogICAgICAgICAgICBTRiBidWcgIzc0MDc2OQoKMDUvMjEvMjAwMzogIHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWNvbnRyYWN0cyBvcHRpb24uCiAgICAgICAgICAgIEZpcnN0IHRyeSBvZiB0aGUgaWRlYSBvZiAiV3JhcCBieSBDb250cmFjdCI6IAogICAgICAgICAgICBidWlsZCB1cCByZWFsaWFibGUgY3Jvc3MtbGFuZ3VhZ2UgbW9kdWxlIGJ5IHdyYXBwaW5nIHdpdGggU1dJRy4KICAgICAgICAgICAgSW1wbGVtZW50ZWQgYmFzaWMgYXNzZXJ0aW9uCiAgICAgICAgICAgIChwcmVhc3NlcnRpb24gJiBwb3N0YXNzZXJ0aW9uICYgaW52YXJpYW50KQogICAgICAgICAgICBmb3Igc2ltcGxlIEMvQysrIGZ1bmN0aW9ucy4KICAgICAgICAgICAgCiAgICAgICAgICAgIEN1cnJlbnQgZm9ybWF0IG9mIGNvbnRyYWN0cyBhcmU6CiAgICAgICAgICAgICVjb250cmFjdCBjbGFzc19uYW1lIDo6IGZ1bmNfbmFtZSAocGFyYXMuLi4pIHsKICAgICAgICAgICAgcmVxdWlyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcnM7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgZW5zdXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGludmFyaWFudDoKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgkgICAgCQowNS8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgdHdlYWtzLiBUaGVyZSB3ZXJlIGEgZmV3IHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgTWFrZWZpbGUgZm9yIHBhc3Npbmcgb24gdGhlIGNvbW1hbmRsaW5lIHdoZW4gY29tcGlsaW5nLgogICAgICAgICAgICBUaGVzZSBhcmUgbm93IGFsbCBkZWZpbmVkIGluIHN3aWdjb25maWcuaC4gQXV0b2NvbmYgZG9lc24ndCBub3JtYWxseSAKICAgICAgICAgICAgYWxsb3cgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHRvIGJlIGRlZmluZWQgaW4gdGhpcyBjb25maWcgaGVhZGVyIGZpbGUsIAogICAgICAgICAgICBidXQgYW4gYXV0b2NvbmYgYXJjaGl2ZSBtYWNybyBlbmFibGVzIHRoaXMuIFRoaXMgbWFjcm8gYWxvbmcgd2l0aCBmdXR1cmUgCiAgICAgICAgICAgIGF1dG9jb25mIG1hY3JvcyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSBUb29scy9jb25maWcgZGlyZWN0b3J5LgoKICAgICAgICAgICAgJ3N3aWcgLXZlcnNpb24nIG5vdyByZXBvcnRzIHRoZSB0YXJnZXQgYnVpbGQgcGxhdGZvcm0uCgowNS8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBGaXggdG8gdGhlIGZvbGxvd2luZyB0eXBlbWFwczoKCiAgICAgICAgICAgIGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCgogICAgICAgICAgICBUaGVzZSBhcmUgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcvZ2VuZXJhdGluZyBwcm94eSBjbGFzc2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyB3b3VsZCB1c2UgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIG5vdCB0aGUgCiAgICAgICAgICAgIEMrKyB0eXBlLCB3aGljaCB3YXMgaW5jb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIHR5cGVtYXBzLiAKCiAgICAgICAgICAgIEluIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgdGhlIEMrKyBjbGFzcyBuYW1lL3R5cGUgCiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGV4Y2VwdCBmb3IgY2xhc3NlcyBpbiBuYW1lc3BhY2UsIHRlbXBsYXRlZCBjbGFzc2VzIGV0Yy4gc28KICAgICAgICAgICAgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IG1vc3QgY2FzZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBhbmQgQyMgTU9EVUxFUyAqKioKCjA1LzA5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWaXN1YWwgQysrIFByb2plY3QgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICAgIGNhbiBiZSBidWlsdCBvbiBXaW5kb3dzIChmb3IgVGNsLCBQZXJsLCBQeXRob24gYW5kIFJ1YnkpLgoKMDUvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcmV0dXJuIGJ5IHZhbHVlLCBjb25zdCwgYW5kIHByaXZhdGUgY29uc3RydWN0b3JzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICBCKCk7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBCKGNvbnN0IEImKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEIgcmV0dXJuQigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJvYmxlbSBhbmQgcGF0Y2ggc3VnZ2VzdGlvbiByZXBvcnRlZCBieSBCaWxsIEhvZmZtYW4uCgowNC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBTaW5nbGUgYXV0b2NvbmYgaW52b2NhdGlvbiAtIGF1dG9jb25mIGluIHRoZSBUb29scyBkaXJlY3RvcnkgaGFzIGdvbmUuCgogICAgICAgICAgICAtIExpYnRvb2wgYm9vdHN0cmFwcGVkIHdoZW4gcnVubmluZyBhdXRvZ2VuLnNoLiBUaGlzIHJlcXVpcmVzIGFueW9uZQogICAgICAgICAgICAgIHVzaW5nIHRoZSBjdnMgdmVyc2lvbiBvZiBTV0lHIHRvIGhhdmUgbGlidG9vbCBpbnN0YWxsZWQgb24gdGhlaXIKICAgICAgICAgICAgICBtYWNoaW5lLiBTdWdnZXN0IHZlcnNpb24gMS40LjIgb3IgaGlnaGVyLCBwcmVmZXJhYmx5IHRoZSBsYXRlc3QgLSAxLjUuCgogICAgICAgICAgICAtIEF1dG9tYWtlIGlzIG5vdyB1c2VkIHRvIGJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcmllcyBpbiBjb25qdW5jdGlvbiAKICAgICAgICAgICAgICB3aXRoIGxpYnRvb2wuCgogICAgICAgICAgICAtIFJ1bnRpbWUgbGlicmFyaWVzIGFyZSBub3cgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGFzIERMTHMgb24gQ3lnd2luLgoKICAgICAgICAgICAgLSBTa2lwcGluZyBsYW5ndWFnZXMgaXMgbm8gbG9uZ2VyIGp1c3QgZGV0ZXJtaW5lZCBpbiB0aGUgdG9wIGxldmVsIAogICAgICAgICAgICAgIG1ha2VmaWxlIGJ1dCBpbiBjb25maWd1cmUuaW4uIFRoaXMgaW5mbyBpcyB1c2VkIGZvciBidWlsZGluZwogICAgICAgICAgICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBhbmQgZm9yIHJ1bm5pbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgLSBUaGVzZSBjaGFuZ2VzIGhhdmUgZml4ZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3J5IGJ1aWxkcywgdGhhdCBpcwogICAgICAgICAgICAgIGJ1aWxkaW5nIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4gCiAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIGZyb20gbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgYWxzbyB3b3JraW5nLiBBbiBpbml0aWFsCiAgICAgICAgICAgICAgY29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlzIG5vIGxvbmdlciBuZWVkZWQgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgICAgaW4gMDQvMDIvMjAwMyBlbnRyeS4gQSAnbWFrZSBkaXN0Y2xlYW4nIHdpbGwgYmUgbmVlZGVkIGJlZm9yZSBidWlsZGluZwogICAgICAgICAgICAgIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaWYgdGhlIGF1dG90b29scyAKICAgICAgICAgICAgICBoYXZlIGJlZW4gcnVuIGZyb20gdGhpcyB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHNvbWUgcG9pbnQsIGJ1dCAKICAgICAgICAgICAgICBhdXRvY29uZiB3aWxsIHRlbGwgeW91IHRoaXMuIE5vdGUgdGhhdCAnbWFrZSBjaGVjaycgb25seSB3b3JrcyBmcm9tIAogICAgICAgICAgICAgIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHRoZSBtb21lbnQuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzIzNDcxIF0gV3JhcHBlcl9wcmludCgpIGZhaWxzIHdpdGggcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgY29uc3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBoYW5kbGluZyAKICAgICAgICAgICAgZGVzY3JpYmVkIGluIENIQU5HRVMgMDgvMTEvMjAwMi4gICBQcmV2aW91c2x5LCBTV0lHIG1lcmVseQogICAgICAgICAgICBjaGVja2VkIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW4gaW5pdGlhbGl6ZXIgaW4gdGhlIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBOb3csIFNXSUcgYWRkaXRpb25hbGx5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBtZW1iZXIKICAgICAgICAgICAgaXMgY29uc3QuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSBraW5kIG9mIGxpbWl0ZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UsCiAgICAgICAgICAgIGFjdGl2YXRlZCB1c2luZyB0aGUgLW1pbmhlcml0IGNvbW1hbmQtbGluZSBvcHRpb24uIEkndmUgYWxzbyB1cGRhdGVkCiAgICAgICAgICAgIHRoZSAiQysrIEluaGVyaXRhbmNlIiBzZWN0aW9uIG9mIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24gdG8gZGlzY3VzcwogICAgICAgICAgICBob3cgdGhpcyB3b3JrcywgYW5kIGl0cyBsaW1pdGF0aW9ucy4gQWxzbyBhbHNvIG1vZGlmaWVkIHRoZSBtaW5oZXJpdC5pCiAgICAgICAgICAgIHRlc3QgY2FzZSB0byBydW4gYWdhaW5zdCB0aGlzLgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAtZ2xvYmFsbW9kdWxlIGNvbW1hbmQtbGluZSBvcHRpb24gZm9yIHRoZSBSdWJ5CiAgICAgICAgICAgIG1vZHVsZSwgZm9yIHdyYXBwaW5nIHN0dWZmIGludG8gdGhlIGdsb2JhbCBtb2R1bGUgKEtlcm5lbCkgaW5zdGVhZAogICAgICAgICAgICBvZiBhIG5lc3RlZCBtb2R1bGUuIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KCjA0LzIzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHN5bW5hbWUgZXJyb3IgaW4gZGlyZWN0b3IgY2FsbHMgdG8gUHl0aG9uIG1ldGhvZHMKCSAgICB0aGF0IGV4dGVuZCBDKysgb3BlcmF0b3JzLgoKCSAgICBTdG9wcGVkIGRpcmVjdG9yIGRlc3RydWN0b3Igd3JhcHBlcnMgZnJvbSBjYWxsaW5nIF9fc2V0X3VwLAoJICAgIHdoaWNoIHdhcyBsZWF2aW5nIHRoZSBkaXJlY3RvciBmbGFnIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KCjA0LzIzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIG5hbWVzcGFjZSByZXNvbHV0aW9uIGFuZCBuZXN0ZWQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWxmcmVkIExvcmJlciAoYW5kIE1hcmNlbG8gTWF0dXMpLgoKMDQvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFBhdGNoIGZvciBKYXZhIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRvIHJ1biBvbiBNYWMgT1MgWC4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBJbmNvcnBvcmF0ZWQgTm9idSBOYWthZGEncyBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIHRoZSBSdWJ5CiAgICAgICAgICAgIDEuOCBhbGxvY2F0aW9uIGZyYW1ld29yay4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZXBsYWNlZCBhbGwgdXNlcyBvZiB0aGUgZGVwcmVjYXRlZCBTVFIyQ1NUUigpIG1hY3JvIHdpdGggdGhlCiAgICAgICAgICAgIHNhZmVyIFN0cmluZ1ZhbHVlUHRyKCkgbWFjcm8uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgcnVieS10YWxrOjY3MDU5CiAgICAgICAgICAgIGFuZCBmb2xsb3ctdXBzIHRvIHRoYXQgcG9zdC4KCjA0LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHByZXByb2Nlc3NvciBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgI2RlZmluZSBtaW4oeCx5KSAoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSAKICAgICAgICAgICAgICAgIGludCBmKGludCBtaW4pOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2ViYXN0aWVuIFJlY2lvLgoKMDQvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBhIHJ1bnRpbWUgY2hlY2sgdG8gdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSBsaWJyYXJ5IHRvIGNoZWNrIAogICAgICAgICAgICB0aGF0IHRoZSBKYXZhIGFycmF5IHBhc3NlZCBpbiBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBDIGFycmF5IGFuZCB0aHJvdyBhbiAKICAgICAgICAgICAgZXhjZXB0aW9uIGlmIG5vdC4KCiAgICAgICAgICAgIEFsc28gZml4IHRvIHVzZSBkZWxldGUgaW5zdGVhZCBvZiBmcmVlIGZvciBhcnJheXMgY3JlYXRlZCB1c2luZyBuZXcuCgowNC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmVtb3ZlIEdDQzMgd2FybmluZyB3aGVuIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGU6CgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGNoYW5naW5nIHNlYXJjaCBvcmRlciBmb3Igc3lzdGVtIGRpcmVjdG9yeSAiL3Vzci9pbmNsdWRlIgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGFzIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIGEgbm9uLXN5c3RlbSBkaXJlY3RvcnkgCgogICAgICAgICAgICBTZWUgU0YgcGF0Y2ggIzcxNTUzMSBzdWJtaXR0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zCgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXByb3ZlZCB3cmFwcGluZyBvZiBlbnVtcyBhbmQgY29uc3RhbnRzLiBUaGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgd3JhcHBlZCBhcyBDIyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gY29uc3RhbnRzLiBFaXRoZXIgdGhlc2UgYXJlIHdyYXBwZWQKICAgICAgICAgICAgYXMgcmVhZG9ubHkgKHJ1bnRpbWUpIGNvbnN0YW50cyBvciBjb21waWxlIHRpbWUgY29uc3RhbnRzLCBkZXBlbmRpbmcgb24KICAgICAgICAgICAgdGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIChUaGUgZGlyZWN0aXZlIGlzIGxpa2VseSB0byBjaGFuZ2UgbmFtZSBzb29uKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGUgd3JhcHBpbmc6CiAgICAgICAgICAgICAgJWphdmFjb25zdCgwKTsKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAyMgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgWFlaOwogICAgICAgICAgICAgICNkZWZpbmUgWFlaIDMzCiAgICAgICAgICAgIGlzIG5vdzoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGludCBBQkMgPSBleGFtcGxlUElOVk9LRS5nZXRfQUJDKCk7CiAgICAgICAgICAgICAgcHVibGljIGNvbnN0IGludCBYWVogPSAzMzsKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGNvbnN0YW50cyBhbmQgZW51bXMgYXJlIHB1dCBpbiB0aGVpciBvd24gaW50ZXJmYWNlIGNhbGxlZAogICAgICAgICAgICB4eHhDb25zdGFudHMsIHdoZXJlIHh4eCBpcyB0aGUgbW9kdWxlIG5hbWUuIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgYXMgCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIGRlcml2ZSAoaW1wbGVtZW50KSBhIEphdmEgY2xhc3MgZnJvbSB0aGUgeHh4Q29uc3RhbnRzCiAgICAgICAgICAgIGludGVyZmFjZSB0byBpbXByb3ZlIHRoZSBzeW50YXg7IG5hbWVseSB3aGVuIHdyYXBwaW5nOgogICAgICAgICAgICAgIGVudW0ge09ORT0xLCBUV08sIFRIUkVFfTsKICAgICAgICAgICAgYWNjZXNzaW5nIHRoZXNlIGZyb20gYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyB4eHhDb25zdGFudHMgaXMgbmVhdGVyOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSBPTkU7CiAgICAgICAgICAgIHRoYW4gdGhlIHByZXZpb3VzOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSB4eHguT05FOwoKICAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IERhdmUgRHJpYmluLgoKMDQvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGltcHJvdmVtZW50cyBmb3IgbXVsdGlwbGUgYnVpbGRzLiBUaGlzIGFsbG93cyBvbmUgdG8gYnVpbGQKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZSBhbmQgcnVudGltZSBsaWJyYXJpZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMvY29tcGlsZXJzIAogICAgICAgICAgICBldGMgYnkgcnVubmluZyBjb25maWd1cmUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiBUaGlzIGlzbid0IDEwMCUganVzdCAKICAgICAgICAgICAgeWV0IGFuZCB3b24ndCBiZSB1bnRpbCBsaWJ0b29sIGlzIGJldHRlciBjb25maWd1cmVkLi4uIGEgJ2NvbmZpZ3VyZScgYW5kIAogICAgICAgICAgICAnbWFrZSBkaXN0Y2xlYW4nIG5lZWRzIHRvIGJlIHJ1biBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYmVmb3JlIGl0IGFsbCB3b3Jrcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJCAuL2NvbmZpZ3VyZQogICAgICAgICAgICAgICQgbWFrZSBkaXN0Y2xlYW4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzE7IGNkIGNvbmZpZzE7IC4uL2NvbmZpZ3VyZSBDQz1nY2MgQ1hYPWcrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzI7IGNkIGNvbmZpZzI7IC4uL2NvbmZpZ3VyZSBDQz1jYyBDWFg9YysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAKICAgICAgICAgICAgVG8gYmUgaW1wcm92ZWQuIEEgJ21ha2UgY2hlY2snIGRvZXMgbm90IHdvcmsgeWV0IGVpdGhlci4gCgowNC8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4KICAgICAgICAgICAgVGhpcyBzaG93ZWQgdXAgd2hlbiB0cnlpbmcgdG8gdXNlIHN0ZF92ZWN0b3IuaSB3aXRoIHZlY3RvcnMKICAgICAgICAgICAgb2YgcG9pbnRlcnMuCgowMy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciBwYXJhbGxlbCBtYWtlIGJ1aWxkcyBvZiBTV0lHLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIG1ha2UgLWogNAogICAgICAgICAgICBCdWlsZCBmYWlsdXJlIHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlLgoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWxlYXNlZCAxLjMuMTkuCgoKClZlcnNpb24gMS4zLjE5IChNYXJjaCAyOCwgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFZhcmlldHkgb2YgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSAxLjMuMTggcmVsZWFzZSBpbmNsdWRpbmc6CgogICAgICAgICAgICAgICAgLSBTZWdtZW50YXRpb24gZmF1bHQgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICAgIC0gVHlwZW1hcCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBFeHByZXNzaW9uIGV2YWx1YXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBMYXJnZSBtZW1vcnkgbGVhayB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4KClZlcnNpb24gMS4zLjE4IChNYXJjaCAyMywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0d28gcHJvYmxlbXMgd2l0aCB0aGUgJWV4dGVuZCBkaXJlY3RpdmUsIG92ZXJsb2FkaW5nLCBhbmQKICAgICAgICAgICAgdGVtcGxhdGUgZXhwYW5zaW9uLiAgU2VlIHRoZSAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkJyBhbmQKICAgICAgICAgICAgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZF8yJyB0ZXN0cyBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlIGZvcgogICAgICAgICAgICBkZXRhaWxzLgoKMDMvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQWRkZWQgc29tZSB0eXBlbWFwcyBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBTY2hvZXJrIGZvciBoYW5kbGluZwogICAgICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBhcyBwb2ludGVycyBvciBieSByZWZlcmVuY2UuIFRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiBwdXQgaW4gdHlwZW1hcHMuaS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBDKysgc2NvcGluZyBidWcgcmVsYXRlZCB0byBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgRm9vOjpiYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5LCBTV0lHIGp1c3QgdG9zc2VkIG91dCB0aGUgRm9vOjpiYXIoKSBkZWNsYXJhdGlvbi4gTm93LAogICAgICAgICAgICB0aGUgZGVjbGFyYXRpb24gaXMgd3JhcHBlZCBwcm92aWRlZCB0aGF0IHRoZSBwcmVmaXggaXMgZXhhY3RseSB0aGUKICAgICAgICAgICAgc2FtZSBhcyB0aGUgY3VycmVudCBzY29wZSAoaW5jbHVkaW5nIGFueSBlbmNsb3NpbmcgbmFtZXNwYWNlcykuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJydWNlIExvd2VyeS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgNjk2NTE2IF0gRW5hYmxpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcgZm9yIGRhdGEgbWVtYmVyIGFjY2Vzcy4KICAgICAgICAgICAgSW4gc29tZSBjb21waWxlcnMsIGF0dHJpYnV0ZSBhY2Nlc3MgY2FuIGdlbmVyYXRlIGV4Y2VwdGlvbnMuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIG9yZGluYXJpbHkgYXNzdW1lcyB0aGF0IG5vIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuICBUbyBkaXNhYmxlIHRoaXMsCiAgICAgICAgICAgIHVzZSB0aGUgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCB4OyAgICAgLyogRXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgWWFrb3YgTWFya292aXRjaC4gCiAKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgUGF0Y2guIFsgNzAxODYwIF0gSW1wcm92ZSBQZXJmb3JtYW5jZSAocHl0aG9uIHByb3hpZXMpLgogICAgICAgICAgICBHaXZlcyBhIHBlcmZvcm1hbmNlIGJvb3N0IHRvIHByb3h5IGNsYXNzIGNvZGUgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHRoZQogICAgICAgICAgICAudGhpcyBhbmQgLnRoaXNvd24gYXR0cmlidXRlcy4gIENvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjAzLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEFkZGVkIG1pc3NpbmcgdmFyYXJnIHN1cHBvcnQuCgowMy8xOC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBSZW1vdmVkIGNvZGUgcmVsYXRlZCB0byB0YWdnaW5nIGluZGl2aWR1YWwgbWV0aG9kcyBmb3IgZGlyZWN0b3JzLgoJICAgIFRoZSBjb25jZXB0IG9mIGhhdmluZyBkaXJlY3RvcnMgZm9yIHNvbWUgYnV0IG5vdCBhbGwgdmlydHVhbCBtZXRob2RzCgkgICAgb2YgYSBjbGFzcyBpcyBkZWVwbHkgZmxhd2VkLiAgVGhlICVmZWF0dXJlKCJub2RpcmVjdG9yIikgdGFnIGlzIGFsc28KCSAgICBnb25lLiAgCgkgICAgCgkgICAgRGlyZWN0b3JzIGFyZSBvZmYgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtIGZvciBhIGNsYXNzLCBpc3N1ZQoJICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIGNsYXNzbmFtZTsgd2hpY2ggd2lsbCBjcmVhdGUgZGlyZWN0b3IgbWV0aG9kcwoJICAgIGZvciBldmVyeSB2aXJ0dWFsIG1ldGhvZCBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBjbGFzcy4KCjAzLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHBhc3NpbmcgYXJndW1lbnRzIG9mIHR5cGUgZnVuY3Rpb24uICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oaW50IHgoaW50LCBpbnQpKTsKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90IHgpOwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zLCB0aGlzIHdvdWxkIHByb2R1Y2UgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuICBOb3csCiAgICAgICAgICAgIFNXSUcgbWVyZWx5IGFkZHMgYW4gZXh0cmEgcG9pbnRlciwgbWFraW5nIHRoZXNlIGRlY2xhcmF0aW9ucyB0aGUgc2FtZQogICAgICAgICAgICBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oaW50ICgqeCkoaW50LCBpbnQpKTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgKngpOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2FydGggQnVzaGVsbC4KCjAzLzE3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciBkaXJlY3RvciBiYXNlIGNsYXNzIGNhbGxzIHRoYXQgaGF2ZSBubwogICAgICAgICAgICByZXR1cm4gdmFsdWUuCgowMy8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnN0IHNtYXJ0LXBvaW50ZXIgd3JhcHBpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBvbmx5ICJ4IiBhbmQgImJhciIgYXJlIHZpc2libGUgZnJvbSBCbGFoIChzaW5jZSBhcHBsaWNhdGlvbgogICAgICAgICAgICBvZiBzcGFtIHZpb2xhdGVzIGNvbnN0bmVzcykuICBNb3Jlb3ZlciwgYWNjZXNzIHRvICJ4IiBpcyByZWFkLW9ubHkuCiAgICAgICAgICAgCjAzLzE1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENsZWFuZWQgdXAgdHdvIHNpZ25lZCB2ZXJzdXMgdW5zaWduZWQgY29tcGFyaXNvbnMgaW4gcHl0aG9uL3N0ZF92ZWN0b3IuaS4KCSAgICAKMDMvMTUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gR2xvYmFsIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgZ2V0IGFuZCBzZXQgbWV0aG9kcy4KICAgICAgICAgICAgTWVtYmVyIHZhcmlhYmxlIHdyYXBwaW5nIGJ1ZyBmaXhlcywgZm9yIGV4YW1wbGUgd3JhcHBpbmcgcG9pbnRlcnMgd29yayBub3cuCiAgICAgICAgICAgIFR5cGVtYXBzIGFyZSB1c2VkIGZvciBhbGwgdmFyaWFibGUgd3JhcHBpbmcgdG8gZ2VuZXJhdGUgdGhlIHByb3BlcnR5IGNvZGUuCgowMy8xMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgdmlydHVhbCBtZXRob2QgdW5yb2xsaW5nIGZvciBkaXJlY3RvcnMuIAoJICAgIFRoZSBvcmRlciBvZiB1bnJvbGxpbmcgaXMgbm93IGZyb20gYmFzZSB0byBkZXJpdmVkLCB0byBlbnN1cmUKCSAgICB0aGF0IHRoZSBtb3N0IGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBkaXJlY3RvciBtZXRob2QgaXMKCSAgICBmb3VuZC4KCgkgICAgRGlyZWN0b3IgbWV0aG9kcyBmb3IgcHVyZSB2aXJ0dWFsIG1ldGhvZHMgbm93IHRocm93CgkgICAgRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTiBpZiBfdXAgaXMgc2V0LgoKMDMvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gUG9seW1vcnBoaXNtIGZpeDogdmlydHVhbCBmdW5jdGlvbnMgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgQyMgcHJveHkgY2xhc3MsIHZpcnR1YWwgb3Igb3ZlcnJpZGUuCiAgICAgICAgICAgIFNvbWUgJ3VzaW5nIFN5c3RlbTsnIHN0YXRlbWVudCBmaXhlcyBuZWVkZWQgYnkgdGhlIE1vbm8gY29tcGlsZXIuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIFN3aWdWYWx1ZVdyYXBwZXI8PiB0bwogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcnVjZSBMb3dlcnkuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAkZGVzY3JpcHRvcih0eXBlKSB2YXJpYWJsZSBpcyBub3cgZXhwYW5kZWQgaW4gY29kZSBzdXBwbGllZCB0bwogICAgICAgICAgICAlZXh0ZW5kLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4ga2luZHMgb2YgYWR2YW5jZWQgd3JhcHBpbmcgCiAgICAgICAgICAgIChlc3BlY2lhbGx5IGNvbnRhaW5lciBjbGFzc2VzKS4KCjAzLzExLzIwMDM6IGx1aWdpCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHN0ZDo6bWFwLgogICAgICAgICAgICAoYSkgSW50ZWdyYXRpb24gd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGEgbGEgc3RkOjp2ZWN0b3IpIGZvcgogICAgICAgICAgICAgICAgUHl0aG9uLCBSdWJ5LCBNelNjaGVtZSwgYW5kIEd1aWxlOwogICAgICAgICAgICAoYikgU2ltcGxlIHdyYXBwZXIgZm9yIG90aGVyIGxhbmd1YWdlcwoKMDMvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICBTV0lHCiAgICAgICAgICAgIHdhc24ndCBwYXJzaW5nIGNlcnRhaW4gb2N0YWwgY29kZXMgY29ycmVjdGx5LgoKMDMvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2Ygc3VidGxlIHByZXByb2Nlc3NvciBwcm9ibGVtcyByZXBvcnRlZCBieQogICAgICAgICAgICBTZWJhc3RpZW4gUmVjaW8uCgogICAgICAgICAgICAoYSkgRW1wdHkgcHJlcHJvY2Vzc29yIHZhbHVlcyBubyBsb25nZXIgZ2VuZXJhdGUgImJhZCBjb25zdGFudAogICAgICAgICAgICB2YWx1ZSIgZXJyb3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTwogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBCQVIKCiAgICAgICAgICAgIChiKSBNYWNybyBuYW1lcyBjYW4gbm93IHNwYW4gbXVsdGlwbGUgbGluZXMgKHRlY2huaWNhbGx5IHZhbGlkLAogICAgICAgICAgICBhbHRob3VnaCBxdWVzdGlvbmFibGUgcHJhY3RpY2UpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEFfTE9OR19NQUNST19cCiAgICAgICAgICAgICAgICAgIE5BTUUgNDIKCiAgICAgICAgICAgIChjKSBXaGl0ZXNwYWNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBiZWZvcmUgY2VydGFpbiBtYWNybyB2YWx1ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08iSGVsbG8iCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQkFSXAogICAgICAgICAgICAgICAgICAiSGVsbG8iCiAKMDMvMDcvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZW1hcHMKICAgICAgICAgICAgaW4gdGhlIExpYi9ydWJ5L3R5cGVtYXBzLmkgbGlicmFyeSBmaWxlLgoKMDMvMDcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2NhbGxiYWNrIHRvIGRlbW9zdHJhdGUgaG93IGRpcmVjdG9ycyBjYW4KCSAgICBiZSB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3MgaW4gUHl0aG9uCgkgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2V4dGVuZCB0byBkZW1vbnN0cmF0ZSB2aXJ0dWFsIG1ldGhvZAoJICAgIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiAocmVhbGx5IHRoZSBzYW1lIGFzIHRoZSBjYWxsYmFjawoJICAgIGV4YW1wbGUsIGp1c3QgYSBkaWZmZXJlbnQgY29udGV4dCkuCgkgICAgQWRkZWQgZm91ciB0ZXN0cyBmb3IgdmVyeSBiYXNpYyBkaXJlY3RvciBmdW5jdGlvbmFsaXR5LiAgVGhlc2UKCSAgICBoYXZlIHJ1bnRpbWUgdGVzdHMgdW5kZXIgcHl0aG9uLgoJICAgIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbWl0cyAjZGVmaW5lIFNXSUdfRElSRUNUT1JTIG5lYXIgdGhlCgkgICAgdG9wIG9mIHRoZSBvdXRwdXQgZmlsZSBpZiBkaXJlY3RvcnMgYXJlIGVuYWJsZWQuICBUaGlzIGlzIHVzZWZ1bAoJICAgIGZvciBkaXNhYmxpbmcgcGFydHMgb2YgdGVzdHMgaW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvbid0CgkgICAgc3VwcG9ydCBkaXJlY3RvcnMuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIHNlY3Rpb24gdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbCBvbiBjcm9zcyBsYW5ndWFnZQoJICAgIHBvbHltb3JwaGlzbSAoZGlyZWN0b3JzKS4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFRoZSBzaG9ydC1saXZlZCAiLWZkaXJlY3RvcnMiIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgVG8gZW5hYmxlIGRpcmVjdG9ycywgaW5zdGVhZCB1c2UgdGhlIGV4dGVuZGVkICVtb2R1bGUgCgkgICAgZGlyZWN0aXZlIGFzIGZvbGxvd3M6CgoJICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIpIG1vZHVsZW5hbWUKCjAzLzA2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgbG9uZyBsb25nIHR5cGVtYXBzIGhhdmUgYmVlbiByZXdyaXR0ZW4gc28gdGhhdCB0aGV5IGNhbiBiZSBtb3JlCiAgICAgICAgICAgIGVhc2lseSB1c2VkIHdpdGggbm9uIElTTyBjb21waWxlcnMsIGxpa2UgVmlzdWFsIEMrKy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgaWYgeW91IGFyZSB3cmFwcGluZyB0aGUgV2luZG93cyA2NCBiaXQgdHlwZSBfX2ludDY0IHRoZSBsb25nIGxvbmcKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHk6CgogICAgICAgICAgICAgICAgJWFwcGx5IGxvbmcgbG9uZyB7IF9faW50NjQgfTsKICAgICAgICAgICAgICAgIF9faW50NjQgdmFsdWUxKF9faW50NjQgeCk7CgogICAgICAgICAgICBfX2ludDY0IHdpbGwgbm93IGFwcGVhciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgaW5zdGVhZCBvZiBsb25nIGxvbmcuCiAgICAgICAgICAgIAowMy8wNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgQ0hBTkdFICoqKgogICAgICAgICAgICBTd2lnIG1vZHVsZSBtdXRhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgV2hlbiBhIGxhbmd1YWdlCiAgICAgICAgICAgIGNsYXNzIG1ldGhvZCB3YW50cyB0byBzYXZlIG5vZGUgYXR0cmlidXRlcywgaXQgbm93IHVzZXMgb25lIG9mIHRoZQogICAgICAgICAgICBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCkKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVzZSBmdW5jdGlvbnMgaXMgYSBuYW1lc3BhY2UgaW4gd2hpY2gKICAgICAgICAgICAgc2F2ZWQgYXR0cmlidXRlcyBhcmUgcGxhY2VkLiAgRm9yIGV4YW1wbGUsdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgICBOb2RlICpuOwogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoImNEZWNsYXJhdGlvbiIsbiwidHlwZSIsInBhcm1zIiwibmFtZSIsTklMKTsKCiAgICAgICAgICAgIHNhdmVzIHRoZSBhdHRyaWJ1dGVzIGFzICJjRGVjbGFyYXRpb246dHlwZSIsICJjRGVjbGFyYXRpb246cGFybXMiLAogICAgICAgICAgICBhbmQgc28gZm9ydGguICAgSWYgbmVjZXNzYXJ5LCBhIGxhbmd1YWdlIG1vZHVsZSBjYW4gcmVmZXIgdG8KICAgICAgICAgICAgb2xkIHZhbHVlcyBieSB1c2luZyB0aGlzIHNwZWNpYWwgbmFtZXNwYWNlIHF1YWxpZmllci4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoaXMsIGEgc3BlY2lhbCBhdHRyaWJ1dGUgInZpZXciIGNvbnRhaW5zIHRoZSBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5hbWVzcGFjZSB1c2VkIHRvIHNhdmUgYXR0cmlidXRlcy4gIEluIHRoZSBhYm92ZSAKICAgICAgICAgICAgZXhhbXBsZSwgInZpZXciIHdvdWxkIGhhdmUgdGhlIHZhbHVlICJjRGVjbGFyYXRpb24iLiAgIFRoZSB2YWx1ZQogICAgICAgICAgICBvZiAiY0RlY2xhcmF0aW9uOnZpZXciIHdvdWxkIGhhdmUgdGhlIHByZXZpb3VzIHZpZXcgYW5kIHNvIGZvcnRoLgoKICAgICAgICAgICAgU3dpZ19yZXN0b3JlKG4pIHJlc3RvcmVzIGEgbm9kZSB0byB0aGUgc3RhdGUgYmVmb3JlIHRoZSBsYXN0CiAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpIG9yIFN3aWdfc2F2ZSgpIGNhbGwuCgogICAgICAgICAgICBOb3RlOiAgVGhpcyBjaGFuZ2UgbWFrZXMgaXQgZWFzaWVyIGZvciBsYW5ndWFnZSBtb2R1bGVzIHRvIHJlZmVyCiAgICAgICAgICAgIHRvIG9sZCB2YWx1ZXMgb2YgYXR0cmlidXRlcy4gIAoKCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1lcmdlZCB0aGUgY3Jvc3MtbGFuZ3VhZ2UgcG9seW1vcnBoaXNtIHBhdGNoLiAgV2hlbiBlbmFibGVkLCBDKysgCgkgICAgInByb3h5IiBjbGFzc2VzIChjYWxsZWQgZGlyZWN0b3JzKSBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHNwZWNpZmllZCAKCSAgICBDKysgY2xhc3MuICBEaXJlY3RvcnMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uLCBzaW1pbGFyIAoJICAgIHRvIHRoZSB3YXkgdGhlIHVzdWFsIHByb3h5IChzaGFkb3cpIGNsYXNzZXMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSAKCSAgICBQeXRob24gdG8gQysrLiAgVG9nZXRoZXIsIHRoZXNlIHR3byB0eXBlcyBvZiBwcm94aWVzIGFsbG93IEMrKyAKCSAgICBjbGFzc2VzIHRoYXQgYXJlIGV4dGVuZGVkIGluIFB5dGhvbiB0byBiZWhhdmUganVzdCBsaWtlIG9yZGluYXJ5IAoJICAgIEMrKyBjbGFzc2VzIGFuZCBiZSB1c2VkIGluIEMrKyBsaWtlIG5hdGl2ZSBvYmplY3RzLiAgCgkgICAgCgkgICAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIFRvIGVuYWJsZSBkaXJlY3RvciBzdXBwb3J0LCBzcGVjaWZ5ICctZmRpcmVjdG9ycycgb24gdGhlIFNXSUcgY29tbWFuZAoJICAgIGxpbmUgb3IgaW4gdGhlIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJbiB0aGUgaW50ZXJmYWNlCgkgICAgZmlsZSwgYWRkICVmZWF0dXJlKCJkaXJlY3RvciIpIHRvIGdlbmVyYXRlIGRpcmVjdG9ycyBmb3IgYWxsIGNsYXNzZXMKCSAgICB0aGF0IGhhdmUgdmlydHVhbCBtZXRob2RzLiAgCgkgICAgCgkgICAgU2VlIGh0dHA6Ly9zdG0ubGJsLmdvdi9+dG0yL3N3aWcvUHJveHlEb2MuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgoJICAgIAoKMDMvMDMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHNtYWxsIGdsaXRjaCBpbiB0eXBlbWFwIGxvY2FsIHZhcmlhYmxlIHJlcGxhY2VtZW50LiAgSWYgeW91IGhhZAogICAgICAgICAgICBhIHR5cGVtYXAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSAoJDFfdHlwZSB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAuLi47CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgbm8gb2NjdXJyZW5jZSBvZiAiJDFfdHlwZSIgYXBwZWFyZWQgaW4gdGhlIGJvZHksIHRoZW4gdGhlIGxvY2FsCiAgICAgICAgICAgIHZhcmlhYmxlIHR5cGUgd291bGRuJ3QgYmUgc3Vic3RpdHV0ZWQuCgowMy8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgdmVyc2lvbiBvZiB0aGUgQ1NoYXJwIG1vZHVsZSB3aGljaCBpcyB0eXBlbWFwIGJhc2VkLgogICAgICAgICAgICBJdCBhbHNvIHVzZXMgRUNNQSBDIyBhbmQgbm8gbG9uZ2VyIHVzZXMgTWljcm9zb2Z0IFZpc3VhbCBDKysuTkVUIAogICAgICAgICAgICBnbHVlLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCB3b3JrIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgTmVpbCBDYXdzZS4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTM1NDggXSBlcnJvciBwYXJzaW5nIGNhc3Rpbmcgb3BlcmF0b3IgZGVmaW5pdGlvbi4KICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyBjYXN0aW5nIG9wZXJhdG9ycyBkZWNsYXJlZCBvdXRzaWRlIG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGlubGluZSBBOjpvcGVyYXRvciBjaGFyICooKSB7IC4uLiB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFydGluIENhc2Fkby4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYW5vbnltb3VzIGJpdC1maWVsZHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgICA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA6IDg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFub255bW91cyBiaXQtZmllbGRzIGFyZSBpZ25vcmVkIGJ5IFNXSUcuICAgUHJvYmxlbQogICAgICAgICAgICByZXBvcnRlZCBieSBGcmFueiBI9nBmaW5nZXIuCgowMi8yNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJldHRlciB0eXBlbWFwcyBpbiB0aGUgRXhhbXBsZXMvamF2YS90eXBlbWFwIGV4YW1wbGUgYW5kIGFsc28gCiAgICAgICAgICAgIGZpeGVzIHN1YnRsZSBidWcgd2hlbiB1c2luZyB0aGUgU3RyaW5nQnVmZmVyIHR5cGVtYXBzIG1vcmUgdGhhbiBvbmNlLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0MjExMiBdIENvbnN0YW50cyBjaGFyIGJ1Zy4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzUzMzcgXSBQYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG5vdCBlbnRpcmVseSB3b3JraW5nLgogICAgICAgICAgICBUaGVyZSB3YXMgYSBzdWJ0bGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBuYW1pbmcgYW5kIG9yZGVyaW5nIG9mCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzLiAgTWF0Y2hpbmcgd29ya2VkIG9rYXksCiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgdGVtcGxhdGVzIHdlcmVuJ3QgZXhwYW5kZWQgY29ycmVjdGx5LgoKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcGFyc2luZyAoYW5kIGdlbmVyYXRpbmcgY29kZSkgZm9yIAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIGFycmF5cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBmb28oaW50ICgmeClbMTBdKTsKICAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTM0NyBdIENvbXBpbGF0aW9uIHdhcm5pbmcgZnJvbSBsaWJweS5jLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYW5pZWwgTC4gUmFsbC4KIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB2aXJ0dWFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBjaGVja2luZyBhbmQgdHlwZWRlZi4KCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKmludHB0cjsKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICpmb28oKSA9IDA7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludHB0ciBmb28oKSB7IH07CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyZWF0aW5nIHRoZXNlIGRlY2xhcmF0aW9ucyBhcyBkaWZmZXJlbnQgZXZlbiB0aG91Z2gKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgKHZpYSB0eXBlZGVmKS4KCjAyLzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCByYW5nZSBjaGVja2luZyBmb3IgdGhlIE5VTTJVU0hSVCBtYWNybywgcGVyIFsgNjc1MzUzIF0uCgowMi8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB0aGUgY29kZSB0aGF0IGRldGVybWluZWQgaWYgYSBjbGFzcyBpcyBhYnN0cmFjdAogICAgICAgICAgICBhbmQgY2FuIGJlIGluc3RhbnRpYXRlZC4gICAgSWYgeW91IGhhZCBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgc3RydWN0IEMgOiB2aXJ0dWFsIEEgeyAKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIC8qIE5vdGUgb3JkZXIgb2YgYmFzZSBjbGFzc2VzICovCQogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRCA6IEIsIEMgeyB9OyAgICAvKiBPayAqLwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRSA6IEMsIEIgeyB9OyAgICAvKiBCcm9rZW4gKi8KCiAgICAgICAgICAgIHRoZW4gU1dJRyBkZXRlcm1pbmVkIHRoYXQgaXQgY291bGQgaW5zdGFudGlhdGUgRCgpLCBidXQgbm90IEUoKS4KICAgICAgICAgICAgVGhpcyBpbmNvbnNpc3RlbmN5IGFyb3NlIGZyb20gdGhlIGRlcHRoLWZpcnN0IHNlYXJjaCBvZiB0aGUgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0byBsb2NhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMuICAgVGhpcyBwcm9ibGVtIHNob3VsZCBub3cgYmUgZml4ZWQtLS1TV0lHIHdpbGwgYXR0ZW1wdAogICAgICAgICAgICB0byBsb2NhdGUgYW55IHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIGEgdmlydHVhbCBtZXRob2QgYnkKICAgICAgICAgICAgdHJhdmVyc2luZyBvdmVyIHRoZSBlbnRpcmUgaGllcmFyY2h5LgoKMDIvMjIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHVzaW5nIGVudW0gdHlwZW1hcHMuIFRoZSBKYXZhIGZpbmFsIHN0YXRpYyB2YXJpYWJsZSB0eXBlCiAgICAgICAgICAgIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGpzdHlwZSB0eXBlbWFwLCBlbmFibGluZyBlbnVtcyB0byBiZSBtYXBwZWQgdG8gCiAgICAgICAgICAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGludC4gQnVnIHJlcG9ydGVkIGJ5IEhlaW5lciBQZXRpdGguCgowMi8yMS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIENTaGFycCAoQyMpIG1vZHVsZSBwcm90b3R5cGUKICAgICAgICAgICAgaS5lLiBjc2hhcnAuY3h4ICYgY3NoYXJwLmggYXQgU291cmNlL01vZHVsZXMvLgogICAgICAgICAgICBUaGV5IGFyZSBmb3IgdGVzdCB1c2FnZSBvbmx5IG5vdyBhbmQgbmVlZCBpbXByb3ZlbWVudC4KICAgICAgICAgICAgVGhlIGludGVyZmFjZSBhbHNvIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgCjAyLzIwLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgd2l0aCAtZnZpcnR1YWwuCiAgICAgICAgICAgIFNpbWlsYXIgYXMgYmVhemxleSdzIG1vZGlmaWNhdGlvbiB0b2RheS4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZ2NjLXN0eWxlIHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICAKICAgICAgICAgICAgUGF0Y2ggWyA2MjMyNTggXSBHQ0Mtc3R5bGUgdmFyYXJnIG1hY3JvIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZSBNYXNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgY2xhc3NlcyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKGludCB4KSA9IDA7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKEludGVnZXIgeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyBnZXR0aW5nIGNvbmZ1c2VkIGFib3V0IHRoZSBsYXR0ZXIgbWV0aG9kLS0tbWFraW5nIEJhcgogICAgICAgICAgICBhYnN0cmFjdC4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVqYXZhY29uc3QoZmxhZykgY2FuIGFsc28gYmUgdXNlZCBvbiBlbnVtcyBhcyB3ZWxsIGFzIGNvbnN0YW50cy4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGVuYWJsZXMgdHJ1ZSBKYXZhIGNvbXBpbGVyIGNvbnN0YW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIAogICAgICAgICAgICB1c2VkIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuIFRoYW5rcyB0byBIZWluZXIgUGV0aXRoIGZvciBwYXRjaGVzLgoKMDIvMTkvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBNb2RpZmllZCAtZmNvbXBhY3QgZmVhdHVyZSB0byBkZWFsIHdpdGggUFAgbGluZXMKCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODkwNDAgXSBNaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvYmVydCBILiBkZSBWcmllcy4KCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBmZXcgZXZpbCBzY29waW5nIHByb2JsZW1zIHdpdGggdGVtcGxhdGVzLCBuYW1lc3BhY2VzLCBhbmQgdGhlCiAgICAgICAgICAgICVleHRlbmQgZGlyZWN0aXZlLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCgowMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW1J1YnldIEltcHJvdmVkIHN1cHBvcnQgZm9yIFZpc3VhbCBDKysgYW5kIG90aGVyIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4gCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc3BlY2lmeSAiL0VYUE9SVDpJbml0Xzxtb2R1bGU+Iiwgd2hlcmUgPG1vZHVsZT4gaXMgdGhlCiAgICAgICAgICAgIHN3aWcgbW9kdWxlIG5hbWUgd2hlbiBsaW5raW5nIHVzaW5nIHRoZXNlIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4KCjAyLzE1LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWZ2aXJ0dWFsIG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIHJlZGlmaW5lZCB2aXJ0dWFsIGZ1bmN0aW9uIGluIGNoaWxkcmVuIGNsYXNzZXMuCgogICAgICAgICAgICBNb2RpZmllZCAtY29tcGFjdCBvcHRpb24gdG8gLWZjb21wYWN0IG9wdGlvbgoKICAgICAgICAgICAgQWRkZWQgLXNtYWxsIG9wdGlvbi4KICAgICAgICAgICAgLXNtYWxsID0gLWZ2aXJ0dWFsIC1mY29tcGFjdAogICAgICAgICAgICBBbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGZ1dHVyZSBmZWF0dXJlIG9wdGlvbnMsCiAgICAgICAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIHJlZHVjZSB3cmFwcGVyIGZpbGUgc3ppZS4KCiAgICAgICAgICAgIEFkZGVkIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hlY2suCiAgICAgICAgICAgIFRvIGR5bmFtaWNhbGx5IHNldCB0aGUgZmVhdHVyZSBvcHRpb25zIHN1Y2ggYXMgLWZjb21wYWN0ICYgLWZ2aXJ0dWFsCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAyLzEzLzIwMDM6IGxlbnoKICAgICAgICAgICAgVXBkYXRlZCBEb2MvTWFudWFsL1Blcmw1Lmh0bWwgdG8gdGFsayBhYm91dCBDKysgY29tcGlsZSBwcm9ibGVtcwogICAgICAgICAgICBjb25maWd1cmUuaW4gbm93IGNoZWNrcyBmb3IgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBSdW50aW1lL01ha2VmaWxlLmluIGFuZCBFeGFtcGxlL01ha2VmaWxlLmluIG5vdyB1c2UgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBBZGRlZCBMaWIvcGVybDUvbm9lbWJlZC5oIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUga25vd24gbWFjcm8gY29uZmxpY3RzCgowMi8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg1NDEwIF0gQysrIEV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gY2F1c2VzIFNXSUcgdG8gZXhpdC4KICAgICAgICAgICAgRml4ZXMgYSBzeW50YXggZXJyb3Igd2l0aCBkZWNsYXJhdGlvbnMgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgaW5zdGFudGlhdGlvbiBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlLgogICAgICAgICAgICBXZSBtaWdodCBkbyBtb3JlIGxhdGVyLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIFdpbGxpYW1zb24uCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmV3cm90ZSBib29sIHR5cGVtYXBzIHRvIHJlbW92ZSBwZXJmb3JtYW5jZSB3YXJuaW5nIGZvciBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgVmlzdWFsIEMrKy4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHdyYXBwaW5nIHJlZmVyZW5jZSB2YXJpYWJsZXMgKGNvbnN0IG5vbi1wcmltaXRpdmUgYW5kIGFsbCBub24tY29uc3QgdHlwZXMpIAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBpbnQmIGk7CiAgICAgICAgICAgICAgQ2xhc3MmIGM7CiAgICAgICAgICAgICAgY29uc3QgQ2xhc3MmIGM7CgowMi8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG1vcmUgdmVyeSBzdWJ0bGUgcHJlcHJvY2Vzc29yIGNvcm5lciBjYXNlcyByZWxhdGVkIHRvIHJlY3Vyc2l2ZQogICAgICAgICAgICBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGNhdCh4LHkpIHggIyMgeQoKICAgICAgICAgICAgICAgICAgIGNhdChjYXQoMSwyKSwzKSAgICAvLyBQcm9kdWNlczogY2F0KDEsMikzCiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgeGNhdCh4LHkpIGNhdCh4LHkpCgogICAgICAgICAgICAgICAgICAgeGNhdCh4Y2F0KDEsMiksMykgIC8vIFByb2R1Y2VzIDEyMwoKICAgICAgICAgICAgU2VlIEsmUiwgMm5kIEVkLiBwLiAyMzEuCgowMi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA2ODM4ODIgXSAtIHBhdGNoIHN1Ym1pdHRlZCBieSBGLiBQb3N0bWEgZm9yIFNXSUcgdG8gY29tcGlsZSBvbiBIUC1VWC4KCjAyLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByZXByb2Nlc3NvciBhcmd1bWVudCBleHBhbnNpb24gYnVnLiBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTAvMjAwMzogc29uZ3lhbmYKICAgICAgICAgICAgQWRkZWQgLWNvbXBhY3Qgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgY29tbWVudHMgYW5kIGNvbWJpbmluZyBzaG9ydCBsaW5lcy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTEzNTUgXSBTeW50YXggZXJyb3Igd2l0aCBjc3RyaW5nLmkKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgT21yaSBCYXJlbC4KCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NjM2MzIgXSBpbmNvbXBhdGliaWxpdHkgd2l0aCBzdGFuZGFyZCBjcHAuCiAgICAgICAgICAgIFRoaXMgaXMgYSByZWZpbmVtZW50IHRoYXQgZml4ZXMgdGhpcyBwcm9ibGVtOgoKICAgICAgICAgICAgICAgICAvLyBTb21lIG1hY3JvIHdpdGggYW4gYXJndW1lbnQKICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyh4KSAgICAgICB4CgogICAgICAgICAgICAgICAgIGludCBGT087ICAgICAgICAvKiBOb3QgYSBtYWNyby0tLW5vIGFyZ3VtZW50cyAqLwogCjAyLzA1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzU0OTEgXSBwYXJzZSBlcnJvciB3aXRoIGdsb2JhbCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbi4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEplcmVteSBZYWxsb3AuCgowMi8wNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB2YXJhcmdzIHByb2Nlc3NpbmcgaW50cm9kdWNlZCBieSB0aGUgbnVtaW5wdXRzIHR5cGVtYXAgcGFyYW1ldGVyLgoKMDEvMDgvMjAwMzogdHRuCgkgICAgW3htbF0gRml4IHN0cmluZy1yZXBsYWNlbWVudCBvcmRlcmluZyBidWdsZXQuCgkgICAgVGhhbmtzIHRvIEdhcnkgSGVycm9uLgoKMTIvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZ1cnRoZXIgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBUaGUgU1dJRyBleGVjdXRhYmxlIGlzIG5vdyBidWlsdCB1c2luZyBhIHNpbmdsZSBNYWtlZmlsZS4KICAgICAgICAgICAgLSBUaGlzIG1ha2VmaWxlIGlzIGdlbmVyYXRlZCBieSBBdXRvbWFrZSAoU291cmNlL01ha2VmaWxlLmFtKS4KICAgICAgICAgICAgLSBEZXBlbmRlbmN5IHRyYWNraW5nIGFuZCB0YWdzIHN1cHBvcnQgYXJlIGluIHRoaXMgbWFrZWZpbGUuCiAgICAgICAgICAgIC0gQXV0b21ha2UgMS43LjIgYW5kIEF1dG9jb25mIDIuNTQgbWluaW11bSB2ZXJzaW9ucyBhcmUgbmVlZGVkIHRvIGJ1aWxkIFNXSUcgZnJvbSBDVlMuCiAgICAgICAgICAgIC0gUnVubmluZyAuL2F1dG9nZW4uc2ggbm93IGluc3RhbGxzIEF1dG9jb25mL0F1dG9tYWtlIHN1cHBvcnQgZmlsZXMgaW50bwogICAgICAgICAgICAgIFRvb2xzL2NvbmZpZyBhbmQgdGhlc2UgZmlsZXMgYXJlIG5vIGxvbmdlciBzdG9yZWQgaW4gQ1ZTLgogICAgICAgICAgICAtIEJ1ZyBmaXhlcyBpbiAnbWFrZSBpbnN0YWxsJyBmb3Igc3lzdGVtcyB1c2luZyAuZXhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGFuZAogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1yZWxlYXNlLXN1ZmZpeD13aGF0ZXZlcgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vcmUgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBBdXRvY29uZidzIEFDX0NBTk9OSUNBTF9IT1NUIHJlcGxhY2VzIHByb3ByaWV0YXJ5IGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgYnVpbGQgaG9zdC4KICAgICAgICAgICAgLSBBdXRvY29uZiBzdXBwb3J0IGZpbGVzIG1vdmVkIHRvIFRvb2xzL2NvbmZpZy4KCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIHJ1biBvbiBNYWNPUywgc3VibWl0dGVkIGJ5IEJlcm5hcmQgRGVzZ3JhdXBlcy4KICAgICAgICAgICAgTWFpbmx5IGVuc3VyaW5nIGdlbmVyYXRlZCBmaWxlcyBhcmUgb3V0cHV0IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZm9yCiAgICAgICAgICAgIHNvbWUgbW9kdWxlcy4KCjEyLzExLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWYXJpb3VzIGJ1aWxkIG1vZGlmaWNhdGlvbnMgYW5kIGJ1ZyBmaXhlczoKICAgICAgICAgICAgLSBTaW1wbGlmaWNhdGlvbiBvZiB2ZXJzaW9uIHN0cmluZy4gVXNlIGF1dG9jb25mJ3MgUEFDS0FHRV9WRVJTSU9OIGluc3RlYWQuCiAgICAgICAgICAgIC0gQnVpbGQgdGltZSByZW1vdmVkIGZyb20gU1dJRyB2ZXJzaW9uLgogICAgICAgICAgICAtIFVzaW5nIHN0YW5kYXJkIGF1dG9jb25mIGNvbmZpZyBoZWFkZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgLSBVcGRhdGVkIG9sZCBhdXRvY29uZiBtYWNyb3MgYXMgcmVwb3J0ZWQgYnkgYXV0b3VwZGF0ZS4KICAgICAgICAgICAgLSBSZW1vdmVkICRwcmVmaXggaW4gYXV0b2NvbmYgZnJvbSBzZWFyY2ggcGF0aHMgYXMgYXV0b2NvbmYgd29uJ3QgZXhwYW5kIHRoZW0uCiAgICAgICAgICAgIC0gU3VidGxlIGJ1ZyBmaXggd2hlcmUgJ21ha2UgcHJlZml4PS9zb21ld2hlcmU7IG1ha2UgY2xlYW47IG1ha2UgcHJlZml4PS9zb213aGVyZS9lbHNlJwogICAgICAgICAgICAgIHByb2R1Y2VkIGFuIGV4ZWN1dGFibGUgdXNpbmcgdGhlIGluY29ycmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtIEFkZGVkIC1sZGZsYWdzIGNvbW1hbmRsaW5lIG9wdGlvbiBmb3IgTXpTY2hlbWUsIE9jYW1sLCBQaWtlIGFuZCBQSFAuCiAgICAgICAgICAgIC0gRml4ZWQgcmVwb3J0aW5nIG9mIGNvbXBpbGVyIHVzZWQgd2hlbiB1c2luZyAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIC0gU1dJRyB3ZWIgYWRkcmVzcyBhZGRlZCB0byAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCgoxMi8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGZpeCB0byBUY2wgZHluYW1pYyBjYXN0IHR5cGVtYXBzLiBSZXBvcnRlZCBieQogICAgICAgICAgICBLcmlzdG9waGVyIEJsb20uCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0ZW1wbGF0ZSBhcmd1bWVudCByZXBsYWNlIGJ1Zy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIENocmlzIEZsYXRsZXkuCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJldmVydGVkIENIQU5HRVMgMDkvMDMvMjAwMiwgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV2YWx1YXRpb24uICBBcmd1bWVudHMKICAgICAgICAgICAgYXJlIG5vdCBldmFsdWF0ZWQgZHVyaW5nIGNvbGxlY3Rpb24sIEsmUiwgcC4gMjMwLgoKMTIvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0OTAyMiBdIENvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggS0FJL0tDQwoKMTIvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHICdyZWwtMS0zJyBDVlMgYnJhbmNoIG1lcmdlZCBiYWNrIGludG8gdGhlIG1haW4gYnJhbmNoLgoKClZlcnNpb24gMS4zLjE3IChOb3ZlbWJlciAyMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjEzOTIyIF0gcHJlcHJvY2Vzc29yIGVycm9ycyB3aXRoIEhBVkVfTE9OR19MT05HLgogICAgICAgICAgICAKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxNTQ4MCBdIG16c2NoZW1lIFNXSUdfTXVzdEdldFB0cl8uCgoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjM1MTE5IF0gU1dJR19jcm9hayBjYXVzZXMgY29tcGlsZXIgd2FybmluZy4KCjExLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHRvIGNsYXNzIG1lbWJlcnMuCgoxMS8xNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE92ZXJsb2FkZWQgQysrIGZ1bmN0aW9ucyB3aGljaCBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBpbiBKYXZhIAogICAgICAgICAgICBvbmNlIGFnYWluIGlzc3VlIGEgd2FybmluZy4KCjExLzE0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSGFuZGxpbmcgb2YgTlVMTCBwb2ludGVycyBpcyBpbXByb3ZlZC4gQSBqYXZhIG51bGwgb2JqZWN0IHdpbGwgbm93CiAgICAgICAgICAgIGJlIHRyYW5zbGF0ZWQgdG8gYW5kIGZyb20gYSBOVUxMIEMvQysrIHBvaW50ZXIgYnkgZGVmYXVsdC4gUHJldmlvdXNseSB3aGVuIAogICAgICAgICAgICB3cmFwcGluZzoKCiAgICAgICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3Mgey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MgKnMpOwoKICAgICAgICAgICAgYW5kIGl0IHdhcyBjYWxsZWQgZnJvbSBKYXZhIHdpdGggbnVsbDoKCiAgICAgICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhudWxsKQoKICAgICAgICAgICAgYSBKYXZhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIEV4dHJhIHR5cGVtYXBzIGhhZCB0byBiZSB3cml0dGVuIGluCiAgICAgICAgICAgIG9yZGVyIHRvIG9idGFpbiBhIE5VTEwgcG9pbnRlciB0byBwYXNzIHRvIGZ1bmN0aW9ucyBsaWtlIHRoaXMgb25lLiBOb3cgdGhlIAogICAgICAgICAgICBkZWZhdWx0IHdyYXBwaW5nIHdpbGwgZGV0ZWN0ICdudWxsJyBhbmQgdHJhbnNsYXRlIGl0IGludG8gYSBOVUxMIHBvaW50ZXIuCiAgICAgICAgICAgIEFsc28gaWYgYSBmdW5jdGlvbiByZXR1cm5zIGEgTlVMTCBwb2ludGVyLCBlZzoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBTb21lQ2xhc3MgKmJhcigpIHsgcmV0dXJuIE5VTEw7IH0KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZW4gdGhpcyB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCBhIFNvbWVDbGFzcyBwcm94eSBjbGFzcyBob2xkaW5nIGEgTlVMTAogICAgICAgICAgICBwb2ludGVyLiBOb3cgbnVsbCBpcyByZXR1cm5lZCBpbnN0ZWFkLiBUaGVzZSBjaGFuZ2VzIGFyZSBzdWJ0bGUgYnV0IHVzZWZ1bC4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlIG9yaWdpbmFsIHR5cGVtYXBzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICQmamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICRqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoKMTEvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBhbmQgc2lnbmF0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAgIG1ldGgoaW50IG1ldGhfcGFyYW0pID0gMDsgCiAgICAgICAgICAgIH07IAogCiAKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfYmFyIDogcHVibGljIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgaW50IG1ldGgoaW50IG1ldGhfcGFyYW1fMSwgaW50IG1ldGhfcGFyYW1fMikgeyByZXR1cm4gMDsgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhYnN0cmFjdF9iYXIgaXMgc3RpbGwgYWJzdHJhY3QuCgogICAgICAgICAgICBGaXhlcyBbIDYyODQzOCBdIERlcml2ZWQgYWJzdHJhY3QgY2xhc3Mgbm90IGFic3RyYWN0LgogICAgICAgICAgICBSZXBvcnRlZCBhbmQgcGF0Y2hlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgbWF0Y2hpbmcgcHJvYmxlbSB3aXRoIHR5cGVtYXBzIGFuZCBhcnJheSBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgICBoYWQgdGhpczoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciBibGFoWzIwXTsKCiAgICAgICAgICAgIGFuZCBhIHR5cGVtYXA6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICAgLi4uICQxX2RpbTAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gJDFfZGltKiB2YXJpYWJsZXMgd2VyZW4ndCBiZSBleHBhbmRlZCBwcm9wZXJseS4gIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYW5rYWogS3VtYXIgR29lbC4KICAgICAgICAgICAgICAgCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBBZGRlZCBhbiBleHBlcmltZW50YWwgbmV3IG1vZHVsZSB0aGF0IGR1bXBzIFNXSUcncyBwYXJzZQoJICAgIHRyZWUgYXMgKENvbW1vbikgTGlzcCBzLWV4cHJlc3Npb25zLiAgVGhlIG1vZHVsZSBpcwoJICAgIGludm9rZWQgd2l0aCBTV0lHJ3MgLXNleHAgY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoZSBvdXRwdXQKCSAgICBjYW4gYmUgcmVhZCBpbnRvIENvbW1vbiBMaXNwLiAgVGhlcmUgaXMgKHByb3RvdHlwZSkKCSAgICBleGFtcGxlIExpc3AgY29kZSB0aGF0IGdlbmVyYXRlcyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQoJICAgIGRlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBLZXZpbiBSb3NlbmJlcmcncyBVRkZJLgoKCSAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIFJlbW92ZWQgZHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mICJjcHBfdGVtcGxhdGVfZGVjbCIgaW4KCSAgICBwYXJzZXIueTsgYmlzb24gMS43NSBjb21wbGFpbmVkLgoKMTEvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHByaW1pdGl2ZSBhcnJheSBoYW5kbGluZyBoYXMgY2hhbmdlZCBsaWtlIGFycmF5cyBvZiBjbGFzc2VzLiAKICAgICAgICAgICAgQyBwcmltaXRpdmUgYXJyYXlzIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBhIEphdmEgYXJyYXkgYnV0IHdpdGggYSBwb2ludGVyIAogICAgICAgICAgICAodHlwZSB3cmFwcGVyIGNsYXNzKS4gQWdhaW4gdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCB0eXBlbWFwcyBoYXZlIGJlZW4gbW92ZWQgaW50byBhcnJheXNfamF2YS5pLCBzbyB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgbWVyZWx5IGluY2x1ZGluZyB0aGlzIGZpbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCgogICAgICAgICAgICBUaGUgYXJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIG5vIGxvbmdlciBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhleSBhcmUgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBpbmNsdWRpbmcgdGhpcyBmaWxlLCB0aHVzIHRoaXMgb2Z0ZW4gdW51c2VkIGNvZGUgaXMgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBzcGVjaWZpY2FsbHkgcmVxdWlyaW5nIHRoaXMgdHlwZSBvZiBhcnJheSBzdXBwb3J0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTEvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIG5lc3RlZCBtb2R1bGUgZGVjbGFyYXRpb25zIChhcyB3YXMKICAgICAgICAgICAgcHJldmlvdXNseSBhZGRlZCBmb3IgdGhlIFBlcmwgbW9kdWxlKS4gU28gYSAlbW9kdWxlIGRpcmVjdGl2ZQogICAgICAgICAgICBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJPdXRlcjo6SW5uZXI6OkZvbyIKCiAgICAgICAgICAgIHdpbGwgbmVzdCBldmVyeXRoaW5nIGFzIChpbiBSdWJ5IGNvZGUpOgoKICAgICAgICAgICAgICAgIG1vZHVsZSBPdXRlcgogICAgICAgICAgICAgICAgICBtb2R1bGUgSW5uZXIKICAgICAgICAgICAgICAgICAgICBtb2R1bGUgRm9vCiAgICAgICAgICAgICAgICAgICAgICAjIHN0dWZmIGdvZXMgaGVyZQogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgIGVuZAogCjExLzA1LzIwMDI6IG1rb2VwcGUgCgkgICAgW016U2NoZW1lXSBBZGQgYW4gYXJndW1lbnQgKC1kZWNsYXJlbW9kdWxlKSB0aGF0IGdlbmVyYXRlcwoJICAgIGNvZGUgdG8gY29ycmVjdGx5IGRlY2xhcmUgYSBwcmltaXRpdmUgbW9kdWxlIGV4dGVuc2lvbi4KCSAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgQnJ1Y2UgQnV0dGVyZmllbGQuCgoxMS8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHBhdGNoIHN1Ym1pdHRlZCBieSBNaWNoYWVsIENhaGlsbCB0byByZW1vdmUgdW51c2VkIHBhcmFtZXRlcgogICAgICAgICAgICB3YXJuaW5ncyBmb3IgdGhlIGplbnYgYW5kIGNscyBwYXJhbWV0ZXJzLiBUaGlzIHBhdGNoIGFsc28gYWxzbyBhbGxvd3Mgb25lCiAgICAgICAgICAgIHRvIHVzZSAidm9pZCIgaW4gdGhlIGpuaSB0eXBlbWFwIGZvciBhbnkgdHlwZSB3aXRob3V0IGNvZGUgYmVpbmcgZ2VuZXJhdGVkCiAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gcmV0dXJuIGEgdmFsdWUuCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFycmF5IGhhbmRsaW5nIGlzIGRpZmZlcmVudC4gQXJyYXlzIG9mIGNsYXNzZXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkCiAgICAgICAgICAgIHdpdGggcHJveHkgYXJyYXlzLCBlZyB3cmFwcGluZwoKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CiAgICAgICAgICAgIAogICAgICAgICAgICB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCB0aGVzZSBKYXZhIGdldHRlcnMgYW5kIHNldHRlcnM6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYW10gdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhbXSBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyB2ZXJ5IGluZWZmaWNpZW50IGFzIHRoZSBlbnRpcmUgYXJyYXkgaXMgY29waWVkIG51bWVyb3VzCiAgICAgICAgICAgIHRpbWVzIG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgZ2V0dGVyIG9yIHNldHRlci4gVGhlc2UgYXJyYXlzIGFyZSBub3cKICAgICAgICAgICAgd3JhcHBlZCB3aXRoIGEgcG9pbnRlciBzbyBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCAKICAgICAgICAgICAgdXNpbmcgYSBwcm94eSBjbGFzczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFggdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFggZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIEFycmF5cyBvZiBlbnVtcyBoYXZlIGFsc28gYmVlbiBzaW1pbGFybHkgY2hhbmdlZC4gVGhpcyBiZWhhdmlvdXIgaXMgbm93IGxpa2UgdGhlIAogICAgICAgICAgICBvdGhlciBTV0lHIGxhbmd1YWdlJ3MgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBhcnJheSBsaWJyYXJ5IHNob3VsZCBiZSB1c2VkIHRvIAogICAgICAgICAgICBhY2Nlc3MgdGhlIG90aGVyIGVsZW1lbnRzLiBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBhY2hpZXZlZCB1c2luZyB0aGUgCiAgICAgICAgICAgIG1hY3JvcyBhbmQgdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICBKQVZBX0FSUkFZU09GQ0xBU1NFUyhYKQogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVHdvIG5ldyB0eXBlbWFwcyBqYXZhaW4gYW5kIGphdmFvdXQgZm9yIGdlbmVyYXRpbmcgdGhlIHByb3h5IGNsYXNzIAogICAgICAgICAgICBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzIG1ldGhvZCBjYWxscyB0byB0aGUgSk5JIGNsYXNzLiBUaGUgbmV3IHR5cGVtYXBzIGFyZSAKICAgICAgICAgICAgcmVhbGx5IHVzZWQgZm9yIHRyYW5zZm9ybWluZyB0aGUganN0eXBlICh1c2VkIGluIHByb3h5IGNsYXNzIGFuZCB0eXBlIHdyYXBwZXIKICAgICAgICAgICAgY2xhc3NlcykgdG8gdGhlIGp0eXBlICh1c2VkIGluIHRoZSBKTkkgY2xhc3MpIGFuZCB2aXNhIHZlcnNhLiBBIGphdmFpbiB0eXBlbWFwCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHdoZW5ldmVyIGFuIGluIHR5cGVtYXAgaXMgd3JpdHRlbiBhbmQgc2ltaWxhcmx5IGphdmFvdXQgZm9yIGFuIG91dAogICAgICAgICAgICB0eXBlbWFwLiBBbiBleGFtcGxlIGlzIHByb2JhYmx5IGJlc3QgdG8gc2hvdyB0aGVtIHdvcmtpbmc6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSBDbGFzcyAiQ2xhc3MuZ2V0Q1B0cigkamF2YWlucHV0KSIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgdW5zaWduZWQgc2hvcnQgIiRqYXZhaW5wdXQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBDbGFzcyAqIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzIHt9OwogICAgICAgICAgICAgICAgICAgIENsYXNzICogYmFyKENsYXNzIGNscywgdW5zaWduZWQgc2hvcnQgdXNoKSB7IHJldHVybiBuZXcgQ2xhc3MoKTsgfTsKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIHByb3h5IGNvZGUgaXMgdGhlbjoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzIGJhcihDbGFzcyBjbHMsIGludCB1c2gpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcyhleGFtcGxlSk5JLmJhcihDbGFzcy5nZXRDUHRyKGNscyksIHVzaCksIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTb21lIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW50cm9kdWNlZCBpbiBvcmRlciB0byB1c2UgdGhlc2UgdHlwZW1hcHMuCiAgICAgICAgICAgIEhlcmUgJGphdmFpbnB1dCBoYXMgYmVlbiByZXBsYWNlZCBieSAnY2xzJyBhbmQgJ3VzaCcuICRqbmljYWxsIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IAogICAgICAgICAgICB0aGUgbmF0aXZlIG1ldGhvZCBjYWxsLCAnZXhhbXBsZUpOSS5iYXIoLi4uKScgYW5kICRvd25lciBoYXMgYmVlbiByZXBsYWNlZCBieSAnZmFsc2UnLgogICAgICAgICAgICAkamF2YWlucHV0IGlzIGFuYWxvZ291cyB0byB0aGUgJGlucHV0IHNwZWNpYWwgdmFyaWFibGUuIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgICAgJGpuaWNhbGwgaXMgYW5hbG9nb3VzIHRvICRhY3Rpb24gaW4gJWV4Y2VwdGlvbi4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNhbGwgdG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgJG93bmVyIGlzIHJlcGxhY2VkIGJ5IGVpdGhlciB0cnVlIGlmICVuZXdvYmplY3QgaGFzIGJlZW4gdXNlZCBvdGhlcndpc2UgZmFsc2UuCgogICAgICAgICAgICBUaGUgamF2YS5zd2cgZmlsZSBjb250YWlucyBkZWZhdWx0IGphdmFpbiBhbmQgamF2b3V0IHR5cGVtYXBzIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSBjb2RlCiAgICAgICAgICAgIGFzIHByZXZpb3VzbHkuIFRoaXMgY2hhbmdlIGlzIG9ubHkgb2YgY29uY2VybiB0byB0aG9zZSB3aG8gaGF2ZSB3cml0dGVuIHRoZWlyIG93biB0eXBlbWFwcyBhcwogICAgICAgICAgICB5b3Ugd2lsbCB0aGVuIG1vc3QgbGlrZWx5IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gamF2YWluIGFuZCBqYXZhb3V0IHR5cGVtYXBzLgoKICAgICAgICAgICAgVGhlIGphdmFvdXQgdHlwZW1hcCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBhIEphdmEgZG93bmNhc3QgdG8gYmUgdXNlZCBvbiBhYnN0cmFjdCAKICAgICAgICAgICAgcHJveHkgYmFzZSBjbGFzc2VzLiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBvbiBkeW5hbWljX2Nhc3QuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yNC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFVwZ2FkZWQgdG8gbGlidG9vbCAxLjQuMywgcHJlc3VtYWJseSB3LyBiZXR0ZXIKCSAgICBzdXBwb3J0IGZvciBuZXdpc2ggcGxhdGZvcm1zIChsaWtlIE1hY09TIFgpLgoKMTAvMjEvMjAwMjogdHRuCgkgICAgRml4ZWQgUnVudGltZS9NYWtlZmlsZS5pbiBidWcgLS0gdGhhbmtzIHRvIFJpY2hhcmQgQ2FsbWJhY2guCgoxMC8xOC8yMDAyOiB0dG4KCSAgICBGaXhlZCB0eXBvIGluIGRvaC5oIC0tIHRoYW5rcyB0byBNYXggSG9ybi4KClZlcnNpb24gMS4zLjE2IChPY3RvYmVyIDE0LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kICVmZWF0dXJlIHJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBPcGVuVk1TIGJ1aWxkIGRpcmVjdG9yeSAodm1zKS4gIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBKZWFuLUZyYW7nb2lzIFBpZXJvbm5lLgoKMTAvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgY2xhdXNlIHRvIHRoZSBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgIFRoZSB0aHJvd3MgY2xhdXNlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZ2VuZXJhdGVkIGZvciBwcm94eSBmdW5jdGlvbnMKICAgICAgICAgICAgYW5kIG1vZHVsZSBjbGFzcyBmdW5jdGlvbnMuCgowOS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgYW5kIGNsYXNzZXMgdGhhdAogICAgICAgICAgICB3ZXJlIGRlZmluZWQgYnV0IG5vdCB3cmFwcGVkLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMZXNsaWUgQnJvb2tzLAogICAgICAgICAgICBHZXJyeSBXb29kcywgYW5kIG90aGVycy4KCjA5LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29tZSBlcnJvciBjaGVja2luZyBhZGRlZDoKICAgICAgICAgICAgMSkgT3V0T2ZNZW1vcnlFeGNlcHRpb24gY2hlY2sgaW4gdGhlIGNoYXIgKiB0eXBlbWFwcy4gCiAgICAgICAgICAgIDIpIEFzIFNXSUcgdHJlYXRzIHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwYXNzaW5nIGJ5IHZhbHVlIGFsbCB0aGUKICAgICAgICAgICAgc2FtZSwgaXQgaXMgcG9zc2libGUgdG8gcGFzcyBhIE5VTEwgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cwogICAgICAgICAgICBhbiBvYmplY3QgcGFzc2VkIGJ5IHZhbHVlIG9yIGJ5IHJlZmVyZW5jZS4gQSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyAKICAgICAgICAgICAgbm93IHRocm93biB1bmRlciB0aGlzIHNjZW5hcmlvLgoKMDkvMjAvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjbGVhbiIgYW5kICJtYWtlIGluc3RhbGwiCgkJCSAgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIEV4cGxhaW4gaG93IHRvIGV4dGVuZCAibWFrZSBpbnN0YWxsIiB3LyBleHRyYS1pbnN0YWxsLmxpc3QuCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0aW9uIG9mIHRoZSAiaWdub3JlIiB0eXBlbWFwLiAgIFRoZSAiaWdub3JlIiB0eXBlbWFwIGhhcwogICAgICAgICAgICBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgImluIiB0eXBlbWFwLgogICAgICAgICAgICBUbyBpZ25vcmUgYW4gYXJndW1lbnQsIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApIGludCAqb3V0cHV0IChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24KICAgICAgICAgICAgb2YgdGhlICJpbiIgYW5kICJpZ25vcmUiIHR5cGVtYXBzICh3aGljaCB3ZXJlIHN1cHBvc2VkIHRvIGJlCiAgICAgICAgICAgIG11dHVhbGx5IGV4Y2x1c2l2ZSkuCgogICAgICAgICAgICBUaGUgdXNlIG9mIHRoZSBudW1pbnB1dHMgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgIEN1cnJlbnRseSwgdmFsdWVzID4xIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3IuICBIb3dldmVyLCBmdXR1cmUKICAgICAgICAgICAgcmVsZWFzZXMgb2YgU1dJRyBtYXkgdXRpbGl6ZSB0aGF0IHRvIHN1cHBvcnQgbXVsdGktaW5wdXQgdHlwZW1hcHMuCgogICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIHN0aWxsIHdvcmtzLCBidXQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpcwogICAgICAgICAgICB0cmFuc2xhdGVkIHRvICV0eXBlbWFwKGluLG51bWlucHV0cz0wKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCBmb3IgdW5uYW1lZCBzdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgIH0gKmJsYWg7CgoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUm9nZXIgR2lic29uLgogICAgICAgICAgICBOb3RlOiB3ZSBtaWdodCBiZSBhYmxlIHRvIGdlbmVyYXRlIHdyYXBwZXJzIGluIHNwZWNpYWwgY2FzZXMuCgowOS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIG1vZGlmaWNhdGlvbiB0byBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuICBQb2ludGVyIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIGFsd2F5cyBzZXQgdG8gYW4gaW5pdGlhbCB2YWx1ZSBvZiAwLiAgIFNpbXBsaWZpZXMgdHlwZW1hcCB3cml0aW5nIGFuZCBjbGVhbnVwCiAgICAgICAgICAgIGNvZGUgKHNpbmNlIHlvdSBjYW4gcmVseSBvbiB6ZXJvLXZhbHVlIGluaXRpYWxpemF0aW9uKS4gICBUaGlzIGFsc28gZ3JlYXRseQogICAgICAgICAgICByZWR1Y2VzIHRoZSBuZWVkIHRvIGV2ZXIgd3JpdGUgYW4gImFyZ2luaXQiIHR5cGVtYXAuCgowOS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHNtYXJ0LXBvaW50ZXIgc3VwcG9ydC4gIElmIG9wZXJhdG9yLT4oKQogICAgICAgICAgICBpcyBwYXJ0IG9mIGFuIGlnbm9yZWQgYmFzZSBjbGFzcyBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICVpZ25vcmUgQmFyOwoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgICAgICAgIC8qIElnbm9yZWQgKi8KICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgdGhlbiBtZXRob2RzIGZyb20gRm9vIGFyZSBzdGlsbCBhdmFpbGFibGUuICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkKICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICAgVGhlIG9ubHkgY2F0Y2ggaXMgdGhhdCB0aGUgb3BlcmF0b3ItPigpIGl0c2VsZiBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgICAoc2luY2UgaXQgd2Fzbid0IHdyYXBwZWQpLiAgIFRoZXJlZm9yZSwgdGhlcmUgd29uJ3QgYmUgYW55CiAgICAgICAgICAgICBfX2RlcmVmX18oKSBvcGVyYXRpb24gdW5sZXNzIGl0IGlzIGV4cGxpY2l0bHkgYWRkZWQgdG8gU3BhbQogICAgICAgICAgICAgKGVpdGhlciB1c2luZyAlZXh0ZW5kIG9yIGp1c3QgcGxhY2luZyBvcGVyYXRvci0+KCkgaW4gdGhlCiAgICAgICAgICAgICBkZWZpbml0aW9uIG9mIFNwYW0pLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjaGVjayIgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIERvY3VlbWVudGVkIG1ldGhvZG9sb2d5IGluIE1hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtEb2NzXSBQcmVmaXhlZCBNYW51YWwvKi5odG1sIHdpdGggIjwhRE9DVFlQRSBodG1sIC4uLj4iIHRvCgkgICAgcGFuZGVyIGRvdGluZ2x5IHRvIChvdmVyLSlzZW5zaXRpdmUgZWRpdG9ycy4KCjA5LzEwLzIwMDI6IHR0bgoJICAgIFtHdWlsZV0gQ29udmVydGVkIEV4YW1wbGVzL2d1aWxlL3NpbXBsZSAibWFrZSBjaGVjayIKCSAgICBiZWhhdmlvciB0byBhY3R1YWxseSBjaGVjayBleGVjdXRpb24gcmVzdWx0cy4gIFJlZHVjZWQKCSAgICBpdGVyYXRpb24gY291bnRzIHNvIHRoYXQgdGhlIHRlc3QgZG9lc24ndCB0YWtlIHRvbyBsb25nLgoKMDkvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHLTEuMy4xNSByZWxlYXNlZC4KCgpWZXJzaW9uIDEuMy4xNSAoU2VwdGVtYmVyIDksIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMDkvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBuYXN0eSBydW50aW1lIHR5cGUgY2hlY2tpbmcgYnVnIHdpdGggc3VidHlwZXMgYW5kIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuIAoKMDkvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGV4Y2VwdGlvbiBjbGFzc2VzIGZvciBhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UgY2FuIGJlIGdlbmVyYXRlZCBieSAKICAgICAgICAgICAgc3BlY2lmeWluZyB0aGVtIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgaW4gdGhlIHRocm93cyBhdHRyaWJ1dGUgaW4gYW55IG9uZQogICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiBpbiwgb3V0LCBjaGVjaywgZnJlZWFyZywgYXJnb3V0IGFuZCB0aHJvd3MuIEEgY2xhc3NpYwogICAgICAgICAgICBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50byBhIHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cywgdGhyb3dzPSJqYXZhLmlvLklPRXhjZXB0aW9uIikgZmlsZV9leGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgIGpjbGFzcyBleGNlcCA9IGplbnYtPkZpbmRDbGFzcygiamF2YS9pby9JT0V4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmIChleGNlcCkKICAgICAgICAgICAgICAgICAgICAgICAgamVudi0+VGhyb3dOZXcoZXhjZXAsICQxLndoYXQoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOyAvLyBvciB1c2UgU1dJR19mYWlsCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgZmlsZV9leGNlcHRpb24gey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpIHRocm93KGZpbGVfZXhjZXB0aW9uKTsKCiAgICAgICAgICAgIFRoZSBKYXZhIG1ldGhvZCB3aWxsIHRoZW4gYmUgZGVjbGFyZWQgd2l0aCBhIHRocm93cyBjbGF1c2U6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Li4ufQoKMDkvMDgvMjAwMjogbWtvZXBwZQoJICAqIFtHdWlsZV0gSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGFyZ2xpc3Qgbm8KCSAgICBsb25nZXIgZ2V0cyBjbHV0dGVyZWQgd2l0aCB0eXBlIHNwZWNpZmljYXRpb24sIG1ha2luZyBpdAoJICAgIG1vcmUgcmVhZGFibGUuICAoQWxzbyB0aGUgSUxJU1AgZnVuY3Rpb24gQy11IE0teAoJICAgIGBhcmdsaXN0LWxpc3AnIFJFVCB3b3JrcyBiZXR0ZXIgdGhpcyB3YXkuKSAgVGhlIHR5cGVzIG9mCgkgICAgYXJndW1lbnRzIGFyZSBleHBsYWluZWQgaW4gYW4gZXh0cmEgc2VudGVuY2UgYWZ0ZXIgdGhlCgkgICAgYXJnbGlzdC4gCgkgICAgCgkgICAgVGhlcmUgYXJlIG5vdyB0d28gZG9jdW1lbnRhdGlvbi1yZWxhdGVkIHR5cGVtYXAgYXJndW1lbnRzOgoKCSAgICAgICAgJXR5cGVtYXAoaW4sIGRvYz0iJE5BTUUgaXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMiLCAKCQkJIGFyZ2xpc3Q9IiRuYW1lIikgIGludCAqVkVDVE9SIHsgLi4uIH0KCQkJIAogICAgICAgICAgICBUaGUgImFyZ2xpc3QiIHRleHRzIG9mIGFsbCBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiBtYWtlIHVwCgkgICAgaXRzIGFyZ2xpc3QgaW4gdGhlIGRvY3VtZW50YXRpb24uICBUaGUgImRvYyIgdGV4dHMgb2YgYWxsCgkgICAgYXJndW1lbnRzIGFyZSBjb2xsZWN0ZWQgdG8gbWFrZSBhIHNlbnRlbmNlIHRoYXQgZGVzY3JpYmVzCgkgICAgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuICBSZWFzb25hYmxlIGRlZmF1bHRzIGFyZQoJICAgIHByb3ZpZGVkLiAKCgkgICAgQXMgdXN1YWwsICRuYW1lIGlzIHN1YnN0aXR1dGVkIGJ5IHRoZSBuYW1lIG9mIHRoZQoJICAgIGFyZ3VtZW50LiBUaGUgbmV3IHR5cGVtYXAgdmFyaWFibGUgJE5BTUUgaXMgbGlrZSAkbmFtZSwKCSAgICBidXQgbWFya2VkLXVwIGFzIGEgdmFyaWFibGUuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMKCSAgICB1cHBlci1jYXNlZDsgaW4gVGVYaW5mbyBtb2RlICgiLXByb2Nkb2Nmb3JtYXQgdGV4aW5mbyIpIGl0CgkgICAgY29tZXMgb3V0IGFzIEB2YXJ7bmFtZX0uIAoJICAgIAoJICAgIFRoZSBkaXJlY3RpdmVzICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAgJW11bHRpcGxlX3ZhbHVlcyBub3cgYWxzbyBoYXZlIGFuIGVmZmVjdCBvbiB0aGUKCSAgICBkb2N1bWVudGF0aW9uLiAoVGhpcyBpcyBhY2hpZXZlZCB2aWEgdGhlIG5ldyBwcmFnbWFzCgkgICAgcmV0dXJuX25vdGhpbmdfZG9jLCByZXR1cm5fb25lX2RvYywgcmV0dXJuX211bHRpX2RvYy4pCgoJICAgIERvY3VtZW50YXRpb24gaGFzIGFsc28gaW1wcm92ZWQgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZQoJICAgIHdyYXBwZWQgYXMgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMgKGNvbW1hbmQtbGluZSBzd2l0Y2gKCSAgICAiLWVtaXQtc2V0dGVycyIpLgoKICAgICAgICAgICogW0d1aWxlXSBFbWl0IGNvbnN0YW50cyBhcyBfaW1tdXRhYmxlXyB2YXJpYWJsZXMuICAoVGhpcwogICAgICAgICAgICB3YXMgYnJva2VuIHJlY2VudGx5LikKCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFVwZGF0ZWQgdGhlIHR5cGVtYXBzIGluIGxpc3QtdmVjdG9yLmkuCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgU2hvcnQtY2lyY3VpdCB0aGUgdHlwZWNoZWNrcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMuCgkgICAgKFRoZSBjaGFuZ2VzIGluIGNvZGUgZ2VuZXJhdGlvbiBhcmUgdmlzaWJsZSBpbiB0aGUgbmV3CgkgICAgdGVzdGNhc2UgIm92ZXJsb2FkX2NvbXBsaWNhdGVkIi4pCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbHV0aW9uIGZvciBbIDU5NjQxMyBdCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgd3JhcHBlciBjb25zdHJ1Y3RvciBtb2RpZmllciBjYW4gYmUgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIAogICAgICAgICAgICBwcm90ZWN0ZWQuIE5vcm1hbGx5IFNXSUcgZ2VuZXJhdGVzIGEgY29uc3RydWN0b3IgbGlrZSB0aGlzIHdoaWNoIGNhbiBvbmx5IAogICAgICAgICAgICBiZSBhY2Nlc3NlZCB3aXRoaW4gb25lIHBhY2thZ2U6CgogICAgICAgICAgICAgIHByb3RlY3RlZCBCYXIobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIFNXSUcgYWNyb3NzIG11bHRpcGxlIHBhY2thZ2VzIG9yIHdhbnQgdG8gdXNlIHRoaXMgY29uc3RydWN0b3IKICAgICAgICAgICAgYW55d2F5LCBpdCBjYW4gbm93IGJlIGFjY2Vzc2VkIG91dHNpZGUgdGhlIHBhY2thZ2UuIFRvIG1vZGlmeSB1c2UgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUgInB1YmxpYyIKCiAgICAgICAgICAgIHRvIGNoYW5nZSB0byBwdWJsaWMgZm9yIGFsbCBwcm94eSBjbGFzc2VzIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gInB1YmxpYyIKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIHR5cGVtYXBzIGZvciB0aGUgSmF2YSBtb2R1bGUuIEMrKyBleGNlcHRpb25zIGdldCBjb252ZXJ0ZWQgaW50bwogICAgICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBKYXZhIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICAKICAgICAgICAgICAgV2FybmluZzogVGhpcyBtYXkgY2hhbmdlIGZyb20gamF2YS5sYW5nLlJ1bnRpbWUgZXhjZXB0aW9uIGluIHRoZSBmdXR1cmUuCgowOS8wNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdmFyaWFibGVzIGRlY2xhcmVkIGFzIHJlZmVyZW5jZXMuCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjA5LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb3JlIHVwZGF0ZXMgdG8gdGhlIFJ1YnkgbW9kdWxlIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZwoJICAgIGEgbmV3IHR5cGVtYXAgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY29sbGVjdCBrZXktdmFsdWUKCSAgICBwYWlycyBmcm9tIGFuIGFyZ3VtZW50IGxpc3QgaW50byBhIEhhc2guCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbiBhbmQgY29uc3RydWN0b3JzLgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgRm9vPFQ+KCkgeyB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGV4dHJhIDxUPiBpbiB0aGUgY29uc3RydWN0b3Igd2FzIGNhcnJpZWQgdGhyb3VnaCBpbiB0aGUKICAgICAgICAgICAgbmFtZS0tY2F1c2luZyBydW50aW1lIHByb2JsZW1zIGluIGdlbmVyYXRlZCBtb2R1bGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3JkaSBBcm5hYmF0IEJlbmVkaWN0by4KIAowOS8wNS8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBTdXBwb3J0IG92ZXJsb2FkaW5nLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZWQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVzCgkgICAgdG8gdXNlIFJ1YnkgMS43IHN1cHBvcnQgZm9yIHRoZXNlIHR5cGVzIHdoZW4gYXZhaWxhYmxlLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG91dHB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlIHRvIHByaW1pdGl2ZQoJICAgIHR5cGVzLgoKMDkvMDQvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHBhc3MtYnktdmFsdWUgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBBcm5vCgkgICAgUGV0ZXJzIHZpYSBEZWJpYW4gYnVndHJhY2tpbmcgKCMxNTY5MDIpLCBwYXRjaCBieSBUb3JzdGVuCgkgICAgTGFuZHNjaG9mZiA8dG9yc3RlbkBkZWJpYW4ub3JnPi4KCjA5LzAzLzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKCSAgICBCZXR0ZXIgcmVmZXJlbmNlIHN1cHBvcnQuCgkgICAgRnVuY3Rpb25zIHRoYXQgd2FudCBhIHZvaWQqKiBjYW4gdGFrZSBhIE5VTEwgYnkgcmVmZXJlbmNlIGFuZAoJICAgIHRoZSB2b2lkKiB3aWxsIGJlIG1hZGUgZm9yIHlvdSBhbmQgdGhlbiBwYXNzZWQtYnktcmVmZXJlbmNlCgoJICAgIEFsc28gYWxsIGludGVnZXItY2xhc3MgbmF0aXZlIHR5cGVzIGNhbiBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlCgkgICAgd2hlcmUgYW4gaW50KiBvciBpbnQmIGV0YyBpcyBuZWVkZWQKCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlZCB0aGUgZXZhbHVhdGlvbiBvcmRlciBvZiBwcmVwcm9jZXNzb3IgbWFjcm8gYXJndW1lbnRzLgogICAgICAgICAgICBBcmd1bWVudHMgYXJlIG5vdyBleHBhbmRlZCBieSB0aGUgcHJlcHJvY2Vzc29yICpiZWZvcmUqIHRoZXkKICAgICAgICAgICAgYXJlIHBhc3NlZCB0byBtYWNybyBleHBhbnNpb24uICBUaGlzIGZpeGVzIGEgc3VidGxlIGV4cGFuc2lvbgogICAgICAgICAgICBidWcgcmVwb3J0ZWQgYnkgQW50aG9ueSBIZWFkaW5nLgoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0aGUgZmlsZSBpbmNsdWRlIG9yZGVyIChhZ2FpbiwgYXBwYXJlbnRseSkuIFNlZSAyLzI3Lzk5LgoKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybF0gQmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LiAgU2luY2UgUGVybCBlcnJvciBoYW5kbGluZwogICAgICAgICAgICByZWxpZXMgb24gc2V0am1wL2xvbmdqbXAsIHdyYXBwZXIgZnVuY3Rpb25zIGhhdmUgYmVlbiBtb2RpZmllZCBzbGlnaHRseQogICAgICAgICAgICB0byBwcm92aWRlIGFuIGV4dHJhIGJsb2NrIHNjb3BlOgoKICAgICAgICAgICAgICAgIFhTKGZvbykgewogICAgICAgICAgICAgICAgICAgY2hhciBfc3dpZ21zZ1tTV0lHX01BWF9FUlJNU0ddID0gIiI7CiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfc3dpZ2VyciA9IF9zd2lnbXNnOwogICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsIHdyYXBwZXIgZnVuY3Rpb24gaGVyZSAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBTV0lHX2Nyb2FrKCJBbiBlcnJvciBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFhTUkVUVVJOKGFyZ3ZpKTsgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiAqLwogICAgICAgICAgICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBjb2RlICovCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBjcm9hayhfc3dpZ19lcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG1hY3JvIFNXSUdfY3JvYWsoeCkgc2V0cyB0aGUgdmFsdWUgb2YgX3N3aWdlcnIgdG8geCBhbmQKICAgICAgICAgICAgZXhlY3V0ZXMgYSAiZ290byBmYWlsIi4gIFRoZSB3aG9sZSB3cmFwcGVyIGZ1bmN0aW9uIGlzIGVuY2xvc2VkCiAgICAgICAgICAgIGJsb2NrIHNjb3BlIHRvIHByb3ZpZGUgcHJvcGVyIGNsZWFudXAgb2YgQysrIG9iamVjdHMuICBTaW5jZQogICAgICAgICAgICBjcm9hayBleGVjdXRlcyBhIGxvbmdqbXAoKSwgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5IHJlY2xhaW0KICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoaXMgZXhlY3V0ZXMgaW4gdGhlIHNhbWUgc2NvcGUgYXMgdGhlIHdyYXBwZXIKICAgICAgICAgICAgZnVuY3Rpb24uCgogICAgICAgICAgICBUaGUgX3N3aWdtc2dbXSB2YXJpYWJsZSBpcyBub3JtYWxseSB1bnVzZWQsIGJ1dCBjYW4gYmUgdXNlZAogICAgICAgICAgICB0byBzdG9yZSBzbWFsbCBlcnJvciBtZXNzYWdlcyB1c2luZyBzcHJpbnRmIG9yIHNucHJpbnRmLiBJdAogICAgICAgICAgICBoYXMgYSBjYXBhY2l0eSBvZiBhdCBsZWFzdCAyNTYgYnl0ZXMgKFNXSUdfTUFYX0VSUk1TRykuCiAgICAgICAgICAgIAowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIGJldHRlciBzdXBwb3J0IGZvciBleGNlcHRpb25zLiAgSW5zdGVhZCBvZiByZXR1cm5pbmcgVENMX0VSUk9SLAogICAgICAgICAgICB1c2UgdGhlIG1hY3JvIFNXSUdfZmFpbCB0byByZXR1cm4gd2l0aCBhbiBlcnJvci4gIFRoaXMgZW5zdXJlcyB0aGF0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgcHJvcGVybHkgY2xlYW5lZCB1cC4gIEV4Y2VwdGlvbiBzcGVjaWZpZXJzIGFyZSBub3cKICAgICAgICAgICAgaGFuZGxlZCBieSBkZWZhdWx0LgoKMDkvMDIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFRoZSB0eXBlLWNoZWNraW5nIHN5c3RlbSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGhhcyBoYWQgYSBmbGF3CgkgICAgaW4gdGhhdCBzb21lIHR5cGVzIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQKCSAgICB3ZXJlbid0LiBUaGlzIGJ1ZyB3YXMgYmVzdCBkZW1vbnN0cmF0ZWQgYnkgdGhlIGluaGVyaXRfbWlzc2luZy5pCgkgICAgdGVzdCBzdWl0ZSBjYXNlLCB3aGljaCBkZWZpbmVzIGEgYmFzZSBjbGFzcyAiRm9vIiB0aGF0IGlzCgkgICAgc3ViY2xhc3NlZCBieSAiQmFyIi4gVGhlICJGb28iIGNsYXNzIGlzbid0IGFjdHVhbGx5IHdyYXBwZWQgKGkuZS4KCSAgICBpdCdzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gUnVieSkgYnV0IHdlJ2Qgc3RpbGwgbGlrZSB0byBiZQoJICAgIGFibGUgdG8gcGFzcyAiQmFyIiBpbnN0YW5jZXMgdG8gZnVuY3Rpb25zIGV4cGVjdGluZyBGb29zIGFuZCBoYXZlCgkgICAgdGhhdCB3b3JrOyBpdCB3YXNuJ3QuIFRoZSByZXZpc2VkIGltcGxlbWVudGF0aW9uIChzaW1pbGFyIHRvIHRoYXQKCSAgICB1c2VkIGZvciBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMpIGFkZHMgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKCSAgICAoX19zd2lndHlwZV9fKSB0byBlYWNoIG9iamVjdCB0aGF0IGluZGljYXRlcyBpdHMgU1dJRyB0eXBlOwoJICAgIHRoYXQgaXMsIGVhY2ggIkJhciIgaW5zdGFuY2Ugd2lsbCBub3cgaGF2ZSBhIHN0cmluZyBpbnN0YW5jZQoJICAgIHZhcmlhYmxlIGNhbGxlZCAiX19zd2lndHlwZV9fIiB3aG9zZSB2YWx1ZSBpcyAiX3BfQmFyIi4KCiAgICAgICAgICAgIFVubGVzcyBkZXZlbG9wZXJzIHdlcmUgdGFraW5nIGFkdmFudGFnZSBvZiB0aGlzIGxvdy1sZXZlbAoJICAgIGltcGxlbWVudGF0aW9uIGRldGFpbCwgdGhleSBzaG91bGRuJ3Qgbm90aWNlIGFueSBjb21wYXRpYmlsaXR5CgkgICAgcHJvYmxlbXM7IG5ldmVydGhlbGVzcywgSSdtIG1hcmtpbmcgaXQgYXMgYSAicG90ZW50aWFsCgkgICAgaW5jb21wYXRpYmlsaXR5Ii4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMDEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNGIEJ1ZyAjNjAzMTk5LgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBPVVRQVVQsIElOUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciBDKysgCiAgICAgICAgICAgIHJlZmVyZW5jZXMuCgowOC8yNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXhlZCBlcnJvciBpbiAibGliX3N0ZF92ZWN0b3IiIHRlc3RjYXNlIGFuZAoJICAgIGNvbXBpbGVyIHdhcm5pbmcgaW4gImxpYl9jZGF0YSIgdGVzdGNhc2UuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICIlbWl4aW4iIGRpcmVjdGl2ZSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvCgkgICAgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0byBtaXgtaW4gdG8gYQoJICAgIGNsYXNzLiBTbywgZm9yIGV4YW1wbGUsIGlmIHlvdSdkIGxpa2UgdG8gc3BlY2lmeSB0aGF0IFJ1YnkncwoJICAgIEVudW1lcmFibGUgbW9kdWxlIHNob3VsZCBiZSBtaXhlZC1pbiB0byB5b3VyIGNsYXNzIEZvbywgeW91J2QKCSAgICB3cml0ZToKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRW51bWVyYWJsZSI7CgkJCiAgICAgICAgICAgIG9yIHRvIHNwZWNpZnkgdGhhdCB0aGUgbW9kdWxlcyBGZWUsIEZpZSBhbmQgRm8gc2hvdWxkIGJlIG1peGVkCgkgICAgaW4gdG8gRm9vOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJGZWUsRmllLEZvIjsKCQkKCSAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlICVhbGlhcyBkaXJlY3RpdmUgc28gdGhhdCBtdWx0aXBsZSBhbGlhc2VzCgkgICAgY2FuIGJlIHNwZWNpZmllZCBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kIGJ5IHVzaW5nIGEgY29tbWEtc2VwYXJhdGVkCgkgICAgbGlzdCBvZiBhbGlhc2VzLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkICJ0aHJvdyIgdHlwZW1hcHMgZm9yIHRoZSBSdWJ5IG1vZHVsZS4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgcHJpbnRpbmcgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAnc3dpZyAtTScgbGlzdHMgYWxsIGZpbGUgZGVwZW5kZW5jaWVzLiAgJ3N3aWcgLU1NJyBsaXN0cwogICAgICAgICAgICBkZXBlbmRlbmNpZXMsIGJ1dCBleGNsdWRlcyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiAKICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICUgc3dpZyAtTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9zd2lnLnN3ZyBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9weXRob24vcHl0aG9uLnN3ZyBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgICAgJSBzd2lnIC1NTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NzU5OSBdIHVuaW9uIGluIGNsYXNzOiBpbmNvcnJlY3Qgc2NvcGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjAwMTMyIF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIG5hbWVzcGFjZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoaWJ1a2F3YSBZb3NoaWtpLgogCjA4LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQXV0b21hdGljIEMrKyBleGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCBmb3IgYWxsIGxhbmd1YWdlIG1vZHVsZXMuICAgIFRoaXMgaXMKICAgICAgICAgICAgcHJldHR5IHNpbXBsZS4gIElmIHlvdSBoYXZlIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB3cmFwX0Jhcl9ibGFoKCkgewogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEtPmJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGb28gJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJ0aHJvdyIgdHlwZW1hcCBjb2RlIGluc2VydGVkLiAkMSA9IF9lICovCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgVGhlICJ0aHJvdyIgdHlwZW1hcCBjYW4gYmUgdXNlZCB0byByYWlzZSBhbiBlcnJvciBpbiB0aGUgdGFyZ2V0IAogICAgICAgICAgICBsYW5ndWFnZS4gIEl0IGNhbiBkbyBhbnl0aGluZy4gIEhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCgidGhyb3ciKSBGb28gewogICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiRm9vIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUbyBtYWtlIHRoaXMgd29yayBpbiBlYWNoIGxhbmd1YWdlIG1vZHVsZSwgc2ltcGx5IGRlZmluZSBhIGZldyBkZWZhdWx0CiAgICAgICAgICAgICJ0aHJvdyIgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgYW5kIGEKICAgICAgICAgICAgZmV3IGNvbW1vbiBleGNlcHRpb24gdHlwZXMuICAgVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdC4KCiAgICAgICAgICAgIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgY2FuIGJlIGRpc2FibGVkIHVzaW5nIC1ub2V4Y2VwdCBvcgogICAgICAgICAgICBzZXR0aW5nIHRoZSBOb0V4Y2VwdCBnbG9iYWwgdmFyaWFibGUgdG8gMS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBbIFB5dGhvbiBdCiAgICAgICAgICAgIEF1dG9tYXRpYyB0cmFuc2xhdGlvbiBvZiBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGludG8gZXJyb3IgaGFuZGxpbmcgY29kZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBGb28gaXMgd3JhcHBlZCBhcyBhIGNsYXNzaWMtc3R5bGUgY2xhc3MgKGNvbXBhdGlibGUKICAgICAgICAgICAgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcpLiAgRnVydGhlcm1vcmUsIHlvdSBjYW4gd3JpdGUgUHl0aG9uIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IEZvbyxlOiAgICAgIyBOb3RlIHVzZSBvZiBleGNlcHRpb24gY2xhc3MgaGVyZSEKICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBGb28gZXJyb3IKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZSBvYmplY3QgImUiIGluIHRoZSBleGNlcHRpb24gaGFuZGxlciBpcyBqdXN0IGEgd3JhcHBlZCBGb28KICAgICAgICAgICAgb2JqZWN0LiAgQWNjZXNzIGl0IGxpa2UgYSBub3JtYWwgb2JqZWN0LgoKICAgICAgICAgICAgSWYgYW4gZXhjZXB0aW9uIGlzIG5vdCB3cmFwcGVkIGFzIGEgY2xhc3MsIGEgUnVudGltZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBleGNlcHRpb24gaXMKICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBvYmplY3QuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhpbnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLGU6CiAgICAgICAgICAgICAgICAgICBwcmludCBlLmFyZ3NbMF0gICAgICAgIyBJbnRlZ2VyIGV4Y2VwdGlvbiB2YWx1ZQoKICAgICAgICAgICAgQ29tbWVudHM6CgogICAgICAgICAgICAgICAgLSAgSWYgYSBjbGFzcyBpcyB1c2VkIGFzIGFuIGV4Y2VwdGlvbiwgaXQgKm11c3QqIGJlIHdyYXBwZWQKICAgICAgICAgICAgICAgICAgIGFzIGEgUHl0aG9uIGNsYXNzaWMtc3R5bGUgY2xhc3MgKG5ldyBjbGFzc2VzIGRvbid0IHdvcmspLgoKICAgICAgICAgICAgICAgIC0gIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgaXMgY29tcGF0aWJsZSB3aXRoICVleGNlcHRpb24uCgogICAgICAgICAgICAgICAgLSAgVXNlIC1ub2V4Y2VwdCB0byB0dXJuIG9mZiB0aGlzIGZlYXR1cmUuCgogICAgICAgICAgICAgICAgLSAgVGhlIG5ld2x5IGludHJvZHVjZWQgInRocm93IiB0eXBlbWFwIGlzIHVzZWQgdG8gcmFpc2UKICAgICAgICAgICAgICAgICAgIFB5dGhvbiBlcnJvcnMgKG5hdHVyYWxseSkuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbmZvcm1hdGlvbiBmcm9tIHRocm93KCkgc3BlY2lmaWVycyBpcyBub3cgc3RvcmVkIGluIHRoZSBwYXJzZQogICAgICAgICAgICB0cmVlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB0aHJvdyhzcGFtLGJhcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgc3RvcmVkIGluZm9ybWF0aW9uIGlzIGZ1bGx5IGNvcnJlY3RlZCBmb3IgbmFtZXNwYWNlcyBhbmQgd29ya3MKICAgICAgICAgICAgd2l0aCB0ZW1wbGF0ZXMuICBVc2VzIHdpbGwgZm9sbG93LgogICAgICAgICAgICAKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBubyBsb25nZXIgYXBwbGllZCB0byBtZW1iZXIgYWNjZXNzCiAgICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGluIHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2god2hhdGV2ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm90IGFwcGxpZWQgdG8gYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICAgIGZvciBGb286OnguICAgVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBhbW91bnQgb2YgZXh0cmEgY29kZQogICAgICAgICAgICBnZW5lcmF0ZWQuCgogICAgICAgICAgICBDYXZlYXQ6ICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSAqaXMqIHVzZWQgd2hlbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgICAgICBhY2Nlc3NlZCB0aHJvdWdoIGEgc21hcnQtcG9pbnRlciBvciBhIHN5bnRoZXNpemVkIGF0dHJpYnV0ZWQKICAgICAgICAgICAgYWRkZWQgd2l0aCAlZXh0ZW5kIGlzIHVzZWQuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgbW9yZSBwYXRjaGVzIHRvIGhvcGVmdWxseSBlbGltaW5hdGUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgU1dJRyAKICAgICAgICAgICAgYXMgYSA2NC1iaXQgZXhlY3V0YWJsZS4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBjb25zdCByZWZlcmVuY2UgbWVtYmVycywgdmFyaWFibGVzLCBhbmQgc3RhdGljIG1lbWJlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgJnJlZjsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyeWluZyB0byBnZW5lcmF0ZSAic2V0IiBmdW5jdGlvbnMgd2hpY2ggd291bGRuJ3QgY29tcGlsZS4gCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IgIkNsYXNzIFggbWlnaHQgYWJzdHJhY3QiIG9mZiBieSBkZWZhdWx0LgogICAgICAgICAgICBFbmFibGUgd2l0aCAtV2FsbC4KCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCBoYW5kbGluZyBvZiBjb25zdCBhbmQgbm9uLWNvbnN0IG92ZXJsb2FkZWQgbWV0aG9kcy4gIElmCiAgICAgICAgICAgIGEgY2xhc3MgZGVmaW5lcyBhIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpIGNvbnN0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlbiB0aGUgbm9uLWNvbnN0IG1ldGhvZCBpcyAqYWx3YXlzKiBzZWxlY3RlZCBpbiBvdmVybG9hZGluZyBhbmQKICAgICAgICAgICAgdGhlIGNvbnN0IG1ldGhvZCBzaWxlbnRseSBkaXNjYXJkZWQuICBJZiBydW5uaW5nIHdpdGggLVdhbGwsIGEgd2FybmluZwogICAgICAgICAgICBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKMDgvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCBpbmhlcml0YW5jZS4gICBDb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYmxhaChkb3VibGUgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb0JhciA6IHB1YmxpYyBGb28sIHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmxhaChjaGFyICp4KTsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEJhcjo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgU1dJRyB3cmFwcyBGb29CYXI6OmJsYWggYXMgYW4gb3ZlcmxvYWRlZCBtZXRob2QgdGhhdCB1c2VzIGFsbAogICAgICAgICAgICBhY2Nlc3NpYmxlIHZlcnNpb25zIG9mIGJsYWgoKS4gIFNlZSBzZWN0aW9uIDE1LjIuMiBpbiBTdHJvdXN0cnVwLCAzcmQgRWQuCgogICAgICAgICAgICBTV0lHIGFsc28gc3VwcG9ydHMgYWNjZXNzIGNoYW5nZSB0aHJvdWdoIHVzaW5nIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286Ong7CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgQ2F2ZWF0OiAgIFNXSUcgZG9lcyBub3QgYWN0dWFsbHkgY2hlY2sgdG8gc2VlIGlmIGRlY2xhcmF0aW9ucyBpbXBvcnRlZAogICAgICAgICAgICB2aWEgJ3VzaW5nJyBhcmUgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gIElmIHRoaXMgb2NjdXJzLCB0aGUKICAgICAgICAgICAgd3JhcHBlciBjb2RlIHdvbid0IGNvbXBpbGUgYW55d2F5cy0tLW5vdCBzdXJlIGl0J3Mgd29ydGggd29ycnlpbmcgYWJvdXQuCiAgICAgICAgICAKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBvdmVybG9hZGluZyBkaXNwYXRjaCB0byBub3QgaW5jbHVkZSBub2RlcyB3aXRoIGFuICJlcnJvciIgYXR0cmlidXRlLgogICAgICAgICAgICBBIGxhbmd1YWdlIG1vZHVsZSBjYW4gc2V0IHRoaXMgaWYgYSBub2RlIGNvdWxkbid0IGJlIHdyYXBwZWQgYW5kIHlvdSBkb24ndCB3YW50CiAgICAgICAgICAgIGl0IGluY2x1ZGVkIGluIHRoZSBkaXNwYXRjaCBmdW5jdGlvbi4KCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiBkaXNwYXRjaC4gICBUaGUgZGlzcGF0Y2hlciBpcyBub3cgYXdhcmUgb2YKICAgICAgICAgICAgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICBjbGFzcyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oRm9vICpmKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGlzcGF0Y2hlciByZS1vcmRlcnMgdGhlIGZ1bmN0aW9ucyBzbyB0aGF0IHNwYW0oQmFyICpiKSBpcwogICAgICAgICAgICBjaGVja2VkIGZpcnN0LS0taXQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHNwYW0oRm9vICpmKS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLVdlcnJvciBjb21tYW5kIGxpbmUgb3B0aW9uLiAgIElmIHN1cHBsaWVkLCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSB0cmVhdGVkCiAgICAgICAgICAgIGFzIGVycm9ycyBhbmQgU1dJRyB3aWxsIHJldHVybiBhIG5vbi16ZXJvIGV4aXQgY29kZS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTYxMzUgXSBUeXBlZGVmIG9mIHJlZmVyZW5jZSBjYW4ndCBjb21waWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICZJbnRSZWY7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oSW50UmVmIGkpOwoKICAgICAgICAgICAgU1dJRy0xLjMuMTQgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLgoKVmVyc2lvbiAxLjMuMTQgKEF1Z3VzdCAxMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFN0YXRpYyBjb25zdCBtZW1iZXJzIGluaXRpYWxpemVkIGR1cmluZyBkZWNsYXJhdGlvbiwgYW5kCgkgICAgb25seSB0aGVtLCBpZToKCgkgICAgc3RydWN0IEEKCSAgICB7CQkgCgkJc3RhdGljIGNvbnN0IGludCBhID0gMSA7ICAvLyB0aGlzIG9uZQoJCXN0YXRpYyBjb25zdCBpbnQgYjsgICAgICAgLy8gbm90IHRoaXMgb25lCiAgICAgICAgICAgIH07ICAgICAKCgkgICAgYXJlIGVtaXR0ZWQgbGlrZSBjb25zdGFudHMgKGVxdWl2YWxlbnQgdG8gZW51bXMgb3IKCSAgICBleHBsaWNpdCAlY29uc3RhbnQpLgoJICAgIAoJICAgIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGNhbm5vdCBiZSBhZGRlZCBkaXJlY3RseSB0byAnY3ZhcicKCSAgICBzaW5jZSB0aGV5IGxhY2sgdGhlIG5lZWRlZCByZWZlcmVuY2UgKHdlbGwsIHlvdSBjYW4gZm9yY2UKCSAgICB0aGVtIHRvIGhhdmUgYSByZWFsIHJlZmVyZW5jZSwgYnV0IGluIGFuIHVnbHkgd2F5IHdoaWNoCgkgICAgZ29lcyBjb21wbGV0ZWx5IGFnYWluIHRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIGluaXRpYWxpemUKCSAgICB0aGVtIGR1cmluZyBkZWNsYXJhdGlvbiwgeW91IGFsc28gaGF2ZSB0byBkZWFsIHdpdGggZXh0cmEKCSAgICBsaW5raW5nIG1hdHRlcnMsIGFuZCBpdCB0YWtlIGEgd2hpbGUgdG8gZmlndXJlIG91dCB3aGF0IGlzCgkgICAgdGhlIHByb2JsZW0gYW5kIGhvdyB0byBzb2x2ZSBpdCkuCgkgICAgCgkgICAgUGxlYXNlIHRlc3QgaXQgd2l0aCB5b3VyIHByZWZlcnJlZCB0YXJnZXQgbGFuZ3VhZ2UsIGFuZAoJICAgIG5vdCBvbmx5IHRoZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByZWFsbHkgcnVuIHRoZSBleGFtcGxlCgkgICAgaW4gdGhlIHRlc3Qtc3VpdGUgKHN0YXRpYy1jb25zdC1tZW1iZXItMi5pKSBiZWNhdXNlIHRoZQoJICAgIHByb2JsZW0gYW5kIHRoZSBzb2x1dGlvbiBjYW5ub3QgYmUgImZ1bGx5IiBhcHByZWNpYXRlZAoJICAgIHVudGlsIHlvdSB0cnkgdG8gbG9hZCB0aGUgbW9kdWxlIGFuZCBydW4gaXQuCgoJICAgIEluIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyAocHl0aG9uIHNwZWNpYWxseSksIHRoaXMgY2FuCgkgICAgcHJvZHVjZXMgYSBkaWZmZXJlbmNlIGluIHRoZSB3YXkgdGhhdCB0aGUgc3RhdGljIGNvbnN0YW50CgkgICAgbWVtYmVycyAnYScgYW5kICdiJyBhcmUgaW50ZXJuYWxseSB3cmFwcGVkLiBIb3BlZnVsbHksCgkgICAgdGhleSBzdGlsbCBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIHNhbWUgd2F5LgoKCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIE5vdyBzdGF0aWMgY29uc3QgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgaW4gYSBtb3JlCgkgICAgbmF0dXJhbCB3YXksIGllLCBpZiB5b3UgaGF2ZQoKCSAgICBzdHJ1Y3QgQQogICAgICAgICAgICAgewkJIAoJCXR5cGVkZWYgdW5zaWduZWQgaW50IHZpZXdmbGFnczsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGZvcndhcmRfZmllbGQgPSAwOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgYmFja3dhcmRfZmllbGQ7CiAgICAgICAgICAgIH07ICAgICAKCSAgICAKCSAgICBub3cgeW91IGNhbiBkbzoKCgkJcHJpbnQgQS5iYWNrd2FyZF9maWVsZAoKCSAgICBhbmQgYWxzbwoKCSAgICAgICAgYSA9IEEoKQoJCXByaW50IGEuZm9yd2FyZF9maWVsZAoJCQoJICAgIE5vdGUgdGhhdCBpZiB0aGUgc3RhdGljIGNvbnN0IG1lbWJlcnMgZG9uJ3QgaGF2ZSBhbgoJICAgIGluaXRpYWxpemVyIChsaWtlIGJhY2t3YXJkX2ZpZWxkKSwgc3RpbGwgeW91IGNhbiBhY2Nlc3MKCSAgICB0aGVtIGluIHRoZSBzYW1lIHdheSBpbiB0aGUgcHl0aG9uIHNpZGUsIGJ1dCB0aGUKCSAgICBpbXBsZW1lbnRhdGlvbiBpcyBhIHF1aXRlIGRpZmZlcmVudDogYmFja3dhcmRfZmllbGQgd2lsbAoJICAgIHN0aWxsIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHksIGFuZCBhbHNvLCB5b3UgYXJlIAoJICAgIHJlc3BvbnNpYmxlIHRvIGluaXRpYWxpemUgaXQgaW4gc29tZSBjb2RlIHVuaXQsIGFuZCBsaW5rIGl0CgkgICAgcHJvcGVybHkuIGZvcndhcmRfZmllbGQsIGJ5IHRoZSBvdGhlciBoYW5kLCB3aWxsIG5vdAoJICAgIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHkgYnV0IG9ubHkgYXMgYSBBIG1lbWJlciwgc2ltaWxhcgoJICAgIHRvIHdoYXQgaGFwcGVuIHdpdGggZW51bSBvciAlY29uc3RhbnQgbWVtYmVycy4KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIENvbW1vbiBjb2RlIGluIHRoZSBfX3NldGF0dHJfXy9fX2dldGF0dHJfXyBub3cKCSAgICBnb2VzIHRvIHR3byAiZnJlZSIgbWV0aG9kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm94eQoJICAgIGZpbGUsIGZyb20gd2hlcmUgZWFjaCBjbGFzcyB1c2UgaXQuIFRoaXMgY2hhbmdlIHJlZHVjZXMKCSAgICB0aGUgc2l6ZSBvZiB0aGUgcHJveHkgZmlsZSwgc3BlY2lhbGx5IGlmIHlvdSB3cmFwIGEgbG90IG9mCgkgICAgc21hbGwgY2xhc3NlcyBpbiBvbmUgbW9kdWxlICh1cCB0byAzMyUgaW4gc29tZSBjYXNlcyksCgkgICAgbWFraW5nIGl0IGZhc3RlciB0byBsb2FkIHRvby4KCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjaGFyICogcmV0dXJucyBOVUxMLAogICAgICAgICAgICB1bmRlZiBpcyByZXR1cm5lZCB0byB0aGUgUGVybCBpbnRlcnByZXRlci4KIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBjb252ZXJzaW9uIG9wZXJhdG9ycyBhbmQgbmFtZXNwYWNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyooKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhlIHdyYXBwZXIgY29kZSwgU1dJRyB3YXMgdXNpbmcgLT5vcGVyYXRvciBGb28qKCkKICAgICAgICAgICAgd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIHVzaW5nIC0+b3BlcmF0b3IgbnM6OkZvbyooKS4KCiAgICAgICAgICAgIE5vdGU6IGlmIHVzaW5nICVyZW5hbWUgd2l0aCBhIGNvbnZlcnNpb24gb3BlcmF0b3IsIHlvdQogICAgICAgICAgICBtaWdodCBoYXZlIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlcmVuYW1lKHRvRm9vUHRyKSBuczo6b3BlcmF0b3IgbnM6OkZvbyooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIF5eXl4gbm90ZSBleHRyYSBxdWFsaWZpZXIKICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIE1pbm9yIGVuaGFuY2VtZW50IHRvICdjb25zdCcgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICAgTm9ybWFsbHkgY29uc3QgZGVjbGFyYXRpb25zIGFyZSB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMKICAgICAgICAgICAgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggdGhlIGN2YXIgYXR0cmlidXRlIChzZWUgU1dJRy5odG1sIGZvcgogICAgICAgICAgICBhIGRpc2N1c3Npb24gb2Ygd2h5KS4gIEhvd2V2ZXIsIGluIG1hbnkgcHJvZ3JhbXMsICJjb25zdCIgCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBtYXkganVzdCBiZSBjb25zdGFudHMtLS1tYWtpbmcgdGhlIGN2YXIuIGFjY2VzcwogICAgICAgICAgICBhd2t3YXJkLiAgVG8gZml4IHRoaXMsICJjb25zdCIgZGVjbGFyYXRpb25zIGFyZSBub3cgYXZhaWxhYmxlCiAgICAgICAgICAgIGJvdGggdGhyb3VnaCBjdmFyLiBhbmQgYXMgYSBzaW1wbGUgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgRk9PID0gNDI7CgogICAgICAgICAgICBJbiBQeXRob246CgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLmN2YXIuRk9PCiAgICAgICAgICAgICAgICAgNDIKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5GT08KICAgICAgICAgICAgICAgICA0MgoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSB2YWx1ZSBvZiBhICJjb25zdCIgdmFyaWFibGUKICAgICAgICAgICAgbWlnaHQgY2hhbmdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0IEJBUiA9ICJIZWxsbyBXb3JsZCI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBwb2ludGVyIGl0c2VsZiBjYW4gbm90IGNoYW5nZSwgYnV0IHRoZSAKICAgICAgICAgICAgZGF0YSBiZWluZyBwb2ludGVkIHRvIGNvdWxkIGJlIG1vZGlmaWVkLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucywKICAgICAgICAgICAgY3Zhci5CQVIgc2hvdWxkIGJlIGFjY2Vzc2VkIHRvIG9idGFpbmVkIHRoZSBjdXJyZW50IHZhbHVlLgoKMDgvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBnZW5lcmF0aW9uIG9mIHRoZSBwcm94eSBjb2RlICgucHkgZmlsZXMpIHRvIG1vcmUKICAgICAgICAgICAgY2xvc2VseSBmb2xsb3cgdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9ucyBhcyB0aGV5IGFwcGVhciBpbgogICAgICAgICAgICB0aGUgLmkgZmlsZS4gICBJbiB0aGUgcGFzdCwgYWxsIG9mIHRoZSBjbGFzcyB3cmFwcGVycyBhcHBlYXJlZAogICAgICAgICAgICBmaXJzdCwgZm9sbG93ZWQgYnkgZnVuY3Rpb24gc3R1YnMsIGluc2VydGVkIFB5dGhvbiBjb2RlLCBhbmQKICAgICAgICAgICAgb3RoZXIgZGV0YWlscy4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkgbWV0aG9kIF9kZWxldGUoKSBjaGFuZ2VkIHRvIGRlbGV0ZSgpLiBUaGVyZSBzaG91bGRuJ3QgZXZlcgogICAgICAgICAgICBiZSBhIHdyYXBwZWQgZnVuY3Rpb24gY2FsbGVkIGRlbGV0ZSgpIGFzIGl0IGlzIGEgQysrIGtleXdvcmQgYW5kIHRoZXJlCiAgICAgICAgICAgIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSBtZW1iZXIgZnVuY3Rpb24gaW4gQy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhlIGZ1bmN0aW9uIGJhY2sgaW4KICAgICAgICAgICAgZm9yIGFsbCBwcm94eSBjbGFzc2VzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgSmF2YSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdW1tYXJ5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiBpbXByb3ZpbmcgdGhlIEphdmEgbW9kdWxlIAogICAgICAgICAgICBmb3IgdmVyIDEuMy4xNC4gIElmIGF0IGFsbCBwb3NzaWJsZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHRha2UgYWR2YW50YWdlcyBvZiB0aGUgCiAgICAgICAgICAgIGltcHJvdmVtZW50cy4gSWYgeW91IHdlcmUgdXNpbmcgcHJveHkgY2xhc3NlcyB5b3UgbWF5IG5vdCBub3RpY2UgYW55IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBpc3N1ZXMuIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGljaCB3aWxsIGhlbHAgd2l0aCBtb3N0IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBjb2RlIHRoYXQgdXNlcwogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIG91dHB1dDoKCiAgICAgICAgICAgIFJlcGxhY2U6CiAgICAgICAgICAgICAgICAlbW9kdWxlIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIFdpdGg6CiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im1vZHVsZW5hbWUiKSBtb2R1bGVuYW1lOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzPSJwdWJsaWMiOwoKICAgICAgICAgICAgVGhlIHByb3h5IGNvbnN0cnVjdG9ycyB0aGF0IHRvb2sgcGFyYW1ldGVycyAobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pCiAgICAgICAgICAgIHdlcmUgcHVibGljIGFuZCBhcmUgbm93IHByb3RlY3RlZC4gSWYgeW91IHdlcmUgbWFraW5nIHVzZSBvZiB0aGVzZSB0aGVuIHlvdSdsbCAKICAgICAgICAgICAgaGF2ZSB0byBtb2RpZnkgeW91ciBjb2RlIGFuZCB0aGUgYmVzdCBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdGhlIG5ldyB0eXBlIAogICAgICAgICAgICB3cmFwcGVyIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgb3RoZXIgbWFpbiBhcmVhcyBhcmUgdGhlIHByYWdtYXMgYW5kIGdsb2JhbCB2YXJpYWJsZSB3cmFwcGluZy4gUmVwbGFjZSAKICAgICAgICAgICAgdGhlIHByYWdtYXMgd2l0aCBvbmUgb2YgdGhlIG5ldyBkaXJlY3RpdmVzIG9yIHR5cGVtYXBzIG1lbnRpb25lZCBiZWxvdyBhbmQgdXNlCiAgICAgICAgICAgICVyZW5hbWUgb24gdGhlIHZhcmlhYmxlcy4KCiAgICAgICAgICAgIElmIHlvdSB3ZXJlIG5vdCB1c2luZyBwcm94eSBjbGFzc2VzLCB5b3Ugd2lsbCBoYXZlIHRvIGRlZmluZSBhIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFzIHdlbGwgYXMgYSBqdHlwZSB0eXBlbWFwLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHdyYXBwaW5nIHR3byBkaW1lbnNpb24gYXJyYXkgdmFyaWFibGVzLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbF0KICAgICAgICAgICAgT2JqZWN0IG1hbmFnZW1lbnQgbm93IGhhcyBhIG11Y2ggYmV0dGVyIHNlbnNlIG9mIG93bmVyc2hpcC4KICAgICAgICAgICAgT3duZXJzaGlwIGJpdHMgaXMgY2hhbmdlZCB3aGVuZXZlciBhbiBvYmplY3QgaXMgc3RvcmVkIGluIGEKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgICAgIEZvbyAqbmV4dDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgaW4gUHl0aG9uCgogICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24KICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICA+Pj4gZyA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBnLm5leHQgPSBmICAgICAgICAgICMgQXNzaWduIGEgcG9pbnRlcgogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duICAgICAgICAgICAjIE5vdGljZSBvd25lcnNoaXAgY2hhbmdlCiAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICBUaGlzIHNjaGVtZSBpcyBtb3N0bHkgYSBjb25zZXJ2YXRpdmUgaGV1cmlzdGljIGRlc2lnbmVkIHRvIAogICAgICAgICAgICBwcm92aWRlIHNlZ21lbnRhdGlvbiBmYXVsdHMuICBJdCBjb3VsZCBjYXVzZSBhIG1lbW9yeSBsZWFrCiAgICAgICAgICAgIGlmIG93bmVyc2hpcCBpcyBjaGFuZ2VkIHVubmVjZXNzYXJpbHkuICBJbiB0aGlzIGNhc2UsIHlvdSBjYW4KICAgICAgICAgICAgZWl0aGVyIHdyaXRlIGEgdHlwZW1hcCAodGhhdCBkb2Vzbid0IGNoYW5nZSBvd25lcnNoaXApLCBvcgogICAgICAgICAgICBtYW51YWxseSBzZXQgdGhlIHRoaXNvd24gYXR0cmlidXRlIGJhY2sgdG8gMS4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gTWFqb3IgdXNhYmlsaXR5IGltcHJvdmVtZW50cyB0byB0aGUgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgICAgU3VwcG9zZSB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgCiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHZvaWQgIGJsYWgoRm9vICpmKTsKCiAgICAgICAgICAgIEluIHBhc3QgdmVyc2lvbnMgb2YgU1dJRywgeW91IGNvdWxkIGNyZWF0ZSBvYmplY3RzIGFuZCB1c2UKICAgICAgICAgICAgdGhlbSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJSBGb28gZgogICAgICAgICAgICAgICAgJSBmIGNvbmZpZ3VyZSAteCAzCiAgICAgICAgICAgICAgICAlIGYgc3BhbQogICAgICAgICAgICAgICAgMzcKICAgIAogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIGlzIHRoYXQgaWYgeW91IHRyaWVkIHRvIGNhbGwgYmxhaCgpLCBpdCBkaWRuJ3QKICAgICAgICAgICAgd29yazoKCiAgICAgICAgICAgICAgICAlIGJsYWggZgogICAgICAgICAgICAgICAgVHlwZSBFcnJvci4gRXhwZWN0ZWQgX3BfRm9vCiAgICAgICAgICAgICAgICAlCgogICAgICAgICAgICBJbnN0ZWFkLCB5b3UgaGFkIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJSBibGFoIFtmIGNnZXQgLXRoaXNdCiAgCiAgICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZXh0cmFjdHMgdGhlIC10aGlzIHBvaW50ZXIsIGF2b2lkaW5nIHRoaXMKICAgICAgICAgICAgcHJvYmxlbS4gIFRoaXMgbWVhbnMgdGhhdCBzYXlpbmcgImJsYWggZiIgaXMgcGVyZmVjdGx5IGxlZ2FsIGFuZAogICAgICAgICAgICBldmVyeXRoaW5nIHdpbGwgc3RpbGwgd29yayBub3JtYWxseS4KCiAgICAgICAgICAgIENhdmVhdDogU2luY2UgcG9pbnRlciBzdHJpbmdzIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUgKF8pLAogICAgICAgICAgICBkb24ndCB1c2UgdGhpcyBpbiBvYmplY3QgbmFtZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlIEZvbyBfZiAKICAgICAgICAgICAgICAgICUgYmxhaCBfZiAgICAgICAgIyBQb3RlbnRpYWwgY3Jhc2gKCiAgICAgICAgICAgIE9iamVjdHMgbm93IGhhdmUgYSAtdGhpc293biBhdHRyaWJ1dGUgdGhhdCBzaG93cyB0aGUgb3duZXJzaGlwLgogICAgICAgICAgICBUaGlzIGJ1aWxkcyB1cG9uIHRoZSBDSEFOR0VTIDExLzI0LzIwMDEgZW50cnkuCgowOC8wNy8yMDAyOiBzYW1qYW0sIFNhbSBMaWRkaWNvdHQKICAgICAgICAgICAgUHJvcGVybHkgaW1wbGVtZW50ZWQgcG9pbnRlciBzeXN0ZW0gdXNpbmcgcGhwIHJlc291cmNlcy4KICAgICAgICAgICAgU3RpbGwgbmVlZCB0byB3b3JrIG91dCB3aGV0aGVyIG9yIG5vdCB0byBsZXQgc2NyaXB0LXVzZXJzIGNhbGwKICAgICAgICAgICAgZGVzdHJ1Y3RvcnMgZGlyZWN0bHkKCjA4LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXBncmFkZWQgbXpzY2hlbWUgbW9kdWxlIHRvIHN1cHBvcnQgdmVyc2lvbiAyMDEgYW5kIGFkZGVkCiAgICAgICAgICAgIG92ZXJsb2FkaW5nIHN1cHBvcnQuCgowOC8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgZXh0cmEgZ3JvdXBpbmcgKGluIHZlcnkgbGltaXRlZCBjYXNlcykuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAoRnVuY1B0cikoaW50LCBkb3VibGUpOwoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCAqKioKICAgICAgICAgICAgCjA4LzAzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVzIHRvIHR5cGVtYXBzLmkgYXMgdGhvc2UgZG9uZSBwcmV2aW91c2x5IGZvciBQZXJsLAogICAgICAgICAgICBQeXRob24gYW5kIFRjbCBtb2R1bGVzLiBOb3cgc3VwcG9ydHMgcmVmZXJlbmNlIHR5cGVzIHdpdGggSU5QVVQsCiAgICAgICAgICAgIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMuCgowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgY3N0cmluZy5pIGFkZGVkLiAgUHJvdmlkZXMgbWFjcm9zIGZvcgogICAgICAgICAgICBtYW5pcHVsYXRpbmcgY2hhciAqIGRhdGEuCiAKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gIFVzZSAlbmV3b2JqZWN0IGluc3RlYWQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVuZXdvYmplY3QgZm9vOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgY2hhciAqZm9vKCk7CgogICAgICAgICAgICAlbmV3b2JqZWN0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsCiAgICAgICAgICAgIGV0Yy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgYXR0cmlidXRlICdqbmljbGFzc25hbWUnIGZvciB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBhbGxvd3MgYSB3YXkgb2YKICAgICAgICAgICAgY2hhbmdpbmcgdGhlIEpOSSBjbGFzcyBuYW1lIGZyb20gdGhlIGRlZmF1bHQgd2hpY2ggdXNlcyB0aGUgbW9kdWxlbmFtZSB3aXRoIEpOSQogICAgICAgICAgICBhcHBlbmRlZCBhZnRlciBpdC4KCiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im5hbWUiKSBtb2R1bGVuYW1lCgogICAgICAgICAgICBJZiAnbmFtZScgaXMgdGhlIHNhbWUgYXMgJ21vZHVsZW5hbWUnIHRoZW4gdGhlIG1vZHVsZSBjbGFzcyBuYW1lIGdldHMgY2hhbmdlZAogICAgICAgICAgICBmcm9tICdtb2R1bGVuYW1lJyB0byBtb2R1bGVuYW1lTW9kdWxlLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmlsZSBpbmNsdWRlIG9yZGVyLiAgTGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZGlyZWN0b3JpZXMgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGdlbmVyaWMgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOiAgInN3aWdfbGliL3B5dGhvbi9mb28uaSIgc2hvdWxkIGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgInN3aWdfbGliL2Zvby5pIi4gICAgSSB0aG91Z2h0IHRoaXMgd2FzIHRoZSBjYXNlIGFscmVhZHksIGJ1dAogICAgICAgICAgICBhcHBhcmVudGx5IGl0IGhhcyBiZWVuIGJyb2tlbiBmb3IgcXVpdGUgc29tZSB0aW1lLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdGRfZGVxdWUuaSBsaWJyYXJ5IGZpbGUuICBXb3JrIGluIHByb2dyZXNzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbCxQZXJsXQogICAgICAgICAgICBJbXByb3ZlbWVudHMgdG8gdHlwZW1hcHMuaS4gIElOUFVUL0lOT1VUIHR5cGVtYXBzIHBlcmZvcm0gYmV0dGVyCiAgICAgICAgICAgIGVycm9yIGNoZWNraW5nLiAgVHlwZW1hcHMgYXJlIG5vdyBzdXBwbGllZCBmb3IgcmVmZXJlbmNlcyBsaWtlIAogICAgICAgICAgICBpbnQgJk9VVFBVVCwgZG91YmxlICZJTk9VVCwgZXRjLgogICAgICAgICAgCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRGVwcmVjYXRlZCB0aGUgVF8qIGFuZCBMXyogdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KICAgICAgICAgICAgTXVsdGlwbGUgcmV0dXJuIHZhbHVlcyBhcmUgYWx3YXlzIHBsYWNlZCBpbiBhIHR1cGxlLiBEZXByZWNhdGVkCiAgICAgICAgICAgIHRoZSBCT1RIIHR5cGVtYXBzLiAgVGhpcyBpcyBub3cgSU5PVVQgKGUuZy4sIGludCAqSU5PVVQpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIGFycmF5LmksIGNhcnJheS5pLCBhbmQgdGltZXIuaSBsaWJyYXJ5IGZpbGVzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgVXNlIGNwb2ludGVyLmkgaW5zdGVhZC4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZvciBjb25zaXN0ZW5jeSB0aGUgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgdXNlIHRoZSBKYXZhQmVhbiAKICAgICAgICAgICAgcHJvcGVydHkgZGVzaWduIHBhdHRlcm4gbGlrZSBtZW1iZXIgdmFyaWFibGVzIGFsd2F5cyBoYXZlLiBUaGlzIG1lYW5zIGlmIHlvdSBhcmUgCiAgICAgICAgICAgIHdyYXBwaW5nIGEgdmFyaWFibGUgY2FsbGVkIGZvbywgdGhlIGdldHRlciBpcyBjYWxsZWQgZ2V0Rm9vKCkgYW5kIHRoZSBzZXR0ZXIgaXMgCiAgICAgICAgICAgIGNhbGxlZCBzZXRGb28oKS4gQmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlcyB0byB0aGUgSmF2YSBtb2R1bGUgdGhlIGdldHRlcnMgYW5kIAogICAgICAgICAgICBzZXR0ZXJzIHdlcmUgY2FsbGVkIGdldF9mb28oKSBhbmQgc2V0X2ZvbygpLiBJZiB5b3UgcmVhbGx5IHdhbnQgdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBmdW5jdGlvbiBuYW1lcyB1c2UgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGxpa2UgdGhpczogJXJlbmFtZShfZm9vKSBGb287CgowNy8zMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNhc3RpbmcgcHJvYmxlbSB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgSWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgICAgY2xhc3MgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXIgOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXogOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBzcGFtIDogcHVibGljIGJhciwgcHVibGljIGJheiB7fTsKCiAgICAgICAgICAgIHRoZW4gdGhlIHdyYXBwZXJzIHdvdWxkbid0IGNvbXBpbGUgZHVlIHRvIGFuIGFtYmlndW91cyBjYXN0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEdWUgdG8gbmV3IHN0YXRpYyB0eXBlY2hlY2tpbmcgYWxsIHBvaW50ZXJzIGhlbGQgaW4gYSBKYXZhIGxvbmcgYXJlIHBhcnQgb2YgCiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBhbmQgdGhpcyBwb2ludGVyIHZhbHVlIGluIHRoZSBKYXZhIGxvbmcgaGFzIGJlY29tZSBhYnN0cmFjdGVkCiAgICAgICAgICAgIGRhdGEuIFRoZSB0eXBlIHdyYXBwZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhcyBzdWNoIHByb3RlY3RlZC4KICAgICAgICAgICAgSWYgeW91IG5lZWQgdG8gbWVzcyBhcm91bmQgd2l0aCBwb2ludGVycyBmcm9tIEphdmEgb3IgZm9yIGV4YW1wbGUgY3JlYXRlIGEgcHJveHkgCiAgICAgICAgICAgIGNsYXNzIG9yIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgYSBudWxsIHBvaW50ZXIsIGFkZCBhIGZ1bmN0aW9uL2NvbnN0cnVjdG9yIAogICAgICAgICAgICB0byBkbyBzbyB3aXRoIHRoZSAlamF2YWNvZGUgdHlwZW1hcC4gWW91IGNhbiBhbHNvIG1ha2UgZ2V0Q1B0cigpIHB1YmxpYyBhZ2FpbiB3aXRoCiAgICAgICAgICAgIHRoZSAlamF2YWdldGNwdHIgdHlwZW1hcC4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZXMgZm9yICV0eXBlbWFwKGlnbm9yZSkuIEluIHBhcnRpY3VsYXIgd2hlbiBpZ25vcmluZyB0aGUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgaW4gYSBmdW5jdGlvbi4gQWxzbyBmb3IgYWxsIHBhcmFtZXRlcnMgaW4gY29uc3RydWN0b3JzLiBUaGVzZSBtb2RzIGhhdmUgYWxzbyBmaXhlZAogICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyBmb3IgcHJveHkgY2xhc3NlcyAtIFNGIDU4MTc5MS4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJW5ld29iamVjdCAocmVwbGFjZW1lbnQgZm9yICVuZXcpIG5vdyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gCgowNy8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlbWFwIGNvcGllcywgJWFwcGx5LCBhbmQgJWNsZWFyIGluc2lkZQogICAgICAgICAgICBDKysgbmFtZXNwYWNlcy4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpOSSBjbGFzcyBub3cgaGFzIHBhY2thZ2UgYWNjZXNzIGFzIHRoZSBjbGFzcyBtb2RpZmllcgogICAgICAgICAgICBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gInB1YmxpYyIgdG8gbm90aGluZy4gVGhpcyBoYXMgYmVlbiBkb25lCiAgICAgICAgICAgIGFzIHRoaXMgY2xhc3MgaXMgbm93IG1vcmUgZm9yIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBTV0lHIHNpbmNlIHRoZSBtb2R1bGUKICAgICAgICAgICAgY2xhc3MgaGFzIHN0YXRpYyB0eXBlIGNoZWNraW5nIGZvciBhbGwgdHlwZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlICVqbmljbGFzc2NsYXNzbW9kaWZpZXIgCiAgICAgICAgICAgIHByYWdtYSB0byBjaGFuZ2UgaXQgYmFjayB0byAicHVibGljIi4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkvU2hhZG93IGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGUgLXByb3h5IGFuZCAKICAgICAgICAgICAgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgZGVwcmVjYXRlZC4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZSAKICAgICAgICAgICAgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRoZW4gdXNlIHRoZSBuZXcgLW5vcHJveHkgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZW1haW5pbmcgcHJhZ21hcyBzaGFrZXVwLiBUaGVzZSB3ZXJlIHRoZSByZW1haW5pbmcgcHJhZ21hcyBhbmQgdGhlaXIKICAgICAgICAgICAgbmV3IG5hbWVzIHdoZXJlIGNoYW5nZWQ6CgogICAgICAgICAgICBtb2R1bGViYXNlCiAgICAgICAgICAgIG1vZHVsZWNvZGUKICAgICAgICAgICAgbW9kdWxlY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgbW9kdWxlaW1wb3J0ID0+IG1vZHVsZWltcG9ydHMKICAgICAgICAgICAgbW9kdWxlaW50ZXJmYWNlID0+IG1vZHVsZWludGVyZmFjZXMKCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbXBvcnRzIHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IHRvIGhvdyB0aGUgbW9kdWxlaW1wb3J0IHByYWdtYSB3b3JrZWQuIAogICAgICAgICAgICBOb3cgaXQgYWN0dWFsbHkgdGFrZXMgY29kZSB3aGljaCBnZXRzIHBsYWNlZCBiZWZvcmUgdGhlIGNsYXNzIGRlZmluaXRpb24gc28gdGhlIAogICAgICAgICAgICB3aG9sZSBpbXBvcnQgc3RhdGVtZW50IGhhcyB0byBiZSBnaXZlbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWltcG9ydHM9JXsKICAgICAgICAgICAgaW1wb3J0IGphdmEuaW8uKjsKICAgICAgICAgICAgaW1wb3J0IGphdmEubWF0aC4qOwogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1vZHVsZWludGVyZmFjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvbGQgbW9kdWxlaW50ZXJmYWNlIGluIHRoYXQgaWYgCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGlzIHJlcXVpcmVkIHRoZXkgbXVzdCBiZSBjb21tYSBzZXBhcmF0ZWQgaW4gb25lIHVzZSBvZiAKICAgICAgICAgICAgdGhlIHByYWdtYSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWludGVyZmFjZXM9IlNlcmlhbGl6YWJsZSwgTXlJbnRlcmZhY2UiCgogICAgICAgICAgICBUaGVzZSBsYXN0IHR3byBwcmFnbWFzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGphdmFpbnRlcmZhY2VzIGFuZCBqYXZhaW1wb3J0cyAKICAgICAgICAgICAgdHlwZW1hcC4KCiAgICAgICAgICAgIEEgc2ltaWxhciBzZXQgb2YgcHJhZ21hcyBoYXMgYmVlbiBpbnRyb2R1Y2VkLCBuYW1lbHk6CgogICAgICAgICAgICBqbmljbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnQKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2UKCiAgICAgICAgICAgIFRoZXNlIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIG1vZHVsZSBjb3VudGVycGFydHMuIE5vdGUgdGhhdCBwcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBtb2R1bGVYWFggcHJhZ21hcyB3b3JrZWQgb24gdGhlIG9sZCBtb2R1bGUgY2xhc3Mgd2hpY2ggaXMgbm93IGNhbGxlZCB0aGUKICAgICAgICAgICAgSk5JIGNsYXNzICh0aGUgY2xhc3Mgd2l0aCB0aGUgbmF0aXZlIGZ1bmN0aW9ucykuIFRoZSBqbmljbGFzc1hYWCBwcmFnbWFzIG5vdyAKICAgICAgICAgICAgd29yayBvbiB0aGUgbmV3IG1vZHVsZSBjbGFzcyAodGhlIGNsYXNzIHRoYXQgaGFzIGFsbCB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzLCBwbHVzIGFsbCBvdGhlcgogICAgICAgICAgICByZW1haW5pbmcgZnVuY3Rpb25zIHdoZW4gdXNpbmcgdGhlIGxvdy1sZXZlbCBwcm9jZWR1cmFsIGludGVyZmFjZSkuCgogICAgICAgICAgICBJbiBzdW1tYXJ5IHRoZSBjb250ZW50cyBvZiB0aGUgcHJhZ21hcyBtYWtlIHVwIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgPGpuaWNsYXNzaW1wb3J0cz4KICAgICAgICAgICAgPGpuaWNsYXNzbW9kaWZpZXJzPiBjbGFzcyBtb2R1bGVuYW1lIGV4dGVuZHMgPGpuaWNsYXNzYmFzZT4gaW1wbGVtZW50cyA8am5pY2xhc3NpbnRlcmZhY2VzPiB7CiAgICAgICAgICAgICAgICA8am5pY2xhc3Njb2RlPgogICAgICAgICAgICAgICAgLi4uIFNXSUcgZ2VuZXJhdGVkIGZ1bmN0aW9ucyAuLi4KICAgICAgICAgICAgfQp9CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVwcmVjYXRlZCBtb2R1bGVtZXRob2Rtb2RpZmllcnMgcHJhZ21hIGFuZCByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBhIGJldHRlciAlZmVhdHVyZSBiYXNlZCBkaXJlY3RpdmUgY2FsbGVkICVqYXZhbWV0aG9kbW9kaWZpZXJzLgogICAgICAgICAgICBBIHVzZWZ1bCBleGFtcGxlIHdvdWxkIGJlIGZvciBzeW5jaHJvbmlzYXRpb24gaW4gbXVsdGktdGhyZWFkZWQgYXBwczoKCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIGZvbyhpbnQgYSkgInB1YmxpYyBzeW5jaHJvbml6ZWQiOwoKICAgICAgICAgICAgQ2hhbmdlcyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGRlZmF1bHQgKCJwdWJsaWMiKSB0byAicHVibGljIHN5bmNocm9uaXplZCIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNldmVyYWwgZGlyZWN0aXZlcyBub3cgYWxsb3cgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICBUaGVzZSBpbmNsdWRlOgoKICAgICAgICAgICAgICAgICVtb2R1bGUobmFtZT0idmFsdWUiLCBuYW1lPSJ2YWx1ZSIsIC4uLikgbW9kdWxlbmFtZQogICAgICAgICAgICAgICAgJWltcG9ydChuYW1lPSJ2YWx1ZSIsIC4uLikgImZpbGVuYW1lLmkiCiAgICAgICAgICAgICAgICAlZXh0ZW5kKG5hbWU9InZhbHVlIiwgLi4uKSBjbGFzc25hbWUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVzZSBjdXJyZW50bHkgaGF2ZSBubyBlZmZlY3QgYW5kIGFyZSByZXNlcnZlZCBmb3IKICAgICAgICAgICAgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgICAgCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnRzIHRvIHNtYXJ0LXBvaW50ZXIgaGFuZGxpbmcuICBTV0lHIG9ubHkgcHJvdmlkZXMKICAgICAgICAgICAgZXh0cmEgc3VwcG9ydCBmb3IgYSBzbWFydC1wb2ludGVyIGlmIG9wZXJhdG9yLT4oKSByZXR1cm5zCiAgICAgICAgICAgIGEgcHJvcGVyIHBvaW50ZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CgogICAgICAgICAgICBJZiBvcGVyYXRvci0+KCkgcmV0dXJucyBhbiBvYmplY3QgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLAogICAgICAgICAgICB0aGVuIFNXSUcgZXhhbWluZXMgdGhlIHJldHVybmVkIG9iamVjdCB0byBzZWUgaWYgaXQgYWxzbwogICAgICAgICAgICBpbXBsZW1lbnRzIG9wZXJhdG9yLT4oKS4gIElmIHNvLCBTV0lHIGNoYXNlcyBvcGVyYXRvci0+KCkKICAgICAgICAgICAgdW50aWwgaXQgY2FuIGZpbmQgb25lIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cwogICAgICAgICAgICBjYXNlcyBsaWtlIHRoaXMgdG8gd29yazoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEJhciBvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpICAgICAgIyBJbnZva2VzIEZvbzo6YmxhaCgpCgogICAgICAgICAgICBUaGUgcy5ibGFoKCkgY2FsbCBhY3R1YWxseSBpbnZva2VzOgoKICAgICAgICAgICAgICAgICAgKChzLm9wZXJhdG9yLT4oKSkub3BlcmF0b3ItPigpKS0+YmxhaCgpOwogCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCB0eXBlZGVmIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vICYgRm9vUmVmOwogICAgICAgICAgICAgICAgIEZvb1JlZiBibGFoKCk7CgogICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QKICAgICAgICAgICAgY29tcGlsZS4KCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgV3JhcHBpbmcgb2Ygc3RhdGljIG1ldGhvZHMgaGFzIGJlZW4gaW1wcm92ZWQgaW4gcHJveHkgY2xhc3Nlcy4gIEluIG9sZGVyCiAgICAgICAgICAgIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhpczoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgc3RhdGljIG1ldGhvZCB3YXMgb25seSBhdmFpbGFibGUgYXMgYSBmdW5jdGlvbiBGb29fYmFyKCkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgID4+PiBGb29fYmFyKCkKCiAgICAgICAgICAgIE5vdywgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGFsc28gYmUgaW52b2tlZCB0aHJvdWdoIGFuIGluc3RhbmNlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgICAgPj4+IGYuYmFyKCkgICAgICAgICMgSW52b2tlcyBzdGF0aWMgbWV0aG9kCgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYWxsIHZlcnNpb25zIG9mIFB5dGhvbi4gIEFkZGl0aW9uYWxseSwgZm9yIFB5dGhvbi0yLjIsCiAgICAgICAgICAgIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGFzOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvby5iYXIoKQoKICAgICAgICAgICAgVGhlIG9sZC1zdHlsZSBmdW5jdGlvbiBpcyBzdGlsbCBzdXBwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSWYKICAgICAgICAgICAgeW91IGNhcmUgYWJvdXQgbWFraW5nIHlvdXIgY29kZSBhY3Jvc3MgZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbiwKICAgICAgICAgICAgZWl0aGVyIHVzZSBGb29fYmFyKCkgb3IgYWNjZXNzIHRoZSBtZXRob2QgdGhyb3VnaCBhbiBpbnN0YW5jZS4KIAowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUuICBQcm94eSBjbGFzc2VzIG5vdyB1dGlsaXplIG5ldyBQeXRob24tMi4yCiAgICAgICAgICAgIGZlYXR1cmVzIGluY2x1ZGluZyBwcm9wZXJ0aWVzIGFuZCBzdGF0aWMgbWV0aG9kcy4gIEhvd2V2ZXIsIHRoZXNlIGZlYXR1cmVzCiAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQgaW4gYSB3YXkgdGhhdCBwcm92aWRlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCiAgICAgICAgICAgIFB5dGhvbiB2ZXJzaW9ucy4gIEluIG90aGVyIHdvcmRzLCBwcm94eSBjbGFzc2VzIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMKICAgICAgICAgICAgb2YgUHl0aG9uIGFuZCBvbmx5IHVzZSBuZXcgZmVhdHVyZXMgd2hlbiBydW5uaW5nIG9uIFB5dGhvbi0yLjIuCgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAlZXh0ZW5kIHNvIHRoYXQgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbiBiZSBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHgpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqcykgeyB9OwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBib3RoIEMrKyAqYW5kKiBDLgoKMDcvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBNb3JlIG5ldyB0eXBlbWFwcyBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIGNhbiBiZSBmdXJ0aGVyIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgY29kZSBmb3IgZ2VuZXJhdGluZyB0aGUgCiAgICAgICAgICAgIGZpbmFsaXplKCkgbWV0aG9kcyAocHJveHkgY2xhc3NlcyBvbmx5KSBhbmQgdGhlIGdldENQdHIoKSBtZXRob2RzIGZvciBwcm94eSAKICAgICAgICAgICAgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhZmluYWxpemUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgICAgICAgICBfZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgdHlwZW1hcCB3aWxsIGVuYWJsZSB1c2VycyB0byBoYW5kbGUgSmF2YSBudWxsIGJ5IG92ZXJyaWRpbmcKICAgICAgICAgICAgdGhpcyB0eXBlbWFwIC0gYSByZXF1ZXN0ZWQgZmVhdHVyZS4KCiAgICAgICAgICAgIFRoZSAtbm9maW5hbGl6ZSBjb21tYW5kbGluZSBvcHRpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVGhlIGphdmFmaW5hbGl6ZQogICAgICAgICAgICB0eXBlbWFwIGlzIG1vcmUgcG93ZXJmdWwgYXMgaXQgd2lsbCBhbGxvdyB0aGUgcmVtb3ZhbCBvZiB0aGUgZmluYWxpemUgbWV0aG9kcyAKICAgICAgICAgICAgZm9yIGFsbCBvciBhbnkgb25lIG9yIG1vcmUgcGFydGljdWxhciBwcm94eSBjbGFzcy4KCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGdldENQdHJYWFgoKSBmdW5jdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHRvIGEgc3RhdGljIGZ1bmN0aW9uIGFuZAogICAgICAgICAgICBpcyBub3cgb2YgdGhlIGZvcm06CgogICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cihYWFggb2JqKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBpcyBhIHJlcXVlc3RlZCBjaGFuZ2Ugd2hpY2ggd2lsbCBhbGxvdyBKYXZhIG51bGwgcG9pbnRlcnMgdG8gYmUgdXNlZCBhcyBudWxsCiAgICAgICAgICAgIGNhbiBiZSBwYXNzZWQgaW4gZm9yIG9iai4gSG93ZXZlciwgdG8gYWNoaWV2ZSB0aGlzIHRoZSBhcHByb3ByaWF0ZSBjb2RlIG11c3QgYmUKICAgICAgICAgICAgd3JpdHRlbiB1c2luZyB0aGUgbmV3IGphdmFnZXRjcHRyIHR5cGVtYXAgZGlyZWN0aXZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGlzIGZ1bmN0aW9uIGJhY2sgaW4gdXNpbmcgdGhlCiAgICAgICAgICAgIG5ldyBqYXZhY29kZSB0eXBlbWFwOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CgogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjEyIGFuZCBTV0lHLTEuMy4xMwogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTEgYW5kIGVhcmxpZXIKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICV9CgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZGlyZWN0aXZlIHRvIGNvbnRyb2wgY29uc3RhbnQgY29kZSBnZW5lcmF0aW9uIC0gJWphdmFjb25zdC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaGFuZGxpbmcgZm9yIGhhbmRsaW5nIGNvbnN0YW50cyBpcyB0byBnZXQgdGhlIHZhbHVlIHRocm91Z2gKICAgICAgICAgICAgYSBKTkkgY2FsbCwgZWcKCiAgICAgICAgICAgICNkZWZpbmUgWUVMTE9XIDUKICAgICAgICAgICAgI2RlZmluZSBCSUcgMTIzNExMCgogICAgICAgICAgICByZXN1bHRzIGluOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gbW9kdWxlbmFtZS5nZXRfWUVMTE9XKCk7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSBtb2R1bGVuYW1lLmdldF9CSUcoKTsKCiAgICAgICAgICAgIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIEphdmEgbW9kdWxlIGluaXRpYWxpc2VkIHRoZSB2YWx1ZSB1c2luZyB0aGUgQyB2YWx1ZToKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IDU7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMjM0TEw7CgogICAgICAgICAgICBUaGlzIHdvcmtzIGluIG1vc3QgY2FzZXMsIGJ1dCB0aGUgdmFsdWUgZm9yIEJJRyB3b24ndCBjb21waWxlIGFzIDEyMzRMTCBpcyBub3QKICAgICAgICAgICAgdmFsaWQgSmF2YSBjb2RlIGFuZCB0aGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB3aHkgdGhlIGRlZmF1bHQgaXMgbm93IHRvIGdldCB0aGUgCiAgICAgICAgICAgIHZhbHVlcyB0aHJvdWdoIGEgSk5JIGNhbGwuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IHRoZXNlICdjb25zdGFudHMnIGNhbm5vdCBiZSB1c2VkIAogICAgICAgICAgICBpbiBzd2l0Y2ggc3RhdGVtZW50cy4gVGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIGFsbG93cyBvbmUgdG8gc3BlY2lmeSB0aGUKICAgICAgICAgICAgd2F5IHRoZSBjb25zdGFudCB2YWx1ZSBpcyBpbml0aWFsaXNlZCBhbmQgd29ya3MgbGlrZSBvdGhlciAlZmVhdHVyZQogICAgICAgICAgICBkaXJlY3RpdmVzLCBlZwoKICAgICAgICAgICAgJWphdmFjb25zdCgwKTsgICAgIC8vIGFsbCBjb25zdGFudHMgZnJvbSB0aGlzIHBvaW50IG9uIGFyZSBpbml0aWFsaXNlZCB1c2luZyB0aGUgQyB2YWx1ZQogICAgICAgICAgICAlamF2YWNvbnN0KDEpIEJJRzsgLy8ganVzdCBCSUcgaW5pdGlhbGlzZWQgdXNpbmcgSk5JIGNhbGwgKG11c3QgYmUgcGFyc2VkIGJlZm9yZSBCSUcgaXMgZGVmaW5lZCkKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgKioqIElNUE9SVEFOVCBDSEFOR0VTIFRPIFRIRSBQWVRIT04gTU9EVUxFICoqKgoKICAgICAgICAgICAgKDEpIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbmFibGVzIHNoYWRvdy9wcm94eSBjbGFzc2VzIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0d28gZmlsZXMgYXJlIGFsd2F5cyBjcmVhdGVkIGJ5IFNXSUcuICBGb3IKICAgICAgICAgICAgaW5zdGFuY2UsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgIC8vIGZpbGU6IGZvby5pCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBmb28KICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZW4gc3dpZyBnZW5lcmF0ZXMgdHdvIGZpbGVzICJmb29fd3JhcC5jIiBhbmQgImZvby5weSIuCgogICAgICAgICAgICAoMikgVGhlIG5hbWUgb2YgdGhlIGxvdy1sZXZlbCBDIGV4dGVuc2lvbiBtb2R1bGUgaGFzIGJlZW4gY2hhbmdlZAogICAgICAgICAgICB0byBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZQogICAgICAgICAgICB0byBjb21waWxlIHRoZSBtb2R1bGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAkIGNjIC1jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMiBmb29fd3JhcC5jCiAgICAgICAgICAgICAgICAkIGNjIC1zaGFyZWQgZm9vX3dyYXAubyAkKE9CSlMpIC1vIF9mb28uc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIGV4dHJhIHVuZGVyc2NvcmUKCiAgICAgICAgICAgIFRoaXMgbmFtaW5nIHNjaGVtZSBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIgUHl0aG9uIG1vZHVsZXMgdGhhdAogICAgICAgICAgICB1dGlsaXplIGV4dGVuc2lvbiBjb2RlLiAgRm9yIGluc3RhbmNlLCB0aGUgc29ja2V0IG1vZHVsZSBjb25zaXN0cwogICAgICAgICAgICBvZiAiX3NvY2tldC5zbyIgYW5kICJzb2NrZXQucHkiLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywKICAgICAgICAgICAgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSB3YXMgbmFtZWQgImZvb2Ntb2R1bGUuc28iLgoKICAgICAgICAgICAgKDMpIEEgbmV3IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBpbnNlcnQgUHl0aG9uIGNvZGUgaW50bwogICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyAucHkgZmlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVweXRob25jb2RlICV7CiAgICAgICAgICAgICAgICBkZWYgZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkhlbGxvIFdvcmxkIgogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2R1bGVzIGFzIGEgbWl4IG9mIEMgYW5kIFB5dGhvbi4KICAgICAgICAgICAgIFB5dGhvbiBjb2RlIGlzIHNlYW1sZXNzbHkgYWRkZWQgdG8gdGhlIG1vZHVsZS4KCiAgICAgICAgICAgICg0KSBUaGUgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICBUaGlzIGlzIHR1cm5lZCBvbgogICAgICAgICAgICBieSBkZWZhdWx0LgoKICAgICAgICAgICAgKDUpIFRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGV4dHJhIHB5dGhvbiBmaWxlLCB1c2UgdGhlICItbm9wcm94eSIKICAgICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGxpa2VseSBicmVhayB0aGUgYnVpbGQgZW52aXJvbm1lbnQgb2YgcHJvamVjdHMgdGhhdAogICAgICAgICAgICB1dGlsaXplIHNoYWRvdyBjbGFzc2VzLiAgIFRvIGZpeCB0aGlzLCB5b3UgcHJvYmFibHkgb25seSBuZWVkIHRvCiAgICAgICAgICAgIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IC5zbyBmaWxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIE1ha2VmaWxlIGluZm9ybWF0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBleGFtcGxlY21vZHVsZS5zbwoKICAgICAgICAgICAgSnVzdCBjaGFuZ2UgaXQgdG86CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gX2V4YW1wbGUuc28KCiAgICAgICAgICAgICoqKiBET0NVTUVOVEFUSU9OIFVQREFURSAqKioKICAgICAgICAgICAgVGhlIGZpbGUgRG9jL01hbnVhbC9QeXRob24uaHRtbCBoYXMgYmVlbiB1cGRhdGVkIHRvIGRlc2NyaWJlIHRoZXNlIGNoYW5nZXMuCgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtbm9leHRlcm4gb3B0aW9uLiAgIElmIHN1cHBsaWVkLCBTV0lHIHdpbGwgbm90IGdlbmVyYXRlCiAgICAgICAgICAgIGV4dHJhIGV4dGVybiBkZWNsYXJhdGlvbnMuICBUaGlzIGlzIHNvbWV0aW1lcyBhbiBpc3N1ZSBvbiAKICAgICAgICAgICAgbm9uLXVuaXggcGxhdGZvcm1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIHdhcm5pbmcgZm9yIGlnbm9yZWQgZnJpZW5kIGZ1bmN0aW9ucy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzQ0OTggXSAtcHJveHkgYW5kICVpbmNsdWRlICJwb2ludGVyLmkiIGNsYXNoLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYXZpZCBDcmVhc3kuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc2MTAzIF0gZ2xvYmFsIGRlc3RydWN0aW9uIHdhcm5pbmcgd2l0aCBzaGFkb3cuCiAgICAgICAgICAgIFBlcmwgZXh0ZW5zaW9ucyBzaG91bGQgbm8gbG9uZ2VyIHJlcG9ydCB0aGUgd2FybmluZwoKICAgICAgICAgICAgICAgIlVzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGR1cmluZyBnbG9iYWwgZGVzdHJ1Y3Rpb24uIgogCiAgICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoICJwZXJsIC13Ii4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJyZXR0IFdpbGxpYW1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbiBDKysgbW9kZSwgU1dJRyBub3cgYWx3YXlzIGRlZmluZXMgbmFtZXNwYWNlIHN0ZC4gIEJ5IGRlZmF1bHQsCiAgICAgICAgICAgIGl0J3MgZW1wdHkuICBIb3dldmVyLCB0aGlzIHdpbGwgc2lsZW5jZSBlcnJvcnMgZnJvbSBwcm9ncmFtcwogICAgICAgICAgICB0aGF0IGluY2x1ZGUgc3RhdGVtZW50cyBzdWNoIGFzICJ1c2luZyBuYW1lc3BhY2Ugc3RkOyIuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgQnVnIFsgNTg0MDE3IF0gdXNpbmcgbmFtZXNwYWNlIHN0ZCBnZW5lcmF0ZXMgZXJyb3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDcvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIG5ldyB3YXJuaW5nIG1lc3NhZ2UgZm9yICVhcHBseS4gIElmIHlvdSB1c2UgJWFwcGx5IGJ1dCBubyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgZGVmaW5lZCwgeW91IHdpbGwgZ2V0IGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBzaG91bGQgaGVscCB3aXRoCiAgICAgICAgICAgIHByb2JsZW1zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqT1VUUFVUIHsgLi4uIH07CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMgb2YgU1dJRywgdGhpcyBzaWxlbnRseSBkaWQgbm90aGluZy4gIE5vdyB5b3UgZ2V0IGFuIGVycm9yIGxpa2UgdGhpczoKICAKICAgICAgICAgICAgICAgICAgIGZpbGU6bGluZS4gV2FybmluZy4gQ2FuJ3QgYXBwbHkgKGNoYXIgKk9VVFBVVCkuIE5vIHR5cGVtYXBzIGFyZSBkZWZpbmVkLgoKMDcvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdGFydGVkIEphdmEgcHJhZ21hIGRlcHJlY2F0aW9uLiBSZXBsYWNlbWVudHMgdXNlICV0eXBlbWFwIGJhc2VkIAogICAgICAgICAgICBkaXJlY3RpdmVzIGFuZCBlbmFibGUgcHJveHkgY2xhc3NlcyBhbmQgdGhlIG5ldyB0eXBlIHdyYXBwZXIgY2xhc3NlcyB0byBiZSAKICAgICAgICAgICAgdGFpbG9yZWQgaW4gdmFyaW91cyB3YXlzLiBUaGVzZSBhcmUgdGhlIG5ldyB0eXBlbWFwczoKICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlKSAgICAgICAgICAgLSBiYXNlIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIC0gY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgSmF2YSBjbGFzczogZGVmYXVsdCBpcyAicHVibGljIgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgICAgICAgICAgIC0gamF2YSBjb2RlIGlzIGNvcGllZCB2ZXJiYXRpbSB0byB0aGUgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgICAgICAgIC0gaW1wb3J0IHN0YXRlbWVudHMgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWludGVyZmFjZXMpICAgICAtIGludGVyZmFjZXMgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgIAogICAgICAgICAgICBBbmQgdGhlc2UgYXJlIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZXMgYmVpbmcgZGVwcmVjYXRlZDoKICAgICAgICAgICAgYWxsc2hhZG93YmFzZQogICAgICAgICAgICBhbGxzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbGxzaGFkb3djb2RlCiAgICAgICAgICAgIGFsbHNoYWRvd2ltcG9ydAogICAgICAgICAgICBhbGxzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgc2hhZG93YmFzZQogICAgICAgICAgICBzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBzaGFkb3djb2RlCiAgICAgICAgICAgIHNoYWRvd2ltcG9ydAogICAgICAgICAgICBzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0YXJnZXQgYSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgRm9vICJpbXBvcnQgamF2YS51dGlsLioiOwogICAgICAgICAgICBvciBhIHBhcnRpY3VsYXIgdHlwZSB3cmFwcGVyIGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgZG91YmxlKiAiaW1wb3J0IGphdmEubWF0aC4qIjsKICAgICAgICAgICAgTm90ZSB0aGF0ICRqYXZhY2xhc3NuYW1lIGluIHRoZXNlIHR5cGVtYXBzIGFyZSBzdWJzdGl0dXRlZCB3aXRoIGVpdGhlciB0aGUgcHJveHkgCiAgICAgICAgICAgIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMgb3IgdGhlIFNXSUdUWVBFIGNsYXNzIG5hbWUuCgowNy8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgbW9kdWxlIG92ZXJoYXVsIHRvIGltcGxlbWVudCBzdGF0aWMgdHlwZSBjaGVja2luZyBvZiBhbGwgCiAgICAgICAgICAgIHR5cGVzLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIDEpIENoYW5nZXMgd2hlbiB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgUHJldmlvdXNseSB3aGVuIHdyYXBwaW5nIGdsb2JhbCBmdW5jdGlvbnM6IAoKICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNze307CiAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyogcyk7CiAgICAgICAgICAgIFNvbWVDbGFzcyogYmFyKCk7CgogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZCBwcm90b3R5cGVzIHVzZWQgYSBsb25nIGZvciBwb2ludGVycyBhbmQgbG9va2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZm9vKGxvbmcgamFyZzEpOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBiYXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIHVubGlrZSBtZW1iZXIgZnVuY3Rpb25zIG9mIGEgQysrIGNsYXNzIHRoZXJlIHdhcyBubyB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNhbGxzIAogICAgICAgICAgICB0byBtYWtlIHRoZSB1c2Ugb2YgdGhlbSBtb3JlIHVzZXIgZnJpZW5kbHkuIFRoZXkgd291bGQgYmUgdXNlZCBmcm9tIEphdmEgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBuZXcgU29tZUNsYXNzKG1vZHVsZW5hbWUuYmFyKCksIGZhbHNlKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocy5nZXRDUHRyU29tZUNsYXNzKCkpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHRoZW4gaXQgd291bGQgbm90IGhhdmUgCiAgICAgICAgICAgIGJlZW4gcG9zc2libGUgdG8gY2FsbCBhbnkgcHJveHkgbWVtYmVyIGZ1bmN0aW9ucyBpbiBTb21lQ2xhc3M6CgogICAgICAgICAgICBsb25nIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oU29tZUNsYXNzIHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTb21lQ2xhc3MgYmFyKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hpY2ggbWVhbnMgdGhlc2UgZnVuY3Rpb25zIGNhbiBub3cgYmUgdXNlZCBtb3JlIG5hdHVyYWxseSB3aXRoIHByb3h5IGNsYXNzZXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgMikgQ2hhbmdlcyB3aGVuIG5vdCB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZSBzbyBjYWxsZWQgbG93LWxldmVsIGludGVyZmFjZSB3YXMgcmF0aGVyIGxvdy1sZXZlbCBpbmRlZWQuIFRoZSAKICAgICAgICAgICAgbmV3IHN0YXRpYyB0eXBlIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGxlc3Mgc28gYnV0IGl0IHJlbWFpbnMgYQogICAgICAgICAgICBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgQy9DKysgd29ybGQuIFByb3h5IGNsYXNzZXMgYXJlIHRoZSBvYnZpb3VzIHdheSB0byB1c2UKICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgY29kZSwgYnV0IGZvciB0aG9zZSB3aG8gd2FudCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFsbCBub24tcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIG5vdyBoYXZlIGEgc2ltcGxlIEphdmEgY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEMvQysrIHR5cGUuIFBvaW50ZXJzIGFuZAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcmUgYWxzbyB3cmFwcGVkIGJ5IHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgdHlwZQogICAgICAgICAgICB3cmFwcGVyIGNsYXNzbmFtZXMgYXJlIGJhc2VkIG9uIHRoZSBTV0lHIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIG90aGVyIGxhbmd1YWdlIAogICAgICAgICAgICBtb2R1bGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEMvQysrIHR5cGUgICAgICBKYXZhIHR5cGUgd3JhcHBlciBjbGFzcyBuYW1lCiAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGludCogICAgICAgICAgICBTV0lHVFlQRV9wX2ludAogICAgICAgICAgICBkb3VibGUqKiAgICAgICAgU1dJR1RZUEVfcF9wX2RvdWJsZQogICAgICAgICAgICBTb21lQ2xhc3MqICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzJiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwoKICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd3JhcHBlZCBieSBTV0lHIGlzIGFjY2Vzc2VkIHZpYSBhIHBvaW50ZXIgZXZlbiB3aGVuIHdyYXBwaW5nIAogICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBwYXNzIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4gU28gdGhlIHByZXZpb3VzIGV4YW1wbGUgd291bGQgbm93IGJlIAogICAgICAgICAgICB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzIHMgPSBleGFtcGxlLmJhcigpOwogICAgICAgICAgICBleGFtcGxlLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0eXBlZGVmcyB0aGF0IFNXSUcga25vd3MgYWJvdXQgYXJlIHJlc29sdmVkLCBzbyB0aGF0IGlmIG9uZSBoYXMgCgogICAgICAgICAgICBjbGFzcyBGb297fTsKICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgdGhlbiBhbnkgdXNlIG9mIEJhciB3aWxsIHJlcXVpcmUgb25lIHRvIHVzZSBTV0lHVFlQRV9wX0ZvbzsKCiAgICAgICAgICAgIFNvbWUgY29uc2lkZXJhdGlvbnM6CiAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgbWFrZSBhIGZpcm0gZGVjaXNpb24gdG8gdXNlIGVpdGhlciBwcm94eSBjbGFzc2VzIG9yIHRoZSBmdW5jdGlvbmFsIAogICAgICAgICAgICBpbnRlcmZhY2UgZWFybHkgb24gYXMgdGhlIGNsYXNzbmFtZXMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgICAgIDMpIFBvaW50ZXJzIGFuZCBub24tcGFyc2VkIHR5cGVzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIFNvbWV0aW1lcyBTV0lHIGNhbm5vdCBnZW5lcmF0ZSBhIHByb3h5IGNsYXNzLiBUaGlzIG9jY3VycyB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIAogICAgICAgICAgICBhIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHLCBidXQgaXMgdGhlbiB1c2VkIGFzIGEgdmFyaWFibGUgb3IgYSBwYXJhbWV0ZXIuIAogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgIHZvaWQgZm9vKFNuYXp6eSBzZHMpOwoKICAgICAgICAgICAgSWYgU1dJRyBoYXMgbm90IHBhcnNlZCBTbmF6enkgaXQgaGFuZGxlcyBpdCBzaW1wbHkgYXMgYSBwb2ludGVyIHRvIGEgU25henp5LgogICAgICAgICAgICBUaGUgSmF2YSBtb2R1bGUgZ2l2ZXMgaXQgYSB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIHRoZSBwb2ludGVyIGFuZCBjYWxscyBpdCAKICAgICAgICAgICAgU1dJR1RZUEVfcF9TbmF6enkuIEluIG90aGVyIHdvcmRzIGl0IGhhbmRsZXMgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVzIGFyZSAKICAgICAgICAgICAgaGFuZGxlZCBpbiB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZm9yIGFsbCAKICAgICAgICAgICAgbm9uLXByb3h5IGNsYXNzZXMsIGVnIGFsbCBwb2ludGVyIHRvIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBwcmltaXRpdmUgdHlwZXMuCgogICAgICAgICAgICA0KSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaWYgeW91IGhhdmUgYmVlbiB1c2luZyBwcm94eSBjbGFzc2VzIGFuZCAKICAgICAgICAgICAgbm8gZ2xvYmFsIHZhcmlhYmxlcy9mdW5jdGlvbnMuIE90aGVyd2lzZSBzb21lIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUuIAogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZHMgc3RpbGwgZXhpc3QgYnV0IHRoZXkgYXJlIG5vdyBpbiBhIEpOSSBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIAogICAgICAgICAgICBtb2R1bGVuYW1lSk5JLiBBcyB0aGlzIGNsYXNzIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncywKICAgICAgICAgICAgaXQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBzbyB0aGUgY2xhc3MgaGFzIGJlY29tZSBwcm90ZWN0ZWQuIFNvbWUgcHJhZ21hcy9kaXJlY3RpdmVzCiAgICAgICAgICAgIHdpbGwgaG9wZWZ1bGx5IGJlIGFkZGVkIHRvIGhlbHAgd2l0aCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgd3JhcHBpbmcgb2YgdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIHZhbHVlLiAgSnVzdCB0byBiZSBzYWZlLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSBTd2lnVmFsdWVXcmFwcGVyPD4KICAgICAgICAgICAganVzdCBpbiBjYXNlIHRoZXkgZG9uJ3QgZGVmaW5lIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoaXMKICAgICAgICAgICAgd291bGQgYmUgdXNlZCBpZiB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgIEZvbzxpbnQ+IGJsYWgoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICBtb3JlYmxhaChGb288aW50PiB4KTsKCiAgICAgICAgICAgIGJ1dCB5b3UgZGlkbid0IGluc3RhbnRpYXRlIEZvbzxpbnQ+IHVzaW5nICV0ZW1wbGF0ZS4gIAogICAgICAgICAgICBXZSBzaG91bGQgcHJvYmFibHkgYWRkIGEgd2FybmluZyBmb3IgdGhpcy4KCjA3LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYW4gZXJyb3IgY2hlY2sgdG8gZGV0ZWN0IHNoYWRvd2VkIHRlbXBsYXRlIHBhcmFtYXRlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICBpbnQgVDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciwgbm90IGEgd2FybmluZy4gIFRoaXMgd2FybmluZyBpcwogICAgICAgICAgICBhbHNvIG5lZWRlZCB0byBmaXggc29tZSByYXRoZXIgaW5zaWRpb3VzIHByb2JsZW1zIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IFQgewogICAgICAgICAgICAgICAgICAgICAgaW50ICBibGFoOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBUIFRyYWl0czsgICAgLy8gV2hpY2ggVCBpcyB0aGlzPz8/PwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBzaGFkb3dzIHRoZSBvdXRlcgogICAgICAgICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGlzIHdoYXQgeW91IHdhbnQpLgoKMDcvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFNXSUcgaXMKICAgICAgICAgICAgbXVjaCBtb3JlIGF3YXJlIG9mIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGlzOgoKICAgICAgICAgICAgICAgIGNvbnN0IGludCBTaXplID0gMTAwOwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28xMDApIEZvbzwxMDA+OwogICAgICAgICAgICAgICAgdm9pZCBiYXIoRm9vPFNpemU+ICp4KTsgICAvLyBLbm93cyB0aGF0IEZvbzxTaXplPiBpcyB0aGUgc2FtZSBhcyBGb288MTAwPjsKCjA3LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWZlYXR1cmUvJWlnbm9yZS8lcmVuYW1lIGFuZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDcvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0IHRyeSB0byBjYXRjaAogICAgICAgICAgICBleGNlcHRpb25zIGluIGluaXRpYWxpemVycy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBCYXIgYjsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgRm9vKGludCB4KSB0cnkgCiAgICAgICAgICAgICAgICAgICAgIDogYih4KSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgY2F0Y2goaW50KSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZCB3cmFwcGVycy4gIEhvd2V2ZXIsIHRoZSB0cnkgYW5kIGNhdGNoCiAgICAgICAgICAgIHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBhcmUgaWdub3JlZC4gIFNlZSBTdHJvdXN0cnVwLCAzcmQgRWQsIHNlY3Rpb24gCiAgICAgICAgICAgIDE0LjQuNi4xIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgICAgICAgCjA3LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHRlbXBsYXRlIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LiAgVGhpcyBmaXhlcwogICAgICAgICAgICB0d28gYnVncy4gIEZpcnN0LCBtaXhpbmcgYWJzdHJhY3QgbWV0aG9kcywgdGVtcGxhdGVzLCBhbmQgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uLgogCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQTxUPgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBX2ludCkgQTxpbnQ+OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQl9pbnQpIEI8aW50PjsKCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gZml4ZXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgICAgICAgICAgICBzdHJ1Y3QgQiB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3R5cGU7CiAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOwogICAgICAgICAgICAgICAgICAgdm9pZCBmb28oc2l6ZV90eXBlIGluZGV4ID0gbmluZGV4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1Z3MgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCgowNy8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1dJR19Db252ZXJ0UHRyKCkgZnVuY3Rpb24KCSAgICBmb3IgdGhlIFNXSUcvUnVieSBydW50aW1lIHN1cHBvcnQgc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoZQoJICAgIFB5dGhvbiB2ZXJzaW9uLiBJZiB0aGUgbGFzdCBhcmd1bWVudCAoZmxhZ3MpIGlzIG5vbi16ZXJvLAoJICAgIFNXSUdfQ29udmVydFB0cigpIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB0eXBlIG1pc21hdGNoZXMKCSAgICBhcyBiZWZvcmUuIElmIGZsYWdzIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgZm9yCgkgICAgdHlwZSBtaXNtYXRjaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24uIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFJVQlkgTU9EVUxFICoqKgoKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucy9tZXRob2RzL2NvbnN0cnVjdG9ycyBub3cgd29yayBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMuICBUaGUgc3VwcG9ydCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LS1qdXN0IGNhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGx5IGFuZCBTV0lHIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLiAgUGxlYXNlIHJlZmVyCiAgICAgICAgICAgIHRvIHRoZSBvdmVybG9hZGluZyBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIG5hbWVzcGFjZXMsIGVudW1zLCBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBuYW1lc3BhY2UgaGVsbG8gewogICAgICAgICAgICAgICAgICBlbnVtIEhlbGxvIHsgSGksIEhvbGEgfTsKIAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8SGVsbG8gSD4KICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIHRyYWl0czxIaT46OnZhbHVlX3R5cGUgc2F5X2hpKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0czxIaT46OnZhbHVlX3R5cGUoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNXSUcgd2Fzbid0IGdlbmVyYXRpbmcgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBxdWFsaWZpZWQgCiAgICAgICAgICAgIHRyYWl0czxIaT4uICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLiAgICAgICAgIAoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBhcnJheSB2YXJpYWJsZSB0eXBlbWFwcyBmb3IgVGNsIG1vZHVsZS4gICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgIHZhcmlhYmxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBpbnQgZm9vWzEwXTsKCiAgICAgICAgICAgIHRoZW4gYSBzZXQgZnVuY3Rpb24gbGlrZSB0aGlzIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvb19zZXQoaW50ICp4KSB7CiAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGZvbyx4LDEwKnNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIH0KCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICVmcmFnbWVudCBkaXJlY3RpdmUuICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBpdCBjYW4gYmUgZWFzeSB0bwogICAgICAgICAgICBnZXQgY2FycmllZCBhd2F5IGFuZCB3cml0ZSBhIGxvdCBvZiBjb2RlLiAgSG93ZXZlciwgZG9pbmcgc28gY2F1c2VzCiAgICAgICAgICAgIHRyZW1lbmRvdXMgY29kZSBibG9hdC4gICBBIGNvbW1vbiB3YXkgdG8gc29sdmUgdGhpcyBpcyB0byB3cml0ZSAKICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdGhlIHdyYXBwZXIgZmlsZSBnZXRzIHBvbGx1dGVkCiAgICAgICAgICAgIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuICAgIFRvIGZpeCB0aGlzLAogICAgICAgICAgICBhIG5ldyBmcmFnbWVudCBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZnJhZ21lbnQoInR5cGVfaGVscGVyIiwiaGVhZGVyIikgJXsKICAgICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAldHlwZW1hcChpbiwgZnJhZ21lbnQ9InR5cGVfaGVhZGVyIikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBjb2RlIGZyYWdtZW50IGlzIG9ubHkgZW1pdHRlZCBpZiB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhY3R1YWxseSB1c2VkLiAgIEEgc2ltaWxhciBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIGZvciBkZWNsYXJhdGlvbgogICAgICAgICAgICBhbm5vdGF0aW9uIGFuZCB0aGUgJWZlYXR1cmUgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZnJhZ21lbnQiLCJ0eXBlX2hlYWRlciIpICBTb21lRGVjbGFyYXRpb247CgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gJWZyYWdtZW50IGlzIHRoZSBmcmFnbWVudCBuYW1lLiAgVGhlIHNlY29uZCBhcmd1bWVudAogICAgICAgICAgICBpcyB0aGUgZmlsZSBzZWN0aW9uIHdoZXJlIHRoZSBmcmFnbWVudCBzaG91bGQgYmUgZW1pdHRlZC4gIAoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZGlyZWN0aXZlIGlzIGZvciB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICAgYW5kIGFkdmFuY2VkIHVzZXJzIHdhbnRpbmcgdG8gc3RyZWFtbGluZSB0eXBlbWFwIGNvZGUuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBtZW1iZXJpbiB0eXBlbWFwcyBmb3IgYWxsIGFycmF5cyBpbiBhbiBhdHRlbXB0IHRvIGVsaW1pbmF0ZQogICAgICAgICAgICBjb25mdXNpb24gYWJvdXQgdGhlaXIgdXNlLgoKMDYvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3Igc21hcnQtcG9pbnRlcnMuICBXaGVuIGEgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICBvcGVyYXRvci0+KCkgbGlrZSB0aGlzCgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgQmFyICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBsb2NhdGVzIGNsYXNzIEJhciBhbmQgdHJpZXMgdG8gd3JhcCBpdHMgbWVtYmVyIHZhcmlhYmxlcyBhbmQKICAgICAgICAgICAgbWV0aG9kcyBhcyBwYXJ0IG9mIEZvby4gIEZvciBleGFtcGxlLCBpZiBCYXIgd2FzIGRlZmluZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBZb3UgY291bGQgZG8gdGhpcyAoaW4gdGhlIHRhcmdldCBsYW5ndWFnZSk6CgogICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgIGYueCA9IDQgICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6eAogICAgICAgICAgICAgIGYuc3BhbSgpICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6c3BhbQoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZmVhdHVyZSBpcyB0byBlbXVsYXRlIHRoZSBiZWhhdmlvciBvZiBDKysKICAgICAgICAgICAgc21hcnQtcG9pbnRlcnMtLS13aGljaCBhbGxvdyBhdHRyaWJ1dGVzIHRvIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkKICAgICAgICAgICAgdGhyb3VnaCBvcGVyYXRvci0+LgoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBhdXRvbWF0aWNhbGx5IGluIFNXSUctLS1ubyBzcGVjaWFsIGRpcmVjdGl2ZXMKICAgICAgICAgICAgYXJlIG5lZWRlZC4gICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IuICBVc2UgJWlnbm9yZSB0byBpZ25vcmUgCiAgICAgICAgICAgIG9wZXJhdG9yLT4uCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA2LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJWV4Y2VwdCBkaXJlY3RpdmUuICAgJWV4Y2VwdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoKMDYvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjbGVhbnVwIG9mIHRoZSBtb2R1bGVzIGRpcmVjdG9yeS4gIEVsaW1pbmF0ZWQgbW9zdAogICAgICAgICAgICBoZWFkZXIgZmlsZXMsIGNvbnNvbGlkYXRlZCBtb2R1bGUgY29kZSBpbnRvIHNpbmdsZSBmaWxlcy4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGluc3RhbnRpYXRpb24gb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEFsbCBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzIG11c3Qgbm93IGRlZmluZSBhIGZhY3RvcnkgZnVuY3Rpb24gc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKgogICAgICAgICAgICAgICAgc3dpZ19weXRob24odm9pZCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQWVRIT04oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlbiBwbGFjZWQgaW4gYSB0YWJsZSBhbmQgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgICAgIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBpbiBzd2lnbWFpbi5jeHguICAKCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaGFzIGEgbnVtYmVyIG9mIGJlbmVmaXRzLiAgSXQgZGVjb3VwbGVzIHRoZSAKICAgICAgICAgICAgU1dJRyBtYWluIHByb2dyYW0gZnJvbSBoYXZpbmcgdG8ga25vdyBhYm91dCB0aGUgY2xhc3MKICAgICAgICAgICAgZGVmaW5pdGlvbnMgZm9yIGVhY2ggbW9kdWxlLiAgQWxzbywgYnkgdXNpbmcgYSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGVhc2llciB0byBpbXBsZW1lbnQgZHluYW1pYyBsb2FkaW5nCiAgICAgICAgICAgIG9mIG1vZHVsZXMgKHNpbXBseSBsb2FkIHRoZSBmaWxlIGFuZCBpbnZva2UgdGhlIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24pLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIHJlZmVyZW5jZSBjb252ZXJzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vICYoKTsKCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciBvcGVyYXRvciBuZXdbXSBhbmQgb3BlcmF0b3IgZGVsZXRlW10uCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBwcm9ibGVtIGZvciBjb25zdGFudHMgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIGludm9sdmluZyB0ZW1wbGF0ZXMuCgowNi8xOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgYSBidWcgZm9yIHRoZSAnLWZlYXR1cmUnIGNvbW1hbmQgbGluZSBhcmd1bWVudDsKICAgICAgICAgICAgdGhhdCBzZXR0aW5nIHdhcyBlZmZlY3RpdmVseSBiZWluZyBpZ25vcmVkIGFuZCBzbyB0aGUgZmVhdHVyZQogICAgICAgICAgICBuYW1lIHdhcyBhbHdheXMgc2V0IGVxdWFsIHRvIHRoZSBtb2R1bGUgbmFtZS4KCjA2LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbXMgd2l0aCBzdGF0aWMgbWVtYmVycyBhbmQgZW51bXMgaW4gdGVtcGxhdGVzLgoKVmVyc2lvbiAxLjMuMTMgKEp1bmUgMTcsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQowNi8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggX19GSUxFX18gZXhwYW5zaW9uIGluIHRoZSBwcmVwcm9jZXNzb3IuICAgT24gV2luZG93cywKICAgICAgICAgICAgdGhlIGJhY2tzbGFzaCAoXCkgaXMgbm93IGNvbnZlcnRlZCB0byAoXFwpIGluIHRoZSBzdHJpbmcgbGl0ZXJhbAogICAgICAgICAgICB1c2VkIGZvciBfX0ZJTEVfXy4gIFJlcG9ydGVkIGJ5IFN0ZXZlIEdsYXNlci4KCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICduYW1lIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0Jy4gIFRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGZvciBwdWJsaWMgbWV0aG9kcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KIAowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogICAgICAgICAgICBhbmQgbmFtZXNwYWNlcy4gICBXaGVuIFNXSUcgZXhwYW5kcyBhIHRlbXBsYXRlLCBpdCBkb2VzCiAgICAgICAgICAgIHNvIHdpdGggZnVsbHkgcmVzb2x2ZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28geyB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRG91YmxlOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvb19kKSBmb288RG91YmxlPjsKCiAgICAgICAgICAgIHRoZW4sIGl0IGlzIGhhbmRsZWQgYXMgZm9vPGRvdWJsZT4gaW4gdGhlIHR5cGVzeXN0ZW0uCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4KCjA2LzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGJvb2wgdHlwZW1hcHMgZm9yIElOUFVULCBPVVRQVVQgYW5kCgkgICAgSU5PVVQgaW4gTGliL3J1YnkvdHlwZW1hcHMuaS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBhIGNvdXBsZSBvZiBicm9rZW4gcHJhZ21hcy4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHVubmVjZXNzYXJ5IGNhc3Qgd2hlbiB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGUgd2hlcmUgCiAgICAgICAgICAgIHRoZSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRyAtIEphdmEgdmFyaWFibGVzIGV4YW1wbGUgCiAgICAgICAgICAgIGZhaWx1cmUgYXMgcmVwb3J0ZWQgYnkgTGFycnkgVmlyZGVuLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAldGVtcGxhdGUgdG8gYWxsb3cgZm9yIGVtcHR5IGluc3RhbnRpYXRpb25zLgoKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgZm9vPGludCxpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWdpc3RlcnMgZm9vPGludCxpbnQ+IHdpdGggdGhlIHR5cGUgc3lzdGVtLCBidXQKICAgICAgICAgICAgZG9lc24ndCB3cmFwIGl0IChzYW1lIGFzICVpZ25vcmUpLiAgIFRoaXMgbWF5IG9ubHkgYmUgYQogICAgICAgICAgICB0ZW1wb3JhcnkgbWVhc3VyZS4gICBTV0lHIG1pZ2h0IGJlIGFibGUgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgaW4gY2VydGFpbiBjYXNlcy4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgZnVuY3Rpb24gcHJvdG90eXBlIHByb2JsZW1zIHdpdGggVGNsIDguNAoKMDYvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGFuZCBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzZXMuICAKICAgICAgICAgICAgVGhpcyBvbmUgaXMgYSBsaXR0bGUgbWluZC1iZW5kaW5nLCBidXQgaGVyZSBpcyBhbiBleGFtcGxlCiAgICAgICAgICAgIHRoYXQgaWxsdXN0cmF0ZXM6CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0eXBlZGVmIEFyZ1R5cGUgYXJnX3R5cGU7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgUmVzVHlwZSByZXNfdHlwZTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IEZ1bmN0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQUYsIGNsYXNzIEFHPgogICAgICAgICAgICAgc3RydWN0IENsYXNzIDogRnVuY3Rpb248dHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OmFyZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OnJlc190eXBlPgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAldGVtcGxhdGUodHJhaXRzX2RkKSB0cmFpdHMgPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShGdW5jdGlvbl9kZCkgRnVuY3Rpb24gPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShDbGFzc19kZCkgQ2xhc3MgPGRvdWJsZSwgZG91YmxlPjsKCgogICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBiYXNlIGNsYXNzIG9mICdDbGFzcycgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSwgYnV0IHRoZSB0eXBlcyBhcmUgb2J0YWluZWQgdGhyb3VnaCB0eXBlZGVmcy4KICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGlzLCBTV0lHIGNvdWxkIG5vdCBsb2NhdGUgdGhlIHdyYXBwZWQgYmFzZSBjbGFzcwogICAgICAgICAgICAoRnVuY3Rpb248ZG91YmxlLGRvdWJsZT4pLiAgIFNob3VsZCBiZSBmaXhlZCBpbiAxLjMuMTMgZXZlbgogICAgICAgICAgICB0aG91Z2ggSSBjYW4gdGhpbmsgb2YgYSBtaWxsaW9uIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0CiAgICAgICAgICAgIGFsc28gYmUgYnJva2VuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb252ZXJzaW9uIG9wZXJhdG9ycy4gIElmIHlvdSBoYWQgYW4KICAgICAgICAgICAgb3BlcmF0b3IgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CgogICAgICAgICAgICBTV0lHIHdhcyBvbW1pdHRpbmcgdGhlICJjb25zdCIgcXVhbGlmaWVyLiAgVGhpcyBhZmZlY3RlZAogICAgICAgICAgICAlcmVuYW1lIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgUmVwb3J0ZWQgYnkgWmhvbmcgUmVuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBMZXNzZW5lZCB0aGUgc3RyaWN0bmVzcyBvZiBhYnN0cmFjdCBjbGFzcyBjaGVja2luZy4gIElmCiAgICAgICAgICAgIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBtZXRob2QoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBTV0lHIHdpbGwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzCiAgICAgICAgICAgICBmb3IgQmFyLiAgSG93ZXZlciwgaXQgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIAogICAgICAgICAgICAgdGhhdCAiQmFyIiBtaWdodCBiZSBhYnN0cmFjdCAoc2luY2UgbWV0aG9kKCkgaXNuJ3QgZGVmaW5lZCkuCiAgICAgICAgICAgICBJbiBTV0lHLTEuMy4xMiwgU1dJRyByZWZ1c2VkIHRvIGdlbmVyYXRlIGEgY29uc3RydWN0b3IgYXQgYWxsLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIElmIHlvdSBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgSXQgaXMgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIHRoaXM6CiAKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBTV0lHLTEuMy4xMiB0cmllZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb3V0c2lkZSBvZiB0aGUgbmFtZXNwYWNlCiAgICAgICAgICAgIHVzaW5nIHNvbWUgdHJpY2suICBIb3dldmVyLCB0aGlzIHdhcyBleHRyZW1lbHkgcHJvYmxlbWF0aWMgYW5kIGZ1bGwKICAgICAgICAgICAgaG9sZXMuICAgVGhpcyB2ZXJzaW9uIGlzIHNhZmVyLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBzY29wZSBxdWFsaWZpY2F0aW9uIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgQTxCOjpDPjo6REQKCiAgICAgICAgICAgIEJlZm9yZSwgdGhpcyB3YXMgc2VwYXJhdGVkIGFzIHNjb3BlcyBBPEIsIEM+LCBhbmQgREQuICBGaXhlZCBub3cuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFsbG93IHRoZSBmb2xsb3dpbmcgc3ludGF4OiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGNsYXNzIEEgeyB9OwogICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgeyAuLi4gfTsKCiAgICAgICAgICAgIEEgYmFzZSBjbGFzcyB3aXRob3V0IGEgc3BlY2lmaWVyIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljIGZvciBhIHN0cnVjdC4KIAowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJvYmxlbXMgd2l0aCAlcmVuYW1lIGRpcmVjdGl2ZSBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgZXhwYW5zaW9uLgoKICAgICAgICAgICAgQ29kZSBsaWtlIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoKSBmb288ZG91YmxlPjo6bWV0aG9kOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh3aGF0ZXZlcikgZm9vPGRvdWJsZT47CgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlc29sdmVkIHNvbWUgdHJpY2t5IGlzc3VlcyBvZiBtdWx0aS1wYXNzIGNvbXBpbGF0aW9uIGFuZCAKICAgICAgICAgICAgYW5kIGluaGVyaXRhbmNlLiAgVGhlIGZvbGxvd2luZyBzaXR1YXRpb24gbm93IGdlbmVyYXRlcwogICAgICAgICAgICBhbiBlcnJvcjoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgaW5jb21wbGV0ZSBjbGFzc2VzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyOwogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGFuIHVuZGVmaW5lZCBjbGFzcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OyAgLy8gQmFyIHVuZGVmaW5lZAoKICAgICAgICAgICAgVGhpcyBmaXhlcyBhIGZhaWxlZCBhc3NlcnRpb24gYnVnIHJlcG9ydGVkIGJ5IEphc29uIFN0ZXdhcnQuCgowNi8wNS8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBSdWJ5IG1vZHVsZSBhYm91dCB0aGUgbGFjawogICAgICAgICAgICBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4gT25seSB0aGUgZmlyc3QgYmFzZSBjbGFzcwogICAgICAgICAgICBsaXN0ZWQgaXMgdXNlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4gKFJlcG9ydGVkIGJ5IENyYWlnCiAgICAgICAgICAgIEZpbGVzKS4KICAgICAgICAgICAgCjA2LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBzdHJ1Y3QgZGVjbGFyYXRpb25zIGFuZCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vIEZvbzsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQSBmZXcgb3RoZXIgc3VidGxlIHN0cnVjdCByZWxhdGVkIHR5cGluZyBwcm9ibGVtcyB3ZXJlCiAgICAgICAgICAgIGFsc28gcmVzb2x2ZWQuCgpWZXJzaW9uIDEuMy4xMiAoSnVuZSAyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHJlbGF0ZWQgdG8gZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgJ21ha2UgdW5pbnN0YWxsJyB0YXJnZXQuICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgYnVnIHdpdGggJXJlbmFtZSwgJWZlYXR1cmUgYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHZlY3Rvcjo6X19nZXRpdGVtX18gewogICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIEZpbmUKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBPb3BzLgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdywgdGhlICVleGNlcHRpb24gZGlyZWN0aXZlIChhbmQgb3RoZXIgZmVhdHVyZXMpIHNob3VsZCBjb3JyZWN0bHkgYXBwbHkgdG8KICAgICAgICAgICAgYm90aCB2ZWN0b3IgYW5kIHNwZWNpYWxpemF0aW9ucy4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZXMgdG8gJXRlbXBsYXRlKCkgZGlyZWN0aXZlLiAgIFRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIHJlZHVjZWQgdG8gcHJpbWl0aXZlIHR5cGVzIGluIHRlbXBsYXRlIG1hdGNoaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAuLi4gcGFydGlhbCBzcGVjaWFsaXphdGlvbiAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKkludFB0cjsgICAgIC8vIEdyb3NzIHR5cGVkZWYKCiAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFib3ZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvckludFB0cikgdmVjdG9yPEludFB0cj47CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBleHRyZW1lbHkgc3VidGxlLCBidXQgaXQgZml4ZXMgYSBudW1iZXIgb2YgcG90ZW50aWFsCiAgICAgICAgICAgIGhvbGVzIGluIEx1aWdpJ3MgU1RMIGxpYnJhcnkgbW9kdWxlcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JpKSB2ZWN0b3I8aW50PjsKCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyB0eXBlbWFwIGJ1ZyByZWxhdGVkIHRvIGNvbnN0LiAgY29uc3QKICAgICAgICAgICAgd2FzIGJlaW5nIGRpc2NhcmRlZCB0aHJvdWdoIHR5cGVkZWZzLgoKMDUvMjkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGlucHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyAoaW4gTGliL3J1YnkvcnVieS5zd2cpLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgamF2YSBhcnJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGVuY2xvc2VkIGJ5IAogICAgICAgICAgICBhIFNXSUdfTk9BUlJBWVMgI2RlZmluZS4gVXNlZnVsIGlmIG5vdCB1c2luZyBhcnJheXMgYW5kIAogICAgICAgICAgICBpdCBpcyBkZXNpcmFibGUgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBjb21waWxlZCBjb2RlLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBFbnVtcyB3ZXJlIG5vdCByZW5hbWVkIHdoZW4gdXNpbmcgJW5hbWUgb3IgJXJlbmFtZQogICAgICAgICAgICBmaXguCgowNS8yOC8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUKCSAgICAibmV3IiBzaW5nbGV0b24gbWV0aG9kIGFuZCAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvcgoJICAgIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMuIFRoZSB3cmFwcGVyIG5hbWUKCSAgICBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAibmV3IiBpcyBhbGxvY19jbGFzc25hbWUgYW5kCgkgICAgdGhlIHdyYXBwZXIgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAiaW5pdGlhbGl6ZSIKCSAgICBpcyBuZXdfY2xhc3NuYW1lLgoKCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byBydW50aW1lLiAgUG9pbnRlciBjb252ZXJzaW9uL2NyZWF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICBub3cgYWxtb3N0IGFsd2F5cyBoYXZlIGFuIGV4dHJhICJmbGFncyIgYXJndW1lbnQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19Db252ZXJ0UHRyKG9iaiwgdm9pZCAqKiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXgogICAgICAgICAgICBUaGlzIGV4dHJhIHBhcmFtZXRlciBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiBhbmQgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBtb3JlIGNvbnRyb2wgb3ZlciBwb2ludGVycyBpbiBmdXR1cmUgdmVyc2lvbnMuCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCBmb3IgQysrIGNsYXNzZXMgd2l0aCBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLiAgSXQKICAgICAgICAgICAgaXMgbm93IHBvc3NpYmxlIHRvIHNhZmVseSByZXR1cm4gb2JqZWN0cyBsaWtlIHRoaXMgYnkgdmFsdWUuCiAgICAgICAgICAgIENhdmVhdDogIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yLgoJICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIC1wcm94eSBvcHRpb24gYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLiAgVGhpcyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyAtc2hhZG93LiAgV2UgYXJlIG1lcmVseSBjaGFuZ2luZyB0ZXJtaW5vbG9neS4KICAgICAgICAgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSAtcGFja2FnZSBvcHRpb24uCiAgICAgICAgICAgIC1wYWNrYWdlIG1lcmVseSBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgdXNlZCBvbiB0aGUKICAgICAgICAgICAgd3JhcHBlcnMuICBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGZpbGUgb3IgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gIFRoaXMgd2FzCiAgICAgICAgICAgIGJyb2tlbiBhdCBzb21lIHBvaW50LCBidXQgd29ya3MgYWdhaW4gbm93LgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA0NzU0NTIgXSBtZW1vcnkgbGVhayBpbiByZXR1cm4tYnktdmFsdWUuCiAgICAgICAgICAgIFByb2JsZW0gcmVsYXRlZCB0byBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyByZXR1cm5pbmcgbmV3bHkKICAgICAgICAgICAgYWxsb2NhdGVkIG9iamVjdHMuIFJlcG9ydGVkIGJ5IFJveSBMZWNhdGVzLgogCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNTEzMTM0IF0gJUJMRVNTRURNRU1CRVJTIGlzbid0IGFsd2F5cyByaWdodC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxldXIgRGlhbmEgRHJhZ2FuLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDczNSBdIC1pbXBvcnRhbGwgYW5kIHRoZSAtSSBvcHRpb24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtndWlsZV0gRml4ZWQgWyA1MzI3MjMgXSBEZWZhdWx0IGFyZyBmb3IgY2hhciogY2FuIFNlZ1YuICAKICAgICAgICAgICAgRXJyb3IgaW4gZ3VpbGUgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gdHlwZW1hcCBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlICJmcmVlYXJnIgogICAgICAgICAgICB0eXBlbWFwIG11c3QgZXhhY3RseSBtYXRjaCB1cCB3aXRoIHRoZSAiaW4iIG9yICJpZ25vcmUiCiAgICAgICAgICAgIHR5cGVtYXAuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChjaGFyICpkYXRhLCBpbnQgbGVuKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGNoYXIgKmRhdGEgeyAuLi4gfTsgCgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKmRhdGEsIGludCBsZW4pOwoKICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlICJpbiIgdHlwZW1hcCBpcyBhcHBsaWVkLCBidXQgdGhlCiAgICAgICAgICAgICBmcmVlYXJnIHR5cGVtYXAgaXMgbm90LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBmcmVlYXJnCiAgICAgICAgICAgICB0eXBlbWFwIGRvZXNuJ3QgbWF0Y2ggdXAgd2l0aCB0aGUgaW5wdXQgYXJndW1lbnQgc2VxdWVuY2UuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ4MjcyIF0gRGVmYXVsdCBhcmd1bWVudCBjb2RlIG1pc3NpbmcgYnJhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDc3MzAgXSBTd2lnVmFsdWVXcmFwcGVyIG5lZWRlZCBmb3IgY29uc3RydWN0b3JzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVW5kZWZpbmVkIGlkZW50aWZpZXJzIG5vdyBldmFsdWF0ZSB0byAwIHdoZW4gZXZhbHVhdGluZwogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNpZiAhRk9PCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgCiAgICAgICAgICAgIHdoZXJlIEZPTyBpcyB1bmRlZmluZWQgb3Igc2V0IHRvIHNvbWUgbm9uLW51bWVyaWMgdmFsdWUuCgogICAgICAgICAgICBGaXhlcyBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgoKIAowNS8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIEMrKyAnZXhwb3J0JyBrZXl3b3JkLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIHJlZmluZW1lbnQgb2YgdHlwZS1uYW1lIG1hbmdsaW5nIHRvIGFjY291bnQgZm9yIHBvaW50ZXJzLCBhcnJheXMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBlbWJlZGRlZCB0eXBlIGNvbnN0cnVjdHMuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluaXRpYWwgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBBdAogICAgICAgICAgICB0aGUgdmVyeSBsZWFzdCwgaXQgaXMgcGFyc2VkIGFuZCB0aGUgY2xhc3NlcyBhcmUgc3RvcmVkLiAgTWF0Y2hpbmcKICAgICAgICAgICAgb2YgaW5zdGFudGlhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyBtb3JlIGxpbWl0ZWQgYW5kIGJhc2VkIG9uCiAgICAgICAgICAgIHRoZSBTV0lHIGRlZmF1bHQgdHlwZW1hcCBydWxlczoKCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgJgoKICAgICAgICAgICAgTm93LCB3aHkgaW4gdGhlIHdvcmxkIHdvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmU/ICBPdGhlcgogICAgICAgICAgICB0aGFuIGFsbG93aW5nIGZvciBzbGlnaHRseSBtb2RpZmllZCBjbGFzcyBBUElzLCB0aGlzIGNhcGFiaWxpdHkgaXMKICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWQgdG8gcHJvdmlkZSBhZHZhbmNlZCB3cmFwcGluZyBzdXBwb3J0IGZvciBTVEwtbGlrZQogICAgICAgICAgICBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmUgbWl4ZWQgd2l0aCB0eXBlbWFwcy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKCgogICAgICAgICAgICAgICAgLyogR2VuZXJpYyB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIG9iamVjdHMgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHBvaW50ZXJzKSAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFNwZWNpYWxpemF0aW9uIChpbnRlZ2VycykuICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gICBOb3JtYWxseSwgdHlwZW1hcCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICogKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBjcmVhdGVzIGFuZCB1c2VzIHZhcmlhYmxlcyAidGVtcDEiLCJ0ZW1wMiIsIAogICAgICAgICAgICAidGVtcDMiIGFuZCBzbyBmb3J0aCBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgdGhlIHR5cGVtYXAgaXMgdXNlZC4KICAgICAgICAgICAgU29tZXRpbWVzIHlvdSB3YW50IGEgc2luZ2xlIHZhcmlhYmxlIGluc3RlYWQuICBUbyBkbyB0aGF0LCB1c2luZwogICAgICAgICAgICB0aGUgZm9sbG93aW5nIG5hbWluZyBzY2hlbWU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqKGludCBfZ2xvYmFsX3RlbXApIHsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBJcyB0aGlzIGNhc2UsIGEgc2luZ2xlIHZhcmlhYmxlIF9nbG9iYWxfdGVtcCBpcyBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9ucy4gIEl0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVtYXBzLiAgUmVwZWF0ZWQKICAgICAgICAgICAgdHlwZW1hcHMgZG8gbm90IHJlcGxpY2F0ZSB0aGUgdmFyaWFibGUtLS10aGV5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGVtaXR0ZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIHRoaXMgY29kZSwKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gKGludCBzb21ldmFyID0gMykgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWV2YXIgaXMgbm93IGVtaXR0ZWQgaW50byB0aGUgd3JhcHBlciBjb2RlLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCAlZXh0ZW5kIHRvIGJlIGJldHRlciBiZWhhdmVkIGluIG5hbWVzcGFjZXMuICBJZiB5b3UgaGF2ZSBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICBTV0lHIG1hdGNoZXMgdGhlIGJsYWgoKSBtZXRob2QgdG8gYSBDIGZ1bmN0aW9uIG5hbWVkIAogICAgICAgICAgICB2b2lkIGZvb19iYXJfYmxhaChmb286OmJhciAqc2VsZikuCgogICAgICAgICAgICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLW5hbWVzcGFjZSB2ZXJzaW9uLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZXM6IGNwb2ludGVyLmksIGNhcnJheXMuaSwgY21hbGxvYy5pLiAgVGhlc2UKICAgICAgICAgICAgcHJvdmlkZSBhY2Nlc3MgdG8gQyBwb2ludGVycyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9MaWJyYXJ5Lmh0bWwgZm9yIGRldGFpbHMuCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEMgdHlwZSBjaGFyIG5vIGxvbmdlciBtYXBzIHRvIEphdmEgdHlwZSBieXRlLCBidXQgdG8gSmF2YSB0eXBlIGNoYXIuCiAgICAgICAgICAgIEl0IGlzIG5vdyB0cmVhdGVkIGFzIGEgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGEgc2lnbmVkIG51bWJlci4gVGhpcyBmaXRzIGluCiAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGlzIGEgbW9yZSBuYXR1cmFsIG1hcHBpbmcgYXMgY2hhciogaXMgCiAgICAgICAgICAgIG1hcHBlZCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIEMgc2lnbmVkIGNoYXIgdHlwZSBpcyBzdGlsbAogICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGJ5dGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEltcHJvdmVkIGNvbnN0YW50cyB3cmFwcGluZy4gQ29uc3RhbnRzICgjZGVmaW5lIGFuZCAlY29uc3RhbnQpIHZhbHVlcyAKICAgICAgICAgICAgYXJlIG5vdyBvYnRhaW5lZCB0aHJvdWdoIGEgSk5JIGNhbGwuIFByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBjb21waWxlZCBhcyAKICAgICAgICAgICAgSmF2YSBjb2RlLCBidXQgdGhpcyBkaWRuJ3Qgd29yayBmb3IgYWxsIGNhc2VzLCBlZyAjZGVmaW5lIDEyM1VMTC4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCBDKysKICAgICAgICAgICAgYWNjZXNzIHNwZWNpZmllcnMuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOYW1lc3BhY2VzIGFuZCBlbnVtcyBub3cgd29yayBjb3JyZWN0bHkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIEJhciB7IEEsIEIgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXR5cGVzIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgIGluIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgJXR5cGVzKEZvbyA9IEJhcik7CgogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBGb28gaXNhIEJhci4gICAgVXNpbmcgdGhpcyBpcyBwb3RlbnRpYWxseSBxdWl0ZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gY2FzZXMgKGFuZCBpbiB0aGUgU1dJRyBsaWJyYXJ5KS4KICAgICAgICAgICAgCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJW5vZGVmYXVsdCBhbmQgJW1ha2VkZWZhdWx0IGRpcmVjdGl2ZXMgbm93IHJlcXVpcmUgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQ7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdDsKCiAgICAgICAgICAgIEluIGFkZGl0aW9uIGJvdGggZGlyZWN0aXZlcyBjYW4gdGFrZSBhIGNsYXNzIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0IEZvbzsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28geyAgIC8qIE5vIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgLyogRGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJZiB5b3UgZG9uJ3QgdXNlIHRoZSB0cmFpbGluZyBzZW1pY29sb24sIHRoaW5ncyB3aWxsIG15c3RlcmlvdXNseSBicmVhay4KCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9yZSBpbXByb3ZlbWVudHMgdG8gdHlwZSBzeXN0ZW0gaGFuZGxpbmcuICBTV0lHIG5vdyBjb3JyZWN0bHkgaGFuZGxlcwogICAgICAgICAgICB0ZW1wbGF0ZSBuYW1lcyBhbmQgcGFyYW1ldGVycyBpbiBhIG5hbWVzcGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmFyIHsgfTsKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyPEludGVnZXI+ICp4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFsbCBvZiB0aGUgdHlwZW5hbWVzIGFyZSBwcm9wZXJseSBxdWFsaWZpZWQuCgowNS8xNy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIGRlcHJlY2F0ZWQgYnJva2VuIC1qbmljIGFuZCAtam5pY3BwIGNvbW1hbmRsaW5lIG9wdGlvbnMuIFRoZSBDIG9yIEMrKyAKICAgICAgICAgICAgSk5JIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3cgZGV0ZXJtaW5lZCBmcm9tIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjA1LzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpDQUxMIG1hY3JvcyB3aGljaCBleGlzdCBzbyB0aGF0IHRoZSBzYW1lIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIGJvdGggdGhlIEMgYW5kIEMrKyBKTkkgY2FsbGluZyBjb252ZW50aW9ucyBubyBsb25nZXIgYXBwZWFyCiAgICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm93IHBhc3NlZCB0aHJvdWdoIHRoZSAKICAgICAgICAgICAgU1dJRyBwcmVwcm9jZXNzb3Igd2hpY2ggZG9lcyB0aGUgbWFjcm8gZXhwYW5zaW9uIGZvciBlaXRoZXIgQyBvciBDKysgKGRlcGVuZGluZwogICAgICAgICAgICBvbiB3aGV0aGVyIC1jKysgaXMgcGFzc2VkIG9uIHRoZSBTV0lHIGNvbW1hbmRsaW5lKS4KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkanVzdGVkIAogICAgICAgICAgICB0byB0YWtlIGFjY291bnQgb2YgdGhpcy4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYW55IHR5cGVtYXBzIHdoaWNoIGNvbnRhaW5lZCAKICAgICAgICAgICAgSkNBTEwgbWFjcm9zIHdpdGhpbiAleyAlfSBicmFja2V0cyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgd2l0aGluIHt9IGJyYWNrZXRzIAogICAgICAgICAgICBzbyB0aGF0IHRoZSBTV0lHIHByZXByb2Nlc3NvciBjYW4gZXhwYW5kIHRoZSBtYWNyb3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENsYXNzIHRlbXBsYXRlcyBtYXkgbm93IGJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQz4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vaSkgRm9vPGludCwgQmFyPjsKICAgICAKICAgICAgICAgICAgU1dJRyBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhpcy0tLWl0J3MganVzdAogICAgICAgICAgICBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCiAgICAgICAgIAowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgdGVtcGxhdGUgc3VwcG9ydC4gIFRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0eXBlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGJvb2w+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgT2J2aW91c2x5LCBuYW1lcyBhcmUgcmVxdWlyZWQgZm9yIHRlbXBsYXRlPGNsYXNzIFQ+OwoKMDUvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbWFjcm8gZXhwYW5zaW9uIGluIHR5cGVtYXBzLiAgVGhlIHNlcXVlbmNlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHR5cGUpCgogICAgICAgICAgICBXaWxsIGV4cGFuZCBpbnRvIHRoZSBTV0lHIHR5cGUgZGVzY3JpcHRvciBzdHJ1Y3RvciBmb3IKICAgICAgICAgICAgdGhlIGdpdmVuIHR5cGUuICBUeXBlIG1heSBiZSBhbnkgYWJzdHJhY3QgZGF0YXR5cGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAqKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICgqKShpbnQsZG91YmxlKSkKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHZlY3RvcjxpbnQ+ICopCgogICAgICAgICAgICBDYXZlYXQ6IEl0IGlzICpOT1QqIGN1cnJlbnRseSBsZWdhbCB0byB1c2Ugb3RoZXIgdHlwZW1hcAogICAgICAgICAgICBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtYWNyby4gIEZvciBleGFtcGxlIAogICAgICAgICAgICAkZGVzY3JpcHRvcigkMV90eXBlKS4KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtb2RpZmljYXRpb24gaXMgdG8gYmV0dGVyCiAgICAgICAgICAgIHN1cHBvcnQgdHlwZW1hcHMgZm9yIGNvbnRhaW5lciBvYmplY3RzIG9yIHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWluZyB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSB3cmFwcGluZyBvZiByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBoYXMgYmVlbgogICAgICAgICAgICBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICBBcmd1bWVudHMgb2YgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSBub3cgcGFzc2VkCiAgICAgICAgICAgIGJ5IHZhbHVlIGFzIG9wcG9zZWQgdG8gcG9pbnRlcnMuICBSZXR1cm4gdmFsdWVzIG9mCiAgICAgICAgICAgIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgcmV0dXJuZWQgYXMgdmFsdWVzIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlcnMuCgogICAgICAgICAgICAncHJpbWl0aXZlJyBpcyBhbnkgb25lIG9mIGludCwgc2hvcnQsIGxvbmcsIGxvbmcgbG9uZywKICAgICAgICAgICAgY2hhciwgZmxvYXQsIGRvdWJsZSwgYm9vbCAoYXMgd2VsbCBhcyB1bnNpZ25lZCB2YXJpYW50cykuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvIGJldHRlciBzdXBwb3J0IEMrKyB3cmFwcGluZy0tZXNwZWNpYWxseQogICAgICAgICAgICBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHRlbXBsYXRlcyBhbmQgdGhlIFNUTC4KICAgICAgICAgICAgCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjY2VzcyB0ZW1wbGF0ZXMKICAgICAgICAgICAgaW4gYSBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBjb21wbGV4IHsKICAgICAgICAgICAgICAgICAgICAgICBUIHJlLCBpbTsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChUIF9yID0gVCgpLCBUIF9pID0gVCgpKSA6IHJlKF9yKSwgaW0oX2kpIHsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgcmVhbCgpIHsgcmV0dXJuIHJlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCBpbWFnKCkgeyByZXR1cm4gaW07IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShjb21wbGV4KSBzdGQ6OmNvbXBsZXg8ZG91YmxlPjsKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBzb21lIHZlcnkgc3VidGxlIG5hbWVzcGFjZS9zeW1ib2wgdGFibGUgCiAgICAgICAgICAgIG1hbmFnZW1lbnQgaXNzdWVzIGludm9sdmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLgogICAgICAgICAgICBJdCBtYXkgbm90IHdvcmsgaW4gY2VydGFpbiBjYXNlcy4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIHN1cHBvcnQgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKICAgICAgICAgICAgICAgc3RydWN0IHBhaXIgewogICAgICAgICAgICAgICAgIF9UMSBmaXJzdDsKICAgICAgICAgICAgICAgICBfVDIgc2Vjb25kOwogICAgICAgICAgICAgICAgIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7IH0KICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4gcGFpcihjb25zdCBwYWlyPF9VMSxfVTI+ICZ4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSwgdXNlICV0ZW1wbGF0ZSBhbmQgJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgZXhwYW5kcyB0aGUgY29uc3RydWN0b3IgaW50byBhIGRlZmF1bHQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcjoKCiAgICAgICAgICAgICAgICVleHRlbmQgcGFpciB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShwYWlyKSBwYWlyPF9UMSxfVDI+OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsLiAgT3RoZXIgdXNlcyBtYXkgYmUgYnJva2VuLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWV4dGVuZCAoJWFkZG1ldGhvZHMpIGRpcmVjdGl2ZSBubyBsb25nZXIgd29ya3MgdW5sZXNzCiAgICAgICAgICAgIGl0IGFwcGVhcnMgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIGEgY2xhc3MuICAgQW4gZXJyb3IKICAgICAgICAgICAgbWVzc2FnZSBpcyBub3cgZ2VuZXJhdGVkIChhcyBvcHBvc2VkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0KS4KCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICV3YXJuZmlsdGVyKCkgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgYXR0YWNoZXMgYSB3YXJuaW5nCiAgICAgICAgICAgIGZpbHRlciB0byBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgYW5kIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBmb287ICAgLy8gU3VwcHJlc3Mgb3ZlcmxvYWRlZCB3YXJuaW5nCiAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOyAKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIE9iamVjdDo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIGNsYXNzIE9iamVjdCB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgb25seSBzdXBwcmVzc2VzIHdhcm5pbmdzIGluIGxhdGVyIHN0YWdlcyBvZiBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRpb24uICBJdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncyByZWxhdGVkIHRvIHByZXByb2Nlc3NpbmcKICAgICAgICAgICAgb3IgcGFyc2luZy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBzdXBwb3J0cyBDOTkgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LF9fVkFfQVJHU19fKQoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50ICIuLi4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmFyaWFibGUgYXJndW1lbnRzIHdoaWNoCiAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VkIGludG8gdGhlIHNwZWNpYWwgYXJndW1lbnQgbmFtZSBfX1ZBX0FSR1NfXyBpbgogICAgICAgICAgICB0aGUgbWFjcm8gZXhwYW5zaW9uLiAgCgogICAgICAgICAgICBTV0lHIGFsc28gaW1wbGVtZW50cyB0aGUgR05VICgjIykgZXh0ZW5zaW9uIGZvciBzd2FsbG93aW5nIHRoZQogICAgICAgICAgICBwcmVjZWRpbmcgY29tbWEgd2hlbiBfX1ZBX0FSR1NfXyBpcyBlbXB0eS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsICMjX19WQV9BUkdTX18pCgogICAgICAgICAgICBIZXJlIGlzIGhvdyB0aGlzIGlzIGV4cGFuZGVkOgoKICAgICAgICAgICAgICAgZGVidWdmKCIlZCIsIDMpICAtLT4gZnByaW50ZihzdGRlcnIsIiVkIiwzKQogICAgICAgICAgICAgICBkZWJ1Z2YoIkhlbGxvIikgIC0tPiBmcHJpbnRmKHN0ZGVyciwiSGVsbG8iICkKCiAgICAgICAgICAgIChub3RpY2UgdGhlIGRlbGV0ZWQgY29tbWEpLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOC8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCiAgICAgICAgICAgIE1hbnkgY2hhbmdlcyB0byBwaHAgbW9kdWxlLiAgU2hhZG93IGNsYXNzZXMgYXJlIG5vdyBpbXBsZW1lbnRlZAogICAgICAgICAgICBlbnRpcmVseSBpbiBuYXRpdmUgQyBhbmQgbm8gbmVlZCBmb3IgcGhwLWNvZGUgc2hhZG93IHdyYXBwZXJzCiAgICAgICAgICAgIFBvcHVsYXRlZCB0ZW1wbGF0ZSBjb25maWcubTQgYW5kIE1ha2VmaWxlLmluIGFzIG5lZWRlZCBieQogICAgICAgICAgICBwaHBpemUgYXJlIGdlbmVyYXRlZC4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBIGNvcHkgY29uc3RydWN0b3IgaXMgbm93IHR1cm5lZCBpbnRvIGEgImNsb25lIgogICAgICAgICAgICBpbnN0YW5jZSBtZXRob2QgKHNlZSBEYXZlJ3MgY2hhbmdlIGZvciBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgICBkYXRlZCA0LzcvMjAwMikuIFRoaXMgc2VlbXMgbGlrZSB0aGUgYXBwcm9wcmlhdGUgdGhpbmcKICAgICAgICAgICAgdG8gZG8gZm9yIFJ1YnkgY29kZS4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDU1Mzg2NCBdIElubGluZSBkZXN0cnVjdG9yIGNvZGUgbm90IHdyaXR0ZW4uCgowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVpZ25vcmUgYmVoYXZlcyBiZXR0ZXIgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIHR5cGUgc3lzdGVtIGluIGdlbmVyYWwuICAgRm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCiAgICAgICAgICAgICVpZ25vcmUgbm93IHN1cHByZXNzZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICBvciBkZXN0cnVjdG9yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVpZ25vcmUgfkZvbzsKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIH5Gb28oKSBzaW1wbHkgImRpc2FwcGVhcmVkIiBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICAgIGNyZWF0ZWQgYSB3cmFwcGVyIGZvciBhIGRlZmF1bHQgZGVzdHJ1Y3RvciAoYXMgaWYgaXQgd2FzIG5ldmVyCiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBpbnRlcmZhY2UpLiAgSW4gU1dJRy0xLjMuMTIsICVpZ25vcmUgc3VwcHJlc3NlcwogICAgICAgICAgICB0aGUgY3JlYXRpb24gb2YgYSBkZXN0cnVjdG9yIGlmIG9uZSBpcyBhY3R1YWxseSBkZWZpbmVkLiAKCiAgICAgICAgICAgIFNpbWlsYXJseSwgZXZlbiB0aG91Z2ggYSBkZWNsYXJhdGlvbiBpcyBpZ25vcmVkLCBpbmZvcm1hdGlvbgogICAgICAgICAgICBtYXkgc3RpbGwgYmUgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUKICAgICAgICAgICAgaXMgYSB2ZXJ5IHN1YnRsZSBlcnJvciB0aGF0IGlzIGZpeGVkIGJ5IHRoaXMgY2hhbmdlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgc3RkOjpzdHJpbmc7ICAgICAgICAgLy8gUHJldmVudCBjbGFzcyB3cmFwcGluZwogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBzdHJpbmcgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgc3RyaW5nICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdm9pZCBmb28oc3RkOjpzdHJpbmcgKnMpOyAgIC8vIEJyb2tlbi4KCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIGZpeCwgJWlnbm9yZSB3b3VsZCBjYXVzZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBkaXNhcHBlYXIuCiAgICAgICAgICAgIFRoaXMsIGluIHR1cm4sIHdvdWxkIGNhdXNlIHRoZSB0eXBlbWFwIHRvIGJlIG1pc2FwcGxpZWQuIAogCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgYmV0dGVyIHN1cHBvcnQgb2YgZGVzdHJ1Y3RvcnMuICBEZXN0cnVjdG9ycyBjYW4gbm93IGJlIHByZWNpc2VseQogICAgICAgICAgICB0YWdnZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjp+Rm9vOwogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgfkJhciB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICpEZXZlbG9wZXIgd2FybmluZyogCiAgICAgICAgICAgIE9wZXJhdGlvbnMgc3VjaCBhcyByZW5hbWluZyBhbmQgZmVhdHVyZSBhdHRhY2htZW50IGZvciBjbGFzc2VzIHVzZWQgdG8KICAgICAgICAgICAgYmUgYXBwbGllZCB0byBkZXN0cnVjdG9ycyBhcyB3ZWxsLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgZGlkIHRoaXM6CiAKICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwoKICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAgICAgICAgIHRoZSBkZXN0cnVjdG9yLiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiAgTm93IHN1Y2ggb3BlcmF0aW9ucwogICAgICAgICAgICB3aWxsIG9ubHkgYXBwbHkgdG8gdGhlIGNsYXNzIGFuZCB0aGUgY29uc3RydWN0b3IuICBOb3RlOiBpZiB5b3UKICAgICAgICAgICAgd2VyZSByZWx5aW5nIG9uIHRoaXMgZm9yIGNsYXNzIHJlbmFtaW5nLCBiZSBhd2FyZSB0aGF0IHJlbmFtZWQKICAgICAgICAgICAgY2xhc3NlcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaGFuZGxlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGNsYXNzIGl0c2VsZgogICAgICAgICAgICBhbmQgbm90IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3MgKGFsdGhvdWdoCiAgICAgICAgICAgIHRoZXkgY2FuIGJlIHJlbmFtZWQgaW5kaXZpZHVhbGx5IGlmIG5lZWRlZCkuICBBcyBmYXIgYXMgSSBrbm93LAogICAgICAgICAgICB0aGUgTGFuZ3VhZ2UgY2xhc3MgaXMgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aGlzIGNhc2UgY29ycmVjdGx5LgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgc2V0IG9mIHRlc3RzLiAgVGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZXJyb3JzIGRpcmVjdG9yeSBjb250YWlucwogICAgICAgICAgICB0ZXN0cyB0aGF0IHRyeSB0byBleGVyY2lzZSBhbGwgb2YgU1dJRydzIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdGFydCBvZiBhIHdhcm5pbmcgZnJhbWV3b3JrLiAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgIHRoYXQgYXJlIHNob3duIGluIHdhcm5pbmcgbWVzc2FnZXMuICAgVGhlc2UgY2FuIGJlIHN1cHByZXNzZWQgdXNpbmcgdGhlCiAgICAgICAgICAgIC13IG9wdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIsMzA1IGV4YW1wbGUuaQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlICNwcmFnbWEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXM6CgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIsMzA1CgogICAgICAgICAgICBOb3RlOiBTaW5jZSBTV0lHIGlzIGEgbXVsdGktcGFzcyBjb21waWxlciwgdGhpcyBwcmFnbWEgc2hvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgdXNlZCB0byBjaGFuZ2UgZ2xvYmFsIHNldHRpbmdzIG9mIHRoZSB3YXJuaW5nIGZpbHRlci4gIEl0IHNob3VsZAogICAgICAgICAgICBub3QgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB3YXJuaW5ncyBpbiBhbiBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICAgVGhlIGhhbmRsaW5nIG9mICNwcmFnbWEgb2NjdXJzIGluIHRoZSBDKysgcHJlcHJvY29lc3NvciBhbmQgYWZmZWN0cyBhbGwgCiAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLgoKICAgICAgICAgICAgVGhlIC1XYWxsIG9wdGlvbiB0dXJucyBvbiBhbGwgd2FybmluZ3MgYW5kIG92ZXJyaWRlcyBhbnkgZmlsdGVycyB0aGF0CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBzZXQuCgogICAgICAgICAgICBXYXJuaW5ncyBjYW4gYmUgaXNzdWVkIGZyb20gYW4gaW50ZXJmYWNlIHVzaW5nICV3YXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV3YXJuICIxMTA6JXNlY3Rpb24gaXMgZGVwcmVjYXRlZCIKCiAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIGEgd2FybmluZyBtZXNzYWdlIGlzIGFuIG9wdGlvbmFsIHdhcm5pbmcgbnVtYmVyLgogICAgICAgICAgICBBIGNvbXBsZXRlIHNldCBvZiB3YXJuaW5nIG51bWJlcnMgaXMgZm91bmQgaW4gU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBwYXJzaW5nIGNoYW5nZS4gICBEaXJlY3RpdmVzIHRvIGluY2x1ZGUgZmlsZXMgbm93IHVzZSBicmFja2V0cyBbIC4uLiBdCiAgICAgICAgICAgIGluc3RlYWQgb2YgeyAuLi4gfS4gICAKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlZmlsZSAiZm9vLmkiIFsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgeyAuLi4gfSB3YXMgYSBiYWQgY2hvaWNlIGJlY2F1c2UgdGhleSB3ZXJlIGluY2x1ZGVkIGltcGxpY2l0bHkgYnkKICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHByb3Blcmx5IGRldGVjdCBsZWdpdGltYXRlIG1pc3NpbmcgJ30nIAogICAgICAgICAgICBlcnJvcnMuCgowNC8xNi8yMDAyLQowNS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgRXVyb3BlYW4gVG91cjogUGFyaXMtQW1zdGVyZGFtLUJhdGguCgowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgaGFzIGJlZW4gcmVuYW1lZCB0byAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIGludCBiYXIoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW90aXZhdGlvbjogdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBmb3IgbWFueQogICAgICAgICAgICBvdGhlciB0YXNrcyBpbmNsdWRpbmcgYWRkaW5nIHN5bnRoZXNpemVkIGF0dHJpYnV0ZXMsIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgYW5kIHR5cGVtYXBzLiBCZWNhdXNlIG9mIHRoaXMsICJhZGRtZXRob2RzIiBpcyBzb21ld2hhdCBtaXNsZWFkaW5nLgogICAgICAgICAgICAlZXh0ZW5kIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlcyB0aGlzIG9wZXJhdGlvbi0tLWV4dGVuc2lvbiBvZiBhCiAgICAgICAgICAgIGNsYXNzIG9yIHN0cnVjdHVyZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlYWRkbWV0aG9kcyBzdGlsbCB3b3JrcyB2aWEgYSBtYWNybyBkZWZpbml0aW9uLiAgIEhvd2V2ZXIsCiAgICAgICAgICAgIGEgd2FybmluZyBtZXNzYWdlIG1heSBiZSBnZW5lcmF0ZWQuICAgRXJyb3JzIGludm9sdmluZyAlYWRkbWV0aG9kcwogICAgICAgICAgICB3aWxsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZS4gIAogICAgICAgICAgICAKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIHR5cGUgc3lzdGVtLiAgVHlwZWRlZiBub3cKICAgICAgICAgICAgcHJvcGFnYXRlcyB0aHJvdWdoIGZ1bmN0aW9ucywgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLAogICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKCp4KShpbnQpLCBJbnRlZ2VyICgqeSkoSW50ZWdlcikpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgJ3gnIGFuZCAneScgaGF2ZSBleGFjdGx5CiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUgKGFuZCB3b3VsZCBvYnZpb3VzbHkgYWNjZXB0IG9iamVjdHMKICAgICAgICAgICAgb2YgZWl0aGVyIHR5cGUpLgoKICAgICAgICAgICAgU2ltaWxhcmx5LCBjb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IChGb286Oip4KShpbnQpLCBpbnQgKEJhcjo6KnkpKGludCkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgeCBhbmQgeSBhcmUgdGhlIHNhbWUgCiAgICAgICAgICAgIHR5cGUgKHZpYSB0eXBlZGVmKS4KICAgICAgICAgICAgCjA0LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGlmIGFueSBwYXJ0IG9mCiAgICAgICAgICAgIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgdmFsdWVzIGZyb20gYSBwcml2YXRlIHBhcnQgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBYOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gWCk7ICAgLy8gV2FybmluZwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXJlCiAgICAgICAgICAgIGFyZSB3b3JrYXJvdW5kcywgYnV0IHRoZXkgYXJlIHJhdGhlciBjbHVtc3kuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgYmxhaChpbnQsaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuYXJncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSAwKTsKCgowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVzZSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmUgaW5zaWRlIGEgbmFtZXNwYWNlIGlzCiAgICAgICAgICAgIGZvcmJpZGRlbiBhbmQgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlLiAgIFRoaXMgaXMKICAgICAgICAgICAgbm90IGFsbG93ZWQgc2luY2UgdGhlIGlubGluZWQgY29kZSB0aGF0IGlzIGVtaXR0ZWQgaXMKICAgICAgICAgICAgbm90IHBsYWNlZCBpbnNpZGUgYSBuYW1lc3BhY2UuICBUaGlzIGNvbmZ1c2VzIG90aGVyCiAgICAgICAgICAgIHN0YWdlcyBvZiBwYXJzaW5nLgogICAgICAgICAgICAgICAgICAgIAowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgYnVnIGZpeGVzIHRvIGNhc3Rpbmcgb3BlcmF0aW9ucyBhbmQgZXhwcmVzc2lvbgogICAgICAgICAgICBwYXJzaW5nLiAgIER1ZSB0byBzb21lIHBhcnNpbmcgaXNzdWVzLCBpdCBpcyBub3QgCiAgICAgICAgICAgIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgY2FzdHMgZm9yIGFsbCBwb3NzaWJsZQogICAgICAgICAgICBkYXRhdHlwZXMuICAgSG93ZXZlciwgdGhlIGNvbW1vbiBjYXNlcyB3b3JrLgoKMDQvMjAvMjAwMjogYmVhemxleSAoQW1zdGVyZGFtKQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGVzIG5vdyB3b3JrLiAgU2ltcGx5IHVzZSB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBvciAlYWRkbWV0aG9kcyB0byBjcmVhdGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbnMgKHNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwpLiAgU3VwcG9ydGluZwogICAgICAgICAgICB0aGlzIHdhcyBlYXN5LS0tZWFybGllciBjaGFuZ2VzIHRvIHRlbXBsYXRlcyBtYWRlIGl0CiAgICAgICAgICAgIHBvc3NpYmxlIHVzaW5nIG9ubHkgYSB0d28tbGluZSBtb2RpZmljYXRpb24gdG8gdGhlIHBhcnNlcgogICAgICAgICAgICBhbmQgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyBlbHNld2hlcmUuICBIbW1tLCBjb21lIHRvIAogICAgICAgICAgICB0aGluayBvZiBpdCwgdGhlIHNtb2tlIHdhcyByYXRoZXIgdGhpY2sgaW4gdGhhdCBJbnRlcm5ldCAiY2FmZSIuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA0LzE5LzIwMDI6IGJlYXpsZXkgKFRHVikKICAgICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBTaW1wbGUgbnVtYmVycyBhbmQgc3RyaW5ncyBjYW4gYmUgdXNlZCB3aXRoIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludDEwMCkgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgTm90ZTogQXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgbm90IGN1cnJlbnRseSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgICAgICAgRGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgbm93IHdvcmsgYW5kIGRvIG5vdCBoYXZlIHRvCiAgICAgICAgICAgIGJlIGdpdmVuIHRvICV0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA0LzE4LzIwMDI6IGJlYXpsZXkgKFBhcmlzKQogICAgICAgICAgICBDaGFuZ2UgaW4gaW50ZXJuYWwgdGVtcGxhdGUgaGFuZGxpbmcuICBUZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3cgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSBhbmQgYXJlIGF3YXJlIG9mIHR5cGVkZWZzLCBldGMuICBUaGlzIGJ1aWxkcwogICAgICAgICAgICB1cG9uIHRoZSBjaGFuZ2UgYmVsb3cuICAgCgogICAgICAgICAgICAqKiogREVWRUxPUEVSIFdBUk5JTkcgKioqCiAgICAgICAgICAgIFdvcmQgb2YgY2F1dGlvbiB0byBsYW5ndWFnZSBtb2R1bGUgd3JpdGVycy4gIFRoZSAibmFtZSIKICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGNlcnRhaW4gcGFyc2UgdHJlZSBub2RlcyAoY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKQogICAgICAgICAgICBtYXkgYmUgcGFyYW1ldGVyaXplZCB3aXRoIHR5cGVzLiAgIFRoaXMgcGFyYW1ldGVyaXphdGlvbiBpcwogICAgICAgICAgICBkb25lIHVzaW5nIFNXSUcgdHlwZS1zdHJpbmdzIGFuZCBub3QgdGhlIHVuZGVybHlpbmcgQyB2ZXJzaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgIGludCBtYXg8aW50ICo+KGludCAqLGludCAqKSAgCgogICAgICAgICAgICBoYXMgYSBuYW1lIG9mICJtYXg8KHAuaW50KT4iLiAgSWYgeW91IHVzZSB0aGUgbmFtZSBkaXJlY3RseSwKICAgICAgICAgICAgeW91IG1heSBnZXQgc3ludGF4IGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBmaXggdGhpcywKICAgICAgICAgICAgdXNlIFN3aWdUeXBlX25hbWVzdHIobmFtZSkgdG8gY29udmVydCBhIHBhcmFtZXRlcml6ZWQgbmFtZSAKICAgICAgICAgICAgdG8gYSBDIG5hbWUgd2l0aCB2YWxpZCBzeW50YXguICBUaGUgaW50ZXJuYWwgdmVyc2lvbiBpcwogICAgICAgICAgICB1c2VkIHRvIHJlZHVjZSB0ZW1wbGF0ZSB0eXBlcyB0byBhIGNvbW1vbiByZXByZXNlbnRhdGlvbiAKICAgICAgICAgICAgYW5kIHRvIGhhbmRsZSBpc3N1ZXMgb2YgdHlwZWRlZi4KICAgICAgICAgICAgCjA0LzE2LzIwMDI6IGJlYXpsZXkgKHNvbWV3aGVyZSBvdmVyIHRoZSBBdGxhbnRpYykKICAgICAgICAgICAgRW5oYW5jZW1lbnQgb2YgdHlwZWRlZiByZXNvbHV0aW9uLiAgVGhlIHR5cGUgc3lzdGVtIGlzIG5vdwogICAgICAgICAgICBhd2FyZSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZvbyh2ZWN0b3I8aW50PiAqeCwgdmVjdG9yPEludGVnZXI+ICp5KTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdmVjdG9yPGludD4gYW5kIHZlY3RvcjxJbnRlZ2VyPiBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZS4gICBUaGVyZSBpcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcwogICAgICAgICAgICBtZWNoYW5pc20gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlbWFwcy4gIEZvciBleGFtcGxlLAogICAgICAgICAgICBhIHR5cGVtYXAgZGVmaW5lZCBmb3IgdmVjdG9yPGludD4gKiB3b3VsZCBhcHBseSB0byBlaXRoZXIgdHlwZS4KICAgICAgICAgICAgSG93ZXZlciwgYSB0eXBlbWFwIGZvciB2ZWN0b3I8SW50ZWdlcj4gKiB3b3VsZCBvbmx5IGFwcGx5IHRvCiAgICAgICAgICAgIHRoYXQgdHlwZS4KCiAgICAgICAgICAgIFR5cGVkZWZzIGFuZCB0eXBlbWFwcyBhbmQgbWF0Y2hlZCBieSBsZWZ0LW1vc3QgZXhwYW5zaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdmVjdG9yPEludGVnZXIsSW50ZWdlcj4gLS0+IAogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIEludGVnZXI+IC0tPgogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIGludD4KCgowNC8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIENoYW5nZXMgdG8gSmF2YSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgICAgT3ZlcmNvbWVzIGEgYnVnIHdoZXJlIHRoZSBtb2R1bGUgYXNzdW1lZCB0aGF0IGEgcG9pbnRlciB0byBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgY291bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIHBvaW50ZXIgdG8gYSBiYXNlIGNsYXNzLiBUaGFua3MgCiAgICAgICAgICAgIHRvIFN0ZXBoZW4gTWNDYXVsIGZvciBhbmFseXNpbmcgdGhlIGJ1ZyBhbmQgc3VibWl0dGluZyBwYXRjaGVzLgoKICAgICAgICAgICAgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBnZXRDUHRyKCkgbWV0aG9kIGluIGVhY2ggc2hhZG93IGNsYXNzIGhhcwogICAgICAgICAgICBkaXNhcHBlYXJlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIGdldENQdHJYWFgoKSwgd2hlcmUgWFhYIGlzIHRoZSAKICAgICAgICAgICAgc2hhZG93IGNsYXNzIG5hbWUuIElmIHlvdSBoYXZlIGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgZ2V0Q1B0cigpLCAKICAgICAgICAgICAgYW5kIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHdyYXBwaW5nIGEgQyBzdHJ1Y3Qgb3IgYSBDKysgY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBub3QgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIGp1c3QgdXNlIHRoZSBuZXcgbWV0aG9kLiBJZgogICAgICAgICAgICBob3dldmVyLCB0aGUgY2xhc3MgaXMgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIHlvdSdsbCBoYXZlCiAgICAgICAgICAgIHRvIGNob29zZSB3aGljaCBwb2ludGVyIHlvdSByZWFsbHkgd2FudC4gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgCiAgICAgICAgICAgIGhhcyBiZWVuIGJyb2tlbiBhcyBub3QgdXNpbmcgdGhlIGNvcnJlY3QgcG9pbnRlciBjYW4gbGVhZCB0byB3ZWlyZCBidWdzCiAgICAgICAgICAgIHRocm91Z2ggaWxsLWRlZmluZWQgYmVoYXZpb3VyLiBJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdGhlIG9sZCBtZXRob2RzLCAKICAgICAgICAgICAgeW91IGNvdWxkIGFkZCB0aGVtIGJhY2sgaW50byBhbGwgc2hhZG93IGNsYXNzZXMgYnkgYWRkaW5nIHRoaXMgYXQgdGhlIAogICAgICAgICAgICBiZWdpbm5pbmcgb2YgeW91ciBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgYWxsc2hhZG93Y29kZT0lewogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKXsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBQbGVhc2Ugc2VlIGVudHJ5IGRhdGVkIDA3LzIzLzIwMDIgdG8gc2VlIGhvdyB0byBkbyB0aGlzIGFmdGVyIHRoZSBkZXByZWNhdGlvbgogICAgICAgICAgICBvZiB0aGUgYWxsc2hhZG93Y29kZSBwcmFnbWEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgcmVmZXJlbmNlcy4gICBEZWNsYXJhdGlvbnMgc3VjaCAKICAgICAgICAgICAgYXMgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oY29uc3Qgc3RyaW5nICZ4ID0gIkhlbGxvIik7CgowNC8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHR5cGVtYXAgJCogc3Vic3RpdHV0aW9ucyBmb3IgdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cy4KICAgICAgICAgICAgUmVxdWVzdGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBub3cgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBXaGVuIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIHVzZWQsIGl0IHdpbGwgdXNlIGEgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgaWYgb25lIGlzIGRlZmluZWQuICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgbGltaXRhdGlvbnMuIFBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIEEgdGVtcGxhdGUgb2YgdHlwZSA8dm9pZCAqPiBkb2VzCiAgICAgICAgICAgIG5vdCBtYXRjaCBhbGwgcG9pbnRlcnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2hhbmdlIHRvIHRlbXBsYXRlIHdyYXBwaW5nIGludGVybmFscy4gVGVtcGxhdGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcHJvY2Vzc2VkIGFzIG1hY3JvcyBidXQgbm93IHJlc3VsdCBpbiByZWFsIHBhcnNlLXRyZWUKICAgICAgICAgICAgbm9kZXMuICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBleHBhbmRzIHRoZXNlIG5vZGVzIGludG8gYQogICAgICAgICAgICBzcGVjaWZpYyBpbnN0YW50aWF0aW9uLiAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgYSBudW1iZXIgb2YKICAgICAgICAgICAgbmV3IGFuZCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXM6CgogICAgICAgICAgICBEaXJlY3RpdmVzIHN1Y2ggYXMgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCAlYWRkbWV0aG9kcyBjYW4KICAgICAgICAgICAgbm93IGJlIGFwcGxpZWQgdG8gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyc2l6ZSkgdmVjdG9yOjpiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYpOwogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7ICAgLy8gUmVuYW1lZAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWN0b3IpIHZlY3RvcjxpbnQ+OyAgIC8vIFJlbmFtaW5nIGNhcnJpZXMgdGhyb3VnaAoKICAgICAgICAgICAgCiAgICAgICAgICAgIEJ5IHBhcnNpbmcgdGVtcGxhdGVzIGludG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUsIGl0IHdpbGwKICAgICAgICAgICAgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBzcGVjaWFsaXphdGlvbiAoYW5kIG1heWJlIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24pLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB3ZXJlIHNpbXBseSBwcm9jZXNzZWQKICAgICAgICAgICAgYXMgd2VpcmQgbWFjcm9zLiAgTm8gb3RoZXIgaW5mb3JtYXRpb24gd2FzIHJldGFpbmVkLiAgIFRoaXMgCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIAogICAgICAgICAgICBjb21wbGljYXRlZCBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCjA0LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIHRlbXBsYXRlIGNsYXNzIHdyYXBwaW5nLiAgIFRoZXJlIHdlcmUgYSB2YXJpZXR5IG9mCiAgICAgICAgICAgICJpc3N1ZXMiIHdpdGggdGhlIG9sZCBhcHByb2FjaCByZWxhdGVkIHRvIHBhcnNpbmcsIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSwgYW5kIG5hbWVzcGFjZXMuICAgVGhlc2UgY2hhbmdlcyBhcmUgbWVhbnQgdG8gcmVjdGlmeQogICAgICAgICAgICBzb21lIG9mIHRoZXNlIHByb2JsZW1zOgoKICAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgY2FuIG5vdyBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgaW5jbHVkaW5nIHRoZSBjbGFzcyBpbmxpbmUgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgfnZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KCSAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBidXQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcwogICAgICAgICAgICBub3QgeWV0IGltcGxlbWVudGVkLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXhwYW5kIHJvdWdobHkgYXMKICAgICAgICAgICAgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgICVyZW5hbWUodmVjaW50PiB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHNpbXBseSBidWlsZHMgdXBvbiB0aGUgY29kZSBhYm92ZSAodGVtcGxhdGVzCiAgICAgICAgICAgIGluY2x1ZGVkIGlubGluZSkuCgogICAgICAgICAgICBUaGlzIG1vZGlmaWVkIGFwcHJvYWNoIHRvIHdyYXBwaW5nIGZpeGVzIHNvbWUgc3VidGxlIHR5cGUKICAgICAgICAgICAgaXNzdWVzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIG5vdyBkZWZpbmUgdHlwZW1hcHMgYW5kIHR5cGVkZWZzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlY3RvcjsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50dmVjdG9yICp2KTsgICAvLyBHZXRzIHRoZSBhYm92ZSB0eXBlbWFwCgogICAgICAgICAgICBUaGlzIGRpZCBub3Qgd29yayBpbiBTV0lHLTEuMy4xMSBkdWUgdG8gYSBwZWN1bGlhcml0eSBvZgogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAldGVtcGxhdGUobmFtZSkgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZSB0ZW1wbGF0ZSBhcyBhIGNsYXNzCiAgICAgICAgICAgIHdpdGggbmFtZSAibmFtZSIuICAgVGhpcyBtaWdodCBicmVhayAlYWRkbWV0aG9kcyBhcyBkZXNjcmliZWQKICAgICAgICAgICAgaW4gdGhlIG1hbnVhbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWNpbnQgeyAgICAvLyBGYWlscy4gdmVjaW50IG5vdCBhIGNsYXNzCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgIAogICAgICAgICAgICBUbyBmaXggdGhpcywganVzdCB1c2UgdGhlIHRlbXBsYXRlIG5hbWUgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiBUaGlzIHRlY2huaXF1ZSBtaWdodCBiZSBhIHdheSB0byBpbXBsZW1lbnQgc29tZSBiaXphcnJlCiAgICAgICAgICAgIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRlY2huaXF1ZXMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGlmIHZlY3RvcjxpbnQ+IGluc3RhbnRpYXRlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgIAowNC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLiAgU1dJRyBzaG91bGQKICAgICAgICAgICAgbm93IGNvcnJlY3RseSBoYW5kbGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGU6IHdhcyBpbXBsZW1lbnRlZCBwcmV2aW91c2x5LCBidXQgdGhlcmUgd2FzIGEgbWlub3IgYnVnLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCiAgICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSAKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBJbnN0ZWFkIG9mIGJlaW5nIHByYWdtYXMsIG11dGFiaWxpdHkgaXMgbm93CiAgICAgICAgICAgIGNvbnRyb2xsZWQgYXMgYSAiZmVhdHVyZSIgdXNpbmcgdGhlIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgICAgJWltbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgeDsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgIGludCB5OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgJW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHo7ICAgICAgICAgICAvLyBNb2RpZmlhYmxlCgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlaXIgb2xkZXIKICAgICAgICAgICAgY291bnRlcnBhcnRzLiAgVGhleSBjYW4gbm93IHBpbnBvaW50IGEgc3BlY2lmaWMgZGVjbGFyYXRpb24gbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgeDsgICAgICAgICAvKiBBbnkgeCAqLwogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7ICAgIC8qIHggaW4gY2xhc3MgRm9vICovCgogICAgICAgICAgICBJbiBmYWN0LCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLCAKICAgICAgICAgICAgJWlnbm9yZSwgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICAgVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNsYXJhdGlvbgogICAgICAKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OwoKICAgICAgICAgICAgd291bGQgbm90IG9ubHkgYXBwbHkgdG8gY2xhc3MgRm9vIGJ1dCB0byBhbGwgZGVyaXZlZCBjbGFzc2VzCiAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbi4gIFRoaXMKICAgICAgICAgICAgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBvbGRlciAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgZGlyZWN0aXZlcy4KICAgICAgICAgICAgU2luY2UgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgY2FuIGJlIGFwcGxpZWQgdG8gZGVjbGFyYXRpb25zIHRoZQogICAgICAgICAgICBzZW1pY29sb24gaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZmVhdHVyZSBhbmQgCiAgICAgICAgICAgIG9uZSB0YXJnZXRlZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIE5vdGU6IHRoaXMgaW5jb21wYXRpYmlsaXR5IGlzIHRoZQogICAgICAgICAgICBwcmltYXJ5IHJlYXNvbiBmb3IgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGhhbmRsaW5nIG9mIGNvcHkgY29uc3RydWN0b3JzLiAgSWYgYSBjbGFzcyBkZWZpbmVzIAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICAgIEZvbyhjb25zdCBGb28gJik7ICAgICAgIC8vIENvcHkgY29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNvcHlfRm9vKCkgZm9yIHRoZSBjb3B5CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyaW9ucywgdGhpcyBnZW5lcmF0ZWQgYSBuYW1lLWNsYXNoIGFuZCBhbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlLiAgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBTV0lHCiAgICAgICAgICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3IgaWYgJXJlbmFtZSBpcyB1c2VkIHRvIHJlc29sdmUKICAgICAgICAgICAgdGhlIG5hbWUgY29uZmxpY3QuICAgSG93ZXZlciwgaWYgbm8gbmFtZSByZXNvbHV0aW9uIGlzIG1hZGUsCiAgICAgICAgICAgIHRoaXMgbmV3IGFwcHJvYWNoIGlzIHVzZWQuCgogICAgICAgICAgICBDb3B5IGNvbnN0cnVjdG9ycyBtYXkgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgdGhpcyBpcyB1cCB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlCiAgICAgICAgICAgIGl0c2VsZi4KICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgbm93IG5hbWVzcGFjZSBhd2FyZS4gICBUaGlzIGFsbG93cwogICAgICAgICAgICBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgZm9vOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgICAgLy8gT2sKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgYmFyIHsKICAgICAgICAgICAgICAgICAgIHVzaW5nIGZvbzo6bWF4OwogICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47ICAgLy8gT2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENhdmVhdDogdGhlIHRlbXBsYXRlIG5hbWUgc3VwcGxpZWQgdG8gJXRlbXBsYXRlIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKICAgICAgICAgICAgc2FtZSBzY29wZSBpbiB3aGljaCB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcHBlYXJzLiAgIFRoaXMgY29kZSBpcwogICAgICAgICAgICBpbGxlZ2FsOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIGZvbzo6bWF4PGludD47CgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHByZXByb2Nlc3Nvci4gICBUaGUgcHJlcHJvY2Vzc29yIGNhbiBub3cgcGVyZm9ybQogICAgICAgICAgICBzdHJpbmcgY29tcGFyaXNvbi4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgQSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjaWYgQSA9PSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGlzIGluIFNXSUcgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVkZWZpbmUgRk9PKHgpIAogICAgICAgICAgICAgICNpZiAjeCA9PSAiaW50IgogICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGludCAqLwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgIE5vcm1hbCB1c2VycyBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBpdCBtYXkKICAgICAgICAgICAgYmUgdXNlZCBpbiBwYXJ0cyBvZiB0aGUgU1dJRyBsaWJyYXJ5LgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHdyYXBwZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgU1dJRyBpcyBub3cgbXVjaCBtb3JlIGF3YXJlIG9mIHB1cmUgdmlydHVhbCBtZXRob2RzLiBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIGNsYXNzIEEgeyAgICAgICAgICAgICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpID0gMDsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7ICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjbGFzcyBDIDogcHVibGljIEIgeyAgLyogT2sgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG9ubHkgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIEMuCiAgICAgICAgICAgIEV2ZW4gdGhvdWdoIEIgbG9va3MgZmluZSwgaXQncyBtaXNzaW5nIGEgcmVxdWlyZWQgbWV0aG9kIGFuZCBpcyBhYnN0cmFjdC4KCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzdHJ1Y3R1cmUgZGF0YSBtZW1iZXIgYWNjZXNzLiAgSWYgeW91CiAgICAgICAgICAgIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIEJhciAgIGI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgYiBhcmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAoMSkgSWYgYiBpcyAqbm90KiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciBGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICgyKSBJZiBiICppcyogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgKkZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJnNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciAqdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gKnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTZWUgdGhlICJTdHJ1Y3R1cmUgZGF0YSBtZW1iZXJzIiBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJRy5odG1sCiAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbGllZCBvbiBhIGxvdCBvZiBhIHVuZGVjbGFyZWQKICAgICAgICAgICAgc3RydWN0dXJlIGFuZCBjbGFzcyBuYW1lcy4gICAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIHNpbXBseQogICAgICAgICAgICB1c2UgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHN1Y2ggYXMgInN0cnVjdCBCYXI7IgogICAgICAgICAgICAKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKysgbmFtZXNwYWNlIHN1cHBvcnQgYWRkZWQuICBTV0lHIHN1cHBvcnRzIGFsbCBhc3BlY3RzIG9mCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW5jbHVkaW5nIG5hbWVzcGFjZSwgdXNpbmcsIGFuZCBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBTV0lHIGlzIHRvIGZsYXR0ZW4KICAgICAgICAgICAgbmFtZXNwYWNlcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgbmFtZXNwYWNlcyBhcmUKICAgICAgICAgICAgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBDKysgbGV2ZWwgYW5kIGluIHRoZSB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgCjA0LzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3VuIGhhcyBtb2RpZmllZCBqYXZhYyBpbiBqZGsxLjQgdG8gbm8gbG9uZ2VyIGNvbXBpbGUKICAgICAgICAgICAgYW4gaW1wb3J0IG9mIGFuIHVubmFtZWQgbmFtZXNwYWNlLiBUbyBmaXggdGhpcyBTV0lHIG5vIGxvbmdlciAKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSBpbXBvcnQgZm9yIHBhY2thZ2VsZXNzIGNsYXNzZXMuCiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MzYxNTc1Lmh0bWwKICAgICAgICAgICAgQXMgcmVwb3J0ZWQgU0YgIzUzODQxNS4KCjAzLzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBwb2ludGVyLXRvLW1lbWJlciwgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgIGZvciB0aGUgUHl0aG9uIG1vZHVsZS4gUmVtYXJrYWJseSBzaW1pbGFyLiBBbHNvIGFkZGVkIGEgbmV3CiAgICAgICAgICAgIGV4YW1wbGUgZm9yIHRoaXMgKEV4YW1wbGVzL3J1YnkvbXBvaW50ZXIpLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gdGhlIFB5dGhvbiBleGFtcGxlIG9mIHRoZSBzYW1lIG5hbWUuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZldyBtaW5vciBlZGl0cyB0byB0aGUgIkFkdmFuY2VkIFRvcGljcyIKICAgICAgICAgICAgY2hhcHRlciBvZiB0aGUgU1dJRyBtYW51YWwgYW5kIGFkZGVkIGEgbmV3IG1ham9yIHNlY3Rpb24KICAgICAgICAgICAgYWJvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aS1tb2R1bGUgUnVieSBwYWNrYWdlcyB3aXRoIFNXSUcuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVtb3ZlZCBhbGwgb2YgdGhlIG9sZCBSdWJ5IHByYWdtYXMuIElmIGFueSBvZiB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgdHJ1bHkgbWlzc2VkIHdlIGNhbiByZXN1cnJlY3QgaXQsIHByZWZlcmFibHkKICAgICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2YgZmVhdHVyZS1iYXNlZCBkaXJlY3RpdmUuCiAgICAgICAgICAgIAowMy8yNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU1dJRyBleGNlcHRpb24gbGlicmFyeSBzdXBwb3J0IGZvciBSdWJ5LCB3aGljaAogICAgICAgICAgICBoYXMgYXBwYXJlbnRseSBiZWVuIGJyb2tlbiBmb3Igc29tZSB0aW1lLiBMdWNraWx5LCBubyBvbmUgc2VlbXMKICAgICAgICAgICAgdG8gaGF2ZSBub3RpY2VkLgoKMDMvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKystbmFtZXNwYWNlIHN1cHBvcnQgaW4gU1dJRyBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgJWFkZG1ldGhvZHM6IAoKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBub3cgYWNjZXB0cyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKICAgICAgICAgICAgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSBDKysgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgRm9vOjpCYXIgYmVsb3cKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBGb286OkJhciB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzb21lbWV0aG9kKCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBCYXIgYWJvdmUKICAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVybWV0aG9kKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUsICVleGNlcHRpb24sIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICBOYW1lc3BhY2VzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHRoZSByZW5hbWluZyBhbmQgZGVjbGFyYXRpb24KICAgICAgICAgICAgbWF0Y2hlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIEZvbzo6cHJpbnQ7ICAgICAgICAgIC8vIFJlbmFtZSBpbiBuYW1lc3BhY2UgRm9vCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcjo6YmxhaDsgICAgICAgICAgICAgICAvLyBJZ25vcmUgYSBkZWNsYXJhdGlvbgoKICAgICAgICAgICAgJXJlbmFtZSBkaXJlY3RpdmVzIGNhbiBiZSBwbGFjZWQgaW5zaWRlIG5hbWVzcGFjZSBibG9ja3MgYXMgd2VsbC4gRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIHByaW50OyAgICAgICAgIC8vIEFwcGxpZXMgdG8gcHJpbnQgYmVsb3cKCiAgICAgICAgICAgICAgICAgICB2b2lkIHByaW50KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW9zdCBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgc2hvdWxkIHdvcmsgcHJvcGVybHkgaW5zaWRlIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIE5vIG90aGVyIGNoYW5nZXMgYXJlIG5lZWRlZC4KICAgICAgCjAzLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIGludGVybmFsIHN5bWJvbCB0YWJsZSBoYW5kbGluZy4gICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgICBtYW5hZ2VzIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBpbiBhIHNlcGFyYXRlIG5hbWVzcGFjZSB0aGFuIG5vcm1hbAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSBBTlNJIEMuICBUaGlzIG1lYW5zIHlvdSBjYW4ndCBoYXZlIGEgc3RydWN0dXJlCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBGb28oKSB7IC4uLiB9CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIG1vcmUgbGlrZSBDKysuICAgSXQncyBub3QgY2xlYXIgdGhhdCBTV0lHIGV2ZXIKICAgICAgICAgICAgcmVhbGx5IHN1cHBvcnRlZCB0aGUgQU5TSSBDIGFueXdheXMtLS11c2luZyB0aGUgc2FtZSBuYW1lIHdvdWxkCiAgICAgICAgICAgIGFsbW9zdCBjZXJ0YWlubHkgZ2VuZXJhdGUgYSBuYW1lLWNsYXNoIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgowMy8yMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1MTczMDIgXSBmb3IgaGFuZGxpbmcgb2YgcmVuYW1lZCBvdmVybG9hZGVkCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycy4gTm93LCByZW5hbWVkIG92ZXJsb2FkZWQgY29uc3RydWN0b3JzIGFyZSBjb252ZXJ0ZWQKICAgICAgICAgICAgaW50byBjbGFzcyBzaW5nbGV0b24gbWV0aG9kcyAoYmFzaWNhbGx5IGFjdGluZyBhcyAiZmFjdG9yeSIKICAgICAgICAgICAgbWV0aG9kcykuCgowMy8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTMyOTU3IF0gJWlnbm9yZSBwYXJzZSBlcnJvciBhbmQgY2FzdGluZyBvcGVyYXRvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowMy8xOC8yMDAyOiBiZWF6bGV5ICgqKiBBRFZBTkNFRCBVU0VSUyBPTkxZICoqKQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIGNhc3RpbmcgaW4gcmV0dXJuIHZhbHVlcy4gIEEgc29tZXdoYXQKICAgICAgICAgICAgY29tbW9uIHByb2JsZW0gaW4gY2VydGFpbiBDKysgcHJvZ3JhbXMgaXMgZnVuY3Rpb25zIHRoYXQgaGlkZQogICAgICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdW5kZXJseWluZyBvYmplY3RzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgCiAgICAgICAgICAgIGZyb20gbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGEgcHJvZ3JhbSBtaWdodCBpbmNsdWRlCiAgICAgICAgICAgIHNvbWUgZ2VuZXJpYyBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKmdldE5vZGUoKTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIE5vZGUgKiBtYXkganVzdCBiZSBiYXNlIGNsYXNzIHRvIGEgd2hvbGUgaGllcmFyY2h5CiAgICAgICAgICAgIG9mIGRpZmZlcmVudCBvYmplY3RzLiAgIEluc3RlYWQgb2YgcmV0dXJuaW5nIHRoaXMgZ2VuZXJpYyBOb2RlICosCiAgICAgICAgICAgIGl0IG1pZ2h0IGJlIG5pY2UgdG8gYXV0b21hdGljYWxseSBkb3duY2FzdCB0aGUgb2JqZWN0IGludG8gdGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUgdXNpbmcgc29tZSBraW5kIGR5bmFtaWMgY2FzdC4KCiAgICAgICAgICAgIEFzc3VtaW5nIHlvdSB1bmRlcnN0YW5kIHRoZSBwZXJpbCBpbnZvbHZlZCwgYSBkb3duY2FzdCBjYW4gbm93CiAgICAgICAgICAgIGJlIHBlcmZvcm1lZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGluIHRoZSBydW4tdGltZSB0eXBlCiAgICAgICAgICAgIGNoZWNrZXI6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICpTV0lHX1R5cGVEeW5hbWljQ2FzdChzd2lnX3R5cGVfaW5mbyAqLCB2b2lkICoqcHRyKTsKCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIGFub3RoZXIKICAgICAgICAgICAgdHlwZS4gIElmIHNvLCBhIGRpZmZlcmVudCB0eXBlIGRlc2NyaXB0b3IgKGZvciB0aGUgY29udmVydGVkIHR5cGUpCiAgICAgICAgICAgIGlzIHJldHVybmVkLiAgIFRoaXMgdHlwZSBkZXNjcmlwdG9yIHdvdWxkIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUKICAgICAgICAgICAgYSBwb2ludGVyIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgogICAgICAgICAgICBUbyB1c2UgdGhpcywgeW91IHdvdWxkIHdyaXRlIGEgdHlwZW1hcCBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqIHsKICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFNXSUdfVHlwZUR5bmFtaWNDYXN0KCQxX2Rlc2NyaXB0b3IsICh2b2lkICoqKSAmJDEpOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9IFNXSUdfTmV3UG9pbnRlck9iaigkMSwgdHkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksCgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqID0gU1dJR1RZUEUgKkRZTkFNSUM7CgogICAgICAgICAgICBUbyBtYWtlIHRoZSB0eXBlbWFwIGhhdmUgYW55IGVmZmVjdCwgeW91IGhhdmUgdG8gd3JpdGUgYSBzdXBwb3J0aW5nIAogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBwZXJmb3JtIGRvd25jYXN0aW5nLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICBzdGF0aWMgc3dpZ190eXBlX2luZm8gKgogICAgICAgICAgICAgIE5vZGVfZHluYW1pY19jYXN0KHZvaWQgKipwdHIpIHsKICAgICAgICAgICAgICAgICBOb2RlICoqbnB0ciA9IChOb2RlICoqKSBwdHI7CiAgICAgICAgICAgICAgICAgRWxlbWVudCAqZSA9IGR5bmFtaWNfY2FzdDxFbGVtZW50ICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERhdGEgKmQgPSBkeW5hbWljX2Nhc3Q8RGF0YSAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9EYXRhOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIGhvdyB0eXBlcyBhcmUgZGV0ZXJtaW5lZC4gZHluYW1pY19jYXN0PD4KICAgICAgICAgICAgdXNlcyBDKysgUlRUSS4gIEhvd2V2ZXIsIGlmIHlvdSBoYWQgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIGRldGVybWluaW5nCiAgICAgICAgICAgIHRoZSB0eXBlLCB5b3UgY291bGQgdXNlIHRoYXQgaGVyZS4gIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0byBzYXZlCiAgICAgICAgICAgIHRoZSBuZXcgcG9pbnRlciB2YWx1ZSBiYWNrIGludG8gdGhlIGFyZ3VtZW50IGFzIHNob3duLiAgV2hlbiBkb3duY2FzdGluZywKICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIGNvdWxkIGNoYW5nZS4gCgogICAgICAgICAgICBGaW5hbGx5LCB0byBtYWtlIHRoZSBjYXN0aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSwgeW91IGhhdmUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgaXQgd2l0aCB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyLiBQdXQgdGhpcyBtYWNybyBpbiB5b3VyIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAgICAgRFlOQU1JQ19DQVNUKFNXSUdUWVBFX3BfTm9kZSwgTm9kZV9keW5hbWljX2Nhc3QpOwoKICAgICAgICAgICAgTm90ZTogdGhpcyBmZWF0dXJlIGRvZXMgbm90IGludHJvZHVjZSBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gCiAgICAgICAgICAgIG5vcm1hbCBTV0lHIG9wZXJhdGlvbi4gIFRoZSBmZWF0dXJlIGlzIG9ubHkgZW5hYmxlZCBieSB3cml0aW5nCiAgICAgICAgICAgIGEgbmV3IHR5cGVtYXAgdGhhdCBleHBsaWNpdGx5IGNhbGxzIFNXSUdfVHlwZUR5bmFtaWNDYXN0KCkgdG8KICAgICAgICAgICAgbWFrZSBhIGNvbnZlcnNpb24uIAogIAogICAgICAgICAgICBFeGFtcGxlcy90ZXN0LXN1aXRlL2R5bmFtaWNfY2FzdC5pIGNvbnRhaW5zIGEgc2ltcGxlIGV4YW1wbGUuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBKYXZhIG1vZHVsZSBkdWUgdG8gZGlmZmVyZW5jZXMKICAgICAgICAgICAgaW4gdGhlIHR5cGUtY2hlY2tpbmcgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgowMy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNtYWxsIGNoYW5nZSB0byB0eXBlLW5hbWUgaGFuZGxpbmcgb2YgdW5uYW1lZCBzdHJ1Y3R1cmVzIGFuZAogICAgICAgICAgICB0eXBlZGVmLiAgSWYgYSBzdHJ1Y3R1cmUgb2YgdGhpcyBmb3JtIGFwcGVhcnM6CgogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgVGhlbiAnRm9vJyBpcyB1c2VkIGFzIHRoZSBwcm9wZXIgdHlwZW5hbWUgZm9yIHRoZSBzdHJ1Y3R1cmUuCiAgICAgICAgICAgIEZ1cnRoZXJtb3JlLCBGb28gY2FuIG5vdyBiZSB1c2VkIGFzIGEgbmFtZSBpbiBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIFNXSUcgd2FzIGFscmVhZHkga2luZCBvZiBkb2luZyB0aGlzLCBidXQgdGhpcyBtb2RpZmljYXRpb24gcmVmaW5lcwogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gdG8gbW9yZSBjbG9zZWx5IGZvbGxvdyB0aGUgQysrIEFSTSwgc2VjdGlvbgogICAgICAgICAgICA3LjEuMywgcC4gMTA2LiAgVGhpcyBmaXhlcyBhIGNvdXBsZSBvZiBvYnNjdXJlIGNvcm5lciBjYXNlcy4KCjAzLzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgQysrIGluaGVyaXRhbmNlIHdpdGggYSBmZXcgZW5oYW5jZW1lbnRzLiAgRmlyc3QsIHR5cGUgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmVlZGVkIGZvciBjYXN0aW5nIGFuZCB0eXBlLWVxdWl2YWxlbmNlIGlzIGdlbmVyYXRlZCBldmVuIHdoZW4gYmFzZS1jbGFzc2VzCiAgICAgICAgICAgIGFyZW4ndCBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyICB7ICAgIC8qIEJhciB1bnNwZWNpZmllZCAqLwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB2b2lkIGJsYWgoQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJsYWgoKSBmdW5jdGlvbiBzdGlsbCBhY2NlcHRzIEZvbyAqIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICAgICAgICAgICAgaXMgcmVhbGx5IGtub3duIGFib3V0IEJhci4gICBQcmV2aW91cyBTV0lHIHZlcnNpb25zIHdvdWxkIGp1c3QgZ2VuZXJhdGUKICAgICAgICAgICAgYSB0eXBlIGVycm9yLgoKICAgICAgICAgICAgSW5oZXJpdGFuY2UgaGFzIGFsc28gYmVlbiBtb2RpZmllZCB0byB3b3JrIHRocm91Z2ggdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgQmFyIE90aGVyQmFyOwogICAgICAgICAgICAgICBjbGFzcyBGb286IHB1YmxpYyBPdGhlckJhciB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJhc2UgY2xhc3Mgb2YgT3RoZXJCYXIgaXMgY29ycmVjdGx5IHJlc29sdmVkIGJhY2sgdG8KICAgICAgICAgICAgQmFyLiAgIFRoZSB1c2Ugb2YgdGhlIG5hbWUgT3RoZXJCYXIgaXMgbG9zdCBpbiB0aGlzIHJlc29sdXRpb24gKHRoZSB3cmFwcGVycwogICAgICAgICAgICB3aWxsIHNpbXBseSB1c2UgQmFyIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBPdGhlckJhcikuCiAgICAgICAgICAgCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXR5cGVtYXAsICVhcHBseSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBjYW4gbm93IGFwcGVhciBpbnNpZGUKICAgICAgICAgICAgY2xhc3MgZGVmaW5pdGlvbnMuICAgCgowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIGNvbXBpbGluZyBTV0lHIG9uIDY0LWJpdAogICAgICAgICAgICBwbGF0Zm9ybXMuCgowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCAiaWdub3JlIiBhbmQgImluIiB0eXBlbWFwcy4gIExvY2FsIHZhcmlhYmxlcwogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggImluIiB3ZXJlIGJlaW5nIGFkZGVkIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIHRoZXkgd2VyZSBuZXZlciB1c2VkLiAgIE1vc3RseSBoYXJtbGVzcywgYnV0IGl0IHdvdWxkIGxlYWQKICAgICAgICAgICAgdG8gYSB2YXJpZXR5IG9mIGNvbXBpbGF0aW9uIHdhcm5pbmdzLgogIAowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byB0aGUgaW50ZXJuYWwgdHlwZSBzeXN0ZW0gYW5kIGhhbmRsaW5nIG9mIG5lc3RlZCBDKysKICAgICAgICAgICAgdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzb21lbWV0aG9kKEJsYWggeCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3b3VsZCBpbXBsaWNpdGx5IGJlIHNldCB0byBCYXI6OkJsYWguCiAgICAgICAgICAgIEFsdGhvdWdoIHRoaXMgaXMgdGVjaG5pY2FsbHkgYWxsb3dlZCwgaXQgYnJlYWtzIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb286OkJsYWggeyAuLi4gfQoKICAgICAgICAgICAgZG9lc24ndCBtYXRjaCBsaWtlIHlvdSBleHBlY3QuICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGluIFNXSUctMS4zLjEyLgogICAgICAgICAgICBOb3csIHR5cGVzIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY2xhc3MgaW4gd2hpY2ggdGhleSB3ZXJlIGRlZmluZWQuCiAgICAgICAgICAgIFNvLCB0aGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd2lsbCBiZSBGb286OkJsYWgtLS1zaW5jZSB0aGUKICAgICAgICAgICAgdHlwZSBCbGFoIHdhcyBkZWZpbmVkIGluIEZvby4KIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgc3VidGxlIHR5cGUgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHR5cGVkZWYgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgQmxhaDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhCbGFoIHgsIDo6QmxhaCB5KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsIGNoYW5nZSB0byBoYW5kbGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KICAgICAgICAgICAgRmlyc3QsIHRoZXJlIGlzIG5vIHBvcnRhYmxlIG9yIHJlbGlhYmxlIHdheSB0byB3cmFwCiAgICAgICAgICAgIGEgdmFyYXJncyBmdW5jdGlvbiBpbiBmdWxsIGdlbmVyYWxpdHkuICBIb3dldmVyLCB5b3UgKmNhbiogY2hhbmdlCiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgdXNpbmcgJXZhcmFyZ3MuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICopIGZwcmludGY7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCAuLi4pOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlciAiLi4uIiBpcwogICAgICAgICAgICBzaW1wbHkgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gJXZhcmFyZ3MuIFRoaXMKICAgICAgICAgICAgcmVzdWx0cyBpbiBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIGNoYXIgKnMpOwoKICAgICAgICAgICAgTW9yZSB0aGFuIG9uZSBhcmd1bWVudCBjYW4gYmUgdXNlZCBhbmQgZGVmYXVsdCB2YWx1ZXMKICAgICAgICAgICAgY2FuIGJlIGRlZmluZWQuICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIHNwZWNpZmllcyBhCiAgICAgICAgICAgIG1heGltdW0gb2YgZm91ciBhcmd1bWVudHMuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICp4MSA9IDAsIGNoYXIgKngyID0gMCwgY2hhciAqeDMgPSAwLCBjaGFyICp4NCA9IDApIGZwcmludGY7CiAKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byBoYW5kbGluZyBvZiB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLiAgdmFyYXJncwogICAgICAgICAgICBpcyBub3cgaGFuZGxlZCBhcyBhIHByb3BlciBwYXJhbWV0ZXIgYW5kIGlzIHBhc3NlZCB0byB0aGUKICAgICAgICAgICAgY29kZSBnZW5lcmF0b3IuICBIb3dldmVyLCBpdCBzdGlsbCBjYW4ndCBiZSBoYW5kbGVkIGNvcnJlY3RseQogICAgICAgICAgICAoYW5kIHdpbGwgZ2VuZXJhdGUgYSB0eXBlbWFwIHdhcm5pbmcpLiAgIFRoaXMgY2hhbmdlIGhhcyBiZWVuCiAgICAgICAgICAgIG1hZGUgdG8gYmV0dGVyIGluY29ycG9yYXRlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgd2l0aCBvdGhlcgogICAgICAgICAgICBkaXJlY3RpdmVzIHN1Y2ggYXMgJWlnbm9yZSwgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MjI1NTUgXSBTeW50YXggZXJyb3IgcGFyc2luZyAiZGVmaW5lIiBjb25zdHJ1Y3QuIFNXSUcKICAgICAgICAgICAgaXMgYSBsaXR0bGUgbW9yZSByZXN0cmljdGl2ZSBpbiBkZXRlcm1pbmluZyAjZGVmaW5lIHN0YXRlbWVudHMKICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHdyYXBwZWQgYXMgY29uc3RhbnRzLiAgQWxzbyBhZGRlZCBhIGJldHRlciBwYXJzZXIKICAgICAgICAgICAgZXJyb3IgcnVsZSBmb3IgaGFuZGxpbmcgYmFkIGNvbnN0YW50cy4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogQ2xhc3NlcyByZW5hbWVkIHdpdGggJXJlbmFtZSB0aGF0IGFyZSBkZXJpdmVkIGZyb20gCiAgICAgICAgICAgIGFub3RoZXIgY2xhc3MgZ2VuZXJhdGUgbW9yZSBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgY29kZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgU0YgWyAjNTIzNjMyIF0gYW5kIFsgIzUxMzMzNSBdIGJvdGggcmVwb3J0ZWQgYnkgSXNyYWVsIAogICAgICAgICAgICBUYW5uZXIuIFN1cHBvcnQgZm9yIHR5cGVzIHRoYXQgYXJlIHVzZWQgd2hpY2ggYXJlIGluIGEgdHlwZWRlZi4gVGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBuYW1lIGlzIGdlbmVyYXRlZC4gQWxzbyBnZW5lcmF0ZWQgY29ycmVjdAogICAgICAgICAgICBzaGFkb3cgY2xhc3NuYW1lIHdoZW4gYSB0ZW1wbGF0ZWQgY2xhc3MgaXMgdXNlZCB3aXRoaW4gYW5vdGhlciAKICAgICAgICAgICAgdGVtcGxhdGVkIGNsYXNzLiBTZWUgdGhlIGNwcF90eXBlZGVmLmkgdGVzdGNhc2UuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIHR5cGUgd2FzIGdlbmVyYXRlZCBpbiBzaGFkb3cgY2xhc3NlcyBmb3IgdHlwZXMgCiAgICAgICAgICAgIHRoYXQgd2VyZW4ndCB3cmFwcGVkIGJ5IFNXSUcuICBUaGUgdHlwZSBpcyB0cmVhdGVkIGFzIGEgcmF3IAogICAgICAgICAgICBwb2ludGVyLCBpZSBubyBzaGFkb3cgY2xhc3MuCgowMi8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSB1c2VkIGJ5ICVyZW5hbWUsICVpZ25vcmUsIGFuZAogICAgICAgICAgICAlZmVhdHVyZS4gICBJZiBhIHR5cGUgc2lnbmF0dXJlIGlzIHN1cHBsaWVkLCBpdCBtdXN0IGV4YWN0bHkKICAgICAgICAgICAgbWF0Y2ggdGhhdCB1c2VkIGluIHRoZSBkZWNsYXJhdGlvbi0tLWluY2x1ZGluZyBhbnkgdXNlIG9mCiAgICAgICAgICAgIGNvbnN0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb28xKSAgIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgJXJlbmFtZShiYXIxKSAgIGJhcihpbnQpIGNvbnN0OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsgICAgICAgLy8gTWF0Y2hlZCAtLT4gZm9vMQogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KSBjb25zdDsgLy8gTm90IG1hdGNoZWQgCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOyAgICAgICAvLyBOb3QgbWF0Y2hlZAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KSBjb25zdDsgLy8gTWF0Y2hlZCAtLT4gYmFyMQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgbm9uLWNvbnN0IHNwZWNpZmljYXRpb24gd291bGQgbWF0Y2gKICAgICAgICAgICAgYm90aCB0aGUgbm9uLWNvbnN0IGFuZCBjb25zdCBkZWNsYXJhdGlvbnMuICBIb3dldmVyLCB0aGUgd2hvbGUKICAgICAgICAgICAgcG9pbnQgb2YgJXJlbmFtZSBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGlzIHRoYXQgdGhleSBiZSBhYmxlCiAgICAgICAgICAgIHRvIHByZWNpc2VseSBwaW5wb2ludCBleGFjdCBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgVGhpcwogICAgICAgICAgICBmaXhlcyB0aGUgcHJvYmxlbS4KCjAyLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3JzLgogICAgICAgICAgICBTV0lHIG5vdyBtYWtlcyBhIHByZWxpbWluYXJ5IHBhc3Mgb3ZlciB0aGUgcGFyc2UgdHJlZSB0byBkaXNjb3ZlcgogICAgICAgICAgICB3aGljaCBjbGFzc2VzIHN1cHBvcnQgZGVmYXVsdCBhbGxvY2F0aW9uLiAgIFRoaXMgZml4ZXMgYSBudW1iZXIKICAgICAgICAgICAgb2YgdmVyeSBzdWJ0bGUgaXNzdWVzIGluIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY2FsbC9yZXR1cm4gYnkgdmFsdWUuCgowMi8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBvbiBDeWd3aW46IFBlcmwsIFB5dGhvbiwgVGNsLCBSdWJ5IGFuZCBKYXZhIHNob3VsZAogICAgICAgICAgICB3b3JrIG91dCBvZiB0aGUgYm94LCBiYXJyaW5nIHRoZSBydW50aW1lIGxpYnJhcnkuIFJlbW92ZWQgZGxsd3JhcCAKICAgICAgICAgICAgYW5kIHJlcGxhY2VkIHdpdGggbmV3bHkgd29ya2luZyBnY2MgLXNoYXJlZCBpbnN0ZWFkIGZvciBDeWd3aW4uIAogICAgICAgICAgICBBbGwgdGhpcyB3aWxsIHJlcXVpcmUgdGhlIG5ldyBpbXByb3ZlZCBiaW51dGlscyAyMDAxMDgwMiBhbmQgbGF0ZXIsCiAgICAgICAgICAgIGJ1dCB0aGUgbGF0ZXN0IEN5Z3dpbiBpcyB1c3VhbGx5IHRoZSBiZXN0IHJlY29tbWVuZGF0aW9uLgoKMDIvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICBhbmQgUGVybCBzaGFkb3cgY2xhc3Nlcy4gUmVwb3J0ZWQgYnkgQ2hpYS1saWFuZyBLYW8uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZpeCB0byB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciBDKysgY2xhc3MKICAgICAgICAgICAgY29uc3RydWN0b3JzIHNvIHRoYXQgd2UgZ2V0IGJvdGggYSAibmV3IiBzaW5nbGV0b24gbWV0aG9kCiAgICAgICAgICAgIGFuZCBhbiAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvciBlYWNoIGNsYXNzLiBUaGlzCiAgICAgICAgICAgIGNoYW5nZSBlbmFibGVzIGRldmVsb3BlcnMgdG8gZGVyaXZlIG5ldyBSdWJ5IGNsYXNzZXMgZnJvbQogICAgICAgICAgICBTV0lHLXdyYXBwZWQgQysrIGNsYXNzZXMgYW5kIHRoZW4gb3ZlcnJpZGUgdGhlaXIgaW5pdGlhbGl6ZQogICAgICAgICAgICBtZXRob2RzIHRvIHByb3ZpZGUgc3ViY2xhc3Mtc3BlY2lmaWMgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFzc2l2ZSBkb2N1bWVudGF0aW9uIHVwZGF0ZSBmb3IgdGhlIFJ1YnkgbW9kdWxlLAogICAgICAgICAgICBjb250cmlidXRlZCBieSBDcmFpZyBGaWxlcy4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBBbiBlcnJvciBpbiB0aGUgU1dJRyBydW50aW1lIHN1cHBvcnQgZm9yIFJ1YnkKICAgICAgICAgICAgd2FzIGNhdXNpbmcgc2V2ZXJhbCBvZiB0aGUgZXhhbXBsZXMgdG8gZmFpbC4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogRW51bWVyYXRpb25zIGRlZmluZWQgd2l0aGluIGEgY2xhc3MgKHN1Y2gKICAgICAgICAgICAgYXMgdGhvc2Ugc2VlbiBpbiB0aGUgRXhhbXBsZXMvcnVieS9lbnVtIGV4YW1wbGUpIHdlcmUgbm90CiAgICAgICAgICAgIGJlaW5nIGV4cG9ydGVkIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMuIFJlcG9ydGVkIGJ5IFdpbGxpYW0KICAgICAgICAgICAgRnVsdG9uLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIHdoZW4gd2UgcnVuIGFjcm9zcyBvdmVybG9hZGVkCiAgICAgICAgICAgIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgQysrIGNvZGUsIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgbm90CiAgICAgICAgICAgIHN1cHBvcnRlZCAoZXZlbiBpZiB0aGUgb3ZlcmxvYWRzIGhhdmUgYmVlbiAlcmVuYW1lZCkuIEZvciBhbgogICAgICAgICAgICBleGFtcGxlIG9mIHdoZXJlIHRoaXMgZG9lc24ndCB3b3JrLCBzZWUgRXhhbXBsZXMvcnVieS9vcGVyYXRvci4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhbiAiaWdub3JlZCIgd2FybmluZyBtZXNzYWdlIHdoZW4gdGhlIHBhcnNlciBydW5zCiAgICAgICAgICAgIGFjcm9zcyBhbiBvcGVyYXRvciE9KCkgZGVjbGFyYXRpb24gZm9yIEMrKyBjb2RlLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiaW1wb3J0IiwgImltcG9ydF90ZW1wbGF0ZSIsICJvcGVyYXRvciIgYW5kCiAgICAgICAgICAgICJ0ZW1wbGF0ZSIgZXhhbXBsZXMuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbXVsdGktbW9kdWxlIHN1cHBvcnQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIG1pc3NpbmcgIiNkZWZpbmUgU1dJR19OT0lOQ0xVREUiIGF0IHRoZSB0b3Agb2YKICAgICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3aGVuIHRoZSAnLWMnIG9wdGlvbiBpcyB1c2VkLgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgQ29ycmVjdGVkIGEgbWlub3Igb2ZmLWJ5LW9uZSBlcnJvciBmb3IgdGhlIHNpemUgb2YgdGhlCiAgICAgICAgICAgIHN3aWdfdHlwZXNbXSBhcnJheSB0aGF0J3MgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyIGNvZGUuCgowMi8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFNGIFsgIzUxNTA1OCBdIFdyb25nIGNvZGUgZm9yIEMrKyB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgpWZXJzaW9uIDEuMy4xMSAoSmFudWFyeSAzMSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBwYXNzL3JldHVybiBieSB2YWx1ZSBmb3IgQysrIG9iamVjdHMgdGhhdCBkZWZpbmUKICAgICAgICAgICAgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgdG8gdGhlIHR5cGVtYXAgc3lzdGVtCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB3cmFwIEMrKyBvYmplY3RzIHdpdGggbm8gZGVmYXVsdAogICAgICAgICAgICBjb25zdHJ1Y3Rvci4gICBUaGlzIGhhcyBiZWVuIGZpeGVkLCBidXQgdGhlIHNvbHV0aW9uIAogICAgICAgICAgICBpbnZvbHZlcyBzb21lIGNsZXZlciB0ZW1wbGF0ZSBtYWdpYyBjb250cmlidXRlZCBieSAKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uICBQbGVhc2Ugc2VlIHRoZSBjb21tZW50cyBpbiB0aGUgZmlsZQogICAgICAgICAgICBMaWIvc3dpZy5zd2cgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFRoaXMgc29sdXRpb24gaXMKICAgICAgICAgICAgZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmVmaW5lZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBHbG9iYWwgdmFyaWFibGVzIGFuZCBtZW1iZXIgZGF0YSBvZiB0eXBlICJjb25zdCBjaGFyICoiCiAgICAgICAgICAgIGNhbiBiZSBzZXQsIGJ1dCB0aGUgb2xkIHZhbHVlIGlzIHNpbGVudGx5IGRpc2NhcmRlZCB3aXRob3V0CiAgICAgICAgICAgIGFueSBnYXJiYWdlIGNvbGxlY3Rpb24uICAgVGhpcyBtYXkgZ2VuZXJhdGUgYSBtZW1vcnkgbGVhay4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIHRvIG1vcmUgc2FmZWx5IGhhbmRsZSB2YXJpYWJsZXMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvbyA9ICJIZWxsbyBXb3JsZFxuIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQncyBub3Qgc2FmZSB0byBmcmVlIHRoZSBvbGQgdmFsdWUuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIGNhbiBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIG5ldyB2YWx1ZSBhbmQgbWFrZSBmb28gcG9pbnQKICAgICAgICAgICAgdG8gaXQuICAgVG8gZml4IHRoaXMgbWVtb3J5IGxlYWssIHlvdSBjYW4gcHJvYmFibHkgZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjbGVhciBjb25zdCBjaGFyICpmb287CiAgICAgICAgICAgICAgICVhcHBseSBjaGFyICoge2NvbnN0IGNoYXIgKmZvb307CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG1pbm9yIHR5cGVtYXAgZW5oYW5jZW1lbnRzIGhhdmUgYmVlbiBhZGRlZC4gIEZpcnN0LAogICAgICAgICAgICB0eXBlbWFwcyBjYW4gaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgaW5jbHVkaW5nIGEgc3BlY2lhbAogICAgICAgICAgICB3YXJuaW5nIGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoaW4sd2FybmluZz0iSSdtIGdvaW5nIHRvIGRvIHNvbWV0aGluZyBkYW5nZXJvdXMiKSAuLi4KCiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBzaG93IHVwIHdoZW5ldmVyIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFwcGxpZWQuCgogICAgICAgICAgICBTZWNvbmQsIGEgdHlwZW1hcCBjYW4gZm9yY2UgYSBuby1tYXRjaCBieSBkZWZpbmluZwoKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzb21ldHlwZSAicGFzcyI7CgogICAgICAgICAgICBJZiB0aGlzIGlzIHVzZWQsIHRoZSB0eXBlbWFwIHN5c3RlbSB3aWxsICpub3QqIHJlY29yZCBhCiAgICAgICAgICAgIHR5cGVtYXAgbWF0Y2ggZm9yICJzb21ldHlwZSIuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBibG9jawogICAgICAgICAgICBzZWxlY3RlZCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGRpc2FibGUKICAgICAgICAgICAgYSB0eXBlbWFwIGZlYXR1cmUgZm9yIHNvbWUgdHlwZSwgeW91IGNvdWxkIGRvIHRoaXMuCgogICAgICAgICAgICAgICAvLyBEbyBub3QgYWxsb3cgZ2xvYmFsIHZhcmlhYmxlcyBvZiB0eXBlICdjb25zdCBjaGFyIConIHRvIGJlIHNldC4KICAgICAgICAgICAgICAgJXR5cGVtYXAodmFyaW4pIGNvbnN0IGNoYXIgKiAicGFzcyI7CgogICAgICAgICAgICBJdCBtaWdodCBhbHNvIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIHRvIGRvIHN1YnRsZSBhbmQKICAgICAgICAgICAgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgIG1ha2UgJ2JsYWggKicgYW4gb3V0cHV0IHZhbHVlIGFuZCAnY29uc3QgYmxhaCAqJyBhbiBpbnB1dAogICAgICAgICAgICBwYXJhbWV0ZXIsIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgYmxhaCAqKGJsYWggdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogQmxvY2sgdW5xdWFsaWZpZWQgdHlwZW1hcHMgZGVmaW5lZCBhYm92ZSAqLwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pICAgICBjb25zdCBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgaW5wdXQgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgKFRoaXMgcG90ZW50aWFsIGFwcGxpY2F0aW9ucyBvZiB0eXBlbWFwcyBzdWdnZXN0ZWQgYnkgR3JlZyBTdGVpbikuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzI5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyBlbnVtZXJhdGlvbnMgd2VyZSB3cmFwcGVkIHdoZW4gdGhlIC1zaGFkb3cgCiAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLiBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKMDEvMjgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEdsb2JhbCBhcnJheXMgYXJlIHN1Y2Nlc3NmdWxseSB3cmFwcGVkLiBJbiBmYWN0IHRoZXkgc3RhcnRlZAogICAgICAgICAgIG1vc3RseSB3b3JraW5nIGluIFNXSUctMS4zLjEwLgoKMDEvMjgvMjAwMjpyaWNoYXJkcAoJICAgQWRkZWQgZmlyc3QgYXR0ZW1wdCBhdCBDKysgYW5kIC1zaGFkb3cgc3VwcG9ydCBmb3IgUEhQNCBtb2R1bGUsCgkgICBwbGVhc2UgdGVzdCBhbmQgbWFpbCBtZSBpZiBhbnkgcHJvYmxlbXMvaWRlYXMgb24gaW1wcm92aW5nIGl0LgoKCSAgIFRoZXJlIGlzIGEga25vd24gcHJvYmxlbSB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtYmVyIHZhcmlhYmxlcywKCSAgIHBsZWFzZSBzZWUgRXhhbXBsZXMvcGhwNC9zeW5jL1JFQURNRSBmb3IgZGV0YWlscy4KCgkgICBBbHNvIG1vcmUgUEhQIGRvY3VtZW50YXRpb24gYWRkZWQgdG8gRG9jL01hbnVhbC9QaHAuaHRtbAoKMDEvMjcvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgVGhlIEFOU0kgQyBzaXplX3QgdHlwZSBpcyBub3cgcmVjb2duaXplZCBhcyBhbiBpbnRlZ2VyIGJ5IGRlZmF1bHQuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyBzdXBwb3J0IGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICBUaGlzIGlzIG5vdCBhIHBvcnRhYmxlIGZlYXR1cmUgYW5kIHdpbGwgcmVxdWlyZSBjb21waWxlciBzdXBwb3J0CiAgICAgICAgICAgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gIEluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAogICAgICAgICAgIGxvbmcgbG9uZyAoZS5nLiwgVGNsIGFuZCBQZXJsKSwgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgc3RyaW5nCiAgICAgICAgICAgb2YgZGlnaXRzLiAgVGhpcyBwcmV2ZW50cyB0aGVpciB1c2UgaW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMsIGJ1dAogICAgICAgICAgIHN0aWxsIGFsbG93cyB2YWx1ZXMgdG8gYmUgc2V0IGZyb20gYSBzdHJpbmcuICAKCiAgICAgICAgICAgbG9uZyBsb25nIHN1cHBvcnQgcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgc3RydG9sbCgpIGFuZCBzdHJ0b3VsbCgpCiAgICAgICAgICAgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlICdsbGQnIGFuZCAnbGx1JyBmb3JtYXQgc3BlY2lmaWVycwogICAgICAgICAgIG9mIHNwcmludGYoKS4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzUwMTgyNyBdIERlbGV0ZSBtZXRob2QgaXMgbm90IGNhbGxlZC4gICBUaGUgVGNsCiAgICAgICAgICAgbW9kdWxlIHdhc24ndCBjb3JyZWN0bHkgY2FsbGluZyBkZXN0cnVjdG9ycyB3aGVuIHRoZXkKICAgICAgICAgICB3ZXJlIGRlZmluZWQgdXNpbmcgJWFkZG1ldGhvZHMuICBUaGlzIGhhcyBiZWVuIGZpeGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFJlaW5oYXJkIEZvYmJlLgoKMDEvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4gIFR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIGEgbnVtYmVyIG9mIG1vZHVsZXMgZm9yIGhhbmRsaW5nIHRoZXNlIHR5cGVzLgogICAgICAgICAgIEluIGFkZGl0aW9uLCB0aGUgcGFyc2VyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFjY2VwdCBsb25nIGxvbmcKICAgICAgICAgICBsaXRlcmFscyBzdWNoIGFzIDEyMzRMTCBhbmQgMTIzNFVMTC4KCjAxLzI3LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBBIEMgY2hhcltdIGlzIG1hcHBlZCB0byBhIEphdmEgU3RyaW5nIHdoaWNoIGlzIHRoZSBkZWZhdWx0IAogICAgICAgICAgIFNXSUcgaGFuZGxpbmcgb2YgY2hhcltdIGFuZCBjaGFyKi4gSXQgdXNlZCB0byBiZSBtYXBwZWQgdG8gYnl0ZVtdLiAKICAgICAgICAgICBOb3RlIHRoYXQgYSBDIHNpZ25lZCBjaGFyW10gYXJyYXkgaXMgbWFwcGVkIHRvIGJ5dGVbXS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowMS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggcmV0dXJuLWJ5LXZhbHVlLCBDKyssIGFuZAogICAgICAgICAgIG9iamVjdHMgdGhhdCBkZWZpbmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2VsIFJlZWQuCgowMS8yNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gT3ZlcmhhdWwgb2YgdGhlIEphdmEgbW9kdWxlLiBUaGUgQyBjb2RlIGdlbmVyYXRpb24gaXMgbm93IAogICAgICAgICAgIGRvbmUgZnJvbSB0eXBlbWFwcy4KCjAxLzI0LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBTdXBwb3J0IGZvciBhcnJheXMgb2YgZW51bSBwb2ludGVycwoKMDEvMjAvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEVycm9yIGNoZWNraW5nIGZvciBudWxsIEphdmEgb2JqZWN0cyBiZWluZyBwYXNzZWQgdG8gbmF0aXZlIAogICAgICAgICAgIGZ1bmN0aW9ucy4gIEV4Y2VwdGlvbiB0aHJvd24gbm93IHdoZXJlYXMgYmVmb3JlIHRoZSBKVk0gY3Jhc2hlZC4KCjAxLzE4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDb3JyZWN0ZWQgYmVoYXZpb3VyIGZvciBmdW5jdGlvbnMgdGhhdCB0YWtlIGFycmF5cy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIHdoZW4gdGhpcyBjIGZ1bmN0aW9uOiAKCiAgICAgICAgICAgdm9pZCBhcnJheWZuKGludCBhcnJheVtdKTsKICAgICAgICAgICAKICAgICAgICAgICBpcyB3cmFwcGVkIHRoZSBjb3JyZXNwb25kaW5nIG5hdGl2ZSBmdW5jdGlvbgoKICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGFycmF5Zm4oaW50W10gYXJyYXkpOwoKICAgICAgICAgICBpcyBwcm9kdWNlZC4gUHJldmlvdXNseSBpZiB0aGUgQyBmdW5jdGlvbiBtYWRlIGFueSBjaGFuZ2VzIHRvIHRoZSAKICAgICAgICAgICBhcnJheSBlbGVtZW50cywgdGhlc2Ugd2VyZSBub3QgcmVmbGVjdGVkIGJhY2sgaW50byB0aGUgSmF2YSBhcnJheS4gCiAgICAgICAgICAgVGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkIHNvIHRoYXQgdGhlIGNoYW5nZXMgYXJlIHByb3BvZ2F0ZWQgYmFjawogICAgICAgICAgIHRvIEphdmEgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgc2VlIHRoZXNlIGNoYW5nZXMuIFRoaXMgaXMgCiAgICAgICAgICAgaG93IHB1cmUgSmF2YSBmdW5jdGlvbnMgd29yaywgaWUgYXJyYXlzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgoKMDEvMTUvMjAwMjpta29lcHBlCiAgICAgICAgICAgW0d1aWxlXSBOZXcgZmlsZSBjcGx1c3BsdXMuaSB3aXRoIEMrKyB0eXBlbWFwcyBjb250cmlidXRlZAogICAgICAgICAgIGJ5IE1hcmNpbyBMdWlzIFRlaXhlaXJhIDxtYXJjaW90QGhvbGx5LmNvbG9zdGF0ZS5lZHU+LgoKMDEvMTEvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENoYW5nZWQgbWFwcGluZyBvZiBDIGxvbmcgdG8gSmF2YSB0eXBlLiBXYXMgbWFwcGVkIHRvIEphdmEKICAgICAgICAgICBsb25nLCBub3cgbWFwcGVkIHRvIEphdmEgaW50LiBJZiB5b3Ugd2FudCB0aGUgcHJldmlvdXMgbWFwcGluZyB0byAKICAgICAgICAgICBKYXZhIGxvbmcgdXNlIHRoaXMgYXBwcm9hY2ggaW4geW91ciBpbnRlcmZhY2UgZmlsZToKICAgICAgICAgICAKICAgICAgICAgICAgICVjbGVhciBsb25nOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nICAgICAgICAgICAgICJqbG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nICAgICAgICAgICAibG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZyAgICAgICAgICAibG9uZyIKCiAgICAgICAgICAgICAlY2xlYXIgbG9uZ1tBTlldOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nW0FOWV0gICAgICAgICJqbG9uZ0FycmF5IgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmdbQU5ZXSAgICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmdbQU5ZXSAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBsb25nW0FOWV0gICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGxvbmdbQU5ZXSAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBsb25nW0FOWV0gICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGxvbmdbQU5ZXSAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBUaGlzIG5ldyBtYXBwaW5nIGlzIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiBpbnRlcmZhY2luZyB0byAzMiBiaXQgCiAgICAgICAgICAgYXBwbGljYXRpb25zIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBjdXJyZW50IDMyLWJpdCBKVk1zLiBGb3IgZnV0dXJlIAogICAgICAgICAgIDY0LWJpdCBKVk1zIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlc2UgbWFwcGluZ3MgLSBlZyBvbiBVbml4IExQNjQgCiAgICAgICAgICAgc3lzdGVtcywgYnV0IG5vdCBvbiBNaWNyb3NvZnQgNjRiaXQgV2luZG93cyB3aGljaCB3aWxsIGJlIHVzaW5nIGEgCiAgICAgICAgICAgUDY0IElMMzIgbW9kZWwuIFRoaXMgbWF5IGJlIGF1dG9tYXRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNXSUcuCgowMS8xMC8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbIDUwMTY3NyBdICVpbml0IGJsb2NrIGluIHdyb25nIHBsYWNlLiBSZXBvcnRlZAogICAgICAgICAgIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDEvMDkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIERlZmF1bHQgc3VwcG9ydCBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiBzaWduZWQgbG9uZyBsb25nIGlzIAogICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgbG9uZy4gdW5zaWduZWQgbG9uZyBsb25nIGlzIG1hcHBlZCB0byBCaWdJbnRlZ2VyLgoKMDEvMDkvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRXhwZXJpbWVudGFsIGNoYW5nZSB0byBwYXJzZXIgdG8gYmV0dGVyIHN1cHBvcnQgbWl4aW5nIG9mCiAgICAgICAgICAgaW50LCBsb25nLCBzaG9ydCwgdW5zaWduZWQsIGZsb2F0LCBhbmQgZG91YmxlLiAgIFRoZSBwYXJzZXIKICAgICAgICAgICBzaG91bGQgbm93IHN1cHBvcnQgdHlwZXMgbGlrZSB0aGlzOgogICAgCiAgICAgICAgICAgICAgICBzaG9ydCB1bnNpZ25lZCBpbnQKICAgICAgICAgICAgICAgIGludCAgIHVuc2lnbmVkIHNob3J0CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaG9ydAoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmFibGVzIGEgdHlwZSBvZiAnbG9uZyBkb3VibGUnIChwcmV2aW91c2x5CiAgICAgICAgICAgIHVuc3VwcG9ydGVkKSB0byBiZSB1c2VkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2FzdGluZyBmaXggZm9yIHdoZW4gZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSBwb2ludGVyIGFzIAogICAgICAgICAgIHJlcG9ydGVkIGJ5IEdhcnkgUGVubmluZ3RvbiAyMDAyLTAxLTA1LiBUaGUgdXBwZXIgMzJiaXRzIG9mIHRoZSAKICAgICAgICAgICA2NCBiaXQgamxvbmcgd2lsbCBoYXZlIGNvbnRhaW5lZCBqdW5rIGZvciAzMmJpdCBwb2ludGVycy4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgcG9pbnRlciBoYW5kbGluZyBpbiBKYXZhIGlzIHBvc3NpYmxlIGFzIHRoZSAKICAgICAgICAgICBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBoYXZlIGJlZW4gYWRkZWQgaW50byB0eXBlbWFwcy5pLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdICRudWxsIGNhbiBiZSB1c2VkIGluIGlucHV0IHR5cGVtYXBzIHRvIHJldHVybiBlYXJseSBmcm9tIEpOSSAKICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBoYXZlIGVpdGhlciB2b2lkIG9yIGEgbm9uLXZvaWQgcmV0dXJuIHR5cGUuIEV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2spIGludCAqICV7IAogICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAlfQoKICAgICAgICAgICBJZiB0aGUgdHlwZW1hcCBnZXRzIHB1dCBpbnRvIGEgZnVuY3Rpb24gd2l0aCB2b2lkIGFzIHJldHVybiwgJG51bGwgCiAgICAgICAgICAgd2lsbCBleHBhbmQgdG8gbm90aGluZzoKCiAgICAgICAgICAgICB2b2lkIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3RoZXJ3aXNlICRudWxsIGV4cGFuZHMgdG8gemVybywgd2hlcmUgamF2YXJldHVybnR5cGUgaXMgZWl0aGVyIGEgCiAgICAgICAgICAgcG9pbnRlciBvciBhIHByaW1pdGl2ZSB0eXBlOgoKICAgICAgICAgICAgIGphdmFyZXR1cm50eXBlIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgowMS8wMi8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gVGhlIEphdmEgbW9kdWxlIGluY29ycmVjdGx5IHVzZWQgYXJnb3V0IHR5cGVtYXBzIGZvciAKICAgICAgICAgICBzdHJpbmdzLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQgYW5kIHRoZSBjb2RlIG5vdyByZXNpZGVzCiAgICAgICAgICAgaW4gdGhlIGZyZWVhcmcgdHlwZW1hcC4gVGhlIGFyZ291dCBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gc3BsaXQgaW50byAKICAgICAgICAgICBhcmdvdXQgYW5kIGZyZWVhcmcgdHlwZW1hcHMuIFRoaXMgY29ycmVjdGlvbiBtYXkgcmVxdWlyZSBzb21lIHVzZXIgCiAgICAgICAgICAgd3JpdHRlbiB0eXBlbWFwcyB0byBiZSBtb2RpZmllZC4gCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gTXVsdGkgdHlwZW1hcHMgbm93IHdvcmtpbmcgZm9yIEphdmEgc2VlIG11bHRpbWFwIGV4YW1wbGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgLSBmcmVlYXJnIHR5cGVtYXAgY29kZSB3YXMgYXBwZWFyaW5nCiAgICAgICAgICAgYmVmb3JlIHRoZSBmdW5jdGlvbiBjYWxsLgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEpDQUxMIG1hY3JvIGZvciBKTkkgY2FsbHMgdGhhdCB3b3JrIGluIGJvdGggQyBhbmQgQysrIHR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggSkNBTEwwLCBKQ0FMTDEsIEpDQUxMMiwgSkNBTEwzIGFuZCBKQ0FMTDQgCiAgICAgICAgICAgbWFjcm9zLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUmVzb2x2ZWQgc29tZSBpbmNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCAlcmVuYW1lIGFuZCBjbGFzcyByZW5hbWluZy4KICAgICAgICAgICBJZiB5b3Ugc3BlY2lmeSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAgQmFyOwoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGVuIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBhcHBsaWVzIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwKICAgICAgICAgICBhbmQgdGhlIGRlc3RydWN0b3IgKGFsbCB3aWxsIGJlIHJlbmFtZWQgdG8gRm9vKS4KCiAgICAgICAgICAgSWYgYSBjbGFzcyBkZWZpbmVzIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IsIHRoZSBvdmVybG9hZGVkIHZhcmlhbnRzCiAgICAgICAgICAgY2FuIHN0aWxsIGJlIHJlbmFtZWQgYnkgc3BlY2lmeWluZyBwYXJhbWV0ZXJzIHRvICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVyZW5hbWUoQmFyX2NvcHkpIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGVyZSBhcmUgc3RpbGwgc29tZSBvZGQgY29ybmVyIGNhc2VzLiAgSWYgeW91IHNwZWNpZnkKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSA6OkJhcjsKCiAgICAgICAgICAgdGhlbiBvbmx5IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBjaGFuZ2VkIGFuZCB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgogICAgICAgICAgIG5hbWVzIGFyZSBsZWZ0IHVubW9kaWZpZWQuICBJZiB5b3Ugc3BlY2lmeSAKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAqOjpCYXI7CgogICAgICAgICAgIHRoZW4gdGhlIG5hbWVzIG9mIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZ1bmN0aW9ucyBhcmUgbW9kaWZpZWQgYnV0CiAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdC4KCjEyLzIxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBqbmksIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMgbm8gbG9uZ2VyIGhhcmRjb2RlZCBidXQgcmVhbCAKICAgICAgICAgICB0eXBlbWFwcy4gTmV3IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiwgJGphdmFjbGFzc25hbWUsIGNhbiBiZSB1c2VkIGluCiAgICAgICAgICAgdGhlIGpzdHlwZSB0eXBlbWFwcy4gSXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgSmF2YSBzaGFkb3cgY2xhc3MgbmFtZQogICAgICAgICAgIHdoZXJlIGFwcGxpY2FibGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgdG8gZG8gd2l0aCBpbmhlcml0YW5jZSB3aGVuIAogICAgICAgICAgIHVzaW5nICVpbXBvcnQuCiAgICAgICAgICAgW0phdmFdIEEgZmV3IG1vcmUgYnVnIGZpeGVzLCB0b2RvIHdpdGggJXJlbmFtZSBhbmQgdXNpbmcgdGhlIGtpbmQKICAgICAgICAgICB3aXRoIHRoZSB0eXBlLCBlZyAKICAgICAgICAgICB2b2lkIGZuKHVuaW9uIHVuaSBteXVuaSwgc3RydWN0IHN0ciBteXN0ciwgY2xhc3MgY2wgbXljbCk7CgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0OTQ1MjQgXSBQcmVwcm9jZXNzb3IgYnVnIC0gYXBvc3Ryb3BoZSBhbmQgI3N1YnN0LgoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgU1dJR19WRVJTSU9OIHByZXByb2Nlc3NvciBzeW1ib2wuICAgVGhpcyBpcyBhIGhleGFkZWNpbWFsCiAgICAgICAgICAgaW50ZWdlciBzdWNoIGFzIDB4MDEwMzExIChjb3JyZXNwb25kaW5nIHRvIFNXSUctMS4zLjExKS4gIFRoaXMgY2FuCiAgICAgICAgICAgYmUgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAjaWYgU1dJR19WRVJTSU9OID49IDB4MDEwMzExCiAgICAgICAgICAgICAgIC8qIFVzZSBzb21lIGZhbmN5IG5ldyBmZWF0dXJlICovCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICBOb3RlOiBUaGUgdmVyc2lvbiBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCBTV0lHCiAgICAgICAgICAgd3JhcHBlciBmaWxlLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMi8yMC8yMDAxOm1rb2VwcGUKCSAgIFtNelNjaGVtZV06IFJlbmFtZWQgbXpzd2lnX21ha2VfYm9vbGVhbiB0bwoJICAgc3dpZ19tYWtlX2Jvb2xlYW4sIGFzIHRoZSBsYXR0ZXIgaXMgdXNlZCBpbiB0aGUgdHlwZW1hcHMuCgkgICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjEyLzE3LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogUmV3cm90ZSBsaXN0LXZlY3Rvci5pIHVzaW5nIG11bHRpLWRpc3BhdGNoCgkgICB0eXBlbWFwcy4gIFVwZGF0ZWQgcG9pbnRlci1pbi1vdXQuaS4gIE1ha2UgdGhlCgkgICBkZXByZWNhdGVkIHR5cGVtYXAtc3Vic3RpdHV0aW9uIG9mICIkc291cmNlIiBpbiAiYXJnb3V0IgoJICAgd29yayBhcyBiZWZvcmUuCgoxMi8xNi8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIG1hY3JvcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgJW11bHRpcGxlX3ZhbHVlcyB0byB1c2UgdGhlIHByb3BlciAlcHJhZ21hIHN5bnRheC4gIE5ldwoJICAgR3VpbGUgZXhhbXBsZS90ZXN0ICJtdWx0aXZhbHVlIjsgbmV3IEd1aWxlIHJ1bi10ZXN0IGZvcgoJICAgdGVzdC1zdWl0ZSBpdGVtICJsaXN0LXZlY3RvciIgKGN1cnJlbnRseSBicm9rZW4pLgoKMTIvMTQvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCB0eXBlbWFwLXN1YnN0aXRpb24gYnVnIGZvciAidmFyaW4iLiAgUmVsYXhlZAoJICAgdmFsaWQtaWRlbnRpZmllciBjaGVjayB0byBhbGxvdyBhbGwgUjVSUyBpZGVudGlmaWVycy4KCgpWZXJzaW9uIDEuMy4xMCAoRGVjZW1iZXIgMTAsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkICV0eXBlbWFwIHNvIHRoYXQgJXsgLi4uICV9IGNhbiBhbHNvIGJlIHVzZWQgYXMgYQogICAgICAgICAgIGNvZGUgYmxvY2sgKG1vc3RseSBmb3IgY29tcGxldGVuZXNzKS4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggJXsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGlzIGZvcm0gZG9lcyBub3QgaW50cm9kdWNlIGEgbmV3IGJsb2NrIHNjb3BlLiAgQWxzbywgdGhlCiAgICAgICAgICAgY29kZSBlbmNsb3NlZCBpbiAleyAuLi4gJX0gaXMgbm90IHByb2Nlc3NlZCBieSB0aGUgcHJlcHJvY2Vzc29yLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDU5NjE0IF0gU1dJRyB3aXRoIG11bHRpcGxlIFRDTCBpbnRlcnByZXRlcnMuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTcxNDEgXSBydWJ5ZGVjLnN3ZyBpcyB3cm9uZwogICAgICAgICAgIFJlcG9ydGVkIGJ5IFBhdWwgQnJhbm5hbi4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxMDU1NyBdIFByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyBvbiBOVC4KICAgICAgICAgICBSZXBvcnRlZCBieSBNYWdudXMgTGp1bmcuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NDUyMzMgXSBFbmhhbmNlbWVudDogaGFuZGxlIGFjY2VzcyBjaGFuZ2UuCiAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIChidXQgaWdub3JlcykgQysrIGFjY2VzcyBjaGFuZ2VzIGZvciB0aGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoKSB7IH0KICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEEoKSB7fQogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBjbGFzcyBCIDogcHJpdmF0ZSBBIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IH0KICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIEE6OnNvbWV0aGluZzsgICAgPC0tLS0gUGFyc2VkLCBidXQgaWdub3JlZAogICAgICAgICAgICAgfTsKIAogICAgICAgICAgIFN1Z2dlc3RlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMTIvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgRml4IGZvciBSdWJ5IHRvIHdvcmsgdXNpbmcgVmlzdWFsIEMrKy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ2NTY4NyBdIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlcnMgZmFpbC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODk1OTQgXSBQeVN0cmluZ19Gcm9tU3RyaW5nIGNhbid0IHRha2UgTlVMTCBhcmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9obiBNZXJyaXR0LiAgIFNXSUcgbm93IGNvbnZlcnRzIHN0cmluZyB2YWx1ZXMKICAgICAgICAgICB0byBQeXRob24gdXNpbmcgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgIHJlc3VsdG9iaiA9IHJlc3VsdCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0KSA6IFB5X0J1aWxkVmFsdWUoIiIpOwoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDYzNTYxIF0gVHlwZSBjb252ZXJzaW9ucyBub3QgZ2VuZXJhdGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCQoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzAyMTcgXSBUY2wgZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MjA4OCBdIGRlZmluZWQoTUFDUk8pIGV4cGFuZGVkIGV2ZXJ5d2hlcmUuCiAgICAgICAgICAgRW1iZWRkZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgc3VjaCBhcwoKICAgICAgICAgICAgICAlI2lmIGRlZmluZWQoRk9PKQoKICAgICAgICAgICBhcmUgbm90IGV4cGFuZGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzY0NjcgXSBQcm9ibGVtcyB3aXRoICNkZWZpbmUgJiBjb21tYXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0Nzc1NDcgXSB3cm9uZyBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBCYWQgcHJvdG90eXBlcyBpbiBMaWIvdGNsL3B0cmxhbmcuaS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4MzE4MiBdIENvbnN0YW50cyBjYW4gdGFrZSBhcmdzIGJ5IG1pc3Rha2UuIAogICAgICAgICAgIFdoZW4gc3dpZyAtcGVybDUgLWNvbnN0IGlzIHVzZWQsIGNvbnN0YW50cyBhcmUgZGVjbGFyZWQKICAgICAgICAgICB3aXRoIGEgdm9pZCBwcm90b3R5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdWIgSUNPTlNUICgpIHsgJGV4YW1wbGVjOjpJQ09OU1QgfQoKICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgUmljaCBXYWxlcy4KCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIE5ldyAlZXhjZXB0aW9uIGRpcmVjdGl2ZS4gICBUaGlzIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgJWV4Y2VwdC4KICAgICAgICAgICBJdCB3b3JrcyBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciBleGNlcHQgaXQgZG9lcyBub3QgYWNjZXB0IGEgCiAgICAgICAgICAgbGFuZ3VhZ2Ugc3BlY2lmaWVyLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICBjYXRjaChTb21lRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICBlcnJvcgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgICVleGNlcHRpb24gaXMgYWxzbyBuYW1lIGF3YXJlLS0tYWxsb3dpbmcgaXQgdG8gYmUgYXBwbGllZCB0bwogICAgICAgICAgIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBhbnkgZnVuY3Rpb24vbWV0aG9kIGZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyKGRvdWJsZSkgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyKGRvdWJsZSkgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIHNlbWFudGljcyBvZiB0aGlzIG5hbWUgbWF0Y2hpbmcgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnN0YW50aWFsIGNsZWFudXAgb2YgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZS4gIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgdXNlZCB0byBiZSBjcmVhdGVkIGluIHRoaXMgcmF0aGVyIGNvbXBsaWNhdGVkIG1hbm5lciBpbnZvbHZpbmcgYWJvdXQKICAgICAgICAgICBhIGhhbGYtZG96ZW4gc3RyaW5ncyBjcmVhdGVkIGluIGJpdHMgYW5kIHBpZWNlcy4gICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkIGluIGEgbW9yZSBzdHJhaWdodGZvcndhcmQgbWFubmVyLS1pbiB0aGUgc2FtZQogICAgICAgICAgIG9yZGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMgYXBwZWFyIGluIHRoZSBzaGFkb3cgZmlsZSBtYXkgZGlmZmVyLgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJWluc2VydCBkaXJlY3RpdmUgKCV7IC4uLiAlfSwgJXJ1bnRpbWUsICVoZWFkZXIsICV3cmFwcGVyLCBldGMuKQogICAgICAgICAgIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiAgIFRoaXMgaGFzIHBvdGVudGlhbAogICAgICAgICAgIHVzZXMgd2hlbiBnZW5lcmF0aW5nIHNoYWRvdyBjbGFzcyBjb2RlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICVpbnNlcnQoInNoYWRvdyIpICV7CiAgICAgICAgICAgICAgICAgIyBTb21lIHB5dGhvbiBjb2RlCiAgICAgICAgICAgICAgICAgZGVmIGJsYWgoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICBwcmludCAiSSdtIGJsYWghIgogICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBzdXBwb3J0IGZvciBjbGFzcyBjb2RlIGluc2VydGlvbiBkZXBlbmRzIG9uIHRoZSBsYW5ndWFnZSBtb2R1bGUuCiAgICAgICAgICAgSG93ZXZlciwgdGhlIGludGVudCBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gc2ltcGxpZnkgdGhlIHRhc2sgb2YgZXh0ZW5kaW5nCiAgICAgICAgICAgc2hhZG93IGNsYXNzIGNvZGUuICAgSW4gdGhlIFB5dGhvbiBtb2R1bGUsIHRoaXMgaW5zZXJ0cyBjb2RlIHdpdGggdGhlCiAgICAgICAgICAgcHJvcGVyIGxldmVsIG9mIGluZGVuZGF0aW9uIChyZWdhcmRsZXNzIG9mIHdoYXQgd2FzIHVzZWQgaW4gdGhlIFNXSUcKICAgICAgICAgICBpbnRlcmZhY2UpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIEphdmEgYW5kIFB5dGhvbiBtb2R1bGVzIHRvIHdvcmsgb24gY3lnd2luLgogICAgICAgICAgIFVuZm9ydHVuYXRlbHkgYSBsb3Qgb2YgdGhlIHB5dGhvbiBtb2R1bGUgaGFzIHN0YXJ0ZWQgdG8gcHJvZHVjZXMgY29kZSAKICAgICAgICAgICB3aGljaCBjYW5ub3QgYmUgYXV0by1pbXBvcnRlZCB1c2luZyBjeWd3aW4gbGlidG9vbHMgc28gbW9zdCBvZiBpdCBpcyAKICAgICAgICAgICBzdGlsbCBicm9rZW4uCgoxMS8yOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJXJlbmFtZSBhbmQgJWZlYXR1cmUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUKICAgICAgICAgICBvZiBhIGNsYXNzIGRlZmluaXRpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29faSkgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIHRoaXMgbWFubmVyLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgb25seSBhcHBsaWVzCiAgICAgICAgICAgdG8gbWVtYmVycyBvZiB0aGUgY2xhc3MgaW4gd2hpY2ggaXQgYXBwZWFycyBhcyB3ZWxsIGFzIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3Nlcy4gIEluIGZhY3QsIHRoaXMgaXMgcmVhbGx5IGp1c3QgdGhlIHNhbWUKICAgICAgICAgICBhcyBzYXlpbmc6CgogICAgICAgICAgICAgJXJlbmFtZShmb29faSkgRm9vOjpmb28oaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIEZvbzo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCB0aGUgZXhwZXJpbWVudGFsICVmZWF0dXJlIGRpcmVjdGl2ZS4gICVmZWF0dXJlIGNhbiBiZQogICAgICAgICAgIHVzZWQgdG8gYXR0YWNoIGFyYml0cmFyeSBzdHJpbmcgYXR0cmlidXRlcyB0byBwYXJzZSB0cmVlIG5vZGVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGJsYWggewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ZXZlcjsgICAgICAKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2V0IikgKjo6eF9zZXQgIngiOwoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiYmxhaCIpIEZvbzo6YmFyKGludCxkb3VibGUpIGNvbnN0ICJzcGFtIjsKCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBib3Jyb3dlZCBmcm9tIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4gIEluIGZhY3QsIHRoZQogICAgICAgICAgIGV4YWN0IHNhbWUgc2VtYW50aWNzIGFwcGx5IChpbmhlcml0YW5jZSwgbWF0Y2hpbmcsIGV0Yy4pLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBhIHZlcnkgcG93ZXJmdWwgbG93LWxldmVsIHByaW1pdGl2ZSB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICAgY3VzdG9taXplIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgdG8gcHJvdmlkZSBoaW50cyB0byAKICAgICAgICAgICBhbnkgc3RhZ2Ugb2YgY29kZSBnZW5lcmF0aW9uLiAgIEZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0bwogICAgICAgICAgIHBhcnNlIHRyZWUgbm9kZXMgYXMgYXR0cmlidXRlcyB3aXRoIG5hbWVzIGxpa2UgImZlYXR1cmU6KiIgd2hlcmUgKiAKICAgICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgZmVhdHVyZSBuYW1lIChlLmcuLCAiZmVhdHVyZTpleGNlcHQiLCAiZmVhdHVyZTpzZXQiLCAKICAgICAgICAgICBldGMuKS4gICBMYW5ndWFnZSBtb2R1bGVzIGNhbiB0aGVuIGxvb2sgZm9yIHRoZSBmZWF0dXJlcyB1c2luZyAKICAgICAgICAgICBhIHNpbXBsZSBhdHRyaWJ1dGUgbG9va3VwLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHJlcGxhY2VtZW50IGZvciBhIG51bWJlciBvZgogICAgICAgICAgIG9sZGVyIFNXSUcgZGlyZWN0aXZlcyBpbmNsdWRpbmcgJWV4Y2VwdCBhbmQgc3BlY2lhbGl6ZWQKICAgICAgICAgICBwcmFnbWFzLiBJdCBpcyBtb3JlIHBvd2VyZnVsIChkdWUgdG8gaXRzIHBhcmFtZXRlcml6ZWQKICAgICAgICAgICBuYW1lIG1hdGNoaW5nKSBhbmQgaXQgcHJvdmlkZXMgdmVyeSBwcmVjaXNlIGNvbnRyb2wgb3ZlcgogICAgICAgICAgIGhvdyBjdXN0b21pemF0aW9uIGZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0byBpbmRpdmlkdWFsCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgIFRoZXJlIGFyZSBmdXR1cmUgZXhwYW5zaW9uIHBsYW5zIHRoYXQgd2lsbAogICAgICAgICAgIGJ1aWxkIHVwb24gdGhpcyBjYXBhYmlsaXR5IGFzIHdlbGwuCgogICAgICAgICAgIEl0J3Mgbm90IGNlcnRhaW4gdGhhdCAlZmVhdHVyZSB3aWxsIGV2ZXIgYmUgdXNlZCBkaXJlY3RseQogICAgICAgICAgIGJ5IFNXSUcgdXNlcnMuICBJbnN0ZWFkLCBpdCBtYXkgYmUgYSBsb3ctbGV2ZWwgcHJpbWl0aXZlCiAgICAgICAgICAgdGhhdCBpcyB1c2VkIGluIGhpZ2gtbGV2ZWwgbWFjcm8gZGVmaW5pdGlvbnMuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgdG8gc3VwcG9ydCBwcm9wZXJ0aWVzLCB5b3UgbWlnaHQgZGVmaW5lIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAlZGVmaW5lICVwcm9wZXJ0eShuYW1lLCBzZXRmLCBnZXRmKQogICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSBzZXRmICNuYW1lOwogICAgICAgICAgICVmZWF0dXJlKCJnZXQiKSBnZXRmICNuYW1lOwogICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgV2hpY2ggYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICVwcm9wZXJ0eShwLCBnZXRfcCwgc2V0X3ApOwoKICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgaW50ICBnZXRfcCgpOwogICAgICAgICAgICAgIHZvaWQgc2V0X3AoaW50KTsKICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogIAoxMS8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgVGNsIG1vZHVsZSBoYXMgYmVlbiBleHBhbmRlZCB3aXRoIHNvbWUgbmV3IGZlYXR1cmVzIGZvcgogICAgICAgICAgIG1hbmFnaW5nIG9iamVjdCBvd25lcnNoaXAuICBGb3IgZXhhbXBsZToKICAgICAgICAgCiAgICAgICAgICAgICAgICBzZXQgYyBbQ2lyY2xlIC1hcmdzIDIwXQogICAgICAgICAgICAgICAgJGMgYXJlYSAgICAgICAgICAgICAjIEludm9rZSBhIG1ldGhvZAogICAgICAgICAgICAgICAgJGMgLWRpc293biAgICAgICAgICAjIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CiAgICAgICAgICAgICAgICAkYyAtYWNxdWlyZSAgICAgICAgICMgQWNxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKCiAgICAgICAgICAgSWYgVGNsIG93bnMgdGhlIG9iamVjdCwgaXRzIGRlc3RydWN0b3IgaXMgaW52b2tlZCB3aGVuIHRoZSAKICAgICAgICAgICBjb3JyZXNwb25kaW5nIG9iamVjdCBjb21tYW5kIGlzIGRlbGV0ZWQgaW4gVGNsLiAgCgogICAgICAgICAgIFRvIHNpbXBsaWZ5IHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLCB0aGUgZm9sbG93aW5nIHN5bnRheAogICAgICAgICAgIGNhbiBiZSB1c2VkOgoKICAgICAgICAgICAgICAgICRjIC1kZWxldGUgICAgICAgICAjIERlbGV0ZSBhbiBvYmplY3QKCiAgICAgICAgICAgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlIG1vcmUgb2JzY3VyZSB2YXJpYW50IG9mIAoKICAgICAgICAgICAgICAgIHJlbmFtZSAkYyB7fQoKICAgICAgICAgICBUaGVzZSBmZWF0dXJlcyBhbHNvIGFkZCBmdW5jdGlvbmFsaXR5IGF0IHRoZSBDIEFQSSBsZXZlbC4KICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYW5hZ2Ugb3duZXJzaGlwIGZyb20gQyBhbmQKICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcy4KCiAgICAgICAgICAgICAgICBTV0lHX0FjcXVpcmUodm9pZCAqcHRyKTsKICAgICAgICAgICAgICAgIFNXSUdfRGlzb3duKHZvaWQgKnB0cik7CgogICAgICAgICAgIEEgbmV3IGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgaW5zdGFuY2VzIGlzIGFsc28gYXZhaWxhYmxlOgoKICAgICAgICAgICAgICAgIFRjbF9PYmogKgogICAgICAgICAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaihUY2xfSW50ZXJwICppbnRlcnAsIHZvaWQgKnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5cGUsIGludCBvd24pOwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gYSB0eXBlbWFwLCB0aGlzIGNyZWF0ZXMgYSBwb2ludGVyIG9iamVjdCBhbmQKICAgICAgICAgICBhbiBpbnRlcnByZXRlciBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gaXNzdWUgbWV0aG9kcyBhbmQKICAgICAgICAgICBhY2Nlc3MgYXR0cmlidXRlcyBhcyBzaG93biBhYm92ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFsbCBQeXRob24tcmVsYXRlZCAlcHJhZ21hIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQuCiAgICAgICAgICAgTW9zdCBvZiB0aGVzZSB3ZXJlIHdyaXR0ZW4gZm9yIG9sZGVyIFNXSUcgdmVyc2lvbnMgaW4gb3JkZXIgdG8KICAgICAgICAgICBjb21wZW5zYXRlIGZvciBsaW1pdGF0aW9ucyBpbiBlYXJsaWVyIHJlbGVhc2VzLiAgSW4gYW4gZWZmb3J0CiAgICAgICAgICAgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgY29kZS1jbHV0dGVyIGFuZCBwb3RlbnRpYWwgZm9yIGVycm9ycywKICAgICAgICAgICBpdCBpcyBlYXNpZXIgdG8gc2ltcGx5IGVsaW1pbmF0ZSB0aGUgcHJhZ21hcyBhbmQgdG8gc3RhcnQgb3ZlcgogICAgICAgICAgIChpZiBuZWVkZWQpLiAgVG8gYmUgaG9uZXN0LCBJJ20gbm90IGV2ZW4gc3VyZSB0aGUgcHJhZ21hcwogICAgICAgICAgIHdvcmtlZCBpbiAxLjMuOSBhbmQgcmVjZW50IHJlbGVhc2VzLgoKICAgICAgICAgICBOb3RlOiBJZiB5b3UgbmVlZCB0byBpbnNlcnQgY29kZSBpbnRvIHRoZSBzaGFkb3cgY2xhc3MgZmlsZQogICAgICAgICAgIGNyZWF0ZWQgYnkgU1dJRywgc2ltcGx5IHVzZSB0aGUgJXNoYWRvdyBkaXJlY3RpdmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlc2hhZG93ICV7CiAgICAgICAgICAgICAgZGVmIHNvbWVfcHl0aG9uX2NvZGUoKTogICAgICAgICAKICAgICAgICAgICAgICAgICAgcHJpbnQgImJsYWghIgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3dlZXBpbmcgY2hhbmdlcyB0byB0aGUgd2F5IGluIHdoaWNoIHRoZSBQeXRob24gbW9kdWxlIGhhbmRsZXMKICAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4gICBJbiBlYXJseSBpbXBsZW1lbnRhdGlvbnMsIHNoYWRvdyBjbGFzc2VzIHdlcmUKICAgICAgICAgICBtZXJlbHkgUHl0aG9uIHdyYXBwZXJzIGFyb3VuZCB0eXBlZCBwb2ludGVyIG9iamVjdHMuIEhvd2V2ZXIsIAogICAgICAgICAgIHNvbWUgdXNlcnMgYWN0dWFsbHkgd2FudGVkIHRvIHJlY2VpdmUgdGhlIHNoYWRvdyBjbGFzcyBvYmplY3QgaW4gQy4KICAgICAgICAgICBUbyBhY2NvbW9kYXRlIHRoaXMsIHRoZSBkZXJlZmVyZW5jaW5nIG9mIHRoZSAidGhpcyIgcG9pbnRlciBpbgogICAgICAgICAgIGEgc2hhZG93IGNsYXNzIHdhcyBtb3ZlZCB0byBDIGFzIGRlc2NyaWJlZCBpbiBDSEFOR0VTIFs4LzgvOTldLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBwcm9jZXNzIG9mIHJldHVybmluZyBwb2ludGVycyB0byBQeXRob24gd2FzIHN0aWxsCiAgICAgICAgICAgc29tZXdoYXQgcHJvYmxlbWF0aWMuICBTcGVjaWZpY2FsbHksIHNoYWRvdyBjbGFzc2VzIG5ldmVyIHdvcmtlZAogICAgICAgICAgIGluIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGVzZToKCiAgICAgICAgICAgICAtICAgVXNlIG9mIGFueSBraW5kIG9mIG91dHB1dCB0eXBlbWFwICgnb3V0JyBvciAnYXJnb3V0JykKICAgICAgICAgICAgIC0gICBHbG9iYWwgdmFyaWFibGVzIChicm9rZW4gYXMgZmFyIGFzIEkgY2FuIHRlbGwpLgoKICAgICAgICAgICBJbiB0aGUgcGFzdCwgc29tZSB1c2VycyBoYXZlIGRlYWx0IHdpdGggdGhpcyBieSBtYW51YWxseSB0cnlpbmcKICAgICAgICAgICB0byBjcmVhdGUgc2hhZG93IGNsYXNzIG9iamVjdHMgdGhlbXNlbHZlcyBmcm9tIEMvQysrLiAgSG93ZXZlciwKICAgICAgICAgICB0aGlzIHdhcyBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgQyB3cmFwcGVycyBkb24ndCByZWFsbHkga25vdyBob3cKICAgICAgICAgICB0byBnZXQgYWNjZXNzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBjbGFzcy4KCiAgICAgICAgICAgVGhlIFB5dGhvbiBtb2R1bGUgaGFzIG5vdyBiZWVuIG1vZGlmaWVkIHRvIGF1dG9tYXRpY2FsbHkgYXR0YWNoCiAgICAgICAgICAgc2hhZG93IGNsYXNzIG9iamVjdHMgdG8gcG9pbnRlcnMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCB0byAKICAgICAgICAgICBQeXRob24uICAgVGhpcyBwcm9jZXNzIG9jY3VycyBpbiB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqKCkKICAgICAgICAgICBzbyB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIHVzZXJzLiAgICBBcyBhIHJlc3VsdCwKICAgICAgICAgICBzaGFkb3cgY2xhc3NlcyBhcmUgbm93IG1vcmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIHdpdGggdHlwZW1hcHMKICAgICAgICAgICBhbmQgb3RoZXIgZmVhdHVyZXMgb2YgU1dJRy4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGludHJvZHVjZSBhIG51bWJlciBvZiBpbmNvbXBhdGliaWxpdGllcy4gIFRoZQogICAgICAgICAgIFNXSUdfTmV3UG9pbnRlck9iaigpIG5vdyB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgIm93biIgdG8gCiAgICAgICAgICAgaW5kaWNhdGUgb2JqZWN0IG93bmVyc2hpcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIHBvaW50ZXIKICAgICAgICAgICB0byBQeXRob24gdGhhdCBQeXRob24gc2hvdWxkIGRlc3Ryb3kuICAgSW4gYWRkaXRpb24sIG9sZGVyIGNvZGUKICAgICAgICAgICB0aGF0IHRyaWVzIHRvIG1hbnVhbGx5IGNvbnN0cnVjdCBzaGFkb3cgY2xhc3Mgb2JqZWN0cyBvciB3aGljaAogICAgICAgICAgIGV4cGVjdHMgYmFyZSBwb2ludGVycyBtYXkgYnJlYWstLS1zdWNoIHBvaW50ZXJzIG1heSBhbHJlYWR5IGJlCiAgICAgICAgICAgZW5jYXBzdWxhdGVkIGJ5IGEgc2hhZG93IGNsYXNzLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVpbnNlcnQgZGlyZWN0aXZlIHRvIGFjY2VwdCBzaW5nbGUgYnJhY2VzIHsgLi4uIH0uCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluc2VydCgiaGVhZGVyIikgewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJXsgLi4uICV9IGV4Y2VwdCB0aGF0IHRoZSBjb2RlIGluIHRoZQogICAgICAgICAgIGJyYWNlcyBpcyBwcm9jZXNzZWQgdXNpbmcgdGhlIHByZXByb2Nlc3Nvci4gICBUaGlzIGNhbiBiZSB1c2VmdWwKICAgICAgICAgICBpbiBjZXJ0YWluIGNvbnRleHRzIHN1Y2ggYXMgbG93LWxldmVsIGNvZGUgZ2VuZXJhdGlvbiBpbiAKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIG5vdyB0cmFuc2xhdGVkIGludG8gcHJlcHJvY2Vzc29yCiAgICAgICAgICAgc3ltYm9scy4gIEZvciBleGFtcGxlOgoJCiAgICAgICAgICAgICAgLi9zd2lnIC1weXRob24gLXNoYWRvdyAtbW9kdWxlIGJsYWggaW50ZXJmYWNlLmkKCiAgICAgICAgICAgQ3JlYXRlcyB0aGUgc3ltYm9sczoKCiAgICAgICAgICAgICAgU1dJR09QVF9QWVRIT04gMQogICAgICAgICAgICAgIFNXSUdPUFRfU0hBRE9XIDEKICAgICAgICAgICAgICBTV0lHT1BUX01PRFVMRSBibGFoCiAgICAgICAgICAgICAgCiAgICAgICAgICAgTW9kdWxlcyBjYW4gbG9vayBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbHRlciB0aGVpciBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBpZiBuZWVkZWQuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIFBlcmw1IG1vZHVsZS4gIEEgbG90IG9mIGNvZGUgZ2VuZXJhdGlvbiBpcwogICAgICAgICAgIG5vdyBkcml2ZW4gYnkgdGFibGVzIGFuZCB0eXBlbWFwcy4gICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSAKICAgICAgICAgICBhbHNvIG1ha2VzIHVzZSBvZiB0YWJsZXMgdG8gaW5zdGFsbCBjb25zdGFudHMsIHZhcmlhYmxlcywgYW5kCiAgICAgICAgICAgZnVuY3Rpb25zIGluc3RlYWQgb2YgaW5saW5pbmcgYSBidW5jaCBvZiBwcm9jZWR1cmUgY2FsbHMuICBUaGUKICAgICAgICAgICBzZXBhcmF0ZSB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBnb25lLiAgIE1vc3QKICAgICAgICAgICBjb2RlIGdlbmVyYXRpb24gaXMgY29udHJvbGxlZCB2aWEgdGhlIHBlcmw1LnN3ZyBmaWxlIGluIHRoZQogICAgICAgICAgIGxpYnJhcnkuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgCjExLzEzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlIEMrKyB0eXBlbmFtZSBrZXl3b3JkLiAgUHJpbWFyaWx5IHRoaXMKICAgICAgICAgICBpcyBhZGRlZCB0byBiZXR0ZXIgc3VwcG9ydCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkICBibGFoKEMmIHYpIHsKICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjppdGVyYXRvciBpID0gdi5iZWdpbigpOwogICAgICAgICAgICAgfQoKICAgICAgICAgICBOb3RlOiB0eXBlbmFtZSBpcyBzdXBwb3J0ZWQgaW4gdGhlIHBhcnNlciBpbiB0aGUgc2FtZSB3YXkgYXMgJ3N0cnVjdCcKICAgICAgICAgICBvciAnY2xhc3MnLiAgWW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2UgaXQgYW55d2hlcmUgZXhjZXB0IGluIHRlbXBsYXRlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGUgQVBJLiAgIE1vc3QgZnVuY3Rpb25zIG5vdwogICAgICAgICAgIHVzZSBhIGNvbW1vbiwgdmVyeSBzaW1wbGUsICBBUEkuICAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YKICAgICAgICAgICBpbnRlcmVzdGluZyBzZW1hbnRpYyBzaWRlLWVmZmVjdHMgb2YgaG93IGNvZGUgaXMgYWN0dWFsbHkgZ2VuZXJhdGVkLgogICAgICAgICAgIERldGFpbHMgd2lsbCBiZSBmb3J0aGNvbWluZyBpbiBEb2MvTWFudWFsL0V4dGVuZGluZy5odG1sLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogTGFuZ3VhZ2UgbW9kdWxlcyB3cml0dGVuIGZvcgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgd2lsbCBubyBsb25nZXIgd29yaywKCjExLzEwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgdmVyeSBzdWJ0bGUgYnVnIGR1ZSB0byB1bm5hbWVkIGNsYXNzIHdyYXBwaW5nLiBGb3IgZXhhbXBsZSwgaWYKICAgICAgICAgICB5b3UgZGlkIHRoaXMKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgeCx5OwogICAgICAgICAgICAgIH0gZ2RQb2ludCwgKmdkUG9pbnRQdHI7CgogICAgICAgICAgICAgIHZvaWQgZm9vKGdkUG9pbnRQdHIgeCk7CgogICAgICAgICAgIFRoZW4gdGhlIGZvbyBmdW5jdGlvbiB3b3VsZCBnZXQgYSB0eXBlLWVycm9yLiAgIFRoZSBwcm9ibGVtIGhhcwogICAgICAgICAgIHRvIGRvIHdpdGggaW50ZXJuYWwgdHlwZWRlZiBoYW5kbGluZyBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgdHlwZWRlZgogICAgICAgICAgIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgc3RydWN0IGFwcGVhciBsYXRlciBpbiB0aGUgcGFyc2UgdHJlZS4KICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFZpbiBKb3Zhbm92aWMuCgoxMS8wOS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvICJvdXQiIHR5cGVtYXBzIChhbmQgcmVsYXRlZCB2YXJpYXRpb25zKS4gIFRoZSBuYW1lCiAgICAgICAgICAgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgdHlwZW1hcCBpcyBub3cgdGhlIHJhdyBDIGlkZW50aWZpZXIgdGhhdAogICAgICAgICAgIGFwcGVhcnMgb24gYSBkZWNsYXJhdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YKICAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vKCk7ICAgIC8vIHR5cGVtYXAgZ2V0cyBhcHBsaWVkCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgbmV2ZXIgcmVhbGx5IHNwZWNpZmllZCBob3cgdGhpcyB3YXMgc3VwcG9zZWQgdG8KICAgICAgICAgICB3b3JrLiAgSW4gU1dJRzEuMSwgeW91IGNvdWxkIHByb2JhYmx5IHdyaXRlIGEgdHlwZW1hcCBmb3IgdGhlCiAgICAgICAgICAgd3JhcHBlciBuYW1lIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBCbGFoX2ZvbyB7IC4uLiB9CgogICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgb2xkIGJlaGF2aW9yIGlzIG5vdyB3aXRoZHJhd24gYW5kIG5vdCBzdXBwb3J0ZWQuIAogICAgICAgICAgIEp1c3QgdXNlIHRoZSBtZW1iZXIgbmFtZSB3aXRob3V0IGFueSBzb3J0IG9mIHNwZWNpYWwgcHJlZml4LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBUY2wgbW9kdWxlIGluaXRpYWxpemF0aW9uOgoKICAgICAgICAgICAoMSkgU1dJRyBub3cgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29kZSBuZWVkZWQgdG8gd29yayB3aXRoCiAgICAgICAgICAgICAgICBUY2wgc3R1YnMuICBTaW1wbHkgY29tcGlsZSB3aXRoIC1EVVNFX1RDTF9TVFVCUy4KCiAgICAgICAgICAgKDIpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgY2FsbHMgVGNsX1BrZ1Byb3ZpZGUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgICAgYSBwYWNrYWdlIG5hbWUuICBUaGUgcGFja2FnZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lCiAgICAgICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gIFRoZSB2ZXJzaW9uIG51bWJlciBpcwogICAgICAgICAgICAgICBzZXQgdG8gIjAuMCIgYnkgZGVmYXVsdC4gIFRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIsIHVzZQogICAgICAgICAgICAgICBzd2lnIC1wa2d2ZXJzaW9uIDEuMiBpbnRlcmZhY2UuaS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgTW9kdWxlcyB0aGF0IHByb3ZpZGVkIHN0dWJzIGFuZCBUY2xfUGtnUHJvdmlkZSBvbiB0aGVpciBvd24gbWlnaHQKICAgICAgICAgICBicmVhay4gIFNpbXBseSByZW1vdmUgdGhhdCBjb2RlLgoKMTEvMDUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCBjb2RlIGdlbmVyYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBUY2wgbW9kdWxlLiAgQ29uc3RhbnRzCiAgICAgICAgICAgYXJlIG5vdyBzdG9yZWQgaW4gYSBsYXJnZSB0YWJsZSB0aGF0IGdldCBpbnN0YWxsZWQgYXQgbW9kdWxlIHN0YXJ0dXAuCiAgICAgICAgICAgVGhlcmUgYXJlIGFsc28gbm8gbG9uZ2VyIGFueSBzdGF0aWMgdmFyaWFibGVzIHNvIGl0IHNob3VsZCBnZW5lcmF0ZQogICAgICAgICAgIHNvbWV3aGF0IGxlc3MgY29kZS4KCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAiY29uc3QiIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byAiY29uc3RhbnQiIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzLiAgImNvbnN0IiBpcyBhIEMga2V5d29yZCB3aGljaCBtYWRlIHRoZSBoYW5kbGluZyBvZiB0aGUgdHlwZW1hcAogICAgICAgICAgIGRpcmVjdGl2ZSBzb21ld2hhdCBhd2t3YXJkIGluIHRoZSBwYXJzZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICAldHlwZW1hcCBkaXJlY3RpdmUgY2FuIG5vdyBhY2NlcHQgbmVhcmx5IGFyYml0cmFyeSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluLHBhcnNlPSJpIixkb2M9ImludGVnZXIiKSBpbnQgIi4uLiI7CgogICAgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBrZXl3b3JkIHBhcmFtZXRlcnMgaXMgdG8gc3VwcGx5IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGhpbnRzIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbW9kdWxlLiAgIFRoZSBpbnRlcHJldGF0aW9uIG9mIHRoZQogICAgICAgICAgIHBhcmFtZXRlcnMgaXMgbGFuZ3VhZ2Ugc3BlY2lmaWMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IHNlbWFudGljIGNoYW5nZSB0byBpbnRlcm5hbCBjYWxsL3JldHVybiBieSB2YWx1ZSBoYW5kbGluZy4KICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBjYWxsLWJ5LXZhbHVlIHdhcyB0cmFuc2xhdGVkCiAgICAgICAgICAgaW50byBwb2ludGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciBhLCBWZWN0b3IgYik7CgogICAgICAgICAgIHR1cm5lZCBpbnRvIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoKmEsKmIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgdHJhbnNsYXRpb24gd2FzIG5vcm1hbGx5IHBlcmZvcm1lZCBieSB0aGUgU1dJRyBjb3JlLCBvdXRzaWRlCiAgICAgICAgICAgb2YgdGhlIGNvbnRyb2wgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEhvd2V2ZXIsIGEgc2lkZSBlZmZlY3QKICAgICAgICAgICBvZiB0aGlzIHdhcyBhIGxvdCBvZiBiaXphcnJlIHR5cGVtYXAgYmVoYXZpb3IuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgaWYgeW91IGRpZCBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFlvdSB3b3VsZCBmaW5kIHRoYXQgaW50MzIgd2FzIHRyYW5zZm9ybWVkIGludG8gYSBwb2ludGVyIGV2ZXJ5d2hlcmUhCiAgICAgICAgICAgKG5lZWRsZXNzIHRvIHNheSwgc3VjaCBiZWhhdmlvciBpcyB1bmV4cGVjdGVkIGFuZCBxdWl0ZSBhd2t3YXJkIHRvCiAgICAgICAgICAgZGVhbCB3aXRoKS4gIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgaWYgYSB0eXBlZGVmIHdhcyBhbHNvIHVzZWQsCiAgICAgICAgICAgdGhlIHBvaW50ZXIgYmVoYXZpb3Igc3VkZGVubHkgZGlzYXBwZWFyZWQuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgcG9pbnRlciB0cmFuc2Zvcm1hdGlvbiBpcyBub3cgcHVzaGVkIHRvIHRoZQogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuICAgVGhpcyBwcm9kdWNlcyB3cmFwcGVycyB0aGF0IGxvb2sgcm91Z2hseQogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcxID0gKmE7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcyID0gKmI7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgZWFzeSB0byBkZWZpbmUgdHlwZW1hcHMgZm9yCiAgICAgICAgICAgYXJiaXRyYXJ5IHVuZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRvIHRoaXMgKGFuZCBpdAogICAgICAgICAgIHdpbGwgd29yayByZWdhcmRsZXNzIHdoYXQgaW50MzIgaXMpOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgJDEgPSAoaW50MzIpIFB5SW50X0FzTG9uZygkaW5wdXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU1DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjYWxsL3JldHVybiBieSB2YWx1ZSBjb2RlIGdlbmVyYXRpb24gaW4KICAgICAgICAgICBzb21lIGxhbmd1YWdlIG1vZHVsZXMuCgoxMS8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHR5cGVtYXBzIHRvIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICB7IAogICAgICAgICAgICAgICAgICAgLi4uIGFuIG9iamVjdCAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICogewogICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICYgewogICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgZW51bSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgIC4uLiBhbiBlbnVtIHZhbHVlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKENMQVNTOjoqKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gcG9pbnRlciB0byBtZW1iZXIgLi4uCiAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgIFRoZXNlIHR5cGVzIGFyZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgdHlwZXMgdGhhdCBkb24ndCBtYXRjaAogICAgICAgICAgIGFueXRoaW5nIGVsc2UuICBTZWUgQ0hBTkdFUyBsb2cgZW50cnkgZm9yIDgvMjcvMjAwMCBmb3IgdGhlCiAgICAgICAgICAgb2xkIGJlaGF2aW9yLiAgVGhlIHJvbGUgb2YgdGhlc2UgdHlwZXMgaXMgYWxzbyBkZXNjcmliZWQgaW4gCiAgICAgICAgICAgRG9jL01hbnVhbC9UeXBlbWFwcy5odG1sCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgCjEwLzI1LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIEd1aWxlIGFuZCBNenNjaGVtZSBtb2R1bGVzIHRvIHN1cHBvcnQKICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBGaXggdG8gaGFuZGxlIHBvaW50ZXJzIHRvIGFycmF5cy4KCjEwLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIERlZmluaW5nIGEgdHlwZW1hcCBydWxlIGZvciBlbnVtIFNXSUdFTlVNIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgIHRvIGRlZmluZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBlbnVtIHZhcmlhYmxlcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJ1YnkgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgUnVieSBtb2R1bGUgY2FuIG5vdyBoYW5kbGUgZnVuY3Rpb25zIHdpdGggYW4gYXJiaXRyYXJ5CiAgICAgICAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFByZXZpb3VzIHZlcnNpb25zIHdlcmUgbGltaXRlZCB0byAKICAgICAgICAgICB0byBmdW5jdGlvbnMgd2l0aCBvbmx5IDkgb3IgMTYgYXJndW1lbnRzIGRlcGVuZGluZyBvbgogICAgICAgICAgIHRoZSB1c2Ugb2YgZGVmYXVsdCBhcmd1bWVudHMuICAgTm90ZTogZnJvbSBzb21lIGluc3BlY3Rpb24KICAgICAgICAgICBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBzb3VyY2UsIHRoZSBuZXcgYXBwcm9hY2ggbWlnaHQgYmUKICAgICAgICAgICBhIGxpdHRsZSBmYXN0ZXIgYXMgd2VsbC4KCjEwLzE4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgdGVtcGxhdGVzLgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gPFMsVD47CgogICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBJcmluYSBLb3Rsb3ZhLgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMgYWRkZWQuICBUaGUgdHlwZW1hcHMKICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBzeW50YXggYmVsb3cuICAgV2l0aGluIGVhY2gKICAgICAgICAgICB0eXBlbWFwLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgJGFyZzsgIC8vIFRoZSBpbnB1dCBvYmplY3QgaW4gdGhlIHRhcmdldCBsYW5ndWFnZQogICAgICAgICAgICAgICAgICAkMTsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3IgZmlyc3QgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDI7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIHNlY29uZCBhcmd1bWVudAoKICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgdmFyaWFibGVzIHJlZmVyIHRvIGVpdGhlciBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMV90eXBlLCAkMV9sdHlwZSwgJDFfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ2MpCiAgICAgICAgICAgICAgICAgICQyX3R5cGUsICQyX2x0eXBlLCAkMl9iYXNldHlwZSwgZXRjLi4uICAoYXJndltdKQoKICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgZGltZW5zaW9uIG9mIGFyZ3YKICAgICAgICAgICAgICAgICAgJDJfZGltMAogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgQmFzaWNhbGx5IGFueSB2YXJpYWJsZSB0aGF0IHdhcyBhdmFpbGFibGUgaW4gbm9ybWFsIHR5cGVtYXBzCiAgICAgICAgICAgaXMgYXZhaWxhYmxlIGZvciBlaXRoZXIgYXJndW1lbnQgYnkgcHJlZmFjaW5nIHRoZSB2YXJpYWJsZQogICAgICAgICAgIG5hbWUgYnkgJyRuXycgd2hlcmUgbiBpcyB0aGUgYXJndW1lbnQgcG9zaXRpb24uCgogICAgICAgICAgIE5vdGVzOiAgCiAgICAgICAgICAgKDEpIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgc2luZ2xlCiAgICAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgICAgeW91IGNhbiBzcGxpdCBhIHN0cmluZyBpbnRvIGEgKGNoYXIgKiwgaW50KSBwYWlyIG9yCiAgICAgICAgICAgICAgIHNwbGl0IGEgbGlzdCBpbnRvIGEgKGludCwgY2hhciBbXSkgcGFpci4gIEl0IGlzIG5vdAogICAgICAgICAgICAgICBwb3NzaWJsZSB0byBtYXAgbXVsdGlwbGUgb2JqZWN0cyB0byBtdWx0aXBsZSBhcmd1bWVudHMuCgogICAgICAgICAgICgyKSBUbyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgU1dJRyB2ZXJzaW9ucywgdGhlCiAgICAgICAgICAgICAgIHZhcmlhYmxlcyBzdWNoIGFzICR0YXJnZXQgYW5kICR0eXBlIGFyZSBwcmVzZXJ2ZWQgYW5kCiAgICAgICAgICAgICAgIGFyZSBtYXBwZWQgb250byB0aGUgZmlyc3QgYXJndW1lbnQgb25seS4KCiAgICAgICAgICAgKDMpIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUuCiAgICAgICAgICAgICAgIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBhcmUgYW4gZXh0ZW5zaW9uIHRvIHR5cGVtYXAgaGFuZGxpbmcuCiAgICAgICAgICAgICAgIFNpbmdsZSB2YWx1ZWQgdHlwZW1hcHMgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgdXN1YWwKICAgICAgICAgICAgICAgd2F5LgoKICAgICAgICAgICBUaGUgb2xkICRzb3VyY2UgYW5kICR0YXJnZXQgdmFyaWFibGVzIGFyZSBvZmZpY2lhbGx5CiAgICAgICAgICAgZGVwcmVjYXRlZC4gIElucHV0IHZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCB0aHJvdWdoCiAgICAgICAgICAgJGFyZyQgYW5kIG91dHB1dCB2YWx1ZXMgYXJlIHJlZmVyZW5jZSB0aHJvdWdoICRyZXN1bHQkLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzLiAgVGhlIHN5bnRheAogICAgICAgICAgIGlzIGEgbGl0dGxlIGZ1bmt5LCBidXQgaGVyZSBnb2VzOgoKICAgICAgICAgICAgICAvLyBEZWZpbmUgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIE11bHRpdmFsdWVkIHR5cGVtYXAgd2l0aCBsb2NhbHMKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgLy8gQ29weSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpID0gKGludCBhcmdjLCBjaGFyICphcmd2W10pOwoKICAgICAgICAgICAgICAvLyBBcHBseSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAlYXBwbHkgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpIH07CgogICAgICAgICAgIE5vdGU6IHRoaXMgZXh0cmEgcGFyc2luZyBzdXBwb3J0IGlzIGFkZGVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uLgogICAgICAgICAgIE5vIGxhbmd1YWdlIG1vZHVsZXMgY3VycmVudGx5IHN1cHBvcnQgbXVsdGktdmFsdWVkIHR5cGVtYXBzLgoKMTAvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWF0Y2hpbmcgY29kZSB0byBkaXNjYXJkIHF1YWxpZmllcnMgd2hlbgogICAgICAgICAgIGNoZWNraW5nIGZvciBhIG1hdGNoLiAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgY2hhciAqeCk7CgogICAgICAgICAgIFRoZSB0eXBlbWFwIGNoZWNrZXIgY2hlY2tzIGZvciBhIG1hdGNoIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CgogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIElmIHR5cGVkZWYncyBhcmUgaW52b2x2ZWQsIHF1YWxpZmllciBzdHJpcHBpbmcgb2NjdXJzIGJlZm9yZQogICAgICAgICAgIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFNvIGlmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgKnN0cmluZzsKICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBzdHJpbmcgeCk7CgogICAgICAgICAgIHR5cGVtYXAgY2hlY2tpbmcgd291bGQgYmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgeAogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nCiAgICAgICAgICAgICAgICBzdHJpbmcgeAogICAgICAgICAgICAgICAgc3RyaW5nCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXaXRob3V0IHF1YWxpZmllciBzdHJpcHBpbmcsIG9uZSBoYXMgdG8gd3JpdGUKICAgICAgICAgICBzZXBlcmF0ZSB0eXBlbWFwcyBmb3IgYWxsIHZhcmlhdGlvbnMgb2YgY29uc3QgYW5kIHZvbGF0aWxlICh3aGljaAogICAgICAgICAgIGlzIGEgcGFpbikuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVHlwZW1hcHMgbWlnaHQgYmUgYXBwbGllZCBpbgogICAgICAgICAgIHBsYWNlcyB3aGVyZSB0aGV5IHdlcmVuJ3QgYmVmb3JlLgoKCjEwLzkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IGRpc2FtYmlndWF0ZQogICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IG9ubHkgdmFyeSBpbiBjb25zdG5lc3MuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIGhhbmRsZSB0aGlzLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgbm9ybWFsbHkuCiAgICAgICAgICAgCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaF9jb25zdCkgYmxhaCgpIGNvbnN0OwoKICAgICAgICAgICBJbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSwgbWV0aG9kIGNhbGxzIGxpa2UgdGhpcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgKG9iaiktPmJsYWgoKSAgICAgICAgICAgICAgIC8vIE5vbi1jb25zdCB2ZXJzaW9uCiAgICAgICAgICAgICAgICgoRm9vIGNvbnN0ICopb2JqKS0+YmxhaCgpICAvLyBjb25zdCB2ZXJzaW9uCgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZvcmNlIHRoZSByaWdodCBtZXRob2QgdG8gYmUgaW52b2tlZC4KICAgICAgICAgICBBZG1pdHRlZGx5LCB0aGlzIGlzIHByb2JhYmx5IG9ic2N1cmUsIGJ1dCB3ZSBtaWdodAogICAgICAgICAgIGFzIHdlbGwgZ2V0IGl0IHJpZ2h0LgoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciBub3cgaWdub3JlcyAnXHInIGluIHRoZSBpbnB1dC4KICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggdGhlIGZvbGxvd2luZyBidWc6CiAgICAgICAgICAgWyAjNDY4NDE2IF0gU1dJRyB0aGlua3MgbWFjcm8gZGVmcyBhcmUgZGVjbGFyYXRpb25zPwoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgfHwsICYmLCBhbmQgISBpbiBjb25zdGFudHMuICBUaGlzCiAgICAgICAgICAgZml4ZXMgU0YgWyAjNDY4OTg4IF0gTG9naWNhbCBvcHMgYnJlYWsgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIEhvd2V2ZXIsIGF0IHRoaXMgdGltZSwgY29uc3RhbnRzIHVzaW5nIHRoZXNlIG9wZXJhdG9ycwogICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkICh0aGUgcGFyc2VyIHdpbGwgaXNzdWUgYSB3YXJuaW5nKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIC1zaG93X3RlbXBsYXRlcyBjb21tYW5kIGxpbmUgb3B0aW9uLiAgVGhpcyBtYWtlcwogICAgICAgICAgIFNXSUcgZGlzcGxheSB0aGUgY29kZSBpdCBhY3R1YWxseSBwYXJzZXMgdG8gZ2VuZXJhdGUKICAgICAgICAgICB0ZW1wbGF0ZSB3cmFwcGVycy4gIE1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gc2VtYW50aWNzIG9mICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBXaGVuCiAgICAgICAgICAgdXNpbmcgJXRlbXBsYXRlLCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBoYW5kbGVkCiAgICAgICAgICAgYXMgdHlwZXMgYnkgZGVmYXVsdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGRvdWJsZT47CgogICAgICAgICAgIFRvIHNwZWNpZnkgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzICpub3QqIGEgdHlwZSwgeW91CiAgICAgICAgICAgbmVlZCB0byB1c2UgZGVmYXVsdC12YWx1ZSBzeW50YXguIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQsaW50PTUwPjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3RvcjxpbnQsc2l6ZT0xMDA+OwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0dGVyLS1vbmx5CiAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgKGUuZy4sIDUwLCAxMDApIGlzIHVzZWQgZHVyaW5nCiAgICAgICAgICAgZXhwYW5zaW9uLiAgVGhpcyBkaWZmZXJzIGZyb20gbm9ybWFsIEMrKywgYnV0IEkgY291bGRuJ3QKICAgICAgICAgICBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byBkbyBpdCBpbiB0aGUgcGFyc2VyLiAgTWlnaHQKICAgICAgICAgICBpbXBsZW1lbnQgYW4gYWx0ZXJuYXRpdmUgbGF0ZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFqb3IgY2hhbmdlcyB0byB0ZW1wbGF0ZSBoYW5kbGluZyBpbiBvcmRlciB0byBwcm92aWRlCiAgICAgICAgICAgYmV0dGVyIGludGVncmF0aW9uIHdpdGggdGhlIEMrKyB0eXBlLXN5c3RlbS4gVGhlIG1haW4KICAgICAgICAgICBwcm9ibGVtIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgIFN1cHBvc2UgeW91IGhhdmUgYSB0ZW1wbGF0ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgYmxhaChjb25zdCBUIHgpIHsgc3R1ZmYgfTsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE5vdyBzdXBwb3NlLCB0aGF0IHlvdSBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb24gYQogICAgICAgICAgIHR5cGUgbGlrZSB0aGlzIGluIFNXSUc6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPGludCAqPjsKCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzICpzdXBwb3NlZCogdG8gZ2VuZXJhdGUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgSG93ZXZlciwgaW4gU1dJRy0xLjMuOSwgdGhlIHRlbXBsYXRlIHN1YnN0aXR1dGlvbiBnZXRzIGl0IHdyb25nCiAgICAgICAgICAgYW5kIHByb2R1Y2VzCgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBpbnQgKngpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgKG5vdGljZSB0aGUgYmFkIHBsYWNlbWVudCBvZiB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIpLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIFNXSUcgcGFyc2VyIG5vdyBnZW5lcmF0ZXMgaW1wbGljaXQgdHlwZWRlZnMKICAgICAgICAgICBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMgdGhhdCBwcm9kdWNlcyBjb2RlIHJvdWdobHkKICAgICAgICAgICBlcXVpdmFsZW50IHRvIGRvaW5nIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpfX3N3aWd0bXBsMTsKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxfX3N3aWd0bXBsMT47CgogICAgICAgICAgIHdoaWNoIGdlbmVyYXRlcyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgU2luY2UgdGhpcyBpcyBjb3JyZWN0IGluIGJvdGggQysrIGFuZCBTV0lHLCBpdCBwcm92aWRlcyB0aGUgcmlnaHQKICAgICAgICAgICBzZW1hbnRpY3MgYW5kIGFsbG93cyBldmVyeXRoaW5nIHRvIGNvbXBpbGUgcHJvcGVybHkuICBIb3dldmVyLAogICAgICAgICAgIHRvIGNsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgY29kZSBhIGxpdHRsZSBiaXQsIHRoZSBwYXJzZXIga2VlcHMKICAgICAgICAgICB0cmFjayBvZiB0aGUgdGVtcGxhdGUgdHlwZXMgYW5kIHBlcmZvcm1zIGJhY2stc3Vic3RpdHV0aW9uIHRvCiAgICAgICAgICAgdGhlIG9yaWdpbmFsIHR5cGUgd2hlbiBidWlsZGluZyB0aGUgcGFyc2UgdHJlZS4gIFRodXMsIGV2ZW4KICAgICAgICAgICB0aG91Z2ggdGhlIGltcGxpY2l0IHR5cGVkZWYgaXMgdXNlZCBpbiB0aGUgaW5wdXQgYW5kIG1heSBhcHBlYXIKICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZSAoZm9yIHByb3BlciBjb21waWxhdGlvbiksIHRoZSBwYXJzZQogICAgICAgICAgIHRyZWUgd2lsbCBoaWRlIGEgbG90IG9mIHRoZXNlIGRldGFpbHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIHdpbGwgbG9vayBsaWtlIGl0IHdhcyBkZWNsYXJlZCBhcyBmb2xsb3dzICh3aGljaCBpcyB3aGF0CiAgICAgICAgICAgeW91IHdhbnQpOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH0KCiAgICAgICAgICAgVGhlIG9ubHkgcGxhY2UgeW91IGFyZSBsaWtlbHkgdG8gbm90aWNlIHRoZSB0eXBlZGVmIGhhY2sKICAgICAgICAgICBpcyBpbiBib2RpZXMgb2YgdGVtcGxhdGUgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIGRpZCB0aGlzLAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBibGFoIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgewogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBUICB0ZW1wdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgeW91IHdpbGwgZmluZCB0aGF0ICdUIHRlbXB2YWx1ZScgZ290IGV4cGFuZGVkIGludG8gc29tZQogICAgICAgICAgIHN0cmFuZ2UgdHlwZWRlZiB0eXBlLiAgVGhpcyAqc3RpbGwqIGNvbXBpbGVzIGNvcnJlY3RseSAKICAgICAgICAgICBzbyBpdCdzIG5vdCBhIGJpZyBkZWFsIChvdGhlciB0aGFuIGxvb2tpbmcga2luZCBvZiB1Z2x5CiAgICAgICAgICAgaW4gdGhlIHdyYXBwZXIgZmlsZSkuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBzb21lIGluaGVyaXRhbmNlIHByb2JsZW1zIGluIFRjbCBPYmplY3QgaW50ZXJmYWNlLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGNsIG1vZHVsZSBoYXMgY2hhbmdlZCB0byB1c2UgYnl0ZS1iYWNrZWQgcG9pbnRlciBzdHJpbmdzLiAgVGhpcwogICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBIb3dldmVyLAogICAgICAgICAgIHRoZSBvcmRlciBpbiB3aGljaCBkaWdpdHMgYXBwZWFyIGluIHBvaW50ZXIgdmFsdWVzIG5vIGxvbmdlcgogICAgICAgICAgIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBhY3R1YWwgbnVtZXJpY2FsIHZhbHVlIG9mIGEKICAgICAgICAgICBwb2ludGVyIChvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCBwYWlycyBvZiBkaWdpdHMgYXBwZWFyCiAgICAgICAgICAgaW4gcmV2ZXJzZSBvcmRlcikuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQZXJsNSBtb2R1bGUgaXMgbm93IGRyaXZlbiBieSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAncGVybDUuc3dnJwogICAgICAgICAgIGluIHRoZSBTV0lHIGxpYnJhcnkuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcGVybDUgbW9kdWxlIG5vIGxvbmdlciB0cmllcyB0byBhcHBseSB0aGUgIm91dCIgdHlwZW1hcAogICAgICAgICAgIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBtYWdpYyB2YXJpYWJsZXMuICBJJ20gc3VycHJpc2VkIHRoYXQKICAgICAgICAgICB0aGlzIGV2ZXIgd29ya2VkIGF0IGFsbCAoc2luY2UgYWxsIG9mIHRoZSBjb2RlIHRoYXQgd2FzIHRoZXJlCiAgICAgICAgICAgd2FzIHdyb25nIGFueXdheXMpLiAgIFVzZSB0aGUgInZhcm91dCIgdHlwZW1hcCB0byBoYW5kbGUKICAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgcmVsYXRlZCB0byBjaGFyYWN0ZXIgYXJyYXkgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgaXMgbm9ybWFsbHkgc3VwcG9zZWQgdG8gcmV0dXJuIGEgc3RyaW5nLCBidXQgdGhpcyB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjkuICAgVGhlIHJlYXNvbiBpdCB3YXMgYnJva2VuIHdhcyBhY3R1YWxseQogICAgICAgICAgIGR1ZSB0byBhIHN1YnRsZSBuZXcgZmVhdHVyZSBvZiB0eXBlbWFwcy4gIFdoZW4gYSBkYXRhIG1lbWJlcgogICAgICAgICAgIGlzIHNldCB0byBhbiBhcnJheSBsaWtlIHRoaXMsIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmVsYXRlZAogICAgICAgICAgIGFjY2Vzc29yIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IHNldCB0byBhbiBhcnJheS4gIFRoaXMgbWVhbnMKICAgICAgICAgICB0aGF0IHlvdSBjYW4gbm93IHdyaXRlIHR5cGVtYXBzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLG91dCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgJHRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCRzb3VyY2UsJGRpbTApOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZnVuY3QKICAgICAgICAgICBtZW1iZXJvdXQgdHlwZW1hcCBpbiBhIG1vcmUgZWxlZ2FudCBtYW5uZXIuCgo5LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTb21lIGZ1cnRoZXIgcmVmaW5lbWVudCBvZiBxdWFsaWZpZWQgQysrIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIChpKSBUaGUgU1dJRyBwYXJzZXIgd2FzIGV4dGVuZGVkIHNsaWdodGx5IHRvIGFsbG93ICd2b2xhdGlsZScKICAgICAgICAgICBhbmQgY29tYmluYXRpb25zIG9mICdjb25zdCcgYW5kICd2b2xhdGlsZScgdG8gYmUgdXNlZC4gIFRoaXMKICAgICAgICAgICBpcyBwcm9iYWJseSByYXJlLCBidXQgdGVjaG5pY2FsbHkgbGVnYWwuICBPbmx5IGFkZGVkIGZvcgogICAgICAgICAgIGNvbXBsZXRlbmVzcy4KCiAgICAgICAgICAgKGlpKSBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkaW5nLCBxdWFsaWZpZWQgYW5kIG5vbi1xdWFsaWZpZWQKICAgICAgICAgICBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudC4gIFRodXMsIHdoZW4gYSBjbGFzcyBoYXMgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKCiAgICAgICAgICAgVHdvIGRpc3RpbmN0IG1ldGhvZHMgYXJlIGRlY2xhcmVkLiAgVG8gZGVhbCB3aXRoIHRoaXMsICVyZW5hbWUKICAgICAgICAgICBhbmQgc2ltaWxhciBkaXJlY3RpdmVzIGhhdmUgYmVlbiBleHRlbmRlZCB0byByZWNvZ25pemUgY29uc3QuCiAgICAgICAgICAgVGh1cywgb25lIGNhbiBkaXNhbWJpZ3VhdGUgdGhlIHR3byBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vY29uc3QpIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIG9yIHNpbXBseSBpZ25vcmUgdGhlIGNvbnN0IHZhcmlhbnQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgTm90ZTogU1dJRyBjdXJyZW50bHkgaGFzIG5vIHdheSB0byBhY3R1YWxseSBpbnZva2UgdGhlIGNvbnN0CiAgICAgICAgICAgbWVtYmVyIHNpbmNlIHRoZSAnY29uc3QnIGlzIGRpc2NhcmRlZCB3aGVuIGdlbmVyYXRpbmcgd3JhcHBlcnMKICAgICAgICAgICBmb3Igb2JqZWN0cy4gIAoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTmV3IGRpcmVjdGl2ZS4gJW5hbWV3YXJuIGNhbiBiZSB1c2VkIHRvIGlzc3VlIHdhcm5pbmcKICAgICAgICAgICBtZXNzYWdlcyBmb3IgY2VydGFpbiBkZWNsYXJhdGlvbiBuYW1lcy4gICBUaGUgbmFtZQogICAgICAgICAgIG1hdGNoaW5nIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuCiAgICAgICAgICAgVGhlIGludGVudCBvZiB0aGlzIGRpcmVjdGl2ZSBpcyB0byBpc3N1ZSB3YXJuaW5ncyBmb3IKICAgICAgICAgICBwb3NzaWJsZSBuYW1lc3BhY2UgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVuYW1ld2FybigicHJpbnQgaXMgYSBweXRob24ga2V5d29yZCIpIHByaW50OwoKICAgICAgICAgICBUaGUgbmFtZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgcGVyZm9ybWVkIGFmdGVyIGEgbmFtZQogICAgICAgICAgIGhhcyBiZWVuIHJlc29sdmVkIHVzaW5nICVyZW5hbWUuICBUaGVyZWZvcmUsIGEKICAgICAgICAgICBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgd2lsbCBub3QgZ2VuZXJhdGUgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCJQcmludCIpIHByaW50OwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsgICAgLyogTm8gd2FybmluZyBnZW5lcmF0ZWQgKi8KCiAgICAgICAgICAgU2luY2UgdGhlIHdhcm5pbmcgbWVjaGFuaXNtIGZvbGxvd3MgJXJlbmFtZSBzZW1hbnRpY3MsIGl0IGlzCiAgICAgICAgICAgYWxzbyB0byBpc3N1ZSB3YXJuaW5ncyBmb3Igc3BlY2lmaWMgY2xhc3NlcyBvciBqdXN0IGZvcgogICAgICAgICAgIGNlcnRhaW4gbWVtYmVyIGZ1bmN0aW9uIG5hbWVzLgoKICAgICAgICAgICAoRGF2ZSAtIEkndmUgYmVlbiB0aGlua2luZyBhYm91dCBhZGRpbmcgc29tZXRoaW5nIGxpa2UgdGhpcwogICAgICAgICAgIGZvciBxdWl0ZSBzb21lIHRpbWUuICBKdXN0IG5ldmVyIGdvdCBhcm91bmQgdG8gaXQpCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIEVuaGFuY2VkIHRoZSAlaWdub3JlIGRpcmVjdGl2ZSBzbyB0aGF0IHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICBjYW4gYmUgaXNzdWVkIHRvIHVzZXJzLiAgIFRoaXMgaXMgZG9uZSB1c2luZyAlaWdub3Jld2FybgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlaWdub3Jld2Fybigib3BlcmF0b3IgbmV3IGlnbm9yZWQiKSBvcGVyYXRvciBuZXc7CgogICAgICAgICAgIFRoZSBuYW1lcyBhbmQgc2VtYW50aWNzIG9mICVpZ25vcmV3YXJuIGlzIGV4YWN0bHkgdGhlIAogICAgICAgICAgIHNhbWUgYXMgJWlnbm9yZS4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgIGlzIGZvciBtb2R1bGUgd3JpdGVycyB3aG8gd2FudCB0byBpZ25vcmUgY2VydGFpbiB0eXBlcwogICAgICAgICAgIG9mIGRlY2xhcmF0aW9ucywgYnV0IHdobyBhbHNvIHdhbnQgdG8gYWxlcnQgdXNlcnMgYWJvdXQgaXQuCiAgICAgICAgICAgQSB1c2VyIG1pZ2h0IGFsc28gdXNlIHRoaXMgZm9yIGRlYnVnZ2luZyAoc2luY2UgbWVzc2FnZXMKICAgICAgICAgICB3aWxsIGFwcGVhciB3aGVuZXZlciBhbiBpZ25vcmVkIGRlY2xhcmF0aW9uIGFwcGVhcnMpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMjYvMjAwMTogYmVhemxleQogICAgICAgICAgIFN1cGVyLWV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBvdmVybG9hZGVkIG9wZXJhdG9ycy4gCiAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiBhIGZldyBkaWZmZXJlbnQgcGFydHMuCgogICAgICAgICAgIChpKSBPcGVyYXRvciBuYW1lcyBzdWNoIGFzICdvcGVyYXRvcisnIGFyZSBub3cgYWxsb3dlZAogICAgICAgICAgIGFzIHZhbGlkIGRlY2xhcmF0b3IgbmFtZXMuICBUaHVzIHRoZSAnb3BlcmF0b3InIHN5bnRheAogICAgICAgICAgIGNhbiBhcHBlYXIgKmFueXBsYWNlKiBhIG5vcm1hbCBkZWNsYXJhdG9yIG5hbWUgd2FzIHVzZWQKICAgICAgICAgICBiZWZvcmUuICBPbiB0aGUgc3VyZmFjZSwgdGhpcyBtZWFucyB0aGF0IG9wZXJhdG9ycyBjYW4KICAgICAgICAgICBiZSBwYXJzZWQganVzdCBsaWtlIG5vcm1hbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuIAogICAgICAgICAgIEhvd2V2ZXIsIGl0IGFsc28gbWVhbnMgdGhhdCBvcGVyYXRvciBuYW1lcyBjYW4gYmUgdXNlZAogICAgICAgICAgIGluIG1hbnkgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXJlbmFtZShfX2FkZF9fKSBDb21wbGV4OjpvcGVyYXRvcisoY29uc3QgQ29tcGxleCAmKTsKCiAgICAgICAgICAgKGlpKSBPcGVyYXRvcnMgYXJlIHdyYXBwZWQgKmV4YWN0bHkqIGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBtZXRob2RzLiAgSW50ZXJuYWxseSwgdGhlIG9wZXJhdG9yIG5hbWUgaXMgdXNlZCAKICAgICAgICAgICBkaXJlY3RseSBtZWFuaW5nIHRoYXQgdGhlIHdyYXBwZXIgY29kZSBtaWdodCBjb250YWluCiAgICAgICAgICAgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYXJnMC0+b3BlcmF0b3IqKChDb21wbGV4IGNvbnN0ICYpKmFyZzEpOwoKICAgICAgICAgICBUaGlzIGFsbCBzZWVtcyB0byBwYXJzZSBhbmQgY29tcGlsZSBjb3JyZWN0bHkgKGF0IGxlYXN0CiAgICAgICAgICAgb24gbXkgbWFjaGluZSkuCgogICAgICAgICAgIChpaWkpIFNXSUcgd2lsbCBubyBsb25nZXIgd3JhcCBhIGRlY2xhcmF0aW9uIGlmIGl0cyBzeW1ib2wKICAgICAgICAgICB0YWJsZSBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzLiAgSWYKICAgICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlcnMgYXJlIGRldGVjdGVkLCB5b3Ugd2lsbCBzZWUgYW4gZXJyb3IKICAgICAgICAgICBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgIFdhcm5pbmcuIENhbid0IHdyYXAgb3BlcmF0b3IqIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4KCiAgICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSAlcmVuYW1lIG9yICVuYW1lIHRvIGJpbmQKICAgICAgICAgICB0aGUgb3BlcmF0b3IgdG8gYSBuaWNlIG5hbWUgbGlrZSAiYWRkIiBvciBzb21ldGhpbmcuIE5vdGU6CiAgICAgICAgICAgdGhlIGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0CiAgICAgICAgICAgbGFuZ3VhZ2UuCgogICAgICAgICAgIFRoZXJlIGFyZSBjZXJ0YWluIGlzc3VlcyB3aXRoIGZyaWVuZCBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycy4KICAgICAgICAgICBTb21ldGltZXMsIGZyaWVuZHMgYXJlIHVzZWQgdG8gZGVmaW5lIG1peGVkIG9wZXJhdG9ycyBzdWNoCiAgICAgICAgICAgYXMgYWRkaW5nIGEgQ29tcGxleCBhbmQgYSBkb3VibGUgdG9nZXRoZXIuICBDdXJyZW50bHksIFNXSUcKICAgICAgICAgICBpZ25vcmVzIGFsbCBmcmllbmQgZGVjbGFyYXRpb25zIGluIGEgY2xhc3MuICBBIGdsb2JhbCBvcGVyYXRvcgogICAgICAgICAgIGRlY2xhcmF0aW9uIGNhbiBwcm9iYWJseSBiZSBtYWRlIHRvIHdvcmssIGJ1dCB5b3UnbGwgaGF2ZSB0bwogICAgICAgICAgIHJlbmFtZSBpdCBhbmQgaXQgcHJvYmFibHkgd29uJ3Qgd29yayB2ZXJ5IGNsZWFubHkgaW4gdGhlCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHNpbmNlIGl0J3Mgbm90IGEgY2xhc3MgbWVtYmVyLgoKICAgICAgICAgICBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gaGFuZGxlIG9wZXJhdG9yIHNwZWNpZmljYXRpb25zIAogICAgICAgICAgIHNvbWV0aW1lcyB1c2VkIGZvciBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgU3RyaW5nIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBvcGVyYXRvciBjb25zdCBjaGFyKigpOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH07CgogICAgICAgICAgICh0aGlzIGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5IGFuZCBnZW5lcmF0ZXMgYSBzeW50YXggZXJyb3IpLgoKICAgICAgICAgICBBbHNvOiBvcGVyYXRvcnMgbm8gbG9uZ2VyIHNob3cgdXAgYXMgc2VwYXJhdGUgcGFyc2UtdHJlZQogICAgICAgICAgIG5vZGVzIChpbnN0ZWFkIHRoZXkgYXJlIG5vcm1hbCAnY2RlY2wnIG5vZGVzKS4gIEkgbWF5CiAgICAgICAgICAgc2VwYXJhdGUgdGhlbSBhcyBhIHNwZWNpYWwgY2FzZSBsYXRlci4KCiAgICAgICAgICAgU2VlIEV4YW1wbGVzL3B5dGhvbi9vcGVyYXRvciBmb3IgYW4gZXhhbXBsZS4KCiAgICAgICAgICAgKioqIFNVUEVSLUVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKClZlcnNpb24gMS4zLjkgKFNlcHRlbWJlciAyNSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlIGRlY2xhcmF0aW9ucyBsaWtlIAogICAgICAgICAgICdjaGFyICoqIGNvbnN0Jy4gIFNXSUcgcGFyc2VkIHRoaXMgY29ycmVjdGx5LCBidXQgdGhlCiAgICAgICAgICAgaW50ZXJuYWwgdHlwZSB3YXMgcmVwcmVzZW50ZWQgaW5jb3JyZWN0bHkgKHRoZSBwb2ludGVycwogICAgICAgICAgIGFuZCBxdWFsaWZpZXJzIHdlcmUgaW4gdGhlIHdyb25nIG9yZGVyKS4KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIFdpdGhkcmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIChub3RlZCBiZWxvdykgdGhhdCB3YXMKICAgICAgICAgICBjYXVzaW5nIHNlcmlvdXMgcGFyc2luZyBwcm9ibGVtcy4KClZlcnNpb24gMS4zLjggKFNlcHRlbWJlciAyMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCBpbXByb3ZlZCBkaXN0dXRpbHMgc2V0dXAucHkgZmlsZSBpbiB0aGUgVG9vbHMgCiAgICAgICAgICAgZGlyZWN0b3J5IChsb29rIGZvciB0aGUgc2V0dXAucHkudG1wbCBmaWxlKS4gIENvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICAgVG9ueSBTZXdhcmQuCgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCB0d28gbmV3IFJQTSBzcGVjIGZpbGVzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuIENvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgVG9ueSBTZXdhcmQgYW5kIFV3ZSBTdGVpbm1hbm4uCiAgCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjM2MzUgXSBQZXJsNS5zd2cgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgQysrCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUd28gbmV3IGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgY3JlYXRpb24gb2YgZGVmYXVsdAogICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdAogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0CgogICAgICAgICAgIFRoZXNlIHJlcGxhY2UgJXByYWdtYSBub2RlZmF1bHQgYW5kICVwcmFnbWEgbWFrZWRlZmF1bHQuCiAgICAgICAgICAgKG9sZCBjb2RlIHdpbGwgc3RpbGwgd29yaywgYnV0IGRvY3VtZW50YXRpb24gd2lsbCBvbmx5CiAgICAgICAgICAgZGVzY3JpYmUgdGhlIG5ldyBkaXJlY3RpdmVzKS4KCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjIzNTQgXSAlaW1wb3J0IGJyb2tlbiBpbiAxLjMuNy4KCjkvMjAvMjAwMTogYmVhemxleQoKICAgICAgICAgICBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIG91dC1vZi1jbGFzcyBjb25zdHJ1Y3RvcgogICAgICAgICAgIGFuZCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6Rm9vKCkgOgogICAgICAgICAgICAgICAgICAgIEJhcigiZm9vIikKICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgIGlubGluZSBGb286On5Gb28oKSB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEphc29uIFN0ZXdhcnQuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciB0byBpZ25vcmUgZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcwogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgViwgbG9uZyBTPiBjbGFzcyBNYXBJdGVyOwoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgYW4gZW1haWwgZXhhbXBsZSBmcm9tIElyaW5hIEtvdGxvdmEuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdW5kZWNsYXJlZCB0Y2xfcmVzdWx0IHZhcmlhYmxlIGluIAogICAgICAgICAgIHRoZSAib3V0IiB0eXBlbWFwIGZvciBUY2wuICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggQWN0aXZlUGVybC4gIAogICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNpbmcgb2YgQysrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBGb28oKSA6IEJhciguLi4pIHsuLi59CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBub3cgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSAoLi4uKSByZWdhcmRsZXNzIG9mIAogICAgICAgICAgIHdoYXQgbWlnaHQgZW5jbG9zZWQgKGV2ZW4gaWYgc3ludGFjdGljYWxseSB3cm9uZykuICBTV0lHCiAgICAgICAgICAgZG9lc24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwogICAgICAgICAgIG5lZWRsZXNzIGFkZCBzeW50YXggcnVsZXMgdG8gaGFuZGxlIGFsbCBvZiB0aGUgcG9zc2liaWxpdGllcwogICAgICAgICAgIGhlcmUuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdHlwZW1hcHMgZm9yIHN0cnVjdHVyZSBtZW1iZXJzLiAgSWYgeW91IGhhdmUgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgaW50ICpiYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIG1lbWJlciBuYW1lICdiYXInIGlzIG5vdyB1c2VkIGluIGFueSBhY2Nlc3NvciBmdW5jdGlvbnMuCiAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlICJpbiIgdHlwZW1hcCB0byBiZSB1c2VkIHdoZW4gc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgdHlwZW1hcAoKICAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLGluKSBpbnQgKmJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBub3cgbWF0Y2hlcyBWZWN0b3I6OmJhci4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgd2lsbCBhbHNvCiAgICAgICAgICAgbWF0Y2ggYW55IGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgImludCAqYmFyIiAoc28geW91IHNob3VsZAogICAgICAgICAgIGJlIGNhcmVmdWwpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRS4gUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyNjQyIHNldHRpbmcgc3RyaW5nIHZhbHVlcyBpbiBzdHJ1Y3R1cmVzCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjM5OCBwcm9ibGVtIHdpdGggbmVzdGVkIHRlbXBsYXRlcy4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYxNjI2IHByb2JsZW0gd2l0aCBmb3JtYXR0aW5nIGFuZCBDKysgY29tbWVudHMuCiAgICAgICAgICAgIAo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2Mjg0NSBXcm9uZyBvd25lcnNoaXAgb2YgcmV0dXJuZWQgb2JqZWN0cy4KICAgICAgICAgICAKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NTkzNjcuICBEZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgY2xhc3NlcwogICAgICAgICAgIHdpdGggcHVyZSB2aXJ0dWFsIG1ldGhvZHMuCgo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIGNsYXNzIHNjb3BlLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgZW51bSBiYXIgeyBGT08sIEJBUiB9OwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyIGIgPSBGT08pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTV0lHIG5vdyBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgZGVmYXVsdCB2YWx1ZSBvZiAiRm9vOjpGT08iIGZvcgogICAgICAgICAgIHRoZSBibGFoKCkgbWV0aG9kIGFib3ZlLiAgVGhpcyB1c2VkIHRvIHdvcmsgaW4gMS4xLCBidXQgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy43LiAgIEJ1ZyByZXBvcnRlZCBieSBNaWtlIFJvbWJlcmcuCgpWZXJzaW9uIDEuMy43ICAoU2VwdGVtYmVyIDMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHNwZWNpYWwgJWlnbm9yZSBkaXJlY3RpdmUgdG8gaWdub3JlIGRlY2xhcmF0aW9ucy4gIFRoaXMKICAgICAgICAgICBmZWF0dXJlIHdvcmtzIGV4YWN0bHkgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSAgZm9vOyAgICAgICAgLy8gSWdub3JlIGFsbCBkZWNsYXJhdGlvbnMgZm9vCiAgICAgICAgICAgICAlaWdub3JlICA6OmZvbzsgICAgICAvLyBPbmx5IGlnbm9yZSBmb28gaW4gZ2xvYmFsIHNjb3BlCiAgICAgICAgICAgICAlaWdub3JlICBTcGFtOjpmb287ICAvLyBPbmx5IGlnbm9yZSBpbiBjbGFzcyBTcGFtCiAgICAgICAgICAgICAlaWdub3JlICAqOjpmb287ICAgICAvLyBJZ25vcmUgaW4gYWxsIGNsYXNzZXMKCiAgICAgICAgICAgJWlnbm9yZSBjYW4gYWxzbyBiZSBwYXJhbWV0ZXJpemVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgU3BhbTo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlICo6OmZvbyhpbnQpOwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAoKOS8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gc2hhZG93Y29kZSBwcmFnbWEgbW9kaWZpZWQgc28gdGhhdCB0aGUgY29kZSB0aGF0IGlzIG91dHB1dCAKICAgICAgICAgICBpbiB0aGUgc2hhZG93IGZpbGUgaXMgcGxhY2VkIHJlbGF0aXZlIHRvIHdoZXJlIGl0IGlzIHBsYWNlZCBpbiB0aGUgCiAgICAgICAgICAgYy9jKysgY29kZS4gVGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgSmF2YURvYyBmdW5jdGlvbiBjb21tZW50cy4gCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBQYXRjaCBbICM0NDc3OTEgXSBGaXggZm9yIHB5dGhvbiAtaW50ZXJmYWNlIG9wdGlvbi4KICAgICAgICAgICBTdWJtaXR0ZWQgYnkgVGFybiBXZWlzbmVyIEJ1cnRvbi4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycwogICAgICAgICAgIGZvciBhIGNsYXNzIGlmIGl0IG9ubHkgZGVmaW5lcyBhIHByaXZhdGUvcHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgICAgb3IgZGVzdHJ1Y3RvciBvciBpZiBhbnkgb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgb25seSBoYXMKICAgICAgICAgICBwcml2YXRlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4gIFRoaXMgd2FzIHJlcG9ydGVkIGluCiAgICAgICAgICAgU0YgUGF0Y2ggWyAjNDQ0MjgxIF0gbm9ucHVibGljL2RlZmF1bHQvaW5oZXJldGVkIGN0b3IvZHRvcgogICAgICAgICAgIGJ5IE1hcmNlbG8gTWF0dXMuCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXRjaCB0byBQZXJsNSBtb2R1bGUgdGhhdCBhbGxvd3MgY29uc3RhbnRzIHRvIGJlCiAgICAgICAgICAgd3JhcHBlZCBhcyBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSBsZWFkaW5nICQuCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgdXNpbmcgdGhlIC1jb25zdCBvcHRpb24uCiAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUmljaCBXYWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSAndm9sYXRpbGUnIHR5cGUgcXVhbGlmaWVyLgogICAgICAgICAgIHZvbGF0aWxlIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyB0byBTV0lHLCBidXQgaXQgaXMKICAgICAgICAgICBuZWVkZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgZGVjbGFyYXRpb25zCiAgICAgICAgICAgdGhhdCB1c2UgaXQuICBJdCdzIGFsc28gYmVlbiBhZGRlZCB0byBtYWtlIHRoZSBTV0lHIHR5cGUKICAgICAgICAgICBzeXN0ZW0gbW9yZSBjb21wbGV0ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkICVyZW5hbWUgZGlyZWN0aXZlLiAgKioqIFRoaXMKICAgICAgICAgICBuZXcgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mCiAgICAgICAgICAgcmVzb2x2aW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAqKioKICAgICAgICAgICAKICAgICAgICAgICBJbiBwcmlvciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgd2FzCiAgICAgICAgICAgdXNlZCB0byBjb25zaXN0ZW50bHkgYXBwbHkgYW4gaWRlbnRpZmllciByZW5hbWluZy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdSBzYWlkIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZSBmb28gYmFyOwoKICAgICAgICAgICBFdmVyeSBvY2N1cnJlbmNlIG9mICdmb28nIHdvdWxkIGJlIHJlbmFtZWQgdG8gJ2JhcicuIAogICAgICAgICAgIEFsdGhvdWdoIHRoaXMgd29ya3MgZmluZSBmb3IgcmVzb2x2aW5nIGEgY29uZmxpY3Qgd2l0aCBhCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHJlc2VydmVkIHdvcmQsIGl0IGlzIHVzZWxlc3MgZm9yCiAgICAgICAgICAgZm9yIGRlYWxpbmcgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMuICAgIFRoaXMgaXMgYmVjYXVzZQogICAgICAgICAgIGFsbCBtZXRob2RzIGFyZSBzaW1wbHkgcmVuYW1lZCB0byB0aGUgc2FtZSB0aGluZyAKICAgICAgICAgICAoZ2VuZXJhdGluZyB0aGUgc2FtZSBjb25mbGljdCBhcyBiZWZvcmUpLgoKICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBvbmx5IHdheSB0byBkZWFsIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzCiAgICAgICAgICAgd2FzIHRvIGdvIHRocm91Z2ggYW5kIGluZGl2aWR1YWxseSByZW5hbWUgdGhlbSBhbGwgdXNpbmcKICAgICAgICAgICAlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCB5b3UgaGFkIHRvIGRvIHRoaXMgZm9yIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3NlcyB0b28uCgogICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBtYWtlcyBpdCBleHRyZW1lbHkgaGFyZCB0byByZXNvbHZlCiAgICAgICAgICAgb3ZlcmxvYWRpbmcgd2l0aG91dCBhIGxvdCBvZiB3b3JrIGFuZCBtYWtlcyBpdCBhbG1vc3QKICAgICAgICAgICBpbXBvc3NpYmxlIHRvIHVzZSBTV0lHIG9uIHJhdyBDKysgLmggZmlsZXMuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCAlcmVuYW1lIG5vdyBhY2NlcHRzIHBhcmFtZXRlciBkZWNsYXJhdG9ycy4KICAgICAgICAgICBUaGUgc3ludGF4IGhhcyBhbHNvIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIEZvciBleGFtcGxlLAogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gcmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcihpbnQpJwogICAgICAgICAgIHRvICdiYXJfaScsIGxlYXZpbmcgYW55IG90aGVyIG9jY3VycmVuY2Ugb2YgJ2JhcicgYWxvbmUuCgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CgogICAgICAgICAgIFVzaW5nIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBub3cgc2VsZWN0aXZlbHkgcmVuYW1lIAogICAgICAgICAgIGNlcnRhaW4gZGVjbGFyYXRpb25zIGluIGFkdmFuY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2QpIGJhcihkb3VibGUpOwoKICAgICAgICAgICAgIC8vIEluY2x1ZGUgcmF3IEMrKyBoZWFkZXIgICAgCiAgICAgICAgICAgICAlaW5jbHVkZSAiaGVhZGVyLmgiCgogICAgICAgICAgIFdoZW4gJXJlbmFtZSBpcyB1c2VkIGluIHRoaXMgbWFubmVyLCBhbGwgb2NjdXJyZW5jZSBvZiBiYXIoaW50KQogICAgICAgICAgIGFyZSByZW5hbWVkIHdoZXJldmVyIHRoZXkgbWlnaHQgb2NjdXIuICBNb3JlIGNvbnRyb2wgaXMgb2J0YWluZWQKICAgICAgICAgICB0aHJvdWdoIGV4cGxpY2l0IHF1YWxpZmljYXRpb24uIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSA6OmJhcihpbnQpOwoKICAgICAgICAgICBvbmx5IGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24sCiAgICAgCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgRm9vOjpiYXIoaW50KTsKCiAgICAgICAgICAgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiBhIGNsYXNzIEZvby4KICAgICAgICAgICBUaGlzIGxhdHRlciBmb3JtIGFsc28gc3VwcG9ydHMgaW5oZXJpdGFuY2UuICBUaGVyZWZvcmUsIGlmIHlvdQogICAgICAgICAgIGhhZCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgU3BhbTo6YmFyKGludCkgbWV0aG9kIHdvdWxkIGFsc28gYmUgcmVuYW1lZCAoc2luY2UgU3BhbSAKICAgICAgICAgICBpcyBhIHN1YmNsYXNzIG9mIEZvbykuICAgVGhpcyBsYXR0ZXIgZmVhdHVyZSBtYWtlcyBpdCBlYXN5CiAgICAgICAgICAgZm9yIFNXSUcgdG8gYXBwbHkgYSBjb25zaXN0ZW50IHJlbmFtaW5nIGFjcm9zcyBhbiBlbnRpcmUKICAgICAgICAgICBjbGFzcyBoaWVyYXJjaHkgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgcmVuYW1pbmcgcnVsZXMgZm9yCiAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgIEEgY2xhc3Mgd2lsZGNhcmQgb2YgKiBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byByZW5hbWluZwogICAgICAgICAgIGFsbCBtYXRjaGluZyBtZW1iZXJzIG9mIGFsbCBjbGFzc2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpICo6OmJhcihpbnQpOwoKICAgICAgICAgICB3aWxsIHJlbmFtZSBhbGwgbWVtYmVycyBiYXIoaW50KSB0aGF0IGFyZSBkZWZpbmVkIGluIGNsYXNzZXMuCiAgICAgICAgICAgSXQgd2lsbCBub3QgcmVuYW1lZCBkZWZpbml0aW9ucyBvZiBiYXIoaW50KSBpbiB0aGUgZ2xvYmFsCiAgICAgICAgICAgc2NvcGUuCgogICAgICAgICAgIFRoZSBvbGQgdXNlIG9mICVyZW5hbWUgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgaXMgc29tZXdoYXQKICAgICAgICAgICBlbmhhbmNlZC4gIAoKICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgYmFyOyAgICAgIC8vIFJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXInLgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSA6OmJhcjsgICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBnbG9iYWwgc2NvcGUgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgKjo6YmFyOyAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gY2xhc3NlcyBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBGb286OmJhcjsgLy8gUmVuYW1lIGFsbCAnYmFyJyBkZWZpbmVkIGluIGNsYXNzIEZvby4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGF0YS1tZW1iZXIgdG8gbWVtYmVyLWZ1bmN0aW9uIAogICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTm93IHN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIGFjY2VzcyB4IGFuZCB5IAogICAgICAgICAgIHRocm91Z2ggYSBtZW1iZXIgZnVuY3Rpb24gaW50ZXJmYWNlIGluc3RlYWQgCiAgICAgICAgICAgb2YgdGhlIHVzdWFsIFNXSUcgYmVoYXZpb3IuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBmLnNldF94KDMuNCkgICAgICAjIGluc3RlYWQgb2YgZi54ID0gMy40CiAgICAgICAgICAgICAgeCA9IGYuZ2V0X3goKSAgICAgIyBpbnN0ZWFkIG9mIHggPSBmLngKCiAgICAgICAgICAgVG8gZG8gdGhpcywgc2ltcGx5IHVzZSB0aGUgbmV3ICVhdHRyaWJ1dGVmdW5jCiAgICAgICAgICAgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldF8lcyxzZXRfJXMpCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICVub2F0dHJpYnV0ZWZ1bmMKCiAgICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byAlYXR0cmlidXRlZnVuYyBhcmUgQy1zdHlsZSBwcmludGYKICAgICAgICAgICBmb3JtYXQgc3RyaW5ncyB0aGF0IGRldGVybWluZSB0aGUgbmFtaW5nIGNvbnZlbnRpb24KICAgICAgICAgICB0byB1c2UuICAlcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUKICAgICAgICAgICBkYXRhIG1lbWJlci4gU1dJRyBwcm92aWRlcyBhIG51bWJlciBvZiBwcmludGYKICAgICAgICAgICBleHRlbnNpb25zIHRoYXQgbWlnaHQgaGVscC4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICB3YW50ZWQgdG8gdGl0bGUgY2FzZSBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMsIHlvdQogICAgICAgICAgIGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldCUodGl0bGUpcyxzZXQlKHRpdGxlKXMpOwoKICAgICAgICAgICBUaGlzIHdpbGwgdHVybiBhbiBhdHRyaWJ1dGUgJ2JhcicgdG8gJ2dldEJhcigpJyBhbmQgJ3NldEJhcigpJy4KCiAgICAgICAgICAgKHNvbWVvbmUgcmVxdWVzdGVkIHRoaXMgbG9uZyBhZ28sIGJ1dCBJIGZpbmFsbHkgZmlndXJlZAogICAgICAgICAgIGhvdyB0byBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgbWFubmVyKS4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBpZiBub25lIGFyZSBkZWZpbmVkLiAgVGhpcyB1c2VkIHRvIGJlCiAgICAgICAgICAgZW5hYmxlZCB3aXRoIGEgY29tbWFuZCBsaW5lIHN3aXRjaCAtbWFrZV9kZWZhdWx0LCBidXQKICAgICAgICAgICBtb3N0IHBlb3BsZSB3YW50IHRoZXNlIGZ1bmN0aW9ucyBhbnl3YXlzLiAgVG8gdHVybgogICAgICAgICAgIG9mZiB0aGlzIGJlaGF2aW9yIHVzZSB0aGUgLW5vX2RlZmF1bHQgb3B0aW9uIG9yIGluY2x1ZGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CiAKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQ7CiAgCiAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgY2VydGFpbiBpbnRlcmZhY2VzIHRoYXQgZGVmaW5lZCB0aGVpcgogICAgICAgICAgIG93biBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgdXNpbmcgdGhlIHNhbWUgbmFtaW5nCiAgICAgICAgICAgY29udmVudGlvbiBhcyBTV0lHLiAgSWYgc28sIHlvdSB3aWxsIGdldCBkdXBsaWNhdGUKICAgICAgICAgICBzeW1ib2xzIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIEl0ZXJhdG9ycwogICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChGSVJTVEtFWSwgTkVYVEtFWSkuICBBbHNvLCBhdHRyaWJ1dGUKICAgICAgICAgICBhY2Nlc3MgaGFzIGJlZW4gY2hhbmdlZCB0byByZWx5IG9uIGluaGVyaXRhbmNlIGluIG9yZGVyCiAgICAgICAgICAgdG8gcHJvdmlkZSBiZXR0ZXIgYmVoYXZpb3IgYWNyb3NzIG1vZHVsZXMuICAKCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIFZhcmlvdXMgb2JzY3VyZSBpbXByb3ZlbWVudHMgdG8gdGhlIHR5cGUgc3lzdGVtIGFuZCBjbGFzc2VzLgogICAgICAgICAgIFN0cmFuZ2UgZGVjbGFyYXRpb25zIGxpa2UgdGhpcyBhcmUgbm93IHdyYXBwZWQgY29ycmVjdGx5CiAgICAgICAgICAgKGkuZS4sIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGRvZXNuJ3QgY2F1c2UgdGhlIEMrKwogICAgICAgICAgICBjb21waWxlciB0byBkaWUgd2l0aCBhIHR5cGUgZXJyb3IpLgoKICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIFJlYWw7CiAgICAgICAgICAgICAgICAgUmVhbCBmb28oUmVhbCAoKm9wKShSZWFsLFJlYWwpLCBSZWFsIHgsIFJlYWwgeSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgIEluaGVyaXRhbmNlIG9mIHR5cGVzIGlzIGFsc28gaGFuZGxlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gY2xhc3Mgd3JhcHBlcnMuICAgV2hlbiBTV0lHIHNlZXMgdHdvIGNsYXNzZXMgbGlrZSB0aGlzLAogCiAgICAgICAgICAgY2xhc3MgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGNsYXNzIFkgOiBwdWJsaWMgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBiYXIoKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGl0IG5vdyBvbmx5IGdlbmVyYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnM6CiAKICAgICAgICAgICAgIFhfZm9vKFggKngpIHsgeC0+Zm9vKCk7IH0KICAgICAgICAgICAgIFlfYmFyKFkgKnkpIHsgeS0+YmFyKCk7IH0KIAogICAgICAgICAgIFVubGlrZSBTV0lHMS4xNSwgdGhlIGZvbygpIG1ldGhvZCBkb2VzICpub3QqIHByb3BhZ2F0ZSB0byBhIHdyYXBwZXIKICAgICAgICAgICBmdW5jdGlvbiBZX2ZvbygpLiBJbnN0ZWFkLCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgWF9mb28oKSBtdXN0IGJlCiAgICAgICAgICAgdXNlZC4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgbW9kdWxlcyB0aGF0IHVzZSBzaGFkb3cgY2xhc3NlcywgYnV0CiAgICAgICAgICAgaXQgbWlnaHQgYnJlYWsgbW9kdWxlcyB0aGF0IGRpcmVjdGx5IHVzZSB0aGUgbG93LWxldmVsIEMgd3JhcHBlcnMuCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSBmb3IgYSBudW1iZXIgb2YgcmVhc29uczoKCiAgICAgICAgICAgICAgIC0gIEl0IGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU1dJRy0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICB3aXRoIGFudGljaXBhdGVkIGZ1dHVyZSBjaGFuZ2VzIHN1Y2ggYXMgb3ZlcmxvYWRlZCBtZXRob2RzLgoKICAgICAgICAgICAgICAgLSAgSXQgcmVzdWx0cyBpbiBzdWJzdGFudGlhbGx5IGxlc3Mgd3JhcHBlciBjb2RlLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIGZvciBiaWcgQysrIGNsYXNzIGhpZXJhcmNoaWVzIChpbmhlcml0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAgIGFyZSBubyBsb25nZXIgY29waWVkIGludG8gZXZlcnkgc2luZ2xlIGRlcml2ZWQgY2xhc3MpLgoKICAgICAgICAgICAgICAgLSAgSXQgYWxsb3dzIGZvciBiZXR0ZXIgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIChjb2RlIGlzbid0IHJlcGxpY2F0ZWQgaW4KICAgICAgICAgICAgICAgICAgZXZlcnkgc2luZ2xlIG1vZHVsZSkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBQcm92aWRlZCBzb21lIFdpbmRvd3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luIGRpcmVjdG9yeSBhbmQgc29tZQogICAgICAgICAgIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlcyBmb3IgcnVubmluZyBleGFtcGxlcyBvbiBXaW5kb3dzLgoKOC8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSByZW5hbWVkIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHByb3Blcmx5OwoJICAgdGhhbmtzIHRvIE1hcmMgWm9uem9uIDxNYXJjLlpvbnpvbkB1bml2LXJlbm5lczEuZnI+IGZvciB0aGUKCSAgIHBhdGNoLiAgU2VlIHRoZSBuZXcgdGVzdCBjYXNlIG5hbWVfY3h4LgoKOC8yNy8yMDAxOiBta29lcHBlCgkgICBbVGNsXSBSZW1vdmVkIGxvdHMgb2Ygd2FybmluZ3MgaXNzdWVkIGJ5IHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycywgd2hpY2ggd2VyZSBjYXVzZWQgYnkgbWl4aW5nIGZ1bmN0aW9uIHBvaW50ZXJzCgkgICBvZiBkaWZmZXJlbnQgbGlua2FnZXMgKEMrKy9DKS4gCgo4LzIzLzIwMDE6IG1rb2VwcGUKCSAgIEltcHJvdmVkIHRoZSBNelNjaGVtZSBtb2R1bGUgYnkgcG9ydGluZyBHdWlsZSdzIHBvaW50ZXIKCSAgIHR5cGUgY2hlY2tpbmcgc3lzdGVtIGFuZCBtYWtpbmcgdHlwZSBkaXNwYXRjaAoJICAgdHlwZW1hcC1kcml2ZW4uIAoKOC8yMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW50aXJlbHkgbmV3IHN5bWJvbCB0YWJsZSBwcm9jZXNzaW5nLiAgIFNXSUcgc2hvdWxkIGJlIGFibGUgdG8KICAgICAgICAgICByZXBvcnQgbXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG11bHRpcGxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgQWxzbywgdGhlIG5ldyBzeW1ib2wgdGFibGUgYWxsb3dzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucwogICAgICAgICAgIChhbHRob3VnaCBvdmVybG9hZGluZyBpc24ndCBxdWl0ZSBzdXBwb3J0ZWQgaW4gdGhlIGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcyB5ZXQpLgoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSAlbmV3IHN1cHBvcnQgYWRkZWQuCiAgICAgICAgICAgKiBbSmF2YV0gUGFja2FnZSBKTkkgbmFtZSByZWZpeGVkIQoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUHl0aG9uIG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IHBvaW50ZXJzIHRvIEMrKyBtZW1iZXJzLiAgVGhpcwogICAgICAgICAgIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbGltaXRlZCBwYXJzaW5nIGFuZCBmdWxsIHR5cGUtc3lzdGVtIHN1cHBvcnQgZm9yIHBvaW50ZXJzIHRvCiAgICAgICAgICAgbWVtYmVycy4gTm9uZSBvZiBTV0lHJ3MgbGFuZ3VhZ2UgbW9kdWxlcyByZWFsbHkga25vdyBob3cgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgdGhpcyBzbyB0aGlzIGlzIHJlYWxseSBvbmx5IHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MgYW5kIGZ1dHVyZQogICAgICAgICAgIGV4cGFuc2lvbi4gIE5vdGU6IFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBwb2ludGVycyB0byBtZW1iZXJzIHdoaWNoIAogICAgICAgICAgIGFyZSB0aGVtc2VsdmVzIHBvaW50ZXJzIHRvIG1lbWJlcnMsIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMgdG8gbWVtYmVycywKICAgICAgICAgICBvciBvdGhlciBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgaXMgbXVjaCBiZXR0ZXIgYXQgcGFyc2luZyBjZXJ0YWluIEMrKyBkZWNsYXJhdGlvbnMuIE9wZXJhdG9ycyBhbmQKICAgICAgICAgICBmcmllbmRzIGdlbmVyYWxseSBkb24ndCBjYXVzZSBhbnltb3JlIHN5bnRheCBlcnJvcnMuICBIb3dldmVyLCBuZWl0aGVyCiAgICAgICAgICAgYXJlIHJlYWxseSBzdXBwb3J0ZWQuCgo4LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAqaGlnaGx5KiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgb2YgQysrCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zLiAgU2luY2UgQysrIHRlbXBsYXRlcyBhcmUgZXNzZW50aWFsbHkKICAgICAgICAgICBnbG9yaWZpZWQgbWFjcm9zIGFuZCBTV0lHIGhhcyBhIGZ1bGx5IG9wZXJhdGlvbmFsIEMgCiAgICAgICAgICAgcHJlcHJvY2Vzc29yIHdpdGggbWFjcm8gc3VwcG9ydCwgdGhlIHBhcnNlciBub3cgY29udmVydHMKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgdG8gbWFjcm9zLiAgRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24KICAgICAgICAgICB0ZW1wbGF0ZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IFQgbWF4KFQgYSwgVCBiKTsKCiAgICAgICAgICAgaXMgaW50ZXJuYWxseSBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV9tYXgoX19uYW1lLFQpCiAgICAgICAgICAgICAgICVuYW1lKF9fbmFtZSkgVCBtYXgoVCBhLCBUIGIpOwogICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFRvIGluc3RhbnRpYXRlIGEgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUsIGEgc3BlY2lhbCAldGVtcGxhdGUgZGVjbGFyYXRpb24KICAgICAgICAgICBpcyB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47CgogICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgdG8gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSBwcm9wZXIgQyBpZGVudGlmaWVyIHRoYXQncwogICAgICAgICAgIHVzZWQgdG8gdW5pcXVlbHkgbmFtZSB0aGUgcmVzdWx0aW5nIGluc3RhbnRpYXRpb24uICAgV2hlbiB1c2VkLCB0aGUKICAgICAgICAgICB0aGUgZXhwYW5kZWQgbWFjcm8gbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlbmFtZShtYXhpbnQpIGludCBtYXgoaW50IGEsIGludCBiKTsKICAgICAgICAgICAgICAlbmFtZShtYXhkb3VibGUpIGRvdWJsZSBtYXgoZG91YmxlIGEsIGRvdWJsZSBiKTsKCiAgICAgICAgICAgQSBzaW1pbGFyIHRlY2huaXF1ZSBpcyB1c2VkIGZvciB0ZW1wbGF0ZSBjbGFzc2VzLiAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmVjdG9yKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgR2V0cyBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX3ZlY3RvcihfX25hbWUsIFQpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxUPiBfX25hbWU7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBfX25hbWUgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBfX25hbWUoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgX19uYW1lIHZlY3RvcjxUPjsKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIEFuIGEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBpcyBjcmVhdGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5OgoKICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWMpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBUaGUgcmVzdWx0aW5nIGNvZGUgcGFyc2VkIGJ5IFNXSUcgaXMgdGhlbjoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlYzsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIGludHZlYyB7CiAgICAgICAgICAgICAgICAgIGludCAqZGF0YTsKICAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50dmVjKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgICBpbnQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBpbnR2ZWMgdmVjdG9yPGludD47CgogICAgICAgICAgIE5vdGU6IHRoZSBsYXN0IHR5cGVkZWYgaXMgbm9uLXN0YW5kYXJkIEMgYW5kIGlzIHVzZWQgYnkgU1dJRyB0byBwcm92aWRlCiAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgbmFtZSAiaW50dmVjIiBhbmQgdGhlIHRlbXBsYXRlIHR5cGUgCiAgICAgICAgICAgInZlY3RvcjxpbnQ+Ii4KCiAgICAgICAgICAgQ0FVVElPTjogIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIHRoZSBmaXJzdCB0aW1lIFNXSUcgaGFzCiAgICAgICAgICAgc3VwcG9ydGVkIEMrKyB0ZW1wbGF0ZXMuICAgRXJyb3IgcmVwb3J0aW5nIGlzIGVzc2VudGlhbCBub24tZXhpc3RlbnQuCiAgICAgICAgICAgSXQgd2lsbCBwcm9iYWJseSBicmVhayBpbiBjZXJ0YWluIGNhc2VzLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqKgoKOC8xNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHdyYXBwaW5nIG9mIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cy4gIEFycmF5cwogICAgICAgICAgIGFyZSBub3cgcHJvcGVybHkgbWFwcGVkIHRvIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZgogICAgICAgICAgIG9uZSBsZXNzIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBbMTBdOyAgICAgICAgICAgICAgLS0+ICBpbnQgKgogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdOyAgICAgICAgICAtLT4gIGludCAoKilbMjBdOwogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdWzMwXTsgICAgICAtLT4gIGludCAoKilbMjBdWzMwXTsKCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNlcnRhaW4gU1dJRyBleHRlbnNpb25zIGJlY2F1c2UKICAgICAgICAgICBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgbWFwcGVkIGFsbCBhcnJheXMgaW50byBhIHNpbmdsZQogICAgICAgICAgIHBvaW50ZXIgc3VjaCBhcyAiaW50ICoiLiAgIEFsdGhvdWdoIHBvc3NpYmx5IHVudXN1YWwsIAogICAgICAgICAgIHRoZSBuZXcgdmVyc2lvbiBpcyBjb3JyZWN0IGluIHRlcm1zIG9mIHRoZSBDIHR5cGUgc3lzdGVtLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gQXJyYXkgc2V0dGVycyBnZW5lcmF0ZWQgZm9yIHN0cnVjdC9jbGFzcyBhcnJheSBtZW1iZXJzLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFueSBpbXByb3ZlbWVudHMgdG8gVGNsL1BlcmwvUHl0aG9uIG1vZHVsZXMgdG8gYmV0dGVyCiAgICAgICAgICAgd29yayB3aXRoIG11bHRpcGxlIGludGVyZmFjZSBmaWxlcyBhbmQgdGhlICVpbXBvcnQgZGlyZWN0aXZlLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIGJlaGF2aW9yIG9mICVpbXBvcnQgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgcG9sbHV0ZXMgdGhlIG1vZHVsZSBuYW1lc3BhY2UgYnkgdXNpbmcKICAgICAgICAgICAnZnJvbSBtb2R1bGUgaW1wb3J0IConIHRvIHJlZmVyIHRvIHRoZSBvdGhlciBtb2R1bGUuIAogICAgICAgICAgIEluc3RlYWQsIGl0IGRvZXMgYSBwcm9wZXIgJ2ltcG9ydCBtb2R1bGUnLiAgIEFsc28sIFNXSUcKICAgICAgICAgICBtYXkgd29yayBhIGxvdCBiZXR0ZXIgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcyB0aGF0IGluY2x1ZGUKICAgICAgICAgICByZWZlcmVuY2VzIHRvIG90aGVyIGltcG9ydGVkIG1vZHVsZXMuCgo4LzEzLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIG5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxpemluZyB0aG9zZSBvZiB0aGUKCSAgIEd1aWxlLXNwZWNpZmljIDUvMjcvMjAwMSBjaGFuZ2VzOiAKCSAgICogJGRlc2NyaXB0b3IgaXMgdGhlIHNhbWUgYXMgU1dJR1RZUEUkbWFuZ2xlLCBidXQgYWxzbwoJICAgICBlbnN1cmVzIHRoYXQgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGlzIG5hbWUgZ2V0cwoJICAgICBkZWZpbmVkLgoJICAgKiAkKnR5cGUsICQqbHR5cGUsICQqbWFuZ2xlLCAkKmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IHN0YXIsIGJ1dCB0aGV5IFJFTU9WRSBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgZnJvbSB0aGUgdHlwZS4gKFRoaXMgaXMgb25seSB2YWxpZCBmb3IgcG9pbnRlciAKCSAgICAgdHlwZXMuKQoJICAgKiAkJnR5cGUsICQmbHR5cGUsICQmbWFuZ2xlLCAkJmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IGFtcGVyc2FuZCwgYnV0IHRoZXkgQUREIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyB0byB0aGUgdHlwZS4KCSAgIFRoZSBHdWlsZS1zcGVjaWZpYyBzdWJzdGl0dXRpb24gJGJhc2VkZXNjcmlwdG9yIHdhcyByZW1vdmVkCgkgICBiZWNhdXNlIGl0IHdhcyB1c2VsZXNzLgoKOC8xMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVleHRlcm4gZGlyZWN0aXZlIGlzIG5vdyBkZXByZWNhdGVkIGFuZCB3aXRoZHJhd24uICBUaGUKICAgICAgICAgICBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlIHdhcyB0byBpbXBvcnQgc2VsZWN0ZWQgZGVmaW5pdGlvbnMKICAgICAgICAgICBmcm9tIG90aGVyIGludGVyZmFjZSBmaWxlcyBhbmQgaGVhZGVycy4gIEhvd2V2ZXIsIHRoZSBzYW1lCiAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoICVpbXBvcnQuICAgVGhpcwogICAgICAgICAgIGxlYXZlcyBTV0lHIHdpdGggdHdvIGZpbGUgaW5jbHVzaW9uIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVpbmNsdWRlIGZpbGVuYW1lICAgICAtIEluc2VydHMgaW50byBjdXJyZW50IGludGVyZmFjZQogICAgICAgICAgICAgICVpbXBvcnQgZmlsZW5hbWUgICAgICAtIEltcG9ydCB0eXBlcyBhbmQgY2xhc3NlcyBmcm9tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kdWxlCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbmV3IHN1cHBvcnQgZm9yIHdyYXBwaW5nIEMvQysrIGNhbGxiYWNrIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgQSBjb21tb24gcHJvYmxlbSB3aXRoIHNvbWUgQyBsaWJyYXJpZXMgaXMgdGhhdCBtYW55CiAgICAgICAgICAgZnVuY3Rpb25zIHRha2UgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgaW50ICgqb3ApKGludCxpbnQpLCAuLi4pOwoKICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgb25seSB3YXkgdG8gY2FsbCBzdWNoIGEgZnVuY3Rpb24gaXMgdG8KICAgICAgICAgICBwYXNzIGl0IGEgZnVuY3Rpb24gcG9pbnRlciBvZiBzb21lIGNvbXBhdGlibGUgdHlwZS4gIEluCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgeW91IGhhZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0KICAgICAgICAgICB3aXRoIHNvbWUgcmVhbGx5IGdyb3NzIGhhY2tzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrLAoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsIGludCk7CgogICAgICAgICAgIHlvdSBoYWQgdG8gaW5zdGFsbCBhIHBvaW50ZXIgdG8gaXQgYXMgYSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIAoKICAgICAgICAgICAgICAgY29uc3QgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgaWYgeW91IGhhZCBhIHJlYWxseSBvbGQgU1dJRyB2ZXJzaW9uOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpPUF9GVU5DKShpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgT1BfRlVOQywgLi4uKTsKICAgICAgICAgICAgICAgY29uc3QgT1BfRlVOQyBGT08gPSBmb287CgogICAgICAgICAgIAogICAgICAgICAgIE5vdywgeW91IGNhbiBkbyBvbmUgb2YgdHdvIHRoaW5nczoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgZm9vKGludCxpbnQpOwoKICAgICAgICAgICBUaGlzIGNyZWF0ZXMgYSBjb25zdGFudCAnZm9vJyBvZiB0eXBlIGludCAoKikoaW50LGludCkuCiAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb25zIGFyZSBpbnN0YWxsZWQgYXMgY29uc3RhbnRzIHdoZXJlCiAgICAgICAgICAgdGhlIG5hbWUgaXMgZGVmaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZyBnaXZlbiB0byAlY2FsbGJhY2soKS4KICAgICAgICAgICBJZiB0aGUgbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGRpZmZlciBmcm9tIHRoZQogICAgICAgICAgIGFjdHVhbCBmdW5jdGlvbiBuYW1lLCBib3RoIGEgZnVuY3Rpb24gd3JhcHBlciBhbmQgYSBjYWxsYmFjayAKICAgICAgICAgICBjb25zdGFudCBhcmUgY3JlYXRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlKHVwcGVyKXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CiAgICAgICAgICAgCiAgICAgICAgICAgQ3JlYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnMgJ2ZvbycsICdiYXInIGFuZCBhZGRpdGlvbmFsbHkKICAgICAgICAgICBjcmVhdGVzIHR3byBjYWxsYmFjayBjb25zdGFudHMgJ0ZPTycsICdCQVInLgoKICAgICAgICAgICBOb3RlOiBTV0lHIHN0aWxsIGRvZXMgbm90IHByb3ZpZGUgYXV0b21hdGljIHN1cHBvcnQgZm9yIAogICAgICAgICAgIHdyaXRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIHN0cnVjdCBuZXN0aW5nIGZpeGVzIGFzIHBlciBTRiBidWcgIzQ0NzQ4OC4KCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlbmFtZSBkaXJlY3RpdmUgbm93IGFwcGxpZXMgdG8gY29uc3RhbnRzIGNyZWF0ZWQgd2l0aAogICAgICAgICAgICNkZWZpbmUgYW5kICVjb25zdGFudC4gIEhvd2V2ZXIsIG1vc3QgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgIHdlcmUgbmV2ZXIgd3JpdHRlbiB0byBzdXBwb3J0IHRoaXMgYW5kIHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgIG1vZGlmaWVkIHRvIG1ha2UgaXQgd29yay4gIFRjbCwgUHl0aG9uLCBhbmQgUGVybCBtb2R1bGVzCiAgICAgICAgICAgYXJlIHdvcmtpbmcgbm93LgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hc3NpdmUgY2hhbmdlcyBhbmQgc2ltcGxpZmljYXRpb24gb2YgQyBkZWNsYXJhdGlvbiBwYXJzaW5nLgogICAgICAgICAgIEFsdGhvdWdoIFNXSUcgaXMgc3RpbGwgbm90IGEgZnVsbCBDIHBhcnNlciwgaXRzIGFiaWxpdHkKICAgICAgICAgICB0byBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgaW5jbHVkaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBwb2ludGVycyB0byBhcnJheXMgaGFzIGJlZW4gdmFzdGx5IGltcHJvdmVkLiAgCgo4LzAzLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogRGlzdHJpYnV0aW9uIGZpeGVzOiBhdXRvY29uZiBubyBsb25nZXIgbmVlZGVkIHRvIGluc3RhbGwgU1dJRy4KCjgvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgdHdvIHVuZG9jdW1lbnRlZCBwYXJzaW5nIGZlYXR1cmVzLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICBzdXBwb3J0cyBvdXQtb2YtY2xhc3Mgc3RhdGljIGZ1bmN0aW9uIG9yIHZhcmlhYmxlCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RhdGljIGludCBGb286OmJhcjsKCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIG1heSByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudCBkZW1hbmQuIAogICAgICAgICAgIEhvd2V2ZXIsIHNpbmNlIFNXSUcgaXMgbW9zdCBvZnRlbiB1c2VkIHdpdGggaGVhZGVyIGZpbGVzLAogICAgICAgICAgIGl0IGlzIG1vcmUgbGlrZWx5IGZvciB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSBpbmNsdWRlZAogICAgICAgICAgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQ2xlYW51cCBvZiB0aGUgR0lGUGxvdCBleGFtcGxlcy4gVXBncmFkZWQgSmF2YSBHSUZQbG90IGV4YW1wbGUuCgo4LzAxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gRWZmaWNpZW5jeSBjaGFuZ2VzOiBfY1B0ciB1c2VkIHdoZXJlIHBvc3NpYmxlIHJhdGhlciB0aGFuCgkgICAgIGdldENQdHIoKS4gQnVnIGZpeGVzIGZvciBpbmhlcml0YW5jZSAtIGRlcml2ZWQgY2xhc3Mgc29tZXRpbWVzCgkgICAgIGRpZG4ndCBkZWxldGUgdGhlIGMgbWVtb3J5IHdoZW4gX2RlbGV0ZSgpIHdhcyBjYWxsZWQuCgkgICAqIFtKYXZhXSBBYnN0cmFjdCBjKysgY2xhc3NlcyBhcmUgd3JhcHBlZCB3aXRoIGEgamF2YSBhYnN0cmFjdCBzaGFkb3cKCSAgICAgY2xhc3MuIEFsc28gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gaXMgbWFwcGVkIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLgoJICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBoYXMgYWx3YXlzIGJlZW4gPG1vZHVsZT5fd3JhcC5jLiBJdCBpcyBub3cKCSAgICAgPG1vZHVsZT5fd3JhcC5jeHggaWYgdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uIGlzIHBhc3NlZCB0byBzd2lnLgoJICAgICBUaGlzIGhhcyBiZWVuIGRvbmUgYXMgb3RoZXJ3aXNlIGMrKyBjb2RlIHdvdWxkIGFwcGVhciBpbiBhIGMgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCgo3LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSB0byBiZSBtb3JlIEMtbGlrZSBpbiBzeW50YXguCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBub3c6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IE5BTUUgPSBWQUxVRTsKICAgICAgICAgICAgICAgICVjb25zdGFudCBUWVBFIE5BTUUgPSBWQUxVRTsKIAogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBGb28gKkJhciA9ICZTcGFtOwoKICAgICAgICAgICBBIG1vcmUgc3VidGxlIGNhc2UgaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gYmxhaDsKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBNb2R1bGVzIHRoYXQgd2VyZSB1c2luZwogICAgICAgICAgIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIGRpcmVjdGx5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkIGZvcm0gb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgJWlubGluZSBpbnQgYmxhaChpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAogICAgICAgICAgIChub3RlOiB0aGlzIGZlYXR1cmUgd2FzIG5ldmVyIGRvY3VtZW50ZWQgYW5kIGlzIHdpdGhkcmF3bikKCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gZXhwbGljaXRseSBkZWNsYXJlZAogICAgICAgICAgIHJldHVybiB0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBmb28oaW50KTsKCiAgICAgICAgICAgSW4gQywgc3VjaCBmdW5jdGlvbnMgd2VyZSBpbXBsaWNpdGx5IGFzc3VtZWQgdG8gcmV0dXJuIGFuICdpbnQnLgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyBpbGxlZ2FsLiAgRWl0aGVyIHdheSwgaXQncyBjb25zaWRlcmVkIGJhZAogICAgICAgICAgIHN0eWxlLiAgUmVtb3Zpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBTV0lHIHdpbGwgc2ltcGxpZnkKICAgICAgICAgICBjZXJ0YWluIGlzc3VlcyBpbiBwYXJzaW5nLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8zMC8yMDAxOiBta29lcHBlCgkgICAqIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rLiAgVGhlIFNvdXJjZS9ET0ggZGlyZWN0b3J5CgkgICAgIGFuZCBtb3N0IG9mIHRoZSBTb3VyY2UvU3dpZyBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZSBub3cuCgkgICAqIFtHdWlsZV0gJXNjaGVtZSBpcyBub3cgYSBtYWNybyBmb3IgJWluc2VydCgic2NoZW1lIikuICAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgIkZJTEVOQU1FIjsgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICV7IFNDSEVNRS1DT0RFICV9CgkgICAgIE5ldyBtYWNyb3MgJW11bHRpcGxlX3ZhbHVlcywgJXZhbHVlc19hc19saXN0LAoJICAgICAldmFsdWVzX2FzX3ZlY3Rvci4gCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIFNXSUcgcHJhZ21hcy4KICAgICAgICAgICAlcHJhZ21hKHN3aWcpIHJlYWRvbmx5IGFuZCAlcHJhZ21hKHN3aWcpIHJlYWR3cml0ZS4gIE1hY3JvcwogICAgICAgICAgIGFyZSB1c2VkIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVwcmFnbWEgZGlyZWN0aXZlLiAgJXByYWdtYSBtdXN0IGFsd2F5cwogICAgICAgICAgIGJlIGRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXByYWdtYShzd2lnKSBtYWtlX2RlZmF1bHQ7CiAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJibGFoLmkiOwoKICAgICAgICAgICBBbHNvIGV4dGVuZGVkIHRoZSBwcmFnbWEgZGlyZWN0aXZlIHRvIGFsbG93IGNvZGUgYmxvY2tzCiAKICAgICAgICAgICAgICAlcHJhZ21hKGZvbykgY29kZSA9ICV7CiAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIHdheSAnY29uc3QnIHZhcmlhYmxlcyBhcmUgd3JhcHBlZC4gIEluIAogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGEgJ2NvbnN0JyB2YXJpYWJsZSB3YXMKICAgICAgICAgICB3cmFwcGVkIGFzIGEgY29uc3RhbnQuICAgTm93LCAnY29uc3QnIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMuICBUaGVyZSBhcmUgc2V2ZXJhbAogICAgICAgICAgIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSwgbW9zdGx5IHBlcnRhaW5pbmcgdG8KICAgICAgICAgICBzdWJ0bGUgZGV0YWlscyBvZiBob3cgJ2NvbnN0JyBhY3R1YWxseSB3b3Jrcy4gCgogICAgICAgICAgIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbGQgaW50ZXJmYWNlcyB0aGF0IHVzZWQgJ2NvbnN0JwogICAgICAgICAgIHRvIGNyZWF0ZSBjb25zdGFudHMuICAgQXMgYSByZXBsYWNlbWVudCwgY29uc2lkZXIgdXNpbmcgdGhpczoKCiAgICAgICAgICAgY29uc3QgaW50IGEgPSA0OyAgID09PT4gICAlY29uc3RhbnQgaW50IGEgPSA0OwogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVvcmdhbml6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uIG9mIHR5cGUgcGFyc2luZy4KICAgICAgICAgICBUeXBlcyB3aXRoICdjb25zdCcgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG5vdy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vc3Qgc3dpZyBkaXJlY3RpdmVzIHJlbGF0ZWQgdG8gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCiAgICAgICAgICAgYXJlIG5vdyBkZXByZWNhdGVkLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBpbiBvcmRlciB0byBzaW1wbGlmeQogICAgICAgICAgIHBhcnNlciByZWNvbnN0cnVjdGlvbi4gIFdpbGwgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKICAgICAgICAgICBkZW1hbmQuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDb2RlIGluY2x1c2lvbiBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgcGFyc2VyLiAgQSBjb21tb24KICAgICAgICAgICBkaXJlY3RpdmUgJWluc2VydCBpcyBub3cgdXNlZCBmb3IgZXZlcnl0aGluZy4gIFRoaXMKICAgICAgICAgICBpbnNlcnRzIGEgZmlsZSBpbnRvIHRoZSBvdXRwdXQ6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgImZvby5zd2ciCgogICAgICAgICAgIFRoaXMgaW5zZXJ0cyBzb21lIGlubGluZSBjb2RlIGludG8gdGhlIG91dHB1dAoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICV7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAKICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhlcmUgYXJlIGZpdmUgcHJlZGVmaW5lZCB0YXJnZXRzIGZvciB0aGUgaW5zZXJ0IGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICJoZWFkZXIiICAgIC0gSGVhZGVyIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJydW50aW1lIiAgIC0gUnVudGltZSBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAid3JhcHBlciIgICAtIFdyYXBwZXIgc2VjdGlvbgogICAgICAgICAgICAgICAiaW5pdCIgICAgICAtIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICJudWxsIiAgICAgIC0gTm90aGluZy4gRGlzY2FyZC4KCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGFyZSBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBhcmUKICAgICAgICAgICBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWNyb3M6CgogICAgICAgICAgICAgICAleyAuLi4gJX0gICAgICAgICAgIC0+ICVpbnNlcnQoaGVhZGVyKSAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVpbml0ICV7IC4uLiAlfSAgICAgLT4gJWluc2VydChpbml0KSAgICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXdyYXBwZXIgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHdyYXBwZXIpICV7IC4uLiAlfQogICAgICAgICAgICAgICAlcnVudGltZSAleyAuLi4gJX0gIC0+ICVpbnNlcnQocnVudGltZSkgJXsgLi4uICV9CgogICAgICAgICAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgbmFtZWQgdGFyZ2V0cyBieSB1c2luZyB0aGUKICAgICAgICAgICBDIEFQSSBmdW5jdGlvbiBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoKSAoc2VlIG1haW4uY3h4KS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBleHBvc2UgYSBzaGFkb3cgY2xhc3MgZmlsZSwKICAgICAgICAgICB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCJzaGFkb3ciLCBmX3NoYWRvdyk7CgogICAgICAgICAgIFRoZW4gaW4gdGhlIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgICAlaW5zZXJ0KHNoYWRvdykgJXsgLi4uICV9CgogICAgICAgICAgIE5vdGU6IHRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IGFueSBvbGQgaW50ZXJmYWNlcywgYnV0CiAgICAgICAgICAgZG9lcyBvcGVuIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciBlbmhhbmNlbWVudHMuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhbHdheXMgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgJ3N3aWcuc3dnJy4KICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucwogICAgICAgICAgIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiB2YXJpb3VzIFNXSUcgZGlyZWN0aXZlcy4KICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgU1dJRyBkaXJlY3RpdmVzIHdlcmUgaGFuZGxlZCBhcyBzcGVjaWFsCiAgICAgICAgICAgY2FzZXMgaW4gdGhlIHBhcnNlci4gIFRoaXMgbWFkZSB0aGUgcGFyc2VyIGEgbGFyZ2UgCiAgICAgICAgICAgYmxvYXRlZCBtZXNzLiAgTm93LCB0aGUgcGFyc2VyIGlzIHN0cmlwcGVkIGRvd24gdG8gYSBmZXcKICAgICAgICAgICBzaW1wbGUgZGlyZWN0aXZlcyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBldmVyeXRoaW5nIGVsc2UuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBGaXhlcyBmb3IgU291cmNlZm9yZ2UgYnVnICM0NDQ3NDggLSBuZXcgdGVzdGNhc2UgY3BwX3N0YXRpYzoKCSAgICAgW1RDTF0gQ2xhc3Mgd2l0aCBqdXN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUvZnVuY3Rpb24gZml4CgkgICAgIFtKYXZhXSBGaXhlZCBzdGF0aWMgdmFyaWFibGVzIHN1cHBvcnQKCSAgICAgW1J1YnldIFN0YXRpYyB2YXJpYWJsZXMgd29ya2Fyb3VuZCByZW1vdmVkCgo3LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogc3R5cGUuYyAoU3dpZ1R5cGVfZGVmYXVsdCk6IFN0cmlwIHF1YWxpZmllcnMgZmlyc3QuIFRoZQoJICAgICBkZWZhdWx0IHR5cGUgb2YgImludCAqIGNvbnN0IiBpcyBub3cgIlNXSUdQT0lOVEVSICoiLgoJICAgKiBtYWluLmN4eDogRGVmaW5lICJfX2NwbHVzcGx1cyIgaW4gU1dJRydzIHByZXByb2Nlc3NvciBpZgoJICAgICBpbiBDKysgbW9kZS4KCSAgICogW0d1aWxlXTogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBhcnJheXMgYW5kIEMrKwoJICAgICByZWZlcmVuY2VzLCBmaXhpbmcgdGhlICJjb25zdGFudF9wb2ludGVycyIgdGVzdCBjYXNlLgoJICAgKiBNb3ZlZCBtb3N0IHRlc3RzIGZyb20gdGhlIG9sZCBHdWlsZS1zcGVjaWZpYyB0ZXN0LXN1aXRlCgkgICAgIHRvIHRoZSBuZXcgdGVzdC1zdWl0ZS4gIEFsc28gbW92ZWQgcGVybDUvcG9pbnRlci1jeHgKCSAgICAgZXhhbXBsZSB0aGVyZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFRlc3Qtc3VpdGUgYWRkZWQuCgkgICAqIEluaXRpYWwgdGVzdGNhc2VzOiBjb25zdGFudF9wb2ludGVycyBjcHBfZW51bSBkZWZpbmVzCgkgICAgIHNpemVvZl9wb2ludGVycyB1bmlvbnMgdmlydHVhbF9kZXN0cnVjdG9yCgkgICAqIE1ha2UgY2xlYW4gaW1wcm92ZW1lbnRzLgoKNy8yNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIFVuZGVyc2NvcmVzIGluIHRoZSBwYWNrYWdlIG5hbWUgYW5kL29yIG1vZHVsZSBuYW1lCgkgICBubyBsb25nZXIgZ2l2ZSBsaW5raW5nIHByb2JsZW1zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTW9yZSBwYXJzZXIgYnVnIGZpeGVzIGZvciBjb25zdGFudCBwb2ludGVycwoKNy8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV0gQWVzdGhldGljIGltcHJvdmVtZW50IGluIHZhcmlhYmxlIHdyYXBwZXJzLgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBjb3JlLWR1bXAgcHJvYmxlbSBpbiBwb2ludGVyIGxpYnJhcnkgd2hlbiAKICAgICAgICAgICAgIGZyZWVpbmcgY2hhcmFjdGVyIGFycmF5cy4KICAgICAgICAgICAgIFNGIEJ1ZyBbICM0MTU4MzcgXSBwb2ludGVyIGxpYiBjb3JlIGR1bXAKCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgZGVzdHJ1Y3RvcnMgYW5kIHNoYWRvdwogICAgICAgICAgICAgY2xhc3Nlcy4gIFNGIGJ1ZyAjMjIxMTI4LgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBUbyBwcm92aWRlIGJldHRlciBsaW5lLW51bWJlciB0cmFja2luZyBpbiBpbnRlcmZhY2VzCiAgICAgICAgICAgICB3aXRoIGxvdHMgb2YgbWFjcm9zLCBzcGVjaWFsIGxvY2F0b3IgY29tbWVudHMgYXJlCiAgICAgICAgICAgICBub3cgZ2VuZXJhdGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvKkBmb28uaSw0MixCTEFIQCovZXhwYW5kZWQgbWFjcm8vKkBAKi8KCiAgICAgICAgICAgICBUaGUgZmlyc3QgLypALi4uQCovIHNlcXVlbmNlIHNldHMgdGhlIGNvbnRleHQKICAgICAgICAgICAgIHRvIHBvaW50IHRvIHRoZSBtYWNybyBjb2RlLiAgVGhlIC8qQEAqLyBjb21tZW50CiAgICAgICAgICAgICB0ZXJtaW5hdGVzIHRoZSBjb250ZXh0LiAgVGhlIFNXSUcgcGFyc2VyIHNob3VsZAogICAgICAgICAgICAgaWdub3JlIGFsbCBvZiB0aGUgbG9jYXRvciBjb21tZW50cyBhcyBzaG91bGQKICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyIChzaG91bGQgc3VjaCBjb21tZW50cyBlbmQgdXAKICAgICAgICAgICAgIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUpLgoKNy8xOC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IGhhbmRsZXMgc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcyBpbgoJICAgdHlwZW1hcHMuICBUaGlzIGludHJvZHVjZWQgYSBuZXcgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LCBidXQKCSAgIG9ubHkgd2l0aCBhIGhldXJpc3RpYyBmdW5jdGlvbi1wb2ludGVyIGNhdGNoLWFsbCBydWxlLiAgCgkgICAqIFtHdWlsZV06IEFkZGVkIHR5cGVtYXBzIGZvciBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzLiAKCSAgICogRml4ZWQgdGhlICJ0ZW1wbGF0ZS13aGl0ZXNwYWNlIiBwcm9ibGVtIGJ5IGNhbm9uaWNhbGl6aW5nCgkgICAgIHdoaXRlc3BhY2UsIGVzcGVjaWFsbHkgYXJvdW5kIGFuZ2xlIGJyYWNrZXRzIGFuZCBjb21tYXMuIAoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEEgU2NoZW1lIGZpbGUgaXMgZW1pdHRlZCBpZiB0aGUgLXNjbXN0dWIgRklMRS5TQ00KCSAgIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgdXNlZC4gIFRoZSAlc2NoZW1lIGRpcmVjdGl2ZQoJICAgKGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIGEgcHJhZ21hKSBhbGxvd3MgdG8gaW5zZXJ0CgkgICBhcmJpdHJhcnkgY29kZSBoZXJlLiAgSW4gInNpbXBsZSIgYW5kICJwYXNzaXZlIiBsaW5rYWdlLAoJICAgdGhlIGZpbGUgZ2V0cyBmaWxsZWQgd2l0aCBkZWZpbmUtbW9kdWxlIGFuZCBleHBvcnQKCSAgIGRlY2xhcmF0aW9ucy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFBhcnNlciBidWcgZml4IHRvIHN1cHBvcnQgY29uc3RhbnQgcG9pbnRlcnMsIGVnIGludCogY29uc3QgcHRyLgoJICAgRml4ZWQgZXZlcnl3aGVyZSAtIHZhcmlhYmxlcywgcGFyYW1ldGVycywgcmV0dXJuIHR5cGVzIGV0Yy4gTm90ZSB0aGF0CgkgICB3aGVuIHdyYXBwaW5nIGEgY29uc3RhbnQgcG9pbnRlciB2YXJpYWJsZSBvbmx5IHRoZSBnZXR0ZXIgaXMgZ2VuZXJhdGVkLgoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIEZpeGVkIFNGIGJ1ZyAjNDQxNDcwICgjZGVmaW5lIFggIi8vIiB3b3VsZCBub3QgYmUgcGFyc2VkLAoJICAgICBzZWUgdGVzdC1zdWl0ZSBlbnRyeSAicHJlcHJvYy0xIiksIHJlcG9ydGVkIGJ5IFQuIFcuIEJ1cnRvbgoJICAgICA8dHdidXJ0b25AdXNlcnMuc2YubmV0Pi4KCSAgICogQ2hhbmdlZCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvICJjaGFyIiwgcmF0aGVyCgkgICAgIHRoYW4gImNoYXIgKiIuICBDaGFuZ2VkIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMKCSAgICAgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgZXhjZXB0IGZvciB0aGUgR3VpbGUgbW9kdWxlLAoJICAgICB3aGVyZSBpdCBpcyBkZXNpcmVkIHRvIG1ha2UgdGhlbSBTY2hlbWUgY2hhcmFjdGVycy4gIFRoaXMKCSAgICAgZml4ZXMgU0YgYnVnICMyMzE0MDksIHRlc3Qtc3VpdGUgZW50cnkgImNoYXItY29uc3RhbnQiLgoJICAgKiBBcHBsaWVkIHBhdGNoIGZvciBET0gvRG9oL21lbW9yeS5jIGJ5IExlcyBTY2hhZmZlcgoJICAgICA8c2NoYWZmZXJAb3B0b25saW5lLm5ldD4gKGF2b2lkIHJlcXVpcmVkIHNpZGUgZWZmZWN0cyBpbgoJICAgICBhc3NlcnQpLiAKCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIGZvciB2aXJ0dWFsIGRlc3RydWN0b3Igd2l0aCB2b2lkIGFzIHBhcmFtZXRlcgoJICAgKiBCdWcgZml4IGluIHBhcnNlciAjZGVmaW5lcyBlbWJlZGRlZCB3aXRoaW4gY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucwoJICAgQ29uc2VxdWVudGx5ICVjb25zdGFudCBjYW4gbm93IGFsc28gYmUgcGxhY2VkIHdpdGhpbiBhIHN0cnVjdC9jbGFzcy91bmlvbi4KCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgdG8gYWxsb3cgc2l6ZW9mKCpJX2FtX2FfcG9pbnRlcikgd2l0aGluIGEgI2RlZmluZQoKNy8xNi8yMDAxOiBta29lcHBlCgkgICAqIEFkZGVkIGNoYW5nZXMgZm9yIHRoZSBNYWNpbnRvc2ggY29udHJpYnV0ZWQgYnkgTHVpZ2kKCSAgIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4gCgkgICAqIFNvbWUgImNvbnN0IiBmaXhlcyBpbiB0aGUgY29kZS4KCSAgICogW0d1aWxlXTogTWFkZSB0aGUgY29uc3RhbnQtd3JhcHBlciBmdW5jdGlvbnMgbXVjaCBzaG9ydGVyLgoKNy8xMy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFNvbWUgImNvbnN0IiBmaXhlcyBmb3IgR3VpbGUgdmVyc2lvbiAxLjMuNC4KCSAgICogSGFuZGxlIGFub255bW91cyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgc3RhdGljCgkgICAgIGFycmF5IG1lbWJlcnMgb2YgY2xhc3Nlcy4gIEJvdGggYnVncyByZXBvcnRlZCBieSBBbm5hbGlzYSBUZXJyYWNpbmEKCSAgICAgPGFubmFsaXNhLnRlcnJhY2luYUBkYXRhbWF0Lml0Pjsgc2VlIHRoZSBmaWxlcwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL3N0YXRpYy1hcnJheS1tZW1iZXIuaSBhbmQKCSAgICAgYW5vbnltb3VzLWFyZy5pLgoKVmVyc2lvbiAxLjMuNiAgKEp1bHkgOSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjcvMDkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IEZPUkVHUk9VTkQgYW5kIEJBQ0tHUk9VTkQgZGVmaW5pdGlvbiBtaXNzaW5nIAoJICAgYWZ0ZXIgVFJBTlNQQVJFTlQgI2RlZmluZSBmaXggaW4gR0lGUGxvdAoKNy8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVycyBzbyB0aGF0IHRoZSByZWxlYXNlIGlzIGtub3duCiAgICAgICAgICAgYXMgMS4zLjYuICBBbGwgZnV0dXJlIHJlbGVhc2VzIHNob3VsZCBoYXZlIGEgc2ltaWxhcgogICAgICAgICAgIHZlcnNpb24gZm9ybWF0LgoKNy8wMi8yMDAxOiBta29lcHBlCgkgICAqIFtQeXRob25dOiBQcmV2ZW50IHRoZSBwcm9ibGVtIG9mIHNlbGYudGhpc293biBub3QgYmVpbmcKCSAgIGRlZmluZWQgaWYgdGhlIEMrKyBjbGFzcyBjb25zdHJ1Y3RvciByYWlzZWQgYW4gZXhjZXB0aW9uLgoJICAgVGhhbmtzIHRvIEx1aWdpIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4KCjYvMjkvMjAwMTogbWtvZXBwZQoJICAgKiBNb3JlIHBvcnRhYmlsaXR5IGZpeGVzOyBmaXhlZCAiZ2NjIC1XYWxsIiB3YXJuaW5ncy4KCjYvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IFRSQU5TUEFSRU5UICNkZWZpbmUgbXVsdGlwbGUgdGltZXMgb24gU29sYXJpcyAKCSAgIChjbGFzaGVzIHdpdGggc3RyZWFtLmgpLgoJICAgKiBNdWx0aXBsZSBkZWZpbml0aW9uIGJ1ZyBmaXggZm9yIHNoYWRvdyBjbGFzc2VzLiBUaGUgcGVybCBhbmQgcHl0aG9uIAoJICAgbW9kdWxlcyBoYWQgd29ya2Fyb3VuZHMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZml4ZXMgaW4gCgkgICB0aGUgY29yZS4gTWFueSBvZiB0aGUgTGFuZ3VhZ2U6OmNwcF94eHh4IGZ1bmN0aW9ucyBub3cgc2V0IGEgCgkgICBmbGFnIHdoaWNoIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIGFjY2VzcyB0aHJvdWdoIAoJICAgaXNfbXVsdGlwbGVfZGVmaW5pdGlvbigpIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBjb2RlIHNob3VsZCBiZSAKCSAgIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIGhhdmUgcHJvZHVjZWQgdmFyeWluZyBkZWdyZWVzIAoJICAgb2YgaW5jb3JyZWN0IHNoYWRvdyBjbGFzcyBjb2RlIGZvciB0aGUgdmFyaW91cyBtb2R1bGVzOgoJICAgY2xhc3MgVGVzdENsYXNzCgkgICB7CgkgICBwdWJsaWM6CgkgICAgIFRlc3RDbGFzcygpIHt9OwoJICAgICBUZXN0Q2xhc3MoaW50IGEpIHt9OwoJICAgICB+VGVzdENsYXNzKCkge307CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KHNob3J0IGspIHt9OwoJICAgICB1bnNpZ25lZCBsb25nIHh5eihpbnQgbikge307CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKCkge307CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKGludCBhKSB7fTsKCSAgIH07CgkgICB2b2lkIGRlbGV0ZV9UZXN0Q2xhc3MoaW50IGEpOwoKNi8yNy8yMDAxOiBta29lcHBlCgkgICAqIFtQZXJsXSBBbm90aGVyIGNvbnN0LXJlbGF0ZWQgcG9ydGFiaWxpdHkgZml4LgoKNi8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEFkZGVkIGluIGNwcF9wcmFnbWEoKSBzdXBwb3J0IHdpdGggYSBob3N0IG9mIG5ldyBwcmFnbWFzIC0gc2VlIAoJICAganN3aWcuaHRtbC4gVGhlc2UgYXJlIGRlc2lnbmVkIGZvciBiZXR0ZXIgbWl4aW5nIG9mIEphdmEgYW5kIGMrKy4gSXQgCgkgICBlbmFibGVzIHRoZSB1c2VyIHRvIHNwZWNpZnkgcHVyZSBKYXZhIGNsYXNzZXMgYXMgYmFzZXMgYW5kL29yIGludGVyZmFjZXMgCgkgICBmb3IgdGhlIHdyYXBwZWQgYy9jKysuCgkgICAqIFtKYXZhXSBPbGQgcHJhZ21hcyByZW5hbWVkLiBXYXJuaW5nIGdpdmVuIGZvciB0aGUgbW9tZW50IGlmIHVzZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LzI1LzIwMDE6IG1rb2VwcGUKCSAgICogSW5jb3Jwb3JhdGVkIG1vcmUgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+IGZvciBzd2lnL3J1Ynkgb24gY3lnd2luLgoKNi8yMC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTWFrZWZpbGUgbW9kcyBzbyB0aGF0ICdtYWtlIGNoZWNrJyB1c2VzIHRoZSBzd2lnIG9wdGlvbnMgaW4gdGhlIG1ha2VmaWxlcwoJICAgKiBbSmF2YV0gUmVtb3ZlZCBHZW5lcmF0aW5nIHdyYXBwZXJzIG1lc3NhZ2UKCSAgICogW0phdmFdIE5VTEwgcG9pbnRlciBidWcgZml4CgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBLYWZmZSBKVk0KCjYvMjAvMjAwMTogbWtvZXBwZQoJICAgKiBTV0lHX1R5cGVRdWVyeSBmcm9tIGNvbW1vbi5zd2cgbm93IHJldHVybnMgYQoJICAgc3dpZ190eXBlX2luZm8qIHJhdGhlciB0aGFuIGEgdm9pZCouICBUaGlzIGZpeGVzIGEgcHJvYmxlbQoJICAgd2hlbiB1c2luZyBwb2ludGVyLmkgYW5kIEMrKywgYXMgaWxsdXN0cmF0ZWQgYnkgdGhlIG5ldwoJICAgdGVzdC1zdWl0ZSBleGFtcGxlIHBlcmw1L3BvaW50ZXItY3h4LgoJICAgKiBQb3J0YWJpbGl0eSBmaXhlcyAoY29uc3QgY2hhciAqKS4gCgkgICAqIEluY29ycG9yYXRlZCBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4sIHdoaWNoIG1ha2Ugc3dpZyBydW5uYWJsZSBvbiBjeWd3aW4uCgo2LzE5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgU0YgYnVnICMyMTExNDQuIFRoaXMgZml4IGlzIGEgd29ya2Fyb3VuZCAKCSAgICAgdW50aWwgZml4ZWQgaW4gdGhlIGNvcmUuCgo2LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogUG9ydGFiaWxpdHkgZml4ZXMgZm9yIHVzZSB3aXRoIHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycy4gCgkgICAqIFtUY2xdOiBQb3J0YWJpbGl0eSBmaXggKGNvbnN0IGNoYXIgKikuCgkgICAqIFtUY2xdOiBDb25maWd1cmUgbm93IGZpcnN0IHRyaWVzIHRvIGZpbmQgYSB0Y2xDb25maWcuc2gKCSAgIGZpbGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgVGNsIGluY2x1ZGUgZGlyZWN0b3J5LCBsaWJyYXJ5CgkgICBsb2NhdGlvbiBhbmQgbGlicmFyeSBuYW1lLgoJICAgKiBbUHl0aG9uXTogQWRkZWQgYSBmZXcgcG9zc2libGUgbGlicmFyeSBsb2NhdGlvbnMuCgo2LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRG9uJ3QgY2FsbCBzY21fY19leHBvcnQgaWYgbm90aGluZyBpcyB0byBiZQoJICAgICBleHBvcnRlZC4gIERvbid0IHdhcm4gb24gJW1vZHVsZSBpZiBtb2R1bGUgaGFzIGJlZW4gc2V0CgkgICAgIGFscmVhZHkgKHRoaXMgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiAlaW1wb3J0IGlzIHVzZWQpLgoKNi8xNi8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IE5ldyAicGFzc2l2ZSIgbGlua2FnZSwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgZm9yCgkgICAgIG11bHRpLW1vZHVsZSBleHRlbnNpb25zIHdpdGhvdXQgR3VpbGUgbW9kdWxlIG1hZ2ljLgoKNi8xNS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEZpeGVkIHByaW50aW5nIG9mIHNtb2JzIChzcGFjZSBhbmQgYW5nbGUgd2VyZQoJICAgICBtaXNzaW5nKS4gCgkgICAqIFByb3Blcmx5IGdlbmVyYXRlIHR5cGUgaW5mb3JtYXRpb24gZm9yIGJhc2UgY2xhc3NlcwoJICAgICBpbXBvcnRlZCB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoYW5rcyB0byBNYXJjZWxvCgkgICAgIE1hdHVzIDxtbWF0dXNAYWNtcy5hcml6b25hLmVkdT4gZm9yIHRoZSByZXBvcnQgYW5kIHRoZQoJICAgICBwYXRjaDsgdGhpcyBjbG9zZXMgU0YgYnVnICMyMzE2MTk7IHNlZSBhbHNvCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvaW1wb3J0Ki4gCgkgICAqIFtHdWlsZV06IEZpeCBjYXN0aW5nIGJldHdlZW4gY2xhc3MgYW5kIGJhc2UgY2xhc3M7IHRoZQoJICAgICBydW50aW1lIHR5cGUgc3lzdGVtIGhhZCBpdCB0aGUgd3Jvbmcgd2F5IGFyb3VuZDsgc2VlCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvY2FzdHMuaQoJICAgKiBNYWtlIHR5cGVtYXBzIGZvciBTV0lHUE9JTlRFUiAqIHdpdGggYXJnIG5hbWUgdGFrZQoJICAgICBwcmVjZWRlbmNlIG92ZXIgdGhvc2Ugd2l0aG91dCBhcmcgbmFtZSwgdG8gbWF0Y2ggbm9ybWFsCgkgICAgIHR5cGVtYXAgcHJlY2VkZW5jZSBydWxlcy4KCSAgICogRml4ZWQgdGhlIHJhbmRvbS1saW5lLW51bWJlcnMgcHJvYmxlbSByZXBvcnRlZCBhcyBTRiBidWcKCSAgICAgIzIxNzMxMDsgdGhhbmtzIHRvIE1pY2hhZWwgU2NoYXJmIDxzY2hhcmZAdXNlcnMuc2YubmV0Pi4KCSAgICogW0d1aWxlXTogSGFuZGxlIHRoZSAlbmFtZSBhbmQgJXJlbmFtZSBkaXJlY3RpdmVzLgoJICAgKiBOZXcgc3ludGF4OiAlbmFtZSBhbmQgJXJlbmFtZSBub3cgb3B0aW9uYWxseSB0YWtlIGRvdWJsZQoJICAgICBxdW90ZXMgYXJvdW5kIHRoZSBzY3JpcHRpbmcgbmFtZS4gIFRoaXMgaXMgdG8gYWxsb3cgc2NyaXB0aW5nCgkgICAgIG5hbWVzIHRoYXQgYXJlbid0IHZhbGlkIEMgaWRlbnRpZmllcnMuCgo2LzE0LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWRlIGEgbWlub3IgY2hhbmdlIHRvIHRoZSB3YXkgZmlsZXMgYXJlIGxvYWRlZCBpbgogICAgICAgICAgIG9yZGVyIHRvIGdldCBmaWxlL2xpbmUgbnVtYmVyIHJlcG9ydGluZyBjb3JyZWN0IGluCiAgICAgICAgICAgdGhlIHByZXByb2Nlc3Nvci4KCjYvMTQvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyB0aGUgKG5vbi1zdGFuZGFyZCkgImxvbmcgbG9uZyIKCSAgICAgdHlwZXMuIEl0IGlzIHVwIHRvIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgdG8KCSAgICAgcHJvdmlkZSB0eXBlbWFwcyBpZiBuZWVkZWQuIFJlcG9ydGVkIGJ5IFNhbSBTdGVpbmdvbGQsIFNGCgkgICAgIGJ1ZyAjNDI5MTc2LgoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyBhcmd1bWVudHMgbGlrZSAiY29uc3QgaW50ICoKCSAgICAgY29uc3QgaSIuIFRoaXMgZml4ZXMgU0YgYnVnICMyMTU2NDkuCgkgICAqIEZpeGVkIHRoZSBHdWlsZSB0ZXN0LXN1aXRlLgoKNi8xMy8yMDAxOiBta29lcHBlCgkgICBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuayBhdCB0YWcKCSAgICJta29lcHBlLW1lcmdlLTEiLiBUaGlzIGNvdmVycyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6Cgp8IDAxLzE2LzAxOiB0dG4KfAkgICBXcm90ZSB0YWJsZSBvZiBjb250ZW50cyBmb3IgRG9jL2VuZ2luZWVyaW5nLmh0bWwuICBBZGRlZCBzZWN0aW9uCnwJICAgb24gQ1ZTIHRhZ2dpbmcgY29udmVudGlvbnMuICBBZGRlZCBjb3B5cmlnaHQgdG8gb3RoZXIgZG9jcy4KfCA5LzI1LzAwIDogYmVhemxleQp8IAkgICBNb2RpZmllZCB0aGUgcHJlcHJvY2Vzc29yIHNvIHRoYXQgbWFjcm8gbmFtZXMgY2FuIHN0YXJ0IHdpdGggYSAnJScuCnwgCSAgIFRoaXMgbWF5IGFsbG93IG5ldyBTV0lHICJkaXJlY3RpdmVzIiB0byBiZSBkZWZpbmVkIGFzIG1hY3JvcyBpbnN0ZWFkCnwgCSAgIG9mIGhhdmluZyB0byBiZSBoYXJkLWNvZGVkIGludG8gdGhlIHBhcnNlci4gIAp8CnwgKioqIEFsc28gYSB5ZXQtdG8tYmUtZG9jdW1lbnRlZCBxdW90aW5nIG1lY2hhbmlzbSB3aXRoIGJhY2txdW90ZXMKfCAqKiogaGFzIGJlZW4gaW1wbGVtZW50ZWQ/Cgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAqIFdoZW4gY29uZmlndXJlIGRvZXMgbm90IGZpbmQgYSBsYW5ndWFnZSwgZG9uJ3QgdXNlIGRlZmF1bHQKCSAgIHBhdGhzIGxpa2UgL3Vzci9sb2NhbC9pbmNsdWRlOyB0aGlzIG9ubHkgY2F1c2VzIGJ1aWxkCgkgICBwcm9ibGVtcy4KCSAqIE5ldyBkaXJlY3Rvcnk6IEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUsIHdoZXJlIGEgZmV3CgkgICBidWdzIGluIDEuM2E1IGFyZSBkZW1vbnN0cmF0ZWQuIAoJICogSGFuZGxlIEMrKyBtZXRob2RzIHRoYXQgaGF2ZSBib3RoIGEgImNvbnN0IiBhbmQgYSAidGhyb3ciCgkgICBkaXJlY3RpdmUgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL2NwbHVzcGx1cy10aHJvdy5pKTsgCgkgICB0aGFua3MgdG8gU2NvdHQgQi4gRHJ1bW1vbmRzIGZvciB0aGUgcmVwb3J0IGFuZCB0aGUgZml4LiAKCSAqIEhhbmRsZSBDKysgcG9pbnRlci1yZWZlcmVuY2UgYXJndW1lbnRzIChsaWtlICJpbnQgKiYgYXJnIikgCgkgICAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvcG9pbnRlci1yZWZlcmVuY2UuaSwKCSAgIHJlcG9ydGVkIGFzIFNGIGJ1ZyAjNDMyMjI0KS4KCSAqIFtSdWJ5XSBGaXhlZCB0eXBvIGluIHJ1YnlkZWMuc3dnOyB0aGFua3MgdG8gTHlsZSBKb2huc29uIQoJICogRG9uJ3Qgc3RvcCB0ZXN0aW5nIHdoZW4gb25lIHRlc3QgZmFpbHMuCgkgKiBbR3VpbGUsIE16U2NoZW1lXSBEb24ndCBwcmludCAiR2VuZXJhdGluZyB3cmFwcGVycy4uLiIuCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVkVDVE9STEVOSU5QVVQgYW5kIExJU1RMRU5JTlBVVCBub3cgaGF2ZSBzZXBhcmF0ZQoJICAgbGlzdCBsZW5ndGggdmFyaWFibGVzLiBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUCgkgICBhdHRhY2hlcyBhcmd1bWVudCBkb2N1bWVudGF0aW9uIGludm9sdmluZyBTQ01fVFlQRSB0byB0aGUKCSAgIHN0YW5kYXJkIHBvaW50ZXIgdHlwZW1hcHMuIElOT1VUIGlzIG5vdyBhbiBhbGlhcyBmb3IgQk9USC4KCjYvMTIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBTb21lIEphdmEgZG9jdW1lbnRhdGlvbiBhZGRlZC4KCSAgIFtKYXZhXSBGaXhlZCBidWdzIGluIGltcG9ydCBwcmFnbWEgYW5kIHNoYWRvdyBwcmFnbWEuIAoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBGaXggZGVjbGFyYXRpb25zIG9mIFNXSUdfZGVmaW5lX2NsYXNzCgkgICAoTGliL3J1YnkvcnVieWRlYy5zd2cpIGFuZCBTV0lHX1R5cGVRdWVyeQoJICAgKExpYi9jb21tb24uc3dnKS4gVGhhbmtzIHRvIEx5bGUgSm9obnNvbgoJICAgPGxqb2huc29uQHJlc2dlbi5jb20+IGZvciB0aGUgcGF0Y2hlcy4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBVc2UgbG9uZyBpbnN0ZWFkIG9mIHNjbV9iaXRzX3Q7IHRoaXMgbWFrZXMgdGhlCgkgICBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGNvbXBhdGlibGUgd2l0aCBHdWlsZSAxLjMuNAoJICAgYWdhaW4uIFRoYW5rcyB0byBNYXNha2kgRnVrdXNoaW1hIGZvciBwb2ludGluZyB0aGlzIG91dC4KCjYvMTEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBUaGUgZ2VuZXJpYyBJTlNUQUxMIGZpbGUgZnJvbSBhdXRvY29uZiBhZGRlZC4gRmV3IGNoYW5nZXMgdG8gUkVBRE1FIGZpbGUuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIEZpeGVkIHR5cG8gaW4gTWFrZWZpbGUuaW47IHRoYW5rcyB0byBHcmVnIFRyb3hlbAoJICAgPGdkdEBpci5iYm4uY29tPi4gCgo2LzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgbWFrZSBjaGVjayB3b3JrcyBhZ2Fpbi4gRXhhbXBsZXMvR0lGUGxvdCBjb25maWd1cmUgZ2VuZXJhdGVkIGJ5CgkgICB0b3AgbGV2ZWwgYXV0b2NvbmYgbm93LgoKNi8wOC8yMDAxOiBta29lcHBlCgkgICBBbm90aGVyIGJ1aWxkIGNoYW5nZTogVGhlIG5ldyBzY3JpcHQgYXV0b2dlbi5zaCBydW5zCgkgICBhdXRvY29uZiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMuICBUaGUgdG9wLWxldmVsCgkgICBjb25maWd1cmUgYWxzbyBjb25maWd1cmVzIGluIEV4YW1wbGVzL0dJRlBsb3QuCgo2LzA3LzIwMDE6IG1rb2VwcGUKCSAgIE1hZGUgdGhlIE1ha2VmaWxlIHdvcmsgd2l0aCBub24tR05VIG1ha2UgYWdhaW4uCgo2LzA3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIENsYXNzL3N0cnVjdCBtZW1iZXJzIHRoYXQgYXJlIGFycmF5cyBvZiBwb2ludGVycyB0byBjbGFzc2VzL3N0cnVjdHMgLQoJICAgU2hhZG93IGNsYXNzJ3MgZ2V0L3NldCBhY2Nlc3NvcnMgbm93IHVzZSBKYXZhIGNsYXNzZXMgaW5zdGVhZCBvZiBsb25ncyAocG9pbnRlcnMpLgoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIHdpbGwgbm93IGNsZWFuIHVwIG1lbW9yeSBpZiBmdW5jdGlvbiByZXR1cm4gdHlwZSAKCSAgIGlzIGEgY2xhc3Mvc3RydWN0LgoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCByZWZlcmVuY2UgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMuCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIE5ldyBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBhbGxvd3MgZm9yCgkgICBhdHRhY2hpbmcgYSBzdWZmaXggdG8gdGhlIHN3aWcgYmluYXJ5IGFuZCB0aGUgc3dpZyBydW50aW1lCgkgICBsaWJyYXJpZXMuICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICAic3dpZwoJICAgLXN3aWdsaWIiIHdvcmtzIGFnYWluLiAgSWYgaW52b2tlZCB3aXRoIHRoZSBuZXcgb3B0aW9uCgkgICAiLWxkZmxhZ3MiLCBTV0lHIHByaW50cyBhIGxpbmUgb2YgbGlua2VyIGZsYWdzIG5lZWRlZCB0bwoJICAgbGluayB3aXRoIHRoZSBydW50aW1lIGxpYnJhcnkgb2YgdGhlIHNlbGVjdGVkIGxhbmd1YWdlCgkgICBtb2R1bGUuIAoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIGdzd2lnX2xpc3RfcCBpcyBhbiBpbnQsIG5vdCBhIFNDTS4gIFRoaXMgdHlwbwoJICAgY2F1c2VkIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggYSBHdWlsZSBjb25maWd1cmVkIHdpdGgKCSAgIHN0cmljdCBDIHR5cGUgY2hlY2tpbmcuIEluIElOUFVUIGFuZCBCT1RIIHR5cGVtYXBzCgkgICBnZW5lcmF0ZWQgYnkgdGhlIFNJTVBMRV9NQVAgbWFjcm8sIHVzZSB0aGUgU0NNX1RPX0MKCSAgIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBHdWlsZSB0byBDIChyYXRoZXIgdGhhbiBDX1RPX1NDTSkuCgkgICBVc2Ugc2NtX2ludHByaW50IHRvIHByaW50IHBvaW50ZXJzIChyYXRoZXIgdGhhbgoJICAgc3ByaW50ZikuIEFsbG93IHVzaW5nICItbGlua2FnZSIgaW5zdGVhZCBvZiAiLUxpbmthZ2UiLiAKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gTW9kcyBmb3IgdXNpbmcgaW5oZXJpdGVkIGMrKyBjbGFzc2VzIGZyb20gSmF2YQoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCBjbGFzcyBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcwoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBkZXN0cnVjdG9yIChfZGVsZXRlKCkpIHdhcyBub3QgYXdhcmUgb2YgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgbm90IGtub3cgYWJvdXQgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgZXh0ZW5kIGV2ZW4gd2hlbiB0aGUgYmFzZWNsYXNzIHdhcyBub3Qga25vd24gdG8gc3dpZwoJICAgW0phdmFdIHNvbWV0aW1lcyBlbnVtLWRlY2xhcmF0aW9ucyBvY2N1cmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzMvMDAgIDogdHRuCiAgICAgICAgICBBZGRlZCBpbnN0cnVjdGlvbnMgZm9yIG1haW50YWluZXJzIGluIEV4YW1wbGVzL1JFQURNRSBvbiBob3cKICAgICAgICAgIHRvIG1ha2UgZXhhbXBsZXMgYWxzbyBiZSB1c2VmdWwgaW4gdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICAgQWxzbywgIm1ha2UgY2hlY2siIG5vdyB1c2VzIC4vTGliIGJ5IHZpYSBlbnYgdmFyIGBTV0lHX0xJQicuCiAgICAgICAgICBUaGlzIGlzIG92ZXJyaWRhYmxlIGxpa2Ugc286CiAgICAgICAgICAgICBtYWtlIGNoay1zd2lnbGliPS9teS9leHBlcmltZW50YWwvc3dpZy9MaWIgY2hlY2sKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAkdHlwZW1hcCB2YXJpYWJsZSB0byB0eXBlbWFwcy4gIFRoaXMgZ2V0cyByZXBsYWNlZCB3aXRoCiAgICAgICAgICBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB0eXBlbWFwIHRoYXQgaXMgYXBwbGllZC4gIEZlYXR1cmUKICAgICAgICAgIHJlcXVlc3QgZnJvbSByc2Fsei4KCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBFeHBlcmltZW50YWwgb3B0aW1pemF0aW9uIHRvIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdmlydHVhbAogICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIHR3byBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgQSgpIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIGNsYXNzIEIoKSA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgU3dpZyBub3cgd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGlzCgogICAgICAgICAgICAgICAgQV9mb28oQSAqYSkgewogICAgICAgICAgICAgICAgICAgIGEtPmZvbygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGFuZCB1c2UgaXQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGJvdGggQV9mb28oKSBhbmQgQl9mb28oKS4KICAgICAgICAgIFRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgaWYgYm90aCBtZXRob2RzIGFyZSBkZWNsYXJlZAogICAgICAgICAgYXMgdmlydHVhbCBhbmQgYm90aCB0YWtlIGlkZW50aWNhbCBwYXJhbWV0ZXJzLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlc3RvcmVkIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAgZm9yIHNldHRpbmcgc3RydWN0dXJlIG1lbWJlcnMuCiAgICAgICAgICBVbmxpa2UgdGhlIG9sZCB2ZXJzaW9uLCB0aGUgbmV3IHZlcnNpb24gaXMgZXhwYW5kZWQgaW5saW5lIGluIHRoZQogICAgICAgICAgd3JhcHBlciBmdW5jdGlvbiBhbGxvd2luZyBhY2Nlc3MgdG8gc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBpbnRlcm5hbHMgKGEgc29tZXRpbWVzIHJlcXVlc3RlZCBmZWF0dXJlKS4gVGhlICJtZW1iZXJvdXQiIHR5cGVtYXAKICAgICAgICAgIGlzIGdvbmUuIFVzZSB0aGUgIm91dCIgdHlwZW1hcHMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEF0dHJpYnV0ZSBzZXQgbWV0aG9kcyBubyBsb25nZXIgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIG1lbWJlci4KICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBub3cgZ2V0cyBzZXQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgdm9pZCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgIGYtPnggPSB4OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiBTV0lHMS4xIGl0IHVzZWQgdG8gYmUgdGhpczoKCiAgICAgICAgICAgICAgaW50IEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYtPnggPSB4KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGR1ZSB0byB0aGUgY29tcGxleGl0eSBjcmVhdGVkIGJ5IHRyeWluZwogICAgICAgICAgdG8gZG8gdGhpcyB3aXRoIG1vcmUgZXhvdGljIGRhdGF0eXBlcyBzdWNoIGFzIGFycmF5cy4gIEl0IGFsc28KICAgICAgICAgIGNvbXBsaWNhdGVzIGlubGluaW5nIGFuZCBoYW5kbGluZyBvZiB0aGUgIm1lbWJlcmluIiB0eXBlbWFwLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgcHRyY2FzdCgpIGFuZCBwdHJtYXAoKSBmdW5jdGlvbnMgZnJvbSB0aGUKICAgICAgICAgIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBPbGQgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wYXRpYmxlCiAgICAgICAgICB3aXRoIG5ldyB0eXBlIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVF1ZXJ5KGNvbnN0IGNoYXIgKm5hbWUpIGFkZGVkLgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHRoZSB0eXBlIGluZm8gc3RydWN0dXJlCiAgICAgICAgICB0aGF0IGlzIHVzZWQgZm9yIHR5cGUtY2hlY2tpbmcuICBJdCB3b3JrcyB3aXRoIGVpdGhlciB0aGUKICAgICAgICAgIG5pY2UgQyBuYW1lIG9yIG1hbmdsZWQgdmVyc2lvbiBvZiBhIGRhdGF0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJpbnQgKiIpOwogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJfcF9pbnQiKTsKCiAgICAgICAgICBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IHNvbWUKICAgICAgICAgIGV4b3RpYyBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZQogICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlIG9iamVjdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IGRpcmVjdGl2ZSAldHlwZXMoKSBhZGRlZC4gIFRoaXMgaXMgdXNlZCB0bwogICAgICAgICAgZXhwbGljaXRseSBsaXN0IGRhdGF0eXBlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbgogICAgICAgICAgdGhlIHJ1bnRpbWUgdHlwZS1jaGVja2luZyBjb2RlLiBOb3JtYWxseSBpdCBpcyBuZXZlcgogICAgICAgICAgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGJ1dCBzb21ldGltZXMgYWR2YW5jZWQgZXh0ZW5zaW9ucwogICAgICAgICAgKHN1Y2ggYXMgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5KSBtYXkgbmVlZCB0byBtYW51YWxseQogICAgICAgICAgYWRkIHR5cGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzAwIDogYmVhemxleQogICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygc3RyaW5nIGFycmF5IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsCiAgICAgICAgICBhIGdsb2JhbCB2YXJpYWJsZSBvZiB0aGUgZm9ybSAiY2hhciBuYW1lWzY0XSIgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgbWFuYWdlZCBhcyBhIDY0IGNoYXJhY3RlciBzdHJpbmcuICBQcmV2aW91c2x5IHRoaXMgZGlkbid0CiAgICAgICAgICB3b3JrIGF0IGFsbCBvciByZXF1aXJlZCB0aGUgdXNlIG9mIGEgc3BlY2lhbCB0eXBlbWFwLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFIChUY2wsIFBlcmwsIFB5dGhvbikgKioqCgo4LzMxLzAwIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCBgY2hlY2stYysrLWV4YW1wbGVzJywgd2hpY2ggdXNlcyBuZXcKCSAgZmlsZXMgdW5kZXIgRXhhbXBsZXMvQysrIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuICBOb3cgIm1ha2UKCSAgY2hlY2siIGFsc28gZG9lcyAibWFrZSBjaGVjay1jKystZXhhbXBsZXMiLiAgQWxzbywgZXhwYW5kZWQKCSAgYWN0aW9ucyBpbiBgY2hlY2stZ2lmcGxvdC1leGFtcGxlJyBhbmQgYGNoZWNrLWFsaXZlbmVzcycuCgo4LzMwLzAwIDogbWtvZXBwZQoJICBNYWpvciBjbGVhbi11cCBpbiB0aGUgR3VpbGUgbW9kdWxlLiBBZGRlZCB0eXBlbWFwLWRyaXZlbgoJICBkb2N1bWVudGF0aW9uIHN5c3RlbS4gQ2hhbmdlZCB0byBoYW5kbGUgbW9yZSB0aGFuIDEwCgkgIGFyZ3MuIFVwZGF0ZWQgYW5kIGV4dGVuZGVkIGV4YW1wbGVzLgoJICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVpbnNlcnQgZGlyZWN0aXZlIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCiAgICAgICAgICBpbnRvIGEgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IHdyYXBwZXIgZmlsZS4gIFRoaXMgaXMgb25seSBpbnRlbmRlZAogICAgICAgICAgZm9yIHVzZSBieSB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXb3JrcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXJzKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChydW50aW1lKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydCh3cmFwcGVycykgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChpbml0KSAgICAgImZpbGUuc3dnIjsKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVydW50aW1lIGRpcmVjdGl2ZSB3aGljaCBpbmNsdWRlcyBjb2RlIGludG8gdGhlIHJ1bnRpbWUKICAgICAgICAgIHBvcnRpb24gb2YgdGhlIHdyYXBwZXIgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVydW50aW1lICV7CiAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgaW50ZXJuYWwgcnVudGltZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgVGhlcmUgaXMgbm8gcHJhY3RpY2FsIHJlYXNvbiBmb3Igb3JkaW5hcnkgdXNlcnMgdG8gdXNlIHRoaXMKICAgICAgICAgIGZlYXR1cmUgKGFsbW9zdCBldmVyeXRoaW5nIGNhbiBiZSBkb25lIHVzaW5nICV7IC4uLiAlfQogICAgICAgICAgaW5zdGVhZCkuICAgSG93ZXZlciwgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzIG1heSB3YW50IHRvCiAgICAgICAgICB1c2UgdGhpcyBpbiBsYW5ndWFnZSBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZyBsaXRlcmFscyBsaWtlCiAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICIkdGFyZ2V0ID0gU3ZJVigkc291cmNlKTsiOwoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWx5IGNvbXBpbGUgZXhwZXJpbWVudGFsIGNvZGUgd2l0aCAtLWVuYWJsZS1leHBlcmltZW50CgkgIGNvbmZpZ3VyZSBmbGFnLgoJICBGaXggLmN2c2lnbm9yZSB0byBpZ25vcmUgY29uZmlncnVlICYgeWFjYyBnZW5lcmF0ZWQgZmlsZXMKCjEvMjgvMDAgOiBsb2ljCgkgIEFwcGx5IGF1dG9tYWtlIGV2ZXJ5d2hlcmUKCSAgS2VlcCBjb25maWd1cmUgc2NyaXB0cyBzbyB0aGF0IHBlb3BsZSBhcmUgbm90ICpmb3JjZWQqIHRvIGF1dG9jb25mCiAgICAgICAgICBLZWVwIHNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHlhY2Mgc28gdGhhdCBjb21waWxhdGlvbiB3aXRob3V0IHlhY2MKCSAgaXMgcG9zc2libGUuCgkgIFNvdXJjZS9MUGFyc2UvY3NjYW5uZXIuYzogY2hhbmdlIGx5YWNjLmggaW50byBwYXJzZXIuaCB0byBwbGVhc2UKCSAgZGVmYXVsdCB5YWNjIGdlbmVyYXRpb24gcnVsZXMuCgkgIFVzZSBBQ19DT05GSUdfU1VCRElSUyBpbiBjb25maWd1cmUuaW4gaW5zdGVhZCBvZiBoYW5kIG1hZGUgc2NyaXB0LgoJICBVcGRhdGUgYWxsIHJlbGV2YW50IC5jdnNpZ25vcmUgdG8gaW5jbHVkZSAuZGVwcwoJICBGaXhlZCBtaXNzaW5nIDsgbGluZSAxMzYgU291cmNlL1N3aWcvc3dpZy5oCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBudW1iZXIgb2YgbWlub3IgZW5kLW9mLWZpbGUgcGFyc2luZyBwcm9ibGVtcyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtZnJlZXplIG9wdGlvbiB0aGF0IGZvcmNlcyBTV0lHIHRvIGZyZWV6ZSB1cG9uIGV4aXQuCiAgICAgICAgICBUaGlzIGlzIG9ubHkgdXNlZCBhcyBhIGRlYnVnZ2luZyB0b29sIHNvIHRoYXQgSSBjYW4gbW9yZQogICAgICAgICAgZWFzaWx5IGV4YW1pbmUgU1dJRydzIG1lbW9yeSBmb290cHJpbnQuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gZ3VpbGUgbW9kdWxlIGZvciBzdXBwb3J0aW5nIG9wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGlldGVyIEJhcm9uLgoKMS8xMy8wMCA6IGxvaWMKCSAgQWRkZWQgLmN2c2lnbm9yZSwgRXhhbXBsZXMvLmN2c2lnbm9yZSwgU291cmNlL0RPSC9Eb2gvLmN2c2lnbm9yZQoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogRml4ZWQgLUkgaGFuZGxpbmcgYnVnCgkgIFNvdXJjZS9Nb2R1bGVzMS4xL2phdmEuY3h4OiBmaXhlZCBjaGFyKiAtPiBjb25zdCBjaGFyKiB3YXJuaW5ncyB0aGF0IGFyZQoJICBlcnJvcnMgd2hlbiBjb21waWxpbmcgd2l0aCBnY2MtMi45NS4yCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBjYXN0IGNvbnN0IGNoYXIqIHRvIGNoYXIqIGZvciBTdHJpbmdfcmVwbGFjZQoJICB0b2tlbiBhbmQgcmVwIHNob3VsZCByZWFsbHkgYmUgY29uc3QuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgSGFyY28ncyBKYXZhIG1vZHVsZXMuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmV2b2tlZCB0aGUgJWlmZGVmLCAlaWZuZGVmLCAlZW5kaWYsICVpZiwgJWVsaWYsIGFuZCAlZWxzZQogICAgICAgICAgZGlyZWN0aXZlcy4gIFRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGFzIFNXSUcgbm93IGhhcyBhIHJlYWwKICAgICAgICAgIHByZXByb2Nlc3Nvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vdmVkIHRoZSBkb2N1bWVudGF0aW9uIG1vZHVsZXMgZnJvbSB0aGUgU1dJRyBkaXJlY3RvcnkKICAgICAgICAgIHRvIHRoZSBNb2R1bGVzIGRpcmVjdG9yeSAod2hlcmUgdGhleSByZWFsbHkgc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgdG8gYmVnaW4gd2l0aCkuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXN0YXQgb3B0aW9uIGZvciBwcmludGluZyBzdGF0aXN0aWNzLiBUaGUKICAgICAgICAgIHN0YXRpc3RpY3MgcmVwb3J0aW5nIHdhcyBpbmFkZXF1YXRlIGFuZCBtb3N0bHkgYnJva2VuCiAgICAgICAgICBhbnl3YXkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtdCBvcHRpb24gZm9yIHJlYWRpbmcgYSB0eXBlbWFwIGZpbGUuICBNb3JlCiAgICAgICAgICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gIEp1c3QgaW5jbHVkZSB0eXBlbWFwcyBhdCB0aGUgdG9wCiAgICAgICAgICBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAlY2hlY2tvdXQgZGlyZWN0aXZlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLWNpIG9wdGlvbiBmb3IgZmlsZSBjaGVja2luLiAgIFRvbyBwcm9ibGVtYXRpYwogICAgICAgICAgdG8gaW1wbGVtZW50LiAgUHJvYmFibHkgYmV0dGVyIHRvIGp1c3QgcHV0IHlvdXIgU1dJRyBsaWJyYXJ5CiAgICAgICAgICB1bmRlciBDVlMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWxldGVkIHRoZSBMQVRFWCBtb2R1bGUuICBTb3JyeS4uLiBEaWRuJ3Qga25vdyBhbnlvbmUKICAgICAgICAgIHdobyB3YXMgdXNpbmcgaXQuICBCZXNpZGVzLCBJJ20gbG9va2luZyB0byBzaW1wbGlmeQogICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24gbW9kdWxlIHRvIHVzZSBhIC50eHQKICAgICAgICAgIHN1ZmZpeCBmb3IgaXRzIG91dHB1dCBmaWxlIGluc3RlYWQgb2YgLmRvYy4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCB0aGUgbG9uZy1sb3N0IFNXSUcgcHJlcHJvY2Vzc29yIGJhY2sgdG8gdGhlIHN5c3RlbS4KICAgICAgICAgIEl0IHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBSYXcgcHJlcHJvY2Vzc2VkIG91dHB1dAogICAgICAgICAgY2FuIGJlIHZpZXdlZCB1c2luZyBzd2lnIC1FIGZpbGUuaS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5IGFuZCBkam1pdGNoZQogICAgICAgICAgQ29tcGxldGVseSByZW9yZ2FuaXplZCB0aGUgU1dJRyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgVGhlCiAgICAgICAgICBiYXNpYyBvcmdhbml6YXRpb24gaXMgbm93OgoKICAgICAgICAgICAgICAgIFNvdXJjZS8gICAgICAgICBTV0lHIHNvdXJjZSBjb2RlCiAgICAgICAgICAgICAgICBMaWIvICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIChzd2lnX2xpYikKICAgICAgICAgICAgICAgIERvYy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uCiAgICAgICAgICAgICAgICBFeGFtcGxlcy8gICAgICAgRXhhbXBsZXMKCiAgICAgICAgICBNb3JlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgoKMTIvMDgvOTk6IExvaWMgRGFjaGFyeSAobG9pY0BzZW5nYS5vcmcpCgkgIEVuaGFuY2VkIHBhY2thZ2UgaGFuZGxpbmcgZm9yIHBlcmw1IGFuZCBjKysuCgoJICBXaXRoIG5ldyBvcHRpb24gLWhpZGUgRm9vOjpCYXIsIGV2ZXJ5IHBlcmw1IG9iamVjdCAoRnJvYikgaXMKCSAgcXVhbGlmaWVkIGJ5IEZvbzo6QmFyOjpGcm9iLiBUaGUgcGFja2FnZSBuYW1lIGlzIHNvbGVseSB1c2VkCgkgIHRvIGVuY2Fwc3VsYXRlIEMvQysrIHdyYXBwZXJzIG91dHB1dCBpbiA8bW9kdWxlPl93cmFwLmMgYW5kIHRoZQoJICBjb3JyZXNwb25kaW5nIHBlcmwgcGFja2FnZSBpbiA8bW9kdWxlPi5wbS4gTm90ZSB0aGF0IGEgcGFja2FnZQoJICBuYW1lIG1heSBjb250YWluIDo6IChGcm9iOjpOaXR6KSBhbmQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUKCSAgcGFja2FnZSBuYW1lIHByb3ZpZGVkIGJ5IC1oaWRlIChGb286OkJhcjo6RnJvYjo6Tml0eikuCgoJICBJbiAqX3dyYXAuYywgU1dJR19pbml0IG1hY3JvIGlzIHVzZWQuIFdhcyBwcmV2aW91c2x5IGRlZmluZWQKCSAgYnV0IG5vdCB1c2VkIGFuZCBzaW1wbGlmaWVzIGNvZGUuCgoJICBBZGRlZCB0eXBlbWFwKHBlcmw1LHBlcmw1aW4pIGFuZCB0eXBlbWFwKHBlcmw1LHBlcmw1b3V0KSB0aGF0CgkgIGRvIHRoZSBlcXVpdmFsZW50IG9mIHR5cGVtYXAocGVybDUsaW4pIGFuZCB0eXBlbWFwKHBlcmw1LG91dCkKCSAgYnV0IGNvbnRhaW4gcGVybCBjb2RlIGFuZCBhcHBsaWVzIHRvIHdyYXBwZXJzIGdlbmVyYXRlZCBieQoJICAtc2hhZG93LgoKCSAgTGFja2luZyBwcm9wZXIgcmVncmVzc2lvbiB0ZXN0cyBJIHVzZWQKCSAgRXhhbXBsZXMvcGVybDUve2MrKyxjb25zdHJhaW50LGRlZmFyZyxleGNlcHQsCgkgIGdyYXBoL2dyYXBoWzEyMzRdLG11bHRpbmhlcml0LG5lc3RlZCxzaGFkb3csc2ltcGxlLHRyZWUsCgkgIHR5cGVtYXBzL3thcmd2LGFyZ3YyLGFycmF5bWVtYmVyLGRhdGFiYXNlLGZpbGUsaWdub3JlLGludGVnZXIsCgkgIG91dHB1dCxwYXNzcmVmLHJlZmVyZW5jZSxyZXR1cm59fS8uIEkgcmFuIHN3aWcgd2l0aCBhbmQgd2l0aG91dAoJICB0aGUgcGF0Y2hlcywgZGlmZiB0aGUgZ2VuZXJhdGVkc291cmNlcywgcnVuIHRoZSAucGwgZmlsZXMKCSAgYW5kIGNoZWNrZWQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsLiBJbiBhbGwgdGhvc2UgZXhhbXBsZXMKCSAgSSBoYWQgbm8gZXJyb3IuCgoxMS8yMS85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gcHJvdmlkZSBmdWxsIHZhcmlhYmxlIGxpbmtpbmcgY2FwYWJpbGl0aWVzCiAgICAgICAgICB0byBhbGwgZGF0YXR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIHBhaXIgb2YgYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICB3ZXJlIGNyZWF0ZWQgZm9yIGRhdGF0eXBlcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgVGNsX0xpbmtWYXIoKSBmdW5jdGlvbi4KICAgICAgICAgIE5vdywgd2Ugc2ltcGx5IHVzZSB2YXJpYWJsZSB0cmFjZXMgdG8gc3VwcG9ydCBldmVyeXRoaW5nLiBUaGlzIG1heQogICAgICAgICAgYnJlYWsgc2NyaXB0cyB0aGF0IHJlbHkgdXBvbiB0aGUgb2xkZXIgYmVoYXZpb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzk5OiBBZGRlZCBzbGlnaHQgdHdlYWsgdG8gd3JhcHBlciBnZW5lcmF0b3IgdG8gY29sbGVjdCBsb2NhbCB2YXJpYWJsZXMKICAgICAgICAgIG9mIHNpbWlsYXIgdHlwZS4gIFByb2R1Y2VzIHNvbWV3aGF0IG1vcmUgY29tcGFjdCB3cmFwcGVyIGNvZGUuCgoxMS8yMC85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gdXNlIFNXSUdfR2V0QXJncygpIHRvIHBhcnNlCiAgICAgICAgICBhcmd1bWVudHMuICAgIFRoaXMgaXMgYSB0ZWNobmlxdWUgYm9ycm93ZWQgZnJvbSBQeXRob24gaW4gd2hpY2gKICAgICAgICAgIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHVzaW5nIGEgZm9ybWF0IHN0cmluZyBjb252ZW50aW9uIHNpbWlsaWFyCiAgICAgICAgICB0byBmcHJpbnRmKCkuICAgVGhpcyByZXN1bHRzIGluIGEgKnN1YnN0YW50aWFsKiByZWR1Y3Rpb24gaW4gdGhlCiAgICAgICAgICBzaXplIG9mIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIHdpdGggb25seSBhIG1vZGVzdCBydW50aW1lIG92ZXJoZWFkCiAgICAgICAgICBpbiBnb2luZyB0aHJvdWdoIHRoZSBleHRyYSBjb252ZXJzaW9uIGZ1bmN0aW9uLgoKMTEvMTMvOTk6IENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgY2xhc3Mvc3RydWN0dXJlIGdlbmVyYXRpb24gY29kZSBmb3IgdGhlCiAgICAgICAgICBUY2wgbW9kdWxlLiAgTm93LCBhIHNtYWxsIHNldCBvZiBydW50aW1lIGZ1bmN0aW9ucyBhcmUgdXNlZAogICAgICAgICAgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgY2xhc3NlcyAoaW5zdGVhZCBvZiBhCiAgICAgICAgICBtYXNzaXZlIGFtb3VudCBvZiBydW50aW1lIGNvZGUgYmVpbmcgZ2VuZXJhdGVkIGZvciBlYWNoIGNsYXNzKS4KICAgICAgICAgIENsYXNzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHNpbXBseSBlbmNvZGVkIGluIGEgc2VyaWVzIG9mCiAgICAgICAgICBzdGF0aWMgdGFibGVzLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpIVUdFKiByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLS1lc3BlY2lhbGx5IGZvciBDKysuCgoxMS8xMy85OTogUmVtb3ZlZCB0aGUgLXRjbCAoVGNsIDcueCkgbW9kdWxlLiAgVGNsIDguMCBpcyBub3cgc2V2ZXJhbAogICAgICAgICAgeWVhcnMgb2xkIGFuZCB0aGUgZGVmYWN0byBzdGFuZGFyZC0tbm8gcmVhbCByZWFzb24gdG8ga2VlcAogICAgICAgICAgc3VwcG9ydGluZyB0aGUgb2xkIHZlcnNpb24gYXQgdGhpcyBwb2ludC4KCjExLzEzLzk5OiBDbGVhbmVkIHVwIC1jIG9wdGlvbiBmb3IgUHl0aG9uIG1vZHVsZS4gIFRoZSBweWV4cC5zd2cgZmlsZQogICAgICAgICAgaXMgbm93IGdvbmUuCgoxMS8xMy85OTogRml4ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb25zIHRvIHdvcmsgYmV0dGVyIHdpdGggc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9uIFdpbmRvd3MuICBTdGF0aWMgbGlua2luZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIGJ5IGRlZmluaW5nCiAgICAgICAgICB0aGUgLURTVEFUSUNfTElOSyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBBbGJlcnRvIEZvbnNlY2EuCgoxMS81Lzk5IDogRml4ZWQgYW4gb2JzY3VyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHJlbGF0ZWQgdG8gdGhlIGdlbmVyYXRpb24KICAgICAgICAgIG9mIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgIEJ1ZyByZXBvcnRlZCBieSBCcmFkIENsZW1lbnRzLgoKMTEvNS85OSA6IEZpeGVkIGEgZmV3IG1lbW9yeSBwcm9ibGVtcyBmb3VuZCBieSBwdXJpZnkuCgoxMS81Lzk5IDogT2ZmaWNpYWxseSBkZXByZWNhdGVkIHRoZSAtaHRjbCwgLWh0aywgYW5kIC1wbHVnaW4gb3B0aW9ucwogICAgICAgICAgZnJvbSB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxMC8yNi85OTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgZnJvbSBweXRob24vdHlwZW1hcHMuaS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBLZWl0aCBEYXZpZHNvbi4KCjgvMTYvOTkgOiBBZGRlZCBfV0lOMzIgc3ltYm9sIHRvIGxpYnJhcmllcyB0byBiZXR0ZXIgc3VwcG9ydCBXaW5kb3dzLgoKOC8xNi85OSA6IERlcHJlY2F0ZWQgdGhlIFBlcmw0IG1vZHVsZS4gICBJdCBpcyBubyBsb25nZXIgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgICBkaXN0cmlidXRpb24gYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJbiB0aGUgZW50aXJlIDMgeWVhcnMgU1dJRwogICAgICAgICAgaGFzIGJlZW4gYXJvdW5kIEkgbmV2ZXIgcmVjZWl2ZWQgYSBzaW5nbGUgY29tbWVudCBhYm91dCBpdCBzbyBJJ20KICAgICAgICAgIGFzc3VtaW5nIG5vIG9uZSB3aWxsIG1pc3MgaXQuLi4KCjgvMTYvOTkgOiBNb2RpZmllZCB0aGUgdHlwZS1jaGVja2luZyBjb2RlIHRvIHJlZ2lzdGVyIHR5cGUgbWFwcGluZ3MgdXNpbmcgYQogICAgICAgICAgdGFibGUgaW5zdGVhZCBvZiByZXBlYXRlZCBjYWxscyB0byBTV0lHX1JlZ2lzdGVyTWFwcGluZygpLiAgVGhpcwogICAgICAgICAgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNvbWV3aGF0LgoKOC8xNS85OSA6IENsZWFuZWQgdXAgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2luZyBjb2RlIGluIHRoZSBUY2wgbW9kdWxlLgoKOC8xNS85OSA6IE1hbnkgY2hhbmdlcyB0byB0aGUgbGlicmFyaWVzIHRvIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMuCgo4LzEzLzk5IDogRWxpbWluYXRlZCBDKysgY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBleHRlcm4gIkMiIGxpbmthZ2UuCgo4LzEzLzk5IDogU29tZSBjbGVhbnVwIG9mIFB5dGhvbiAuc3dnIGZpbGVzIHRvIGJldHRlciBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICBvbiBXaW5kb3dzLgoKOC8xMy85OSA6IE1vZGlmaWVkIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZSB0byBhdHRhY2ggcHJhZ21hcyBkZWNsYXJlZCBpbnNpZGUKICAgICAgICAgIGEgY2xhc3MgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MgaXRzZWxmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgJXByYWdtYShweXRob24pIGFkZHRvbWV0aG9kID0gImluc2VydDpwcmludCBgaGVsbG8gd29ybGQnIgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgTW9zdCBwZW9wbGUgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBob3cgdGhpcyB3b3Jrcy4gIEZvciBwZW9wbGUKICAgICAgICAgIHdyaXRpbmcgYmFja2VuZCBtb2R1bGVzLCBjbGFzcy1iYXNlZCBwcmFnbWFzIHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBsYW5nLT5jcHBfb3Blbl9jbGFzcygpICAgICAgICAgICAgIC8vIE9wZW4gYSBjbGFzcwogICAgICAgICAgICAgIGxhbmctPmNwcF9wcmFnbWEoKSAgICAgICAgICAgICAgICAgLy8gU3VwcGx5IHByYWdtYXMKICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgbWVtYmVycwoKICAgICAgICAgICAgICBsYW5nLT5jcHBfY2xvc2VfY2xhc3MoKSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjbGFzcwoKICAgICAgICAgIEFsbCBvZiB0aGUgcHJhZ21hcyBhcmUgcGFzc2VkIGZpcnN0IHNpbmNlIHRoZXkgbWlnaHQgYmUgdXNlZCB0bwogICAgICAgICAgYWZmZWN0IHRoZSBjb2RlIGdlbmVyYXRpb24gb2Ygb3RoZXIgbWVtYmVycy4gICBQbGVhc2Ugc2VlCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZSBmb3IgYW4gZXhhbXBsZS4gICBQYXRjaGVzIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMy85OSA6IFBhdGNoIHRvIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byBlbGltaW5hdGUgaWdub3JlZAogICAgICAgICAgZXhjZXB0aW9uIGVycm9ycyBpbiBkZXN0cnVjdG9ycy4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMS85OSA6IE1pbm9yIHBhdGNoIHRvIHN3aWdfbGliL3B5dGhvbi9zd2lncHRyLnN3ZyAgKGFkZGVkIFNXSUdTVEFUSUMKICAgICAgICAgIGRlY2xhcmF0aW9uKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEx5bGUgSm9obnNvbi4KCjgvMTEvOTkgOiBBZGRlZCBGSVJTVEtFWS9ORVhUS0VZIG1ldGhvZHMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjgvMTEvOTkgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgcmV0dXJuZWQKICAgICAgICAgIGFuZCBwYXNzZWQgYXMgJ05vbmUuJyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4KCjgvMTAvOTkgOiBGaXhlZCBtaXNzaW5nICdpbnQnIHNwZWNpZmllcnMgaW4gdmFyaW91cyBwbGFjZXMuCgo4LzEwLzk5IDogQWRkZWQgV2luZG93cyBtYWtlZmlsZSBmb3IgUnVudGltZSBsaWJyYXJpZXMuICBDb250cmlidXRlZAogICAgICAgICAgYnkgQm9iIFRlY2hlbnRpbi4KCjgvMTAvOTkgOiBGaXhlZCBtaW5vciBwcm9ibGVtIGluIFB5dGhvbiBydW50aW1lIG1ha2VmaWxlIGludHJvZHVjZWQKICAgICAgICAgIGJ5IGtleXdvcmQgYXJndW1lbnRzLgoKOC84Lzk5ICA6IENoYW5nZWQgJHRhcmdldCBvZiBwZXJsNShvdXQpIHR5cGVtYXAgZnJvbSBTVCgwKSB0bwogICAgICAgICAgU1QoYXJndmkpLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiBGaXhlZCBidWcgaW4gdHlwZW1hcCBjaGVja2luZyByZWxhdGVkIHRvIHRoZSBBTlkga2V5d29yZAogICAgICAgICAgaW4gYXJyYXlzIGFuZCBpZ25vcmVkIGFyZ3VtZW50cy4gIEVycm9yIHJlcG9ydGVkIGJ5CiAgICAgICAgICBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6ICVlbmFibGVkb2MgYW5kICVkaXNhYmxlZG9jIGRpcmVjdGl2ZXMgY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICBpbnNpZGUgY2xhc3Mvc3RydWN0dXJlIGRlZmluaXRpb25zLiAgIEhvd2V2ZXIsIG5vIGNoZWNrCiAgICAgICAgICBpcyBtYWRlIHRvIHNlZSBpZiB0aGV5IGFyZSBiYWxhbmNlZCAoaS5lLiwgYSAlZGlzYWJsZWRvYwogICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBhIG1hdGNoaW5nCiAgICAgICAgICAlZW5hYmxlZG9jIGluIHRoZSBzYW1lIGNsYXNzKS4KCjgvOC85OSAgOiBLZXl3b3JkIGFyZ3VtZW50IGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIFB5dGhvbgogICAgICAgICAgbW9kdWxlLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhjaGFyICpiYXIsIGludCBzcGFtLCBkb3VibGUgeCk7CgogICAgICAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcwoKICAgICAgICAgICAgICAgZm9vKHggPSAzLjQsIGJhcj0iaGVsbG8iLCBzcGFtPTQyKQoKICAgICAgICAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHJ1biBTV0lHIHdpdGggdGhlICcta2V5d29yZCcgY29tbWFuZAogICAgICAgICAgbGluZSBvcHRpb24uICAgIE1peGluZyBrZXl3b3JkIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgc2hvdWxkIHdvcmsgYXMgd2VsbC4gICBVbm5hbWVkIGFyZ3VtZW50cyBhcmUgYXNzaWduZWQgbmFtZXMKICAgICAgICAgIHN1Y2ggYXMgImFyZzEiLCAiYXJnMiIsIGV0Yy4uLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgRnVuY3Rpb25zIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIHN1Y2ggYXMKICAgICAgICAgIGJhcihpbnQgKk9VVFBVVCwgaW50ICpPVVRQVVQpIHdpbGwgbGlrZWx5IGNhdXNlIHByb2JsZW1hdGljCiAgICAgICAgICB3cmFwcGVyIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLiAgIFRvIGZpeCB0aGlzLCAgdXNlIGRpZmZlcmVudAogICAgICAgICAgbmFtZXMgb3IgdXNlICVhcHBseSB0byBtYXAgdHlwZW1hcHMgdG8gYWx0ZXJuYXRlIG5hbWVzLgoKOC84Lzk5ICA6IEhhbmRsaW5nIG9mIHRoZSAndGhpcycgcG9pbnRlciBoYXMgYmVlbiBjaGFuZ2VkIGluIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBQcmV2aW91c2x5LCBkZXJlZmVyZW5jaW5nIG9mICcudGhpcycgb2NjdXJlZCBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBzaGFkb3cgY2xhc3MgaXRzZWxmLiAgIE5vdywgdGhpcyBzdGVwIG9jY3VycyBpbiB0aGUgQwogICAgICAgICAgd3JhcHBlcnMgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgICBTV0lHX0dldFB0ck9iaihQeU9iamVjdCAqLCB2b2lkICoqcHRyLCBjaGFyICp0eXBlKQoKICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHBvaW50ZXIKICAgICAgICAgIG9yIGEgc2hhZG93IGNsYXNzIGluc3RhbmNlIHdpdGggYSAnLnRoaXMnIGF0dHJpYnV0ZSBvZgogICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZS4gIFRoaXMgY2hhbmdlIGFsbG93cyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgIDEuICBUaGUgcmVhbCBzaGFkb3cgY2xhc3MgaW5zdGFuY2UgZm9yIGFuIG9iamVjdCBpcwogICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgQyB3cmFwcGVycyB3aGVyZSBpdCBjYW4gYmUgZXhhbWluZWQvbW9kaWZpZWQKICAgICAgICAgICAgICBieSB0eXBlbWFwcy4KCiAgICAgICAgICAyLiAgSGFuZGxpbmcgb2YgZGVmYXVsdC9rZXl3b3JkIGFyZ3VtZW50cyBpcyBub3cgZ3JlYXRseQogICAgICAgICAgICAgIHNpbXBsaWZpZWQuCgogICAgICAgICAgMy4gIFRoZSBQeXRob24gd3JhcHBlciBjb2RlIGlzIG11Y2ggbW9yZSBzaW1wbGUuCgogICAgICAgICAgUGx1cywgaXQgZWxpbWluYXRlZCBtb3JlIHRoYW4gMzAwIGxpbmVzIG9mIEMrKyBjb2RlIGluIHRoZQogICAgICAgICAgUHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAqKiogQ0FWRUFUIDogVGhpcyByZXF1aXJlcyB0aGUgYWJzdHJhY3Qgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgIEl0IHNob3VsZCB3b3JrIHdpdGggUHl0aG9uIDEuNCwgYnV0IHByb2JhYmx5IG5vdGhpbmcgb2xkZXIKICAgICAgICAgIHRoYW4gdGhhdC4KCgo4LzgvOTkgIDogRml4ZWQgaGFuZGxpbmcgb2YgImNvbnN0IiBhbmQgcG9pbnRlcnMgaW4gY2xhc3Nlcy4gIEluIHBhcnRpY3VsYXIsCiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcwoKICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptc2c7CiAgICAgICAgICAgICBjb25zdCBpbnQgICppcHRyOwogICAgICAgICAgfQoKICAgICAgICAgIGFyZSBoYW5kbGVkIGFzIGFzc2lnbmFibGUgdmFyaWFibGVzIGFzIG9wcG9zZWQgdG8gY29uc3RhbnQKICAgICAgICAgIHZhbHVlcyAodGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciBpbiBDL0MrKykuICAgTm90ZToKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzICJjaGFyICpjb25zdCBtc2ciIGFyZSBzdGlsbCB1bnN1cHBvcnRlZC4KICAgICAgICAgIENvbnN0YW50cyBkZWNsYXJlZCBhdCB0aGUgZ2xvYmFsIGxldmVsIHVzaW5nIGNvbnN0IGFyZSBhbHNvCiAgICAgICAgICBicm9rZW4gKGJlY2F1c2UgSSBoYXZlIGEgbnVtYmVyIG9mIGludGVyZmFjZXMgdGhhdCByZWx5IHVwb24KICAgICAgICAgIHRoaXMgYmVoYXZpb3IpLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0CiAgICAgICAgICBtaXN0YWtlbmx5IHRyZWF0ICdjb25zdCBjaGFyIConIHR5cGVzIGFzIGNvbnN0YW50IHZhbHVlcy4KCjgvOC85OSAgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHN1cHBvcnQgYml0LWZpZWxkcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19rZXl3b3JkIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfZXh0ZXJuICA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX3N0YXRpYyAgOiAxOwogICAgICAgICAgfSBmbGFnczsKCiAgICAgICAgICBCaXQtZmllbGRzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gaW50ZWdlciB0eXBlcyBhbmQgdGhlaXIKICAgICAgICAgIGFyZSBvdGhlciByZXN0cmljdGlvbnMuICBTV0lHIHBlcmZvcm1zIG5vIHN1Y2ggdHlwZS1jaGVja2luZwogICAgICAgICAgKGFsdGhvdWdoIHRoZSBDIGNvbXBpbGVyIHdpbGwgY2F0Y2ggcHJvYmxlbXMgd2hlbiBpdCB0cmllcyB0bwogICAgICAgICAgY29tcGlsZSB0aGUgd3JhcHBlciBjb2RlKS4KCjgvOC85OSAgOiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlIG9mICRiYXNldHlwZSBzdWJzdGl0dXRpb24gaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgJXR5cGVtYXAocHl0aG9uLCBhcmdvdXQpIHNwYW0qKiBPVVRQVVR7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgY2hhciogYSA9ICIkYmFzZXR5cGVfcCI7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICB9CgogICAgICAgICAgKFBhdGNoIHN1Z2dlc3RlZCBieSBOYXRoYW4gRHVuZmllbGQpLgoKNi8yMi85OSA6IE1hZGUgYSB2ZXJ5IHNsaWdodCB0d2VhayB0byB0aGUgUGVybDUgc2hhZG93IGNsYXNzCiAgICAgICAgICBjb2RlIHRoYXQgYWxsb3dzIHR5cGVtYXBzIHRvIGFsdGVyIHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgb2Ygb2JqZWN0cyAodG8gc3VwcG9ydCBwb2x5bW9ycGhpYyB0eXBlcykuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgRHJha2UgRGllZHJpY2guCgo0LzgvOTkgIDogRml4ZWQgbnVsbCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsIG1vZHVsZS4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjMvMTcvOTkgOiBGaXhlZCBidWcgaW4gcGVybDVwdHIuc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR3JlZyBBbmRlcnNvbi4KCjIvMjcvOTkgOiBFbGltaW5hdGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIFN3aWcgcnVucyBvbgogICAgICAgICAgZW1wdHkgZmlsZXMuCgoyLzI3Lzk5IDogQWRkZWQgcGF0Y2ggdG8gR3VpbGUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB1bnVzZWQKICAgICAgICAgIHZhcmlhYmxlcy4gICBDb250cmlidXRlZCBieSBNaWtlIFNpbW9ucy4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgcmV0dXJuaW5nIHJlZmVyZW5jZXMuCgoyLzI3Lzk5IDogRml4ZWQgUnVudGltZS9NYWtlZmlsZS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkKICAgICAgICAgIE1pa2UgUm9tYmVyZy4KCjIvMjcvOTkgOiBJbmNvcnBvcmF0ZWQgcGF0Y2hlcyB0byB0aGUgdHlwZS1jaGVja2VyLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAtZXhwb3J0YWxsIHN3aXRjaCBhbmQgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIGluIFBlcmw1IG1vZHVsZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjIvMjcvOTkgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgdG8gcmVjb2duaXplICd1bmRlZicgYXMgYSBOVUxMIGNoYXIgKi4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgUGVybDUgbW9kdWxlIHRvIHN1cHBvcnQgdGhlIG5ld2VyIHZlcnNpb25zIG9mCiAgICAgICAgICBBY3RpdmVTdGF0ZSBQZXJsIGZvciBXaW4zMi4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgaW5jbHVkZSBvcmRlciBvZiBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgIC1JIG9wdGlvbi4KCjIvNS85OC0gOiBEYXZlIGZpbmlzaGVzIGhpcyBkaXNzZXJ0YXRpb24sIGdvZXMgam9iIGh1bnRpbmcsIG1vdmVzIHRvCjIvNS85OSAgICBDaGljYWdvIGFuZCBnZW5lcmFsbHkgdGhyYXNoZXMgYWJvdXQuCgpWZXJzaW9uIDEuMSBQYXRjaCA1IChGZWJydWFyeSA1LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2x5IGxpbmsgdmVyc2lvbnMgb2YgUHl0aG9uIDEuNS4gICAgVG8gbWFrZSBpdCB0aGUgZGVmYXVsdCwKICAgICAgICAgIHNpbXBseSBjb3B5ICdzd2lnX2xpYi9weXRob24vZW1iZWQxNS5pJyB0byAnc3dpZ19saWIvcHl0aG9uL2VtYmVkLmknCgpWZXJzaW9uIDEuMSBQYXRjaCAzIChOb3ZlbWJlciAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2l0aCBzaGFkb3cgY2xhc3NlcyBhbmQKICAgICAgICAgIHN0YXRpYyBjbGFzcyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gY2xhc3MgaW5zdGFuY2VzLgogICAgICAgICAgTm90ZSA6IFRoZSBmaXggZm9yIHRoaXMgYnVnIHJlcXVpcmVzIGEgc2xpZ2h0IHJlc3RydWN0dXJpbmcgb2YKICAgICAgICAgIG9mIHRoZSAucG0gZmlsZXMgY3JlYXRlZCBieSBTV0lHLgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2wvVGNsOCBtb2R1bGVzIHJlbGF0ZWQgdG8gdmFyaWFibGUgbGlua2luZwogICAgICAgICAgb2YgY2hhcmFjdGVyIGFycmF5cy4gIElmIHlvdSBkZWNsYXJlZCBhIGdsb2JhbCB2YXJpYWJsZSAnY2hhciBmb29bMTBdJywKICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIHdvdWxkIGVpdGhlciBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdAogICAgICAgICAgaW1tZWRpYXRlbHkgdXBvbiBsb2FkaW5nIG9yIHdlaXJkIG1lbW9yeSBjb3JydXB0aW9uIGVsc2V3aGVyZS4KICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdyBiZSBmaXhlZCBhbHRob3VnaCBjaGFyYWN0ZXIgYXJyYXlzIGNhbiBvbmx5IGJlCiAgICAgICAgICByZWFkLW9ubHkuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgdGhhdCBjYXVzZWQgaXQgdG8KICAgICAgICAgIGZhaWwgaWYgZmlsZXMgd2VyZSBpbXBvcnRlZCBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4KICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgoKMTEvMjMvOTc6IEZpeGVkIGluY29ycmVjdCBkaWFnbm9zdGljIG1lc3NhZ2UgaW4gdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24KICAgICAgICAgIG1vZHVsZS4KCjExLzIzLzk3OiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgLW8gb3B0aW9uIHdoZW4gdXNlZCB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gSWYgLW8gd2FzIHVzZWQgdG8gc3BlY2lmeSBib3RoIHRoZSBwYXRobmFtZSBhbmQgZmlsZW5hbWUKICAgICAgICAgIG9mIFNXSUcncyBvdXRwdXQgc3VjaCBhcwoKICAgICAgICAgICAgICAgICBzd2lnIC1vIC9ob21lL3N3aWcvd3JhcHBlci5jIC1zaGFkb3cgLXBlcmw1IGZvby5pCgogICAgICAgICAgVGhlIHdyYXBwZXIgY29kZSB3b3VsZCBiZSBwbGFjZWQgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLW8sCiAgICAgICAgICBidXQgdGhlIC5wbSBmaWxlIGFuZCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIHBsYWNlZCBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSBTV0lHIHdhcyBydW4uICAgTm93LCB0aGVzZSBmaWxlcyBhcmUgcGxhY2VkCiAgICAgICAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggdGhlIC1vIG9wdGlvbi4KICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGFsc28gbmVlZGVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIG9uIHRoZQogICAgICAgICAgTWFjaW50b3NoLgoKMTEvMjMvOTc6IEFkZGVkIGEgJ3RoaXMoKScgbWV0aG9kIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIHJldHVybiB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUgZnJvbSBhIHNoYWRvdwogICAgICAgICAgY2xhc3MgdGhhdCBpcyByZXByZXNlbnRlZCBhcyBhIHRpZWQgaGFzaC4gICBUbyB1c2UganVzdAogICAgICAgICAgaW52b2tlIGFzIGEgbWV0aG9kIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICRsID0gbmV3IExpc3Q7ICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICRwdHIgPSAkbC0+dGhpcygpOyAgICMgR2V0IHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZQoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsIDggcG9pbnRlci5pIGxpYnJhcnkgZmlsZSAod2hpY2ggd2FzIGNvbXBsZXRlbHkKICAgICAgICAgIGJyb2tlbiBpbiAxLjFwMikuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIFBlcmw1IHR5cGUtY2hlY2tlciB0byBmaXggYSBmZXcgcHJvYmxlbXMKICAgICAgICAgIHdpdGggZ2xvYmFsIHZhcmlhYmxlcyBvZiBwb2ludGVyIHR5cGVzIGFuZCB0byBhbGxvdwogICAgICAgICAgdGllZCBoYXNoZXMgdG8gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aXRoIG5vcm1hbAogICAgICAgICAgcG9pbnRlciB2YWx1ZXMuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWVjaGFuaXNtIHRvIGFsbG93IG91dHB1dAogICAgICAgICAgdHlwZW1hcHMgb2YgdHlwZSAndm9pZCcuICAgVGhlc2Ugd2VyZSBpZ25vcmVkIHByZXZpb3VzbHksCiAgICAgICAgICBidXQgbm93IGlmIHlvdSBzcGVjaWZ5LAoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGxhbmcsb3V0KSB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2b2lkIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIG9yIGFzc2lnbiBhIHJldHVybiB2YWx1ZSB0byB0aGUgZnVuY3Rpb24uCgoxMS8yMy85NzogRml4ZWQgcHJvY2Vzc2luZyBvZiAnYm9vbCcgZGF0YXR5cGVzIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMTEvMjMvOTc6IEZpeGVkIG1pbm9yIHBhcnNpbmcgZXJyb3Igd2l0aCBDKysgaW5pdGlhbGl6ZXJzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgQigpIDogQSgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2w4IG1vZHVsZSBzbyB0aGF0IEMgZnVuY3Rpb25zIHRoYXQgY2FsbCBiYWNrIGludG8KICAgICAgICAgIFRjbCBkb24ndCBjb3JydXB0IHRoZSByZXR1cm4gcmVzdWx0IG9iamVjdCAoU1dJRyB3YXMgZ2F0aGVyaW5nCiAgICAgICAgICB0aGUgcmVzdWx0IG9iamVjdCB0b28gZWFybHkgd2hpY2ggbGVhZHMgdG8gcHJvYmxlbXMgaWYgc3Vic2VxdWVudAogICAgICAgICAgVGNsIGNhbGxzIGFyZSBtYWRlKS4KCjExLzIzLzk3OiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gdGhlIFB5dGhvbiBtb2R1bGUgd2hlbiB0d28gb3IKICAgICAgICAgIG1vcmUgb3V0cHV0IHBhcmFtZXRlcnMgd2VyZSB1c2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudHMgb2YgYQogICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVpbmNsdWRlIHR5cGVtYXBzLmkKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKk9VVFBVVCwgZG91YmxlICpPVVRQVVQsIGRvdWJsZSBhKTsKCiAgICAgICAgICBQcmV2aW91c2x5LCBkb2luZyB0aGlzIHJlc3VsdGVkIGluIHRoZSBjcmVhdGlvbiBvZiBhbgogICAgICAgICAgZXh0cmFuZW91cyBjb21tYSBpbiB0aGUgb3V0cHV0LCByZXN1bHRpbmcgaW4gYSBDIHN5bnRheCBlcnJvci4KCjExLzIyLzk3OiBGaXhlZCBhIGJ1ZyB3aGVuIHRlbXBsYXRlIGhhbmRsaW5nIHRoYXQgd2FzIHN0cmlwcGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICBhcm91bmQgbmVzdGVkIHRlbXBsYXRlcy4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIEZvbzxCYXI8ZG91YmxlPiA+CgogICAgICAgICAgd2FzIGdldHRpbmcgbXVuZ2VkIGludG8gRm9vPEJhcj4+IHdoaWNoIGlzIGEgc3ludGF4IGVycm9yIGluCiAgICAgICAgICBpbiB0aGUgQysrIGNvbXBpbGVyLgoKMTEvMjIvOTc6IEZpeGVkIGJ1Z3MgaW4gdGhlIEJvcmxhbmQgQysrIG1ha2VmaWxlcy4KCjExLzIyLzk3OiBGaXhlZCBtZW1vcnkgY29ycnVwdGlvbiBidWcgd2hlbiBwcm9jZXNzaW5nIGludGVnZXIKICAgICAgICAgIGFyZ3VtZW50cyBpbiBUY2w4IG1vZHVsZS4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUnVudGltZS9NYWtlZmlsZSByZWxhdGVkIHRvIFRjbCA4LgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE5vIGxvbmdlciBnZW5lcmF0ZXMgYSBwZXJsIHN5bnRheCBlcnJvci4KCjExLzkvOTcgOiBDaGFuZ2VkIGEgc3RybmNweSgpIHRvIHN0cmNweSgpIGluIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tlci4KICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluCiAgICAgICAgICB0eXBlLWNoZWNraW5nLgoKMTAvMjkvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBjb2RlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMgYW5kCiAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKFZlY3RvciBhLCBWZWN0b3IgYiA9IGQpOwoKICAgICAgICAgIHNob3VsZCBub3cgd29yayBwcm9wZXJseS4KClZlcnNpb24gMS4xIFBhdGNoIDIgKFNlcHRlbWJlciA0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cmVuY2VzKS4KCjcvNy85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdpdGggbm9uLW1lbWJlcgogICAgICAgICAgZnVuY3Rpb25zIHRoYXQgYXJlIHJldHVybmluZyBtb3JlIHRoYW4gb25lIHZhbHVlLgoKNy83Lzk3ICA6IEluY29ycG9yYXRlZCBtb2RpZmljYXRpb25zIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggR3VpbGUgMS4yLgogICAgICAgICAgU3RpbGwgbmVlZCB0byB0ZXN0IGl0IG91dCwgYnV0IGl0IGlzIHJ1bW9yZWQgdG8gd29yay4KCjcvMi85NyAgOiBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byBvdXRwdXQgYXJndW1lbnRzIGFuZCBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgICBJZiBhbiBvdXRwdXQgYXJndW1lbnQgaXMgZGV0ZWN0ZWQsIFNXSUcgYXNzdW1lcwogICAgICAgICAgdGhhdCB0aGUgcmVzdWx0IGlzIGEgbGlzdCBhbmQgaGFuZGxlcyBpdCBhcHByb3ByaWF0ZWx5LgogICAgICAgICAgSWYgdGhlIG5vcm1hbCByZXR1cm4gdHlwZSBvZiBhbiBmdW5jdGlvbiBpcyBhbiBvYmplY3QsCiAgICAgICAgICBpdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgc2hhZG93IGNsYXNzIGFzIGJlZm9yZSwgYnV0CiAgICAgICAgICB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYQogICAgICAgICAgbGlzdC4gICoqKiBOT1RFIDogVGhpcyBiZWhhdmlvciBoYXMgYmVlbiBzdWJzZXF1ZW50bHkgY2hhbmdlZCAqKioKCjYvMjkvOTcgOiBDaGFuZ2VkIEVYUE9SVCB0byBTV0lHRVhQT1JUIGluIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgIFNob3VsZCBwcm92aWRlIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cy4KCjYvMjkvOTcgOiBNb2RpZmllZCBQeXRob24gc2hhZG93IGNsYXNzZXMgc28gdGhhdCBvdXRwdXQgYXJndW1lbnRzCiAgICAgICAgICB3b3JrIGNvcnJlY3RseSAod2hlbiB0eXBlbWFwcyBhcmUgdXNlZCkuCgpWZXJzaW9uIDEuMSAoSnVuZSAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzI0Lzk3IDogRml4ZWQgT2JqZWN0aXZlLUMgY29uc3RydWN0b3IgYnVnIHdoZW4gd29ya2luZyB3aXRoIFBlcmw1CiAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4KCjYvMjMvOTcgOiBGaXhlZCBzb21lIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCBPYmplY3RpdmUtQy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIG5vdyA6CgogICAgICAgICAgICAgICAtIGZvbyA6IChpbnQpIGEgd2l0aDogKGludCkgYjsKCjYvMjIvOTcgOiBBZGRlZCBTV0lHIFJ1bnRpbWUgbGlicmFyeS4gICBUaGlzIGxpYnJhcnkgY29udGFpbnMKICAgICAgICAgIHRoZSBTV0lHIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucwogICAgICAgICAgdGhhdCBhcmUgbm9ybWFsbHkgaW5jbHVkZWQgaW4gZXZlcnkgbW9kdWxlLiAgQnkgdXNpbmcKICAgICAgICAgIHRoZSBsaWJyYXJ5LCBpdCBpcyBlYXNpZXIgdG8gd29yayB3aXRoIG11bHRpcGxlIFNXSUcKICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIG1pbm9yIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byBzdGF0aWMgbGlua2luZwogICAgICAgICAgb2YgbXVsdGlwbGUgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBzb21lIGJ1Z3Mgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIFdoZW4gdXNlZCB3aXRoCiAgICAgICAgICBQZXJsNSBzaGFkb3cgY2xhc3NlcywgdGhpcyBnZW5lcmF0ZXMgYSAncmVxdWlyZScgc3RhdGVtZW50CiAgICAgICAgICB0byBsb2FkIGluIGV4dGVybmFsIG1vZHVsZXMuCgo2LzIyLzk3IDogQWRkZWQgLXN3aWdsaWIgb3B0aW9uLiAgVGhpcyBwcmludHMgb3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeSBhbmQgZXhpdHMuICBUaGlzIG9wdGlvbiBpcyBvbmx5IHJlYWxseSB1c2VmdWwgdG8KICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG9vbHMgdGhhdCBhcmUgbG9va2luZyBmb3IgU1dJRyBhbmQgaXRzIGxpYnJhcnkKICAgICAgICAgIGxvY2F0aW9uIChlLmcuIGF1dG9jb25mLCBjb25maWd1cmUsIGV0Yy4uLikuCgo2LzIxLzk3IDogRml4ZWQgZXhwb3J0IGJ1ZyB3aXRoIFBlcmw1LjAwNCBvbiBXaW5kb3dzLU5ULgoKNi8yMC85NyA6IE1pbm9yIGNoYW5nZSB0byBjb2RlIGdlbmVyYXRpb24gb2YgY2xhc3Mvc3RydWN0dXJlIG1lbWJlcnMgaW4KICAgICAgICAgIG9yZGVyIHRvIHdvcmsgYmV0dGVyIHdpdGggdHlwZW1hcHMuIFNob3VsZCBoYXZlIG5vIG5vdGljYWJsZQogICAgICAgICAgaW1wYWN0IG9uIGV4aXN0aW5nIFNXSUcgbW9kdWxlcy4KCjYvMTkvOTcgOiBBZGRlZCAtdCBvcHRpb24uIFRoaXMgYWxsb3dzIFNXSUcgdG8gbG9hZCBhIHR5cGVtYXAgZmlsZSBiZWZvcmUKICAgICAgICAgIHByb2Nlc3NpbmcgYW55IGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtdCB0eXBlbWFwcy5pIC1weXRob24gZXhhbXBsZS5pCgogICAgICAgICAgQXQgbW9zdCwgb25seSBvbmUgdHlwZW1hcCBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhpcyBtYW5uZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE4Lzk3IDogTmVlZCBhIE1ha2VmaWxlIGZhc3Q/IFR5cGUKCiAgICAgICAgICAgICAgICAgc3dpZyBbLXRjbCwgLXBlcmw1LCAtcHl0aG9uXSAtY28gTWFrZWZpbGUKCiAgICAgICAgICBhbmQgeW91IHdpbGwgZ2V0IGEgTWFrZWZpbGUgc3BlY2lmaWMgdG8gdGhhdCB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICBZb3UganVzdCBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQgeW91J3JlCiAgICAgICAgICByZWFkeSB0byBydW4uCgo2LzE4Lzk3IDogQ29tcGxldGVkIHRoZSAtY2kgb3B0aW9uLiAgVGhpcyBvcHRpb24gY2hlY2tzIGEgZmlsZSBpbnRvIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5LiAgIEl0IHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYQogICAgICAgICAgbGFuZ3VhZ2Ugb3B0aW9uLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICBzd2lnIC10Y2wgLWNpIGZvb2Jhci5pCgogICAgICAgICAgQ2hlY2tzIHRoZSBmaWxlIGZvb2Jhci5pIGludG8gdGhlIFRjbCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LgogICAgICAgICAgSW4gb3JkZXIgdG8gY2hlY2sgYSBmaWxlIGludG8gdGhlIGdlbmVyYWwgbGlicmFyeSAoYWNjZXNzaWJsZQogICAgICAgICAgdG8gYWxsIGxhbmd1YWdlcyBtb2R1bGVzKSwgZG8gdGhlIGZvbGxvd2luZwoKICAgICAgICAgICAgICAgICAgc3dpZyAtY2kgLW8gLi4vZm9vYmFyLmkgZm9vYmFyLmkKCiAgICAgICAgICAoQWRtaXR0ZWRseSB0aGlzIGxvb2tzIGEgbGl0dGxlIHN0cmFuZ2UgYnV0IGlzIHVuYXZvaWRhYmxlKS4KICAgICAgICAgIFRoZSBjaGVjay1pbiBvcHRpb24gaXMgcHJpbWFyaWx5IGRlc2lnbmVkIGZvciBTV0lHIG1haW50ZW5hbmNlCiAgICAgICAgICBhbmQgbGlicmFyeSBkZXZlbG9wbWVudC4gVGhlIGNvbW1hbmQgd2lsbCBmYWlsIGlmIHRoZSB1c2VyIGRvZXMKICAgICAgICAgIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gdG8gdGhlIFNXSUcgbGlicmFyeS4gIFRoaXJkIHBhcnR5IGxpYnJhcnkKICAgICAgICAgIGV4dGVuc2lvbnMgY2FuIGVhc2lseSBpbnN0YWxsIHRoZW1zZWx2ZXMgYnkgc2ltcGx5IHByb3ZpZGluZwogICAgICAgICAgYSBzaGVsbCBzY3JpcHQgdGhhdCB1c2VzICdzd2lnIC1jaScgdG8gaW5zdGFsbCB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgIGxpYnJhcnkgZmlsZXMuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGtub3cgd2hlcmUgdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgaXMgbG9jYXRlZCBpZiB5b3UgdXNlIHRoaXMgbWVjaGFuaXNtLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xNi85NyA6IEZpeGVkIGEgYnVnIGluIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdoZW4gJW5hbWUoKSB3YXMgYXBwbGllZAogICAgICAgICAgdG8gYSBjbGFzcyBkZWZpbml0aW9uLiAgIFVuZm9ydHVuYXRlbHksIGZpeGluZyB0aGUgYnVnIHJlcXVpcmVkCiAgICAgICAgICBhIGNoYW5nZSBpbiB0aGUgTGFuZ3VhZ2UgQyBBUEkgYnkgYWRkaW5nIGFuIGV4dHJhIGFyZ3VtZW50IHRvCiAgICAgICAgICB0aGUgTGFuZ3VhZ2U6OmNwcF9jbGFzc19kZWNsKCkgZnVuY3Rpb24uICBUaGlzIG1heSBicmVhawogICAgICAgICAgU1dJRyBDKysgZXh0ZW5zaW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi8xNS85NyA6IEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGlmIG5vIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgJW1vZHVsZSBkaXJlY3RpdmUgb3IgLW1vZHVsZSBvcHRpb24uCgo2LzE1Lzk3IDogRml4ZWQgbGluZSBudW1iZXIgYnVnIHdoZW4gcmVwb3J0aW5nIGVycm9ycyBmb3IgdW5kZWZpbmVkCiAgICAgICAgICBiYXNlIGNsYXNzZXMuCgo2LzE1Lzk3IDogQWRkZWQgbmV3ICVyZW5hbWUgZGlyZWN0aXZlLiAgVGhpcyBhbGxvd3MgdGhlIGZvcndhcmQgZGVjbGFyYXRpb24KICAgICAgICAgIG9mIGEgcmVuYW1pbmcuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVyZW5hbWUgT2xkTmFtZSBOZXdOYW1lOwoKICAgICAgICAgICAgICAgICAuLi4uIGxhdGVyIC4uLgogICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7CgogICAgICAgICAgVW5saWtlICVuYW1lLCAlcmVuYW1lIHdpbGwgcmVuYW1lIGFueSBvY2N1cmVuY2Ugb2YgdGhlIG9sZCBuYW1lLgogICAgICAgICAgVGhpcyBhcHBsaWVzIHRvIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjbGFzcyBtZW1iZXJzIGFuZCBzbyBmb3J0aC4KICAgICAgICAgIFRoZXJlIGlzIG5vIHdheSB0byBkaXNhYmxlICVyZW5hbWUgb25jZSBzZXQsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGUKICAgICAgICAgIG5hbWUgYnkgcmVkZWNsYXJpbmcgaXQgdG8gc29tZXRoaW5nIGVsc2UuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE1Lzk3IDogSW1wcm92ZWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgc28gdGhhdCBpdAogICAgICAgICAgY291bGQgYmUgdXNlZCB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIDoKCiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFNXSUcKICAgICAgICAgICAgICAgICAgICAlbmFtZShOZXdOYW1lKQogICAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7Cgo2LzE1Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gcmV0dXJuIGRhdGF0eXBlLiAgSW4gdGhpcyBjYXNlLAogICAgICAgICAgU1dJRyBhc3N1bWVzIGEgcmV0dXJuIHR5cGUgb2YgJ2ludCcuCgo2LzExLzk3IDogSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGluIHRoZSBwYXJzZXIuICBJdCBzaG91bGQgYmUgYSBsaXR0bGUKICAgICAgICAgIGxlc3Mgc2Vuc2l0aXZlIHRvIGVycm9ycyB0aGF0IG9jY3VyIGluc2lkZSBjbGFzcyBkZWZpbml0aW9ucwogICAgICAgICAgbm93LiAgQWxzbyByZXBvcnRzIGVycm9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCgo2LzExLzk3IDogTWFkZSAnJCcgYSBsZWdhbCBzeW1ib2wgaW4gaWRlbnRpZmllcnMuICBUaGlzIGlzIHRvIHN1cHBvcnQKICAgICAgICAgIHNvbWUgT2JqZWN0aXZlLUMgbGlicmFyaWVzLiAgU29tZSBjb21waWxlcnMgKHN1Y2ggYXMgZ2NjKSBtYXkgYWxzbwogICAgICAgICAgYWxsb3cgaWRlbnRpZmllcnMgdG8gY29udGFpbiBhICQgaW4gQy9DKysgY29kZSBhcyB3ZWxsICh0aGlzIGlzCiAgICAgICAgICBhbiBvYnNjdXJlIGZlYXR1cmUgb2YgQykuIFdoZW4gJyQnIGFwcGVhcnMgaW4gaWRlbnRpZmllciwgU1dJRwogICAgICAgICAgcmVtYXBzIGl0IHRvIHRoZSBzdHJpbmcgJ19TXycgd2hlbiBjcmVhdGluZyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBmdW5jdGlvbi4gVGh1cyBhIGZ1bmN0aW9uICdmb28kYmFyJyB3b3VsZCBiZSBjYWxsZWQgJ2Zvb19TX2JhcicuCgo2LzExLzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB3aXRoIF9fcmVwcl9fIG1ldGhvZC4gIElmCiAgICAgICAgICBzdXBwbGllZCBieSB0aGUgdXNlciwgaXQgd2FzIGlnbm9yZWQsIGJ1dCBub3cgaXQgc2hvdWxkIHdvcmsuCgo2LzkvOTcgIDogRml4ZWQgdGhlIFRjbCA4LjAgbW9kdWxlIHRvIHdvcmsgd2l0aCBUY2wgOC4wYjEuICAgU1dJRyBpcyBubwogICAgICAgICAgbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCAqYW55KiBhbHBoYSByZWxlYXNlIG9mIFRjbCA4LjAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvNy85NyAgOiBQdXQgYSBtYXhpbWFsIGVycm9yIGNvdW50IGluIChjdXJyZW50bHkgc2V0IHRvIDIwKS4gU1dJRyB3aWxsIGJhaWwgb3V0CiAgICAgICAgICBpZiBpdCBnZW5lcmF0ZXMgbW9yZSBlcnJvcnMgdGhhbiB0aGlzICh1c2VmdWwgZm9yIHByZXZlbnRpbmcgU1dJRwogICAgICAgICAgZnJvbSBwcmludGluZyA0MDAwIHN5bnRheCBlcnJvcnMgd2hlbiBpdCBnZXRzIGNvbmZ1c2VkKS4KCjYvNy85NyAgOiBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBwYXJzaW5nIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCgo2LzcvOTcgIDogTWlub3IgY2hhbmdlIHRvIFBlcmw1IG1vZHVsZS4gIEMrKyBzdGF0aWMgZnVuY3Rpb25zIGFyZSBub3cKICAgICAgICAgIHB1dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZWlyIGNsYXNzIHdoZW4gdXNpbmcgc2hhZG93IGNsYXNzZXMuCgo2LzcvOTcgIDogQ2VudHJhbGl6ZWQgdGhlIG5hbWluZyBvZiBmdW5jdGlvbnMsIG1lbWJlcnMsIHdyYXBwZXJzIGV0Yy4uLiBCeQogICAgICAgICAgY2VudHJhbGl6aW5nIHRoZSBuYW1pbmcgc2NoZW1lLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbWFrZQogICAgICAgICAgc29tZSBtdWx0aS1maWxlIG9wdGltaXphdGlvbnMuICBBbHNvLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8KICAgICAgICAgIGNoYW5nZSBTV0lHJ3MgbmFtaW5nIHNjaGVtZSAocGVyaGFwcyBhIG5ldyBmZWF0dXJlIHRvIGJlIGFkZGVkCiAgICAgICAgICBsYXRlcikuCgo2LzIvOTcgIDogQWRkZWQgJ2FyZ2luaXQnIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBhc3NpZ24gaW5pdGlhbCB2YWx1ZXMKICAgICAgICAgIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIERvaW5nIHNvIG1ha2VzIGl0IHNvbWV3aGF0IGVhc2llciB0byBkZXRlY3QKICAgICAgICAgIGltcHJvcGVyIGFyZ3VtZW50IHBhc3Npbmcgd2hlbiB3b3JraW5nIHdpdGggb3RoZXIgdHlwZW1hcHMuCgo2LzIvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHJlYWQtb25seSB2YXJpYWJsZXMgd2VyZSBpbmhlcml0ZWQKICAgICAgICAgIGludG8gb3RoZXIgY2xhc3Nlcy4gIFVuZGVyIGluaGVyaXRhbmNlLCB0aGUgdmFyaWFibGVzIHdvdWxkCiAgICAgICAgICBiZWNvbWUgd3JpdGFibGUsIGJ1dCB0aGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQuCgo1LzMwLzk3IDogQW4gZW1wdHkgJW5hbWUoKSBkaXJlY3RpdmUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgb3Igc3VwcG9ydGVkLgogICAgICAgICAgVGhpcyBkaXJlY3RpdmUgd2FzIG9yaWdpbmFsbHkgdXNlZCB0byBzdHJpcCB0aGUgcHJlZml4CiAgICAgICAgICBvZmYgb2YgYSBjbGFzcyBvciBzdHJ1Y3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG5ldmVyIHJlYWxseQogICAgICAgICAgc2VlbWVkIHRvIHdvcmsgcmlnaHQgYW5kIGl0IGNvbXBsaWNhdGVkIHRoZSBDKysgY29kZSBnZW5lcmF0b3IKICAgICAgICAgIHNpZ25pZmljYW50bHkuICAgQXMgZmFyIGFzIEkgY2FuIHRlbGwgbm8gb25lIHVzZXMgaXQsIHNvIGl0CiAgICAgICAgICBpcyBub3cgaGlzdG9yeS4gICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS8yOC85NyA6IEZpeGVkIGEgcGFyc2luZyBidWcgd2l0aCAjZGVmaW5lIGFuZCBDKysgY29tbWVudHMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBub3cgd29yayBwcm9wZXJseSA6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBDT05TVCAgIDQgICAgIC8vIEEgQ29tbWVudAoKNS8yOC85NyA6IE1hZGUgc29tZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFNXSUcgU3RyaW5nIGNsYXNzLgogICAgICAgICAgKG9ubHkgYWZmZWN0cyB0aGUgU1dJRyBjb21waWxlciBpdHNlbGYpLgoKNS8yOC85NyA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc2tpcCB0ZW1wbGF0ZSBkZWZpbml0aW9ucyBhbmQgaXNzdWUgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLgoKNS8yOC85NyA6IFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgYWRkZWQgKGllLiB0ZW1wbGF0ZXMpLgogICAgICAgICAgVHlwZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCBwYXNzIHRocm91Z2ggdGhlIFNXSUcgY29tcGlsZXIKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28odmVjdG9yPGNvbXBsZXg+ICphLCB2ZWN0b3I8ZG91YmxlPiAqYik7CgogICAgICAgICAgV2hlbiB1c2VkLCB0aGUgZW50aXJlIG5hbWUgJ3ZlY3Rvcjxjb21wbGV4PicgYmVjb21lcyB0aGUgbmFtZQogICAgICAgICAgb2YgdGhlIGRhdGF0eXBlLiAgICAgIER1ZSB0byBzcGFjZSBsaW1pdGF0aW9ucyBpbiBkYXRhdHlwZQogICAgICAgICAgcmVwcmVzZW50YXRpb25zLCB0aGUgbmFtZSBzaG91bGQgbm90IGV4Y2VlZCA5NiBjaGFyYWN0ZXJzLgoKICAgICAgICAgIE5vdGUgOiBUaGlzIGlzIG9ubHkgcGFydCBvZiB3aGF0IGlzIG5lZWRlZCBmb3IgdGVtcGxhdGUgc3VwcG9ydC4KICAgICAgICAgIFRlbXBsYXRlIGNsYXNzIGRlZmluaXRpb25zIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSBTV0lHLgoKICAgICAgICAgIFRoZSB0ZW1wbGF0ZSBub3RhdGlvbiBhYm92ZSBtYXkgYWxzbyBiZSB1c2VkIHdoZW4gc3BlY2lmeWluZwogICAgICAgICAgT2JqZWN0aXZlLUMgcHJvdG9jb2wgbGlzdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzI0Lzk3IDogRmlyc3QgY3V0IGF0IE9iamVjdGl2ZS1DIHN1cHBvcnQgYWRkZWQuICAgQXMgaXQgdHVybnMgb3V0LCBhbG1vc3QKICAgICAgICAgIGV2ZXJ5dGhpbmcgY2FuIGJlIGhhbmRsZWQgd2l0aCBvbmx5IGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8KICAgICAgICAgIHRoZSBDKysgbW9kdWxlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yMy85NyA6IEZpeGVkIHJlcGVhdGVkIGRlZmluaXRpb24gYnVnIGluIG11bHRpcGxlIGluaGVyaXRhbmNlIGhhbmRsaW5nCiAgICAgICAgICB3aGVuIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzIChpZS4KICAgICAgICAgIHRoZSBldmlsIGRpYW1vbmQpLgoKNS8yMS85NyA6IEZpeGVkIHJhdGhlciBlbWJhcnJhc3NpbmcgdHlwbyB0aGF0IHdvcmtlZCBpdHMgd2F5IGludG8gdGhlCiAgICAgICAgICBUZXN0cy9CdWlsZCBkaXJlY3RvcnkuCgo1LzE5Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIG5hdGl2ZSBtZXRob2RzIGFuZAogICAgICAgICAgc2hhZG93IGNsYXNzZXMgd2l0aCBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMuCgo1LzE5Lzk3IDogTW9kaWZpZWQgdGhlICVhcHBseSBkaXJlY3RpdmUgc2xpZ2h0bHkgc28gdGhhdCBpdCB3b3VsZCB3b3JrCiAgICAgICAgICB3aXRoIHBvaW50ZXJzIGEgbGl0dGxlIGJldHRlci4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IHVuc2lnbmVkIGxvbmcgeyBEV09SRCB9OwoKICAgICAgICAgIEFwcGxpZXMgKmFsbCogdHlwZW1hcHMgYXNzb2NpYXRlZCB3aXRoICJ1bnNpZ25lZCBsb25nIiB0bwogICAgICAgICAgIkRXT1JEIi4gICBUaGlzIG5vdyBpbmNsdWRlcyBwb2ludGVycyB0byB0aGUgdHdvIGRhdGF0eXBlcy4KICAgICAgICAgIEZvciBleGFtcGxlLCBhIHR5cGVtYXAgYXBwbGllZCB0byAidW5zaWduZWQgbG9uZyAqKiIgd291bGQKICAgICAgICAgIGFsc28gYmUgYXBwbGllZCB0byBhbnkgb2NjdXJyZW5jZSBvZiAiRFdPUkQgKioiIGFzIHdlbGwuCgo1LzE5Lzk3IDogRml4ZWQgYW4gb3duZXJzaGlwIGFzc2lnbm1lbnQgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgY2xhc3MgbWVtYmVycyB3ZXJlIHJldHVybmluZyBuZXcgb2JqZWN0cyBiZWxvbmdpbmcgdG8KICAgICAgICAgIGRpZmZlcmVudCBjbGFzc2VzLgoKNS8xNy85NyA6IEFkZGVkIGEgZmV3IG1vcmUgdHlwZW1hcCB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICAgICAkbmFtZSAgICAgICAgICAtIE5hbWUgb2YgZnVuY3Rpb24vdmFyaWFibGUvbWVtYmVyCiAgICAgICAgICAgICAgICAgICRiYXNldHlwZSAgICAgIC0gQmFzZSBkYXRhdHlwZSAodHlwZSB3aXRob3V0IHBvaW50ZXJzKQogICAgICAgICAgICAgICAgICAkYXJnbnVtICAgICAgICAtIEFyZ3VtZW50IG51bWJlcgoKNS8xNi85NyA6IEZpeGVkIGVtYmFycmFzc2luZyB1bmRlcnNjb3JlIGVycm9yIGluIGxvY2FsIHZhcmlhYmxlCiAgICAgICAgICBhbGxvY2F0b3IuCgo1LzE2Lzk3IDogRml4ZWQgbmFtZXNwYWNlIGNsYXNoIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzCiAgICAgICAgICB3aGVuIGNyZWF0aW5nIGFycmF5cyBhcyBuZXcgbG9jYWwgdmFyaWFibGVzLgoKNS8xNS85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIGluaGVyaXRhbmNlIG9mIGFkZGVkIG1ldGhvZHMgYWNyb3NzCiAgICAgICAgICBtdWx0aXBsZSBmaWxlcy4gICBTV0lHIG5vdyB1c2VzIG5hbWVzIG9mIGJhc2UgY2xhc3NlcwogICAgICAgICAgd2hlbiBnZW5lcmF0aW5nIHN1Y2ggZnVuY3Rpb25zLgoKNS8xNC85NyA6IEZpbmlzaGVkIHN1cHBvcnQgZm9yIGRlZmF1bHQgdHlwZW1hcHMuICBQcmltYXJpbHkgdXNlZAogICAgICAgICAgaW50ZXJuYWxseSwgdGhleSBjYW4gYmUgdXNlZCB0byBtYXRjaCB0aGUgYmFzaWMKICAgICAgICAgIGJ1aWx0LWluIGRhdGF0eXBlcyB1c2VkIGluc2lkZSBvZiBTV0lHLiAgIFlvdSBjYW4KICAgICAgICAgIHNwZWNpZnkgdGhlbSBpbiBpbnRlcmZhY2UgZmlsZXMgYXMgd2VsbCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gYXRvaSgkdGFyZ2V0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFVubGlrZSBub3JtYWwgdHlwZW1hcHMsIHRoaXMgZGVmYXVsdCBtYXAgd2lsbCBnZXQgYXBwbGllZAogICAgICAgICAgdG8gKmFsbCogaW50ZWdlciBkYXRhdHlwZXMgZW5jb3VudGVyZWQsIGluY2x1ZGluZyB0aG9zZQogICAgICAgICAgcmVuYW1lZCB3aXRoIHR5cGVkZWYsIGV0Yy4uLgoKNS8xMy85NyA6IEZpeGVkIHN1YnN0cmluZyBidWcgaW4gdHlwZSBjaGVja2VyLgoKNS8xMi85NyA6IEZpeGVkIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzIHdoZW4gZGVjbGFyaW5nIGxvY2FsCiAgICAgICAgICB2YXJpYWJsZXMgb2Ygc3RydWN0dXJlcy4KClZlcnNpb24gMS4xIEJldGE2IChNYXkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNS85Lzk3ICA6IEZpeGVkIGJpemFycmUgTlVMTCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBtb2R1bGUuCgo1LzgvOTcgIDogRml4ZWQgbXlzdGVyaW91cyBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBydW5uaW5nIFNXSUcgb24gYW4KICAgICAgICAgIGVtcHR5IGZpbGUuCgo1LzcvOTcgIDogVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgbm93IHJlcGxhY2UgdGhlIHNwZWNpYWwgc3ltYm9sICIkY2xlYW51cCIKICAgICAgICAgIHdpdGggdGhlIGNsZWFudXAgY29kZSBzcGVjaWZpZWQgd2l0aCB0aGUgImZyZWVhcmciIHR5cGVtYXAuCiAgICAgICAgICBUaGlzIGNoYW5nZSBuZWVkZWQgdG8gcHJvcGVybHkgbWFuYWdlIG1lbW9yeSBhbmQgZXhjZXB0aW9ucy4KCjUvNS85NyAgOiBBZGRlZCB0aGUgJ3R5cGVtYXBzLmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgY29udGFpbnMgYQogICAgICAgICAgdmFyaWV0eSBvZiBjb21tb24gdHlwZW1hcHMgZm9yIGlucHV0IHZhbHVlcywgcG9pbnRlcnMsCiAgICAgICAgICBhbmQgc28gb24uCgo1LzUvOTcgIDogQ2hhbmdlZCBiZWhhdmlvciBvZiAiYXJnb3V0IiB0eXBlbWFwIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICBPbGQgdmVyc2lvbnMgYXV0b21hdGljYWxseSB0dXJuZWQgdGhlIHJlc3VsdCBpbnRvIGEKICAgICAgICAgIFB5dGhvbiBsaXN0LiAgVGhlIG5ldyB2ZXJzaW9uIGRvZXMgbm90aGluZywgbGVhdmluZyB0aGUKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHVwIHRvIHRoZSB1c2VyLiAgVGhpcyBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5CiAgICAgICAgICBidXQgbWF5IGJyZWFrIG9sZGVyIGNvZGVzIHRoYXQgcmVseSBvbiB0eXBlbWFwcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uIG9mCiAgICAgICAgICAiYXJnb3V0IiBhbmQgImlnbm9yZSIgdHlwZW1hcHMuCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgdGhhdCB3b3VsZCBnZW5lcmF0ZSBpbmNvcnJlY3QgY29kZQogICAgICAgICAgaWYgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgImlnbm9yZWQiLgoKNS80Lzk3ICA6IEFkZGVkICVhcHBseSBhbmQgJWNsZWFyIGRpcmVjdGl2ZXMuICAgVGhlc2UgZm9ybSBhIGhpZ2hlciBsZXZlbAogICAgICAgICAgaW50ZXJmYWNlIHRvIHRoZSB0eXBlbWFwIG1lY2hhbmlzbS4gIEluIGEgbnV0c2hlbGwsIHRoZXkKICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgcHJvY2Vzc2luZyBvZiB2YXJpb3VzIGRhdGF0eXBlcyB3aXRob3V0CiAgICAgICAgICBldmVyIGhhdmluZyB0byB3cml0ZSBhIHR5cGVtYXAuICBTZWUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbgogICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gICoqIE5FVyBGRUFUVVJFICoqCgo1LzQvOTcgIDogQWRkZWQgYSBsb2NhbCB2YXJpYWJsZSBleHRlbnNpb24gdG8gdGhlIHR5cGVtYXAgaGFuZGxlci4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgKihkb3VibGUgdGVtcCkgewoJCSAgICAgICAgdGVtcCA9IGF0b2YoJHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSAmdGVtcDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCAndGVtcCcgaXMgYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cwogICAgICAgICAgaW4gdGhlIGVudGlyZSB3cmFwcGVyIGZ1bmN0aW9uIChub3QganVzdCB0aGUgdHlwZW1hcAogICAgICAgICAgY29kZSkuICBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBiZXR0ZXIgc3VwcG9ydCBmb3IKICAgICAgICAgIGNlcnRhaW4gdHlwZXMgb2YgYXJndW1lbnQgaGFuZGxpbmcgYW5kIGFsc28gbWFrZXMgaXQKICAgICAgICAgIHBvc3NpYmxlIHRvIHdyaXRlIHRocmVhZC1zYWZlIHR5cGVtYXBzLiAgQW55IG51bWJlcgogICAgICAgICAgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBieSBzdXBwbHlpbmcgYSBjb21tYQogICAgICAgICAgc2VwYXJhdGVkIGxpc3QuICAgTG9jYWwgdmFyaWFibGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlCiAgICAgICAgICB1bmlxdWUsIGV2ZW4gaWYgdGhlIHNhbWUgdHlwZW1hcCBpcyBhcHBsaWVkIG1hbnkgdGltZXMKICAgICAgICAgIGluIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgICAgICAgICAqKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBQZXJsNCBvciBHdWlsZSBtb2R1bGVzLgoKNS8yLzk3ICA6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJWlmZGVmLCAlZW5kaWYsICVpZiwgZXRjLi4uICAoVGhlc2UgYXJlCiAgICAgICAgICBTV0lHIGVxdWl2YWxlbnRzIG9mIHRoZSBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgIGNhbiBwYXNzIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKS4KCjUvMi85NyAgOiBGaXhlZCBtYWpvciAoYnV0IHN1YnRsZSkgYnVnIGluIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIKICAgICAgICAgIHJlbGF0ZWQgdG8gc2VhcmNoaW5nIGFuZCB0eXBlLWNoZWNraW5nIGZvciBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICBUbyBtYWtlIGEgbG9uZyBzdG9yeSBzaG9ydCwgaWYgeW91IGhhZCB0d28gY2xhc3NlcyBuYW1lZAogICAgICAgICAgIkZvbyIgYW5kICJGb29PYmplY3QiIHRoZSB0eXBlIGNoZWNrZXIgd291bGQgc29tZXRpbWVzCiAgICAgICAgICBnZXQgY29uZnVzZWQgYW5kIGJlIHVuYWJsZSB0byBsb2NhdGUgIkZvbyIgaW4gYW4gaW50ZXJuYWwKICAgICAgICAgIHRhYmxlLgoKNS8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgLWNvIG9wdGlvbi4KCjQvMjQvOTcgOiBQb2ludGVyIGxpYnJhcnkgYWRkZWQgdG8gdGhlIFNXSUcgbGlicmFyeS4KCjQvMTkvOTcgOiBBZGRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICAgVGhpcyBpcyBhICJoaW50IiB0aGF0IGNhbiBiZSB1c2VkCiAgICAgICAgICB0byB0ZWxsIFNXSUcgdGhhdCBhIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIG5ldyBvYmplY3QuIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IEZvbyAqY3JlYXRlX2ZvbygpOwoKICAgICAgICAgIFRoaXMgdGVsbHMgU1dJRyB0aGF0IGNyZWF0ZV9mb28oKSBpcyBjcmVhdGluZyBhIG5ldyBvYmplY3QKICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGl0LiAgIE1hbnkgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkKICAgICAgICAgIGNob29zZSB0byBpZ25vcmUgdGhlIGhpbnQsIGJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3NlcywKICAgICAgICAgIHRoZSAlbmV3IGlzIHVzZWQgdG8gaGFuZGxlIHByb3BlciBvd25lcnNoaXAgb2Ygb2JqZWN0cy4KCiAgICAgICAgICAlbmV3IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5ncy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgY2hhciAqY3JlYXRlX3N0cmluZygpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHdpbGwgYXV0b21hdGljYWxseSBjbGVhbnVwCiAgICAgICAgICB0aGUgcmV0dXJuZWQgc3RyaW5nLS1lbGltaW5hdGluZyBtZW1vcnkgbGVha3MuCiAgICAgICAgICAqKiBORVcgRkVBVFVSRSAqKgoKNC8xOS85NyA6IEFkZGVkIGEgbmV3IHR5cGVtYXAgIm5ld2ZyZWUiLiAgIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCiAgICAgICAgICB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgbWV0aG9kIGJ5IHdoaWNoCiAgICAgICAgICBhIG5ldyBvYmplY3QgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBpcyBkZWxldGVkLgoKNC8xOS85NyA6IFRoZSBzeW1ib2wgIl9fY3BsdXNwbHVzIiBpcyBub3cgZGVmaW5lZCBpbiB0aGUgU1dJRyBpbnRlcnByZXRlcgogICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggdGhlIC1jKysgb3B0aW9uLgoKNC8xNy85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIHdoZW4gdXNlZCBpbnNpZGUgdGhlCiAgICAgICAgICAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgo0LzE1Lzk3IDogQWRkZWQgYSBzcGVjaWFsIHR5cGVtYXAgc3ltYm9sIFBSRVZJT1VTIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIHJlc3RvcmUgYSBwcmV2aW91cyB0eXBlbWFwLiBGb3IgZXhhbXBsZSA6CgoJICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgKiA9IFBSRVZJT1VTOwoKICAgICAgICAgIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgaW4gbGlicmFyeSBmaWxlcy4KCjQvMTMvOTcgOiBBZGRlZCAlcHJhZ21hIGRpcmVjdGl2ZSBmb3IgUGVybDUgbW9kdWxlLiAgIFR3byBuZXcgcHJhZ21hcyBhcmUKICAgICAgICAgIGF2YWlsYWJsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGNvZGUgPSAic3RyaW5nIgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiZmlsZS5wbCIKCiAgICAgICAgICBCb3RoIGluc2VydCBjb2RlIGludG8gdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4gIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY3VzdG9taXplIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuCgo0LzEzLzk3IDogU2Nhbm5lciBtb2RpZmllZCB0byBvbmx5IHJlY29nbml6ZSBDKysga2V5d29yZHMgd2hlbiB0aGUgLWMrKwogICAgICAgICAgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQyBwcm9ncmFtcwogICAgICAgICAgdGhhdCBtYWtlIHVzZSBvZiB0aGVzZSBrZXl3b3JkcyBmb3IgaWRlbnRpZmllcnMuCiAgICAgICAgICBTV0lHIG1heSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgcnVuIHdpdGggdGhlIC1jKysgb3B0aW9uIHdoZW4KICAgICAgICAgIGNvbXBpbGluZyBDKysgY29kZSAodGhpcyB3YXMgYWxsb3dlZCwgYnV0IG5vdCByZWNvbW1lbmRlZCBpbgogICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMpLiAqKlBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkqKgoKNC8xMS85NyA6IEZpeGVkIGEgcmF0aGVyIG5hc3R5IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gdXNpbmcKICAgICAgICAgIHZhcmlhYmxlIGxpbmtpbmcgd2l0aCBjb21wbGV4IGRhdGF0eXBlcyBhbmQgcG9pbnRlcnMuICAgT24gVW5peCwKICAgICAgICAgIGNvZGUgd291bGQgd29yayAoc29tZWhvdyksIGJ1dCB3b3VsZCBjYXVzZSBhbiBhY2Nlc3MgdmlvbGF0aW9uCiAgICAgICAgICB1bmRlciBXaW5kb3dzLU5ULiAgVGhlIGZpeCBzaG91bGQgY29ycmVjdCB0aGUgcHJvYmxlbSwKICAgICAgICAgIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgYSBwcm9ibGVtIHVzaW5nIGdsb2JhbCB2YXJpYWJsZXMgb2YKICAgICAgICAgIGNvbXBsZXggZGF0YXR5cGVzIGluIGNvbmp1bmN0aW9uIHdpdGggc2hhZG93IGNsYXNzZXMuICBGb3J0dW5hdGVseSwKICAgICAgICAgIHRoaXMgc29ydCBvZiB0aGluZyBzZWVtcyB0byBiZSByZWxhdGl2ZWx5IHJhcmUgKGNvbnNpZGVyaW5nCiAgICAgICAgICB0aGF0IHRoZSBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBtb3JlIHRoYW4gYSB5ZWFyIC0geWlrZXMhKS4KCjQvMTEvOTcgOiBGaXhlZCBiaXphcnJlIGNvbnN0YW50IGV2YWx1YXRpb24gYnVnIGluIFBlcmw1IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MtTlQuCgo0LzgvOTcgIDogQnVnIHdoZW4gdXNpbmcgZGVmYXVsdCBhcmd1bWVudHMgYW5kIEMrKyByZWZlcmVuY2VzIGZpeGVkLgoKNC84Lzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIGluIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcyByZWxhdGVkIHRvCiAgICAgICAgICB1c2luZyBjbGFzcyByZW5hbWluZyAoYXBwbHlpbmcgdGhlICVuYW1lIGRpcmVjdGl2ZSB0byBhIGNsYXNzCiAgICAgICAgICBkZWZpbml0aW9uKSBhbmQgc2hhZG93IGNsYXNzZXMuCgo0LzcvOTcgIDogRml4ZWQgbWlub3IgYnVncyBpbiBzd2lncHRyLnN3ZywgdGNsOHB0ci5zd2csIGFuZCBwZXJsNXB0ci5zd2cgdG8KICAgICAgICAgIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiB3ZWlyZCBkYXRhdHlwZXMgYXJlIHBhc3NlZC4KCjMvMjkvOTcgOiAnTWFrZWZpbGUud2luJyBhZGRlZC4gICBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZXhhbXBsZXMKICAgICAgICAgIGluIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdW5kZXIgV2luZG93cyBOVC85NS4KCjMvMjcvOTcgOiBGaXhlcyB0byBTV0lHJ3MgZXJyb3IgcmV0dXJuIGNvZGVzLiAgIFNXSUcgbm93IHJldHVybnMgbm9uLXplcm8KICAgICAgICAgIGV4aXQgY29kZXMgZm9yIGNlcnRhaW4ga2luZHMgb2YgZXJyb3JzICh3aGljaCBtYWtlcyBpdCBtb3JlCiAgICAgICAgICBmcmllbmRseSB0byBtYWtlZmlsZXMpLiAgICAgQW4gb3ZlcmhhdWwgb2YgdGhlIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICBpcyBvbiB0aGUgdG8tZG8gbGlzdCBhbmQgd2lsbCBwcm9iYWJseSBzaG93IHVwIGluIGEgbGF0ZXIgcmVsZWFzZS4KCjMvMjUvOTcgOiBCdWcgZml4LiAgImZyZWVhcmciIGFuZCAiYXJnb3V0IiB0eXBlbWFwcyBoYXZlIGJlZW4gZml4ZWQgaW4KICAgICAgICAgIHRoZSBQZXJsNSBtb2R1bGUuICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycwogICAgICAgICAgYW5kIGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXJzIHNoYXJlZCB0aGUgc2FtZSBtZW1vcnkgc3BhY2UtLWNhdXNpbmcKICAgICAgICAgIGFsbCBzb3J0cyBvZiBuYXN0eSBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBwYXNzIHBlcmwgdmFsdWVzIGJ5CiAgICAgICAgICByZWZlcmVuY2UuICAgU1dJRyBub3cgaW50ZXJuYWxseSBtYWtlcyBhICJjb3B5IiAod2hpY2ggaXMgcmVhbGx5CiAgICAgICAgICBqdXN0IGEgcG9pbnRlcikgb2YgYWZmZWN0ZWQgcGFyYW1ldGVycyBhbmQgdXNlcyB0aGF0LiAgIFRoaXMKICAgICAgICAgIGlzIGRvbmUgdHJhbnNwYXJlbnRseSBzbyB0aGVyZSBpcyBubyBub3RpY2FibGUgaW1wYWN0IG9uIGFueQogICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcy4gICBUaGlzIGNoYW5nZSBpcyBwcm9iYWJseSBvbmx5IG5vdGljYWJsZQogICAgICAgICAgdG8gZXhwZXJ0IHVzZXJzLgoKMy8yNS85NyA6IEFkZGVkIHR5cGUtY2hlY2sgdG8gdmVyYm9zZSBhbmQgc3RhdCBtb2RlLiAgU1dJRyB3aWxsIG5vdyBnZW5lcmF0ZSBhIGxpc3QKICAgICAgICAgIG9mIGFsbCBkYXRhdHlwZXMgdGhhdCB3ZXJlIHVzZWQgYnV0IHVuZGVmaW5lZCAodXNlZnVsIGZvciB0cmFja2luZwogICAgICAgICAgZG93biB3ZWlyZCBidWdzKS4gICBUaGlzIGlzIGVuYWJsZWQgd2l0aCB0aGUgLXYgb3B0aW9uICh3aGljaAogICAgICAgICAgaXMgbm93IG9mZmljaWFsbHkga25vd24gYXMgIm92ZXJseSB2ZXJib3NlIiBtb2RlKSBvciB0aGUgLXN0YXQgb3B0aW9uLgoKMy8yNS85NyA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNlciB0byBtYWtlIGluY2x1ZGUgZ3VhcmRzIHdvcmsgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICNpZm5kZWYgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICNkZWZpbmUgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vYmFyLmkKICAgICAgICAgICAgICAgIC4uLiBkZWNsYXJhdGlvbnMgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKCjMvMjQvOTcgOiAlY2hlY2tvdXQgZGlyZWN0aXZlIGFkZGVkLiAgIFRoaXMgYWxsb3dzIGFuIGludGVyZmFjZSBmaWxlIHRvCiAgICAgICAgICBleHRyYWN0IGZpbGVzIGZyb20gdGhlIFNXSUcgbGlicmFyeSBhbmQgcGxhY2UgdGhlbSBpbiB0aGUKICAgICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCBzY3JpcHRzIGFuZAogICAgICAgICAgb3RoZXIgaGVscGVyIGNvZGUgdGhhdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggbGlicmFyeSBmaWxlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAlY2hlY2tvdXQgYXJyYXkudGNsCgogICAgICAgICAgV2lsbCBsb29rIGZvciBhIGZpbGUgImFycmF5LnRjbCIgaW4gdGhlIGxpYnJhcnkgYW5kIGNvcHkgaXQKICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gICAgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlCiAgICAgICAgICBkaXJlY3RvcnksIHRoaXMgZGlyZWN0aXZlIGRvZXMgbm90aGluZyAoaXQgd2lsbCBub3Qgb3ZlcndyaXRlIGFuCiAgICAgICAgICBleGlzdGluZyBmaWxlKS4gIFRoaXMgb25seSBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBmb3Igbm93LgoKMy8yNC85NyA6IFNXSUcgd2lsbCBub3cgbG9vayBpbiB0aGUgU1dJRyBMaWJyYXJ5IGZvciBhIGZpbGUgaWYgaXQgY2FuJ3QKICAgICAgICAgIGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQXMgYSByZXN1bHQsIGl0IGlzIGVhc3kgdG8KICAgICAgICAgIG1ha2UgbW9kdWxlcyBmcm9tIFNXSUcgbGlicmFyeSBmaWxlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgIHdhbnQgdG8gbWFrZSBhIFB5dGhvbiBtb2R1bGUgZnJvbSB0aGUgU1dJRyB0aW1lcnMgbGlicmFyeSwganVzdAogICAgICAgICAgdHlwZSB0aGlzIGluIGFueSBkaXJlY3RvcnkgOgoKICAgICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiB0aW1lcnMuaQoKICAgICAgICAgIFlvdSB3aWxsIGdldCB0aGUgZmlsZXMgdGltZXJzX3dyYXAuYyBhbmQgdGltZXJzX3dyYXAuZG9jIGluCiAgICAgICAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCB5b3UgY2FuIG5vdyBjb21waWxlLiAgIFRoZSBmaWxlCiAgICAgICAgICByZW1haW5zIGluIHRoZSBTV0lHIGxpYnJhcnkgKGFsdGhvdWdoIHlvdSBjYW4gY2hlY2sgaXQgb3V0CiAgICAgICAgICB1c2luZyB0aGUgLWNvIG9wdGlvbikuICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogLWNvIG9wdGlvbiBhZGRlZCB0byBTV0lHIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIHRoZSBTV0lHIGxpYnJhcnkuCiAgICAgICAgICBXaGVuIHVzZWQsIHRoaXMgaW5zdHJ1Y3RzIFNXSUcgdG8gY2hlY2sgb3V0IGEgbGlicmFyeSBmaWxlIGFuZAogICAgICAgICAgcGxhY2UgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIHVuaXggPiBzd2lnIC1jbyBhcnJheS5pCiAgICAgICAgICAgICAgICBhcnJheS5pIGNoZWNrZWQgb3V0IGZyb20gdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgICAgICAgdW5peCA+CgogICAgICAgICAgT25jZSBpbiB5b3VyIGRpcmVjdG9yeSB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZmlsZSB0byBzdWl0IHlvdXIKICAgICAgICAgIHBhcnRpY3VsYXIgcHVycG9zZXMuICBUaGUgY2hlY2tvdXQgb3B0aW9uIG1ha2VzIGl0IGVhc3kgdG8KICAgICAgICAgIGdyYWIgbGlicmFyeSBmaWxlcyB3aXRob3V0IGtub3dpbmcgYW55dGhpbmcgYWJvdXQgdGhlIFNXSUcKICAgICAgICAgIGluc3RhbGxhdGlvbiwgYnV0IGl0IGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gc3RhcnQKICAgICAgICAgIGluY2x1ZGluZyBzY3JpcHRzLCBDIGNvZGUsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIGZpbGVzCiAgICAgICAgICBpbiB0aGUgbGlicmFyeS4gIEZvciBleGFtcGxlLCB5b3UgY291bGQgcHV0IGEgY29vbCBzY3JpcHQKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5IGFuZCBjaGVjayBpdCBvdXQgd2hlbmV2ZXIgeW91IHdhbnRlZCB0byB1c2UgaXQuCiAgICAgICAgICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogI3ByYWdtYSBleHBvcnQgZGlyZWN0aXZlcyBhZGRlZCB0byBUY2wgb3V0cHV0IGZvciBjb21waWxpbmcKICAgICAgICAgIHNoYXJlZCBsaWJyYXJpZXMgb24gdGhlIE1hYy4KCjMvMjQvOTcgOiBNaW5vciBjaGFuZ2VzIHRvIHdpc2guaSBhbmQgdGNsc2guaSBsaWJyYXJ5IGZpbGVzIHRvIHByb3ZpZGUKICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZSBNYWNpbnRvc2guCgozLzE5Lzk3IDogU1dJRydzIHBvbGljeSB0b3dhcmRzIE5VTEwgcG9pbnRlcnMgaGFzIGJlZW4gcmVsYXhlZC4gIFRoZQogICAgICAgICAgcG9saWN5IG9mIHJlcXVpcmluZyBhIHNwZWNpYWwgY29tcGlsZXIgZGlyZWN0aXZlIC1EQUxMT1dfTlVMTAogICAgICAgICAgdG8gdXNlIE5VTEwgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIFdoaWxlIHRoaXMgbWF5CiAgICAgICAgICBzZWVtICJ1bnNhZmUiLCBpdCB0dXJucyBvdXQgdGhhdCB5b3UgY2FuIHVzZSBhICJjaGVjayIKICAgICAgICAgIHR5cGVtYXAgdG8gYWNoaWV2ZSBzb21lIHNhZmV0eS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIE5vZGUgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIk5VTEwgUG9pbnRlcnMgbm90IGFsbG93ZWQuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBwcmV2ZW50cyBhbnkgTlVMTCB2YWx1ZSBvZiBhICJOb2RlICoiIHBvaW50ZXIgdG8gYmUKICAgICAgICAgIHBhc3NlZCB0byBhIGZ1bmN0aW9uLiAgIChJIHRoaW5rIHRoaXMgaXMgbXVjaCBjbGVhbmVyCiAgICAgICAgICB0aGFuIHRoZSBvbGQgLURBTExPV19OVUxMIGhhY2sgYW55d2F5cykuCgozLzE5Lzk3IDogRml4ZWQgcG9pbnRlciBoYW5kbGluZyBlcnJvcnMgaW4gUGVybDUgbW9kdWxlLiAgTW9kdWxlcyBubwogICAgICAgICAgbG9uZ2VyIGNvcmUgZHVtcCB3aGVuIGEgUGVybCByZWZlcmVuY2UgaXMgaW5hZHZlcnRlbnRseQogICAgICAgICAgcGFzc2VkIGluIGFzIGEgQyBwb2ludGVyLgoKMy8xOC85NyA6IEFkZGVkIGEgImNoZWNrIiB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlCiAgICAgICAgICB2YWxpZGl0eSBvZiBmdW5jdGlvbiBpbnB1dCB2YWx1ZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIGludCBwb3NpbnQgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIkFyZ3VtZW50IGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIiKTsKICAgICAgICAgICAgICAgIH0KCjMvMTgvOTcgOiBBZGRlZCBhbiAkYXJnIHZhcmlhYmxlIHRvIFRjbCB0eXBlbWFwcy4gICBUaGlzIG1ha2VzIGl0IGVhc2llcgogICAgICAgICAgdG8gcmV0dXJuIGFyZ3VtZW50IHZhbHVlcyBieSAicmVmZXJlbmNlIi4KCjMvMTgvOTcgOiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBDKysgcmVmZXJlbmNlcyBhbmQKICAgICAgICAgIHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgozLzE4Lzk3IDogRml4ZWQgYSBmZXcgZ2xpdGNoZXMgaW4gdGhlIHR5cGVtYXAgbW9kdWxlIHdpdGggcmVzcGVjdCB0bwogICAgICAgICAgY2hhaW5pbmcuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAgJGluICAgICAgICAgICAgICAgIC8vIEluc2VydHMgcHJleGlzdGluZyB0eXBlbWFwCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWNlaXZlZCBhICVkXG4iLCAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGFsbG93ZWQgZm9yIHF1aXRlIHNvbWUgdGltZSwgYnV0IGRpZG4ndCB3b3JrCiAgICAgICAgICBpZiBubyBleGlzdGluZyB0eXBlbWFwIHdhcyBkZWZpbmVkLiAgTm93LCBpdCBzdGlsbCBkb2Vzbid0CiAgICAgICAgICB3b3JrIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgaXMgZGVmaW5lZCwgYnV0IGl0IGlzc3VlcyBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuICAgVGhlcmUgaXMgc29tZSBzdXBwb3J0IHVzaW5nIGRlZmF1bHQgdHlwZW1hcHMsCiAgICAgICAgICBidXQgbm9uZSBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB0YWtlIGFkdmFudGFnZSBvZiBpdC4gIFRoaXMKICAgICAgICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCBhdCB0aGlzIHRpbWUuCgpWZXJzaW9uIDEuMWI1IFBhdGNoIDEgKE1hcmNoIDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xNi85NyA6IEZpeGVkIHJlZmVyZW5jZXMgYnVnIHdpdGggQysrIGNvZGUgZ2VuZXJhdGlvbi4KCjMvMTYvOTcgOiBGaXhlZCBpbml0aWFsaXphdGlvbiBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIHRoYXQKICAgICAgICAgIHdhcyBjYXVzaW5nIHdlaXJkIHByb2JsZW1zLgoKMy8xNi85NyA6IEZpeGVkIGZhdGFsIGJ1ZyB3aXRoIC1jIG9wdGlvbiBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvMTMvOTcgOiBGaXhlZCBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGludm9sdmluZyB0aGUgJXRleHQgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgc29ydGluZy4gSW4gdGhlIG9sZCBzeXN0ZW0sICV0ZXh0IGVudHJpZXMgd291bGQgZmxvYXQgdG8gdGhlCiAgICAgICAgICB0b3Agb2YgYSBzZWN0aW9uIGJlY2F1c2UgdGhleSB3ZXJlICJuYW1lbGVzcyIuICAgTm93IHRoZXkgYXJlCiAgICAgICAgICBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gYW5kIHdpbGwgc3RheSBpbiB0aGUgcHJvcGVyCiAgICAgICAgICBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZW50cnkuCgpWZXJzaW9uIDEuMWI1IChNYXJjaCAxMiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzExLzk3IDogRml4ZWQgY29tcGlsYXRpb24gcHJvYmxlbXMgaW50cm9kdWNlZCBieSBUY2wvVGsgOC4wYTIuCiAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZICoqKiBTV0lHIG5vIGxvbmdlciB3b3JrcyB3aXRoIFRjbC9UayA4LjBhMS4KCjMvMTAvOTcgOiBGaXhlZCBidWcgd2l0aCBpZ25vcmVkIGFyZ3VtZW50cyBhbmQgQysrIG1lbWJlciBmdW5jdGlvbnMgaW4KICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlLgoKMy85Lzk3ICA6IFBhcnNpbmcgYnVncyB3aXRoIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBhbmQgcHJpdmF0ZWx5CiAgICAgICAgICBkZWNsYXJlZCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgZml4ZWQuCgozLzkvOTcgIDogRml4ZWQgYSBmZXcgbWlub3IgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2l0aCBDKysgY2xhc3NlcyBhbmQKICAgICAgICAgIGNvbnN0cnVjdG9ycy4gICBJbiBzb21lIGNhc2VzLCB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZQogICAgICAgICAgd291bGQgbm90IGNvbXBpbGUgcHJvcGVybHkuICAgU1dJRyBub3cgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgICB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQuCgozLzgvOTcgIDogQWRkZWQgYSAtbCBvcHRpb24gdG8gU1dJRyB0aGF0IGFsbG93cyBhZGRpdGlvbmFsIFNXSUcgbGlicmFyeSBmaWxlcwogICAgICAgICAgdG8gYmUgZ3JhYmJlZCB3aXRob3V0IGhhdmluZyB0aGVtIHNwZWNpZmllZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHRoZSBpbnRlcmZhY2UgZmlsZSBjbGVhbiBhbmQgbW92ZSBjZXJ0YWluCiAgICAgICAgICBvcHRpb25zIGludG8gYSBNYWtlZmlsZS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgIHN3aWcgLXRjbCBleGFtcGxlLmkgICAgICAgICAgICAgICMgIEJ1aWxkIGEgbm9ybWFsIFRjbCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC10Y2wgLWx3aXNoLmkgZXhhbXBsZS5pICAgICAjICBCdWlsZCBpdCBhcyBhIHdpc2ggZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgYnkgaW5jbHVkaW5nIHRoZSAnd2lzaC5pJyBmaWxlLgoKICAgICAgICAgICAgICBzd2lnIC1weXRob24gZXhhbXBsZS5pICAgICAgICAgICAjIEJ1aWxkIGEgZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtbGVtYmVkLmkgZXhhbXBsZS5pICMgQnVpbGQgYSBzdGF0aWMgZXh0ZW5zaW9uCgogICAgICAgICAgVGhlc2Uga2luZHMgb2Ygb3B0aW9ucyBjb3VsZCBwcmV2aW91c2x5IGJlIGFjY29tcGxpc2hlZCB3aXRoCiAgICAgICAgICBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgICAgICAlbW9kdWxlIGV4YW1wbGUKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgI2lmZGVmIFNUQVRJQwogICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgZW1iZWQuaQogICAgICAgICAgICAgICAgICAgI2VuZGlmCgozLzgvOTcgIDogSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gR3VpbGUgbW9kdWxlIHRvIHVzZSB0aGUgbmV3IGdoIGludGVyZmFjZQogICAgICAgICAgaW4gRlNGIEd1aWxlIDEuMC4gICAgVGhlIG9sZGVyIGdzY20gaW50ZXJmYWNlIHVzZWQgaW4gQ3lnbnVzCiAgICAgICAgICBHdWlsZSByZWxlYXNlcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IFNXSUcuCgozLzgvOTcgIDogQ2xlYW5lZCB1cCB0aGUgVGNsIE5ldHNjYXBlIHBsdWdpbiBleGFtcGxlLiAgIEl0IHNob3VsZCB3b3JrIHdpdGgKICAgICAgICAgIHZlcnNpb24gMS4xIG9mIHRoZSBwbHVnaW4gbm93LgoKMy84Lzk3ICA6IEFkZGVkIGJldHRlciBhcnJheSBzdXBwb3J0IHRvIHRoZSB0eXBlbWFwIG1vZHVsZS4gIFRoZSBrZXl3b3JkCiAgICAgICAgICBBTlkgY2FuIG5vdyBiZSB1c2VkIHRvIG1hdGNoIGFueSBhcnJheSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyB3aWxsIG1hdGNoIGFueSBzaW5nbGUtZGltZW5zaW9uYWwgZG91YmxlIGFycmF5LiAgIFRoZSBhcnJheQogICAgICAgICAgZGltZW5zaW9uIGlzIHBhc3NlZCBpbiB0aGUgdmFyaWFibGVzICRkaW0wLCAkZGltMSwgLi4uICRkaW05LiAgRm9yCiAgICAgICAgICBleGFtcGxlIDoKCgkJICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldW0FOWV1bQU5ZXSB7CgkJCXByaW50ZigiUmVjZWl2ZWQgYSBkb3VibGVbJWRdWyVkXVslZF1cbiIsJGRpbTAsJGRpbTEsJGRpbTIpOwoJICAgICAgICAgICAgfQoKICAgICAgICAgIEFueSB0eXBlbWFwIGludm9sdmluZyBhIHNwZWNpZmljIGFycmF5IGRpbWVuc2lvbiB3aWxsIG92ZXJyaWRlIGFueQogICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlIEFOWSB0YWcuICBUaHVzLCBhICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFs1XVs0XVtBTlldIHt9CiAgICAgICAgICB3b3VsZCBvdmVycmlkZSBhIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0uICBIb3dldmVyLCBvdmVydXNlIG9mIHRoZSBBTlkKICAgICAgICAgIHRhZyBpbiBhcnJheXMgb2YgaGlnaC1kaW1lbnNpb25zIG1heSBub3Qgd29yayBhcyB5b3UgZXhwZWN0IGR1ZSB0bwogICAgICAgICAgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZSB1c2VkLiBGb3IgZXhhbXBsZSwgd2hpY2ggb2YgdGhlIGZvbGxvd2luZwogICAgICAgICAgdHlwZW1hcHMgaGFzIHByZWNlZGVuY2U/CgogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXVs1XSB7fSAgICAgLy8gQXZvaWQgdGhpcyEKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgWzVdW0FOWV0ge30KCjMvNy85NyAgOiBGaXhlZCBhIG51bWJlciBvZiBidWdzIHJlbGF0ZWQgdG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgaGFuZGxpbmcuCiAgICAgICAgICBUeXBlZGVmcyBpbnZvbHZpbmcgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG5vdyB3b3JrcyBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIE1BVFJJWFs0XVs0XTsKCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGRvdWJsZSBmb28oTUFUUklYIGEpOwoKICAgICAgICAgIFR5cGVjYXN0aW5nIG9mIHBvaW50ZXJzIGludG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGlzIG5vdwogICAgICAgICAgaW1wbGVtZW50ZWQgcHJvcGVybHkgd2hlbiBtYWtpbmcgQy9DKysgZnVuY3Rpb24gY2FsbHMuCgozLzYvOTcgIDogRml4ZWQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJ1ZyBpbiB0aGUgVGNsIE9iamVjdC1vcmllbnRlZAogICAgICAgICAgaW50ZXJmYWNlLiAgV2VsbCwgYWN0dWFsbHksIGRpZG4ndCBmaXggaXQgYnV0IGlzc3VlZCBhCiAgICAgICAgICBUY2wgZXJyb3IgaW5zdGVhZC4gICBUaGUgYnVnIHdvdWxkIG1hbmlmZXN0IGl0c2VsZiBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XSAgICAgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0gICMgTWFrZSAkbSBpbnRvIGFuIG9iamVjdCBhc3N1bWluZyAkbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgcG9pbnRlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTaW5jZSAkbSA9PSAkbCwgJGwgZ2V0cyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoc2luY2UgaXRzIHRoZSBzYW1lIGNvbW1hbmQgbmFtZSkKICAgICAgICAgICAgICAgICAlICRtIGluc2VydCBGb28KICAgICAgICAgICAgICAgICBTZWdtZW50YXRpb24gZmF1bHQgICAgICAgIyBOb3RlIDogdGhlIGxpc3Qgbm8gbG9uZ2VyIGV4aXN0cyEKCiAgICAgICAgICBOb3csIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgcmVkZWZpbmluZyB0aGUgY29tbWFuZC4KICAgICAgICAgIEFzIGluIDoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0KICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXQogICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzIQoKICAgICAgICAgIFVzZSBjYXRjaHt9IHRvIGlnbm9yZSB0aGUgZXJyb3IuCgozLzMvOTcgIDogQmV0dGVyIHN1cHBvcnQgZm9yIGVudW1zIGFkZGVkLiAgIERhdGF0eXBlcyBvZiAnZW51bSBNeUVudW0nCiAgICAgICAgICBhbmQgdHlwZWRlZnMgc3VjaCBhcyAndHlwZWRlZiBlbnVtIE15RW51bSBGb287JyBub3cgd29yay4KCjMvMy85NyAgOiBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICBpbnQgYSxiOwogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyhpbnQgaSkgOiBhKDApLCBiKGkpLCBCYXIoaSwwKSB7IH07CiAgICAgICAgICAgICAgIH07CgozLzMvOTcgIDogTW9kaWZpZWQgcGFyc2VyIHRvIGlnbm9yZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpIHRocm93KFgsWSk7CgozLzMvOTcgIDogQWRkZWQgJWltcG9ydCBkaXJlY3RpdmUuICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAlZXh0ZXJuCiAgICAgICAgICBleGNlcHQgaXQgdGVsbHMgdGhlIGxhbmd1YWdlIG1vZHVsZSB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICBjb21pbmcgZnJvbSBhIHNlcGFyYXRlIG1vZHVsZS4gICBUaGlzIGlzIHVzdWFsbHkgb25seQogICAgICAgICAgbmVlZGVkIHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLgoKMy8yLzk3ICA6IENoYW5nZWQgcG9pbnRlciB0eXBlLWNoZWNrZXIgdG8gYmUgc2lnbmlmaWNhbnRseSBtb3JlCiAgICAgICAgICBlZmZpY2llbnQgd2hlbiB3b3JraW5nIHdpdGggZGVyaXZlZCBkYXRhdHlwZXMuICBUaGlzCiAgICAgICAgICBoYXMgYmVlbiBhY2NvbXBsaXNoZWQgYnkgc3RvcmluZyB0eXBlLW1hcHBpbmdzIGluIHNvcnRlZAogICAgICAgICAgb3JkZXIsIHVzaW5nIGJpbmFyeSBzZWFyY2ggc2NoZW1lcywgYW5kIGNhY2hpbmcgcmVjZW50bHkKICAgICAgICAgIHVzZWQgZGF0YXR5cGVzLiAgIEZvciBTV0lHIGdlbmVyYXRlZCBDKysgbW9kdWxlcyB0aGF0CiAgICAgICAgICBtYWtlIGEgbGFyZ2UgbnVtYmVyIG9mIEMgZnVuY3Rpb24gY2FsbHMgd2l0aCBkZXJpdmVkIHR5cGVzLAogICAgICAgICAgdGhpcyBjb3VsZCByZXN1bHQgaW4gc3BlZWR1cHMgb2YgYmV0d2VlbiAxMDAgYW5kIDUwMDAwIHBlcmNlbnQuCiAgICAgICAgICBIb3dldmVyLCBkdWUgdG8gdGhlIHJlcXVpcmVkIHNvcnRpbmcgb3BlcmF0aW9uLCBtb2R1bGUKICAgICAgICAgIGxvYWRpbmcgdGltZSBtYXkgaW5jcmVhc2VkIHNsaWdodGx5IHdoZW4gdGhlcmUgYXJlIGxvdHMgb2YKICAgICAgICAgIGRhdGF0eXBlcy4KCjMvMi85NyAgOiBGaXhlZCBzb21lIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIFB5dGhvbgogICAgICAgICAgZW1iZWQuaSBsaWJyYXJ5IGZpbGVzLgoKMi8yNy85NyA6IFNsaWdodCBjaGFuZ2UgdG8gQysrIGNvZGUgZ2VuZXJhdGlvbiB0byB1c2UgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgIHdoZW4gcmV0dXJuaW5nIGNvbXBsZXggZGF0YSB0eXBlIGJ5IHZhbHVlLgoKMi8yNi85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHdpdGggLWMgb3B0aW9uLgoKMi8yNi85NyA6IFNsaWdodCB0d2VhayBvZiBwYXJzZXIgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bWVyYXRpb25zCiAgICAgICAgICBzdWNoIGFzCgogICAgICAgICAgICAgICAgZW51bSBWYWx1ZSAoQUxFLCBTVE9VVCwgTEFHRVIsIH07CgoyLzI1Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBUY2wgbW9kdWxlIHdoZW4gdXNpbmcgdGhlCiAgICAgICAgICAlbmFtZSgpIGRpcmVjdGl2ZSBvbiBhIGNsYXNzbmFtZS4KCjIvMjUvOTcgOiBGaW5pc2hlZCBjb2RlLXNpemUgb3B0aW1pemF0aW9uIG9mIEMrKyBjb2RlIGdlbmVyYXRpb24gd2l0aAogICAgICAgICAgaW5oZXJpdGFuY2Ugb2YgYXR0cmlidXRlcy4gICAgSW5oZXJpdGVkIGF0dHJpYnV0ZXMgbm93CiAgICAgICAgICBvbmx5IGdlbmVyYXRlIG9uZSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgcmUtdXNlZAogICAgICAgICAgaW4gYW55IGRlcml2ZWQgY2xhc3Nlcy4gICBUaGlzIGNvdWxkIHByb3ZpZGUgYmlnIGNvZGUKICAgICAgICAgIHNpemUgaW1wcm92ZW1lbnRzIGluIHNvbWUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMuCgoyLzI1Lzk3IDogUGVybDUgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgYm90aCB0aGUgVW5peCBhbmQgV2luZG93cwogICAgICAgICAgdmVyc2lvbnMuICBUaGUgd2luZG93cyB2ZXJzaW9uIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZQogICAgICAgICAgQWN0aXZld2FyZSBwb3J0IG9mIFBlcmwgNS4wMDMgcnVubmluZyB1bmRlciBXaW5kb3dzIDk1LgogICAgICAgICAgVGhlIEMgc291cmNlIGdlbmVyYXRlZCBieSBTV0lHIHNob3VsZCBjb21waWxlIHdpdGhvdXQKICAgICAgICAgIG1vZGlmaWNhdGlvbiB1bmRlciBib3RoIHZlcnNpb25zIG9mIFBlcmwsIGJ1dCBpcyBub3cKICAgICAgICAgIGV2ZW4gbW9yZSBoaWRlb3VzIHRoYW4gYmVmb3JlLgoKMi8yNS85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBzY29wZSByZXNvbHV0aW9uIG9wZXJhdGlvbiB0bwogICAgICAgICAgYXBwZWFyIGluIGV4cHJlc3Npb25zIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBhcyBpbiA6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IGEgPSAgQmFyOjpkZWZ2YWx1ZSk7CgoyLzI1Lzk3IDogRml4ZWQgYnVnIHdoZW4gcmVzb2x2aW5nIHN5bWJvbHMgaW5zaWRlIEMrKyBjbGFzc2VzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZW51bSBWYWx1ZSB7QUxFLCBTVE9VVCwgTEFHRVJ9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB2b2lkIGRlZmFyZyhWYWx1ZSB2ID0gU1RPVVQpOwoKICAgICAgICAgICAgICB9OwoKMi8yNC85NyA6IEZpeGVkIGJ1ZyB3aXRoIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjIvMjMvOTcgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHRvIGJlIGJldHRlciBiZWhhdmVkIHVuZGVyIFdpbmRvd3MKCiAgICAgICAgICAgIC0gIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBub3cgcHJvcGVybHkgZXhwb3J0ZWQuCiAgICAgICAgICAgICAgIEl0IHNob3VsZCBub3QgYmUgbmVjY2Vzc2FyeSB0byBleHBsaWNpdGx5IGV4cG9ydCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIHlvdXJzZWxmLgoKICAgICAgICAgICAgLSAgQml6YXJyZSBjb21waWxhdGlvbiBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyCiAgICAgICAgICAgICAgIGNvZGUgYXMgQU5TSSBDIHVuZGVyIFZpc3VhbCBDKysgNC54IGZpeGVkLgoKICAgICAgICAgICAgLSAgVGVzdGVkIHdpdGggYm90aCB0aGUgc3RvY2sgUHl0aG9uLTEuNCBkaXN0cmlidXRpb24gYW5kIFB5dGhvbndpbgogICAgICAgICAgICAgICBydW5uaW5nIHVuZGVyIFdpbjk1LgoKMi8xOS85NyA6IEZpeGVkIHR5cGVkZWYgaGFuZGxpbmcgYnVnIGluIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMi8xOS85NyA6IEFkZGVkIGV4Y2VwdGlvbiBzdXBwb3J0LiAgVG8gdXNlIGl0LCBkbyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgJWV4Y2VwdChsYW5nKSB7CiAgICAgICAgICAgICAgICAgIC4uLiB0cnkgcGFydCBvZiB0aGUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgLi4uIGNhdGNoIHBhcnQgb2YgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAkZnVuY3Rpb24gaXMgYSBTV0lHIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKICAgICAgICAgIGFjdHVhbCBDL0MrKyBmdW5jdGlvbiBjYWxsIGluIGEgd3JhcHBlciBmdW5jdGlvbi4gIFRodXMsCiAgICAgICAgICBhIHJlYWwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gbWlnaHQgbG9vayBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICVleGNlcHQocGVybDUpIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNoYXIgKiYgc3opIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcHJvY2VzcyBhbiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvYWsoIlVua25vd24gZXhjZXB0aW9uLiBCYWlsaW5nIG91dC4uLiIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CgoyLzE5Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgbWFuYWdpbmcgZ2VuZXJpYyBjb2RlIGZyYWdtZW50cyAobmVlZGVkCiAgICAgICAgICBmb3IgZXhjZXB0aW9ucykuCgoyLzE5Lzk3IDogRml4ZWQgc29tZSByZWFsbHkgb2JzY3VyZSB0eXBlbWFwIHNjb3BpbmcgYnVncyBpbiB0aGUgQysrCiAgICAgICAgICBoYW5kbGVyLgoKMi8xOC85NyA6IENsZWFuZWQgdXAgcGVybG1haW4uaSBmaWxlIGJ5IHJlbW92aW5nIHNvbWUgcHJvYmxlbWF0aWMsCiAgICAgICAgICBidXQgc2VlbWluZ2x5IHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9ucy4KCjIvMTgvOTcgOiBPcHRpbWl6ZWQgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9ucyB1bmRlciBpbmhlcml0YW5jZS4KICAgICAgICAgIFNXSUcgY2FuIG5vdyB1c2Ugd3JhcHBlciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBhCiAgICAgICAgICBiYXNlIGNsYXNzIGluc3RlYWQgb2YgcmVnZW5lcmF0aW5nIHdyYXBwZXJzIGZvcgogICAgICAgICAgdGhlIHNhbWUgZnVuY3Rpb25zIGluIGEgZGVyaXZlZCBjbGFzcy4gICAgVGhpcyBjb3VsZAogICAgICAgICAgbWFrZSBhIGRyYXN0aWMgcmVkdWN0aW9uIGluIHdyYXBwZXIgY29kZSBzaXplIGZvciBDKysKICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIGRlZXAgaW5oZXJpdGFuY2UgaGllcmFyY2hpZXMgYW5kCiAgICAgICAgICBsb3RzIG9mIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBBZGRpdGlvbmFsIG1ldGhvZHMgc3BlY2lmaWVkIHdpdGggJWFkZG1ldGhvZHMgY2FuIG5vdwogICAgICAgICAgYmUgaW5oZXJpdGVkIGFsb25nIHdpdGggbm9ybWFsIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgoKMi8xOC85NyA6IE1pbm9yIGludGVybmFsIGZpeGVzIHRvIG1ha2UgU1dJRydzIHN0cmluZyBoYW5kbGluZyBhIGxpdHRsZQogICAgICAgICAgc2FmZXIuCgoyLzE2Lzk3IDogTW92ZWQgc29tZSBjb2RlIGdlbmVyYXRpb24gb2YgVGNsIHNoYWRvdyBjbGFzc2VzIHRvCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLgoKMi8xNi85NyA6IEZpeGVkIGRvY3VtZW50YXRpb24gZXJyb3Igb2YgJy1jb25maWd1cmUnIG1ldGhvZCBpbgogICAgICAgICAgVGNsIG1vZHVsZXMuCgoyLzE2Lzk3IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHNsaWdodGx5IHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICB0byB1c2UgUGVybCByZWZlcmVuY2VzLgoKMi8xMi85NyA6IEZpeGVkIGFyZ3VtZW50IGNoZWNraW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGJ5CiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyAoZnVuY3Rpb24gY2FsbHMgd2l0aCB0b28gbWFueQogICAgICAgICAgYXJndW1lbnRzIHdvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkKS4gIEZ1bmN0aW9ucyBub3cKICAgICAgICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzIEMgdmVyc2lvbgogICAgICAgICAgKHdpdGggcG9zc2liaWxpdHkgb2YgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIHN0aWxsIHN1cHBvcnRlZCkuCgoyLzEyLzk3IDogRml4ZWQgZGVmYXVsdCBhcmd1bWVudCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGdlbmVyYXRpbmcgd3JhcHBlciBmdW5jdGlvbnMgaW52b2x2aW5nIGRlZmF1bHQKICAgICAgICAgIGFyZ3VtZW50cyBvZiBjb21wbGV4IGRhdGF0eXBlcy4KCjIvMTIvOTcgOiBGaXhlZCB0eXBlbWFwIHNjb3BpbmcgcHJvYmxlbXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBnZXQgYSBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZG91YmxlIGJhcihkb3VibGUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIG5ldyBnZXQgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGFwcGx5IHRoZSBzZWNvbmQgdHlwZW1hcCB0byBhbGwgZnVuY3Rpb25zIGluIEZvbwogICAgICAgICAgZHVlIHRvIGRlbGF5ZWQgZ2VuZXJhdGlvbiBvZiBDKysgd3JhcHBlciBjb2RlIChjbGVhcmx5IHRoaXMKICAgICAgICAgIGlzIG5vdCB0aGUgZGVzaXJlZCBlZmZlY3QpLiAgIFByb2JsZW0gaGFzIGJlZW4gZml4ZWQgYnkKICAgICAgICAgIGFzc2lnbmluZyB1bmlxdWUgbnVtZXJpY2FsIGlkZW50aWZpZXJzIHRvIGV2ZXJ5IGRhdGF0eXBlIGluCiAgICAgICAgICBhbiBpbnRlcmZhY2UgZmlsZSBhbmQgcmVjb3JkaW5nIHRoZSAicmFuZ2Ugb2YgZWZmZWN0IiBvZiBlYWNoCiAgICAgICAgICB0eXBlbWFwLgoKMi8xMS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yICJpZ25vcmUiIGFuZCAiZGVmYXVsdCIgdHlwZW1hcHMuICBPbmx5IHVzZQogICAgICAgICAgaWYgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4KCjIvOS85NyAgOiBBZGRlZCBhdXRvbWF0aWMgY3JlYXRpb24gb2YgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IKICAgICAgICAgIEMgc3RydWN0cyBhbmQgQysrIGNsYXNzZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhbnkgc29ydCBvZgogICAgICAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgYnkKICAgICAgICAgIHJ1bm5pbmcgU1dJRyB3aXRoIHRoZSAnLW1ha2VfZGVmYXVsdCcgb3B0aW9uIG9yIGJ5IGluc2VydGluZwogICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW50byBhbiBpbnRlcmZhY2UgZmlsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEgbWFrZV9kZWZhdWx0CgogICAgICAgICAgVGhlIGZvbGxvd2luZyBwcmFnbWEgZGlzYWJsZXMgYXV0b21hdGljIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24KCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0CgoyLzkvOTcgIDogQWRkZWQgLW1ha2VfZGVmYXVsdCBvcHRpb24gZm9yIHByb2R1Y2luZyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGZvciBjbGFzc2VzIHdpdGhvdXQgdGhlbS4KCjIvOS85NyAgOiBDaGFuZ2VkIHRoZSBzeW50YXggb2YgdGhlIFNXSUcgJXByYWdtYSBkaXJlY3RpdmUgdG8KICAgICAgICAgICVwcmFnbWEgb3B0aW9uPXZhbHVlIG9yICVwcmFnbWEobGFuZykgb3B0aW9uPXZhbHVlLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWFrZXMgdGhlIHN5bnRheCBhIGxpdHRsZSBtb3JlIGNvbnNpc3RlbnQKICAgICAgICAgIGJldHdlZW4gZ2VuZXJhbCBwcmFnbWFzIGFuZCBsYW5ndWFnZS1zcGVjaWZpYyBwcmFnbWFzLgogICAgICAgICAgVGhlIG9sZCBzeW50YXggc3RpbGwgd29ya3MsIGJ1dCB3aWxsIHByb2JhYmx5IGJlIHBoYXNlZAogICAgICAgICAgb3V0IChhIHdhcm5pbmcgbWVzc2FnZSBpcyBjdXJyZW50bHkgcHJpbnRlZCkuCgoyLzkvOTcgIDogSW1wcm92ZWQgVGNsIHN1cHBvcnQgb2YgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBvZgogICAgICAgICAgc3RydWN0dXJlcywgY2xhc3NlcywgYW5kIHVuaW9ucy4KCjIvOS85NyAgOiBGaXhlZCBDKysgY29tcGlsYXRpb24gcHJvYmxlbSBpbiBQeXRob24gJ2VtYmVkLmknIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBtaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBwZXJsbWFpbi5pIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gcmV0dXJuIGFuIEF0dHJpYnV0ZUVycm9yIHdoZW4KICAgICAgICAgIHVuZGVmaW5lZCBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCAob2xkZXIgdmVyc2lvbnMgcmV0dXJuZWQKICAgICAgICAgIGEgTmFtZUVycm9yKS4KCjIvOS85NyAgOiBGaXhlZCBidWcgd2hlbiAlYWRkbWV0aG9kcyBpcyB1c2VkIGFmdGVyIGEgY2xhc3MgZGVmaW5pdGlvbiB3aG9zZQogICAgICAgICAgbGFzdCBzZWN0aW9uIGlzIHByb3RlY3RlZCBvciBwcml2YXRlLgoKMi84Lzk3ICA6IE1hZGUgc2xpZ2h0IGNoYW5nZXMgaW4gaW5jbHVkZSBmaWxlIHByb2Nlc3NpbmcgdG8gc3VwcG9ydAogICAgICAgICAgdGhlIE1hY2ludG9zaC4KCjIvOC85NyAgOiBFeHRlbmRlZCBzd2lnbWFpbi5jeHggdG8gcHJvdmlkZSBhIHJ1ZGltZW50YXJ5IE1hY2ludG9zaCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCdzIGEgcmVhbGx5IGJhZCBpbnRlcmZhY2UsIGJ1dCB3b3JrcyB1bnRpbCBzb21ldGhpbmcgYmV0dGVyCiAgICAgICAgICBpcyB3cml0dGVuLgoKMS8yOS85NyA6IEZpeGVkIHR5cGUtY2FzdGluZyBidWcgaW50cm9kdWNlZCBieSAxLjFiNCB3aGVuIHNldHRpbmcvZ2V0dGluZyB0aGUKICAgICAgICAgIHZhbHVlIG9mIGdsb2JhbCB2YXJpYWJsZXMgaW52b2x2aW5nIGNvbXBsZXggZGF0YSB0eXBlcy4KCjEvMjkvOTcgOiBSZW1vdmVkIGVycm9uZW91cyB3aGl0ZSBzcGFjZSBiZWZvcmUgYW4gI2VuZGlmIGluIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgYnkgdGhlIFB5dGhvbiBtb2R1bGUgKHdhcyBjYXVzaW5nIGVycm9ycyBvbiBERUMgQWxwaGEgY29tcGlsZXJzKS4KCjEvMjYvOTcgOiBGaXhlZCBlcnJvcnMgd2hlbiB1c2luZyBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cyBpbiBQeXRob24gc2hhZG93CgkgIHNoYWRvdyBjbGFzc2VzLgoKMS8yMy85NyA6IEZpeGVkIGJ1ZyB3aXRoIG5lc3RlZCAlZXh0ZXJuIGRlY2xhcmF0aW9ucy4KCjEvMjEvOTcgOiBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiBpbnZvbHZpbmcgY29uc3QgZGF0YXR5cGVzLgoKMS8yMS85NyA6IFNvbWV3aGF0IG9ic2N1cmUsIGJ1dCBzZXJpb3VzIGJ1ZyB3aXRoIGhhdmluZyBtdWx0aXBsZSBsZXZlbHMKICAgICAgICAgIG9mIHR5cGVkZWZzIGZpeGVkLiAgRm9yIGV4YW1wbGUgOgoKCQl0eXBlZGVmIGNoYXIgKlN0cmluZzsKICAgICAgICAgICAgICAgIHR5cGVkZWYgU3RyaW5nICBOYW1lOwoKVmVyc2lvbiAxLjEgQmV0YTQgKEphbnVhcnkgMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IFNXSUcgMS4xYjMgY3Jhc2hlZCBhbmQgYnVybmVkIHNob3J0bHkgYWZ0ZXIgdGFrZSBvZmYgZHVlCnRvIGEgZmV3IG1ham9yIHJ1bi10aW1lIHByb2JsZW1zIHRoYXQgc3VyZmFjZWQgYWZ0ZXIgcmVsZWFzZS4KVGhpcyByZWxlYXNlIHNob3VsZCBmaXggbW9zdCwgaWYgbm90IGFsbCwgb2YgdGhvc2UgcHJvYmxlbXMuCgoxLzE2Lzk3IDogRml4ZWQgbWFqb3IgbWVtb3J5IG1hbmFnZW1lbnQgYnVnIG9uIExpbnV4CgoxLzE0Lzk3IDogRml4ZWQgYnVnIGluIGZ1bmN0aW9ucyByZXR1cm5pbmcgY29uc3RhbnQgQysrIHJlZmVyZW5jZXMuCgoxLzE0Lzk3IDogTW9kaWZpZWQgQysrIG1vZHVsZSB0byBoYW5kbGUgZGF0YXR5cGVzIGJldHRlci4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgYSAqc2luZ2xlKiBzY29wZSByZXNvbHV0aW9uCiAgICAgICAgICBvcGVyYXRvciBpbiBkYXRhdHlwZXMuICBJZSA6IEZvbzo6YmFyLiAgIFNXSUcgZG9lc24ndAogICAgICAgICAgeWV0IGhhbmRsZSBuZXN0ZWQgY2xhc3Nlcywgc28gdGhpcyBzaG91bGQgYmUKICAgICAgICAgIHN1ZmZpY2llbnQgZm9yIG5vdy4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgdHlwZWRlZiBpbnNpZGUgYSBDKysgY2xhc3MuCgoxLzE0Lzk3IDogRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIGRhdGF0eXBlcyBkZWZpbmVkIGluc2lkZQogICAgICAgICAgYSBDKysgY2xhc3MuICBTV0lHIHdhcyBub3QgZ2VuZXJhdGluZyBjb3JyZWN0IGNvZGUsCiAgICAgICAgICBidXQgYSBuZXcgc2NvcGluZyBtZWNoYW5pc20gYW5kIG1ldGhvZCBmb3IgaGFuZGxpbmcKICAgICAgICAgIGRhdGF0eXBlcyBpbnNpZGUgYSBDKysgY2xhc3MgaGF2ZSBiZWVuIGFkZGVkLgoKMS8xNC85NyA6IENoYW5nZWQgZW51bWVyYXRpb25zIHRvIHVzZSB0aGUgdmFsdWUgbmFtZSBpbnN0ZWFkCiAgICAgICAgICBvZiBhbnkgdmFsdWVzIHRoYXQgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgICAgICBmaWxlLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBhIGxpdHRsZSBtb3JlIGZyaWVuZGx5IHRvCiAgICAgICAgICBDKysgY29tcGlsZXJzLgoKMS8xNC85NyA6IFJlbW92ZWQgdHlwZWRlZiBidWcgdGhhdCBtYWRlIGFsbCBlbnVtZXJhdGlvbnMKICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlciBpbiB0aGUgdHlwZSBjaGVja2VyIChzaW5jZQogICAgICAgICAgaXQgZ2VuZXJhdGVkIGFsb3Qgb2YgdW5uZWNlc3NhcnkgY29kZSkuCgpWZXJzaW9uIDEuMSBCZXRhMyAoSmFudWFyeSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBBICpodWdlKiBudW1iZXIgb2YgY2hhbmdlcyByZWxhdGVkIHRvIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KCjEuICBTdXBwb3J0IGZvciBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYWRkZWQuCgoyLiAgVHlwZW1hcHMgYWRkZWQuCgozLiAgU29tZSBzdXBwb3J0IGZvciBuZXN0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFkZGVkLgoKNC4gIERlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcgYWRkZWQuCgo1LiAgLWMgb3B0aW9uIGFkZGVkIGZvciBidWlsZGluZyBiYXJlIHdyYXBwZXIgY29kZSBtb2R1bGVzLgoKNi4gIFJld3JvdGUgUG9pbnRlciB0eXBlLWNoZWNraW5nIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKICAgIGNvcnJlY3RseS4KCjcuICBUY2wgOC4wIG1vZHVsZSBhZGRlZC4KCjguICBQZXJsNCBhbmQgR3VpbGUgbW9kdWxlcyByZXN1cnJlY3RlZCBmcm9tIHRoZSBkZWFkICh3ZWxsLCB0aGV5CiAgICBhdCBsZWFzdCB3b3JrIGFnYWluKS4KCjkuICBOZXcgT2JqZWN0IE9yaWVudGVkIFRjbCBpbnRlcmZhY2UgYWRkZWQuCgoxMC4gQnVnIGZpeGVzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMTEuIENsZWFuZWQgdXAgbWFueSBvZiB0aGUgaW50ZXJuYWwgbW9kdWxlcyBvZiB0aGUgcGFyc2VyLgoKMTIuIFRvbnMgb2YgZXhhbXBsZXMgYW5kIHRlc3RpbmcgbW9kdWxlcyBhZGRlZC4KCjEzLiBGaXhlZCBidWdzIHJlbGF0ZWQgdG8gdXNlIG9mICJjb25zdCIgcmV0dXJuIHZhbHVlcy4KCjE0LiBGaXhlZCBidWcgd2l0aCBDKysgbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMTUuIENoYW5nZWQgU1dJRyBjb25maWd1cmF0aW9uIHNjcmlwdC4KClZlcnNpb24gMS4xIEJldGEyIChEZWNlbWJlciAzLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCiAgIGludm9sdmVkIGFyZSB0b28gbnVtZXJvdXMgdG8gbWVudGlvbi4gIEJhc2ljYWxseSwgdGFrZSBldmVyeXRoaW5nCiAgIHlvdSBrbmV3IGFib3V0IHRoZSBvbGQgc3lzdGVtLCB0aHJvdyB0aGVtIG91dCwgYW5kIHJlYWQgdGhlCiAgIGZpbGUgRG9jL2RvYy5wcy4KCjIuIExpbWl0ZWQgc3VwcG9ydCBmb3IgI2lmIGRlZmluZWQoKSBhZGRlZC4KCjMuIFR5cGUgY2FzdHMgYXJlIG5vdyBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgaWUKCiAgICAgICAgICNkZWZpbmUgIEEgICAoaW50KSAzCgo0LiBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmIGxpc3RzLiAgRm9yIGV4YW1wbGUgOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgICAgZG91YmxlIHgseSx6OwogICAgICAgIH0gVmVjdG9yLCAqVmVjdG9yUHRyOwoKNS4gTmV3IFNXSUcgZGlyZWN0aXZlcyAocmVsYXRlZCB0byBkb2N1bWVudGF0aW9uIHN5c3RlbSkKCgklc3R5bGUKCSVsb2NhbHN0eWxlCgklc3Vic2VjdGlvbgoJJXN1YnN1YnNlY3Rpb24KCjYuIFJlb3JnYW5pemVkIHRoZSBDKysgaGFuZGxpbmcgYW5kIG1hZGUgaXQgYSBsaXR0bGUgZWFzaWVyIHRvCiAgIHdvcmsgd2l0aCBpbnRlcm5hbGx5LgoKNy4gIEZpeGVkIHByb2JsZW0gd2l0aCBpbmhlcml0aW5nIGRhdGEgbWVtYmVycyBpbiBQeXRob24KICAgIHNoYWRvdyBjbGFzc2VzLgoKOC4gIEZpeGVkIHN5bWJvbCB0YWJsZSBwcm9ibGVtcyB3aXRoIHNoYWRvdyBjbGFzc2VzIGluIGJvdGgKICAgIFB5dGhvbiBhbmQgUGVybC4KCjkuICBGaXhlZCBhbm5veWluZyBzZWdtZW50YXRpb24gZmF1bHQgYnVnIGluIHdyYXBwZXIgY29kZQogICAgZ2VuZXJhdGVkIGZvciBQZXJsNS4KCjEwLiBGaXhlZCBidWcgd2l0aCAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuICBOb3cgaXQgY2FuIGJlIHBsYWNlZAogICAgYW55d2hlcmUgaW4gYSBjbGFzcy4KCjExLiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQgdG8gdGhlIFNXSUcgc2VsZi10ZXN0LiAgIERvY3VtZW50YXRpb24KICAgIHRlc3RzIGFyZSBub3cgcGVyZm9ybWVkIGFsb25nIHdpdGggb3RoZXIgdGhpbmdzLgoKMTIuIFJlb3JnYW5pemVkIHRoZSBTV0lHIGxpYnJhcnkgYSBsaXR0bGUgYml0IGFuZCBzZXQgaXQgdXAgdG8KICAgIHNlbGYtZG9jdW1lbnQgaXRzZWxmIHVzaW5nIFNXSUcuCgoxMy4gTG90cyBhbmQgbG90cyBvZiBtaW5vciBidWcgZml4ZXMgKG1vc3RseSBvYnNjdXJlLCBidXQgYnVncwogICAgbm9uZXRoZWxlc3MpLgoKClZlcnNpb24gMS4xIEJldGExIChPY3RvYmVyIDMwLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEFkZGVkIG5ldyAlZXh0ZXJuIGRpcmVjdGl2ZSBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMKCjIuIFBlcmw1IHNoYWRvdyBjbGFzc2VzIGFkZGVkCgozLiBSZXdyb3RlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIHdvcmsgYmV0dGVyCgo0LiBBZGRlZCAnYm9vbCcgZGF0YXR5cGUKCjUuICV7LCV9IGJsb2NrIGlzIG5vdyBvcHRpb25hbC4KCjYuIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBtb2R1bGUKCjcuIFJld3JvdGUgYWxsIG9mIHRoZSBTV0lHIHRlc3RzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUKICAgKGFuZCBsZXNzIHNjYXJ5KS4KCjguIFJld3JvdGUgcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcgdG8gYmUgbW9yZSBtZW1vcnkKICAgZWZmaWNpZW50IGFuZCBmbGV4aWJsZS4KCjkuIENoYW5nZWQgcGFyc2VyIHRvIGlnbm9yZSAnc3RhdGljJyBkZWNsYXJhdGlvbnMuCgoxMC4gSW5pdGlhbGl6ZXJzIGFyZSBub3cgaWdub3JlZC4gIEZvciBleGFtcGxlIDoKCglzdHJ1Y3QgRm9vQmFyIGEgPSB7Myw0LDV9OwoKMTEuIFNvbWV3aGF0IGJldHRlciBwYXJzaW5nIG9mIGFycmF5cyAoYWx0aG91Z2ggaXQncwogICAgdXN1YWxseSBqdXN0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugbm93KS4KCjEyLiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMuCgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAzMSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gRml4ZWQgbWlub3IgYnVnIGluIEMrKyBtb2R1bGUKCjIuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBwb2ludGVyIHR5cGUtY2hlY2tlciB3aGVuIHVzaW5nCiAgIC1EQUxMT1dfTlVMTC4KCjMuIEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yayB3aXRoIFB5dGhvbiAxLjRiZXRhMwoKNC4gQ2hhbmdlZCBjb25maWd1cmUgc2NyaXB0IHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGhvdXQKICAgeWFjYyBvciBiaXNvbi4KClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMjgsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgQ2hhbmdlZCBwYXJzZXIgdG8gc3VwcG9ydCBtb3JlIEMvQysrIGRhdGF0eXBlcyAod2VsbCwKICAgIG1vcmUgdmFyaWFudHMpLiAgIFR5cGVzIGxpa2UgInVuc2lnbmVkIiwgInNob3J0IGludCIsCiAgICAibG9uZyBpbnQiLCBldGMuLi4gbm93IHdvcmsuCgoyLiAgInVuaW9ucyIgYWRkZWQgdG8gcGFyc2VyLgoKMy4gIFVzZSBvZiAidHlwZWRlZiIgYXMgaW4gOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgZG91YmxlIHgseSx6OwoJfSBWZWN0b3I7CgogICAgTm93IHdvcmtzIGNvcnJlY3RseS4gICBUaGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBpcyB1c2VkIGFzCiAgICB0aGUgc3RydWN0dXJlIG5hbWUuCgo0LiAgQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYsICNlbHNlLCAjZW5kaWYsIGV0Yy4uLgogICAgYWRkZWQuCgo1LiAgTmV3ICVkaXNhYmxlZG9jLCAlZW5hYmxlZG9jIGRpcmVjdGl2ZXMgYWxsb3cgZG9jdW1lbnRhdGlvbgogICAgdG8gc2VsZWN0aXZlbHkgYmUgZGlzYWJsZWQgZm9yIGNlcnRhaW4gcGFydHMgb2YgYSB3cmFwcGVyCiAgICBmaWxlLgoKNi4gIE5ldyBQeXRob24gbW9kdWxlIHN1cHBvcnRzIGJldHRlciB2YXJpYWJsZSBsaW5raW5nLCBjb25zdGFudHMsCiAgICBhbmQgc2hhZG93IGNsYXNzZXMuCgo3LiAgUGVybDUgbW9kdWxlIGltcHJvdmVkIHdpdGggYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBYUwogICAgYW5kIHhzdWJwcC4gICBTV0lHIHBvaW50ZXJzIGFuZCBub3cgY3JlYXRlZCBzbyB0aGF0IHRoZXkKICAgIGFyZSBjb21wYXRpYmxlIHdpdGggeHN1YnBwIHBvaW50ZXJzLgoKOC4gIFN1cHBvcnQgZm9yIFtpbmNyIFRjbF0gbmFtZXNwYWNlcyBhZGRlZCB0byBUY2wgbW9kdWxlLgoKOS4gICVwcmFnbWEgZGlyZWN0aXZlIGFkZGVkLgoKMTAuICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBhZGRlZC4KCjExLiAlbmF0aXZlIGRpcmVjdGl2ZSBhZGRlZCB0byBhbGxvdyBwcmUtZXhpc3Rpbmcgd3JhcHBlciBmdW5jdGlvbnMKICAgIHRvIGJlIHVzZWQuCgoxMi4gV3JvdGUgY29uZmlndXJlIHNjcmlwdCBmb3IgU1dJRyBpbnN0YWxsYXRpb24uCgoxMy4gRnVuY3Rpb24gcG9pbnRlcnMgbm93IGFsbG93ZWQgd2l0aCB0eXBlZGVmIHN0YXRlbWVudHMuCgoxNC4gJXR5cGVkZWYgbW9kaWZpZWQgdG8gaW5zZXJ0IGEgY29ycmVzcG9uZGluZyBDIHR5cGVkZWYgaW50bwogICAgdGhlIG91dHB1dCBmaWxlLgoKMTUuIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBDKysgcmVmZXJlbmNlcy4KCjE2LiBOZXcgU3RyaW5nIGFuZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3NlcyBhZGQgdG8gbWFrZSBnZW5lcmF0aW5nCiAgICB3cmFwcGVyIGNvZGUgZWFzaWVyLgoKMTcuIEZpeGVkIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZyB0byBlbGltaW5hdGUgY29yZSBkdW1wcwogICAgYW5kIHRvIGFsbG93IGhlbHAgbWVzc2FnZXMuCgoxOC4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzIHRvIGFsbW9zdCBhbGwgY29kZSBtb2R1bGVzCgoKVmVyc2lvbiAxLjAgQmV0YSAzIChQYXRjaCAxKSBKdWx5IDE3LCAxOTk2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4wIEZpbmFsIGlzIG5vdCBxdWl0ZSByZWFkeSB5ZXQsIGJ1dCB0aGlzIHJlbGVhc2UgZml4ZXMgYQpudW1iZXIgb2YgaW1tZWRpYXRlIHByb2JsZW1zIDoKCjEuICBDb21waWxlciBlcnJvcnMgd2hlbiB1c2luZyAtc3RyaWN0IDEgdHlwZSBjaGVja2luZyBoYXZlIGJlZW4gZml4ZWQuCgoyLiAgUG9pbnRlciB0eXBlIGNoZWNrZXIgbm93IHJlY29nbml6ZXMgcG9pbnRlcnMgb2YgdGhlIGZvcm0KICAgIF8wX1R5cGUgY29ycmVjdGx5LgoKMy4gIEEgZmV3IG1pbm9yIGZpeGVzIHdlcmUgbWFkZSBpbiB0aGUgTWFrZWZpbGUKClZlcnNpb24gMS4wIEJldGEgMyAoSnVuZSAxNCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpUaGVyZSBhcmUgbG90cyBvZiBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSA6CgoxLiAgU1dJRyBpcyBub3cgaW52b2tlZCB1c2luZyB0aGUgInN3aWciIGNvbW1hbmQgaW5zdGVhZCBvZiAid3JhcCIuCiAgICBIZXksIHN3aWcgc291bmRzIGNvb2xlci4KCjIuICBUaGUgU1dJR19MSUIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlCiAgICBsb2NhdGlvbiB3aGVyZSBTV0lHIGxvb2tzIGZvciBsaWJyYXJ5IGZpbGVzLgoKMy4gIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgIFlvdSBzaG91bGQgdXNlIHRoZSAtYysrIG9wdGlvbgogICAgdG8gZW5hYmxlIGl0LgoKNC4gIFRoZSAlaW5pdCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICVtb2R1bGUgZGlyZWN0aXZlLgogICAgJW1vZHVsZSBjb25zdHJ1Y3RzIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICBmb3Igd2hhdGV2ZXIgdGFyZ2V0IGxhbmd1YWdlIHlvdSdyZSB1c2luZyAoYWN0dWFsbHkgdGhpcyBtYWtlcwogICAgU1dJRyBmaWxlcyBhIGxpdHRsZSBjbGVhbmVyKS4gIFRoZSBvbGQgJWluaXQgZGlyZWN0aXZlIHN0aWxsIHdvcmtzLgoKNS4gIFRoZSBzeW50YXggb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgIFVzZSBvZiB0aGUKICAgIG9sZCBvbmUgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWF5IHN0aWxsIHdvcmsuCgo2LiAgVG8gc3VwcG9ydCBUY2wvVGsgb24gbm9uLXVuaXggcGxhdGZvcm1zLCBTV0lHIGltcG9ydHMgYSBmaWxlIGNhbGxlZAogICAgc3dpZ3RjbC5jZmcgZnJvbSB0aGUgJChTV0lHX0xJQikvdGNsIGRpcmVjdG9yeS4gICBJIGRvbid0IGhhdmUgYWNjZXNzCiAgICB0byBhbiBOVCBtYWNoaW5lLCBidXQgdGhpcyBmaWxlIGlzIHN1cHBvc2VkbHkgYWxsb3dzIFNXSUcgdG8KICAgIHByb2R1Y2Ugd3JhcHBlciBjb2RlIHRoYXQgY29tcGlsZXMgb24gYm90aCBVTklYIGFuZCBub24gVU5JWCBtYWNoaW5lcy4KICAgIElmIHRoaXMgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBmaWxlIHN3aWd0Y2wuY2ZnLiBQbGVhc2UKICAgIGxldCBtZSBrbm93IGlmIHRoaXMgZG9lc24ndCB3b3JrIHNvIEkgY2FuIHVwZGF0ZSB0aGUgZmlsZSBhcwogICAgbmVjZXNzYXJ5LgoKNy4gIFRoZSBTV0lHIHJ1bi10aW1lIHR5cGVjaGVja2VyIGhhcyBiZWVuIGltcHJvdmVkLiAgICBZb3UgY2FuIGFsc28KICAgIG5vdyByZWRlZmluZSBob3cgaXQgd29ya3MgYnkgc3VwcGx5aW5nIGEgZmlsZSBjYWxsZWQgInN3aWdwdHIuY2ZnIgogICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgQnkgZGVmYXVsdCwKICAgIFNXSUcgcmVhZHMgdGhpcyBmaWxlIGZyb20gJChTV0lHX0xJQikvY29uZmlnLgoKOC4gIFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyA6CgoJLSAgRG9jdW1lbnRhdGlvbiBvcmRlciBpcyBwcmludGVkIGluIGludGVyZmFjZSBmaWxlIG9yZGVyIGJ5CiAgICAgICAgICAgZGVmYXVsdC4gICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHB1dHRpbmcgYW4gJWFscGhhCiAgICAgICAgICAgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAtICBZb3UgY2FuIHN1cHBseSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCB1c2luZwoKICAgICAgICAgICAldGV4dCAleyBwdXQgeW91ciB0ZXh0IGhlcmUgJX0KCiAgICAgICAgLSAgQSBmZXcgbWlub3IgYnVncyB3ZXJlIGZpeGVkLgoKOS4gIEEgZmV3IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZCBsaW5lCiAgICBvcHRpb25zIChidXQgaXQncyBzdGlsbCBub3QgZmluaXNoZWQpLgoKMTAuICBMb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBpbiBtb3N0IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGhhdmUgYmVlbgogICAgIG1hZGUuCgoxMS4gRmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDguMyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgU1dJRwogICAgcG9ydCB0byBub24tdW5peCBwbGF0Zm9ybXMgKHdvcmsgaW4gcHJvZ3Jlc3MpLgoKMTIuIEMrKyBmaWxlIHN1ZmZpeCBpcyBub3cgLmN4eCAoZm9yIHNhbWUgcmVhc29uKS4KCjEzLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGdyYWRlZCBzaWduaWZpY2FudGx5IGFuZCBpcyBub3cKICAgIGFyb3VuZCAxMDAgcGFnZXMuICAgIEkgYWRkZWQgbmV3IGV4YW1wbGVzIGFuZCBhIHNlY3Rpb24gb24KICAgIEMrKy4gIFRoZSBkb2N1bWVudGF0aW9uIG5vdyBpbmNsdWRlcyBhIFRhYmxlIG9mIENvbnRlbnRzLgoKMTQuIFRoZSBTV0lHIEV4YW1wbGVzIGRpcmVjdG9yeSBpcyBzdGlsbCB3b2VmdWxseSBzcGFyc2UsIGJ1dCBpcwogICAgZ2V0dGluZyBiZXR0ZXIuCgpTcGVjaWFsIG5vdGljZSBhYm91dCBDKysKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB0byBzdXBwb3J0IEMrKyBwYXJzaW5nLiAgQ3VycmVudGx5CnRoZSBDKysgaXMgZmFyIGZyb20gY29tcGxldGUsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBzaW1wbGUgY2FzZXMuCk5vIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBhZGQgc3BlY2lhbCBDKysgcHJvY2Vzc2luZyB0byBhbnkgb2YKdGhlIHRhcmdldCBsYW5ndWFnZXMuICAgU2VlIHRoZSB1c2VyIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBob3cKQysrIGlzIGhhbmRsZWQuICAgSWYgeW91IGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgQysrIGltcGxlbWVudGF0aW9uLApwbGVhc2UgbGV0IG1lIGtub3cuICBFeHBlY3QgbWFqb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgYXJlYS4KCk5vdGUgOiBJIGhhdmUgb25seSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIGFuZCBDKysgd2l0aCBUY2wgYW5kClB5dGhvbi4KCk5vdGljZSBhYm91dCBWZXJzaW9uIDEuMEZpbmFsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJzaW9uIDEuMEIzIGlzIHRoZSBsYXN0IEJldGEgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiAxLjAgRmluYWwgaXMKcmVsZWFzZWQuICBJIGhhdmUgZnJvemVuIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDEuMAphbmQgd2lsbCBvbmx5IGZpeCBidWdzIGFzIHRoZXkgc2hvdyB1cC4gIFdvcmsgb24gU1dJRyB2ZXJzaW9uIDIuMCBpcwphbHJlYWR5IGluIHByb2dyZXNzLCBidXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHJhdGhlciBzaWduaWZpY2FudApjaGFuZ2VzIHRvIFNXSUcncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGhvcGVmdWxseSBmb3IgdGhlIGJldHRlcikuICBObwphbnRpY2lwYXRlZCBkYXRlIGZvciB2ZXJzaW9uIDIuMCBpcyBzZXQsIGJ1dCBpZiB5b3UndmUgZ290IGFuIGlkZWEsCmxldCBtZSBrbm93LgoKVmVyc2lvbiAxLjAgQmV0YSAyIChBcHJpbCAyNiwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhpcyByZWxlYXNlIGlzIGlkZW50aWNhbCB0byBCZXRhMSBleGNlcHQgYSBmZXcgbWlub3IgYnVncyBhcmUKZml4ZWQgYW5kIHRoZSBTV0lHIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNS9UayA0LjEuCkEgdGNsNy41IGV4YW1wbGVzIGRpcmVjdG9yeSBpcyBub3cgaW5jbHVkZWQuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBNYWtlZmlsZSB0aGF0IGRpZG4ndCBpbnN0YWxsIHRoZSBsaWJyYXJpZXMKICBjb3JyZWN0bHkuCgotIFNXSUcgTGlicmFyeSBmaWxlcyBhcmUgbm93IHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUgYW5kIFRrIDQuMS4KCi0gTWlub3IgYnVnIGZpeGVzIGluIG90aGVyIG1vZHVsZXMuCgoKVmVyc2lvbiAxLjAgQmV0YSAxICAoQXByaWwgMTAsIDE5OTYpLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoaXMgaXMgdGhlIGZpcnN0ICJzZW1pLW9mZmljaWFsIiByZWxlYXNlIG9mIFNXSUcuICAgIEl0IGhhcyBhCm51bWJlciBvZiBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgb3ZlciB0aGUgQWxwaGEgcmVsZWFzZS4gICBUaGVzZQpub3RlcyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci0taG9wZSBJIHJlbWVtYmVyZWQgZXZlcnl0aGluZy4uLi4KCjEuICBUY2wvVGsKClNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFRjbDcuMywgVGszLjYgYW5kIGxhdGVyIHZlcnNpb25zLgpJJ3ZlIGFsc28gdGVzdGVkIFNXSUcgd2l0aCBleHBlY3QtNS4xOS4KCk5vcm1hbGx5IFNXSUcgZXhwZWN0cyB0byB1c2UgdGhlIGhlYWRlciBmaWxlcyAidGNsLmgiIGFuZCAidGsuaCIuCk5ld2VyIHZlcnNpb25zIG9mIFRjbC9UayB1c2UgdmVyc2lvbiBudW1iZXJzLiAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZQppbiBTV0lHIGFzIGZvbGxvd3MgOgoKICAgICAgICAlIHdyYXAgLWh0Y2wgdGNsNy40LmggLWh0ayB0azQuMC5oIGV4YW1wbGUuaQoKT2YgY291cnNlLCBJIHByZWZlciB0byBzaW1wbHkgc2V0IHVwIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gInRjbC5oIiBhbmQKdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIG9uIHRoZSBtYWNoaW5lLgoKMi4gIFBlcmw0CgpUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIFBlcmwtNC4wMzUuICBTV0lHJ3MgaW50ZXJmYWNlIHRvClBlcmw0IGlzIGJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGluIHRoZSAiUHJvZ3JhbW1pbmcgUGVybCIKYm9vayBieSBMYXJyeSBXYWxsLCBhbmQgZmlsZXMgbG9jYXRlZCBpbiB0aGUgInVzdWIiIGRpcmVjdG9yeSBvZiB0aGUKUGVybDQgZGlzdHJpYnV0aW9uLgoKSW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFBlcmw0LCB5b3UnbGwgbmVlZCB0byBsaW5rIHdpdGggdGhlIHVwZXJsLm8KZmlsZSBmb3VuZCBpbiB0aGUgUGVybDQgc291cmNlIGRpcmVjdG9yeS4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIHRoaXMKZmlsZSB0byBhIG1vcmUgY29udmVuaWVudCBsb2NhdGlvbi4KCjMuICBQZXJsNQoKVGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzIGFsb3QgbGVzcwpidWdneSB0aGFuIHRoZSBhbHBoYSByZWxlYXNlLiAgICAgU1dJRyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5IG9mCnRoZSBYUyBsYW5ndWFnZSBhbmQgeHN1YnBwIHN1cHBsaWVkIHdpdGggUGVybDUuICBDdXJyZW50bHkgU1dJRwpwcm9kdWNlcyB0aGUgbmVjZXNzYXJ5IEMgY29kZSBhbmQgLnBtIGZpbGUgbmVlZGVkIHRvIGR5bmFtaWNhbGx5CmxvYWQgYSBtb2R1bGUgaW50byBQZXJsNS4KClRvIHN1cHBvcnQgUGVybDUncyBub3Rpb24gb2YgbW9kdWxlcyBhbmQgcGFja2FnZXMgKGFzIHdpdGggeHN1YnBwKSwKeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyA6CgogICAgICAgICUgd3JhcCAtcGVybDUgLW1vZHVsZSBNeU1vZHVsZSAtcGFja2FnZSBNeVBhY2thZ2UgZXhhbXBsZS5pCgpOb3RlIDogSW4gb3JkZXIgZm9yIGR5bmFtaWMgbG9hZGluZyB0byBiZSBlZmZlY3RpdmUsIHlvdSBuZWVkIHRvIGJlCmNhcmVmdWwgYWJvdXQgbmFtaW5nLiAgICBGb3IgYSBtb2R1bGUgbmFtZWQgIk15TW9kdWxlIiwgeW91J2xsIG5lZWQgdG8KY3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmaWxlIGNhbGxlZCAiTXlNb2R1bGUuc28iIHVzaW5nIHNvbWV0aGluZyBsaWtlCgogICAgICAgICUgbGQgLXNoYXJlZCBteV9vYmoubyAtbyBNeU1vZHVsZS5zbwoKVGhlIHVzZSBvZiB0aGUgJWluaXQgZGlyZWN0aXZlIG11c3QgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIHNpbmNlIFBlcmw1CmNhbGxzIGEgZnVuY3Rpb24gImJvb3RfTW9kdWxlTmFtZSIgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MuClNlZSB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBnZXQgdGhpbmdzCnRvIHdvcmsuCgo0LiAgUHl0aG9uMS4zCgpUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlIHN1cHBvcnRpbmcgUHl0aG9uLiAgICBUaGUgUHl0aG9uIHBvcnQgaXMKZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmV3cml0dGVuLiAgIFZhcmlhYmxlIGxpbmthZ2UgaXMgZG9uZSB0aHJvdWdoCmZ1bmN0aW9ucyB3aGljaCBpcyBzb3J0IG9mIGEga2x1ZGdlLiAgSSBhbHNvIHRoaW5rIGl0IHdvdWxkIGJlIG5pY2UKdG8gaW1wb3J0IFNXSUcgcG9pbnRlcnMgaW50byBQeXRob24gYXMgYSBuZXcgb2JqZWN0IChpbnN0ZWFkIG9mIHN0cmluZ3MpLgpPZiBjb3Vyc2UsIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrLgoKNS4gIEd1aWxlMwoKSWYgeW91IHJlYWxseSB3YW50IHRvIGxpdmUgb24gdGhlIGVkZ2UsIHBpY2sgdXAgYSBjb3B5IG9mIEd1aWxlLWlpaSBhbmQKcGxheSBhcm91bmQgd2l0aCB0aGlzLiAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC0tLWVzcGVjaWFsbHkgc2luY2UKSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9mZmljaWFsIHN0YXRlIG9mIEd1aWxlIGlzIHRoZXNlIGRheXMuICBUaGlzCmltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgc2hvdWxkIEkgc3VkZGVubHkgZmlndXJlIG91dCBiZXR0ZXIKd2F5cyB0byBkbyB0aGluZ3MuCgo2LiAgRXh0ZW5kaW5nIFNXSUcKClNXSUcgaXMgd3JpdHRlbiBpbiBDKysgYWx0aG91Z2ggSSB0ZW5kIHRvIHRoaW5rIG9mIHRoZSBjb2RlIGFzIG1vc3RseQpiZWluZyBBTlNJIEMgd2l0aCBhIGxpdHRsZSBpbmhlcml0YW5jZSB0aHJvd24gaW4uICAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UKaXMgaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCklmIHlvdSB3YW50IHRvIGFkZCB5b3VyIG93biBtb2RpZmljYXRpb25zLCBzZWUgQXBwZW5kaXggQyBvZiB0aGUgdXNlcgptYW51YWwuICAgVGhlbiB0YWtlIGEgbG9vayBhdCB0aGUgInVzZXIiIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb21lCmNvZGUgZm9yIGJ1aWxkaW5nIHlvdXIgb3duIGV4dGVuaW9ucy4KCjcuIFRoZSBTV0lHIGxpYnJhcnkKClRoZSBTV0lHIGxpYnJhcnkgaXMgc3RpbGwgaW5jb21wbGV0ZS4gIFNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbgp0aGUgdXNlciBtYW51YWwgYXJlIHVuYXZhaWxhYmxlLiAgICBUaGVzZSBmaWxlcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCndoZW4gdGhleSBhcmUgcmVhZHkuICAgU3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBmb3IgYW5ub3VuY2VtZW50cwphbmQgdXBkYXRlcy4KCjguIFNXSUcgRG9jdW1lbnRhdGlvbgoKSSBoYXZlIHNvbWV0aW1lcyBleHBlcmllbmNlZCBwcm9ibGVtcyB2aWV3aW5nIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gaW4Kc29tZSBwb3N0c2NyaXB0IHZpZXdlcnMuICAgSG93ZXZlciwgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gcHJpbnQKbm9ybWFsbHkuICAgIEknbSB3b3JraW5nIG9uIG1ha2luZyBtdWNoIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9ubGluZSwKYnV0IHRoaXMgdGFrZXMgdGltZS4KClZlcnNpb24gMC4xIEFscGhhIChGZWJydWFyeSA5LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBSdW4tdGltZSB0eXBlLWNoZWNraW5nIG9mIFNXSUcgcG9pbnRlcnMuICAgUG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZAogICAgYXMgc3RyaW5ncyB3aXRoIGJvdGggbnVtZXJpYyBhbmQgZW5jb2RlZCB0eXBlIGluZm9ybWF0aW9uLiAgICBUaGlzIG1ha2VzCiAgICBpdCBhIGxpdHRsZSBoYXJkZXIgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgKGFuZCBpdCBlbGltaW5hdGVzCiAgICBzb21lIHNlZ21lbnRhdGlvbiBmYXVsdHMgYW5kIG90aGVyIG9kZGl0aWVzKS4KCjIuICBQeXRob24gMS4zIG5vdyBzdXBwb3J0ZWQuCgozLiAgI2RlZmluZSBhbmQgZW51bSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIGNvbnN0YW50cy4KCjQuICBDb21wbGV0ZWx5IHJld3JvdGUgdGhlICVpbmNsdWRlIGRpcmVjdGl2ZSBhbmQgbWFkZSBpdCBhbG90IG1vcmUgcG93ZXJmdWwuCgo1LiAgUmVzdHJ1Y3R1cmVkIHRoZSBTV0lHIGxpYnJhcnkgdG8gbWFrZSBpdCB3b3JrIGJldHRlci4KCjYuICBWYXJpb3VzIGJ1ZyBmaXhlcyB0byBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIGltcGxlbWVudGF0aW9ucy4KCjcuICBCZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgJXR5cGVkZWYgZGlyZWN0aXZlLgoKOC4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIFNXSUcncyBjbGFzcyBzdHJ1Y3R1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXhwYW5kLgogICAgU1dJRyBpcyBub3cgYnVpbHQgaW50byBhIGxpYnJhcnkgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIG1ha2UgeW91cgogICAgb3duIGV4dGVuaW9ucy4KCjkuICBNYWRlIGV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLgoKMTAuIE1pbm9yIGNoYW5nZXMgdG8gdGhlIFNXSUcgcGFyc2VyIHRvIG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5LgogICAgQWxzbyB0b29rIG91dCBzb21lIGV4dHJhbmVvdXMgcnVsZXMgdGhhdCB3ZXJlIHVuZG9jdW1lbnRlZCBhbmQKICAgIGRpZG4ndCB3b3JrIGluIHRoZSBmaXJzdCBwbGFjZS4KCjExLiBUaGUgU1dJRyBsaWJyYXJ5IGZpbGVzICJ0Y2xzaCIsICJ3aXNoIiwgImV4cGVjdCIsIGV0Yy4uLiBpbiB0aGUgZmlyc3QKICAgIHJlbGVhc2UgaGF2ZSBiZWVuIHJlc3RydWN0dXJlZCBhbmQgcmVuYW1lZCB0byAidGNsc2guaSIsICJ3aXNoLmkiLAogICAgYW5kIHNvIG9uLgo=