ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpEYW5pZWwgKDI4IEF1Z3VzdCAyMDAxKQotIEdlb3JnIEh1ZXR0ZW5lZ2dlciBtb2RpZmllZCB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb25hbGl0eSBzbGlnaHRseSwgYW5kCiAgYWRkZWQgc3VwcG9ydCBmb3IgZXJyb3IgY29kZSA0MTcgd2hlbiBkb2luZyBmb3JtIHBvc3QgYW5kIHVzaW5nIHRoZSBFeHBlY3Q6CiAgaGVhZGVyLiBHcmVhdCB3b3JrIQoKLSBNYWRlIHNvbWUgdGVzdHMgd2l0aCBjYWNoZWQgU1NMIHNlc3Npb24gSURzLCBhbmQgdGhleSBzZWVtIHRvIHdvcmsuIFRoZXJlCiAgc2hvdWxkIGJlIGEgc2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnQgaW4gdGhlIFNTTCBjb25uZWN0aW9uIHBoYXNlLCBidXQKICBpbiBteSB0aW55IHRlc3RzIGl0IGp1c3QgaXNuJ3QgcG9zc2libGUgdG8gbm90aWNlIGFueSBkaWZmZXJlbmNlLgoKLSBVcGdyYWRlZCB0byBhdXRvbWFrZSAxLjUgb24gbXkgZGV2ZWxvcG1lbnQvcmVsZWFzZSBtYWNoaW5lLgoKRGFuaWVsICgyNyBBdWd1c3QgMjAwMSkKLSBTbG93bHkgc3RhcnRlZCB3cml0aW5nIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgY29kZQoKRGFuaWVsICgyNCBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIHJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gd2luZG93cyBhbmQgdXBkYXRlZCB0aGUgTVMgcHJvamVjdAogIGZpbGVzLgoKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHR3byBraW5kcyBvZiBjb21tYW5kIGxpbmUgY29uc3RydWN0cyB3aXRoIHRoZSBuZXcgLUcgdGhhdAogIGN1cmwgZGlkbid0IHJlYWxseSBkZWFsIHdpdGggdGhlIHdheSBvbmUgd291bGQgbGlrZS4KCi0gVGltIENvc3RlbGxvIHBhdGNoZWQgYXdheSBhIHVzZSBvZiBzdHJjYXNlY21wKCkgaW4gdGhlIFNTTCBjb2RlLiBXZSBoYXZlIG91cgogIG93biBwb3J0YWJsZSB2ZXJzaW9uIG5hbWVkIHN0cmVxdWFsKCkgdGhhdCBzaG91bGQgYmUgdXNlZCEKCi0gVGltIGFsc28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUudmM2IGZpbGUgdGhhdCBtYWRlIGl0IG1peAogIGRlYnVnIG9iamVjdCBtb2R1bGVzIGNhdXNpbmcgY29uZnVzaW9ucy4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDEpCi0gVC4gQmhhcmF0aCBhY2N1cmF0ZWx5IGZvdW5kIGEgbGliY3VybCBidWcgdGhhdCB3b3VsZCBoYXBwZW4gd2hlbiBkb2luZyBhCiAgc2Vjb25kIGludm9rZSBvZiBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpdGggYSBuZXcgVVJMIHdoZW4gdGhlIHByZXZpb3VzIGludm9rZQogIGZvbGxvd2VkIGEgTG9jYXRpb246IGhlYWRlci4KCi0gU3RhcnRlZCB0aGUgaW1wcm92ZW1lbnQgd29yayBvbiB0aGUgY29va2llIGVuZ2luZToKICAtIE5vdyBrZWVwcyBjb29raWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjb29raWUgZmlsZQogIC0gQSB3cml0ZSB0byB0aGUgcG9zc2libHkgc3RhdGljIHN0cmluZyB3YXMgcmVtb3ZlZAogIC0gQWRkZWQgYSBmdW5jdGlvbiB0aGF0IGNhbiBvdXRwdXQgYWxsIGNvb2tpZXMKICAtIE5vdyBzdXBwb3J0cyByZWFkaW5nIG11bHRpcGxlIGNvb2tpZSBmaWxlcwoKLSBTdGV2ZSBMaG9tbWUgY29ycmVjdGVkIGEgRExMIG5hbWluZyBpc3N1ZSBpbiB0aGUgTVNWQysrIHByb2plY3QgZmlsZS4KCi0gU3BsaXQgdXAgdGhlIG1vbnN0ZXIgZnVuY3Rpb24gaW4gbGliL2Z0cC5jIHRvIHVzZSBtb3JlIHNtYWxsaXNoIGZ1bmN0aW9ucyB0bwogIGluY3JlYXNlIHJlYWRhYmlsaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAxKQotIEdlb3JnIEh1ZXR0ZW5lZ2dlcidzIGJpZyBwYXRjaCB3YXMgYXBwbGllZC4gTm93IHdlIGhhdmU6CiAgbyAiRXhwZWN0OiAxMDAtY29udGludWUiIHN1cHBvcnQuIFdlIHdpbGwgZnJvbSBub3cgb24gc2VuZCB0aGF0IGhlYWRlciBpbgogICAgYWxsIHJmYzE4NjctcG9zdHMsIGFzIHRoYXQgbWFrZXMgdXMgYWJvcnQgbXVjaCBmYXN0ZXIgd2hlbiB0aGUgc2VydmVyCiAgICByZWplY3RzIG91ciBQT1NULiBQb3N0aW5nIHdpdGhvdXQgdGhlIEV4cGVjdDogaGVhZGVyIGlzIHN0aWxsIHBvc3NpYmxlIGluCiAgICB0aGUgc3RhbmRhcmQgcmVwbGFjZS1pbnRlcm5hbC1oZWFkZXIgc3R5bGUuCiAgbyBjdXJsX2Zvcm1hZGQoKSBpcyBhIG5ldyBmb3JtcG9zdCBidWlsZGluZyBmdW5jdGlvbiB0aGF0IGlzIGludHJvZHVjZWQgdG8KICAgIHJlcGxhY2UgdGhlIG5vdyBkZXByZWNhdGVkIGN1cmxfZm9ybXBhcnNlKCkgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgZnVuY3Rpb24KICAgIHdpbGwgc3RpbGwgaGFuZyBhcm91bmQgZm9yIGEgd2hpbGUsIGJ1dCB0aGUgY3VybF9mb3JtYWRkKCkgaXMgdGhlIG5ldyB3YXkKICAgIGFuZCBjb3JyZWN0IHdheSB0byBidWlsZCBmb3JtIHBvc3RzLgogIG8gRG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcwoKICBUaGVzZSBjaGFuZ2VzIGFyZSByZWFzb24gZW5vdWdoIHRvIG5hbWUgdGhlIG5leHQgY3VybCByZWxlYXNlIDcuOS4uLgoKLSBXZSBub3cgY29udmVydCBtYW4gcGFnZXMgdG8gSFRNTCBwYWdlcyBhbmQgaW5jbHVkZSB0aGVtIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZS4gRm9yIHRoZSBwbGVhc3VyZSBvZiBldmVyeW9uZSB3aXRob3V0IG5yb2ZmIHdpdGhpbiByZWFjaC4KCi0gQW5kculzIEdhcmPtYSdzIHN1Z2dlc3RlZCBmbHVzaGluZyBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgb3V0cHV0IHN0cmVhbSB3YXMKICBhZGRlZC4gSXQgc2hvdWxkIG1ha2UgdGhlIHByb2dyZXNzIG1ldGVyIGxvb2sgYmV0dGVyIG9uIFdpbmRvd3MuCgotIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsCiAgb24gbWFueSBSZWQgSGF0IGJveGVzIQoKRGFuaWVsICgyMCBBdWd1c3QgMjAwMSkKLSBXZSBuZWVkIGFuIHVwZGF0ZWQgbGlidG9vbCB0byBtYWtlIGEgYmV0dGVyIGJ1aWxkIGVudmlyb25tZW50IGZvciBPcGVuQlNECiAgYXMgd2VsbCBhcyBGcmVlQlNECgpWZXJzaW9uIDcuOC4xCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIEJyYWQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaGlwIHR3byBleHRyYSBsaWJ0b29sIGZpbGVzIGluIHRoZSB0YXJiYWxscyB0aGF0CiAgd2UgcmVhbGx5IGRvbid0IG5lZWQgdG8hIFJlbW92aW5nIHRoZW0gbWFrZXMgdGhlIGd6LWFyY2hpdmUgYWJvdXQgNjBLCiAgc21hbGxlciEKCi0gQWxiZXJ0IENoaW4gYnJvdWdodCBmaXhlcyBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNvY2tsZW5fdAogIHByb3Blcmx5IGFzIHdlbGwgYXMgbW92aW5nIGxvdHMgb2Ygb3VyIGN1c3RvbSBhdXRvY29uZiBtYWNyb3MgdG8KICBhY2luY2x1ZGUubTQuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDAxKQotIE1vb25lc2FteSBpbXByb3ZlZCBoaXMgLUcgZmVhdHVyZSBmb3IgaG9zdCBuYW1lcyBvbmx5IFVSTHMuLi4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDEpCi0gRmluYWxseSBjbGVhbmVkIHVwIHRoZSBrZXJiZXJvcyBjb2RlIHRvIHVzZSBDdXJsXyBwcmVmaXhlcyBvbiBhbGwgZ2xvYmFsCiAgc3ltYm9scyBhbmQgdG8gbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLgoKVmVyc2lvbiA3LjguMS1wcmU2CgpEYW5pZWwgKDE2IEF1Z3VzdCAyMDAxKQotIFMuIE1vb25lc2FteSBhZGRlZCB0aGUgLUcgb3B0aW9uIHRvIGN1cmwsIHRoYXQgY29udmVydHMgdGhlIGRhdGEgc3BlY2lmaWVkCiAgd2l0aCAtZCB0byBhIEdFVCByZXF1ZXN0LiBEZWZhdWx0IGFjdGlvbiB3aGVuIHVzaW5nIC1kIGlzIFBPU1QuIFdoZW4gLUcgaXMKICB1c2VkLCB0aGUgLWQgc3BlY2lmaWVkIGRhdGEgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgVVJMIHdpdGggYSAnPycKICBzZXBhcmF0b3IuIEFzIHN1Z2dlc3RlZCBwcmV2aW91c2x5IGJ5IEtldmluIFJvdGguCgotIGN1cmwtY29uZmlnIC0tbGlicyBzaG91bGQgbm93IGRpc3BsYXkgYWxsIGxpbmtlciBvcHRpb25zIHJlcXVpcmVkIHRvIGxpbmsKICB3aXRoIGxpYmN1cmwuIEl0IGluY2x1ZGVzIHRoZSBwYXRoIGFuZCBvcHRpb25zIGZvciBsaWJjdXJsIGl0c2VsZi4KICBjdXJsLWNvbmZpZyAtLWNmbGFncyBkaXNwbGF5cyB0aGUgY29tcGlsZXIgb3B0aW9uKHMpIG5lZWRlZCB0byBjb21waWxlCiAgc291cmNlIGZpbGVzIHRoYXQgdXNlIGxpYmN1cmwgZnVuY3Rpb25zLiBCYXNpY2FsbHksIHRoYXQgc2V0cyB0aGUgaW5jbHVkZQogIHBhdGggY29ycmVjdC4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDEpCi0gQXJrYWRpdXN6IE1pc2tpZXdpY3ogcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIGhvdyBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcwogIHdlcmUgcGFyc2VkIGFuZCB1c2VkLiAoUkZDMjczMi1mb3JtYXQpCgotIEJ1ZyAjMTI3MzMgb3ZlciBvbiBwaHAubmV0IGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIGxpYmN1cmwgdGhhdCBtYWRlIGl0IGNvcmUKICBkdW1wIGlmIHlvdSB1c2VkIENVUkxPUFRfUE9TVCB3aXRob3V0IHNldHRpbmcgYW55IGRhdGEgdG8gcG9zdCB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTISBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gTm90IHVzaW5nIENVUkxPUFRfUE9TVEZJRUxEUwogIG5vdyBlcXVhbHMgc2V0dGluZyBpdCB0byBubyBkYXRhIGF0IGFsbC4KCi0gUmFtYW5hIE1va2thcGF0aSByZXBvcnRlZCB0aGF0IGN1cmwgd2l0aCAnLXcgJXtodHRwX2NvZGV9JyBkaWRuJ3Qgd29yawogIHByb3Blcmx5IHdoZW4gdXNlZCBmb3IgbXVsdGlwbGUgVVJMcyBvbiBhIHNpbmdsZSBjb21tYW5kIGxpbmUuIEluZGVlZCwgdGhlCiAgdmFyaWFibGUgd2FzIG5vdCByZXNldCBiZXR3ZWVuIHRoZSByZXF1ZXN0cy4gVGhpcyBpcyBub3cgZml4ZWQuCgotIERhdmlkIEphbWVzIGZpeGVkIHRoZSBCb3JsYW5kIG1ha2VmaWxlIHNvIHRoYXQgbGliY3VybCBzdGlsbCBjb21waWxlcyBhbmQKICBidWlsZHMgd2l0aCB0aGF0IGNvbXBpbGVyLgoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBPb3BzLiBJIHJ1aW5lZCBOaWNvJ3Mgc29ja2xlbl90IGRlZmluZSBpbiBjb25maWctdm1zLmgsIGNvcnJlY3RlZCBpdCBub3cuCgotIEFuIG9sZGVyIGl0ZW0gbm90IG1lbnRpb25lZCBoZXJlIGJlZm9yZTogQ1VSTF9HTE9CQUxfV0lOMzIgaXMgYSBkZWZpbmUgZm9yCiAgd2luZG93cyB1c2VycyB0byBjdXJsX2dsb2JhbF9pbml0KCksIHRoYXQgbWFrZXMgbGliY3VybCBpbml0IHRoZSB3aW5zb2NrCiAgc3R1ZmYuIElmIGxpYmN1cmwgaXMgYWxsIHNvY2tldCBzdHVmZiB5b3UgZG8sIHRoZW4gYWxsb3dpbmcgaXQgdG8gZmlkZGxlCiAgd2l0aCB0aGlzIGlzIGEgY29tZm9ydGFibGUgc2hvcnRjdXQgdG8gZmFtZS4KClZlcnNpb24gNy44LjEtcHJlNQoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCBtb3JlIGZlZWRiYWNrIGZyb20gaGlzIFZNUyBwb3J0aW5nIGVmZm9ydHMgYW5kIGEgZmV3CiAgbWlub3IgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeS4KCi0gSSBtb2RpZmllZCBjb25maWd1cmUuaW4gc28gdGhhdCAtLWVuYWJsZS1kZWJ1ZyBzZXRzIG1vcmUgcGlja3kgZ2NjIG9wdGlvbnMuCiAgSSB0aGVuIHJlbW92ZWQgYWxtb3N0IGFsbCB0aGUgbmV3IHdhcm5pbmdzIHRoYXQgYXBwZWFyZWQsIGFuZCBieSBkb2luZyBzbyBJCiAgY29ycmVjdGVkIHRoZSBzaXplX3QtdHJlYXRlZC1hcy1zaWduZWQgcHJvYmxlbSB0aGF0IGhhcyBiZWVuIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QgcHJldmlvdXNseS4gSSBhbHNvIHJlbW92ZWQgYSBidW5jaCBvZiB0aGUganVzdCByZWNlbnRseQogIGFkZGVkICNpZmRlZiBWTVMgbGluZXMuCgotIEkgcmVtb3ZlZCB0aGUgdXNlIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSBTU0wgY29kZS4gSXQgd2FzIG9uY2UKICBuZWNlc3NhcnkgYnV0IGhhc24ndCBiZWVuIG5lZWRlZCBzaW5jZSBPcGVuU1NMIDAuOS40LiBUaGUgb2xkIGNvZGUgc2hvdWxkCiAgKGhvcGVmdWxseSkgc3RpbGwgd29yayBpZiBsaWJjdXJsIGlzIGJ1aWx0IGFnYWluc3QgYW4gYW5jaWVudCB2ZXJzaW9uIG9mCiAgT3BlblNTTC4KCkRhbmllbCAoMTMgQXVndXN0IDIwMDEpCi0gUGV0ZXIgVG9kZCBwb3N0ZWQgYSBwYXRjaCB0aGF0IG5vdyBhbGxvd3Mgbm9uLWZpbGUgcmMxODY3LXN0eWxlIGZvcm0gcG9zdHMKICB0byBiZSBsYXJnZXIgdGhhbiA0Sy4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZpeGVkIGJ1Z3MgZm9yIGJ1aWxkaW5nIGRlYnVnIGFuZCBTU0wgbGliIGluIFZDIG1ha2VmaWxlCgpEYW5pZWwgKDkgQXVndXN0IDIwMDEpCi0gVGhlIHJlZGlyZWN0ZWQgZXJyb3Igc3RyZWFtIHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjdXJsX2Vhc3lfY2xlYW51cCgpIGNhbGwKICB3YXMgbWFkZSwgYW5kIHdoZW4gVkVSQk9TRSB3YXMgZW5hYmxlZCwgdGhlIGNsZWFudXAgZnVuY3Rpb24gdHJpZWQgdG8gdXNlCiAgdGhlIHN0cmVhbS4gSXQgY291bGQgbGVhZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gQWxzbywgdGhlIHN0cmVhbSB3YXMKICBjbG9zZWQgZXZlbiBpZiB3ZSBsb29wZWQgdG8gZ2V0IG1vcmUgZmlsZXMuICBDb3JyZWN0cyBEdXN0aW4gQm9zd2VsbCdzIGJ1ZwogIHJlcG9ydCAjNDQxNjEwCgotIE5vdyBnZW5lcmF0ZXMgdGhlIHJlbGVhc2UgY29uZmlndXJlIHNjcmlwdCB3aXRoIGF1dG9jb25mIDIuNTIKClZlcnNpb24gNy44LjEtcHJlNAoKRGFuaWVsICg4IEF1Z3VzdCAyMDAxKQotIGN1cmwgLUUgdXNlcyBhIGNvbG9uIHRvIHNlcGFyYXRlIGEgZmlsZSBuYW1lIGZyb20gYSBwYXNzcGhyYXNlLiBUaGlzIHR1cm5lZAogIG91dCByZWFsbHkgYmFkIGZvciB0aGUgd2luZG93cyBwZW9wbGUgd2hvIHdhbnRzIHRvIGluY2x1ZGUgYSBkcml2ZSBsZXR0ZXIgaW4KICB0aGUgZmlsZSBuYW1lIGxpa2UgImM6XGNlcnQucGVtIi4gVGhlcmUncyBub3cgYSB3aW4zMiB3b3JrLWFyb3VuZAogIGltcGxlbWVudGVkIHRoYXQgdHJpZXMgd29yayBhcm91bmQgdGhhdCwgd2hlbiB0aGUgY29sb24gc2VlbXMgdG8gYmUgdXNlZCBmb3IKICB0aGlzIGtpbmQgb2YgY29uc3RydWN0LgoKLSBQYXRyaWNrIEJpaGFuLUZhb3UgaW50cm9kdWNlZCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCB3aGljaCBtYWtlcyBjdXJsCiAgdmVyaWZ5IHRoZSBzZXJ2ZXIncyBDTiBmaWVsZCB3aGVuIHRhbGtpbmcgaHR0cHM6Ly8uIElmIC0tY2FjZXJ0IGlzIG5vdCB1c2VkLAogIGFueSBmYWlsdXJlcyBpbiBtYXRjaGluZyBpcyBvbmx5IGRpc3BsYXllZCBhcyBpbmZvcm1hdGlvbiAoLXYpLgoKRGFuaWVsICg3IEF1Z3VzdCAyMDAxKQotIFdyb3RlIHVwIG5pbmUgbW9yZSB0ZXN0IGNhc2VzLCBtb3JlIG9yIGxlc3MgY29udmVydGVkIGZyb20gdGhlIGZvcm1lciB0ZXN0CiAgc3VpdGUuCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9zdGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyAnY3VybC1jb25maWcgLS1saWJzJyBpbmNsdWRlIHRoZQogIGRpcmVjdG9yeSBpbiB3aGljaCBsaWJjdXJsIGl0c2VsZiBpcyBpbnN0YWxsZWQgaW4uIFdoaWxlIHRoaXMgd2Fzbid0IG15CiAgaW5pdGlhbCBpbnRlbnRpb24gd2l0aCB0aGlzIG9wdGlvbiwgaXQgbWFrZXMgc2Vuc2UgYW5kIG1ha2VzIGxpbmtpbmcgd2l0aAogIGxpYmN1cmwgZWFzaWVyLgoKLSBTdGVmYW4gVWxyaWNoIHBvaW50ZWQgb3V0IHRvIHVzIHRoYXQgb3RoZXIgdG9vbHMgYW5kIGxpYnJhcmllcyB0cmVhdCBmaWxlOi8vCiAgVVJMcyB3aXRoIG9ubHkgb25lIHNsYXNoIGFmdGVyIHRoZSBob3N0IG5hbWUgc2xpZ2hseSBkaWZmZXJlbnQgdGhhbiBsaWJjdXJsCiAgZG9lcy4gU2luY2UgYWxsIHRoZSBvdGhlcnMgc2VlbSB0byBhZ3JlZSwgd2UgYmV0dGVyIGZvbGxvdyB0aGVtLgoKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCB1cyB3aXRoIGEgaHVnZSBzZXQgb2YgZml4ZXMgdG8gbWFrZSBjdXJsIGNvbXBpbGUgYW5kCiAgYnVpbGQgdW5kZXIgT3BlblZNUy4KClZlcnNpb24gNy44LjEtcHJlMwoKRGFuaWVsICg2IEF1Z3VzdCAyMDAxKQotIEpvbmF0aGFuIEhzZXUgbm90aWNlZCB0aGF0IHlvdSBjb3VsZG4ndCBnZXQgYSBoZWFkZXIgY2FsbGJhY2sgdW5sZXNzIHlvdQogIHNldCBDVVJMT1BUX1dSSVRFSEVBREVSIHRvIG5vbi1OVUxMLCBldmVuIGlmIHlvdSBkaWRuJ3QgY2FyZSBhYm91dCB0aGF0CiAgZGF0YS4gVGhpcyBpcyBub3cgZml4ZWQuCgpEYW5pZWwgKDUgQXVndXN0IDIwMDEpCi0gU2VyZ2lvIEJhbGxlc3RyZXJvIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHJlYWRpbmcgcmVzcG9uc2VzIGZyb20gTkNTQSBodHRwZAogIDEuNS54IHNlcnZlcnMsIGFzIHRoZXkgcmV0dXJuIHJlYWxseSBzY3Jld2VkIHVwIHJlc3BvbnNlIGhlYWRlcnMgd2hlbiBhc2tlZAogIGZvciB3aXRoIEhUVFAgMS4xLgoKLSBjdXJsX2VzY2FwZSgpIG5vIGxvbmdlciB0cmVhdHMgYWxyZWFkeSBlbmNvZGVkIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0CiAgc3RyaW5nIGVzcGVjaWFsbHkuCgpEYW5pZWwgKDMgQXVndXN0IDIwMDEpCi0gSSByZXBsYWNlZCB0aGUgZm9ybWVyIGxpYi9hcnBhX3RlbG5ldC5oIGZpbGUgd2l0aCBvbmUgSSB3cm90ZSBteXNlbGYsIHRvCiAgYXZvaWQgdGhlIEJTRCBhbm5vdWNlbWVudCBjbGF1c2Ugb2YgdGhlIGxpY2Vuc2UgaW4gdGhlIGZvcm1lciBmaWxlLgoKLSBBbmRyZXcgRnJhbmNpcyBwcm92aWRlZCBhIG5ldyB2ZXJzaW9uIG9mIGJhc2U2NC5jIHRvIHdvcmsgYXJvdW5kIHRoZSBsaWNlbnNlCiAgYm9pbGVyIHBsYXRlIHRoYXQgY2FtZSB3aXRoIHRoZSBwcmV2aW91cyBvbmUuIEkgcGF0Y2hlZCBpdCwgYnV0IHRoZSBnbG9yeQogIHNob3VsZCBnbyB0byBBbmRyZXcgZm9yIGhpcyBoZWFkcyB1cC4KCi0gVG9tYXN6IExhY2tpIG5vdGljZWQgdGhhdCB3aGVuIHlvdSBkbyByZXBlYXRlZCB0cmFuc2ZlcnMgd2l0aCBsaWJjdXJsIHlvdQogIGNvdWxkbid0IGFsd2F5cyByZWxpYWJseSBjaGFuZ2UgSFRUUCByZXF1ZXN0LiBUaGlzIGhhcyBub3cgYmVlbiBmaXhlZCBhbmQgYQogIG5ldyBsaWJjdXJsIG9wdGlvbiB3YXMgYWRkZWQ6IENVUkxPUFRfSFRUUEdFVCwgdGhhdCBjYW4gZm9yY2UgdGhlIEhUVFAKICByZXF1ZXN0ciAoYmFjaykgdG8gR0VULgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHBvaW50ZWQgb3V0IHRoYXQgaHR0cHNzZXJ2ZXIucGwgd2Fzbid0IGluY2x1ZGVkIGluCiAgcmVsZWFzZSBhcmNoaXZlcy4gSXQgc2hvdWxkIGJlIG5vdy4KCkRhbmllbCAoMiBBdWd1c3QgMjAwMSkKLSBGcmFuayBLZWVuZXkgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWlzdGFrZSBmb3IgY2VydGlmaWNhdGUgY29udmVydGlvbnMuCgotIFRvbWFzeiBMYWNraSBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIHRyYW5zZmVyIGxvb3AgdGhhdCBjb3VsZCBtYWtlIHRoZQogIHNlbGVjdCgpIGxvb3AgdXNlIGZhciB0b28gbXVjaCBDUFUuCgotIFBhd2VsIEEuIEdhamRhIHBvaW50ZWQgb3V0IGFuIG91dHB1dCBtaXN0YWtlIGRvbmUgd2hlbiB1c2luZyBsaWJjdXJsJ3MKICBwcm9ncmVzcyBjYWxsYmFjay4KCkRhbmllbCAoMjkgSnVuZSAyMDAxKQotIE5hdmVlbiBOb2VsIG5vdGljZWQgdGhhdCB0aGUgQm9ybGFuZCBsaWJyYXJ5IG1ha2VmaWxlIHdhc24ndCB1cGRhdGVkLgoKLSBOaWMgUm9ldHMgYnJvdWdodCBhIGZpeCBmb3IgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aGVuIHVzaW5nIFNTTC4KCkRhbmllbCAoMjcgSnVuZSAyMDAxKQotIE1hZGUgdGhlIEZUUCB0ZXN0cyBydW4gT0sgZXZlbiBvbiBtYWNoaW5lcyBydW5uaW5nIGN1cmwgSVB2Ni1lbmFibGVkLgoKLSBUcm95IEVuZ2VsIGNvcnJlY3RlZCBzb21lIFJQTSBwYWNrYWdlIGRldGFpbHMuCgpWZXJzaW9uIDcuOC4xLXByZTIKCkRhbmllbCAoMjUgSnVuZSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB0aGF0IG9jY3VycmVkIHdoZW4gZG93bmxvYWRpbmcKICBzZXZlcmFsIGZpbGVzIHdpdGggY3VybCwgYW5kIHVzaW5nIHJlc3VtZS4gVGhlIGZpcnN0IGZpbGUncyByZXN1bWUgaW5kZXggd2FzCiAgdGhlbiB1c2VkIGZvciBhbGwgZmlsZXMsIHJlc3VsdGluZyBpbiB3ZWlyZCByZXN1bHRzLi4uCgotIEFudG9uIEthbG15a292IHByb3ZpZGVkIGEgZml4IHRoYXQgbWFrZXMgY3VybCB3b3JrIHdpdGggZm9ybSBmaWVsZCBuYW1lcwogIHdpdGggc3BhY2VzIGxpa2Ugd2hlbiAtRiBpcyB1c2VkLgoKVmVyc2lvbiA3LjguMS1wcmUxCgpEYW5pZWwgKDIwIEp1bmUgMjAwMSkKLSBNaWtlIEJ5dG5hciBwcm92aWRlZCBhIGZpbmUgcmVwb3J0IHRoYXQgcHJvdmVkIHRoYXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uCiAgZm9yIGNvbmZpZ3VyZSBuZWVkZWQgdHdlYWtpbmcuIEl0IG5vIGxvbmdlciBzZWFyY2hlcyB0aGUgZGVmYXVsdCBkaXJlY3RvcmllcwogIGZvciBPcGVuU1NMIGxpYnMgb3IgZGlyZWN0b3JpZXMgd2hlbiBhIHNwZWNpZmllZCBwYXRoIGlzIGdpdmVuLgoKRGFuaWVsICgxOSBKdW5lIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgaXMgY3V0IG9mZiBkdXJpbmcgdHJhbnNmZXIsIGN1cmwgY291bGQgcHJlc2VudCBhIHRydWx5CiAgZ2FyYmFnZWQgZXJyb3IgbWVzc2FnZSBhbmQgaW4gd29yc3QgY2FzZSBkdW1wIGNvcmUuIFRoYW5rcyB0byBkZXRhaWxlZAogIHJlcG9ydHMgZnJvbSBTaGF3biBQb3Vsc29uIHdlIG5haWxlZCB0aGlzLgoKRGFuaWVsICgxMiBKdW5lIDIwMDEpCi0gU2FsdmFkb3IgROF2aWxhIHByb3ZpZGVkIGEgZml4IGZvciBGVFAgcmFuZ2UgZG93bmxvYWRzLgoKLSBBZGRlZCBhIGZldyBtb3JlIHRlc3QgY2FzZXMgZnJvbSB0aGUgZm9ybWVyIHRlc3Qgc3VpdGUgdG8gdGhlIG5ldyBmaWxlCiAgZm9ybWF0LiBXZSdyZSBub3cgYXQgYSB0b3RhbCBvZiAyNiB0ZXN0cy4KCkRhbmllbCAoMTEgSnVuZSAyMDAxKQotIGxpYmN1cmwncyB2ZXJzaW9uLWluZm8gd2FzIHdyb25nLCBhcyBub3RlZCBieSBib3RoIERvbWVuaWNvIEFuZHJlb2xpIGFuZAogIERhdmlkIE9kaW4uCgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIEr2cm4gZml4ZWQgdGhlIGN1cmxfdW5lc2NhcGUgZHVwbGljYXRlIGVudHJ5IGluIGxpYi9saWJjdXJsLmRlZgoKLSBJIG1hZGUgU1NMIGNlcnRpZmljYXRlIGZhaWx1cmUgbWVzc2FnZXMgdG8gYmUgbW9yZSBkZXRhaWxlZC4KClZlcnNpb24gNy44CgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIFNEYXZpbGEgcHJvdmlkZWQgYSByZXN1bWVkIGRvd25sb2FkIGZpeC4KClZlcnNpb24gNy44LXByZTQKCkRhbmllbCAoMSBKdW5lIDIwMDEpCi0gU3RlcmxpbmcgcHJvdmlkZWQgc29tZSBuZXcgUEhQIGV4YW1wbGVzLgoKLSBDaGFuZ2VkIHRoZSBDVlMgaGllcmFyY2h5IGFuZCB0aGUgb2xkZXIgY2hlY2tvdXQgaW5zdHJ1Y3Rpb24gZG9lcyBubyBsb25nZXIKICB3b3JrLiBXZSBtb3ZlZCB0aGUgZW50aXJlIHNvdXJjZSBjb2RlIGludG8gYSBDVlMgbW9kdWxlIG5hbWVkICdjdXJsJy4KCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gQ1VSTE9QVF9NVVRFIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuIEl0IGlzIHN0aWxsIHByZXNlbnQgaW4gdGhlIGluY2x1ZGUgZmlsZQogIHRvIG5vdCBjYXVzZSBjb21waWxlciBlcnJvcnMgZm9yIGFwcGxpY2F0aW9ucyB1c2luZyBpdCwgYnV0IGl0IGlzbid0IHVzZWQKICBhbnl3aGVyZSBpbiB0aGUgbGlicmFyeS4KClZlcnNpb24gNy44LXByZTMKCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gT25jZSBhbmQgZm9yIGFsbCBmaXhlZCB0aGUgX1JFRU5UUkFOVCBtZXNzIGZvciBTb2xhcmlzIGNvbXBpbGVzIHRvIHByZXNlbnQKICBsZXNzIHdhcm5pbmdzLgoKLSBTdGVybGluZyBIdWdoZXMgdGlyZWxlc3NseSBwb2ludHMgb3V0IGFuZCBjb3JyZWN0cyBteSBtaXN0YWtlcy4uLiEgU28sCiAgY3VybF9nbG9iYWxfaW5pdCgpIG5vdyBsZXRzIHRoZSBhcmd1bWVudCBmbGFncyAqU0VUKiB3aGF0IHBhcnRzIHRvCiAgaW5pdC4gQ1VSTF9HTE9CQUxfREVGQVVMVCBtYWtlcyBhIG5pY2UgZGVmYXVsdCwgQ1VSTF9HTE9CQUxfQUxMIGluaXRzIGFsbAogIGtub3duIHN1YnN5c3RlbXMgYW5kIENVUkxfR0xPQkFMX05PTkUgaW5pdHMgbm90aGluZyBtb3JlIHRoYW4gYWJzb2x1dGVseQogIG5lY2Vzc2FyeS4gTWFuIHBhZ2UgdXBkYXRlZCBhY2NvcmRpbmdseS4KCi0gRml4ZWQgdGhlIHN0cnRvay5oIGluY2x1ZGUgZmlsZSBhcyBpdCB3b3VsZG4ndCBjb21waWxlIG9uIGFsbCBwbGF0Zm9ybXMhCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIE1hZGUgbGliY3VybCBieSBkZWZhdWx0IGFjdCBhcyBpZiBDVVJMT1BUX01VVEUgYW5kIENVUkxPUFRfTk9QUk9HUkVTUyB3ZXJlCiAgc2V0IFRSVUUuIFNldCB0aGVtIHRvIEZBTFNFIHRvIG1ha2UgbGliY3VybCBtb3JlIHRhbGthdGl2ZS4gVGhlICpfTVVURQogIG9wdGlvbiBpcyBzdWJqZWN0IGZvciBjb21wbGV0ZSByZW1vdmFsLi4uCgpWZXJzaW9uIDcuOC1wcmUyCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiB3cm90ZSBhIG1ha2VmaWxlIGZvciBidWlsZGluZyBTb2xhcmlzIHBhY2thZ2VzLgoKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBmaXhlcyBmb3IgJ2J1aWxkY29uZicgKHRoZSBidWlsZC1mcm9tLUNWUyB0b29sKSBhbmQKICB3ZSBkaXNjdXNzZWQgYW5kIGFkZGVkIGEgZmV3IENVUkxfR0xPQkFMXyogZmxhZ3MgaW4gaW5jbHVkZS9jdXJsLmgKCi0gS2pldGlsIEphY29ic2VuIHByaXZhdGVseSBhbm5vdW5jZWQgaGlzIHB5dGhvbiBpbnRlcmZhY2UgdG8gbGliY3VybCwKICBhdmFpbGFibGUgYXQgaHR0cDovL3B5Y3VybC5zb3VyY2Vmb3JnZS5uZXQvCgpEYW5pZWwgKDI5IE1heSAyMDAxKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHN0cnRvaygpIHByb2JsZW0gaW4gbGliY3VybC4gSXQgaXMgbm90IGEgdGhyZWFkLQogIHNhZmUgZnVuY3Rpb24uIE5vdyBjb25maWd1cmUgY2hlY2tzIGZvciBhIHRocmVhZC1zYWZlIHZlcnNpb24sIGFuZAogIGxpYi9zdHJ0b2suYyBvZmZlcnMgb25lIGZvciB0aGUgc3lzdGVtcyB0aGF0IGRvbid0IGNvbWUgd2l0aCBvbmUgaW5jbHVkZWQhCgotIE1ldHRndXQgSmFtYWxsYSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdhcyB3cml0dGVuCiAgdG8gc3RkZXJyIGV2ZW4gdGhvdWdoIC0tc3RkZXJyIHJlZGlyZWN0aW9uIHdhcyB1c2VkLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEkgbW92ZWQgb3V0IHRoZSBsaXN0IG9mIGNvbnRyaWJ1dG9ycyBmcm9tIHRoZSBjdXJsLjEgbWFuIHBhZ2UgYW5kIG1hZGUgYQogIHNlcGFyYXRlIGRvY3MvVEhBTktTIGZpbGUuIEl0IG1ha2VzIHRoZSBsaXN0IGVhc2llciB0byBmaW5kLCBhbmQgbWFkZSBpdAogIGVhc2llciBmb3IgbWUgdG8gbWFrZSBhIHNlcGFyYXRlIHdlYiBwYWdlIHdpdGggdGhhdCBzYW1lIGluZm9ybWF0aW9uLgoKICBJIHJlYWxseSBkbyB3YW50IGFsbCB5b3UgZ3V5cyBtZW50aW9uZWQgaW4gdGhlcmUgdG8gZmVlbCB5b3UgZ2V0IHRoZSBjcmVkaXQKICB5b3UgZGVzZXJ2ZS4KCi0gbGliL2Vhc3kuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBpbiB0aGUgNy44LXByZTEgZHVlIHRvIGEgc2lsbHkgbWlzdGFrZQoKVmVyc2lvbiA3LjgtcHJlMQoKRGFuaWVsICgyOCBNYXkgMjAwMSkKLSBjdXJsLWNvbmZpZyBub3cgc3VwcG9ydHMgJy0tdmVybnVtJyB0aGF0IG91dHB1dHMgYSBwbGFpbiBoZXhhZGVjaW1hbCB2ZXJzaW9uCiAgb2YgdGhlIGxpYmN1cmwgdmVyc2lvbiBudW1iZXIgKHVzaW5nIDggYml0cyBmb3IgZWFjaCAzIG51bWJlcnMpLiBWZXJzaW9uCiAgNy43LjQgYXBwZWFycyBhcyAwNzA3MDQKCi0gV3JvdGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dsb2JhbF9pbml0IGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwLi4uCgotIFQuIEJoYXJhdGggYnJvdWdodCBuZXdzIGFib3V0IHRoZSB1c2FnZSBvZiB0aGUgT3BlblNTTCBpbnRlcmZhY2UgdGhhdCB3YXMKICBub3QgcHJldmlvdXNseSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIHRodXMgY2F1c2VkIGxpYmN1cmwgdG8gbGVhawogIG1lbW9yeS4gIFRoZSBvbmx5IHNvbWV3aGF0IHNhbmUgYXBwcm9hY2ggdG8gZml4IHRoaXMgZGlsZW1tYSwgaXMgYWRkaW5nIHR3bwogIHR3byBuZXcgZnVuY3Rpb25zIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgY3VybF9nbG9iYWxfY2xlYW51cCgpIHRoYXQgc2hvdWxkCiAgYmUgY2FsbGVkICpPTkNFKiBieSB0aGUgYXBwbGljYXRpb24gdXNpbmcgbGliY3VybC4gVGhlIGluaXQgc2hvdWxkIGJlIGRvbmUKICBvbmx5IGF0IHN0YXJ0dXAsIG5vIG1hdHRlciBob3cgbWFueSB0aHJlYWRzIHRoZSBhcHBsaWNhdGlvbiBpcyBnb25uYSB1c2UsCiAgYW5kIHRoZSBjbGVhbnVwIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaGFzIGZpbmlzaGVkIHVzaW5nCiAgbGliY3VybCBjb21wbGV0ZWx5LgoKICAqKiogVVBHUkFERSBOT1RJQ0UgKioqCgogIElmIHlvdSB3cml0ZSBhcHBsaWNhdGlvbnMgdXNpbmcgbGliY3VybCwgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgdHdvCiAgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZSAhISEKCiAgSSBjYW4ndCBzYXkgSSB0aGluayB0aGlzIGlzIGEgdmVyeSBiZWF1dGlmdWwgc29sdXRpb24sIGJ1dCBhcyBPcGVuU1NMCiAgaW5zaXN0cyBvbiBtYWtpbmcgbG90cyBvZiBzdHVmZiBvbiBhICJnbG9iYWwiIHNjb3BlLCB3ZSdyZSBmb3JjZWQgdG8gd2FsawogIHRoZSBwYXRoIHRoZXkgcG9pbnQgdXMgdG8uCgotIE1vdmluZyBtb3JlIHRlc3QgY2FzZXMgaW50byB0aGUgbmV3IGZpbGUgZm9ybWF0LgoKVmVyc2lvbiA3LjcuNC1wcmUzCgpEYW5pZWwgKDIzIE1heSAyMDAxKQotIEludHJvZHVjZWQgYSBuZXcgZmlsZSBmb3JtYXQgZm9yIHN0b3JpbmcgdGVzdCBjYXNlcywgYW5kIHRodXMgSSBoYWQgdG8KICBtb2RpZnkgYWxsIHRoZSBwZXJsIHRlc3Qgc2NyaXB0cyBhbmQgbW9yZSAoSSBhZGRlZCBhIG5ldyBvbmUpLiBJIGhhdmUgbm90CiAgInBvcnRlZCIgYWxsIHRoZSBvbGQgdGVzdCBjYXNlcyB0byB0aGUgbmV3IGZvcm1hdCB5ZXQsIGJ1dCBpdCdsbCBjb21lLgoKICBUaGUgbWFpbiBhZHZhbnRhZ2Ugb2YgdGhpcyBuZXcgZm9ybWF0IGlzIHRoYXQgYWxsIHRlc3QgZGF0YSBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBpcyBzdG9yZWQgaW4gYSBzaW5nbGUgZmlsZS4gSXQgZ2l2ZXMgYSBiZXR0ZXIgb3ZlcnZpZXcgZm9yIGVhY2ggdGVzdAogIGNhc2UgYW5kIGEgbG90IGxlc3MgZmlsZXMuCgotIEFuZHLpcyBHYXJj7WEgYnJvdWdodCBhIGZpeCBmb3IgdGhlIG5ldHNjYXBlL21vemlsbGEgY29va2llIGZpbGUgcGFyc2luZwogIGZ1bmN0aW9uLCBhcyBpdCB0dXJucyBvdXQgaXQgZG9lc24ndCBhbHdheXMgc3RvcmUgdGhlIHBhdGghCgpEYW5pZWwgKDIyIE1heSAyMDAxKQotIEFzIHdhcyByZXBvcnRlZCBhbm9ueW1vdXNseSwgd2hlbiBGQUlMT05FUlJPUiB3YXMgdXNlZCwgdGhlIGh0dHBjb2RlIHdhcwogIG5vdCBzdG9yZWQgcHJvcGVybHkgYW5kIHRodXMgd2Fzbid0IHBvc3NpYmx5IHRvIHJlYWQgYWZ0ZXIgYSB0cmFuc2ZlciB3aXRoCiAgdGhlIGN1cmxfZWFzeV9nZXRpbmZvKCkgZnVuY3Rpb24uIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSW5zdGFsbGVkIGFuZCBtYWRlIHVzZSBvZiB0aGUgZm9sbG93aW5nIHRvb2wgdmVyc2lvbnM6CiAgICBhdXRvY29uZiAyLjUwCiAgICBsaWJ0b29sIDEuNAogICAgYXV0b21ha2UgMS40LXAxCgogIEkgd291bGRuJ3QgcmVjb21tZW5kIGFueSBkZXZlbG9wZXIgdG8gdHJ5IHRvIGdlbmVyYXRlIHRoaW5ncyB3aXRoIG9sZGVyCiAgdmVyc2lvbnMgdGhhbiB0aGVzZS4gQnVpbGRpbmcgZnJvbSBDVlMgd2lsbCBwcm9iYWJseSBtb3JlIG9yIGxlc3MgcmVxdWlyZQogIGF0IGxlYXN0IHRoZXNlIHZlcnNpb25zLgoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBncmV3IHRvIG1vcmUgdGhhbiBkb3VibGUgaXRzCiAgcHJldmlvdXMgc2l6ZSEKCiAgQXJrYWRpdXN6IE1pc2tpZXdpY3ogaGVscGVkIG1lIGJ5IHBvaW50aW5nIG91dCBJIGhhZCB0byByZW1vdmUgbXkKICBhY2luY2x1ZGUubTQgZmlsZSBiZWZvcmUgSSBjb3VsZCBnZXQgaXQgd29ya2luZyEKCkRhbmllbCAoMjEgTWF5IDIwMDEpCi0gSSBtYWRlIGZ0cHM6Ly8gd29yay4gQWRkZWQgdGVzdCBjYXNlIDQwMCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLCBhcyB0aGUKICBmaXJzdCBmdHBzOi8vIHRlc3QgY2FzZS4gUmVxdWlyZXMgc3R1bm5lbC4KCi0gQWxzbyBtYWRlIHRoZSB0ZXN0IGNhc2VzIHRoYXQgcnVucyBzc2wgdGVzdHMgbm90IHJ1biBpZiBsaWJjdXJsIGlzbid0IGJ1aWx0CiAgd2l0aCBzc2wgc3VwcG9ydC4KCkRhbmllbCAoMTkgTWF5IDIwMDEpCi0gTWFkZSB0aGUgY29uZmlndXJlIG5vdCBhZGQgYW55IGV4dHJhIC1MIExERkxBR1Mgb3IgLUkgQ1BQRkxBR1MgdW5sZXNzIHRoZXkKICBhcmUgYWN0dWFsbHkgbmVlZGVkLiBBbGJlcnQgQ2hpbidzIGFuZCBEb21lbmljbyBBbmRyZW9saSdzIHN1Z2dlc3Rpb25zCiAgaGVscGVkIG91dC4KClZlcnNpb24gNy43LjQtcHJlMgoKRGFuaWVsICgxOCBNYXkgMjAwMSkKLSBOaWNlciBjb25maWd1cmUtY2hlY2sgZm9yIHRoZSBPcGVuU1NMIGhlYWRlcnMsIHdoaWNoIHRoZW4gc2V0cyB0aGUgcHJvcGVyCiAgdmFyaWFibGUgdG8gaGF2ZSBjdXJsLWNvbmZpZyBiZSBnb29kLiAoQWxiZXJ0IENoaW4gcHJvdmlkZWQgdGhlIGZpeCkKCi0gRm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoZWl3IG93biAnc3RybGNhdCgpJyBsaWJjdXJsIHByb3ZpZGVzIGl0cyBvd24uCiAgSXQgd2FzIG5vdyByZW5hbWVkIHRvIHByZXZlbnQgY29sbGlkZXMgd2l0aCBvdGhlciBsaWJzLiAoQWZ0ZXIgZGlzY3Vzc2lvbnMKICB3aXRoIFN0ZXJsaW5nIEh1Z2hlcyBhbmQgdGhlIGltcGxpY2F0aW9ucyB0aGlzIGhhZCBvbiBQSFAgYnVpbGRzLikKCkRhbmllbCAoMTcgTWF5IDIwMDEpCi0gQ29sbSBCdWNrbGV5IHBvc3RlZCBhIGRldGFpbGVkIGJ1ZyByZXBvcnQgb24gKHRoZSBkZWJpYW5pemVkKSA3LjcuMywgdGhhdAogIHR1cm5lZCBvdXQgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIGRlYmlhbi1idWlsdCA3LjcuMy1wYWNrYWdlIHRoYXQKICBjb250YWluZWQgZmlsZXMgZnJvbSB0aGUgNy43LjIgcmVsZWFzZSEKCi0gSSBhZGRlZCB0aGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBhZ2FpbiwgYnV0IHdpdGggYSBmYWtlIHZhbHVlLCBqdXN0IHRvCiAgbWFrZSBwcm9ncmFtcyB0aGF0IHVzZSBpdCwgbm90IGZhaWwgd2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGlzIHZlcnNpb24gb2YKICBsaWJjdXJsLgoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBQYXdlbCBBLiBHYWpkYSBmaXhlZCBhIHByb2JsZW0gd2l0aCByZXN1bWVkIHRyYW5zZmVycyBvbiByZS11c2VkIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucy4KClZlcnNpb24gNy43LjQtcHJlMQoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZml4ZWQgRlRQIFBPUlQgZm9yIElQdjYtZW5hYmxlZCBsaWJjdXJsLgoKLSBBZGRlZCB0aGUgZmlyc3QgSFRUUFMgdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxMiBNYXkgMjAwMSkKLSBKdWtrYSBQaWhsIHN1Z2dlc3RlZCB0aGF0IGlmIChsaWIpY3VybCBpcyB0b2xkIHRvIHZlcmlmeSB0aGUgcGVlcidzCiAgY2VydGlmaWNhdGUgYW5kIHRoZSBwZWVyIGNhbid0IGJlIHZlcmlmaWVkLCBpdCBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIGEKICBwcm9wZXIgZXJyb3IgY29kZS4gSSBhZGRlZCBhIGJyYW5kIG5ldyBlcnJvciBjb2RlIG5hbWVkCiAgQ1VSTEVfU1NMX1BFRVJfQ0VSVElGSUNBVEUgZm9yIHRoaXMgcHVycG9zZS4KCkRhbmllbCAoMTEgTWF5IDIwMDEpCi0gQXMgd2FzIGRpc2N1c3NlZCB3aXRoIEZyZWRlcmljIExlcGllZCBhIHdoaWxlIGFnbywgSSBub3cgbWFkZSBsaWJjdXJsIG5vdAogIHJldHVybiBlcnJvciBldmVuIHRob3VnaCBubyBkYXRhIHdhcyB0cmFuc2ZlcmVkIG9uIHVwbG9hZC9kb3dubG9hZCByZXN1bWUKICB3aGVuIHRoZSBubyB0cmFuc2ZlciBpcyBuZWVkZWQuIFRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGVycm9yIHdhcyByZW1vdmVkCiAgZnJvbSB0aGUgaGVhZGVyIGZpbGUgdG8gbWFrZSBhbnkgaW1wbGVtZW5hdG9yIHRoYXQgdXNlcyB0aGF0IHRvIGJlIGF3YXJlIG9mCiAgdGhlIGZhY3QgdGhhdCBpdCBjYW4ndCBiZSByZXR1cm5lZCBhbnltb3JlIQoKLSBJbXByb3ZlZCBnZW5lcmFsIGhlYWRlci1wYXJzaW5nIHRvIGJldHRlciBhbGxvdyB3aGl0ZSBzcGFjZXMgYW5kIG1vcmUuCgotIFJvZG5leSBTaW1tb25zIHByb3ZlZCB0aGUgZml4IEkgZGlkIHllc3RlcmRheSB3YXMgYmFkIGFuZCBJIGhhZCB0byBwb3N0CiAgYW5vdGhlciBvbmUuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSB0d28gcmVkaXJlY3QgcHJvYmxlbXMgbW9yZSEKICAKRGFuaWVsICgxMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgY29ycmVjdGx5IG5vdGVkIHRoYXQgdGhlIHNwYWNlLWFmdGVyLWhlYWRlciBwcm9ibGVtIHdpdGgKICBMb2NhdGlvbjogaXMgcHJlc2VudCBvbiBzZXZlcmFsIG90aGVyIHBsYWNlcyBpbiB0aGUgbGliY3VybCBzb3VyY2VzLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogIGhlYWRlcnMgd2l0aCBhbiBleHRyYSBzcGFjZSBhZnRlciB0aGUgY29sb24uCgotIFJvZG5leSBTaW1tb25zIGZvdW5kIG91dCB0aGF0IG11bHRpcGxlIEZUUCB0cmFuc2ZlcnMgZGlkIG5vdCB0cmVhdCByZWxhdGl2ZQogIGRpcmVjdG9yaWVzIGNvcnJlY3RseS4KCkRhbmllbCAoOSBNYXkgMjAwMSkKLSBHZXR0aW5nIGFuIEZUUCBmaWxlIHdpdGggQ1VSTE9QVF9OT0JPRFkgc2V0IChvciAtSSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLAogIG1ha2VzIGN1cmwgdXNlIHRoZSBub24tc3RhbmRhcmQgZnRwIGNvbW1hbmQgIlNJWkUiLiBJZiBpdCBmYWlsZWQsIGxpYmN1cmwKICByZXR1cm5lZCBlcnJvci4gU3RhcnRpbmcgbm93LCBpdCBqdXN0IGRvbid0IG91dHB1dCB0aGUgZmlsZSBzaXplIGluc3RlYWQuCiAgQW5vbnltb3VzIGJ1ZyByZXBvcnQuCgotIHN0dW5uZWwucG0gd2FzIGFjY2lkZW50YWxseSBsZWZ0IG91dCBmcm9tIHRoZSByZWxlYXNlIGFyY2hpdmUsIGl0IGlzIG5vdwogIGFkZGVkIChzdHVubmVsIGlzIG5lZWRlZCB0byBydW4gdGhlIGh0dHBzLXRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlKQogIApEYW5pZWwgKDcgTWF5IDIwMDEpCi0gQ29ycmVjdGVkIHR3byBtaW5vciBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGhlIEZJTEUgKiB0byB2b2lkICogY29udmVyc2lvbgogIHRoYXQgSSBtaXNzZWQgYXQgdHdvIHBsYWNlcy4gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHBhdGNoZXMuIFNhbmRlciBHYXRlcwogIGZpbGVkIGEgYnVnIHJlcG9ydCBvbiB0aGlzLgoKVmVyc2lvbiA3LjcuMwoKRGFuaWVsICg0IE1heSAyMDAxKQotIEFsbCBjYWxsYmFjayBmdW5jdGlvbnMgbm93IHRha2UgJ3ZvaWQgKicgaW5zdGVhZCBvZiAnRklMRSAqJy4gVGhpcyBpcyBtYWRlCiAgdGhpcyB3YXkgdG8gbWFrZSBpdCBtb3JlIG9idmlvdXMgdG8gcGVvcGxlIHRoYXQgYW55dGhpbmcgY2FuIGJlIHBhc3NlZCB0bwogIHRoZW0gKGJ5IHVzaW5nIHRoZSBhcHJvcHJpYXRlIG9wdGlvbikuIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggU3RlcmxpbmcKICBIdWdoZXMuCgpEYW5pZWwgKDMgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBwcm9ibGVtIHdpdGggcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gdGhhdCBtYWRlIGxpYmN1cmwgZmFpbCBpZiB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHVzZWQgbWl4ZWQKICBjaHVua2VkIGFuZCBub24tY2h1bmtlZCB0cmFuc2ZlcnMuCgotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGJhZCB0cmVhdG1lbnQgb2YgMzA0LXJlcGxpZXMsIGFzIHRoZXkgd291bGQgbm90IGJlCiAgdHJlYXRlZCBhcyBjb250ZW50LWxlbmd0aCAwIHJlcGxpZXMgYnV0IHdvdWxkIGNhdXNlIGEgImhhbmciIHVudGlsIHRoZQogIHNlcnZlciB0aW1lZC1vdXQgYW5kIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgZG9jcy9leGFtcGxlcy9NYWtlZmlsZS5hbQoKRGFuaWVsICgyNyBBcHJpbCAyMDAxKQotIFVwZGF0ZWQgdGhlIElOVEVSQUxTIGRvY3VtZW50IGFnYWluLiBJdCB3YXMgbGFnZ2luZyBhIGJpdC4gSSB0aGluayBJIG1hZGUgaXQKICBtb3JlIGVhc3kgdG8gZm9sbG93IG5vdyBhcyB3ZWxsLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuIGN1cmwgcmVjZWl2ZWQKICBhICJDb250ZW50LUxlbmd0aDogMCIgaGVhZGVyLgoKLSBHaXVzZXBwZSBEJ0FtYnJvc2lvIHdhcyBmaXJzdCBvdXQgdG8gcmVwb3J0IHRoYXQgVEVMTkVUIGRvZXNuJ3Qgd29yayBpbiBjdXJsCiAgY29tcGlsZWQvYnVpbHQgb24gd2luMzIuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIHVuaXhlcyB0aG91Z2ghCgotIERhdmUgSGFtaWx0b24gcmVwb3J0ZWQgd2VpcmQgcHJvYmxlbXMgd2l0aCBDVVJML1BIUCB0aGF0IEkgcmVhbGx5IGNhbid0CiAgZXhwbGFpbiBhdCB0aGUgbW9tZW50LiBJJ20gaG9waW5nIG9uIHNvbWUgaGVscCBmcm9tIHRoZSBQSFAgY3Jldy4KCkRhbmllbCAoMjYgQXByaWwgMjAwMSkKLSBJIHJld3JvdGUgdGhlIEZUUCBjb21tYW5kIHJlc3BvbnNlIGZ1bmN0aW9uLiBJIGhhZCB0byBkbyBpdCB0byBtYWtlIGZ0cHMKICB3b3JrLCBhcyB0aGUgT3BlblNTTCByZWFkKCktZnVuY3Rpb24gZGlkbid0IHdvcmsgdGhlIHNhbWUgd2F5IHRoZSBub3JtYWwKICB1bml4IHJlYWQoKSBkb2VzLCBidXQgaXQgd2FzIGFsc28gYSBodWdlIHBlcmZvcm1hbmNlIGJvb3N0LiBQcmV2aW91c2x5IHRoZQogIGZ1bmN0aW9uIHJlYWQgb25lIGJ5dGUgYXQgYSB0aW1lLCBub3cgaXQgcmVhZHMgdmVyeSBsYXJnZSBjaHVua3MsIGFuZCBpdAogIG1ha2VzIGEgbm90YWJsZSBzcGVlZCBkaWZmZXJlbmNlLgoKRGFuaWVsICgyNSBBcHJpbCAyMDAxKQotIENvbm5lY3Rpb24gcmUtdXNlIHdoZW4gbm90IHVzaW5nIGEgcHJveHkgZGlkbid0IHdvcmsgcHJvcGVybHkgZm9yCiAgbm9uLWRlZmF1bHQgcG9ydCBudW1iZXJzLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAxKQotIEkndmUgbm90aWNlZCB0aGF0IEZUUFMgZG9lc24ndCB3b3JrLiBXZSBhdHRlbXB0IHRvIHVzZSBzc2wgZXZlbiBmb3IgdGhlCiAgZGF0YSB0cmFuc2Zlciwgd2hpY2ggY2F1c2VzIHRoZSB0cmFuc2ZlciB0byAnaGFuZycuLi4gV2UgbmVlZCB0byBmaXggdGhpcy4KCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gdXNlICdzdHVubmVsJyB0byBkbyBIVFRQUyBhbmQgRlRQUyB0ZXN0aW5nIG9uCiAgdGhlIGFscmVkeSB3cml0dGVuIHBlcmwgc2VydmVycyBlYXNpbHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDEpCi0gVGhlIE9wZW5TU0wgdmVyc2lvbiBzdHJpbmcgcmVjZW50bHkgbW9kaWZpZWQgZGlkbid0IHplcm8gdGVybWluYXRlIG9uZQogIG9mIHRoZSBnZW5lcmF0ZWQgc3RyaW5ncyBwcm9wZXJseSwgd2hpY2ggY291bGQgbGVhZCB0byBhIGNyYXNoIG9yIHNpbXBseQogIHdlaXJkIHZlcnNpb24gc3RyaW5nIG91dHB1dCEKClZlcnNpb24gNy43LjIKCkRhbmllbCAoMjIgQXByaWwgMjAwMSkKLSBSb3NpbWlsZG8gZGEgU2lsdmEgdXBkYXRlZCB0aGUgTWFrZWZpbGVzIGZvciBCb3JsYW5kL1dpbmRvd3MuCgotIEVyaWMgUmF1dG1hbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHRoYXQgd291bGQKICBsZWFkIHRvIGJyb2tlbiBIb3N0OiBoZWFkZXJzIGluIHRoZSBzZWNvbmQgSFRUUCByZXF1ZXN0LgoKRGFuaWVsICgyMCBBcHJpbCAyMDAxKQotIEFkZGVkIG1hbiBwYWdlcyBmb3IgdGhlIGN1cmxfc3RyZXF1YWwoKSBhbmQgY3VybF9tcHJpbnRmKCkgZmFtaWxpZXMuIFdyb3RlCiAgYSAnbGliY3VybCBvdmVydmlldycgbWFuIHBhZ2UuCgotIFNwZWxsLWZpeGVkIHNvbWUgZG9jdW1lbnRzLgoKLSBTLiBNb29uZXNhbXkgY29ycmVjdGVkIG1pc3Rha2VzIGluIHRoZSBtYW4gcGFnZS4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBjdXJsX3NsaXN0cyBvcHRpb25zIGluIHRoZSBwZXJsIGludGVyZmFjZSwgcHJlc2VudAogIHNlcGFyYXRlbHkgaW4gdGhlIEN1cmw6OmVhc3kgMS4xLjQgcGFja2FnZS4KCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHJlbW92ZWQgdGhlIGRlY2ltYWxzIGZyb20gdGhlIHNpemUgdmFyaWFibGVzIGluIHRoZQogIC0td3JpdGUtb3V0IG91dHB1dC4gV2UgaGFyZGx5IGV2ZXIgZ2V0IGZyYWN0aW9uIG9mIGJ5dGVzISA6LSkKClZlcnNpb24gNy43LjItcHJlMQoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBwYXRjaCBmb3IgdGhlIEFDX1NZU19MQVJHRUZJTEUgbWFjcm8uCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDEpCi0gSW5wdXQgZnJvbSBNaWNoYWVsIE1lYWxsaW5nIG1hZGUgbWUgYWRkIC0tZmVhdHVyZSB0byBjdXJsLWNvbmZpZy4gSXQKICBkaXNwbGF5cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gYnVpbHQtaW4gaW4gdGhlIGN1cnJlbnQKICBsaWJjdXJsLiBUaGUgY3VycmVudGx5IGF2YWlsYWJsZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBsaXN0ZWQgYXJlOiBTU0wsIEtSQjQKICBhbmQgSVB2Ni4KCi0gSSBjb21taXR0ZWQgQ3JpcyBhbmQgR2VvcmcncyBwZXJsIGludGVyZmFjZSB3b3JrLiBUaGV5J3ZlIGdvdCBjYWxsYmFja3MKICB3b3JraW5nIGFuZCBvcHRpb25zIHRoYXQgcmVjZWl2ZXMgdGhvc2Ugc2xpc3QgcG9pbnRlcnMuCgotIFB1bmVldCBQYXdhaWEgZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCBkb3dubG9hZHMgdGhhdCB1c2UgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zIGFuZCBJIG1hZGUgYSByYXRoZXIgbGFyZ2Ugd3JpdGV1cCB0byBjb3JyZWN0IHRoaXMuIEl0IGlzCiAgaW1wb3J0YW50IHRoYXQgYWxsIHNlc3Npb24tZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCBhbmQgbm90CiAgaW4gdGhlIG1haW4gc3RydWN0IGFzIHRoaXMgcHJldmlvdXNseSBkaWQuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDEpCi0gRnJlZGVyaWMgTGVwaWVkIGZpeGVkIGEgZnRwIHJlc3VtZWQgZG93bmxvYWQgcHJvYmxlbSBhbmQgaW50cm9kdWNlZCBhIG5ldwogIGVycm9yIGNvZGUgdGhhdCBsZXRzIGFwcGxpY2F0aW9ucyBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGEgcmVzdW1lZCBkb3dubG9hZAogIGFjdHVhbGx5IGRpZG4ndCBkb3dubG9hZCBhbnl0aGluZyBzaW5jZSB0aGUgd2hvbGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQuCiAgU2hvdWxkIHRoaXMgcmV0dXJuIE9LIGluc3RlYWQ/CgotIEkgYWRkZWQgJ2N1cmwtY29uZmlnLmluJyB0byB0aGUgcm9vdCBkaXIgYW5kIGNvbmZpZ3VyZSBzY3JpcHQuIE5vdywgYQogIGN1cmwtY29uZmlnIHNjcmlwdCBpcyBtYWRlIHdoZW4gY3VybCBpcyBidWlsdC4gVGhlIHNjcmlwdCBjYW4gYmUgdXNlZCB0bwogIGZpZ3VyZSBvdXQgY29tcGlsZSB0aW1lIG9wdGlvbnMgdXNlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LCB3aGljaCBpbiB0dXJuCiAgc2hvdWxkIGJlIG9wdGlvbnMgWU9VIHNob3VsZCB1c2UgdG8gYnVpbGQgYXBwbGljYXRpb25zIHRoYXQgdXNlIGxpYmN1cmwuCgogIFRoaXMgKi1jb25maWcgc3R5bGUgaXMgbm90IGEgbmV3IGlkZWEsIGJ1dCBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiB1c2VkCiAgc3VjY2Vzc2Z1bGx5IGluIG90aGVyIChsaWJyYXJ5IGJhc2VkKSBwcm9qZWN0cy4KCi0gUGhpbCBLYXJuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3cm9uZ2x5IGRpZCBub3QgYWx3YXlzIHVzZSBHTVQgdGltZSB6b25lCiAgZm9yIHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBzdHlsZSBoZWFkZXJzLgoKLSBHZW9yZyBTY2h3YXJ6IHBvaW50ZWQgb3V0IGFuIGV4dHJhIG5lZWRlZCAjaW5jbHVkZSBmaWxlIG5lZWRlZCBpbiBzcmMvbWFpbi5jCiAgZm9yIGN1cmwgdG8gYnVpbGQgb24gVWx0cml4LgoKRGFuaWVsICgxMSBBcHJpbCAyMDAxKQotIENyaXMgQmFpbGlmZiBwb2ludGVkIG91dCB0d28gcHJvYmxlbXMgdGhhdCBJIGNvcnJlY3RlZC4gRmlyc3QsIGxpYmN1cmwncyB1c2UKICBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSFRUUF9QUk9YWSBpbiB1cHBlcmNhc2UgbWF5IGJlY29tZSBhIHNlY3VyaXR5CiAgaGF6YXJkIHdoZW4gcGVvcGxlIHVzZSBsaWJjdXJsIGluIGEgc2VydmVyL2NnaSBzaXR1YXRpb24gd2hlcmUgdGhlIHNlcnZlcgogIHNldHMgdGhlIEhUVFBfKi12YXJpYWJsZXMgYWNjb3JkaW5nIHRvIGluY29taW5nIGhlYWRlcnMgaW4gdGhlIEhUVFAKICByZXF1ZXN0LiBUaHVzLCBhICJQcm94eToiLWhlYWRlciB3b3VsZCBzZXQgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCiAgVGhlbiwgaW52b2tpbmcgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRob3V0IGhhdmluZyBhbiBVUkwgc2V0IGNhdXNlZCBhIGNyYXNoLgoKLSBTLiBNb29uZXNhbXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBjdXJsIHVzZSBub24tYmxvY2tpbmcgY29ubmVjdHMgb24KICB3aW5kb3dzIHdoZW4gY29ubmVjdGlvbiB0aW1lb3V0IGlzIHNldCwgYXMgaXQgYWxsb3dzIHdpbmRvd3MgdXNlcnMgdG8gc2V0CiAgdGhhdCB0aW1lb3V0IQoKLSBIaXJvdGFrYSBNYXRzdXl1a2kgd3JvdGUgYSBSdWJ5IGludGVyZmFjZSB0byBsaWJjdXJsIQoKLSBDcmlzIEJhaWxpZmYsIEZvcnJlc3QgQ2Fob29uIGFuZCBHZW9yZyBIb3JuIHdvcmsgb24gdGhlIFBlcmwgaW50ZXJmYWNlLgoKLSBJJ3ZlIHdyaXR0ZW4gYSBmaXJzdCBzaG90IGF0IGEgSmF2YSBpbnRlcmZhY2UgdG8gbGliY3VybC4gTWFueSB0aGFua3MgdG8KICBEYW5pZWwgTWFyZWxsIGZvciB0aXJlbGVzc2x5IGFuc3dlcmluZyB0byBhbGwgbXkgYmFzaWMgSmF2YSBxdWVzdGlvbnMuIEl0CiAgd29ya3MsIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IGJhc2ljLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAxKQotIFRoZSBwcm9ncmVzcyBkaXNwbGF5IGNvdWxkIGdldCBzaWxseSB3aGVuIGRvaW5nIG11bHRpcGxlIGZpbGUgdHJhbnNmZXJzLCBhcwogIGl0IHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHRyYW5zZmVycyEKCi0gRGlzY3Vzc2lvbnMgd2l0aCBDcmlzIEJhaWxpZmYgd2hvIHdyaXRlcyBhIFBlcmwgaW50ZXJmYWNlIHRvIGxpYmN1cmwsIG1hZGUKICBtZSBhZGQgQ1VSTE9QVF9IRUFERVJGVU5DVElPTi4gSXQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgc2VwYXJhdGUgY2FsbGJhY2sKICBmdW5jdGlvbiBmb3Igd3JpdGluZyBoZWFkZXJzLiBQcmV2aW91c2x5IHlvdSBjb3VsZCBvbmx5IHNldCBhIGRpZmZlcmVudCBGSUxFCiAgKiB3aGVuIGhlYWRlcnMgYXJlIHdyaXR0ZW4gZnJvbSB3aXRoaW4gbGliY3VybC4KCkRhbmllbCAoNyBBcHJpbCAyMDAxKQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIGN1cmxfZXNjYXBlKCkgYW5kIHBvaW50ZWQgb3V0IGEgZmxhdyBpbgogIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlLgoKRGFuaWVsICg2IEFwcmlsIDIwMDEpCi0gQWRqdXN0ZWQgdGhlIHZlcnNpb24gY29kZSB0byBwcm9wZXJseSBkaXNwbGF5IE9wZW5TU0wgMC45LjZhLiBUaGV5IHN1cmUKICBjaGFuZ2UgdGhlaXIgdmVyc2lvbiBkZWZpbmUgZm9ybWF0IG9mdGVuLi4uCgotIGN1cmxfZm9ybWZyZWUoKSBub3cgYWNjZXB0cyBhIE5VTEwgcG9pbnRlciB3aXRob3V0IGNyYXNoaW5nIQoKVmVyc2lvbiA3LjcuMQoKRGFuaWVsICgzIEFwcmlsIDIwMDEpCi0gUHVuZWV0IFBhd2FpYSBwb2ludGVkIG91dCB0d28gc2VyaW91cyBwcm9ibGVtcy4gTGliY3VybCB3b3VsZCBhdHRlbXB0IHRvCiAgcmVhZCBiYWQgbWVtb3J5IGR1cmluZyBzaXR1YXRpb25zIHdoZW4gYW4gKGZ0cCkgY29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZC4KICBBbHNvLCB0aGUgbGliL01ha2VmaWxlLnZjNiB3YXMgY29ycmVjdGVkLgoKLSBNb3JlIGludmVzdGlnYXRpb25zIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgbWFkZSBtZSByZWFsaXplIHRoYXQKICBpdCB3YXMgbm90IGNsZWFuIGVub3VnaCB0byB3b3JrIHRyYW5zcGFyYW50bHkgd2l0aCBwZXJzaXN0ZW50IGFuZCBub24tCiAgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gSSB0aGluayBJJ3ZlIGZpeGVkIGl0IG5vdy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwMSkKLSBHZW9yZyBIb3JuIG1haWxlZCBtZSBzb21lIGNvcnJlY3Rpb25zIGZvciB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZS4KCi0gRXhwZXJpbWVudGFsIGZ0cHM6Ly8gc3VwcG9ydCBhZGRlZC4gSXQgaXMgYmFzaWNhbGx5IEZUUCBvdmVyIFNTTCBmb3IgdGhlCiAgY29udHJvbCBjb25uZWN0aW9uLiBJdCBzdGlsbCBtYWtlcyBhbGwgZGF0YSB0cmFuc2ZlcnMgZ29pbmcgb3ZlciB1bmVuY3J5cHRlZAogIGNvbm5lY3Rpb25zLiBSYWluZXIgV2Vpa3VzYXQncyBmdHBkLXNzbCBzZXJ2ZXIgaGFjayBzdXBwb3J0cyB0aGlzIGFuZCBJIHVzZWQKICB0aGF0IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IHNldCBhIENVUkxPUFRfVElNRU9VVCBhbmQgdGhlbiB0cmllZAogIHRvIGdldCBhIGZpbGUgZnJvbSBhIHNpdGUgYW5kIGl0IGZhaWxzLCB0aGUgU0lHQUxSTSB3b3VsZCBzdGlsbCBiZSBzZW50CiAgYWZ0ZXIgdGhlIHRpbWVvdXQtdGltZSwgcXVpdGUgaW5leHBlY3RlZGx5IQoKLSBJIGFkZGVkIGFuIGZ0cCB0cmFuc2ZlciBleGFtcGxlIHRvIGRvY3MvZXhhbXBsZXMvIGFuZCBJIGFsc28gd3JvdGUgYSB0aW55CiAgZXhhbXBsZSBtYWtlZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnQgd2hlbiBidWlsZGluZyBvbmUgb2YgdGhlCiAgZXhhbXBsZXMuCgpWZXJzaW9uIDcuNy4xLWJldGExCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDEpCi0gTW9oYW1lZCBMcmhhemkgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCA3LjYuMSBhbmQgcGVyc2lzdGVudCBIVFRQLzEuMAogIGNvbm5lY3Rpb25zICh3aGVuIHRoZSBzZXJ2ZXIgcmVwbGllZCBhIENvbm5lY3Rpb246IEtlZXAtQWxpdmUpIGFuZCB0aGlzCiAgcHJvYmxlbSB3YXMgbm90IHByb3Blcmx5IGRlYWx0IHdpdGggaW4gNy43IGVpdGhlci4gQSBwYXRjaCB3YXMgcG9zdGVkIHRvIHRoZQogIGN1cmwtYW5kLXBocCBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDEpCi0gQ29saW4gV2F0c29uIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSBhbmQgYnJvdWdodCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0LAogIHdoaWNoIHdhcyBhYm91dCB0aGUgbWFuIHBhZ2UgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgcXVvdGUgKCcpIGluIGEKICB3YXkgdGhhdCBnbnJvZmYgZG9lc24ndCBsaWtlLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAxKQotIFBldGVyIEJyYXkgcmVwb3J0ZWQgY29ycmVjdGx5IHRoYXQgdGhlIHJvb3QgbWFrZWZpbGUgdXNlZCBtYWtlIGluc3RlYWQgb2YKICAkKE1BS0UpIGZvciB0aGUgdGVzdCB0YXJnZXQuCgotIENvcnJlY3RlZCB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZSB0byB1c2UgY3VybF9lYXN5X3NldG9wdCgpIGFuZCBub3QKICBjdXJsX3NldG9wdCgpIHdoaWNoIHdhcyByZW1vdmVkIGluIDcuNyEKCi0gUy4gTW9vbmVzYW15IHByb3ZpZGVkIHVwZGF0ZXMgb24gdGhyZWUgZG9jdW1lbnRzIChNQU5VQUwsIElOU1RBTEwgYW5kIEZBUSkuCgotIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246LCBsaWJjdXJsIHdvdWxkIHNvbWV0aW1lcyB3cml0ZSB0byB0aGUgVVJMIHN0cmluZwogIGluIGEgd2F5IGl0IHNob3VsZG4ndC4gQXMgdGhlIHBvaW50ZXIgaXMgcGFzc2VkLWluIHRvIGxpYmN1cmwgZnJvbSBhbgogIGFwcGxpY2F0aW9uLCB3ZSBjYW4ndCBiZSBhbGxvd2VkIHRvIHdyaXRlIHRvIGl0LiBUaGUgcGFydGljdWxhciBidWcgcmVwb3J0CiAgZnJvbSAnbmsnIHRoYXQgYnJvdWdodCB0aGlzIHVwIHdhcyBiZWNhdXNlIGhlIGhhZCBhIHJlYWQtb25seSBVUkwgdGhhdCB0aGVuCiAgY2F1c2VkIGEgbGliY3VybCBjcmFzaCEKCi0gTm8gbG9uZ2VyIHJlYWRzIEhFQUQgcmVzcG9uc2VzIGxvbmdlciB0aGFuIHRvIHRoZSBsYXN0IGhlYWRlci4gUHJldmlvdXNseSwKICBjdXJsIHdvdWxkIHJlYWQgdGhlIGZ1bGwgcmVwbHkgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGEgImNsb3NlIiBvbmUuCgotIGxpYmN1cmwgZGlkIHJlLXVzZSBjb25uZWN0aW9ucyB3YXkgdG9vIG11Y2guIERvaW5nICJjdXJsCiAgaHR0cDovL3d3dy57bWljcm9zb2Z0LGlibX0uY29tIiB3b3VsZCBtYWtlIGl0IHJlLXVzZSB0aGUgY29ubmVjdGlvbiB3aGljaAogIG1hZGUgdGhlIHNlY29uZCByZXF1ZXN0IHJldHVybiB2ZXJ5IG9kZCByZXN1bHRzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIEVkaW4gS2FkcmliYXNpYyBtYWRlIG1lIGF3YXJlIHRoYXQgY3VybCBzaG91bGQgbm90IHJlLXNlbmQgUE9TVCByZXF1ZXN0cwogIHdoZW4gZm9sbG93aW5nIDMwMi1yZWRpcmVjdHMuIEkgbWFkZSAzMDIgd29yayBsaWtlIDMwMyB3aGljaCBtZWFucyBjdXJsIHVzZXMKICBHRVQgaW4gdGhlIGZvbGxvd2luZyByZXF1ZXN0KHMpLgoKLSBsaWJjdXJsIG5vdyByZXNldCB0aGUgImZvbGxvd2VkLWxvY2F0aW9uIiBjb3VudGVyIG9uIGVhY2ggaW52b2tlIG9mCiAgY3VybF9lYXN5X3BlcmZvcm0oKSBhcyBpdCBvdGhlcndpc2Ugd291bGQgc3VtIHVwIGFsbCByZWRpcmVjdHMgb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCB0aHVzIGNvdWxkIHJlYWNoIHRoZSBtYXhyZWRpcnMgY291bnRlciB3cm9uZ2x5LgoKLSBKaW0gRHJhc2ggc3VnZ2VzdGVkIGN1cmxfZXNjYXBlKCkgc2hvdWxkIG5vdCByZS1lbmNvZGUgd2hhdCBhbHJlYWR5IGxvb2tzCiAgbGlrZSBhbiBlbmNvZGVkIHNlcXVlbmNlIGFuZCBJIHRoaW5rIHRoYXQncyBhIGZhaXIgc3VnZ2VzdGlvbi4KClZlcnNpb24gNy43CgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGZhaWxzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBnZXRob3N0YnluYW1lX3IoKSBpcwogIGRldGVjdGVkIGJ1dCBpdCBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byBpbnZva2UgaXQgKHdoYXQgYW1vdW50IG9mCiAgYXJndW1lbnRzIGl0IGlzIHN1cHBvc2VkIHRvIGdldCkuIFJlcG9ydHMgZnJvbSBBbmRy6XMgR2FyY+1hIG1hZGUgbWUgYXdhcmUKICBvZiB0aGlzIG5lZWQuCgotIFRhbGtpbmcgd2l0aCBKaW0gRHJhc2ggbWFkZSBtZSBmaW5hbGx5IHB1dCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5lc2NhcGUKICBmdW5jdGlvbnMgaW4gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgYW5kIHdyaXRlIG1hbiBwYWdlcyBmb3IgdGhlbS4gVGhlCiAgZXNjYXBlIGZ1bmN0aW9uIHdhcyBtb2RpZmllZCB0byB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSB1bmVzY2FwZSBvbmUKICBoYWQuCgotIE5vIGJ1ZyByZXBvcnRzIGF0IGFsbCBvbiB0aGUgbGF0ZXN0IGJldGFzLiBSZWxlYXNlIHRpbWUgY29taW5nIHVwLgoKVmVyc2lvbiA3LjctYmV0YTUKCkRhbmllbCAoMTkgTWFyY2ggMjAwMSkKLSBHZW9yZyBPdHRpbmdlciByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHVzaW5nIC1DIHRvZ2V0aGVyIHdpdGggLUwgaW4gdGhlIHNlbnNlCiAgdGhhdCB0aGUgLUMgaW5mbyBnb3QgbG9zdCB3aGVuIGl0IHdhcyByZWRpcmVjdGVkLiBJIGNvdWxkIG5vdCByZXBlYXQgdGhpcwogIHByb2JsZW0gb24gdGhlIDcuNyBicmFuY2ggd2h5IEkgbGVhdmUgdGhpcyBmb3IgdGhlIG1vbWVudC4gVGVzdCBjYXNlIDM5IHdhcwogIGFkZGVkIHRvIGRvIGV4YWN0bHkgdGhpcywgYW5kIGl0IHNlZW1zIHRvIGRvIHJpZ2h0LgoKLSBDaHJpc3RpYW4gUm9ib3R0b20gUmVpcyByZXBvcnRlZCBob3cgaGlzIDcuNyBiZXRhIGRpZG4ndCBzdWNjZXNzZnVsbHkgZG8KICBmb3JtIHBvc3RzIGFzIGVsZWdhbnRseSBhcyA3LjYuMSBkaWQuIEluZGVlZCwgdGhpcyB3YXMgYSBmbGF3IGluIHRoZSBoZWFkZXIKICBlbmdpbmUsIGFzIEhUVFAgMS4xIGhhcyBpbnRyb2R1Y2VkIGEgbmV3IDEwMCAidHJhbnNpZW50IiByZXR1cm4gY29kZSBmb3IgUFVUCiAgYW5kIFBPU1Qgb3BlcmF0aW9ucyB0aGF0IEkgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IuIFNlY3Rpb24gOC4yLjMgaW4gUkZDMjYxNgogIGhhcyBhbGwgdGhlIGRldGFpbHMuIFNlZW1zIHRvIHdvcmsgbm93IQoKRGFuaWVsICgxNiBNYXJjaCAyMDAxKQotIEFmdGVyIGhhdmluZyBleHBlcmllbmNlZCBhbm90aGVyIG1hY2hpbmUgYnJlYWstZG93biwgd2UncmUgYmFjay4KCi0gR2VvcmcgSG9ybidzIHBlcmwgaW50ZXJmYWNlIEN1cmw6OmVhc3kgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBjdXJsIHJlbGVhc2UKICBhcmNoaXZlLiBUaGUgcGVybC8gZGlyZWN0b3J5IGlzIG5vdyBwcmVzZW50LiBQbGVhc2UgaGVscCBtZSB3aXRoIGRvY3MsCiAgZXhhbXBsZXMgYW5kIHVwZGF0ZXMgeW91IHRoaW5rIGZpdC4KCi0gTWFkZSBhIG5ldyBwaHAvIGRpcmVjdG9yeSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlIGFuZCBtb3ZlZCB0aGUgUEhQIGV4YW1wbGVzCiAgaW50byBhIHN1YmRpcmVjdG9yeSBpbiB0aGVyZS4gTm90IG11Y2ggUEhQIGluZm8geWV0LCBidXQgSSBwbGFuIHRvLiBQbGVhc2UKICBoZWxwIG1lIGhlcmUgYXMgd2VsbCEKCi0gTWFkZSBsaWJjdXJsIHJldHVybiBlcnJvciBpZiBhIHRyYW5zZmVyIGlzIGFib3J0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhCiAgImNodW5rIi4gSXQgYWN0dWFsbHkgZW5hYmxlcyBsaWJjdXJsIHRvIGRpc2NvdmVyIHByZW1hdHVyZSB0cmFuc2ZlciBhYm9ydHMKICBldmVuIGlmIHRoZSBDb250ZW50LUxlbmd0aDogc2l6ZSBpcyB1bmtub3duLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAxKQotIEFkZGVkIC0tY29ubmVjdC10aW1lb3V0IHRvIGN1cmwsIHdoaWNoIHNldHMgdGhlIG5ldyBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUCiAgb3B0aW9uIGluIGxpYmN1cmwuIEl0IGxpbWl0cyB0aGUgdGltZSBjdXJsIGlzIGFsbG93ZWQgdG8gc3BlbmQgaW4gdGhlCiAgY29ubmVjdGlvbiBwaGFzZS4gVGhpcyBkaWZmZXJzIGZyb20gLW0vLS1tYXgtdGltZSB0aGF0IGxpbWl0cyB0aGUgZW50aXJlCiAgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24uIFJlcXVlc3RlZCBieSBMYXJyeSBGYWhub2UgYW5kIG90aGVycy4KCiAgSSBhbHNvIHVwZGF0ZWQgdGhlIGN1cmwuMSBhbmQgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlcyBhbmQgcmVtb3ZlZCB0aGUKICBpdGVtIGZyb20gdGhlIFRPRE8uCgpWZXJzaW9uIDcuNy1iZXRhNAoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIE1hZGUgY3VybCBncm9rIElQdjYgd2l0aCBIVFRQIHByb3hpZXMgYW5kIGdvdCBldmVyeXRoaW5nIHRvIGNvbXBpbGUgbmljZWx5CiAgYWdhaW4gd2hlbiBFTkFCTEVfSVBWNiBpcyBzZXQuCgogIEkgbmVlZCB0byByZW1ha2UgdGhpbmdzIGluIHRoZSB0ZXN0IHN1aXRlLiBJIGNhbid0IHRlc3QgdGhlIEZUUCBwYXJ0cyB3aXRoCiAgY3VybCBidWlsdCBmb3IgSVB2NiBhcyBpdCB1c2VzIGEgZGlmZmVyZW50IHNldCBvZiBGVFAgY29tbWFuZHMgdGhlbiEKCi0gSSBmZWxsIG9udG8gYSBidWcgcmVwb3J0IG9uIHBocC5uZXQgKHBvc3RlZCBieSBMYXJzIFRvcmJlbiBXaWxzb24pIHRoYXQgd2FzCiAgYSByZXBvcnQgbWVhbnQgZm9yIG91ciBwcm9qZWN0LiBBbnl3YXksIGl0IHNhaWQgdGhlIC5uZXRyYyBwYXJzaW5nIGRpZG4ndAogIHdvcmsgYXMgc3VwcG9zZWQsIGFuZCBhcyBJIGFncmVlZCB3aXRoIExhcnMsIEkgbWFkZSB0aGUgbmV0cmMgcGFyc2VyIHVzZQogIGdldHB3dWlkKCkgdG8gZmlndXJlIG91dCB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGVmZmVjdGl2ZSB1c2VyIGFuZCB0cnkKICB0aGF0IG5ldHJjLiBJdCBzdGlsbCB1c2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIT01FIGZvciB0aG9zZSB0aGF0IGRvbid0CiAgaGF2ZSB0aGF0IGZ1bmN0aW9uIG9yIGlmIHRoZSB1c2VyIGRvZXNuJ3QgcmV0dXJuIHZhbGlkIHB3ZCBpbmZvLgoKLSBFZGluIEthZHJpYmFpYyBwb3N0ZWQgYSBidWcgcmVwb3J0IHdoZXJlIGhlIGdvdCBhIGNyYXNoIHdoZW4gYSBmZXRjaCB3aXRoCiAgdXNlcitwYXNzd29yZCBpbiB0aGUgVVJMIGZvbGxvd2VkIGEgTG9jYXRpb246IHRvIGEgc2Vjb25kIFVSTCAoYWJzb2x1dGUsCiAgd2l0aG91dCBuYW1lK3Bhc3N3b3JkKS4gVGhpcyBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBhIGxvbmcgd2hpbGUgYW5kCiAgY3Jhc2hlcyBkdWUgdG8gYSByZWFkIGF0IGFkZHJlc3MgemVyby4gRml4ZWQgbm93LiBXcm90ZSB0ZXN0IGNhc2UgMzgsIHRoYXQKICB0ZXN0cyB0aGlzLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSdzIGh0dHBzZXJ2ZXIgc2xpZ2h0bHkgdG8gYXBwZW5kIGFsbCBjbGllbnQgcmVxdWVzdAogIGRhdGEgdG8gaXRzIGxvZyBmaWxlIHNvIHRoYXQgdGhlIHRlc3Qgc2NyaXB0IG5vdyBiZXR0ZXIgY2FuIHZlcmlmeSBhIHJhbmdlCiAgb2YgcmVxdWVzdHMgYW5kIG5vdCBvbmx5IHRoZSBsYXN0IG9uZSwgYXMgaXQgZGlkIHByZXZpb3VzbHkuCgotIFVwZGF0ZWQgdGhlIGN1cmwgbWFuIHBhZ2Ugd2l0aCAtLXJhbmRvbS1maWxlIGFuZCAtLWVnZC1maWxlIGRldGFpbHMuCgpWZXJzaW9uIDcuNy1iZXRhMwoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHByb3ZpZGVkIHNpbWlsYXIgZml4ZXMgYXMgSvZybiBkaWQgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXRjaGVzCiAgZm9yIG5vbi1TU0wgY29tcGlsZXMuCgotIEkgaW5jcmVhc2VkIHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZvciBsaWJjdXJsIGFzIEkndmUgcmVtb3ZlZCB0aGUgbG93IGxldmVsCiAgZnVuY3Rpb25zIGZyb20gdGhlIGludGVyZmFjZS4gSSBhbHNvIHRvb2sgdGhpcyBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlCiAgQ3VybF9zdHJlcXVhbCBmdW5jdGlvbiB0byBjdXJsX3N0cmVxdWFsIGFuZCBDdXJsX3N0cm5lcXVhbCB0bwogIGN1cmxfc3RybmVxdWFsLCBhcyB0aGV5J3JlIHB1YmxpYyBsaWJjdXJsIGZ1bmN0aW9ucyAoZXZlbiBpZiB0aGV5J3JlIHN0aWxsCiAgdW5kb2N1bWVudGVkKS4KCiAgVGhpcyB3aWxsIG1ha2Ugb2xkZXIgcHJvZ3JhbXMgbm90IGNhcGFibGUgb2YgdXNpbmcgdGhlIG5ldyBsaWJjdXJsIHdpdGgKICBqdXN0IGEgZHJvcC1pbiByZXBsYWNlbWVudC4KCi0gSvZybiBIYXJ0cm90aCB1cGRhdGVkIHN0dWZmIGZvciB3aW4zMiBjb21waWxlczoKICBvIGNvbmZpZy13aW4zMi5oIHdhcyBmaXhlZCBmb3Igc29ja2xlbl90CiAgbyBsaWIvc3NsdXNlLmMgaGFkIGEgYmFkICNlbmRpZiBwbGFjZW1lbnQKICBvIGxpYi9maWxlLmMgd2FzIG1hZGUgdG8gY29tcGlsZSBvbiB3aW4zMiBhZ2FpbgogIG8gbGliL01ha2VmaWxlLm0zMiB3YXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZmlsZXMKICBvIGxpYi9saWJjdXJsLmRlZiBtYXRjaGVzIHRoZSBjdXJyZW50IGludGVyZmFjZSBzdGF0ZQoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEl0IG9ubHkgdG9vayBhbiBob3VyIG9yIHNvIGJlZm9yZSBK9nJuIEhhcnRyb3RoIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUKICBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLiBHaXZlbiBoaXMgZmluZSBleGFtcGxlLXNpdGUsIEkgY291bGQgZWFzaWx5IHNwb3QKICB0aGUgcHJvYmxlbSBhbmQgd2hlbiBJIHJlLXJlYWQgdGhlIHNwZWMgKHRoZSBwYXJ0IEkgaGF2ZSBwYXN0ZWQgaW4gdGhlIHRvcAogIG9mIHRoZSBodHRwX2NodW5rcy5oIGZpbGUpLCBJIHJlYWxpemVkIEkgaGFkIG1hZGUgbXkgc3RhdGUtbWFjaGluZSBzbGlnaHRseQogIHdyb25nIGFuZCBkaWRuJ3QgZXhwZWN0L2hhbmRsZSB0aGUgdHJhaWxpbmcgQ1JMRiB0aGF0IGNvbWVzIGFmdGVyIHRoZSBkYXRhCiAgaW4gZWFjaCBjaHVuayAoYW5kIHRob3NlIGV4dHJhIHR3byBieXRlcyBzdXJlIGZlZWwgd2FzdGVkKS4KCiAgSGFkIHRvIG1vZGlmeSB0ZXN0IGNhc2UgMzQgdG8gbWF0Y2ggdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjctYmV0YTIKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBBZGRlZCB0aGUgcG9saWN5IHN0dWZmIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIGZvciB0aGUgdHdvIHN1cHBvcnRlZAogIHBvbGljaWVzLgoKLSBJbXBsZW1lbnRlZCBzb21lIHN1cHBvcnQgZm9yIHRoZSBDVVJMT1BUX0NMT1NFUE9MSUNZIG9wdGlvbi4gVGhlIHBvbGljaWVzCiAgQ1VSTENMT1NFUE9MSUNZX0xFQVNUX1JFQ0VOVExZX1VTRUQgYW5kIENVUkxDTE9TRVBPTElDWV9PTERFU1QgYXJlIG5vdwogIHN1cHBvcnRlZCwgYW5kIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgaXMgdXNlZCBhcyBkZWZhdWx0IGlmIG5vIHBvbGljeQogIGlzIGNob3Nlbi4KCkRhbmllbCAoMTIgTWFyY2ggMjAwMSkKLSBBZGRlZCBDVVJMT1BUX1JBTkRPTV9GSUxFIGFuZCBDVVJMT1BUX0VHRFNPQ0tFVCB0byBsaWJjdXJsIGZvciBzZWVkaW5nIHRoZQogIFNTTCByYW5kb20gZW5naW5lLiBUaGUgcmFuZG9tIHNlZWRpbmcgc3VwcG9ydCB3YXMgYWxzbyBicm91Z2h0IHRvIHRoZSBjdXJsCiAgY2xpZW50IHdpdGggdGhlIG5ldyBvcHRpb25zIC0tcmFuZG9tLWZpbGUgPGZpbGU+IGFuZCAtLWVnZC1maWxlIDxmaWxlPi4gSQogIG5lZWQgc29tZSBwZW9wbGUgdG8gcmVhbGx5IHRlc3QgdGhpcyB0byBrbm93IHRoZXkgd29yayBhcyBzdXBwb3NlZC4gUmVtZW1iZXIKICB0aGF0IGxpYmN1cmwgbm93IGluZm9ybXMgKGlmIHZlcmJvc2UgaXMgb24pIGlmIHRoZSByYW5kb20gc2VlZCBpcyBjb25zaWRlcmVkCiAgd2VhayAoSFRUUFMgY29ubmVjdGlvbnMpLgoKLSBNYWRlIHRoZSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGVuZ2luZSBkZXRlY3RlZCBiYWQgZm9ybWF0dGVkIGRhdGEgbGVuZ3RoCiAgYW5kIHJldHVybiBlcnJvciBpZiBzbyAod2UgY2FuJ3QgcG9zc2libHkgZXh0cmFjdCBzZW5zaWJsZSBkYXRhIGlmIHRoaXMgaXMKICB0aGUgY2FzZSkuIEFkZGVkIGEgdGVzdCBjYXNlIHRoYXQgZGV0ZWN0cyB0aGlzLiBOdW1iZXIgMzYuIE5vdyB0aGVyZSBhcmUgNjAKICB0ZXN0IGNhc2VzLgoKLSBBZGRlZCA1IG5ldyBsaWJjdXJsIG9wdGlvbnMgdG8gY3VybC9jdXJsLmggdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwuIFRoZXkncmUgYWxzbyBkb2N1bWVudGVkIChmYWlybHkKICB0aG9yb3VnaGx5KSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLiBUaHJlZSBvZiB0aGVtIGFyZSBub3cKICBpbXBsZW1lbnRlZCwgYWx0aG91Z2ggbm90IHJlYWxseSB0ZXN0ZWQgYXQgdGhpcyBwb2ludC4uLiBBbnl3YXksIHRoZSBuZXcKICBpbXBsZW1lbnRlZCBvcHRpb25zIGFyZSBuYW1lZCBDVVJMT1BUX01BWENPTk5FQ1RTLCBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QsCiAgQ1VSTE9QVF9GT1JCSURfUkVVU0UuIFRoZSBvbmVzIHN0aWxsIGxlZnQgdG8gd3JpdGUgY29kZSBmb3IgYXJlOgogIENVUkxPUFRfQ0xPU0VQT0xJQ1kgYW5kIGl0cyByZWxhdGVkIG9wdGlvbiBDVVJMT1BUX0NMT1NFRlVOQ1RJT04uCgotIE1hZGUgY3VybCAodGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdG9vbCkgdXNlIHRoZSBuZXcgbGliY3VybCA3LjcgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gc3VwcG9ydCBieSByZS11c2luZyB0aGUgc2FtZSBjdXJsIGhhbmRsZSBmb3IgZXZlcnkgc3BlY2lmaWVkIGZpbGUKICB0cmFuc2ZlciBhbmQgYWZ0ZXIgc29tZSBtb3JlIHRlc3QgY2FzZSB0d2Vha2luZyB3ZSBoYXZlIDEwMCUgdGVzdCBjYXNlIE9LLgogIEkgbWFkZSBzb21lIHRlc3QgY2FzZXMgcmV0dXJuIEhUVFAvMS4wIG5vdyB0byBtYWtlIHN1cmUgdGhhdCB3b3JrcyBhcyB3ZWxsLgoKLSBIYWQgdG8gYWRkICdDb25uZWN0aW9uOiBjbG9zZScgdG8gdGhlIGhlYWRlcnMgb2YgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIHNvCiAgdGhhdCBjdXJsIGJlaGF2ZXMgIm9sZC1zdHlsZSIgc2luY2UgdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgZG9lc24ndCBkbyBtdWx0aXBsZQogIGNvbm5lY3Rpb25zLi4uIE5vdyBJIGdldCAxMDAlIHRlc3QgY2FzZSBPSy4KCi0gVGhlIGN1cmwuaGF4eC5zZSBzaXRlLCB0aGUgbWFpbiBjdXJsIG1haWxpbmcgbGlzdCBhbmQgbXkgcGVyc29uYWwgZW1haWwgYXJlCiAgYWxsIGRlYWQgdG9kYXkgZHVlIHRvIHBvd2VyIGJsYWNrb3V0IGluIHRoZSBhcmVhIHdoZXJlIHRoZSBtYWluIHNlcnZlcnMgYXJlCiAgbG9jYXRlZC4gSG9ycmlibGUuCgotIEkndmUgbWFkZSBwZXJzaXN0YW5jZSB3b3JrIG92ZXIgYSBzcXVpZCBIVFRQIHByb3h5LiBJIGZpbmQgaXQgZGlzdHVyYmluZwogIHRoYXQgaXQgdXNlcyBoZWFkZXJzIHRoYXQgYXJlbid0IHByZXNlbnQgaW4gYW55IEhUVFAgc3RhbmRhcmQgdGhvdWdoCiAgKFByb3h5LUNvbm5lY3Rpb246KSBhbmQgdGhhdCBtYWtlcyBtZSBmZWVsIHRoYXQgSSdtIG5vdyBvbiB0aGUgZWRnZSBvZiB3aGF0CiAgdGhlIHN0YW5kYXJkIGFjdHVhbGx5IGRlZmluZXMuIEkgbmVlZCB0byBnZXQgdGhpcyBjb2RlIGV4Y2VyY2lzZWQgb24gYSBsb3QKICBvZiBkaWZmZXJlbnQgSFRUUCBwcm94aWVzIGJlZm9yZSBJIGZlZWwgc2FmZS4KCiAgTm93IEknbSBmYWNpbmcgdGhlIHByb2JsZW0gd2l0aCBteSB0ZXN0IHN1aXRlIHNlcnZlcnMgKGJvdGggRlRQIGFuZCBIVFRQKQogIG5vdCBzdXBwb3J0aW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGxpYmN1cmwgaXMgZG9pbmcgdGhlbSBub3cuIEkgaGF2ZQogIHRvIGZpeCB0aGUgdGVzdCBzZXJ2ZXJzIHRvIGdldCBhbGwgdGhlIHRlc3QgY2FzZXMgZG8gT0suCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgZGlkIG91dHB1dCBlcnJvcnMgdG8gc3RkZXJyIGV2ZW4gaWYKICBNVVRFIGFuZCBOT1BST0dSRVNTIHdhcyBzZXQuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBidWcgYW5kIGhhcHBlbnMgaWYKICB0aGVyZSdzIGFuIGVycm9yIGFuZCBubyBFUlJPUkJVRkZFUiBpcyBzZXQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KClZlcnNpb24gNy43LWJldGExCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIGlzIG5vIGxvbmdlciBhbnkgdHJvdWJsZSBmb3IgbGliY3VybC4gSSd2ZQogIGFkZGVkIHR3byBzb3VyY2UgZmlsZXMgYW5kIEkndmUgcnVuIHNvbWUgdGVzdCBkb3dubG9hZHMgdGhhdCBsb29rIGZpbmUuCgotIEhUVFAgSEVBRCB3b3JrcyB0b28sIGV2ZW4gb24gMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwMSkKLSBUaGUgY3VycmVudCA1NyB0ZXN0IGNhc2VzIG5vdyBwYXNzIE9LLiBJdCB3b3VsZCBzdWdnZXN0IHRoYXQgbGliY3VybCB3b3JrcwogIHVzaW5nIHRoZSBvbGQtc3R5bGUgd2l0aCBvbmUgY29ubmVjdGlvbiBwZXIgaGFuZGxlLiBUaGUgdGVzdCBzdWl0ZSBkb2Vzbid0CiAgaGFuZGxlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHlldCBzbyB0aGVyZSBhcmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhpcy4KCi0gSSBwYXRjaGVkIHRoZSB0ZWxuZXQuYyBoZWF2aWx5IHRvIG5vdCB1c2UgYW55IGdsb2JhbCB2YXJpYWJsZXMgYW55bW9yZS4gSXQKICBzaG91bGQgbWFrZSBpdCBhIGxvdCBuaWNlciBsaWJyYXJ5LXdpc2UuCgotIFRoZSBmaWxlOi8vIHN1cHBvcnQgd2FzIG1vZGlmaWVkIHNsaWdodGx5IHRvIHVzZSB0aGUgaW50ZXJuYWwgY29ubmVjdC1maXJzdC0KICB0aGVuLWRvIGFwcHJvYWNoLgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTW9yZSBidWdzIGVyYXNlZC4KClZlcnNpb24gNy43LWFscGhhMgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTm93LCB0aGVyZSdzIGV2ZW4gYSBiYXNpYyBjaGVjayB0aGF0IGEgcmUtdXNlZCBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlCiAgYmVmb3JlIGl0IGlzIGFzc3VtZWQgc28uIEEgZmV3IGZpcnN0IHRlc3RzIGhhdmUgcHJvdmVuIHRoYXQgbGliY3VybCB3aWxsCiAgdGhlbiByZS1jb25uZWN0IGluc3RlYWQgb2YgcmUtdXNlIHRoZSBkZWFkIGNvbm5lY3Rpb24hCgpEYW5pZWwgKDIgTWFyY2ggMjAwMSkKLSBOb3cgdGhleSB3b3JrIGludGVybWl4ZWQgYXMgd2VsbC4gTWFqb3IgY29vbG5lc3MhCgotIE1vcmUgZmlkZGxpbmcgYXJvdW5kLCBteSAndGlueScgY2xpZW50IEkgaGF2ZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBub3cgaGFzCiAgcHJvdmVkIHRvIGRvd25sb2FkIGJvdGggRlRQIGFuZCBIVFRQIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhleSBkbwogIG5vdCB3b3JrIGludGVybWl4ZWQgeWV0IHRob3VnaC4KCkRhbmllbCAoMSBNYXJjaCAyMDAxKQotIFdpbGZyZWRvIFNhbmNoZXogcG9pbnRlZCBvdXQgYSBtaW5vciBzcGVsbGluZyBtaXN0YWtlIGluIGEgbWFuIHBhZ2UgYW5kIHRoYXQKICBjdXJsX3NsaXN0X2FwcGVuZCgpIHNob3VsZCB0YWtlIGEgY29uc3QgY2hhciAqIGFzIHNlY29uZCBhcmd1bWVudC4gSXQgZG9lcwogIG5vdy4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMSkKLSBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzdGFydCB0byBsb29rIGdvb2QgZm9yIEhUVFAuIE9uIGEgc3Vic2VxdWVudAogIHJlcXVlc3QsIGl0IHNlZW1zIHRoYXQgbGliY3VybCBub3cgY2FuIHBpY2sgYW4gYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9uCiAgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzLCBvciBpdCBvcGVucyBhIG5ldyBvbmUuCgotIERvdWdsYXMgUi4gSG9ybmVyIG1haWxlZCBtZSBjb3JyZWN0aW9ucyB0byB0aGUgY3VybF9mb3JtcGFyc2UoKSBtYW4gcGFnZQogIHRoYXQgSSBhcHBsaWVkLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAxKQotIEFkZGVkIHRoZSBkb2NzL2V4YW1wbGVzL3dpbjMyc29ja2V0cy5jIGZpbGUgZm9yIG91ciB3aW5kb3dzIGZyaWVuZHMuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcHJvdmlkZWQgYnJhbmQgbmV3IFRFTE5FVCBmdW5jdGlvbmFsaXR5IGFuZAogIGltcHJvdmVtZW50czoKCiAgKiBOZWdvdGlhdGlvbiBpcyBub3cgcGFzc2l2ZS4gQ3VybCBkb2VzIG5vdCBuZWdvdGlhdGUgdW50aWwgdGhlIHBlZXIgZG9lcy4KICAqIFBvc3NpYmlsaXR5IHRvIHNldCBuZWdvdGlhdGlvbiBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUsIGN1cnJlbnRseSBvbmx5CiAgICBYRElTUExPQywgVFRZUEUgYW5kIE5FV19FTlZJUk9OIChjYWxsZWQgTkVXX0VOVikuCiAgKiBOb3cgc2VuZHMgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgdGhlIC11IHN3aXRjaCBpcyB1c2VkLgogICogVXNlIC10IHRvIHNldCB0ZWxuZXQgb3B0aW9ucyAoTGludXMgZXZlbiB1cGRhdGVkIHRoZSBtYW4gcGFnZSwgYXdlc29tZSEpCgotIEhhdmVuJ3QgZG9uZSB0aGlzIGJpZyBjaGFuZ2VzIHRvIGN1cmwgZm9yIGEgd2hpbGUuIE1vdmVkIGFyb3VuZCBhIGxvdCBvZgogIHN0cnVjdCBmaWVsZHMgYW5kIHN0dWZmIHRvIG1ha2UgbXVsdGlwbGUgY29ubmVjdGlvbnMgZ2V0IGNvbm5lY3Rpb24gc3BlY2lmaWMKICBkYXRhIGluIHNlcGFyYXRlIHN0cnVjdHMgc28gdGhhdCB0aGV5IGNhbiBjby1leGlzdCBpbiBhIG5pY2Ugd2F5LiBTZWUgdGhlCiAgbWFpbGluZyBsaXN0cyBmb3IgZGlzY3Vzc2lvbnMgYXJvdW5kIGhvdyB0aGlzIGlzIGdvbm5hIGJlIGltcGxlbWVudGVkLiBEb2NzCiAgYW5kIG1vcmUgd2lsbCBmb2xsb3cuCgogIFN0dWRpZWQgdGhlIEhUVFAgUkZDIHRvIGZpbmQgb3V0IGJldHRlciBob3cgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzaG91bGQKICB3b3JrLiBTZWVtcyBjb29sIGVub3VnaC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMSkKLSBCb2IgU2NoYWRlciBicm91Z2h0IG1lIHR3byBmaWxlcyB0aGF0IGhlbHAgc2V0IHVwIGEgTVMgVkMrKyBsaWJjdXJsIHByb2plY3QKICBlYXNpZXIuIEhlIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhbiB1cC10by1kYXRlIGxpYmN1cmwuZGVmIGZpbGUuCgotIEkgbW92ZWQgYSBidW5jaCBvZiBwcm90b3R5cGVzIGZyb20gdGhlIHB1YmxpYyA8Y3VybC9jdXJsLmg+IGZpbGUgdG8gdGhlCiAgbGlicmFyeSBwcml2YXRlIHVybGRhdGEuaC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSB1cGNvbWluZyBjaGFuZ2VzLiBUaGUKICBsb3cgbGV2ZWwgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciBiZWluZyBwbGFubmVkIHRvIGJlY29tZSByZWFsaXR5LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAxKQotIENVUkxPUFRfUE9TVCBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4gSnVzdCBzZXR0aW5nIHRoZSBQT1NUIHN0cmluZyB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTIHdpbGwgc3dpdGNoIG9uIHRoZSBIVFRQIFBPU1QuIE1vc3Qgb3RoZXIgdGhpbmdzIGluCiAgbGliY3VybCBhbHJlYWR5IHdvcmtzIHRoaXMgd2F5LCBpLmUgdGhleSByZXF1aXJlIG9ubHkgdGhlIHBhcmFtZXRlciB0bwogIHN3aXRjaCBvbiBhIGZlYXR1cmUgc28gSSB0aGluayB0aGlzIHdvcmtzIHdlbGwgd2l0aCB0aGUgcmVzdC4gU2V0dGluZyBhIE5VTEwKICBzdHJpbmcgc3dpdGNoZXMgb2ZmIHRoZSBQT1NUIGFnYWluLgoKLSBFeGNlbGxlbnQgc3VnZ2VzdGlvbnMgZnJvbSBSaWNoIEdyYXksIFJpY2sgSm9uZXMsIEpvaGFuIE5pbHNzb24gYW5kIEJqb3JuCiAgUmVlc2UgaGVscGVkIG1lIGRlZmluZSBhIHdheSBob3cgdG8gaW5jb3Jwb3JhdGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBpbnRvCiAgbGliY3VybCBpbiBhIHZlcnkgc21vb3RoIHdheS4gSWYgZG9uZSByaWdodCwgbm8gY2hhbmdlIG1heSBoYXZlIHRvIGJlIG1hZGUKICB0byBvbGRlciBwcm9ncmFtcyBhbmQgdGhleSB3aWxsIGp1c3Qgc3RhcnQgdXNpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuCiAgYXBwbGljYWJsZSEKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwMSkKLSBDaGFuZ2VkIHRoZSB3b3JkICd0aW1lb3V0ZWQnIHRvICd0aW1lZCBvdXQnIGluIHR3byBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXMuCiAgU3VnZ2VzdGVkIGJ5IExhcnJ5IEZhaG5vZS4KClZlcnNpb24gNy42LjEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDAxKQotIEZyYW5rIFJlaWQgYW5kIENhaW4gSG9wd29vZCBwcm92aWRlZCBpbmZvcm1hdGlvbiBhbmQgcmVzZWFyY2ggYXJvdW5kIGEgSFRUUFMKICBQVVQvdXBsb2FkIHByb2JsZW0gd2Ugc2VlbSB0byBoYXZlLiBObyBzb2x1dGlvbiBmb3VuZCB5ZXQuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMSkKLSBBbiBpbnRlcmVzdGluZyBkaXNjdXNzaW9uIGlzIGhvdyB0byBzcGVjaWZ5IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGhvdXQgaGF2aW5nCiAgY3VybCBhc2sgZm9yIGl0IGludGVyYWN0aXZlbHk/IFRoZSBjdXJyZW50IGltcGxtZW50YXRpb24gdGFrZXMgYW4gZW1wdHkKICBwYXNzd29yZCBhcyBhIHJlcXVlc3QgZm9yIGEgcGFzc3dvcmQgcHJvbXB0LiBIb3dldmVyLCBJIHN0aWxsIHdhbnQgdG8KICBzdXBwb3J0IGEgYmxhbmsgdXNlciBmaWVsZC4gVGh1cywgdG9kYXkgaWYgeW91IGVudGVyICItdSA6IiAod2l0aG91dCB1c2VyCiAgYW5kIHBhc3N3b3JkKSBjdXJsIHdpbGwgcHJvbXB0IGZvciB0aGUgcGFzc3dvcmQuIFRyaWNreS4gSG93IHdvdWxkIHlvdQogIHNwZWNpZnkgeW91IHdhbnQgdGhlIHByb21wdCBvdGhlcndpc2U/CgotIE1hZGUgdGhlIG5ldHJjIHBhcnNlIHJlc3VsdCBwb3NzaWJsZSB0byB1c2UgZm9yIG90aGVyIHByb3RvY29scyB0aGFuIEZUUCBhbmQKICBIVFRQIChzdWNoIGFzIHRoZSB1cGNvbWluZyBURUxORVQgZml4ZXMpLgoKLSBUaGUgcHJldmlvdXNseSBtZW50aW9uZWQgIk1TVkMrKyBwcm9ibGVtcyIgdHVybmVkIG91dCB0byBiZSBhIG5vbi1pc3N1ZS4KCi0gQWRkZWQgYSBIVFRQIGZpbGUgdXBsb2FkIGNvZGUgZXhhbXBsZSBpbiB0aGUgZG9jcy9leGFtcGxlcy8gc2VjdGlvbiBvbgogIHJlcXVlc3QuCgotIEFkanVzdGVkIHRoZSBGVFAgcmVzcG9uc2UgZml4IHNsaWdodGx5LgoKVmVyc2lvbiA3LjYuMS1wcmUzCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgZm91bmQgYSBmbGF3IGluIHRoZSByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uIGZvciBGVFAgdGhhdAogIGNvdWxkIG1ha2UgbGliY3VybCBub3QgZ2V0IG91dCBvZiB0aGUgbG9vcCBwcm9wZXJseSB3aGVuIGl0IHNob3VsZCwgaWYKICBsaWJjdXJsIGdvdCAtMSByZXR1cm5lZCB3aGVuIHJlYWRpbmcgdGhlIHNvY2tldC4KCi0gSSBmb3VuZCBhIHNpbWlsYXIgbWlzdGFrZSBpbiBodHRwLmMgd2hlbiB1c2luZyBhIHByb3h5IGFuZCByZWFkaW5nIHRoZQogIHJlc3VsdHMgZnJvbSB0aGUgcHJveHkgY29ubmVjdGlvbi4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGF0IHRoZSBWQyBtYWtlZmlsZSBpbiBzcmMvIG5lZWRlZCB0aGUgbGlicGF0aCBzZXQKICBmb3IgdGhlIGRlYnVnIGJ1aWxkIHRvIHdvcmsuCgotIERhbmllbCBHZWhyaWdlciBzdGVwcGVkIGluIHRvIGFzc2lzdCB3aXRoIHRoZSBWQysrIHN0dWZmIFJvYmVydCBXZWF2ZXIKICBicm91Z2h0IHVwIHllc3RlcmRheS4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBicm91Z2h0IGEgYmlnIHBhdGNoIHRoYXQgYnJpbmdzIElQdjYtYXdhcmVuZXNzIHRvCiAgYSBidW5jaCBvZiBkaWZmZXJlbnQgYXJlYXMgd2l0aGluIGxpYmN1cmwuCgotIFJvYmVydCBXZWF2ZXIgdG9sZCBtZSBhYm91dCB0aGUgcHJvYmxlbXMgdGhlIE1TIFZDKysgNi4wIGNvbXBpbGVyIGhhcyB3aXRoCiAgdGhlICdzdGF0aWMnIGtleXdvcmQgb24gYSBudW1iZXIgb2YgbGliY3VybCBmdW5jdGlvbnMuIEkgbWlnaHQgbmVlZCB0byBhZGQgYQogIHBhdGNoIHRoYXQgcmVkZWZpbmVzIHN0YXRpYyB3aGVuIGxpYmN1cmwgaXMgY29tcGlsZWQgd2l0aCB0aGF0IGNvbXBpbGVyLgogIEhvdyBkbyBJIGtub3cgd2hlbiBWQysrIGNvbXBpbGVzLCBhbnlvbmU/CgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwMSkKLSBjdXJsX2dldGluZm8oKSB3YXMgZXh0ZW5kZWQgd2l0aCB0d28gbmV3IG9wdGlvbnM6CiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRC4gVGhleQogIHJldHVybiB0aGUgZnVsbCBhc3N1bWVkIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciBpbiB0aGUgZ2l2ZW4KICBkaXJlY3Rpb24uIFRoZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCB3aWxsIGJlIHRoZSBDb250ZW50LUxlbmd0aDoKICBzaXplIG9mIGEgSFRUUCBkb3dubG9hZC4gQWRkZWQgZGVzY3JpcHRpb25zIHRvIHRoZSBtYW4gcGFnZSBhcyB3ZWxsLiBUaGlzCiAgd2FzIGRvbmUgYWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBCb2IgU2NoYWRlci4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHByb3ZpZGVkIGFub3RoZXIgZml4IHRoYXQgbWFrZXMgY3VybCBidWlsZCB1bmRlciB0aGUgbW9yZQogIHJlY2VudCBjeWd3aW4gaW5zdGFsbGF0aW9ucy4gSXQgc2VlbXMgdGhleSd2ZSBjaGFuZ2VkIHRoZSBwcmVzZXQgZGVmaW5lcyB0bwogIG5vdCBpbmNsdWRlIFdJTjMyIGFueW1vcmUuCgpWZXJzaW9uIDcuNi4xLXByZTIKCkRhbmllbCAoMzEgSmFudWFyeSAyMDAxKQotIEN1cmxfcmVhZCgpIGFuZCBjdXJsX3JlYWQoKSBub3cgcmV0dXJuIGEgc3NpemVfdCBmb3IgdGhlIHNpemUsIGFzIGl0IGhhZCB0bwogIGJlIGFibGUgdG8gcmV0dXJuIC0xLiBUaGUgdGVsbmV0IHN1cHBvcnQgY3Jhc2hlZCBkdWUgdG8gdGhpcyBhbmQgdGhlcmUgd2FzIGEKICBwb3NzaWJpbGl0eSB0byB3ZWlyZCBiZWhhdmlvdXIgYWxsIG92ZXIuIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaGVscGVkIG1lCiAgZmluZCB0aGlzLgoKLSBBZGRlZCBhIGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgYSB3b3JraW5nIGdldGFkZHJpbmZvKCkgaWYgSVB2NiBpcyByZXF1ZXN0ZWQuCiAgSSBhbHNvIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmVhdHVyZSAtLWVuYWJsZS1kZWJ1ZyB3aGljaCBzZXRzIGEgY291cGxlCiAgb2YgY29tcGlsZXIgb3B0aW9ucyB3aGVuIHVzZWQuIEl0IGFzc3VtZXMgZ2NjLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDEpCi0gSSBmaW5hbGx5IHRvb2sgYSBzdGFiIGF0IHRoZSBsb25nLXRlcm0gRklYTUUgaXRlbSBJJ3ZlIGhhZCBvbiBteXNlbGYsIGFuZAogIG5vdyBsaWJjdXJsIHdpbGwgcHJvcGVybHkgd29yayB3aGVuIGRvaW5nIGEgSFRUUCByYW5nZS1yZXF1ZXN0IHRoYXQgZm9sbG93cwogIGEgTG9jYXRpb246LiBQcmV2aW91c2x5IHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIGZhaWwgc2F5aW5nIHRoYXQgdGhlIHNlcnZlcgogIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHJhbmdlIHJlcXVlc3RzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IgdGhlIEhUVFAgUFVUIHJlc3VtZSB0aGluZyAodGVzdCBjYXNlIDMzKS4KClZlcnNpb24gNy42LjEtcHJlMQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gWWV0IGFub3RoZXIgQ29udGVudC1SYW5nZSBjaGFuZ2UuIE9rIG5vdz8gQm9iIFNjaGFkZXIgY2hlY2tzIGZyb20gaGlzIGVuZCAKICBhbmQgaXQgd29ya3MgZm9yIGhpbS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDAxKQotIFNvIHRoZSBIVFRQIFBVVCByZXN1bWUgZml4IHdhc24ndCBnb29kLiBUaGVyZSBzaG91bGQgYXBwZWFyYW50bHkgYmUgYQogIENvbnRlbnQtUmFuZ2UgaGVhZGVyIHdoZW4gcmVzdW1pbmcgYSBQVVQuCgotIEkgbm90aWNlZCBJIGJyb2tlIHRoZSBkb3dubG9hZC1jaGVjayB0aGF0IHZlcmlmaWVzIHRoYXQgYSByZXN1bWVkIEhUVFAKICBkb3dubG9hZCBpcyBhY3R1YWxseSByZXN1bWVkLiBJdCBnb3QgYnJva2UgYmVjYXVzZSBteSBuZXcgJ2h0dHByZXEnIGZpZWxkCiAgaW4gdGhlIG1haW4gY3VybCBzdHJ1Y3QuIEkgc2hvdWxkIGdldCBzbGFwcGVkLiBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvcgogIHRoaXMgbm93LCBzbyBJIHdvbid0IGJlIGFibGUgdG8gcnVpbiB0aGlzIGFnYWluIHdpdGhvdXQgbm90aWNpbmcuCgotIEFkZGVkIGEgdGVzdCBjYXNlIGZvciBjb250ZW50LWxlbmd0aCB2ZXJpZnlpbmcgd2hlbiBkb3dubG9hZGluZyBIVFRQLgoKLSBNYWRlIHRoZSBwcm9ncmVzcyBtZXRlciB0aXRsZSBzYXkgaWYgdGhlIHRyYW5zZmVyIGlzIGJlaW5nIHRyYW5zZmVyZWQuIEl0CiAgbWFrZXMgdGhlIG91dHB1dCBzbGlnaHRseSBiZXR0ZXIgZm9yIHJlc3VtZXMuCgotIFdoZW4gZGVhbGluZyB3aXRoIExvY2F0aW9uOiBhbmQgSFRUUCByZXR1cm4gY29kZXMsIGxpYmN1cmwgd2lsbCBub3QgYXR0ZW1wdAogIHRvIGZvbGxvdyB0aGUgc3Bpcml0IG9mIFJGQzI2MTYgYmV0dGVyLiBJdCBtZWFucyB0aGF0IHdoZW4gUE9TVGluZyB0byBhCiAgVVJMIHRoYXQgaXMgYmVpbmcgZm9sbG93aW5nIHRvIGEgc2Vjb25kIHBsYWNlLCB0aGUgc3RhbmRhcmQgd2lsbCBqdWRnZSBvbgogIHdoYXQgdG8gZG8uIEFsbCBIVFRQIGNvZGVzIGV4Y2VwdCAzMDMgYW5kIDMwNSB3aWxsIGNhdXNlIGN1cmwgdG8gbWFrZSBhCiAgc2Vjb25kIFBPU1Qgb3BlcmF0aW9uLiAzMDMgd2lsbCBtYWtlIGEgR0VUIGFuZCAzMDUgaXMgbm90IHlldCBzdXBwb3J0ZWQuCgogIEkgYWxzbyB3cm90ZSB0d28gdGVzdCBjYXNlcyBmb3IgdGhpcyBQT1NUL0dFVC9Mb2NhdGlvbiBzdHVmZi4KClZlcnNpb24gNy42CgpEYW5pZWwgKDI2IEphbnVhcnkgMjAwMSkKLSBMb3RzIG9mIG1haWxzIGJhY2sgYW5kIGZvcnRoIHdpdGggQm9iIFNjaGFkZXIgZmluYWxseSBtYWRlIG1lIGFkZCBhIHNtYWxsCiAgcGllY2Ugb2YgY29kZSBpbiB0aGUgSFRUUCBlbmdpbmUgc28gdGhhdCBIVFRQIHVwbG9hZCByZXN1bWUgd29ya3MuIFlvdSBjYW4KICBub3cgZG8gYW4gb3BlcmF0aW9uIGxpa2UgJ2N1cmwgLVQgZmlsZSAtQyA8b2Zmc2V0PiA8VVJMPicgYW5kIGN1cmwgd2lsbCBQVVQKICB0aGUgZW5kaW5nIHBhcnQgb2YgdGhlIGZpbGUgc3RhcnRpbmcgYXQgZ2l2ZW4gb2ZmZXQgdG8gdGhlIHNwZWNpZmllZCBVUkwuCgpWZXJzaW9uIDcuNi1wcmU0CgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMSkKLSBJIHRvb2sgaG9sZCBvZiBSaWNrIEpvbmVzJyBxdWVzdGlvbiB3aHkgd2UgZG9uJ3QgdXNlIHJlY3YoKSBhbmQgc2VuZCgpIGZvcgogIHJlYWRpbmcvd3JpdGluZyB0byB0aGUgc29ja2V0cyBhbmQgSSd2ZSBub3cgbW9kaWZpZWQgdGhlIHNyZWFkKCkgYW5kCiAgc3dyaXRlKCkgbWFjcm9zIHRvIHVzZSB0aGVtIGluc3RlYWQuIElmIG5vdGhpbmcgZWxzZSwgdGhleSBjb3VsZCBiZSB0ZXN0ZWQKICBpbiB0aGUgbmV4dCBiZXRhLXJvdW5kIGNvbWluZyByaWdodCB1cC4KCi0gSmVmZiBNb3Jyb3cgZm91bmQgYSBwcm9ibGVtIHdpdGggbGliY3VybCdzIHVzYWdlIG9mIFNTTF9yZWFkKCkgYW5kIHN1cHBsaWVkCiAgaGlzIHJlc2VhcmNoIHJlc3VsdHMgaW4gaG93IHRvIGZpeCB0aGlzLiBJdCB0dXJucyBvdXQgd2UgaGF2ZSB0byBpbnZva2UgdGhlCiAgZnVuY3Rpb24gc2V2ZXJhbCB0aW1lcyBpbiBzb21lIGNhc2VzLiBUaGUgc2FtZSBnb2VzIGZvciB0aGUgU1NMX3dyaXRlKCkuCgogIEkgbWFkZSBzb21lIHJhdGhlciBkcmFzdGljIGNoYW5nZXMgYWxsIG92ZXIgbGliY3VybCB0byBtYWtlIGFsbCB3cml0ZXMgYW5kCiAgcmVhZHMgZ2V0IGRvbmUgb24gb25lIHNpbmdsZSBwbGFjZSBzbyB0aGF0IHRoaXMgcmVwZWF0ZWQtYXR0ZW1wdHMgdGhpbmcKICB3b3VsZCBvbmx5IGhhdmUgdG8gYmUgaW1wbGVtZW50ZWQgYXQgb25lIHBvaW50LgoKLSBSaWNrIEpvbmVzIHNwb3R0ZWQgdGhhdCB0aGUgJ3RvdGFsIHRpbWUnIGNvdW50ZXIgcmVhbGx5IGRpZG4ndCBtZWFzdXJlIHRoZQogIHRvdGFsIHRpbWUgdmVyeSBhY2N1cmF0ZSBvbiBzdWJzZWNvbmQgbGV2ZWxzLgoKLSBKb2hhbiBOaWxzc29uIHBvaW50ZWQgb3V0IHRoZSBuZWVkIHRvIG1vcmUgY2xlYXJseSBzcGVjaWZ5IHRoYXQgdGhlIHRpbWVvdXQKICB2YWx1ZSB5b3Ugc2V0IGZvciBhIGRvd25sb2FkIGlzIGZvciB0aGUgKmVudGlyZSogZG93bmxvYWQuIFRoZXJlJ3MgY3VycmVudGx5CiAgbm8gb3B0aW9uIGF2YWlsYWJsZSB0aGF0IHNldHMgYSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbiBwaGFzZSBvbmx5LgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDEpCi0gSW5nbyBSYWxmIEJsdW0gc3VibWl0dGVkIGEgc2VyaWVzIG9mIHBhdGNoZXMgcmVxdWlyZWQgdG8gZ2V0IGN1cmwgdG8gY29tcGlsZQogIHByb3Blcmx5IHdpdGggY3lnd2luLgoKLSBSb2JlcnQgV2VhdmVyIHBvc3RlZCBhIGZpeCBmb3IgdGhlIHdpbjMyIHNlY3Rpb24gb2YgdGhlIGN1cmxfZ2V0ZW52KCkgY29kZQogIHRoYXQgY29ycmVjdGVkIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrLgoKLSBBZGRlZCBjb21tZW50cyBpbiBhIGZldyBmaWxlcyBpbiBhIHN1ZGRlbiBhdHRlbXB0IHRvIG1ha2UgdGhlIHNvdXJjZXMgbW9yZQogIGVhc3kgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZCEKCkRhbmllbCAoMjMgSmFudWFyeSAyMDAxKQotIEFkZGVkIHNpbXBsZSBJUHY2IGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgbWFkZSB0aGUgdmVyc2lvbgogIHN0cmluZyBhZGQgJ2lwdjYnIHRvIHRoZSBlbmFibGUgc2VjdGlvbiBpbiB0aGF0IGNhc2UuIEVOQUJMRV9JUFY2IHdpbGwgYmUKICBzZXQgaWYgY3VybCBpcyBjb21waWxlZCB3aXRoIElQdjYgc3VwcG9ydCBlbmFibGVkLgoKLSBBZGRlZCBhIHBhcnNlciBmb3IgSVB2Ni1zdHlsZSBzcGVjaWZpZWQgSVAtYWRkcmVzc2VzIGluIGEgVVJMLiBUaHVzLCB3aGVuCiAgSVB2NiBnZXRzIGVuYWJsZWQgc29vbiwgd2UgY2FuIHVzZSBVUkxzIGxpa2UgJ1swOjoxXTo4MCcuLi4KCi0gTWFkZSB0aGUgVVJMIGdsb2JiaW5nIGluIHRoZSBjbGllbnQgcG9zc2libGUgdG8gZmFpbCBzaWxlbnRseSBpZiB0aGVyZSdzIGFuCiAgZXJyb3IgaW4gdGhlIGdsb2JiaW5nLiBJdCBtYWtlcyBpdCBhbG1vc3QgaW50dWl0aXZlLCBzbyB3aGVuIHlvdSBkb24ndAogIGZvbGxvdyB0aGUgc3ludGF4IHJ1bGVzLCBnbG9iYmluZyBpcyBzaW1wbHkgc3dpdGNoZWQgb2ZmIGFuZCB0aGUgcmF3IHN0cmluZwogIGlzIHVzZWQgaW5zdGVhZC4KCiAgSSBzdGlsbCB0aGluayB3ZSdsbCBnZXQgcHJvYmxlbXMgd2l0aCBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcyB3aGVuIHdlICp3YW50KgogIGdsb2JiaW5nIG9uIHBhcnRzIG9mIHRoZSBVUkwgYXMgdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgVVJMIHdpbGwgZm9yIHN1cmUKICBzZXJpb3VzbHkgY29uZnVzZSB0aGUgZ2xvYmJlci4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcHJvZ3Jlc3MgbWV0ZXIgcGF0Y2ggdGhhdCBtYWtlcyBpdCBsb29rIGJldHRlciBldmVuCiAgZHVyaW5nIHNsb3cgc3RhcnRzLiBQcmV2aW91c2x5IGl0IG1hZGUgc29tZSBzaWxseSBhc3N1bXB0aW9ucy4uLgoKLSBBZGRlZCB0d28gRlRQIHRlc3RzIGZvciAtUSBhbmQgLVEgLSBzdHVmZiBzaW5jZSBpdCB3YXMgYmVpbmcgZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdC4gSGFkIHRvIGNvcnJlY3QgdGhlIGZ0cHNlcnZlci5wbCB0b28gYXMgaXQgYnVnZ2VkIHNsaWdodGx5LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgTG9jYXRpb246IHBhcnNlcnMgZGVhbCB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGh1cyBJIHJlbW92ZWQgdGhlIGxhc3QKICBjb2RlIHRoYXQgcmVzdHJpY3RzIHRoZSBsZW5ndGggb2YgVVJMcyB0aGF0IGN1cmwgc3VwcG9ydHMuCgotIEFkZGVkIGEgLS1nbG9ib2ZmIHRlc3QgY2FzZSAoIzI4KSBhbmQgaXQgcXVpY2tseSBpZGVudGlmaWVkIGEgbWVtb3J5IHByb2JsZW0KICBpbiBzcmMvbWFpbi5jIHRoYXQgSSB0b29rIGNhcmUgb2YuCgpWZXJzaW9uIDcuNi1wcmUzCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSB0d28gZm9ybWVyIGZpbGVzIGxpYi9kb3dubG9hZC5jIGFuZCBsaWIvaGlnaGxldmVsLmMgYmVjb21lIHRoZSBuZXcKICBsaWIvdHJhbnNmZXIuYyB3aGljaCBtYWtlcyBtb3JlIHNlbnNlLiBJIGFsc28gZGlkIHRoZSByZW5hbWUgZnJvbSBUcmFuc2ZlcigpCiAgdG8gQ3VybF9UcmFuc2ZlcigpIGluIHRoZSBvdGhlciBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uCiAgaW4gdGhlIHNwaXJpdCBvZiB1c2luZyBDdXJsXyBwcmVmaXggZm9yIGxpYnJhcnktc2NvcGVkIGdsb2JhbCBzeW1ib2xzLgoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgLWcvLS1nbG9ib2ZmIHRoYXQgc3dpdGNoZXMgT0ZGIHRoZSBVUkwgZ2xvYmJpbmcgYW5kIHRodXMgZW5hYmxlcyB7fVtdCiAgbGV0dGVycyB0byBiZSBwYXJ0IG9mIHRoZSBVUkwuIERvIG5vdGUgdGhhdCBSRkMyMzk2IHNlY3Rpb24gMi40LjMgZXhwbGljaXRseQogIG1lbnRpb24gdGhlc2UgbGV0dGVycyB0byBiZSBlc2NhcGVkLiBUaGlzIHdhcyBwb3N0ZWQgYXMgYSBmZWF0dXJlIHJlcXVlc3QgYnkKICBKb3JnZSBHdXRpZXJyZXogYW5kIGFzIGEgYnVnIGJ5IFRlcnJ5LgoKLSBTaG9ydCBvcHRpb25zIHRvIGN1cmwgdGhhdCByZXF1aXJlcyBwYXJhbWV0ZXJzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHdpdGhvdXQKICBoYXZpbmcgdGhlIG9wdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBzcGFjZSBzZXBhcmF0ZWQuIC1vZmlsZSB3b3JrcyBhcyBnb29kIGFzCiAgLW8gZmlsZS4gLW0yMCBpcyBlcXVhbCB0byAtbSAyMC4gRG8gbm90ZSB0aGF0IHRoaXMgZ29lcyBmb3Igc2luZ2xlLWxldHRlcgogIG9wdGlvbnMgb25seSwgdmVyYm9zZSAtLWxvbmctc3R5bGUgb3B0aW9ucyBzdGlsbCBtdXN0IGJlIHNlcGFyYXRlZCB3aXRoCiAgc3BhY2UgZnJvbSB0aGVpciBwYXJhbWV0ZXJzLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwMSkKLSBGcmFuY2lzIERhZ2VuYWlzIHJlcG9ydGVkIHRoYXQgdGhlIFNDTyBjb21waWxlciBzdGlsbCBmYWlscyB3aGVuIGNvbXBpbGluZwogIGN1cmwgZHVlIHRvIHRoYXQgZ2V0cGFzc19yKCkgcHJvdG90eXBlLiBJJ3ZlIG5vdyBwdXQgaXQgYXJvdW5kICNpZm5kZWYKICBIQVZFX0dFVFBBU1NfUiBpbiBhbiBhdHRlbXB0IHRvIHBsZWFzZSB0aGUgU0NPIHN5c3RlbXMuCgotIE1hZGUgc29tZSBtaW5vciBjb3JyZWN0aW9ucyB0byBnZXQgdGhlIGNsaWVudCB0byBjbGVhbnVwIHByb3Blcmx5IGFuZCBJIG1hZGUKICB0aGUgc2VwYXJhdG9yIHdvcmsgYWdhaW4gd2hlbiBnZXR0aW5nIG11bHRpcGxlIGdsb2JiZWQgVVJMcyB0byBzdGRvdXQuCgotIFdvcmtlZCB3aXRoIExvaWMgRGFjaGFyeSB0byBnZXQgdGhlIG1ha2UgZGlzdCBhbmQgbWFrZSBkaXN0Y2hlY2sgd29yawogIGNvcnJlY3RseS4gVGhlICdtYWtldGd6JyBzY3JpcHQgaXMgbm93IHVzaW5nIHRoZSBhdXRvbWFrZSBnZW5lcmF0ZWQgJ21ha2UKICBkaXN0JyB3aGVuIGNyZWF0aW5nIHJlbGVhc2UgYXJjaGl2ZXMuIExvaWMgc3VjY2Vzc2Z1bGx5IG1hZGUgJ21ha2UgcnBtcycKICBhdXRvbWF0aWNhbGx5IGJ1aWxkIFJQTXMhCgpMb2ljIERhY2hhcnkgKDYgSmFudWFyeSAyMDAxKQotIEF1dG9tYXRlZCBnZW5lcmF0aW9uIG9mIHJwbSBwYWNrYWdlcywgbm8gbmVlZCB0byBiZSByb290LgoKLSBtYWtlIGRpc3RjaGVjayBnZW5lcmF0ZXMgYSBwcm9wZXIgZGlzdHJpYnV0aW9uIChFWFRSQV9ESVNUCiAgaW4gYWxsIE1ha2VmaWxlLmFtIG1vZGlmaWVkIHRvIG1hdGNoIEZJTEVTKS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDEpCi0gSHVnZSBjbGllbnQtc2lkZSBoYWNrOiBub3cgbXVsdGlwbGUgVVJMcyBhcmUgc3VwcG9ydGVkLiBBbnkgbnVtYmVyIG9mIFVSTHMKICBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGV5J2xsIGFsbCBiZSBkb3dubG9hZGVkLiBUaGVyZQogIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIC1vIG9yIC1PIGZvciBlYWNoIFVSTCBvciB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8KICBzdGRvdXQuIFRoaXMgbmVlZHMgbW9yZSB0ZXN0aW5nLCB0aW1lIHRvIHJlbGVhc2UgYSA3LjYtcHJlIHBhY2thZ2UuCgotIFRoZSBrcmI0IHN1cHBvcnQgd2FzIGJyb2tlbiBpbiB0aGUgcmVsZWFzZS4gRml4ZWQgbm93LgoKLSBIdWdlIGludGVybmFsIHN5bWJvbCByZW5hbWUgb3BlcmF0aW9uLiBBbGwgbm9uLXN0YXRpYyBidXQgc3RpbGwgbGliLWludGVybmFsCiAgc3ltYm9scyBzaG91bGQgbm93IGJlIHByZWZpeGVkIHdpdGggJ0N1cmxfJyB0byBwcmV2ZW50IGNvbGxpc2lvbnMgd2l0aCBvdGhlcgogIGxpYnMuIEFsbCBwdWJsaWMgc3ltYm9scyBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnY3VybF8nIGFuZCB0aGUgcmVzdCBzaG91bGQKICBiZSBzdGF0aWMgYW5kIHRodXMgaW52aXNpYmxlIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBJIHVwZGF0ZWQgdGhlIElOVEVSTkFMUwogIGRvY3VtZW50IHRvIHNheSB0aGlzIGFzIHdlbGwuCgpWZXJzaW9uIDcuNS4yCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAxKQotIEFzIEtldmluIFAgUm90aCBzdWdnZXN0ZWQsIEkndmUgYWRkZWQgdGV4dCB0byB0aGUgbWFuIHBhZ2UgZm9yIGV2ZXJ5IGNvbW1hbmQKICBsaW5lIG9wdGlvbiBhbmQgd2hhdCBoYXBwZW5zIHdoZW4geW91IHNwZWNpZnkgdGhhdCBvcHRpb24gbW9yZSB0aGFuCiAgb25jZS4gVGhhdCBoYXNuJ3QgYmVlbiBleGFjdGx5IGNyeXN0YWwgY2xlYXIgYmVmb3JlLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IHBvc3NpYmxlIHRvIHJ1biBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlLiBGb3IKICBvZGQgcmVhc29ucyBJIGNhbid0IGJ1aWxkIGN1cmwgcHJvcGVybHkgb3V0c2lkZSB0aG91Z2guIEl0IGhhcyB0byBkbyB3aXRoCiAgY3VybCdzIGRlcGVuZGVuY2llcyBvbiBsaWJjdXJsLi4uCgotIEN1dCBvZmYgYWxsIG9sZGVyIChkYXRlZCAxOTk5IGFuZCBlYXJsaWVyKSBDSEFOR0VTIGVudHJpZXMgZnJvbSB0aGlzIGZpbGUuCiAgVGhlIG9sZGVyIHBpZWNlIGlzIG5hbWVkIENIQU5HRVMuMCBhbmQgaXMgYWRkZWQgdG8gdGhlIENWUyByZXBvc2l0b3J5IGluCiAgY2FzZSBhbnlvbmUgd291bGQgbmVlZCBpdC4KCi0gSSBhZGRlZCBhbm90aGVyIGZpbGUgJ0NWUy1JTkZPJyB0byB0aGUgQ1ZTLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAogIGZpbGVzIGluIHRoZSBDVlMgdGhhdCBhcmVuJ3QgaW5jbHVkZWQgaW4gcmVsZWFzZSBhcmNoaXZlcyBhbmQgaG93IHRvIGJ1aWxkCiAgY3VybCB3aGVuIHlvdSBnZXQgdGhlIHNvdXJjZXMgb2ZmIENWUy4KCi0gVXBkYXRlZCBDT05UUklCVVRFIGFuZCBGQVEgZHVlIHRvIHRoZSBuZXcgbGljZW5zZS4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDEpCi0gUmVuYW1lZCBSRUFETUUubGliY3VybCB0byBMSUJDVVJMCgotIENoYW5nZWQgaGVhZGVycyBpbiBhbGwgc291cmNlcyBmaWxlcyB0byB0aGUgbmV3IGR1YWwgbGljZW5zZSBjb25jZXB0IG9mCiAgY3VybDogdXNlIHRoZSBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlICpvciogTVBMLiBUaGUgTEVHQUwgZmlsZSB3YXMgdXBkYXRlZAogIGFjY29yZGluZ2x5IGFuZCB0aGUgTVBMIDEuMSBhbmQgTUlUL1ggZGVyaXZhdGUgbGljZW5zZXMgYXJlIG5vdyBwYXJ0IG9mIHRoZQogIHJlbGVhc2UgYXJjaGl2ZS4K