PWhlYWQxIE5BTUUKCkNoYW5nZXMgLSBBcGFjaGUgbW9kX3BlcmwgY2hhbmdlcyBsb2dmaWxlCgo9aGVhZDEgQ0hBTkdFUwoKYWxsIGNoYW5nZXMgd2l0aG91dCBhdXRob3IgYXR0cmlidXRpb24gYXJlIGJ5IERvdWcgTWFjRWFjaGVybgoKQWxzbyByZWZlciB0byB0aGUgQXBhY2hlOjpUZXN0IGNoYW5nZXMgbG9nIGZpbGUsIGF0IEFwYWNoZS1UZXN0L0NoYW5nZXMKCj1vdmVyIDMKCj1pdGVtIDIuMC4xMS1yYzEKCkZpeCBbQ1ZFLTIwMTEtMjc2N10gQXJiaXRyYXJ5IFBlcmwgY29kZSBleGVjdXRpb24gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHVzZXIKYWNjb3VudCB2aWEgYSB1c2VyLW93bmVkIC5odGFjY2Vzcy4gUGF0Y2ggZnJvbSBidWdzLmRlYmlhbi5vcmcgIzY0NDE2OS4gW0phbgpJbmd2b2xkc3RhZCA8amFuaStkZWJpYW4tMjAxMStAaWZpLnVpby5ubz5dCgpGaXggcG90ZW50aWFsIHRlc3Qgc3VpdGUgaGFuZ3MgZHVlIHRvIHBpcGVsaW5lZCByZXNwb25zZSBkZWFkbG9ja3MuIFBhdGNoCmZyb20gcnQuY3Bhbi5vcmcgIzgyNDA5LiBbWmVmcmFtIDx6ZWZyYW1AZnlzaC5vcmc+XQoKRml4IHQvY29tcGF0L3JlcXVlc3QudCBmYWlsdXJlcyBbU3RldmUgSGF5XQoKRml4IHVzZS1hZnRlci1mcmVlIHNlZ2ZhdWx0IGluIGFwX3NlcnZlcl9jb25maWdfZGVmaW5lcyBzZWVuIG9uIHN0YXJ0LXVwIG9uCk9wZW5CU0QuIFtGb3VuZC9maXhlZCBieSBTYW0gVmF1Z2hhbi9Kb2UgT3J0b25dCgpGaXggYnVpbGQgd2l0aCBQZXJscyBlYXJsaWVyIHRoYW4gNS4xMy42LiBbUmFpbmVyIEp1bmcKPHJhaW5lci5qdW5nQGtpcHBkYXRhLmRlPl0KCkZpeCBmaWx0ZXIvaW5fYmJzX2luamVjdF9oZWFkZXIudCB0ZXN0IGZhaWx1cmUgd2l0aCBBcGFjaGUgMi40LjI1Ky4gW1N0ZWZhbgpGcml0c2NoIDxzZkBzZnJpdHNjaC5kZT5dCgpGaXggYXBhY2hlL3JlYWQudCB0ZXN0IGZhaWx1cmUgd2l0aCBBcGFjaGUgMi40LjI1Ky4gW05pa28gVHluaQo8bnR5bmlAZGViaWFuLm9yZz5dCgo9aXRlbSAyLjAuMTAgT2N0b2JlciAyNywgMjAxNgoKRGVjbGFyZSBNUF92dGJsX2VudiBhbmQgTVBfdnRibF9lbnZlbGVtIGFzICdleHRlcm4nIHRvIGZpeCBsaW5rZXIgZXJyb3JzIG9uCk9TWC9EYXJ3aW4uIFtNaWNoYWVsIFNjaG91dCA8bXNjaG91dEBna2cubmV0Pl0KCkF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjODkgb3B0aW9uIHdoZW4gbW9kcGVybCBpcyBiZWluZwpidWlsdCB3aXRoIGVpdGhlciBnY2MgNSBvciBjbGFuZy4gW0tsYXVzIFMuIE1hZHNlbiA8a3NtQGpvYmluZGV4LmRrPl0KCkZpeCBub24tdGhyZWFkZWQgUGVybCA1LjIyLnggYnVpbGQgYW5kIHRlc3RzLiBbS2xhdXMgUy4gTWFkc2VuCjxrc21Aam9iaW5kZXguZGs+XQoKQWRkIHN1cHBvcnQgZm9yIFBlcmwgNS4yMi54LiBbTmlrbyBUeW5pIDxudHluaUBpa2kuZmk+LCBTdGV2ZSBIYXldCgo9aXRlbSAyLjAuOSBKdW5lIDE4LCAyMDE1CgpBZGQgbm90ZSB0byBSRUFETUUgYWJvdXQgTVBfSU5MSU5FIHByb2JsZW0gd2hlbiBidWlsZGluZyB3aXRoIEdDQyA1LgpbTmlrbyBUeW5pIDxudHluaUBkZWJpYW4ub3JnPl0KCkZpeCB0L2FwaS9hcGxvZy50IGZvciBhcHItMS41LjIuIFtTdGV2ZSBIYXldCgpOb3RlIHRoYXQgUGVybCA1LjIyLnggaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuIFRoaXMgaXMgbG9nZ2VkIGFzCkNQQU4gUlQjMTAxOTYyIGFuZCB3aWxsIGhvcGVmdWxseSBiZSBhZGRyZXNzZWQgaW4gMi4wLjEwLiBbU3RldmUgSGF5XQoKRml4IHVudGhyZWFkZWQgYnVpbGQsIHdoaWNoIHdhcyBicm9rZW4gaW4gMi4wLjktcmMyLiBbU3RldmUgSGF5XQoKUmVtb3ZlIFBlcmxJbnRlcnBTY29wZS4gVGhpcyBoYXMgbm90IGJlZW4gd29ya2luZyBwcm9wZXJseSB3aXRoIHRocmVhZGVkCk1QTXMgd2l0aCBodHRwZC0yLjQueCBhbmQgdGhlIHVzZS1jYXNlIG9mIHRoaXMgZGlyZWN0aXZlIHdhcyBxdWVzdGlvbmFibGUuCltKYW4gS2FsdXphXQoKQWxsb3cgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSB3aXRoIGh0dHBkLTIuNC54IHdoZW4gbW9kX2FjY2Vzc19jb21wYXQgaXMgbm90CmxvYWRlZC4gW1N0ZXZlIEhheV0KCkFkZCBzdXBwb3J0IGZvciBBcGFjaGUgaHR0cGQtMi40LnguIFtUb3JzdGVuIEZvZXJ0c2NoLCBKYW4gS2FsdXphLApTdGV2ZSBIYXksIEdvemVyXQoKRG9uJ3QgY2FsbCBtb2RwZXJsX3RocmVhZGVkX21wbSgpIGV0IGFsLiBmcm9tIFhTIGNvZGUuIEZpeGVzIERlYmlhbiBCdWcKIzc2NTE3NC4gW05pa28gVHluaSA8bnR5bmlAZGViaWFuLm9yZz5dCgpNYWtlIHN1cmUgbW9kcGVybF9pbnRlcnBfc2VsZWN0IHVzZXMgci0+c2VydmVyIHJhdGhlciB0aGFuIHRoZSBwYXNzZWQgcwpwYXJhbWV0ZXIgdG8gZmluZCB0aGUgaW50ZXJwcmV0ZXIgcG9vbCB0byBwdWxsIGFuIGludGVycHJldGVyIGZyb20uIFRoaXMKZml4ZXMgYW4gaXNzdWUgd2l0aCB2aG9zdHMgd2l0aCBhIHNlcGFyYXRlIGludGVycHJldGVyIHBvb2wgYW5kIHJ1bnRpbWUKZGlyLWNvbmZpZyBtZXJnZXMgdGhhdCB1c2VkIHRvIHB1bGwgdGhlIGludGVycHJldGVyIGZyb20gdGhlIHdyb25nIHBvb2wuCltUb3JzdGVuIEZvZXJ0c2NoXQoKUGVybEludGVycFNjb3BlIGlzIG5vdyBtb3JlIGFkdmlzb3J5LiBVc2luZyAkKGN8ciktPnBub3RlcyB3aWxsIGJpbmQKdGhlIGN1cnJlbnQgaW50ZXJwcmV0ZXIgdG8gdGhhdCBvYmplY3QgZm9yIGl0J3MgbGlmZXRpbWUuCiQoY3xyKS0+cG5vdGVzX2tpbGwoKSBjYW4gYmUgdXNlZCB0byBwcmVtYXR1cmVseSBkcm9wIHBub3RlcyBhbmQKcmVtb3ZlIHRoaXMgYmluZGluZy4gW1RvcnN0ZW4gRm9lcnRzY2hdCgpOb3cgY29ycmVjdGx5IGludm9rZXMgUGVybENsZWFudXBIYW5kbGVycywgZXZlbiBpZiB0aGV5IGFyZSB0aGUgb25seQpoYW5kbGVyIHR5cGUgY29uZmlndXJlZCBmb3IgdGhhdCByZXF1ZXN0IFtUb3JzdGVuIEZvZXJ0c2NoXQoKRm9yIHRocmVhZGVkIE1QTXMsIGNoYW5nZSBpbnRlcnByZXRlciBtYW5hZ21lbnQgdG8gYSBuZXcsIHJlZmVyZW5jZS1jb3VudGVkCmFsbG9jYXRpb24gbW9kZWwuIFtUb3JzdGVuIEZvZXJ0c2NoXQoKRXhwb3NlIG1vZHBlcmxfaW50ZXJwX3Bvb2xfdCB2aWEgTW9kUGVybDo6SW50ZXJwUG9vbCwgbW9kcGVybF90aXBvb2xfdAp2aWEgTW9kUGVybDo6VGlQb29sIGFuZCBtb2RwZXJsX3RpcG9vbF9jb25maWdfdCB2aWEgTW9kUGVybDo6VGlQb29sQ29uZmlnCltUb3JzdGVuIEZvZXJ0c2NoXQoKRXhwb3NlIG1vZHBlcmxfaW50ZXJwX3QgdmlhIE1vZFBlcmw6OkludGVycHJldGVyIFtUb3JzdGVuIEZvZXJ0c2NoXQoKRml4IHQvY29tcGF0L2FwYWNoZV9maWxlLnQgb24gV2luZG93cy4gQXBhY2hlOjpGaWxlLT50bXBmaWxlKCkgd2FudHMgVE1QRElSCm9yIFRFTVAgZnJvbSB0aGUgZW52aXJvbm1lbnQsIG9yIGVsc2UgZGVmYXVsdHMgdG8gL3RtcC4gVGhlIGxhdHRlciBpcyBubwpnb29kIG9uIFdpbmRvd3MsIHNvIG1ha2Ugc3VyZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwYXNzZWQgdGhyb3VnaC4KKFRFTVAgc2hvdWxkIGJlIHNldCB0byBzb21ldGhpbmcgc3VpdGFibGUgb24gV2luZG93cy4pIFtTdGV2ZSBIYXldCgpGaXggdC9hcGkvZXJyX2hlYWRlcnNfb3V0LnQgd2l0aCBIVFRQOjpIZWFkZXJzID4gNi4wMC4gW1JvbGFuZG8KPHJvbG9zd29ybGRAZ21haWwuY29tPl0KCkZpeCB0aGUgYnVpbGQgd2l0aCBWQysrIGFuZCBkbWFrZSAocmF0aGVyIHRoYW4gbm1ha2UpIG9uIFdpbmRvd3MuIFRoZQpNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgQXBhY2hlMjo6QnVpbGQgdXNlcyBzaGVsbCBjb21tYW5kcyBmb3IgdGhlIG1hbmlmZXN0CmZpbGUsIGJ1dCBuZWdsZWN0ZWQgdG8gdGVsbCBkbWFrZSB0byB1c2UgdGhlIHNoZWxsLiBbU3RldmUgSGF5XQoKRG9uJ3Qgd3JpdGUgYW4gJ3JwbScgdGFyZ2V0IGludG8gdGhlIE1ha2VmaWxlIG9uIFdpbmRvd3MuIEl0IGlzbid0IHJlbGV2YW50Cm9uIFdpbmRvd3MsIGFuZCB0aGUgKGhhcmQtY29kZWQsIG5vdCBNYWtlTWFrZXItZ2VuZXJhdGVkKSByZWNpcGUgZ3JvdXAgaGFzCnN5bnRheCB3aGljaCBkbWFrZSBkb2Vzbid0IHVuZGVyc3RhbmQuIFtTdGV2ZSBIYXldCgo9aXRlbSAyLjAuOCBBcHJpbCAxNywgMjAxMwoKUGVybCA1LjE2LjMncyBmaXggZm9yIGEgcmVoYXNoLWJhc2VkIERvUyBtYWtlcyBpdCBtb3JlIGRpZmZpY3VsdCB0byBpbnZva2UKdGhlIHdvcmthcm91bmQgZm9yIHRoZSBvbGQgaGFzaCBjb2xsaXNpb24gYXR0YWNrLCB3aGljaCBicmVha3MgbW9kX3Blcmwncwp0L3BlcmwvaGFzaF9hdHRhY2sudC4gUGF0Y2ggZnJvbSBydC5jcGFuLm9yZyAjODM5MTYgaW1wcm92ZXMgdGhlIGZpeApwcmV2aW91c2x5IGFwcGxpZWQgYXMgcmV2aXNpb24gMTQ1NTM0MC4gW1plZnJhbV0KCk9uIFBlcmwgNS4xNy42IGFuZCBhYm92ZSwgaGFzaCBzZWVkaW5nIGhhcyBjaGFuZ2VkLCBhbmQgSHZSRUhBU0ggaGFzCmRpc2FwcGVhcmVkLiBQYXRjaCB0byB1cGRhdGUgbW9kX3BlcmwgYWNjb3JkaW5nbHkgZnJvbSBydC5jcGFuLm9yZyAjODM5MjEuCltaZWZyYW1dCgpSZXN0b3JlIGJ1aWxkIHdpdGggUGVybCA1LjguMSwgNS44LjIgZXRjOiB0YWtlIGNhcmUgdG8gdXNlCiRDb25maWd7dXNlaXRocmVhZHN9IHJhdGhlciB0aGFuICRDb25maWd7dXNldGhyZWFkc30sIGFuZCBzdXBwbHkgZGVmaW5pdGlvbnMKb2YgTmV3eCBhbmQgTmV3eHogYXMgbmVjZXNzYXJ5LiBbU3RldmUgSGF5XQoKT24gUGVybCA1LjE3LjksIHQvYXBhY2hlL3JlYWQyLnQgZmFpbHMgYmVjYXVzZSBhbiAidW5pbml0aWFsaXplZCB2YWx1ZSIKd2FybmluZyBpcyBnZW5lcmF0ZWQgZm9yIHRoZSBidWZmZXIgYmVpbmcgYXV0b3ZpdmlmaWVkLiBUaGlzIGlzIGJlY2F1c2UKdGhlIHN2X3NldHB2bigpIHRoYXQncyBtZWFudCB0byB2aXZpZnkgdGhlIGJ1ZmZlciBkb2Vzbid0IHBlcmZvcm0gc2V0Cm1hZ2ljOyB0aGUgd2FybmluZyBpcyBnZW5lcmF0ZWQgYnkgdGhlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBTdlBWX2ZvcmNlKCkuClBhdGNoIHRvIGZpeCB0aGlzIGZyb20gcnQuY3Bhbi5vcmcgIzgzOTIyLiBbWmVmcmFtXQoKRml4IHQvcGVybC9oYXNoX2F0dGFjay50IHRvIHdvcmsgd2l0aCBQZXJsIDUuMTQuNCwgNS4xNi4zIGV0Yywgd2hpY2gKY29udGFpbiBhIGZpeCBmb3IgQ1ZFLTIwMTMtMTY2NyAobWVtb3J5IGV4aGF1c3Rpb24gd2l0aCBhcmJpdHJhcnkgaGFzaAprZXlzKS4gVGhpcyByZXNvbHZlcyBydC5wZXJsLm9yZyAjMTE2ODYzLCBmcm9tIHdoZXJlIHRoZSBwYXRjaCB3YXMgdGFrZW4uCltIdWdvIHZhbiBkZXIgU2FuZGVuXQoKdXNlIEFQUjo6RmluZm8gaW5zdGVhZCBvZiBQZXJsJ3Mgc3RhdCgpIGluIE1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyIHRvCmdlbmVyYXRlIEhUVFAgY29kZSA0MDQgZXZlbiBpZiB0aGUgcmVxdWVzdGVkIGZpbGVuYW1lIGNvbnRhaW5zIG5ld2xpbmVzCltUb3JzdGVuXQoKUmVtb3ZlIGFsbCB1c2VzIG9mIGRlcHJlY2F0ZWQgY29yZSBwZXJsIHN5bWJvbHMuIFtTdGV2ZSBIYXldCgpBZGQgYnJhbmNoIHJlbGVhc2UgdGFnIHRvICdtYWtlIHRhZycgdGFyZ2V0LiBbUGhyZWRdCgo9aXRlbSAyLjAuNyBKdW5lIDUsIDIwMTIKCkZpeCBicmVha2FnZSBjYXVzZWQgYnkgcmVtb3ZhbCBvZiBQTF91aWQgZXQgYWwgZnJvbSBwZXJsIDUuMTYuMC4gUGF0Y2ggZnJvbQpydC5jcGFuLm9yZyAjNzcxMjkuIFtaZWZyYW1dCgo9aXRlbSAyLjAuNiBBcHJpbCAyNCwgMjAxMgoKUHJlc2VydmUgNS44IGNvbXBhdGliaWxpdHkgc3Vycm91bmRpbmcgdXNlIG9mIE1VVEFCTEVfQ1YgW0FkYW0gUHJpbWVdCgpNb3ZlIGNvZGUgYWZ0ZXIgZGVjbGFyYXRpb25zIHRvIGtlZXAgTVNWQysrIGNvbXBpbGVyIGhhcHB5LiBbU3RldmUgSGF5XQoKQWRvcHQgbW9kcGVybF9wY3cuYyBjaGFuZ2VzIGZyb20gaHR0cGQyNCBicmFuY2guIFtUb3JzdGVuIEZvZXJ0c2NoXQoKUG9vbCBjbGVhbnVwIGZ1bmN0aW9ucyBtdXN0IG5vdCBsb25nam1wLiBDYXRjaCB0aGVzZSBleGNlcHRpb25zIGFuZCB0dXJuCnRoZW0gaW50byB3YXJuaW5ncy4gW1RvcnN0ZW4gRm9lcnRzY2hdIAoKRml4IGEgcmFjZSBjb25kaXRpb24gaW4gb3VyIHRpcG9vbCBtYW5hZ2VtZW50LgpTZWUgaHR0cDovL3d3dy5nb3NzYW1lci10aHJlYWRzLmNvbS9saXN0cy9tb2RwZXJsL2Rldi8xMDQwMjYKUGF0Y2ggc3VibWl0dGVkIGJ5OiBTYWx1c2FTZWNvbmR1cyA8c2FsdXNhQG5hdGlvbnN0YXRlcy5uZXQ+ClJldmlld2VkIGJ5OiBUb3JzdGVuIEZvZXJ0c2NoCgpFbnN1cmUgdGhhdCBNUF9BUFhTIGlzIHNldCB3aGVuIGJ1aWxkaW5nIG9uIFdpbjMyIHdpdGggTVBfQVBfUFJFRklYLApvdGhlcndpc2UgdGhlIGJ1bmRsZWQgUmVsb2FkIGFuZCBTaXplTGltaXQgYnVpbGRzIHdpbGwgZmFpbCB0byBmaW5kIGEKcHJvcGVybHkgY29uZmlndXJlZCBUZXN0IGVudmlyb25tZW50LgpbU3RldmUgSGF5XQoKRml4IGEgZmV3IFJFRkNOVCBidWdzLgpQYXRjaCBzdWJtaXR0ZWQgYnk6IE5pa28gVHluaSA8bnR5bmlAZGViaWFuLm9yZz4KUmV2aWV3ZWQgYnk6IFRvcnN0ZW4gRm9lcnRzY2gKCkNvcnJlY3QgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBidWlsZCBjb25maWcgaW4gTW9kUGVybDo6TU0uIFRoZSBnbG9iYWwKdmFyaWFibGUgd2FzIG9ubHkgYmVpbmcgc2V0IG9uY2Ugb24gbG9hZGluZyB0aGUgbW9kdWxlLCB3aGljaCB3YXMgYmVmb3JlCkFwYWNoZTI6OkJ1aWxkQ29uZmlnLnBtIGhhZCBiZWVuIHdyaXR0ZW4sIGxlYWRpbmcgdG8gY3dkIGFuZCBNUF9MSUJOQU1FCmJlaW5nIHVuc2V0IHdoZW4gd3JpdGluZyB0aGUgUmVsb2FkIGFuZCBTaXplTGltaXQgbWFrZWZpbGVzLgpbU3RldmUgSGF5XQoKRGlzY292ZXIgYXByLTItY29uZmlnIGZyb20gQXBhY2hlIDIuNCBvbndhcmRzLiBbR296ZXJdCgpBcGFjaGUgMi40IGFuZCBvbndhcmRzIGRvZXNuJ3QgcmVxdWlyZSBsaW5raW5nIHRoZSBNUE0gbW9kdWxlIGRpcmVjdGx5IGluCnRoZSBodHRwZCBiaW5hcnkgYW55bW9yZS4gQVBYUyBsb3N0IHRoZSBNUE1fTkFNRSBxdWVyeSwgc28gd2UgY2FuJ3QgYXNzdW1lCmEgZ2l2ZW4gTVBNIGFueW1vcmUuIEludHJvZHVjZSBhIGZha2UgTVBNICdkeW5hbWljJyB0byByZXByZXNlbnQgdGhpcy4gCltUb3JzdGVuIEZvZXJ0c2NoLCBHb3plcl0KClBlcmwgNS4xNCBicm91Z2h0IGEgZmV3IGNoYW5nZXMgaW4gUGVybF9zdl9kdXAoKSB0aGF0IG1hZGUgYSB0aHJlYWRlZCBhcGFjaGUKc2VnZmF1bHQgd2hpbGUgY2xvbmluZyBpbnRlcnByZXRlcnMuCltUb3JzdGVuIEZvZXJ0c2NoXQoKUGVybElPQXBhY2hlX2ZsdXNoKCkgYW5kIG1weHNfQXBhY2hlMl9fUmVxdWVzdFJlY19yZmx1c2goKSBub3cgbm8gbG9uZ2VyIHRocm93CmV4Y2VwdGlvbnMgd2hlbiBtb2RwZXJsX3didWNrZXRfZmx1c2goKSBmYWlscyBpZiB0aGUgZmFpbHVyZSB3YXMganVzdCBhIHJlc2V0CmNvbm5lY3Rpb24gb3IgYW4gYWJvcnRlZCBjb25uZWN0aW9uLiBUaGUgZmFpbHVyZSBpcyBzaW1wbHkgbG9nZ2VkIHRvIHRoZSBlcnJvcgpsb2cgaW5zdGVhZC4gVGhpcyBzaG91bGQgZml4IGNhc2VzIG9mIGh0dHBkLmV4ZSBjcmFzaGluZyB3aGVuIHVzZXJzIHByZXNzIHRoZQpTdG9wIGJ1dHRvbiBpbiB0aGVpciB3ZWIgYnJvd3NlcnMuCltTdGV2ZSBIYXldCgpGaXhlZCBhIGZldyBpc3N1ZXMgdGhhdCBjYW1lIHVwIHdpdGggTFdQIDYuMDA6Ci0gdC9yZXNwb25zZS9UZXN0QVBJL3JlcXVlc3RfcmVjLnBtIGFzc3VtZXMgSFRUUC8xLjAgYnV0IExXUCA2IHVzZXMgMS4xCi0gdC9hcGkvZXJyX2hlYWRlcnNfb3V0LnQgZmFpbHMgZHVlIHRvIGEgYnVnIHNvbWV3aGVyZSBpbiBMV1AgNgotIHQvZmlsdGVyL1Rlc3RGaWx0ZXIvb3V0X3N0cl9yZXZlcnNlLnBtIHNlbmRzIHRoZSB3cm9uZyBjb250ZW50LWxlbmd0aCBoZWFkZXIKW1RvcnN0ZW4gRm9lcnRzY2hdCgpCdWdmaXg6IEFwYWNoZTI6OlNlcnZlclV0aWw6OmdldF9zZXJ2ZXJ7ZGVzY3JpcHRpb24sYmFubmVyLHZlcnNpb259IGNhbm5vdApiZSBkZWNsYXJlZCBhcyBwZXJsIGNvbnN0YW50cyBvciB0aGV5IHdvbid0IHJlZmxlY3QgYWRkZWQgdmVyc2lvbiBjb21wb25lbnRzCmlmIEFwYWNoZTI6OlNlcnZlclV0aWwgaXMgbG9hZGVkIGJlZm9yZSB0aGUgUG9zdENvbmZpZyBwaGFzZS4gTm93LCB0aGV5CmFyZSBvcmRpbmFyeSBwZXJsIGZ1bmN0aW9ucy4gW1RvcnN0ZW4gRm9lcnRzY2hdCgpDaGVjayBmb3IgdGhlIHJpZ2h0IEV4dFV0aWxzOjpFbWJlZCB2ZXJzaW9uIGR1cmluZyBidWlsZCBbVG9yc3RlbiBGb2VydHNjaF0KClRha2UgYSBsZXNzb24gZnJvbSBydC5jcGFuLm9yZyAjNjYwODUgYW5kIHBhc3MgTERfTElCUkFSWV9QQVRIIGlmIG1vZF9lbnYKaXMgcHJlc2VudC4gIFNob3VsZCBwcmV2ZW50IHRlc3QgZmFpbHVyZXMgb24gc29tZSBwbGF0Zm9ybXMuCltGcmVkIE1veWVyXQoKCj1pdGVtIDIuMC41IEZlYnJ1YXJ5IDcsIDIwMTEKClRoZSBtb2RfcGVybCBQTUMgZGVkaWNhdGVzIHRoaXMgcmVsZWFzZSBvZiBtb2RfcGVybCB0byBSYW5keSBLb2Jlcywgd2hvCnBhc3NlZCBhd2F5IGluIFNlcHRlbWJlciAyMDEwLiAgUmFuZHkgd2FzIGEgbWVtYmVyIG9mIHRoZSBtb2RfcGVybCBwcm9qZWN0IAptYW5hZ2VtZW50IGNvbW1pdHRlZSBhbmQgYSBjby1hdXRob3Igb2YgdGhlIG1vZF9wZXJsIERldmVsb3BlcidzIENvb2tib29rLgpIaXMgd29yayBoZWxwZWQgbWFueSBXaW5kb3dzIG1vZF9wZXJsIHVzZXJzLiBIaXMgd29yayB3aXRoIHBwbSBmaWxlcywgYW5kCldpbjMyIHBlcmwgdXNlcnMgd2lsbCBiZSBzb3JlbHkgbWlzc2VkLiBIZSB3YXMga2luZCwgYnJpZ2h0LCBhbmQgYWx3YXlzCndpbGxpbmcgdG8gbGVuZCBhIGhhbmQgb24gdGhlIG1vZF9wZXJsIHVzZXIncyBsaXN0LgoKUHJlcGFyZSBtb2RwZXJsIGZvciB0aGUgdXBjb21pbmcgcGVybCA1LjE0IFtUb3JzdGVuIEZvZXJ0c2NoXQoKQWRkIGxpYi9Nb2RQZXJsL01ldGhvZExvb2t1cC5wbSB0byBNQU5JRkVTVCB2aWEgbGliL01vZFBlcmwvTWFuaWZlc3QucG0KUlQgIzQ4MTAzIHJlcG9ydGVkIGJ5IE1BUktMRUBjcGFuLm9yZwpbRnJlZCBNb3llcl0KClBlcmxJT0FwYWNoZV93cml0ZSgpIG5vdyB0aHJvd3MgYW4gQVBSOjpFcnJvciBvYmplY3QsIHJhdGhlciB0aGFuIGp1c3QgYSBzdHJpbmcKZXJyb3IsIGlmIG1vZHBlcmxfd2J1Y2tldF93cml0ZSgpIGZhaWxzLgpbU3RldmUgSGF5XQoKQXV0aGVudGljYXRpb24gdGVzdHMgZmFpbCB3aXRoIExXUCA1LjgxNSBhbmQgbGF0ZXIKW0RvdWcgU2NocmFnXQoKQ29uY2lzZSB0ZXN0IHdvbid0IHBlcmZvcm0gdW5sZXNzIFN0YXR1c1RlcnNlIGlzIHNldCB0byBPTgpbRG91ZyBTY2hyYWddCgpMb29rIGZvciBhIHVzYWJsZSBhcHhzIGluICRFTlZ7UEFUSH0gaWYgYWxsIG90aGVyIG9wdGlvbnMgZmFpbCwgdGhlbiBwcm9tcHQgdGhlIHVzZXIgZm9yIG9uZS4KW1BocmVkXQoKV29yayBhcm91bmQgYm9vdHN0cmFwIHdhcm5pbmdzIHdoZW4gQXBhY2hlMjo6QnVpbGRDb25maWcgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LgpbUGhyZWRdCgpSZW1vdmUgQXBhY2hlOjp0ZXN0IGNvbXBhdGliaWxpdHkgKHBhcnQgb2YgbW9kX3BlcmwgMS4yLjcpLCB0aGF0IGNvZGUgY2F1c2VzIGJ1aWxkIGlzc3VlcyBhbmQgaXMgNCB2ZXJzaW9ucyBvdXQgb2YgZGF0ZS4KW1BocmVkXQoKTWFrZSBzdXJlIHBlcmwgaXMgYnVpbHQgZWl0aGVyIHdpdGggbXVsdGlwbGljaXR5IGFuZCBpdGhyZWFkcyBvciB3aXRob3V0CmJvdGggW1RoZW9yeSwgVG9yc3Rlbl0KClN1cHBvcnQgZm9yICJpbnN0YWxsX3ZlbmRvciIgYW5kICJpbnN0YWxsX3NpdGUiIG1ha2UgdGFyZ2V0cyBbVG9yc3Rlbl0KClJ1biB0ZXN0cyBvbiBidW5kbGVkIHB1cmUgcGVybCBBcGFjaGU6OiogbW9kdWxlcyBbR296ZXIsIFBocmVkXQoKSW1wbGVtZW50IGEgbWluaS1wcmVwcm9jZXNzIGxhbmd1YWdlIGZvciBtYXAtZmlsZXMgaW4geHMvbWFwcy4KW1RvcnN0ZW4gRm9lcnRzY2hdCgpJbXBsZW1lbnQgQVBSOjpTb2NrZXQ6OmZpbGVubyBbVG9yc3RlbiBGb2VydHNjaF0KCkV4cG9ydCBQUk9YWVJFUV9SRVNQT05TRSwgYSBtaXNzaW5nIFBST1hZUkVRXyogY29uc3RhbnQgW0dvemVyXQoKTWFrZSBzdXJlIHN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHByZXNlcnZlZCBieSB0aGUgcGVybC1zY3JpcHQKaGFuZGxlciBbVG9yc3RlbiBGb2VydHNjaF0KCkZpeCB0aGUgZmlsdGVyIGluaXQgaGFuZGxlciBhdHRyaWJ1dGUgY2hlY2sgaW4gCm1vZHBlcmxfZmlsdGVyX3Jlc29sdmVfaW5pdF9oYW5kbGVyKCkgW1RvcnN0ZW4gRm9lcnRzY2hdCgpNYWtlIHN1cmUgYnVmZmVyIGlzIGEgdmFsaWQgU1YgaW4gbW9kcGVybF9maWx0ZXJfcmVhZCgpIFtUb3JzdGVuIEZvZXJ0c2NoXQoKTW92ZSBtb2RwZXJsX3Jlc3BvbnNlX2ZpbmlzaCgpIG91dCBvZiBtb2RwZXJsX3Jlc3BvbnNlX2hhbmRsZXJfcnVuIGluCm1vZF9wZXJsLmMgW1RvcnN0ZW4gRm9lcnRzY2hdCgoiTU9EUEVSTF9JTkM9IG5vdyBjb3JyZWN0bHkgc3VwcG9ydGVkIGFzIGFuIGFyZ3VtZW50IHRvIE1ha2VmaWxlLlBMIgpbVG9yc3RlbiBGb2VydHNjaF0KCkZpeCBhbiBYU1MgaXNzdWUgaW4gQXBhY2hlMjo6U3RhdHVzIHJlcG9ydGVkIGJ5IFJpY2hhcmQgSi4gQnJhaW4KPHJpY2hhcmRAcHJvY2hlY2t1cC5jb20+LiBbVG9yc3RlbiBGb2VydHNjaF0KCkFkZCBOT1RJQ0UgZmlsZSB0byB0aGUgZGlzdHJpYnV0aW9uLiBbSm9lIFNjaGFlZmVyXQoKTWFrZSBzdXJlIEFwYWNoZTI6OlJlcXVlc3RJTzo6cmVhZCBkb2Vzbid0IGNsZWFyIHRoZSBidWZmZXIgb24gZW5kIG9mCmZpbGUgYW5kIGhhbmRsZSBuZWdhdGl2ZSBvZmZzZXRzIGFuZCBvZmZzZXRzIHRoYXQgYXJlIGxhcmdlciB0aGFuCnRoZSBjdXJyZW50IHN0cmluZyBsZW5ndGguIFtUb3JzdGVuIEZvZXJ0c2NoXQoKRml4IGEgcHJvYmxlbSB0aGF0IGNvdWxkIG1ha2UgQVBSOjpYU0xvYWRlciBhbmQgQXBhY2hlMjo6WFNMb2FkZXIKbG9hZCB0aGUgd3Jvbmcgc2hhcmVkIGxpYnJhcnkuIFtUb3JzdGVuIEZvZXJ0c2NoXQoKRml4IGNvbXBpbGF0aW9uIHdoZW4gdXNpbmcgYSBub24tdGhyZWFkZWQgQVBSLgpbR296ZXIsIFBoaWxpcCBNLiBHb2xsdWNjaV0KCk1ha2Ugc3VyZSBtb2RfcGVybCdzIG93biBDaGlsZEluaXRIYW5kbGVycyBhcmUgcnVuIGJlZm9yZSB1c2VyCnN1cHBsaWVkIG9uZXMuIFRoaXMgZml4ZXMgdGhlIGluY29ycmVjdGx5IHJlcG9ydGVkIHZhbHVlIG9mICQkCmF0IENoaWxkSW5pdCB0aW1lIFtHb3plcl0KCj1pdGVtIDIuMC40IEFwcmlsIDE2LCAyMDA4CgpGaXggJHItPmxvY2F0aW9uIGNvcnJ1cHRpb24gdW5kZXIgY2VydGFpbiBjb25kaXRpb25zCltHb3plcl0KCkZpeCBhIGNyYXNoIHdoZW4gc3Bhd25pbmcgUGVybCB0aHJlYWRzIHVuZGVyIFBlcmwgNS4xMApbR296ZXJdCgpGaXggZXJyYXRpYyBiZWhhdmlvdXIgd2hlbiBmaWx0ZXJzIHdlcmUgdXNlZCB3aXRoIFBlcmwgNS4xMApbR296ZXJdCgpGaXggcHJvYmxlbXMgd2l0aCByZWRlZmluaXRpb25zIG9mIHBlcmxfZnJlZSBhcyBmcmVlIGFuZCBwZXJsX21hbGxvYwphcyBtYWxsb2Mgb24gV2luMzIsIGFzIGRlc2NyaWJlZCBhdAogaHR0cDovL21hcmMuaW5mby8/bD1hcGFjaGUtbW9kcGVybCZtPTExOTg5NjQwNzUxMDUyNiZ3PTIKW1RvbSBEb25vdmFuXQoKRml4IGEgY3Jhc2ggd2hlbiBydW5uaW5nIGEgc3ViLXJlcXVlc3QgZnJvbSB3aXRoaW4gYSBmaWx0ZXIgd2hlcmUKbW9kX3Blcmwgd2FzIG5vdCB0aGUgY29udGVudCBoYW5kbGVyLiBbR296ZXJdCgpSZWZhY3RvciB0ZXN0cyB0byB1c2Uga2VlcGFsaXZlcyBpbnN0ZWFkIG9mIHNhbWVfaW50ZXJwIFtHb3plciwgUGhyZWRdCgpBcGFjaGUyOjpSZWxvYWQgaGFzIGJlZW4gbW92ZWQgdG8gYW4gZXh0ZXJuYWxseSBtYWludGFpbmVkCkNQQU4gZGlzdHJpYnV0aW9uIFtGcmVkIE1veWVyIDxmcmVkQHJlZGhvdHBlbmd1aW4uY29tPl0KClBlcmxDbGVhbnVwSGFuZGxlciBhcmUgbm93IHJlZ2lzdGVyZWQgd2l0aCBhIHN1YnBvb2wgb2YgJHItPnBvb2wsCmluc3RlYWQgb2YgJHItPnBvb2wgaXRzZWxmLCBlbnN1cmluZyB0aGV5IHJ1biBfYmVmb3JlXyBhbnkgb3RoZXIKJHItPnBvb2wgY2xlYW51cHMgW1RvcnN0ZW4gRm9lcnRzY2hdCgpGaXggYSBidWcgdGhhdCB3b3VsZCBwcmV2ZW50IHBub3RlcyBmcm9tIGJlaW5nIGNsZWFuZWQgdXAgcHJvcGVybHkKYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCBbVG9yc3RlbiBGb2VydHNjaF0KCk9uIFdpbjMyLCBlbWJlZCB0aGUgbWFuaWZlc3QgZmlsZSwgaWYgcHJlc2VudCwgaW4gbW9kX3Blcmwuc28sCnNvIGFzIHRvIHdvcmsgd2l0aCBWQyA4IFtTdGV2ZSBIYXksIFJhbmR5IEtvYmVzXQoKRXhwb3NlIGFwcl90aHJlYWRfcndsb2NrX3Qgd2l0aCB0aGUgQVBSOjpUaHJlYWRSV0xvY2sgbW9kdWxlCltUb3JzdGVuIEZvZXJ0c2NoXQoKRG9uJ3Qgd2FzdGUgYW4gZXh0cmEgaW50ZXJwcmV0ZXIgYW55bW9yZSB1bmRlciB0aHJlYWRlZCBNUE1zIHdoZW4gdXNpbmcgYSAKbW9kcGVybCBoYW5kbGVyIFtUb3JzdGVuIEZvZXJ0c2NoXSAKCkZpeCBhIGJ1ZyB0aGF0IGNvdWxkIGNhdXNlIGEgY3Jhc2ggd2hlbiB1c2luZyAkci0+cHVzaF9oYW5kbGVycygpIG11bHRpcGxlCnRpbWVzIGZvciBhIHBoYXNlIHRoYXQgaGFzIG5vIGNvbmZpZ3VyZWQgaGFuZGxlcnMgW1RvcnN0ZW4gRm9lcnRzY2hdCgpDYXRjaCB1cCB3aXRoIHNvbWUgaHR0cGQgQVBJIGNoYW5nZXMKICAyLjIuNDogCiAgIFRoZSBmdWxsIHNlcnZlciB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgZXJyb3IgbG9nIGF0CnN0YXJ0dXAgYXMgd2VsbCBhcyBzZXJ2ZXIgc3RhdHVzIHJlcG9ydHMsIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2V0dGluZwpvZiB0aGUgU2VydmVyVG9rZW5zIGRpcmVjdGl2ZS4gYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkgaXMgbm93CmRlcHJlY2F0ZWQsIGFuZCBpcyByZXBsYWNlZCBieSBhcF9nZXRfc2VydmVyX2Jhbm5lcigpIGFuZAphcF9nZXRfc2VydmVyX2Rlc2NyaXB0aW9uKCkuIFtKZWZmIFRyYXdpY2tdCgogIDIuMy4wOgphcF9nZXRfc2VydmVyX3ZlcnNpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBUaGlyZC1wYXJ0eSBtb2R1bGVzIG11c3QKbm93IHVzZSBhcF9nZXRfc2VydmVyX2Jhbm5lcigpIG9yIGFwX2dldF9zZXJ2ZXJfZGVzY3JpcHRpb24oKS4KW0dvemVyXQoKZml4ZWQgQXBhY2hlMjo6Y29tcGF0IEFwYWNoZTI6OlNlcnZlclV0aWw6OnNlcnZlcl9yb290KCkgcmVzb2x1dGlvbgppc3N1ZXMgW0pvc2h1YSBIb2JsaXR0XQoKKikgU0VDVVJJVFk6IENWRS0yMDA3LTEzNDkgKGN2ZS5taXRyZS5vcmcpCmZpeCB1bmVzY2FwZWQgdmFyaWFibGUgaW50ZXJwcm9sYXRpb24gaW4gcmVndWxhciBleHByZXNzaW9uCltSYW5kYWwgTC4gU2Nod2FydHogPG1lcmx5bkBzdG9uZWhlbmdlLmNvbT4sIEZyZWQgTW95ZXIgPGZyZWRAcmVkaG90cGVuZ3Vpbi5jb20+XQoKTWFrZSAkci0+dGhlX3JlcXVlc3QoKSB3cml0ZWFibGUKW0ZyZWQgTW95ZXIgPGZyZWRAcmVkaG90cGVuZ3Vpbi5jb20+XQoKZml4IE1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyOjpyZWFkX3NjcmlwdCB0byBoYW5kbGUgYWxsIHBvc3NpYmxlCmVycm9ycywgcHJldmlvdXNseSB0aGVyZSB3YXMgYSBjYXNlIHdoZXJlIEFwYWNoZTI6OkNvbnN0OjpPSyB3YXMKcmV0dXJuZWQgb24gYW4gZXJyb3IuICBbRWl2aW5kIEVrbHVuZCA8ZWVrbHVuZEBnbWFpbC5jb20+XQoKYSBtaW5vciBjb21waWxhdGlvbiB3YXJuaW5nIHJlc29sdmVkIGluIG1vZHBlcmxfaGFuZGxlcl9uZXdfZnJvbV9zdgpbU3Rhc10KCmEgbWlub3IgY29tcGlsYXRpb24gd2FybmluZyByZXNvbHZlZCBpbiBtb2RwZXJsX2d0b3Bfc2l6ZV9zdHJpbmcKW1N0YXNdCgpQcmV2ZW50IGRpcmVjdCB1c2Ugb2YgX2RlcHJlY2F0ZWRfIEFwYWNoZTI6OlJlYWRDb25maWcgaW4KPFBlcmw+IHNlY3Rpb25zIHdpdGggaHR0cGQgQWxpYXMgZGlyZWN0aXZlcyBmcm9tIAppbmNvcnJlY3RseSBnZW5lcmF0aW5nCidUaGUgQWxpYXMgZGlyZWN0aXZlIGluIHh4eHh4IGF0IGxpbmUgeSB3aWxsIHByb2JhYmx5IG5ldmVyIG1hdGNoJwptZXNzYWdlcy4KW1BoaWxpcCBNLiBHb2xsdWNjaSA8cGdvbGx1Y2NpQHA2bTc4Zy5jb20+XQoKUHJldmVudCBBcGFjaGUyOjpQZXJTZWN0aW9uczo6c3ltZHVtcCgpIGZyb20gcmV0dXJuaW5nIGludmFsaWQKaHR0cGQuY29uZiBzbmlwcGV0cyBsaWtlICdBbGlhcyB1bmRlZicKW1BoaWxpcCBNLiBHb2xsdWNjaSA8cGdvbGx1Y2NpQHA2bTc4Zy5jb20+XQoKUmVxdWlyZSBCLVNpemUgMC45IGZvciBBcGFjaGUyOjpTdGF0dXMgd2hpY2ggZml4ZXMKQ2FuJ3QgY2FsbCBtZXRob2QgInNjcmlwdF9uYW1lIiBvbiBhbiB1bmRlZmluZWQgdmFsdWUKW1BoaWxpcCBNLiBHb2xsdWNjaSA8cGdvbGx1Y2NpQHA2bTc4Zy5jb20+XQoKLW1hcmNoPXBlbnRpdW00IG9yIGFueXRoaW5nIHdpdGggYW4gPSBpbiBpdCBpbiBDQ0ZMQUdTIG9yIEBBUkdWCnRoYXQgZ2V0cyBwYXNzZWQgdG8geHMvQVBSL0FQUi9NYWtlZmlsZS5QTCBicm9rZSB0aGUgQEFSR1YKcGFyc2luZy4gIEkuRS4gRnJlZUJTRCBwb3J0IGJ1aWxkcyB3aGVuIHVzZXJzIGhhZCBDUFVUWVBFCnNldCBpbiAvZXRjL21ha2UuY29uZi4KW1BoaWxpcCBNLiBHb2xsdWNjaSA8cGdvbGx1Y2NpQHA2bTdnOC5jb20+XQoKRml4ZXMgdG8gZ2V0IGJsZWVkLWl0aHJlYWQgKDUuOS41KykgdG8gY29taWxlIGFnYWluLiAKW1BoaWxpcCBNLiBHb2xsdWNjaSA8cGdvbGx1Y2NpQHA2bTdnOC5jb20+XQoKPWl0ZW0gMi4wLjMgTm92ZW1iZXIgMjgsIDIwMDYKClByZXZlbnQgdGhpbmdzIGluICVJTkMgdGhhdCBhcmUgbm90IHN0YXQoKSBhYmxlCmZyb20gYnJlYWtpbmcgQXBhY2hlMjo6U3RhdHVzICdMb2FkZWQgTW9kdWxlcycKdW5kZXIgZmF0YWwgd2FybmluZ3MuCltQaGlsaXAgTS4gR29sbHVjY2kgPHBnb2xsdWNjaUBwNm03ZzguY29tPl0KCldoZW4gdXNpbmcgTVBfQVBfUFJFRklYIG9uIFdJTjMyIG1ha2Ugc3VyZSB0aGF0IGl0cwphIHZhbGlkIGRpcmVjdG9yeS4KW05pa29sYXkgQW5hbmlldiA8YW5hbmlldkB0aGVnZGIuY29tPl0KCkZpeCBidWcgY29uY2VybmluZyAnZXJyb3Itbm90ZXMnIGhhdmluZyBubyB2YWx1ZSBvbiAKZXJyb3Jkb2N1bWVudCByZWRpcmVjdC4KW0d1eSBBbGJlcnRlbGxpIElJIDxndXlAYWxiZXJ0ZWxsaS5jb20+XQoKTXVsdGktbGluZSAkUGVybENvbmZpZyBpcyBub3cgd29ya2luZyBbR296ZXJdCgpQZXJsT3B0aW9ucyBOb25lIHdhcyBwcmV2aW91c2x5IGluY29ycmVjdGx5IHJlcG9ydGVkIGFzIGludmFsaWQKaW5zaWRlIDxWaXJ0dWFsSG9zdD4gb3IgPERpcmVjdG9yeT4gYmxvY2tzLgpbUGhpbGlwIE0uIEdvbGx1Y2NpXQoKUmVxdWlyZSBCOjpTaXplIDAuMDcgYW5kIEI6OlRlcnNlU2l6ZSAwLjA3IGZvciBBcGFjaGUyOjpTdGF0dXMKW1BoaWxpcCBNLiBHb2xsdWNjaV0KCkFwYWNoZTI6OlN0YXR1cyB3YXMgZXhwZWN0aW5nIEI6OlRlcnNlU2l6ZSB0byByZXR1cm4KYW4gb3AgY291bnQgZm9yIHRoaW5ncyB0aGF0IGl0IGRpZG4ndCBjYXVzaW5nCnJlcXVlc3RzIGxpa2UgaHR0cDovL2xvY2FsaG9zdC9wZXJsLXN0YXR1cy9tYWluP25vaF9iX3BhY2thZ2Vfc2l6ZQp0byBjYXVzZSA0MDVzCltQaGlsaXAgTS4gR29sbHVjY2ldCgpVcGRhdGVzIGZvciBXaW4zMiB0byBhbGxvdyBidWlsZGluZyBhbmQgdGVzdGluZyBvbiBBcGFjaGUvMi4yOgotIHVzZSBodHRwZC5leGUgYXMgdGhlIEFwYWNoZSBiaW5hcnkgbmFtZSB3aGVuIGluc3RhbGxpbmcgYXB4cwotIHVzZSBuZXcgYXByIGxpYnJhcnkgbmFtZXMgKGxpYmFwci0xLmxpYiBhbmQgbGliYXBydXRpbC0xLmxpYikKW1JhbmR5IEtvYmVzXQoKTWFrZSBzdXJlIHRoYXQgYWRkaXRpb25hbCBsaWJyYXJ5IHBhdGhzIGFyZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQgZmxhZ3MKc28gdGhhdCBtb2RfcGVybCB3aWxsIHVzZSB0aGUgc2FtZSB2ZXJzaW9ucyBvZiBsaWJyYXJpZXMgdGhhdCBBUFIgZG9lcy4KW01pa2UgU21pdGggPG1pa2VAbWFpbGNoYW5uZWxzLmNvbT5dCgpBZGRlZCAkci0+Y29ubmVjdGlvbi0+cG5vdGVzLCBpZGVudGljYWwgdG8gJHItPnBub3RlcywgYnV0CmZvciB0aGUgZW50aXJlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uCltHZW9mZnJleSBZb3VuZywgR296ZXJdCgpGaXhlZCBwcm9ibGVtcyB3aXRoIGFkZF9jb25maWcoKSBhbmQgdGhyZWFkLXNhZmV0eTogW0dvemVyXQotICRzLT5hZGRfY29uZmlnIGlzIG5vdCBhbGxvd2VkIGFueW1vcmUgYWZ0ZXIgc2VydmVyIHN0YXJ0dXAKLSAkci0+YWRkX2NvbmZpZyBjYW4gb25seSBhZmZlY3QgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQKICByZXF1ZXN0LCBqdXN0IGxpa2UgLmh0YWNjZXNzIGZpbGVzIGRvCgpNYWtlIHN1cmUgdGhhdCBMSUJTIGFuZCBvdGhlciBNYWtlTWFrZXIgY29tbWFuZCBsaW5lIGZsYWdzIGFyZSBub3QKaWdub3JlZCBieSB0aGUgdG9wIGxldmVsIE1ha2VmaWxlLlBMIGFuZCB4cy9BUFIvQVBSL01ha2VmaWxlLlBMIFtTdGFzXQoKQ29ycmVjdGVkIGEgdHlwbyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBjb3JydXB0aW9uIG9mICQpLCB0aGUKZWZmZWN0aXZlIGdyb3VwIGlkIGFzIFBlcmwgc2VlcyBpdCBbR296ZXJdCgpBZGRlZCBzdXBwb3J0IGZvciBodHRwZC0yLjIncyBuZXcgb3ZlcnJpZGVfb3B0cyBpbiBBcGFjaGUyOjpBY2Nlc3MuCkNhbGxzIHRvIGFkZF9jb25maWcoKSBub3cgYWNjZXB0IGFuIG92ZXJyaWRlX29wdHMgdmFsdWUgYXMgdGhlIDR0aAphcmd1bWVudC4gW1RvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2hAZ214Lm5ldD4sIEdvemVyXQoKRml4ICdQZXJsU3dpdGNoZXMgK2luaGVyaXQnIHRoYXQgZ290IGJyb2tlbiBzb21ld2hlcmUgYWxvbmcKdGhlIHdheSB0byAyLjAuIFlvdSBjYW4gYWxzbyB1c2UgJ1BlcmxPcHRpb25zICtJbmhlcml0U3dpdGNoZXMnCmZvciB0aGUgc2FtZSByZXN1bHQuIFtHb3plcl0KCkFkZCBwZXJsIEFQSSBjb3JyZXNwb25kaW5nIHRvIFVzZXIgYW5kIEdyb3VwIGRpcmVjdGl2ZXMgaW4gaHR0cGQuY29uZjogCkFwYWNoZTI6OlNlcnZlclV0aWwtPnVzZXJfaWQgYW5kIEFwYWNoZTI6OlNlcnZlclV0aWwtPmdyb3VwX2lkCltTdGFzXQoKQXBhY2hlMjo6UmVsb2FkIG5vdyBmaXJzdCB1bmxvYWRzIGFsbCBtb2RpZmllZCBtb2R1bGVzIGJlZm9yZQp0cnlpbmcgdG8gcmVsb2FkIHRoZW0uIFRoaXMgd2F5LCBpbnRlci1tb2R1bGUgZGVwZW5kZW5jaWVzCmFyZSBtb3JlIGxpa2VseSB0byBiZSBjb3JyZWN0bHkgc2F0aXNmaWVkIHdoZW4gcmVsb2FkZWQKW0phdmllciBVcnVlbiBWYWwgPGp1cnVlbkB3YXJwLmVzPiwgR296ZXJdCgokci0+YWRkX2NvbmZpZygpIGNhbiBub3cgdGFrZSBhbiBvcHRpb25uYWwgM3JkIGFyZ3VtZW50IHRoYXQKc3BlY2lmaWVzIHdoYXQgcHNldWRvIDxMb2NhdGlvbiAkcGF0aD4gdGhlIGNvbmZpZ3VyYXRpb24gaXMKZXZhbHVhdGVkIGludG8gW1RvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2hAZ214Lm5ldD5dCgpyZW1vdmUgLURBUF9IQVZFX0RFU0lHTkFURURfSU5JVElBTElaRVIgYW5kIC1EQVBfREVCVUcgZnJvbQpNUF9NQUlOVEFJTkVSIG1vZGUgdG8gYXZvaWQgY29sbGlzaW9ucyBbSm9lIE9ydG9uXQoKQmFjayBvdXQgcjI4MDI2MiB3aGljaCB3YXMgY2F1c2luZyBBcGFjaGUyOjpSZWxvYWQgdG8gbWlzYmVoYXZlLgpbSlQgU21pdGggPGp0QHBsYWluYmxhY2suY29tPl0KClBlcmxfZG9fb3Blbi9jbG9zZSBmaXhlcyB0byBtYWtlIG1vZF9wZXJsIDIuMCBjb21waWxlIHdpdGgKYmxlYWQtcGVybEAyNTg4OSsgKDUuOS4zKykgW1N0YXNdCgpBZGRlZCBBcGFjaGUyOjpQZXJsU2VjdGlvbnMtPnNlcnZlciwgcmV0dXJuaW5nIHRoZSBzZXJ2ZXIKaW50byB3aGljaCB0aGUgPFBlcmw+IHNlY3Rpb24gaXMgZGVmaW5lZCBbR296ZXJdCgpSZXF1aXJlIEI6OlNpemUgYW5kIEI6OlRlcnNlU2l6ZSB2MC4wNiBmb3IgQXBhY2hlMjo6U3RhdHVzCm9wdGlvbnMgU3RhdHVzVGVyc2UgYW5kIFN0YXR1c1RlcnNlU2l6ZSB3aGljaCBoYXMgbm93IGJlZW4gCnVwZGF0ZWQgdG8gc3VwcG9ydCB0aGUgbmV3IG1vZF9wZXJsMiBhcGkgcG9zdCBSQzUuCltQaGlsaXAgTS4gR29sbHVjY2ldCgpXaGVuIHVzaW5nIEFwYWNoZTI6OlBlcmxTZWN0aW9ucy0+ZHVtcCwgdGhlIGNvbmZpZ3VyYXRpb24gCndvdWxkIHByaW50IG91dCBpbiB0aGUgY29ycmVjdCBvcmRlciwgYnV0IHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gd2FzIApwYXNzZWQgb2ZmIHRvIEFwYWNoZSB0aGUgb3JkZXJpbmcgd2FzIGxvc3QuCltTY290dCBXZXNzZWxzIDxzd2Vzc2Vsc0B1c2duLm5ldD5dCgo9aXRlbSAyLjAuMiAtIE9jdG9iZXIgMjAsIDIwMDUKCmFkZCA6cHJveHkgaW1wb3J0IHRhZyB0byBBcGFjaGUyOjpDb25zdCB3aGljaCBleHBvc2VzIG5ldwpjb25zdGFudHMgUFJPWFlSRVFfTk9ORSwgUFJPWFlSRVFfUFJPWFksIGFuZCBQUk9YWVJFUV9SRVZFUlNFCltHZW9mZnJleSBZb3VuZ10KCiQwIEZpeGVzIDogW0dvemVyXQotIFNldHRpbmcgJDAgd29ya3Mgb24gTGludXggYWdhaW4KLSBIUC1VWCBhbmQgKkJTRGVzIHNob3cgdGhlIGNvcnJlY3QgcHJvY2VzcyBuYW1lIGluc3RlYWQgb2YgJy1lJwogCkZpeCBhIGNyaXRpY2FsIGJ1dCB0cml2aWFsIGJ1ZyB0aGF0IHdvdWxkIGNhdXNlIE1QX01BSU5UQUlORVI9MQpvciBNUF9UUkFDRT0xIGJ1aWxkcyB0byBmYWlsIGlmIG5vdCBidWlsZGluZyBhZ2FpbnN0IGEgdGhyZWFkZWQgQVBSLgpGdW5jdGlvbnMgc3VjaCBhcyBhcHJfb3NfdGhyZWFkX2N1cnJlbnQoKSB3b3VsZCBub3QgYmUgbGlua2VkIGluLApidXQgd2VyZSBleHBlY3RlZCB0byBiZS4KW1BoaWxpcCBNLiBHb2xsdWNjaV0KCkFkZCB0aGUgb3V0cHV0IG9mIGxkZCh1bml4L2N5Z3dpbikgYW5kIG90b29sIC1MIChkYXJ3aW4pCmZvciBodHRwZCB0byB0aGUgbXAyYnVnIHJlcG9ydCBzY3JpcHQuCltQaGlsaXAgTS4gR29sbHVjY2ldCgpQcmV2ZW50IHRvb2xzIHN1Y2ggYXMgQXBhY2hlMjo6U3RhdHVzJ3MgTG9hZGVkIE1vZHVsZXMgc2NyZWVuCmZyb20gZGlzcGxheWluZyBlcnJvbmVvdXMgaW5mb3JtYXRpb24gYWJvdXQgbW9kX3BlcmwucG0gYmVpbmcgbG9hZGVkLgpbU3RhcywgUGhpbGlwIE0uIEdvbGx1Y2NpXQoKQ29ycmVjdGx5IHNldCB0aGUgdmVyc2lvbiBvZiBNb2RQZXJsOjpNZXRob2RMb29rdXAsIHByZXZpb3VzbHksCml0IHdhcyBub3Qgc2V0IGJlY2F1c2Ugb2YgdGhlIHdheSBpdCB3YXMgR2VuZXJhdGluZyB2aWEgTW9kUGVybDo6V3JhcFhTLgpbUGhpbGlwIE0uIEdvbGx1Y2NpXQoKSW1wcm92ZSB0aGUgZGV0ZWN0aW9uIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBhbiBtcDIgYnVpbGQgdHJlZS4KVGhpcyBhbGxvd3MgdXNhZ2Ugb2YgRXh0VXRpbHM6Ok1ha2VNYWtlciBvcHRpb25zIHN1Y2ggYXMgUFJFRklYIHRvCm5vdCBicmVhayB0aGUgcHJvYmUgb2YgbXAyIGJ1aWxkIHRyZWVzLgpbU3RhcywgUGhpbGlwIE0uIEdvbGx1Y2NpXQoKQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXdlciBTbWFwcyAoL3Byb2Mvc2VsZi9zdGF0bSkgb24gTGludXgKc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQgKGkuZS4gbGludXgtMi42LjEzLXJjNC1tbTEpCnRvIGFjY3VyYXRlbHkgY291bnQgdGhlIGFtb3VudCBvZiBzaGFyZWQgbWVtb3J5LgpbVG9yc3RlbiBGb2VydHNjaCA8dG9yc3Rlbi5mb2VydHNjaCBnbXgubmV0Pl0KCk9uIGN5Z3dpbiBzb21lIGRsbHMgbWlnaHQgaGFwcGVuIHRvIGJlIHdpdGggaWRlbnRpY2FsIGJhc2UgYWRkcmVzc2VzCmFuZCBpZiB5b3UgdHJ5IHRvIGxvYWQgYm90aCBvZiB0aGVtIHlvdSdsbCBnZXQgYW4gZXJyb3IgYW5kIHlvdSdsbApoYXZlIHRvIHVzZSB0aGUgcmViYXNlIHV0aWxpdHkgdG8gZml4IHRoZW0uICB0aGlzIGZpeCBzaG91bGQgcHJldmVudAp0aGlzLiAgW05pa29sYXkgQW5hbmlldiA8YW5hbmlldkB0aGVnZGIuY29tPl0KCkZpeCBhbiB1bmRlZmluZWQgd2FybmluZyBpbiBEU08gYnVpbGRzIHdoZW4gbm90IHVzaW5nIE1QX0FQWFMuCltOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgpXaGVuIHJ1bm5pbmcgTWFrZWZpbGUuUEwgd2l0aCB0aGUgTVBfTUFJTlRBSU5FUj0xIG9wdGlvbgphZGQgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgaWYgd2UgYXJlIHVzaW5nIGdjYwp2ZXJzaW9uIDMuMy4yIG9yIGhpZ2hlciBhbmQgaXRzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIGNjb3B0cy4KW1BoaWxpcCBNLiBHb2xsdWNjaSwgR296ZXJdCgpTZXZlcmFsIGZpeGVzIHRvIEFwYWNoZTI6OlN0YXR1cwpbUGhpbGlwIE0uIEdvbGx1Y2NpXQoKV2hlbiB1c2luZyBBcGFjaGUyOjpSZWxvYWQgYW5kIFJlbG9hZERlYnVnIGlzIHNldCB0byAnT24nLCAKc29ydCB0aGUgb3V0cHV0IGFscGhhYmV0aWNhbGx5IFtQaGlsaXAgTS4gR29sbHVjY2ldCgpjcm9hayBpbiBjYXNlIGEgZmlsdGVyIHJldHVybnMgREVDTElORUQgYWZ0ZXIgY2FsbGluZyAkZi0+cmVhZCAoYXMgaXQKaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbikgW1N0YXNdCgphbm90aGVyIHJvdW5kIG9mIGN5Z3dpbiBmaXhlcyBbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQoKTXVsdGlwbGUgZml4ZXMgdG8gbWFrZSBtb2RfcGVybCAyLjAgd29yayB3aXRoIGJsZWFkLXBlcmwgKDUuOS4zKykKW1N0YXNdCgp0L21vZHVsZXMvcmVsb2FkLnQgd291bGQgZmFpbCBpZiBydW4gbW9yZSB0aGFuIDMgdGltZXMsIGJyZWFraW5nCnNtb2tlcyBbR296ZXJdCgpmaWx0ZXIgZmx1c2hpbmcgbm93IGRvZXNuJ3QgY3JvYWsgb24gY29ubmVjdGlvbiByZXNldAooRUNPTk5SRVNFVC9FQ09OTkFCT1JURUQpLCBidXQganVzdCBsb2dzIHRoZSBldmVudCBvbiB0aGUgJ2luZm8nCmxldmVsLiBbU3Rhc10KClJQTSBGcmllbmRseSBidWlsZHMgOiBbR296ZXJdCi0gbWFrZSBkaXN0IHRhcmJhbGxzIGNhbiBub3cgYmUgYnVpbHQgZGlyZWN0bHkgaW50byBSUE1zIHdpdGggcnBtYnVpbGQKLSBBZGRlZCBhIG5ldyB0YXJnZXQgJ21ha2UgcnBtJyB0byBkaXJlY3RseSBidWlsZCBycG1zIGZyb20gYSBjaGVja291dAoKCgo9aXRlbSAyLjAuMSAtIEp1bmUgMTcsIDIwMDUKCkI6OlRlcnNlIGhhcyBwcm9ibGVtcyB3aXRoIFhTIGNvZGUsIHNvIGFkanVzdCBBcGFjaGU6OlN0YXR1cyB0byBldmFsCnt9IHRoZSBjb2RlIGRvaW5nIFN5bnRheCBUcmVlIER1bXA6IHN5bnRheCBhbmQgZXhlY3V0aW9uIG9yZGVyIG9wdGlvbnMKW1N0YXNdCgpGaXggYSBicm9rZW4gcmVnZXhwIGluIEFwYWNoZTI6OkJ1aWxkOjpkaXIoKSBvbiB3aW4zMiB0aGF0IHdvdWxkCmluY29ycmVjdGx5IGF0dGVtcHQgdG8gZnVsbHktcXVhbGlmeSBwYXRocyBsaWtlIGM6L3NvbWUvcGF0aApbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQoKRml4IHRoZSAiTm8gbGlicmFyeSBmb3VuZCIgd2FybmluZ3Mgd2hlbiBidWlsZGluZyBvbiB3aW4zMiB3aXRob3V0CmFweHMgYW5kIE1QX0FQX1BSRUZJWCBbTmlrb2xheSBBbmFuaWV2IDxhbmFuaWV2QHRoZWdkYi5jb20+XQoKVGhlIHB1cmUtcGVybCBNb2RQZXJsOjpVdGlsOjp1bmxvYWRfcGFja2FnZSBpbXBsZW1lbnRhdGlvbiB3YXMKYWNjaWRlbnRseSBkZWxldGluZyBzdWItc3Rhc2hlcyBbR296ZXJdCgpJZiBydW5uaW5nIE1ha2VmaWxlLlBMIHVubmF0ZW5kZWQgKFNURElOIGlzbid0IGEgdGVybWluYWwgb3IKTVBfUFJPTVBUX0RFRkFVTFQ9MSksIGJyZWFrIG91dCBvZiBwb3RlbnRpYWxseSBpbmZpbml0ZSBwcm9tcHQKbG9vcHMgW0dvemVyXQoKZml4IE1vZFBlcmw6OlRlc3RSZXBvcnQgdXNlZCBieSB0L1JFUE9SVCBhbmQgbXAyYnVnIHRvIHVzZQpFeHRVdGlsczo6TWFrZU1ha2VyJ3MgTU0tPnBhcnNlX3ZlcnNpb24gdG8gZ2V0IHRoZSBpbnRlcmVzdGluZwpwYWNrYWdlcyB2ZXJzaW9uIG51bWJlciwgdy9vIHRyeWluZyB0byBsb2FkIHRoZW0gKHdoaWNoIG1heSBmYWlsIGlmCnRoZSBlbnZpcm9ubWVudCBpcyBub3QgcmlnaHQpIFtTdGFzXQoKZml4IGEgYnVnIGluIE1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyOiBub3cgc3RyaXBwaW5nIF9fKEVORHxEQVRBKV9fCm9ubHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBbU3Rhc10KCkFQUjo6QmFzZTY0IDogW1RvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2hAZ214Lm5ldD5dCi0gZml4IGVuY29kZV9sZW4oKSB0byByZXR1cm4gdGhlIGxlbmd0aCB3aXRob3V0IGFjY291bnRpbmcgZm9yIHRoZQp0ZXJtaW5hdGluZyAnXDAnIGFzIHRoZSBDIEFQSSBkb2VzLiAKLSBmaXggZW5jb2RlKCkgdG8gY3JlYXRlIHRoZSBzdHJpbmcgb2YgdGhlIGNvcnJlY3QgbGVuZ3RoIChwcmV2aW91c2x5CndhcyBjcmVhdGluZyBvbmUgdG9vIG1hbnkpCgppbiBtb2RfcGVybCBjYWxsYmFja3MgbWVyZ2UgZXJyb3Itbm90ZXMgZW50cmllcyByYXRoZXIgdGhhbiBzdG9yZSBqdXN0CnRoZSBuZXdlc3QgZXJyb3IgW01hcmsgPG1hcmtAaW1tZXJtYWlsLmNvbT5dCgpFeHBvc2UgQXBhY2hlMjo6Q29uc3Q6OkVYRUNfT05fUkVBRCAoYWRkZWQgdG8gdGhlIDpvdmVycmlkZSBncm91cCkKW1N0YXNdCgpGaXggYSBidWcgaW4gY3VzdG9tIGRpcmVjdGl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgdGhlIGNvZGUgY2FsbGVkCmZyb20gbW9kcGVybF9tb2R1bGVfY29uZmlnX21lcmdlKCkgd2FzIHNldHRpbmcgdGhlIGdsb2JhbCBjb250ZXh0CmFmdGVyIHNlbGVjdGluZyB0aGUgbmV3IGludGVycHJldGVyIHdoaWNoIHdhcyBsZWFkaW5nIHRvIGEgc2VnZmF1bHQgaW4KYW55IGhhbmRsZXIgY2FsbGVkIHRoZXJlYWZ0ZXIsIHdob3NlIGNvbnRleHQgd2FzIGRpZmZlcmVudApiZWZvcmVoYW5kLiBbU3Rhc10KCgoKPWl0ZW0gMi4wLjAgLSBNYXkgMjAsIDIwMDUKCmZpeCBnbG9iYWwgYW5vbl9jbnQgZG91YmxlLWluaXRpYWxpemF0aW9uIGJ1ZyB0aGF0IHdhcyBjYXVzaW5nCnN0YXJ0dXAgc2VnZmF1bHRzIG9uIE9TWC4gW0dvemVyXQoKZml4IHRoZSBhcF9pbnN0YWxsIHRhcmdldCBpbiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlICh1c2VkIGZvciBzdGF0aWMKYnVpbGQpIFtTdGFzXQoKUmVpbnRyb2R1Y2UgYSBwdXJlLVBlcmwgdmVyc2lvbiBvZiBNb2RQZXJsOjpVdGlsOjp1bmxvYWRfcGFja2FnZSgpClRoZSBwcm9ibGVtYXRpYyBYUyB2ZXJzaW9uIGlzIG5vdyBjYWxsZWQgdW5sb2FkX3BhY2thZ2VfeHMoKSBhbmQKbm90IHVzZWQgYnkgZGVmYXVsdCBbR296ZXJdCgpNb3JlIEFQUjo6U3RhdHVzIHdyYXBwZXJzOiAgW1N0YXMsIFJhbmR5IEtvYmVzXQotIGlzX0VPRgotIGlzX0VDT05OQUJPUlRFRAotIGlzX0VDT05OUkVTRVQKLSBpc19USU1FVVAKCm1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBwaWNrcyB1cCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBiYXNlZCBvbiB0aGUKYXB4cyBxdWVyaWVzIGFuZCBvbmx5IHNlYXJjaCB0aGUgaHR0cGQgc291cmNlIGlmICRzZWxmLT57TVBfQVBfUFJFRklYfQp3YXMgc2V0LiBFYXJsaWVyIGl0IHdhcyBhbHdheXMgcGlja2luZyB0aGUgaGVhZGVycyBmcm9tIHRoZSBodHRwZApzb3VyY2UgaWYgaXQgd2FzIGF2YWlsYWJsZSwgd2hpY2ggd2FzIHJlc3VsdGluZyBpbiB0aGUgd3JvbmcgaGVhZGVycwppZiB0aGUgaW5zdGFsbGVkIGh0dHBkIHdhcyBkaWZmZXJlbnQgdGhhbiB0aGUgc291cmNlIHRoYXQgd2FzIGZvdW5kCltTdGFzXQoKaW50cm9kdWNlIE1vZFBlcmw6OlJlZ2lzdHJ5UHJlZm9yayBhbmQgTW9kUGVybDo6UGVybFJ1blByZWZvcmssIHdoaWNoCmJlaGF2ZSB0aGUgc2FtZSBhcyBNb2RQZXJsOjpSZWdpc3RyeSBhbmQgTW9kUGVybDo6UGVybFJ1biwKcmVzcGVjdGl2ZWx5LCBidXQgY2hkaXIgdG8gdGhlIHNjcmlwdCdzIGRpcmVjdG9yeSBsaWtlIG1vZF9jZ2kKZG9lcy4gVGhlc2UgdHdvIG5ldyBoYW5kbGVycyB3aWxsIHJlZnVzZSB0byBsb2FkIHVuZGVyIHRocmVhZGVkIE1QTXMKd2hlcmUgY2hkaXIgY2FuJ3QgYmUgdXNlZCBhcyBpdCB3aWxsIGFmZmVjdCBhbGwgcnVubmluZyB0aHJlYWRzIFtTdGFzXQoKTW9kUGVybDo6UmVnaXN0cnlDb29rZXI6OmNoZGlyX2ZpbGVfbm9ybWFsKCkgbm93IGNoZGlycyB0byB0aGUgY3VycmVudApzY3JpcHQncyBkaXJlY3Rvcnkgb3IgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYXMgYW4gYXJndW1lbnQsIGFzIGl0CndhcyBwbGFubmVkIGluIGZpcnN0IHBsYWNlLiBUaGVyZWZvcmUgc3dpdGNoIE1vZFBlcmw6OlJlZ2lzdHJ5IGFuZApNb2RQZXJsOjpQZXJsUnVuIHRvIHVzIE5PUCBmb3IgdGhpcyBtZXRob2QgY2FsbC4gSWYgY2hkaXJfZmlsZSBpcwptYXBwZWQgdG8gY2hkaXJfZmlsZV9ub3JtYWwoKSwgdGhlbiBydW4oKSBhbmQKY29udmVydF9zY3JpcHRfdG9fY29tcGlsZWRfaGFuZGxlcigpIG5vdyBjYWxsIGNoZGlyIHRvIHRoZSBzY3JpcHQncwpkaXJlY3RvcnkgYW5kIGF0IGJlZm9yZSByZXR1cm5pbmcgZ28gYmFjayB0byB0aGUgc2VydmVyIHJvb3QuIFtTdGFzXQoKcHJldmVudCB1bmRlZiB3YXJuaW5ncyBpbiBjYXRmaWxlKCkgY2FsbHMgaW4gQXBhY2hlMjo6QnVpbGQgd2hlbgpjYWxsZWQgZnJvbSB0aGUgTW9kUGVybC1SZWdpc3RyeSB0cmVlIFtTdGFzXQoKZml4IG1vZHBlcmxfYnJpZ2FkZV9kdW1wIHRvIHVzZSBhcHJfZmlsZV9wcmludGYoKSBpbnN0ZWFkIG9mCmZwcmludGYoKSwgd2hpY2ggZG9lc24ndCB3b3JrIGV2ZXJ5d2hlcmUgW1N0YXNdCgpGaXggYSB3YXJuaW5nIHRyaWdnZXJlZCBieSBgbG5gIG9uIEN5Z3dpbiwgd2hlbiBydW5uaW5nIHBlcmwKTWFrZWZpbGUuUEwgZm9yIGEgc2Vjb25kIHRpbWUgd2l0aG91dCBwcmV2aW91c2x5IHJ1bm5pbmcgbWFrZQpjbGVhbi4gW05pa29sYXkgQW5hbmlldiA8YW5hbmlldkB0aGVnZGIuY29tPl0KCldoZW4gY29tcGlsaW5nIGEgc3RhdGljIG1vZF9wZXJsIGFuZApNUF9BUF9DT05GSUdVUkU9Ii0td2l0aC1hcHI9L3NvbWUvcGF0aCIgYXJndW1lbnQgaXMgZ2l2ZW4sIEFwYWNoZSB3aWxsCnVzZSB0aGUgYXByLWNvbmZpZyBhdCB0aGUgZ2l2ZW4gcGF0aCwgYnV0IG1vZF9wZXJsIHdhcyB1c2luZyB0aGUKZGVmYXVsdCBhdCAic3JjbGliL2Fwci8ubGlicyIuIEZpeCB0aGF0IFtOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgpTaG93IE1QX0FQVV9DT05GSUcgYXMgYW4gYXJndW1lbnQgdG8gTWFrZWZpbGUuUEwgaW4gdGhlIFVzYWdlCm1lbnUuIFtOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgpNYWtlZmlsZS5QTDogZml4IHRoZSBwcmUtcmVuYW1lIG1wMiBpbnN0YWxsIGRpYWdub3N0aWNzIGNvZGUsIHRvIHVzZQp0aGUgbXAgdmVyc2lvbiBvZiAxLjk5OXh4IGFuZCBub3QgMS45OTlfeHgsIGFzIHRoZSBsYXR0ZXIgaXMKdW5zdWl0YWJsZSBmb3IgbnVtZXJpY2FsIGNvbXBhcmlzb24sIGFsc28gZml4IHRoZSBuYW1lIG9mIHRoZSByZXBvcnRlZApjb25mbGljdGluZyBkaXJlY3RvcnkgW1N0YXNdLgoKYWRkIEFQUjo6U3RhdHVzOjppc18oRUFDQ0VTfEVOT0VOVCksIGFuZCB1c2UgaW4gTW9kUGVybDo6UmVnaXN0cnlDb29rZXIKdG8gcmV0dXJuLCBhcyBhcHByb3ByaWF0ZSwgQXBhY2hlMjo6Q29uc3Q6OihGT1JCSURERU58Tk9UX0ZPVU5EKSwKYmFzZWQgb24gJEAuIEFsc28gcmVtb3ZlIGEgY2hlY2sgaW4gbW9kcGVybF9zbHVycF9maWxlbmFtZQpvZiBzcmMvbW9kdWxlcy9wZXJsL21vZHBlcmxfdXRpbC5jIHRvIGVuYWJsZSAkQCB0byBiZSBzZXQgd2hlbgpvcGVuaW5nIG9yIHJlYWRpbmcgYSBmaWxlIGZhaWxzLiBUaGlzIGZpeGVzIGEgYnVnIG9uIFdpbjMyLCByZXZlYWxlZAppbiA0MDQudCBhbmQgcmVkaXJlY3QudCBvZiB0aGUgTW9kUGVybC1SZWdpc3RyeSB0ZXN0cywgYXMgcmVwb3J0ZWQKYnkgU3RldmUgSGF5IGFuZCBNYXJrdXMgV2ljaGl0aWxsIFtTdGFzLCBSYW5keSBLb2Jlc10KCmxpbmsgQXBhY2hlMjo6KiBhbmQgTW9kUGVybDo6KiB0byBtb2RfcGVybC5hIGFuZCBEeW5hTG9hZGVyLmEsIGJ1dAotbG1vZF9wZXJsIGFuZCAtbER5bmFMb2FkZXIgZG9uJ3Qgd29yaywgYW5kIHdlIGNhbid0IHN1cHBseSB0aGUgZnVsbApwYXRocywgYmVjYXVzZSBNYWtlTWFrZXIgZG9lc24ndCBhbGxvdyB0aGlzLiBJIHdvcmthcm91bmQgdGhpcyBieQptYWtpbmcgYSBzeW1saW5rIHRvIG1vZF9wZXJsLmEgKGNhbGxlZCBsaWJtb2RfcGVybC5hKSBhbmQgY29weQpEeW5hTG9hZGVyLmEgdG8gbGliRHluYUxvYWRlci5hIChJIGRvbid0IGNyZWF0ZSBhIHN5bWxpbmssIGJlY2F1c2UsCndoZW4gcnVubmluZyBtYWtlIGNsZWFuLCB0aGUgcmVhbCBEeW5hTG9hZGVyLmEgbWF5IGdldCBkZWxldGVkKS4gIFRoZQpBUFI6OiogZXh0ZW5zaW9ucyBhcmUgbm90IGFmZmVjdGVkLCBiZWNhdXNlIGluIGJvdGggY2FzZXMgd2UgbGluayB0aGVtCmFnYWluc3QgYXByZXh0LiAgQWxzbyBvdGhlciBzbWFsbCBmaXhlcyBhcmUgYWRkZWQuIFtOaWtvbGF5IEFuYW5pZXYKPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgoKCgo9aXRlbSAxLjk5OV8yMyAtIE1heSAzLCAyMDA1CgpmaXggQXBhY2hlMjo6QnVpbGQ6OmR5bmFtaWNfbGlua19NU1dpbjMyIHRvIGdlbmVyYXRlIGEgbmV3IGxpbmUgYWZ0ZXIKZHluYW1pY19saW5rIGNvZGUgaW4gTWFrZWZpbGUgW05pa29sYXkgQW5hbmlldiA8YW5hbmlldkB0aGVnZGIuY29tPl0KCmZpeCBhIHdhcm5pbmcgaW4gQXBhY2hlMjo6QnVpbGQ6OmJ1aWxkX2NvbmZpZygpIHdoZW4gYnVpbGRpbmcKd2l0aCBNUF9TVEFUSUNfRVhUUz0xIFtOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCgppbXByb3ZpbmcgRFNPIHN1cHBvcnQgb24gY3lnd2luLiBUaGUgcHJvYmxlbSB3aXRoIGN5Z3dpbiBpcyB0aGF0IGl0CmJlaGF2ZXMgbGlrZSB3aW5kb3dzIChpdCdzIGEgcG9zaXggbGF5ZXIgb3ZlciB3aW5kb3dzIGFmdGVyCmFsbCkuIFRoYXQncyB3aHkgd2UgbmVlZCB0byBzdXBwbHkgYWxsIHN5bWJvbHMgZHVyaW5nIGxpbmtpbmcgdGltZQpqdXN0IGxpa2Ugb24gd2luMzIsIGJ5IGFkZGluZyAtbGFwci0wIC1sYXBydXRpbC0wIGFuZCAtbGh0dHBkLiBPbgp3aW5kb3dzLCBBcGFjaGUgc3VwcGxpZXMgYWxsIHRoZSB0aHJlZSBsaWJyYXJpZXMgYW5kIGl0J3MgZWFzeSB0bwpsaW5rLCBidXQgb24gY3lnd2luIGFwYWNoZSBkb2Vzbid0IHBsYXkgbmljZSBhbmQgZG9lc24ndCBzdXBwbHkKbGliaHR0cGQuIFRoaXMgY2hhbmdlIGFkZHMgbGliYXByIGFuZCBsaWJhcHJ1dGlsLiBbTmlrb2xheSBBbmFuaWV2CjxhbmFuaWV2QHRoZWdkYi5jb20+XQoKaW1wcm92ZSB0aGUgZGlhZ25vc3RpY3Mgd2hlbiBkZXRlY3RpbmcgbXAyIDwgMS45OTkwMjIsIHRlbGwgdGhlIHVzZXIKd2hpY2ggZmlsZXMgYW5kL29yIGRpcnMgbmVlZCB0byBiZSByZW1vdmVkIFtTdGFzXQoKcmVzdG9yZSB0aGUgREVTVERJUiBzdXBwb3J0IHBhcnRpYWxseSBudWtlZCBieSB0aGUgYXBhY2hlMiByZW5hbWUKYnJhbmNoIFtUb3JzdGVuIEb2cnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2ggZ214Lm5ldD5dCgphZGQgQVBSOjpTdGF0dXMgdG8gcHJvdmlkZSBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUKQVBSX1NUQVRVU19JU18qIG1hY3JvcyBvZiBhcHJfZXJybm8uaCwgZXNwZWNpYWxseSB0aG9zZSBjb21wb3NpdGVzCmxpa2UgQVBSX1NUQVRVU19JU19FQUdBSU4ocykgd2hpY2ggYXJlIHNhdGlzZmllZCBieSBtb3JlIHRoYW4gb25lCnNwZWNpZmljIGVycm9yIGNvbmRpdGlvbi4gUHJlc2VudGx5IG9ubHkgQVBSX1NUQVRVU19JU19FQUdBSU4gaXMKcHJvdmlkZWQgW1JhbmR5IEtvYmVzXQoKZml4IHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBtYW5wYWdlcyBmb3IgLnBtIGZpbGVzIGZyb20gc3ViLXByb2plY3RzCmxpa2UgTW9kUGVybC1SZWdpc3RyeSAocHJldmlvdXNseSB3YXMgY3JlYXRpbmcgbWFucGFnZSBmaWxlcyBsaWtlCi46Ok1vZFBlcmw6OlBlcmxSdW4uMykgW1N0YXNdCgpmaXggdGhlIHBvZDJtYW4naWZpY2F0aW9uIHBhcnQgb2YgJ21ha2UgaW5zdGFsbCcgKHVzaW5nIFBPRDJNQU5fRVhFCmluc3RlYWQgb2YgUE9EMk1BTiBNYWtlZmlsZSBtYWNybykgW1N0YXNdCgoKPWl0ZW0gMS45OTlfMjIgLSBBcHJpbCAxNCwgMjAwNQoKICAgICoqKioqKioqKioqKioqKioqKioqIElNUE9SVEFOVCAqKioqKioqKioqKioqKioqKioqKgogICAgdGhpcyB2ZXJzaW9uIG9mIG1vZF9wZXJsIGlzIGNvbXBsZXRlbHkgaW5jb21wYXRpYmxlCiAgICAgIHdpdGggcHJpb3IgdmVyc2lvbnMgb2YgbW9kX3BlcmwsIGJvdGggMS5YWCBhbmQKICAgICAxLjk5X1hYLiBQbGVhc2UgcmVhZCB0aGUgYmVsb3cgY2hhbmdlcyBjYXJlZnVsbHkuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCnJlbW92ZSBNUF9JTlNUX0FQQUNIRTIgaW5zdGFsbGF0aW9uIG9wdGlvbiBhbmQgQXBhY2hlMi5wbSAtIGFsbAptb2RfcGVybCByZWxhdGVkIGZpbGVzIHdpbGwgbm93IGJlIGluc3RhbGxlZCBzbyB0aGV5IGFyZSB2aXNpYmxlCnZpYSBzdGFuZGFyZCBASU5DLiAgYWxzbywgcmVmdXNlIHRvIGluc3RhbGwgb3ZlciBtb2RfcGVybCAyIHZlcnNpb25zCmxlc3MgdGhhbiAxLjk5OV8yMi4gIFtHZW9mZnJleSBZb3VuZ10KCnMvQXBhY2hlOjovQXBhY2hlMjo6L2cgYW5kIHMvbW9kX3BlcmwvbW9kX3BlcmwyL2cgaW4gYWxsIG1vZHVsZQpBUElzLiAgc28sIEFwYWNoZTo6UmVxdWVzdFJlYyBpcyBub3cgQXBhY2hlMjo6UmVxdWVzdFJlYywKQXBhY2hlOjpjb21wYXQgaXMgbm93IEFwYWNoZTI6OmNvbXBhdCwgYW5kIHNvIG9uLiBbam9lc10KCm1vdmUgYWxsIEFwYWNoZTo6IGNvbnN0YW50cyB0byBBcGFjaGUyOjpDb25zdCBhbmQgYWxsIEFQUjo6IGNvbnN0YW50cwp0byBBUFI6OkNvbnN0LiAgZm9yIGV4YW1wbGUsIEFwYWNoZTpPSyBpcyBub3cgQXBhY2hlMjo6Q29uc3Q6Ok9LIGFuZApBUFI6OlNVQ0NFU1MgaXMgbm93IEFQUjo6Q29uc3Q6OlNVQ0NFU1MuICBbR2VvZmZyZXkgWW91bmddCgphZGQgJEVOVntNT0RfUEVSTF9BUElfVkVSU0lPTn0gYXMgc29tZXRoaW5nIHRoYXQgY2xlYXJseSBkaXN0aW5ndWlzaGVzCndoaWNoIG1vZF9wZXJsIHZlcnNpb24gaXMgYmVpbmcgdXNlZCBhdCByZXF1ZXN0IHRpbWUuICBbR2VvZmZyZXkgWW91bmddCgpyZW5hbWUgQXBhY2hlLT5yZXF1ZXN0KCkgdG8gQXBhY2hlMjo6UmVxdWVzdFV0aWwtPnJlcXVlc3QoKSwgYW5kCkFwYWNoZS0+c2VydmVyKCkgdG8gQXBhY2hlMjo6U2VydmVyVXRpbC0+c2VydmVyKCkKW0dlb2ZmcmV5IFlvdW5nXQoKZml4IEFwYWNoZTI6OlN0YXR1cyB3aGljaCB3YXMgYmFpbGluZyBvdXQgb24gdHJ5aW5nIHRvIGxvYWQgbW9kdWxlcwp3aXRoIGRldiB2ZXJzaW9ucyBsaWtlIDIuMTIxXzAyIFtTdGFzXQoKV2hlbiBwYXJzaW5nIE1ha2VmaWxlLlBMIE1QXyogb3B0aW9ucywgaGFuZGxlIGNvcnJlY3RseSB0aGUgTVBfRk9PPTAKZW50cmllcyBbUGhpbGlwIE0uIEdvbGx1Y2NpIDxwZ29sbHVjY2lAcDZtN2c4LmNvbT5dCgppbml0IHRoZSBhbm9uc3ViIGhhc2ggZm9yIGJhc2UgcGVybCBhbmQgZWFjaCB2aG9zdCArUGFyZW50IChwcmV2aW91c2x5CndhcyBpbml0J2VkIG9ubHkgZm9yIHRoZSBiYXNlIHBlcmwpIFtTdGFzXQoKZml4IGEgYnVnIHdoZW4gYSBub24tdGhyZWFkZWQgcGVybCBpcyB1c2VkIGFuZCBhbm9ueW1vdXMgc3ViIGlzIHB1c2hlZAphdCB0aGUgc2VydmVyIHN0YXJ0dXAgKHRoZSBDViB3YXNuJ3Qgc3Vydml2aW5nKSBbU3Rhc10KCk1ha2Ugc3VyZSB0aGF0IENQQU4gc2hlbGwgZG9lc24ndCB0cmlwbGUgb3ZlciB1c2FnZSBvZgokRXh0VXRpbHM6Ok1ha2VNYWtlcjo6VkVSU0lPTiBbUmFuZHkgS29iZXNdCgpBcGFjaGUyOjpSZXF1ZXN0UmVjLT5uZXcgbm93IHNldHMgJHItPnJlcXVlc3RfdGltZSBbU3Rhc10KCnJlbW92ZSBDR0kucG0gYW5kIEFwYWNoZTo6UmVxdWVzdCBkZXBlbmRlbmNpZXMgZnJvbSBBcGFjaGUyOjpTdGF0dXMKc2luY2UgdGhleSB3ZXJlbid0IHVzZWQgYXQgYWxsIFtHZW9mZnJleSBZb3VuZ10KCkZpeGVzIGZvciBBcGFjaGUyOjpSZWxvYWQncyB0b3VjaGZpbGUgZmVhdHVyZSAocmV0dXJuIEFwYWNoZTI6OkNvbnN0OjpPSwppbnN0ZWFkIG9mIDEpIFtDaHJpcyBXYXJyZW4gPGNod2FycmVuQGNpc2NvLmNvbT5dCgpjeWd3aW4gZml4ZXM6IFtOaWtvbGF5IEFuYW5pZXYgPGFuYW5pZXZAdGhlZ2RiLmNvbT5dCi0gZG9lc24ndCBsaWtlIFhTIHdyYXBwZXIgc3RhcnRpbmcgd2l0aCAnc3RhdGljJwotIG5lZWQgdG8gY29tcGlsZSBldmVyeXRoaW5nIHdpdGggLURDWUdXSU4KCk1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyIEFQSSBjaGFuZ2U6IHMvcmV3cml0ZV9zaGViYW5nL3NoZWJhbmdfdG9fcGVybC8KdGhlIG5ldyBBUEkgbm93IHJldHVybnMgdGhlIHN0cmluZyB0byBwcmVwZW5kIGJlZm9yZSB0aGUgcmVzdCBvZiB0aGUKc2NyaXB0LCBpbnN0ZWFkIG9mIHJld3JpdGluZyB0aGUgY29udGVudCwgd2hpY2ggaXMgYm90aCBmYXN0ZXIgYW5kCmRvZXNuJ3QgbWlzbGVhZCB0aGUgcGVybCBkZWJ1Z2dlciBbRG9taW5pcXVlIFF1YXRyYXZhdXgKPGRvbUBpZGVhbHguY29tPl0KClN0YXJ0aW5nIGZyb20gRXh0VXRpbHM6Ok1ha2VNYWtlciA2LjI2IHdlbnQgYmFjayB0byBwbV90b19ibGliIHRhcmdldApmcm9tIHBtX3RvX2JsaWIudHMgaW50cm9kdWNlZCBpbiA2LjIyLCBzbyBuZWVkZWQgdG8gZml4IHRoZSBnbHVlX3BvZAp0YXJnZXQsIHNvIGluc3RhbGwgd2lsbCB3b3JrIGNvcnJlY3RseSBbU3Rhc10KClN5bnRheCBlcnJvcnMgaW4gPFBlcmw+IHNlY3Rpb25zIHdlcmUgbm90IGNvcnJlY3RseSBjYXVnaHQgYW5kCnJlcG9ydGVkLiBbR296ZXJdCgp3aGVuIGJ1aWxkaW5nIG1wMiBFVTo6TU0gbG9va3MgaW50byBBcGFjaGUtVGVzdC9NQU5JRkVTVCBhbmQgY29tcGxhaW5zCmFib3V0IHRoZSBtaXNzaW5nIEFwYWNoZS1UZXN0L01FVEEueW1sICh3aGljaCBpcyBpbmRlZWQgbm90IGluY2x1ZGVkCmluIHRoZSBtb2RwZXJsIHBhY2thZ2UgZHVlIHRvIHRoZSBQQVVTRSBwcm9ibGVtcyBvZiBkZWFsaW5nIHdpdGggbW9yZQp0aGFuIG9uZSBNRVRBLnltbC4gU29sdXRpb246IEV4Y2x1ZGUgQXBhY2hlLVRlc3QvTUFOSUZFU1QgZnJvbQptb2RfcGVybCBkaXN0cmlidXRpb24gcGFja2FnZS4gW1N0YXNdCgpNb2RQZXJsOjpSZWdpc3RyeSBubyBsb25nZXIgY2hlY2tzIGZvciAteCBiaXQgKHdlIGRvbid0IGV4ZWN1dGVkCnNjcmlwdHMgYW55d2F5KSwgYW5kIHRodXMgd29ya3Mgb24gYWNsLWJhc2VkIGZpbGVzeXN0ZW1zLiBBbHNvCnJlcGxhY2VkIHRoZSAtciBjaGVjayB3aXRoIGEgcHJvcGVyIGVycm9yIGhhbmRsaW5nIHdoZW4gdGhlIGZpbGUgaXMKcmVhZCBpbi4gW0RhbW9uIEJ1Y2t3YWx0ZXIgPGJ1Y2t3YWRAZ21haWwuY29tPl0KCkFwYWNoZTI6OlJlcXVlc3RVdGlsOjpzbHVycF9maWxlbmFtZSBub3cgdGhyb3dzIGFuIEFQUjo6RXJyb3IgZXhjZXB0aW9uCm9iamVjdCAoYmVmb3JlIGl0IHdhcyBqdXN0IGNyb2FraW5nKS4gW1N0YXNdCgpmaXggQVBSOjpFcnJvcidzIG92ZXJsb2FkIG9mICc9PScgKGl0IHdhcyBhbHdheXMgcmV0dXJuaW5nIHRydWUKYmVmb3JlKSwgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyAnIT0nIFtTdGFzXQoKaWYgJHItPmRvY3VtZW50X3Jvb3Qgd2FzIG1vZGlmaWVkLCByZXN0b3JlIGl0IGF0IHRoZSBlbmQgb2YgcmVxdWVzdApbam9lc10KCkFwYWNoZTI6OlNlcnZlclJlYyBtZXRob2Qgd2hpY2ggc2V0IHRoZSBub24taW50ZWdlciBmaWVsZHMgaW4gdGhlCnNlcnZlcl9yZWMsIG5vdyBjb3B5IHRoZSB2YWx1ZSBmcm9tIHRoZSBwZXJsIHNjYWxhciwgc28gaWYgaXQgY2hhbmdlcwpvciBnb2VzIG91dCBvZiBzY29wZSB0aGUgQyBzdHJ1Y3QgaXMgbm90IGFmZmVjdGVkLiBVc2luZyBpbnRlcm5hbCBwZXJsCnZhcmlhYmxlcyB0byBwcmVzZXJ2ZSB0aGUgdmFsdWUsIHNpbmNlIHVzaW5nIHRoZSBzZXJ2ZXIgcG9vbCB0bwphbGxvY2F0ZSB0aGUgbWVtb3J5IHdpbGwgbWVhbiBhIG1lbW9yeSBsZWFrIFtTdGFzXQoKYWRkIHRoZSBlc2NhcGVfdXJsIGVudHJ5IGluIHRoZSBNb2RQZXJsOjpNZXRob2RMb29rdXAga25vd2xlZGdlYmFzZQpbU3Rhc10KCkFwYWNoZTI6OlN1YlByb2Nlc3M6OnNwYXduX3Byb2NfcHJvZyBub3cgY2FuIGJlIGNhbGxlZCBpbiBhIHZvaWQKY29udGV4dCwgaW4gd2hpY2ggY2FzZSBhbGwgdGhlIGNvbW11bmljYXRpb24gc3RkIHBpcGVzIHdpbGwgYmUgY2xvc2VkCltTdGFzXQoKZml4IGEgYnVnIGluICRyLT5kb2N1bWVudF9yb290LCB3aGljaCBwcmV2aW91c2x5IHdlcmVuJ3QgY29weWluZyB0aGUKbmV3IHN0cmluZyBhd2F5IFtTdGFzXQoKaW50cm9kdWNlIGEgbmV3IGJ1aWxkIG9wdGlvbiBNUF9BUF9ERVNURElSIHRvIGFpZCBwYWNrYWdlIGJ1aWxkZXJzCmRpcmVjdCB0aGUgQXBhY2hlLXNwZWNpZmljIGZpbGVzIHRvIHRoZSByaWdodCBwbGFjZS4gW0NvcnkgT21hbmQKPENvcnkuT21hbmRAU3VuLkNPTT5dCgpGaXggYnVnIGluIG1vZHBlcmxfcGFja2FnZV9jbGVhcl9zdGFzaCgpIHNlZ2ZhdWx0aW5nIHdoZW4KZW5jb3VudGVyaW5nIGRlY2xhcmVkIGJ1dCBub3QgeWV0IGRlZmluZWQgc3Vicm91dGluZXMuCltTdGV2ZSBIYXkgPHN0ZXZlLmhheUB1ay5yYWRhbi5jb20+LCBHb3plcl0KCndpbjMyIG5lZWRzIFBFUkxfU1lTX0lOSVQzL1BFUkxfU1lTX1RFUk0gY2FsbHMgW1N0ZXZlIEhheQo8c3RldmUuaGF5QHVrLnJhZGFuLmNvbT5dCgpGaXggYnJva2VuIE1QX1NUQVRJQ19FWFRTPTEgYnVpbGQuIFtHb3plcl0KClBlcmwgLUR1c2U2NGJpdCBmaXguIFBvaW50ZXJzIGNhbid0IGp1c3QgYmUgZ2VuZXJpY2FsbHkKY2FzdGVkIGZyb20vdG8gSVZzLiBVc2UgUFRSMklWL0lOVDJQVFIgaW5zdGVhZC4gW0dvemVyXQoKUGVybCAtRHVzZTY0Yml0IGZpeC4gYXByX3NpemVfdCBwb2ludGVycyBjYW4ndCBqdXN0IGJlIGdlbmVyaWNhbGx5CmNhc3RlZCBmcm9tL3RvIFVWcy4gVXNlIFBUUjJVVi9JTlQyUFRSIGluc3RlYWQuIFtHb3plcl0KCmZpeCBhIGJ1ZyBpbiBBcGFjaGUyOjpCdWlsZDo6ZGlyOiBJZiB0aGUgcmlnaHQgZGlyZWN0b3J5IGlzbid0IGZvdW5kIGluCnRoZSBmb3IgbG9vcCAkZGlyIHN0aWxsIGNvbnRhaW5zIGEgPiB2YWx1ZSwgc28gdGhlIHx8PSBoYXMgbm8KZWZmZWN0LiBbTmljayBXZWxsbmhvZmVyIDx3ZWxsbmhvZmVyQGFldnVtLmRlPl0KCgoKPWl0ZW0gMS45OTlfMjEgLSBKYW51YXJ5IDIyLCAyMDA1CgpQZXJsUG9zdENvbmZpZ1JlcXVpcmUgd2FzIHRyeWluZyB0byBkZXRlY3QgbWlzc2luZyBmaWxlcyBlYXJseSBvbiwKYnV0IHdpdGhvdXQgc2VhcmNoaW5nIHRocnUgQElOQywgY2F1c2luZyBmYWxzZSBuZWdhdGl2ZXMuIEJldHRlciBvZmYKc2tpcHBpbmcgdGhhdCBjaGVjayBhbmQgbGVhdmUgaXQgdG8gbW9kcGVybF9yZXF1aXJlX2ZpbGUoKSB0byByZXBvcnQKcHJvYmxlbXMgd2l0aCBmaW5kaW5nIHRoZSBmaWxlLiAgW1BhdHJpY2sgTGVCb3V0aWxsaWVyCjxwYXRyaWNrLmxlYm91dGlsbGllckBnbWFpbC5jb20+LCBHb3plcl0KCmFkZCBhIHBlcmwgYnVnIHdvcmthcm91bmQ6IHdpdGggVVNFX0lUSFJFQURTIHBlcmwgbGVha3MgcHRocmVhZF9rZXlfdApvbiBldmVyeSByZWxvYWQgb2YgbGlicGVybC57YSxzb30gKGl0J3MgYWxsb2NhdGVkIG9uIHRoZSB2ZXJ5IGZpcnN0CnBlcmxfYWxsb2MoKSBhbmQgbmV2ZXIgZnJlZWQpLiBUaGlzIGJlY29tZXMgYSBwcm9ibGVtIG9uIGFwYWNoZQpyZXN0YXJ0OiBpZiB0aGUgT1MgbGltaXQgaXMgMTAyNCwgMTAyNCByZXN0YXJ0cyBsYXRlciB0aGluZ3Mgd2lsbApzdGFydCBjcmFzaGluZyBbR2lzbGUgQWFzIDxnaXNsZUBBY3RpdmVTdGF0ZS5jb20+LCBTdGFzXQoKb24gSXJpeCBtb2RfcGVybC5zbyBuZWVkcyB0byBzZWUgdGhlIGxpYnBlcmwuc28gc3ltYm9scywgd2hpY2gKcmVxdWlyZXMgdGhlIC1leHBvcnRzIG9wdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgLWxwZXJsLiAgW0dvcmRvbiBMYWNrCjxnbWw0NDEwQGdnci5jby51az5dCgpwb29sIGFyZ3VtZW50cyB0byBzdGFydHVwIGFuZCBjb25uZWN0aW9uIGNhbGxiYWNrcyBtdXN0IGJlIGJsZXNzZWQKaW50byBBUFI6OlBvb2wgYW5kIG5vdCBBcGFjaGU6OlBvb2wgY2xhc3MgW2pvZXNdCgpNYWtlIFBlcmxTZXRFbnYsIFBlcmxQYXNzRW52IGFuZCAlRU5WIGluIFBlcmxSZXF1cmUsIFBlcmxNb2R1bGUsClBlcmxDb25maWdSZXF1aXJlIGFuZCBQZXJsUG9zdENvbmZpZ1JlcXVpcmUgYWZmZWN0IGVhY2ggb3RoZXIsIHNvIGEKY2hhbmdlIGluIG9uZSBvZiB0aGVzZSBpcyBpbW1lZGlhdGVseSBzZWVuIGluIHRoZSBvdGhlcnMuIFtQcmF0aWsKPHByYXRpa25haWsgZ21haWwuY29tPiwgU3Rhc10KCgoKPWl0ZW0gMS45OTlfMjAgLSBKYW51YXJ5IDUsIDIwMDUKCnRoZSBhdXRvZ2VuZXJhdGVkIG1vZHVsZXMgKGFuZCBzb21lIGltcGxlbWVudGVkIGluIHhzLyBtb2R1bGVzKSBhcmUKbm93IGdldHRpbmcgdGhlIHNhbWUgdmVyc2lvbiBudW1iZXIgYXMgJG1vZF9wZXJsOjpWRVJTSU9OICh0aGUKZXhjZXB0aW9uIGFyZSBBUFIgbW9kdWxlcyB3aGljaCBnZXQgMC4wMDlfMDAwIGZvciBub3cpLiBbU3Rhc10KCnVudGlsIHdlIGZpZ3VyZSBvdXQgaG93IHRvIHRlbGwgUEFVU0UgaW5kZXggYWJvdXQgdmVyc2lvbnMgb2YgdGhlCmF1dG9nZW5lcmF0ZWQgbW9kdWxlcywgY3JlYXRlIGEgZmFrZSBtb2R1bGUgd2hpY2ggbGlzdHMgYWxsIHRoZQphdXRvZ2VuZXJhdGVkIG1vZHVsZXMgYW5kIHRoZWlyIHZlcnNpb25zIGFuZCBpbmNsdWRlIHRoYXQgaW4gdGhlCmRpc3Ryby4gW1N0YXNdCgptb3ZpbmcgdG8gdGhlIHRyaXBsZXQgdmVyc2lvbiBub3RhdGlvbiwgd2hpY2ggcmVxdWlyZXMgdXMgdG8gYnVtcCAxLjk5Cj0+IDEuOTk5IHNvIDEuOTk5MDIwIChtcDIpID4gMS4yOSAobXAxKS4gW1N0YXNdCk5vdyB3ZSBhcmUgZ29uZyB0byBoYXZlOgogICRtb2RfcGVybDo6VkVSU0lPTiAgICAgICAgOiAiMS4wOTkwMjAiCiAgaW50ICRtb2RfcGVybDo6VkVSU0lPTiAgICA6IDEuMDk5MDIKICAkbW9kX3Blcmw6OlZFUlNJT05fVFJJUExFVDogMS45OS4yMAoKPFBlcmw+IGFuZCBQZXJsUG9zdENvbmZpZ1JlcXVpcmVzIHdlcmUgbGVha2luZyBzb21lIG1lbW9yeSBhdApzdGFydHVwLiBVc2UgcGFybXMtPnRlbXBfcG9vbCBpbnN0ZWFkIG9mIHBhcm1zLT5wb29sIGZvciB0ZW1wb3JhcnkKbWVtb3J5IGFsbG9jYXRpb25zLiBbR296ZXJdCgpkZWFsIHdpdGggYSBzaXR1YXRpb24gd2hlcmUgYW4gb2JqZWN0IGlzIHVzZWQgdG8gY29uc3RydWN0IGFub3RoZXIKb2JqZWN0LCBidXQgaXQncyB0aGVuIGF1dG8tREVTVFJPWWVkIGJ5IHBlcmwgcmVuZGVyaW5nIHRoZSBvYmplY3QgdGhhdAp1c2VkIGl0IGNvcnJ1cHRlZC4gdGhlIHNvbHV0aW9uIGlzIHRvIG1ha2UgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cwpyZWZlciB0byB0aGUgdW5kZXJseWluZyBvYmplY3QgdmlhIG1hZ2ljIGF0dGFjaG1lbnQuIG9ubHkgb2JqZWN0cwp1c2luZyBvYmplY3RzIHRoYXQgaGF2ZSBERVNUUk9ZIGFyZSBlZmZlY3RlZC4gVGhpcyBjb25jZXJucyBzb21lIG9mCnRoZSBtZXRob2RzIGFjY2VwdGluZyB0aGUgY3VzdG9tIEFQUjo6UG9vbCBvYmplY3QgKG5vdCBuYXRpdmUgcG9vbHMKbGlrZSAkci0+cG9vbCkuIFtTdGFzXQpBZGp1c3RlZDogCi0gQVBSOjpCcmlnYWRlOiBuZXcKLSBBUFI6OkZpbmZvOiBzdGF0Ci0gQVBSOjpJcFN1Ym5ldDogbmV3Ci0gQVBSOjpUYWJsZTogY29weSwgb3ZlcmxheSwgbWFrZQotIEFQUjo6VGhyZWFkTXV0ZXg6IG5ldwotIEFQUjo6VVJJOiBwYXJzZQotIEFwYWNoZTo6UmVxdWVzdFV0aWw6IG5ldwotIEFQUjo6UG9vbDogbmV3Ci0gQVBSOjpCdWNrZXRBbGxvYzogbmV3CgpBUFI6OkJ1Y2tldDo6YWxsb2NfY3JlYXRlIG1vdmVkICB0byBBUFI6OkJ1Y2tldEFsbG9jOjpuZXcKQVBSOjpCdWNrZXQ6OmFsbG9jX2Rlc3Ryb3kgbW92ZWQgdG8gQVBSOjpCdWNrZXRBbGxvYzo6ZGVzdHJveSBbU3Rhc10KCnByZWZvcmsgaGFuZGxlcnMgb3B0aW1pc2F0aW9uOiBkb24ndCBkdXAgdGhlIGhhbmRsZXIgc3RydWN0IHVubGVzcwp0aGlzIGlzIGEgdGhyZWFkZWQtbXBtIFtTdGFzXQoKc3BlZWQgdXAgdGhlICdwZXJsIE1ha2VmaWxlLlBMJyBzdGFnZSBbUmFuZHkgS29iZXNdOgogLSByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0byBidWlsZF9jb25maWcoKSBvZgogICBBcGFjaGU6OkJ1aWxkIHdpdGhpbiBNb2RQZXJsOjpCdWlsZE1NCiAtIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxscyB0byBhcHhzX2NmbGFncywgYXB4c19leHRyYV9jZmxhZ3MsCiAgIGFuZCBhcHhzX2V4dHJhX2NwcGZsYWdzIGluIEFwYWNoZTo6QnVpbGQKIC0gaW4gYXB4cyBvZiBBcGFjaGU6OkJ1aWxkLCByZXR1cm4gYSBjYWNoZWQgcmVzdWx0IG9ubHkgd2hlbiBkZWZpbmVkCgptb3ZlIE1vZFBlcmw6OlV0aWw6OmV4aXQoKSBpbnRvIG1vZF9wZXJsLnNvLCBzaW5jZSBpdCBuZWVkcyB0byB3b3JrLApldmVuIGlmIE1vZFBlcmw6OlV0aWwgd2Fzbid0IGxvYWRlZCBbU3Rhc10KCgoKPWl0ZW0gMS45OV8xOSAtIERlY2VtYmVyIDIzLCAyMDA0Cgokci0+aG9zdG5hbWUgaXMgbm93IHdyaXRhYmxlIFtHb3plcl0KClN0YXRpYyBidWlsZCB3aXRoIGEgUGVybCB3aXRob3V0IGl0aHJlYWRzIGFuZCBhIG5vbi10aHJlYWRlZCBNUE0Kd291bGQgc2VnZmF1bHQgb24gc3RhcnR1cC4gQ2F1c2VkIGJ5IGEgYnVnIGluIHBlcmwncyBwZXJsX3NodXRkb3duKCkKY29kZS4gRml4ZWQgaW4gUGVybCA1LjguMiwgc28gaXQncyBub3cgYSBidWlsZCByZXF1aXJlbWVudCBbR296ZXJdCgpyZXBsYWNlIHRoZSBhZGRlZCBpbiAxLjk5XzE3IGNvZGUgb24gcmVzZXR0aW5nL3Jlc3RvcmluZyBQTF90YWludGVkLAp3aXRoIGV4cGxpY2l0IHJlc2V0IGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBlYWNoIGNhbGxiYWNrLiBUaGlzIHNvbHZlcyBhCmNvbXBsaWNhdGVkIHRhaW50aW5nIGlzc3VlcyBjYXVzZWQgd2hlbiBwZXJsIGV4Y2VwdGlvbiBvYmplY3QgaXMKdGhyb3duLiByZ3Mgc3VnZ2VzdGVkIHRoYXQgaXQgc2hvdWxkIGJlIHNhZmUsIHNpbWlsYXIgdG8gcGVybCdzIG93bgpwcF9uZXh0c3RhdGUgd2hpY2ggc2F5czogLyogRWFjaCBzdGF0ZW1lbnQgaXMgcHJlc3VtZWQgaW5ub2NlbnQgKi8KW1N0YXNdCgpOZXcgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzOiBbR296ZXJdCiAtIFBlcmxDb25maWdSZXF1aXJlCiAgICBKdXN0IGxpa2UgUGVybFJlcXVpcmUsIGJ1dCBfYWx3YXlzXyB0cmlnZ2VycyBhbiBpbW1lZGlhdGUKICAgIGludGVycHJldGVyIHN0YXJ0dXAKIC0gUGVybFBvc3RDb25maWdSZXF1aXJlCiAgICBBIGRlbGF5ZWQgZm9ybSBvZiBQZXJsUmVxdWlyZSwgdGhhdCB3YWl0cyB1bnRpbCB0aGUgcG9zdF9jb25maWcKICAgIHBoYXNlIGJlZm9yZSByZXF1aXJlJ2luZyBmaWxlcwoKZml4IGEgd2FybmluZyBpbiBBcGFjaGU6OlN0YXR1cyBbSm9obiBXaWxsaWFtcyA8d2lsbGlhbXMgdG5pLmNvbT5dCgpJZ25vcmUgQXBhY2hlLVRlc3QvTUVUQS55bWwgaW4gZGlzdHJpYnV0aW9uIHRhcmJhbGxzIHVudGlsIFBBVVNFCmlzIGNhcGFibGUgb2YgaGFuZGxpbmcgbXVsdGlwbGUgTUVUQS55bWwgZmlsZXMgaW4gb25lIGRpc3RybyBbR296ZXJdCgptb2RwZXJsX2V4cG9ydHMuYyBub3cgd3JhcHMgYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBhICNpZm5kZWYKZnVuY3Rpb25fbmFtZSB3cmFwcGVyIHRvIGhlbHAgaW4gd2VlZGluZyBvdXQgZnVuY3Rpb25zIHRoYXQgb25seSBtYWtlCnNlbnNlIGZvciBjZXJ0YWluIFBlcmwgY29uZmlndXJhdGlvbnMgKHBlcmxpbywgdGhyZWFkcykgKHdoaWNoIGFsc28KZml4ZXMgc3RhdGljIGJ1aWxkIGFnYWluc3QgcGVybGlvLWRpc2FibGVkIHBlcmxzLCBsaWtlIDUuNi54KSBbR296ZXJdCgpmb3IgbWFrZSB0ZXN0LCBza2lwIGNvbmZpZ3VyaW5nIGZhc3RjZ2kgaWYgaXQncyBmb3VuZCBpbiB0aGUgZ2xvYmFsCmh0dHBkLmNvbmYsIGFzIGl0IGNhdXNlcyBjcmFzaGVzIGluIHRoZSB0ZXN0IHN1aXRlIFtTdGFzXQoKZml4IE1ha2VmaWxlLlBMIGFyZ3VtZW50cyBwYXJzZXIgdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIE1QX2ZvbwpvcHRpb24gb24gdGhlIHNhbWUgbGluZSAoaW5jbHVkaW5nIC5tYWtlcGxfYXJncy5tb2RfcGVybDIgZmlsZSkgW1N0YXNdCgpmaXggY29tcGlsYXRpb24gaXNzdWVzIGluIE1vZFBlcmw6OlV0aWw6OmN1cnJlbnRfcGVybF9pZCAob24gc29tZQpidWlsZHMgbmV3U1ZwdmYgY2FuJ3QgYmUgcmVzb2x2ZWQgYnV0IFBlcmxfbmV3U1ZwdmYgd29ya3MganVzdApmaW5lKS4gW1N0YXMsIE1hcmt1cyBXaWNoaXRpbGwgPG1hd2ljQGdteC5kZT5dCgpmaXggQVBSOjpFcnJvcjo6c3RyIHRvIHJldHVybiBhIGxleGljYWwgdmFyaWFibGUsIHJhdGhlciB0aGFuIGEKc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBTdlRSVUUgaW4gbW9kcGVybF9lcnJzdigpIHZpYQpvdmVybG9hZCBhbmQgb24gd2luMzIgKGFuZCByYW5kb21seSBvbiBsaW51eCkgY2F1c2VzIGNyYXNoZXMgdmlhOgoiQXR0ZW1wdCB0byBmcmVlIHRlbXAgcHJlbWF0dXJlbHkiIHdhcm5pbmcsIHdoZXJlIHRoaXMgJ3RlbXAnIGlzIHRoZQpzdHJpbmcgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4gTWFraW5nIGl0IGEgbGV4aWNhbCB2YXJpYWJsZSBiZWZvcmUKcmV0dXJuaW5nIGl0LCByZXNvbHZlcyB0aGUgcHJvYmxlbS4gW1N0ZXZlIEhheV0KCmZpeCBNRVRBLnlhbWwgcy9wcml2YXRlL25vX2luZGV4LyAodG8gaGlkZSB0aGUgYnVuZGxlZCBBcGFjaGUtVGVzdApmcm9tIFBBVVNFIGluZGV4ZXIpIFtSYW5keSBLb2Jlc10KCgoKPWl0ZW0gMS45OV8xOCAtIERlY2VtYmVyIDEyLCAyMDA0CgpGaXggeDg2XzY0IHdhcm5pbmdzIGluIG1vZHBlcmxfcmVzdGFydF9jb3VudF8qLCBkdWUgdG8gY2FzdGluZyBiZXR3ZWVuCmludGVnZXJzIGFuZCBwb2ludGVyIHR5cGVzIFtKb2UgT3J0b25dCgpvcGVuX2xvZ3MgYW5kIHBvc3RfY29uZmlnIGhhbmRsZXJzIHJlcXVpcmUgdGhlIEFwYWNoZTo6T0sgcmV0dXJuIGNvZGUKb3IgdGhlIHNlcnZlciBhYm9ydHMsIHNvIHdlIG5lZWQgdG8gbG9nIGFuIGVycm9yIGluIGNhc2UgdGhlIGhhbmRsZXIKZGlkbid0IGZhaWwgYnV0IHJldHVybmVkIHNvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSBBcGFjaGU6Ok9LIFtTdGFzXQoKbmV3IGZ1bmN0aW9uIE1vZFBlcmw6OlV0aWw6OmN1cnJlbnRfcGVybF9pZCgpIHdoaWNoIHJldHVybnMgc29tZXRoaW5nCmxpa2UgKC5lLmcgMHg5MmFjNzYwKSAoYVRIWCkgdW5kZXIgdGhyZWFkZWQgbXBtIGFuZCAwIHVuZGVyCm5vbi10aHJlYWRlZCBwZXJsICgweDApLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBtb2RwZXJsIHVuZGVyIHRocmVhZGVkCnBlcmxzLiAgW1N0YXNdCgptYWtlIHN1cmUgdGhhdCBtb2RwZXJsJ3MgaW50ZXJuYWwgcG9zdF9jb25maWcgY2FsbGJhY2ssIHdoaWNoIGFtb25nc3QKb3RoZXIgdGhpbmdzLCBjbG9uaW5nIHBlcmwgaW50ZXJwcmV0ZXJzIGlzIHJ1bm5pbmcgYXMKbW9kcGVybF9ob29rX3Bvc3RfY29uZmlnX2xhc3QgQVBSX0hPT0tfUkVBTExZX0xBU1QsIHdoaWNoIGVuc3VyZXMgdGhhdAp1c2VyJ3MgcG9zdF9jb25maWcgY2FsbGJhY2tzIGFyZSBydW4gYmVmb3JlIHRoZSBjbG9uaW5nLiBub3cgdGhlIGNvZGUKZnJvbSBjb25maWcgcGhhc2UncyBzdGFydHVwLnBsIGNhbiBiZSBzYWZlbHkgbW92ZWQgdG8gdGhlIHBvc3RfY29uZmlnCnBoYXNlJ3MgZXF1aXZhbGVudC4gW1N0YXNdCgpGdXJ0aGVyIHN5bmMgd2l0aCBsaWJhcHIgY29uc3RhbnRzIGNoYW5nZXM6IFtTdGFzXSAKLSB0aGUgY29uc3RhbnRzCiAgQVBSOjooUkVBRHxXUklURXxDUkVBVEV8QVBQRU5EfFRSVU5DQVRFfEJJTkFSWXxFWENMfEJVRkZFUkVEfERFTE9OQ0xPU0UpCiAgbm93IGhhdmUgYSBwcmVmaXggQVBSOjpGT1BFTl8gYW5kIG1vdmVkIGdyb3VwIHMvZmlsZW1vZGUvZm9wZW4vCi0gY29uc3RhbnRzIGZyb20gdGhlIGZpbGVwcm90IGdyb3VwIG1vdmVkIHRvIHRoZSBmcHJvdCBncm91cCBhbmQgdGhlCiAgcHJlZml4IGhhcyBjaGFuZ2VkOiBmcm9tIEFQUjo6RklMRVBST1RfIHRvIEFQUjo6RlBST1RfCi0gdGhpcyBhbHNvIGZpeGVzIHRoZSBpbXBvcnQgb2YgQVBSX0VYQ0wgYXMgYW4gZXJyb3IgY29uc3RhbnQKCiRyLT5wcmludCgpIGFuZCB0aWVkIHByaW50KCkgbm93IHJldHVybiAwRTAgKHplcm8gYnV0IHRydWUpIHdoZW4gdGhlCmNhbGwgd2FzIHN1Y2Nlc3NmdWwgYnV0IGZvciB6ZXJvIGJ5dGVzLiAgW0dlb2ZmcmV5IFlvdW5nXQoKYSBuZXcgZnVuY3Rpb24gQXBhY2hlOjpTZXJ2ZXJVdGlsOjpzZXJ2ZXJfc2h1dGRvd25fY2xlYW51cF9yZWdpc3RlciB0bwpyZWdpc3RlciBjbGVhbnVwcyB0byBiZSBydW4gYXQgc2VydmVyIHNodXRkb3duLiBbU3Rhc10KCiRiYi0+Y2xlYW51cCBpcyBubyBtb3JlIHNlZ2ZhdWx0aW5nICh3YXMgc2VnZmF1bHRpbmcgZHVlIHRvIGEgYnJva2VuCnByb3RvdHlwZSBpbiBBUFIsIGFuZCBjb25zZXF1ZW50bHkgaW52YWxpZCBYUyBnbHVlIGNvZGUpIFtSYW5keSBLb2JlcywKU3Rhc10KCm1ha2Ugc3VyZSB0aGF0IEFCU1BFUkxSVU4gYW5kIEFCU1BFUkxSVU4gYXJlIGRlZmluZWQgaW4Kc3JjL21vZHVsZXMvcGVybC9NYWtlZmlsZSAobmVlZGVkIGJ5IHdpbjMyIGJ1aWxkKSBbU3Rhc10KCkZvciBzdGF0aWMgYnVpbGRzLCBtb2RfcGVybCBoZWFkZXIgZmlsZXMgd2VyZSBiZWluZyBpbnN0YWxsZWQKaW50byBhcGFjaGUncyBzb3VyY2UgdHJlZSBpbnN0ZWFkIG9mIHdoZXJlIGFwYWNoZSBpbnN0YWxsZWQgaXQncwpvd24gaGVhZGVycyBbR296ZXJdCgptb2RwZXJsX3RocmVhZHNfc3RhcnRlZCgpIHdhc24ndCB3b3JraW5nIHVuZGVyIHN0YXRpYyB3b3JrZXIgYnVpbGQsCmR1ZSB0byBNUF90aHJlYWRzX3N0YXJ0ZWQgc3RhdGljIHZhcmlhYmxlIG5vdCBiZWluZyByZXNldCBvbgpyZXN0YXJ0LiBOb3cgcmVzZXR0aW5nIGl0LiBbU3Rhc10KCkBJTkMgc2hyaW5raW5nIGVmZm9ydHM6IFtTdGFzXQoxKSB3aGVuIGFkZGluZyAkU2VydmVyUm9vdCBkb24ndCBhZGQgdGhlIHRyYWlsaW5nIC8gKGFzIGl0IGVuZHMgdXAKdHdpY2Ugd2hlbiBhZGRlZCBieSBBLVQgdy9vIHRyYWlsaW5nIC8pCjIpIGFkZCAkU2VydmVyUm9vdC9saWIvcGVybCBvbmx5IGlmIGl0IGFjdHVhbGx5IGV4aXN0cwoKRm9yIHN0YXRpYyBidWlsZHMsIHdlIG5vdyBydW4gJ21ha2UgY2xlYW4nIGluIGh0dHBkJ3Mgc291cmNlCnRyZWUgYmVmb3JlIHJ1bm5pbmcgLi9jb25maWd1cmUgaWYgdGhlIHNvdXJjZSB0cmVlIGhhcyBiZWVuCmNvbmZpZ3VyZWQgYmVmb3JlIFtHb3plcl0KCkFwYWNoZTo6U2l6ZUxpbWl0IHBvcnRlZCBbUGVycmluIEhhcmtpbnMgPHBlcnJpbiBlbGVtLmNvbT5dCgpjcmVhdGUgYSBuZXcgc3VicG9vbCBtb2RwZXJsX3NlcnZlcl91c2VyX3Bvb2wgKGZyb20KbW9kcGVybF9zZXJ2ZXJfcG9vbCksIHdoaWNoIGlzIHVzZWQgaW50ZXJuYWxseSBieQpBcGFjaGU6OlNlcnZlclV0aWw6OnNlcnZlcl9yZXN0YXJ0X3JlZ2lzdGVyLiBUaGlzIGVuc3VyZXMgdGhhdAp1c2VyLXJlZ2lzdGVyZWQgY2xlYW51cHMgYXJlIHJ1biAqYmVmb3JlKiBwZXJsJ3MgaW50ZXJuYWxzIGNsZWFudXBzCmFyZSBydW4uIChwcmV2aW91c2x5IHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCBub24tdGhyZWFkZWQgcGVybHMgd2hpY2gKd2VyZSBzZWdmYXVsdGluZyBvbiB1c2VyIGNsZWFudXBzLCBzaW5jZSBwZXJsIHdhcyBhbHJlYWR5IGdvbmUgYnkgdGhhdAp0aW1lKS4gW1N0YXNdCgpTdGFydGluZyBmcm9tIEV4dFV0aWxzOjpNYWtlTWFrZXIgNi4yMiBpdCBubyBsb25nZXIgZ2VuZXJhdGVzCnBtX3RvX2JsaWIgdGFyZ2V0LCBidXQgcG1fdG9fYmxpYi50cywgc28gbmVlZGVkIHRvIGZpeCB0aGUgZ2x1ZV9wb2QKdGFyZ2V0LCBzbyBpbnN0YWxsIHdpbGwgd29yayBjb3JyZWN0bHkgW1N0YXNdCgpBcGFjaGU6OlJlcXVlc3RVdGlsIDogJHItPmNoaWxkX3Rlcm1pbmF0ZSgpIGltcGxlbWVudGVkIGZvcgpub24tdGhyZWFkZWQgTVBNcy4gW0dvemVyXQoKbmV3IEFQSSBBcGFjaGU6OlNlcnZlclV0aWw6OnJlc3RhcnRfY291bnQoKSB3aGljaCBjYW4gYmUgdXNlZCB0byB0ZWxsCndoZXRoZXIgdGhlIHNlcnZlciBpcyBzdGFydGluZy9yZXN0YXJ0aW5nL2dyYWNlZnVsbHkKcmVzdGFydGluZy9ldGMuIEJhc2VkIG9uIHRoaXMgZmVhdHVyZSBpbXBsZW1lbnQKJEFwYWNoZTo6U2VydmVyOjpTdGFydGluZyBhbmQgJEFwYWNoZTo6U2VydmVyOjpSZVN0YXJ0aW5nIGluCkFwYWNoZTo6Y29tcGF0IFtTdGFzXQoKQXBhY2hlOjpSZXNvdXJjZSBwb3J0ZWQgdG8gbXAyIFtTdGFzXQoKSWYgbm9uZSBvZiBNUF9BUFhTLCBNUF9BUF9QUkVGSVggYW5kIE1QX1VTRV9TVEFUSUMgd2VyZSBzcGVjaWZpZWQgd2hlbgpjb25maWd1cmluZyBNYWtlZmlsZS5QTCwgd2Ugbm93IHByb21wdCBmb3IgQVBYUyBwYXRoIGZpcnN0IGFuZCBvbmx5IGlmCnRoYXQgZmFpbHMgYXNrIGZvciBNUF9BUF9QUkVGSVguIFRoaXMgaXMgYSByZXF1aXJlbWVudCB0byBnZXQgJ21ha2UKdGVzdCcgZmluZCBodHRwZC4gW1N0YXNdCgpEeW5hbWljYWxseSBwcm9tcHQgYW5kIGFkZCBNUF9JTlNUX0FQQUNIRTI9MSB3aGVuIGluc3RhbGxpbmcgb24Kc3lzdGVtcyB3aXRoIG1vZF9wZXJsIDEgcHJlaW5zdGFsbGVkLiBbU3Rhc10KCmZpeCB0aGUgbG9nZ2luZyBjYWxsIGluIFJlZ2lzdHJ5Q29va2VyIFtMYXJzIEVnZ2VydCA8bGFycy5lZ2dlcnQKbmV0bGFiLm5lYy5kZT5dCgpmaXggJHItPmZpbGVuYW1lIGluIEFwYWNoZTo6Y29tcGF0IHRvIHVwZGF0ZSB0aGUgZmluZm8gc3RydWN0ICh3aGljaAppcyBob3cgaXQgd29ya2VkIGluIG1wMSkgW1N0YXNdCgplbmNsb3NlIGFsbCBvY2N1cmVuY2VzIG9mIGV2YWxfKiB3aXRoIEVOVEVSO1NBVkVUTVBTOwouLi4gRlJFRVRNUFM7TEVBVkU7IHByZXZpb3VzbHkgdGhpbmdzIGp1c3QgaGFwcGVuZWQgdG8gd29yaywgZHVlIHRvCmV4dGVybmFsIHNjb3BlcyB3aGljaCB3YXMgbm90IHZlcnkgcmVsaWFibGUgYW5kIHNvbWUgY2hhbmdlIGNvdWxkCmludHJvZHVjZSBvYnN1cmUgYnVncy4gW1N0YXNdCgppbiBjYXNlIGEgbmF0aXZlIGFwYWNoZSByZXNwb25zZSBmaWx0ZXIgaXMgY29uZmlndXJlZCBvdXRzaWRlIHRoZQo8TG9jYXRpb24+IGJsb2NrIHdpdGggUGVybFNldCpGaWx0ZXIgZGlyZWN0aXZlLCBtYWtlIHN1cmUgdGhhdAptb2RfcGVybCBkb2Vzbid0IHRyeSB0byBhZGQgaXQgYXMgY29ubmVjdGlvbiBmaWx0ZXIgKHByZXZpb3VzbHkgd2FzCmxvZ2dpbmcgYW4gZXJyb3IgbGlrZTogW2Vycm9yXSBhIGNvbnRlbnQgZmlsdGVyIHdhcyBhZGRlZCB3aXRob3V0IGEKcmVxdWVzdDogaW5jbHVkZXMpIFtTdGFzXQoKcmVwbGFjZSB0aGUgc2xvdyBpbXBsZW1lbnRhdGlvbiBvZiBhbm9uIGhhbmRsZXJzIHVzaW5nIEI6OkRlcGFyc2UsCndpdGggcGVyLWludGVycHJldGVyIGNhY2hlIG9mIGNvbXBpbGVkIENPREUgcmVmcyAoc29ydCBvZiBlbXVsYXRpbmcKbmFtZWQgc3Vicm91dGluZXMgZm9yIGFub255bW91cyBoYW5kbGVycykgW1N0YXNdLgoKYXZvaWQgc2VnZmF1bHRzIHdoZW4gYSBib2d1cyAkciBvYmplY3QgaXMgdXNlZCBbU3Rhc10KClJlbW92ZSBtYWdpY25lc3Mgb2YgUGVybExvYWRNb2R1bGUgYW5kIGltcGxlbWVudCBBcGFjaGU6Ok1vZHVsZTo6YWRkKCkKZm9yIG1vZHVsZXMgdGhhdCBpbXBsZW1lbnQgdGhlaXIgb3duIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBbR296ZXJdCgpBcGFjaGU6OkNvbm5lY3Rpb246OnJlbW90ZV9pcCBpcyBub3cgc2V0dGFibGUgKG5lZWRlZCB0byBzZXQgdGhlCnJlbW90ZV9pcCByZWNvcmQgYmFzZWQgb24gcHJveHkncyBYLUZvcndhcmRlZC1Gb3IgaGVhZGVyKSBbU3Rhc10KCkZpeCBNb2RwZXJsOjpVdGlsOjp1bmxvYWRfcGFja2FnZSgpIFtHb3plcl0KICAtIE1pc3Rha2VubHkgc2tpcHBpbmcgc21hbGwgZW50cmllcyBvZiBzaXplIDIgYW5kIGxlc3MKICAtIExlYXZlIGVudHJpZXMgZnJvbSBvdGhlciBwYWNrYWdlcyBhbG9uZQoKJGZpbHRlci0+cmVtb3ZlIG5vdyB3b3JrcyB3aXRoIG5hdGl2ZSAobm9uLW1vZHBlcmwpIGZpbHRlcnMgKyB0ZXN0CltUb3JzdGVuIEb2cnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2ggZ214Lm5ldD5dCgoKCj1pdGVtIDEuOTlfMTcgLSBPY3RvYmVyIDIyLCAyMDA0CgpJbXBsZW1lbnQgQXBhY2hlLT51bmVzY2FwZV91cmxfaW5mbyBpbiBBcGFjaGU6OmNvbXBhdCBhbmQgZHJvcCBpdApmcm9tIHRoZSBvZmZpY2lhbCBBUEkgZm9yIENHSTo6VXRpbDo6dW5lc2NhcGUoKSBhcyBhIHN1Z2dlc3RlZApyZXBsYWNlbWVudCBbR296ZXJdCgpmaXggeHNfZ2VuZXJhdGUgdG8gY3JvYWsgb24gZHVwbGljYXRlIGVudHJpZXMgaW4geHMvbWFwcyBmaWxlcwpbQ2hyaXN0aWFuIEtyYXVzZSA8Y2hrciBwbGF1ZW5lci5kZT5dCgpXb3JrYXJvdW5kIGEgcG9zc2libGUgYnVnIGluIFBlcmxfbG9hZF9tb2R1bGUoKSBbR296ZXJdCgpGaXggYSBwcm9ibGVtIGJ1aWxkaW5nIHdpdGggbm9uLUdOVSBtYWtlIChjYW4ndCBtYWtlIHRhcmdldCBkeW5hbWljCmluIHhzL0FQUi9hcHJleHQpIFtHb3plcl0KCmVzY2FwZSBIVE1MIGluIGR1bXBlZCB2YXJpYWJsZXMgYnkgQXBhY2hlOjpTdGF0dXMgW01hcmt1cyBXaWNoaXRpbGwKPG1hd2ljQGdteC5kZT5dCgokci0+ZG9jdW1lbnRfcm9vdCBjYW4gbm93IGJlIGNoYW5nZWQgd2hlbiBzYWZlIHRvIGRvIHNvIFtHb3plcl0KCkFQUjo6QnVja2V0LT5uZXcgbm93IHJlcXVpcmVzIGFuIEFQUjo6QnVja2V0QWxsb2MgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LgpOZXcgc3VicyBhZGRlZDogQVBSOjpCdWNrZXQ6OnNldGFzaWRlLCBBUFI6OkJ1Y2tldDo6YWxsb2NfY3JlYXRlLApBUFI6OkJ1Y2tldDo6YWxsb2NfZGVzdHJveSwgQVBSOjpCcmlnYWRlOjpidWNrZXRfYWxsb2MuIFtqb2VzXQoKcmVpbXBsZW1lbnQgQVBSOjpQb29sIGxpZmUtc2NvcGUgaGFuZGxpbmcsICh0aGUgcHJldmlvdXMKaW1wbGVtZW50YXRpb24gaGFkIHByb2JsZW1zKSBbam9lc10KCm1ha2Ugc3VyZSB0aGF0IEFwYWNoZTo6RmlsdGVyOjpyZWFkLCBBUFI6OlNvY2tldDo6cmVjdiwKQXBhY2hlOjpSZXF1ZXN0SU86OnJlYWQsIEFQUjo6QnJpZ2FkZTo6ZmxhdHRlbiwgYW5kIEFQUjo6QnVja2V0OjpyZWFkCmFsbCByZXR1cm4gdGFpbnRlZCBkYXRhIHVuZGVyIC1UIFtTdGFzXQoKdGFnIHRoZSBjdXN0b20gcG9vbHMgY3JlYXRlZCBieSBtb2RfcGVybCBmb3IgZWFzaWVyIHBvb2xzIGRlYnVnIFtKb2UKT3J0b25dCgpmaXggYSBidWcgaW4gbm9uLWl0aHJlYWRlZC1wZXJsIGltcGxlbWVudGF0aW9uIHdoZXJlIHRoZSBjYWNoZWQKY29tcGlsZWQgQ09ERSByZWZzIG9mIGh0dHBkLmNvbmYtaW5saW5lZCBvbmUtbGluZXIgaGFuZGxlcnMgbGlrZToKUGVybEZpeHVwSGFuZGxlciAnc3ViIHsgdXNlIEFwYWNoZTo6Q29uc3QgcXcoREVDTElORUQpOyBERUNMSU5FRCB9JwpkaWRuJ3QgaGF2ZSB0aGUgcmVmZXJlbmNlIGNvdW50IHJpZ2h0LiBbU3Rhc10KCnBlci1zZXJ2ZXIgUGVybFNldEVudiBhbmQgUGVybFBhc3NFbnYgdmFsdWVzIGFyZSBwcm9wZXJseSBhZGRlZAp0byAlRU5WIHdoZW4gb25seSBhIHBlci1kaXJlY3RvcnkgaGFuZGxlciBpcyBjb25maWd1cmVkLgpbR2VvZmZyZXkgWW91bmddCgpyZXNvbHZlIHNldmVyYWwgJ1VzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGluLi4uJyB3YXJuaW5ncyBpbgpBcGFjaGU6OlN0YXR1cyBbU3Rhc10uCgptYWtlIGluc3RhbGwgYW5kIHN0YXRpYyBidWlsZCBub3cgY29ycmVjdGx5IGluc3RhbGxzIG1vZF9wZXJsIGFzCndlbGwgYXMgdGhlIHN0YXRpY2FsbHkgYnVpbHQgYXBhY2hlIFtHb3plcl0KCmlmIHNvbWUgY29kZSBjaGFuZ2VzIHRoZSBjdXJyZW50IGludGVycHJldGVyJ3MgdGFpbnRlZCBzdGF0ZSB0byBvbiwKdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBoYW5kbGVyIGNhbGxiYWNrIHdpbGwgYmUgdGFpbnRlZCwgYW5kIHdlCmZhaWwgdG8gZGVhbCB3aXRoIHRoYXQuIFNvIHJldmVydCB0byBjb2VyY2luZyBhbnkgcmV0dXJuIHZhbHVlLCBidXQKdW5kZWYgKGEgc3BlY2lhbCBjYXNlIGZvciBleGl0KCkpLiB0byBJViwgc28gdGhhdCB0YWludGVkIHZhbHVlcyBhcmUKaGFuZGxlZCBjb3JyZWN0bHkgYXMgd2VsbC4gW1N0YXNdCgptYWtlIHN1cmUgdGhhdCBlYWNoIGhhbmRsZXIgY2FsbGJhY2sgc3RhcnRzIHdpdGggYSBwcmlzdGluZQp0YWludGVkLW5lc3Mgc3RhdGUsIHNvIHRoYXQgcHJldmlvdXMgY2FsbGJhY2sgY2FsbHMgd29uJ3QgYWZmZWN0IHRoZQpjb25zZXF1ZW50IG9uZXMuIFdpdGhvdXQgdGhpcyBjaGFuZ2UgYW55IGhhbmRsZXIgdHJpZ2dlcmluZyBldmFsIG9yCmFub3RoZXIgZnVuY3Rpb24gY2FsbCwgdGhhdCBjaGVja3MgVEFJTlRfUFJPUEVSLCB3aWxsIGNyYXNoIG1vZF9wZXJsCndpdGg6ICJJbnNlY3VyZSBkZXBlbmRlbmN5IGluIGV2YWwgd2hpbGUgcnVubmluZyBzZXRnaWQuIENhbGxiYWNrCmNhbGxlZCBleGl0LiIgZmFyZXdlbGwgbWVzc2FnZSBbU3Rhc10KCm1ha2Ugc3VyZSB0aGF0ICdtYWtlIGRpc3RjbGVhbicgY2xlYW5zIGFsbCB0aGUgYXV0b2dlbmVyYXRlZCBmaWxlcwpbU3Rhc10KCiRyLT5sb2dfcmVhc29uIGhhcyBiZWVuIHBvcnRlZCBhbmQgbW92ZWQgb3V0IG9mIEFwYWNoZTo6Y29tcGF0CltHb3plcl0KCkFQUjo6T1M6OnRocmVhZF9jdXJyZW50IHJlbmFtZWQgQVBSOjpPUzo6Y3VycmVudF90aHJlYWRfaWQgYW5kCm5vdyByZXR1cm5zIHRoZSBhY3R1YWwgdGhyZWFkX2lkIGluc3RlYWQgb2YgYW4gb2JqZWN0IHRoYXQKbmVlZGVkIHRvIGJlIGRlcmVmZXJlbmNlZCB0byBnZXQgYXQgdGhlIHRocmVhZF9pZCBbR296ZXJdCgpjaGFuZ2UgYSBidW5jaCBvZiB0aGUgQVBSOjogY29uc3RhbnRzIHRvIGhhdmUgYSBiZXR0ZXIgcHJlZml4CihBUFI6OkZJTEVUWVBFXyogYW5kIEFQUjo6RklMRVBST1RfKS4gbGliYXByIHdpbGwgYmUgY2hhbmdlZCBzb29uIHRvbwpbU3Rhc10KCkdlbmVyYXRlIG1vZHBlcmxfZXhwb3J0cy5jIGZvciBzdGF0aWMgYnVpbGRzIHRvIHByZXZlbnQgdGhlCmxpbmtlciBmcm9tIHN0cmlwcGluZyBuZWVkZWQgYnV0IHVudXNlZCBzeW1ib2xzIFtHb3plcl0KCkFkZCAubGlicy8gYXMgcGFydCBvZiB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCB3aGVuIGJ1aWxkaW5nCmFnYWluc3QgaHR0cGQncyBzb3VyY2UgdHJlZSBbR296ZXJdCgpJbiB0aGUgc3RhdGljIGJ1aWxkLCBydW4gbWFrZSBpbiBodHRwZCdzIHNyY2xpYi8gZWFybHkgdG8gaGF2ZQpnZW5lcmF0ZWQgZmlsZXMgcHJlc2VudCBhdCBtb2RfcGVybCBjb25maWd1cmUgdGltZSBbR296ZXJdCgpXaGVuIHNlYXJjaGluZyBmb3IgYXAocnx1KS1jb25maWcgaW4gaHR0cGQncyBzb3VyY2UgdHJlZSwgc2VhcmNoCmludG8gc3JjbGliL2Fwci11dGlsIGFzIHdlbGwgYXMgc3JjbGliL2FwciBbR296ZXJdCgpSZW1vdmUgQVBSOjpGaW5mbzo6cG9vbCBhcyBpdCBoYXMgbm8gdXNlIHRvIHVzIFtTdGFzXQoKZ2V0IFBlcmxTZXRWYXIgYW5kIFBlcmxBZGRWYXIgbXVsdGktbGV2ZWwgbWVyZ2VzIHRvIChmaW5hbGx5KSB3b3JrCnByb3Blcmx5LiAgW1JpY2kgTGFrZSA8cmljaSByaWNpbGFrZS5uZXQ+XQoKTVBfQVBfQlVJTEQgY29uZmlndXJlIG9wdGlvbiByZW1vdmVkLiBOb3cgaW1wbGljaXQgd2hlbiBNUF9VU0VfU1RBVElDCmlzIHNwZWNpZmllZCBbR296ZXJdCgpBcGFjaGU6Ok1vZHVsZSAkbW9kLT52ZXJzaW9uKCkgYW5kICRtb2QtPm1pbm9yX3ZlcnNpb24oKSByZW5hbWVkCnRvICRtb2QtPmFwX2FwaV9tYWpvcl92ZXJzaW9uKCkgYW5kICRtb2QtPmFwX2FwaV9taW5vcl92ZXJzaW9uCmZvciBjbGFyaXR5IFtHb3plcl0KCkFwYWNoZTo6TG9nIGNoYW5nZXM6IFtTdGFzXQogIC0gbW92ZWQgdG8gY29tcGF0OiBBcGFjaGU6Ondhcm4sIEFwYWNoZS0+d2FybiwgQXBhY2hlOjpTZXJ2ZXItPndhcm4sCiAgICBBcGFjaGU6OlNlcnZlcjo6d2FybgogIC0gcmUtZW5hYmxlZCAkci0+d2FybgogIC0gcmVtb3ZlZCBzdXBwb3J0IGZvciBBcGFjaGU6OlNlcnZlclJlYy0+d2FybgogICAgKEFwYWNoZTo6U2VydmVyUmVjOjp3YXJuIGlzIHN0aWxsIHRoZXJlKQoKQXBhY2hlOjpEaXJlY3RpdmUgY29uZnRyZWUoKSBjaGFuZ2VkIGZyb20gY2xhc3MgbWV0aG9kIHRvCnJlZ3VsYXIgc3Vicm91dGluZSBbR296ZXJdCgpBcGFjaGU6Ok1vZHVsZSB0b3BfbW9kdWxlKCkgYW5kIGdldF9jb25maWcoKSBhcyBjbGFzcyBtZXRob2RzCmFkZGVkIHRvIEFwYWNoZTo6Y29tcGF0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBbR296ZXJdCgpBcGFjaGU6Ok1vZHVsZSB0b3BfbW9kdWxlKCkgYW5kIGdldF9jb25maWcoKSBjaGFuZ2VkIGZyb20gY2xhc3MKbWV0aG9kcyB0byByZWd1bGFyIHN1YnJvdXRpbmVzIFtHb3plcl0KCkFkZGVkIEFwYWNoZTo6Q21kUGFybXM6OmFkZF9jb25maWcoKSB0byB3b3JrIGFyb3VuZCBhIG1lbW9yeQpsZWFrIGRpc2NvdmVyZWQgd2l0aCA8UGVybD4gc2VjdGlvbnMgaW4gLmh0YWNjZXNzIGZpbGVzIFtHb3plcl0KCkFkZGVkIE1vZFBlcmw6OlV0aWw6OnVubG9hZF9wYWNrYWdlKCkgdG8gcmVtb3ZlIGEgbG9hZGVkIHBhY2thZ2UKYXMgdGhvcm91Z2hseSBhcyBwb3NzaWJsZSBieSBjbGVhcmluZyBpdCdzIHN0YXNoLiBbR296ZXJdCgpmaXggQXBhY2hlLT5yZXF1ZXN0KCRyKSB0byBiZSBzZXQtYWJsZSBldmVuIHcvOiBQZXJsT3B0aW9ucwotR2xvYmFsUmVxdWVzdCBbU3Rhc10KCkFkZCBBcGFjaGU6OlJlbG9hZC0+dW5yZWdpc3Rlcl9tb2R1bGUoKSB0byBleHBsaWNpdGVseSByZW1vdmUgYQptb2R1bGUgZnJvbSBBcGFjaGU6OlJlbG9hZCdzIG1vbml0b3JpbmcgbGlzdCBbR296ZXJdCgppbnRyb2R1Y2UgYSBjdXN0b20gbW9kcGVybCBlcnJvciBtZXNzYWdlIGZvciBmYWlsaW5nIGZpbHRlciBoYW5kbGVycwoocHJldmlvdXNseSAndW5rbm93biBlcnJvcicgY29taW5nIGZyb20gcmM9NTAwIHdhcyBsb2dnZWQpIFtTdGFzXQoKRml4IEFwYWNoZTo6TG9nIG1ldGhvZHMvZnVuY3Rpb25zIHRvIGxvZyBpbnRvIHRoZSB2aG9zdCdzIGVycm9yX2xvZwpmaWxlIChpZiB0aGVyZSBpcyBvbmUpLiAoICRzLT5sb2ctPiosICRzLT5sb2dfZXJyb3IsICRzLT5sb2dfc2Vycm9yLApBcGFjaGU6OlNlcnZlclJlYzo6d2FybiwgZXRjLikuIEFwYWNoZTo6U2VydmVyUmVjIGNhbiBub3cgZXhwb3J0IGl0cwp3YXJuIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIENPUkU6Ondhcm4gW1N0YXNdCgpGaXggJHMtPmxvZy0+KiwgJHMtPmxvZ19lcnJvciBhbmQgJHMtPmxvZ19zZXJyb3IgdG8gYWdhaW4gbG9nIGludG8gdGhlCnZob3N0J3MgZXJyb3JfbG9nIGZpbGUgKGlmIHRoZXJlIGlzIG9uZSkuIFtTdGFzXQoKJHMtPmxvZy0+d2FybiBhbmQgb3RoZXIgJHMtPmxvZy0+Zm9vIGFyZSBub3cgbG9nZ2luZyB0byB0aGUgcmlnaHQKdmhvc3Qgc2VydmVyIGFuZCBub3QgdGhlIGdsb2JhbCBvbmUuIG1vZHBlcmxfc3Yyc2VydmVyX3JlYyB3YXMKYnJva2VuLiBbU3Rhc10KCkZpeCBhIGdsdWVfcG9kIG1ha2UgdGFyZ2V0IGJ1Zywgd2hlbiAucG0gZmlsZSBkb2Vzbid0IGV4aXN0LAplLmcuIFRocmVhZE11dGV4LnBtIGlzIG5vdCBjcmVhdGVkIG9uIHVubGVzcwokYXByX2NvbmZpZy0+e0hBU19USFJFQURTfSBbU3Rhc10KCkludHJvZHVjZSBBUFI6OlNvY2tldDo6cG9sbCB0byBwb2xsIGEgbm9uLWJsb2NraW5nIHNvY2tldCBbS2VuIFNpbXBzb24KPGtzaW1wc29uQGxhcmNoLm1haWxjaGFubmVscy5jb20+XQoKRml4IHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIG1pbmltYWwgcmVxdWlyZWQgaHR0cGQgdmVyc2lvbiBpcyBub3QKc2F0aXNmaWVkIFtQcmF0aWsgPHByYXRpa25haWtAZ21haWwuY29tPl0KCkZpeCBpbnRlcmFjdGl2ZSBwcm9tcHRpbmcgYXQgcGVybCBNYWtlZmlsZS5QTCwgd2hlbiBubyBBUFhTIG9yCk1QX0FQX1BSRUZJWCB3ZXJlIHByb3ZpZGVkLiBub3cgYXNraW5nIGZvciBhbiBhbHRlcm5hdGl2ZSBsb2NhdGlvbiBpZgp0aGUgc3VnZ2VzdGVkIGNob2ljZXMgd2VyZW4ndCBzZWxlY3RlZC4gW1N0YXNdCgpBZGRlZCBBUFI6OlVSSS0+cnBhdGggbWV0aG9kLiBSZXR1cm5zIHRoZSBwYXRoIG9mIGFuIHVyaSBtaW51cwpwYXRoX2luZm8sIGlmIGFueS4gW0dvemVyXQoKbW92ZWQgQXBhY2hlOjpjdXJyZW50X2NhbGxiYWNrKCkgdG8gTW9kUGVybDo6VXRpbDo6Y3VycmVudF9jYWxsYmFjawp3aGVyZSBpdCBiZWxvbmdzIFtHb3plcl0KCm1vZHBlcmxfcGVybF9tb2R1bGVfbG9hZGVkKCkgZml4ZWQgdG8gdXNlICVJTkMgdG8gZGV0ZXJtaW5lIGlmIGEgbW9kdWxlCmlzIGxvYWRlZCBpbnN0ZWFkIG9mIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgc3Rhc2ggW0dvemVyXQoKZml4IHRoZSBtb2RwZXJsIGJ1aWxkLCB3aGVyZSBodHRwZCBoYXMgYmVlbiBidWlsdCBhZ2FpbnN0IHNlcGFyYXRlCmluc3RhbGxhdGlvbnMgb2YgYXByLXV0aWwgYW5kIGFwciwgd2hlcmUgYXByLXV0aWwgaGFzIGJlZW4gaW5zdGFsbGVkCndpdGggYSBkaWZmZXJlbnQgaW5jbHVkZWRpciB0byBhcHIuIFtKb2UgT3J0b25dCgokQXBhY2hlOjpTZXJ2ZXI6OlNhdmVDb25maWcgaXMgbm93ICRBcGFjaGU6OlBlcmxTZWN0aW9uczo6U2F2ZQpbR2VvZmZyZXkgWW91bmddCgoKCj1pdGVtIDEuOTlfMTYgLSBBdWcgMjIsIDIwMDQKCkZpeCBhIGNvbXBpbGF0aW9uIHByb2JsZW0gYnJlYWtpbmcgMS45OV8xNSAoc3ZfY29weXB2IHdhcyBhZGRlZCBpbgpwZXJsIDUuNy4zKSBbSmFzb24gV29vZHdhcmQgPHdvb2R3YXJkakBqYW9zLm9yZz5dCgpBZGRlZCAkci0+Y29udGVudF9sYW5ndWFnZXMgaW4gQXBhY2hlOjpSZXF1ZXN0UmVjIFtHb3plcl0KCkFQUjo6QnVja2V0OiBhZGQgZGVsZXRlKCkgYW5kIGRlc3Ryb3koKSBtZXRob2RzIFtTdGFzXQoKCgo9aXRlbSAxLjk5XzE1IC0gQXVnIDIwLCAyMDA0CgpyZXBsYWNlIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgbW9kcGVybCBmaWx0ZXIgaGFuZGxlcnMgdG8gdXNlIGEKdGVtcG9yYXJ5IHN1YnBvb2wgb2YgdGhlIGFwX2ZpbHRlcl90IG9iamVjdC4gcHJldmlvdXNseSB1c2luZyBwZXJsJ3MKc2FmZW1hbGxvYyBoYWQgcHJvYmxlbXMgb24gd2luMzIgKHJhbmRvbWx5IG15X3BlcmwgPT0gTlVMTCkgW1N0YXNdCgpEaXNhYmxlIEFwYWNoZTo6SG9va1J1bjo6cnVuX2NyZWF0ZV9yZXF1ZXN0IC0tIGl0J3MgYWxyZWFkeSBydW4KaW50ZXJuYWxseSBieSBBcGFjaGU6OlJlcXVlc3RSZWMtPm5ldyBbU3Rhc10KClVwZGF0ZSBBcGFjaGU6OlJlcXVlc3RSZWMtPm5ldygpIHRvIGluaXRpYWxpemUgbWVtYmVycyBvZiByZXF1ZXN0X3JlYwp3aGljaCB3ZXJlIGFkZGVkIHNvbWUgdGltZSBhZ28gKHdpdGhvdXQgaXQgd2Ugd2VyZSBnZXR0aW5nIHNlZ2ZhdWx0cwppbiB0aGUgbmV3IHBzZXVkb19odHRwIHRlc3QuIFtTdGFzXQoKQXBhY2hlOjpDbWRQYXJtcy0+bGltaXRlZCBtZW1iZXIgcmVwbGFjZWQgYnkgaXNfbWV0aG9kX2xpbWl0ZWQoKQptZXRob2QgW0dvemVyXQoKQXBhY2hlOjpNb2R1bGUgY2hhbmdlcyBbR296ZXJdCi0gcmVhZHdyaXRlID0+IHJlYWRvbmx5OgogICAgY21kcywgbmV4dCwgbmFtZSwgbW9kdWxlX2luZGV4LCBtaW5vcl92ZXJzaW9uLCB2ZXJzaW9uCi0gcmVtb3ZlZDogcmVtb3ZlX21vZHVsZQoKZW5zdXJlIHRoYXQgYSBzdWItZGlyIEFwYWNoZS1UZXN0IGV4aXN0cyBpbiB0aGUgc291cmNlIGRpc3RybyAodGhpcyBpcwphIHJlcXVpcmVtZW50LCBzaW5jZSB0aGUgdGVzdCBzdWl0ZSByZWxpZXMgb24gdGhlIHBhcnRpY3VsYXIKQXBhY2hlLVRlc3QgdmVyc2lvbiBkaXN0cmlidXRlZCB3aXRoIHRoZSBtb2RfcGVybCBzb3VyY2UpIFtTdGFzXQoKY29tYmluZSBoYW5kbGVyIHJlc29sdmluZyBmYWlsdXJlIGVycm9yIHdpdGggdGhlIGFjdHVhbCBlcnJvciwgc28KdGhlcmUgaXMgb25seSBvbmUgbG9nZ2VkIGVudHJ5IFtTdGFzXQoKcG9kIG1hbnBhZ2VzIGFyZSBub3cgZ2x1ZWQgdG8gYWxsIC5wbSBmaWxlcyBmb3Igd2hpY2ggLnBvZCBleGlzdHMgYXQKJ21ha2UgaW5zdGFsbCcgcGhhc2UgW1N0YXNdCgpBcGFjaGU6OlJlcXVlc3RJTzo6c2VuZGZpbGUoKSBub3cgaW5kaWNhdGVzIHdoaWNoIGZpbGUgaXQgaGFzIGZhaWxlZAp0byBvcGVuIG9uIGZhaWx1cmUuIFtTdGFzXQoKZml4IEFwYWNoZTo6U3ViUmVxdWVzdCdzIG1ldGhvZHM6IGxvb2t1cF9maWxlLCBsb29rdXBfdXJpLApsb29rdXBfbWV0aG9kX3VyaSB0byBkZWZhdWx0IHRoZSBsYXN0IGFyZ3VtZW50IHRvCnItPnByb3RvX291dHB1dF9maWx0ZXJzIChubyByZXF1ZXN0IGZpbHRlcnMgZm9yIHRoZSBzdWJyZXF1ZXN0KSBhbmQKbm90IHItPm91dHB1dF9maWx0ZXJzLT5uZXh0IGFzIGl0IHdhcyBiZWZvcmUgKG9uZSBmaWx0ZXIgd2FzIGdldHRpbmcKc2tpcHBlZCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbHRlcnMgd2VyZSBhcHBsaWVkICp0d2ljZSopLiBbU3Rhc10KCkFwYWNoZTo6Q21kUGFybXMgY2hhbmdlcyBbR296ZXJdCi0gcmVhZHdyaXRlID0+IHJlYWRvbmx5OgogICAgb3ZlcnJpZGUsIGxpbWl0ZWQsIGRpcmVjdGl2ZSwgcG9vbCwgdGVtcF9wb29sLCBzZXJ2ZXIsIHBhdGgsCiAgICBjbWQsIGNvbnRleHQsIGVycl9kaXJlY3RpdmUKCi0gcmVtb3ZlZDogbGltaXRlZF94bWV0aG9kcywgeGxpbWl0ZWQsIGNvbmZpZ19maWxlLCBlcnJfZGlyZWN0aXZlCgpGaXggYSBidWcgaW4gQVBSOjpCdWNrZXQtPm5ldyB3aGVuIGEgcGFzc2VkIGFyZ3VtZW50IHdhcyBvZiB0eXBlClBBRFRNUCBbU3Rhc10KCkFwYWNoZTo6Q29ubmVjdGlvbiBjaGFuZ2VzIFtTdGFzLCAiRnJlZCBNb3llciIgPGZyZWQgL2Fib3V0Lwp0YXBlcmZyaWVuZGx5bXVzaWMub3JnPl0KLSByZWFkd3JpdGUgPT4gcmVhZG9ubHk6CgogICAgcG9vbCwgYmFzZV9zZXJ2ZXIsIGxvY2FsX2FkZHIsIHJlbW90ZV9hZGRyLCByZW1vdGVfaXAsIHJlbW90ZV9ob3N0LCAKICAgIGFib3J0ZWQsIGxvY2FsX2lwLCBsb2NhbF9ob3N0LCBpZCwgY29ubl9jb25maWcsIHNiaCwgYnVja2V0X2FsbG9jCgotIHJlbW92ZWQ6IGxvZ25hbWUKCk1vdmUgY2hlY2tfY21kX2NvbnRleHQgZnJvbSBBcGFjaGU6OkNvbW1hbmQgdG8gQXBhY2hlOjpDbWRQYXJtcy4KW0dvemVyXQoKQWRkIDpjb250ZXh0IGdyb3VwIG9mIGNvbnN0YW50cyBmb3IgY2hlY2tfY21kX2NvbnRleHQoKS4KTk9UX0lOX1ZJUlRVQUxIT1NULCBOT1RfSU5fTElNSVQsIE5PVF9JTl9ESVJFQ1RPUlksIE5PVF9JTl9MT0NBVElPTiwKTk9UX0lOX0ZJTEVTLCBOT1RfSU5fRElSX0xPQ19GSUxFICYgR0xPQkFMX09OTFkgW0dvemVyXQoKUmVtb3ZlZCBBcGFjaGU6OkNvbW1hbmQgbWV0aG9kIHNvYWtfZW5kX2NvbnRhaW5lciBbR296ZXJdCgpSZW1vdmVkIEFwYWNoZTo6TW9kdWxlIG1ldGhvZHMgKGR5bmFtaWNfbG9hZF9oYW5kbGUgYW5kCmZpbmRfbW9kdWxlX25hbWUpIFtHb3plcl0KCkFsbCBBcGFjaGU6OkNvbW1hbmQgbWV0aG9kcyBhcmUgbm93IHJlYWQtb25seSBbR296ZXJdCgpSZW1vdmVkIEFwYWNoZTo6Q29tbWFuZCBtZXRob2RzIChmdW5jIGFuZCBjbWRfZGF0YSkgW0dvemVyXQoKUmVtb3ZlZCBBcGFjaGU6OkRpcmVjdGl2ZSBtZXRob2RzIChkYXRhICYgd2Fsa19jb25maWcpIFtHb3plcl0KCkFsbCBBcGFjaGU6OkRpcmVjdGl2ZSBtZXRob2RzIGFyZSBub3cgcmVhZC1vbmx5IFtHb3plcl0KCkZpbHRlcnMgc2hvdWxkIG5vdCByZXNldCAkQCBpZiBpdCB3YXMgYWxyZWFkeSBzZXQgYmVmb3JlCmludm9jYXRpb24gW0dvemVyXQoKQXBhY2hlOjpjb21wYXQgc2VydmVyX3Jvb3RfcmVsYXRpdmUgbm93IGNvcnJlY3RseSBoYW5kbGVzIGFic29sdXRlIApwYXRocyBsaWtlIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlIGRvZXMgW0dvemVyXQoKRml4IGEgYnVnIGluIDxQZXJsPiBzZWN0aW9ucyB3aXRoIG11bHRpcGxlIGFsaWFzZXMgaW4gYQp2aXJ0dWFsaG9zdCBjb250YWluZXIuIFtHb3plcl0KClBlcmxNb2R1bGUsIFBlcmxSZXF1aXJlLCBQZXJsIGFuZCA8UGVybD4gaXMgbm93IHN1cHBvcnRlZCBpbgouaHRhY2Nlc3MuIFRoZXkgd2lsbCBydW4gZm9yIGVhY2ggcmVxdWVzdC4gW0dvemVyXQoKcmVtb3ZlZCBzdXBwb3J0IGZvciBodHRwZCAyLjAuNDYuICBodHRwZCAyLjAuNDcgaXMgbm93IHRoZSBtaW5pbXVtCnN1cHBvcnRlZCB2ZXJzaW9uLiAgW0dlb2ZmcmV5IFlvdW5nXQoKU3RhdGljIGJ1aWxkcyBmb3IgaHR0cGQgPj0gMi4wLjUxIGF2YWlsYWJsZS4gV2l0aCB0aGUgbmV3IE1QX0FQX0JVSUxECm9wdGlvbiwgY29uZmlndXJlIGFuZCBjb21waWxlIGFuIGh0dHBkIHdpdGggbW9kX3Blcmwgc3RhdGljYWxseSBsaW5rZWQKaW4gW0dvemVyXQoKQXBhY2hlOjpSZXF1ZXN0UmVjIG1ldGhvZHMgY2hhbmdlcyBbU3Rhc10KLSByZWFkd3JpdGUgPT4gcmVhZG9ubHk6CgogICAgY29ubmVjdGlvbiwgY2Fub25pY2FsX2ZpbGVuYW1lLCBoZWFkZXJfb25seSwgbWFpbiwgbmV4dCwgcHJldiwKICAgIHBvb2wsIHBlcl9kaXJfY29uZmlnLCByZXF1ZXN0X2NvbmZpZywgcHJvdG9fbnVtLCBwcm90b2NvbCwKICAgIHJlcXVlc3RfdGltZSwgc2VydmVyLCB0aGVfcmVxdWVzdCwgdW5wYXJzZWRfdXJpCgotIHJlbW92ZWQ6CgogICAgcmVtYWluaW5nIC0gdGhpcyBtZXRob2QgaXMgbm90IG5lZWRlZCBpZiB0aGUgZGVwcmVjYXRlZAogICAgICAgICAgICAgICAgJHItPmNsaWVudF9ibG9jayBtZXRob2RzIGFyZW4ndCB1c2VkLCAodXNlICRyLT5yZWFkCiAgICAgICAgICAgICAgICAkci0+aW5zdGVhZCkKICAgIGNhbm9uaWNhbF9maWxlbmFtZSAtIGl0J3MgYSBwcml2YXRlIG1lbWJlcgoKVGhlIGZ1bmMgQXBhY2hlOjpTdWJQcm9jZXNzOjpzcGF3bl9wcm9jX3Byb2cgaXMgbm93IGEgbWV0aG9kOgokci0+c3Bhd25fcHJvY19wcm9nIFtTdGFzXQoKQXBhY2hlOjpQcm9jZXNzIG1ldGhvZHMgKHBvb2wsIHBjb25mIGFuZCBzaG9ydF9uYW1lKSBhcmUgbm93IHJlYWQtb25seQpbU3Rhc10KCigkcnwkY3wkcyktPnNlcnZlcl9yb290X3JlbGF0aXZlIHdlcmUgcmVtb3ZlZC4gTm93IG9ubHkgYW4gZXhwbGljaXQKYW5kIHNvbWV3aGF0IGRlcHJlY2F0ZWQgZnVuY3Rpb24gQVBJIHJlbWFpbnM6CkFwYWNoZTo6U2VydmVyVXRpbDo6c2VydmVyX3Jvb3RfcmVsYXRpdmUoJHBvb2wsICRwYXRoKTsgaXQncyB0b28gZWFzeQp0byBjYXVzZSBtZW1vcnkgbGVhayB3aXRoIHRoaXMgbWV0aG9kLCBhbmQgaXQncyBpbmVmZmljaWVudCBhcyBpdApkdXBsaWNhdGVzIHRoZSByZXR1cm4gdmFsdWUsIHRvIGF2b2lkIHBvdGVudGlhbCBzZWdmYXVsdHMgaWYgdGhlIHBvb2wKaXQgd2FzIGFsbG9jYXRlZCBmcm9tIGdldHMgZGVzdHJveWVkIGFuZCB0aGUgdmFsdWUgaXMgYXR0ZW1wdGVkIHRvIGJlCnVzZWQuIEluc3RlYWQgb2YgdGhpcyBtZXRob2QgdXNlIHRoZSBlcXVpdmFsZW50OgpGaWxlOjpTcGVjLT5jYXRmaWxlKEFwYWNoZTo6U2VydmVyVXRpbDo6c2VydmVyX3Jvb3QsICRmbmFtZSk7IFtTdGFzXQoKJHItPnBzaWduYXR1cmUgbm93IGxpdmVzIGluIHRoZSBwYWNrYWdlIGl0IGJlbG9uZ3MgdG86CkFwYWNoZTo6UmVxdWVzdFV0aWwgKHByZXZpb3VzbHkgbGl2ZWQgaW4gQXBhY2hlOjpTZXJ2ZXJVdGlsKS4gW1N0YXNdCgpBIGZldyBmdW5jdGlvbnMgbW92ZWQgbmFtZXNwYWNlIGZyb20gQXBhY2hlOjogdG8gQXBhY2hlOjpTZXJ2ZXJVdGlsOjoKKHRvIG1ha2UgaXQgZWFzaWVyIHRvIGZpbmQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZnVuY3Rpb24pOiBbU3Rhc10KICAtIGV4aXN0c19jb25maWdfZGVmaW5lCiAgLSBzZXJ2ZXJfcm9vdAogIC0gZ2V0X3NlcnZlcl9idWlsdAogIC0gZ2V0X3NlcnZlcl92ZXJzaW9uCgpmaXggYW4gb2xkIG91dHN0YW5kaW5nIGJ1ZyBpbiB0aGUgQVBSOjpUYWJsZSdzIFRJRSBpbnRlcmZhY2Ugd2l0aAplYWNoKCkvdmFsdWVzKCkgb3ZlciB0YWJsZXMgd2l0aCBtdWx0aS12YWx1ZXMga2V5cy4gTm93IHRoZSBwcm9kdWNlZApvcmRlciBpcyBjb3JyZWN0IGFuZCBjb25zaXN0ZW50IHdpdGgga2V5cygpLiBUaG91Z2gsIHZhbHVlcygpIHdvcmtzCmNvcnJlY3RseSBvbmx5IHdpdGggcGVybCA1LjgueCBhbmQgaGlnaGVyLiBbSm9lIFNjaGFlZmVyXQoKcmVxdWlyZSBQZXJsIDUuNi4xLCA1LjYuMCBpc24ndCBzdXBwb3J0ZWQgZm9yIGEgbG9uZyB0aW1lLCBidXQgd2UKd2VyZW4ndCBhYm9ydGluZyBhdCB0aGUgTWFrZWZpbGUuUEwgc3RhZ2UgW1N0YXNdCgpBcGFjaGU6OlJlcXVlc3RVdGlsOjptZXRob2RfcmVnaXN0ZXIoJHMtPnByb2Nlc3MtPnBjb25mLCAnRk9PJyk7IGlzCm5vdyAkcy0+bWV0aG9kX3JlZ2lzdGVyKCdGT08nKS4KQXBhY2hlOjpSZXF1ZXN0VXRpbDo6YWRkX3ZlcnNpb25fY29tcG9uZW50KCRzLT5wcm9jZXNzLT5wY29uZiwgJ0JBUi8wLjEnKTsKaXMgbm93ICRzLT5hZGRfdmVyc2lvbl9jb21wb25lbnQoJ0JBUi8wLjEnKS4gIFtTdGFzXQoKUmVtb3ZlICRBcGFjaGU6OlNlcnZlcjo6U3RyaWN0UGVybFNlY3Rpb25zLiBOb3csIGFsbCA8UGVybD4Kc2VjdGlvbnMgZXJyb3JzIGFyZSBmYXRhbCBieSBkZWZhdWx0IGFuZCBjYXVzZSBzZXJ2ZXIgc3RhcnR1cCB0bwphYm9ydCBvbiBlcnJvci4gW0dvemVyXQoKRml4ICgkcnwkZmlsdGVyfCRidWNrZXQpLT5yZWFkKCkgZnVuY3Rpb25zIHRvIHJ1biB0aGUgc2V0IG1hZ2ljIGxvZ2ljLAp0byBoYW5kbGUgY2FzZXMgd2hlbiBhIHBhc3NlZCBidWZmZXIgdG8gZmlsbCBpcyBub3QgYSByZWd1bGFyCnNjYWxhci4gW1N0YXNdCgpBcGFjaGU6OlNlcnZlclJlYyBhY2Nlc3NvcnMgY2hhbmdlczogW1N0YXNdCi0gcmVhZG9ubHkgYWNjZXNzb3JzOgoKICAgIHByb2Nlc3MsIG5leHQsIGlzX3ZpcnR1YWwsIG1vZHVsZV9jb25maWcsIGxvb2t1cF9kZWZhdWx0cyBhbmQKICAgIGFkZHJzCgotIHJlYWR3cml0ZSBhY2Nlc3NvcnMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRocmVhZGVkIG1wbXMsIHdoZXJlIHRoZQogIGFjY2Vzc29ycyBhcmUgd3JpdGFibGUgb25seSBiZWZvcmUgdGhlIGNoaWxkX2luaXQgcGhhc2UgKGkuZS4gYmVmb3JlCiAgdGhyZWFkcyBhcmUgc3Bhd25lZCk6CgogICAgc2VydmVyX2FkbWluLCBzZXJ2ZXJfaG9zdG5hbWUsIHBvcnQsIGVycm9yX2ZuYW1lLCBlcnJvcl9sb2csCiAgICBsb2dsZXZlbCwgdGltZW91dCwga2VlcF9hbGl2ZV90aW1lb3V0LCBrZWVwX2FsaXZlX21heCwga2VlcF9hbGl2ZSwKICAgIG5hbWVzLCB3aWxkX25hbWVzLCBsaW1pdF9yZXFfbGluZSwgbGltaXRfcmVxX2ZpZWxkc2l6ZSwKICAgIGxpbWl0X3JlcV9maWVsZHMsIGFuZCBwYXRoCgpzdXBwb3J0cyBhIG5ldyB0eXBlIG9mIHN0cnVjdCBhY2Nlc3Nvciwgd2hpY2ggaXMganVzdCBsaWtlIHJlYWQvd3JpdGUKb25lLCBidXQgZG9lc24ndCBhbGxvdyB3cml0ZSBhY2Nlc3Mgc3RhcnRpbmcgYXQgdGhlIENoaWxkSW5pdCBwaGFzZQp1bmRlciB0aHJlYWRlZCBtcG0gKHRvIGF2b2lkIHRocmVhZC1zYWZlbHkgaXNzdWVzKSBbU3Rhc10KCkluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBBcGFjaGU6OlJlcXVlc3RSZWMsIEFwYWNoZTo6U2VydmVyIGlzCm5vdyBBcGFjaGU6OlNlcnZlclJlYyBhbmQgYWxsIG1ldGhvZHMvZnVuY3Rpb25zIGZyb20gQXBhY2hlOjpTZXJ2ZXIKbm93IGxpdmUgaW4gQXBhY2hlOjpTZXJ2ZXJSZWMuIFtTdGFzXQoKVXNlIGEgY29udGV4dC1zcGVjaWZpYyBQZXJsX2xvYWRfbW9kdWxlKCkgaW5zdGVhZCBvZiBsb2FkX21vZHVsZSgpLCB0bwphdm9pZCB0aGUgcHJvYmxlbSB3aXRoICdsb2FkX21vZHVsZScgc3ltYm9sIHJlc29sdXRpb24gb24gY2VydGFpbgpwbGF0Zm9ybXMsIHdoZXJlIGZvciBzb21lIHJlYXNvbiBpdCBkb2Vzbid0IGdldCByZXNvbHZlZCBhdCBjb21waWxlCnRpbWUgdG8gUGVybF9sb2FkX21vZHVsZV9ub2NvbnRleHQgW1N0YXNdCgpNYWtlIGl0IHBvc3NpYmxlIHRvIGRpc2FibGUgbW9kX3BlcmwgZm9yIHRoZSBiYXNlIHNlcnZlciwgYnV0IGVuYWJsZQppdCBmb3IgdGhlIHZpcnR1YWwgaG9zdHMgW1N0YXNdCgpSZW1vdmVkIHRoZSBkZXByZWNhdGVkIHBhdGggYXJndW1lbnQgdG8gJHItPmFkZF9jb25maWcoKSBbR296ZXJdCgpDcmVhdGVkIGEgTUVUQS55bWwgZm9yIENQQU4gYW5kIGZyaWVuZHMsIGluY2x1ZGluZyBBcGFjaGUtVGVzdCBhcwphIHByaXZhdGUgcmVzb3VyY2UgdG8ga2VlcCBDUEFOIGZyb20gaW5zdGFsbGluZyBtb2RfcGVybCB3aGVuIGEKdXNlciBqdXN0IHdhbnRzIEFwYWNoZTo6VGVzdCBbR296ZXJdCgpNb3ZpbmcgSFRUUCBzcGVjaWZpYyBmdW5jdGlvbnMgZ2V0X3N0YXR1c19saW5lLCBtZXRob2RfcmVnaXN0ZXIgZnJvbQpBcGFjaGU6OiB0byBBcGFjaGU6OlJlcXVlc3RVdGlsOjogdG8gbWF0Y2ggdGhlaXIgY29udGFpbmVyIFtTdGFzXQoKQWRqdXN0IHRoZSBsaXN0IG9mIG1vZF9wZXJsIGhlYWRlciBmaWxlcyBpbnN0YWxsZWQgaW50byB0aGUgQXBhY2hlMgppbmNsdWRlLyBkaXJlY3RvcnksIG1hZGUgbmVjZXNzYXJ5IGZyb20gdGhlIHJlbmFtaW5nIGFuZCByZWZhY3RvcmluZwphcmlzaW5nIGZyb20gdGhlIGRlY291cGxpbmcgb2YgQVBSIGFuZCBBUFI6OiogZnJvbSBtb2RfcGVybC5zby4KQWxzbyBpbmNsdWRlIG1vZHBlcmxfYXByX3Blcmxpby5oIHVuZGVyIHhzL0FQUi9QZXJsSU8vIGluCnRoZSBsaXN0IG9mIHN1Y2ggZmlsZXMgaW5zdGFsbGVkIFtTdGFzLCBSYW5keSBLb2Jlc10KCiRyLT5yZWFkKCkvUkVBRCBub3cgdGhyb3cgZXhjZXB0aW9ucyBbU3Rhc10KCiRyLT5yZmx1c2ggbm93IHJldHVybnMgbm90aGluZyAod2FzIGFsd2F5cyByZXR1cm5pbmcgQVBSOjpTVUNDRVNTCmJlZm9yZSkgW1N0YXNdCgpidWcgcmVwb3J0cyBnZW5lcmF0aW5nIGNvZGU6IFtTdGFzXQotIGFkZCAoYXByfGFwdSktY29uZmlnIGxpbmtpbmcgaW5mbwotIHNob3cgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29uZmlnIGZpbGUgdXNlZCB0byBnZXQgdGhlIGRhdGEgZm9yIHRoZQogIHJlcG9ydAoKVGhlIEFQUiBhbmQgQVBSOjoqIGZhbWlseSBvZiBtb2R1bGVzIGNhbiBub3cgYmUgdXNlZCB3aXRob3V0IGhhdmluZwp0byBsb2FkIG1vZF9wZXJsLnNvLiBPbiAqbml4LCB0aGlzIGlzIGRvbmUgYnkgY29tcGlsaW5nIHRoZSBuZWVkZWQKZnVuY3Rpb25zIGZyb20gdGhlIGFwcHJvcHJpYXRlIHNvdXJjZXMgdXNlZCB0byBidWlsZCBtb2RfcGVybC5zbwppbnRvIEFQUi5zbywgYW5kIHRoZW4gYXJyYW5naW5nIGZvciBBUFI6OiogdG8gJ3VzZSBBUFIgKCknLiBPbiBXaW4zMiwKYSBzdGF0aWMgbGlicmFyeSBvZiBuZWVkZWQgZnVuY3Rpb25zIGlzIGJ1aWx0LCBhbmQgQVBSL0FQUjo6KiAKdGhlbiBsaW5rIGludG8gdGhpcyBsaWJyYXJ5IFtTdGFzLCBKb2UgU2NoYWVmZXIsIFJhbmR5IEtvYmVzXQoKQVBSOjpSZXF1ZXN0SU86OnNlbmRmaWxlKCkgbm93IGZsdXNoZXMgYW55IGJ1ZmZlcmVkIG91dHB1dCBiZWZvcmUKc2VuZGluZyB0aGUgZmlsZSBjb250ZW50cyBvdXQuIElmIHRoZSByZXR1cm4gc3RhdHVzIGlzIG5vdCBjaGVja2VkIGFuZAphbiBlcnJvciBoYXBwZW5zIGl0J2xsIHRocm93IGFuIGV4Y2VwdGlvbi4gRml4IG9mZnNldCBoYW5kbGluZy4gW1N0YXNdCgpSZWdpc3RyeTogcmVtb3ZlIHRoZSBtaXNsZWFkaW5nIHByZWZpeCAiJCQ6ICRjbGFzczoiIGluIHRoZSBsb2dnZWQKZXJyb3IgbWVzc2FnZSwgc2luY2Ugbm90IG9ubHkgcmVnaXN0cnkgZXJyb3JzIHdpbGwgZ2V0IGxvZ2dlZCBpZiAkQCBpcwpzZXQgW1N0YXNdCgpjaGFuZ2UgdC9SRVBPUlQgdG8gc3VnZ2VzdCB0byBwb3N0IGJ1ZyByZXBvcnRzIHRvIHRoZSBtb2RwZXJsIHVzZXJzCmxpc3QsIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbiBbU3Rhc10KCmFtZDY0IGZpeGVzICBbSm9lIFNjaGFlZmVyIDxqb2UrZ21hbmVAc3Vuc3RhcnN5cy5jb20+XQogIC0gdXNlIElWIGluc3RlYWYgb2YgaW50IHdoZXJlIGEgcG9pbnRlciBpcyB1c2VkCiAgLSBtcHhzX0FQUl9fQnVja2V0X25ldyBuZWVkcyB0byB1c2UgYXByX3NpemVfdC9vZmZfc2V0X3QgdHlwZXMKCkFQUjo6U29ja2V0OjpyZWN2KCkgbm93IHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmVhZCBkYXRhIFtTdGFzXQoKQVBSOjpCdWNrZXQncyByZWFkKCkgcmV0dXJucyAiIiBpbnN0ZWFkIG9mIHVuZGVmIHdoZW4gdGhlcmUgaXMgbm8gZGF0YQp0byByZWFkLiBbU3Rhc10KCmZpeCBhIGJ1ZyBpbiBSZWdpc3RyeSBoYW5kbGVycywgd2hlcmUgdGhlIHNhbWUgZXJyb3Igd2FzIGxvZ2dlZCB0d2ljZQphbmQgcG90ZW50aWFsbHkgYSB3cm9uZyBlcnJvciBjb2RlIHJldHVybmVkIFtTdGFzXQoKQXBhY2hlOjpSZXF1ZXN0SU86IHByaW50KCksIHByaW50ZigpLCBwdXRzKCksIHdyaXRlKCksIHJmbHVzaCgpIHRocm93CmFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlIFtTdGFzXQoKQXBhY2hlOjpTdWJSZXF1ZXN0OiBydW4oKSB0aHJvdyBhbiBleGNlcHRpb24gb24gZmFpbHVyZSBbU3Rhc10KCkFwYWNoZTo6RmlsdGVyOiBbU3Rhc10KICAtIHJlbW92ZSB1bm5lZWRlZCBtZXRob2RzOiByZW1vdmVfaW5wdXRfZmlsdGVyKCkgYW5kCiAgICByZW1vdmVfb3V0cHV0X2ZpbHRlcigpLCBmcHV0cygpCiAgLSBmcmVjKCkgYWNjZXNzb3IgaXMgbWFkZSByZWFkLW9ubHkKICAtIGZmbHVzaCgpLCBnZXRfYnJpZ2FkZSgpIGFuZCBwYXNzX2JyaWdhZGUoKSBub3cgdGhyb3cgZXhjZXB0aW9ucyBpZgogICAgY2FsbGVkIGluIHRoZSB2b2lkIGNvbnRleHQKICAtIHJlYWQsIHByaW50KCkgYW5kIHB1dHMoKSB0aHJvdyBhbiBleGNlcHRpb24gb24gZmFpbHVyZQoKQXBhY2hlOjpGaWx0ZXJSZWM6IFtTdGFzXQogIC0gcmVtb3ZlIHRoZSBuZXh0KCkgYWNjZXNzb3Igc2luY2UgaXQncyBub3QgdXNlZCBieSBBcGFjaGUgYXQgdGhlCiAgICBtb21lbnQKICAtIG5hbWUoKSBpcyBtYWRlIHJlYWQtb25seQoKQVBSOjpVUkk6IFtTdGFzXQogIC0gcmVtb3ZlZCBhY2Nlc3NvcnMKICAgIG8gaXNfaW5pdGlhbGl6ZWQoKSAoaW50ZXJuYWwgYXByX3VyaSBmbGFnKQogICAgbyAgZG5zX2xvb2tlZF91cCgpIGFuZCBkbnNfcmVzb2x2ZWQoKSAodGhleSBhcmUgbm90IAogICAgICAgdXNlZCBieSBhcGFjaGUvYXByKQogIC0gYWxsIHJlbWFpbmluZyBhY2Nlc3NvcnMgbm93IGFjY2VwdCB1bmRlZiB2YWx1ZSwgd2hpY2ggdW5zZXRzIHRoZQogICAgZmllbGQKCkV4dGVuZGVkIFdyYXBYUyBjb2RlIHRvIHN1cHBvcnQgYSBuZXcgdHlwZSBvZiBhY2Nlc3NvcjogY2hhciAqIHdoaWNoCmFjY2VwdHMgdW5kZWYgdG8gc2V0IHRoZSBDIHBvaW50ZXIgdG8gTlVMTCBhbmQgYXMgc3VjaCB1bnNldCB0aGUKbWVtYmVyIG9mIHRoZSBzdHJ1Y3QuIFtTdGFzXQoKRXhjZXB0aW9uIGVycm9yIG1lc3NhZ2VzIG5vdyBpbmNsdWRlIHRoZSBlcnJvciBpZCBhbG9uZyB3aXRoIHRoZSBlcnJvcgptZXNzYWdlIChhcyB0aGV5IGRpZCBpbiBmaXJzdCBwbGFjZSkuIFtTdGFzXQoKJHItPmZpbmZvIG5vdyBhY2NlcHRzIEFQUjo6RmluZm8gb2JqZWN0IGFzIGFuIG9wdGlvbmFsCmFyZ3VtZW50LiBbU3Rhc10KCkFQUjo6RmluZm8gW1N0YXNdCiAgLSBjaGFuZ2Ugc3RhdCgpIHRvIHJldHVybiBmaW5mbwogIC0gbWFrZSBhbGwgZmllbGQgYWNjZXNzb3JzIHJlYWRvbmx5CgpBUlA6OnBhc3N3b3JkX3ZhbGlkYXRlIGlzIG5vdyBBUlA6OlV0aWw6OnBhc3N3b3JkX3ZhbGlkYXRlIFtTdGFzXQoKQVBSOjpJcFN1Ym5ldDo6bmV3KCkgbm93IHRocm93cyBBUFI6OkVycm9yIGV4Y2VwdGlvbiAobm90IHJldHVybmluZwpyYykgW1N0YXNdCgpyZW5hbWUgcGFja2FnZSBBUFI6Ok5ldExpYiAtPiBBUFI6OklwU3VibmV0IHRvIG1hdGNoIHRoZSBjbGFzcyBuYW1lCltTdGFzXQoKQVBSOjpCdWNrZXRUeXBlOiBbU3Rhc10KICAtIG5hbWUgaXMgcmVhZG9ubHkKCkFQUjo6QnJpZ2FkZSBbU3Rhc10KICAtIGRlc3Ryb3koKSBub3cgdGhyb3dzIEFQUjo6RXJyb3IgZXhjZXB0aW9uIChub3QgcmV0dXJuaW5nIHJjKQogIC0gcmVuYW1lIGVtcHR5ID0+IGlzX2VtcHR5CiAgLSBhZGRlZCB0aGUgbWV0aG9kIGNsZWFudXAoKQogIC0gZmxhdHRlbigpIG5vdyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCAoYW5kIHBhc3NlZCB0aGUKICAgIGJ1ZmZlciBieSB0aGUgYXJndW1lbnQpIGFuZCB0aHJvd3MgQVBSOjpFcnJvciBleGNlcHRpb24KCkFQUjo6QnVja2V0OiBbU3Rhc10KICAtIHJlYWQoKSBub3cgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWFkIGRhdGEgYW5kIHRocm93cwogICAgQVBSOjpFcnJvciBleGNlcHRpb24gKG5vdCByZXR1cm5pbmcgcmMpLiBUaGUgcmV0dXJuZWQgc2NhbGFyIGlzCiAgICBub3cgVEFJTlRFRC4KICAtIHR5cGUtPm5hbWUgbm93IGhhcyBhIG1vZHVsZSBBUFI6OkJ1Y2tldFR5cGUKICAtIHR5cGUoKSwgbGVuZ3RoKCksIHN0YXJ0KCksIGRhdGEoKSBhcmUgbm93IGFsbCByZWFkb25seQogIC0gbmV3KCkgZml4IGEgYnVnIGluIG9mZnNldCBoYW5kbGluZwoKCgo9aXRlbSAxLjk5XzE0IC0gTWF5IDIxLCAyMDA0CgpBUFI6OlNvY2tBZGRyOjpwb3J0KCkgYWNjZXNzb3IgaXMgbm93IHJlYWQtb25seSBbU3Rhc10KCkFQUjo6UG9vbCBub3cgaGFzIGRlc3Ryb3koKSBhbmQgY2xlYXIoKSBhdmFpbGFibGUgW1N0YXNdCgpub3cgbG9nZ2luZyB0aGUgZXJyb3JzIGhhcHBlbmluZyBpbiBwb29sIGNsZWFudXAgY2FsbGJhY2tzIFtTdGFzXQoKdXNlIHRoZSBuZXcgQXBhY2hlLVRlc3QgYXR0cmlidXRlIC1taW5jbGllbnQgaW4gdGhlIHRlc3Qgc3VpdGVzLiBOb3cKYWxvbmcgd2l0aCB0aGUgZGVmYXVsdCBtYXhjbGllbnRzID0gbWluY2xpZW50cysxLCB3ZSBubyBsb25nZXIgc2hvdWxkCmdldCAnc2VydmVyIHJlYWNoZWQgTWF4Q2xpZW50cyBzZXR0aW5nJyBlcnJvcnMuIFtTdGFzXQoKbmV3IEFQSSBmb3IgQVBSOjpTb2NrZXQgcmVjdigpIGFuZCBzZW5kKCkgKyB1cGRhdGVkIHRlc3RzIFtTdGFzXQoKYWRkIGluZnJhc3RydWN0dXJlIGZvciBuZXcgTW9kUGVybDo6Q29uc3QgY29uc3RhbnRzIGFuZCB0aGUgZmlyc3QKY29uc3RhbnQgTW9kUGVybDo6RVhJVC4gW1N0YXNdCgpyZS1pbXBsZW1lbnQgTW9kUGVybDo6VXRpbDo6ZXhpdCB0byB1c2UgZXhjZXB0aW9uIG9iamVjdHMsIHNvIGl0J3MKcG9zc2libGUgdG8gZGV0ZWN0IGV4aXQgY2FsbGVkIGluIGV2YWwgY29udGV4dCBhbmQgY2FsbCBpdCBhZ2FpbgpvdXRzaWRlIHRoZSBldmFsIGNvbnRleHQuIFtTdGFzXQoKYWRkIHRoZSBwZXJsIGludGVyZmFjZSBmb3IgdGhlIG5ldyBleGNlcHRpb24gaGFuZGxpbmcgY29kZSAobW9kX3BlcmwsCmFwYWNoZSBhbmQgYXByIG1ldGhvZHMgd2lsbCBub3cgdGhyb3cgZXhjZXB0aW9ucyB3aXRoICRAIGJlaW5nIGFuCm9iamVjdCkuIE5ldyBjbGFzcyBBUFI6OkVycm9yIHdhcyBhZGRlZCwgdG8gaGFuZGxlIHRoZSBleGNlcHRpb24Kb2JqZWN0cyB3aXRoIG92ZXJsb2FkIG1ldGhvZHMuIEFsc28gYWRkZWQgY29uZmVzcyBhbmQgY3JvYWsKZXF1aXZhbGVudHMgb2YgQ2FycCdzIG1ldGhvZHMsIHNpbmNlIGF0IHRoZSBtb21lbnQgdGhlIENhcnAncyBvbmVzCmRvbid0IHdvcmsgYXMgaXMuIFRoZSBmb2xsb3dpbmcgcGVybCBhbmQgQyBtZXRob2RzIGhhdmUgYmVlbiByZW5hbWVkOgogIG1vZHBlcmxfYXByX3N0cmVycm9yICA9PiBtb2RwZXJsX2Vycm9yX3N0cmVycm9yIAogIEFQUjo6c3RyZXJyb3IgICAgICAgICA9PiBBUFI6OkVycm9yOjpzdHJlcnIgCltTdGFzXQoKc2V0IHRoZSAnZXJyb3Itbm90ZXMnIHRhYmxlIHRvIHRoZSBlcnJvciBtZXNzYWdlIG9uCkhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SIFtTdGFzXQoKZml4IHRoZSBhcHhzIGJ1aWxkIGZ1bmN0aW9uIHRvIG5vdCBoYW5kbGUgZW1wdHkgbG9va3VwcyBhcyBlcnJvcnMKW1JhbmR5IEtvYmVzLCBTdGV2ZSBIYXldCgpmaXggdHlwZSBjYXN0aW5nIHByb2JsZW1zIGluIHRoZSBpbyBmdW5jdGlvbnMgW1N0YXNdCgphZGQgc3VwcG9ydCBmb3IgbGliZ3RvcCAyLjUuMCsgKG1haW50ZW5hbmNlIG1vZGUpIFtTdGFzXQoKQVBSOjpTb2NrZXQ6OnRpbWVvdXRfc2V0IG5vdyBjcm9ha3Mgb24gZmFpbHVyZSBbU3Rhc10KCnNpZ25pZmljYW50bHkgc3BlZWR1cCB0aGUgc3RhcnR1cCBvZiB0aHJlYWRlZCBtcG0gdGVzdCBzdWl0ZSwgYnkKY29uZmlndXJpbmcgb25seSB0aGUgbWluaW1hbCBudW1iZXIgb2YgcGVybCBpbnRlcnByZXRlcnMgdG8gc3RhcnQKW1N0YXNdCgptYWtlIEFQUjo6U29ja2V0OjpvcHRfKHNldHxnZXQpIHdvcmtpbmcgKGFuZCBjaGFuZ2UgdGhlIHByZXZpb3VzCmJlaGF2aW9yKSBbU3Rhc10KCm1ha2Ugc3VyZSB0aGF0IG91ciBwcm90b2NvbCBtb2R1bGUgdGVzdHMgdGhhdCBpbnRlcmFjdCB3aXRoIHRoZSBzb2NrZXQKdXNlIGEgYmxvY2tpbmcgcmVhZCBbSm9lIE9ydG9uXQoKVXNlIGEgYmV0dGVyIGFwcHJvYWNoIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBuZWVkIHRvIHN0cmlwIHBlcmwncwpMYXJnZUZpbGVzU291cmNlIGZsYWcsIGJ5IGNoZWNraW5nIHdoZXRoZXIgbGliYXByIHdhcyBjb21waWxlZCB3aXRoCi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgb3Igbm90LiBDaGVja2luZyBmb3IgQVBSX0hBU19MQVJHRV9GSUxFUyBpcwp1c2VsZXNzIHNpbmNlIGl0IGRvZXNuJ3QgdGVsbCB3aGV0aGVyIDMyIHZzIDY0IGJpdHMgb2ZmX3QgYW5kIHNpbWlsYXIKdHlwZXMgYXJlIHVzZWQgW0pvZSBPcnRvbl0KCidTZXRIYW5kbGVyIHBlcmwtc2NyaXB0JyBubyBsb25nZXIgZ3JhYnMgYW55IG5ld2x5IGVuY291bnRlcmVkIEVORApibG9ja3MsIGFuZCByZW1vdmVzIHRoZW0gZnJvbSBQTF9lbmRhdiwgYnV0IG9ubHkgaWYgdGhleSBhcmUKZXhwbGljaXRseSByZWdpc3RlcmVkIHZpYSBNb2RQZXJsOjpHbG9iYWw6OnNwZWNpYWxfbGlzdF9yZWdpc3RlcihFTkQKPT4gJHBhY2thZ2VfbmFtZSkgKHRoaXMgaXMgYSBuZXcgZnVuY3Rpb24pLiBJdCdzIG5vdyBwb3NzaWJsZSB0byBoYXZlCmEgY29tcGxldGUgY29udHJvbCBvZiB3aGVuIEVORCBibG9ja3MgYXJlIHJ1biBmcm9tIHRoZSB1c2VyIHNwYWNlLCBub3QKb25seSBpbiB0aGUgcmVnaXN0cnkgaGFuZGxlcnMgW1N0YXNdCgpFTkQgYmxvY2tzIGVuY291bnRlcmVkIGJ5IGNoaWxkIHByb2Nlc3NlcyBhbmQgbm90IGhpamFja2VkIGJ5Ck1vZFBlcmw6Okdsb2JhbDo6c3BlY2lhbF9saXN0X3JlZ2lzdGVyKCkgYXJlIG5vdyBleGVjdXRlZCBhdCB0aGUKc2VydmVyIHNodXRkb3duIChwcmV2aW91c2x5IHRoZXkgd2VyZW4ndCBleGVjdXRlZCBhdCBhbGwpLiBbU3Rhc10KCkFkZGVkIHRlc3QgdG8gZW5zdXJlIDxQZXJsPiBzZWN0aW9ucyBjYW4gaGF2ZSB0aGluZ3MgbGlrZSAlTG9jYXRpb24KdGllZCBbR296ZXJdCgpGaXggdGhlIGluc3RhbGxhdGlvbiBvbiBXaW4zMiBzbyB0aGF0IGFuIGFwcHJvcHJpYXRlIEFwYWNoZTIKc3ViZGlyZWN0b3J5IHVuZGVyIHRoZSBQZXJsIHRyZWUgaXMgdXNlZCB3aGVuIE1QX0lOU1RfQVBBQ0hFMiBpcwpzcGVjaWZpZWQgW1JhbmR5IEtvYmVzXQoKRml4IGEgcmVkZWZpbmVkIHdhcm5pbmcgaW4gQXBhY2hlOjpTdGF0dXMgW1N0YXNdCgpGaXggQXBhY2hlOjpTdGF0dXMsIHRvIGxvb2t1cCB0aGUgQXBhY2hlOjpSZXF1ZXN0IHZlcnNpb24gd2l0aG91dApsb2FkaW5nIGl0LiBPbmx5IGlmIGEgc3VpdGFibGUgKDIueCkgdmVyc2lvbiBpcyBmb3VuZCAtLSBsb2FkIGFuZCB1c2UKaXQuIFByZXZpb3VzbHkgbG9hZGluZyB0aGUgMS54IHZlcnNpb24gd2FzIGFmZmVjdGluZyBBcGFjaGU6OmNvbXBhdC4KW1N0YXNdCgpGaXggYSBidWcgaW4gc3BlY2lhbCBibG9ja3MgaGFuZGxpbmcgKGxpa2UgRU5EKSwgd2hpY2ggdW50aWwgbm93IHdhcwpkcm9wcGluZyBvbiB0aGUgZmxvb3IgYWxsIGJsb2NrcyBidXQgdGhlIGxhc3Qgb25lIChtYWlubHkgYWZmZWN0aW5nCnJlZ2lzdHJ5IGhhbmRsZXJzKS4gW1N0YXNdCgpUaGUgZmlsdGVyIHN0cmVhbWluZyBBUEkgcHJpbnQoKSBmdW5jdGlvbiwgbm93IGNvcnJlY3RseSBoYW5kbGVzIGEKYmluYXJ5IGRhdGEgW1N0YXNdCgpGaXggUmVnaXN0cnkgaGFuZGxlcnMsIG5vdCB0byBsb3NlIHRoZSBleGVjdXRpb24gZXJyb3JzLCB3aGVuIHRoZXkKaW5jbHVkZSBFTkQgYmxvY2tzIFtTdGFzXQoKCgo9aXRlbSAxLjk5XzEzIC0gTWFyY2ggOCwgMjAwNAoKcmVzcGVjdCAkRU5We0FQQUNIRV9URVNUX1NUQVJUVVBfVElNRU9VVH0gc2V0dGluZ3MgaWYgYW55IFtTdGFzXQoKQWRkZWQgdGVzdHMgZm9yIGlzc3Vpbmcgc3VicmVxdWVzdHMgZnJvbSBmaWx0ZXJzIFtHZW9mZnJleSBZb3VuZ10KClVwZGF0ZWQgdG8gdGhlIG5ldyBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCBbR296ZXJdCgpEcm9wIHRoZSBzdXBwb3J0IGZvciBtYWtpbmcgR0FURVdBWV9JTlRFUkZBQ0Ugc3BlY2lhbC4gSXQncyBub3QgbmVlZGVkCmFzICRFTlZ7TU9EX1BFUkx9LCBhdmFpbGFibGUgaW4gYm90aCBtb2RfcGVybCBnZW5lcmF0aW9ucywgc2hvdWxkIGJlCnVzZWQgdG8gdGVzdCB3aGV0aGVyIHRoZSBjb2RlIGlzIHJ1bm5pbmcgdW5kZXIgbW9kX3BlcmwuIFtTdGFzXQoKSGFuZGxlIGNvcnJlY3RseSB0aGUgc2l0dWF0aW9uIHdoZW4gcmVzcG9uc2UgSFRUUCBoZWFkZXJzIGFyZSBwcmludGVkCmZyb20gdGhlIGhhbmRsZXIgYW5kIHRoZSByZXNwb25zZSBib2R5IHN0YXJ0cyB3aXRoIFwwMDAsIHdoaWNoIGlzIHRoZQpjYXNlIHdpdGggc29tZSBpbWFnZXMgbGlrZSAuaWNvLiBbU3Rhc10KCkFwYWNoZTo6UGVybFNlY3Rpb25zLT5kdW1wKCkgYW5kIHN0b3JlKGZpbGVuYW1lKSBbR296ZXJdCgpleHBvc2UgJGMtPmtlZXBhbGl2ZSByZWxhdGVkIGNvbnN0YW50cyBhbmQgJGMtPmtlZXBhbGl2ZXMgY291bnRlcgpbU3Rhc10KClBlcmwgaGFuZGxlcnMgYXJlIG5vdyBndWFyYW50ZWVkIHRvIHJ1biBiZWZvcmUgY29yZSBDIGhhbmRsZXJzIGZvcgphbGwgcmVxdWVzdCBwaGFzZXMuICBbR2VvZmZyZXkgWW91bmddCgpGaXggdGhlIFNURElOL09VVCBvdmVycmlkaW5nIHByb2Nlc3MgdG8gaGFuZGxlIGdyYWNlZnVsbHkgY2FzZXMsIHdoZW4KZWl0aGVyIG9yIGJvdGggYXJlIGNsb3NlZC9ib2d1cyAodGhlIHByb2JsZW0gd2FzIG9ubHkgd2l0aCB1c2VwZXJsaW8KZW5hYmxlZCBwZXJsKSBbU3Rhc10KCmNvcHkgYXByX3RhYmxlX2NvbXByZXNzIGxvZ2ljIGZyb20gbGF0ZXIgaHR0cGQgdmVyc2lvbnMgaW4gY2FzZSBtb2RfcGVybAppcyBidWlsdCBhZ2FpbnN0IDIuMC40NiwgYXMgbW9kX3Blcmwgbm93IHJlcXVpcmVzIGl0IGludGVybmFsbHkuICB1c2VycwpzaG91bGQgYmUgYXdhcmUgdGhhdCAyLjAuNDcgbWF5IGJlY29tZSB0aGUgb2xkZXN0IHN1cHBvcnRlZCBodHRwZCB2ZXJzaW9uIAppbiB0aGUgbmVhciBmdXR1cmUuICBbR2VvZmZyZXkgWW91bmddCgpGaXggdGhlIGNvcnJ1cHRpb24gb2YgdGhlIGh0dHBkIHByb2Nlc3MgYXJndlswXSwgY2F1c2VkIGJ5ICQwCm1hbmlwdWxhdGluZyBbU3Rhc10KCk1vZFBlcmw6Ok1ldGhvZExvb2t1cDo6bG9va3VwX21ldGhvZCBub3cgaGFuZGxlcyBzdWItY2xhc3NlZCBvYmplY3RzCltTdGFzXQoKc3RhbmRhcmQgJUVOViBwb3B1bGF0aW9uIHdpdGggQ0dJIHZhcmlhYmxlcyBhbmQgY29udGVudHMgb2YgdGhlCnN1YnByb2Nlc3NfZW52IHRhYmxlIChzdWNoIGFzIFNldEVudiBhbmQgUGFzc0VudikgaGFzIGJlZW4gZGVsYXllZAp1bnRpbCB0aGUgbGFzdCBwb3NzaWJsZSBtb21lbnQgYmVmb3JlIGNvbnRlbnQtZ2VuZXJhdGlvbiBydW5zLgpQZXJsU2V0RW52IGFuZCBQZXJsUGFzc0VudiBhcmUgZWFjaCBhbiBleGNlcHRpb24gdG8gdGhpcyBhbmQgYXJlCnBsYWNlZCBpbiBib3RoICVFTlYgYW5kIHRoZSBzdWJwcm9jZXNzX2VudiB0YWJsZSBpbW1lZGlhdGVseSwKcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBbKy1dU2V0dXBFbnYgc2V0dGluZy4KW0dlb2ZmcmV5IFlvdW5nXQoKZml4IFBlcmxBZGRWYXIgY29uZmlndXJhdGlvbiBtZXJnaW5nIFtHZW9mZnJleSBZb3VuZ10KCkFub255bW91cyBzdWJzIGFyZSBub3cgc3VwcG9ydGVkIGluIHB1c2hfaGFuZGxlcnMsIHNldF9oYW5kbGVycywKYWRkX2lucHV0X2ZpbHRlciwgZXRjLiBBIGZhc3QgY2FjaGVkIGN2IGlzIHVzZWQgd2l0aCBub24taXRocmVhZGVkCnBlcmwuIEEgc2xvd2VyIGRlcGFyc2UvZXZhbCBhcHByb2FjaCAodmlhIEI6OkRlcGFyc2UpIGlzIHVzZWQgd2l0aAppdGhyZWFkcyBlbmFibGVkIHBlcmxzLiBGdXJ0aGVyIG9wdGltaXphdGlvbnMgYXJlIHBsYW5uZWQgZm9yIHRoZQpsYXR0ZXIgY2FzZS4gW1N0YXNdCgpodF90aW1lIHcvbyB0aGUgcG9vbCBpcyBub3cgYXZhaWxhYmxlIG9ubHkgdmlhIG92ZXJyaWRlL3Jlc3RvcmUgY29tcGF0CkFQSS4gZm9ybWF0X3RpbWUsIGhhcyBiZWVuIHJlbmFtZWQgYmFjayB0byBodF90aW1lLCBhbmQgdGhlIGRlZmF1bHQKdmFsdWVzIGZvciBmbXQsIHRpbWUgYW5kIGdtdCBhcmUgbm93IHN1cHBvcnRlZC4gW1N0YXNdCgppdCdzIG5vdyBwb3NzaWJsZSB0byBwdXNoIG5ldyBoYW5kbGVycyBpbnRvIHRoZSBzYW1lIHBoYXNlIHRoYXQgaXMKcnVubmluZyBhdCB0aGUgbW9tZW50IFtTdGFzXS4KCndoZW4gJHItPmhhbmRsZXIoJG5ld19oYW5kbGVyKSBpcyBjYWxsZWQgZnJvbSBhIHJlc3BvbnNlIHBoYXNlLCBpdCBub3cKY2hlY2tzIHRoYXQgdGhlIHJlc3BvbnNlIGhhbmRsZXIgdHlwZSBpcyBub3Qgc3dpdGNoZWQgKGUuZy4gZnJvbQonbW9kcGVybCcgdG8gJ3Blcmwtc2NyaXB0JykgZnJvbSB0aGUgY3VycmVudGx5IHVzZWQgb25lIFtTdGFzXQoKU2luY2UgQXBhY2hlOjpTdWJQcm9jZXNzIGlzIG5vdyBwYXJ0IG9mIHRoZSBtcDIgQVBJLCBhZGQKJHItPmNsZWFudXBfZm9yX2V4ZWMgYXMgYSBub29wIGluIEFwYWNoZTo6Y29tcGF0LiBUaGF0IGZ1bmN0aW9uIGlzIG5vCmxvbmdlciBuZWVkZWQgaW4gQXBhY2hlMi4gW1N0YXNdCgpXaGVuICdwZXJsIE1ha2VmaWxlLlBMIFBSRUZJWD0vZm9vL2JhcicgaXMgdXNlZCBhbmQgbW9kX3BlcmwgMSBpcwpmb3VuZCwgYnV0IGF0IGRpZmZlcmVudCBwcmVmaXggbm8gbG9uZ2VyIHJlcXVpcmUKTVBfSU5TVF9BUEFDSEUyPTEuIFtTdGFzXQoKbW9kcGVybF9tZ3ZfcmVzb2x2ZSBub3cgY3JvYWtzIHdoZW4gYSBtb2R1bGUgc2NoZWR1bGVkIGZvciBhdXRvbG9hZGluZwpmYWlscyB0byBsb2FkLiAgQXV0b0xvYWRlZCBtb2R1bGVzIHNob3VsZG4ndCBzaWxlbnRseSBmYWlsLiBbU3Rhc10KClBlcmwoSW5wdXR8T3V0cHV0KUZpbHRlckhhbmRsZXIgaGFuZGxlcnMgYXJlIG5vdyBhbHdheXMgQXV0b0xvYWRlZCwgYXMKaWYgJysnIHByZWZpeCB3YXMgdXNlZC4gVGhpcyBtdXN0IGJlIHBlcmZvcm1lZCB0byBnZXQgdGhlIGFjY2VzcyB0bwpmaWx0ZXIgYXR0cmlidXRlcyBsb25nIGJlZm9yZSB0aGUgZmlsdGVyIGl0c2VsZiBpcyBleGVjdXRlZC4gW1N0YXNdCgpBUFIvUG9vbC54cyBoYXMgYmVlbiByZWltcGxlbWVudGVkLiAgVGhlIHByb2JsZW0gd2l0aCB0aGUgcHJldmlvdXMKaW1wbGVtZW50YXRpb24gaXMgdGhhdCBhIGRlYWQgcGVybCBwb29sIG9iamVjdCBjb3VsZCBoaWphY2sgYSBuZXdseQpjcmVhdGVkIHBvb2wsIHdoaWNoIGRpZG4ndCBiZWxvbmcgdG8gdGhhdCBvYmplY3QsIGJ1dCB3aGljaCBoYXBwZW5lZAp0byBiZSBhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9uLiBUaGUgcHJvYmxlbSBpcyB0aGF0CmFwcl9wb29sX3VzZXJfZGF0YV9zZXQvZ2V0IGhhcyBubyBtZWNoYW5pc20gdG8gY2hlY2sgd2hldGhlciB0aGUgcG9vbApoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBhc3NpZ25lZCB0byAoaXQgZG9lcyBidXQgb25seSBpbiB0aGUKZGVidWcgbW9kZSkuIEl0IHJlYWxseSBuZWVkcyBzb21lIHNpZ25hdHVyZSBtZWNoYW5pc20gd2hpY2ggY2FuIGJlCnZlcmlmaWVkIHRoYXQgdGhlIHBvb2wgaXMgc3RpbGwgdGhlIHNhbWUgcG9vbC4gU2luY2UgYXByX3Bvb2wgZG9lc24ndApoYXZlIHRoaXMgZmVhdHVyZSwgdGhlIHJlZmVyZW5jZSBjb3VudGluZyBoYXMgYmVlbiByZWltcGxlbWVudGVkIHVzaW5nCmEgcGxhaW4gc3YgcmVmZXJlbmNlLiBTZXZlcmFsIG5ldyAobWFpbmx5IGhpamFja2luZykgdGVzdHMgd2hpY2ggYmFkbHkKZmFpbCB3aXRoIHRoZSBwcmV2aW91cyBpbXBlbGVtZW50YXRpb24gaGF2ZSBiZWVuIGFkZGVkLiBbU3Rhc10KCmZpeCBjYWxsaW5nICRyLT5zdWJwcm9jZXNzX2VudigpIGluIGEgdm9pZCBjb250ZXh0IHNvIHRoYXQgaXQgb25seQpwb3B1bGF0ZXMgJUVOViBpZiBhbHNvIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cy4gIGFsc28sIG1ha2Ugc3VyZSBpdApjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGFuZCBzdGlsbCBwb3B1bGF0ZSAlRU5WLgpbR2VvZmZyZXkgWW91bmddCgphZGQgQVBSOjpCcmlnYWRlOjpwb29sKCkgdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSBwb29sIGFzc29jaWF0ZWQgd2l0aAp0aGUgYnJpZ2FkZSAgW0dlb2ZmcmV5IFlvdW5nXQoKbWFrZSAndC9URVNUIC1zdGFydHVwX3RpbWVvdXQgc2Vjcycgd29ya2luZyAocHJldmlvdXNseSB1c2VyJ3MgdmFsdWUKd2FzIGlnbm9yZWQpIFtTdGFzXQoKTW9kUGVybDo6UmVnaXN0cnkgYW5kIGZyaWVuZHMgbm93IHN1cHBvcnQgbm9uLXBhcnNlZCBoZWFkZXJzIHNjcmlwdHMsCndob3NlIGZpbGVuYW1lID1+IC9ebnBoLS8sIGlkZW50aWNhbGx5IHRvIG1vZF9jZ2kuICsgdGVzdCBbU3Rhc10KCmltcGxlbWVudCBBUFI6OkJyaWdhZGU6Omxlbmd0aCgpIGFuZCBBUFI6OkJyaWdhZGU6OmZsYXR0ZW4oKSAodGhlCmxhdHRlciBpbXBsZW1lbnRzIGEgd3JhcHBlciBmb3IgYXByX2JyaWdhZGVfZmxhdHRlbiwgYnV0IGFsc28gaW5jbHVkZXMKYW4gZW11bGF0aW9uIG9mIGFwcl9icmlnYWRlX3BmbGF0dGVuKSBhcyBbR2VvZmZyZXkgWW91bmddCgooJHJ8JHMpLT5hZGRfY29uZmlnKCkgbm93IGRpZSBpZiBmYWlsZWQgKHByZXZpb3VzbHkgcmV0dXJuZWQgdGhlCmVycm9yKSBbU3Rhc10KCmZpeCBjb250ZXh0IHByb2JsZW1zIGluIDxwZXJsPiBzZWN0aW9ucyBhbmQKUGVybE1vZHVsZS9QZXJsTG9hZE1vZHVsZS9QZXJsUmVxdXJlIHVuZGVyIHRocmVhZGVkIG1wbXMgdy8KUGVybE9wdGlvbnMgK1BhcmVudC8rQ2xvbmUgaW4gVmhvc3RzICsgVGVzdFZob3N0Ojpjb25maWcgdGVzdC4gW1N0YXNdCgpJbXBsZW1lbnRlZCBBcGFjaGU6OmdldF9zZXJ2ZXJfdmVyc2lvbiBhbmQgQXBhY2hlOjpnZXRfc2VydmVyX2J1aWx0CmFzIGNvbnN0YW50IHN1YnJvdXRpbmVzIFtHZW9mZnJleSBZb3VuZ10KCk1vdmVkIHNvbWUgZnVuY3Rpb25zIG91dCBvZiB0aGUgQXBhY2hlOjogbmFtZXNwYWNlOgogIEFwYWNoZTo6dW5lc2NhcGVfdXJsKCkgICAgICAgaXMgbm93IEFwYWNoZTo6VVJJOjp1bmVzY2FwZV91cmwoKQogIEFwYWNoZTo6bG9nX3BpZCgpICAgICAgICAgICAgaXMgbm93IEFwYWNoZTo6TG9nOjpsb2dfcGlkKCkKICBBcGFjaGU6OkxPR19NQVJLKCkgICAgICAgICAgIGlzIG5vdyBBcGFjaGU6OkxvZzo6TE9HX01BUksoKQpbR2VvZmZyZXkgWW91bmddCgppZiBNUF9BUF9QUkVGSVggaXMgdXNlZCBhcHhzIGFuZCBhcHItY29uZmlnIGZyb20gdGhlIGFwYWNoZSBidWlsZCB0cmVlCndvbid0IHdvcmssIHNvIGl0IGNhbid0IGNvLWV4aXN0IHdpdGggTVBfQVBYUyBhbmQgTVBfQVBSX0NPTkZJRyBidWlsZApvcHRpb25zIC0gZW5zdXJlIHRoYXQgdGhpcyBkb2Vzbid0IGhhcHBlbi4gW1N0YXNdCgpzZXJ2ZXJfcm9vdF9yZWxhdGl2ZSgpIG5vdyByZXF1aXJlcyBlaXRoZXIgYSB2YWxpZCBwb29sIG9yIGFuICRyLCAkcywKb3IgJGMgb2JqZWN0IGFzIGEgZmlyc3QgYXJndW1lbnQuICBhbHNvLCB0aGUgcmV0dXJuZWQgcmVzdWx0IGlzIGEKY29weSwgcHJvdGVjdGluZyBhZ2FpbnN0IGNhc2VzIHdoZXJlIHRoZSBwb29sIHdvdWxkIGdvIG91dCBvZiBzY29wZQpiZWZvcmUgdGhlIHJlc3VsdC4gIFtHZW9mZnJleSBZb3VuZ10KCkNoZWNrIHRoZSBzdWNjZXNzIG9mIHN5c29wZW4gaW4gdG1wZmlsZSgpIGluIGNvbXBhdCBbR2VvZmZyZXkgWW91bmddCgptYWtlIHN1cmUgRHluYUxvYWRlciBpcyBsb2FkZWQgYmVmb3JlIFhTTG9hZGVyLCBub3Qgb25seSB3aXRoIHBlcmwKNS42LjEsIGJ1dCBhbHdheXMgYmVjYXVzZSBvZiB0aGUgaXNzdWVzIHdpdGggPFBlcmw+IHNlY3Rpb25zIGFyZQpsb2FkZWQgZnJvbSArUGFyZW50IHZob3N0IFtTdGFzXQoKYWRkZWQgKCRyfCRzKS0+aXNfcGVybF9vcHRpb25fZW5hYmxlZCgkb3B0aW9uX25hbWUpLCB0byB0ZXN0IGZvcgpQZXJsT3B0aW9ucyArIHRlc3RzIFtTdGFzXQoKT24gU29sYXJpcyBhZGQgYSB3b3JrYXJvdW5kIGZvciB4cy9BUFIvQVBSL01ha2VmaWxlLlBMIHRvIGJ1aWxkCkFQUi5zbywgY29ycmVjdGx5IGxpbmtlZCBhZ2FpbnN0IGFwciBhbmQgYXByLXV0aWwgbGlicywgYnkgYWRkZGluZyB0aGUKbWlzc2luZyAtUiBwYXRocyBjb3JyZXNwb25kaW5nIHRvIC1MIGZsYWdzLiBFVTo6TU0gd2FzIGFkZGluZyB0aGVtIHZpYQpMRF9SVU5fUEFUSCBpbnN0ZWFkIG9mIHVzaW5nIC1SLCBidXQgc2luY2UgcGVybCdzIGxkZGZsYWdzIG1heSBoYXZlIC1SCml0IG92ZXJyaWRlcyBMRF9SVU5fUEFUSC4gU28gZXhwbGljaXRseSBhZGQgYW55dGhpbmcgdGhhdCBtYXkgZ28gaW50bwpMRF9SVU5fUEFUSCB2aWEgLVIuIEFsc28gbWFrZSBzdXJlIHRoYXQgLVIgY29taW5nIGZyb20gQXBhY2hlIHdpbGwKYXBwZWFyIGZpcnN0LiBbQnJhZCBMYW5hbSA8YmxsQGdlbnRvby5jb20+XQoKJ21ha2UgZGlzdCcgbm93IGdlbmVyYXRlcyBhbmQgcGlja3MgQXBhY2hlLVRlc3QvTUVUQS55bWwgd2hpY2ggd2FzCmFsd2F5cyByZXBvcnRlZCBtaXNzaW5nLCBhcyBpdCB3YXMgaW5jbHVkZWQgaW4gQXBhY2hlLVRlc3QvTUFOSUZFU1QKW1N0YXNdCgpmaXggdGhlICRyLT5yZWFkIGZ1bmN0aW9uIHRvIHJldHVybiB1bmRlZiBvbiBmYWlsdXJlIHNpbWlsYXIgdG8gdGhlCmNvcmUgcGVybCBmdW5jdGlvbiBhbmQgbWFrZSAkISBhdmFpbGFibGUgZm9yIHRob3NlIHdobyB0ZXN0IGZvciByZWFkKCkKZmFpbHVyZXMuIFtTdGFzXQoKTWFrZSBzdXJlIHRoYXQgcG5vdGVzIGFyZSBkZXN0cm95ZWQgYWZ0ZXIgUGVybENsZWFudXAgaGFuZGxlcnMgYXJlCmZpbmlzaGVkIGFuZCBub3QgYmVmb3JlICsgdGVzdC4gW1N0YXNdCgoKCj1pdGVtIDEuOTlfMTIgLSBEZWNlbWJlciAyMiwgMjAwMwoKUmVzdG9yZSBhIHByb3BlciBiZWhhdmlvciBvZiBhbGwgUmVnaXN0cnkgaGFuZGxlcnMsIGJ1dCBQZXJsUnVuLCBub3QKdG8gcmVzZXQgJUlOQyB0byBmb3JnZXQgYW55IC5wbCBmaWxlcyByZXF1aXJlZCBkdXJpbmcgdGhlIHNjcmlwdCdzCmV4ZWN1dGlvbi4gW1N0YXNdCgo8UGVybD4gYXJlIG5vdyBldmFsdWF0aW5nIGNvZGUgaW50byBvbmUgZGlzdGluY3QgbmFtZXNwYWNlIHBlcgpjb250YWluZXIsIHNpbWlsYXIgdG8gTW9kUGVybDo6UmVnaXN0cnkgc2NyaXB0cy4gW1BoaWxpcHBlIE0uIENoaWFzc29uXQoKRml4IE1vZFBlcmw6Ok1NOjpXcml0ZU1ha2VmaWxlIHRvIHVzZSB0aGUgTU9EUEVSTF9DQ09QVFMgZW50cnkgZnJvbQpBcGFjaGU6OkJ1aWxkQ29uZmlnLCBhcyBpdCBjb250YWlucyBzb21lIGZsYWdzIGFkZGVkIGJ5IG1vZF9wZXJsLAp3aGljaCBhcmVuJ3QgaW4gcGVybF9jY29wdHMgYW5kIGFwX2Njb3B0cy4gW1N0YXNdCgpBZGQgdGhlIGltcGxlbWVudGF0aW9uIG9mIEFwYWNoZTo6Q29ubmVjdGlvbjo6bG9jYWxfYWRkciBhbmQKQXBhY2hlOjpDb25uZWN0aW9uOjpyZW1vdGVfYWRkciB0byB0aGUgQXBhY2hlOjpjb21wYXQgb3ZlcnJpZGFibGUKZnVuY3Rpb25zLiBbU3Rhc10KCkFwYWNoZTo6Y29tcGF0J3MgaW1wbGVtZW50YXRpb24gb2YgQVBSOjpVUkk6OnVucGFyc2UsCkFwYWNoZTo6UmVxdWVzdFJlYzo6ZmluZm8gYW5kIEFwYWNoZTo6UmVxdWVzdFJlYzo6bm90ZXMgaXMgbm93Cm92ZXJyaWRhYmxlIGFuZCBub3QgZW5hYmxlZCBieSBkZWZhdWx0LiBbU3Rhc10KCkFwYWNoZTo6Y29tcGF0IG5vIGxvbmdlciBlbmFibGVzIGZ1bmN0aW9ucyB3aGljaCBjb2xsaWRlIHdpdGggbXAyIEFQSQpieSBkZWZhdWx0LiBJdCBwcm92aWRlcyB0d28gbmV3IGZ1bmN0aW9uczogb3ZlcnJpZGVfbXAyX2FwaSBhbmQKcmVzdG9yZV9tcDJfYXBpIHRvIG92ZXJyaWRlIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBtcDIgQVBJLiBbU3Rhc10KCkZvciBXaW4zMiwgYWRkIGEgLmJhdCBleHRlbnNpb24gdG8gY2FuZGlkYXRlcyBmb3IgdGhlIGFweHMgYW5kCmFwci1jb25maWcgdXRpbGl0aWVzIHVzZWQgaW4gQXBhY2hlOjpCdWlsZCwgc28gdGhhdCB0aGUgLXggZmlsZQp0ZXN0IGNhbiBwb3RlbnRpYWxseSBzdWNjZWVkIFtSYW5keSBLb2Jlc10KClBsdWcgYSBtZW1vcnkgbGVhayB3aXRoICdwZXJsLXNjcmlwdCcgbm90IGNsZWFuaW5nIHVwIHRoZSB0ZW1wIHZhcnMKY3JlYXRlZCBkdXJpbmcgdGhlIG92ZXJyaWRlIG9mIFNURElOL1NURE9VVCB0byB1c2UgdGhlIDpBcGFjaGUgSU8KbGF5ZXIgW1N0YXNdCgpsaWJndG9wIGNvbmZpZyAobmVlZGVkIGZvciBlbmFibGluZyBNT0RfUEVSTF9UUkFDRT1tKSBpcyBub3cgc2VhcmNoZWQKdXNpbmcgdGhlIGdub21lIHBhY2thZ2luZyB0b29scyBpZiBhdmFpbGFibGUgKHBrZy1jb25maWcgZm9yIGdub21lLTIueAphbmQgZ25vbWUtY29uZmlnIGZvciBnbm9tZS0xLngpIFtTdGFzXQoKUHJldmVudCBhIHByb2JsZW0gd2hlcmUgYW4gYXV0b3ZpdmlmaWVkIHBhY2thZ2UgKHN0YXNoKSBwcmV2ZW50cyBmcm9tCm1vZHBlcmxfbWd2IHRvIGxvYWQgdGhlIGZpbGUgd2l0aCB0aGF0IHBhY2thZ2UgKHVudGlsIG5vdyBpdCB3YXMKY2hlY2tpbmcgd2hldGhlciB0aGUgc3Rhc2ggZXhpc3RlZCBhbHJlYWR5IGFuZCBza2lwcGVkIHRoZSBsb2FkaW5nIGlmCnRoYXQgd2FzIHRoZSBjYXNlKS4gTm93IGNoZWNraW5nICVJTkMgYW5kIGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUKbW9kdWxlLiBSZXBvcnRpbmcgdGhlIGZhaWx1cmUgb25seSBpZiB0aGUgbW9kdWxlIGhhcyBmYWlsZWQgdG8gbG9hZAphbmQgdGhlIHN0YXNoIGlzIG5vdCBkZWZpbmVkIChzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gYXV0b3ZpdmlmeQpwYWNrYWdlcyB3aXRob3V0IGxvYWRpbmcgdGhlbSBmcm9tIGFuIGV4dGVybmFsIGZpbGUpLiBbU3Rhc10KCk1heENsaWVudHMgaXMgbm93IG92ZXJyaWRhYmxlIGZyb20gdGhlIHQvVEVTVCAtbWF4Y2xpZW50cyBjb21tYW5kIGxpbmUKb3B0aW9uIChpdCB3YXMgaGFyZGNvZGVkIGJlZm9yZSkuIFtTdGFzXQoKUG9zdHBvbmUgdGhlIGFsbG9jYXRpb24gb2YgdGhlIHdidWNrZXQgaW4gZmlsdGVycyB0aWxsIHRoZSBtb21lbnQgaXQncwpuZWVkZWQgKGlmIGF0IGFsbCkuIFNpbmNlIG5vbi1zdHJlYW1pbmcgZmlsdGVycyBhcmVuJ3QgZ29pbmcgdG8gdXNlCnRoYXQgYnVmZmVyLCBpdCdzIGEgd2FzdGUgdG8gYWxsb2NhdGUvZnJlZSBpdC4gW1N0YXNdCgpFeHRlbmQgdGhlIGF1dG9nZW5lcmF0ZWQgYnVnIHJlcG9ydCB0byBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0Cmluc3RhbGxlZCBtb2R1bGVzIG9mIHNwZWNpYWwgaW50ZXJlc3QgKHdoaWNoIG1heSBhaWQgaW4gdW5kZXJzdGFuZGluZwp0aGUgYnVnIHJlcG9ydCksIHN1Y2ggYXMgQ0dJLnBtLCBBcGFjaGU6OlJlcXVlc3QsIExXUCwgZXRjLiBbU3Rhc10KCkFzIHRoZSB0ZXN0IHN1aXRlIGtlZXBzIG9uIGdyb3dpbmcsIGl0IHRha2VzIGxvbmdlciB0aW1lIHRvCnN0YXJ0dXAuIENoYW5nZSB0aGUgbWFpbiB0ZXN0IHN1aXRlIHRpbWVvdXQgdG8gMTgwIHNlY3MgZm9yIHRocmVhZGVkCm1wbXMgYW5kIDEyMCBzZWNzIGZvciBub24tdGhyZWFkZWQgb25lcy4gW1N0YXNdCgp1c2UgcGxhaW4gbWFsbG9jL2ZyZWUgdG8gYWxsb2NhdGUgZmlsdGVyIHN0cnVjdHMsIHNpbmNlIHRoZXkgY291bGQgYmUKaW52b2tlZCBodW5kcmVkcyBvZiB0aW1lcyBkdXJpbmcgYSBzaW5nbGUgcmVxdWVzdCwgY2F1c2luZyBodWdlIG1lbW9yeQpkZW1hbmRzIGlmIHRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wsIHdoaWNoIGdldHMgZGVzdHJveWVkCm9ubHkgYXQgdGhlIGVuZCBvZiBhIHJlcXVlc3QuIFtTdGFzXQoKRml4IGEgY29tcGlsYXRpb24gZXJyb3IgaW4gQVBYLnhzIHdoZW4gTVBfSEFWRV9BUFJfTElCUyBpcyBub3QgZGVmaW5lZApbRnJlZCBNb3llciA8ZnJlZEB0YXBlcmZyaWVuZGx5bXVzaWMub3JnPl0KCmZpeCBhIG1lbW9yeSBsZWFrIHdoZW4gJGZpbHRlci0+Y3R4IGlzIHVzZWQgW1N0YXNdCgpmaXggYnVnbGV0IG9uIFdpbjMyIChhbmQgcG90ZW50aWFsbHkgb3RoZXIgbm9uLVVuaXggcGxhdGZvcm1zKQp3aGVyZSBub3QgYWxsIGZpbGVzIHdlcmUgYmVpbmcgaW5zdGFsbGVkIHVuZGVyIGEgcmVsYXRpdmUgQXBhY2hlMgpzdWJkaXJlY3Rvcnkgd2hlbiBNUF9JTlNUX0FQQUNIRTIgd2FzIHNwZWNpZmllZCBbUmFuZHkgS29iZXNdLgoKZGVwcmVjYXRlZCBBUFI6OlNvY2tBZGRyOjpwb3J0X2dldCgpL0FQUjo6U29ja0FkZHI6OnBvcnRfc2V0KCkKcmVwbGFjZWQgd2l0aCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBwb3J0IHJlY29yZCB2aWEKQVBSOjpTb2NrQWRkcjo6cG9ydCgpLiBbR2VvZmZyZXkgWW91bmcsIFN0YXNdCgpkZXByZWNhdGVkIEFQUjo6VVJJOjpkZWZhdWx0X3BvcnRfZm9yX3NjaGVtZSgpIHJlcGxhY2VkIHdpdGgKQVBSOjpVUkk6OnBvcnRfb2Zfc2NoZW1lKCkgW0dlb2ZmcmV5IFlvdW5nXQoKZGVwcmVjYXRlZCBBUFI6OlNvY2tBZGRyOjppcF9zZXQoKSBhbmQgQVBSOjpOT19USU1FT1VUIHJlbW92ZWQuCltHZW9mZnJleSBZb3VuZ10KCkFwYWNoZTo6TVBNLT5pc190aHJlYWRlZCgpIHJlcGxhY2VzIEFwYWNoZTo6TVBNX0lTX1RIUkVBREVECltHZW9mZnJleSBZb3VuZ10KCmZpeCAiUGVybFNldFZhciBGb28gMCIgc28gdGhhdCAkci0+ZGlyX2NvbmZpZygnRm9vJykgcmV0dXJucyAwLCBub3QgdW5kZWYKW0dlb2ZmcmV5IFlvdW5nXQoKYWRkIEFwYWNoZTo6TVBNIGNsYXNzLCBhbG9uZyB3aXRoIHNob3coKSBhbmQgcXVlcnkoKSBjbGFzcyBtZXRob2RzCltHZW9mZnJleSBZb3VuZ10KCmFkZCA6bXBtcSBpbXBvcnQgdGFnIHRvIEFwYWNoZTo6Q29uc3QgW0dlb2ZmcmV5IFlvdW5nXQoKRml4IE1vZFBlcmw6OlJlZ2lzdHJ5IGhhbmRsZXJzIGZhbWlseSB0byBtb2RpZnkgJDAgb25seSBmb3IgdGhlCmR1cmF0aW9uIG9mIHRoZSBoYW5kbGVyLCBieSBsb2NhbGl6aW5nIGl0IFtTdGFzXQoKRml4IDpBcGFjaGUgcGVybGlvJ3MgU1RET1VUIHRvIGJlIHJlZW50cmFudCArIG1vZHVsZXMvaW5jbHVkZV9zdWJyZXEKdGVzdCBbU3Rhc10KCmZpeCBzbHVycF9maWxlbmFtZSB0byBhbHdheXMgb3BlbiB0aGUgZmlsZSBhbmQgbm90IHRyeSB0byBndWVzcwp3aGV0aGVyIGZpbGVuYW1lIGhhcyBiZWVuIGFscmVhZHkgb3BlbmVkLCBhcyB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkKdG8gYWNjb21wbGlzaCB0aGF0IFtTdGFzXQoKQXBhY2hlLT5jYW5fc3RhY2tfaGFuZGxlcnMgaXMgbm93IGluIEFwYWNoZTo6Y29tcGF0IChtcDIgYWx3YXlzIGNhbgpzdGFjayBoYW5kbGVycykgW1N0YXNdCgphZGQgYWNjZXNzIHRvICRyLT5maW5mbygpIGFuZCByZWxhdGVkIEFQUjo6RmluZm8gbWV0aG9kcywKc3VjaCBhcyAkci0+ZmluZm8tPnNpemUoKSwgJHItPmZpbmZvLT5tdGltZSgpLCBhbmQKJHItPmZpbmZvLT5zdGF0KCkgW0dlb2ZmcmV5IFlvdW5nXQoKYWRkIDpmaWxldHlwZSBpbXBvcnQgdGFnIHRvIEFQUjo6Q29uc3QgW0dlb2ZmcmV5IFlvdW5nXQoKPFBlcmw+IHNlY3Rpb25zIG5vdyBwcm9wZXJseSBzZXQgJDAgdG8gdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KZmlsZSB0aGV5IGFyZSBpbi4gW1BoaWxpcHBlIE0uIENoaWFzc29uXQoKQXBhY2hlOjpTdGF0dXM6IHByb3ZpZGUgYSB3b3JrYXJvdW5kIGZvciBDb25maWc6Om15Y29uZmlnKCkgd2hpY2gKZmFpbHMgdW5kZXIgdGhyZWFkcyB3aXRoICg1LjguMCA8IHBlcmwgPCA1LjguMykgW0VsaXphYmV0aCBNYXR0aWpzZW4KPGxpekBkaWprbWF0Lm5sPl0KCkZpeCBBcGFjaGU6OlN0YXR1czo6aGFuZGxlciB0byByZXR1cm4gJ0FwYWNoZTo6T0snIFtKdWFubWEgQmFycmFucXVlcm8KPGxla3R1QHRlcnJhLmVzPl0KCjxQZXJsPiBzZWN0aW9ucyBub3cgcHJvcGVybHkgc2V0IGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiwKbWFraW5nIGVycm9yIG1lc3NhZ2VzIHJlcG9ydCB0aGUgY29ycmVjdCBsb2NhdGlvbi4gW1BoaWxpcHBlIE0uIENoaWFzc29uXQoKCgo9aXRlbSAxLjk5XzExIC0gTm92ZW1iZXIgMTAsIDIwMDMKCmFkZCBhIGJ1aWxkL3dpbjMyX2ZldGNoX2FweHMgc2NyaXB0IChjYWxsZWQgd2l0aGluIHRoZSB0b3AtbGV2ZWwKTWFrZWZpbGUuUEwpIHRvIG9mZmVyIHRvIGZldGNoIGFuZCBpbnN0YWxsIGEgV2luMzIgZGV2ZWxvcG1lbnQKdmVyc2lvbiBvZiBhcHhzIGFuZCAoYXByfGFwdSktY29uZmlnIFtSYW5keSBLb2Jlc10KCnJld3JpdGUgJHItPnJlYWQoKSBhbmQgcGVybGlvIHJlYWQgZnVuY3Rpb25zIHRvIHVzZSB0aGUgc2FtZSBmdW5jdGlvbiwKd2hpY2ggY29tcGxldGVseSBzYXRpc2ZpZXMgdGhlIHJlYWQgcmVxdWVzdCBpZiBwb3NzaWJsZSwgb24gdGhlIHdheQpnZXR0aW5nIHJpZCBvZiBnZXRfY2xpZW50X2Jsb2NrIGFuZCBpdHMgc3VwcG9ydGluZyBmdW5jdGlvbnMgd2hpY2gKaGF2ZSBwcm9ibGVtcyBhbmQgd2lsbCBtb3N0IGxpa2VseSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgaHR0cGQtQVBJCmluIHRoZSBmdXR1cmUuIERpcmVjdGx5IG1hbmlwdWxhdGUgYnVja2V0IGJyaWdhZGVzIGluc3RlYWQuIFtTdGFzXQoKU2luY2UgQXBhY2hlMi5wbSBwb3BzIC9mb28vQXBhY2hlMiBkaXJzIHRvIHRoZSB0b3Agb2YgQElOQywgaXQgbm93CmFsc28gdGFrZXMgY2FyZSBvZiBrZWVwaW5nIGxpYiBhbmQgYmxpYiBkaXJzIGJlZm9yZSB0aGUgc3lzdGVtIGRpcnMsCnNvIHRoYXQgcHJldmlvdXNseSBpbnN0YWxsZWQgbGlicmFyaWVzIHdvbid0IGdldCBsb2FkZWQgaW5zdGVhZCBvZiB0aGUKY3VycmVudGx5IHVuaW5zdGFsbGVkIGxpYnJhcmllcyB0aGF0IGFyZSB1bmRlciB0ZXN0LiBbU3Rhc10KCldoZW4gJ21ha2UgdGVzdCcgZmFpbHMgd2Ugbm93IHByaW50IHRoZSBpbmZvIG9uIHdoYXQgdG8gZG8gbmV4dCBbU3Rhc10KCkF0IHRoZSBlbmQgb2YgJ21ha2UgaW5zdGFsbCcgd2Ugbm93IHByaW50IHRoZSBpbmZvIGhvdyB0byBwcm9jZWVkIHdpdGgKbW9kX3BlcmwgYW5kIHdoYXQgdG8gZG8gaW4gdGhlIGNhc2Ugb2YgcG9zdC1pbnN0YWxsIHByb2JsZW1zIApbR2VvZmZyZXkgWW91bmddCgpBZGp1c3QgdGhlIHNvdXJjZSB0byBwcm9wZXJseSB3b3JrIHdpdGggNS44LjIncyBuZXcgYWxnb3JpdGhtIG9mCmR5bmFtaWMgcmUtaGFzaGluZyBvZiBoYXNoZXMgb24gaGFzaCBjb2xsaXNpb24gYXR0YWNrLiBbTmljaG9sYXMgQ2xhcmsKPG5pY2tAY2NsNC5vcmc+LCBTdGFzXS4gQWRkIGEgdGVzdCB0aGF0IG1vdW50cyBzdWNoIGFuIGF0dGFjayBzbyB3ZQpjYW4gdmVyaWZ5IHRoYXQgd2UgY2FuIHN1cnZpdmUgdGhpcyByZWhhc2hpbmcuIFtTY290dCBBIENyb3NieQo8c2Nyb3NieUBjcy5yaWNlLmVkdT4sIE5pY2hvbGFzIENsYXJrIDxuaWNrQGNjbDQub3JnPiwgVGVscwo8cGVybF9kdW1teUBibG9vZGdhdGUuY29tPiwgTWFyayBKYXNvbiBEb21pbnVzIDxtamRAcGxvdmVyLmNvbT4sIFN0YXNdCgpTdGFuZGFyZGl6ZSB0aGUgQXBhY2hlOjpQZXJsU2VjdGlvbnMgcGFja2FnZSBuYW1lIHRvIGl0J3MgcGx1cmFsIGZvcm0gZm9yCmNsYXJpdHkgYW5kIHNvIHRoYXQgdGhlIHBvZCBnZXRzIGdsdWVkIGluIGl0J3MgcHJvcGVyIHBsYWNlLgpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCnJldHVybiB2YWx1ZSBmcm9tIFBlcmwgY2FsbGJhY2tzIGFyZSBub3cgcGFzc2VkIGRpcmVjdGx5IHRvIEFwYWNoZQp3aXRob3V0IGFkZGl0aW9uYWwgcG9zdC1jYWxsIG1hbmlwdWxhdGlvbnMgKHN1Y2ggYXMgYXNzdW1pbmcgSFRUUF9PSwpzaG91bGQgcmVhbGx5IGJlIE9LKS4gIFtHZW9mZnJleSBZb3VuZ10KCnBlcmwgNS44LjEgdy8gaXRocmVhZHMgaGFzIGEgYnVnIHdoZXJlIGl0IHJlcG9ydHMgdGhlIHdyb25nIHBhcmVudCBwaWQKKGFzIGlmIHRoZSBwcm9jZXNzIHdhcyBuZXZlciBmb3JrZWQpLCBwcm92aWRlIGEgbG9jYWwgd29ya2Fyb3VuZCAoKyBuZXcKdGVzdCkuIFtSYWZhZWwgR2FyY2lhLVN1YXJleiA8cmdhcmNpYXN1YXJlekBmcmVlLmZyPl0KCm92ZXJyaWRkZW4gU1REKiBzdHJlYW1zIG5vdyBjYW4gYmUgZnVydGhlciBvdmVycmlkZGVuIGFuZCB3aWxsIGJlCnByb3Blcmx5IHJlc3RvcmVkLCB3aGljaCBhbGxvd3MgZnVuY3Rpb25zIGxpa2UgJHItPmludGVybmFsX3JlZGlyZWN0CndvcmsgKCthZGQgdGVzdHMpIFtTdGFzXQoKaW1wbGVtZW50IHBlcmxpbydzIGdldGFyZyBob29rLCB3aGljaCBub3cgYWxsb3dzIGR1cGluZyBTVEQqIHN0cmVhbXMKb3ZlcmxvYWRlZCBieSBtb2RwZXJsIFtTdGFzXQoKQWRkIFBlcmxNYXBUb1N0b3JhZ2VIYW5kbGVyIFtHZW9mZnJleSBZb3VuZ10KCmNhbGxiYWNrcyBhcmUgbm93IGV4cGVjdGVkIHRvIHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgCihPSywgU0VSVkVSX0VSUk9SLCBldGMpIG9yIHJldHVybiB2aWEgYW4gb2ZmaWNpYWwgQVBJIAooZXhpdCwgZGllLCBldGMpLiAgcmVseWluZyBvbiBpbXBsaWNpdCByZXR1cm5zIGZyb20gdGhlIApsYXN0IGNhbGwgZXZhbHVhdGVkIGJ5IGEgc3Vicm91dGluZSBtYXkgcmVzdWx0IGluIHNlcnZlciAKZXJyb3JzLiAgW1N0YXMsIEdlb2ZmcmV5IFlvdW5nXQoKaW4gdGhlIE1QX01BSU5UQUlORVIgbW9kZSBhZGQgdGhlIC1XZXJyb3IgY29tcGlsYXRpb24gZmxhZyB3aGVuIHBlcmwKdjUuNi4yIG9yIGhpZ2hlciBpcyB1c2VkLCBzbyB0aGF0IHdlIGRvbid0IG1pc3MgY29tcGlsYXRpb24Kd2FybmluZ3MuIFtTdGFzXQoKZml4IHRoZSBNYWtlZmlsZS5QTCBvcHRpb24gcGFyc2VyIHRvIHN1cHBvcnQgb3ZlcnJpZGluZyBvZiBjZXJ0YWluCmJ1aWxkIG9wdGlvbnMsIGluIGFkZGl0aW9uIHRvIGFwcGVuZGluZyB0byB0aGVtICguZS5nLiBub3cgTVBfTElCTkFNRQppcyBvdmVycmlkYWJsZSkgW0FuZHJldyBXeWxsaWUgPHd5bGxpZUBkaWxleC5uZXQ+XQoKbWFrZSBzdXJlIHRoYXQgY29ubmVjdGlvbiBmaWx0ZXJzIHdvbid0IGJlIGluc2VydGVkIGFzIHJlcXVlc3QgZmlsdGVycwpbU3Rhc10KClByZXZlbnQgdGhlICdVc2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZS4nIHdhcm5pbmcgd2hlbgpNb2RQZXJsOjpVdGlsOjpleGl0IGlzIHVzZWQuIFtTdGFzXQoKVG8gbWFrZSB0aGUgdGVzdC1zdWl0ZSBzYW5kYm94LWZyaWVuZGx5LCB3aGljaCBicmVhayB3aGVuIHRoaW5ncyB0cnkgdG8KcnVuIG9mZiAvdG1wLCB1c2UgdC9sb2dzIGFzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbW9kX2NnaWQgc29ja2V0IGFuZApUTVBESVIgZW52IHZhciBbSGFyb29uIFJhZmlxdWUgPGhhcm9vbi5yYWZpcXVlQHV0b3JvbnRvLmNhPl0KCgoKPWl0ZW0gMS45OV8xMCAtIFNlcHRlbWJlciAyOSwgMjAwMwoKYWRkZWQgQXBhY2hlOjpDUkxGLCBBcGFjaGU6OkNSLCBhbmQgQXBhY2hlOjpMRiB0bwpBcGFjaGU6OkNvbnN0J3MgOnBsYXRmb3JtIGdyb3VwICBbR2VvZmZyZXkgWW91bmddCgptYWtlIHN1cmUgdGhhdCB0aGUgY3VzdG9tIHBvb2xzIGFyZSBkZXN0cm95ZWQgb25seSBvbmNlIGFuZCBvbmx5IHdoZW4KYWxsIHJlZmVyZW5jZXMgd2VudCBvdXQgb2Ygc2NvcGUgW1N0YXNdCgooJHJ8JGMpLT5hZGRfKGlucHV0fG91dHB1dClfZmlsdGVyKFwmaGFuZGxlcikgbm93IHZlcmlmeSB0aGF0IHRoZQpmaWx0ZXIgb2YgdGhlIHJpZ2h0IGtpbmQgaXMgcGFzc2VkIGFuZCB3aWxsIHJlZnVzZSB0byBhZGQgYSByZXF1ZXN0CmZpbHRlciBhcyBhIGNvbm5lY3Rpb24gZmlsdGVyIGFuZCB2aWNlIHZlcnNhLiBUaGUgcmVxdWVzdCBmaWx0ZXIKaGFuZGxlciBpcyBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgRmlsdGVyUmVxdWVzdEhhbmRsZXIgYXR0cmlidXRlIGFzCmxvbmcgYXMgaXQgZG9lc24ndCBoYXZlIGFueSBvdGhlciBhdHRyaWJ1dGVzLiBUaGUgY29ubmVjdGlvbiBmaWx0ZXIKaGFuZGxlciBpcyByZXF1aXJlZCB0byBoYXZlIHRoZSBGaWx0ZXJDb25uZWN0aW9uSGFuZGxlcgphdHRyaWJ1dGUuIFtTdGFzXQoKZml4IHRyYWNpbmcgd2l0aCAoUGVybFRyYWNlL01PRF9QRVJMX1RSQUNFKSBvbiB3aW4zMiAodGhlIGVycm9yX2xvZwpmaWxlaGFuZGxlIHdhcyBpbnZhbGlkIGFmdGVyIHRoZSBvcGVuX2xvZ3MgcGhhc2UpIFtTdGFzXQoKZml4IGEgYnVnIHdoZXJlICVFTlYgdmFycyBzZXQgdmlhIHN1YnByb2Nlc3NfZW52IHBlcnNpc3QgYWNyb3NzCnJlcXVlc3RzLiAgKGUuZy4gYSBDb29raWUgaW5jb21pbmcgaGVhZGVyIHdoaWNoIGVuZHMgdXAgaW4KJEVOVntIVFRQX0NPT0tJRX0gd291bGQgcGVyc2lzdCB0byB0aGUgbmV4dCByZXF1ZXN0IHdoaWNoIGhhcyBubwpDb29raWUgaGVhZGVyIGF0IGFsbCkuIE5vdyB3ZSB1bnNldCBhbGwgdGhlICVFTlYgdmFycyBzZXQgZnJvbQpzdWJwcm9jZXNzX2Vudi4gSW1wcm92ZSBhbmQgZXh0ZW5kIHRoZSB0ZXN0cyB0byBjb3ZlciB0aGlzIGJ1Zy4gW1N0YXNdCgppdCBpcyBpbnZhbGlkIHRvIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiBvciBhbnkgb3RoZXIgSFRUUApyZXNwb25zZSBjb2RlIGZyb20gbW9kcGVybF93YnVja2V0X3Bhc3MsIHRoZXJlZm9yZSBzZXQgdGhlIGVycm9yIGNvZGUKaW50byByLT5zdGF0dXMgYW5kIHJldHVybiBBUFJfU1VDQ0VTUy4gVW50aWwgbm93IHJlc3BvbnNlIGhhbmRsZXIKd2l0aCBtZXNzZWQgdXAgcmVzcG9uc2UgaGVhZGVycywgd2VyZSBjYXVzaW5nIG5vIHJlc3BvbnNlIHdoYXQgc28gZXZlcgp0byB0aGUgY2xpZW50LiAgTFdQIHdhcyBhc3N1bWluZyA1MDAsIGFuZCBpdCB3YXMgYWxsIGZpbmUsIHRlc3RpbmcKd2l0aG91dCBMV1AgaGFzIGltbWVkaWF0ZWx5IHJldmVhbGVkIHRoYXQgdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUKaGFuZGxpbmcgb2YgdGhpcyBjYXNlLiBbU3Rhc10KCnB1dCB0aGUgZW5kIHRvIHRoZSAnTm90IGEgQ09ERSByZWZlcmVuY2UnIGVycm9ycywgaW5zdGVhZCBwcm92aWRlIGFuCmludGVsbGlnZW50IGVycm9yIG1lc3NhZ2UsIGhvcGVmdWxseSB0ZWxsaW5nIHdoaWNoIGZ1bmN0aW9uIGNhbid0IGJlCmZvdW5kLiAgYXQgdGhlIHNhbWUgdGltZSBpbXByb3ZlIHRoZSB0cmFjaW5nIHRvIGluY2x1ZGUgdGhlIHBpZC90aWQgb2YKdGhlIHNlcnZlciB0aGF0IGhhcyBlbmNvdW50ZXJlZCB0aGlzIHByb2JsZW0sIHRvIG1ha2UgaXQgZWFzaWVyIHRvCmRlYnVnLiBbU3Rhc10KCm1vZF9wZXJsIGhhbmRsZXIgbXVzdCBiZSBkdXBlZCBmb3IgYW55IG1wbSB3aGljaCBydW5zIHdpdGhpbgpVU0VfSVRIUkVBRC4gIFVudGlsIG5vdyB0aGVyZSB3YXMgYSBiaWcgcHJvYmxlbSB3aXRoIHByZWZvcmsgbXBtIGlmCmFueSBvZiBpdHMgdmhvc3RzIHdhcyB1c2luZyBQZXJsT3B0aW9ucyArKFBhcmVudHxDbG9uZSkgYW5kIGhhcHBlbmVkCnRvIGxvYWQgaGFuZGxlcnMgYmVmb3JlIHRoZSBtYWluIHNlcnZlci4gV2hlbiB0aGF0IHdhcyBoYXBwZW5pbmcgdGhlCm1haW4gc2VydmVyIHdpbGwgc2VlIHRoYXQgdGhlIGhhbmRsZXIgd2FzIHJlc29sdmVkIChzaW5jZSBpdCBzZWVzIHRoZQpoYW5kbGVyIHN0cnVjdCBmcm9tIHRoZSB2aG9zdCB0aGF0IGxvYWRlZCB0aGlzIG1vZHVsZSwgaW5zdGVhZCBvZiBpdHMKb3duKSwgd2hpY2ggaW4gZmFjdCBpdCB3YXNuJ3QsIGNhdXNpbmcgdGhlIGZhaWx1cmUgdG8gcnVuIHRoZSBoYW5kbGVyCndpdGggdGhlIGluZmFtb3VzICdOb3QgYSBDT0RFIHJlZmVyZW5jZScgZXJyb3IuIFtTdGFzXQoKTWFrZSBzdXJlIHRoYXQgdGhlIHN0YXRpYyBtb2RfcGVybCBsaWJyYXJ5IGlzIGJ1aWx0IGFmdGVyIHRoZSBkeW5hbWljCihhIHJlcXVpcmVtZW50IG9uIHdpbjMyKSBbU3RldmUgSGF5IDxzdGV2ZS5oYXlAdWsucmFkYW4uY29tPl0KCkFwYWNoZTo6U3RhdHVzIG5vdyBnZW5lcmF0ZXMgSFRNTCA0LjAxIFN0cmljdCAoYW5kIGluIG1hbnkgY2FzZXMsIGFsc28KSVNPLUhUTUwpIGNvbXBsaWFudCBvdXRwdXQuIEFsc28gYWRkIGEgc2ltcGxlIENTUyB0byBtYWtlIHRoZSByZXBvcnRzCmxvb2sgbmljZXIuIFtWaWxsZSBTa3l0dOQgPHZpbGxlLnNreXR0YUBpa2kuZmk+XQoKQVBSOjpQb29sOjpERVNUUk9ZIGltcGxlbWVudGVkIGFuZCB0d2Vha2VkIHRvIG9ubHkKZGVzdHJveSBwb29scyBjcmVhdGVkIHZpYSBBUFI6OlBvb2wtPm5ldygpIFtHZW9mZnJleSBZb3VuZ10KCiRyLT5zbHVycF9maWxlbmFtZSBpcyBub3cgaW1wbGVtZW50ZWQgaW4gQy4gW1N0YXNdCgpyZW1vdmUgc3VwcG9ydCBmb3IgaHR0cGQgMi4wLjQ1L2FwciAwLjkuMyBhbmQgbG93ZXIuCmh0dHBkIDIuMC40NiBpcyBub3cgdGhlIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb24uCltHZW9mZnJleSBZb3VuZ10KCkFQUjo6UGVybElPIG5vdyBhY2NlcHRzIHRoZSBwb29sIG9iamVjdCBpbnN0ZWFkIG9mIGEgcmVxdWVzdC9zZXJ2ZXIKb2JqZWN0cywgc28gaXQgY2FuIGJlIHVzZWQgYW55d2hlcmUsIGluY2x1ZGluZyBvdXRzaWRlIG1vZF9wZXJsIFtTdGFzXQoKd2hlbiBwZXJsIGlzIGJ1aWx0IHdpdGggcGVybGlvIGVuYWJsZWQgKDUuOCspIHRoZSBuZXcgUGVybElPIEFwYWNoZQpsYXllciBpcyB1c2VkLCBzbyBub3cgb25lIGNhbiBwdXNoIGxheWVycyBvbnRvIFNURElOLCBTVERPVVQgaGFuZGxlcwplLmcuIGJpbm1vZGUoU1RET1VULCAnOnV0ZjgnKTsgW1N0YXNdCgphZGQgYXBfdGFibGVfY29tcHJlc3MoKSB0byBBUFI6OlRhYmxlIFtHZW9mZnJleSBZb3VuZ10KCmFsdGVyIHN0YWNrZWQgaGFuZGxlciBpbnRlcmZhY2Ugc28gdGhhdCBtb2RfcGVybCBmb2xsb3dzIEFwYWNoZSAKYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB3aXRoIHJlc3BlY3QgdG8gVk9JRC9SVU5fRklSU1QvUlVOX0FMTApoYW5kbGVyIHR5cGVzLiAgbm93LCBmb3IgcGhhc2VzIHdoZXJlIE9LIGVuZHMgdGhlIEFwYWNoZQpjYWxsIGxpc3QgKFJVTl9GSVJTVCBoYW5kbGVycywgc3VjaCBhcyB0aGUgUGVybFRyYW5zSGFuZGxlciksIAptb2RfcGVybCBmb2xsb3dzIHN1aXQgYW5kIGxlYXZlcyBzb21lIGhhbmRsZXJzIHVuY2FsbGVkLgpbR2VvZmZyZXkgWW91bmddCgpBcGFjaGU6OkJ1aWxkIG5vdyB0cmllcyB0byB1c2UgdGhlIG5ldyBBUFJfQklORElSIHF1ZXJ5IHN0cmluZyB0byBmaW5kCnRoZSBsb2NhdGlvbiBvZiBhcHItY29uZmlnLiBbU3Rhc10KCm5ldyBwYWNrYWdlIEFwYWNoZTo6cG9ydGluZyB0byBtYWtlIGl0IGVhc2llciB0byBwb3J0IG1wMSBjb2RlIHRvIG1wMgpbU3Rhc10KCm5ldyBBcGFjaGU6OkJ1aWxkIG1ldGhvZHM6IG1wbV9uYW1lKCksIG1wbV9pc190aHJlYWRlZCgpLiB1c2UgdGhlbSBpbgp0aGUgdG9wLWxldmVsIE1ha2VmaWxlLlBMIHRvIHJlcXVpcmUgNS44LjAvaXRocmVhZHMgaWYgbXBtIHJlcXVpcmVzCnRocmVhZHMuIFtTdGFzXQoKYWRkIHRoZSBtaXNzaW5nIFhTIG1ldGhvZHMgdG8gTW9kUGVybDo6TWV0aG9kTG9va3VwLCBhZGQgc3VwcG9ydCBmb3IKbXAxIG1ldGhvZHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBtb2RfcGVybCAyLjAgQVBJLiBbU3Rhc10KCm1vZF9wZXJsIG5vdyByZWZ1c2VzIHRvIGJ1aWxkIGFnYWluc3QgdGhyZWFkZWQgbXBtcyAobm9uLXByZWZvcmspCnVubGVzcyBwZXJsIDUuOCsgdy9pdGhyZWFkcyBpcyB1c2VkIFtTdGFzXQoKZG9uJ3QgdHJ5IHRvIHJlYWQgUEVSTF9IQVNIX1NFRUQgZW52IHZhciwgd2hlcmUgYXByX2Vudl9nZXQgaXMgbm90CmF2YWlsYWJsZSAoYXByIDwgMC45LjMpIFtTdGFzXQoKQVBSLnNvIG5vdyBjYW4gYmUgbG9hZGVkIGFuZCB1c2VkIG91dHNpZGUgbW9kX3BlcmwgKGFsbCB0aGUgd2F5IGJhY2sKdG8gaHR0cGQgMi4wLjM2KSBbU3Rhc10KCnBlcmwgNS44LjEgcmFuZG9taXplcyB0aGUgaGFzaCBzZWVkLCBiZWNhdXNlIHdlIHByZWNhbGN1bGF0ZSB0aGUgaGFzaAp2YWx1ZXMgb2YgbWd2IGVsZW1lbnRzIHRoZSBoYXNoIHNlZWQgaGFzIHRvIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGwKcGVybCBpbnRlcnByZXRlcnMuIFNvIG1vZF9wZXJsIG5vdyBpbnRlcmNlcHRzIGNhc2VzIHdoZXJlIHBlcmwgd291bGQKaGF2ZSByYW5kb21pemUgaXQsIGRvIHRoZSBzZWVkIHJhbmRvbWl6YXRpb24gYnkgaXRzZWxmIGFuZCB0ZWxsIHBlcmwKdG8gdXNlIHRoYXQgdmFsdWUuIFtTdGFzXQoKZml4IEFQUjo6UGVybElPIGxheWVyIHRvIHBvcCBpdHNlbGYgaWYgb3BlbigpIGhhcyBmYWlsZWQuIFtTdGFzXQoKbW92ZSB0aGUgZGVmaW5pdGlvbiBvZiBERUZJTkU9Jy1ETVBfSEFWRV9BUFJfTElCUycgdG8gdGhlIHRvcCBsZXZlbApNYWtlZmlsZS5QTCwgc2luY2UgaXQgb3ZlcnJpZGVzIE1ZOjpwYXN0aHJ1IHRhcmdldCB3aGljaCBtYWtlcyBpdAppbXBvc3NpYmxlIHRvIGRlZmluZSBsb2NhbCBERUZJTkUgaW4gc3ViZGlycy4gW1N0YXNdCgptYWtlIEFQUiBwZXJsIGZ1bmN0aW9ucyB3b3JrIG91dHNpZGUgbW9kX3Blcmw6IHNldmVyYWwgbGlicmFyaWVzCndlcmVuJ3QgbGlua2VkLiBBbHNvIExJQlMgbmVlZHMgdG8gcmVjZWl2ZSBhbGwgbGlicyBpbiBvbmUKc3RyaW5nLiBbU3Rhc10KCkFwYWNoZTo6Y29tcGF0OiAkci0+Y2dpX2VudiwgJHItPmNnaV92YXIgYXJlIG5vdyBhbGlhc2VzIHRvCiRyLT5zdWJwcm9jZXNzX2VudiBbU3Rhc10KCkZvciBXaW4zMiwgZ2VuZXJhdGUgLnBkYiBmaWxlcyBmb3IgZGVidWdnaW5nIHdoZW4gYnVpbHQgd2l0aApNUF9ERUJVRy4gVGhlc2Ugd2lsbCBnZXQgaW5zdGFsbGVkIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzCnRoZSBhc3NvY2lhdGVkIGRsbC9zbyBsaWJzLiBBcyB3ZWxsLCBpbnN0YWxsIG1vZF9wZXJsLmxpYgppbnRvIE1QX0FQX1BSRUZJWC9saWIvIGZvciB1c2UgYnkgM3JkIHBhcnR5IG1vZHVsZXMgW1JhbmR5IEtvYmVzXS4KCkFwYWNoZTIucG0gaXMgbm93IGF1dG9nZW5lcmF0ZWQgYW5kIHdpbGwgYWRqdXN0IEBJTkMgdG8gaW5jbHVkZQpBcGFjaGUyLyBzdWJkaXJzIG9ubHkgaWYgYnVpbHQgd2l0aCBNUF9JTlNUX0FQQUNIRTI9MSBbU3Rhc10KCkNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFyZ3VtZW50ICdyZWFkYnl0ZXMnIGZvcgphcF9nZXRfYnJpZ2FkZSgpLCBmcm9tIDAgdG8gODE5Mi4gb3RoZXIgdGhhbiBiZWluZyB1c2VsZXNzLCAwIGFsd2F5cwp0cmlnZ2VycyBhbiBhc3NlcnQgaW4gaHR0cGQgaW50ZXJuYWwgZmlsdGVycyBhbmQgODE5MiBpcyBhIGdvb2QKZGVmYXVsdC4gW1N0YXNdCgpGaXggRHluYUxvYWRlciBicmVha2FnZSB3aGVuIHVzaW5nIERMX0dMT0JBTCBvbiBPcGVuQlNECltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKcmVuYW1lZCB0aGUgcHJpdmF0ZSBtb2RwZXJsX21vZHVsZV9jb25maWdfZ2V0X29iaiBmdW5jdGlvbiB0byAKbW9kcGVybF9tb2R1bGVfY29uZmlnX2NyZWF0ZV9vYmosIHNpbmNlIHRoZSBsb2dpYyBjcmVhdGVzIAp0aGUgb2JqZWN0IGJ1dCBkb2Vzbid0IGRpZyBpdCBvdXQgaWYgaXQgYWxyZWFkeSBleGlzdHMuICB0aGVuLAptb3ZlZCBsb2dpYyBmcm9tIG1weHNfQXBhY2hlX19Nb2R1bGVfZ2V0X2NvbmZpZyBpbnRvIGEgbmV3IHB1YmxpYwpDIGZ1bmN0aW9uIHRoYXQgcmV1c2VkIHRoZSBvbGQgbmFtZSwgbW9kcGVybF9tb2R1bGVfY29uZmlnX2dldF9vYmouCndoaWxlIEFwYWNoZTo6TW9kdWxlLT5nZXRfY29uZmlnIGV4aXN0cyBhcyBhIHdyYXBwZXIgdG8gcmV0dXJuIHRoZQpvYmplY3QgdG8gUGVybCBzcGFjZSwgbm93IEMvWFMgZm9sa3MgY2FuIGFsc28gYWNjZXNzIHRoZSBvYmplY3QKZGlyZWN0bHkgd2l0aCB0aGUgcHVibGljIGZ1bmN0aW9uLgpbR2VvZmZyZXkgWW91bmddCgpBcGFjaGU6OlJlbG9hZDogYWRkIGEgbmV3IGNvbmZpZyB2YXJpYWJsZToKUmVsb2FkQ29uc3RhbnRSZWRlZmluZVdhcm5pbmdzIHRvIG9wdGlvbmFsbHkgc2h1dCBvZmYgdGhlIGNvbnN0YW50IHN1YgpyZWRlZmluZSB3YXJuaW5ncyBbU3Rhc10KCmltcGxlbWVudCAkcGFybXMtPmluZm8uICBkaXJlY3RpdmUgaGFuZGxlcnMgc2hvdWxkIG5vdyBiZSBjb21wbGV0ZS4KW0dlb2ZmcmV5IFlvdW5nXQoKTVBfR1RPUCBub3cgd29ya3Mgd2l0aCBtb2Rlcm4gR0NDCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmddCgphZGQgbWlzc2luZyBkZXBlbmRlbmNpZXMgdG8gQXBhY2hlOjpQZXJsU2VjdGlvbnMKW0dlb2ZmcmV5IFlvdW5nXQoKJHItPmdldF9jbGllbnRfYmxvY2sgaXMgYm9ndXMgaW4gaHR0cGQtMi4wLjQ1IChhbmQgZWFsaWVyKSwgYXMgaXQKY2FuJ3QgaGFuZGxlIEVPUyBidWNrZXRzIGFycml2aW5nIGluIHRoZSBzYW1lIGJ1Y2tldCBicmlnYWRlIHdpdGgKZGF0YS4gc28gcmV3cml0ZSBNb2RQZXJsOjpUZXN0OjpyZWFkX3Bvc3QgdG8gdXNlIGFuIGV4cGxpY2l0IHJlYWQKdGhyb3VnaCBhbGwgYnVja2V0IGJyaWdhZGVzIHRpbGwgaXQgc2VlcyBlb3MgYW5kIHRoZW4gaXQgc3RvcHMuIFRoZQpjb2RlIGlzIGxvbmdlciBidXQgaXQgd29ya3MgY29ycmVjdGx5LiBbU3Rhc10KCmFuIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgYmluYXJ5IGNvbXBhdGliaWxpdHkgcHJvYmxlbSBpbgpQZXJsSU9BUFJfc2VlayBBUEkgd2hlbiBBUFJfSEFTX0xBUkdFX0ZJTEVTPTAgW1N0YXNdCgpwZXJsIDUuOC4wIGZvcmdldHMgdG8gZXhwb3J0IFBlcmxJT0Jhc2Vfbm9vcF9mYWlsLCBjYXVzaW5nIHByb2JsZW1zIG9uCndpbjMyIGFuZCBhaXguIHJlaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gbG9jYWxseSB0byBzb2x2ZSB0aGUKcHJvYmxlbS4gQVBSOjpQZXJsSU8gc2hvdWxkIG5vdyBiZSB1c2VmdWwgb24gd2luMzIgYW5kIGFpeCBbU3Rhc10KCmltcGxlbWVudCBERUNMSU5FX0NNRCBhbmQgRElSX01BR0lDX1RZUEUgY29uc3RhbnRzCltHZW9mZnJleSBZb3VuZ10KCmFsbG93IGluaXQgZmlsdGVyIGhhbmRsZXJzIHRvIGNhbGwgb3RoZXIgbWV0aG9kcyB0aGFuIGp1c3QgJGYtPmN0eCBbU3Rhc10KCkZpeCBBcGFjaGU6OlJlbG9hZCB0byBncmFjZWZ1bGx5IGhhbmRsZSB0aGUgY2FzZSB3aXRoIGVtcHR5IFRvdWNoZmlsZXMKW0RtaXRyaSBUaWtob25vdiA8ZG1pdHJpQG5ldGlsbGEuY29tPl0KClBlcmxSZXF1aXJlIGVudHJpZWQgc2hvdWxkIGJlIGV4ZWN1dGVkIGJlZm9yZSBQZXJsTW9kdWxlIGVudHJpZXMgaW4KVmlydHVhbEhvc3QgY29udGFpbmVycywganVzdCBsaWtlIGluIHRoZSBiYXNlIHNlcnZlciBbU3Rhc10KCgoKPWl0ZW0gMS45OV8wOSAtIEFwcmlsIDI4LCAyMDAzCgokZmlsdGVyLT5zZWVuX2VvcygpIG5vdyBhY2NlcHRzIDEvMCB0byBzZXQvdW5zZXQgdGhlIGZsYWcgc28gc3RyZWFtaW5nCmZpbHRlcnMgY2FuIGNvbnRyb2wgdGhlIHNlbmRpbmcgb2YgRU9TLiBbU3Rhc10KCnN1cHBvcnQgc3lzdGVtcyB3aGVyZSBhcHIgaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQgc2VwYXJhdGVseSBmcm9tCmh0dHBkIGhlYWRlciBmaWxlcyBbIkFuZHJlcyBTYWxvbW9uIiA8ZGlsaW5nZXJAdm94ZWwubmV0Pl0KCmltcGxlbWVudCBpbml0IGZpbHRlciBoYW5kbGVycyArIHRlc3RzIFtTdGFzXQoKaW1wcm92aW5nIE1vZFBlcmw6Ok1ldGhvZExvb2t1cCB0bzoKLSBoYW5kbGUgbW9yZSBhbGlhc2VkIHBlcmwgWFMgZnVuY3Rpb25zCi0gc29ydCB0aGUgbWV0aG9kcyBtYXAgc3RydWN0IHNvIG9uZSBjYW4gdXNlIHRoZSBhdXRvZ2VuZXJhdGVkIG1hcCBhcyBpcwotIGFkZCBsb29rdXBfbW9kdWxlLCB0ZWxscyB3aGljaCBtZXRob2RzIGFyZSBkZWZpbmVkIGJ5IGEgZ2l2ZW4gbW9kdWxlCi0gYWRkIGxvb2t1cF9vYmplY3QsIHRlbGxzIHdoaWNoIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBvbiBhIGdpdmVuIG9iamVjdAotIHByb3ZpZGUgYXV0b2V4cG9ydGVkIHdyYXBwZXJzIHByaW50X21ldGhvZCwgcHJpbnRfbW9kdWxlIGFuZAogIHByaW50X29iamVjdCBmb3IgZWFzeSBkZXBsb3ltZW50IGZyb20gdGhlIGNvbW1hbmQgbGluZQpbU3Rhc10KCmFkZCBQZXJsIGdsdWUgZm9yIGZ1bmN0aW9uczogQVBSOjpTb2NrZXQ6OnRpbWVvdXRfZ2V0CkFQUjo6U29ja2V0Ojp0aW1lb3V0X3NldCBbU3Rhc10KCnNpbWlsYXIgdG8gU2V0RW52LCB1cGNhc2UgdGhlIGVudiBrZXlzIGZvciBQYXNzRW52IG9uIHBsYXRmb3JtcyB3aXRoCmNhc2VsZXNzIGVudiAoZS5nLiB3aW4zMikgW3N0ZXZlLnNwYXJsaW5nQHBzLmdlLmNvbV0KCkFkZCBhIGJhY2tjb21wYXQgd3JhcHBlciBmb3IgJHItPm5vdGVzIChtcDIgc3VwcG9ydHMgb25seSB0aGUKQVBSOjpUYWJsZSBBUEkpIFtTdGFzXQoKQWRkIGEgc2NyaXB0IG1wMmJ1ZyBhbmQgYSB0YXJnZXQgJ21ha2UgYnVncmVwb3J0Jywgc28gcGVvcGxlIGNhbiB1c2UKYnVncmVwb3J0aW5nIGR1cmluZyB0aGUgYnVpbGQgYW5kIGFmdGVyIG1vZHBlcmwgaXMgaW5zdGFsbGVkLiBbU3Rhc10KCkFkZCBhIHNjcmlwdCBtcDJkb2MgYXMgYSByZXBsYWNlbWVudCBmb3IgcGVybGRvYyAoZHVlIHRvIDIuMCBtb2R1bGVzCmxpdmluZyB1bmRlciBBcGFjaGUyLCB3aGljaCB3b24ndCBiZSBsb29rZWQgYXQgYnkgcGVybGRvYykuIFtTdGFzXQoKQWRkIGEgY29uc3RhbnQgQVBSOjpQZXJsSU86OlBFUkxJT19MQVlFUlNfQVJFX0VOQUJMRUQgYW5kIHVzZSBpdCBpbgp0ZXN0cyBbU3Rhc10KClJlcXVpcmUgcGVybCA1Ljggb3IgaGlnaGVyIHdoZW4gYnVpbGRpbmcgbW9kX3Blcmwgb24gT1NlcyByZXF1aXJpbmcKaXRocmVhZHMgKGUuZy4sIHdpbjMyKSwgc2luY2UgNS42LnggaXRocmVhZHMgYXJlbid0IGdvb2QuIFtTdGFzXQoKTVBfQ09NUEFUXzFYPTAgbm93IGNhbiBiZSBwYXNzZWQgdG8gTWFrZWZpbGUuUEwgdG8gZGlzYWJsZQptcDEtYmFjay1jb21wYXQgY29tcGlsZS10aW1lIGZlYXR1cmVzICsgYWRqdXN0IHRlc3RzLiBbU3Rhc10KCjxTRVJWRVJfUk9PVD4gYW5kIDxTRVJWRVJfUk9PVD4vbGliL3BlcmwgYXJlIG5vdyBhZGRlZCB0byBASU5DLCBqdXN0Cmxpa2UgbW9kX3BlcmwgMS4wIHdpdGggTVBfQ09NUEFUXzFYPTEgKGN1cnJlbnRseSBlbmFibGVkIGJ5CmRlZmF1bHQpLiBbU3Rhc10KClRoZSBQZXJsLTUuOC4wIGNyeXB0KCkgd29ya2Fyb3VuZCBpcyBub3cgdXNlZCBvbmx5IGlmIDUuOC4wIGlzIHVzZWQsCnNpbmNlIDUuOC4xLXRvYmUvNS45LjAtdG9iZShibGVhZC1wZXJsKSB3b24ndCBjb21waWxlIHdpdGgKaXQuIFtHZW9mZnJleSBZb3VuZ10KCm5ldyBkaXJlY3RpdmVzIFBlcmxTZXRJbnB1dEZpbHRlciBhbmQgUGVybFNldE91dHB1dEZpbHRlciwgd2hpY2ggYXJlCnRoZSBzYW1lIGFzIFNldElucHV0RmlsdGVyIGFuZCBTZXRPdXRwdXRGaWx0ZXIgcmVzcGVjdGl2ZWx5LCBidXQgYWxsb3cKdG8gaW5zZXJ0IG5vbi1tb2RfcGVybCBmaWx0ZXJzIGJlZm9yZSwgYmV0d2VlbiBvciBhZnRlciBtb2RfcGVybApmaWx0ZXJzLiArIHRlc3RzIFtTdGFzXQoKaW1wcm92ZWQgZmlsdGVycyBkZWJ1ZyB0cmFjaW5nIFtTdGFzXQoKaW1wbGVtZW50ICRmaWx0ZXItPnJlbW92ZSAoZmlsdGVyIHNlbGYtcmVtb3ZhbCkgKyB0ZXN0cyBbU3Rhc10KCnJlbW92ZSB0aGUgc2Vjb25kLWd1ZXNzaW5nIGNvZGUgdGhhdCB3YXMgdHJ5aW5nIHRvIGd1ZXNzIHRoZSBwYWNrYWdlCm5hbWUgdG8gbG9hZCBmcm9tIHRoZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gKGJ5IHN0cmlwcGluZyA6OnN0cmluZyBhbmQKdHJ5aW5nIHRvIGxvYWQgdGhlIHBhY2thZ2UpLiBmYWxsIGJhY2sgdG8gdXNpbmcgZXhwbGljaXQgUGVybE1vZHVsZSB0bwpsb2FkIG1vZHVsZXMgd2hvc2UgaGFuZGxlciBzdWIgbmFtZSBpcyBub3QgY2FsbGVkICdoYW5kbGVyJyArIGFkanVzdAp0ZXN0cy4gW1N0YXNdCgpzZXQgdGhlIG1hZ2ljIHRhaW50IGZsYWdzIGJlZm9yZSBtb2R1bGVzIGFyZSByZXF1aXJlZCBbU3Rhc10KCm1ha2Ugc3VyZSB0byBzZXQgYmFzZSBzZXJ2ZXIncyBtaXAgYmVmb3JlIGFueSBvZiB0aGUKUGVybFJlcXVpcmUvUGVybE1vZHVsZSBkaXJlY3RpdmVzIGFyZSBjYWxsZWQsIHNpbmNlIHRoZXkgbWF5IGFkZAphZGRfY29uZmlnKCksIHdoaWNoIGluIHR1cm4gcnVucyBQZXJsIHNlY3Rpb25zIG9yIFBlcmxMb2FkTW9kdWxlLAp3aGljaCBtYXkgbmVlZCB0aGUgc2NmZy0+bWlwIHRvIGJlIHNldC4gW1N0YXNdCgpNb2RQZXJsOjpNTSBpcyBub3cgcmVhZHkgdG8gYmUgdXNlZCBpbiBNYWtlZmlsZS5QTCBvZiAzcmQgcGFydHkKbW9kX3BlcmwgbW9kdWxlcyBbU3RhcyBhbmQgR2VvZmZdCgpmaXggYSBzZWdmYXVsdCBjYXVzZWQgYnkgUGVybE1vZHVsZSBpbiAkcy0+YWRkX2NvbmZpZywgZHVlIHRvIHNldHRpbmcKdGhlIE1QX2luaXRfZG9uZSBmbGFnIGJlZm9yZSBpbml0IHdhcyBkb25lICsgYWRkIHRlc3QgW1N0YXNdCgphZGp1c3QgdGhlIGdlbmVyYXRlZCBNYWtlZmlsZSdzIHRvIHByb3Blcmx5IGJ1aWxkIG9uIGFpeCAodGVzdGVkIG9uCnBvd2VycGMtaWJtLWFpeDUuMS4wLjApIFtTdGFzXQoKdGhlIGJ1aWxkIG5vdyBhdXRvbWF0aWNhbGx5IGdsdWVzIHRoZSAucG9kIGZpbGVzIHRvIHRoZSByZXNwZWN0aXZlIC5wbQpmaWxlcywgc28gb25lIGNhbiB1c2UgcGVybGRvYyBvbiAucG0gZmlsZXMgdG8gcmVhZCB0aGUKZG9jdW1lbnRhdGlvbi4gW1N0YXNdCgpwcm92aWRlIGEgd29ya2Fyb3VuZCBmb3IgRXh0VXRpbHM6Ok1ha2VNYWtlcjo6bXZfYWxsX21ldGhvZHMsIHNvCk1vZFBlcmw6OkJ1aWxkTU0gYW5kIE1vZFBlcmw6Ok1NIGNhbiBvdmVycmlkZSBFVTo6TU0gbWV0aG9kcyBiZWhpbmQKdGhlIHNjZW5lcy4gW1N0YXNdCgphZGRpbmcgTW9kUGVybDo6QnVpbGRNTSwgd2hpY2ggaXMgbm93IHVzZWQgZm9yIGJ1aWxkaW5nIG1vZF9wZXJsLgpNb2RQZXJsOjpNTSB3aWxsIGJlIHVzZWQgZm9yIDNyZCBwYXJ0eSBtb2R1bGVzLiBNb2RQZXJsOjpCdWlsZE1NCnJldXNlcyBNb2RQZXJsOjpNTSB3aGVyZSBwb3NzaWJsZS4gW1N0YXNdCgpkcm9wIHRoZSBnbHVlIGNvZGUgZm9yIGFwcl9nZW5lcmF0ZV9yYW5kb21fYnl0ZXMsIHNpbmNlIGl0J3Mgbm90CmF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zLiBbU3Rhc10KClNpbmNlIG5vbi10aHJlYWRlZCBtcG1zIGRvbid0IHVzZSB0aXBvb2xzIGluIG1pcHMsIGRvbid0IGNyZWF0ZSBhbmQKZGVzdHJveSB0aGVtLiBbU3Rhc10KCnJlLXVzZSB0aGUgd29ya2Fyb3VuZCBmb3IgZ2xpYmMvUGVybC01LjguMCBjcnlwdCgpIGJ1ZyBmb3IgdGhlCm1haW4vdmhvc3QgYmFzZSBwZXJsIGludGVycHJldGVycyBhcyB3ZWxsLiBUaGlzIHNvbHZlcyB0aGUgcHJvYmxlbSBmb3IKdGhlIGJ1Z2d5IGdsaWJjIG9uIFJIOC4wLiBbU3Rhc10KCnNlbmRfY2dpX2hlYWRlciBub3cgdHVybnMgdGhlIGhlYWRlciBwYXJzaW5nIG9mZiBhbmQgY2FuIHNlbmQgYW55IGRhdGEKYXR0YWNoZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlIGhlYWRlcnMgYXMgYSByZXNwb25zZSBib2R5LiBbU3Rhc10KCm1vdmUgdGhlIGNoZWNrIHRoYXQgcHJpbnQvcHJpbnRmL3B1dHMvd3JpdGUvZXRjIGFyZSBjYWxsZWQgaW4gdGhlCnJlc3BvbnNlIHBoYXNlIGludG8gdGhlIGZ1bmN0aW9ucyB0aGVtc2VsdmVzIHNvIDEpIHdlIGNhbiBwcmludCBhIG1vcmUKdXNlZnVsIGVycm9yIG1lc3NhZ2UgMikgdGhpcyBjaGVjayBpcyBub3QgYWx3YXlzIG5lZWRlZCBpbgptb2RwZXJsX3didWNrZXRfd3JpdGUsIHdoZW4gY2FsbGVkIGludGVybmFsbHksIHNvIHdlIHNhdmUgc29tZSBjeWNsZXMuCltTdGFzXQoKYWRkIGNoZWNrcyB0aGF0IHByaW50L3ByaW50Zi9wdXRzL3dyaXRlL2V0YyBhcmUgY2FsbGVkIGluIHRoZSByZXNwb25zZQpwaGFzZS4gbW92ZSB0aGUgY2hlY2sgaW50byB0aGUgZnVuY3Rpb25zIHRoZW1zZWx2ZXMgc28gd2UgY2FuIHByaW50IGEKbW9yZSB1c2VmdWwgZXJyb3IgbWVzc2FnZSBbU3Rhc10KCidtYWtlIGluc3RhbGwnIG5vdyBpbnN0YWxscyBtb2RfcGVybCpoIGZpbGVzIHVuZGVyIGh0dHBkJ3MgaW5jbHVkZQp0cmVlIFtTdGFzXQoKV2hlbiBQZXJsT3B0aW9ucyArUGFyc2VIZWFkZXJzIGlzIGFuIGVmZmVjdCwgdGhlIENHSSBoZWFkZXJzIHBhcnNpbmcKd29uJ3QgYmUgZG9uZSBpZiBhbnkgKm1vZF9wZXJsKiBoYW5kbGVyIGJlZm9yZSBhbmQgaW5jbHVkaW5nIHRoZQpyZXNwb25zZSBwaGFzZSwgc2V0cyAkci0+Y29udGVudF90eXBlLiAgKHNpbWlsYXIgYmVoYXZpb3IgdG8gbXAxJ3MKc2VuZF9odHRwX2hlYWRlcigpIFtTdGFzXQoKUmVnaXN0cnk6IG1ha2Ugc3VyZSB0aGF0ICRyIGlzIG5vdCBpbiB0aGUgc2NvcGUgd2hlbiB0aGUgc2NyaXB0IGlzCmNvbXBpbGVkIFtTdGFzXQoKJEFwYWNoZTo6U2VydmVyOjpTYXZlQ29uZmlnIGFkZGVkLiBXaGVuIHNldCB0byBhIHRydWUgdmFsdWUsCndpbGwgbm90IGNsZWFyIHRoZSBjb250ZW50IG9mIEFwYWNoZTo6UmVhZENvbmZpZzo6IG9uY2UgPFBlcmwgPgpzZWN0aW9ucyBhcmUgcHJvY2Vzc2VkLiBbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnXQoKQXBhY2hlOjpjb21wYXQ6IHN1cHBvcnQgMS4wJ3MgQXBhY2hlLT5wdXNoX2hhbmRsZXJzLApBcGFjaGUtPnNldF9oYW5kbGVycyBhbmQgQXBhY2hlLT5nZXRfaGFuZGxlcnMgW1N0YXNdCgpyZXZhbXAgdGhlIGNvZGUgaGFuZGxpbmcgb3V0cHV0IGZsdXNoaW5nIGFuZCBmbHVzaCBidWNrZXQKc2VuZGluZy4gTmFtZWxseSBtb2RwZXJsX3didWNrZXRfZmx1c2ggYW5kIG1vZHBlcmxfd2J1Y2tldF9wYXNzIG5vdwpjYW4gYmUgdG9sZCB0byBzZW5kIGEgZmx1c2ggYnVja2V0IGJ5IHRoZW1zZWx2ZXMsIGF0dGFjaGluZyBpdCB0byB0aGUKZGF0YSBiYiB0aGV5IGFyZSBhbHJlYWR5IHNlbmRpbmcuIFRoaXMgaGFsZnMgdGhlIG51bWJlciBvZiBvdXRwdXQKZmlsdGVyIGludm9jYXRpb25zIHdoZW4gdGhlIHJlc3BvbnNlIGhhbmRsZXIgZmx1c2hlcyBvdXRwdXQgdmlhICR8IG9yCnJmbHVzaC4gYWRqdXN0IHRlc3RzLCB3aGljaCB3ZXJlIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgaW52b2NhdGlvbnMuCltTdGFzXQoKbW92ZSBNb2RQZXJsOjpSZWdpc3RyeUNvb2tlciB0byB1c2UgYSBoYXNoIGFzIG9iamVjdCAoc2ltaWxhciB0byBtcDEpLAp0byBtYWtlIGl0IGVhc2llciB0byBzdWJjbGFzcy4gW05hdGhhbiBCeXJkIDxuYXRoYW5AYnlyZC5uZXQ+XQoKJHItPnJmbHVzaCBoYXMgdG8gZmx1c2ggaW50ZXJuYWwgbW9kcGVybCBidWZmZXIgYmVmb3JlIGNhbGxpbmcKYXBfcmZsdXNoLCBzbyBpbXBsZW1lbnQgcmZsdXNoLCBpbnN0ZWFkIG9mIGF1dG9nZW5lcmF0aW5nIHRoZSB4cyBjb2RlCmZvciBpdC4gW1N0YXNdCgpmaXggdGhlIGlucHV0IGZpbHRlcnMgaGFuZGxpbmcgb2YgREVDTElORUQgaGFuZGxlcnMgKGNvbnN1bWUgdGhlIGRhdGEsCm9uIGJlaGFsZiBvZiB0aGUgaGFuZGxlcikgKyB0ZXN0cyBbU3Rhc10KCmZpeCB0aGUgY29kZSB0aGF0IGF1dG9nZW5lcmF0ZXMgbW9kcGVybF9sYXJnZWZpbGVzLmggbm90IHRvIGRlZmluZQptYWNyb3MgbWF0Y2hpbmcgbS9eLS8gKHdhcyBhIHByb2JsZW0gb24gYWl4LTQuMy4zKSBbU3Rhc10KCiRBcGFjaGU6OlNlcnZlcjo6U3RyaWN0UGVybFNlY3Rpb25zIGFkZGVkLiBXaGVuIHNldCB0byBhIHRydWUKdmFsdWUsIHdpbGwgYWJvcnQgc2VydmVyIHN0YXJ0dXAgaWYgdGhlcmUgYXJlIHN5bnRheCBlcnJvcnMKaW4gPFBlcmwgPiBzZWN0aW9ucyBbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnXQoKVXNlIFdpbjMyOjpHZXRTaG9ydFBhdGhOYW1lIGZvciBXaW4zMiB0byBoYW5kbGUgY2FzZXMgd2hlbgp0aGUgc3VwcGxpZWQgTVBfQVBfUFJFRklYIGNvbnRhaW5zIHNwYWNlcy4gW1JhbmR5IEtvYmVzXQoKQnVtcCB1cCBUaHJlYWRzUGVyQ2hpbGQgZm9yIG1wbV93aW5udCBpbiBodHRwZC5jb25mLCB3aGljaCBzZWVtcyAKdG8gaGVscCBhdm9pZCBzZXJ2ZXIgc3RhcnR1cCBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLgpbUmFuZHkgS29iZXNdCgppbXBsZW1lbnQgYSBuZXcgaGVscGVyIG1vZHVsZSBNb2RQZXJsOjpNZXRob2RMb29rdXAgdG8gaGVscCBmaWd1cmUgb3V0CndoaWNoIG1vZHVsZSBzaG91bGQgYmUgbG9hZGVkIHdoZW4gYSBjZXJ0YWluIG1ldGhvZCBpcyByZXBvcnRlZCB0byBiZQptaXNzaW5nLiBbU3Rhc10KCmZpeCBhIGJ1ZyBmb3IgYXByIDwgMC45LjMsIHdoZXJlIGl0IHNlZ2ZhdWx0cyBpbiBhcHJfdXJpX3VucGFyc2UsIGlmCmhvc3RuYW1lIGlzIHNldCwgYnV0IG5vdCB0aGUgc2NoZW1lLiBJbiBjYXNlIHRoZSBob3N0bmFtZSBpcyBkZWZpbmVkCmJ1dCBzY2hlbWUgaXMgbm90IEFwYWNoZTo6Y29tcGF0IHdpbGwgZGVmYXVsdCB0byB0aGUgJ2h0dHAnIHNjaGVtZSwKd2hlcmVhcyBBUFI6OlVSSTo6dW5wYXJzZSBwcm92aWRlcyBubyBkZWZhdWx0IFtTdGFzXQoKbW92ZSAkci0+c2VuZF9odHRwX2hlYWRlciBpbXBsZW1lbnRhdGlvbiB0byBBcGFjaGU6OmNvbXBhdC4gIFRoaXMKYWxsb3dzIHRoZSAxLjAgY29kZSB0byBydW4gdW5tb2RpZmllZCBpZiAkci0+c2VuZF9odHRwX2hlYWRlciBpcwpjYWxsZWQgYmVmb3JlIHRoZSByZXNwb25zZSBjaGFuZ2UuIHdlIGFscmVhZHkgaGFuZGxlIHRoZSBjaGVjayB3aGV0aGVyCmNvbnRlbnRfdHlwZSB3YXMgc2V0LCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdGhlIGhlYWRlcnMgYXJlIHRvIGJlCnBhcnNlZCBpbnNpZGUgbW9kcGVybF93YnVja2V0X3Bhc3MoKS4gW1N0YXNdCgpmaXhlcyB0byBBcGFjaGU6OmNvbXBhdC4gbWFrZSAkci0+Y29ubmVjdGlvbi0+YXV0aF90eXBlIGludGVyZmFjZQp3aXRoIHItPmFwX2F1dGhfdHlwZS4gbWFrZSBib3RoICRyLT5jb25uZWN0aW9uLT5hdXRoX3R5cGUgYW5kCiRyLT5jb25uZWN0aW9uLT51c2VyIHdyaXRhYmxlLiBbR2VvZmZyZXkgWW91bmddCgpPcGVuIHVwIHItPmFwX2F1dGhfdHlwZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHdyaXRlIGN1c3RvbQphdXRoZW4gaGFuZGxlcnMgdGhhdCBkb24ndCByZWx5IG9uIEJhc2ljIGF1dGhlbnRpY2F0aW9uIG9yCml0J3MgYXNzb2NpYXRlZCBhcF8qIGZ1bmN0aW9ucy4KW0dlb2ZmcmV5IFlvdW5nXQoKYWRkIEFwYWNoZTo6QnVuZGxlMiBbU3Rhc10KCkFwYWNoZTo6UmVsb2FkIG5vdyBzdXBwb3J0cyB0aGUgUGVybFByZUNvbm5lY3Rpb25IYW5kbGVyIGludm9jYXRpb24KbW9kZSwgc28gY29ubmVjdGlvbiBmaWx0ZXIgYW5kIHByb3RvY29sIG1vZHVsZXMgY2FuIGJlIGF1dG9tYXRpY2FsbHkKcmVsb2FkZWQgb24gY2hhbmdlLiBbU3Rhc10KCmltcGxlbWVudCBBcGFjaGU6OmN1cnJlbnRfY2FsbGJhY2sgKyAkci0+Y3VycmVudF9jYWxsYmFjayBnb2VzIGludG8KQXBhY2hlOjpjb21wYXQsIHNpbmNlIG5vdyB3ZSBoYXZlIGEgd2F5IHRvbyBtYW55IGNhbGxiYWNrcyB1bnJlbGF0ZWQKdG8gJHIgW1N0YXNdCgpBZGQgQXBhY2hlOjpjb21wYXQgbWV0aG9kczogJHItPmNvbm5lY3Rpb24tPmF1dGhfdHlwZSBhbmQKJHItPmNvbm5lY3Rpb24tPnVzZXIgKHJlcXVpcmVzICdQZXJsT3B0aW9ucyArR2xvYmFsUmVxdWVzdCcpICsgdGVzdHMKW1N0YXNdCgpTZXZlcmFsIGlzc3VlcyByZXNvbHZlZCB3aXRoIHBhcnNpbmcgaGVhZGVycywgaW5jbHVkaW5nIG1ha2luZyB3b3JrCnRoZSBoYW5kbGVycyBjYWxsaW5nICRyLT5jb250ZW50X3R5cGUoKSBhbmQgbm90IHNlbmRpbmcgcmF3IGhlYWRlcnMsCndoZW4gdGhlIGhlYWRlcnMgc2Nhbm5pbmcgaXMgdHVybmVkIG9uLiBMb3RzIG9mIHRlc3RzIGFkZGVkIHRvCmV4ZXJjaXNlIGRpZmZlcmVudCBzaXR1YXRpb25zLiBbU3Rhc10KCndhcm4gb24gdXNpbmcgLVQgaW4gTW9kUGVybDo6UmVnaXN0cnkgc2NyaXB0cyB3aGVuIG1vZF9wZXJsIGlzIG5vdApydW5uaW5nIHdpdGggLVQgW1N0YXNdCgpwZXJsIDUuNy4zKyBoYXMgYSBidWlsdC1pbiAke15UQUlOVH0gdG8gdGVzdCB3aGV0aGVyIGl0J3MgcnVubmluZwp1bmRlciAtKFR8dCkuIEJhY2twb3J0ICR7XlRBSU5UfSBmb3IgbW9kX3BlcmwgcnVubmluZyB1bmRlcgo1LjYuMC01LjcuMywgKHdoYXQgdXNlZCB0byBiZSAkQXBhY2hlOjpfX1QuICAkQXBhY2hlOjpfX1QgaXMgYXZhaWxhYmxlCnRvbywgYnV0IGRlcHJlY2F0ZWQuIFtTdGFzXQoKYWRkIFBlcmxDaGlsZEV4aXRIYW5kbGVyIGltcGxlbWVudGF0aW9uIFtTdGFzXQoKYWRkIFBlcmxDbGVhbnVwSGFuZGxlciBpbXBsZW1lbnRhdGlvbiArIHRlc3QgW1N0YXNdCgpkaWUgd2hlbiBBcGFjaGUtPnJlcXVlc3QgcmV0dXJucyBub3RoaW5nICgnUGVybE9wdGlvbnMgLUdsb2JhbFJlcXVlc3QnCm9yICdTZXRIYW5kbGVyIG1vZHBlcmwnKSBbU3Rhc10KCk5ldyBBcGFjaGU6OkRpcmVjdGl2ZSBtZXRob2RzOiBhc19oYXNoKCksIGxvb2t1cCgpICsgdGVzdHMgKyBkb2NzCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKU3RhY2tlZCBoYW5kbGVycyBjaGFpbiBleGVjdXRpb24gaXMgbm93IGFib3J0ZWQgd2hlbiBhIGhhbmRsZXIgcmV0dXJucwpzb21ldGhpbmcgb3RoZXIgdGhhbiBPSyBvciBERUNMSU5FRCBbU3Rhc10KCm1ha2UgJGZpbHRlci0+cmVhZCgpIGluIGlucHV0IHN0cmVhbWluZyBmaWx0ZXJzLCB1c2UgdGhlIHNhbWUgbnVtYmVyCm9mIGFyZ3VtZW50cyBhcyByZWFkKCkgaW4gdGhlIG91dHB1dCBmaWx0ZXJzLiBbU3Rhc10KCkltcGxlbWVudCAkci0+YWRkX2lucHV0X2ZpbHRlciBhbmQgJHItPmFkZF9vdXRwdXRfZmlsdGVyCiAgICAgICAgICAkYy0+YWRkX2lucHV0X2ZpbHRlciBhbmQgJGMtPmFkZF9vdXRwdXRfZmlsdGVyCmFuZCBhZGQgdGVzdHMgIFtTdGFzXQoKU2tpcCB0aGUgaGFuZGxlciBwYWNrYWdlOjpmdW5jIHJlc29sdmluZyBlcnJvciwgb25seSB3aGVuIHRoZSBlcnJvcgptZXNzYWdlIG1hdGNoZXMgIkNhbid0IGxvY2F0ZSAuKj8gaW4gQElOQyIsIHJhdGhlciB0aGFuIGp1c3QgIkNhbid0CmxvY2F0ZSIsIHNpbmNlIHRoZXJlIGFyZSBtYW55IG90aGVyIGVycm9ycyB0aGF0IHN0YXJ0IHdpdGggdGhhdApzdHJpbmcuIFtTdGFzXQoKdGhlIHRvcCBsZXZlbCAnbWFrZSB0ZXN0JyBub3cgZGVzY2VuZHMgaW50byB0aGUgTW9kUGVybC1SZWdpc3RyeSBkaXIKdG8gcnVuICdtYWtlIHRlc3QnIHRoZXJlIFtTdGFzXQoKQWxsIHJlc3BvbnNlIGZ1bmN0aW9ucyBhcmUgbm93IHJldHVybmluZyBzdGF0dXMgYW5kIHRoZSBjYWxsZXJzIGNoZWNrCmFuZCBjcm9hayBvbiBmYWlsdXJlIG9yIHByb2dhdGUgdGhlbSBmdXJ0aGVyLiBbU3Rhc10KCk9QRU4sIENMT1NFIGFuZCBGSUxFTk8gaW1wbGVtZW50YXRpb24gZm9yIEFwYWNoZTo6UmVxdWVzdFJlYyBbU3Rhc10KCkFub3RoZXIgZml4IGZvciB0aGUgaGFuZGxpbmcgb2YgdGhlIHJldHVybiBzdGF0dXMgaW4KTW9kUGVybDo6UmVnaXN0cnlDb29rZXI6IHJlc2V0IHRoZSBzdGF0dXMgdG8gdGhlIG9yaWdpbmFsIG9uZSBvbmx5IGlmCml0IHdhcyBjaGFuZ2VkIGJ5IHRoZSBzY3JpcHQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGV4ZWN1dGlvbiBzdGF0dXMKW1N0YXNdCgpwcmV2ZW50IHNlZ2ZhdWx0IGluICRyLT5wcmludCAvICRmaWx0ZXItPnByaW50IChpbiBvdXRwdXQgZmlsdGVyKSBhbmQKcmVsYXRlZCBmdW5jdGlvbnMgd2hlbiB0aGV5IGFyZSBjYWxsZWQgYmVmb3JlIHRoZSByZXNwb25zZSBwaGFzZQpbU3Rhc10KCnByZXZlbnQgc2VnZmF1bHQgaW4gc2VuZF9odHRwX2hlYWRlciB3aGVuIGl0J3MgY2FsbGVkIGJlZm9yZSB0aGUKcmVzcG9uc2UgcGhhc2UgW1N0YXNdCgppbnB1dCBzdHJlYW0gZmlsdGVyaW5nIHN1cHBvcnQgd2FzIGFkZGVkICsgdGVzdHMgKHBsdXMgcmVuYW1pbmcgZmlsdGVyCnRlc3RzIHNvIHdlIGNhbiBrbm93IGZyb20gdGhlIHRlc3QgbmFtZSB3aGF0IGtpbmQgb2YgZmlsdGVyIGlzIHRlc3RlZCkKW1N0YXNdCgpBZGQgcHJvcGVyIHN1cHBvcnQgZm9yIG1pcy1iZWhhdmVkIGZlZWRpbmcgZmlsdGVycyB0aGF0IHNlbmQgbW9yZSB0aGFuCm9uZSBFT1MgYnVja2V0IGluIHN0cmVhbWluZyBmaWx0ZXJzICsgdGVzdC4gW1N0YXNdCgpwcmV2ZW50IGEgc2VnZmF1bHQgd2hlbiBwdXNoX2hhbmRsZXJzIGFyZSB1c2VkIHRvIHB1c2ggYSBoYW5kbGVyIGludG8KdGhlIGN1cnJlbnRseSBwaGFzZSBhbmQgc3dpdGNoaW5nIHRoZSBoYW5kbGVyIChwZXJsLXNjcmlwdC9tb2RwZXJsKSArCnRlc3RzIFtTdGFzXQoKQWRkICRmaWx0ZXItPnNlZW5fZW9zIHRvIHRoZSBzdHJlYW1pbmcgZmlsdGVyIGFwaSB0byBrbm93IHdoZW4gZW9zIGhhcwpiZWVuIHNlZW4sIHNvIHNwZWNpYWwgc2lnbmF0dXJlcyBjYW4gYmUgcGFzc2VkIGFuZCBhbnkgZGF0YSBzdG9yZWQgaW4KdGhlIGNvbnRleHQgZmx1c2hlZCArIHRlc3RzLiBbU3Rhc10KCkFkZCAkZmlsdGVyLT5jdHggdG8gbWFpbnRhaW4gc3RhdGUgYmV0d2VlbiBmaWx0ZXIgaW52b2NhdGlvbiArIHRlc3RzCltTdGFzXQoKUmVxdWVzdCBpbnB1dCBhbmQgb3V0cHV0IGZpbHRlcnMgYXJlIG5vdyBnZXR0aW5nIHRoZSBFT1MgYnVja2V0LCB3aGljaAp3YXNuJ3QgcGFzc2VkIHRocm91Z2ggYmVmb3JlLiBOb3cgdGhlIGNvbnRleHQgY2FuIGJlIGZsdXNoZWQgb24KRU9TLiBbU3Rhc10KCgoKPWl0ZW0gMS45OV8wOCAtIEphbnVhcnkgMTAsIDIwMDMKCkNvcnJlY3QgTW9kUGVybDo6UmVnaXN0cnlDb29rZXIgdG8gcmVzZXQgJUlOQywgYWZ0ZXIgY29tcGlsZSBmb3IgLnBsCmZpbGVzIHdoaWNoIGRvbid0IGRlY2xhcmUgdGhlIHBhY2thZ2UgKyBhZGQgdGVzdHMgdG8gY2hlY2sgdGhhdCBbU3Rhc10KCkxvZyB0aGUgcmVhbCBlcnJvciBtZXNzYWdlIHdoZW4gRm9vOjpCYXI6OnN1Yl9uYW1lIGZhaWxzIHRvIHJlc29sdmUsCmJlY2F1c2Ugb2YgYSBwcm9ibGVtIGluIEZvbzo6QmFyLCB3aGVuIEZvbzo6QmFyICp3YXMqIGZvdW5kIFtTdGFzXQoKQWRkIFBlcmxQcmVDb25uZWN0aW9uSGFuZGxlciBzdXBwb3J0IGluIEFwYWNoZTo6VGVzdCBbU3Rhc10KCkVuYWJsZSBQZXJsUHJlQ29ubmVjdGlvbkhhbmRsZXIgW1N0YXNdCgpTdXBwb3J0IHRoZSBIb3N0OiByZXF1ZXN0IGhlYWRlciBpbiBBcGFjaGU6OlRlc3RDbGllbnQgW1N0YXNdCgpyZXN0b3JlIHRoZSBNb2RQZXJsOjpSZWdpc3RyeUxvYWRlcjo6bmV3KCkgbWV0aG9kIGZvciBiYWNrd2FyZHMKY29tcGF0aWJpbGl0eSAgW1N0YXNdCgpwb3J0IHRoZSBzdXBwb3J0IGZvciBOYW1lV2l0aFZpcnR1YWxIb3N0IGluIE1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyCmFuZCBNb2RQZXJsOjpSZWdpc3RyeUxvYWRlciBbU3Rhc10KCmZpeCB0aGUgaGFuZGxpbmcgb2YgdGhlIHJldHVybiBzdGF0dXMgaW4gTW9kUGVybDo6UmVnaXN0cnlDb29rZXIsIGFkZAphIHRlc3QgdG8gdmVyaWZ5IHRoYXQgW1N0YXNdCgp1bmRlciBub24tdGhyZWFkZWQgcGVybCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgbW9kX3BlcmwgaXMgcnVubmluZywKd2hlbiBtb2RwZXJsX3Zob3N0X2lzX3J1bm5pbmcgY2hlY2sgaXMgZG9uZS4gW1N0YXNdCgpmaXggJHItPnJlYWQgdG8gcmVhZCBhbGwgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpZiBwb3NzaWJsZSwKYWRqdXN0IHRoZSB0ZXN0IFRlc3RBcGFjaGU6OnJlYWQgdG8gdmVyaWZ5IHRoYXQgW1N0YXNdCgpmaXggdGhlIG1ldGhvZCBjb250ZW50KCkgaW4gQXBhY2hlOjpjb21wYXQgdG8gcmVhZCBhIHdob2xlIHJlcXVlc3QKYm9keS4gc2FtZSBmb3IgTW9kUGVybDo6VGVzdDo6cmVhZF9wb3N0LiBhZGQgdGVzdHMuICBbU3Rhc10KCkFkanVzdCB0aGUgcmV2ZXJzZSBmaWx0ZXIgdGVzdCB0byB3b3JrIG9uIHdpbjMyIChyZW1vdmUgdHJhaWxpbmcgXHIpCltSYW5keSBLb2JlcyA8cmFuZHlAdGhlb3J5eDUudXdpbm5pcGVnLmNhPl0KClN0cm9uZ2x5IHN1Z2dlc3Qgd2luMzIgdXNlcnMgdG8gdXBncmFkZSB0byA1LjguMCwgaWYgdGhleSBydW4gNS42LngKW1JhbmR5IEtvYmVzIDxyYW5keUB0aGVvcnl4NS51d2lubmlwZWcuY2E+XQoKV2hlbiBpbnN0YWxsaW5nIHRoZSBtb2RfcGVybCBzaGFyZWQgb2JqZWN0LCBmaXJzdCBuZWVkIHRvIGNoZWNrCndoZXRoZXIgdGhlIGRpcmVjdG9yeSAnbW9kdWxlcycgYWxyZWFkeSBleGlzdHMsIGFuZCBjcmVhdGUgaXQgaWYgbm90LgpbUmFuZHkgS29iZXMgPHJhbmR5QHRoZW9yeXg1LnV3aW5uaXBlZy5jYT5dCgpBZGQgYSBjYXBhYmlsaXR5IHRvIHR1bmUgdGhlIHRlc3QgY29uZmlndXJhdGlvbiBzZWN0aW9ucyBvcmRlcmluZwppbiBBcGFjaGU6OlRlc3RDb25maWdQZXJsIFtTdGFzIEJla21hbl0KCmZpeCB0aGUgY29tcGxhaW5pbmcgY29kZSBhYm91dCBsYXRlIFBlcmxTd2l0Y2hlcyB3aGVuIFBlcmxMb2FkTW9kdWxlCmlzIHVzZWQgYmVmb3JlIGl0IFtTdGFzIEJla21hbl0KCmFkZCB2YXJpb3VzIHRlc3RzIHRoYXQgZXhlcmNpc2UgUGVybExvYWRNb2R1bGUgYW5kIHZob3N0cwpbU3RhcyBCZWttYW5dCgpoYW5kbGUgY29ycmVjdGx5IFBlcmxMb2FkTW9kdWxlcyAoZGlyZWN0aXZlcykgd2l0aCB2aG9zdHM6CiAgLSBoYW5kbGUgZ3JhY2VmdWxseSBjYXNlcyB3aGVuIHRoaW5ncyBhcmUgdW5kZWYvTlVMTAogIC0gaGFuZGxlIHRoZSBjYXNlIHdoZW4gc2NmZz09TlVMTCwgYnkgc3RlYWxpbmcgdGhlIGJhc2Vfc2VydmVycydzIGNvbmZpZwpbU3RhcyBCZWttYW5dCgptYWtlIG1vZF9wZXJsIHdvcmsgd2l0aCB2aG9zdHMgd2hlbiB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgcHJpb3IgdG8KICBwb3N0X2NvbmZpZygpOgogIC0gY2FsbCBtb2RwZXJsX2luaXRfZ2xvYmFscyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgYmVjYXVzZSB0aGUgbWFpbiBzZXJ2ZXIKICAgIHJlY29yZCBpcyBuZWVkZWQgZHVyaW5nIHRoZSBjb25maWd1cmF0aW9uIHBhcnNpbmcsIGZvciBwZXJsbG9hZG1vZHVsZQogICAgYW5kIHZob3N0cwogIC0gYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgYSByZWFsIGJhc2Vfc2VydmVyLCB3aGVuIGRlYWxpbmcKICAgIHdpdGggbW9kcGVybF9pbml0LCBhbmQgaWYgbm90IHJldHJpZXZlIGl0IGZyb20gdGhlIGdsb2JhbCByZWNvcmQKW1N0YXMgQmVrbWFuXQoKcHJldmVudCBzZWdmYXVsdHMsIHdoZW4gc2NmZyBpcyBOVUxMIGluIEFwYWNoZTo6TW9kdWxlLT5nZXRfY29uZmlnKCk7CltTdGFzIEJla21hbl0KCmVuc3VyZSB0aGF0IGEgY29yZSBmaWxlIGlzIGEgZmlsZSBpbmRlZWQsIGJlZm9yZSBjb21wbGFpbmluZyBbUGhpbGlwcGUKTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCmFkZCAkci0+YXNfc3RyaW5nIFtHZW9mZnJleSBZb3VuZ10KCmFkZCBiYWNrY29tcGF0IHZhcnM6ICRBcGFjaGU6OlNlcnZlcjo6Q1dEIGFuZAokQXBhY2hlOjpTZXJ2ZXI6OkFkZFBlcmxWZXJzaW9uIFtTdGFzIEJla21hbl0KCmVudiB2YXIgTU9EX1BFUkxfVFJBQ0UgaXMgd29ya2luZyBhZ2FpbiBbU3RhcyBCZWttYW5dCgphZGQgYSBuZXcgdGVzdCBUZXN0RGlyZWN0aXZlOjpwZXJsbG9hZG1vZHVsZTIsIHdoaWNoIHBlcmZvcm1zIGEgbW9yZQpldm9sdmVkIG1lcmdpbmcuICBbU3RhcyBCZWttYW5dCgpmaXggQXBhY2hlOjpUZXN0Q29uZmlnUGVybCB1bmRlciBtb2RfcGVybCAxLjAsIG5lZWQgdG8gcmVxdWlyZQptb2RfcGVybC5wbSBiZWZvcmUgdXNpbmcgJG1vZF9wZXJsOjpWRVJTSU9OIFtHZW9mZnJleSBZb3VuZ10KCmFkZCBhbiBBcGFjaGU6OlNJRyBiYWNrY29tcGF0IHN0dWIgdG8gQXBhY2hlOjpjb21wYXQgW1N0YXMgQmVrbWFuXQoKZml4IHRoZSBBcGFjaGU6OlRlc3RDb25maWdQZXJsJ3MgcnVuX2FwYWNoZV90ZXN0X2NvbmZpZygpIGZ1bmN0aW9uCndoZXJlIHRlc3QgcGFja2FnZXMgYXJlIHNjYW5uZWQgZm9yIHRoZSBtYWdpYyBBUEFDSEVfVEVTVF9DT05GSUdVUkUKYW5kIGlmIGZvdW5kIGdldCByZXF1aXJlKCknZC4gQXBhY2hlMiBuZWVkcyB0byBiZSBydW4gZm9yIG1vZF9wZXJsCjIuMC4gIFtTdGFzIEJla21hbl0KCm1vdmUgdGhlIGN1c3RvbSBtb2RfcGVybCAyLjAgY29uZmlndXJhdGlvbiBiaXRzIG91dCBvZiB0aGUKTW9kUGVybDo6VGVzdFJ1biwgd2hlcmUgdGhleSBkb24ndCBiZWxvbmcsIGludG8gYSBzcGVjaWFsIGNvbmZpZyBmaWxlCndoaWNoIGlzIGluY2x1ZGVkIGF0IHRoZSB2ZXJ5IGVuZCBvZiBodHRwZC5jb25mIFtTdGFzIEJla21hbl0KCmV4dGVuZCBBcGFjaGU6OlRlc3QgdG8gYWxsb3cgZXh0cmEgY29uZmlndXJhdGlvbiBmaWxlcyB0byBiZSBpbmNsdWRlZAphdCB0aGUgdmVyeSBlbmQgb2YgaHR0cGQuY29uZiwgd2hlbiBldmVyeXRoaW5nIHdhcyBsb2FkZWQgYW5kCmNvbmZpZ3VyZWQgW1N0YXMgQmVrbWFuXQoKcmVzb2x2ZSBhIHNlZ2ZhdWx0IGluIEFwYWNoZTo6TW9kdWxlOjpnZXRfY29uZmlnKCkgZm9yIHRoZSBlZGdlIGNhc2UKd2hlbiB0aGUgcGFja2FnZSBuYW1lIGlzIGJvZ3VzLiBbU3RhcyBCZWttYW5dCgpBcGFjaGU6OlJlbG9hZDogYWRkIHN1cHBvcnQgZm9yIHdhdGNoaW5nIGFuZCByZWxvYWRpbmcgbW9kdWxlcyBvbmx5IGluCnNwZWNpZmllZCBzdWItZGlycyBbSGFycnkgRGFuaWxldnNreSA8aGFycnlAZGVlcmZpZWxkY2FwaXRhbC5jb20+XQoKZW5hYmxlIEFQUi5wbSdzIGxpbmtpbmcgZm9yIGFwciAwLjkuMiBhbmQgaGlnaGVyLCB3aGljaCB1c2VzIGEgbmV3IGxpYgpuYW1pbmcgc2NoZW1lLCBzdWNoIGFzIGxpYmFwci0wLnNvLjAuOS4yLCBvbmx5IGlmIGFwci1jb25maWcgYW5kCmFwdS1jb25maWcgc2NyaXB0cyBleGlzdC4gW1N0YXMgQmVrbWFuXQoKZGVmaW5lIElvVFlQRV9SRE9OTFkvSW9UWVBFX1dST05MWSBmb3IgcGVybC01LjYuMCBzbyB0aGUgcHJvamVjdApjb21waWxlcyBhZ2FpbiB1bmRlciA1LjYuMCBbU3RhcyBCZWttYW5dCgphbGxvdyBvdXRwdXQgc3RyZWFtaW5nIGZpbHRlcnMgdG8gYXBwZW5kIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtCltTdGFzIEJla21hbl0KCmZpeGVzIHRvIGNvbXBpbGUgd2l0aCBBY3RpdmVQZXJsIDUuOCBiZXRhCltSYW5keSBLb2JlcyA8cmFuZHlAdGhlb3J5eDUudXdpbm5pcGVnLmNhPl0KCmZpeCBmb3IgZGlyZWN0aXZlIGhhbmRsZXJzIHdpdGhpbiB2aG9zdHMgdXNpbmcgdGhyZWFkZWQgTVBNcwpbU3RlcGhlbiBDbG91c2UgPHN0ZXBoZW5jQHRoZWlxZ3JvdXAuY29tPl0KCmZpeCA8SWZEZWZpbmUgTU9EUEVSTDI+IHN1cHBvcnQKCmRlZmF1bHQgQXV0aFR5cGUgdG8gQmFzaWMgaWYgbm90IHNldCBpbiAkci0+Z2V0X2Jhc2ljX2F1dGhfcHcoKQpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCndvcmthcm91bmQgZ2xpYmMvUGVybC01LjguMCBjcnlwdCgpIGJ1ZyAoc2VlbiB3aXRoIHRocmVhZGVkIE1QTXMpCgpmaXggZGVsZXRlICRFTlZ7JGtleX0gYnVnCgpmaXggcGFyc2VfYXJncyBjb21wYXQgbWV0aG9kIHRvIHN1cHBvcnQgbm9uLWFzY2lpIGNoYXJhY3RlcnMgYW5kIHRyLysvIC8KW1dhbGVyeSBTdHVkZW5uaWtvdiA8ZGVzcGFpckBzYW1hLnJ1Pl0KCmZpeCBwb3N0X2Nvbm5lY3Rpb24gY29tcGF0IG1ldGhvZCB0byBiZWhhdmUgYXMgaXQgZGlkIGluIDEueApbR2VvZmZyZXkgWW91bmddCgphZGQgc3VwcG9ydCBmb3Igc2V0dGluZyAkci0+YXV0aF9uYW1lIGFuZCAkci0+YXV0aF90eXBlCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKYWRkIEFwYWNoZS0+aHR0cGRfY29uZiBjb21wYXQgbWV0aG9kCltQaGlsaXBwZSBNLiBDaGlhc3NvbiA8Z296ZXJAY3Bhbi5vcmc+XQoKYWRkIGRlZmF1bHQgPFBlcmw+IGhhbmRsZXIgQXBhY2hlOjpQZXJsU2VjdGlvbi4KbWFrZSA8UGVybD4gYmxvY2tzIHRvIGJlIEVYRUNfT05fUkVBRCBzbyBhcGFjaGUgZG9lcyBub3QgcGFyc2UgdGhlIGNvbnRlbnRzLgphZGQgIlBlcmwiIGRpcmVjdGl2ZSBmb3IgZ2VuZXJhbCB1c2UgYW5kIGZvciB3aGljaCA8UGVybD4gc2VjdGlvbnMgYXJlCnN0dWZmZWQgaW50by4KW1BoaWxpcHBlIE0uIENoaWFzc29uIDxnb3plckBjcGFuLm9yZz5dCgpyZW5hbWUgb3ZlcmxvYWRlZCBMb2FkTW9kdWxlIGRpcmVjdGl2ZSB0byBQZXJsTG9hZE1vZHVsZSBhbmQgYWRqdXN0CnRoZSB0ZXN0IG5hbWluZwoKCgo9aXRlbSAxLjk5XzA3IC0gU2VwdGVtYmVyIDI1LCAyMDAyCgpmaXggPXBvZCBkaXJlY3RpdmUgdGVzdCBjb25maWcgcHJvYmxlbQpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCgoKPWl0ZW0gMS45OV8wNiAtIFNlcHRlbWJlciAyNSwgMjAwMgoKYWRkIHN1cHBvcnQgZm9yIHBvZCBkaXJlY3RpdmVzICg9cG9kLD1iYWNrLD1jdXQpIGFuZCBfX0VORF9fIGRpcmVjdGl2ZQpbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCnR3ZWFrcyB0byBzdXBwb3J0IFRlc3QucG0gMS4yMSBbUGhpbGlwcGUgTS4gQ2hpYXNzb24gPGdvemVyQGNwYW4ub3JnPl0KCmFkZCAkci0+YWRkX2NvbmZpZyBtZXRob2QgdG8gYWRkIGR5bmFtaWMgY29uZmlndXJhdGlvbiBhdCByZXF1ZXN0IHRpbWUKCmFkZCBBcGFjaGU6OkRJUl9NQUdJQ19UWVBFIGNvbnN0YW50CgphZGQgc3VwcG9ydCBmb3IgZGlyZWN0aXZlIGhhbmRsZXJzCgpmaXggc291cmNlX3NjYW4gdG8gcnVuIHdpdGggY3VycmVudCBodHRwZC9hcHIKCmFkZCBBcGFjaGU6OlNlcnZlci0+YWRkX2NvbmZpZyBtZXRob2QgdG8gYWRkIGR5bmFtaWMgY29uZmlndXJhdGlvbiBhdApzZXJ2ZXIgc3RhcnR1cCB0aW1lCgphZGQgQXBhY2hlOjpEaXJlY3RpdmUtPnRvX3N0cmluZyBtZXRob2QKCmFkZCBzdXBwb3J0IGZvciBwbHVnZ2FibGUgPFBlcmw+IHNlY3Rpb25zCgpmaXggY29tcGlsYXRpb24gcHJvYnMgd2l0aCBnZXRfcmVtb3RlX2hvc3QoKSB0aGF0IGhhZCBhIHdyb25nCnByb3RvdHlwZSBbU3RhcyBCZWttYW5dCgpBcGFjaGU6OlN1YlByb2Nlc3Mgbm93IGhhcyBhIG1hbnBhZ2UgW1N0YXMgQmVrbWFuXQoKZml4IHRoZSBBcGFjaGU6OlN1YlByb2Nlc3MgdGVzdHMgdG8gd29yayB3aXRoIHBlcmxpby1kaXNhYmxlZCBQZXJsCltTdGFzIEJla21hbl0KCmZpeCB0aGUgZmlsZWhhbmRsZSBsZWFrIGluIEFQUjo6UGVybElPIChib3RoIHBlcmxpby1kaXNhYmxlZCBhbmQKcGVybGlvLWVuYWJsZWQgUGVybCkgW1N0YXMgQmVrbWFuXQoKcmVtb3ZlIGR1cCgpIHdoZW4gY29udmVydGluZyBmaWxlaGFuZGxlcyBmcm9tIGFwcl9maWxlX3QgdG8gRklMRSoKdW5kZXIgcGVybGlvLWRpc2FibGVkIFBlcmwgKEFQUjo6UGVybElPKSBbU3RhcyBCZWttYW5dCgpmaXggY29tcGlsYXRpb24gaWYgYXBhY2hlL2FwciBkbyBub3QgaGF2ZSB0aHJlYWQgc3VwcG9ydAoKCgo9aXRlbSAxLjk5XzA1IC0gQXVndXN0IDIwLCAyMDAyCgpmaXggUGVybE9wdGlvbnMgK1BhcnNlSGVhZGVycyB0byBvbmx5IHBhcnNlIG9uY2UgcGVyLXJlcXVlc3QKCmFkZCBleHRlcm5hbCByZWRpcmVjdHMgUmVnaXN0cnkgdGVzdHMgW1N0YXMgQmVrbWFuXQoKZ2V0IHJpZCBvZiB0aGUgY29tcGF0IGxheWVyIGluIE1vZFBlcmwtUmVnaXN0cnkgW1N0YXMgQmVrbWFuXQoKTW9kUGVybDo6UmVnaXN0cnlMb2FkZXIgaXMgbm93IGZ1bGx5IG9wZXJhdGlvbmFsIGFuZCB0ZXN0ZWQgW1N0YXMgQmVrbWFuXQoKUmVnaXN0cnkgbWV0aG9kIGhhbmRsZXJzIGFyZSBub3cgd29ya2luZyBbU3RhcyBCZWttYW5dCgpjb3JlIFJlZ2lzdHJ5IHBhY2thZ2VzIGFsbCBjb21waWxlIHRoZSBzY3JpcHRzIGludG8KTW9kUGVybDo6UmVnaXN0cnlST09UOjogbmFtZXNwYWNlIGFuZCBjYWNoZSB0aGVtIGluCiVNb2RQZXJsOjpSZWdpc3RyeUNhY2hlLiBCb3RoIG92ZXJyaWRhYmxlIGJ5IHRoZSBzdWItY2xhc3Nlcy4gW1N0YXMgQmVrbWFuXQoKY29tcGF0IHRlc3RzIHdlcmUgc3BsaXQgaW50byBncm91cHMgYnkgZnVuY3Rpb25hbGl0eSwgc2VuZF9mZCB0ZXN0Cm1vdmVkIHRvIGNvbXBhdC4gIFtTdGFzIEJla21hbl0KCmFkZGVkICRjLT5nZXRfcmVtb3RlX2hvc3QgYW5kIGEgY29tcGF0IHdyYXBwZXIgJHItPmdldF9yZW1vdGVfaG9zdCArCnRlc3RzIFtTdGFzIEJla21hbl0KCmFkanVzdCB0aGUgYnVpbGQgc3lzdGVtIHRvIHN1cHBvcnQgbW9kX3BlcmwgYnVpbGQgZnJvbSB0aGUgc291cmNlCnRyZWUuIFtTdGFzIEJla21hbl0KCk1vZFBlcmw6OlJlZ2lzdHJ5Q29va2VyIHN5bmNzIHdpdGggbW9kX3BlcmwgMS4wJ3MgcmVnaXN0cnk6CiAtIHByb3RvdHlwZXMgZGVmaW5lZCBjaGVja3MgaW4gZmx1c2hfbmFtZXNwYWNlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1lhaXIgTGVuZ2EgPHlhaXIubGVuZ2FAY2l0aWdyb3VwLmNvbT5dCiAtIHNldCBlcnJvci1ub3RlcyBvbiBlcnJvciBbR2VvZmZyZXkgWW91bmddCiAtIHByZXNlcnZlIHN0YXR1cyBpbiBSZWdpc3RyeSBzY3JpcHRzIFtHZW9mZnJleSBZb3VuZ10KCmFwcl90YWJsZV90IGlzIG5vdyBhbiBvcGFxdWUgdHlwZSwgdXNlIGFwcl90YWJsZV9lbHRzKCkgdG8gZ2V0IHRoZSBhcnJheQpyZWNvcmQgW1N0YXMgQmVrbWFuXQoKYWRkIHN1cHBvcnQgZm9yIHJlZGlyZWN0cyB3aXRoIFBlcmxPcHRpb25zICtQYXJzZUhlYWRlcnMKCmJhY2twb3J0IHRvIDIuMC4zNQoKYWRqdXN0IHRvIGZpbHRlciByZWdpc3RlciBhcGkgY2hhbmdlCgphZGRlZCBBUFI6OlRocmVhZE11dGV4IG1vZHVsZQoKCgo9aXRlbSAxLjk5XzA0IC0gSnVuZSAyMSwgMjAwMgoKdmFyaW91cyBBUFIgUGVybElPIHVwZGF0ZXMgW1N0YXMgQmVrbWFuXQoKc3RvcCB1c2luZyBhbiBhcHJfcG9vbF90IHRvIGFsbG9jYXRlIGl0ZW1zIGZvciB0aGUgaW50ZXJwcmV0ZXIgcG9vbCwKc2FmZXIgZm9yIHRocmVhZGVkIE1QTXMgYW5kIHByZXZlbnRzICJsZWFrcyIgd2hlbiBpbnRlcnByZXRlcnMgYXJlCnJlbW92ZWQgZnJvbSBkdWUgdG8gUGVybEludGVycE1heHtSZXF1ZXN0cyxTcGFyZX0KCmltcGxlbWVudCBtb2RwZXJsX3N5c19kbGNsb3NlKCkgdG8gYXZvaWQgYXByL3Bvb2wgb3ZlcmhlYWQvdGhyZWFkIGlzc3VlcwoKZ2V0IHRoZSAtRFBFUkxfQ09SRSBvcHRpbWl6YXRpb24gd29ya2luZyBhZ2FpbgoKUEVSTF9TRVRfQ09OVEVYVCB0byB0aGUgcGFyZW50IGludGVycHJldGVyIHdoZW4gY2xvbmluZyBpbnRlcnByZXRlcnMgYXQKcmVxdWVzdCB0aW1lLCBlbHNlIGRUSFggbWlnaHQgYmUgTlVMTCBkdXJpbmcgY2xvbmUgaW4gdGhlIGdpdmVuIHRocmVhZCwKd2hpY2ggd291bGQgY3Jhc2ggdGhlIHNlcnZlci4KCgoKPWl0ZW0gMS45OV8wMyAtIEp1bmUgMTUsIDIwMDIKCndpbjMyIGZpeCBmb3IgdGhlIGdsb2JhbCBBcGFjaGUtPnJlcXVlc3Qgb2JqZWN0IHRvIG1ha2Ugc3VyZSBpdCB1c2VzCnRoZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSBtZWNoYW5pc20KCmFkZCBhIHJlZmVyZW5jZSBjb3VudCBtZWNoYW5pc20gdG8gaW50ZXJwcmV0ZXJzIGZvciB1c2UgaW4gdGhyZWFkZWQgTVBNcywKc28gaWYgQVBSOjpQb29sIGNsZWFudXBzIGhhdmUgYmVlbiByZWdpc3RlcmVkIHRoZSBpbnRlcnByZXRlciBpcyBub3QKcHV0YmFjayBpbnRvIHRoZSBpbnRlcnByZXRlciBwb29sIHVudGlsIGFsbCBjbGVhbnVwcyBoYXZlIHJ1bi4KCnVuYnVmZmVyIFNUREVSUiAoYnkgdHVybmluZyBvbiBhdXRvZmx1c2ggYnkgZGVmYXVsdCkKCmFkZCBzdXBwb3J0IGZvciBQZXJsKkhhbmRsZXIgK0FwYWNoZTo6Rm9vCgpmaXggb3Blbl9sb2dzLHBvc3RfY29uZmlnLGNoaWxkX2luaXQgaG9va3MgdG8gcnVuIGluIHRoZSBwcm9wZXIgb3JkZXIKCmFkanVzdCB0byBhcHJfYnVja2V0X3R5cGVfdCBjaGFuZ2VzIGluIDIuMC4zNy1kZXYKW01sYWRlbiBUdXJrIDxtdHVya0BtYXBwaW5nc29mdC5jb20+XQoKYWRkIE1PRFBFUkwyIGNvbmZpZyBkZWZpbmUsIGFzIGlmIHRoZSBzZXJ2ZXIgaGFkIGJlZW4gc3RhcnRlZCB3aXRoIC1ETU9EUEVSTDIKCmNvbXBhdCBhZGRpdGlvbnMgYW5kIGZpeGVzOiAkci0+bG9va3VwX3tmaWxlLHVyaX0sICRyLT5pc19tYWluLCBBcGFjaGUtPmRlZmluZQoKYWRkZWQgY29tcGF0IGZvciBBcGFjaGU6OmxvZ19lcnJvciBbU3RhcyBCZWttYW5dCgoKCj1pdGVtIDEuOTlfMDIgLSBKdW5lIDEsIDIwMDIKCnBhc3MgdGhlIFBBVEggYW5kIFRaIGVudmlyb25tZW50IHZhcmlhYmxlcyBhdCBzdGFydHVwIGJ5IGRlZmF1bHQgYXMgMS54eCBkaWQKCmZpeCBNb2RQZXJsOjpVdGlsOjpleGl0IHNlZ3Ygd2l0aCA1LjYuMAoKbm8gbG9uZ2VyIHN1cHBvcnQgNS43LnggcGVybCBkZXZlbG9wbWVudCB2ZXJzaW9ucwoKYWRkZWQgY29tcGF0IGZvciBBcGFjaGU6OlRhYmxlLT5uZXcKCnZhcmlvdXMgZml4ZXMgdG8gY29tcGlsZS9ydW4gb24gZGFyd2luCgpzZXJ2ZXItc2NvcGUgUGVybHtTZXQsUGFzc31FbnYgY29uZmlnIG5vdyBwcm9wYWdhdGVkIHRvICVFTlYgYXQgc3RhcnR1cAoKdXNlIFN2T0soc3YpIGluc3RlYWQgb2Ygc3YgPT0gJlBMX3N2X3VuZGVmIHRvIGRldGVjdCB1bmRlZiB2YWx1ZXMgaW4geHMKW1N0ZXBoZW4gQ2xvdXNlIDxzdGVwaGVuY0B0aGVpcWdyb3VwLmNvbT5dCgpjb21wbGV0ZSBBcGFjaGU6OlV0aWwgMS54IGNvbXBhdAoKYWRkZWQgQXBhY2hlOjpNUE1fSVNfVEhSRUFERUQgY29uc3RhbnQKCmFkZGVkIGNvbXBhdCBmdW5jdGlvbiBmb3IgQXBhY2hlOjpDb25zdGFudHM6OlNFUlZFUl9WRVJTSU9OCgphZGRlZCBBcGFjaGU6OkNvbnN0YW50czo6ZXhwb3J0IHN0dWIgZm9yIGNvbXBhdAoKYWRkZWQgbm9vcCBzdHVicyBmb3IgdGltZW91dCBmdW5jdGlvbnMgcmVtb3ZlZCBmcm9tIDIuMDoKJHItPntzb2Z0LGhhcmQscmVzZXQsa2lsbH1fdGltZW91dAoKdHVybmVkIG9uIFBlcmxPcHRpb25zICtHbG9iYWxSZXF1ZXN0IGJ5IGRlZmF1bHQgZm9yIHBlcmwtc2NyaXB0IGhhbmRsZXIKdW5sZXNzIGl0IGlzIGV4cGxpY2l0bHkgdHVybmVkIG9mZiB3aXRoIFBlcmxPcHRpb25zIC1HbG9iYWxSZXF1ZXN0CgphZGRlZCBBUFI6Ok9TOjp0aHJlYWRfY3VycmVudCBmdW5jdGlvbgoKYWRkZWQgc3VwcG9ydCBmb3IgMS54ICRyLT5zdWJwcm9jZXNzX2VudiBmdW5jdGlvbmFsaXR5CgphZGRlZCBzdXBwb3J0IGZvciAkci0+cHVzaF9oYW5kbGVycyhQZXJsSGFuZGxlciA9PiAuLi4pCgphZGRlZCBzdXBwb3J0IGZvciAkci0+cHJveHlyZXEgdG8gZGV0ZWN0IHByb3h5IHJlcXVlc3RzCgokci0+Y29udGVudF90eXBlKCR2YWwpIG5vdyBjYWxscyBhcF9zZXRfY29udGVudF90eXBlIHVuZGVybmVhdGgKCmFkZCB0aGUgZXJyX2hlYWRlcl9vdXQoKSB3cmFwcGVyIHRvIEFwYWNoZTo6Y29tcGF0ICsgY29ycmVzcG9uZGluZyB0ZXN0cwpbU3RhcyBCZWttYW5dCgpmaXggJHItPmRpcl9jb25maWcgbG9va3VwIG9mIHZhbHVlcyBzZXQgaW4gdGhlIHNlcnZlciBjb250ZXh0CgphZGRlZCBBcGFjaGU6OlJFRElSRUNUIHNob3J0Y3V0IGNvbnN0YW50Cgp2YXJpb3VzIGZpeGVzIGZvciBtZXRob2QgaGFuZGxlcnMKCnVzZSBBcGFjaGU6OlNlcnZlclV0aWwgaW4gQXBhY2hlOjpjb21wYXQgc28gQXBhY2hlLT5zZXJ2ZXIgd29ya3MgaW4gY29tcGF0Cm1vZGUgW0RhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPl0KCmFkZCBBcGFjaGU6OlV0aWw6OnVuZXNjYXBlX3VyaSBhbGlhcyB0byBBcGFjaGU6OnVuZXNjYXBlX3VybCBpbiBBcGFjaGU6OmNvbXBhdAoKY2hhbmdlIEFwYWNoZTo6dW5lc2NhcGVfdXJsIHRvIHJldHVybiB0aGUgZXNjYXBlZCB1cmwgYXMgMS54IGRvZXMKCmRpc2FibGVkIHRlcm0gY29sb3JpbmcgYnkgZGVmYXVsdCAoZW5hYmxlIHdpdGggZW52IHZhciBBUEFDSEVfVEVTVF9DT0xPUj0xKQoKZml4IGZvciBBUFI6OklwU3VibmV0LT5uZXcgdG8gY2hlY2sgcmV0dXJuIHN0YXR1cyBhcHJfaXBzdWJuZXRfY3JlYXRlCgplbmFibGVkIEFQUjo6U29ja0FkZHIgbW9kdWxlCgp0dXJuIG9uIGJpbm1vZGUgZm9yIGZpbGVoYW5kbGUgdXNlZCBpbiAkci0+c2VuZF9mZAoKZ2V0IE1QX3tUUkFDRSxERUJVR30gTWFrZWZpbGUuUEwgb3B0aW9ucyB3b3JraW5nIG9uIHdpbjMyCgp2YXJpb3VzIGZpeGVzIHRvIGJ1aWxkL3J1biB3aXRoIGJsZWVkcGVybAoKdmFyaW91cyBmaXhlcyBmb3Igd2luMzIgdG8gZ2V0IG1ha2UgdGVzdCBwYXNzaW5nCgptb3ZlZCBjb25zdHVjdF97dXJsLHNlcnZlcn0gbWV0aG9kcyB0byBBcGFjaGU6OlVSSSBtb2R1bGUKCmltcGxlbWVudCBBcGFjaGU6OlVSSTo6cGFyc2UgaW4gQXBhY2hlOjpjb21wYXQKCmdpdmUgUGVybCpIYW5kbGVycyBwcmVjZWRlbmNlIG92ZXIgb3RoZXIgaGFuZGxlcnMgYnkgdXNpbmcgQVBSX0hPT0tfRklSU1QKcmF0aGVyIHRoYW4gQVBSX0hPT0tfTEFTVAoKd29ya2Fyb3VuZCBidWcgaW4gNS42LjEgd2hlbiBYU0xvYWRlciBsb2FkcyBEeW5hTG9hZGVyLCB3aXBpbmcgb3V0IGFueQpkbCBoYW5kbGVzIGl0IGhhZCBiZWVuIGtlZXBpbmcgdHJhY2sgb2YuCgp0aWR5IHVwIHRlc3QgdG8gcnVuIHN0YW5kYWxvbmUgKHdpdGhvdXQgbW9kcGVybCB0ZXN0IGNvbmZpZykgCltTdGFzIEJla21hbl0KCm92ZXJyaWRlIFRfUFRST0JKIElOUFVUIHR5cGVtYXAgdG8gY3JvYWsgaWYgb2JqZWN0IGlzIG5vdCBhIGJsZXNzZWQKcmVmZXJlbmNlLCB0byBwcmV2ZW50IHBvc3NpYmxlIHNlZ3YgZnJvbSBlLmcuIEFwYWNoZTo6U2VydmVyLT5wcm9jZXNzCgphcHJfbG9jay5oIGlzIGdvbmU7IGRpc2FibGUgQVBSOjpMb2NrIGZvciB0aGUgbW9tZW50CgplbmFibGVkIHRoZSBBcGFjaGU6OlByb2Nlc3MgbW9kdWxlCgpmaXggTW9kUGVybDo6VXRpbDo6ZXhpdCB0byBjbGVhciAkQCBiZWZvcmUgY2FsbGluZyBQZXJsX2Nyb2FrCgpjdXQgZG93biBvbiBzb21lIGJ1aWxkIG5vaXNlCgpmaXggJ1BlcmxPcHRpb25zICtHbG9iYWxSZXF1ZXN0JyB3aGVuIHVzZWQgd2l0aGluIHN1YnJlcXVlc3RzCgpnZXQgcmlkIG9mIHNvbWUgInN1YnJvdXRpbmUgcmVkZWZpbmVkIiB3YXJuaW5ncyBpbiBNb2RQZXJsOjpNTSB0aGF0CnNob3cgdXAgd2l0aCBuZXdlciBibGVlZHBlcmxzLgoKYSBmZXcgZml4ZXMgZm9yIEFwYWNoZTo6Y29tcGF0IFtEYXZlIFJvbHNreSA8YXV0YXJjaEB1cnRoLm9yZz5dCgoKCj1pdGVtIDEuOTlfMDEgLSBBcHJpbCA2LCAyMDAyCgpGaXJzdCBwdWJsaWMgcmVsZWFzZSBvZiBtb2RfcGVybC0yLjAtdG9iZS4KCj1iYWNrCgo9Y3V0Cg==