ICBDaGFuZ2Vsb2cgZm9yIHRoZSBjLWFyZXMgcHJvamVjdAoKVmVyc2lvbiAxLjcuNCAoRGVjZW1iZXIgOSwgMjAxMCkKCkNoYW5nZWQ6CgogbyBsb2NhbC1iaW5kOiBTdXBwb3J0IGJpbmRpbmcgdG8gbG9jYWwgaW50ZXJmYWNlL0lQcywgc2VlCiAgIGFyZXNfc2V0X2xvY2FsX2lwNCwgYXJlc19zZXRfbG9jYWxfaXA2LCBhcmVzX3NldF9sb2NhbF9kZXYKCkZpeGVkOgoKIG8gbWVtb3J5IGxlYWsgaW4gYXJlc19nZXRuYW1laW5mbwogbyBhZGQgbWlzc2luZyBicmVhayB0aGF0IGNhdXNlZCBnZXRfYXJlc19zZXJ2ZXJzIHRvIGZhaWwKIG8gYXJlc19wYXJzZV9hX3JlcGx5OiBmaXggQ05BTUUgcmVzcG9uc2UgcGFyc2luZwogbyBpbml0X2J5X29wdGlvbnM6IGRvbid0IGNvcHkgYW4gZW1wdHkgc29ydGxpc3QKIG8gUmVwbGFjZWQgdWludDMyX3Qgd2l0aCB1bnNpZ25lZCBpbnQgdG8gZml4IGJyb2tlbiBidWlsZHMKICAgb24gYSBjb3VwbGUgb2YgcGxhdGZvcm1zCiBvIEZpeCBsb29rdXAgd2l0aCBIT1NUQUxJQVNFUyBzZXQKIG8gYWRpZzogZml4IE5BUFRSIHBhcnNpbmcKIG8gY29tcGlsZXIgd2FybmluZyBjbGVhbnVwcwoKVmVyc2lvbiAxLjcuMyAoSnVuZSAxMSwgMjAxMCkKCkZpeGVkOgoKIG8gYnVpbGRzIG9uIEFuZHJvaWQKIG8gbm93IGluY2x1ZGVzIGFsbCBmaWxlcyBuZWNlc3NhcnkgdG8gYnVpbGQgaXQgKDEuNy4yIGxhY2tlZCBhIGZpbGUpCgpWZXJzaW9uIDEuNy4yIChKdW5lIDEwLCAyMDEwKQoKQ2hhbmdlZDoKCiBvIEFkZGVkIGFyZXNfcGFyc2VfbXhfcmVwbHkoKQoKRml4ZWQ6CgogbyBhcmVzX2luaXQ6IExhc3QsIG5vdCBmaXJzdCBpbnN0YW5jZSBvZiBkb21haW4gb3Igc2VhcmNoIHNob3VsZCB3aW4KIG8gaW1wcm92ZSBhbHRlcm5hdGl2ZSBkZWZpbml0aW9uIG9mIGJvb2wKIG8gZml4IFZTMjAxMCBjb21waWxlciB3YXJuaW5ncwoKClZlcnNpb24gMS43LjEgKE1hciAyMywgMjAxMCkKCiogTWF5IDMxLCAyMDEwIChKYWt1YiBIcm96ZWspCi0gVXNlIHRoZSBsYXN0IGluc3RhbmNlIG9mIGRvbWFpbi9zZWFyY2gsIG5vdCB0aGUgZmlyc3Qgb25lCgoqIE1hcmNoIDIzLCAyMDEwIChEYW5pZWwgU3RlbmJlcmcpCi0gV2Ugc3dpdGNoZWQgZnJvbSBDVlMgdG8gZ2l0LiBTZWUgaHR0cDovL2dpdGh1Yi5jb20vYmFnZGVyL2MtYXJlcwoKKiBNYXJjaCA1LCAyMDEwIChEYW5pZWwgU3RlbmJlcmcpCi0gRGFuaWVsIEpvaG5zb24gcHJvdmlkZWQgZml4ZXMgZm9yIGJ1aWxkaW5nIHdpdGggdGhlIGNsYW5nIGNvbXBpbGVyLgoKKiBNYXJjaCA1LCAyMDEwIChZYW5nIFRzZSkKLSBBZGRlZCBJUHY2IG5hbWUgc2VydmVycyBzdXBwb3J0LiBJbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBiYXNlZCBvbiBjb2RlLAogIGNvbW1lbnRzIGFuZCBmZWVkYmFjayBwcm92aWRlZCBOb3ZlbWJlciBhbmQgRGVjZW1iZXIgb2YgMjAwOCBieSBEYW5pZWwKICBTdGVuYmVyZywgR3JlZ29yIEphc255LCBQaGlsIEJsdW5kZWxsIGFuZCBteXNlbGYsIERlY2VtYmVyIDIwMDkgYnkgQ2VkcmljCiAgQmFpbCwgYW5kIEZlYnJ1YXJ5IDIwMTAgYnkgSmFrdWIgSHJvemVrIG9uIHRoZSBjLWFyZXMgbWFpbGluZyBsaXN0LiBPbgogIE1hcmNoIEkgcmV2aWV3ZWQgYWxsIHRoYXQsIHNlbGVjdGVkIHRoZSBiZXN0IG9mIGVhY2gsIGFuZCBhZGp1c3RlZCBvcgogIGV4dGVuZGVkIHBhcnRzIG9mIGl0IHRvIG1ha2UgdGhlIGJlc3QgZml0LgoKICBUaGUgZXh0ZXJuYWwgYW5kIHZpc2libGUgcmVzdWx0IG9mIGFsbCB0aGlzIGlzIHRoYXQgdHdvIG5ldyBmdW5jdGlvbnMgYXJlCiAgYWRkZWQgdG8gdGhlIGV4dGVybmFsIEFQSSwgYXJlc19nZXRfc2VydmVycygpIGFuZCBhcmVzX3NldF9zZXJ2ZXJzKCksIHdoaWNoCiAgYmVjb21lcyBub3cgdGhlIHByZWZlcnJlZCB3YXkgb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBuYW1lIHNlcnZlcnMgZm9yIGFueQogIGFyZXMgY2hhbm5lbCBhcyB0aGVzZSBzdXBwb3J0IGJvdGggSVB2NCBhbmQgSVB2NiBuYW1lIHNlcnZlcnMuCgogIEluIG9yZGVyIHRvIG5vdCBicmVhayBBQkkgY29tcGF0aWJpbGl0eSwgYXJlc19pbml0X29wdGlvbnMoKSB3aXRoIG9wdGlvbgogIG1hc2sgQVJFU19PUFRfU0VSVkVSUyBhbmQgYXJlc19zYXZlX29wdGlvbnMoKSBtYXkgc3RpbGwgYmUgdXNlZCBpbiBjb2RlCiAgd2hpY2ggaXMgaW50ZW5kZWQgdG8gcnVuIG9uIElQdjQtb25seSBzdGFja3MuIEJ1dCByZW1lbWJlciB0aGF0IHRoZXNlCiAgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IElQdjYgbmFtZSBzZXJ2ZXJzLiBUaGlzIGltcGxpZXMgdGhhdCBpZiB0aGUgdXNlcgogIGlzIGNhcGFibGUgb2YgZGVmaW5pbmcgb3IgcHJvdmlkaW5nIGFuIElQdjYgbmFtZSBzZXJ2ZXIsIGFuZCB0aGUgYXBwIGlzCiAgdXNpbmcgYXJlc19pbml0X29wdGlvbnMoKSBvciBhcmVzX3NhdmVfb3B0aW9ucygpIGF0IHNvbWUgcG9pbnQgdG8gaGFuZGxlCiAgdGhlIG5hbWUgc2VydmVycywgdGhlIGFwcCB3aWxsIGxpa2VseSBsb3NlIElQdjYgbmFtZSBzZXJ2ZXJzLgoKKiBKYW51YXJ5IDI4LCAyMDEwIChEYW5pZWwgU3RlbmJlcmcpCi0gVG9tbWllIEdhbm5lcnQgcG9pbnRlZCBvdXQgYSBzaWxseSBidWcgaW4gYXJlc19wcm9jZXNzX2ZkKCkgc2luY2UgaXQgZGlkbid0CiAgY2hlY2sgZm9yIGJyb2tlbiBjb25uZWN0aW9ucyBsaWtlIGFyZXNfcHJvY2VzcygpIGRpZC4gQmFzZWQgb24gdGhhdCwgSQogIG1lcmdlZCB0aGUgdHdvIGZ1bmN0aW9ucyBpbnRvIGEgc2luZ2xlIGdlbmVyaWMgb25lIHdpdGggdHdvIGZyb250LWVuZHMuCgoqIERlY2VtYmVyIDI5LCAyMDA5IChZYW5nIFRzZSkKLSBMYXN6bG8gVGFtYXMgU3phYm8gYWRqdXN0ZWQgTWFrZWZpbGUubXN2YyBjb21waWxlciBvcHRpb25zIHNvIHRoYXQgd2hlcmUKICBydW4tdGltZSBlcnJvciBjaGVja3MgZW5hYmxpbmcgY29tcGlsZXIgb3B0aW9uIC9HWiB3YXMgdXNlZCBpdCBpcyByZXBsYWNlZAogIHdpdGggZXF1aXZhbGVudCAvUlRDc3UgZm9yIFZpc3VhbCBTdHVkaW8gMjAwMyBhbmQgbmV3ZXIgdmVyc2lvbnMuIE9wdGlvbgogIC9HWCBpcyByZXBsYWNlZCB3aXRoIGVxdWl2YWxlbnQgL0VIc2MgZm9yIGFsbCB2ZXJzaW9ucy4gQWxzbyBmaXhlZCBzb2NrZXQKICBkYXRhIHR5cGUgZm9yIGludGVybmFsIGNvbmZpZ3VyZV9zb2NrZXQgZnVuY3Rpb24uCgoqIERlY2VtYmVyIDIxLCAyMDA5IChZYW5nIFRzZSkKLSBJbmdtYXIgUnVuZ2Ugbm90aWNlZCB0aGF0IFdpbmRvd3MgY29uZmlnLXdpbjMyLmggY29uZmlndXJhdGlvbiBmaWxlCiAgZGlkIG5vdCBpbmNsdWRlIGEgZGVmaW5pdGlvbiBmb3IgSEFWRV9DTE9TRVNPQ0tFVCB3aGljaCByZXN1bHRlZCBpbgogIGZ1bmN0aW9uIGNsb3NlKCkgYmVpbmcgaW5hcHByb3ByaWF0ZWx5IHVzZWQgdG8gY2xvc2Ugc29ja2V0cy4KClZlcnNpb24gMS43LjAgKE5vdiAzMCwgMjAwOSkKCiogTm92ZW1iZXIgMjYsIDIwMDkgKFlhbmcgVHNlKQotIExhcnJ5IExhbnNpbmcgZml4ZWQgYXJlc19wYXJzZV9zcnZfcmVwbHkgdG8gcHJvcGVybHkgcGFyc2UgcmVwbGllcwogIHdoaWNoIG1pZ2h0IGNvbnRhaW4gbm9uLVNSViBhbnN3ZXJzLCBza2lwcGluZyBvdmVyIHBvdGVudGlhbCBub24tU1JWCiAgb25lcyBzdWNoIGFzIENOQU1Fcy4KCiogTm92ZW1iZXIgMjMsIDIwMDkgKFlhbmcgVHNlKQotIENoYW5nZWQgbmFtaW5nIGNvbnZlbnRpb24gZm9yIGMtYXJlcyBsaWJyYXJpZXMgYnVpbHQgd2l0aCBNU1ZDLCBkZXRhaWxzCiAgYW5kIGJ1aWxkIGluc3RydWN0aW9ucyBwcm92aWRlZCBpbiBSRUFETUUubXN2YyBmaWxlLgoKKiBOb3ZlbWJlciAyMiwgMjAwOSAoWWFuZyBUc2UpCi0gSmFrdWIgSHJvemVrIGZpeGVkIG1vcmUgZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBtYW4gcGFnZXMgdG8gc3luYyB0aGVtCiAgd2l0aCB0aGUgb25lcyBkZWNsYXJlZCBpbiBhcmVzLmgKCi0gSmFrdWIgSHJvemVrIHJlbmFtZWQgYWRkcnR0bCBhbmQgYWRkcjZ0dGwgc3RydWN0cyB0byBhcmVzX2FkZHJ0dGwgYW5kCiAgYXJlc19hZGRyNnR0bCBpbiBvcmRlciB0byBwcmV2ZW50IG5hbWUgc3BhY2UgcG9sbHV0aW9uLCBhbG9uZyB3aXRoCiAgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gY29kZSBiYXNlIGFuZCBtYW4gcGFnZXMuVGhpcyBjaGFuZ2UgZG9lcyBub3QgYnJlYWsKICBBQkksIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVjb21waWxlIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4gQnV0IGV4aXN0aW5nCiAgYXBwbGljYXRpb25zIHVzaW5nIHRoZXNlIHN0cnVjdHMgd2l0aCB0aGUgb2xkIG5hbWUgd2lsbCBuZWVkIHNvdXJjZSBjb2RlCiAgYWRqdXN0bWVudHMgd2hlbiByZWNvbXBpbGVkIHVzaW5nIGMtYXJlcyAxLjcuMC4KCiogTm92ZW1iZXIgMjEsIDIwMDkgKFlhbmcgVHNlKQotIEFkZGVkIG1hbmlmZXN0IHN0dWZmIHRvIE1ha2VmaWxlLm1zdmMuCgoqIE5vdmVtYmVyIDIwLCAyMDA5IChZYW5nIFRzZSkKLSBGaXhlZCBzZXZlcmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgaW4gbWFuIHBhZ2VzIHRoYXQgd2VyZSBvdXQgb2Ygc3luYwogIHdpdGggdGhlIG9uZXMgZGVjbGFyZWQgaW4gYXJlcy5oLiAgQWRkZWQgYXJlc19mcmVlX2RhdGEoKSBhbG9uZyB3aXRoCiAgbWFuIHBhZ2UuICBVcGRhdGVkIGFyZXNfcGFyc2Vfc3J2X3JlcGx5KCkgYW5kIGFyZXNfcGFyc2VfdHh0X3JlcGx5KCkKICB3aXRoIGNoYW5nZXMgZnJvbSBKYWt1YiBIcm96ZWsgbWFraW5nIHRoZXNlIG5vdyByZXR1cm4gbGlua2VkIGxpc3RzCiAgaW5zdGVhZCBvZiBhcnJheXMsIGFuZCBtZXJnaW5nIHRoZSBhcmVzX2ZyZWVfZGF0YSgpIGFkanVzdG1lbnRzLgoKKiBOb3ZlbWJlciAxMCwgMjAwOSAoWWFuZyBUc2UpCi0gVXBkYXRlZCBNU1ZDIDYuMCBwcm9qZWN0IGZpbGVzIHRvIG1hdGNoIHNldHRpbmdzIGZyb20gTWFrZWZpbGUubXN2Yy4KCiogTm92ZW1iZXIgOSwgMjAwOSAoWWFuZyBUc2UpCi0gTWFrZWZpbGUubXN2YyBpcyBub3cgdGhlIHJlZmVyZW5jZSBtZXRob2QgdG8gYnVpbGQgYy1hcmVzIGFuZCBzYW1wbGUKICBwcm9ncmFtcyB3aXRoIGFueSBNU1ZDIGNvbXBpbGVyIG9yIE1TIFZpc3VhbCBTdHVkaW8gdmVyc2lvbi4gIElmIG5vCiAgb3B0aW9uIG9yIHRhcmdldCBhcmUgc3BlY2lmaWVkIGl0IGJ1aWxkcyBkeW5hbWljIGFuZCBzdGF0aWMgYy1hcmVzCiAgbGlicmFyaWVzIGluIGRlYnVnIGFuZCByZWxlYXNlIGZsYXZvdXJzIGFuZCBhbHNvIGJ1aWxkcyBhbGwgc2FtcGxlCiAgcHJvZ3JhbXMgdXNpbmcgZWFjaCBvZiB0aGUgZGlmZmVyZW50IGMtYXJlcyBsaWJyYXJpZXMuCgoqIE5vdmVtYmVyIDIsIDIwMDkgKFlhbmcgVHNlKQotIFJlbmFtZWQgYy1hcmVzIHNldHVwLmggdG8gYXJlc19zZXR1cC5oCgoqIE9jdG9iZXIgMzEsIDIwMDkgKFlhbmcgVHNlKQotIFN5bWJvbCBoaWRpbmcgY29uZmlndXJlIG9wdGlvbnMgYXJlIG5hbWVkIG5vdyAtLWVuYWJsZS1zeW1ib2wtaGlkaW5nCiAgYW5kIC0tZGlzYWJsZS1zeW1ib2wtaGlkaW5nIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGVtIGxlc3MgYW1iaWd1b3VzLgoKKiBPY3RvYmVyIDMwLCAyMDA5IChZYW5nIFRzZSkKLSBNYW55IGZpeGVzIGZvciBhcmVzX3BhcnNlX3R4dF9yZXBseSgpCgoqIE9jdG9iZXIgMjksIDIwMDkgKERhbmllbCBTdGVuYmVyZykKLSBKYWt1YiBIcm96ZWsgYWRkZWQgYXJlc19wYXJzZV90eHRfcmVwbHkoKSBmb3IgVFhUIHBhcnNpbmcKCiogT2N0b2JlciAyOSwgMjAwOSAoWWFuZyBUc2UpCi0gVXBkYXRlZCBNU1ZDIDYuMCB3b3Jrc3BhY2UgYW5kIHByb2plY3QgZmlsZXMgdGhhdCBhbGxvd3MgYnVpbGRpbmcKICBkeW5hbWljIGFuZCBzdGF0aWMgYy1hcmVzIGxpYnJhcmllcyBpbiBkZWJ1ZyBhbmQgcmVsZWFzZSBmbGF2b3Vycy4KICBBZGRpdGlvbmFsbHkgZWFjaCBvZiB0aGUgdGhyZWUgc2FtcGxlIHByb2dyYW1zIGlzIGJ1aWx0IGFnYWluc3QKICBlYWNoIG9mIHRoZSBmb3VyIHBvc3NpYmxlIGMtYXJlcyBsaWJyYXJpZXMsIGdlbmVyYXRpbmcgYWxsIHRoaXMKICBhIHRvdGFsIG51bWJlciBvZiAxMiBleGVjdXRhYmxlcyBhbmQgNCBsaWJyYXJpZXMuCgoqIE9jdG9iZXIgMjgsIDIwMDkgKFlhbmcgVHNlKQotIEluaXRpYWwgc3RlcCB0b3dhcmRzIHRoZSBhYmlsaXR5IHRvIHJlZHVjZSBjLWFyZXMgZXhwb3J0ZWQgc3ltYm9scwogIHdoZW4gYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSBiYXNlZCBvbiB0aGUgJ3Zpc2liaWxpdHknIGF0dHJpYnV0ZQogIGZvciBHTlVDIGFuZCBJbnRlbCBjb21waWxlcnMgYW5kIGJhc2VkIG9uIF9fZ2xvYmFsIGZvciBTdW4gY29tcGlsZXJzLAogIHRha2luZyBhbHNvIGluIGFjY291bnQgX19kZWNsc3BlYyBmdW5jdGlvbiBkZWNvcmF0aW9uIGZvciBXaW4zMiBhbmQKICBTeW1iaWFuIERMTCdzLgoKKiBPY3RvYmVyIDI3LCAyMDA5IChZYW5nIFRzZSkKLSBGaXhlZCBQZWxsZXMgQyBXaW4zMiB0YXJnZXQgY29tcGlsYXRpb24gaXNzdWVzLgoKKiBPY3RvYmVyIDIzLCAyMDA5IChZYW5nIFRzZSkKLSBKb2huIEVuZ2VsaGFydCBub3RpY2VkIGFuIHVucmVsZWFzZWQgcHJvYmxlbSByZWxhdGl2ZSB0byBhIGR1cGxpY2F0ZQogIEFSRVNfRUNBTkNFTExFRCBlcnJvciBjb2RlIHZhbHVlIGFuZCBtaXNzaW5nIGVycm9yIGNvZGUgZGVzY3JpcHRpb24uCgoqIE9jdG9iZXIgNywgMjAwOSAoWWFuZyBUc2UpCi0gT3ZlcmhhdWxlZCBhcmVzX19nZXRfaG9zdGVudCgpIEZpeGluZyBvdXQgb2YgYm91bmRzIG1lbW9yeSBvdmVyd3JpdGUKICB0cmlnZ2VyZWQgd2l0aCBtYWxmb3JtZWQgL2V0Yy9ob3N0cyBmaWxlLiBJbXByb3ZpbmcgcGFyc2luZyBvZiAvZXRjL2hvc3RzCiAgZmlsZS4gVmFsaWRhdGluZyByZXF1ZXN0ZWQgYWRkcmVzcyBmYW1pbHkuIEVuc3VyaW5nIHRoYXQgZmFpbHVyZXMgYWx3YXlzCiAgcmV0dXJuIGEgTlVMTCBwb2ludGVyLiBBZGp1c3RpbmcgaGVhZGVyIGluY2x1c2lvbnMuCgoqIE9jdG9iZXIgNiwgMjAwOSAoWWFuZyBUc2UpCi0gRml4IHNzaXplX3QgcmVkZWZpbml0aW9uIGVycm9ycyBvbiBXSU42NCByZXBvcnRlZCBieSBBbGV4ZXkgU2ltYWsuCgoqIFNlcHRlbWJlciAyOSwgMjAwOSAoWWFuZyBUc2UpCi0gTWFrZSBjb25maWd1cmUgc2NyaXB0IGFsc28gY2hlY2sgaWYgX1JFRU5UUkFOVCBkZWZpbml0aW9uIGlzIHJlcXVpcmVkIHRvCiAgbWFrZSBlcnJubyBhdmFpbGFibGUgYXMgYSBwcmVwcm9jZXNzb3IgbWFjcm8uCgoqIFNlcHRlbWJlciA3LCAyMDA5IChZYW5nIFRzZSkKLSBBZGQgVF9TUlYgcG9ydGFiaWxpdHkgY2hlY2sgdG8gYXJlc19wYXJzZV9zcnZfcmVwbHkuYwoKKiA0IFNlcCAyMDA5IChEYW5pZWwgU3RlbmJlcmcpCi0gSmFrdWIgSHJvemVrIGFkZGVkIGFyZXNfcGFyc2Vfc3J2X3JlcGx5KCkgZm9yIFNSViBwYXJzaW5nCgoqIDMgQXVnIDIwMDkgKERhbmllbCBTdGVuYmVyZykKLSBKb3NodWEgS3dhbiBmaXhlZCB0aGUgaW5pdCByb3V0aW5lIHRvIGZpbGwgaW4gdGhlIGRlZmF1bHRzIGZvciBzdHVmZiB0aGF0CiAgZmFpbHMgdG8gZ2V0IGluaXRlZCBieSBvdGhlciBtZWFucy4gVGhpcyBmaXhlcyBhIGNhc2Ugb2Ygd2hlbiB0aGUgYy1hcmVzCiAgaW5pdCBmYWlscyB3aGVuIGludGVybmV0IGFjY2VzcyBpcyBmb25lLgoKLSBUaW1vIFRlcmFzIGNoYW5nZWQgdGhlIHJlYXNvbiBjb2RlIHVzZWQgaW4gdGhlIHJlc29sdmUgY2FsbGJhY2sgZG9uZSB3aGVuCiAgYXJlc19jYW5jZWwoKSBpcyB1c2VkLCB0byBiZSBBUkVTX0VDQU5DRUxMRUQgaW5zdGVhZCBvZiBBUkVTX0VUSU1FT1VUIHRvCiAgYmV0dGVyIGFsbG93IHRoZSBjYWxsYmFjayB0byBrbm93IHdoYXQncyBoYXBwZW5pbmcuCgoqIDE0IEp1bCAyMDA5IChHdWVudGVyIEtuYXVmKQotIHJlbmFtZWQgZ2VuZXJhdGVkIGNvbmZpZy5oIHRvIGFyZXNfY29uZmlnLmggdG8gYXZvaWQgYW55IGZ1dHVyZSBjbGFzaGVzCiAgd2l0aCBjb25maWcuaCBmcm9tIG90aGVyIHByb2plY3RzLgoKKiBKdW5lIDIwIDIwMDkgKFlhbmcgVHNlKQotIFJlZmFjdG9yIGhvdyBsaWJyYXJpZXMgYXJlIGNoZWNrZWQgZm9yIGNvbm5lY3QoKSBmdW5jdGlvbiBpbiBjb25maWd1cmUKICBzY3JpcHQgYW5kIGNoZWNrIGZvciBjb25uZWN0KCkgYXMgaXQgaXMgZG9uZSBmb3Igb3RoZXIgZnVuY3Rpb25zLgoKKiBKdW5lIDE5IDIwMDkgKFlhbmcgVHNlKQotIE1ha2Ugc2Nsb3NlKCkgZnVuY3Rpb24tbGlrZSBtYWNybyBkZWZpbml0aW9uIHVzZWQgdG8gY2xvc2UgYSBzb2NrZXQsCiAgbm93IHNvbGVseSBiYXNlZCBvbiBIQVZFX0NMT1NFU09DS0VUIGFuZCBIQVZFX0NMT1NFU09DS0VUX0NBTUVMCiAgY29uZmlnIGZpbGUgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zCgoqIEp1bmUgMTggMjAwOSAoWWFuZyBUc2UpCi0gQWRkIENsb3NlU29ja2V0IGNhbWVsIGNhc2UgZnVuY3Rpb24gY2hlY2sgZm9yIGNvbmZpZ3VyZSBzY3JpcHQuCgoqIEp1bmUgMTcgMjAwOSAoWWFuZyBUc2UpCi0gQ2hlY2sgZm9yIHNvY2tldCgpIGFuZCBjbG9zZXNvY2tldCgpIGFzIGl0IGlzIGRvbmUgZm9yIG90aGVyIGZ1bmN0aW9ucwogIGluIGNvbmZpZ3VyZSBzY3JpcHQuCgoqIEp1bmUgMTEgMjAwOSAoWWFuZyBUc2UpCi0gTW9kaWZpZWQgYnVpbGRjb25mIHNvIHRoYXQgd2hlbiBhdXRvbWFrZSBydW5zIGl0IGNvcGllcyBtaXNzaW5nIGZpbGVzCiAgaW5zdGVhZCBvZiBzeW1saW5raW5nIHRoZW0uCgoqIEp1bmUgOCAyMDA5IChZYW5nIFRzZSkKLSBSZW1vdmVkIGJ1aWxkY29uZi5iYXQgZnJvbSByZWxlYXNlIGFuZCBkYWlseSBzbmFwc2hvdCBhcmNoaXZlcy4gVGhpcwogIGZpbGUgaXMgb25seSBmb3IgQ1ZTIHRyZWUgY2hlY2tvdXQgYnVpbGRzLgoKKiBNYXkgMjYgMjAwOSAoWWFuZyBUc2UpCi0gQWRkZWQgLS1lbmFibGUtY3VybGRlYnVnIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGJ1aWxkaW5nCiAgd2l0aCB0aGUgbG93LWxldmVsIGN1cmwgZGVidWcgbWVtb3J5IHRyYWNraW5nICdmZWF0dXJlJyB0byBhbGxvdyBkZWNvdXBsZWQKICBzZXR0aW5nIGZyb20gLS1lbmFibGUtZGVidWcsIGFsbG93aW5nIGFnYWluIHRvIGJ1aWxkIGMtYXJlcyBpbmRlcGVuZGVudGx5CiAgb3V0IG9mIHRoZSBDVlMgdHJlZS4KCiAgRm9yIHRoZSBjLWFyZXMgbGlicmFyeSBvcHRpb24gLS1lbmFibGUtZGVidWcgZW5hYmxlcyBkZWJ1ZyBidWlsZCBmZWF0dXJlcwogIHdoaWNoIGFyZSBfbm90XyByZWxhdGVkIHdpdGggbWVtb3J5IHRyYWNraW5nLiBGb3IgdGhlIGMtYXJlcyBsaWJyYXJ5IHdoZW4KICAtLWVuYWJsZS1kZWJ1ZyBpcyBnaXZlbiBpdCBkb2VzIG5vdCBlbmFibGUgdGhlIG1lbW9yeSB0cmFja2luZyBmZWF0dXJlLiBJZgogIHlvdSB3aXNoIHRvIGVuYWJsZSB0aGUgY3VybCBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcgeW91IG11c3QgdXNlIGNvbmZpZ3VyZQogIG9wdGlvbiAtLWVuYWJsZS1jdXJsZGVidWcgZXhwbGljaXRpbHkgdG8gZG8gc28uCgogIEludGVybmFsbHksIGRlZmluaXRpb24gb2YgcHJlcHJvY2Vzc29yIHN5bWJvbCBERUJVR0JVSUxEIHJlc3RyaWN0cyBjb2RlCiAgd2hpY2ggaXMgb25seSBjb21waWxlZCBmb3IgZGVidWcgZW5hYmxlZCBidWlsZHMuIEFuZCBzeW1ib2wgQ1VSTERFQlVHIGlzCiAgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGNvZGUgd2hpY2ggaXMgX29ubHlfIHVzZWQgZm9yIG1lbW9yeSB0cmFja2luZy4KCiAgTWFrZSBhcmVzX2luaXQoKSwgYXJlc19kdXAoKSBhbmQgYXJlc19pbml0X29wdGlvbnMoKSBmYWlsIHJldHVybmluZwogIEFSRVNfRU5PVElOSVRJQUxJWkVEIGlmIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gaGFzIG5vdCBiZWVuIHBlcmZvcm1lZAogIGNhbGxpbmcgYXJlc19saWJyYXJ5X2luaXQoKS4KCiogTWF5IDIwIDIwMDkgKFlhbmcgVHNlKQotIEFkZGVkIGFyZXNfbGlicmFyeV9pbml0KCkgYW5kIGFyZXNfbGlicmFyeV9jbGVhbnVwKCkgbWFuIHBhZ2VzLgoKKiBNYXkgMTkgMjAwOSAoWWFuZyBUc2UpCi0gSW50cm9kdWNlZCBhcmVzX2xpYnJhcnlfaW5pdCgpIGFuZCBhcmVzX2xpYnJhcnlfY2xlYW51cCgpIGZ1bmN0aW9ucy4KCiAgVGhpcyBpcyBhbiBBUEkgYW5kIEFCSSBicmVhayBmb3IgV2luMzIvNjQgc3lzdGVtcy4gTm9uLVdpbjMyLzY0IGJ1aWxkIHRhcmdldHMKICB1c2luZyBjLWFyZXMgMS43LjAgY2FuIHN0aWxsIHN1cnZpdmUgd2l0aG91dCBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucy4gUmVhZCBhbGwKICB0aGUgZGV0YWlscyBvbiBhcmVzX2xpYnJhcnlfaW5pdCgzKSBhbmQgYXJlc19saWJyYXJ5X2NsZWFudXAoMykgbWFuIHBhZ2VzIHRoYXQKICBhcmUgaW5jbHVkZWQuCgogIGN1cmwvbGliY3VybCA3LjE5LjUgaXMgZnVsbHkgY29tcGF0aWJsZSB3aXRoIGMtYXJlcyAxLjcuMCBvbiBhbGwgc3lzdGVtcy4KCiAgSW4gb3JkZXIgdG8gdXNlIGMtYXJlcyAxLjcuMCB3aXRoIGN1cmwvbGliY3VybCBvbiBXaW4zMi82NCBzeXN0ZW1zIGl0IGlzCiAgcmVxdWlyZWQgdGhhdCBjdXJsL2xpYmN1cmwgaXMgNy4xOS41IG9yIG5ld2VyLiBJbiBvdGhlciB3b3JkcywgaXQgaXMgbm90CiAgcG9zc2libGUgb24gV2luMzIvNjQgdG8gdXNlIGMtYXJlcyAxLjcuMCB3aXRoIGEgY3VybC9saWJjdXJsIHZlcnNpb24gbGVzcwogIHRoYW4gNy4xOS41CgoqIE1heSAxMSAyMDA5IChEYW5pZWwgU3RlbmJlcmcpCi0gR3JlZ29yIEphc255IG1hZGUgYy1hcmVzIGxpbmsgd2l0aCBsaWJ0b29sICdzIC1leHBvcnQtc3ltYm9scy1yZWdleCBvcHRpb24gdG8KICBvbmx5IGV4cG9zZSBmdW5jdGlvbnMgc3RhcnRpbmcgd2l0aCBhcmVzXy4KCiogTWF5IDcgMjAwOSAoWWFuZyBUc2UpCi0gRml4IGFuIG00IG92ZXJxdW90aW5nIHRyaWdnZXJpbmcgYSBzcHVyaW91cyAnQVNfVFJfQ1BQJyBzeW1ib2wgZGVmaW5pdGlvbgogIGF0dGVtcHQgaW4gZ2VuZXJhdGVkIGNvbmZpZy5oCgoqIE1heSAyIDIwMDkgKFlhbmcgVHNlKQotIFVzZSBhIGJ1aWxkLXRpbWUgY29uZmlndXJlZCBhcmVzX3NvY2tsZW5fdCBkYXRhIHR5cGUgaW5zdGVhZCBvZiBzb2NrbGVuX3QuCgoqIEFwcmlsIDIxIDIwMDkgKFlhbmcgVHNlKQotIE1vdmVkIHBvdGVudGlhbCBpbmNsdXNpb24gb2Ygc3lzdGVtJ3MgbWFsbG9jLmggYW5kIG1lbW9yeS5oIGhlYWRlciBmaWxlcyB0bwogIHNldHVwX29uY2UuaC4gIEluY2x1c2lvbiBvZiBlYWNoIGhlYWRlciBmaWxlIGlzIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIG9mCiAgTkVFRF9NQUxMT0NfSCBhbmQgTkVFRF9NRU1PUllfSCByZXNwZWN0aXZlbHkuCgoqIE1hcmNoIDExIDIwMDkgKFlhbmcgVHNlKQotIEphcGhldGggQ2xlYXZlciBmaXhlZCBhY291bnRyeS5jIHJlcGxhY2luZyB1X2xvbmcgd2l0aCB1bnNpZ25lZCBsb25nLgoKKiBGZWJydWFyeSAyMCAyMDA5IChZYW5nIFRzZSkKLSBEbyBub3QgaGFsdCBjb21waWxhdGlvbiB3aGVuIHVzaW5nIFZTMjAwOCB0byBidWlsZCBhIFdpbmRvd3MgMjAwMCB0YXJnZXQuCgoqIEZlYnJ1YXJ5IDMgMjAwOSAoUGhpbCBCbHVuZGVsbCkKLSBJZiB0aGUgc2VydmVyIHJldHVybnMgZ2FyYmFnZSBvciBub3RoaW5nIGF0IGFsbCBpbiByZXNwb25zZSB0byBhbiBBQUFBIHF1ZXJ5LAogIGdvIG9uIGFuZCBhc2sgZm9yIEEgcmVjb3JkcyBhbnl3YXkuCgoqIEphbnVhcnkgMzEgMjAwOSAoRGFuaWVsIFN0ZW5iZXJnKQotIGFyZXNfZ2V0aG9zdGJ5bmFtZSgpIG5vdyBhY2NlcHRzICdBRl9VTlNQRUMnIGFzIGEgZmFtaWx5IGZvciByZXNvbHZpbmcKICBlaXRoZXIgQUZfSU5FVDYgb3IgQUZfSU5FVC4gSXQgd29ya3MgYnkgYWNjZXB0aW5nIGFueSBvZiB0aGUgbG9va3N1cHMgaW4gdGhlCiAgaG9zdHMgZmlsZSwgYW5kIGl0IHJlc29sdmVzIHRoZSBBQUFBIGZpZWxkIHdpdGggYSBmYWxsYmFjayB0byBBLgoKKiBKYW51YXJ5IDE0IDIwMDkgKERhbmllbCBTdGVuYmVyZykKLSBhcmVzLmggbm8gbG9uZ2VyIHVzZXMgdGhlIEhBVkVfU1RSVUNUX0lONl9BRERSIGRlZmluZSBjaGVjaywgYnV0IGluc3RlYWQgaXQKICBub3cgZGVjbGFyZXMgdGhlIHByaXZhdGUgc3RydWN0IGFyZXNfaW42X2FkZHIgZm9yIGFsbCBzeXN0ZW1zIGluc3RlYWQgb2YKICByZWx5aW5nIG9uIG9uZSBwb3NzaWJseSBub3QgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgoKKiBKYW51YXJ5IDEzIDIwMDkgKFBoaWwgQmx1bmRlbGwpCi0gYXJlc19fc2VuZF9xdWVyeSgpIG5vdyB2YXJpZXMgdGhlIHJldHJ5IHRpbWVvdXQgcHNldWRvLXJhbmRvbWx5IHRvIGF2b2lkCiAgcGFja2V0IHN0b3JtcyB3aGVuIHNldmVyYWwgcXVlcmllcyB3ZXJlIHN0YXJ0ZWQgYXQgdGhlIHNhbWUgdGltZS4KCiogSmFudWFyeSAxMSAyMDA5IChEYW5pZWwgU3RlbmJlcmcpCi0gUGhpbCBCbHVuZGVsbCBhZGRlZCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYXJlc19fZXhwYW5kX25hbWVfZm9yX3Jlc3BvbnNlKCkKICB0aGF0IGlzIG5vdyB1c2VkIGJ5IHRoZSBhcmVzX3BhcnNlXypfcmVwbHkoKSBmdW5jdGlvbnMgaW5zdGVhZCBvZiB0aGUKICBhcmVzX2V4cGFuZF9uYW1lKCkgc2ltcGx5IHRvIGVhc2llciByZXR1cm4gQVJFU19FQkFEUkVTUCBmb3IgdGhlIGNhc2VzIHdoZXJlCiAgdGhlIG5hbWUgZXhwYW5zaW9uIGZhaWxzIGFzIGluIHJlc3BvbnNlcyB0aGF0IHJlYWxseSBpc24ndCBleHBlY3RlZC4KClZlcnNpb24gMS42LjAgKERlYyA5LCAyMDA4KQoKKiBEZWNlbWJlciA5IDIwMDggKEdpc2xlIFZhbmVtKQoKICBGaXhlcyBmb3IgV2luMzIgdGFyZ2V0cyB1c2luZyB0aGUgV2F0dC0zMiB0Y3AvaXAgc3RhY2suCgoqIERlYyA0IDIwMDggKERhbmllbCBTdGVuYmVyZykKCiAgR3JlZ29yIEphc255IHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgYXJlc19zZXRfc29ja2V0X2NhbGxiYWNrKCksCiAgYW5kIEkgZWRpdGVkIGl0IHRvIGFsc28gZ2V0IGR1cGVkIGJ5IGFyZXNfZHVwKCkuCgoqIERlYyAzIDIwMDggKERhbmllbCBTdGVuYmVyZykKCiAgQVBJIGNoYW5nZXM6CgogIEkgbWFkZSBzdXJlIHRoZSBwdWJsaWMgYXJlc19jb25maWcgc3RydWN0IGxvb2tzIGxpa2UgYmVmb3JlIGFuZCB5ZXQgaXQKICBzdXBwb3J0cyB0aGUgUk9UQVRFIG9wdGlvbiB0aGFua3MgdG8gYy1hcmVzIG5vdyBzdG9yaW5nIHRoZSAib3B0bWFzayIKICBpbnRlcm5hbGx5LiBUaHVzIHdlIHNob3VsZCBiZSBBQkkgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXN0IHJlbGVhc2UocykKICBub3cuIE15IGVmZm9ydHMgbWVudGlvbmVkIGJlbG93IHNob3VsZCBub3QgYnJlYWsgYmFja3dhcmRzIEFCSSBjb21wbGlhbmNlLgoKICBIZXJlJ3MgaG93IEkgc3VnZ2VzdCB3ZSBwcm9jZWVkIHdpdGggdGhlIEFQSToKCiAgYXJlc19pbml0KCkgd2lsbCBiZSBwcmltYXJ5ICJjaGFubmVsIGNyZWF0b3IiIGZ1bmN0aW9uLgoKICBhcmVzX2luaXRfb3B0aW9ucygpIHdpbGwgY29udGludWUgdG8gd29yayBleGFjdGx5IGxpa2Ugbm93IGFuZCBiZWZvcmUuIEZvcgogIHN0YXJ0ZXJzLCBpdCB3aWxsIGJlIHRoZSAob25seSkgd2F5IHRvIHNldCB0aGUgZXhpc3Rpbmcgb3B0aW9ucy4KCiAgYXJlc19zYXZlX29wdGlvbnMoKSB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgbGlrZSB0b2RheSwgYnV0IHdpbGwgT05MWSBzYXZlCiAgb3B0aW9ucyB0aGF0IHlvdSBjYW4gc2V0IHRvZGF5IChpbmNsdWRpbmcgQVJFU19PUFRfUk9UQVRFIGFjdHVhbGx5KSBidXQgbmV3CiAgb3B0aW9ucyB0aGF0IHdlIGFkZCBtYXkgbm90IGJlIHNhdmVkIHdpdGggdGhpcy4KCiAgSW5zdGVhZCB3ZSBpbnRyb2R1Y2U6CgogIGFyZXNfZHVwKCkgdGhhdCBpbnN0ZWFkIGNhbiBtYWtlIGEgbmV3IGNoYW5uZWwgYW5kIGNsb25lIHRoZSBjb25maWcgdXNlZAogIGZyb20gYW4gZXhpc3RpbmcgY2hhbm5lbC4gSXQgd2lsbCB0aGVuIGNsb25lIGFsbCBjb25maWcgb3B0aW9ucywgaW5jbHVkaW5nCiAgZnV0dXJlIG5ldyB0aGluZ3Mgd2UgYWRkLgoKICBhcmVzX3NldF8qKCkgc3R5bGUgZnVuY3Rpb25zIHRoYXQgc2V0IChuZXcpIGNvbmZpZyBvcHRpb25zLiBBcyBhIHN0YXJ0IHdlCiAgc2ltcGx5IGFkZCB0aGVzZSBmb3IgbmV3IGZ1bmN0aW9uYWxpdHksIGJ1dCBvdmVyIHRpbWUgd2UgY2FuIGFsc28gaW50cm9kdWNlCiAgdGhlbSBmb3IgZXhpc3RpbmcgInN0cnVjdCBhcmVzX29wdGlvbnMiIHNvIHRoYXQgd2UgY2FuIGV2ZW50dWFsbHkgZGVwcmVjYXRlCiAgdGhlIHR3byBhcmVzXypfb3B0aW9ucygpIGZ1bmN0aW9ucy4KCiAgYXJlc19nZXRfKigpIHN0eWxlIGZ1bmN0aW9ucyBmb3IgZXh0cmFjdGluZyBpbmZvIGZyb20gYSBjaGFubmVsIGhhbmRsZSB0aGF0CiAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBhcmVzX3NhdmVfb3B0aW9ucygpLgoKKiBOb3YgMjYgMjAwOCAoWWFuZyBUc2UpCi0gQnJhZCBTcGVuY2VyIHByb3ZpZGVkIGNoYW5nZXMgdG8gYWxsb3cgYnVpbGRjb25mIHRvIHdvcmsgb24gT1MgWC4KCi0gR2VyYWxkIENvbWJzIGZpeGVkIGEgYnVnIGluIGFyZXNfcGFyc2VfcHRyX3JlcGx5KCkgd2hpY2ggd291bGQgY2F1c2UgYQogIGJ1ZmZlciB0byBzaHJpbmsgaW5zdGVhZCBvZiBleHBhbmQgaWYgYSByZXBseSBjb250YWluZWQgOCBvciBtb3JlIHJlY29yZHMuCgoqIE5vdiAyNSAyMDA4IChZYW5nIFRzZSkKLSBJbiBwcmVwYXJhdGlvbiBmb3IgdGhlIHVwY29tbWluZyBJUHY2IG5hbWVzZXJ2ZXJzIHBhdGNoLCB0aGUgaW50ZXJuYWwKICBhcmVzX2FkZHIgdW5pb24gaXMgbm93IGNoYW5nZWQgaW50byBhbiBpbnRlcm5hbCBzdHJ1Y3Qgd2hpY2ggYWxzbyBob2xkcwogIHRoZSBhZGRyZXNzIGZhbWlseS4KCiogTm92IDE5IDIwMDggKERhbmllbCBTdGVuYmVyZykKLSBCcmFkIFNwZW5jZXIgYnJvdWdodCB0aGUgbmV3IGZ1bmN0aW9uIGFyZXNfZ2V0aG9zdGJ5bmFtZV9maWxlKCkgd2hpY2ggc2ltcGx5CiAgcmVzb2x2ZXMgYSBob3N0IG5hbWUgZnJvbSB0aGUgZ2l2ZW4gZmlsZSwgdXNpbmcgdGhlIHJlZ3VsYXIgaG9zdHMgc3ludGF4LgoKKiBOb3YgMSAyMDA4IChEYW5pZWwgU3RlbmJlcmcpCi0gQ2FybG8gQ29udGF2YWxsaSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgZ2xpYmMgInJvdGF0ZSIgb3B0aW9uLCBhcyBkb2N1bWVudGVkCiAgaW4gbWFuIHJlc29sdi5jb25mOgoKICBjYXVzZXMgcm91bmQgcm9iaW4gc2VsZWN0aW9uIG9mIG5hbWVzZXJ2ZXJzIGZyb20gYW1vbmcgdGhvc2UgbGlzdGVkLiAgVGhpcwogIGhhcyB0aGUgZWZmZWN0IG9mIHNwcmVhZGluZyB0aGUgcXVlcnkgbG9hZCBhbW9uZyBhbGwgbGlzdGVkIHNlcnZlcnMsIHJhdGhlcgogIHRoYW4gaGF2aW5nIGFsbCBjbGllbnRzIHRyeSB0aGUgZmlyc3QgbGlzdGVkIHNlcnZlciBmaXJzdCBldmVyeSB0aW1lLgoKICBZb3UgY2FuIGVuYWJsZSBpdCB3aXRoIEFSRVNfT1BUX1JPVEFURQoKKiBPY3QgMjEgMjAwOCAoWWFuZyBUc2UpCiAgQ2hhcmxlcyBIYXJkaW4gYWRkZWQgaGFuZGxpbmcgb2YgRUlOUFJPR1JFU1MgZm9yIFVEUCBjb25uZWN0cy4KCiogT2N0IDE4IDIwMDggKERhbmllbCBTdGVuYmVyZykKICBDaGFybGVzIEhhcmRpbiBtYWRlIGFkaWcgc3VwcG9ydCBhIHJlZ3VsYXIgbnVtZXJpY2FsIGRvdHRlZCBJUCBhZGRyZXNzIGZvciB0aGUKICAtcyBvcHRpb24gYXMgd2VsbC4KCiogT2N0IDcgMjAwOCAoWWFuZyBUc2UpCi0gQWRkZWQgLS1lbmFibGUtb3B0aW1pemUgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUgYW5kIGRpc2FibGUgY29tcGlsZXIKICBvcHRpbWl6YXRpb25zIHRvIGFsbG93IGRlY291cGxlZCBzZXR0aW5nIGZyb20gLS1lbmFibGUtZGVidWcuCgoqIE9jdCAyIDIwMDggKFlhbmcgVHNlKQotIEFkZGVkIC0tZW5hYmxlLXdhcm5pbmdzIGNvbmZpZ3VyZSBvcHRpb24gdG8gZW5hYmxlIGFuZCBkaXNhYmxlIHN0cmljdAogIGNvbXBpbGVyIHdhcm5pbmdzIHRvIGFsbG93IGRlY291cGxlZCBzZXR0aW5nIGZyb20gLS1lbmFibGUtZGVidWcuCgoqIFNlcCAxNyAyMDA4IChZYW5nIFRzZSkKLSBDb2RlIHJlb3JnYW5pemF0aW9uIHRvIGFsbG93IGludGVybmFsL3ByaXZhdGUgdXNlIG9mICJuYW1lc2VyLmgiIHRvIGFueQogIHN5c3RlbSB0aGF0IGxhY2tzIGFycGEvbmFtZXNlci5oIG9yIGFycGEvbmFtZXNlcl9jb21wYXQuaCBoZWFkZXIgZmlsZXMuCgoqIFNlcCAxNiAyMDA4IChZYW5nIFRzZSkKLSBDb2RlIHJlb3JnYW5pemF0aW9uIHRvIGFsbG93IGludGVybmFsL3ByaXZhdGUgdXNlIG9mIGFyZXNfd3JpdGV2IHRvIGFueQogIHN5c3RlbSB0aGF0IGxhY2tzIHRoZSB3cml0ZXYgZnVuY3Rpb24uCgoqIFNlcCAxNSAyMDA4IChZYW5nIFRzZSkKLSBDb2RlIHJlb3JnYW5pemF0aW9uIHRvIGFsbG93IGludGVybmFsL3ByaXZhdGUgdXNlIG9mIGFyZXNfc3RyY2FzZWNtcCB0byBhbnkKICBzeXN0ZW0gdGhhdCBsYWNrcyB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4KCi0gSW1wcm92ZSBjb25maWd1cmUgZGV0ZWN0aW9uIG9mIHNvbWUgc3RyaW5nIGZ1bmN0aW9ucy4KCiogU2VwIDExIDIwMDggKFlhbmcgVHNlKQotIENvZGUgcmVvcmdhbml6YXRpb24gdG8gYWxsb3cgaW50ZXJuYWwvcHJpdmF0ZSB1c2Ugb2YgYXJlc19zdHJkdXAgdG8gYW55CiAgc3lzdGVtIHRoYXQgbGFja3MgdGhlIHN0cmR1cCBmdW5jdGlvbi4KClZlcnNpb24gMS41LjMgKEF1ZyAyOSwgMjAwOCkKCiogQXVnIDI1IDIwMDggKFlhbmcgVHNlKQotIEltcHJvdmVtZW50IGJ5IEJyYWQgSG91c2U6CgogIFRoaXMgcGF0Y2ggYWRkcmVzc2VzIGFuIGlzc3VlIGluIHdoaWNoIGEgcmVzcG9uc2UgY291bGQgYmUgc2VudCBiYWNrIHRvIHRoZQogIHNvdXJjZSBwb3J0IG9mIGEgY2xpZW50IGZyb20gYSBkaWZmZXJlbnQgYWRkcmVzcyB0aGFuIHRoZSByZXF1ZXN0IHdhcyBtYWRlIHRvLgogIFRoaXMgaXMgb25lIGZvcm0gb2YgYSBETlMgY2FjaGUgcG9pc29uaW5nIGF0dGFjay4KCiAgVGhlIHBhdGNoIHNpbXBseSB1c2VzIHJlY3Zmcm9tKCkgcmF0aGVyIHRoYW4gcmVjdigpIGFuZCB2YWxpZGF0ZXMgdGhhdCB0aGUKICBhZGRyZXNzIHJldHVybmVkIGZyb20gcmVjdmZyb20oKSBtYXRjaGVzIHRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgd2UgaGF2ZQogIGNvbm5lY3RlZCB0by4gT25seSBuZWNlc3Nhcnkgb24gVURQIHNvY2tldHMgYXMgdGhleSBhcmUgY29ubmVjdGlvbi1sZXNzLCBUQ1AKICBpcyB1bmFmZmVjdGVkLgoKLSBGaXggYnkgR2VvcmdlIE5laWxsOgogIEZpeGVkIGNvbXBpbGF0aW9uIG9mIGFjb3VudHJ5IHNhbXBsZSBhcHBsaWNhdGlvbiBmYWlsdXJlIG9uIHNvbWUgc3lzdGVtcy4KCiogQXVnIDQgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQotIEZpeCBieSBUb2Z1IExpbmRlbjoKCiAgVGhlIHN5bXB0b206CiAgKiBVc2VycyAodXN1YWxseSwgYnV0IG5vdCBhbHdheXMpIG9uIDItV2lyZSByb3V0ZXJzIGFuZCB0aGUgQ29tY2FzdCBzZXJ2aWNlCiAgYW5kIGEgd2lyZWQgY29ubmVjdGlvbiB0byB0aGVpciByb3V0ZXIgd291bGQgZmluZCB0aGF0IHRoZSBzZWNvbmQgYW5kCiAgc3Vic2VxdWVudCBETlMgbG9va3VwcyBmcm9tIGZyZXNoIHByb2Nlc3NlcyB1c2luZyBjLWFyZXMgdG8gcmVzb2x2ZSB0aGUgc2FtZQogIGFkZHJlc3Mgd291bGQgY2F1c2UgdGhlIHByb2Nlc3MgdG8gbmV2ZXIgc2VlIGEgcmVwbHkgKGl0IGtlZXBzIHBvbGxpbmcgZm9yCiAgYXJvdW5kIDFtMTVzIGJlZm9yZSBnaXZpbmcgdXApLgoKICBUaGUgcmVwcm86CiAgKiBPbiBzdWNoIGEgbWFjaGluZSAoYW5kIHllYWgsIGl0IHRvb2sgdXMgYSBsb3Qgb2YgUUEgdG8gZmluZCB0aGUgc3lzdGVtcwogIHRoYXQgcmVwcm9kdWNlIHN1Y2ggYSBzcGVjaWZpYyBwcm9ibGVtISksIGRvICdhaG9zdCB3d3cuc2Vjb25kbGlmZS5jb20nLAogIHRoZW4gZG8gaXQgYWdhaW4uICBUaGUgZmlyc3QgcHJvY2VzcydzIGxvb2t1cCB3aWxsIHdvcmssIHN1YnNlcXVlbnQgbG9va3VwcwogIHdpbGwgdGltZS1vdXQgYW5kIGZhaWwuCgogIFRoZSBjYXVzZToKICAqIGluaXRfaWRfa2V5KCkgd2FzIGNhbGxpbmcgcmFuZG9taXplX2tleSgpICpiZWZvcmUqIGl0IGluaXRpYWxpemVkCiAga2V5LT5zdGF0ZSwgbWVhbmluZyB0aGF0IHRoZSByYW5kb21uZXNzIGdlbmVyYXRlZCBieSByYW5kb21pemVfa2V5KCkgaXMKICBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiB3aXRoIGRldGVybWluaXN0aWMgdmFsdWVzLiAoL2Rldi91cmFuZG9tIHdhcyBhbHNvCiAgYmVpbmcgcmVhZCBpbmNvcnJlY3RseSBpbiB0aGUgYy1hcmVzIHZlcnNpb24gd2Ugd2VyZSB1c2luZywgYnV0IHRoaXMgd2FzCiAgZml4ZWQgaW4gYSBsYXRlciB2ZXJzaW9uLikKICAqIFRoaXMgbWFrZXMgdGhlIHN0cmVhbSBvZiBnZW5lcmF0ZWQgcXVlcnktSURzIGZyb20gYW55IG5ldyBjLWFyZXMgcHJvY2VzcwogIGJlIGFuIGlkZW50aWNhbCBhbmQgcHJlZGljdGFibGUgc2VxdWVuY2Ugb2YgSURzLgogICogVGhpcyBtYWtlcyB0aGUgMi1XaXJlJ3MgZGVmYXVsdCBidWlsdC1pbiBETlMgc2VydmVyIGRldGVjdCB0aGVzZSBxdWVyaWVzCiAgYXMgcHJvYmFibGUtZHVwbGljYXRlcyBhbmQgKGVycm9uZW91c2x5KSBub3QgcmVzcG9uZCBhdCBhbGwuCgoKKiBBdWcgNCAyMDA4IChZYW5nIFRzZSkKLSBBdXRvY29uZiAyLjYyIGhhcyBjaGFuZ2VkIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFDX0FJWCBtYWNybyB3aGljaCB3ZSB1c2UuCiAgUHJpb3IgdmVyc2lvbnMgb2YgYXV0b2NvbmYgZGVmaW5lZCBfQUxMX1NPVVJDRSBpZiBfQUlYIHdhcyBkZWZpbmVkLiAyLjYyCiAgdmVyc2lvbiBvZiBBQ19BSVggZGVmaW5lcyBfQUxMX1NPVVJDRSBhbmQgb3RoZXIgZm91ciBwcmVwcm9jZXNzb3Igc3ltYm9scwogIG5vIG1hdHRlciBpZiB0aGUgc3lzdGVtIGlzIEFJWCBvciBub3QuIFRvIGtlZXAgdGhlIHRyYWRpdGlvbmFsIGJlaGF2aW91ciwKICBhbmQgYW4gdW5pZm9ybSBvbmUgYWNyb3NzIGF1dG9jb25mIHZlcnNpb25zIEFDX0FJWCBpcyByZXBsYWNlZCB3aXRoIG91cgogIG93biBpbnRlcm5hbCBtYWNybyBDQVJFU19DSEVDS19BSVhfQUxMX1NPVVJDRS4KCiogQXVnIDEgMjAwOCAoWWFuZyBUc2UpCi0gQ29uZmlndXJlIHByb2Nlc3Mgbm93IGNoZWNrcyBpZiB0aGUgcHJlcHJvY2Vzc29yIF9SRUVOVFJBTlQgc3ltYm9sIGlzIGFscmVhZHkKICBkZWZpbmVkLiBJZiBpdCBpc24ndCBjdXJyZW50bHkgZGVmaW5lZCBhIHNldCBvZiBjaGVja3MgYXJlIHBlcmZvcm1lZCB0byB0ZXN0CiAgaWYgaXRzIGRlZmluaXRpb24gaXMgcmVxdWlyZWQgdG8gbWFrZSB2aXNpYmxlIHRvIHRoZSBjb21waWxlciBhIHNldCBvZiAqX3IKICBmdW5jdGlvbnMuIEZpbmFsbHksIGlmIF9SRUVOVFJBTlQgaXMgYWxyZWFkeSBkZWZpbmVkIG9yIG5lZWRlZCBpdCB0YWtlcyBjYXJlCiAgb2YgbWFraW5nIGFkanVzdG1lbnRzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCBpdCBpcyBkZWZpbmVkIGVxdWFsbHkgZm9yIHRoZQogIGNvbmZpZ3VyZSBwcm9jZXNzIHRlc3RzIGFuZCBnZW5lcmF0ZWQgY29uZmlnIGZpbGUuCgoqIEp1bCAyMCAyMDA4IChZYW5nIFRzZSkKLSBXaGVuIHJlY3Zmcm9tIHByb3RvdHlwZSB1c2VzIGEgdm9pZCBwb2ludGVyIGZvciBhcmd1bWVudHMgMiwgNSBvciA2IHRoaXMgd2lsbAogIG5vdyBjYXVzZSB0aGUgZGVmaW5pdGlvbiwgYXMgYXBwcm9wcmlhdGUsIG9mIFJFQ1ZGUk9NX1RZUEVfQVJHMl9JU19WT0lELAogIFJFQ1ZGUk9NX1RZUEVfQVJHNV9JU19WT0lEIG9yIFJFQ1ZGUk9NX1RZUEVfQVJHNl9JU19WT0lELgoKKiBKdWwgMTcgMjAwOCAoWWFuZyBUc2UpCi0gUkVDVkZST01fVFlQRV9BUkcyLCBSRUNWRlJPTV9UWVBFX0FSRzUgYW5kIFJFQ1ZGUk9NX1RZUEVfQVJHNiBhcmUgbm93IGRlZmluZWQKICB0byB0aGUgZGF0YSB0eXBlIHBvaW50ZWQgYnkgaXRzIHJlc3BlY3RpdmUgYXJndW1lbnQgYW5kIG5vdCB0aGUgcG9pbnRlciB0eXBlLgoKKiBKdWwgMTYgMjAwOCAoWWFuZyBUc2UpCi0gSW1wcm92ZWQgY29uZmlndXJlIGRldGVjdGlvbiBvZiBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBnZXRzZXJ2Ynlwb3J0X3IuCiAgRGV0ZWN0aW9uIGlzIG5vdyBiYXNlZCBvbiBjb21waWxhdGlvbiBjaGVja3MgaW5zdGVhZCBvZiBsaW5rZXIgb25lcy4KCi0gQ29uZmlndXJlIHByb2Nlc3Mgbm93IGNoZWNrcyBhdmFpbGFiaWxpdHkgb2YgcmVjdmZyb20oKSBzb2NrZXQgZnVuY3Rpb24gYW5kCiAgZmluZHMgb3V0IGl0cyByZXR1cm4gdHlwZSBhbmQgdGhlIHR5cGVzIG9mIGl0cyBhcmd1bWVudHMuIEFkZGVkIGRlZmluaXRpb25zCiAgZm9yIG5vbi1jb25maWd1cmUgc3lzdGVtcyBjb25maWcgZmlsZXMsIGFuZCBpbnRyb2R1Y2VkIG1hY3JvIHNyZWFkZnJvbSB3aGljaAogIHdpbGwgYmUgdXNlZCBvbiB1ZHAgc29ja2V0cyBhcyBhIHJlY3Zmcm9tKCkgd3JhcHBlciBpbiB0aGUgZnV0dXJlLgoKKiBKdWwgMTUgMjAwOCAoWWFuZyBUc2UpCi0gSW50cm9kdWNlIGRlZmluaXRpb24gb2YgX1JFRU5UUkFOVCBzeW1ib2wgaW4gc2V0dXAuaCB0byBpbXByb3ZlIGxpYnJhcnkKICB1c2FiaWxpdHkuICBQcmV2aW91c2x5IHRoZSBjb25maWd1cmUgcHJvY2VzcyBvbmx5IHVzZWQgdGhlIEFDX1NZU19MQVJHRUZJTEUKICBtYWNybyBmb3IgZGVidWcgYnVpbGRzLCBub3cgaXQgaXMgYWxzbyB1c2VkIGZvciBub24tZGVidWcgb25lcyBlbmFibGluZyB0aGUKICB1c2Ugb2YgY29uZmlndXJlIG9wdGlvbnMgLS1lbmFibGUtbGFyZ2VmaWxlIGFuZCAtLWRpc2FibGUtbGFyZ2VmaWxlIHdoaWNoCiAgbWlnaHQgYmUgbmVlZGVkIGZvciBsaWJyYXJ5IGNvbXBhdGliaWxpdHkuICBSZW1vdmUgY2hlY2tpbmcgdGhlIHNpemUgb2YKICBjdXJsX29mZl90LCBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgoKKiBKdWwgMyAyMDA4IChEYW5pZWwgU3RlbmJlcmcpCi0gUGhpbCBCbHVuZGVsbDogSWYgeW91IGFzayBhcmVzX2dldGhvc3RieW5hbWUoKSB0byBkbyBhbiBBRl9JTkVUNiBsb29rdXAgYW5kCiAgdGhlIHRhcmdldCBob3N0IGhhcyBvbmx5IEEgcmVjb3JkcywgaXQgYXV0b21hdGljYWxseSBmYWxscyBiYWNrIHRvIGFuCiAgQUZfSU5FVCBsb29rdXAgYW5kIGdpdmVzIHlvdSB0aGUgQSByZXN1bHRzLiAgSG93ZXZlciwgaWYgdGhlIHRhcmdldCBob3N0IGhhcwogIGEgQ05BTUUgcmVjb3JkLCB0aGlzIGJlaGF2aW91ciBpcyBkZWZlYXRlZCBzaW5jZSB0aGUgb3JpZ2luYWwgcXVlcnkgZG9lcwogIHJldHVybiBzb21lIGRhdGEgZXZlbiB0aG91Z2ggYXJlc19wYXJzZV9hYWFfcmVwbHkoKSBkb2Vzbid0IGNvbnNpZGVyIGl0CiAgcmVsZXZhbnQuIEhlcmUncyBhIHNtYWxsIHBhdGNoIHRvIG1ha2UgaXQgYmVoYXZlIHRoZSBzYW1lIHdpdGggYW5kIHdpdGhvdXQKICB0aGUgQ05BTUUuCgoqIEp1bCAyIDIwMDggKFlhbmcgVHNlKQotIEZhbGxiYWNrIHRvIGdldHRpbWVvZmRheSB3aGVuIG1vbm90b25pYyBjbG9jayBpcyB1bmF2YWlsYWJsZSBhdCBydW4tdGltZS4KCiogSnVuIDMwIDIwMDggKERhbmllbCBTdGVuYmVyZykKCi0gQXMgd2FzIHBvaW50ZWQgb3V0IHRvIG1lIGJ5IEFuZHJlYXMgU2NodWxkZWksIHRoZSBNQVhIT1NUTkFNRUxFTiBkZWZpbmUgaXMKICBub3QgcG9zaXggb3IgYW55dGhpbmcgYW5kIHRodXMgYy1hcmVzIGZhaWxlZCB0byBidWlsZCBvbiBodXJkIChhbmQgcG9zc2libHkKICBlbHNld2hlcmUpLiBUaGUgZGVmaW5lIHdhcyBhbHNvIHNvbWV3aGF0IGFydGlmaWNpYWxseSB1c2VkIGluIHRoZSB3aW5kb3dzCiAgcG9ydC4gTm93LCBJIGluc3RlYWQgcmV3cm90ZSB0aGUgdXNlIG9mIGdldGhvc3RieW5hbWUgdG8gZW5sYXJnZSB0aGUgaG9zdAogIG5hbWUgYnVmZmVyIGluIGNhc2Ugb2YgbmVlZCBhbmQgdG90YWxseSBhdm9pZCB0aGUgdXNlIG9mIHRoZSBNQVhIT1NUTkFNRUxFTgogIGRlZmluZS4gSSB0aHVzIGFsc28gcmVtb3ZlZCB0aGUgZGVmaWVuIGZyb20gdGhlIG5hbXNlci5oIGZpbGUgd2hlcmUgaXQgd2FzCiAgb25jZSBhZGRlZCBmb3IgdGhlIHdpbmRvd3MgYnVpbGQuCgogIEkgYWxzbyBmaXhlZCBpbml0X2J5X2RlZmF1bHRzKCkgZnVuY3Rpb24gdG8gbm90IGxlYWsgbWVtb3J5IGluIGNhc2UgaWYKICBlcnJvci4KCiogSnVuIDkgMjAwOCAoWWFuZyBUc2UpCgotIE1ha2UgbGliY2FyZXMucGMgZ2VuZXJhdGVkIGZpbGUgZm9yIHBrZy1jb25maWcgaW5jbHVkZSBpbmZvcm1hdGlvbiByZWxhdGl2ZQogIHRvIHRoZSBsaWJyYXJpZXMgbmVlZGVkIGZvciB0aGUgc3RhdGljIGxpbmtpbmcgb2YgYy1hcmVzLgoKKiBNYXkgMzAgMjAwOCAoWWFuZyBUc2UpCgotIEJyYWQgSG91c2UgZml4ZWQgYSBtaXNzaW5nIGhlYWRlciBmaWxlIGluY2x1c2lvbiBpbiBhZGlnIHNhbXBsZSBwcm9ncmFtLgoKVmVyc2lvbiAxLjUuMiAoTWF5IDI5LCAyMDA4KQoKKiBNYXkgMTMgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBJbnRyb2R1Y2luZyBtaWxsaXNlY29uZCByZXNvbHV0aW9uIHN1cHBvcnQgZm9yIHRoZSB0aW1lb3V0IG9wdGlvbi4gU2VlCiAgYXJlc19pbml0X29wdGlvbnMoKSdzIEFSRVNfT1BUX1RJTUVPVVRNUy4KCiogTWF5IDkgMjAwOCAoWWFuZyBUc2UpCgotIFVzZSBtb25vdG9uaWMgdGltZSBzb3VyY2UgaWYgYXZhaWxhYmxlLCBmb3IgcHJpdmF0ZSBmdW5jdGlvbiBhcmVzX190dm5vdygpCgoqIE1heSA3IDIwMDggKERhbmllbCBTdGVuYmVyZykKCi0gU2ViYXN0aWFuIG1hZGUgYy1hcmVzIGFibGUgdG8gcmV0dXJuIGFsbCBQVFItcmVjb3JkcyB3aGVuIGRvaW5nIHJldmVyc2UKICBsb29rdXBzLiBJdCBpcyBub3QgY29tbW9uIHByYWN0aWNlIHRvIGhhdmUgbXVsdGlwbGUgUFRSLVJlY29yZHMgZm9yIGEgc2luZ2xlCiAgSVAsIGJ1dCBpdHMgcGVyZmVjdGx5IGxlZ2FsIGFuZCBzb21lIHNpdGVzIGhhdmUgdGhvc2UuCgotIERvdWcgR29sZHN0ZWluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoOiB1cGRhdGVzIGF1dG9jb25mIDIuMTMgdXNhZ2UgdG8KICBhdXRvY29uZiAyLjU3IHVzYWdlICh3aGljaCBpcyB0aGUgdmVyc2lvbiB5b3UgaGF2ZSBzcGVjaWZpZWQgYXMgdGhlIG1pbmltdW0KICB2ZXJzaW9uKS4gSXQncyBhIG1pbm9yIGNoYW5nZSBidXQgaXQgZG9lcyBjbGVhbiB1cCBzb21lIHdhcm5pbmdzIHdpdGggbmV3ZXIKICBhdXRvY29uZiAoc3BlY2lmaWNhbGx5IDIuNjIpLgoKKiBNYXkgNSAyMDA4IChZYW5nIFRzZSkKCi0gSW1wcm92ZWQgcGFyc2luZyBvZiByZXNvbHZlciBjb25maWd1cmF0aW9uIGZpbGVzLgoKKiBBcHJpbCA0IDIwMDggKERhbmllbCBTdGVuYmVyZykKCi0gRWlubyBUdW9taW5lbiBpbXByb3ZlZCB0aGUgY29kZSB3aGVuIGEgZmlsZSBpcyB1c2VkIHRvIHNlZWQgdGhlIHJhbmRvbWl6ZXIuCgotIEFsZXhleSBTaW1hayBtYWRlIGFkaWcgc3VwcG9ydCBOQVBUUiByZWNvcmRzCgotIEFsZXhleSBTaW1hayBmaXhlZCB0aGUgVkMgZHNwIGZpbGUgYnkgYWRkaW5nIHRoZSBtaXNzaW5nIHNvdXJjZSBmaWxlCiAgYXJlc19leHBhbmRfc3RyaW5nLmMKCiogRGVjZW1iZXIgMTEgMjAwNyAoR2lzbGUgVmFuZW0pCgotIEFkZGVkIGFub3RoZXIgc2FtcGxlIGFwcGxpY2F0aW9uOyBhY291bnRyeS5jIHdoaWNoIGNvbnZlcnRzIGFuCiAgSVB2NC1hZGRyZXNzKGVzKSBhbmQvb3IgaG9zdC1uYW1lKHMpIHRvIGNvdW50cnktbmFtZSBhbmQgY291bnRyeS1jb2RlLgogIFRoaXMgdXNlcyB0aGUgc2VydmljZSBvZiB0aGUgRE5TQkwgYXQgY291bnRyaWVzLm5lcmQuZGsuCgoqIERlY2VtYmVyIDMgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBCcmFkIFNwZW5jZXIgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYXNzdW1lIHRoYXQgdGhlcmUncyBubwogIC9kZXYvdXJhbmRvbSB3aGVuIGJ1aWx0IGNyb3NzLWNvbXBpbGVkIGFzIHRoZW4gdGhlIHNjcmlwdCBjYW5ub3QgY2hlY2sgZm9yCiAgaXQuCgotIEVyaWsgS2xpbmUgY2xlYW5lZCB1cCBhcmVzX2dldGhvc3RieWFkZHIuYzpuZXh0X2xvb2t1cCgpIHNvbWV3aGF0CgpWZXJzaW9uIDEuNS4xIChOb3YgMjEsIDIwMDcpCgoqIE5vdmVtYmVyIDIxIDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gUm9iaW4gQ29ybmVsaXVzIHBvaW50ZWQgb3V0IHRoYXQgYXJlc19sbGlzdC5oIHdhcyBtaXNzaW5nIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZSBmb3IgMS41LjAKClZlcnNpb24gMS41LjAgKE5vdiAyMSwgMjAwNykKCiogT2N0b2JlciAyIDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gYXJlc19zdHJlcnJvcigpIHNlZ2ZhdWx0ZWQgaWYgdGhlIGlucHV0IGVycm9yIG51bWJlciB3YXMgb3V0IG9mIHRoZSBjdXJyZW50bHkKICBzdXBwb3J0ZWQgcmFuZ2UuCgotIFlhbmcgVHNlOiBBdm9pZCBhIHNlZ2ZhdWx0IHdoZW4gZ2VuZXJhdGluZyBhIEROUyAiVHJhbnNhY3Rpb24gSUQiIGluCiAgaW50ZXJuYWwgZnVuY3Rpb24gaW5pdF9pZF9rZXkoKSB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMuCgoqIFNlcHRlbWJlciAyOCAyMDA3IChEYW5pZWwgU3RlbmJlcmcpCgotIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuNS4wIGZvciBuZXh0IHJlbGVhc2UgYW5kIHNvbmFtZSBidW1wZWQgdG8gMiBkdWUgdG8gQUJJCiAgYW5kIEFQSSBjaGFuZ2VzIGluIHRoZSBwcm9ncmVzcyBjYWxsYmFjayAoYW5kIHBvc3NpYmx5IG1vcmUgY29taW5nIHVwIGZyb20KICBTdGVpbmFyKQoKKiBTZXB0ZW1iZXIgMjggMjAwNyAoU3RlaW5hciBILiBHdW5kZXJzb24pCgotIERvbid0IHNraXAgYSBzZXJ2ZXIgaWYgaXQncyB0aGUgb25seSBvbmUuIChCdWdmaXggZnJvbSB0aGUgR29vZ2xlIHRyZWUuKQoKLSBNYWRlIHRoZSBxdWVyeSBjYWxsYmFja3MgcmVjZWl2ZSB0aGUgbnVtYmVyIG9mIHRpbWVvdXRzIHRoYXQgaGFwcGVuZWQgZHVyaW5nCiAgdGhlIGV4ZWN1dGlvbiBvZiBhIHF1ZXJ5LCBhbmQgdXBkYXRlZCBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LiAoUGF0Y2ggZnJvbQogIHRoZSBHb29nbGUgdHJlZS4pCgotIFN1cHBvcnQgYSBmZXcgbW9yZSBzb2NrZXQgb3B0aW9uczogQVJFU19PUFRfU09DS19TTkRCVUYgYW5kCiAgQVJFU19PUFRfU09DS19SQ1ZCVUYKCi0gQWx3YXlzIHJlZ2lzdGVyIGZvciBUQ1AgZXZlbnRzIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIHF1ZXJpZXMsIGFzCiAgdGhlIG90aGVyIHNpZGUgY291bGQgYWx3YXlzIGNsb3NlIHRoZSBjb25uZWN0aW9uLCB3aGljaCBpcyBhIHZhbGlkIGV2ZW50CiAgd2hpY2ggc2hvdWxkIGJlIHJlc3BvbmRlZCB0by4KCiogU2VwdGVtYmVyIDIyIDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gU3RlaW5hciBILiBHdW5kZXJzb24gZml4ZWQ6IENvcnJlY3RseSBjbGVhciBzb2NrZXRzIGZyb20gdGhlIGZkX3NldCBvbiBpbgogIHNldmVyYWwgZnVuY3Rpb25zICh3cml0ZV90Y3BfZGF0YSwgcmVhZF90Y3BfZGF0YSwgcmVhZF91ZHBfcGFja2V0cykgc28gdGhhdAogIGlmIGl0IGZhaWxzIGFuZCB0aGUgc29ja2V0IGlzIGNsb3NlZCB0aGUgZm9sbG93aW5nIGNvZGUgZG9lc24ndCB0cnkgdG8gdXNlCiAgdGhlIGZpbGUgZGVzY3JpcHRvci4KCi0gU3RlaW5hciBILiBHdW5kZXJzb24gbW9kaWZpZWQgYy1hcmVzIHRvIG5vdyBhbHNvIGRvIHRvIEROUyByZXRyaWVzIGV2ZW4gd2hlbgogIFRDUCBpcyB1c2VkIHNpbmNlIHRoZXJlIGFyZSBzZXZlcmFsIGVkZ2UgY2FzZXMgd2hlcmUgaXQgc3RpbGwgbWFrZXMgc2Vuc2UuCgotIEJyYWQgSG91c2UgcHJvdmlkZWQgYSBmaXggZm9yIGFyZXNfc2F2ZV9vcHRpb25zKCk6CgogIEFwcGFyZW50bHkgSSBvdmVybG9va2VkIHNvbWV0aGluZyB3aXRoIHRoZSBhcmVzX3NhdmVfb3B0aW9ucygpIHdoZXJlIGl0CiAgd291bGQgdHJ5IHRvIGRvIGEgbWFsbG9jKDApIHdoZW4gbm8gb3B0aW9ucyBvZiB0aGF0IHR5cGUgbmVlZGVkIHRvIGJlIHNhdmVkLgogIE9uIG1vc3QgcGxhdGZvcm1zLCB0aGlzIHdhcyBmaW5lIGJlY2F1c2UgbWFsbG9jKDApIGRvZXNuJ3QgYWN0dWFsbHkgcmV0dXJuCiAgTlVMTCwgYnV0IG9uIEFJWCBpdCBkb2VzLCBzbyBhcmVzX3NhdmVfb3B0aW9ucyB3b3VsZCByZXR1cm4gQVJFU19FTk9NRU0uCgoqIEp1bHkgMTQgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBWbGFkIERpbnVsZXNjdSBmaXhlZCB0d28gb3V0c3RhbmRpbmcgdmFsZ3JpbmQgcmVwb3J0czoKCiAgMS4gSW4gYXJlc19xdWVyeS5jICwgaW4gZmluZF9xdWVyeV9ieV9pZCB3ZSBjb21wYXJlIHEtPnFpZCAod2hpY2ggaXMgYSBzaG9ydAogIGludCB2YXJpYWJsZSkgd2l0aCBxaWQsIHdoaWNoIGlzIGRlY2xhcmVkIGFzIGFuIGludCB2YXJpYWJsZS4gIE1vcmVvdmVyLAogIEROU19IRUFERVJfU0VUX1FJRCBpcyB1c2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgcWlkLCBidXQgRE5TX0hFQURFUl9TRVRfUUlECiAgc2V0cyBvbmx5IHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgcWlkLiBJIHRoaW5rIHRoYXQgcWlkIHNob3VsZCBiZSBkZWNsYXJlZCBhcwogICJ1bnNpZ25lZCBzaG9ydCIgaW4gdGhpcyBmdW5jdGlvbi4KCiAgMi4gVGhlIHNhbWUgcHJvYmxlbSBvY2N1cnMgaW4gYXJlc19wcm9jZXNzLmMsIHByb2Nlc3NfYW5zd2VyKCkgLiAgcXVlcnktPnFpZAogIChhbiB1bnNpZ25lZCBzaG9ydCBpbnRlZ2VyIHZhcmlhYmxlKSBpcyBjb21wYXJlZCB3aXRoIGlkLCB3aGljaCBpcyBhbgogIGludGVnZXIgdmFyaWFibGUuIE1vcmVvdmVyLCBpZCBpcyBpbml0aWFsaXplZCBmcm9tIEROU19IRUFERVJfUUlEIHdoaWNoIHNldHMKICBvbmx5IHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgaWQuIEkgdGhpbmsgdGhhdCB0aGUgaWQgdmFyaWFibGUgc2hvdWxkIGJlCiAgZGVjbGFyZWQgYXMgInVuc2lnbmVkIHNob3J0IiBpbiB0aGlzIGZ1bmN0aW9uLgoKICBFdmVuIGFmdGVyIGRlY2xhcmluZyB0aGVzZSB2YXJpYWJsZXMgYXMgInVuc2lnbmVkIHNob3J0IiwgdGhlIHZhbGdyaW5kCiAgZXJyb3JzIGFyZSBzdGlsbCB0aGVyZS4gV2hpY2ggYnJpbmdzIHVzIHRvIHRoZSB0aGlyZCBwcm9ibGVtLgoKICAzLiBUaGUgdGhpcmQgcHJvYmxlbSBpcyB0aGF0IFZhbGdyaW5kIGFzc3VtZXMgdGhhdCBxdWVyeS0+cWlkIGlzIG5vdAogIGluaXRpYWxpc2VkIGNvcnJlY3RseS4gQW5kIGl0IGRvZXMgdGhhdCBiZWNhdXNlIHF1ZXJ5LT5xaWQgaXMgc2V0IGZyb20KICBETlNfSEVBREVSX1FJRChxYnVmKTsgVmFsZ3JpbmQgc2F5cyB0aGF0IHFidWYgaGFzIHVuaXRpYWxpc2VkIGJ5dGVzLiBBbmQKICBxYnVmIGhhcyB1bmluaXRpYWxpc2VkIGJ5dGVzIGJlY2F1c2Ugb2YgY2hhbm5lbC0+bmV4dF9pZCAuIEFuZCBuZXh0X2lkIGlzCiAgc2V0IGJ5IGFyZXNfaW5pdC5jOmFyZXNfX2dlbmVyYXRlX25ld19pZCgpIC4gSSBmb3VuZCB0aGF0IHB1dHRpbmcgc2hvcnQgcj0wCiAgaW4gdGhpcyBmdW5jdGlvbiAoaW5zdGVhZCBvZiBzaG9ydCByKSBtYWtlcyBhbGwgVmFsZ3JpbmQgd2FybmluZ3MgZ28gYXdheS4KICBJIGhhdmUgc3R1ZGllZCBhcmVzX19yYzQoKSB0b28sIGFuZCB0aGlzIGlzIHRoZSBvZmZlbmRpbmcgbGluZToKCiAgICAgICAgYnVmZmVyX3B0cltjb3VudGVyXSBePSBzdGF0ZVt4b3JJbmRleF07ICAgKGFyZXNfcXVlcnkuYzo2MikKCiAgVGhpcyBpcyB3aGF0IHRyaWdnZXJzIFZhbGdyaW5kLi4gYnVmZmVyX3B0ciBpcyB1bml0aWFsaXNlZCBpbiB0aGlzIGZ1bmN0aW9uLAogIGFuZCBieSBhcHBseWluZyBePSBvbiBpdCwgaXQgcmVtYWlucyB1bml0aWFsaXNlZC4KClZlcnNpb24gMS40LjAgKEp1bmUgOCwgMjAwNykKCiogSnVuZSA0IDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gSmFtZXMgQnVyc2EgcmVwb3J0ZWQgYSBtYWpvciBtZW1vcnkgcHJvYmxlbSB3aGVuIHJlc29sdmluZyBtdWx0aS1JUCBuYW1lcwogIGFuZCBJIGZvdW5kIGFuZCBmaXhlZCB0aGUgcHJvYmxlbS4gSXQgd2FzIGFkZGVkIGJ5IEFzaGlzaCBTaGFybWEncyBwYXRjaAogIHR3byBkYXlzIGFnby4KCiAgV2hlbiBJIHRoZW4gdHJpZWQgdG8gdmVyaWZ5IG11bHRpcGxlIGVudHJpZXMgaW4gL2V0Yy9ob3N0cyBhZnRlciBteSBmaXgsIEkKICBnb3QgYW5vdGhlciBzZWdmYXVsdCBhbmQgZGVjaWRlZCB0aGlzIGNvZGUgd2FzIG5vdCByaXBlIGZvciBpbmNsdXNpb24gYW5kIEkKICByZXZlcnRlZCB0aGUgcGF0Y2guCgoqIEp1bmUgMiAyMDA3CgotIEJyYWQgU3BlbmNlciBmb3VuZCBhbmQgZml4ZWQgdGhyZWUgZmxhd3MgaW4gdGhlIGNvZGUsIGZvdW5kIHdpdGggdGhlIG5ldwogIGdjYyA0LjIuMCB3YXJuaW5nOiAtV2FkZHJlc3MKCi0gQnJhZCBIb3VzZSBmaXhlZCBWUzIwMDUgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRpbWVfdCBiZWluZyA2NGJpdC4KICBIZSBhbHNvIG1hZGUgcmVjZW50IE1pY3Jvc29mdCBjb21waWxlcnMgdXNlIF9zdHJkdXAoKSBpbnN0ZWFkIG9mIHN0cmR1cCgpLgoKLSBCcmFkIEhvdXNlJ3MgbWFuIHBhZ2VzIGZvciBhcmVzX3NhdmVfb3B0aW9ucygpIGFuZCBhcmVzX2Rlc3Ryb3lfb3B0aW9ucygpCiAgd2VyZSBhZGRlZC4KCi0gQXNoaXNoIFNoYXJtYSBwcm92aWRlZCBhIHBhdGNoIGZvciBzdXBwb3J0aW5nIG11bHRpcGxlIGVudHJpZXMgaW4gdGhlCiAgL2V0Yy9ob3N0cyBmaWxlLiBQYXRjaCBlZGl0ZWQgZm9yIGNvZGluZyBzdHlsZSBhbmQgZnVuY3Rpb25hbGl0eSBieSBtZQogIChEYW5pZWwpLgoKKiBNYXkgMzAgMjAwNwoKLSBTaG11bGlrIFJlZ2V2IGJyb3VnaHQgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHRyYW5zYWN0aW9uIElEczoKCiAgVGhlIGMtYXJlcyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHVzZXMgYSBETlMgIlRyYW5zYWN0aW9uIElEIiBmaWVsZCB0aGF0IGlzCiAgc2VlZGVkIHdpdGggYSBwc2V1ZG8gcmFuZG9tIG51bWJlciAoYmFzZWQgb24gZ2V0dGltZW9mZGF5KSB3aGljaCBpcwogIGluY3JlbWVudGVkICgrKykgYmV0d2VlbiBjb25zZWN1dGl2ZSBjYWxscyBhbmQgaXMgdGhlcmVmb3JlIHJhdGhlcgogIHByZWRpY3RhYmxlLiBJbiBnZW5lcmFsLCBwcmVkaWN0YWJpbGl0eSBvZiBETlMgVHJhbnNhY3Rpb24gSUQgaXMgYSB3ZWxsCiAga25vd24gc2VjdXJpdHkgcHJvYmxlbSAoZS5nLgogIGh0dHA6Ly9iYWsuc3BjLm9yZy9kbXMvYXJjaGl2ZS9kbnNfaWRfYXR0YWNrLnR4dCkgYW5kIG1ha2VzIGEgYy1hcmVzIGJhc2VkCiAgaW1wbGVtZW50YXRpb24gdnVsbmVyYWJsZSB0byBETlMgcG9pc29uaW5nLiBDcmVkaXQgZ29lcyB0byBBbWl0IEtsZWluCiAgKFRydXN0ZWVyKSBmb3IgaWRlbnRpZnlpbmcgdGhpcyBwcm9ibGVtLgoKICBUaGUgcGF0Y2ggSSB3cm90ZSBjaGFuZ2VzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYSBtb3JlIHNlY3VyZSB3YXkgb2YKICBnZW5lcmF0aW5nIHVuaXF1ZSBJRHMuIEl0IHN0YXJ0cyBieSBvYnRhaW5pbmcgYSBrZXkgd2l0aCByZWFzb25hYmxlIGVudHJvcHkKICB3aGljaCBpcyB1c2VkIHdpdGggYW4gUkM0IHN0cmVhbSB0byBnZW5lcmF0ZSB0aGUgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlCiAgdHJhbnNhY3Rpb24gSURzLgoKICBOb3RlIHRoYXQgdGhlIGtleSBnZW5lcmF0aW9uIGNvZGUgKGluIGFyZXNfaW5pdDpyYW5kb21pemVfa2V5KSBoYXMgdHdvCiAgdmVyc2lvbnMsIHRoZSBXaW5kb3dzIHNwZWNpZmljIG9uZSB1c2VzIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2FmZSBmdW5jdGlvbgogIHByb3ZpZGVkIChidXQgdW5kb2N1bWVudGVkIDopIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIChkZXNjcmliZWQgYXQKICBodHRwOi8vYmxvZ3MubXNkbi5jb20vbWljaGFlbF9ob3dhcmQvYXJjaGl2ZS8yMDA1LzAxLzE0LzM1MzM3OS5hc3B4KS4gIFRoZQogIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgbmFpdmUgYW5kIHVzZXMgdGhlIHN0YW5kYXJkICdyYW5kJwogIGZ1bmN0aW9uLiBTdXJlbHkgYSBiZXR0ZXIgd2F5IHRvIGdlbmVyYXRlIHJhbmRvbSBrZXlzIGV4aXN0cyBmb3Igb3RoZXIKICBwbGF0Zm9ybXMuCgogIFRoZSBwYXRjaCBjYW4gYmUgdGVzdGVkIGJ5IHVzaW5nIHRoZSBhZGlnIHV0aWxpdHkgYW5kIHVzaW5nIHRoZSAnLXMnIG9wdGlvbi4KCi0gQnJhZCBIb3VzZSBhZGRlZCBhcmVzX3NhdmVfb3B0aW9ucygpIGFuZCBhcmVzX2Rlc3Ryb3lfb3B0aW9ucygpIHRoYXQgY2FuIGJlCiAgdXNlZCB0byBrZWVwIG9wdGlvbnMgZm9yIGxhdGVyIHJlLXVzYWwgd2hlbiBhcmVzX2luaXRfb3B0aW9ucygpIGlzIHVzZWQuCgogIFByb2JsZW06IENhbGxpbmcgYXJlc19pbml0KCkgZm9yIGVhY2ggbG9va3VwIGNhbiBiZSB1bm5lY2Vzc2FyaWx5IHJlc291cmNlCiAgICAgICAgIGludGVuc2l2ZS4gIE9uIHdpbmRvd3MsIGl0IG11c3QgTG9hZExpYnJhcnkoKSBvciBzZWFyY2ggdGhlIHJlZ2lzdHJ5CiAgICAgICAgIG9uIGVhY2ggY2FsbCB0byBhcmVzX2luaXQoKS4gIE9uIHVuaXgsIGl0IG11c3QgcmVhZCBhbmQgcGFyc2UKICAgICAgICAgbXVsdGlwbGUgZmlsZXMgdG8gb2J0YWluIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIEluCiAgICAgICAgIGEgc2luZ2xlLXRocmVhZGVkIGVudmlyb25tZW50LCBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIG9ubHkKICAgICAgICAgYXJlc19pbml0KCkgb25jZSwgYnV0IGluIGEgaGVhdmlseSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCwgaXQgaXMKICAgICAgICAgdW5kZXNpcmFibGUgdG8gYXJlc19pbml0KCkgYW5kIGFyZXNfZGVzdHJveSgpIGZvciBlYWNoIHRocmVhZCBjcmVhdGVkCiAgICAgICAgIGFuZCB0cmFjayB0aGF0LgoKICBTb2x1dGlvbjogQ3JlYXRlIGFyZXNfc2F2ZV9vcHRpb25zKCkgYW5kIGFyZXNfZGVzdHJveV9vcHRpb25zKCkgZnVuY3Rpb25zIHRvCiAgICAgICAgIHJldHJpZXZlIGFuZCBmcmVlIG9wdGlvbnMgb2J0YWluZWQgZnJvbSBhbiBpbml0aWFsaXplZCBjaGFubmVsLiAgVGhlCiAgICAgICAgIG9wdGlvbnMgcG9wdWxhdGVkIGNhbiBiZSB1c2VkIHRvIHBhc3MgYmFjayBpbnRvIGFyZXNfaW5pdF9vcHRpb25zKCksCiAgICAgICAgIGl0IHNob3VsZCBwb3B1bGF0ZSBhbGwgbmVlZGVkIGZpZWxkcyBhbmQgbm90IHJldHJpZXZlIGFueSBpbmZvcm1hdGlvbgogICAgICAgICBmcm9tIHRoZSBzeXN0ZW0uICBQcm9iYWJseSB3aXNlIHRvIGRlc3Ryb3kgdGhlIGNhY2hlIGV2ZXJ5IG1pbnV0ZSBvcgogICAgICAgICBzbyB0byBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVjb21pbmcgc3RhbGUuCgotIERhbmllbCBTIGFkZGVkIGFyZXNfcHJvY2Vzc19mZCgpIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBhc2sgZm9yIHByb2Nlc3NpbmcKICBvbiBzcGVjaWZpYyBzb2NrZXRzIGFuZCB0aHVzIGF2b2lkaW5nIHNlbGVjdCgpIGFuZCBhc3NvY2lhdGVkCiAgZnVuY3Rpb25zL21hY3Jvcy4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGJ5IHVwY29taW5nIGxpYmN1cmwgcmVsZWFzZXMKICBmb3IgdGhpcyB2ZXJ5IHJlYXNvbi4gSXQgYWxzbyBtYWRlIG1lIGV4cG9ydCB0aGUgYXJlc19zb2NrZXRfdCB0eXBlIGluIHRoZQogIHB1YmxpYyBhcmVzLmggaGVhZGVyIGZpbGUsIHNpbmNlIGFyZXNfcHJvY2Vzc19mZCgpIHVzZXMgdGhhdCB0eXBlIGZvciB0d28gb2YKICB0aGUgYXJndW1lbnRzLgoKKiBNYXkgMjUgMjAwNwoKLSBSYXZpIFByYXRhcCBmaXhlZCBhIGZsYXcgaW4gdGhlIGluaXRfYnlfcmVzb2x2X2NvbmYoKSBmdW5jdGlvbiBmb3Igd2luZG93cwogIHRoYXQgY291bGQgY2F1c2UgaXQgdG8gcmV0dXJuIGEgYmFkIHJldHVybiBjb2RlLgoKKiBBcHJpbCAxNiAyMDA3CgotIFlhbmcgVHNlOiBQcm92aWRlIGFyZXNfZ2V0b3B0KCkgY29tbWFuZC1saW5lIHBhcnNlciBmdW5jdGlvbiBhcyBhIHNvdXJjZQogIGNvZGUgaGVscGVyIGZ1bmN0aW9uLCBub3QgYmVsb25naW5nIHRvIHRoZSBhY3R1YWwgYy1hcmVzIGxpYnJhcnkuCgoqIEZlYnJ1YXJ5IDE5IDIwMDcKCi0gVmxhZCBEaW51bGVzY3UgYWRkZWQgYXJlc19wYXJzZV9uc19yZXBseSgpLgoKKiBGZWJydWFyeSAxMyAyMDA3CgotIFlhbmcgVHNlOiBGaXggZmFpbHVyZSB0byBnZXQgdGhlIHNlYXJjaCBzZXF1ZW5jZSBvZiAvZXRjL2hvc3RzIGFuZAogIEROUyBmcm9tIC9ldGMvbnNzd2l0Y2guY29uZiwgL2V0Yy9ob3N0LmNvbmYgb3IgL2V0Yy9zdmMuY29uZiB3aGVuCiAgL2V0Yy9yZXNvbHYuY29uZiBkaWQgbm90IGV4aXN0IG9yIHdhcyB1bmFibGUgdG8gcmVhZCBpdC4KCiogTm92ZW1iZXIgMjIgMjAwNgoKLSBJbnN0YWxsIGFyZXNfZG5zLmggdG9vCgotIE1pY2hhZWwgV2FsbG5lciBmaXhlZCB0aGlzIHByb2JsZW06IFdoZW4gSSBzZXQgZG9tYWlucyBpbiB0aGUgb3B0aW9ucwogIHN0cnVjdCwgYW5kIHRoZXJlIGFyZSBkb21haW4vc2VhcmNoIGVudHJpZXMgaW4gL2V0Yy9yZXNvbHYuY29uZiwgdGhlIGRvbWFpbnMKICBvZiB0aGUgb3B0aW9ucyBzdHJ1Y3Qgd2lsbCBiZSBvdmVycmlkZGVuLgoKKiBOb3ZlbWJlciA2IDIwMDYKCi0gWWFuZyBUc2UgcmVtb3ZlZCBhIGNvdXBsZSBvZiBwb3RlbnRpYWwgemVybyBzaXplIG1lbW9yeSBhbGxvY2F0aW9ucy4KCi0gQW5kcmVhcyBSaWVrZSBmaXhlZCB0aGUgbGluZSBlbmRpbmdzIGluIHRoZSBhcmVzbGliLmRzcCBmaWxlIHRoYXQgSSAoRGFuaWVsKQogIGJyb2tlIGluIHRoZSAxLjMuMiByZWxlYXNlLiBXZSBzaG91bGQgc3dpdGNoIHRvIGEgc3lzdGVtIHdoZXJlIHRoYXQgZmlsZSBpcwogIGF1dG8tZ2VuZXJhdGVkLiBXZSBjb3VsZCByaXAgc29tZSBjb2RlIGZvciB0aGF0IGZyb20gY3VybC4uLgoKVmVyc2lvbiAxLjMuMiAoTm92ZW1iZXIgMywgMjAwNikKCiogT2N0b2JlciAxMiAyMDA2CgotIFByZXZlbnQgYXJlc19nZXRzb2NrKCkgdG8gb3ZlcmZsb3cgaWYgbW9yZSB0aGFuIDE2IHNvY2tldHMgYXJlIHVzZWQuCgoqIFNlcHRlbWJlciAxMSAyMDA2CgotIEd1aWxoZXJtZSBCYWxlbmEgVmVyc2lhbmk6IEkgbm90ZWQgYSBzdHJhbmdlIEJVRyBpbiBXaW4zMiBwb3J0CiAgKGFyZXNfaW5pdC5jL2dldF9pcGhscGFwaV9kbnNfaW5mbygpIGZ1bmN0aW9uKTogd2hlbiBJIGRpc2FibGUgdGhlIG5ldHdvcmsKICBieSBoYW5kIG9yIGRpc2Nvbm5lY3QgdGhlIG5ldHdvcmsgY2FibGUgaW4gV2luZG93cyAyMDAwIG9yIFdpbmRvd3MgWFAsIG15CiAgYXBwbGljYXRpb24gZ2V0cyAxMjcuMC4wLjEgYXMgdGhlIG9ubHkgbmFtZSBzZXJ2ZXIuIFRoZSBwcm9ibGVtIGNvbWVzIGZyb20KICAnR2V0TmV0d29ya1BhcmFtcycgZnVuY3Rpb24sIHRoYXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nICIiIGFzIHRoZSBvbmx5CiAgbmFtZSBzZXJ2ZXIgaW4gdGhhdCBjYXNlLiBNb3Jlb3ZlciwgdGhlIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gb2YKICBpbmV0X2FkZHIoKSByZXR1cm5zIElOQUREUl9MT09QQkFDSyBpbnN0ZWFkIG9mIElOQUREUl9OT05FLgoKKiBBdWd1c3QgMjkgMjAwNgoKLSBCcmFkIFNwZW5jZXIgZGlkCgogIG8gbWFkZSBhcmVzX3ZlcnNpb24uaCB1c2UgZXh0ZXJuICJDIiBmb3IgYysrIGNvbXBpbGVycwogIG8gZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gYXJlc19nZXRuYW1laW5mby5jCiAgbyBmaXhlZCBhIGJ1ZmZlciBwb3NpdGlvbiBpbml0IGZvciBUQ1AgcmVhZHMKCiogQXVndXN0IDMgMjAwNgoKLSBSYXZpIFByYXRhcCBmaXhlZCBhcmVzX2dldHNvY2soKSB0byBhY3R1YWxseSByZXR1cm4gdGhlIHByb3BlciBiaXRtYXAgYW5kCiAgbm90IGFsd2F5cyB6ZXJvIQoKVmVyc2lvbiAxLjMuMSAoSnVuZSAyNCwgMjAwNikKCiogSnVseSAyMywgMjAwNgoKLSBHaXNsZSBWYW5lbSBhZGRlZCBnZXRvcHQoKSB0byB0aGUgYWhvc3QgcHJvZ3JhbS4gQ3VycmVudGx5IGFjY2VwdHMKICBvbmx5IFstdCB7YXxhYWFhfV0gdG8gc3BlY2lmeSBhZGRyZXNzIGZhbWlseSBpbiBhcmVzX2dldGhvc3RieW5hbWUoKS4KCiogSnVuZSAxOSwgMjAwNgoKLSAod2FoZXJuKSBSZW1vdmVkICJiaWcgZW5kaWFuIiBETlMgc2VjdGlvbiBhbmQgUlIgZGF0YSBpbnRlZ2VyIHBhcnNlcgogIG1hY3JvcyBmcm9tIGFyZXNfZG5zLmgsIHdoaWNoIGJyZWFrIGMtYXJlcyBvbiBteSBTcGFyYzY0LiBCaXQtd2lzZQogIG9wZXJhdGlvbnMgaW4gQyBvcGVyYXRlIG9uIGxvZ2ljYWwgdmFsdWVzLiBBbmQgaW4gYW55IGV2ZW50IHRoZSBvY3RldHMgYXJlCiAgYWxyZWFkeSBpbiBiaWctZW5kaWFuIChha2EgbmV0d29yaykgYnl0ZSBvcmRlciBzbyB0aGV5J3JlIGJlaW5nIHJldmVyc2VkCiAgKHRodXMgdGhlIHNvdXJjZSBvZiB0aGUgYnJlYWthZ2UpLgoKKiBKdW5lIDE4LCAyMDA2CgotIFdpbGxpYW0gQWhlcm4gaGFuZGxlcyBFQUdBSU4vRVdPVUxEQkxPQ0sgZXJyb3JzIGluIG1vc3Qgb2YgdGhlIEkvTyBjYWxscwogIGZyb20gYXJlYV9wcm9jZXNzLmMuCgogIFRPRE86IEhhbmRsZSBvbmUgbGFzdCBFQUdBSU4gZm9yIGEgVURQIHNvY2tldCBzZW5kKDIpIGluCiAgYXJlc19fc2VuZF9xdWVyeSgpLgoKKiBNYXkgMTAsIDIwMDYKCi0gQnJhbSBNYXR0aHlzIGJyb3VnaHQgbXkgYXR0ZW50aW9uIHRvIGEgbGlidG9vbCBwZWN1bGlhcml0eSB3aGVyZSBkZXRlY3RpbmcKICB0aGluZ3Mgc3VjaCBhcyBDKysgY29tcGlsZXIgYWN0dWFsbHkgaXMgYSBiYWQgdGhpbmcgYW5kIHNpbmNlIHdlIGRvbid0IG5lZWQKICB0aGF0IGRldGVjdGlvbiBJIGFkZGVkIGEgd29yay1hcm91bmQsIG11Y2ggaW5zcGlyZWQgYnkgYSBwcmV2aW91cyBwYXRjaCBieQogIFBhb2xvIEJvbnppbmkuIFRoaXMgYWxzbyBzaG9ydGVucyB0aGUgY29uZmlndXJlIHNjcmlwdCBxdWl0ZSBhIGxvdC4KCiogTWF5IDMsIDIwMDYKCi0gTmljayBNYXRoZXdzb24gYWRkZWQgdGhlIEFSRVNfT1BUX1NPQ0tfU1RBVEVfQ0Igb3B0aW9uIHRoYXQgd2hlbiBzZXQgbWFrZXMKICBjLWFyZXMgY2FsbCBhIGNhbGxiYWNrIG9uIHNvY2tldCBzdGF0ZSBjaGFuZ2VzLiBBIGJldHRlciB3YXkgdGhhbiB0aGUKICBhcmVzX2dldHNvY2soKSB0byBnZXQgZnVsbCBjb250cm9sIG92ZXIgdGhlIHNvY2tldCBzdGF0ZS4KCiogSmFudWFyeSA5LCAyMDA2CgotIEFsZXhhbmRlciBMYXppYyBpbXByb3ZlZCB0aGUgZ2V0c2VydmJ5cG9ydF9yKCkgY29uZmlndXJlIGNoZWNrLgoKKiBKYW51YXJ5IDYsIDIwMDYKCi0gQWxleGFuZGVyIExhemljIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGJ1aWxkY29uZiBzaG91bGQgdXNlIHRoZSBBQ0xPQ0FMX0ZMQUdTCiAgdmFyaWFibGUgZm9yIGVhc2llciBjb250cm9sbGluZyB3aGF0IGl0IGRvZXMgYW5kIGhvdyBpdCBydW5zLgoKKiBKYW51YXJ5IDUsIDIwMDYKCi0gSmFtZXMgQnVyc2EgZml4ZWQgYy1hcmVzIHRvIGZpbmQgdGhlIGhvc3RzIGZpbGUgb24gUklTQyBPUywgYW5kIG1hZGUgaXQKICBidWlsZCB3aXRoIG5ld2VyIGdjYyB2ZXJzaW9ucyB0aGF0IG5vIGxvbmdlciBkZWZpbmVzICJyaXNjb3MiLgoKKiBEZWNlbWJlciAyMgoKLSBEYW5pZWwgU3RlbmJlcmcgYWRkZWQgYXJlc19nZXRzb2NrKCkgdGhhdCBleHRyYWN0cyB0aGUgc2V0IG9mIHNvY2tldHMgdG8KICB3YWl0IGZvciBhY3Rpb24gb24uIFNpbWlsYXIgdG8gYXJlc19mZHMoKSBidXQgbm90IHJlc3RyaWN0ZWQgdG8gdXNpbmcKICBzZWxlY3QoKSBmb3IgdGhlIHdhaXRpbmcuCgoqIE5vdmVtYmVyIDI1CgotIFlhbmcgVHNlIGZpeGVkIHNvbWUgc2VuZCgpIC8gcmVjdigpIGNvbXBpbGVyIHdhcm5pbmdzCgoqIFNlcHRlbWJlciAxOAoKLSBBZGRlZCBjb25zdGFudHMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgYXJlc19nZXRhZGRyaW5mbwoKLSBNYWRlIGFyZXNfZ2V0bmFtZWluZm8gdXNlIHRoZSByZWVudHJhbnQgZ2V0c2VydmJ5cG9ydCAoZ2V0c2VydmJ5cG9ydF9yKSBpZiBpdAogIGlzIGF2YWlsYWJsZSB0byBlbnN1cmUgaXQgd29ya3MgcHJvcGVybHkgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudC4KCiogU2VwdGVtYmVyIDEwCgotIGNvbmZpZ3VyZSBmaXggZm9yIGRldGVjdGluZyBhIG1lbWJlciBpbiB0aGUgc29ja2FkZHJfaW42IHN0cnVjdCB3aGljaCBmYWlsZWQKICBvbiBpcHY2LWVuYWJsZWQgSFAtVVggMTEuMDAKClZlcnNpb24gMS4zLjAgKEF1Z3VzdCAyOSwgMjAwNSkKCiogQXVndXN0IDIxCgotIEFsZnJlZG8gVHVwb25lIHByb3ZpZGVkIGEgZml4IGZvciB0aGUgV2luZG93cyBjb2RlIGluIGdldF9pcGhscGFwaV9kbnNfaW5mbygpCiAgd2hlbiBnZXR0aW5nIHRoZSBETlMgc2VydmVyIGV0Yy4KCiogSnVuZSAxOQoKLSBBZGRlZCBzb21lIGNoZWNrcyBmb3IgdGhlIGFkZHJpbmZvIHN0cnVjdHVyZS4KCiogSnVuZSAyCgotIFdpbGxpYW0gQWhlcm46CgogIE1ha2UgVURQIHNvY2tldHMgbm9uLWJsb2NraW5nLiBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGF0IGxlYXN0IG9uIExpbnV4IDIuNCBhCiAgcmVhZCBldmVudCBjYW4gY29tZSBiYWNrIGZyb20gcG9sbCgpIG9uIGEgdmFsaWQgU09DS19ER1JBTSBzb2NrZXQgYnV0CiAgcmVjdigyKSB3aWxsIHN0aWxsIGJsb2NrLiBUaGlzIHBhdGNoIGRvZXNuJ3QgaWdub3JlIEVBR0FJTiBpbgogIHJlYWRfdWRwX3BhY2tldHMoKSwgdGhvdWdoIG1heWJlIGl0IHNob3VsZC4gKFRoaXMgcGF0Y2ggd2FzIGVkaXRlZCBieSBEYW5pZWwKICBTdGVuYmVyZyBhbmQgYSBuZXcgY29uZmlndXJlIHRlc3Qgd2FzIGFkZGVkIChpbXBvcnRlZCBmcm9tIGN1cmwncyBjb25maWd1cmUpCiAgdG8gcHJvcGVybHkgZGV0ZWN0IHdoYXQgbm9uLWJsb2NraW5nIHNvY2tldCBhcHByb2FjaCB0byB1c2UuKQoKICBJJ20gbm90IHF1aXRlIHN1cmUgaG93IHRoaXMgd2FzIGhhcHBlbmluZywgYnV0IEkndmUgYmVlbiBzZWVpbmcgUFRSIHF1ZXJpZXMKICB3aGljaCBzZWVtIHRvIHJldHVybiBlbXB0eSByZXNwb25zZXMuIEF0IGxlYXN0LCB0aGV5IHdlcmUgZW1wdHkgd2hlbiBjYWxsaW5nCiAgYXJlc19leHBhbmRfbmFtZSgpIG9uIHRoZSByZWNvcmQuIEhlcmUncyBhIHBhdGNoIHdoaWNoIGd1YXJhbnRlZXMgdG8KICBOVUwtdGVybWluYXRlIHRoZSBleHBhbmRlZCBuYW1lLiBUaGUgb2xkIGJlaGF2aW9yIGZhaWxlZCB0byBOVUwtdGVybWluYXRlIGlmCiAgbGVuIHdhcyAwLCBhbmQgdGhpcyB3YXMgY2F1c2luZyBzdHJsZW4oKSB0byBydW4gcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKICBhZnRlciBjYWxsaW5nIGFyZXNfZXhwYW5kX25hbWUoKSBhbmQgZ2V0dGluZyBBUkVTX1NVQ0NFU1MgYXMgdGhlIHJldHVybgogIHZhbHVlLiBJZiBxIGlzIG5vdCBncmVhdGVyIHRoYW4gKnMgdGhlbiBpdCdzIGVxdWFsIGFuZCAqcyBpcyBhbHdheXMKICBhbGxvY2F0ZWQgd2l0aCBhdCBsZWFzdCBvbmUgYnl0ZS4KCiogTWF5IDE2CgotIEFkZGVkIGFyZXNfZ2V0bmFtZWluZm8gd2hpY2ggbWltaWNzIHRoZSBnZXRuYW1laW5mbyBBUEkgKGFub3RoZXIgZmVhdHVyZQogIHRoYXQgY291bGQgdXNlIHRlc3RpbmcpLgoKKiBNYXkgMTQKCi0gQWRkZWQgYW4gaW5ldF9udG9wIGZ1bmN0aW9uIGZyb20gQklORCBmb3Igc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGl0LgoKKiBBcHJpbCA5CgotIE1hZGUgc29ydGxpc3Qgc3VwcG9ydCBJUHY2ICh0aGlzIGNhbiBwcm9iYWJseSB1c2Ugc29tZSB0ZXN0aW5nKS4KCi0gTWFkZSBzb3J0bGlzdCBzdXBwb3J0IENJRFIgbWF0Y2hpbmcgZm9yIElQdjQuCgoqIEFwcmlsIDgKCi0gQWRkZWQgcHJlbGltaW5hcnkgSVB2NiBzdXBwb3J0IHRvIGFyZXNfZ2V0aG9zdGJ5bmFtZS4gQ3VycmVudGx5LCBzb3J0bGlzdAogIGRvZXMgbm90IHdvcmsgd2l0aCBJUHY2LiBBbHNvIHByb3ZpZGVkIGFuIGltcGxlbWVudGF0aW9uIG9mIGJpdG5jbXAgZnJvbQogIEJJTkQgZm9yIHN5c3RlbXMgdGhhdCBkbyBub3Qgc3VwcGx5IHRoaXMgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGFkZAogIElQdjYgc3VwcG9ydCB0byBzb3J0bGlzdC4KCi0gTWFkZSBhcmVzX2dldGhvc3RieWFkZHIgc3VwcG9ydCBJUHY2IGJ5IHNwZWNpZnlpbmcgQUZfSU5FVDYgYXMgdGhlIGZhbWlseS4KICBUaGUgZnVuY3Rpb24gY2FuIGxvb2t1cCBJUHY2IGFkZHJlc3NlcyBib3RoIGZyb20gZmlsZXMgKC9ldGMvaG9zdHMpIGFuZAogIEROUyBsb29rdXBzLgoKKiBBcHJpbCA3CgotIFR1cG9uZSBBbGZyZWRvIGZpeGVkIGluY2x1ZGVzIG9mIGFycGEvbmFtZXNlcl9jb21wYXQuaCB0byBidWlsZCBmaW5lIG9uIE1hYwogIE9TIFguCgoqIEFwcmlsIDUKCi0gRG9taW5pY2sgTWVnbGlvOiBQcm92aWRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgaW5ldF9uZXRfcHRvbiBhbmQgaW5ldF9wdG9uCiAgZnJvbSBCSU5EIGZvciBzeXN0ZW1zIHRoYXQgZG8gbm90IGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zLgoKKiBNYXJjaCAxMSwgMjAwNQoKLSBEb21pbmljayBNZWdsaW8gYWRkZWQgYXJlc19wYXJzZV9hYWFhX3JlcGx5LmMgYW5kIGRpZCB2YXJpb3VzCiAgYWRqdXN0bWVudHMuIFRoZSBmaXJzdCBsaXR0bGUgc3RlcHMgdG93YXJkcyBJUHY2IHN1cHBvcnQhCgoqIE5vdmVtYmVyIDcKCi0gRml4ZWQgdGhlIFZDIHByb2plY3QgYW5kIG1ha2VmaWxlIHRvIHVzZSBhcmVzX2NhbmNlbCBhbmQgYXJlc192ZXJzaW9uCgoqIE9jdG9iZXIgMjQKCi0gVGhlIHJlbGVhc2VkIGFyZXNfdmVyc2lvbi5oIGZyb20gMS4yLjEgc2F5cyAxLjIuMCBkdWUgdG8gYSBtYWtldGd6IGZsYXcuCiAgVGhpcyBpcyBub3cgZml4ZWQuCgpWZXJzaW9uIDEuMi4xIChPY3RvYmVyIDIwLCAyMDA0KQoKKiBTZXB0ZW1iZXIgMjkKCi0gSGVucmlrIFN0b2VybmVyIGZpeDogZ290IGEgcmVwb3J0IHRoYXQgVHJ1NjQgVW5peCAodGhlIHVuaXggZnJvbSBEaWdpdGFsCiAgd2hlbiB0aGV5IG1hZGUgQWxwaGEncykgdXNlcyAvZXRjL3N2Yy5jb25mIGZvciB0aGUgcHVycG9zZSBmaXhlZCBiZWxvdyBmb3IKICBvdGhlciBPU2VzLiBIZSBtYWRlIGMtYXJlcyBjaGVjayBmb3IgYW5kIHVuZGVyc3RhbmQgaXQgaWYgcHJlc2VudC4KCi0gTm93IGMtYXJlcyB3aWxsIHVzZSBsb2NhbCBob3N0IG5hbWUgbG9va3VwIF9iZWZvcmVfIEROUyByZXNvbHZpbmcgYnkgZGVmYXVsdAogIGlmIG5vdGhpbmcgZWxzZSBpcyB0b2xkLgoKKiBTZXB0ZW1iZXIgMjYKCi0gSGVucmlrIFN0b2VybmVyOiBmb3VuZCBvdXQgdGhhdCBjLWFyZXMgZG9lcyBub3QgbG9vayBhdCB0aGUgL2V0Yy9ob3N0LmNvbmYKICBmaWxlIHRvIGRldGVybWluZSB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggdG8gc2VhcmNoIC9ldGMvaG9zdHMgYW5kIEROUy4gIFNvIG9uCiAgc3lzdGVtcyB3aGVyZSB0aGlzIG9yZGVyIGlzIGRlZmluZWQgYnkgL2V0Yy9ob3N0LmNvbmYgaW5zdGVhZCBvZiBhICJsb29rdXAiCiAgZW50cnkgaW4gL2V0Yy9yZXNvbHYuY29uZiwgYy1hcmVzIHdpbGwgYWx3YXlzIGRlZmF1bHQgdG8gbG9va2luZyBpbiBETlMKICBmaXJzdCwgYW5kIC9ldGMvaG9zdHMgc2Vjb25kLgoKICBjLWFyZXMgbm93IGxvb2tzIGF0CgogIDEpIHJlc29sdi5jb25mIChmb3IgdGhlICJsb29rdXAiIGxpbmUpOwogIDIpIG5zc3dpdGNoLmZvbiAoZm9yIHRoZSAiaG9zdHM6IiBsaW5lKTsKICAzKSBob3N0LmNvbmYgKGZvciB0aGUgIm9yZGVyIiBsaW5lKS4KCiAgRmlyc3QgbWF0Y2ggd2lucy4KCi0gRG9taW5pY2sgTWVnbGlvIHBhdGNoZWQ6IEMtYXJlcyBvbiBXaW5kb3dzIGFzc3VtZWQgdGhhdCB0aGUgSE9TVFMgZmlsZSBpcwogIGxvY2F0ZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24uIEl0IGFzc3VtZWQKICBDOlxXaW5kb3dzXFN5c3RlbTMyXERyaXZlcnNcRXRjLiBUaGlzIGlzIGEgcG9vciBhc3N1bXB0aW9uIHRvIG1ha2UuIEluIGZhY3QsCiAgdGhlIGxvY2F0aW9uIG9mIHRoZSBIT1NUUyBmaWxlIGNhbiBiZSBjaGFuZ2VkIHZpYSBhIHJlZ2lzdHJ5IHNldHRpbmcuCgogIFRoZXJlIGlzIGEga2V5IGNhbGxlZCBEYXRhYmFzZVBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBIT1NUUwogIGZpbGU6CiAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvaXRzb2x1dGlvbnMvbmV0d29yay9kZXBsb3kvZGVwb3ZnL3RjcGlwMmsubXNweAoKICBUaGUgcGF0Y2ggd2lsbCBtYWtlIGMtYXJlcyBjb3JyZWN0bHkgY29uc3VsdCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBsb2NhdGlvbgogIG9mIHRoaXMgZmlsZS4KCiogQXVndXN0IDI5CgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBNU1ZDIGJ1aWxkIGZpbGVzLgoKKiBBdWd1c3QgMjAKCi0gR2lzbGUgVmFuZW0gbWFkZSBjLWFyZXMgYnVpbGQgYW5kIHdvcmsgd2l0aCBoaXMgV2F0dC0zMiBUQ1AvSVAgc3RhY2suCgoqIEF1Z3VzdCAxMwoKLSBIYXJzaGFsIFByYWRoYW4gbWFkZSBhIG1pbm9yIHN5bnRheCBjaGFuZ2UgaW4gYXJlc19pbml0LmMgdG8gbWFrZSBpdCBidWlsZAogIGZpbmUgd2l0aCBNU1ZDIDcuMQoKKiBKdWx5IDI0CgotIE1hZGUgdGhlIGxpYiBnZXQgYnVpbHQgc3RhdGljIG9ubHkgaWYgLS1lbmFibGUtZGVidWcgaXMgdXNlZC4KCi0gR2lzbGUgVmFuZW0gZml4ZWQ6CgogIEJhc2ljYWxseSBpbiBsb29wcyBsaWtlIGhhbmRsZV9lcnJvcnMoKSwgJ3F1ZXJ5LT5uZXh0JyB3YXMgYXNzaWduZWQgYSBsb2NhbAogIHZhcmlhYmxlIGFuZCB0aGVuIHF1ZXJ5IHdhcyByZWZlcmVuY2VkIGFmdGVyIHRoZSBtZW1vcnkgd2FzIGZyZWVkIGJ5CiAgbmV4dF9zZXJ2ZXIoKS4gSSd2ZSBjaGFuZ2VkIHRoYXQgc28gbmV4dF9zZXJ2ZXIoKSBhbmQgZW5kX3F1ZXJ5KCkgcmV0dXJucwogIHRoZSBuZXh0IHF1ZXJ5LiBTbyBjYWxsZXJzIHNob3VsZCB1c2UgdGhpcyByZXQtdmFsdWUuCgogIFRoZSBuZXh0IHByb2JsZW0gd2FzIHRoYXQgJ3NlcnZlci0+dGNwX2J1ZmZlcl9wb3MnIGhhZCBhIHJhbmRvbSB2YWx1ZSBhdAogIGVudHJ5IHRvIDFzdCByZWN2KCkgKGx1Y2tpbHkgY2F1c2luZyBXaW5zb2NrIHRvIHJldHVybiBFTk9CVUZTKS4KCiAgSSd2ZSBhbHNvIGFkZGVkIGEgYXJlc193cml0ZXYoKSBmb3IgV2luZG93cyB0byBzdHJlYW1saW5lIHRoZSBjb2RlIGEgYml0CiAgbW9yZS4KCiogSnVseSAyMAotIEZpeGVkIGEgZmV3IHZhcmlhYmxlIHJldHVybiB0eXBlcyBmb3Igc29tZSBzeXN0ZW0gY2FsbHMuIE1hZGUgY29uZmlndXJlCiAgY2hlY2sgZm9yIHNzaXplX3QgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhhdCB3aGVuIHJlY2VpdmluZyB0aGUgc2VuZCgpCiAgZXJyb3IgY29kZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncyBvbiBzb21lIHN5c3RlbXMuCgotIE1hZGUgY29uZmlndXJlIGNyZWF0ZSBjb25maWcuaCwgYW5kIGFsbCBzb3VyY2UgZmlsZXMgbm93IGluY2x1ZGUgc2V0dXAuaCB0aGF0CiAgbWlnaHQgaW5jbHVkZSB0aGUgcHJvcGVyIGNvbmZpZy5oIChvciBhIGhhbmRpY3JhZnRlZCBhbHRlcm5hdGl2ZSkuCgotIFN3aXRjaGVkIHRvICdhcmVzX3NvY2tldF90JyB0eXBlIGZvciBzb2NrZXRzIGluIGFyZXMsIHNpbmNlIFdpbmRvd3MgZG9uJ3QKICB1c2UgJ2ludCcgZm9yIHRoYXQuCgotIGF1dG9tYWtlLWlmaWVkIGFuZCBsaWJvb2wtaWZpZWQgYy1hcmVzLiBOb3cgaXQgYnVpbGRzIGxpYmNhcmVzIGFzIGEgc2hhcmVkCiAgbGliIG9uIG1vc3QgcGxhdGZvcm1zIGlmIHdhbnRlZC4gKFRoaXMgYmxvYXRlZCB0aGUgc2l6ZSBvZiB0aGUgcmVsZWFzZQogIGFyY2hpdmUgd2l0aCBhbm90aGVyIDIwMEshKQoKLSBNYWtlZmlsZS5hbSBub3cgdXNlcyBNYWtlZmlsZS5pbmMgZm9yIHRoZSBjIHNvdXJjZXMsIGggaGVhZGVycyBhbmQgbWFuCiAgcGFnZXMsIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBvdGhlciBtYWtlZmlsZXMgdG8gdXNlIHRoZSBleGFjdCBzYW1lIHNldCBvZgogIGZpbGVzLgoKLSBBZGp1c3RlZCAnbWFrZXRneicgdG8gdXNlIHRoZSBuZXcgYXV0b21ha2UgbWFnaWMgd2hlbiBidWlsZGluZyBkaXN0cmlidXRpb24KICBhcmNoaXZlcy4KCi0gQW55b25lIGRlc2lyZXMgSFRNTCBhbmQvb3IgUERGIHZlcnNpb25zIG9mIHRoZSBtYW4gcGFnZXMgaW4gdGhlIHJlbGVhc2UKICBhcmNoaXZlcz8KCiogSnVseSAzCi0gR/xudGVyIEtuYXVmIG1hZGUgYy1hcmVzIGJ1aWxkIGFuZCBydW4gb24gTm92ZWxsIE5ldHdhcmUuCgoqIEp1bHkgMQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIE1ha2VmaWxlLmRqIHRvIGJ1aWxkIHdpdGggZGpncHAsIGFkZGVkIGEgZmV3IG1vcmUgZGpncHAKICBmaXhlcyBhbmQgbWFkZSBhcmVzIG5vdCB1c2UgJ2Vycm5vJyB0byBwcm92aWRlIGZ1cnRoZXIgaW5mbyBvbiBXaW5kb3dzLgoKKiBKdW5lIDMwCi0gR2lzbGUgVmFuZW0gbWFkZSBpdCBidWlsZCB3aXRoIGRqZ3BwIGFuZCBydW4gZmluZSB3aXRoIHRoZSBXYXR0LTMyIHN0YWNrLgoKKiBKdW5lIDEwCi0gR2lzbGUgVmFuZW0ncyBpbml0IHBhdGNoIGZvciBXaW5kb3dzOgoKICBUaGUgaW5pdF9ieV9yZXNvbHZfY29uZigpIGZ1bmN0aW9uIGZldGNoZXMgdGhlIEROUy1zZXJ2ZXIocykKICBmcm9tIGEgc2VyaWVzIG9mIHJlZ2lzdHJ5IGJyYW5jaGVzLgoKICBUaGlzIGNhbiBiZSB3cm9uZyBpbiB0aGUgY2FzZSB3aGVyZSBESENQIGhhcyBhc3NpZ25lZCBuYW1lc2VydmVycywgYnV0IHRoZQogIHVzZXIgaGFzIG92ZXJyaWRkZW4gdGhlc2Ugc2VydmVycyB3aXRoIG90aGVyIHByZWZlcmVkIHNldHRpbmdzLiBUaGVuIGl0J3MKICB3cm9uZyB0byB1c2UgdGhlIERIQ1BOQU1FU0VSVkVSIHNldHRpbmcgaW4gcmVnaXN0cnkuCgogIEluIHRoZSBjYXNlIG9mIG5vIGdsb2JhbCBESENQLWFzc2lnbmVkIG9yIGZpeGVkIHNlcnZlcnMsIGJ1dCBETlMgc2VydmVyKHMpCiAgcGVyIGFkYXB0ZXIsIG9uZSBoYXMgdG8gcXVlcnkgdGhlIGFkYXB0ZXIgYnJhbmNoZXMuICBCdXQgaG93IGNhbiBjLWFyZXMga25vdwogIHdoaWNoIGFkYXB0ZXIgaXMgdmFsaWQgZm9yIHVzZT8gQUZBSUNTIGl0IGNhbid0LiBUaGVyZSBjb3VsZCBiZSBvbmUgYWRhcHRlcgogIHRoYXQgaXMgZG93biAoZS5nLiBhIFZQTiBhZGFwdGVyKS4KCiAgU28gaXQncyBiZXR0ZXIgdG8gbGVhdmUgdGhpcyB0byB0aGUgSVAgSGVscGVyIEFQSSAoaXBobGFwaSkgYXZhaWxhYmxlIGluCiAgV2luLTk4LzIwMDAgYW5kIGxhdGVyLiBNeSBwYXRjaCBmYWxscy1iYWNrIHRvIHRoZSBvbGQgd2F5IGlmIG5vdCBhdmFpbGFibGUuCgoqIEp1bmUgOAotIEphbWVzIEJ1cnNhIGZpeGVkIGFuIGluaXQgaXNzdWUgZm9yIFJJU0MgT1MuCgoqIE1heSAxMQotIE5pY28gU3RhcHBlbmJlbHQgcmVwb3J0ZWQgdGhhdCB3aGVuIHByb2Nlc3NpbmcgZG9tYWluIGFuZCBzZWFyY2ggbGluZXMgaW4KICB0aGUgcmVzb2x2LmNvbmYgZmlsZSwgdGhlIGZpcnN0IGVudHJ5IGVuY291bnRlcmVkIGlzIHByb2Nlc3NlZCBhbmQgdXNlZCBhcwogIHRoZSBzZWFyY2ggbGlzdC4gQWNjb3JkaW5nIHRvIHRoZSBtYW51YWwgcGFnZXMgZm9yIGJvdGggTGludXgsIFNvbGFyaXMgYW5kCiAgVHJ1NjQsIHRoZSBsYXN0IGVudHJ5IG9mIGVpdGhlciBhIGRvbWFpbiBvciBhIHNlYXJjaCBmaWVsZCBpcyB1c2VkLgoKICBUaGlzIGlzIG5vdyBhZGp1c3RlZCBpbiB0aGUgY29kZQoKVmVyc2lvbiAxLjIuMCAoQXByaWwgMTMsIDIwMDQpCgoqIEFwcmlsIDIsIDIwMDQKLSBVcGRhdGVkIHZhcmlvdXMgbWFuIHBhZ2VzIHRvIGxvb2sgbmljZXIgd2hlbiBjb252ZXJ0ZWQgdG8gSFRNTCBvbiB0aGUgd2ViCiAgc2l0ZS4KCiogQXByaWwgMSwgMjAwNAotIERpcmsgTWFuc2tlIHByb3ZpZGVkIGEgbmV3IGZ1bmN0aW9uIHRoYXQgaXMgbm93IG5hbWVkIGFyZXNfY2FuY2VsKCkuIEl0IGlzCiAgdXNlZCB0byBjYW5jZWwvY2xlYW51cCBhIHJlc29sdmUvcmVxdWVzdCBtYWRlIHVzaW5nIGFyZXMgZnVuY3Rpb25zIG9uIHRoZQogIGdpdmVuIGFyZXMgY2hhbm5lbC4gSXQgZG9lcyBub3QgZGVzdHJveS9raWxsIHRoZSBhcmVzIGNoYW5uZWwgaXRzZWxmLgoKLSBEb21pbmljayBNZWdsaW8gY2xlYW5lZCB1cCB0aGUgZm9ybWF0dGluZyBpbiBzZXZlcmFsIG1hbiBwYWdlcy4KCiogTWFyY2ggMzAsIDIwMDQKLSBEb21pbmljayBNZWdsaW8ncyBuZXcgYXJlc19leHBhbmRfc3RyaW5nLiBBIGhlbHBlciBmdW5jdGlvbiB3aGVuIGRlY29kaW5nCiAgaW5jb21pbmcgRE5TIHBhY2thZ2VzLgoKLSBEYW5pZWwgU3RlbmJlcmcgbW9kaWZpZWQgdGhlIE1ha2VmaWxlLmluIHRvIHVzZSBhIGZvciBsb29wIGZvciB0aGUgbWFuIHBhZ2UKICBpbnN0YWxsYXRpb24gdG8gaW1wcm92ZSBvdmVydmlldyBhbmQgbWFrZSBpdCBlYXNpZXIgdG8gYWRkIG1hbiBwYWdlcy4KClZlcnNpb24gMS4xLjAgKE1hcmNoIDExLCAyMDA0KQoKKiBNYXJjaCA5LCAyMDA0Ci0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgYnVpbGQgb24gV2luZG93cy4KCiogRmVicnVhcnkgMjUsIDIwMDQKLSBEYW4gRmFuZHJpY2ggZm91bmQgYSBmbGF3IGluIHRoZSBGZWIgMjIgZml4LgoKLSBBZGRlZCBiZXR0ZXIgY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIGxvZ2ljICh0YWtlbiBmcm9tIHRoZSBjdXJsIGNvbmZpZ3VyZQogIHNjcmlwdCkuIEFkZGVkIGFjaW5jbHVkZS5tNCB0byB0aGUgdGFyYmFsbC4KCiogRmVicnVhcnkgMjMsIDIwMDQKLSBSZW1vdmVkIGFyZXNfZnJlZV9lcnJtZW0oKSwgdGhlIGZ1bmN0aW9uLCB0aGUgZmlsZSBhbmQgdGhlIG1hbiBwYWdlLiBJdCB3YXMKICBub3QgdXNlZCBhbmQgaXQgZGlkIG5vdGhpbmcuCgotIEZpeGVkIGEgbG90IG9mIGNvZGUgdGhhdCB3YXNuJ3QgIjY0Yml0IGNsZWFuIiBhbmQgdGh1cyBjYXVzZWQgYSBsb3Qgb2YKICBjb21waWxlciB3YXJuaW5ncyBvbiBwaWNreSBjb21waWxlcnMuCgoqIEZlYnJ1YXJ5IDIyLCAyMDA0Ci0gRG9taW5pY2sgTWVnbGlvIG1hZGUgYXJlcyBpbml0IHN1cHBvcnQgbXVsdGlwbGUgbmFtZSBzZXJ2ZXJzIGluIHRoZQogIE5hbWVTZXJ2ZXIga2V5IG9uIFdpbmRvd3MuCgoqIEZlYnJ1YXJ5IDE2LCAyMDA0Ci0gTW9kaWZpZWQgYXJlc19wcml2YXRlLmggdG8gaW5jbHVkZSBsaWJjdXJsJ3MgbWVtb3J5IGRlYnVnIGhlYWRlciBpZgogIENVUkxERUJVRyBpcyBzZXQuIFRoaXMgbWFrZXMgYWxsIHRoZSBhcmVzLWZ1bmN0aW9ucyBzdXBlcnZpc2VkIHByb3Blcmx5IGJ5CiAgdGhlIGN1cmwgdGVzdCBzdWl0ZS4gVGhpcyBhbHNvIGZvcmNlZCBtZSB0byBhZGQgaW5jbHVzaW9uIG9mIHRoZQogIGFyZXNfcHJpdmF0ZS5oIGhlYWRlciBpbiBhIGZldyBtb3JlIGZpbGVzIHRoYXQgYXJlIHVzaW5nIHNvbWUga2luZCBvZgogIG1lbW9yeS1yZWxhdGVkIHJlc291cmNlcy4KCi0gTWFkZSB0aGUgbWFrZWZpbGUgb25seSBidWlsZCBhaG9zdCBhbmQgYWRpZyBpZiAnbWFrZSBkZW1vcycgaXMgdXNlZC4KCiogRmVicnVhcnkgMTAsIDIwMDQKLSBEaXJrIE1hbnNrZSBtYWRlIGFyZXNfdmVyc2lvbi5oIGluc3RhbGxlZCB3aXRoICdtYWtlIGluc3RhbGwnCgoqIEZlYnJ1YXJ5IDQsIDIwMDQKLSBhcmVzX2ZyZWVfZXJybWVtKCkgaXMgc3ViamVjdCBmb3IgcmVtb3ZhbCwgaXQgaXMgc2ltcGx5IHByZXNlbnQgZm9yIGZ1dHVyZQogIHB1cnBvc2VzLCBhbmQgc2luY2Ugd2UgcmVtb3ZlZCB0aGUgZXh0cmEgcGFyYW1ldGVyIGluIHN0cmVycm9yKCkgaXQgd29uJ3QKICBiZSB1c2VkIGJ5IGMtYXJlcyEKLSBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgbm93IGVuYWJsZXMgcGlja3kgY29tcGlsZXIgb3B0aW9ucyBpZiBnY2MgaXMgdXNlZAotIGZpeGVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3MgLS1lbmFibGUtZGVidWcgc2hvd2VkIGFuZCBKb2VyZyBNdWVsbGVyLVRvbGsKICByZXBvcnRlZAoKVmVyc2lvbiAxLjAuMCAoRmVicnVhcnkgMywgMjAwNCkKCiogRmVicnVhcnkgMywgMjAwNAotIG5vdyB3ZSBwcm9kdWNlIHRoZSBsaWJjYXJlcy5hIGxpYnJhcnkgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgbGliYXJlcy5hCiAgc2luY2Ugd2UgYXJlIG5vIGxvbmdlciBjb21wYXRpYmxlCgoqIEZlYnJ1YXJ5IDIsIDIwMDQKCi0gYXJlc19zdHJlcnJvcigpIGhhcyBvbmUgYXJndW1lbnQgbGVzcy4gVGhpcyBpcyB0aGUgZmlyc3Qgb2ZmaWNpYWwKICBtb2RpZmljYXRpb24gb2YgdGhlIGV4aXN0aW5nIHByb3ZpZGVkIGFyZXMgQVBJLgoKKiBKYW51YXJ5IDI5LCAyMDA0CgotIERpcmsgTWFuc2tlIGZpeGVkIGhvdyB0aGUgc29ja2V0IGlzIHNldCBub24tYmxvY2tpbmcuCgoqIEphbnVhcnkgNCwgMjAwNAoKLSBEb21pbmljayBNZWdsaW8gbWFkZSB0aGUgcHJpdmF0ZSBnZXR0aW1lb2ZkYXkoKSBiZWNvbWUgYXJlc19nZXR0aW1lb2ZkYXkoKQogIGluc3RlYWQgaW4gb3JkZXIgdG8gbm90IHBvbGx1dGUgdGhlIG5hbWUgc3BhY2UgYW5kIHJpc2sgY29sbGlkaW5nIHdpdGgKICBvdGhlciBsaWJyYXJpZXMnIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24uCgoqIE9jdG9iZXIgMjQsIDIwMDMuIERhbmllbCBTdGVuYmVyZwoKICBBZGRlZCBhcmVzX3ZlcnNpb24oKS4KClZlcnNpb24gMS4wLXByZTEgKDggT2N0b2JlciAyMDAzKQoKLSBKYW1lcyBCdXJzYSBtYWRlIGl0IHJ1biBvbiBSSVNDIE9TCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIGl0IHJ1biBmaW5lIG9uIE5UNAoKLSBEdW5jYW4gV2lsY294IG1hZGUgaXQgd29yayBmaW5lIG9uIE1hYyBPUyBYCgotIERhbmllbCBTdGVuYmVyZyBhZGp1c3RlZCB0aGUgd2luZG93cyBwb3J0CgotIGxpcmVuIGF0IHZpdmlzaW1vLmNvbSBtYWRlIHRoZSBpbml0aWFsIHdpbmRvd3MgcG9ydAoKKiBJbXBvcnRlZCB0aGUgc291cmNlcyBmcm9tIGFyZXMgMS4xLjEK