ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKVmVyc2lvbiA3LjE2LjAgKDMwIE9jdG9iZXIgMjAwNikKCkRhbmllbCAoMjUgT2N0b2JlciAyMDA2KQotIEZpeGVkIENVUkxPUFRfRkFJTE9ORVJST1IgdG8gcmV0dXJuIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IgZXZlbiBmb3IgdGhlCiAgY2FzZSB3aGVuIDQwMSBvciA0MDcgYXJlIHJldHVybmVkLCAqSUYqIG5vIGF1dGggY3JlZGVudGlhbHMgaGF2ZSBiZWVuIGdpdmVuLgogIFRoZSBDVVJMT1BUX0ZBSUxPTkVSUk9SIG9wdGlvbiBpcyBub3QgcG9zc2libGUgdG8gbWFrZSBmb29sLXByb29mIGZvciA0MDEKICBhbmQgNDA3IGNhc2VzIHdoZW4gYXV0aCBjcmVkZW50aWFscyBpcyBnaXZlbiwgYnV0IHdlJ3ZlIG5vdyBjb3ZlcmVkIHRoaXMKICBzb21ld2hhdCBtb3JlLgoKICBZb3UgbWlnaHQgZ2V0IHNvbWUgYW1vdW50cyBvZiBoZWFkZXJzIHRyYW5zZmVycmVkIGJlZm9yZSB0aGlzIHNpdHVhdGlvbiBpcwogIGRldGVjdGVkLCBsaWtlIGZvciB3aGVuIGEgIjEwMC1jb250aW51ZSIgaXMgcmVjZWl2ZWQgYXMgYSByZXNwb25zZSB0byBhCiAgUE9TVC9QVVQgYW5kIGEgNDAxIG9yIDQwNyBpcyByZWNlaXZlZCBpbW1lZGlhdGVseSBhZnRlcndhcmRzLgoKICBBZGRlZCB0ZXN0IDI4MSB0byB2ZXJpZnkgdGhpcyBjaGFuZ2UuCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwNikKLSBSYXZpIFByYXRhcCBwcm92aWRlZCBhIG1ham9yIHVwZGF0ZSB3aXRoIHBpcGVsaW5pbmcgZml4ZXMuIFdlIGFsc28gbm8gbG9uZ2VyCiAgcmUtdXNlIGNvbm5lY3Rpb25zIChmb3IgcGlwZWxpbmluZykgYmVmb3JlIHRoZSBuYW1lIHJlc29sdmluZyBpcyBkb25lLgoKRGFuaWVsICgyMSBPY3RvYmVyIDIwMDYpCi0gTmlyIFNvZmZlciBtYWRlIHRoZSB0ZXN0cy9saWJ0ZXN0L01ha2VmaWxlLmFtIHVzZSBhIHByb3BlciB2YXJpYWJsZSBmb3IgYWxsCiAgdGhlIHNpbmdsZSB0ZXN0IGFwcGxpY2F0aW9ucycgbGluayBhbmQgZGVwZW5kZW5jZXMsIHNvIHRoYXQgeW91IGVhc2llciBjYW4KICBvdmVycmlkZSB0aG9zZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2hlbiB1c2luZyBtYWtlLgoKLSBBcm1lbCBBc3NlbGluIHNlcGFyYXRlZCBDQSBjZXJ0IHZlcmlmaWNhdGlvbiBwcm9ibGVtcyBmcm9tIHByb2JsZW1zIHdpdGgKICByZWFkaW5nIHRoZSAobG9jYWwpIENBIGNlcnQgZmlsZSB0byBsZXQgdXNlcnMgZWFzaWVyIHBpbnBvaW50IHRoZSBhY3R1YWwKICBwcm9ibGVtLiBDVVJMRV9TU0xfQ0FDRVJUX0JBREZJTEUgKDc3KSBpcyB0aGUgbmV3IGxpYmN1cmwgZXJyb3IgY29kZS4KCkRhbmllbCAoMTggT2N0b2JlciAyMDA2KQotIFJlbW92ZWQgdGhlICJwcm90b2NvbC1ndWVzc2luZyIgZm9yIFVSTHMgd2l0aCBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggRlRQUwogIG9yIFRFTE5FVCBzaW5jZSB0aGV5IGFyZSBwcmFjdGljYWxseSBub24tZXhpc3RhbnQuIFRoaXMgbGVhdmVzIHVzIHdpdGggb25seQogIHRocmVlIGRpZmZlcmVudCBwcmVmaXhlcyB0aGF0IHdvdWxkIGFzc3VtZSB0aGUgcHJvdG9jb2wgaXMgYW55dGhpbmcgYnV0CiAgSFRUUCwgYW5kIHRoZXkgYXJlIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCAiZnRwLiIsICJkaWN0LiIgb3IgImxkYXAuIi4KCkRhbmllbCAoMTcgT2N0b2JlciAyMDA2KQotIEJ1ZyByZXBvcnQgIzE1NzkxNzEgcG9pbnRlZCBvdXQgY29kZSBmbGF3cyBkZXRlY3RlZCB3aXRoICJwcmVmYXN0IiwgYW5kIHRoZXkKICB3ZXJlIDEgLSBhIHRvbyBzbWFsbCBtZW1vcnkgY2xlYXIgd2l0aCBtZW1zZXQoKSBpbiB0aGUgdGhyZWFkZWQgcmVzb2x2ZXIgYW5kCiAgMiAtIGEgcmFuZ2Ugb2YgcG90ZW50aWFsbHkgYmFkIHVzZXMgb2YgdGhlIGN0eXBlIGZhbWlseSBvZiBpcyooKSBmdW5jdGlvbnMKICBzdWNoIGFzIGlzZGlnaXQoKSwgaXNhbG51bSgpLCBpc3ByaW50KCkgYW5kIG1vcmUuIFRoZSBsYXR0ZXIgbWFkZSBtZSBzd2l0Y2gKICB0byB1c2luZyBvdXIgb3duIHNldCBvZiB0aGVzZSBmdW5jdGlvbnMvbWFjcm9zIHVzaW5nIHVwcGVyY2FzZSBsZXR0ZXJzLCBhbmQKICB3aXRoIHNvbWUgZXh0cmEgc2V0IG9mIGNyYXp5IHR5cGVjYXN0cyB0byBhdm9pZCBtaXN0YWtpbmdseSBwYXNzaW5nIGluCiAgbmVnYXRpdmUgbnVtYmVycyB0byB0aGUgdW5kZXJseWluZyBpcyooKSBmdW5jdGlvbnMuCgotIFdpdGggSmVmZiBQb2hsbWV5ZXIncyBoZWxwLCBJIGZpeGVkIHRoZSBleHBpcmUgdGltZXIgd2hlbiB1c2luZwogIGN1cmxfbXVsdGlfc29ja2V0KCkgZHVyaW5nIG5hbWUgcmVzb2x2ZXMgd2l0aCBjLWFyZXMgYW5kIHRoZSBMT1dfU1BFRUQKICBvcHRpb25zIG5vdyB3b3JrIGZpbmUgd2l0aCBjdXJsX211bHRpX3NvY2tldCgpIGFzIHdlbGwuCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwNikKLSBBZGRlZCBhIGNoZWNrIGluIGNvbmZpZ3VyZSB0aGF0IHNpbXBseSB0cmllcyB0byBydW4gYSBwcm9ncmFtIChub3Qgd2hlbgogIGNyb3NzLWNvbXBpbGluZykgaW4gb3JkZXIgdG8gZGV0ZWN0IHByb2JsZW1zIHdpdGggcnVuLXRpbWUgbGlicmFyaWVzIHRoYXQKICBvdGhlcndpc2Ugd291bGQgb2NjdXIgd2hlbiB0aGUgc2l6ZW9mIHRlc3RzIGZvciBjdXJsX29mZl90IHdvdWxkIHJ1biBhbmQKICB0aHVzIGJlIG11Y2ggbW9yZSBjb25mdXNpbmcgdG8gdXNlcnMuIFRoZSBjaGVjayBvZiBjb3Vyc2Ugc2hvdWxkIHJ1biBhZnRlcgogIGFsbCBsaWItY2hlY2tzIGFyZSBkb25lIGFuZCBiZWZvcmUgYW55IG90aGVyIHRlc3QgaXMgdXNlZCB0aGF0IHdvdWxkIHJ1biBhbgogIGV4ZWN1dGFibGUgYnVpbHQgZm9yIHRlc3RpbmctcHVycG9zZXMuCgpEYW4gRiAoMTMgT2N0b2JlciAyMDA2KQotIFRoZSB0YWdnaW5nIG9mIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBQT1NUIGJvZHkgZGF0YSBzZW50CiAgdG8gdGhlIENVUkxPUFRfREVCVUdGVU5DVElPTiBjYWxsYmFjayBoYXMgYmVlbiBmaXhlZCAoaXQgd2FzIGVycm9uZW91c2x5CiAgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgaGVhZGVyKS4gIEEgbWVzc2FnZSB3YXMgYWxzbyBhZGRlZCB0byB0aGUKICBjb21tYW5kIGxpbmUgdG9vbCB0byBzaG93IHdoZW4gZGF0YSBpcyBiZWluZyBzZW50LCBlbmFibGVkIHdoZW4KICAtLXZlcmJvc2UgaXMgdXNlZC4KCkRhbmllbCAoMTIgT2N0b2JlciAyMDA2KQotIFN0YXJ0aW5nIG5vdywgYWRkaW5nIGFuIGVhc3kgaGFuZGxlIHRvIGEgbXVsdGkgc3RhY2sgdGhhdCB3YXMgYWxyZWFkeSBhZGRlZAogIHRvIGEgbXVsdGkgc3RhY2sgd2lsbCBjYXVzZSBDVVJMTV9CQURfRUFTWV9IQU5ETEUgdG8gZ2V0IHJldHVybmVkLgoKLSBKZWZmIFBvaGxtZXllciBoYXMgYmVlbiB3b3JraW5nIHdpdGggdGhlIGhpcGVyZmlmby5jIGV4YW1wbGUgc291cmNlIGNvZGUsCiAgYW5kIHdoaWxlIGRvaW5nIHNvIGl0IGJlY2FtZSBhcHBhcmVudCB0aGF0IHRoZSBjdXJyZW50IHRpbWVvdXQgc3lzdGVtIGZvcgogIHRoZSBzb2NrZXQgQVBJIHJlYWxseSB3YXMgYSBiaXQgYXdrd2FyZCBzaW5jZSBpdCBiZWNvbWUgcXVpdGUgc29tZSB3b3JrIHRvCiAgYmUgc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IHRpbWVvdXQgc2V0LgoKICBKZWZmIHRoZW4gcHJvdmlkZWQgdGhlIG5ldyBDVVJMTU9QVF9USU1FUkZVTkNUSU9OIHRoYXQgaXMgeWV0IGFub3RoZXIKICBjYWxsYmFjayB0aGUgYXBwIGNhbiBzZXQgdG8gZ2V0IHRvIGtub3cgd2hlbiB0aGUgZ2VuZXJhbCB0aW1lb3V0IHRpbWUKICBjaGFuZ2VzIGFuZCB0aHVzIGZvciBhbiBhcHBsaWNhdGlvbiBsaWtlIGhpcGVyZmlmby5jIGl0IG1ha2VzIGV2ZXJ5dGhpbmcgYQogIGxvdCBlYXNpZXIgYW5kIG5pY2VyLiBUaGVyZSdzIGEgQ1VSTE1PUFRfVElNRVJEQVRBIG9wdGlvbiB0b28gb2YgY291cnNlIGluCiAgZ29vZCBvbGQgbGliY3VybCB0cmFkaXRpb24uCgogIEplZmYgaGFzIGFsc28gdXBkYXRlZCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSBjb2RlIHRvIHVzZSB0aGlzIG5ld3MuCgpEYW5pZWwgKDkgT2N0b2JlciAyMDA2KQotIEJvZ2RhbiBOaWN1bGEncyBzZWNvbmQgdGVzdCBjYXNlIChwb3N0ZWQgU3VuLCAwOCBPY3QgMjAwNikgY29udmVydGVkIHRvIHRlc3QKICBjYXNlIDUzNSBhbmQgaXQgbm93IHJ1bnMgZmluZS4gQWdhaW4gYSBwcm9ibGVtIHdpdGggdGhlIHBpcGVsaW5pbmcgY29kZSBub3QKICB0YWtpbmcgYWxsIHBvc3NpYmxlIChlcnJvcikgY29uZGl0aW9ucyBpbnRvIGFjY291bnQuCgpEYW5pZWwgKDYgT2N0b2JlciAyMDA2KQotIEJvZ2RhbiBOaWN1bGEncyBoYW5naW5nIHRlc3QgY2FzZSAocG9zdGVkIFdlZCwgMDQgT2N0IDIwMDYpIHdhcyBjb252ZXJ0ZWQgdG8KICB0ZXN0IGNhc2UgNTMzIGFuZCB0aGUgdGVzdCBub3cgcnVucyBmaW5lLgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNikKLSBEbWl0cml5IFNlcmdleWV2IHByb3ZpZGVkIGFuIGV4YW1wbGUgc291cmNlIGNvZGUgdGhhdCBjcmFzaGVkIENWUyBsaWJjdXJsCiAgYnV0IHRoYXQgd29ya2VkIG5pY2VseSBpbiA3LjE1LjUuIEkgY29udmVydGVkIGl0IGludG8gdGVzdCBjYXNlIDUzMiBhbmQKICBmaXhlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDYpCi0gUmVtb3ZlZCBhIGZldyBvdGhlciBuby1sb25nZXIgcHJlc2VudCBvcHRpb25zIGZyb20gdGhlIGhlYWRlciBmaWxlLgoKLSBTdXBwb3J0IGZvciBGVFAgdGhpcmQgcGFydHkgdHJhbnNmZXJzIHdhcyByZW1vdmVkLiBIZXJlJ3Mgd2h5OgoKICBvIFRoZSByZWNlbnQgbXVsdGkgaW50ZXJmYWNlIGNoYW5nZXMgYnJva2UgaXQgYW5kIHRoZSBkZXNpZ24gb2YgdGhlIDNyZCBwYXJ0eQogICAgdHJhbnNmZXJzIG1hZGUgaXQgdmVyeSBoYXJkIHRvIGZpeCB0aGUgcHJvYmxlbXMKICBvIEl0IHdhcyBzdGlsbCBibG9ja2luZyBhbmQgdGh1cyBuYXN0eSBmb3IgdGhlIG11bHRpIGludGVyZmFjZQogIG8gSXQgd2FzIGEgbG90IG9mIGV4dHJhIGNvZGUgZm9yIGEgdmVyeSByYXJlbHkgdXNlZCBmZWF0dXJlCiAgbyBJdCBkaWRuJ3QgdXNlIHRoZSBzYW1lIGNvZGUgYXMgZm9yICJwbGFpbiIgRlRQIHRyYW5zZmVycywgc28gaXQgZGlkbid0IHdvcmsKICAgIGZpbmUgZm9yIElQdjYgYW5kIGl0IGRpZG4ndCBwcm9wZXJseSByZS11c2UgY29ubmVjdGlvbnMgYW5kIG1vcmUKICBvIFRoZXJlJ3Mgbm9ib2R5IGFyb3VuZCB3aG8ncyB3aWxsaW5nIHRvIHdvcmsgb24gYW5kIGltcHJvdmUgdGhlIGV4aXN0aW5nCiAgICBjb2RlCgogIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoaXJkIHBhcnR5IHRyYW5zZmVycyBhcmUgYmFubmVkIGZvcmV2ZXIsIG9ubHkgdGhhdAogIHRoZXkgbmVlZCB0byBiZSBkb25lIGJldHRlciBpZiB0aGV5IGFyZSB0byBiZSByZS1hZGRlZCBpbiB0aGUgZnV0dXJlLgoKICBUaGUgQ1VSTE9QVF9TT1VSQ0VfKiBvcHRpb25zIGFyZSByZW1vdmVkIGZyb20gdGhlIGxpYiBhbmQgc28gYXJlIHRoZSAtLTNwKgogIG9wdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIEZvciB0aGlzIHJlYXNvbiwgSSBhbHNvIGJ1bXBlZCB0aGUKICB2ZXJzaW9uIGluZm8gZm9yIHRoZSBsaWIuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDA2KQotIFJlcG9ydGVkIGluICMxNTYxNDcwIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTYxNDcwKSwgbGliY3VybAogIHdvdWxkIGNyYXNoIGlmIGEgYmFkIGZ1bmN0aW9uIHNlcXVlbmNlIHdhcyB1c2VkIHdoZW4gc2h1dHRpbmcgZG93biBhZnRlcgogIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKGkuZSB1c2luZyBlYXN5X2NsZWFudXAgYWZ0ZXIgbXVsdGlfY2xlYW51cCkgc28KICBwcmVjYXV0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYW55IG1vcmUgLSB0ZXN0IGNhc2UgNTI5CiAgd2FzIGFkZGVkIHRvIHZlcmlmeS4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDYpCi0gVGhlIFVSTCBpbiB0aGUgY29va2llIGphciBmaWxlIGlzIG5vdyBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBnaXZpbmcgYSA0MDQuCiAgUmVwb3J0ZWQgYnkgVGltb3RoeSBTdG9uZS4gVGhlIG5ldyBVUkwgd2lsbCB0YWtlIHRoZSB2aXNpdG9yIHRvIGEgY3VybCB3ZWIKICBzaXRlIG1pcnJvciB3aXRoIHRoZSBkb2N1bWVudC4KCkRhbmllbCAoMjQgU2VwdGVtYmVyIDIwMDYpCi0gQmVybmFyZCBMZWFrIGZpeGVkIGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpLWxpYnMuCgotIENvcnkgTmVsc29uIG1hZGUgbGliY3VybCB1c2UgdGhlIFdTQVBvbGwoKSBmdW5jdGlvbiBpZiBidWlsdCBmb3IgV2luZG93cwogIFZpc3RhIChfV0lOMzJfV0lOTlQgPj0gMHgwNjAwKQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwNikKLSBNaWtlIFByb3R0cyBhZGRlZCAtLWZ0cC1zc2wtY29udHJvbCB0byBtYWtlIGN1cmwgdXNlIEZUUC1TU0wsIGJ1dCBvbmx5CiAgZW5jcnlwdCB0aGUgY29udHJvbCBjb25uZWN0aW9uIGFuZCB1c2UgdGhlIGRhdGEgY29ubmVjdGlvbiAicGxhaW4iLgoKLSBEbWl0cml5IFNlcmdleWV2IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSBTT0NLU1s0NV0gY29kZSB3b3JrIGJldHRlcgogIGFzIGl0IG5vdyB3aWxsIHJlYWQgdGhlIGZ1bGwgZGF0YSBzZW50IGZyb20gc2VydmVycy4gVGhlIFNPQ0tTLXJlbGF0ZWQgY29kZQogIHdhcyBhbHNvIG1vdmVkIHRvIHRoZSBuZXcgbGliL3NvY2tzLmMgc291cmNlIGZpbGUuCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDA2KQotIEFkZGVkIHRlc3QgY2FzZSA1MzEgaW4gYW4gYXR0ZW1wdCB0byByZXBlYXQgYnVnIHJlcG9ydCAjMTU2MTQ3MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTYxNDcwKSB0aGF0IGlzIHNhaWQgdG8gY3Jhc2ggd2hlbiBhbgogIEZUUCB1cGxvYWQgZmFpbHMgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlLiBJdCBkaWQgbm90LCBidXQgSSBtYWRlIGEgZmFpbGVkCiAgdXBsb2FkIHN0aWxsIGFzc3VtZSB0aGUgY29udHJvbCBjb25uZWN0aW9uIHRvIGJlIGZpbmUuCgpEYW5pZWwgKDIwIFNlcHRlbWJlciAyMDA2KQotIEFybWVsIEFzc2VsaW4gZml4ZWQgcHJvYmxlbXMgd2hlbiB5b3UgZ2F2ZSBhIHByb3h5IFVSTCB3aXRoIHVzZXIgbmFtZSBhbmQKICBlbXB0eSBwYXNzd29yZCBvciBubyBwYXNzd29yZCBhdCBhbGwuIFRlc3QgY2FzZSAyNzggYW5kIDI3OSB3ZXJlIGFkZGVkIHRvCiAgdmVyaWZ5LgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIgMjAwNikKLSBBZGRlZCBkb2NzL2V4YW1wbGVzLzEwLWF0LWEtdGltZS5jIGJ5IE1pY2hhZWwgV2FsbG5lcgoKLSBBZGRlZCBkb2NzL2V4YW1wbGVzL2hpcGVyZmlmby5jIGJ5IEplZmYgUG9obG1leWVyCgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDA2KQotIEZpeGVkIG15IGJyZWFrYWdlIGZyb20gZWFybGllciB0b2RheSBzbyB0aGF0IGRvaW5nIGN1cmxfZWFzeV9jbGVhbnVwKCkgb24gYQogIGhhbmRsZSB0aGF0IGlzIHBhcnQgb2YgYSBtdWx0aSBoYW5kbGUgZmlyc3QgcmVtb3ZlcyB0aGUgaGFuZGxlIGZyb20gdGhlCiAgc3RhY2suCgotIEFkZGVkIENVUkxPUFRfU1NMX1NFU1NJT05JRF9DQUNIRSBhbmQgLS1uby1zZXNzaW9uaWQgdG8gZGlzYWJsZSBTU0wKICBzZXNzaW9uLUlEIHJlLXVzZSBvbiBkZW1hbmQgc2luY2UgdGhlcmUgb2J2aW91c2x5IGFyZSBicm9rZW4gc2VydmVycyBvdXQKICB0aGVyZSB0aGF0IG1pc2JlaGF2ZSB3aXRoIHNlc3Npb24tSURzIHVzZWQuCgotIEplZmYgUG9obG1leWVyIHByZXNlbnRlZCBhICptdWx0aV9zb2NrZXQoKS11c2luZyBwcm9ncmFtIHRoYXQgZXhwb3NlZCBhCiAgcHJvYmxlbSB3aXRoIGl0IChTSUdTRUdWLXN0eWxlKS4gSXQgY2xlYXJseSBzaG93ZWQgdGhhdCB0aGUgZXhpc3RpbmcKICBzb2NrZXQtc3RhdGUgYW5kIHN0YXRlLWRpZmZlcmVuY2UgZnVuY3Rpb24gd2Fzbid0IGdvb2QgZW5vdWdoIHNvIEkgcmV3cm90ZQogIGl0IGFuZCBjb3VsZCB0aGVuIHJlLXJ1biBKZWZmJ3MgcHJvZ3JhbSB3aXRob3V0IGFueSBjcmFzaC4gVGhlIHByZXZpb3VzCiAgdmVyc2lvbiBjbGVhcmx5IGNvdWxkIG1pc3MgdG8gdGVsbCB0aGUgYXBwbGljYXRpb24gd2hlbiBhIGhhbmRsZSBjaGFuZ2VkCiAgZnJvbSB1c2luZyBvbmUgc29ja2V0IHRvIHVzaW5nIGFub3RoZXIuCgogIFdoaWxlIEkgd2FzIGF0IGl0IChhcyBJIGNvdWxkIHVzZSB0aGlzIGFzIGEgbWVhbnMgdG8gdHJhY2sgdGhpcyBwcm9ibGVtCiAgZG93biksIEkndmUgbm93IGFkZGVkIGEgJ21hZ2ljJyBudW1iZXIgdG8gdGhlIGVhc3kgaGFuZGxlIHN0cnVjdCB0aGF0IGlzCiAgaW5pdGVkIGF0IGN1cmxfZWFzeV9pbml0KCkgdGltZSBhbmQgY2xlYXJlZCBhdCBjdXJsX2Vhc3lfY2xlYW51cCgpIHRpbWUgdGhhdAogIHdlIGNhbiB1c2UgaW50ZXJuYWxseSB0byBkZXRlY3QgdGhhdCBhbiBlYXN5IGhhbmRsZSBzZWVtcyB0byBiZSBmaW5lLCBvciBhdAogIGxlYXN0IG5vdCBjbG9zZWQgb3IgZnJlZWQgKGZyZWVpbmcgaW4gZGVidWcgYnVpbGRzIGZpbGwgdGhlIGFyZWEgd2l0aCAweDEzCiAgYnl0ZXMgYnV0IGluIG5vcm1hbCBidWlsZHMgd2UgY2FuIG9mIGNvdXJzZSBub3QgYXNzdW1lIGFueSBwYXJ0aWN1bGFyIGRhdGEKICBpbiB0aGUgZnJlZWQgYXJlYXMpLgoKRGFuaWVsICg5IFNlcHRlbWJlciAyMDA2KQotIE1pY2hlbGUgQmluaSBmaXhlZCBob3cgdGhlIGhvc3RuYW1lIGlzIHB1dCBpbiBOVExNIHBhY2thZ2VzLiBBcyBzZXJ2ZXJzCiAgZG9uJ3QgZXhwZWN0IGZ1bGx5IHF1YWxpZmllZCBuYW1lcyB3ZSBuZWVkIHRvIGN1dCB0aGVtIG9mZiBhdCB0aGUgZmlyc3QgZG90LgoKLSBQZXRlciBTeWx2ZXN0ZXIgY2xlYW5lZCB1cCBhbmQgZml4ZWQgdGhlIGdldHNvY2tuYW1lKCkgdXNlcyBpbiBmdHAuYy4gU29tZQogIG9mIHRoZW0gY2FuIGJlIGNvbXBsZXRldGx5IHJlbW92ZWQgdGhvdWdoLi4uCgpEYW5pZWwgKDYgU2VwdGVtYmVyIDIwMDYpCi0gUmF2aSBQcmF0YXAgYW5kIEkgaGF2ZSBpbXBsZW1lbnRlZCBIVFRQIFBpcGVsaW5pbmcgc3VwcG9ydC4gRW5hYmxlIGl0IGZvciBhCiAgbXVsdGkgaGFuZGxlIHVzaW5nIENVUkxNT1BUX1BJUEVMSU5JTkcgYW5kIGFsbCBIVFRQIGNvbm5lY3Rpb25zIGRvbmUgb24gdGhhdAogIGhhbmRsZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBnZXQgcGlwZWxpbmVkIGluc3RlYWQgb2YgZG9uZSBpbiBwYXJhbGxlbGwgYXMKICB0aGV5IGFyZSBwZXJmb3JtZWQgb3RoZXJ3aXNlLgoKICBBcyBhIHNpZGUtZWZmZWN0IGZyb20gdGhpcyB3b3JrLCBjb25uZWN0aW9ucyBhcmUgbm93IHNoYXJlZCBiZXR3ZWVuIGFsbCBlYXN5CiAgaGFuZGxlcyB3aXRoaW4gYSBtdWx0aSBoYW5kbGUsIHNvIGlmIHlvdSB1c2UgTiBlYXN5IGhhbmRsZXMgZm9yIHRyYW5zZmVycywKICBlYWNoIG9mIHRoZW0gY2FuIHBpY2sgdXAgYW5kIHJlLXVzZSBhIGNvbm5lY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkIGJ5CiAgYW55IG9mIHRoZSBoYW5kbGVzLCBiZSBpdCB0aGUgc2FtZSBvciBvbmUgb2YgdGhlIG90aGVycy4KCiAgVGhpcyBzZXBhcmF0aW9uIG9mIHRoZSB0aWdodCByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb25uZWN0aW9ucyBhbmQgZWFzeQogIGhhbmRsZXMgaXMgbW9zdCBub3RpY2FibGUgd2hlbiB5b3UgY2xvc2UgZWFzeSBoYW5kbGVzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgaW4KICBhIG11bHRpIGhhbmRsZSBhbmQgY2hlY2sgYW1vdW50IG9mIHVzZWQgbWVtb3J5IG9yIHdhdGNoIHRoZSBkZWJ1ZyBvdXRwdXQsIGFzCiAgdGhlcmUgYXJlIHRpbWVzIHdoZW4gbGliY3VybCB3aWxsIGtlZXAgdGhlIGVhc3kgaGFuZGxlIGFyb3VuZCBmb3IgYSB3aGlsZQogIGxvbmdlciB0byBiZSBhYmxlIHRvIGNsb3NlIGl0IHByb3Blcmx5LiBMaWtlIGZvciBzZW5kaW5nIFFVSVQgdG8gY2xvc2UgZG93bgogIGFuIEZUUCBjb25uZWN0aW9uLgoKICBUaGlzIGlzIGEgbWFqb3IgY2hhbmdlLgogIApEYW5pZWwgKDQgU2VwdGVtYmVyIDIwMDYpCi0gRG1pdHJ5IFJlY2hraW4gKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NTE0MTIpIHByb3ZpZGVkIGEKICBwYXRjaCB0aGF0IHdoaWxlIG5vdCBmaXhpbmcgdGhpbmdzIHZlcnkgbmljZWx5LCBpdCBkb2VzIG1ha2UgdGhlIFNPQ0tTNQogIHByb3h5IGNvbm5lY3Rpb24gc2xpZ2h0bHkgYmV0dGVyIGFzIGl0IG5vdyBhY2tub3dsZWRnZXMgdGhlIHRpbWVvdXQgZm9yCiAgY29ubmVjdGlvbiBhbmQgaXQgbm8gbG9uZ2VyIHNlZ2ZhdWx0cyBpbiB0aGUgY2FzZSB3aGVuIFNPQ0tTIHJlcXVpcmVzCiAgYXV0aGVudGljYXRpb24gYW5kIHlvdSBkaWQgbm90IHNwZWNpZnkgdXNlcm5hbWU6cGFzc3dvcmQuCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgZm91bmQgYW5kIGZpeGVkIGEgbXVsdGkgaW50ZXJmYWNlIGZsYXcgd2hlbiB1c2luZyBhc3luY2gKICBuYW1lIHJlc29sdmVzLiBJdCBjb3VsZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIHN0YXRlLgoKR2lzbGUgKDI5IEF1Z3VzdCAyMDA2KQotIEFkZGVkIHN1cHBvcnQgZm9yIG90aGVyIE1TLURPUyBjb21waWxlcnMgKGRlc2lkZXMgZGpncHApLiBBbGwgTVMtRE9TCiAgY29tcGlsZXIgbm93IHVzZXMgdGhlIHNhbWUgY29uZmlnLmRvcyBmaWxlIChyZW5hbWVkIHRvIGNvbmZpZy5oIGJ5CiAgbWFrZSkuIGxpYmN1cmwgbm93IGJ1aWxkcyBmaW5lIHVzaW5nIFdhdGNvbSBhbmQgTWV0YXdhcmUncyBIaWdoLUMKICB1c2luZyB0aGUgV2F0dC0zMiB0Y3AvaXAtc3RhY2suCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIENVUkxPUFRfU09DS09QVEZVTkNUSU9OIGFuZCBDVVJMT1BUX1NPQ0tPUFREQVRBIHRvCiAgYWxsb3cgYXBwbGljYXRpb25zIHRvIHNldCB0aGVpciBvd24gc29ja2V0IG9wdGlvbnMuCgpEYW5pZWwgKDI1IEF1Z3VzdCAyMDA2KQotIEFybWVsIEFzc2VsaW4gcmVwb3J0ZWQgdGhhdCB0aGUgJ3J1bm5pbmdfaGFuZGxlcycgY291bnRlciB3YXNuJ3QgdXBkYXRlZAogIHByb3Blcmx5IGlmIHlvdSByZW1vdmVkIGEgImxpdmUiIGhhbmRsZSBmcm9tIGEgbXVsdGkgaGFuZGxlIHdpdGgKICBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKS4KCkRhbmllbCAoMjIgQXVndXN0IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSByZW1haW5pbmcgbWlzdGFrZSBmcm9tIHRoZSBBdWd1c3QgMTkgVFlQRSBjaGFuZ2UuCgotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIEFsbG93U2VydmVyQ29ubmVjdCgpIGluIHRoZSBGVFAKICBjb2RlIHdoZW4gZG9pbmcgcHVyZSBpcHY2IEVQUlQgY29ubmVjdGlvbnMuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDA2KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgQXJtZWwgQXNzZWxpbiwgdGhlIEZUUCBjb2RlIG5vIGxvbmdlciByZS1pc3N1ZXMgdGhlIFRZUEUKICBjb21tYW5kIG9uIHN1YnNlcXVlbnQgcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gdW5sZXNzIGl0IGhhcyB0by4KCi0gQXJtZWwgQXNzZWxpbiBmaXhlZCBhIGNyYXNoIGluIHRoZSBGVFAgY29kZSB3aGVuIHVzaW5nIFNJTkdMRUNXRCBtb2RlIGFuZAogIGZpbGVzIGluIHRoZSByb290IGRpcmVjdG9yeS4KCi0gQW5kcmV3IEJpZ2dzIHBvaW50ZWQgb3V0IGEgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBmbGF3IHdoZXJlIGxpYmN1cmwgZGlkbid0CiAgc2VuZCB0aGUgd2hvbGUgcmVxdWVzdCBhdCBvbmNlLCBldmVuIHRob3VnaCB0aGUgRXhwZWN0OiBoZWFkZXIgd2FzIGRpc2FibGVkCiAgYnkgdGhlIGFwcGxpY2F0aW9uLiBBbiBlZmZlY3Qgb2YgdGhpcyBjaGFuZ2UgaXMgYWxzbyB0aGF0IHNtYWxsICg8IDEwMjQKICBieXRlcykgUE9TVHMgYXJlIG5vdyBhbHdheXMgc2VudCB3aXRob3V0IEV4cGVjdDogaGVhZGVyIHNpbmNlIHdlIGRlZW0gaXQKICBtb3JlIGNvc3RseSB0byBib3RoZXIgYWJvdXQgdGhhdCB0aGFuIHRoZSByaXNrIHRoYXQgd2Ugc2VuZCB0aGUgZGF0YSBpbgogIHZhaW4uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDYpCi0gQXJtZWwgQXNzZWxpbiBtYWRlIHRoZSBDVVJMT1BUX1BSRVFVT1RFIG9wdGlvbiB3b3JrIGZpbmUgZXZlbiB3aGVuCiAgQ1VSTE9QVF9OT0JPRFkgaXMgc2V0IHRydWUuIFBSRVFVT1RFIGlzIHRoZW4gcnVuIHJvdWdobHkgYXQgdGhlIHNhbWUgcGxhY2UKICBpbiB0aGUgY29tbWFuZCBzZXF1ZW5jZSBhcyBpdCB3b3VsZCBoYXZlIHJ1biBpZiB0aGVyZSB3b3VsZCd2ZSBiZWVuIGEKICB0cmFuc2Zlci4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNikKLSBGaXhlZCBhIGZsYXcgaW4gdGhlICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgdHJlYXRtZW50LiBJZiB5b3UgZGlkIHR3byBQT1NUcwogIG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCBhbGxvd2VkIHRoZSBmaXJzdCB0byB1c2UgdGhhdCBoZWFkZXIsIHlvdQogIGNvdWxkIG5vdCBkaXNhYmxlIGl0IGZvciB0aGUgc2Vjb25kIHJlcXVlc3QuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDYpCi0gRG9tZW5pY28gQW5kcmVvbGZvdW5kIGEgcXVpY2sgYnVpbGQgZXJyb3Igd2hpY2ggaGFwcGVuZWQgYmVjYXVzZQogIHNyYy9jb25maWcuaC5pbiB3YXMgbm90IGEgcHJvcGVyIGR1cGxjYXRlIG9mIGxpYi9jb25maWcuaC5pbiB3aGljaCBpdAogIHNob3VsZCd2ZSBiZWVuIGFuZCB0aGlzIHdhcyBkdWUgdG8gdGhlIG1ha2V0Z3ogc2NyaXB0IG5vdCBkb2luZyB0aGUgY3AKICBwcm9wZXJseS4KClZlcnNpb24gNy4xNS41ICg3IEF1Z3VzdCAyMDA2KQoKRGFuaWVsICgyIEF1Z3VzdCAyMDA2KQotIE1hcmsgTGVudGN6bmVyIGZpeGVkIGhvdyBsaWJjdXJsIHdhcyBub3QgcHJvcGVybHkgZG9pbmcgY2h1bmtlZCBlbmNvZGluZwogIGlmIHRoZSBoZWFkZXIgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiB3YXMgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbi4KICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTMxODM4CgpEYW5pZWwgKDEgQXVndXN0IDIwMDYpCi0gTWFjaWVqIEthcnBpdWsgZml4ZWQgYSBjcmFzaCB0aGF0IHdvdWxkIG9jY3VyIGlmIHdlIHBhc3NlZCBDdXJsX3N0cmVycm9yKCkKICBhbiB1bmtub3duIGVycm9yIG51bWJlciBvbiBnbGliYyBzeXN0ZW1zLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1MzIyODkKCkRhbmllbCAoMzEgSnVseSAyMDA2KQotICpBTEVSVCogY3VybF9tdWx0aV9zb2NrZXQoKSBhbmQgY3VybF9tdWx0aV9zb2NrZXRfYWxsKCkgZ290IG1vZGlmaWVkCiAgcHJvdG90eXBlczogdGhleSBib3RoIG5vdyBwcm92aWRlIHRoZSBudW1iZXIgb2YgcnVubmluZyBoYW5kbGVzIGJhY2sgdG8gdGhlCiAgY2FsbGluZyBmdW5jdGlvbi4gSXQgbWFrZXMgdGhlIGZ1bmN0aW9ucyByZXNlbWJsZSB0aGUgZ29vZCBvbGQKICBjdXJsX211bHRpX3BlcmZvcm0oKSBtb3JlIGFuZCBwcm92aWRlcyBhIG5pY2Ugd2F5IHRvIGtub3cgd2hlbiB0aGUgbXVsdGkKICBoYW5kbGUgZ29lcyBlbXB0eS4KCiAgQUxFUlQyOiBkb24ndCB1c2UgdGhlIGN1cmxfbXVsdGlfc29ja2V0KigpIGZ1bmN0aW9uYWxpdHkgaW4gYW55dGhpbmcKICBwcm9kdWN0aW9uLWxpa2UgdW50aWwgSSBzYXkgaXQncyBzb21ld2hhdCBzZXR0bGVkLCBhcyBJIHN1c3BlY3QgdGhlcmUgbWlnaHQKICBiZSBzb21lIGZ1cnRoZXIgQVBJIGNoYW5nZXMgYmVmb3JlIEknbSBkb25lLi4uCgpEYW5pZWwgKDI4IEp1bHkgMjAwNikKLSBZdmVzIExlamV1bmUgZml4ZWQgc28gdGhhdCByZXBsYWNpbmcgQ29udGVudC1UeXBlOiB3aGVuIGRvaW5nIG11bHRpcGFydAogIGZvcm1wb3N0cyB3b3JrIGV4YWN0bHkgdGhlIHdheSB5b3Ugd2FudCBpdCAoYW5kIHRoZSB3YXkgeW91J2QgYXNzdW1lIGl0CiAgd29ya3MpLgoKRGFuaWVsICgyNyBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYWRkZWQgLS1mdHAtc3NsLXJlcWQgd2hpY2ggbWFrZXMgY3VybCAqcmVxdWlyZSogU1NMIGZvciBib3RoCiAgY29udHJvbCBhbmQgZGF0YSBjb25uZWN0aW9uLCBhcyB0aGUgZXhpc3RpbmcgLS1mdHAtc3NsIG9wdGlvbiBvbmx5IHJlcXVlc3RzCiAgaXQuCgotIFtIaXBlci1yZWxhdGVkIHdvcmtdIEFkZGVkIGEgZnVuY3Rpb24gY2FsbGVkIGN1cmxfbXVsdGlfYXNzaWduKCkgdGhhdCB3aWxsCiAgc2V0IGEgcHJpdmF0ZSBwb2ludGVyIGFkZGVkIHRvIHRoZSBpbnRlcm5hbCBsaWJjdXJsIGhhc2ggdGFibGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgc29ja2V0IHBhc3NlZCBpbiB0byB0aGlzIGZ1bmN0aW9uOgoKICBDVVJMTWNvZGUgY3VybF9tdWx0aV9hc3NpZ24oQ1VSTE0gKm11bHRpX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9zb2NrZXRfdCBzb2NrZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNvY2twKTsKCiAgJ3NvY2twJyBiZWluZyBhIGN1c3RvbSBwb2ludGVyIHNldCBieSB0aGUgYXBwbGljYXRpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoCiAgdGhpcyBzb2NrZXQuIFRoZSBzb2NrZXQgaGFzIHRvIGJlIGFscmVhZHkgZXhpc3RpbmcgYW5kIGluLXVzZSBieSBsaWJjdXJsLAogIGxpa2UgaGF2aW5nIGFscmVhZHkgY2FsbGVkIHRoZSBjYWxsYmFjayB0ZWxsaW5nIGFib3V0IGl0cyBleGlzdGFuY2UuCgogIFRoZSBzZXQgaGFzaHAgcG9pbnRlciB3aWxsIHRoZW4gYmUgcGFzc2VkIG9uIHRvIHRoZSBjYWxsYmFjayBpbiB1cGNvbWluZwogIGNhbGxzIHdoZW4gdGhpcyBzYW1lIHNvY2tldCBpcyB1c2VkIChpbiB0aGUgYnJhbmQgbmV3ICdzb2NrZXRwJyBhcmd1bWVudCkuCgpEYW5pZWwgKDI2IEp1bHkgMjAwNikKLSBEYW4gTmVsc29uIGFkZGVkIHRoZSBDVVJMT1BUX0ZUUF9BTFRFUk5BVElWRV9UT19VU0VSIGxpYmN1cmwgb3B0aW9uIGFuZCBjdXJsCiAgdG9vbCBvcHRpb24gbmFtZWQgLS1mdHAtYWx0ZXJuYXRpdmUtdG8tdXNlci4gSXQgcHJvdmlkZXMgYSBtZWFuIHRvIHNlbmQgYQogIHBhcnRpY3VsYXIgY29tbWFuZCBpZiB0aGUgbm9ybWFsIFVTRVIvUEFTUyBhcHByb2FjaCBmYWlscy4KCi0gTWljaGFlbCBKZXJyaXMgYWRkZWQgbWFnaWMgdGhhdCBidWlsZHMgbGliL2N1cmxsaWIudmNwcm9qIGF1dG9tYXRpY2FsbHkgZm9yCiAgbmV3ZXIgTVNWQy4KCkRhbmllbCAoMjUgSnVseSAyMDA2KQotIEdlb3JnIEhvcm4gbWFkZSB0aGUgdHJhbnNmZXIgdGltZW91dCBlcnJvciBtZXNzYWdlIGluY2x1ZGUgbW9yZSBkZXRhaWxzLgoKRGFuaWVsICgyMCBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBidWlsZCBlcnJvciB3aGVuIGJ1aWxkaW5nIGxpYmN1cmwgd2l0aCBIVFRQIGRpc2FibGVkLAogIHByb2JsZW0gYWRkZWQgd2l0aCB0aGUgY3VybF9mb3JtZ2V0KCkgcGF0Y2guCgpEYW5pZWwgKDE3IEp1bHkgMjAwNikKLSBKYXJpIFN1bmRlbGwgZGlkIHNvbWUgZXhjZWxsZW50IHJlc2VhcmNoIGFuZCBidWcgdHJhY2tpbmcsIGZpZ3VyZWQgb3V0IHRoYXQKICB3ZSBkaWQgd3JvbmcgYW5kIHBhdGNoZWQgaXQ6IFdoZW4gbm9kZXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHNwbGF5IHRyZWUsCiAgYW5kIHdlIGRpZG4ndCBwcm9wZXJseSByZW1vdmUgaXQgZnJvbSB0aGUgc3BsYXkgdHJlZSB3aGVuIGFuIGVhc3kgaGFuZGxlIHdhcwogIHJlbW92ZWQgZnJvbSBhIG11bHRpIHN0YWNrIGFuZCB0aHVzIHdlIGNvdWxkIHdyb25nbHkgbGVhdmUgYSBub2RlIGluIHRoZQogIHNwbGF5IHRyZWUgcG9pbnRpbmcgdG8gKGJhZCkgbWVtb3J5LgoKRGFuaWVsICgxNCBKdWx5IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQgYSBmbGF3IHdoZXJlIHRoZSBDUkxGIGNvdW50ZXIgd2Fzbid0IHByb3Blcmx5IGNsZWFyZWQKICBmb3IgRlRQIEFTQ0lJIHRyYW5zZmVycy4KCkRhbmllbCAoOCBKdWx5IDIwMDYpCi0gQXRlcyBHb3JhbCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwncyBjb29raWUgcGFyc2VyIGRpZCBjYXNlIGluc2Vuc2l0aXZlCiAgc3RyaW5nIGNvbXBhcmlzb25zIG9uIHRoZSBwYXRoIHdoaWNoIGlzIGluY29ycmVjdCBhbmQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0CiAgZml4ZXMgdGhpcy4gSSBlZGl0ZWQgdGVzdCBjYXNlIDggdG8gaW5jbHVkZSBkZXRhaWxzIHRoYXQgdGVzdCBmb3IgdGhpcy4KCi0gSW5nbWFyIFJ1bmdlIHByb3ZpZGVkIGEgc291cmNlIHNuaXBwZXQgdGhhdCBjYXVzZWQgYSBjcmFzaC4gVGhlIHJlYXNvbiBmb3IKICB0aGUgY3Jhc2ggd2FzIHRoYXQgbGliY3VybCBpbnRlcm5hbGx5IHdhcyBhIGJpdCBjb25mdXNlZCBhYm91dCB3aG8gb3duZWQgdGhlCiAgRE5TIGNhY2hlIGF0IGFsbCB0aW1lcyBzbyBpZiB5b3UgY3JlYXRlZCBhbiBlYXN5IGhhbmRsZSB0aGF0IHVzZXMgYSBzaGFyZWQKICBETlMgY2FjaGUgYW5kIGFkZGVkIHRoYXQgdG8gYSBtdWx0aSBoYW5kbGUgaXQgd291bGQgY3Jhc2guIE5vdyB3ZSBrZWVwIG1vcmUKICBjYXJlZnVsIGludGVybmFsIHRyYWNrIG9mIGV4YWN0bHkgd2hhdCBraW5kIG9mIEROUyBjYWNoZSBlYWNoIGVhc3kgaGFuZGxlCiAgdXNlczogTm9uZSwgUHJpdmF0ZSAoYWxsb2NhdGVkIGZvciBhbmQgdXNlZCBvbmx5IGJ5IHRoaXMgc2luZ2xlIGhhbmRsZSksCiAgU2hhcmVkIChwb2ludHMgdG8gYSBjYWNoZSBoZWxkIGJ5IGEgc2hhcmVkIG9iamVjdCksIEdsb2JhbCAocG9pbnRzIHRvIHRoZQogIGdsb2JhbCBjYWNoZSkgb3IgTXVsdGkgKHBvaW50cyB0byB0aGUgY2FjaGUgd2l0aGluIHRoZSBtdWx0aSBoYW5kbGUgdGhhdCBpcwogIGF1dG9tYXRpY2FsbHkgc2hhcmVkIGJldHdlZW4gYWxsIGVhc3kgaGFuZGxlcyB0aGF0IGFyZSBhZGRlZCB3aXRoIHByaXZhdGUKICBjYWNoZXMpLgoKRGFuaWVsICg0IEp1bHkgMjAwNikKLSBUb3NoaXl1a2kgTWFlemF3YSBmaXhlZCBhIHByb2JsZW0gd2hlcmUgeW91IGNvdWxkbid0IG92ZXJyaWRlIHRoZQogIFByb3h5LUNvbm5lY3Rpb246IGhlYWRlciB3aGVuIHVzaW5nIGEgcHJveHkgYW5kIG5vdCBkb2luZyBDT05ORUNULgoKRGFuaWVsICgyNCBKdW5lIDIwMDYpCi0gTWljaGFlbCBXYWxsbmVyIGFkZGVkIGN1cmxfZm9ybWdldCgpLCB3aGljaCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZXh0cmFjdAogIChzZXJpYWxpc2UpIGEgcHJldmlvdXNseSBidWlsdCBmb3JtcG9zdCAoYXMgd2l0aCBjdXJsX2Zvcm1hZGQoKSkuCgpEYW5pZWwgKDIzIEp1bmUgMjAwNikKLSBBcnZlIEtudWRzZW4gZm91bmQgYSBmbGF3IGluIGN1cmxfbXVsdGlfZmRzZXQoKSBmb3Igc3lzdGVtcyB3aGVyZQogIGN1cmxfc29ja2V0X3QgaXMgdW5zaWduZWQgKGxpa2UgV2luZG93cykgdGhhdCBjb3VsZCBjYXVzZSBpdCB0byB3cm9uZ2x5CiAgcmV0dXJuIGEgbWF4IGZkIG9mIC0xLgoKRGFuaWVsICgyMCBKdW5lIDIwMDYpCi0gUGV0ZXIgU2lsdmEgaW50cm9kdWNlZCBDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFIGFuZAogIENVUkxPUFRfTUFYX1JFQ1ZfU1BFRURfTEFSR0UgdGhhdCBsaW1pdCB0aGEgbWF4aW11bSByYXRlIGxpYmN1cmwgaXMgYWxsb3dlZAogIHRvIHNlbmQgb3IgcmVjZWl2ZSBkYXRhLiBUaGlzIGtpbmQgb2YgYWRkcyB0aGUgdGhlIGNvbW1hbmQgbGluZSB0b29sJ3MKICBvcHRpb24gLS1saW1pdC1yYXRlIHRvIHRoZSBsaWJyYXJ5LgoKICBUaGUgcmF0ZSBsaW1pdGluZyBsb2dpYyBpbiB0aGUgY3VybCBhcHAgaXMgbm93IHJlbW92ZWQgYW5kIGlzIGluc3RlYWQKICBwcm92aWRlZCBieSBsaWJjdXJsIGl0c2VsZi4gVHJhbnNmZXIgcmF0ZSBsaW1pdGluZyB3aWxsIG5vdyBhbHNvIHdvcmsgZm9yIC1kCiAgYW5kIC1GLCB3aGljaCBpdCBkaWRuJ3QgYmVmb3JlLgoKRGFuaWVsICgxOSBKdW5lIDIwMDYpCi0gTWFkZSAtSyBvbiBhIGZpbGUgdGhhdCBjb3VsZG4ndCBiZSByZWFkIGNhdXNlIGEgd2FybmluZyB0byBiZSBkaXNwbGF5ZWQuCgpEYW5pZWwgKDEzIEp1bmUgMjAwNikKLSBEYW4gRmFuZHJpY2ggaW1wbGVtZW50ZWQgLS1lbmFibGUtaGlkZGVuLXN5bWJvbHMgY29uZmlndXJlIG9wdGlvbiB0byBlbmFibGUKICAtZnZpc2liaWxpdHk9aGlkZGVuIG9uIGdjYyA+PSA0LjAuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGxpYmN1cmwKICBiaW5hcnkgYW5kIHNwZWVkcyB1cCBkeW5hbWljIGxpbmtpbmcgYnkgaGlkaW5nIGFsbCB0aGUgaW50ZXJuYWwgc3ltYm9scyBmcm9tCiAgdGhlIHN5bWJvbCB0YWJsZS4KClZlcnNpb24gNy4xNS40ICgxMiBKdW5lIDIwMDYpCgpEYW5pZWwgKDggSnVuZSAyMDA2KQotIEJyaWFuIERlc3NlbnQgZml4ZWQgdGhlIGNvZGUgZm9yIGN5Z3dpbiBpbiB0aHJlZSBkaXN0aW5jdCB3YXlzOgoKICBUaGUgZmlyc3QgbW9kaWZpZXMge2xpYixzcmN9L3NldHVwLmggdG8gbm90IGluY2x1ZGUgdGhlIHdpbnNvY2sgaGVhZGVycwogIHVuZGVyIEN5Z3dpbi4gIFRoaXMgZml4ZXMgdGhlIHJlcG9ydGVkIGJ1aWxkIHByb2JsZW0uICBDeWd3aW4gYXR0ZW1wdHMgYXMKICBtdWNoIGFzIHBvc3NpYmxlIHRvIGVtdWxhdGUgYSBwb3NpeCBlbnZpcm9ubWVudCB1bmRlciBXaW5kb3dzLiAgVGhpcyBtZWFucwogIHRoYXQgV0lOMzIgaXMgKm5vdCogI2RlZmluZWQgYW5kICh0byB0aGUgZXh0ZW50IHBvc3NpYmxlKSBldmVyeXRoaW5nIGlzIGRvbmUKICBhcyBpdCB3b3VsZCBiZSBvbiBhICppeCB0eXBlIHN5c3RlbS4gIFRodXMgPHN5cy9zb2NrZXQuaD4gaXMgdGhlIHByb3BlcgogIGluY2x1ZGUsIGFuZCBldmVuIHRob3VnaCB3aW5zb2NrMi5oIGlzIHByZXNlbnQsIGluY2x1ZGluZyBpdCBqdXN0IGludHJvZHVjZXMKICBhIHdob2xlIGJ1bmNoIG9mIGluY29tcGF0aWJsZSBzb2NrZXQgQVBJIHN0dWZmLgoKICBUaGUgc2Vjb25kIGlzIGEgcGF0Y2ggSSd2ZSBpbmNsdWRlZCBpbiB0aGUgQ3lnd2luIGJpbmFyeSBwYWNrYWdlcyBmb3IgYQogIHdoaWxlLiAgSXQgc2tpcHMgdHdvIHVubmVjZXNzYXJ5IGxpYnJhcnkgY2hlY2tzICgtbHdpbm1tIGFuZCAtbGdkaTMyKS4gIFRoZQogIGNoZWNrcyBhcmUgaW5ub2N1b3VzIGFuZCB0aGV5IGRvIHN1Y2NlZWQsIGJ1dCB0aGV5IHBvbGx1dGUgTElCUyB3aXRoCiAgdW5uZWNlc3Nhcnkgc3R1ZmYgd2hpY2ggZ2V0cyByZWNvcmRlZCBhcyBzdWNoIGluIHRoZSBsaWJjdXJsLmxhIGZpbGUsIHdoaWNoCiAgYnJpbmdzIHRoZW0gaW50byB0aGUgYnVpbGQgb2YgYW55IGxpYmN1cmwtZG93bnN0cmVhbS4gIEFzIGZhciBhcyBJIGtub3cKICB0aGVzZSBsaWJzIGFyZSByZWFsbHkgb25seSBuZWNlc3NhcnkgZm9yIG1pbmd3LCBzbyBhbHRlcm5hdGl2ZWx5IHRoZXkgY291bGQKICBiZSBkZXNpZ25lZCB0byBvbmx5IHJ1biBpZiAkaG9zdCBtYXRjaGVzICotKi1taW5ndyogYnV0IEkgdG9vayB0aGUgc2FmZXIKICByb3V0ZSBvZiBza2lwcGluZyB0aGVtIGZvciAqLSotY3lnd2luKi4KCiAgVGhlIHRoaXJkIHBhdGNoIHJlcGxhY2VzIGFsbCB1c2VzIG9mIHRoZSBhbmNpZW50IGFuZCBvYnNvbGV0ZSBfX0NZR1dJTjMyX18KICB3aXRoIF9fQ1lHV0lOX18uIFJlZjogPGh0dHA6Ly9jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDAzLTA5L21zZzAxNTIwLmh0bWw+LgoKRGFuaWVsICg3IEp1bmUgMjAwNikKLSBNaWthZWwgU2VubmVyaG9sbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgTlRMTTIgc2Vzc2lvbiByZXNwb25zZSBzdXBwb3J0CiAgdG8gbGliY3VybC4gVGhlIDIxIE5UTE0gdGVzdCBjYXNlcyB3ZXJlIGFnYWluIG1vZGlmaWVkIHRvIGNvbXBseS4uLgoKRGFuaWVsICgyNyBNYXkgMjAwNikKLSDTc2NhciBNb3JhbGVzIFZpdvMgdXBkYXRlZCB0aGUgbGliY3VybC5mcmFtZXdvcmsubWFrZSBmaWxlLgoKRGFuaWVsICgyNiBNYXkgMjAwNikKLSBPbGFmIFN0/GJlbiBmaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBEaWdlc3QgYXV0aGVudGljYXRpb24gd2l0aCBtZDUtc2VzcyB0bwogIGZhaWwuIFdoZW4gdXNpbmcgdGhlIG1kNS1zZXNzLCB0aGUgcmVzdWx0IHdhcyBub3QgTWQ1IGVuY29kZWQgYW5kIEJhc2U2NAogIHRyYW5zZm9ybWVkLgoKRGFuaWVsICgyNSBNYXkgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyAiU0VTUyIgdG8gYmUgc2V0IHdpdGgKICBDVVJMT1BUX0NPT0tJRUxJU1QsIHdoaWNoIHRoZW4gbWFrZXMgYWxsIHNlc3Npb24gY29va2llcyBnZXQgY2xlYXJlZC4KCkRhbmllbCAoMjQgTWF5IDIwMDYpCi0gVG9yIEFybnRzZW4gbWFkZSB0ZXN0IDI3MSBydW4gZmluZSBhZ2FpbiBzaW5jZSB0aGUgVEZUUCBwYXRoIGZpeC4KCkRhbmllbCAoMjMgTWF5IDIwMDYpCi0gTWFydGluIE1pY2hsbWF5ciBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjMzY3OTU0LCBidXQgdGhlIHNhbWUgZXJyb3IgYWxzbwogIHNob3dlZCB1cCBpbiB0aGUgYXV0b2J1aWxkcy4gSXQgc2VlbXMgYSByYXRoZXIgbG9uZy1zaW5jZSBpbnRyb2R1Y2VkIHNoZWxsCiAgc2NyaXB0IGZsYXcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc3VkZGVubHkgd2FzIGRldGVjdGVkIGJ5IHRoZSBiYXNoCiAgdmVyc2lvbiBpbiBEZWJpYW4gVW5zdGFibGUuIEl0IGhhZCBwcmV2aW91c2x5IHBhc3NlZCB1bmRldGVjdGVkIGJ5IGFsbAogIHNoZWxscyB1c2VkIHNvIGZhci4uLgoKLSBEYXZpZCBNY0NyZWVkeSB1cGRhdGVkIGxpYi9jb25maWctdHBmLmgKCkRhbmllbCAoMTEgTWF5IDIwMDYpCi0gRml4ZWQgdGhlIGNvbmZpZ3VyZSdzIGNoZWNrIGZvciBvbGQtc3R5bGUgU1NMZWF5IGhlYWRlcnMgc2luY2UgSSBmZWxsIG92ZXIgYQogIGNhc2Ugd2l0aCBhIGR1cGxpY2F0ZSBmaWxlIG5hbWUgKGEga3JiNCBpbXBsZW1lbnRhdGlvbiB3aXRoIGFuIGVyci5oCiAgZmlsZSkuIEkgY29udmVydGVkIHRoZSBjaGVjayB0byBtYW51YWxseSBtYWtlIHN1cmUgdGhyZWUgb2YgdGhlIGhlYWRlcnMgYXJlCiAgcHJlc2VudCBiZWZvcmUgY29uc2lkZXJpbmcgdGhlbSBmaW5lLgoKLSBEYXZpZCBNY0NyZWVkeSBwcm92aWRlZCBhIGZpeCBmb3IgQ1VSTElORk9fTEFTVFNPQ0tFVCB0aGF0IGRvZXMgZXh0ZW5kZWQKICBjaGVja3Mgb24gdGhlIHRvLWJlLXJldHVybmVkIHNvY2tldCB0byBtYWtlIHN1cmUgaXQgdHJ1bHkgc2VlbXMgdG8gYmUgYWxpdmUKICBhbmQgd2VsbC4gRm9yIFNTTCBjb25uZWN0aW9uIGl0IChvbmx5KSB1c2VzIE9wZW5TU0wgZnVuY3Rpb25zLgoKRGFuaWVsICgxMCBNYXkgMjAwNikKLSBGaXhlZCBESUNUIGluIHR3byBhc3BlY3RzOgoKICAxIC0gYWxsb3cgcHJvcGVybHkgVVJMLWVzY2FwZWQgd29yZHMsIGxpa2UgdXNpbmcgJTIwIGZvciBzcGFjZXMKCiAgMiAtIHByb3Blcmx5IGVzY2FwZSBjZXJ0YWluIGxldHRlcnMgd2l0aGluIGEgd29yZCB0byBjb21wbHkgdG8gdGhlIFJGQzIyMjkKCkRhbmllbCAoOSBNYXkgMjAwNikKLSBBbmRyZWFzIE50YWZsb3MgcmVwb3J0ZWQgYSBidWcgaW4gbGliY3VybC5tNDogV2hlbiBjb25maWd1cmluZyBteSBHTlUKICBhdXRvdG9vbHMgcHJvamVjdCwgd2hpY2ggb3B0aW9uYWxseSAoZGVmYXVsdD15ZXMpIHVzZXMgbGliY3VybCBvbiBhIHN5c3RlbQogIHdpdGhvdXQgYSAodXNhYmxlKSBsaWJjdXJsIGluc3RhbGxhdGlvbiwgYnV0IG5vdCBzcGVjaWZ5aW5nCiAgYC0td2l0aG91dC1saWJjdXJsJywgY29uZmlndXJlIGRldGVybWluZXMgY29ycmVjdGx5IHRoYXQgbm8gbGliY3VybCBpcwogIGF2YWlsYWJsZSwgaG93ZXZlciwgdGhlIExJQkNVUkwgdmFyaWFibGUgZ2V0cyBleHBhbmRlZCB0byBgTElCQ1VSTCA9IC1sY3VybCcKICBpbiB0aGUgcmVzdWx0aW5nIE1ha2VmaWxlcy4KCiAgRGF2aWQgU2hhdyBmaXhlZCB0aGUgZmxhdy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHJlY2VudGx5IGFkZGVkIG5vbi1ibG9ja2luZyBTU0wKICBjb25uZWN0cy4gVGhlIHN0YXRlIG1hY2hpbmUgd2FzIG5vdCByZXNldCBwcm9wZXJseSBzbyB0aGF0IHN1YnNlcXVlbnQKICBjb25uZWN0cyB1c2luZyB0aGUgc2FtZSBoYW5kbGUgd291bGQgZmFpbCwgYW5kIHRoZXJlIHdlcmUgdHdvIG1lbW9yeSBsZWFrcy4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4geW91IGFkZGVkIGFuIGVhc3kgaGFuZGxlIHRvIGEKICBtdWx0aSBzdGFjayBhbmQgdGhhdCBlYXN5IGhhbmRsZSBoYWQgYWxyZWFkeSBiZWVuIHVzZWQgdG8gZG8gb25lIG9yIG1vcmUKICBlYXN5IGludGVyZmFjZSB0cmFuc2ZlcnMsIGFzIHRoZW4gdGhlIGNvZGUgdGhyZXcgYXdheSB0aGUgcHJldmlvdXNseSB1c2VkCiAgRE5TIGNhY2hlIHdpdGhvdXQgcHJvcGVybHkgZnJlZWluZyBpdC4KCkRhbmllbCAoOCBNYXkgMjAwNikKLSBEYW4gRmFuZHJpY2ggd2VudCBvdmVyIHRoZSBURlRQIGNvZGUgYW5kIGhlIHBvaW50ZWQgb3V0IGFuZCBmaXhlZCBudW1lcm91cwogIHByb2JsZW1zOgoKICAqIFRoZSByZWNlaXZlZCBmaWxlIGlzIGNvcnJ1cHRlZCB3aGVuIGEgcGFja2V0IGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKICAgICh0aGlzIGlzIGEgc2VyaW91cyBwcm9ibGVtISkKCiAgKiBUcmFuc21pdHRpbmcgYSBmaWxlIGFib3J0cyBpZiBhIGJsb2NrIGlzIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQKCiAgKiBEYXRhIGlzIHN0b3JlZCBpbiB0aGUgd3JvbmcgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlciBmb3IgdXBsb2Fkcywgc28gdXBsb2FkcwogICAgYWx3YXlzIGZhaWwgKEkgZG9uJ3Qgc2VlIGhvdyBpdCBjb3VsZCBoYXZlIGV2ZXIgd29ya2VkLCBidXQgaXQgZGlkIG9uIHg4NgogICAgYXQgbGVhc3QpCgogICogQSBudW1iZXIgb2YgY2FsbHMgYXJlIG1hZGUgdG8gc3RyZXJyb3IgaW5zdGVhZCBvZiBDdXJsX3N0cmVycm9yLCBtYWtpbmcKICAgIHRoZSBjb2RlIG5vdCB0aHJlYWQgc2FmZQoKICAqIFRoZXJlIGFyZSByZWZlcmVuY2VzIHRvIGVycm5vIGluc3RlYWQgb2YgQ3VybF9zb2NrZXJybm8oKSwgY2F1c2luZwogICAgaW5jb3JyZWN0IGVycm9yIG1lc3NhZ2VzIG9uIFdpbmRvd3MKCiAgKiBUaGUgZmlsZSBuYW1lIGluY2x1ZGVzIGEgbGVhZGluZyAvIHdoaWNoIHZpb2xhdGVzIFJGQzM2MTcuIERvaW5nIHNvbWV0aGluZwogICAgc2ltaWxhciB0byBmdHAsIHdoZXJlIHR3byBzbGFzaGVzIGFmdGVyIHRoZSBob3N0IG5hbWUgbWVhbnMgYW4gYWJzb2x1dGUKICAgIHJlZmVyZW5jZSBzZWVtcyBhIHJlYXNvbmFibGUgZXh0ZW5zaW9uIHRvIGZpeCB0aGlzLgoKICAqIEZhaWx1cmVzIGluIEVCQ0RJQyBjb252ZXJzaW9uIGFyZSBub3QgcHJvcGFnYXRlZCB1cCB0byB0aGUgY2FsbGVyIGJ1dCBhcmUKICAgIHNpbGVudGx5IGlnbm9yZWQKCi0gRml4ZWQga25vd24gYnVnICMyOC4gVGhlIFRGVFAgY29kZSBubyBsb25nZXIgYXNzdW1lcyBhIHBhY2tlZCBzdHJ1Y3QgYW5kCiAgdGh1cyB3b3JrcyByZWxpYWJseSBvbiBtb3JlIHBsYXRmb3Jtcy4KCkRhbmllbCAoNSBNYXkgMjAwNikKLSBSb2xhbmQgQmxvbSBmaWxlZCBidWcgcmVwb3J0ICMxNDgxMjE3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0ODEyMTcpLCB3aXRoIGZvbGxvdy11cHMgYnkgTWljaGVsZQogIEJpbmkgYW5kIERhdmlkIEJ5cm9uLiBsaWJjdXJsIHByZXZpb3VzbHkgd3JvbmdseSB1c2VkIEdldExhc3RFcnJvcigpIG9uCiAgd2luZG93cyB0byBnZXQgZXJyb3IgZGV0YWlscyBhZnRlciBzb2NrZXQtcmVsYXRlZCBmdW5jdGlvbiBjYWxscywgd2hlbiBpdAogIHJlYWxseSBzaG91bGQgdXNlIFdTQUdldExhc3RFcnJvcigpIGluc3RlYWQuCgogIFdoZW4gY2hhbmdpbmcgdG8gdGhpcywgdGhlIGZvcm1lciBmdW5jdGlvbiBDdXJsX291cmVycm5vKCkgaXMgbm93IGluc3RlYWQKICBjYWxsZWQgQ3VybF9zb2NrZXJybm8oKSBhcyBpdCBpcyBuZWNlc3NhcnkgdG8gb25seSB1c2UgaXQgdG8gZ2V0IGVycm5vIGZyb20KICBzb2NrZXQtcmVsYXRlZCBmdW5jdGlvbnMgYXMgb3RoZXJ3aXNlIGl0IHdvbid0IHdvcmsgYXMgaW50ZW5kZWQgb24gV2luZG93cy4KCkRhbmllbCAoNCBNYXkgMjAwNikKLSBNYXJrIEVpY2hpbiBzdWJtaXR0ZWQgYnVnIHJlcG9ydCAjMTQ4MDgyMQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDgwODIxKSBIZSBmb3VuZCBhbmQgaWRlbnRpZmllZCBhCiAgcHJvYmxlbSB3aXRoIGhvdyBsaWJjdXJsIGRlYWx0IHdpdGggR251VExTIGFuZCBhIGNhc2Ugd2hlcmUgZ251dGxzIHJldHVybmVkCiAgR05VVExTX0VfQUdBSU4gaW5kaWNhdGluZyBpdCB3b3VsZCBibG9jay4gSXQgd291bGQgdGhlbiByZXR1cm4gYW4gdW5leHBlY3RlZAogIHJldHVybiBjb2RlLCBtYWtpbmcgQ3VybF9zc2xfc2VuZCgpIGNvbmZ1c2UgdGhlIHVwcGVyIGxheWVyIC0gY2F1c2luZyByYW5kb20KICAyOCBieXRlcyB0cmFzaCBkYXRhIHRvIGdldCBpbnNlcnRlZCBpbiB0aGUgdHJhbnNmZXJlZCBzdHJlYW0uCgogIFRoZSBwcm9wZXIgZml4IHdhcyB0byBtYWtlIHRoZSBDdXJsX2d0bHNfc2VuZCgpIGZ1bmN0aW9uIHJldHVybiB0aGUgcHJvcGVyCiAgcmV0dXJuIGNvZGVzIHRoYXQgdGhlIGNhbGxlcnMgd291bGQgZXhwZWN0LiBUaGUgQ3VybF9vc3NsX3NlbmQoKSBmdW5jdGlvbgogIGFscmVhZHkgZGlkIHRoaXMuCgpEYW5pZWwgKDIgTWF5IDIwMDYpCi0gQWRkZWQgYSAtLWNoZWNrZm9yIG9wdGlvbiB0byBjdXJsLWNvbmZpZyB0byBhbGxvdyB1c2VycyB0byBlYXNpZXIKICB3cml0ZSBmb3IgZXhhbXBsZSBzaGVsbCBzY3JpcHRzIHRoYXQgdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEKICBuZXctZW5vdWdoIGxpYmN1cmwgdmVyc2lvbi4gSWYgLS1jaGVja2ZvciBpcyBnaXZlbiBhIHZlcnNpb24gc3RyaW5nCiAgbmV3ZXIgdGhhbiB3aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQsIGN1cmwtY29uZmlnIHdpbGwgcmV0dXJuIGEKICBub24temVybyBleGl0IGNvZGUgYW5kIG91dHB1dCBhIHN0cmluZyBhYm91dCB0aGUgdW5mdWxmaWxsZWQKICByZXF1aXJlbWVudC4KCkRhbmllbCAoMjYgQXByaWwgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBicm91Z2h0IGluaXRpYWwgbGluZSBlbmQgY29udmVyc2lvbnMgd2hlbiBkb2luZyBGVFAgQVNDSUkKICB0cmFuc2ZlcnMuIFRoZXkgYXJlIGRvbmUgb24gbm9uLXdpbmRvd3Mgc3lzdGVtcyBhbmQgdHJhbnNsYXRlIENSTEYgdG8gTEYuCgogIEkgbW9kaWZpZWQgdGhlIDE1IExJU1QtdXNpbmcgdGVzdCBjYXNlcyBhY2NvcmRpbmdseS4gVGhlIGRvd25zaWRlIGlzIHRoYXQgbm93CiAgd2UnbGwgaGF2ZSBldmVuIG1vcmUgdHJvdWJsZSB0byBnZXQgdGhlIHRlc3RzIHRvIHJ1biBvbiBXaW5kb3dzIHNpbmNlIHRoZXkKICBzaG91bGQgZ2V0IENSTEYgbmV3bGluZXMgbGVmdCBpbnRhY3Qgd2hpY2ggdGhlICpuaXggdmVyc2lvbnMgZG9uJ3QuIEkgZmlndXJlCiAgdGhlIG9ubHkgc2FuZSB0aGluZyB0byBkbyBpcyB0byBhZGQgc29tZSBraW5kIG9mIFtuZXdsaW5lXSBtYWNybyBmb3IgdGhlIHRlc3QKICBjYXNlIGZpbGVzIGFuZCBoYXZlIHRoZW0gZXhwYW5kZWQgdG8gdGhlIHByb3BlciBuYXRpdmUgbGluZSBlbmRpbmcgd2hlbiB0aGUKICB0ZXN0IGNhc2VzIGFyZSBydW4uIFRoaXMgaXMgaG93ZXZlciBsZWZ0IHRvIGltcGxlbWVudC4KCkRhbmllbCAoMjUgQXByaWwgMjAwNikKLSBQYXVsIFF1ZXJuYSBmaXhlZCBsaWJjdXJsIHRvIGJldHRlciBkZWFsIHdpdGggZGVmbGF0ZSBjb250ZW50IGVuY29kaW5nCiAgd2hlbiB0aGUgc3RyZWFtICh3cm9uZ2x5KSBsYWNrcyBhIHByb3BlciB6bGliIGhlYWRlci4gVGhpcyBzZWVtcyB0byBiZSB0aGUKICBjYXNlIG9uIHRvbyBtYW55IGFjdHVhbCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA2KQotIEFsZSBWZXNlbHkgZml4ZWQgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2hlbiB1c2luZyBhIGhvc3RuYW1lLgoKRGFuaWVsICgxOSBBcHJpbCAyMDA2KQotIEJhc2VkIG9uIHByZXZpb3VzIGluZm8gZnJvbSBUb3IgQXJudHNlbiwgSSBtYWRlIGNvbmZpZ3VyZSBkZXRlY3QgdGhlIEludGVsCiAgSUNDIGNvbXBpbGVyIHRvIGFkZCBhIGNvbXBpbGVyIG9wdGlvbiBmb3IgaXQsIGluIG9yZGVyIGZvciBjb25maWd1cmUgdG8KICBwcm9wZXJseSBiZSBhYmxlIHRvIGRldGVjdCBmdW5jdGlvbiBwcm90b3R5cGVzLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIGxlc3MgZWFnZXIgdG8gY2xvc2UKICB0aGUgY29udHJvbCBjb25uZWN0aW9uIHdoZW4gdXNpbmcgRlRQLCBmb3IgZXhhbXBsZSB3aGVuIHlvdSByZW1vdmUgYW4gZWFzeQogIGhhbmRsZSBmcm9tIGEgbXVsdGkgc3RhY2suCgotIEFwcGxpZWQgYSBwYXRjaCBieSBBdGVzIEdvcmFsIGFuZCBLYXRpZSBXYW5nIHRoYXQgY29ycmVjdGVkIG15IGJhZCBmaXgKICBhdHRlbXB0IGZyb20gQXByaWwgMTAuCgpEYW5pZWwgKDExIEFwcmlsIDIwMDYpCi0gIzE0NjgzMzAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0NjgzMzApIHBvaW50ZWQgb3V0IGEgYmFkCiAgdHlwZWNhc3QgaW4gdGhlIGN1cmwgdG9vbCBsZWFkaW5nIHRvIGEgY3Jhc2ggd2l0aCAoNjRiaXQ/KSBWUzIwMDUgKGF0IGxlYXN0KQogIHNpbmNlIHRoZSBzdHJ1Y3QgdGltZXZhbCBmaWVsZCB0dl9zZWMgaXMgYW4gaW50IHdoaWxlIHRpbWVfdCBpcyA2NGJpdC4KCkRhbmllbCAoMTAgQXByaWwgMjAwNikKLSBBdGVzIEdvcmFsIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBzcGVjaWZpZWQgYm90aCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUIGFuZAogIENVUkxPUFRfVElNRU9VVCwgdGhlIF9sb25nZXJfIHRpbWUgd291bGQgd3JvbmdseSBiZSB1c2VkIGZvciB0aGUgU1NMCiAgY29ubmVjdGlvbiB0aW1lLW91dCEKCi0gSSBtZXJnZWQgbXkgaGlwZXIgcGF0Y2ggKGh0dHA6Ly9jdXJsLmhheHguc2UvbGliY3VybC9oaXBlci8pIGludG8gdGhlIG1haW4KICBzb3VyY2VzLiBTZWUgdGhlIGxpYi9SRUFETUUubXVsdGlfc29ja2V0IGZvciBpbXBsZW1lbnRhdGlvbiBzdG9yeSB3aXRoCiAgZGV0YWlscy4gRG9uJ3QgZXhwZWN0IGl0IHRvIHdvcmsgZnVsbHkgeWV0LiBJIGRvbid0IGludGVuZCB0byBibG93IGFueQogIHdoaXN0bGVzIG9yIHJpbmcgYW55IGJlbGxzIGFib3V0IGl0IHVudGlsIEknbSBtb3JlIGNvbnZpbmNlZCBpdCB3b3JrcyBhdAogIGxlYXN0IHNvbWV3aGF0IHJlbGlhYmx5LgoKRGFuaWVsICg3IEFwcmlsIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkncyBFQkNESUMgYW5kIFRQRiBjaGFuZ2VzLiBUaHJlZSBuZXcgY3VybF9lYXN5X3NldG9wdCgpCiAgb3B0aW9ucyAoY2FsbGJhY2tzKSB3ZXJlIGFkZGVkOgoKICBDT05WX0ZST01fTkVUV09SS19GVU5DVElPTgogIENPTlZfVE9fTkVUV09SS19GVU5DVElPTgogIENPTlZfRlJPTV9VVEY4X0ZVTkNUSU9OCgpEYW5pZWwgKDUgQXByaWwgMjAwNikKLSBNaWNoZWxlIEJpbmkgbW9kaWZpZWQgdGhlIE5UTE0gY29kZSB0byB3b3JrIGZvciBoaXMgIndlaXJkIElJUyBjYXNlIgogIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDYtMDIvMDE1NC5odG1sKSBieSBhZGRpbmcgdGhlIE5UTE0gaGFzaAogIGZ1bmN0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBMTSBvbmUgYW5kIG1ha2luZyBzb21lIG90aGVyIGFkanVzdG1lbnRzIGluIHRoZQogIG9yZGVyIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGRhdGEgYmxvY2sgYXJlIHNlbnQgaW4gdGhlIFR5cGUtMiByZXBseS4KICBJbnNwaXJhdGlvbiBmb3IgdGhpcyB3b3JrIHdhcyB0YWtlbiBmcm9tIHRoZSBGaXJlZm94IE5UTE0gaW1wbGVtZW50YXRpb24uCgogIEkgZWRpdGVkIHRoZSBleGlzdGluZyAyMSghKSBOVExNIHRlc3QgY2FzZXMgdG8gcnVuIGZpbmUgd2l0aCB0aGVzZSBuZXdzLiBEdWUKICB0byB0aGUgZmFjdCB0aGF0IHdlIG5vdyBwcm9wZXJseSBpbmNsdWRlIHRoZSBob3N0IG5hbWUgaW4gdGhlIFR5cGUtMiBtZXNzYWdlCiAgdGhlIHRlc3QgY2FzZXMgbm93IG9ubHkgY29tcGFyZSBwYXJ0cyBvZiB0aGF0IGNodW5rLgoKRGFuaWVsICgyOCBNYXJjaCAyMDA2KQotICMxNDUxOTI5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDUxOTI5KSBkZXRhaWxlZCBhIGJ1ZyB0aGF0CiAgb2NjdXJyZWQgd2hlbiBhc2tpbmcgbGliY3VybCB0byBmb2xsb3cgSFRUUCByZWRpcmVjdHMgYW5kIHRoZSBvcmlnaW5hbCBVUkwKICBoYWQgbW9yZSB0aGFuIG9uZSBxdWVzdGlvbiBtYXJrICg/KS4gQWRkZWQgdGVzdCBjYXNlIDI3NiB0byB2ZXJpZnkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDYpCi0gRGF2aWQgQnlyb24gZm91bmQgYSBwcm9ibGVtIG11bHRpcGxlIC1kIG9wdGlvbnMgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoCiAgLS1lbmFibGUtZGVidWcsIGFzIHRoZW4gY3VybCB1c2VkIGZyZWUoKSBvbiBtZW1vcnkgYWxsb2NhdGVkIGJvdGggd2l0aAogIG5vcm1hbCBtYWxsb2MoKSBhbmQgd2l0aCBsaWJjdXJsLXByb3ZpZGVkIGZ1bmN0aW9ucywgd2hlbiB0aGUgbGF0dGVyIE1VU1QgYmUKICBmcmVlZCB3aXRoIGN1cmxfZnJlZSgpIGluIGRlYnVnIGJ1aWxkcy4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNikKLSBUb3IgQXJudHNlbiBmaWd1cmVkIG91dCB0aGF0IFRGVFAgd2FzIGJyb2tlbiBvbiBhIGxvdCBvZiBzeXN0ZW1zIHNpbmNlIHdlCiAgY2FsbGVkIGJpbmQoKSB3aXRoIGEgdG9vIGJpZyBhcmd1bWVudCBpbiB0aGUgM3JkIHBhcmFtZXRlciBhbmQgYXQgbGVhc3QKICBUcnU2NCwgQUlYIGFuZCBJUklYIHNlZW0gdG8gYmUgdmVyeSBwaWNreSBhYm91dCBpdC4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCBDVVJMSU5GT19GVFBfRU5UUllfUEFUSC4KCi0gWGF2aWVyIEJvdWNob3V4IG1hZGUgdGhlIFNTTCBjb25uZWN0aW9uIG5vbi1ibG9ja2luZyBmb3IgdGhlIG11bHRpIGludGVyZmFjZQogICh3aGVuIHVzaW5nIE9wZW5TU0wpLgoKLSBUb3IgQXJudHNlbiBmaXhlZCB0aGUgQUlYIFRvb2xib3ggUlBNIHNwZWMKCkRhbmllbCAoMjAgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBsaWJjdXJsIHRvIG5vIGxvbmdlciBpZ25vcmUgQVVUSCBmYWlsdXJlcyBhbmQgbm93IGl0CiAgcmVhY3RzIHByb3Blcmx5IGFjY29yZGluZyB0byB0aGUgQ1VSTE9QVF9GVFBfU1NMIHNldHRpbmcuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0d28gVEZUUCBwcm9ibGVtczogRml4ZWQgYSBidWcgd2hlcmVieSBhIHJlY2VpdmVkIGZpbGUKICB3aG9zZSBsZW5ndGggd2FzIGEgbXVsdGlwbGUgb2YgNTEyIGJ5dGVzIGNvdWxkIGhhdmUgcmFuZG9tIGdhcmJhZ2UKICBhcHBlbmRlZC4gQWxzbywgc3RvcCBwcm9jZXNzaW5nIFRGVFAgcGFja2V0cyB3aGljaCBhcmUgdG9vIHNob3J0IHRvIGJlCiAgbGVnYWwuCgotIElsamEgdmFuIFNwcnVuZGVsIHJlcG9ydGVkIGEgcG9zc2libGUgY3Jhc2ggaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHVzaW5nCiAgImN1cmwgaG9zdHdpdGhvdXRzbGFzaCAtZCBkYXRhIC1HIgoKVmVyc2lvbiA3LjE1LjMgKDIwIE1hcmNoIDIwMDYpCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDYpCi0gVlVMTkVSQUJJTElUWSByZXBvcnRlZCB0byB1cyBieSBVbGYgSGFybmhhbW1hci4KCiAgbGliY3VybCB1c2VzIHRoZSBnaXZlbiBmaWxlIHBhcnQgb2YgYSBURlRQIFVSTCBpbiBhIG1hbm5lciB0aGF0IGFsbG93cyBhCiAgbWFsaWNpb3VzIHVzZXIgdG8gb3ZlcmZsb3cgYSBoZWFwLWJhc2VkIG1lbW9yeSBidWZmZXIgZHVlIHRvIHRoZSBsYWNrIG9mCiAgYm91bmRhcnkgY2hlY2suCgogIFRoaXMgb3ZlcmZsb3cgaGFwcGVucyBpZiB5b3UgcGFzcyBpbiBhIFVSTCB3aXRoIGEgVEZUUCBwcm90b2NvbCBwcmVmaXgKICAoInRmdHA6Ly8iKSwgdXNpbmcgYSB2YWxpZCBob3N0IGFuZCBhIHBhdGggcGFydCB0aGF0IGlzIGxvbmdlciB0aGFuIDUxMgogIGJ5dGVzLgoKICBUaGUgYWZmZWN0ZWQgZmxhdyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGEgcmVkaXJlY3QsIGlmIGN1cmwvbGliY3VybCBpcyB0b2xkIHRvCiAgZm9sbG93IHJlZGlyZWN0cyBhbmQgYW4gSFRUUCBzZXJ2ZXIgcG9pbnRzIHRoZSBjbGllbnQgdG8gYSB0ZnRwIFVSTCB3aXRoIHRoZQogIGNoYXJhY3RlcmlzdGljcyBkZXNjcmliZWQgYWJvdmUuCgogIFRoZSBDb21tb24gVnVsbmVyYWJpbGl0aWVzIGFuZCBFeHBvc3VyZXMgKENWRSkgcHJvamVjdCBoYXMgYXNzaWduZWQgdGhlIG5hbWUKICBDVkUtMjAwNi0xMDYxIHRvIHRoaXMgaXNzdWUuCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDYpCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBSUE0gc3BlYyBmaWxlIGZvciBBSVggVG9vbGJveCwgdGhhdCBub3cgaXMgaW5jbHVkZWQKICBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxNCBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkOgoKICBhIGJhZCBTU0wgZXJyb3IgbWVzc2FnZSB3aGVuIE9wZW5TU0wgY2VydGlmaWNhdGVzIGFyZSB2ZXJpZmllZCBmaW5lLgoKICBhIG1pc3NpbmcgcmV0dXJuIGNvZGUgYXNzaWdubWVudCBpbiB0aGUgRlRQIGNvZGUKCkRhbmllbCAoNyBNYXJjaCAyMDA2KQotIE1hcmt1cyBLb2V0dGVyIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICMzNTU3MTUgd2hpY2ggaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIG11bHRpLXBhcnQgZm9ybXBvc3RzLiBUaGUgZml4IGZyb20gRmVicnVhcnkKICAyMm5kIGNvdWxkIG1ha2UgdGhlIEN1cmxfZG9uZSgpIGZ1bmN0aW9uIGdldCBjYWxsZWQgdHdpY2Ugb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCBpdCB3YXMgbm90IGRlc2lnbmVkIGZvciB0aGF0IGFuZCB0aHVzIHRyaWVkIHRvIGNhbGwgZnJlZSgpIG9uCiAgYW4gYWxyZWFkeSBmcmVlZCBtZW1vcnkgYXJlYSEKCi0gUGV0ZXIgSGV1Y2hlcnQgbWFkZSBzdXJlIHRoZSBDVVJMRlRQU1NMX0NPTlRST0wgc2V0dGluZyBmb3IgQ1VSTE9QVF9GVFBfU1NMCiAgaXMgdXNlZCBwcm9wZXJseS4KCkRhbmllbCAoNiBNYXJjaCAyMDA2KQotIExvdHMgb2YgdXNlcnMgb24gV2luZG93cyBoYXZlIHJlcG9ydGVkIGdldHRpbmcgdGhlICJTU0w6IGNvdWxkbid0IHNldAogIGNhbGxiYWNrIiBlcnJvciBtZXNzYWdlIHNvIEkndmUgbm93IG1hZGUgdGhlIHNldHRpbmcgb2YgdGhhdCBjYWxsYmFjayBub3QgYmUKICBhcyBjcml0aWNhbCBhcyBiZWZvcmUuIFRoZSBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGFkZGl0aW9uYWwgbG9nZ2dpbmcvCiAgdHJhY2UgYW55d2F5IHNvIGEgZmFpbHVyZSBqdXN0IG1lYW5zIHNsaWdodGx5IGxlc3MgZGF0YS4gSXQgc2hvdWxkIHN0aWxsIGJlCiAgYWJsZSB0byBwcm9jZWVkIGFuZCBjb25uZWN0IGZpbmUgdG8gdGhlIHNlcnZlci4KCkRhbmllbCAoNCBNYXJjaCAyMDA2KQotIFRob21hcyBLbGF1c25lciBwcm92aWRlZCBhIHBhdGNoIHdyaXR0ZW4gYnkgVG9kZCBWaWVybGluZyBpbiBidWcgcmVwb3J0CiAgIzE0NDI0NzEgdGhhdCBmaXhlcyBhIGJ1aWxkIHByb2JsZW0gb24gSW50ZXJpeC4KCkRhbmllbCAoMiBNYXJjaCAyMDA2KQotIEZUUCB1cGxvYWQgd2l0aG91dCBhIGZpbGUgbmFtZSBwYXJ0IGluIHRoZSBVUkwgbm93IGNhdXNlcwogIGN1cmxfZWFzeV9wZXJmb3JtKCkgdG8gcmV0dXJuIENVUkxFX1VSTF9NQUxGT1JNQVQuIFByZXZpb3VzbHkgaXQgYWxsb3dlZCB0aGUKICB1cGxvYWQgYnV0IG5hbWVkIHRoZSBmaWxlICIobmlsKSIgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFRlc3QgY2FzZSA1MjQKICB2ZXJpZmllcy4KCi0gQWRkZWQgYSBjaGVjayBmb3IgZ2V0cHJvdG9ieW5hbWUgaW4gY29uZmlndXJlIHNvIHRoYXQgaXQnbGwgYmUgdXNlZCwgdGhhbmtzCiAgdG8gR2lzbGUgVmFuZW0ncyBjaGFuZ2UgdGhlIG90aGVyIGRheS4KCkRhbmllbCAoMjggRmVicnVhcnkgMjAwNikKLSBEYW4gRmFuZHJpY2ggcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIHN0dWNrIGluIGFuIGVuZGxlc3MgbG9vcCBpbiBjYXNlIHdlCiAgYXJlIG91dCBvZiBmaWxlIGhhbmRsZXMgdmVyeSBlYXJseSBpbiBjdXJsJ3MgY29kZSB3aGVyZSBpdCBtYWtlcyBzdXJlIHRoYXQKICAwLCAxIGFuZCAyIGFyZW4ndCBnb25uYSBiZSB1c2VkIGJ5IHRoZSBsaWIgZm9yIHRyYW5zZmVycy4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNikKLSBNYXJ0eSBLdWhydCBwb2ludGVkIG91dCB0aGF0IHRoZXJlIHdlcmUgdHdvIFZNUy1zcGVjaWZpYyBmaWxlcyBtaXNzaW5nIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZS4KClZlcnNpb24gNy4xNS4yICgyNyBGZWJydWFyeSAyMDA2KQoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA2KQotIExvdHMgb2Ygd29yayBhbmQgYW5hbHlzaXMgYnkgInhieF9fXyIgaW4gYnVnICMxNDMxNzUwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0MzE3NTApIGhlbHBlZCBtZSBpZGVudGlmeSBhbmQgZml4IHR3bwogIGRpZmZlcmVudCBidXQgcmVsYXRlZCBidWdzOgoKICAxKSBSZW1vdmluZyBhbiBlYXN5IGhhbmRsZSBmcm9tIGEgbXVsdGkgaGFuZGxlIGJlZm9yZSB0aGUgdHJhbnNmZXIgaXMgZG9uZQogICAgIGNvdWxkIGxlYXZlIGEgY29ubmVjdGlvbiBpbiB0aGUgY29ubmVjdGlvbiBjYWNoZSBmb3IgdGhhdCBoYW5kbGUgdGhhdCBpcwogICAgIGluIGEgc3RhdGUgdGhhdCBpc24ndCBzdWl0YWJsZSBmb3IgcmUtdXNlLiBBIHN1YnNlcXVlbnQgcmUtdXNlIGNvdWxkIHRoZW4KICAgICByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIgYW5kIHNlZ2ZhdWx0LgoKICAyKSBXaGVuIGFuIGVhc3kgaGFuZGxlIHdhcyByZW1vdmVkIGZyb20gdGhlIG11bHRpIGhhbmRsZSwgdGhlcmUgY291bGQgYmUgYW4KICAgICBvdXRzdGFuZGluZyBjLWFyZXMgRE5TIG5hbWUgcmVzb2x2ZSByZXF1ZXN0LiBXaGVuIHRoZSByZXNwb25zZSBhcnJpdmVkLAogICAgIGl0IGNhdXNlZCBoYXZvYyBzaW5jZSB0aGUgY29ubmVjdGlvbiBzdHJ1Y3QgaXQgImJlbG9uZ2VkIiB0byBjb3VsZCd2ZQogICAgIGJlZW4gZnJlZWQgYWxyZWFkeS4KCiAgTm93IEN1cmxfZG9uZSgpIGlzIGNhbGxlZCB3aGVuIGFuIGVhc3kgaGFuZGxlIGlzIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZQogIHByZS1tYXR1cmVseSAodGhhdCBpcywgYmVmb3JlIHRoZSB0cmFuc2ZlciB3YXMgY29tcGx0ZXRlZCkuIEN1cmxfZG9uZSgpIGFsc28KICBtYWtlcyBzdXJlIHRvIGNhbmNlbCBhbGwgKGlmIGFueSkgb3V0c3RhbmRpbmcgYy1hcmVzIHJlcXVlc3RzLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA2KQotIFBldGVyIFN1IGFkZGVkIHN1cHBvcnQgZm9yIFNPQ0tTNCBwcm94aWVzLiBFbmFibGUgdGhpcyBieSBzZXR0aW5nIHRoZSBwcm94eQogIHR5cGUgdG8gdGhlIGFscmVhZHkgcHJvdmlkZWQgdHlwZSBDVVJMUFJPWFlfU09DS1M0LgoKICBJIGFkZGVkIGEgLS1zb2NrczQgb3B0aW9uIHRoYXQgd29ya3MgbGlrZSB0aGUgY3VycmVudCAtLXNvY2tzNSBvcHRpb24gYnV0CiAgaW5zdGVhZCB1c2UgdGhlIHNvY2tzNCBwcm90b2NvbC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNikKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIGFuIGlzc3VlIHdpdGggbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbiBhbmQgY29tcHJlc3NlZAogIGNvbnRlbnQgd2hlbiBsaWJjdXJsIGRpZG4ndCBob25vciB0aGUgaW50ZXJuYWwgaWdub3JlYm9keSBmbGFnLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA2KQotIFVsZiBI5HJuaGFtbWFyIGZpeGVkIGEgZm9ybWF0IHN0cmluZyAocHJpbnRmIHN0eWxlKSBwcm9ibGVtIGluIHRoZSBOZWdvdGlhdGUKICBjb2RlLiBJdCBzaG91bGQgaG93ZXZlciBub3QgYmUgdGhlIGNhdXNlIG9mIGFueSB0cm91Ymxlcy4gSGUgYWxzbyBmaXhlZCBhCiAgZmV3IHNpbWlsYXIgcHJvYmxlbXMgaW4gdGhlIEhUVFAgdGVzdCBzZXJ2ZXIgY29kZS4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNikKLSBTaG11bGlrIFJlZ2V2IHByb3ZpZGVkIGEgZml4IGZvciB0aGUgRE5TIGNhY2hlIHdoZW4gdXNpbmcgc2hvcnQgbGlmZSB0aW1lcywKICBhcyBwcmV2aW91c2x5IGl0IGNvdWxkIGJlIGhvbGRpbmcgb24gdG8gb2xkIGNhY2hlZCBlbnRyaWVzIGxvbmdlciB0aGFuCiAgcmVxdWVzdGVkLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA2KQotIEthcmwgTW9lcmRlciBhZGRlZCB0aGUgQ1VSTE9QVF9DT05ORUNUX09OTFkgYW5kIENVUkxJTkZPX0xBU1RTT0NLRVQgb3B0aW9ucwogIHRoYXQgYW4gYXBwIGNhbiB1c2UgdG8gbGV0IGxpYmN1cmwgb25seSBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3QgYW5kIHRoZW4KICBleHRyYWN0IHRoZSBzb2NrZXQgZnJvbSBsaWJjdXJsLiBsaWJjdXJsIHdpbGwgdGhlbiBub3QgYXR0ZW1wdCB0byBkbyBhbnkKICB0cmFuc2ZlciBhdCBhbGwgYWZ0ZXIgdGhlIGNvbm5lY3QgaXMgZG9uZS4KCi0gS2VudCBCb29ydHogaW1wcm92ZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgR251VExTIHRvIHByb3Blcmx5IHNldCBMSUJTCiAgaW5zdGVhZCBvZiBMREZMQUdTLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDYpCi0gUGhpbGlwcGUgVmF1Y2hlciBwcm92aWRlZCBhIGJyaWxsaWFudCBwaWVjZSBvZiB0ZXN0IGNvZGUgdGhhdCBzaG93IGEgcHJvYmxlbQogIHdpdGggcmUtdXNlZCBGVFAgY29ubmVjdGlvbnMuIElmIHRoZSBzZWNvbmQgcmVxdWVzdCBvbiB0aGUgc2FtZSBjb25uZWN0aW9uCiAgd2FzIHNldCBub3QgdG8gZmV0Y2ggYSAiYm9keSIsIGxpYmN1cmwgY291bGQgZ2V0IGNvbmZ1c2VkIGFuZCBjb25zaWRlciBpdCBhbgogIGF0dGVtcHQgdG8gdXNlIGEgZGVhZCBjb25uZWN0aW9uIGFuZCB3b3VsZCBnbyBhY3RpbmcgbWlnaHR5IHN0cmFuZ2UuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNikKLSBNYWtlIC0tbGltaXQtcmF0ZSBbbnVtXSBtZWFuIGJ5dGVzLiBJdCB1c2VkIHRvIGJlIHRoYXQgYnV0IGl0IGJyb2tlIGluIG15CiAgY2hhbmdlIGRvbmUgaW4gTm92ZW1iZXIgMjAwNS4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDA2KQotIEFkZGVkIENVUkxPUFRfTE9DQUxQT1JUIGFuZCBDVVJMT1BUX0xPQ0FMUE9SVFJBTkdFIHRvIGxpYmN1cmwuIFNldCB3aXRoIHRoZQogIGN1cmwgdG9vbCB3aXRoIC0tbG9jYWwtcG9ydC4gUGxhaW4gYW5kIHNpbXBseSBzZXQgdGhlIHJhbmdlIG9mIHBvcnRzIHRvIGJpbmQKICB0aGUgbG9jYWwgZW5kIG9mIGNvbm5lY3Rpb25zIHRvLiBJbXBsZW1lbnRlZCBvbiB0byBwb3B1bGFyIGRlbWFuZC4KCi0gQmFzZWQgb24gYW4gZXJyb3IgcmVwb3J0IGJ5IFBoaWxpcHBlIFZhdWNoZXIsIHdlIG5vIGxvbmdlciBjb3VudCBhIHJldHJpZWQKICBjb25uZWN0aW9uIHNldHVwIGFzIGEgZm9sbG93LXJlZGlyZWN0LiBJdCB0dXJucyBvdXQgMSkgdGhpcyBmYWlscyB3aGVuIGEgRlRQCiAgY29ubmVjdGlvbiBpcyByZS1zZXR1cCBhbmQgMikgaXQgZG9lcyBtYWtlIHRoZSBtYXgtcmVkaXJzIGNvdW50ZXIgYmVoYXZlCiAgd3JvbmcuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwNikKLSBNaWNoYWwgTWFyZWsgcHJvdmlkZWQgYSBwYXRjaCBmb3IgRlRQIHRoYXQgbWFrZXMgbGliY3VybCBjb250aW51ZSB0byB0cnkKICBQQVNWIGV2ZW4gYWZ0ZXIgRVBTViByZXR1cm5lZCBhIHBvc2l0aXZlIHJlc3BvbnNlIGNvZGUsIGlmIGxpYmN1cmwgZmFpbGVkIHRvCiAgY29ubmVjdCB0byB0aGUgcG9ydCBudW1iZXIgdGhlIEVQU1YgcmVzcG9uc2Ugc2FpZC4gT2J2aW91c2x5IHNvbWUgcGVvcGxlIGFyZQogIGdvaW5nIHRocm91Z2ggcHJvdG9jb2wtc2Vuc2l0aXZlIGZpcmV3YWxscyAob3Igc2ltaWxhcikgdGhhdCBkb24ndAogIHVuZGVyc3RhbmQgRVBTViBhbmQgdGhlbiB0aGV5IGRvbid0IGFsbG93IHRoZSBzZWNvbmQgY29ubmVjdGlvbiB1bmxlc3MgUEFTVgogIHdhcyB1c2VkLiBUaGlzIGFsc28gY2FsbGVkIGZvciBhIG1pbm9yIGZpeCBvZiB0ZXN0IGNhc2UgMjM4LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDYpCi0gRHVhbmUgQ2F0aGV5IHdhcyBvbmUgb2Ygb3VyIGZyaWVuZHMgd2hvIHJlcG9ydGVkIHRoYXQgY3VybCAtUCBbSVBdCiAgKENVUkxPUFRfRlRQUE9SVCkgZGlkbid0IHdvcmsgZm9yIGlwdjYtZW5hYmVkIGN1cmxzIGlmIHRoZSBJUCB3YXNuJ3QgYQogICJuYXRpdmUiIElQIHdoaWxlIGl0IHdvcmtzIGZpbmUgZm9yIGlwdjYtZGlzYWJsZWQgYnVpbGRzIQoKICBJbiB0aGUgcHJvY2VzcyBvZiBmaXhpbmcgdGhpcywgSSByZW1vdmVkIHRoZSBzdXBwb3J0IGZvciBMUFJUIHNpbmNlIEkgY2FuJ3QKICB0aGluayBvZiBtYW55IHJlYXNvbnMgdG8ga2VlcCBkb2luZyBpdCBhbmQgYXNraW5nIG9uIHRoZSBtYWlsaW5nIGxpc3QgZGlkbid0CiAgcmV2ZWFsIGFueW9uZSBlbHNlIHRoYXQgY291bGQgZWl0aGVyLiBUaGUgY29kZSB0aGF0IHNlbmRzIEVQUlQgYW5kIFBPUlQgaXMKICBub3cgYWxzbyBhIGxvdCBzaW1wbGVyIHRoYW4gYmVmb3JlIChJTUhPKS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA2KQotIEpvbiBUdXJuZXIgcG9pbnRlZCBvdXQgdGhhdCBkb2luZyAtUCBbaG9zdG5hbWVdIChDVVJMT1BUX0ZUUFBPUlQpIHdpdGggY3VybAogIChidWlsdCBpcHY0LW9ubHkpIGRpZG4ndCB3b3JrLgoKRGFuaWVsICgxOCBKYW51YXJ5IDIwMDYpCi0gQXMgcmVwb3J0ZWQgaW4gYnVnICMxNDA4NzQyIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDA4NzQyKSwKICB0aGUgY29uZmlndXJlIHNjcmlwdCBjb21wbGFpbmVkIGFib3V0IGEgbWlzc2luZyAibWlzc2luZyIgc2NyaXB0IGlmIHlvdSByYW4KICBjb25maWd1cmUgd2l0aGluIGEgcGF0aCB3aG9zZSBuYW1lIGluY2x1ZGVkIG9uZSBvciBtb3JlIHNwYWNlcy4gVGhpcyBpcyBkdWUKICB0byBhIGZsYXcgaW4gYXV0b21ha2UgKDEuOS42IGFuZCBlYXJsaWVyKS4gSSd2ZSBub3cgd29ya2VkIGFyb3VuZCBpdCBieQogIGluY2x1ZGluZyBhbiAib3ZlcmxvYWRlZCIgdmVyc2lvbiBvZiB0aGUgQU1fTUlTU0lOR19IQVNfUlVOIHNjcmlwdCB0aGF0J2xsCiAgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvbmUgYXV0b21ha2Ugc2hpcHMgd2l0aC4gVGhpcyBrbHVkZ2UgbmVlZHMgdG8gYmUKICByZW1vdmVkIG9uY2Ugd2UgZ2V0IGFuIGF1dG9tYWtlIHZlcnNpb24gd2l0aCB0aGlzIHByb2JsZW0gY29ycmVjdGVkLgogIFBvc3NpYmx5IHdlJ2xsIHRoZW4gbmVlZCB0byBjb252ZXJ0IHRoaXMgaW50byBhIGtsdWRnZSBkZXBlbmRpbmcgb24gd2hhdAogIGF1dG9tYWtlIHZlcnNpb24gdGhhdCBpcyB1c2VkIGFuZCB0aGF0IGlzIGdvbm5hIGJlIHBhaW5mdWwgYW5kIEkgZG9uJ3QgZXZlbgogIHdhbnQgdG8gdGhpbmsgYWJvdXQgdGhhdCBub3cuLi4hCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwNikKLSBEYXZpZCBTaGF3OiBIZXJlIGlzIHRoZSBsYXRlc3QgbGliY3VybC5tNCBhdXRvY29uZiB0ZXN0cy4gSXQgaXMgdXBkYXRlZCB3aXRoCiAgdGhlIGxhdGVzdCBmZWF0dXJlcyBhbmQgcHJvdG9jb2xzIHRoYXQgbGliY3VybCBzdXBwb3J0cyBhbmQgaGFzIGEgbWlub3IgZml4CiAgdG8gYmV0dGVyIGRlYWwgd2l0aCB0aGUgb2JzY3VyZSBjYXNlIHdoZXJlIHNvbWVvbmUgaGFzIG1vcmUgdGhhbiBvbmUgbGliY3VybAogIGluc3RhbGxlZCBhdCB0aGUgc2FtZSB0aW1lLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDYpCi0gRGF2aWQgU2hhdyBmaW5hbGx5IHJlbW92ZWQgYWxsIHRyYWNlcyBvZiBHb3BoZXIgYW5kIHdlIGFyZSBub3cgb2ZmaWNpYWxseQogIG5vdCBzdXBwb3J0aW5nIGl0LiBJdCBoYXNuJ3QgYmVlbiBmdW5jdGlvbmluZyBmb3IgeWVhcnMgYW55d2F5LCBzbyB0aGlzIGlzCiAganVzdCBmaW5hbGx5IHN0YXRpbmcgd2hhdCBhbHJlYWR5IHdhcyB0cnVlLiBBbmQgYSBjbGVhbnVwIGF0IHRoZSBzYW1lIHRpbWUuCgotIEJyeWFuIEhlbmRlcnNvbiB0dXJuZWQgdGhlICdpbml0aWFsaXplZCcgdmFyaWFibGUgZm9yIGN1cmxfZ2xvYmFsX2luaXQoKQogIGludG8gYSBjb3VudGVyLCBhbmQgdGh1cyB5b3UgY2FuIG5vdyBkbyBtdWx0aXBsZSBjdXJsX2dsb2JhbF9pbml0KCkgYW5kIHlvdQogIGFyZSB0aGVuIHN1cHBvc2VkIHRvIGRvIHRoZSBzYW1lIGFtb3VudCBvZiBjYWxscyB0byBjdXJsX2dsb2JhbF9jbGVhbnVwKCkuCiAgQnJ5YW4gaGFzIGFsc28gdXBkYXRlZCB0aGUgZG9jcyBhY2NvcmRpbmdseS4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA2KQotIEFuZHJldyBCZW5oYW0gZml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgdGVzdCBzdWl0ZSB0aGF0IGNvdWxkIGNhdXNlIHRoZQogIHRlc3Qgc2NyaXB0IHRvIGtpbGwgYWxsIHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzIGdyb3VwIQoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDYpCi0gTWljaGFlbCBKYWhuOgoKICBGaXhlZCBGVFBfU0tJUF9QQVNWX0lQIGFuZCBGVFBfVVNFX0VQU1YgdG8gImRvIHJpZ2h0IiB3aGVuIHVzZWQgb24gRlRQIHRocnUKICBIVFRQIHByb3h5LgoKICBGaXhlZCBQUk9YWVRVTk5FTCB0byB3b3JrIGZpbmUgd2hlbiB5b3UgZG8gZnRwIHRocm91Z2ggYSBwcm94eS4gIEl0IHdvdWxkCiAgcHJldmlvdXNseSBvdmVyd3JpdGUgaW50ZXJuYWwgbWVtb3J5IGFuZCBjYXVzZSB1bnByZWRpY3RlZCBiZWhhdmlvdXIhCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNikKLSBJIGRlY2lkZWQgdG8gZG9jdW1lbnQgdGhlICJzZWNyZXQgb3B0aW9uIiBoZXJlIG5vdywgYXMgSSd2ZSByZWNlaXZlZCAqTk8qCiAgZmVlZGJhY2sgYXQgYWxsIG9uIG15IG1haWxpbmcgbGlzdCByZXF1ZXN0cyBmcm9tIE5vdmVtYmVyIDIwMDU6CgogIEknbSBsb29raW5nIGZvciBmZWVkYmFjayBhbmQgY29tbWVudHMuIEkgYWRkZWQgc29tZSBleHBlcmltZW50YWwgY29kZSB0aGUKICBvdGhlciBkYXksIHRoYXQgYWxsb3dzIGEgbGliY3VybCB1c2VyIHRvIHNlbGVjdCB3aGF0IG1ldGhvZCBsaWJjdXJsIHNob3VsZAogIHVzZSB0byByZWFjaCBhIGZpbGUgb24gYSBGVFAoUykgc2VydmVyLgoKICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIENWUyBjb2RlIGFuZCBpbiByZWNlbnQgZGFpbHkgc25hcHNob3RzLgoKICBMZXQgbWUgZXhwbGFpbi4uLgoKICBUaGUgY3VycmVudCBuYW1lIGZvciB0aGUgb3B0aW9uIGlzIENVUkxPUFRfRlRQX0ZJTEVNRVRIT0QgKC0tZnRwLW1ldGhvZCBmb3IKICB0aGUgY29tbWFuZCBsaW5lIHRvb2wpIGFuZCB5b3Ugc2V0IGl0IHRvIGEgbG9uZyAodGhlcmUgYXJlIGN1cnJlbmx5IG5vCiAgZGVmaW5lcyBmb3IgdGhlIGFyZ3VtZW50IHZhbHVlcywganVzdCBwbGFpbiBudW1lcmljYWxzKS4gWW91IGNhbiBzZXQgdGhyZWUKICBkaWZmZXJlbnQgIm1ldGhvZHMiIHRoYXQgZG8gdGhpczoKCiAgMSBtdWx0aWN3ZCAtIGxpa2UgdG9kYXksIGN1cmwgd2lsbCBkbyBhIHNpbmdsZSBDV0Qgb3BlcmF0aW9uIGZvciBlYWNoIHBhdGgKICAgICAgICAgICBwYXJ0IGluIHRoZSBnaXZlbiBVUkwuIEZvciBkZWVwIGhpZXJhcmNoaWVzIHRoaXMgbWVhbnMgdmVyeSBtYW55CiAgICAgICAgICAgY29tbWFuZHMuIFRoaXMgaXMgaG93IFJGQzE3Mzggc2F5cyBpdCBzaG91bGQgYmUgZG9uZS4gVGhpcyBpcyB0aGUKICAgICAgICAgICBkZWZhdWx0LgoKICAyIG5vY3dkIC0gbm8gQ1dEIGF0IGFsbCBpcyBkb25lLCBjdXJsIHdpbGwgZG8gU0laRSwgUkVUUiwgU1RPUiBldGMgYW5kIGdpdmUKICAgICAgICAgICBhIGZ1bGwgcGF0aCB0byB0aGUgc2VydmVyLgoKICAzIHNpbmdsZWN3ZCAtIG1ha2Ugb25lIENXRCB3aXRoIHRoZSBmdWxsIHRhcmdldCBkaXJlY3RvcnkgYW5kIHRoZW4gb3BlcmF0ZQogICAgICAgICAgICBvbiB0aGUgZmlsZSAibm9ybWFsbHkiLgoKICAoV2l0aCB0aGUgY29tbWFuZCBsaW5lIHRvb2wgeW91IGRvIC0tZnRwLW1ldGhvZCBbTUVUSE9EXSwgd2hlcmUgW01FVEhPRF0gaXMKICBvbmUgb2YgIm11bHRpY3dkIiwgIm5vY3dkIiBvciAic2luZ2xlY3dkIi4pCgogIFdoYXQgZmVlZGJhY2sgSSdtIGludGVyZXN0ZWQgaW46CgogIDEgLSBEbyB0aGV5IHdvcmsgYXQgYWxsPyBEbyB5b3UgZmluZCBzZXJ2ZXJzIHdoZXJlIG9uZSBvZiB0aGVzZSBkb24ndCB3b3JrPwoKICAyIC0gV2hhdCB3b3VsZCBwcm9wZXIgbmFtZXMgZm9yIHRoZSBvcHRpb24gYW5kIGl0cyBhcmd1bWVudHMgYmUsIGlmIHdlCiAgICAgIGNvbnNpZGVyIHRoaXMgZmVhdHVyZSBnb29kIGVub3VnaCB0byBnZXQgaW5jbHVkZWQgYW5kIGRvY3VtZW50ZWQgaW4KICAgICAgdXBjb21pbmcgcmVsZWFzZXM/CgogIDMgLSBTaG91bGQgd2UgbWFrZSBsaWJjdXJsIGFibGUgdG8gIndhbGsgdGhyb3VnaCIgdGhlc2Ugb3B0aW9ucyBpbiBjYXNlIG9mCiAgICAgIChwYXRoIHJlbGF0ZWQpIGZhaWx1cmVzLCBvciBzaG91bGQgaXQgZmFpbCBhbmQgbGV0IHRoZSB1c2VyIHJlZG8gYW55CiAgICAgIHBvc3NpYmxlIHJldHJpZXM/CgogIChUaGlzIG9wdGlvbiBpcyBub3QgZG9jdW1lbnRlZCBpbiBhbnkgbWFuIHBhZ2UganVzdCB5ZXQgc2luY2UgSSdtIG5vdCBzdXJlCiAgdGhlc2UgbmFtZXMgd2lsbCBiZSB1c2VkIG9yIGlmIHRoZSBmdW5jdGlvbmFsaXR5IHdpbGwgZW5kIHVwIGV4YWN0bHkgbGlrZQogIHRoaXMuICBBbmQgZm9yIHRoZSBzYW1lIHJlYXNvbnMgd2UgaGF2ZSBubyB0ZXN0IGNhc2VzIGZvciB0aGVzZSB5ZXQuKQoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDYpCi0gV2hlbiB1c2luZyBhIGJhZCBwYXRoIG92ZXIgRlRQLCBhcyBpbiB3aGVuIGxpYmN1cmwgY291bGRuJ3QgQ1dEIGludG8gYWxsCiAgZ2l2ZW4gc3ViZGlycywgbGliY3VybCB3b3VsZCBzdGlsbCAicmVtZW1iZXIiIHRoZSBmdWxsIHBhdGggYXMgaWYgaXQgaXMgdGhlCiAgY3VycmVudCBkaXJlY3RvcnkgbGliY3VybCBpcyBpbiBzbyB0aGF0IHRoZSBuZXh0IGN1cmxfZWFzeV9wZXJmb3JtKCkgd291bGQKICBnZXQgcmVhbGx5IGNvbmZ1c2VkIGlmIGl0IHRyaWVkIHRoZSBzYW1lIHBhdGggYWdhaW4gLSBhcyBpdCB3b3VsZCBub3QgaXNzdWUKICBhbnkgQ1dEIGNvbW1hbmRzIGF0IGFsbCwgYXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBpbiB0aGUgInByb3BlciIgZGlyLgoKICBTdGFydGluZyBub3csIGEgZmFpbGVkIENXRCBjb21tYW5kIHNldHMgYSBmbGFnIHRoYXQgcHJldmVudHMgdGhlIHBhdGggdG8gYmUKICAicmVtZW1iZXJlZCIgYWZ0ZXIgcmV0dXJuaW5nLgoKRGFuaWVsICg3IEphbnVhcnkgMjAwNikKLSBNaWNoYWVsIEphaG4gZml4ZWQgc28gdGhhdCB0aGUgc2Vjb25kIENPTk5FQ1Qgd2hlbiBkb2luZyBGVFAgb3ZlciBhIEhUVFAKICBwcm94eSBhY3R1YWxseSB1c2VkIGEgbmV3IGNvbm5lY3Rpb24gYW5kIG5vdCBzZW50IHRoZSBzZWNvbmQgcmVxdWVzdCBvbiB0aGUKICBmaXJzdCBzb2NrZXQhCgpEYW5pZWwgKDYgSmFudWFyeSAyMDA2KQotIEFsZXhhbmRlciBMYXppYyBtYWRlIHRoZSBidWlsZGNvbmYgcnVuIHRoZSBidWlsZGNvbmYgaW4gdGhlIGFyZXMgZGlyIGlmIHRoYXQKICBpcyBwcmVzZW50IGluc3RlYWQgb2YgdHJ5aW5nIHRvIG1pbWljIHRoYXQgc2NyaXB0IGluIGN1cmwncyBidWlsZGNvbmYKICBzY3JpcHQuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDA2KQotIEFuZHJlcyBHYXJjaWEgbWFkZSB0aGUgVEZUUCB0ZXN0IHNlcnZlciBidWlsZCB3aXRoIG1pbmd3Lgo=