LyoqIEBwYWdlIGFwcmVxX2NoYW5nZXMgQ0hBTkdFUwpAYnJpZWYgTGlzdCBvZiBtYWpvciBjaGFuZ2VzLgoKCkBzZWN0aW9uIHYyXzA1IENoYW5nZXMgd2l0aCBsaWJhcHJlcTItMi4wNQoKCi0gQyBUZXN0cyBbam9lc10KICBSZXBsYWNlIEN1VGVzdC1iYXNlZCB0ZXN0cyB3aXRoIGN1c3RvbSBUQVAtY29tcGxpYW50CiAgZnJhbWV3b3JrLgoKLSBDIEFQSSBbam9lc10KICBNYWtlIG91ciAibGlidG9vbCBjdXJyZW50IGludGVyZmFjZSIgbnVtYmVyIGRlcGVuZCBvbiBhcHIncyAKICBtYWpvciBudW1iZXIuICBUaGlzIGFsbG93cyBsaWJhcHJlcTIgdG8gYmUgaW5zdGFsbGVkIGludG8gYSAKICBzeXN0ZW0td2lkZSBsb2NhdGlvbiB3aGlsZSBhdm9pZGluZyBBQkkgY29uZmxpY3RzIGFyaXNpbmcgZnJvbQogIG91ciBhcHItYmFzZWQgaW50ZXJmYWNlcy4KCi0gQyBBUEkgW01heCBLZWxsZXJtYW5uXQogIG1vZF9hcHJlcSBtdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYXByZXFfYnJpZ2FkZV9jb25jYXQKICB0byBhdm9pZCBhIFJBTS1jb25zdW1pbmcgaW5maW5pdGUgbG9vcC4gIEEgYmFkIEFQUkVRX1RlbXBEaXIgCiAgc2V0dGluZyBjYW4gY2F1c2UgdGhpcyBzaXR1YXRpb24uCgotIEMgQVBJIFtqb2VzXQogIFByb3ZpZGUgd29ya2Fyb3VuZCBmb3IgY2h1bmtlZCB0cmFpbGVycyBidWcgaW4gYXBfaHR0cF9maWx0ZXIuCgotIEMsIFBlcmwgQVBJIFtqb2VzXQogIFNldmVyYWwgdXBsb2FkLXJlbGF0ZWQgYnVnZml4ZXM6CiAgIDEpIGFwcmVxX3VwbG9hZCBhbmQgYXByZXFfdXBsb2FkcyBkaWQgbm90IHNlYXJjaCB0aGUgZnVsbCBib2R5IHRhYmxlLAogICAyKSAkdXBsb2FkLT5zbHVycCBhbmQgJGlvLT5yZWFkIGRpZCBub3QgYXV0b3ZpdmlmeSB0aGUgcmVzdWx0YW50IHN0cmluZy4KCi0gQyBBUEkgW2pvZXNdCiAgQWRkICJmbGFncyIgYXR0cmlidXRlIHRvIGFwcmVxX3ZhbHVlX3QsIHBsYW5uaW5nIGZvciBjaGFyc2V0IHN1cHBvcnQuCiAgVGhpcyBpcyBhbiBBQkkgY2hhbmdlLCBzdGFydGluZyB3aXRoIGxpYmFwcmVxMi5zby4yLjAuMjQuCgotIEMgQVBJIFtqb2VzXQogIEFkZCBhcHJlcV9lbnZfYnVja2V0X2FsbG9jKCkgdG8gZ2V0IGFuIGFsbG9jYXRvciBkaXJlY3RseSBmcm9tIHRoZQogIGVudmlyb25tZW50IGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlbSBmcm9tIGEgcG9vbC4gIFRoaXMgaXMgYW4KICBBQkkgY2hhbmdlLCBzdGFydGluZyB3aXRoIGxpYmFwcmVxMi5zby4yLjAuMjMuCgotIEJ1aWxkIHN5c3RlbSBbam9lc10KICBBZGQgLS13aXRoLWFwYWNoZTItaHR0cGQgb3B0aW9uIHNvIHVzZXJzIGNhbiBvdmVycmlkZSBhcHhzJ3MKICBub3Rpb24gb2Ygd2hlcmUgdGhlIGh0dHBkIGV4ZWN1dGFibGUgaXMuICBYU0J1aWxkZXIncyBoZWFkZXIKICBwYXJzZXIgcnVucyBmcm9tIGJ1aWxkY29uZiBub3cgaW5zdGVhZCBvZiBjb25maWd1cmUsIHNvIHdlCiAgd2lsbCBpbmNsdWRlIHRob3NlIHRhYmxlcyBpbiB0aGUgcmVsZWFzZSB0YXJiYWxsLiAgYnVpbGRjb25mCiAgZ2V0cyBhbiBhZGRpdGlvbmFsIC0td2l0aC1wZXJsIG9wdGlvbiBmb3IgcnVubmluZyB0aGUgeHNidWlsZGVyLnBsCiAgcGFyc2luZyBzY3JpcHQuICBUaGUgWFMgZ2VuZXJhdGlvbiBjb2RlIGluIHhzYnVpbGRlci5wbCBoYXMgbW92ZWQgCiAgdG8gZ2x1ZS9wZXJsL01ha2VmaWxlLlBMLgoKLSBQZXJsIEFQSSBbam9lc10KICBBbGxvdyBjdG9ycyBmb3IgQXBhY2hlOjpDb29raWUsIEFwYWNoZTo6Q29va2llOjpKYXIKICBhbmQgQXBhY2hlOjo6UmVxdWVzdCB0byBhY2NlcHQgQXBhY2hlOjpSZXF1ZXN0IG9iamVjdHMKICAoaW5zdGVhZCBvZiByZXF1aXJpbmcgYW4gQXBhY2hlOjpSZXF1ZXN0UmVjIG9iamVjdCkuCiAgVGhpcyB0aHJlYWQgZGV0YWlscyB0aGUgYnVnCiAgICAgICAgaHR0cDovL3RocmVhZC5nbWFuZS5vcmcvZ21hbmUuY29tcC5hcGFjaGUubW9kLXBlcmwvMTU3MjcKCi0gQyBBUEkgW0JvamFuIFNtb2p2ZXJdCiAgQmFrZSBjb29raWVzIHdpdGggZXJyX2hlYWRlcnNfb3V0IHNvIHRoZXkgYXJlCiAgc2VudCBvbiBub24tMnh4IHNlcnZlciByZXNwb25zZXMgKGllLiBhIDMwNCByZWRpcmVjdCkuCiAgQWxzbyBlbnN1cmUgdGhhdCBoZWFkZXJzIGFyZSBjb3BpZWQgd2l0aCBhcHJfdGFibGVfYWRkCiAgaW5zdGVhZCBvZiBhcHJfdGFibGVfYWRkbi4gIFNpbmNlIGFwcmVxX2Nvb2tpZV9iYWtlKCkKICBhbGxvY2F0ZXMgZnJvbSB0aGUgc3RhY2ssIHRoZSBTZXQtQ29va2llIGhlYWRlcnMgd291bGQgCiAgb2NjYXNpb25hbGx5IGdldCBtYW5nbGVkIHdpdGhvdXQgdGhpcyBwYXRjaC4KCi0gQyBBUEkgW2pvZXNdCiAgQWRkIGFwcmVxX3JlZ2lzdGVyX3BhcnNlcigpLCB3aGljaCBhbGxvd3MgdXNlcnMgdG8gYWRkCiAgdGhlaXIgb3duIHBhcnNlcnMgdG8gYXByZXFfcGFyc2VyKCkncyByZWNvZ25pemVkIE1JTUUgdHlwZXMuCgotIEMgQVBJIFtqb2VzXQogIFN1cHBvcnQgIm11bHRpcGFydC9taXhlZCIgZmlsZSB1cGxvYWRzLgogIFN1cHBvcnQgWEZvcm1zJyAibXVsdGlwYXJ0L3JlbGF0ZWQiIGVuY3R5cGUuCgotIEMgQVBJIFtqb2VzXQogIEFkZCBhcHJlcV9ob29rX2Fwcl94bWxfcGFyc2VyKCksIHdoaWNoIGlzIGEgc2ltcGxlIHdyYXBwZXIKICBob29rIGFyb3VuZCBBUFIncyBleHBhdC1iYXNlZCBhcHJfeG1sX3BhcnNlci4gIEFkZCBhIGdlbmVyaWMKICBwYXJzZXIgYXByZXFfcGFyc2VfZ2VuZXJpYygpIHRvIHBhcnNlIGFyYml0cmFyeSBlbmN0eXBlcyB1c2luZwogIHRoZSBob29rIEFQSS4KCgpAc2VjdGlvbiB2Ml8wNF9kZXYgQ2hhbmdlcyB3aXRoIGxpYmFwcmVxMi0yLjA0LWRldiAocmVsZWFzZWQgQXVndXN0IDMwLCAyMDA0KQoKCi0gUGVybCBBUEkgW2pvZXNdCiAgQWRkIFRBSU5UIGNoZWNrcywgbWFya2luZyBhbGwgcGFyc2VkIGRhdGEgYXMgdGFpbnRlZC4KCi0gQyBBUEkgW2pvZXNdCiAgQWRkIGJvZHlfc3RhdHVzIGF0dHJpYnV0ZSB0byBhcHJlcV9yZXF1ZXN0X3QsIHRvIGFsbG93IHRoZSBib3RoCiAgZW52aXJvbm1lbnQgYW5kIHRoZSBwYXJzZXIgdG8gcmVwb3J0IGFueSBlcnJvcnMgZW5jb3VudGVyZWQuCgotIEMgQVBJIFtyYW5keWssIGpvZXNdCiAgQ29va2llIHBhcnNlciB3YXMgbG9ja2luZyB1cCBvbiBub24tYWxwaGFudW1lcmljIGNoYXJzIGluIGNvb2tpZSBuYW1lcy4KICBBbHNvIFJGQyBDb29raWUgYXR0cmlidXRlcyBhcmUgYWx3YXlzIGNoZWNrZWQgZm9yIHF1b3RlcyBkdXJpbmcgYmFrZSgyKSwKICBhbmQgdGhlIHF1b3RlcyBhcmUgbm93IHN0cmlwcGVkIGZyb20gaW5jb21pbmcgUkZDIGNvb2tpZXMgZHVyaW5nIHBhcnNpbmcgCiAgKGJ1dCB0aGV5IGFyZSBuZXZlciBzdHJpcHBlZCBmcm9tIHRoZSBhY3R1YWwgY29va2llIHZhbHVlKS4KCi0gUGVybCBBUEkgW2pvZXNdCiAgQXBhY2hlOjpDb29raWU6Okphci0+bmV3IGFjY2VwdHMgYSBWQUxVRV9DTEFTUyBhcmd1bWVudCwgd2hpY2ggZWZmZWN0aXZlbHkKICBibGVzc2VzIGFsbCB0aGUgamFyJ3MgY29va2llcyBpbnRvIHRoYXQgY2xhc3MsIHdoaWNoIHNpbXBsaWZpZXMgc3ViY2xhc3NpbmcKICBBcGFjaGU6OkNvb2tpZS4gICBBY2NvcmRpbmdseSBBcGFjaGU6OkNvb2tpZS0+ZnJlZXplKCR2YWx1ZSkgbm8gbG9uZ2VyIGFjY2VwdHMgCiAgYSBmcmVlemUoKS1hYmxlIG9iamVjdCBpbiAkdmFsdWUuCgotIEMgQVBJIFtNYXJrdXMgV2ljaGl0aWxsLCByYW5keWssIGpvZXNdCiAgRHJvcCBBUFJfREVMT05DTE9TRSBmcm9tIGFwcmVxX2ZpbGVfbWt0ZW1wIGltcGxlbWVudGF0aW9uIGFuZCBpbnN0YWxsCiAgYXByZXFfZmlsZV9jbGVhbnVwLiBXaGVuIHBhc3NlZCB0byBhcHJfZmlsZV9vcGVuIG9uIFdpbjMyLCBBUFJfREVMT05DTE9TRSAKICBzZXRzIHRoZSBGSUxFX1NIQVJFRF9ERUxFVEUgZmxhZywgd2hpY2ggaXMsIHVuZm9ydHVuYXRlbHksIGEgcHJvcGVydHkgdGhhdAogIGlzIHByZXNlcnZlZCBhY3Jvc3MgTlRGUyAiaGFyZCIgbGlua3MuICBUaGlzIGJyZWFrcyBhcHBzIHRoYXQgbGluaygpIAogIHRoZSB0ZW1wIGZpbGUgdG8gYSBwZXJtYW5lbnQgbG9jYXRpb24sIGFuZCBzdWJzZXF1ZW50bHkgZXhwZWN0IHRvIG9wZW4gaXQgCiAgd2l0aG91dCBGSUxFX1NIQVJFRF9ERUxFVEUgYmVmb3JlIHRoZSBvcmlnaW5hbCB0ZW1wZmlsZSBpcyBjbG9zZWQrZGVsZXRlZC4gCiAgSW4gZmFjdCwgZXZlbiBBcGFjaGU6OlVwbG9hZCBkb2VzIHRoaXMsIHNvIGl0IGlzIGEgY29tbW9uIGVub3VnaCBldmVudCB0aGF0CiAgdGhlIGFwcmVxX2ZpbGVfY2xlYW51cCB3b3JrYXJvdW5kIGlzIG5lY2Vzc2FyeS4KCi0gQyBBUEkgW0tlbiBCdXJjaGFtLCBqb2VzXQogIEZpeCBidWcgaW4gdXJsIHBhcnNlciB0aGF0IG9jY3VycyB3aGVuIGEgJVhYLWVuY29kZWQgc2VxdWVuY2UKICBpcyBzcGxpdCBhY3Jvc3MgbXVsdGlwbGUgYnVja2V0cy4gIEFkZGVkIGFwcmVxX2RlY29kZV9kZWNvZGV2CiAgdG8gbWFrZSB0aGlzIHByb2JsZW0gbGVzcyBpbmNvbnZlbmllbnQuCgotIFBlcmwgQVBJIFtqb2VzXQogIEV4Y2VwdGlvbiBvYmplY3RzIGluaGVyaXQgZnJvbSB0aGUgb2JqZWN0IHdoaWNoIHJhaXNlZCBpdCwKICB3aGljaCBhbGxvd3MgJEAgdG8gaW52b2tlIGl0cyBtZXRob2RzIHdpdGggaW1wdW5pdHkgKGV4Y2VwdGlvbnMgCiAgYXJlIGRpc2FibGVkIGZvciBvYmplY3RzIHdoaWNoIGRlcml2ZSBmcm9tIGFuIGV4Y2VwdGlvbiBjbGFzcykuCgotIFBlcmwgQVBJIFtqb2VzXQogIEltcGxlbWVudCBIT09LX0RBVEEgYW5kIFVQTE9BRF9IT09LLgoKLSBQZXJsIEFQSSBbam9lc10KICBBZGQgc2FmZSBYUyB3cmFwcGVycyBmb3IgJHRhYmxlLT5hZGQsICR0YWJsZS0+c2V0LCAkdGFibGUtPlNUT1JFLAogIGFuZCAkdGFibGVfY2xhc3MtPm5ldy4KCi0gUGVybCBBUEkgW2pvZXNdCiAgQWRkIGV4Y2VwdGlvbnMgdG8gJHVwbG9hZC0+bGluaywgJHVwbG9hZC0+dGVtcG5hbWUsICR1cGxvYWQtPnNsdXJwLCAKICBhbmQgJGNvb2tpZS0+c2V0X2F0dHIuICBSZXR1cm4gdmFsdWUgb2YgJHVwbG9hZC0+c2x1cnAgaXMgbm93IHRoZSAKICB1cGxvYWQgbGVuZ3RoLiAgQWxzbyBkb2N1bWVudCBuZXcgJHVwbG9hZC0+aW8uCgotIEMgQVBJIFtqb2VzXQogIFJlc3RyaWN0IGFsbCBhcHJfc3RhdHVzX3QgY29kZXMgdG8gQVBSX1NVQ0NFU1MsIEFQUl9JTkNPTVBMRVRFLAogIEFQUl9FR0VORVJBTCwgQVBSX0VJTklULCBBUFJfRU5PVElNUEwsIHNpbmNlIGFueSBvdGhlcnMgd2lsbAogIGdlbmVyYXRlIGNvbmZ1c2luZyBlcnJvciBtZXNzYWdlcyBmcm9tIGFwcl9zdHJlcnJvci4KCi0gUGVybCBBUEkgW2pvZXNdCiAgQWRkZWQgJHVwbG9hZC0+aW8gd2l0aCBhIFRJRUhBTkRMRSBBUEkgbGF5ZXJlZCBvdmVyIEFQUjo6QnJpZ2FkZS4gICAkdXBsb2FkLT5maAogIHJlbWFpbnMgaW1wbGVtZW50ZWQgYXMgYW4gQVBSOjpQZXJsSU8gb2JqZWN0LCB3aGljaCBpcyBzZWVrYWJsZSBidXQgbGVzcyBlZmZpY2llbnQgCiAgYW5kIGN1cnJlbnRseSBzdWZmZXJzIHNvbWUgcG9ydGFiaWxpdHkgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCBsYXJnZWZpbGUgc3VwcG9ydAogIGluIHBlcmwgYW5kIGFwci4KCi0gUGVybCBBUEkgW2pvZXNdCiAgQWRkZWQgYXByZXFfeHNfY3JvYWsgZm9yIHRocm93aW5nIEFQUjo6RXJyb3IgZXhjZXB0aW9ucyBhbmQgaW5jbHVkZWQKICBlcnJvci1jaGVja2luZyBvbiAkcmVxLT5wYXJhbSwgJHJlcS0+YXJncywgJHJlcS0+Ym9keSwgJHJlcS0+dXBsb2FkLCAKICBhbmQgJGphci0+Z2V0LgoKLSBQZXJsIEFQSSBbam9lc10KICBBZGRlZCAkamFyLT5zdGF0dXMsICRyZXEtPmFyZ3Nfc3RhdHVzIGFuZCAkcmVxLT5ib2R5X3N0YXR1cyB0byByZXBvcnQKICBwYXJzaW5nIGVycm9ycy4gQWxzbyBhZGQgJHVwbG9hZC0+dGVtcG5hbWUgcGVyIHVzZXIgcmVxdWVzdC4KCi0gQyBBUEkgW2pvZXNdCiAgRHJvcHBlZCBzdGF0dXMgYXR0cmlidXRlIG9mIGFwcmVxX3ZhbHVlX3QuICBBZGRlZCBzdGF0dXMgZmllbGQgdG8KICBhcHJlcV9qYXJfdCBhbmQgYWRkZWQgYXJnc19zdGF0dXMgZmllbGQgdG8gYXByZXFfcmVxdWVzdF90LiBQYXJzZXJzCiAgYWxzbyBtdXN0IHJldHVybiB0aGVpciBwdWJsaWMgc3RhdHVzIGNvZGUgd2hlbiBhIE5VTEwgYnJpZ2FkZSBpcyBwYXNzZWQuCiAgYXByZXFfaG9va19kaXNhYmxlX3VwbG9hZHMoKSBpcyBhbHNvIGFkZGVkLgogIC4KICBUaGlzIGlzIGFuIEFCSSBjaGFuZ2UgYWZmZWN0aW5nIGFsbCB2ZXJzaW9ucyBvZiBsaWJhcHJlcTIgcHJpb3IgdG8gMi4wLjEyLgoKLSBQZXJsIEFQSSBbam9lc10KICAkdXBsb2FkLT5pbmZvIHJldHVybnMgYSBwcm9wZXIgQVBSOjpUYWJsZSBvYmplY3Qgbm93LiBBbHNvIGltcGxlbWVudGVkCiAgJHVwbG9hZC0+c2l6ZSwgJHVwbG9hZC0+ZmgsIGFuZCAkdXBsb2FkLT50eXBlLgoKLSBDIEFQSSBbSmVhbi1GcmFu529pcyBNZWVzc2VdCiAgbWZkIHBhcnNlciBmYWlscyB0byBwYXJzZSBDUkxGLXRlcm1pbmF0ZWQgZmlsZXMgd2hlbiB0aGUgdGVybWluYXRpbmcKICBib3VuZGFyeSBzdHJpbmcgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IGJ1Y2tldC4gIFRoaXMgaXMgcmVwb3J0ZWRseQogIGEgY29tbW9uIGV2ZW50IGZvciBQREYgZmlsZXMgdXBsb2FkZWQgd2l0aCBOZXRzY2FwZSA3LgoKLSBQZXJsIEFQSSBbam9lc10KICBBZGQgYmFjay1jb21wYXQgc3VwcG9ydCBmb3IgQXBhY2hlOjpDb29raWUtPmZldGNoKCkgdmlhCiAgQXBhY2hlLT5yZXF1ZXN0LgoKLSBDIEFQSSBbam9lc10KICBBZGQgTWF4Qm9keSwgTWF4QnJpZ2FkZSwgYW5kIFRlbXBEaXIgcGVyLWRpciBkaXJlY3RpdmVzIHRvIG1vZF9hcHJlcSAKICBmaWx0ZXIuCgotIEMgQVBJIFtqb2VzXQogIFJlcGxhY2UgZnJlZS90ZW1wbmFtIGRlcGVuZGVuY3kgaW4gYXByZXFfZmlsZV9ta3RlbXAoKSB3aXRoCiAgYXByX3RlbXBfZGlyX2dldCgpLiAgQWRkIGFkZGl0aW9uYWwgZ2NjIHdhcm5pbmcgZmxhZ3Mgd2hlbgogIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBpcyBzZXQuCgotIEMgQVBJIFtqb2VzLCBTY290dCBIdXR0b25dCiAgUmVwbGFjZSBhcHJlcV9icmlnYWRlX2NvcHkgd2l0aCBtb3JlIGVmZmVjdGl2ZSBBUFJFUV9CUklHQURFX0NPUFkKICBtYWNyby4gIEFsc28gaW50cm9kdWNlIEFQUkVRX0JSSUdBREVfU0VUQVNJREUgdG8gZGVhbCB3aXRoIGJ1Y2tldHMgCiAgdGhhdCBuZWVkIHRvIGJlIHNldCBhc2lkZSBmb3IgdXNlIGluIGZ1dHVyZSBmdW5jdGlvbiBjYWxscy4gbW9kX3NzbCAKICBnZW5lcmF0ZXMgdHJhbnNpZW50IGJ1Y2tldHMgd2hpY2ggdGlja2xlZCB0aGlzIGJ1Zy4KCi0gUGVybCBBUEkgW2pvZXNdCiAgU2VwYXJhdGUgQXBhY2hlOjpVcGxvYWQgbW9kdWxlIGZyb20gQXBhY2hlOjpSZXF1ZXN0IGZvciAKICBiZXR0ZXIgb3JnYW5pemF0aW9uLgoKCkBzZWN0aW9uIHYyXzAzX2RldiBDaGFuZ2VzIHdpdGggbGliYXByZXEyLTIuMDMtZGV2IChyZWxlYXNlZCBKdW5lIDEyLCAyMDA0KQoKCi0gQyBBUEkgW2pvZXNdCiAgIk9iamVjdGlmeSIgY29va2llL2phciBBUEk6IHMvYXByZXFfKG1ha2V8c2VyaWFsaXplKV9jb29raWUvYXByZXFfY29va2llXyQxLwogIGFuZCByZW9yZGVyaW5nIGFyZ3Mgc28gdGhlIGNvb2tpZS9qYXIgb2JqZWN0IGlzIGFsd2F5cyB0aGUgZmlyc3QgYXJndW1lbnQuCiAgTWFjcm9zIGFkZGVkIHRvIHByb3ZpZGUgc291cmNlLWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIG5hbWVzLgoKLSBQZXJsIEFQSSBbam9lc10KICBBZGRlZCAkdXBsb2FkLT5zbHVycCgkZGF0YSksIHdoaWNoIHJlYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQogIHVwbG9hZCAiJHVwbG9hZCIgaW50byB0aGUgc2NhbGFyICIkZGF0YSIuCgotIEMgQVBJIFtqb2VzLCByYW5keWtdCiAgYXByZXFfcnVuXyhob29rfHBhcnNlcikgYXJlIG1hY3Jvcywgc28gdGhleSBhcmUgY2FwaXRhbGl6ZWQgbm93LgogIEZpeGVkIGFwcmVxX3BhcmFtc19hc19zdHJpbmcoKSBhbmQgYWRkZWQgYXByZXFfcGFyYW1zX2FzX2FycmF5KCkuCiAgUmV3b3JrZWQgZGVmaW5pdGlvbnMgb2YgQVBSRVFfREVDTEFSRV9IT09LLCBBUFJFUV9ERUNMQVJFX1BBUlNFUiAKICBhbmQgYXByZXFfKHBhcnNlcnxob29rKV90LCBob3BlZnVsbHkgdG8gYmUgbW9yZSBXaW4zMiBmcmllbmRseS4KICBBbHNvIHVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24uCgotIEMgQVBJIFtqb2VzXQogIENvbXBlbnNhdGUgZm9yIGEgbWlzc2luZyBDUkxGIGluIGVtcHR5IGZpbGUgdXBsb2FkIGJsb2NrLCB3aGljaCAKICBhY3R1YWxseSBjb21wbGllcyB3aXRoIFJGQyAyMDQ2IFNlY3Rpb24gNS4xLjEuICBLb25xdWVyb3IgKHZlcnNpb24gdW5rbm93bikKICBhbmQgTW96aWxsYSAwLjkuNyBhcmUga25vd24gdG8gZW1pdCBzdWNoIGJsb2Nrcy4KCi0gUGVybCBBUEkgW2pvZXNdCiAgJHJlcS0+dXBsb2FkKCkgaW4gbGlzdCBjb250ZXh0IGZhaWxlZCB0byBmaWx0ZXIgb3V0IG5vbi11cGxvYWRzLgogIEFsc28gJHJlcS0+dXBsb2FkKCJub25leGlzdGVudC1rZXktbmFtZSIpIHNlZ2ZhdWx0cy4KCi0gUGVybCB0ZXN0IHN1aXRlCiAgdC9URVNULlBMIG11c3QgcnVuIHBhcmVudCBjbGFzcycgcHJlX2NvbmZpZ3VyZSB0byBnZXQgdGhlCiAgY29uZmlndXJhdGlvbiByaWdodAoKLSBDIEFQSSBbam9lc10KICBhcHJlcV9icmlnYWRlX2NvbmNhdCgpIHdhc24ndCBzdXBwbHlpbmcgdGhlIGZpbmFsIEVPUyBidWNrZXQKICB0byBsYXJnZSBicmlnYWRlcyAoPjI1NkspLCB3aGljaCBzb210aW1lcyBjYXVzZWQgdGhlIHByZWZldGNoIAogIGxvb3AgaW4gbW9kX2FwcmVxLmMncyBhcHJlcV9maWx0ZXIoKSB0byBoYW5nLgoKLSBEb2N1bWVudGF0aW9uIFtqb2VzXQogIENIQU5HRVMgZmlsZSByZWZvcm1hdHRlZCwgcmVtb3ZpbmcgZGF0ZXMgJiBvdGhlciBjbHV0dGVyIAogIGFzIFN0YXMgc3VnZ2VzdHMuCgotIEMgQVBJIFtqb2VzXQogIFJld3JvdGUgY2dpX3JlYWQoKSBpbiBhcHJlcV9lbnYuYyBhbmQgcmV3b3JrZWQgbW9kX2FwcmVxLmMgCiAgdG8gZW5mb3JjZSBhcHJlcV9lbnZfbWF4X2JvZHkoKSBzZXR0aW5ncy4KCi0gQyBBUEkgW2pvZXNdCiAgRml4ZWQgYnVnIGluIHVybF9wYXJzZXIgY29kZS0gbWlzc2luZyBjb250ZXh0IGJyaWdhZGUgd2FzCiAgbmVlZGVkIHRvIHRyYWNrIGtleS12YWx1ZSBwYWlycyB3aGljaCBzcGFuIG11bHRpcGxlIGJ1Y2tldHMuCgotIEMgQVBJIFtqb2VzXQogIEFQSSBtb2RpZmljYXRpb25zOiByZW1vdmVkIHN0cnVjdCBhcHJlcV9jZmdfdCwgYWRkaW5nCiAgbmV3IGFwcmVxX2VudiBob29rcyBtYXhfYm9keSwgbWF4X2JyaWdhZGVfbGVuLCBhbmQgdGVtcF9kaXIuCiAgRm9sZGVkIGFwcmVxX3BhcnNlcnMuaCBpbnRvIGFwcmVxX3BhcmFtcy5oIGFuZCBtb2RpZmllZCB0aGUgYXJndW1lbnRzIAogIHRvIGFwcmVxX3J1bl9wYXJzZXIoKSBhbmQgYXByZXFfcnVuX2hvb2soKS4gUmVuYW1lZCAKICBhcHJlcV9wYXJzZXJfdCdzIGNvbnRlbnRfdHlwZSBhcyBlbmN0eXBlIGFuZCBhcHJlcV9jb3B5X2JyaWdhZGUoKQogIGFzIGFwcmVxX2JyaWdhZGVfY29weSgpLgogIFRoZXNlIGNoYW5nZXMgbWFrZSBsaWJhcHJlcTIuc28uMi4wLjUgaW5jb21wYXRpYmxlIHdpdGggZWFybGllciAKICB2ZXJzaW9ucy4KCi0gUGVybCBBUEkgW3N0YXNdCiAgSW5jbHVkZSBwcHBvcnQuaCBmcm9tIGJsZWFkLXBlcmwgdG8gc3VwcG9ydCBvbGRlciBwZXJscy4KICBBZGQgYSBwcm9wZXIgc3VwcG9ydCBmb3IgaXRocmVhZHMuCgotIEMgQVBJIFtTd2VuIFNjaGlsbGlnLCBqb2VzXQogIEZpeGVkIGJ1ZyBpbiBjYWxjdWxhdGlvbiBvZiBOZXRzY2FwZSBjb29raWUgZXhwaXJhdGlvbiBkYXRlcy4KICBhcHJfdGltZV90IGlzIG1lYXN1cmVkIGluIG1pY3Jvc2Vjb25kcywgbm90IHNlY29uZHMsIHdoaWNoCiAgdGhyZXcgb2ZmIHRoZSBhcml0aG1ldGljOyBhcHJfdGltZV9mcm9tX3NlYyB3YXMgbmVlZGVkIGZvcgogIHRoZSBjb252ZXJzaW9uLgoKLSBDIEFQSSBbTWF4IEtlbGxlcm1hbm5dCiAgRml4IHNlZ2ZhdWx0IGNhdXNlZCBieSBpbnZhbGlkICUtZXNjYXBlIHNlcXVlbmNlIGluIHF1ZXJ5IHN0cmluZy4KCgpAc2VjdGlvbiB2Ml8wMl9kZXYgQ2hhbmdlcyB3aXRoIGxpYmFwcmVxMi0yLjAyLWRldiAocmVsZWFzZWQgTm92IDE1LCAyMDAzKQoKCi0gUGVybCBBUEkgW2pvZXNdCiAgRml4IGJvZ3VzIHBvb2wvY29va2llIGluaXRpYWxpemVycyBpbiBBcGFjaGU6OkNvb2tpZTo6c2V0X2F0dHIoKSwKICB3aGljaCBjYXVzZWQgQXBhY2hlOjpDb29raWU6Om5ldyB0byBzZWdmYXVsdC4gIEJ1ZwogIGZpcnN0IHJlcG9ydGVkIHRvIG1vZHBlcmwgbGlzdCBieSBXb2xmZ2FuZyBLdWJlbnMuCgoKQHNlY3Rpb24gdjJfMDFfZGV2IENoYW5nZXMgd2l0aCBsaWJhcHJlcTItMi4wMS1kZXYgKHJlbGVhc2VkIE5vdiAxMCwgMjAwMykKCgotIGJ1aWxkIHN5c3RlbSBbam9lc10KICBTa2lwIEFwYWNoZTo6VGVzdCB0ZXN0cyBpbiBlbnYvIHdoZW4gQXBhY2hlOjpUZXN0IGlzIHVuYXZhaWxhYmxlLgogIFRoaXMgYWxsb3dzIHRoZSBDIEFQSSB0byBiZSBidWlsZCBhbmQgaW5zdGFsbGVkIHdpdGhvdXQgcmVxdWlyaW5nCiAgQXBhY2hlOjpUZXN0IChpdCBpcyBzdGlsbCBhIHJlcXVpcmVtZW50IGZvciBjb21waWxpbmcgdGhlIHBlcmwgZ2x1ZSkuCgotIEMgQVBJIG1vZF9hcHJlcS5jIFtqb2VzXQogIFBhcnNlciBlcnJvcnMgd2VyZSBjcmVlcGluZyBpbnRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYXByZXFfZmlsdGVyLAogIHdoaWNoIGJyZWFrcyB0aGUgInRyYW5zcGFyZW50IHRlZSIgcGFyYWRpZ20uICBUaGlzIGNhdXNlZCBib2d1cwogICI0MDAgQmFkIFJlcXVlc3QiIHJlc3BvbnNlcyAoZmlyc3QgcmVwb3J0ZWQgYnkgVmxhZGltaXIgRHVkbykgCiAgdG8gb2NjdXIgd2hlbiBsaWJhcHJlcTIgd2FzIHVzZWQgYnkgYW4gb3V0cHV0IGZpbHRlciBkdXJpbmcgYSBHRVQgCiAgcmVxdWVzdCAoaGFuZGxlZCBieSBhcGFjaGUyJ3MgZGVmYXVsdCBoYW5kbGVyKS4gIFRoZSB0ZXN0IHN1aXRlIAogIGhhcyBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCgotIEMgQVBJIFtqb2VzXQogIEluY29ycG9yYXRlIGxpYmFwcmVxX2NnaSBpbnRvIGxpYmFwcmVxMiBhcyB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCwKICBhbmQgYWRkIGFwcmVxX2Vudl90IGFuZCBpbml0aWFsaXplciBhcHJlcV9lbnZfbW9kdWxlKCkgdG8gbWFuYWdlIHRoZQogIGVudmlyb25tZW50IGF0IHJ1bnRpbWUgKGRldGVybWluaW5nIHRoZSBlbnZpcm9ubWVudCBhdCBsb2FkLXRpbWUKICB3YXMgcHJvYmxlbWF0aWMgb24gbm9uLUVMRiBzeXN0ZW1zKS4KCgpAc2VjdGlvbiB2Ml8wXzAgQ2hhbmdlcyB3aXRoIGxpYmFwcmVxMi0yLjAwLWRldiAoT2N0IDI1LCAyMDAzKQoKCi0gQyBBUEk6IGxpYmFwcmVxX2NnaS5jIFtyYW5keWssIGpvZXNdCiAgQ0dJIGVudmlyb25tZW50IGRlZmluZWQgYnkgZW52L2xpYmFwcmVxX2NnaS5jIGlzIGZ1bmN0aW9uYWwKICAod2l0aCB0ZXN0cyBhZGRlZCB0byBlbnYvdCkuICBUaGlzIGxpYnJhcnkgbWF5IHNvb24gYmUgaW5jb3Jwb3JhdGVkCiAgZGlyZWN0bHkgaW50byBsaWJhcHJlcTIgYXMgYSBkZWZhdWx0IGVudmlyb21lbnQuCgotIEMgQVBJOiBtb2RfYXByZXEuYyBbam9lc10KICBBZGRlZCBjdHgtPnNhd19lb3MgdG8gZW5zdXJlIHdlIGRvbid0IHJlYWQgZnJvbSB1cHN0cmVhbSBmaWx0ZXJzCiAgYWZ0ZXIgcmVjZWl2aW5nIGFuIGVvcyBidWNrZXQuICBPdGhlcndpc2UgaXQgd2FzIHBvc3NpYmxlIGZvcgogIHR3byBlb3MgYnVja2V0cyB0byBhcHBlYXIgd2hlbiBhIHByZWZldGNoIHJlYWQgaXMgaW52b2x2ZWQsIHdoaWNoCiAgYnJlYWtzIG90aGVyIG1vZHVsZXMgbGlrZSBtb2RfcHJveHkuICBUaGlzIGJ1ZyB3YXMgdW5jb3ZlcmVkIGJ5CiAgUGhpbGlwcGUgQ2hpYXNzb24uICBtb2RfYXByZXEncyBhcHJlcV9lbnZfbWFqaWNfbnVtYmVyIGJ1bXBlZCB0bwogIHJlZmxlY3QgdGhlIGFkZGVkIGZpeGVzLgoKLSBjb25maWd1cmU6IC0tZW5hYmxlLXBlcmwtZ2x1ZSBbam9lc10KICBUaGUgLS1lbmFibGUtcGVybC1nbHVlIG9wdGlvbiBpbnRlZ3JhdGVzIHRoZSBwZXJsIGdsdWUgaW50byB0aGUgCiAgbm9ybWFsIFVuaXggYnVpbGQgY3ljbGUuICBJdCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBidXQgaXMgc2lsZW50bHkgCiAgcmVlbmFibGVkIGlmIHRoZSB1c2VyIGNvbmZpZ3VyZXMgdGhlIHNvdXJjZSB0cmVlIHZpYSBNYWtlZmlsZS5QTC4KCi0gQyBBUEkgW2pvZXNdCiAgQWRkZWQgYXByZXFfaGVhZGVyX2F0dHJpYnV0ZSgpIGFuZCBmaXhlZCBtZmQgcGFyc2VyIHRvIGFsbG93IAogICJjaGFyc2V0IiBhdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLiAgU3ZlbgogIEdlaXNsZXIgcG9pbnRzIG91dCB0aGF0IE9wZXJhIDcuMjAgZG9lcyBnZW5lcmF0ZSBzdWNoIGhlYWRlcnMuIAoKLSBDIEFQSSBbam9lc10KICBBZGRlZCB2ZXJzaW9uaW5nIEFQSSBmb2xsb3dpbmcgaHR0cDovL2Fwci5hcGFjaGUub3JnL3ZlcnNpb25pbmcuaHRtbAogIGFwcmVxX2VudiByZW5hbWVkIGFwcmVxX2Vudl9uYW1lLCBhbmQgYXByZXFfZW52X21hZ2ljX251bWJlciBhZGRlZAogIHRvIHByb3ZpZGUgdmVyc2lvbmluZyBmb3IgZW52aXJvbm1lbnRzIChtb2R1bGVzKS4gIFRoZSBoZWFkZXIgZmlsZXMgCiAgYXJlIG5vdyBpbnN0YWxsZWQgdG8gImluY2x1ZGUvYXByZXEyIiwgYW5kIHRoZSBsaWJyYXJ5IGlzIHJlbmFtZWQgCiAgImxpYmFwcmVxMiIuIEFsc28gYWRkZWQgYW4gYXByZXEyLWNvbmZpZyBzY3JpcHQgYmFzZWQgb24gYXB1LWNvbmZpZy4KCi0gY29uZmlndXJlOiBzdGF0aWMgbW9kX2FwcmVxLmMgW0JvamFuIFNtb2p2ZXIsIGpvZXNdCiAgQWRkIC0td2l0aC1hcGFjaGUyLXNyYyBjb25maWd1cmUgb3B0aW9uLCBhbG9uZyB3aXRoIC0td2l0aC1hcHItY29uZmlnCiAgYW5kIC0td2l0aC1hcHUtY29uZmlnLCBhbmQgcHJvdmlkZSBzdXBwb3J0IGZvciBjb21waWxpbmcgbW9kX2FwcmVxIAogIGludG8gaHR0cGQgYXMgYSBzdGF0aWMgYXBhY2hlIG1vZHVsZS4KCi0gQyBBUEk6IG1vZF9hcHJlcS5jIFtqb2VzXQogIFN1cHBvcnQgZm9yIGludGVybmFsIHJlZGlyZWN0cyBhZGRlZCB0byB0aGUgbW9kX2FwcmVxIGZpbHRlci4KICBUaGlzIGVuc3VyZXMgYW55IFBPU1QgZGF0YSBwcmVmZXRjaGVkIGluIHRoZSBtYWluIHJlcXVlc3QgCiAgZ2V0cyBwYXNzZWQgYWxvbmcgdG8gdGhlIHN1YnJlcXVlc3QgaGFuZGxlcihzKS4KCi0gQyBidWdmaXg6IGFwcmVxX2RlY29kZSBbR3JhaGFtIENsYXJrXQogIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBzYW1lCiAgcG9pbnRlciAtIGUuZy4gaWYgY2FsbGVkIGFzIGFwcmVxX3VuZXNjYXBlKHMpIC0gc3RyaW5nIHMgaXMgbW9kaWZpZWQKICBpbmNvcnJlY3RseSBpbiBnZW5lcmFsLiAgUGF0Y2ggaW5jbHVkZXMgbmV3IHVuaXQgdGVzdC4KCi0gUGVybCBBUEkgW2pvZXNdCiAgQWRkZWQgJHJlcS0+cGFyc2UsICRyZXEtPnN0YXR1cywgJiAicHJlcGFyc2UiIGxvZ2ljIAogIHRvICRyZXEtPnBhcmFtICYgJHJlcS0+dXBsb2FkLgoKLSBDIEFQSSBbam9lc10KICBBZGRlZCAicHJlcGFyc2UiIGxvZ2ljIHRvIGFwcmVxX3BhcmFtcyAmIGFwcmVxX3VwbG9hZHMKICB0byBicmluZyBiZWhhdmlvciBpbiBsaW5lIHdpdGggbGliYXByZXEtMS54LgoKLSBDIEFQSSBbam9lc10KICBEcm9wcGVkIHBhcmFtLT5jaGFyc2V0LgogIE1ha2UgYXByZXFfYnJpZ2FkZV9jb25jYXQgcHVibGljLCBzbyBtb2RfYXByZXEgY2FuIHVzZSBpdAogIGZvciBpdHMgY3R4LT5zcG9vbCBicmlnYWRlLgoKLSBEb2N1bWVudGF0aW9uIFtqb2VzXQogIFVwZGF0ZWQgQ29va2llX3BvZCB0byByZWZsZWN0IEFQSSBjaGFuZ2VzIG92ZXIgdjEuWC4KCi0gRG9jdW1lbnRhdGlvbiBbam9lc10KICBBZGRlZCBkb3h5Z2VuIGxpbmtzIHRvIEFwYWNoZTo6UmVxdWVzdCBhbmQgQXBhY2hlOjpDb29raWUgCiAgcGVybCBkb2NzLgoKLSBDIEFQSSBbam9lc10KICBBZGRlZCBhcHJlcV9jb3B5X2JyaWdhZGUoYmIpIHRvIGFwcmVxLmguCgotIEMgQVBJIFtqb2VzXQogIFRoZSBuZXcgZmlsdGVyLWJhc2VkIGRlc2lnbiByZXF1aXJlZCBhIGNvbXBsZXRlIAogIGRlcGFydHVyZSBmcm9tIGxpYmFwcmVxLTEuWCBjb2RlYmFzZS4gbGliYXByZXEtMgogIGlzIGJhc2VkIHNvbGVseSBvbiBBUFIsIGFuZCB0byBiZSBmdWxseSBmdW5jdGlvbmFsLCAKICByZXF1aXJlcyBhIHN1cHBvcnRpbmcgZW52aXJvbm1lbnQgc2ltaWxhciB0byBBcGFjaGUtMi4KICBBIHBlcnNvbiB3aXNoaW5nIHRvIHBvcnQgbGliYXByZXEtMiB0byBhIG5ldyBlbnZpcm9ubWVudAogIG5lZWRzIHRvIHByb3ZpZGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBkZWNsYXJhdGlvbnMgaW4gYXByZXFfZW52LmguCgotIFBlcmwgQVBJIFtqb2VzXQogIEFnZ3JlZ2F0ZXMgYXJlIGFsd2F5cyBjb2xsZWN0ZWQgaW50byBhbiBBUFI6OlRhYmxlLWJhc2VkIHBhY2thZ2UuCiAgTmV3IHRhYmxlIHBhY2thZ2VzOiBBcGFjaGU6OkNvb2tpZTo6VGFibGUsIEFwYWNoZTo6UmVxdWVzdDo6VGFibGUsCiAgYW5kIEFwYWNoZTo6VXBsb2FkOjpUYWJsZS4KCi0gUGVybCBBUEkgW2pvZXNdCiAgQXBhY2hlOjpDb29raWUtPmZldGNoIG5vdyByZXF1aXJlcyBhbiAiZW52aXJvbm1lbnQiIGFyZ3VtZW50ICgkcikuCiAgSXRzIHJldHVybiB2YWx1ZSBpcyBibGVzc2VkIGludG8gdGhlIEFwYWNoZTo6Q29va2llOjpKYXIgY2xhc3MuCgotIFBlcmwgQVBJIFtqb2VzXQogIFR3byBuZXcgcmVxdWVzdCBsb29rdXAgZnVuY3Rpb25zOgogIC0jICRyZXEtPmFyZ3MgLSBwYXJhbSBsb29rdXAgdXNpbmcgb25seSB0aGUgcXVlcnkgc3RyaW5nCiAgLSMgJHJlcS0+Ym9keSAtIHBhcmFtIGxvb2t1cCB1c2luZyBvbmx5IHRoZSBQT1NUIGRhdGEKCgoqKi8K