ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiB3cm90ZSBhIG1ha2VmaWxlIGZvciBidWlsZGluZyBTb2xhcmlzIHBhY2thZ2VzLgoKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBmaXhlcyBmb3IgJ2J1aWxkY29uZicgKHRoZSBidWlsZC1mcm9tLUNWUyB0b29sKSBhbmQKICB3ZSBkaXNjdXNzZWQgYW5kIGFkZGVkIGEgZmV3IENVUkxfR0xPQkFMXyogZmxhZ3MgaW4gaW5jbHVkZS9jdXJsLmgKCi0gS2pldGlsIEphY29ic2VuIHByaXZhdGVseSBhbm5vdW5jZWQgaGlzIHB5dGhvbiBpbnRlcmZhY2UgdG8gbGliY3VybCwKICBhdmFpbGFibGUgYXQgaHR0cDovL3B5Y3VybC5zb3VyY2Vmb3JnZS5uZXQvCgpEYW5pZWwgKDI5IE1heSAyMDAxKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHN0cnRvaygpIHByb2JsZW0gaW4gbGliY3VybC4gSXQgaXMgbm90IGEgdGhyZWFkLQogIHNhZmUgZnVuY3Rpb24uIE5vdyBjb25maWd1cmUgY2hlY2tzIGZvciBhIHRocmVhZC1zYWZlIHZlcnNpb24sIGFuZAogIGxpYi9zdHJ0b2suYyBvZmZlcnMgb25lIGZvciB0aGUgc3lzdGVtcyB0aGF0IGRvbid0IGNvbWUgd2l0aCBvbmUgaW5jbHVkZWQhCgotIE1ldHRndXQgSmFtYWxsYSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdhcyB3cml0dGVuCiAgdG8gc3RkZXJyIGV2ZW4gdGhvdWdoIC0tc3RkZXJyIHJlZGlyZWN0aW9uIHdhcyB1c2VkLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEkgbW92ZWQgb3V0IHRoZSBsaXN0IG9mIGNvbnRyaWJ1dG9ycyBmcm9tIHRoZSBjdXJsLjEgbWFuIHBhZ2UgYW5kIG1hZGUgYQogIHNlcGFyYXRlIGRvY3MvVEhBTktTIGZpbGUuIEl0IG1ha2VzIHRoZSBsaXN0IGVhc2llciB0byBmaW5kLCBhbmQgbWFkZSBpdAogIGVhc2llciBmb3IgbWUgdG8gbWFrZSBhIHNlcGFyYXRlIHdlYiBwYWdlIHdpdGggdGhhdCBzYW1lIGluZm9ybWF0aW9uLgoKICBJIHJlYWxseSBkbyB3YW50IGFsbCB5b3UgZ3V5cyBtZW50aW9uZWQgaW4gdGhlcmUgdG8gZmVlbCB5b3UgZ2V0IHRoZSBjcmVkaXQKICB5b3UgZGVzZXJ2ZS4KCi0gbGliL2Vhc3kuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBpbiB0aGUgNy44LXByZTEgZHVlIHRvIGEgc2lsbHkgbWlzdGFrZQoKVmVyc2lvbiA3LjgtcHJlMQoKRGFuaWVsICgyOCBNYXkgMjAwMSkKLSBjdXJsLWNvbmZpZyBub3cgc3VwcG9ydHMgJy0tdmVybnVtJyB0aGF0IG91dHB1dHMgYSBwbGFpbiBoZXhhZGVjaW1hbCB2ZXJzaW9uCiAgb2YgdGhlIGxpYmN1cmwgdmVyc2lvbiBudW1iZXIgKHVzaW5nIDggYml0cyBmb3IgZWFjaCAzIG51bWJlcnMpLiBWZXJzaW9uCiAgNy43LjQgYXBwZWFycyBhcyAwNzA3MDQKCi0gV3JvdGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dsb2JhbF9pbml0IGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwLi4uCgotIFQuIEJoYXJhdGggYnJvdWdodCBuZXdzIGFib3V0IHRoZSB1c2FnZSBvZiB0aGUgT3BlblNTTCBpbnRlcmZhY2UgdGhhdCB3YXMKICBub3QgcHJldmlvdXNseSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIHRodXMgY2F1c2VkIGxpYmN1cmwgdG8gbGVhawogIG1lbW9yeS4gIFRoZSBvbmx5IHNvbWV3aGF0IHNhbmUgYXBwcm9hY2ggdG8gZml4IHRoaXMgZGlsZW1tYSwgaXMgYWRkaW5nIHR3bwogIHR3byBuZXcgZnVuY3Rpb25zIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgY3VybF9nbG9iYWxfY2xlYW51cCgpIHRoYXQgc2hvdWxkCiAgYmUgY2FsbGVkICpPTkNFKiBieSB0aGUgYXBwbGljYXRpb24gdXNpbmcgbGliY3VybC4gVGhlIGluaXQgc2hvdWxkIGJlIGRvbmUKICBvbmx5IGF0IHN0YXJ0dXAsIG5vIG1hdHRlciBob3cgbWFueSB0aHJlYWRzIHRoZSBhcHBsaWNhdGlvbiBpcyBnb25uYSB1c2UsCiAgYW5kIHRoZSBjbGVhbnVwIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaGFzIGZpbmlzaGVkIHVzaW5nCiAgbGliY3VybCBjb21wbGV0ZWx5LgoKICAqKiogVVBHUkFERSBOT1RJQ0UgKioqCgogIElmIHlvdSB3cml0ZSBhcHBsaWNhdGlvbnMgdXNpbmcgbGliY3VybCwgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgdHdvCiAgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZSAhISEKCiAgSSBjYW4ndCBzYXkgSSB0aGluayB0aGlzIGlzIGEgdmVyeSBiZWF1dGlmdWwgc29sdXRpb24sIGJ1dCBhcyBPcGVuU1NMCiAgaW5zaXN0cyBvbiBtYWtpbmcgbG90cyBvZiBzdHVmZiBvbiBhICJnbG9iYWwiIHNjb3BlLCB3ZSdyZSBmb3JjZWQgdG8gd2FsawogIHRoZSBwYXRoIHRoZXkgcG9pbnQgdXMgdG8uCgotIE1vdmluZyBtb3JlIHRlc3QgY2FzZXMgaW50byB0aGUgbmV3IGZpbGUgZm9ybWF0LgoKVmVyc2lvbiA3LjcuNC1wcmUzCgpEYW5pZWwgKDIzIE1heSAyMDAxKQotIEludHJvZHVjZWQgYSBuZXcgZmlsZSBmb3JtYXQgZm9yIHN0b3JpbmcgdGVzdCBjYXNlcywgYW5kIHRodXMgSSBoYWQgdG8KICBtb2RpZnkgYWxsIHRoZSBwZXJsIHRlc3Qgc2NyaXB0cyBhbmQgbW9yZSAoSSBhZGRlZCBhIG5ldyBvbmUpLiBJIGhhdmUgbm90CiAgInBvcnRlZCIgYWxsIHRoZSBvbGQgdGVzdCBjYXNlcyB0byB0aGUgbmV3IGZvcm1hdCB5ZXQsIGJ1dCBpdCdsbCBjb21lLgoKICBUaGUgbWFpbiBhZHZhbnRhZ2Ugb2YgdGhpcyBuZXcgZm9ybWF0IGlzIHRoYXQgYWxsIHRlc3QgZGF0YSBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBpcyBzdG9yZWQgaW4gYSBzaW5nbGUgZmlsZS4gSXQgZ2l2ZXMgYSBiZXR0ZXIgb3ZlcnZpZXcgZm9yIGVhY2ggdGVzdAogIGNhc2UgYW5kIGEgbG90IGxlc3MgZmlsZXMuCgotIEFuZHLpcyBHYXJj7WEgYnJvdWdodCBhIGZpeCBmb3IgdGhlIG5ldHNjYXBlL21vemlsbGEgY29va2llIGZpbGUgcGFyc2luZwogIGZ1bmN0aW9uLCBhcyBpdCB0dXJucyBvdXQgaXQgZG9lc24ndCBhbHdheXMgc3RvcmUgdGhlIHBhdGghCgpEYW5pZWwgKDIyIE1heSAyMDAxKQotIEFzIHdhcyByZXBvcnRlZCBhbm9ueW1vdXNseSwgd2hlbiBGQUlMT05FUlJPUiB3YXMgdXNlZCwgdGhlIGh0dHBjb2RlIHdhcwogIG5vdCBzdG9yZWQgcHJvcGVybHkgYW5kIHRodXMgd2Fzbid0IHBvc3NpYmx5IHRvIHJlYWQgYWZ0ZXIgYSB0cmFuc2ZlciB3aXRoCiAgdGhlIGN1cmxfZWFzeV9nZXRpbmZvKCkgZnVuY3Rpb24uIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSW5zdGFsbGVkIGFuZCBtYWRlIHVzZSBvZiB0aGUgZm9sbG93aW5nIHRvb2wgdmVyc2lvbnM6CiAgICBhdXRvY29uZiAyLjUwCiAgICBsaWJ0b29sIDEuNAogICAgYXV0b21ha2UgMS40LXAxCgogIEkgd291bGRuJ3QgcmVjb21tZW5kIGFueSBkZXZlbG9wZXIgdG8gdHJ5IHRvIGdlbmVyYXRlIHRoaW5ncyB3aXRoIG9sZGVyCiAgdmVyc2lvbnMgdGhhbiB0aGVzZS4gQnVpbGRpbmcgZnJvbSBDVlMgd2lsbCBwcm9iYWJseSBtb3JlIG9yIGxlc3MgcmVxdWlyZQogIGF0IGxlYXN0IHRoZXNlIHZlcnNpb25zLgoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBncmV3IHRvIG1vcmUgdGhhbiBkb3VibGUgaXRzCiAgcHJldmlvdXMgc2l6ZSEKCiAgQXJrYWRpdXN6IE1pc2tpZXdpY3ogaGVscGVkIG1lIGJ5IHBvaW50aW5nIG91dCBJIGhhZCB0byByZW1vdmUgbXkKICBhY2luY2x1ZGUubTQgZmlsZSBiZWZvcmUgSSBjb3VsZCBnZXQgaXQgd29ya2luZyEKCkRhbmllbCAoMjEgTWF5IDIwMDEpCi0gSSBtYWRlIGZ0cHM6Ly8gd29yay4gQWRkZWQgdGVzdCBjYXNlIDQwMCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLCBhcyB0aGUKICBmaXJzdCBmdHBzOi8vIHRlc3QgY2FzZS4gUmVxdWlyZXMgc3R1bm5lbC4KCi0gQWxzbyBtYWRlIHRoZSB0ZXN0IGNhc2VzIHRoYXQgcnVucyBzc2wgdGVzdHMgbm90IHJ1biBpZiBsaWJjdXJsIGlzbid0IGJ1aWx0CiAgd2l0aCBzc2wgc3VwcG9ydC4KCkRhbmllbCAoMTkgTWF5IDIwMDEpCi0gTWFkZSB0aGUgY29uZmlndXJlIG5vdCBhZGQgYW55IGV4dHJhIC1MIExERkxBR1Mgb3IgLUkgQ1BQRkxBR1MgdW5sZXNzIHRoZXkKICBhcmUgYWN0dWFsbHkgbmVlZGVkLiBBbGJlcnQgQ2hpbidzIGFuZCBEb21lbmljbyBBbmRyZW9saSdzIHN1Z2dlc3Rpb25zCiAgaGVscGVkIG91dC4KClZlcnNpb24gNy43LjQtcHJlMgoKRGFuaWVsICgxOCBNYXkgMjAwMSkKLSBOaWNlciBjb25maWd1cmUtY2hlY2sgZm9yIHRoZSBPcGVuU1NMIGhlYWRlcnMsIHdoaWNoIHRoZW4gc2V0cyB0aGUgcHJvcGVyCiAgdmFyaWFibGUgdG8gaGF2ZSBjdXJsLWNvbmZpZyBiZSBnb29kLiAoQWxiZXJ0IENoaW4gcHJvdmlkZWQgdGhlIGZpeCkKCi0gRm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoZWl3IG93biAnc3RybGNhdCgpJyBsaWJjdXJsIHByb3ZpZGVzIGl0cyBvd24uCiAgSXQgd2FzIG5vdyByZW5hbWVkIHRvIHByZXZlbnQgY29sbGlkZXMgd2l0aCBvdGhlciBsaWJzLiAoQWZ0ZXIgZGlzY3Vzc2lvbnMKICB3aXRoIFN0ZXJsaW5nIEh1Z2hlcyBhbmQgdGhlIGltcGxpY2F0aW9ucyB0aGlzIGhhZCBvbiBQSFAgYnVpbGRzLikKCkRhbmllbCAoMTcgTWF5IDIwMDEpCi0gQ29sbSBCdWNrbGV5IHBvc3RlZCBhIGRldGFpbGVkIGJ1ZyByZXBvcnQgb24gKHRoZSBkZWJpYW5pemVkKSA3LjcuMywgdGhhdAogIHR1cm5lZCBvdXQgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIGRlYmlhbi1idWlsdCA3LjcuMy1wYWNrYWdlIHRoYXQKICBjb250YWluZWQgZmlsZXMgZnJvbSB0aGUgNy43LjIgcmVsZWFzZSEKCi0gSSBhZGRlZCB0aGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBhZ2FpbiwgYnV0IHdpdGggYSBmYWtlIHZhbHVlLCBqdXN0IHRvCiAgbWFrZSBwcm9ncmFtcyB0aGF0IHVzZSBpdCwgbm90IGZhaWwgd2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGlzIHZlcnNpb24gb2YKICBsaWJjdXJsLgoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBQYXdlbCBBLiBHYWpkYSBmaXhlZCBhIHByb2JsZW0gd2l0aCByZXN1bWVkIHRyYW5zZmVycyBvbiByZS11c2VkIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucy4KClZlcnNpb24gNy43LjQtcHJlMQoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZml4ZWQgRlRQIFBPUlQgZm9yIElQdjYtZW5hYmxlZCBsaWJjdXJsLgoKLSBBZGRlZCB0aGUgZmlyc3QgSFRUUFMgdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxMiBNYXkgMjAwMSkKLSBKdWtrYSBQaWhsIHN1Z2dlc3RlZCB0aGF0IGlmIChsaWIpY3VybCBpcyB0b2xkIHRvIHZlcmlmeSB0aGUgcGVlcidzCiAgY2VydGlmaWNhdGUgYW5kIHRoZSBwZWVyIGNhbid0IGJlIHZlcmlmaWVkLCBpdCBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIGEKICBwcm9wZXIgZXJyb3IgY29kZS4gSSBhZGRlZCBhIGJyYW5kIG5ldyBlcnJvciBjb2RlIG5hbWVkCiAgQ1VSTEVfU1NMX1BFRVJfQ0VSVElGSUNBVEUgZm9yIHRoaXMgcHVycG9zZS4KCkRhbmllbCAoMTEgTWF5IDIwMDEpCi0gQXMgd2FzIGRpc2N1c3NlZCB3aXRoIEZyZWRlcmljIExlcGllZCBhIHdoaWxlIGFnbywgSSBub3cgbWFkZSBsaWJjdXJsIG5vdAogIHJldHVybiBlcnJvciBldmVuIHRob3VnaCBubyBkYXRhIHdhcyB0cmFuc2ZlcmVkIG9uIHVwbG9hZC9kb3dubG9hZCByZXN1bWUKICB3aGVuIHRoZSBubyB0cmFuc2ZlciBpcyBuZWVkZWQuIFRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGVycm9yIHdhcyByZW1vdmVkCiAgZnJvbSB0aGUgaGVhZGVyIGZpbGUgdG8gbWFrZSBhbnkgaW1wbGVtZW5hdG9yIHRoYXQgdXNlcyB0aGF0IHRvIGJlIGF3YXJlIG9mCiAgdGhlIGZhY3QgdGhhdCBpdCBjYW4ndCBiZSByZXR1cm5lZCBhbnltb3JlIQoKLSBJbXByb3ZlZCBnZW5lcmFsIGhlYWRlci1wYXJzaW5nIHRvIGJldHRlciBhbGxvdyB3aGl0ZSBzcGFjZXMgYW5kIG1vcmUuCgotIFJvZG5leSBTaW1tb25zIHByb3ZlZCB0aGUgZml4IEkgZGlkIHllc3RlcmRheSB3YXMgYmFkIGFuZCBJIGhhZCB0byBwb3N0CiAgYW5vdGhlciBvbmUuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSB0d28gcmVkaXJlY3QgcHJvYmxlbXMgbW9yZSEKICAKRGFuaWVsICgxMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgY29ycmVjdGx5IG5vdGVkIHRoYXQgdGhlIHNwYWNlLWFmdGVyLWhlYWRlciBwcm9ibGVtIHdpdGgKICBMb2NhdGlvbjogaXMgcHJlc2VudCBvbiBzZXZlcmFsIG90aGVyIHBsYWNlcyBpbiB0aGUgbGliY3VybCBzb3VyY2VzLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogIGhlYWRlcnMgd2l0aCBhbiBleHRyYSBzcGFjZSBhZnRlciB0aGUgY29sb24uCgotIFJvZG5leSBTaW1tb25zIGZvdW5kIG91dCB0aGF0IG11bHRpcGxlIEZUUCB0cmFuc2ZlcnMgZGlkIG5vdCB0cmVhdCByZWxhdGl2ZQogIGRpcmVjdG9yaWVzIGNvcnJlY3RseS4KCkRhbmllbCAoOSBNYXkgMjAwMSkKLSBHZXR0aW5nIGFuIEZUUCBmaWxlIHdpdGggQ1VSTE9QVF9OT0JPRFkgc2V0IChvciAtSSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLAogIG1ha2VzIGN1cmwgdXNlIHRoZSBub24tc3RhbmRhcmQgZnRwIGNvbW1hbmQgIlNJWkUiLiBJZiBpdCBmYWlsZWQsIGxpYmN1cmwKICByZXR1cm5lZCBlcnJvci4gU3RhcnRpbmcgbm93LCBpdCBqdXN0IGRvbid0IG91dHB1dCB0aGUgZmlsZSBzaXplIGluc3RlYWQuCiAgQW5vbnltb3VzIGJ1ZyByZXBvcnQuCgotIHN0dW5uZWwucG0gd2FzIGFjY2lkZW50YWxseSBsZWZ0IG91dCBmcm9tIHRoZSByZWxlYXNlIGFyY2hpdmUsIGl0IGlzIG5vdwogIGFkZGVkIChzdHVubmVsIGlzIG5lZWRlZCB0byBydW4gdGhlIGh0dHBzLXRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlKQogIApEYW5pZWwgKDcgTWF5IDIwMDEpCi0gQ29ycmVjdGVkIHR3byBtaW5vciBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGhlIEZJTEUgKiB0byB2b2lkICogY29udmVyc2lvbgogIHRoYXQgSSBtaXNzZWQgYXQgdHdvIHBsYWNlcy4gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHBhdGNoZXMuIFNhbmRlciBHYXRlcwogIGZpbGVkIGEgYnVnIHJlcG9ydCBvbiB0aGlzLgoKVmVyc2lvbiA3LjcuMwoKRGFuaWVsICg0IE1heSAyMDAxKQotIEFsbCBjYWxsYmFjayBmdW5jdGlvbnMgbm93IHRha2UgJ3ZvaWQgKicgaW5zdGVhZCBvZiAnRklMRSAqJy4gVGhpcyBpcyBtYWRlCiAgdGhpcyB3YXkgdG8gbWFrZSBpdCBtb3JlIG9idmlvdXMgdG8gcGVvcGxlIHRoYXQgYW55dGhpbmcgY2FuIGJlIHBhc3NlZCB0bwogIHRoZW0gKGJ5IHVzaW5nIHRoZSBhcHJvcHJpYXRlIG9wdGlvbikuIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggU3RlcmxpbmcKICBIdWdoZXMuCgpEYW5pZWwgKDMgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBwcm9ibGVtIHdpdGggcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gdGhhdCBtYWRlIGxpYmN1cmwgZmFpbCBpZiB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHVzZWQgbWl4ZWQKICBjaHVua2VkIGFuZCBub24tY2h1bmtlZCB0cmFuc2ZlcnMuCgotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGJhZCB0cmVhdG1lbnQgb2YgMzA0LXJlcGxpZXMsIGFzIHRoZXkgd291bGQgbm90IGJlCiAgdHJlYXRlZCBhcyBjb250ZW50LWxlbmd0aCAwIHJlcGxpZXMgYnV0IHdvdWxkIGNhdXNlIGEgImhhbmciIHVudGlsIHRoZQogIHNlcnZlciB0aW1lZC1vdXQgYW5kIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgZG9jcy9leGFtcGxlcy9NYWtlZmlsZS5hbQoKRGFuaWVsICgyNyBBcHJpbCAyMDAxKQotIFVwZGF0ZWQgdGhlIElOVEVSQUxTIGRvY3VtZW50IGFnYWluLiBJdCB3YXMgbGFnZ2luZyBhIGJpdC4gSSB0aGluayBJIG1hZGUgaXQKICBtb3JlIGVhc3kgdG8gZm9sbG93IG5vdyBhcyB3ZWxsLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuIGN1cmwgcmVjZWl2ZWQKICBhICJDb250ZW50LUxlbmd0aDogMCIgaGVhZGVyLgoKLSBHaXVzZXBwZSBEJ0FtYnJvc2lvIHdhcyBmaXJzdCBvdXQgdG8gcmVwb3J0IHRoYXQgVEVMTkVUIGRvZXNuJ3Qgd29yayBpbiBjdXJsCiAgY29tcGlsZWQvYnVpbHQgb24gd2luMzIuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIHVuaXhlcyB0aG91Z2ghCgotIERhdmUgSGFtaWx0b24gcmVwb3J0ZWQgd2VpcmQgcHJvYmxlbXMgd2l0aCBDVVJML1BIUCB0aGF0IEkgcmVhbGx5IGNhbid0CiAgZXhwbGFpbiBhdCB0aGUgbW9tZW50LiBJJ20gaG9waW5nIG9uIHNvbWUgaGVscCBmcm9tIHRoZSBQSFAgY3Jldy4KCkRhbmllbCAoMjYgQXByaWwgMjAwMSkKLSBJIHJld3JvdGUgdGhlIEZUUCBjb21tYW5kIHJlc3BvbnNlIGZ1bmN0aW9uLiBJIGhhZCB0byBkbyBpdCB0byBtYWtlIGZ0cHMKICB3b3JrLCBhcyB0aGUgT3BlblNTTCByZWFkKCktZnVuY3Rpb24gZGlkbid0IHdvcmsgdGhlIHNhbWUgd2F5IHRoZSBub3JtYWwKICB1bml4IHJlYWQoKSBkb2VzLCBidXQgaXQgd2FzIGFsc28gYSBodWdlIHBlcmZvcm1hbmNlIGJvb3N0LiBQcmV2aW91c2x5IHRoZQogIGZ1bmN0aW9uIHJlYWQgb25lIGJ5dGUgYXQgYSB0aW1lLCBub3cgaXQgcmVhZHMgdmVyeSBsYXJnZSBjaHVua3MsIGFuZCBpdAogIG1ha2VzIGEgbm90YWJsZSBzcGVlZCBkaWZmZXJlbmNlLgoKRGFuaWVsICgyNSBBcHJpbCAyMDAxKQotIENvbm5lY3Rpb24gcmUtdXNlIHdoZW4gbm90IHVzaW5nIGEgcHJveHkgZGlkbid0IHdvcmsgcHJvcGVybHkgZm9yCiAgbm9uLWRlZmF1bHQgcG9ydCBudW1iZXJzLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAxKQotIEkndmUgbm90aWNlZCB0aGF0IEZUUFMgZG9lc24ndCB3b3JrLiBXZSBhdHRlbXB0IHRvIHVzZSBzc2wgZXZlbiBmb3IgdGhlCiAgZGF0YSB0cmFuc2Zlciwgd2hpY2ggY2F1c2VzIHRoZSB0cmFuc2ZlciB0byAnaGFuZycuLi4gV2UgbmVlZCB0byBmaXggdGhpcy4KCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gdXNlICdzdHVubmVsJyB0byBkbyBIVFRQUyBhbmQgRlRQUyB0ZXN0aW5nIG9uCiAgdGhlIGFscmVkeSB3cml0dGVuIHBlcmwgc2VydmVycyBlYXNpbHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDEpCi0gVGhlIE9wZW5TU0wgdmVyc2lvbiBzdHJpbmcgcmVjZW50bHkgbW9kaWZpZWQgZGlkbid0IHplcm8gdGVybWluYXRlIG9uZQogIG9mIHRoZSBnZW5lcmF0ZWQgc3RyaW5ncyBwcm9wZXJseSwgd2hpY2ggY291bGQgbGVhZCB0byBhIGNyYXNoIG9yIHNpbXBseQogIHdlaXJkIHZlcnNpb24gc3RyaW5nIG91dHB1dCEKClZlcnNpb24gNy43LjIKCkRhbmllbCAoMjIgQXByaWwgMjAwMSkKLSBSb3NpbWlsZG8gZGEgU2lsdmEgdXBkYXRlZCB0aGUgTWFrZWZpbGVzIGZvciBCb3JsYW5kL1dpbmRvd3MuCgotIEVyaWMgUmF1dG1hbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHRoYXQgd291bGQKICBsZWFkIHRvIGJyb2tlbiBIb3N0OiBoZWFkZXJzIGluIHRoZSBzZWNvbmQgSFRUUCByZXF1ZXN0LgoKRGFuaWVsICgyMCBBcHJpbCAyMDAxKQotIEFkZGVkIG1hbiBwYWdlcyBmb3IgdGhlIGN1cmxfc3RyZXF1YWwoKSBhbmQgY3VybF9tcHJpbnRmKCkgZmFtaWxpZXMuIFdyb3RlCiAgYSAnbGliY3VybCBvdmVydmlldycgbWFuIHBhZ2UuCgotIFNwZWxsLWZpeGVkIHNvbWUgZG9jdW1lbnRzLgoKLSBTLiBNb29uZXNhbXkgY29ycmVjdGVkIG1pc3Rha2VzIGluIHRoZSBtYW4gcGFnZS4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBjdXJsX3NsaXN0cyBvcHRpb25zIGluIHRoZSBwZXJsIGludGVyZmFjZSwgcHJlc2VudAogIHNlcGFyYXRlbHkgaW4gdGhlIEN1cmw6OmVhc3kgMS4xLjQgcGFja2FnZS4KCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHJlbW92ZWQgdGhlIGRlY2ltYWxzIGZyb20gdGhlIHNpemUgdmFyaWFibGVzIGluIHRoZQogIC0td3JpdGUtb3V0IG91dHB1dC4gV2UgaGFyZGx5IGV2ZXIgZ2V0IGZyYWN0aW9uIG9mIGJ5dGVzISA6LSkKClZlcnNpb24gNy43LjItcHJlMQoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBwYXRjaCBmb3IgdGhlIEFDX1NZU19MQVJHRUZJTEUgbWFjcm8uCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDEpCi0gSW5wdXQgZnJvbSBNaWNoYWVsIE1lYWxsaW5nIG1hZGUgbWUgYWRkIC0tZmVhdHVyZSB0byBjdXJsLWNvbmZpZy4gSXQKICBkaXNwbGF5cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gYnVpbHQtaW4gaW4gdGhlIGN1cnJlbnQKICBsaWJjdXJsLiBUaGUgY3VycmVudGx5IGF2YWlsYWJsZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBsaXN0ZWQgYXJlOiBTU0wsIEtSQjQKICBhbmQgSVB2Ni4KCi0gSSBjb21taXR0ZWQgQ3JpcyBhbmQgR2VvcmcncyBwZXJsIGludGVyZmFjZSB3b3JrLiBUaGV5J3ZlIGdvdCBjYWxsYmFja3MKICB3b3JraW5nIGFuZCBvcHRpb25zIHRoYXQgcmVjZWl2ZXMgdGhvc2Ugc2xpc3QgcG9pbnRlcnMuCgotIFB1bmVldCBQYXdhaWEgZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCBkb3dubG9hZHMgdGhhdCB1c2UgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zIGFuZCBJIG1hZGUgYSByYXRoZXIgbGFyZ2Ugd3JpdGV1cCB0byBjb3JyZWN0IHRoaXMuIEl0IGlzCiAgaW1wb3J0YW50IHRoYXQgYWxsIHNlc3Npb24tZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCBhbmQgbm90CiAgaW4gdGhlIG1haW4gc3RydWN0IGFzIHRoaXMgcHJldmlvdXNseSBkaWQuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDEpCi0gRnJlZGVyaWMgTGVwaWVkIGZpeGVkIGEgZnRwIHJlc3VtZWQgZG93bmxvYWQgcHJvYmxlbSBhbmQgaW50cm9kdWNlZCBhIG5ldwogIGVycm9yIGNvZGUgdGhhdCBsZXRzIGFwcGxpY2F0aW9ucyBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGEgcmVzdW1lZCBkb3dubG9hZAogIGFjdHVhbGx5IGRpZG4ndCBkb3dubG9hZCBhbnl0aGluZyBzaW5jZSB0aGUgd2hvbGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQuCiAgU2hvdWxkIHRoaXMgcmV0dXJuIE9LIGluc3RlYWQ/CgotIEkgYWRkZWQgJ2N1cmwtY29uZmlnLmluJyB0byB0aGUgcm9vdCBkaXIgYW5kIGNvbmZpZ3VyZSBzY3JpcHQuIE5vdywgYQogIGN1cmwtY29uZmlnIHNjcmlwdCBpcyBtYWRlIHdoZW4gY3VybCBpcyBidWlsdC4gVGhlIHNjcmlwdCBjYW4gYmUgdXNlZCB0bwogIGZpZ3VyZSBvdXQgY29tcGlsZSB0aW1lIG9wdGlvbnMgdXNlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LCB3aGljaCBpbiB0dXJuCiAgc2hvdWxkIGJlIG9wdGlvbnMgWU9VIHNob3VsZCB1c2UgdG8gYnVpbGQgYXBwbGljYXRpb25zIHRoYXQgdXNlIGxpYmN1cmwuCgogIFRoaXMgKi1jb25maWcgc3R5bGUgaXMgbm90IGEgbmV3IGlkZWEsIGJ1dCBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiB1c2VkCiAgc3VjY2Vzc2Z1bGx5IGluIG90aGVyIChsaWJyYXJ5IGJhc2VkKSBwcm9qZWN0cy4KCi0gUGhpbCBLYXJuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3cm9uZ2x5IGRpZCBub3QgYWx3YXlzIHVzZSBHTVQgdGltZSB6b25lCiAgZm9yIHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBzdHlsZSBoZWFkZXJzLgoKLSBHZW9yZyBTY2h3YXJ6IHBvaW50ZWQgb3V0IGFuIGV4dHJhIG5lZWRlZCAjaW5jbHVkZSBmaWxlIG5lZWRlZCBpbiBzcmMvbWFpbi5jCiAgZm9yIGN1cmwgdG8gYnVpbGQgb24gVWx0cml4LgoKRGFuaWVsICgxMSBBcHJpbCAyMDAxKQotIENyaXMgQmFpbGlmZiBwb2ludGVkIG91dCB0d28gcHJvYmxlbXMgdGhhdCBJIGNvcnJlY3RlZC4gRmlyc3QsIGxpYmN1cmwncyB1c2UKICBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSFRUUF9QUk9YWSBpbiB1cHBlcmNhc2UgbWF5IGJlY29tZSBhIHNlY3VyaXR5CiAgaGF6YXJkIHdoZW4gcGVvcGxlIHVzZSBsaWJjdXJsIGluIGEgc2VydmVyL2NnaSBzaXR1YXRpb24gd2hlcmUgdGhlIHNlcnZlcgogIHNldHMgdGhlIEhUVFBfKi12YXJpYWJsZXMgYWNjb3JkaW5nIHRvIGluY29taW5nIGhlYWRlcnMgaW4gdGhlIEhUVFAKICByZXF1ZXN0LiBUaHVzLCBhICJQcm94eToiLWhlYWRlciB3b3VsZCBzZXQgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCiAgVGhlbiwgaW52b2tpbmcgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRob3V0IGhhdmluZyBhbiBVUkwgc2V0IGNhdXNlZCBhIGNyYXNoLgoKLSBTLiBNb29uZXNhbXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBjdXJsIHVzZSBub24tYmxvY2tpbmcgY29ubmVjdHMgb24KICB3aW5kb3dzIHdoZW4gY29ubmVjdGlvbiB0aW1lb3V0IGlzIHNldCwgYXMgaXQgYWxsb3dzIHdpbmRvd3MgdXNlcnMgdG8gc2V0CiAgdGhhdCB0aW1lb3V0IQoKLSBIaXJvdGFrYSBNYXRzdXl1a2kgd3JvdGUgYSBSdWJ5IGludGVyZmFjZSB0byBsaWJjdXJsIQoKLSBDcmlzIEJhaWxpZmYsIEZvcnJlc3QgQ2Fob29uIGFuZCBHZW9yZyBIb3JuIHdvcmsgb24gdGhlIFBlcmwgaW50ZXJmYWNlLgoKLSBJJ3ZlIHdyaXR0ZW4gYSBmaXJzdCBzaG90IGF0IGEgSmF2YSBpbnRlcmZhY2UgdG8gbGliY3VybC4gTWFueSB0aGFua3MgdG8KICBEYW5pZWwgTWFyZWxsIGZvciB0aXJlbGVzc2x5IGFuc3dlcmluZyB0byBhbGwgbXkgYmFzaWMgSmF2YSBxdWVzdGlvbnMuIEl0CiAgd29ya3MsIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IGJhc2ljLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAxKQotIFRoZSBwcm9ncmVzcyBkaXNwbGF5IGNvdWxkIGdldCBzaWxseSB3aGVuIGRvaW5nIG11bHRpcGxlIGZpbGUgdHJhbnNmZXJzLCBhcwogIGl0IHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHRyYW5zZmVycyEKCi0gRGlzY3Vzc2lvbnMgd2l0aCBDcmlzIEJhaWxpZmYgd2hvIHdyaXRlcyBhIFBlcmwgaW50ZXJmYWNlIHRvIGxpYmN1cmwsIG1hZGUKICBtZSBhZGQgQ1VSTE9QVF9IRUFERVJGVU5DVElPTi4gSXQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgc2VwYXJhdGUgY2FsbGJhY2sKICBmdW5jdGlvbiBmb3Igd3JpdGluZyBoZWFkZXJzLiBQcmV2aW91c2x5IHlvdSBjb3VsZCBvbmx5IHNldCBhIGRpZmZlcmVudCBGSUxFCiAgKiB3aGVuIGhlYWRlcnMgYXJlIHdyaXR0ZW4gZnJvbSB3aXRoaW4gbGliY3VybC4KCkRhbmllbCAoNyBBcHJpbCAyMDAxKQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIGN1cmxfZXNjYXBlKCkgYW5kIHBvaW50ZWQgb3V0IGEgZmxhdyBpbgogIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlLgoKRGFuaWVsICg2IEFwcmlsIDIwMDEpCi0gQWRqdXN0ZWQgdGhlIHZlcnNpb24gY29kZSB0byBwcm9wZXJseSBkaXNwbGF5IE9wZW5TU0wgMC45LjZhLiBUaGV5IHN1cmUKICBjaGFuZ2UgdGhlaXIgdmVyc2lvbiBkZWZpbmUgZm9ybWF0IG9mdGVuLi4uCgotIGN1cmxfZm9ybWZyZWUoKSBub3cgYWNjZXB0cyBhIE5VTEwgcG9pbnRlciB3aXRob3V0IGNyYXNoaW5nIQoKVmVyc2lvbiA3LjcuMQoKRGFuaWVsICgzIEFwcmlsIDIwMDEpCi0gUHVuZWV0IFBhd2FpYSBwb2ludGVkIG91dCB0d28gc2VyaW91cyBwcm9ibGVtcy4gTGliY3VybCB3b3VsZCBhdHRlbXB0IHRvCiAgcmVhZCBiYWQgbWVtb3J5IGR1cmluZyBzaXR1YXRpb25zIHdoZW4gYW4gKGZ0cCkgY29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZC4KICBBbHNvLCB0aGUgbGliL01ha2VmaWxlLnZjNiB3YXMgY29ycmVjdGVkLgoKLSBNb3JlIGludmVzdGlnYXRpb25zIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgbWFkZSBtZSByZWFsaXplIHRoYXQKICBpdCB3YXMgbm90IGNsZWFuIGVub3VnaCB0byB3b3JrIHRyYW5zcGFyYW50bHkgd2l0aCBwZXJzaXN0ZW50IGFuZCBub24tCiAgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gSSB0aGluayBJJ3ZlIGZpeGVkIGl0IG5vdy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwMSkKLSBHZW9yZyBIb3JuIG1haWxlZCBtZSBzb21lIGNvcnJlY3Rpb25zIGZvciB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZS4KCi0gRXhwZXJpbWVudGFsIGZ0cHM6Ly8gc3VwcG9ydCBhZGRlZC4gSXQgaXMgYmFzaWNhbGx5IEZUUCBvdmVyIFNTTCBmb3IgdGhlCiAgY29udHJvbCBjb25uZWN0aW9uLiBJdCBzdGlsbCBtYWtlcyBhbGwgZGF0YSB0cmFuc2ZlcnMgZ29pbmcgb3ZlciB1bmVuY3J5cHRlZAogIGNvbm5lY3Rpb25zLiBSYWluZXIgV2Vpa3VzYXQncyBmdHBkLXNzbCBzZXJ2ZXIgaGFjayBzdXBwb3J0cyB0aGlzIGFuZCBJIHVzZWQKICB0aGF0IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IHNldCBhIENVUkxPUFRfVElNRU9VVCBhbmQgdGhlbiB0cmllZAogIHRvIGdldCBhIGZpbGUgZnJvbSBhIHNpdGUgYW5kIGl0IGZhaWxzLCB0aGUgU0lHQUxSTSB3b3VsZCBzdGlsbCBiZSBzZW50CiAgYWZ0ZXIgdGhlIHRpbWVvdXQtdGltZSwgcXVpdGUgaW5leHBlY3RlZGx5IQoKLSBJIGFkZGVkIGFuIGZ0cCB0cmFuc2ZlciBleGFtcGxlIHRvIGRvY3MvZXhhbXBsZXMvIGFuZCBJIGFsc28gd3JvdGUgYSB0aW55CiAgZXhhbXBsZSBtYWtlZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnQgd2hlbiBidWlsZGluZyBvbmUgb2YgdGhlCiAgZXhhbXBsZXMuCgpWZXJzaW9uIDcuNy4xLWJldGExCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDEpCi0gTW9oYW1lZCBMcmhhemkgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCA3LjYuMSBhbmQgcGVyc2lzdGVudCBIVFRQLzEuMAogIGNvbm5lY3Rpb25zICh3aGVuIHRoZSBzZXJ2ZXIgcmVwbGllZCBhIENvbm5lY3Rpb246IEtlZXAtQWxpdmUpIGFuZCB0aGlzCiAgcHJvYmxlbSB3YXMgbm90IHByb3Blcmx5IGRlYWx0IHdpdGggaW4gNy43IGVpdGhlci4gQSBwYXRjaCB3YXMgcG9zdGVkIHRvIHRoZQogIGN1cmwtYW5kLXBocCBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDEpCi0gQ29saW4gV2F0c29uIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSBhbmQgYnJvdWdodCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0LAogIHdoaWNoIHdhcyBhYm91dCB0aGUgbWFuIHBhZ2UgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgcXVvdGUgKCcpIGluIGEKICB3YXkgdGhhdCBnbnJvZmYgZG9lc24ndCBsaWtlLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAxKQotIFBldGVyIEJyYXkgcmVwb3J0ZWQgY29ycmVjdGx5IHRoYXQgdGhlIHJvb3QgbWFrZWZpbGUgdXNlZCBtYWtlIGluc3RlYWQgb2YKICAkKE1BS0UpIGZvciB0aGUgdGVzdCB0YXJnZXQuCgotIENvcnJlY3RlZCB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZSB0byB1c2UgY3VybF9lYXN5X3NldG9wdCgpIGFuZCBub3QKICBjdXJsX3NldG9wdCgpIHdoaWNoIHdhcyByZW1vdmVkIGluIDcuNyEKCi0gUy4gTW9vbmVzYW15IHByb3ZpZGVkIHVwZGF0ZXMgb24gdGhyZWUgZG9jdW1lbnRzIChNQU5VQUwsIElOU1RBTEwgYW5kIEZBUSkuCgotIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246LCBsaWJjdXJsIHdvdWxkIHNvbWV0aW1lcyB3cml0ZSB0byB0aGUgVVJMIHN0cmluZwogIGluIGEgd2F5IGl0IHNob3VsZG4ndC4gQXMgdGhlIHBvaW50ZXIgaXMgcGFzc2VkLWluIHRvIGxpYmN1cmwgZnJvbSBhbgogIGFwcGxpY2F0aW9uLCB3ZSBjYW4ndCBiZSBhbGxvd2VkIHRvIHdyaXRlIHRvIGl0LiBUaGUgcGFydGljdWxhciBidWcgcmVwb3J0CiAgZnJvbSAnbmsnIHRoYXQgYnJvdWdodCB0aGlzIHVwIHdhcyBiZWNhdXNlIGhlIGhhZCBhIHJlYWQtb25seSBVUkwgdGhhdCB0aGVuCiAgY2F1c2VkIGEgbGliY3VybCBjcmFzaCEKCi0gTm8gbG9uZ2VyIHJlYWRzIEhFQUQgcmVzcG9uc2VzIGxvbmdlciB0aGFuIHRvIHRoZSBsYXN0IGhlYWRlci4gUHJldmlvdXNseSwKICBjdXJsIHdvdWxkIHJlYWQgdGhlIGZ1bGwgcmVwbHkgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGEgImNsb3NlIiBvbmUuCgotIGxpYmN1cmwgZGlkIHJlLXVzZSBjb25uZWN0aW9ucyB3YXkgdG9vIG11Y2guIERvaW5nICJjdXJsCiAgaHR0cDovL3d3dy57bWljcm9zb2Z0LGlibX0uY29tIiB3b3VsZCBtYWtlIGl0IHJlLXVzZSB0aGUgY29ubmVjdGlvbiB3aGljaAogIG1hZGUgdGhlIHNlY29uZCByZXF1ZXN0IHJldHVybiB2ZXJ5IG9kZCByZXN1bHRzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIEVkaW4gS2FkcmliYXNpYyBtYWRlIG1lIGF3YXJlIHRoYXQgY3VybCBzaG91bGQgbm90IHJlLXNlbmQgUE9TVCByZXF1ZXN0cwogIHdoZW4gZm9sbG93aW5nIDMwMi1yZWRpcmVjdHMuIEkgbWFkZSAzMDIgd29yayBsaWtlIDMwMyB3aGljaCBtZWFucyBjdXJsIHVzZXMKICBHRVQgaW4gdGhlIGZvbGxvd2luZyByZXF1ZXN0KHMpLgoKLSBsaWJjdXJsIG5vdyByZXNldCB0aGUgImZvbGxvd2VkLWxvY2F0aW9uIiBjb3VudGVyIG9uIGVhY2ggaW52b2tlIG9mCiAgY3VybF9lYXN5X3BlcmZvcm0oKSBhcyBpdCBvdGhlcndpc2Ugd291bGQgc3VtIHVwIGFsbCByZWRpcmVjdHMgb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCB0aHVzIGNvdWxkIHJlYWNoIHRoZSBtYXhyZWRpcnMgY291bnRlciB3cm9uZ2x5LgoKLSBKaW0gRHJhc2ggc3VnZ2VzdGVkIGN1cmxfZXNjYXBlKCkgc2hvdWxkIG5vdCByZS1lbmNvZGUgd2hhdCBhbHJlYWR5IGxvb2tzCiAgbGlrZSBhbiBlbmNvZGVkIHNlcXVlbmNlIGFuZCBJIHRoaW5rIHRoYXQncyBhIGZhaXIgc3VnZ2VzdGlvbi4KClZlcnNpb24gNy43CgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGZhaWxzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBnZXRob3N0YnluYW1lX3IoKSBpcwogIGRldGVjdGVkIGJ1dCBpdCBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byBpbnZva2UgaXQgKHdoYXQgYW1vdW50IG9mCiAgYXJndW1lbnRzIGl0IGlzIHN1cHBvc2VkIHRvIGdldCkuIFJlcG9ydHMgZnJvbSBBbmRy6XMgR2FyY+1hIG1hZGUgbWUgYXdhcmUKICBvZiB0aGlzIG5lZWQuCgotIFRhbGtpbmcgd2l0aCBKaW0gRHJhc2ggbWFkZSBtZSBmaW5hbGx5IHB1dCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5lc2NhcGUKICBmdW5jdGlvbnMgaW4gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgYW5kIHdyaXRlIG1hbiBwYWdlcyBmb3IgdGhlbS4gVGhlCiAgZXNjYXBlIGZ1bmN0aW9uIHdhcyBtb2RpZmllZCB0byB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSB1bmVzY2FwZSBvbmUKICBoYWQuCgotIE5vIGJ1ZyByZXBvcnRzIGF0IGFsbCBvbiB0aGUgbGF0ZXN0IGJldGFzLiBSZWxlYXNlIHRpbWUgY29taW5nIHVwLgoKVmVyc2lvbiA3LjctYmV0YTUKCkRhbmllbCAoMTkgTWFyY2ggMjAwMSkKLSBHZW9yZyBPdHRpbmdlciByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHVzaW5nIC1DIHRvZ2V0aGVyIHdpdGggLUwgaW4gdGhlIHNlbnNlCiAgdGhhdCB0aGUgLUMgaW5mbyBnb3QgbG9zdCB3aGVuIGl0IHdhcyByZWRpcmVjdGVkLiBJIGNvdWxkIG5vdCByZXBlYXQgdGhpcwogIHByb2JsZW0gb24gdGhlIDcuNyBicmFuY2ggd2h5IEkgbGVhdmUgdGhpcyBmb3IgdGhlIG1vbWVudC4gVGVzdCBjYXNlIDM5IHdhcwogIGFkZGVkIHRvIGRvIGV4YWN0bHkgdGhpcywgYW5kIGl0IHNlZW1zIHRvIGRvIHJpZ2h0LgoKLSBDaHJpc3RpYW4gUm9ib3R0b20gUmVpcyByZXBvcnRlZCBob3cgaGlzIDcuNyBiZXRhIGRpZG4ndCBzdWNjZXNzZnVsbHkgZG8KICBmb3JtIHBvc3RzIGFzIGVsZWdhbnRseSBhcyA3LjYuMSBkaWQuIEluZGVlZCwgdGhpcyB3YXMgYSBmbGF3IGluIHRoZSBoZWFkZXIKICBlbmdpbmUsIGFzIEhUVFAgMS4xIGhhcyBpbnRyb2R1Y2VkIGEgbmV3IDEwMCAidHJhbnNpZW50IiByZXR1cm4gY29kZSBmb3IgUFVUCiAgYW5kIFBPU1Qgb3BlcmF0aW9ucyB0aGF0IEkgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IuIFNlY3Rpb24gOC4yLjMgaW4gUkZDMjYxNgogIGhhcyBhbGwgdGhlIGRldGFpbHMuIFNlZW1zIHRvIHdvcmsgbm93IQoKRGFuaWVsICgxNiBNYXJjaCAyMDAxKQotIEFmdGVyIGhhdmluZyBleHBlcmllbmNlZCBhbm90aGVyIG1hY2hpbmUgYnJlYWstZG93biwgd2UncmUgYmFjay4KCi0gR2VvcmcgSG9ybidzIHBlcmwgaW50ZXJmYWNlIEN1cmw6OmVhc3kgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBjdXJsIHJlbGVhc2UKICBhcmNoaXZlLiBUaGUgcGVybC8gZGlyZWN0b3J5IGlzIG5vdyBwcmVzZW50LiBQbGVhc2UgaGVscCBtZSB3aXRoIGRvY3MsCiAgZXhhbXBsZXMgYW5kIHVwZGF0ZXMgeW91IHRoaW5rIGZpdC4KCi0gTWFkZSBhIG5ldyBwaHAvIGRpcmVjdG9yeSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlIGFuZCBtb3ZlZCB0aGUgUEhQIGV4YW1wbGVzCiAgaW50byBhIHN1YmRpcmVjdG9yeSBpbiB0aGVyZS4gTm90IG11Y2ggUEhQIGluZm8geWV0LCBidXQgSSBwbGFuIHRvLiBQbGVhc2UKICBoZWxwIG1lIGhlcmUgYXMgd2VsbCEKCi0gTWFkZSBsaWJjdXJsIHJldHVybiBlcnJvciBpZiBhIHRyYW5zZmVyIGlzIGFib3J0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhCiAgImNodW5rIi4gSXQgYWN0dWFsbHkgZW5hYmxlcyBsaWJjdXJsIHRvIGRpc2NvdmVyIHByZW1hdHVyZSB0cmFuc2ZlciBhYm9ydHMKICBldmVuIGlmIHRoZSBDb250ZW50LUxlbmd0aDogc2l6ZSBpcyB1bmtub3duLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAxKQotIEFkZGVkIC0tY29ubmVjdC10aW1lb3V0IHRvIGN1cmwsIHdoaWNoIHNldHMgdGhlIG5ldyBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUCiAgb3B0aW9uIGluIGxpYmN1cmwuIEl0IGxpbWl0cyB0aGUgdGltZSBjdXJsIGlzIGFsbG93ZWQgdG8gc3BlbmQgaW4gdGhlCiAgY29ubmVjdGlvbiBwaGFzZS4gVGhpcyBkaWZmZXJzIGZyb20gLW0vLS1tYXgtdGltZSB0aGF0IGxpbWl0cyB0aGUgZW50aXJlCiAgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24uIFJlcXVlc3RlZCBieSBMYXJyeSBGYWhub2UgYW5kIG90aGVycy4KCiAgSSBhbHNvIHVwZGF0ZWQgdGhlIGN1cmwuMSBhbmQgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlcyBhbmQgcmVtb3ZlZCB0aGUKICBpdGVtIGZyb20gdGhlIFRPRE8uCgpWZXJzaW9uIDcuNy1iZXRhNAoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIE1hZGUgY3VybCBncm9rIElQdjYgd2l0aCBIVFRQIHByb3hpZXMgYW5kIGdvdCBldmVyeXRoaW5nIHRvIGNvbXBpbGUgbmljZWx5CiAgYWdhaW4gd2hlbiBFTkFCTEVfSVBWNiBpcyBzZXQuCgogIEkgbmVlZCB0byByZW1ha2UgdGhpbmdzIGluIHRoZSB0ZXN0IHN1aXRlLiBJIGNhbid0IHRlc3QgdGhlIEZUUCBwYXJ0cyB3aXRoCiAgY3VybCBidWlsdCBmb3IgSVB2NiBhcyBpdCB1c2VzIGEgZGlmZmVyZW50IHNldCBvZiBGVFAgY29tbWFuZHMgdGhlbiEKCi0gSSBmZWxsIG9udG8gYSBidWcgcmVwb3J0IG9uIHBocC5uZXQgKHBvc3RlZCBieSBMYXJzIFRvcmJlbiBXaWxzb24pIHRoYXQgd2FzCiAgYSByZXBvcnQgbWVhbnQgZm9yIG91ciBwcm9qZWN0LiBBbnl3YXksIGl0IHNhaWQgdGhlIC5uZXRyYyBwYXJzaW5nIGRpZG4ndAogIHdvcmsgYXMgc3VwcG9zZWQsIGFuZCBhcyBJIGFncmVlZCB3aXRoIExhcnMsIEkgbWFkZSB0aGUgbmV0cmMgcGFyc2VyIHVzZQogIGdldHB3dWlkKCkgdG8gZmlndXJlIG91dCB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGVmZmVjdGl2ZSB1c2VyIGFuZCB0cnkKICB0aGF0IG5ldHJjLiBJdCBzdGlsbCB1c2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIT01FIGZvciB0aG9zZSB0aGF0IGRvbid0CiAgaGF2ZSB0aGF0IGZ1bmN0aW9uIG9yIGlmIHRoZSB1c2VyIGRvZXNuJ3QgcmV0dXJuIHZhbGlkIHB3ZCBpbmZvLgoKLSBFZGluIEthZHJpYmFpYyBwb3N0ZWQgYSBidWcgcmVwb3J0IHdoZXJlIGhlIGdvdCBhIGNyYXNoIHdoZW4gYSBmZXRjaCB3aXRoCiAgdXNlcitwYXNzd29yZCBpbiB0aGUgVVJMIGZvbGxvd2VkIGEgTG9jYXRpb246IHRvIGEgc2Vjb25kIFVSTCAoYWJzb2x1dGUsCiAgd2l0aG91dCBuYW1lK3Bhc3N3b3JkKS4gVGhpcyBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBhIGxvbmcgd2hpbGUgYW5kCiAgY3Jhc2hlcyBkdWUgdG8gYSByZWFkIGF0IGFkZHJlc3MgemVyby4gRml4ZWQgbm93LiBXcm90ZSB0ZXN0IGNhc2UgMzgsIHRoYXQKICB0ZXN0cyB0aGlzLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSdzIGh0dHBzZXJ2ZXIgc2xpZ2h0bHkgdG8gYXBwZW5kIGFsbCBjbGllbnQgcmVxdWVzdAogIGRhdGEgdG8gaXRzIGxvZyBmaWxlIHNvIHRoYXQgdGhlIHRlc3Qgc2NyaXB0IG5vdyBiZXR0ZXIgY2FuIHZlcmlmeSBhIHJhbmdlCiAgb2YgcmVxdWVzdHMgYW5kIG5vdCBvbmx5IHRoZSBsYXN0IG9uZSwgYXMgaXQgZGlkIHByZXZpb3VzbHkuCgotIFVwZGF0ZWQgdGhlIGN1cmwgbWFuIHBhZ2Ugd2l0aCAtLXJhbmRvbS1maWxlIGFuZCAtLWVnZC1maWxlIGRldGFpbHMuCgpWZXJzaW9uIDcuNy1iZXRhMwoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHByb3ZpZGVkIHNpbWlsYXIgZml4ZXMgYXMgSvZybiBkaWQgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXRjaGVzCiAgZm9yIG5vbi1TU0wgY29tcGlsZXMuCgotIEkgaW5jcmVhc2VkIHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZvciBsaWJjdXJsIGFzIEkndmUgcmVtb3ZlZCB0aGUgbG93IGxldmVsCiAgZnVuY3Rpb25zIGZyb20gdGhlIGludGVyZmFjZS4gSSBhbHNvIHRvb2sgdGhpcyBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlCiAgQ3VybF9zdHJlcXVhbCBmdW5jdGlvbiB0byBjdXJsX3N0cmVxdWFsIGFuZCBDdXJsX3N0cm5lcXVhbCB0bwogIGN1cmxfc3RybmVxdWFsLCBhcyB0aGV5J3JlIHB1YmxpYyBsaWJjdXJsIGZ1bmN0aW9ucyAoZXZlbiBpZiB0aGV5J3JlIHN0aWxsCiAgdW5kb2N1bWVudGVkKS4KCiAgVGhpcyB3aWxsIG1ha2Ugb2xkZXIgcHJvZ3JhbXMgbm90IGNhcGFibGUgb2YgdXNpbmcgdGhlIG5ldyBsaWJjdXJsIHdpdGgKICBqdXN0IGEgZHJvcC1pbiByZXBsYWNlbWVudC4KCi0gSvZybiBIYXJ0cm90aCB1cGRhdGVkIHN0dWZmIGZvciB3aW4zMiBjb21waWxlczoKICBvIGNvbmZpZy13aW4zMi5oIHdhcyBmaXhlZCBmb3Igc29ja2xlbl90CiAgbyBsaWIvc3NsdXNlLmMgaGFkIGEgYmFkICNlbmRpZiBwbGFjZW1lbnQKICBvIGxpYi9maWxlLmMgd2FzIG1hZGUgdG8gY29tcGlsZSBvbiB3aW4zMiBhZ2FpbgogIG8gbGliL01ha2VmaWxlLm0zMiB3YXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZmlsZXMKICBvIGxpYi9saWJjdXJsLmRlZiBtYXRjaGVzIHRoZSBjdXJyZW50IGludGVyZmFjZSBzdGF0ZQoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEl0IG9ubHkgdG9vayBhbiBob3VyIG9yIHNvIGJlZm9yZSBK9nJuIEhhcnRyb3RoIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUKICBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLiBHaXZlbiBoaXMgZmluZSBleGFtcGxlLXNpdGUsIEkgY291bGQgZWFzaWx5IHNwb3QKICB0aGUgcHJvYmxlbSBhbmQgd2hlbiBJIHJlLXJlYWQgdGhlIHNwZWMgKHRoZSBwYXJ0IEkgaGF2ZSBwYXN0ZWQgaW4gdGhlIHRvcAogIG9mIHRoZSBodHRwX2NodW5rcy5oIGZpbGUpLCBJIHJlYWxpemVkIEkgaGFkIG1hZGUgbXkgc3RhdGUtbWFjaGluZSBzbGlnaHRseQogIHdyb25nIGFuZCBkaWRuJ3QgZXhwZWN0L2hhbmRsZSB0aGUgdHJhaWxpbmcgQ1JMRiB0aGF0IGNvbWVzIGFmdGVyIHRoZSBkYXRhCiAgaW4gZWFjaCBjaHVuayAoYW5kIHRob3NlIGV4dHJhIHR3byBieXRlcyBzdXJlIGZlZWwgd2FzdGVkKS4KCiAgSGFkIHRvIG1vZGlmeSB0ZXN0IGNhc2UgMzQgdG8gbWF0Y2ggdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjctYmV0YTIKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBBZGRlZCB0aGUgcG9saWN5IHN0dWZmIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIGZvciB0aGUgdHdvIHN1cHBvcnRlZAogIHBvbGljaWVzLgoKLSBJbXBsZW1lbnRlZCBzb21lIHN1cHBvcnQgZm9yIHRoZSBDVVJMT1BUX0NMT1NFUE9MSUNZIG9wdGlvbi4gVGhlIHBvbGljaWVzCiAgQ1VSTENMT1NFUE9MSUNZX0xFQVNUX1JFQ0VOVExZX1VTRUQgYW5kIENVUkxDTE9TRVBPTElDWV9PTERFU1QgYXJlIG5vdwogIHN1cHBvcnRlZCwgYW5kIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgaXMgdXNlZCBhcyBkZWZhdWx0IGlmIG5vIHBvbGljeQogIGlzIGNob3Nlbi4KCkRhbmllbCAoMTIgTWFyY2ggMjAwMSkKLSBBZGRlZCBDVVJMT1BUX1JBTkRPTV9GSUxFIGFuZCBDVVJMT1BUX0VHRFNPQ0tFVCB0byBsaWJjdXJsIGZvciBzZWVkaW5nIHRoZQogIFNTTCByYW5kb20gZW5naW5lLiBUaGUgcmFuZG9tIHNlZWRpbmcgc3VwcG9ydCB3YXMgYWxzbyBicm91Z2h0IHRvIHRoZSBjdXJsCiAgY2xpZW50IHdpdGggdGhlIG5ldyBvcHRpb25zIC0tcmFuZG9tLWZpbGUgPGZpbGU+IGFuZCAtLWVnZC1maWxlIDxmaWxlPi4gSQogIG5lZWQgc29tZSBwZW9wbGUgdG8gcmVhbGx5IHRlc3QgdGhpcyB0byBrbm93IHRoZXkgd29yayBhcyBzdXBwb3NlZC4gUmVtZW1iZXIKICB0aGF0IGxpYmN1cmwgbm93IGluZm9ybXMgKGlmIHZlcmJvc2UgaXMgb24pIGlmIHRoZSByYW5kb20gc2VlZCBpcyBjb25zaWRlcmVkCiAgd2VhayAoSFRUUFMgY29ubmVjdGlvbnMpLgoKLSBNYWRlIHRoZSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGVuZ2luZSBkZXRlY3RlZCBiYWQgZm9ybWF0dGVkIGRhdGEgbGVuZ3RoCiAgYW5kIHJldHVybiBlcnJvciBpZiBzbyAod2UgY2FuJ3QgcG9zc2libHkgZXh0cmFjdCBzZW5zaWJsZSBkYXRhIGlmIHRoaXMgaXMKICB0aGUgY2FzZSkuIEFkZGVkIGEgdGVzdCBjYXNlIHRoYXQgZGV0ZWN0cyB0aGlzLiBOdW1iZXIgMzYuIE5vdyB0aGVyZSBhcmUgNjAKICB0ZXN0IGNhc2VzLgoKLSBBZGRlZCA1IG5ldyBsaWJjdXJsIG9wdGlvbnMgdG8gY3VybC9jdXJsLmggdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwuIFRoZXkncmUgYWxzbyBkb2N1bWVudGVkIChmYWlybHkKICB0aG9yb3VnaGx5KSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLiBUaHJlZSBvZiB0aGVtIGFyZSBub3cKICBpbXBsZW1lbnRlZCwgYWx0aG91Z2ggbm90IHJlYWxseSB0ZXN0ZWQgYXQgdGhpcyBwb2ludC4uLiBBbnl3YXksIHRoZSBuZXcKICBpbXBsZW1lbnRlZCBvcHRpb25zIGFyZSBuYW1lZCBDVVJMT1BUX01BWENPTk5FQ1RTLCBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QsCiAgQ1VSTE9QVF9GT1JCSURfUkVVU0UuIFRoZSBvbmVzIHN0aWxsIGxlZnQgdG8gd3JpdGUgY29kZSBmb3IgYXJlOgogIENVUkxPUFRfQ0xPU0VQT0xJQ1kgYW5kIGl0cyByZWxhdGVkIG9wdGlvbiBDVVJMT1BUX0NMT1NFRlVOQ1RJT04uCgotIE1hZGUgY3VybCAodGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdG9vbCkgdXNlIHRoZSBuZXcgbGliY3VybCA3LjcgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gc3VwcG9ydCBieSByZS11c2luZyB0aGUgc2FtZSBjdXJsIGhhbmRsZSBmb3IgZXZlcnkgc3BlY2lmaWVkIGZpbGUKICB0cmFuc2ZlciBhbmQgYWZ0ZXIgc29tZSBtb3JlIHRlc3QgY2FzZSB0d2Vha2luZyB3ZSBoYXZlIDEwMCUgdGVzdCBjYXNlIE9LLgogIEkgbWFkZSBzb21lIHRlc3QgY2FzZXMgcmV0dXJuIEhUVFAvMS4wIG5vdyB0byBtYWtlIHN1cmUgdGhhdCB3b3JrcyBhcyB3ZWxsLgoKLSBIYWQgdG8gYWRkICdDb25uZWN0aW9uOiBjbG9zZScgdG8gdGhlIGhlYWRlcnMgb2YgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIHNvCiAgdGhhdCBjdXJsIGJlaGF2ZXMgIm9sZC1zdHlsZSIgc2luY2UgdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgZG9lc24ndCBkbyBtdWx0aXBsZQogIGNvbm5lY3Rpb25zLi4uIE5vdyBJIGdldCAxMDAlIHRlc3QgY2FzZSBPSy4KCi0gVGhlIGN1cmwuaGF4eC5zZSBzaXRlLCB0aGUgbWFpbiBjdXJsIG1haWxpbmcgbGlzdCBhbmQgbXkgcGVyc29uYWwgZW1haWwgYXJlCiAgYWxsIGRlYWQgdG9kYXkgZHVlIHRvIHBvd2VyIGJsYWNrb3V0IGluIHRoZSBhcmVhIHdoZXJlIHRoZSBtYWluIHNlcnZlcnMgYXJlCiAgbG9jYXRlZC4gSG9ycmlibGUuCgotIEkndmUgbWFkZSBwZXJzaXN0YW5jZSB3b3JrIG92ZXIgYSBzcXVpZCBIVFRQIHByb3h5LiBJIGZpbmQgaXQgZGlzdHVyYmluZwogIHRoYXQgaXQgdXNlcyBoZWFkZXJzIHRoYXQgYXJlbid0IHByZXNlbnQgaW4gYW55IEhUVFAgc3RhbmRhcmQgdGhvdWdoCiAgKFByb3h5LUNvbm5lY3Rpb246KSBhbmQgdGhhdCBtYWtlcyBtZSBmZWVsIHRoYXQgSSdtIG5vdyBvbiB0aGUgZWRnZSBvZiB3aGF0CiAgdGhlIHN0YW5kYXJkIGFjdHVhbGx5IGRlZmluZXMuIEkgbmVlZCB0byBnZXQgdGhpcyBjb2RlIGV4Y2VyY2lzZWQgb24gYSBsb3QKICBvZiBkaWZmZXJlbnQgSFRUUCBwcm94aWVzIGJlZm9yZSBJIGZlZWwgc2FmZS4KCiAgTm93IEknbSBmYWNpbmcgdGhlIHByb2JsZW0gd2l0aCBteSB0ZXN0IHN1aXRlIHNlcnZlcnMgKGJvdGggRlRQIGFuZCBIVFRQKQogIG5vdCBzdXBwb3J0aW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGxpYmN1cmwgaXMgZG9pbmcgdGhlbSBub3cuIEkgaGF2ZQogIHRvIGZpeCB0aGUgdGVzdCBzZXJ2ZXJzIHRvIGdldCBhbGwgdGhlIHRlc3QgY2FzZXMgZG8gT0suCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgZGlkIG91dHB1dCBlcnJvcnMgdG8gc3RkZXJyIGV2ZW4gaWYKICBNVVRFIGFuZCBOT1BST0dSRVNTIHdhcyBzZXQuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBidWcgYW5kIGhhcHBlbnMgaWYKICB0aGVyZSdzIGFuIGVycm9yIGFuZCBubyBFUlJPUkJVRkZFUiBpcyBzZXQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KClZlcnNpb24gNy43LWJldGExCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIGlzIG5vIGxvbmdlciBhbnkgdHJvdWJsZSBmb3IgbGliY3VybC4gSSd2ZQogIGFkZGVkIHR3byBzb3VyY2UgZmlsZXMgYW5kIEkndmUgcnVuIHNvbWUgdGVzdCBkb3dubG9hZHMgdGhhdCBsb29rIGZpbmUuCgotIEhUVFAgSEVBRCB3b3JrcyB0b28sIGV2ZW4gb24gMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwMSkKLSBUaGUgY3VycmVudCA1NyB0ZXN0IGNhc2VzIG5vdyBwYXNzIE9LLiBJdCB3b3VsZCBzdWdnZXN0IHRoYXQgbGliY3VybCB3b3JrcwogIHVzaW5nIHRoZSBvbGQtc3R5bGUgd2l0aCBvbmUgY29ubmVjdGlvbiBwZXIgaGFuZGxlLiBUaGUgdGVzdCBzdWl0ZSBkb2Vzbid0CiAgaGFuZGxlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHlldCBzbyB0aGVyZSBhcmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhpcy4KCi0gSSBwYXRjaGVkIHRoZSB0ZWxuZXQuYyBoZWF2aWx5IHRvIG5vdCB1c2UgYW55IGdsb2JhbCB2YXJpYWJsZXMgYW55bW9yZS4gSXQKICBzaG91bGQgbWFrZSBpdCBhIGxvdCBuaWNlciBsaWJyYXJ5LXdpc2UuCgotIFRoZSBmaWxlOi8vIHN1cHBvcnQgd2FzIG1vZGlmaWVkIHNsaWdodGx5IHRvIHVzZSB0aGUgaW50ZXJuYWwgY29ubmVjdC1maXJzdC0KICB0aGVuLWRvIGFwcHJvYWNoLgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTW9yZSBidWdzIGVyYXNlZC4KClZlcnNpb24gNy43LWFscGhhMgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTm93LCB0aGVyZSdzIGV2ZW4gYSBiYXNpYyBjaGVjayB0aGF0IGEgcmUtdXNlZCBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlCiAgYmVmb3JlIGl0IGlzIGFzc3VtZWQgc28uIEEgZmV3IGZpcnN0IHRlc3RzIGhhdmUgcHJvdmVuIHRoYXQgbGliY3VybCB3aWxsCiAgdGhlbiByZS1jb25uZWN0IGluc3RlYWQgb2YgcmUtdXNlIHRoZSBkZWFkIGNvbm5lY3Rpb24hCgpEYW5pZWwgKDIgTWFyY2ggMjAwMSkKLSBOb3cgdGhleSB3b3JrIGludGVybWl4ZWQgYXMgd2VsbC4gTWFqb3IgY29vbG5lc3MhCgotIE1vcmUgZmlkZGxpbmcgYXJvdW5kLCBteSAndGlueScgY2xpZW50IEkgaGF2ZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBub3cgaGFzCiAgcHJvdmVkIHRvIGRvd25sb2FkIGJvdGggRlRQIGFuZCBIVFRQIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhleSBkbwogIG5vdCB3b3JrIGludGVybWl4ZWQgeWV0IHRob3VnaC4KCkRhbmllbCAoMSBNYXJjaCAyMDAxKQotIFdpbGZyZWRvIFNhbmNoZXogcG9pbnRlZCBvdXQgYSBtaW5vciBzcGVsbGluZyBtaXN0YWtlIGluIGEgbWFuIHBhZ2UgYW5kIHRoYXQKICBjdXJsX3NsaXN0X2FwcGVuZCgpIHNob3VsZCB0YWtlIGEgY29uc3QgY2hhciAqIGFzIHNlY29uZCBhcmd1bWVudC4gSXQgZG9lcwogIG5vdy4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMSkKLSBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzdGFydCB0byBsb29rIGdvb2QgZm9yIEhUVFAuIE9uIGEgc3Vic2VxdWVudAogIHJlcXVlc3QsIGl0IHNlZW1zIHRoYXQgbGliY3VybCBub3cgY2FuIHBpY2sgYW4gYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9uCiAgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzLCBvciBpdCBvcGVucyBhIG5ldyBvbmUuCgotIERvdWdsYXMgUi4gSG9ybmVyIG1haWxlZCBtZSBjb3JyZWN0aW9ucyB0byB0aGUgY3VybF9mb3JtcGFyc2UoKSBtYW4gcGFnZQogIHRoYXQgSSBhcHBsaWVkLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAxKQotIEFkZGVkIHRoZSBkb2NzL2V4YW1wbGVzL3dpbjMyc29ja2V0cy5jIGZpbGUgZm9yIG91ciB3aW5kb3dzIGZyaWVuZHMuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcHJvdmlkZWQgYnJhbmQgbmV3IFRFTE5FVCBmdW5jdGlvbmFsaXR5IGFuZAogIGltcHJvdmVtZW50czoKCiAgKiBOZWdvdGlhdGlvbiBpcyBub3cgcGFzc2l2ZS4gQ3VybCBkb2VzIG5vdCBuZWdvdGlhdGUgdW50aWwgdGhlIHBlZXIgZG9lcy4KICAqIFBvc3NpYmlsaXR5IHRvIHNldCBuZWdvdGlhdGlvbiBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUsIGN1cnJlbnRseSBvbmx5CiAgICBYRElTUExPQywgVFRZUEUgYW5kIE5FV19FTlZJUk9OIChjYWxsZWQgTkVXX0VOVikuCiAgKiBOb3cgc2VuZHMgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgdGhlIC11IHN3aXRjaCBpcyB1c2VkLgogICogVXNlIC10IHRvIHNldCB0ZWxuZXQgb3B0aW9ucyAoTGludXMgZXZlbiB1cGRhdGVkIHRoZSBtYW4gcGFnZSwgYXdlc29tZSEpCgotIEhhdmVuJ3QgZG9uZSB0aGlzIGJpZyBjaGFuZ2VzIHRvIGN1cmwgZm9yIGEgd2hpbGUuIE1vdmVkIGFyb3VuZCBhIGxvdCBvZgogIHN0cnVjdCBmaWVsZHMgYW5kIHN0dWZmIHRvIG1ha2UgbXVsdGlwbGUgY29ubmVjdGlvbnMgZ2V0IGNvbm5lY3Rpb24gc3BlY2lmaWMKICBkYXRhIGluIHNlcGFyYXRlIHN0cnVjdHMgc28gdGhhdCB0aGV5IGNhbiBjby1leGlzdCBpbiBhIG5pY2Ugd2F5LiBTZWUgdGhlCiAgbWFpbGluZyBsaXN0cyBmb3IgZGlzY3Vzc2lvbnMgYXJvdW5kIGhvdyB0aGlzIGlzIGdvbm5hIGJlIGltcGxlbWVudGVkLiBEb2NzCiAgYW5kIG1vcmUgd2lsbCBmb2xsb3cuCgogIFN0dWRpZWQgdGhlIEhUVFAgUkZDIHRvIGZpbmQgb3V0IGJldHRlciBob3cgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzaG91bGQKICB3b3JrLiBTZWVtcyBjb29sIGVub3VnaC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMSkKLSBCb2IgU2NoYWRlciBicm91Z2h0IG1lIHR3byBmaWxlcyB0aGF0IGhlbHAgc2V0IHVwIGEgTVMgVkMrKyBsaWJjdXJsIHByb2plY3QKICBlYXNpZXIuIEhlIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhbiB1cC10by1kYXRlIGxpYmN1cmwuZGVmIGZpbGUuCgotIEkgbW92ZWQgYSBidW5jaCBvZiBwcm90b3R5cGVzIGZyb20gdGhlIHB1YmxpYyA8Y3VybC9jdXJsLmg+IGZpbGUgdG8gdGhlCiAgbGlicmFyeSBwcml2YXRlIHVybGRhdGEuaC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSB1cGNvbWluZyBjaGFuZ2VzLiBUaGUKICBsb3cgbGV2ZWwgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciBiZWluZyBwbGFubmVkIHRvIGJlY29tZSByZWFsaXR5LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAxKQotIENVUkxPUFRfUE9TVCBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4gSnVzdCBzZXR0aW5nIHRoZSBQT1NUIHN0cmluZyB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTIHdpbGwgc3dpdGNoIG9uIHRoZSBIVFRQIFBPU1QuIE1vc3Qgb3RoZXIgdGhpbmdzIGluCiAgbGliY3VybCBhbHJlYWR5IHdvcmtzIHRoaXMgd2F5LCBpLmUgdGhleSByZXF1aXJlIG9ubHkgdGhlIHBhcmFtZXRlciB0bwogIHN3aXRjaCBvbiBhIGZlYXR1cmUgc28gSSB0aGluayB0aGlzIHdvcmtzIHdlbGwgd2l0aCB0aGUgcmVzdC4gU2V0dGluZyBhIE5VTEwKICBzdHJpbmcgc3dpdGNoZXMgb2ZmIHRoZSBQT1NUIGFnYWluLgoKLSBFeGNlbGxlbnQgc3VnZ2VzdGlvbnMgZnJvbSBSaWNoIEdyYXksIFJpY2sgSm9uZXMsIEpvaGFuIE5pbHNzb24gYW5kIEJqb3JuCiAgUmVlc2UgaGVscGVkIG1lIGRlZmluZSBhIHdheSBob3cgdG8gaW5jb3Jwb3JhdGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBpbnRvCiAgbGliY3VybCBpbiBhIHZlcnkgc21vb3RoIHdheS4gSWYgZG9uZSByaWdodCwgbm8gY2hhbmdlIG1heSBoYXZlIHRvIGJlIG1hZGUKICB0byBvbGRlciBwcm9ncmFtcyBhbmQgdGhleSB3aWxsIGp1c3Qgc3RhcnQgdXNpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuCiAgYXBwbGljYWJsZSEKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwMSkKLSBDaGFuZ2VkIHRoZSB3b3JkICd0aW1lb3V0ZWQnIHRvICd0aW1lZCBvdXQnIGluIHR3byBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXMuCiAgU3VnZ2VzdGVkIGJ5IExhcnJ5IEZhaG5vZS4KClZlcnNpb24gNy42LjEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDAxKQotIEZyYW5rIFJlaWQgYW5kIENhaW4gSG9wd29vZCBwcm92aWRlZCBpbmZvcm1hdGlvbiBhbmQgcmVzZWFyY2ggYXJvdW5kIGEgSFRUUFMKICBQVVQvdXBsb2FkIHByb2JsZW0gd2Ugc2VlbSB0byBoYXZlLiBObyBzb2x1dGlvbiBmb3VuZCB5ZXQuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMSkKLSBBbiBpbnRlcmVzdGluZyBkaXNjdXNzaW9uIGlzIGhvdyB0byBzcGVjaWZ5IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGhvdXQgaGF2aW5nCiAgY3VybCBhc2sgZm9yIGl0IGludGVyYWN0aXZlbHk/IFRoZSBjdXJyZW50IGltcGxtZW50YXRpb24gdGFrZXMgYW4gZW1wdHkKICBwYXNzd29yZCBhcyBhIHJlcXVlc3QgZm9yIGEgcGFzc3dvcmQgcHJvbXB0LiBIb3dldmVyLCBJIHN0aWxsIHdhbnQgdG8KICBzdXBwb3J0IGEgYmxhbmsgdXNlciBmaWVsZC4gVGh1cywgdG9kYXkgaWYgeW91IGVudGVyICItdSA6IiAod2l0aG91dCB1c2VyCiAgYW5kIHBhc3N3b3JkKSBjdXJsIHdpbGwgcHJvbXB0IGZvciB0aGUgcGFzc3dvcmQuIFRyaWNreS4gSG93IHdvdWxkIHlvdQogIHNwZWNpZnkgeW91IHdhbnQgdGhlIHByb21wdCBvdGhlcndpc2U/CgotIE1hZGUgdGhlIG5ldHJjIHBhcnNlIHJlc3VsdCBwb3NzaWJsZSB0byB1c2UgZm9yIG90aGVyIHByb3RvY29scyB0aGFuIEZUUCBhbmQKICBIVFRQIChzdWNoIGFzIHRoZSB1cGNvbWluZyBURUxORVQgZml4ZXMpLgoKLSBUaGUgcHJldmlvdXNseSBtZW50aW9uZWQgIk1TVkMrKyBwcm9ibGVtcyIgdHVybmVkIG91dCB0byBiZSBhIG5vbi1pc3N1ZS4KCi0gQWRkZWQgYSBIVFRQIGZpbGUgdXBsb2FkIGNvZGUgZXhhbXBsZSBpbiB0aGUgZG9jcy9leGFtcGxlcy8gc2VjdGlvbiBvbgogIHJlcXVlc3QuCgotIEFkanVzdGVkIHRoZSBGVFAgcmVzcG9uc2UgZml4IHNsaWdodGx5LgoKVmVyc2lvbiA3LjYuMS1wcmUzCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgZm91bmQgYSBmbGF3IGluIHRoZSByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uIGZvciBGVFAgdGhhdAogIGNvdWxkIG1ha2UgbGliY3VybCBub3QgZ2V0IG91dCBvZiB0aGUgbG9vcCBwcm9wZXJseSB3aGVuIGl0IHNob3VsZCwgaWYKICBsaWJjdXJsIGdvdCAtMSByZXR1cm5lZCB3aGVuIHJlYWRpbmcgdGhlIHNvY2tldC4KCi0gSSBmb3VuZCBhIHNpbWlsYXIgbWlzdGFrZSBpbiBodHRwLmMgd2hlbiB1c2luZyBhIHByb3h5IGFuZCByZWFkaW5nIHRoZQogIHJlc3VsdHMgZnJvbSB0aGUgcHJveHkgY29ubmVjdGlvbi4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGF0IHRoZSBWQyBtYWtlZmlsZSBpbiBzcmMvIG5lZWRlZCB0aGUgbGlicGF0aCBzZXQKICBmb3IgdGhlIGRlYnVnIGJ1aWxkIHRvIHdvcmsuCgotIERhbmllbCBHZWhyaWdlciBzdGVwcGVkIGluIHRvIGFzc2lzdCB3aXRoIHRoZSBWQysrIHN0dWZmIFJvYmVydCBXZWF2ZXIKICBicm91Z2h0IHVwIHllc3RlcmRheS4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBicm91Z2h0IGEgYmlnIHBhdGNoIHRoYXQgYnJpbmdzIElQdjYtYXdhcmVuZXNzIHRvCiAgYSBidW5jaCBvZiBkaWZmZXJlbnQgYXJlYXMgd2l0aGluIGxpYmN1cmwuCgotIFJvYmVydCBXZWF2ZXIgdG9sZCBtZSBhYm91dCB0aGUgcHJvYmxlbXMgdGhlIE1TIFZDKysgNi4wIGNvbXBpbGVyIGhhcyB3aXRoCiAgdGhlICdzdGF0aWMnIGtleXdvcmQgb24gYSBudW1iZXIgb2YgbGliY3VybCBmdW5jdGlvbnMuIEkgbWlnaHQgbmVlZCB0byBhZGQgYQogIHBhdGNoIHRoYXQgcmVkZWZpbmVzIHN0YXRpYyB3aGVuIGxpYmN1cmwgaXMgY29tcGlsZWQgd2l0aCB0aGF0IGNvbXBpbGVyLgogIEhvdyBkbyBJIGtub3cgd2hlbiBWQysrIGNvbXBpbGVzLCBhbnlvbmU/CgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwMSkKLSBjdXJsX2dldGluZm8oKSB3YXMgZXh0ZW5kZWQgd2l0aCB0d28gbmV3IG9wdGlvbnM6CiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRC4gVGhleQogIHJldHVybiB0aGUgZnVsbCBhc3N1bWVkIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciBpbiB0aGUgZ2l2ZW4KICBkaXJlY3Rpb24uIFRoZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCB3aWxsIGJlIHRoZSBDb250ZW50LUxlbmd0aDoKICBzaXplIG9mIGEgSFRUUCBkb3dubG9hZC4gQWRkZWQgZGVzY3JpcHRpb25zIHRvIHRoZSBtYW4gcGFnZSBhcyB3ZWxsLiBUaGlzCiAgd2FzIGRvbmUgYWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBCb2IgU2NoYWRlci4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHByb3ZpZGVkIGFub3RoZXIgZml4IHRoYXQgbWFrZXMgY3VybCBidWlsZCB1bmRlciB0aGUgbW9yZQogIHJlY2VudCBjeWd3aW4gaW5zdGFsbGF0aW9ucy4gSXQgc2VlbXMgdGhleSd2ZSBjaGFuZ2VkIHRoZSBwcmVzZXQgZGVmaW5lcyB0bwogIG5vdCBpbmNsdWRlIFdJTjMyIGFueW1vcmUuCgpWZXJzaW9uIDcuNi4xLXByZTIKCkRhbmllbCAoMzEgSmFudWFyeSAyMDAxKQotIEN1cmxfcmVhZCgpIGFuZCBjdXJsX3JlYWQoKSBub3cgcmV0dXJuIGEgc3NpemVfdCBmb3IgdGhlIHNpemUsIGFzIGl0IGhhZCB0bwogIGJlIGFibGUgdG8gcmV0dXJuIC0xLiBUaGUgdGVsbmV0IHN1cHBvcnQgY3Jhc2hlZCBkdWUgdG8gdGhpcyBhbmQgdGhlcmUgd2FzIGEKICBwb3NzaWJpbGl0eSB0byB3ZWlyZCBiZWhhdmlvdXIgYWxsIG92ZXIuIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaGVscGVkIG1lCiAgZmluZCB0aGlzLgoKLSBBZGRlZCBhIGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgYSB3b3JraW5nIGdldGFkZHJpbmZvKCkgaWYgSVB2NiBpcyByZXF1ZXN0ZWQuCiAgSSBhbHNvIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmVhdHVyZSAtLWVuYWJsZS1kZWJ1ZyB3aGljaCBzZXRzIGEgY291cGxlCiAgb2YgY29tcGlsZXIgb3B0aW9ucyB3aGVuIHVzZWQuIEl0IGFzc3VtZXMgZ2NjLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDEpCi0gSSBmaW5hbGx5IHRvb2sgYSBzdGFiIGF0IHRoZSBsb25nLXRlcm0gRklYTUUgaXRlbSBJJ3ZlIGhhZCBvbiBteXNlbGYsIGFuZAogIG5vdyBsaWJjdXJsIHdpbGwgcHJvcGVybHkgd29yayB3aGVuIGRvaW5nIGEgSFRUUCByYW5nZS1yZXF1ZXN0IHRoYXQgZm9sbG93cwogIGEgTG9jYXRpb246LiBQcmV2aW91c2x5IHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIGZhaWwgc2F5aW5nIHRoYXQgdGhlIHNlcnZlcgogIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHJhbmdlIHJlcXVlc3RzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IgdGhlIEhUVFAgUFVUIHJlc3VtZSB0aGluZyAodGVzdCBjYXNlIDMzKS4KClZlcnNpb24gNy42LjEtcHJlMQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gWWV0IGFub3RoZXIgQ29udGVudC1SYW5nZSBjaGFuZ2UuIE9rIG5vdz8gQm9iIFNjaGFkZXIgY2hlY2tzIGZyb20gaGlzIGVuZCAKICBhbmQgaXQgd29ya3MgZm9yIGhpbS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDAxKQotIFNvIHRoZSBIVFRQIFBVVCByZXN1bWUgZml4IHdhc24ndCBnb29kLiBUaGVyZSBzaG91bGQgYXBwZWFyYW50bHkgYmUgYQogIENvbnRlbnQtUmFuZ2UgaGVhZGVyIHdoZW4gcmVzdW1pbmcgYSBQVVQuCgotIEkgbm90aWNlZCBJIGJyb2tlIHRoZSBkb3dubG9hZC1jaGVjayB0aGF0IHZlcmlmaWVzIHRoYXQgYSByZXN1bWVkIEhUVFAKICBkb3dubG9hZCBpcyBhY3R1YWxseSByZXN1bWVkLiBJdCBnb3QgYnJva2UgYmVjYXVzZSBteSBuZXcgJ2h0dHByZXEnIGZpZWxkCiAgaW4gdGhlIG1haW4gY3VybCBzdHJ1Y3QuIEkgc2hvdWxkIGdldCBzbGFwcGVkLiBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvcgogIHRoaXMgbm93LCBzbyBJIHdvbid0IGJlIGFibGUgdG8gcnVpbiB0aGlzIGFnYWluIHdpdGhvdXQgbm90aWNpbmcuCgotIEFkZGVkIGEgdGVzdCBjYXNlIGZvciBjb250ZW50LWxlbmd0aCB2ZXJpZnlpbmcgd2hlbiBkb3dubG9hZGluZyBIVFRQLgoKLSBNYWRlIHRoZSBwcm9ncmVzcyBtZXRlciB0aXRsZSBzYXkgaWYgdGhlIHRyYW5zZmVyIGlzIGJlaW5nIHRyYW5zZmVyZWQuIEl0CiAgbWFrZXMgdGhlIG91dHB1dCBzbGlnaHRseSBiZXR0ZXIgZm9yIHJlc3VtZXMuCgotIFdoZW4gZGVhbGluZyB3aXRoIExvY2F0aW9uOiBhbmQgSFRUUCByZXR1cm4gY29kZXMsIGxpYmN1cmwgd2lsbCBub3QgYXR0ZW1wdAogIHRvIGZvbGxvdyB0aGUgc3Bpcml0IG9mIFJGQzI2MTYgYmV0dGVyLiBJdCBtZWFucyB0aGF0IHdoZW4gUE9TVGluZyB0byBhCiAgVVJMIHRoYXQgaXMgYmVpbmcgZm9sbG93aW5nIHRvIGEgc2Vjb25kIHBsYWNlLCB0aGUgc3RhbmRhcmQgd2lsbCBqdWRnZSBvbgogIHdoYXQgdG8gZG8uIEFsbCBIVFRQIGNvZGVzIGV4Y2VwdCAzMDMgYW5kIDMwNSB3aWxsIGNhdXNlIGN1cmwgdG8gbWFrZSBhCiAgc2Vjb25kIFBPU1Qgb3BlcmF0aW9uLiAzMDMgd2lsbCBtYWtlIGEgR0VUIGFuZCAzMDUgaXMgbm90IHlldCBzdXBwb3J0ZWQuCgogIEkgYWxzbyB3cm90ZSB0d28gdGVzdCBjYXNlcyBmb3IgdGhpcyBQT1NUL0dFVC9Mb2NhdGlvbiBzdHVmZi4KClZlcnNpb24gNy42CgpEYW5pZWwgKDI2IEphbnVhcnkgMjAwMSkKLSBMb3RzIG9mIG1haWxzIGJhY2sgYW5kIGZvcnRoIHdpdGggQm9iIFNjaGFkZXIgZmluYWxseSBtYWRlIG1lIGFkZCBhIHNtYWxsCiAgcGllY2Ugb2YgY29kZSBpbiB0aGUgSFRUUCBlbmdpbmUgc28gdGhhdCBIVFRQIHVwbG9hZCByZXN1bWUgd29ya3MuIFlvdSBjYW4KICBub3cgZG8gYW4gb3BlcmF0aW9uIGxpa2UgJ2N1cmwgLVQgZmlsZSAtQyA8b2Zmc2V0PiA8VVJMPicgYW5kIGN1cmwgd2lsbCBQVVQKICB0aGUgZW5kaW5nIHBhcnQgb2YgdGhlIGZpbGUgc3RhcnRpbmcgYXQgZ2l2ZW4gb2ZmZXQgdG8gdGhlIHNwZWNpZmllZCBVUkwuCgpWZXJzaW9uIDcuNi1wcmU0CgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMSkKLSBJIHRvb2sgaG9sZCBvZiBSaWNrIEpvbmVzJyBxdWVzdGlvbiB3aHkgd2UgZG9uJ3QgdXNlIHJlY3YoKSBhbmQgc2VuZCgpIGZvcgogIHJlYWRpbmcvd3JpdGluZyB0byB0aGUgc29ja2V0cyBhbmQgSSd2ZSBub3cgbW9kaWZpZWQgdGhlIHNyZWFkKCkgYW5kCiAgc3dyaXRlKCkgbWFjcm9zIHRvIHVzZSB0aGVtIGluc3RlYWQuIElmIG5vdGhpbmcgZWxzZSwgdGhleSBjb3VsZCBiZSB0ZXN0ZWQKICBpbiB0aGUgbmV4dCBiZXRhLXJvdW5kIGNvbWluZyByaWdodCB1cC4KCi0gSmVmZiBNb3Jyb3cgZm91bmQgYSBwcm9ibGVtIHdpdGggbGliY3VybCdzIHVzYWdlIG9mIFNTTF9yZWFkKCkgYW5kIHN1cHBsaWVkCiAgaGlzIHJlc2VhcmNoIHJlc3VsdHMgaW4gaG93IHRvIGZpeCB0aGlzLiBJdCB0dXJucyBvdXQgd2UgaGF2ZSB0byBpbnZva2UgdGhlCiAgZnVuY3Rpb24gc2V2ZXJhbCB0aW1lcyBpbiBzb21lIGNhc2VzLiBUaGUgc2FtZSBnb2VzIGZvciB0aGUgU1NMX3dyaXRlKCkuCgogIEkgbWFkZSBzb21lIHJhdGhlciBkcmFzdGljIGNoYW5nZXMgYWxsIG92ZXIgbGliY3VybCB0byBtYWtlIGFsbCB3cml0ZXMgYW5kCiAgcmVhZHMgZ2V0IGRvbmUgb24gb25lIHNpbmdsZSBwbGFjZSBzbyB0aGF0IHRoaXMgcmVwZWF0ZWQtYXR0ZW1wdHMgdGhpbmcKICB3b3VsZCBvbmx5IGhhdmUgdG8gYmUgaW1wbGVtZW50ZWQgYXQgb25lIHBvaW50LgoKLSBSaWNrIEpvbmVzIHNwb3R0ZWQgdGhhdCB0aGUgJ3RvdGFsIHRpbWUnIGNvdW50ZXIgcmVhbGx5IGRpZG4ndCBtZWFzdXJlIHRoZQogIHRvdGFsIHRpbWUgdmVyeSBhY2N1cmF0ZSBvbiBzdWJzZWNvbmQgbGV2ZWxzLgoKLSBKb2hhbiBOaWxzc29uIHBvaW50ZWQgb3V0IHRoZSBuZWVkIHRvIG1vcmUgY2xlYXJseSBzcGVjaWZ5IHRoYXQgdGhlIHRpbWVvdXQKICB2YWx1ZSB5b3Ugc2V0IGZvciBhIGRvd25sb2FkIGlzIGZvciB0aGUgKmVudGlyZSogZG93bmxvYWQuIFRoZXJlJ3MgY3VycmVudGx5CiAgbm8gb3B0aW9uIGF2YWlsYWJsZSB0aGF0IHNldHMgYSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbiBwaGFzZSBvbmx5LgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDEpCi0gSW5nbyBSYWxmIEJsdW0gc3VibWl0dGVkIGEgc2VyaWVzIG9mIHBhdGNoZXMgcmVxdWlyZWQgdG8gZ2V0IGN1cmwgdG8gY29tcGlsZQogIHByb3Blcmx5IHdpdGggY3lnd2luLgoKLSBSb2JlcnQgV2VhdmVyIHBvc3RlZCBhIGZpeCBmb3IgdGhlIHdpbjMyIHNlY3Rpb24gb2YgdGhlIGN1cmxfZ2V0ZW52KCkgY29kZQogIHRoYXQgY29ycmVjdGVkIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrLgoKLSBBZGRlZCBjb21tZW50cyBpbiBhIGZldyBmaWxlcyBpbiBhIHN1ZGRlbiBhdHRlbXB0IHRvIG1ha2UgdGhlIHNvdXJjZXMgbW9yZQogIGVhc3kgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZCEKCkRhbmllbCAoMjMgSmFudWFyeSAyMDAxKQotIEFkZGVkIHNpbXBsZSBJUHY2IGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgbWFkZSB0aGUgdmVyc2lvbgogIHN0cmluZyBhZGQgJ2lwdjYnIHRvIHRoZSBlbmFibGUgc2VjdGlvbiBpbiB0aGF0IGNhc2UuIEVOQUJMRV9JUFY2IHdpbGwgYmUKICBzZXQgaWYgY3VybCBpcyBjb21waWxlZCB3aXRoIElQdjYgc3VwcG9ydCBlbmFibGVkLgoKLSBBZGRlZCBhIHBhcnNlciBmb3IgSVB2Ni1zdHlsZSBzcGVjaWZpZWQgSVAtYWRkcmVzc2VzIGluIGEgVVJMLiBUaHVzLCB3aGVuCiAgSVB2NiBnZXRzIGVuYWJsZWQgc29vbiwgd2UgY2FuIHVzZSBVUkxzIGxpa2UgJ1swOjoxXTo4MCcuLi4KCi0gTWFkZSB0aGUgVVJMIGdsb2JiaW5nIGluIHRoZSBjbGllbnQgcG9zc2libGUgdG8gZmFpbCBzaWxlbnRseSBpZiB0aGVyZSdzIGFuCiAgZXJyb3IgaW4gdGhlIGdsb2JiaW5nLiBJdCBtYWtlcyBpdCBhbG1vc3QgaW50dWl0aXZlLCBzbyB3aGVuIHlvdSBkb24ndAogIGZvbGxvdyB0aGUgc3ludGF4IHJ1bGVzLCBnbG9iYmluZyBpcyBzaW1wbHkgc3dpdGNoZWQgb2ZmIGFuZCB0aGUgcmF3IHN0cmluZwogIGlzIHVzZWQgaW5zdGVhZC4KCiAgSSBzdGlsbCB0aGluayB3ZSdsbCBnZXQgcHJvYmxlbXMgd2l0aCBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcyB3aGVuIHdlICp3YW50KgogIGdsb2JiaW5nIG9uIHBhcnRzIG9mIHRoZSBVUkwgYXMgdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgVVJMIHdpbGwgZm9yIHN1cmUKICBzZXJpb3VzbHkgY29uZnVzZSB0aGUgZ2xvYmJlci4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcHJvZ3Jlc3MgbWV0ZXIgcGF0Y2ggdGhhdCBtYWtlcyBpdCBsb29rIGJldHRlciBldmVuCiAgZHVyaW5nIHNsb3cgc3RhcnRzLiBQcmV2aW91c2x5IGl0IG1hZGUgc29tZSBzaWxseSBhc3N1bXB0aW9ucy4uLgoKLSBBZGRlZCB0d28gRlRQIHRlc3RzIGZvciAtUSBhbmQgLVEgLSBzdHVmZiBzaW5jZSBpdCB3YXMgYmVpbmcgZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdC4gSGFkIHRvIGNvcnJlY3QgdGhlIGZ0cHNlcnZlci5wbCB0b28gYXMgaXQgYnVnZ2VkIHNsaWdodGx5LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgTG9jYXRpb246IHBhcnNlcnMgZGVhbCB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGh1cyBJIHJlbW92ZWQgdGhlIGxhc3QKICBjb2RlIHRoYXQgcmVzdHJpY3RzIHRoZSBsZW5ndGggb2YgVVJMcyB0aGF0IGN1cmwgc3VwcG9ydHMuCgotIEFkZGVkIGEgLS1nbG9ib2ZmIHRlc3QgY2FzZSAoIzI4KSBhbmQgaXQgcXVpY2tseSBpZGVudGlmaWVkIGEgbWVtb3J5IHByb2JsZW0KICBpbiBzcmMvbWFpbi5jIHRoYXQgSSB0b29rIGNhcmUgb2YuCgpWZXJzaW9uIDcuNi1wcmUzCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSB0d28gZm9ybWVyIGZpbGVzIGxpYi9kb3dubG9hZC5jIGFuZCBsaWIvaGlnaGxldmVsLmMgYmVjb21lIHRoZSBuZXcKICBsaWIvdHJhbnNmZXIuYyB3aGljaCBtYWtlcyBtb3JlIHNlbnNlLiBJIGFsc28gZGlkIHRoZSByZW5hbWUgZnJvbSBUcmFuc2ZlcigpCiAgdG8gQ3VybF9UcmFuc2ZlcigpIGluIHRoZSBvdGhlciBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uCiAgaW4gdGhlIHNwaXJpdCBvZiB1c2luZyBDdXJsXyBwcmVmaXggZm9yIGxpYnJhcnktc2NvcGVkIGdsb2JhbCBzeW1ib2xzLgoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgLWcvLS1nbG9ib2ZmIHRoYXQgc3dpdGNoZXMgT0ZGIHRoZSBVUkwgZ2xvYmJpbmcgYW5kIHRodXMgZW5hYmxlcyB7fVtdCiAgbGV0dGVycyB0byBiZSBwYXJ0IG9mIHRoZSBVUkwuIERvIG5vdGUgdGhhdCBSRkMyMzk2IHNlY3Rpb24gMi40LjMgZXhwbGljaXRseQogIG1lbnRpb24gdGhlc2UgbGV0dGVycyB0byBiZSBlc2NhcGVkLiBUaGlzIHdhcyBwb3N0ZWQgYXMgYSBmZWF0dXJlIHJlcXVlc3QgYnkKICBKb3JnZSBHdXRpZXJyZXogYW5kIGFzIGEgYnVnIGJ5IFRlcnJ5LgoKLSBTaG9ydCBvcHRpb25zIHRvIGN1cmwgdGhhdCByZXF1aXJlcyBwYXJhbWV0ZXJzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHdpdGhvdXQKICBoYXZpbmcgdGhlIG9wdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBzcGFjZSBzZXBhcmF0ZWQuIC1vZmlsZSB3b3JrcyBhcyBnb29kIGFzCiAgLW8gZmlsZS4gLW0yMCBpcyBlcXVhbCB0byAtbSAyMC4gRG8gbm90ZSB0aGF0IHRoaXMgZ29lcyBmb3Igc2luZ2xlLWxldHRlcgogIG9wdGlvbnMgb25seSwgdmVyYm9zZSAtLWxvbmctc3R5bGUgb3B0aW9ucyBzdGlsbCBtdXN0IGJlIHNlcGFyYXRlZCB3aXRoCiAgc3BhY2UgZnJvbSB0aGVpciBwYXJhbWV0ZXJzLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwMSkKLSBGcmFuY2lzIERhZ2VuYWlzIHJlcG9ydGVkIHRoYXQgdGhlIFNDTyBjb21waWxlciBzdGlsbCBmYWlscyB3aGVuIGNvbXBpbGluZwogIGN1cmwgZHVlIHRvIHRoYXQgZ2V0cGFzc19yKCkgcHJvdG90eXBlLiBJJ3ZlIG5vdyBwdXQgaXQgYXJvdW5kICNpZm5kZWYKICBIQVZFX0dFVFBBU1NfUiBpbiBhbiBhdHRlbXB0IHRvIHBsZWFzZSB0aGUgU0NPIHN5c3RlbXMuCgotIE1hZGUgc29tZSBtaW5vciBjb3JyZWN0aW9ucyB0byBnZXQgdGhlIGNsaWVudCB0byBjbGVhbnVwIHByb3Blcmx5IGFuZCBJIG1hZGUKICB0aGUgc2VwYXJhdG9yIHdvcmsgYWdhaW4gd2hlbiBnZXR0aW5nIG11bHRpcGxlIGdsb2JiZWQgVVJMcyB0byBzdGRvdXQuCgotIFdvcmtlZCB3aXRoIExvaWMgRGFjaGFyeSB0byBnZXQgdGhlIG1ha2UgZGlzdCBhbmQgbWFrZSBkaXN0Y2hlY2sgd29yawogIGNvcnJlY3RseS4gVGhlICdtYWtldGd6JyBzY3JpcHQgaXMgbm93IHVzaW5nIHRoZSBhdXRvbWFrZSBnZW5lcmF0ZWQgJ21ha2UKICBkaXN0JyB3aGVuIGNyZWF0aW5nIHJlbGVhc2UgYXJjaGl2ZXMuIExvaWMgc3VjY2Vzc2Z1bGx5IG1hZGUgJ21ha2UgcnBtcycKICBhdXRvbWF0aWNhbGx5IGJ1aWxkIFJQTXMhCgpMb2ljIERhY2hhcnkgKDYgSmFudWFyeSAyMDAxKQotIEF1dG9tYXRlZCBnZW5lcmF0aW9uIG9mIHJwbSBwYWNrYWdlcywgbm8gbmVlZCB0byBiZSByb290LgoKLSBtYWtlIGRpc3RjaGVjayBnZW5lcmF0ZXMgYSBwcm9wZXIgZGlzdHJpYnV0aW9uIChFWFRSQV9ESVNUCiAgaW4gYWxsIE1ha2VmaWxlLmFtIG1vZGlmaWVkIHRvIG1hdGNoIEZJTEVTKS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDEpCi0gSHVnZSBjbGllbnQtc2lkZSBoYWNrOiBub3cgbXVsdGlwbGUgVVJMcyBhcmUgc3VwcG9ydGVkLiBBbnkgbnVtYmVyIG9mIFVSTHMKICBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGV5J2xsIGFsbCBiZSBkb3dubG9hZGVkLiBUaGVyZQogIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIC1vIG9yIC1PIGZvciBlYWNoIFVSTCBvciB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8KICBzdGRvdXQuIFRoaXMgbmVlZHMgbW9yZSB0ZXN0aW5nLCB0aW1lIHRvIHJlbGVhc2UgYSA3LjYtcHJlIHBhY2thZ2UuCgotIFRoZSBrcmI0IHN1cHBvcnQgd2FzIGJyb2tlbiBpbiB0aGUgcmVsZWFzZS4gRml4ZWQgbm93LgoKLSBIdWdlIGludGVybmFsIHN5bWJvbCByZW5hbWUgb3BlcmF0aW9uLiBBbGwgbm9uLXN0YXRpYyBidXQgc3RpbGwgbGliLWludGVybmFsCiAgc3ltYm9scyBzaG91bGQgbm93IGJlIHByZWZpeGVkIHdpdGggJ0N1cmxfJyB0byBwcmV2ZW50IGNvbGxpc2lvbnMgd2l0aCBvdGhlcgogIGxpYnMuIEFsbCBwdWJsaWMgc3ltYm9scyBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnY3VybF8nIGFuZCB0aGUgcmVzdCBzaG91bGQKICBiZSBzdGF0aWMgYW5kIHRodXMgaW52aXNpYmxlIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBJIHVwZGF0ZWQgdGhlIElOVEVSTkFMUwogIGRvY3VtZW50IHRvIHNheSB0aGlzIGFzIHdlbGwuCgpWZXJzaW9uIDcuNS4yCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAxKQotIEFzIEtldmluIFAgUm90aCBzdWdnZXN0ZWQsIEkndmUgYWRkZWQgdGV4dCB0byB0aGUgbWFuIHBhZ2UgZm9yIGV2ZXJ5IGNvbW1hbmQKICBsaW5lIG9wdGlvbiBhbmQgd2hhdCBoYXBwZW5zIHdoZW4geW91IHNwZWNpZnkgdGhhdCBvcHRpb24gbW9yZSB0aGFuCiAgb25jZS4gVGhhdCBoYXNuJ3QgYmVlbiBleGFjdGx5IGNyeXN0YWwgY2xlYXIgYmVmb3JlLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IHBvc3NpYmxlIHRvIHJ1biBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlLiBGb3IKICBvZGQgcmVhc29ucyBJIGNhbid0IGJ1aWxkIGN1cmwgcHJvcGVybHkgb3V0c2lkZSB0aG91Z2guIEl0IGhhcyB0byBkbyB3aXRoCiAgY3VybCdzIGRlcGVuZGVuY2llcyBvbiBsaWJjdXJsLi4uCgotIEN1dCBvZmYgYWxsIG9sZGVyIChkYXRlZCAxOTk5IGFuZCBlYXJsaWVyKSBDSEFOR0VTIGVudHJpZXMgZnJvbSB0aGlzIGZpbGUuCiAgVGhlIG9sZGVyIHBpZWNlIGlzIG5hbWVkIENIQU5HRVMuMCBhbmQgaXMgYWRkZWQgdG8gdGhlIENWUyByZXBvc2l0b3J5IGluCiAgY2FzZSBhbnlvbmUgd291bGQgbmVlZCBpdC4KCi0gSSBhZGRlZCBhbm90aGVyIGZpbGUgJ0NWUy1JTkZPJyB0byB0aGUgQ1ZTLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAogIGZpbGVzIGluIHRoZSBDVlMgdGhhdCBhcmVuJ3QgaW5jbHVkZWQgaW4gcmVsZWFzZSBhcmNoaXZlcyBhbmQgaG93IHRvIGJ1aWxkCiAgY3VybCB3aGVuIHlvdSBnZXQgdGhlIHNvdXJjZXMgb2ZmIENWUy4KCi0gVXBkYXRlZCBDT05UUklCVVRFIGFuZCBGQVEgZHVlIHRvIHRoZSBuZXcgbGljZW5zZS4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDEpCi0gUmVuYW1lZCBSRUFETUUubGliY3VybCB0byBMSUJDVVJMCgotIENoYW5nZWQgaGVhZGVycyBpbiBhbGwgc291cmNlcyBmaWxlcyB0byB0aGUgbmV3IGR1YWwgbGljZW5zZSBjb25jZXB0IG9mCiAgY3VybDogdXNlIHRoZSBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlICpvciogTVBMLiBUaGUgTEVHQUwgZmlsZSB3YXMgdXBkYXRlZAogIGFjY29yZGluZ2x5IGFuZCB0aGUgTVBMIDEuMSBhbmQgTUlUL1ggZGVyaXZhdGUgbGljZW5zZXMgYXJlIG5vdyBwYXJ0IG9mIHRoZQogIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMzAgRGVjZW1iZXIgMjAwMCkKLSBNYWRlIGFsbCBGVFAgY29tbWFuZHMgZ2V0IHNlbnQgd2l0aCB0aGUgdHJhaWxpbmcgQ1JMRiBpbiBvbmUgc2luZ2xlIHdyaXRlKCkKICBhcyBzcGxpdHRpbmcgdGhlbSB1cCBzZWVtcyB0byBjb25mdXNlIGF0IGxlYXN0IHNvbWUgZmlyZXdhbGxzIChGVy0xIGJlaW5nCiAgb25lIG1ham9yKS4KCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwMCkKLSBBZGRlZCBmaWxlIGRlc3JjaXB0b3IgYW5kIEZJTEUgaGFuZGxlIGxlYWsgZGV0ZWN0aW9uIHRvIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0KICBhbmQgdGh1cyBJIGZvdW5kIGFuZCByZW1vdmVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWthZ2UgaW4gdGhlIGZ0cCBwYXJ0cwogIHRoYXQgaGFwcGVuZWQgd2hlbiB5b3UgZGlkIFBPUlRlZCBkb3dubG9hZHMuCgotIEFkZGVkIGFuIGluY2x1ZGUgPHN0ZGlvLmg+IGluIDxjdXJsL2N1cmwuaD4gc2luY2UgaXQgdXNlcyBGSUxFICouCgpEYW5pZWwgKDEyIERlY2VtYmVyIDIwMDApCi0gTXVsdGlwbGUgVVJMIGRvd25sb2FkcyB3aXRoIC1PIHdhcyBzdGlsbCBidWdnaW5nLiBOb3QgYW55bW9yZSBJIHRoaW5rIG9yCiAgaG9wZSwgb3IgYXQgbGVhc3QgSSd2ZSB0cmllZC4uLiA6LU8KCi0gRnJhbmNvaXMgUGV0aXRqZWFuIGZpeGVkIGFub3RoZXIgLU8gcHJvYmxlbQoKVmVyc2lvbiA3LjUuMQoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDAwKQotIENsZWFuZWQgdXAgYSBmZXcgb2YgdGhlIG1ha2VmaWxlcyB0byB1c2UgdW5peC1zdHlsZSBuZXdsaW5lcyBvbmx5LiBBcyBLZXZpbgogIFAgUm90aCBmb3VuZCBvdXQsIGF0IGxlYXN0IG9uZSBDVlMgY2xpZW50IGJlaGF2ZWQgd3JvbmdseSB3aGVuIGl0IGZvdW5kCiAgZGlmZmVyZW50IG5ld2xpbmUgY29udmVudGlvbnMgd2l0aGluIHRoZSBzYW1lIGZpbGUuCgotIEFsYmVydCBDaGluLUEtWW91bmcgY29ycmVjdGVkIHRoZSBMREZMQUdTIHVzZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IKICB0aGUgU1NMIHN0dWZmLgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDApCi0gTWFzc2ltbyBTcXVpbGxhY2UgY29ycmVjdGx5IGRlc2NyaWJlZCBob3cgbGliY3VybCBjb3VsZCB1c2Ugc2Vzc2lvbiBpZHMgd2hlbgogIGRvaW5nIFNTTCBjb25uZWN0aW9ucy4KCi0gSmFtZXMgR3JpZmZpdGhzIGZvdW5kIG91dCB0aGF0IGN1cmwgd291bGQgY3Jhc2ggaWYgdGhlIGZpbGUgeW91IHNwZWNpZnkgd2l0aAogIC1vIGlzIHNob3J0ZXIgdGhhbiB0aGUgVVJMISBUaGlzIHRvb2sgc29tZSBob3VycyB0byBmdWxseSBodW50IGRvd24sIGJ1dCBpdAogIGlzIGZpeGVkIG5vdy4KCkRhbmllbCAoNSBEZWNlbWJlciAyMDAwKQotIEphZXBpbCBLaW0gc2VudCB1cyBtYWtlZmlsZXMgdGhhdCBidWlsZCBjdXJsIHVzaW5nIHRoZSBmcmVlIHdpbmRvd3MgYm9ybGFuZAogIGNvbXBpbGVyLiBUaGUgcm9vdCBtYWtlZmlsZSBub3cgYWNjZXB0cyAnbWFrZSBib3JsYW5kJyB0byBidWlsZCBjdXJsIHdpdGgKICB0aGF0IGNvbXBpbGVyLgoKLSBTdGVmYW4gUmFkbWFuIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlc3QgbWFrZWZpbGVzIGRpZG4ndCB1c2UgdGhlIFBFUkwKICB2YXJpYWJsZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0cyBmaWd1cmUgb3V0LiBBY3R1YWxseSwgeW91IHN0aWxsIG5lZWQKICBwZXJsIGluIHRoZSBwYXRoIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBydW4gb2suCgotIFJpY2ggR3JheSBmb3VuZCBudW1lcm91cyBwb3J0YWJpbGl0eSBwcm9ibGVtczoKICAqIFRoZSBTQ08gY29tcGlsZXIgZ290IGFuIGVycm9yIG9uIHRoZSBnZXRwYXNzX3IoKSBwcm90b3R5cGUgaW4gZ2V0cGFzcy5oCiAgICBzaW5jZSB0aGUgY3VybCBvbmUgZGlmZmVyZWQgZnJvbSB0aGUgU0NPIG9uZQogICogVGhlIEhQVVggY29tcGlsZXIgZ290IGFuIGVycm9yIGJlY2F1c2Ugb2YgaG93IGN1cmwgZGlkIHRoZSBzaWdhY3Rpb24KICAgIHN0dWZmIGFuZCB1c2VkIGEgZGVmaW5lIEhQVVggZG9lc24ndCBoYXZlIChvciBuZWVkKS4KICAqIEEgZmV3IG1vcmUgcHJvYmxlbXMgcmVtYWluIHRvIGJlIHJlc2VhcmNoZWQuCgotIFBhdWwgSGFycmluZ3RvbiBleHBlcmllbmNlZCBhIGNvcmUgZHVtcCB1c2luZyBodHRwcy4gTm90IG11Y2ggZGV0YWlscyB5ZXQuCgpEYW5pZWwgKDQgRGVjZW1iZXIgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIGEgcHJvYmxlbSB3aXRoIG11bHRpcGxlIFVSTHMgYW5kIC1vLy1PLgoKVmVyc2lvbiA3LjUKCkRhbmllbCAoMSBEZWNlbWJlciAyMDAwKQotIENyYWlnIERhdmlzb24gZ2F2ZSB1cyBoaXMgdXBkYXRlcyBvbiB0aGUgVkMrKyBtYWtlZmlsZXMsIHNvIG5vdyBjdXJsIHNob3VsZAogIGJ1aWxkIGZpbmUgd2l0aCB0aGUgTWljcm9zb2Z0IGNvbXBpbGVyIG9uIHdpbmRvd3MgdG9vLgoKLSBGaXhlZCB0aGUgbGliY3VybCB2ZXJzaW9uaW5nIHNvIHRoYXQgd2UgZG9uJ3QgcnVpbiBvbGQgcHJvZ3JhbXMgd2hlbgogIHJlbGVhc2luZyBuZXcgc2hhcmVkIGxpYnJhcnkgaW50ZXJmYWNlcy4KCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwMCkKLSBSZW5hbWVkIGRvY3MvUkVBRE1FLmN1cmwgdG8gZG9jcy9NQU5VQUwgdG8gYmV0dGVyIHJlZmxlY3Qgd2hhdCB0aGUgZG9jdW1lbnQKICBhY3R1YWxseSBjb250YWlucy4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwMCkKLSBJIHJlbW92ZWQgYSBidW5jaCBvZiAnI2lmIDAnIHNlY3Rpb25zIGZyb20gdGhlIGNvZGUuIFRoZXkgb25seSBtYWtlIHRoaW5ncwogIGhhcmRlciB0byBmb2xsb3cuIEFmdGVyIGFsbCwgd2UgZG8gaGF2ZSBhbGwgb2xkZXIgdmVyc2lvbnMgaW4gdGhlIENWUy4KClZlcnNpb24gNy41LXByZTUKCkRhbmllbCAoMjggTm92ZW1iZXIgMjAwMCkKLSBJIGZpbGxlZCBpbiBtb3JlIGVycm9yIGNvZGVzIGluIHRoZSBtYW4gcGFnZSBlcnJvciBjb2RlIGxpc3QgdGhhdCBoYWQgYmVlbgogIGxhZ2dpbmcuCgotIEphbWVzIEdyaWZmaXRocyBtYWlsZWQgbWUgYSBmaW5lIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgQ1VSTE9QVF9NQVhSRURJUlMKICBsaWJjdXJsIG9wdGlvbi4gV2hlbiB1c2VkLCBpdCdsbCBwcmV2ZW50IGxvY2F0aW9uIGZvbGxvd2luZyBtb3JlIHRoYW4gdGhlCiAgc2V0IG51bWJlciBvZiB0aW1lcy4gSXQgaXMgdXNlZnVsIHRvIGJyZWFrIG91dCBvZiBlbmRsZXNzIHJlZGlyZWN0LWxvb3BzLgoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHR3byB0ZXN0IGNhc2VzIGZvciBmaWxlOi8vLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHRoZSBsaWJjdXJsIENVUkxPUFRfRklMRVRJTUUgc2V0b3B0LCB3aGVuIHNldCBpdCB0cmllcyB0byBnZXQgdGhlCiAgbW9kaWZpZWQgdGltZSBvZiB0aGUgcmVtb3RlIGRvY3VtZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBvcHRpb24gc2luY2UgaXQKICBpbnZvbHZlcyBhbiBleHRyYSBzZXQgb2YgY29tbWFuZHMgb24gRlRQIHNlcnZlcnMuIChVc2luZyB0aGUgTURUTSBjb21tYW5kCiAgd2hpY2ggaXMgbm90IGluIHRoZSBSRkM5NTkpCgogIGN1cmxfZWFzeV9nZXRpbmZvKCkgZ290IGEgY29ycmVzcG9uZGluZyBDVVJMSU5GT19GSUxFVElNRSB0byBnZXQgdGhlIHRpbWUKICBhZnRlciBhIHRyYW5zZmVyLiBJdCdsbCByZXR1cm4gYSB6ZXJvIGlmIENVUkxPUFRfRklMRVRJTUUgd2Fzbid0IHVzZWQgb3IgaWYKICB0aGUgdGltZSB3YXNuJ3QgcG9zc2libGUgdG8gZ2V0LgoKICAtLWhlYWQvLUkgdXNlZCBvbiBhIEZUUCBzZXJ2ZXIgd2lsbCBub3cgcHJlc2VudCBhICdMYXN0LU1vZGlmaWVkOicgaGVhZGVyCiAgaWYgY3VybCBjb3VsZCBnZXQgdGhlIHRpbWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlLgoKLSBBZGRlZCB0aGUgb3B0aW9uICctLWNhY2VydCBbZmlsZV0nIHRvIGN1cmwsIHdoaWNoIGFsbG93cyBhIHNwZWNpZmllZCBQRU0KICBmaWxlIHRvIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgd2hlbiBkb2luZyBIVFRQUwogIGNvbm5lY3Rpb25zLiBUaGlzIGhhcyBiZWVuIHJlcXVlc3RlZCwgcmF0aGVyIHJlY2VudGx5IGJ5IEh1bGthIEJvaHVzbGF2IGJ1dAogIG90aGVycyBoYXZlIGFza2VkIGZvciBpdCBiZWZvcmUgYXMgd2VsbC4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMCkKLSBOdW1lcm91cyBmaXhlcyB0aGUgdGVzdCBzdWl0ZSBoYXMgYnJvdWdodCBpbnRvIHRoZSBkYXlsaWdodDoKCiAgICogY3VybF91bmVzY2FwZSgpIGNvdWxkIHJldHVybiBhIHRvbyBsb25nIHN0cmluZwogICAqIG9uIGZ0cCB0cmFuc2ZlciBmYWlsdXJlcywgdGhlcmUgY291bGQgYmUgbWVtb3J5IGxlYWtzCiAgICogZnRwIENXRCBjb3VsZCB1c2UgYmFkIGRpcmVjdG9yeSBuYW1lcwogICAqIG1lbWRlYnVnIG5vdyB1c2VzIHRoZSBtcHJpbnRmKCkgcm91dGluZXMgZm9yIGJldHRlciBwb3J0YWJpbGl0eQogICAqIGZyZWUoTlVMTCkgcmVtb3ZlZCB3aGVuIGRvaW5nIHJlc3VtZWQgdHJhbnNmZXJzCgotIEFkZGVkIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBmb3IgRlRQLgoKLSBHZW5lcmFsIGNsZWFudXBzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyB3aXRoIGdjYyAtV2FsbCAtcGVkYW50aWMuCgotIEkgbWFkZSB0aGUgdGVzdHMvZnRwc2VydmVyLnBsIHdvcmsgd2l0aCB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ0cAogIG9wZXJhdGlvbnMuIFBPUlQsIFBBU1YsIFJFVFIsIFNUT1IsIExJU1QsIFNJWkUsIFVTRVIsIFBBU1MgYWxsIHdvcmsgbm93LiBOb3cKICBhbGwgSSBoYXZlIHRvIGRvIGlzIGludGVncmF0ZSB0aGUgZnRwIHNlcnZlciBkb2luZ3MgaW4gdGhlIHJ1bnRlc3RzLnBsCiAgc2NyaXB0IHNvIHRoYXQgZnRwIHRlc3RzIGNhbiBiZSBydW4gdGhlIHNhbWUgd2F5IGh0dHAgdGVzdHMgYWxyZWFkeSBydW4uCgpEYW5pZWwgKDIwIE5vdmVtYmVyIDIwMDApCi0gTWFkZSBsaWJjdXJsIGNhcGFibGUgb2YgZGVhbGluZyB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGhlIGZvcm1lciBsaW1pdCBvZgogIDQwOTYgYnl0ZXMgd2FzIGEgYml0IGFubm95aW5nIHdoZW4gcGVvcGxlIHdhbnRlZCB0byB1c2UgY3VybCB0byByZWFsbHkgbWFrZQogIGxpZmUgdG91Z2ggb24gYSB3ZWIgc2VydmVyLiBOb3csIHRoZSBjb21tYW5kIGxpbmUgbGltaXQgaXMgdGhlIG1vc3QgYW5ub3lpbmcKICBidXQgdGhhdCBjYW4gYmUgY2lyY3VtdmVudGVkIGJ5IHVzaW5nIGEgY29uZmlnIGZpbGUuCgogIE5PVEU6IHRoZXJlIGlzIHN0aWxsIGEgNDA5Ni1ieXRlIGxpbWl0IG9uIFVSTHMgZXh0cmFjdGVkIGZyb20gTG9jYXRpb246CiAgaGVhZGVycy4KCi0gQ29ycmVjdGVkIHRoZSBzcGVsbGluZyBvZiAncmVzb2x2ZScgaW4gdHdvIGVycm9yIG1lc3NhZ2VzLgoKLSBBbGV4YW5kZXIgS291cmFrb3MgcG9zdGVkIGEgYnVnIHJlcG9ydCBhbmQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCEgSXQKICB0dXJuZWQgb3V0IHRoYXQgbHlueCBhbmQgd2dldCBzdXBwb3J0IGxvd2VyY2FzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcwogIHdoZXJlIGN1cmwgb25seSBsb29rZWQgZm9yIHRoZSB1cHBlcmNhc2UgdmVyc2lvbnMuIE5vdyBjdXJsIHdpbGwgdXNlIHRoZQogIGxvd2VyY2FzZSB2ZXJzaW9ucyBpZiB0aGV5IGV4aXN0LCBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgdXNlIHRoZSB1cHBlcmNhc2UKICB2ZXJzaW9ucy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMjAwMCkKLSBjdXJsX2Zvcm1mcmVlKCkgd2FzIGFkZGVkLiBIb3cgY29tZSBubyBvbmUgbWlzc2VkIHRoYXQgb25lIGJlZm9yZT8gSSByYW4gdGhlCiAgdGVzdCBzdWl0ZSB3aXRoIHRoZSBtYWxsb2MgZGVidWcgZW5hYmxlZCBhbmQgZ290IGxvdHMgb2YgIm5pY2UiIHdhcm5pbmdzIG9uCiAgbWVtb3J5IGxlYWtzLiBUaGUgbW9zdCBzZXJpb3VzIG9uZSB3YXMgdGhpcy4gVGhlcmUgd2VyZSBhbHNvIGxlYWtzIGluIHRoZQogIGNvb2tpZSBoYW5kbGluZywgYW5kIGEgZmV3IGVycm9ycyB3aGVuIGN1cmwgZmFpbGVkIHRvIGNvbm5lY3QgYW5kIHNpbWlsYXIKICB0aGluZ3MuIE1vcmUgdGVzdHMgY2FzZXMgd2VyZSBhZGRlZCB0byBjb3ZlciB1cCBhbmQgdG8gdmVyaWZ5IHRoYXQgdGhlc2UKICBwcm9ibGVtcyBoYXZlIGJlZW4gcmVtb3ZlZC4KCi0gTXVjaG8gdXBkYXRlZCBjb25maWcgZmlsZSBwYXJzZXIgKEknbSBkZWFkIHRpcmVkIG9mIGFsbCB0aGUgYnVnIHJlcG9ydHMgYW5kCiAgd2VpcmQgYmVoYXZpb3VyIEkgZ2V0IG9uIHRoZSBmb3JtZXIgb25lKS4gSXQgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgbm93LAogIGFsdGhvdWdoIEkgZG91YnQgbWFueSBwZW9wbGUgd2lsbCBub3RpY2UgdGhlIGRpZmZlcmVuY2VzLiBUaGUgbWFpbgogIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBpZiB5b3UgdXNlIG9wdGlvbnMgdGhhdCByZXF1aXJlIHBhcmFtZXRlcnMsIHRoZXkgbXVzdAogIGJvdGggYmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGxpbmUuIFdpdGggdGhpcyBuZXcgcGFyc2VyLCB5b3UgY2FuIGFsc28KICBzcGVjaWZ5IGxvbmcgb3B0aW9ucyB3aXRob3V0ICctLScgYW5kIHlvdSBtYXkgc2VwYXJhdGUgb3B0aW9ucyBhbmQKICBwYXJhbWV0ZXJzIHdpdGggOiBvciA9LiBJdCBtYWtlcyBhIGNvbmZpZyBmaWxlIGxpbmUgY291bGQgbG9vayBsaWtlOgoKICAgICAgICB1c2VyLWFnZW50ID0gImZvb2JhciBhbmQgc29tZXRoaW5nIgoKICBQYXJhbWV0ZXJzIHdpdGhpbiBxdW90ZXMgbWF5IGNvbnRhaW4gc3BhY2VzLiBXaXRob3V0IHF1b3RlcywgdGhleSdyZQogIGV4cGVjdGVkIHRvIGJlIGEgc2luZ2xlIG5vbi1zcGFjZSB3b3JkLgoKICBIYWQgdG8gcGF0Y2ggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzZXIgYSBsaXR0bGUgdG8gbWFrZSB0aGlzIHdvcmsuCgotIEFkZGVkIC0tdXJsIGFzIGFuIG9wdGlvbiB0byBhbGxvdyB0aGUgVVJMIHRvIGJlIHNwZWNpZmllZCB0aGlzIHdheS4gSXQgbWFrZXMKICB3YXkgbmljZXIgY29uZmlnIGZpbGVzLiBUaGUgcHJldmlvdXMgd2F5IG9mIHNwZWNpZnlpbmcgVVJMcyBpbiB0aGUgY29uZmlnCiAgZmlsZSBkb2Vzbid0IHdvcmsgYW55bW9yZS4KCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSBVc2luZyBjZXJ0YWluIGNoYXJhY3RlcnMgaW4gdXNlcm5hbWVzIG9yIHBhc3N3b3JkcyBmb3IgSFRUUCBhdXRoZW50aWNhdGlvbgogIGZhaWxlZC4gVGhpcyB3YXMgZHVlIHRvIHRoZSBtcHJpbnRmKCkgdGhhdCBoYWQgYSBzaWxseSBjaGVjayBmb3IgbGV0dGVycywKICBhbmQgaWYgdGhleSB3ZXJlbid0IGlzcHJpbnQoKSB0aGV5IHdlcmVuJ3Qgb3V0cHV0ZWQgImFzLWlzIi4gVGhpcyBjYXVzZWQKICBwYXNzd29yZHMgYW5kIHVzZXJuYW1lcyB1c2luZyAnpycgKGZvciBleGFtcGxlKSB0byBmYWlsLgoKVmVyc2lvbiA3LjQuMgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDAwKQotICd0ZXN0cy9ydW50ZXN0cy5wbCcgbm93IHNvcnRzIHRoZSB0ZXN0IGNhc2VzIHByb3Blcmx5IHdoZW4gJ2FsbCcgaXMgdXNlZC4KCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwMCkKLSBJIGZlbGwgb3ZlciB0aGUgZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xMi50eHQgSW50ZXJuZXQgRHJhZnQgdGl0bGVkCiAgIkV4dGVuc2lvbnMgdG8gRlRQIiB0aGF0IGNvbnRhaW5zIGEgZGVmaW5lZCB3YXkgaG93IHRoZSBmdHAgY29tbWFuZCBTSVpFCiAgY291bGQgYmUgYXNzdW1lZCB0byB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBwb3N0ZWQgYSBidWcgcmVwb3J0IGFib3V0IHVzaW5nICItQyAtIiBhbmQgRlRQIHVwbG9hZGluZyBhCiAgZmlsZSB0aGF0IGlzbid0IHByc2VudCBvbiB0aGUgc2VydmVyLiBUaGUgc2VydmVyIG1pZ2h0IHRoZW4gcmV0dXJuIGEgNTUwIGFuZAogIGN1cmwgd2lsbCBmYWlsLiBTaG91bGQgaXQgaW5zdGVhZCBhcyBMYXVyZW50IFBhcGllciBzdWdnZXN0cywgc3RhcnQKICB1cGxvYWRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIGFzIGEgbm9ybWFsIHVwbG9hZD8KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwMCkKLSBGaXhlZCBhIGNyYXNoIHdpdGggdGhlIGZvbGxvd2xvY2F0aW9uIGNvdW50ZXIuCgotIFdoaWxlIHdyaXRpbmcgdGVzdCBjYXNlcyBmb3IgdGhlIHRlc3Qgc3VpdGUsIEkgZGlzY292ZXJlZCBhbiBvbGQgbGltaXRhdGlvbgogIHRoYXQgcHJldmVudGVkIC1vIGFuZCAtVCB0byBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEkgcmVtb3ZlZCB0aGlzCiAgaW1tZWRpYXRlbHkgYXMgdGhpcyBoYXMgbm8gcmVsZXZhbmNlIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCiAgCi0gQ2hyaXMgRmFoZXJ0eSBmaXhlZCBhIGZyZWUtdHdpY2UgcHJvYmxlbSBpbiBsaWIvZmlsZS5jCgotIEkgZml4ZWQgdGhlIHBlcmwgaHR0cCBzZXJ2ZXIgcHJvYmxlbSBpbiB0aGUgdGVzdCBzdWl0ZS4KClZlcnNpb24gNy40LjIgcHJlNAoKRGFuaWVsICgxMCBOb3ZlbWJlciAyMDAwKQotIEkndmUgKGZpbmFsbHkpIHN0YXJ0ZWQgd29ya2luZyBvbiB0aGUgY3VybCB0ZXN0IHN1aXRlLiBJdCBpcyBpbiB0aGUgbmV3CiAgdGVzdHMvIGRpcmVjdG9yeS4gSXQgcmVxdWlyZXMgc2ggYW5kIHBlcmwuIFRoZXJlJ3MgYSBUQ1Agc2VydmVyIGluIHBlcmwgYW5kCiAgbW9zdCBvZiB0aGUgb3RoZXIgc3R1ZmYgcnVubmluZyBhIHByZXR0eSBzaW1wbGUgc2hlbGwgc2NyaXB0LgoKICBJJ3ZlIG9ubHkgbWFkZSBmb3VyIHRlc3QgY2FzZXMgc28gZmFyLCBidXQgaXQgcHJvdmVzIHRoZSBzeXN0ZW0gY2FuIHdvcmsuCgotIExhdXJlbnQgUGFwaWVyIG5vdGljZWQgdGhhdCBjdXJsIGRpZG4ndCBzZXQgVFlQRSB3aGVuIGRvaW5nIC0taGVhZCBjaGVja3MKICBmb3Igc2l6ZXMgb24gRlRQIHNlcnZlcnMuIFNvbWUgc2VydmVycyBzZWVtIHRvIHJldHVybiBkaWZmZXJlbnQgc2l6ZXMKICBkZXBlbmRpbmcgb24gd2hldGhlciBBU0NJSSBvciBCSU5BUlkgaXMgdXNlZCEKCi0gTGF1cmVudCBQYXBpZXIgZGV0ZWN0ZWQgdGhhdCBpZiB5b3UgYXBwZW5kZWQgYSBGVFAgdXBsb2FkIGFuZCBldmVyeXRoaW5nIHdhcwogIGFscmVhZHkgdXBsb2FkZWQsIGN1cmwgd291bGQgaGFuZy4KCi0gQW5ndXMgTWFja2F5J3MgZ2V0cGFzc19yKCkgaW4gbGliL2dldHBhc3MuYyBpcyBub3cgY29tcGxpYW50IHdpdGggdGhlCiAgZ2V0cGFzc19yKCkgZnVuY3Rpb24gaXQgc2VlbXMgc29tZSBzeXN0ZW1zIGFjdHVhbGx5IGhhdmUuCiAgCi0gVmVua2F0YXJhbWFuYSBNb2trYXBhdGkgZGV0ZWN0ZWQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIgYW5kIGNvcnJlY3RlZAogIGl0LiAgSWYgdGhlIGNvb2tpZSB3YXMgc2V0IGZvciB0aGUgZnVsbCBob3N0IG5hbWUgKGRvbWFpbj1mdWxsLmhvc3QuY29tKSwKICB0aGUgY29va2llIHdhcyBuZXZlciBzZW50IGJhY2sgYmVjYXVzZSBvZiBhIGZhdWx0eSBsZW5ndGggY29tcGFyaXNvbiBiZXR3ZWVuCiAgdGhlIHNldCBkb21haW4gbGVuZ3RoIGFuZCB0aGUgY3VycmVudCBob3N0IG5hbWUuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbHNvY2tldCAoT1MvMiBzZWVtcyB0byBuZWVkCiAgaXQpLiBBZGRlZCBhIGNoZWNrIGZvciBSU0FnbHVlL3JzYXJlZiBmb3IgdGhlIGNhc2VzIHdoZXJlIGxpYmNyeXB0byBpcyBmb3VuZAogIGJ1dCBsaWJzc2wgaXNuJ3QuIEkgaGF2ZW4ndCB2ZXJpZmllZCB0aGlzIGZpeCB5ZXQgdGhvdWdoLCBhcyBJIGhhdmUgbm8KICBzeXN0ZW0gdGhhdCByZXF1aXJlcyB0aG9zZSBsaWJzIHRvIGJ1aWxkLgogIApWZXJzaW9uIDcuNC4yIHByZTMKCkRhbmllbCAoNyBOb3ZlbWJlciAyMDAwKQotIFJlbW92ZWQgcGVycm9yKCkgb3V0cHV0cyBmcm9tIGdldHBhc3MuYy4gQW5ndXMgTWFja2F5IGFsc28gYWdyZWVkIHRvIGEKICBzbGlnaHRseSBtb2RpZmllZCBsaWNlbnNlIG9mIHRoZSBnZXRwYXNzLmMgZmlsZSBhcyB0aGUgcHJvdG90eXBlIHdhcyBjaGFuZ2VkLgoKRGFuaWVsICg2IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgcG9zc2liaWxpdHkgdG8gc2V0IGEgcGFzc3dvcmQgY2FsbGJhY2sgdG8gdXNlIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluLgogIFRoZXkncmUgY29udHJvbGVkIHdpdGggY3VybF9lYXN5X3NldG9wdCgpIG9mIGNvdXJzZSwgdGhlIHRhZ3MgYXJlCiAgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiBhbmQgQ1VSTE9QVF9QQVNTV0REQVRBLgoKLSBVc2VkIFQuIEJoYXJhdGgncyB0aGlua2luZyBhbmQgZml4ZWQgdGhlIHRpbWVycyB0aGF0IHNob3dlZCB0ZXJyaWJseSB3cm9uZwogIHRpbWVzIHdoZW4gbG9jYXRpb246IGhlYWRlcnMgd2VyZSBmb2xsb3dlZC4KCi0gRW1tYW51ZWwgVHljaG9uIGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZG4ndCByZWFsbHkgbGlrZSB1c2VyIG5hbWVzIG9ubHkgaW4KICB0aGUgVVJMLiBJIGNvcnJlY3RlZCB0aGlzIGFuZCBJIGFsc28gZml4ZWQgdGhlIHNpbmNlIGxvbmcgbGl2aW5nIHByb2JsZW0KICB3aXRoIFVSTCBlbmNvZGVkIHVzZXIgbmFtZXMgYW5kIHBhc3N3b3JkcyBpbiB0aGUgVVJMcy4gVGhleSBzaG91bGQgd29yayBub3cuCiAgCkRhbmllbCAoMiBOb3ZlbWJlciAyMDAwKQotIFdoZW4gSSBhZGRlZCAtLWludGVyZmFjZSwgdGhlIG5ldyBlcnJvciBjb2RlIHRoYXQgd2FzIGFkZGVkIHdpdGggaXQgd2FzCiAgaW5zZXJ0ZWQgaW4gdGhlIHdyb25nIHBsYWNlIGFuZCB0aHVzIGFsbCBlcnJvciBjb2RlcyBmcm9tIDM1IGFuZCB1cHdhcmRzIGdvdAogIGluY3JlYXNlZCBvbmUgc3RlcC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLCB3ZSdyZSBiYWNrIGF0IHRoZSBwcmV2aW91cwogIG51bWJlcnMuIEFsbCBuZXcgZXhpdCBjb2RlcyBzaG91bGQgYmUgYWRkZWQgYXQgdGhlIGVuZC4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIGEgY2hlY2sgZm9yIHNpZ25hbCgpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHNvIHRoYXQgaWYgc2lnYWN0aW9uKCkKICBpc24ndCBwcmVzZW50LCB3ZSBjYW4gdXNlIHNpZ25hbCgpIGluc3RlYWQuCgotIEknbSBoYXZpbmcgYSBsaWNlbnNlIGRpc2N1c3Npb24gZ29pbmcgb24gcHJpdmF0ZWx5LiBUaGUgaXNzdWUgaXMgeWV0IGFnYWluCiAgR1BMLWxpY2Vuc2VkIHByb2dyYW1zIHRoYXQgaGF2ZSBwcm9ibGVtcyB3aXRoIE1QTC4gSSBhbSBsZWFuaW5nIHRvd2FyZHMKICBtYWtpbmcgYSBraW5kIG9mIGR1YWwtbGljZW5zZSB0aGF0IHdpbGwgc29sdmUgdGhpcyBvbmNlIGFuZCBmb3IgYWxsLi4uCgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMCkKLSBBZGRlZCB0aGUgcGFja2FnZXMvIGRpcmVjdG9yeS4gSSBpbnRlbmQgdG8gbGV0IHRoaXMgY29udGFpbiBzb21lIGRvY3MgYW5kCiAgdGVtcGxhdGVzIG9uIGhvdyB0byBnZW5lcmF0ZSBjdXN0b20tZm9ybWF0IHBhY2thZ2VzIGZvciB2YXJpb3VzIHBsYXRmb3Jtcy4KICBJJ3ZlIG5vdyByZW1vdmVkIHRoZSBSUE0gcmVsYXRlZCBjdXJsLnNwZWMgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSByb290LgoKRGFuaWVsICgzMCBPY3RvYmVyIDIwMDApCi0gVC4gQmhhcmF0aCBicm91Z2h0IGEgc2V0IG9mIHBhdGNoZXMgdGhhdCBicmluZyBuZXcgZnVuY3Rpb25hbGl0eSB0bwogIGN1cmxfZWFzeV9nZXRpbmZvKCkgYW5kIGN1cmxfZWFzeV9zZXRvcHQoKS4gTm93IHlvdSBjYW4gcmVxdWVzdCBwZWVyCiAgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdpdGggdGhlICpzZXRvcHQoKSBDVVJMT1BUX1NTTF9WRVJJRllQRUVSIG9wdGlvbgogIGFuZCB0aGVuIHVzZSB0aGUgQ1VSTE9QVF9DQUlORk8gdG8gc2V0IHRoZSBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkgdGhlIHJlbW90ZQogIHBlZXIgYWdhaW5zdC4gQWZ0ZXIgYW4gc3VjaCBhbiBvcGVyYXRpb24gd2l0aCBhIHZlcmlmaWNhdGlvbiByZXF1ZXN0LCB0aGUKICAqX2dldGluZm8oKSBvcHRpb24gQ1VSTElORk9fU1NMX1ZFUklGWVJFU1VMVCB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dAogIHdoZXRoZXIgdGhlIHZlcmlmaWNhdGlvbiBzdWNjZWVkZWQgb3Igbm90LiAgCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgdXMgYSBzcGxlbmRpZCBwYXRjaCB0aGF0IHNvbHZlcyB0aGUgbG9uZy1zdGFuZGluZwogIGFubm95aW5nIHByb2JsZW0gd2l0aCB0aW1lb3V0cyB0aGF0IG1hZGUgY3VybCBleGl0IHdpdGggc2lsbHkgZXhpdCBjb2RlcwogICh3aGljaCBhcyBiZWVuIGNvbW1lbnRlZCBvdXQgbGF0ZWx5KS4gVGhpcyBzb2x1dGlvbiBpcyBzaWdhY3Rpb24oKSBiYXNlZCBhbmQKICBvZiBjb3Vyc2UgdGhlbiBvbmx5IHdvcmtzIGZvciB1bml4ZXMgKGFuZCBvbmx5IHRob3NlIHVuaXhlcyB0aGF0IGFjdHVhbGx5CiAgaGF2ZSB0aGUgc2lnYWN0aW9uKCkgZnVuY3Rpb24pLgoKRGFuaWVsICgyNiBPY3RvYmVyIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSBmbGF3IG1lbnRpb25lZCBieSBLZXZpbiBSb3RoCiAgdGhhdCBtYWRlIHRoZSBwYXNzd29yZCBnZXQgZWNob2VkIHdoZW4gcHJvbXB0ZWQgZm9yIGludGVyYWN0aXZlbHkuIFRoZQogIGdldHBhc3MoKSBmdW5jdGlvbiAobm93IGtub3duIGFzIG15X2dldHBhc3MoKSkgd2FzIGFsc28gZml4ZWQgdG8gbm90IHVzZSBhbnkKICBzdGF0aWMgYnVmZmVycy4gVGhpcyBhbHNvIG1lYW5zIHdlIGNhbm5vdCB1c2UgdGhlICJzdGFuZGFyZCIgZ2V0cGFzcygpCiAgZnVuY3Rpb24gZXZlbiBmb3IgdGhvc2Ugc3lzdGVtcyB0aGF0IGhhdmUgaXQsIHNpbmNlIGl0IGlzbid0IHRocmVhZC1zYWZlLgogIAotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgaWYgeW91J2Qgd3JpdGUgYSBjb25maWcgZmlsZSB3aXRoICctdiB1cmwnLCB0aGUKICB1cmwgd291bGQgbm90IGJlIHVzZWQgYXMgImRlZmF1bHQgVVJMIiBhcyBkb2N1bWVudGVkLCBhbHRob3VnaCBpZiB5b3Ugd3JvdGUKICBpdCAndXJsIC12JyBpdCB3b3JrZWQhIFRoaXMgaGFzIGJlZW4gY29ycmVjdGVkIG5vdy4KCi0gS2V2aW4gUm90aCdzIGlkZWEgb2YgdXNpbmcgbXVsdGlwbGUgLWQgb3B0aW9ucyBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgd2FzCiAganVzdCBicmlsbGlhbnQsIGFuZCBJIGNvdWxkbid0IHJlYWxseSB0aGluayBvZiBhbnkgcmVhc29uIHdoeSB3ZSBzaG91bGRuJ3QKICBzdXBwb3J0IGl0ISBUaGUgYXBwZW5kIGZ1bmN0aW9uIGFsd2F5cyBhcHBlbmQgJyYnIGFuZCB0aGVuIHRoZSBuZXcgLWQKICBjaHVuay4gVGhpcyBlbmFibGVzIGNvbnN0cnVjdHMgbGlrZSB0aGUgZm9sbG93aW5nOgoKICAgICAgICBjdXJsIC1kIG5hbWU9ZGFuaWVsIC1kIGFnZT11bmtub3duIGZvb2JhcnNpdGUuY29tCgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMCkKLSBJIGZpeGVkIHRoZSBsaWIvbWVtZGVidWcuYyBzb3VyY2Ugc28gdGhhdCBpdCBjb21waWxlcyBvbiBMaW51eCBhbmQgb3RoZXIKICBzeXN0ZW1zLiBJdCB3aWxsIGJlIHVzZWZ1bCBvbmUgZGF5IHdoZW4gc29tZW9uZSBlbHNlIGJ1dCBtZSB3YW50cyB0byBydW4gdGhlCiAgbWVtb3J5IGRlYnVnZ2luZyBzeXN0ZW0uCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMCkKLSBJIG1vZGlmaWVkIHRoZSBtYWtldGd6IGFuZCBjb25maWd1cmUgc2NyaXB0cywgc28gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdpbGwgZmV0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gdGhlIGluY2x1ZGUvY3VybC9jdXJsLmggaGVhZGVyIGZpbGVzLCBhbmQKICB0aGVuIHRoZSBtYWtldGd6IGRvZXNuJ3QgaGF2ZSB0byByZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gSSBidWlsZAogIHJlbGVhc2UtYXJjaGl2ZXMuCgotIEJq9nJuIFN0ZW5iZXJnIGFuZCBMaW51cyBOaWVsc2VuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHNpbGx5CiAgZW5vdWdoIHRvIG5vdCBhbGxvdyBALWxldHRlcnMgaW4gcGFzc3dvcmRzIHdoZW4gdGhleSB3ZXJlIHNwZWNpZmllZCB3aXRoIHRoZQogIC11IG9yIC1VIGZsYWdzIChDVVJMT1BUX1VTRVJQV0QgYW5kIENVUkxPUFRfUFJPWFlVU0VSUFdEKS4gVGhpcyBhbHNvCiAgc3VnZ2VzdHMgdGhhdCBjdXJsIHByb2JhYmx5IHNob3VsZCB1cmwtZGVjb2RlIHRoZSBwYXNzd29yZCBwaWVjZSBvZiBhbiBVUkwKICBzbyB0aGF0IHlvdSBjb3VsZCBwYXNzIGFuIGVuY29kZWQgQC1sZXR0ZXIgdGhlcmUuLi4KICAKRGFuaWVsICgyMCBPY3RvYmVyIDIwMDApCi0gWWV0IGFub3RoZXIgaHR0cCBzZXJ2ZXIgYmFyZmVkIG9uIGN1cmwncyByZXF1ZXN0IHRoYXQgaW5jbHVkZSB0aGUgcG9ydAogIG51bWJlciBpbiB0aGUgSG9zdDogaGVhZGVyIGFsd2F5cy4gSSBub3cgb25seSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBpdAogIGlzbid0IHRoZSBkZWZhdWx0ICg4MCBmb3IgSFRUUCwgNDQzIGZvciBIVFRQUykuIHd3dy5wZXJsLmNvbSB0dXJuZWQgb3V0IHRvCiAgcnVuIG9uZSBvZiB0aG9zZSBuYXN0eSBzZXJ2ZXJzLgoKLSBUaGUgUEhQNCBtb2R1bGUgZm9yIGN1cmwgaGFkIHByb2JsZW1zIHdpdGggcmVmZXJlciB0aGF0IHNlZW1zIHRvIGhhdmUgYmVlbgogIGNvcnJlY3RlZCBqdXN0IHllc3RlcmRheS4gKFN0ZXJsaW5nIEh1Z2hlcyBvZiB0aGUgUEhQIHRlYW0gY29uZmlybWVkIHRoaXMpCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwMCkKLSBWbGFkaW1pciBPYmxvbW92IHJlcG9ydGVkIHRoYXQgdGhlIC1ZIGFuZCAteSBvcHRpb25zIGRpZG4ndCB3b3JrLiBUaGV5CiAgZGlkbid0IHdvcmsgZm9yIG1lIGVpdGhlci4gVGhpcyBvbmNlIGFnYWluIHByb3ZlcyB3ZSBzaG91bGQgaGF2ZSB0aGF0IHRlc3QKICBzdWl0ZS4uLgogIAotIEkgZmluYWxseSBjaGFuZ2VkIHRoZSBlcnJvciBtZXNzYWdlIGxpYmN1cmwgcmV0dXJucyBpZiB5b3UgdHJ5IGEgaHR0cHM6Ly8KICBVUkwgd2hlbiB0aGUgbGlicmFyeSB3YXNuJ3QgYnVpbGQgd2l0aCBTU0wgZW5hYmxlZC4gSXQgd2lsbCBub3cgcmV0dXJuIHRoaXMKICBlcnJvcjoKICAgICAgICAibGliY3VybCB3YXMgYnVpbHQgd2l0aCBTU0wgZGlzYWJsZWQsIGh0dHBzOiBub3Qgc3VwcG9ydGVkISIKCiAgSSByZWFsbHkgaG9wZSBpdCB3aWxsIG1ha2UgaXQgYSBiaXQgY2xlYXJlciB0byB1c2VycyB3aGVyZSB0aGUgYWN0dWFsCiAgcHJvYmxlbSBsaWVzLgoKVmVyc2lvbiA3LjQuMQoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gSSBmb3Jnb3QgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIG1hbGxvYyBkZWJ1ZyBkZWZpbmVzIGZyb20gdGhlIG1ha2VmaWxlcyBpbgogIHRoZSByZWxlYXNlIGFyY2hpdmUgKG9mIGNvdXJzZSkuCgpWZXJzaW9uIDcuNAoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gVGhlIGJ1ZmZlciBvdmVyZmxvdyBtZW50aW9uZWQgYmVsb3cgd2FzIHBvc3RlZCB0byBidWd0cmFxIG9uIEZyaWRheSAxM3RoLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDApCi0gQ29saW4gUm9iZXJ0IFBoaXBwcyBlbGVnYW50bHkgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93LiBJdCBjb3VsZCBiZSB1c2VkCiAgYnkgYW4gZXZpbCBmdHAgc2VydmVyIHRvIGNyYXNoIGN1cmwuIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgb2YgcmVwbGFjaW5nIGEKICBmZXcgb3RoZXIgc3ByaW50ZigpcyBpbnRvIHNucHJpbnRmKClzIGFzIHdlbGwuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMCkKLSBGb3VuZCBzb21lIG1vcmUgbWVtb3J5IGxlYWtzLiBUaGlzIG5ldyBzaW1wbGUgbWVtb3J5IGRlYnVnZ2VyIGhhcyB0dXJuZWQgb3V0CiAgcmVhbGx5IHVzZWZ1bCEKClZlcnNpb24gNy40IHByZTYKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gRmxvcmlhbiBLb2VuaWcgcG9pbnRlZCBvdXQgdGhhdCB0aGUgYm9vbCB0eXBlZGVmIGluIHRoZSBjdXJsL2N1cmwuaCBpbmNsdWRlCiAgZmlsZSB3YXMgYnJlYWtpbmcgUEhQIDQuMC4zIGNvbXBpbGluZy4gVGhlIGJvb2wgdHlwZWRlZiBpcyBub3QgdXNlZCBpbiB0aGUKICBwdWJsaWMgaW50ZXJmYWNlIGFuZCB3YXMgd3JvbmdseSBpbnNlcnRlZCBpbiB0aGF0IGhlYWRlciBmaWxlLgoKLSBK9nJnIEhhcnRyb3RoIGNvcnJlY3RlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIGluIHRoZSBzcmMvdXJsZ2xvYi5jIHN0dWZmLiBJdAogIGRpZG4ndCBoYXJtIGFueW9uZSBzaW5jZSB0aGUgbWVtb3J5IGlzIGZyZWUoKWVkIG9uIGV4aXQgYW55d2F5LgoKLSBDb3JyZWN0ZWQgdGhlIHNyYy9tYWluLmMuIFdlIHVzZSB0aGUgX01QUklOVEZfUkVQTEFDRSAjZGVmaW5lIHRvIHVzZSBvdXIKICBsaWJjdXJsLXByaW50ZigpIGZ1bmN0aW9ucy4gVGhpcyBnaXZlcyB1cyBzbnByaW50ZigpIGV0IGFsIG9uIGFsbAogIHBsYXRmb3Jtcy4gSSBjb252ZXJ0ZWQgdGhlIGFsbG9jYXRlZCB1c2VyYWdlbnQgc3RyaW5nIHRvIG9uZSB0aGF0IHVzZXMgYQogIGxvY2FsIGJ1ZmZlci4KCi0gSSd2ZSBzZXQgYW4gI2lmIDAgc2VjdGlvbiBhcm91bmQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyCiAgZ2VuZXJhdGVkIGluIGxpYi9mb3JtZGF0YS5jLiBUaGlzIHdpbGwgaG9wZWZ1bGx5IG1ha2UgY3VybCBkbyBtb3JlCiAgUEhQLWZyaWVuZGx5IG11bHRpLXBhcnQgcG9zdHMuCgpWZXJzaW9uIDcuNCBwcmU1CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIE5pY28gQmFnZ3VzIGZvdW5kIG91dCB0aGF0IGN1cmwncyBhYmlsaXR5IHRvIGZvcmNlIGEgQVNDSUkgZG93bmxvYWQgd2hlbgogIHVzaW5nIEZUUCB3YXMgbm8gbG9uZ2VyIHdvcmtpbmchIEkgY29ycmVjdGVkIHRoaXMuIFRoaXMgcHJvYmxlbSB3YXMgcHJvYmFibHkKICBpbnRyb2R1Y2VkIHdoZW4gSSByZWRlc2lnbmVkIGxpYmN1cmwgZm9yIHZlcnNpb24gNy4KCi0gR2VvcmcgSG9ybiBwcm92aWRlZCBhIHNvdXJjZSBleGFtcGxlIHRoYXQgcHJvdmVkIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybC4KICBJIGFkZGVkIHNpbXBsZSBtZW1vcnkgZGVidWdnaW5nIGZhY2lsaXRpZXMgYW5kIG5vdyB3ZSBjYW4gbWFrZSBsaWJjdXJsIGxvZwogIGFsbCBtZW1vcnkgZmlkZGxpbmcgZnVuY3Rpb25zLiBBbiBhZGRpdGlvbmFsIHBlcmwgc2NyaXB0IGlzIHVzZWQgdG8gYW5hbHl6ZQogIHRoZSBvdXRwdXQgbG9nZmlsZSBhbmQgdG8gbWF0Y2ggbWFsbG9jKClzIHdpdGggZnJlZSgpcyBldGMuIFRoZSBtZW1vcnkgbGVhawogIEdlb3JnIGZvdW5kIHR1cm5lZCBvdXQgdG8gYmUgdGhlIG1haW4gY29va2llIHN0cnVjdCB0aGF0IGNvb2tpZV9jbGVhbnVwKCkKICBkaWRuJ3QgZnJlZSEgVGhlIHBlcmwgc2NyaXB0IGlzIG5hbWVkIG1lbWFuYWx5emUucGwgYW5kIGl0IGlzIGF2YWlsYWJsZSBpbgogIHRoZSBDVlMgcmVzcG9zaXRvcnksIG5vdCBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICg4IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGZvdW5kIGEgR2V0SG9zdCgpIHByb2JsZW0uIEl0IHR1cm5lZCBvdXQgaXQgbmV2ZXIgYXNzaWduZWQgdGhlCiAgcG9pbnRlciBpbiB0aGUgdGhpcmQgYXJndW1lbnQgcHJvcGVybHkhIFRoaXMgY291bGQgbWFrZSBhIGNyYXNoLCBvciBhdCBiZXN0CiAgYSBtZW1vcnkgbGVhayEKClZlcnNpb24gNy40IHByZTQKCkRhbmllbCAoNiBPY3RvYmVyIDIwMDApCi0gSXMgdGhlIC1GIHBvc3QgZm9sbG93aW5nIHRoZSBSRkMgMTg2NyBzcGVjPyBXZSBoYWQgdGhpcyBkaWN1c3Npb24gb24gdGhlCiAgbWFpbGluZyBsaXN0IHNpbmNlIGl0IGFwcGVhcnMgY3VybCBjYW4ndCBwb3N0IC1GIGZvcm0gcG9zdHMgdG8gYSBQSFAKICByZWNlaXZlci4uLiBJJ3ZlIGJlZW4gaW4gdG91Y2ggd2l0aCB0aGUgUEhQIGRldmVsb3BlcnMgYWJvdXQgdGhpcy4KCi0gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IHRoYXQgdGhlIGxvbmcgb3B0aW9uICctLXByb3h5JyB3YXNuJ3Qgd29ya2luZwogIGFueW1vcmUhIFRoZSBvcHRpb24gcGFyc2VyIGdvdCBjb25mdXNlZCB3aGVuIEkgYWRkZWQgdGhlIC0tcHJveHl0dW5uZWwgZm9yCiAgNy4zLiBUaGlzIHdhcyBpbmRlZWQgYSB2ZXJ5IG9sZCBmbGF3IHRoYXQgaGFzbid0IHR1cm5lZCB1cCB1bnRpbCBub3cuLi4KCi0gSvZybiBIYXJ0cm90aCBwcm92aWRlZCBwYXRjaGVzLCB1cGRhdGVkIG1ha2VmaWxlcyBhbmQgdHdvIG5ldyBmaWxlcyBmb3IgRExMCiAgc3R1ZmYgb24gd2luMzIuIEhlIGFsc28gcG9pbnRlZCBvdXQgdGhhdCBsaWIgc291cmNlIGZpbGVzIHdlcmUgY29tcGlsZWQgd2l0aAogIC1JLi4vc3JjIHdoaWNoIGlzbid0IG9ubHkgd3JvbmcgYnV0IHBsYWluIHN0dXBpZCEKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZpeGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAgcmVzdW1lLiBDdXJsIHByZXZpb3VzbHkgdXNlZAogIGEgbG9jYWwgdmFyaWFibGUgYmFkbHksIHRoYXQgY291bGQgbGVhZCB0byBjcmFzaGVzLgoKVmVyc2lvbiA3LjQgcHJlMwoKRGFuaWVsICg0IE9jdG9iZXIgMjAwMCkKLSBNb3JlIGRvY3Mgd3JpdHRlbi4gVGhlIGN1cmxfZWFzeV9nZXRpbmZvLjMgbWFuIHBhZ2UgaXMgbm93IHByZXR0eSBhY2N1cmF0ZSwKICBhcyBpcyB0aGUgLXcgc2VjdGlvbiBpbiBjdXJsLjEuIEkgYWRkZWQgdHdvIG9wdGlvbnMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCiAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNlaXZlZCBoZWFkZXJzJyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgSFRUUAogIHJlcXVlc3QuIFQuIEJoYXJhdGggcmVxdWVzdGVkIHRoZW0uCiAgCkRhbmllbCAoMyBPY3RvYmVyIDIwMDApCi0gQ29ycmVjdGVkIGEgc2V2ZXIgZnJlZSgpIGJlZm9yZSB1c2UgaW4gdGhlIG5ldyBhZGRfYnVmZmVyX3NlbmQoKSEgOy0pCgpWZXJzaW9uIDcuNCBwcmUyCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIEphc29uIFMuIFByaWViZSBzZW50IG1lIHBhdGNoZXMgdGhhdCBjaGFuZ2VkIHRoZSB3YXkgY3VybCBpc3N1ZXMgSFRUUAogIHJlcXVlc3RzLiBUaGUgZW50aXJlIHJlcXVlc3QgaXMgbm93IGlzc3VlZCBpbiBvbmUgc2luZ2xlIHNob3QuIEl0IGRpZG4ndCBkbwogIHRoaXMgcHJldmlvdXNseSwgYW5kIGl0IGhhcyB0dXJuZWQgb3V0IHRoYXQgc2luY2UgdGhlIGNvbW1vbiBicm93c2VycyBkbyBpdAogIHRoaXMgd2F5LCBzb21lIHNpdGVzIGhhdmUgdHVybmVkIG91dCB0byB3b3JrIHdpdGggYnJvd3NlcnMgYnV0IG5vdCB3aXRoCiAgY3VybCEgQWx0aG91Z2ggdGhpcyBpcyBub3QgYSBjbGllbnQtc2lkZSBwcm9ibGVtLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KICBmdWxseSBlbXVsYXRlIGJyb3dzZXJzLCBhbmQgdGh1cyB3ZSBoYXZlIG5vdyBhZGp1c3RlZCB0aGUgbmV0d29ya2luZyBsYXllcgogIHRvIHNsaWdodGx5IG1vcmUgYXBwZWFyIGFzIGEgYnJvd3Nlci4gSSBhZGp1c3RlZCBKYXNvbidzIHBhdGNoLCB0aGUgZmF1bHRzCiAgYXJlIHByb2JhYmx5IG1pbmUuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAwKQotIEFueW9uZSB3aG8gZXZlciB1cGxvYWRlZCBkYXRhIHdpdGggY3VybCBvbiBhIHNsb3cgbGluayBoYXMgbm90aWNlZCB0aGF0IHRoZQogIHByb2dlc3MgbWV0ZXIgaXMgdXBkYXRlZCB2ZXJ5IGluZnJlcXVlbnRseS4gVGhhdCBpcyBkdWUgdG8gdGhlIGxhcmdlIGJ1ZmZlcgogIHNpemUgY3VybCBpcyB1c2luZy4gSXQgcmVhZHMgNTBLYiBhbmQgc2VuZHMgaXQsIHVwZGF0ZXMgdGhlIHByb2dyZXNzIG1ldGVyCiAgYW5kIGxvb3BzLiA1MEtiIGlzIHZlcnkgbXVjaCBvbiBhIHNsb3cgbGluaywgYWx0aG91Z2ggaXQgaXMgcHJldHR5IG5lYXQgdG8KICB1c2Ugb24gYSBmYXN0IG9uZS4KCiAgSSd2ZSBub3cgbWFkZSBhbiBhZGp1c3RtZW50IHRoYXQgbWFrZXMgY3VybCB1c2UgYSAyS2IgYnVmZmVyIGZvciB1cGxvYWRzIHRvCiAgc3RhcnQgd2l0aC4gSWYgY3VybCdzIGF2ZXJhZ2UgdXBsb2FkIHNwZWVkIGlzIGZhc3RlciB0aGFuIGJ1ZmZlciBzaXplIGJ5dGVzCiAgcGVyIHNlY29uZCwgY3VybCB3aWxsIGluY3JlYXNlIHRoZSB1c2VkIGJ1ZmZlciBzaXplIHVwIHRvIG1heCA1MEtiLiBJdAogIHNob3VsZCBtYWtlIHRoZSBwcm9ncmVzcyBtZXRlciB3b3JrIGJldHRlci4KICAKVmVyc2lvbiA3LjQgcHJlMQoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwMCkKLSBSaXBwZWQgb3V0IHRoZSAtdyBzdHVmZiBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBwdXQgaW4gdGhlIGN1cmwgdG9vbC4gSXQgZ2V0cwogIGFsbCB0aGUgcmVsZXZhbnQgaW5mbyBmcm9tIHRoZSBsaWJyYXJ5IHVzaW5nIHRoZSBuZXcgY3VybF9lYXN5X2dldGluZm8oKQogIGZ1bmN0aW9uLgoKLSBicmFkIGF0IG9wZW5ic2Qub3JnIG1haWxlZCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIG15IGtlcmJlcm9zIG1pc3Rha2UgYW5kCiAgcmVtb3ZlZCBhIGNvbXBpbGVyIHdhcm5pbmcgZnJvbSBob3N0aXAuYyB0aGF0IE9wZW5CU0QgcGVvcGxlIGdldC4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDApCi0gT2YgY291cnNlIChJIHNob3VsZCBwcm9iYWJseSBnZXQgcHVuaXNoZWQgc29tZWhvdykgSSBkaWRuJ3QgcHJvcGVybHkgY29ycmVjdAogIHRoZSAjaW5jbHVkZSBsaW5lcyBmb3IgdGhlIGJhc2U2NCBzdHVmZiBpbiB0aGUga2VyYmVyb3Mgc291cmNlcyBpbiB0aGUganVzdAogIHJlbGVhc2VkIDcuMyBwYWNrYWdlLiBUaGV5IHN0aWxsIGluY2x1ZGUgdGhlICpfa3JiLmggZmlsZXMhIE5vdywgdGhlIGVycm9yCiAgaXMgc29vbyB2ZXJ5IGVhc3kgdG8gc3BvdCBhbmQgZml4IHNvIEkgd29uJ3QgYm90aGVyIHdpdGggYSBxdWljayBidWcgZml4CiAgcmVsZWFzZS4gSSdsbCBwb3N0IGEgcGF0Y2ggd2hlbmV2ZXIgb25lIGlzIG5lZWRlZCBpbnN0ZWFkLiBJdCdsbCBiZQogIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIGluIGEgZmV3IG1pbnV0ZXMgYW55d2F5LgoKVmVyc2lvbiA3LjMKCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDApCi0gUmVtb3ZlZCB0aGUgYmFzZTY0X2tyYi5bY2hdIGZpbGVzLiBUaGV5J3ZlIG5vdyByZXBsYWNlZCB0aGUgZm9ybWVyCiAgYmFzZTY0LltjaF0gZmlsZXMuCgpEYW5pZWwgKDI2IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgc29tZSBkb2NzLgoKLSBJIGNoYW5nZWQgdGhlIE9wZW5TU0wgZml4IHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBhcyB3ZWxsLiBUaGUgcG9zdGVkCiAgcGF0Y2ggd2FzIG9ubHkgd29ya2luZyB3aXRoIDAuOS42IGFuZCBubyBvbGRlciBvbmVzLgogIApWZXJzaW9uIDcuMy1wcmU4CgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAwKQotIEVyZG11dCBQZmVpZmVyIGluZm9ybWVkIHVzIHRoYXQgY3VybCBkaWRuJ3QgYnVpbGQgd2l0aCBPcGVuU1NMIDAuOS42IGFuZAogIHNob3dlZCB1cyB3aGF0IG5lZWRlZCB0byBnZXQgcGF0Y2hlZCBpbiBvcmRlciB0byBtYWtlIGl0IGJ1aWxkIHByb3Blcmx5CiAgYWdhaW4uCgotIERpcmsgS3J1c2NoZXdza2kgZm91bmQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIuIEkgbWFkZSBhbiBhbHRlcm5hdGl2ZQogIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBEaXJrIGhpbXNlbGYgc3VnZ2VzdGVkLiBUaGUgYnVnIG1hZGUgYSBjb29raWUKICBoZWFkZXIgdGhhdCBkaWRuJ3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZW1pY29sb24gdG8gbm90IGdldCBwYXJzZWQuCgotIEkndmUgbWFya2VkIC1jIGFuZCAtdCBkZXByZWNhdGVkIG5vdy4gSWYgeW91IHVzZSBhbnkgb2YgdGhlbSwgY3VybCB3aWxsIHRlbGwKICB5b3UgdG8gdXNlICItQyAtIiBvciAiLVQgLSIgaW5zdGVhZC4gSSBkb24ndCB0aGluayBvY2N1cHlpbmcgdHdvIGxldHRlcnMgZm9yCiAgbmVhcmx5IGlkZW50aWNhbCBmdW5jdGlvbnMgaXMgZ29vZCB1c2UuIEFsc28sIC1UIC0ga2luZCBvZiBmb2xsb3dzIHRoZSBjdXJsCiAgdHJhZGl0aW9uIG9mIHVzaW5nIC0gZm9yIHN0ZGluIHdoZXJlIGEgZmlsZSBuYW1lIGlzIGV4cGVjdGVkLgoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IGZpbmFsbHkgbWFkZSB0aGUga3JiNCBmdHAgdXBsb2FkCiAgd29yayEKCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zIGNvZGUgaXMgbm90IHF1aXRlIHRocmVhZC1zYWZlIHlldC4gVGhlcmUgYXJlIGEgZmV3IG1vcmUgZ2xvYmFscwogIHRoYXQgbmVlZCB0byBiZSB0YWtlIGNhcmUgb2YuIExldCdzIGdldCB0aGUgdXBsb2FkIHdvcmtpbmcgZmlyc3QhCgpEYW5pZWwgKDIwIFNlcHRlbWJlciAyMDAwKQotIFJpY2hhcmQgUHJlc2NvdHQgc29sdmVkIGFub3RoZXIgbmFtZSBsb29rdXAgYnVmZmVyIHNpemUgcHJvYmxlbS4gSSB0b29rIHRoaXMKICBvcHBvcnR1bml0eSB0byByZXdyaXRlIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24uIFdpdGggdGhlc2UgbGFyZ2UgYnVmZmVyCiAgc2l6ZXMsIEkgdGhpbmsga2VlcGluZyB0aGVtIGFzIGxvY2FsIGFycmF5cyBxdWlja2x5IHR1cm4gdWdseS4gSSBub3cgdXNlCiAgbWFsbG9jKCkgdG8gZ2V0IHRoZSBidWZmZXIgbWVtb3J5LiBUaGFua3MgdG8gdGhpcywgSSBub3cgY2FuIHJlYWxsb2MoKSB0byBhCiAgbGFyZ2UgYnVmZmVyIGluIGNhc2Ugb2YgZGVtYW5kIChlcnJubyA9PSBFUkFOR0UpIGluIGNhc2UgYSBzb2x1dGlvbiBsaWtlCiAgdGhhdCB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LiBJIHN0aWxsIHdhbnQgdG8gYXZvaWQgdGhhdCBraW5kIG9mIG5hc3RpbmVzcy4KCi0gVHJpZWQgdG8gY29tcGlsZSBhbmQgcnVuIGN1cmwgb24gTGludXggZm9yIGFscGhhIGFuZCBGcmVlQlNEIGZvciBhbHBoYS4gV2VudAogIGFzIHNtb290aCBhcyBpdCBjb3VsZC4KCi0gQWRkZWQgYSBkb2NzL2V4YW1wbGVzIGRpcmVjdG9yeSB3aXRoIHR3byB0aW55IGV4YW1wbGUgc291cmNlcyB0aGF0IHNob3cgaG93CiAgdG8gdXNlIGxpYmN1cmwuIEkgaG9wZSB1c2VycyB3aWxsIHN1cHBseSBtZSB3aXRoIG1vcmUgdXNlZnVsIGV4YW1wbGVzCiAgZnVydGhlciBvbi4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEr2cm4gSGFydHJvdGggdG8gbm8gbG9uZ2VyIHVzZSB0aGUgd29yZCAnaW50ZWZhY2UnIGluIHRoZQogIGNvbmZpZyBzdHJ1Y3QgaW4gdGhlIHNyYy9tYWluLmMgZmlsZSBzaW5jZSBjZXJ0YWluIGNvbXBpbGVycyBoYXZlIHRoYXQgd29yZAogICJyZXNlcnZlcmVkIi4gIEkgZmlndXJlIHRoYXQgaXMgc29tZSBraW5kIG9mIEMrKyBkZWNlYXNlLgoKLSBVcGRhdGVkIHRoZSBjdXJsLjEgbWFuIHBhZ2Ugd2l0aCAtLWludGVyZmFjZSBhbmQgLS1rcmI0LgoKLSBNb2RpZmllZCB0aGUgYmFzZTY0RW5jb2RlKCkgZnVuY3Rpb24gdG8gd29yayBsaWtlIHRoZSBrZXJiZXJvcyBvbmUsIHNvIHRoYXQKICBJIGNvdWxkIHJlbW92ZSB0aGUgdXNlIG9mIHRoYXQuIFRoZXJlIGlzIG5vIG5lZWQgZm9yICp0d28qIGJhc2U2NCBlbmNvZGluZwogIGZ1bmN0aW9ucyEgOy0pCgpWZXJzaW9uIDcuM3ByZTUKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zNC1sYXllciBzb3VyY2UgY29kZSB0aGF0IGlzIG11Y2ggImluZmx1ZW5jZWQiIGJ5IHRoZSBvcmlnaW5hbAogIGtyYjQgc291cmNlIGNvZGUsIHRocm91Z2ggeWFmYyBpbnRvIGN1cmwsIHdhcyB1c2luZyBxdWl0ZSBhIGxvdCBvZiBnbG9iYWwKICB2YXJpYWJsZXMuIGxpYmN1cmwgY2FuJ3Qgd29yayBwcm9wZXJseSB3aXRoIGdsb2JhbHMgbGlrZSB0aGF0IHdoeSBJIGhhZCB0bwogIGNsZWFuIHVwIGFsbW9zdCBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbmV3IHNlY3VyaXR5LmMgdG8gbWFrZSB0aGVtIHVzZQogIGNvbm5lY3Rpb24gc3BlY2lmaWMgdmFyaWFibGVzIGluc3RlYWQgb2YgdGhlIGdsb2JhbHMuIEkganVzdCBob3BlIEkgZGlkbid0CiAgZGVzdHJveSBhbnl0aGluZyBub3cuLi4gOi0pIGNvbmZpZ3VyZSB1cGRhdGVkLCB2ZXJzaW9uIHN0cmluZyBub3cgcmVmbGVjdHMKICBrcmI0IGJ1aWx0LWluLiBJdCBhbG1vc3Qgd29ya3Mgbm93LiBPbmx5IHVwbG9hZHMgYXJlIHN0aWxsIGJlaW5nIG5hdWdodHkuCgpWZXJzaW9uIDcuM3ByZTMKCkRhbmllbCAoMTggU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBzdXBwbGllZCBhIG1ham9yIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBrcmI0LWZ0cCBzdXBwb3J0IHRvCiAgY3VybC4gTWFydGluIGlzIHRoZSBwcmltYXJ5IGF1dGhvciBvZiB0aGUgZnRwIGNsaWVudCBuYW1lZCB5YWZjIGFuZCBoZSBkaWQKICBub3QgaGVzaXRhdGUgdG8gaGVscCB1cyBpbXBsZW1lbnQgdGhpcyB3aGVuIEkgYXNrZWQgaGltLiBNYW55IGFuZCBzaW5jZXJlCiAgdGhhbmtzIHRvIGEgc3BsZW5kaWQgZWZmb3J0LiBJdCBkaWRuJ3QgZXZlbiB0YWtlIG1hbnkgaG91cnMhCgotIFN0ZXBoZW4gS2ljayBzdXBwbGllZCBhIGJpZyBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIC0taW50ZXJmYWNlIGZsYWcgdG8KICB0aGUgY3VybCB0b29sIGFuZCBDVVJMT1BUX0lOVEVSRkFDRSBmb3IgbGliY3VybC4gSXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuCiAgb3V0Z29pbmcgaW50ZXJmYWNlIHRvIHVzZSBmb3IgeW91ciByZXF1ZXN0LiBUaGlzIG1heSBub3Qgd29yayBvbiBhbGwKICBwbGF0Zm9ybXMuIFRoaXMgbmVlZHMgdGVzdGluZy4KCi0gUmljaGFyZCBQcmVzY290dCBub3RpY2VkIHRoYXQgY3VybCBvbiBUcnU2NCB1bml4IGNvdWxkIGNvcmUgZHVtcGVkIGlmIHRoZQogIG5hbWUgZGlkbid0IHJlc29sdmUgcHJvcGVybHkuIFRoaXMgd2FzIGR1ZSB0byB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uIG5vdAogIHJldHVybmluZyBhbiBlcnJvciBldmVuIHRob3VnaCBpdCBmYWlsZWQgb24gc29tZSBwbGF0Zm9ybXMhCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgYWxsIHNvcnRzIG9mIGRvY3VtZW50cyBpbiByZWdhcmRzIHRvIHRoZSBuZXcgcHJveHl0dW5uZWwgc3VwcG9ydC4KClZlcnNpb24gNy4zcHJlMgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBLYWktVXdlIFJvbW1lbCBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGh0dHBwcm94eXR1bm5lbCBzdHVmZiBmb3IgZnRwLgogIEFkanVzdGVkIGl0LiBBZGRlZCBiZXR0ZXIgaW5mbyBtZXNzYWdlIHdoZW4gc2V0dGluZyB1cCB0aGUgdHVubmVsIGFuZCB0aGUKICBwYXN2IG1lc3NhZ2Ugd2hlbiBkb2luZyB0aGUgc2Vjb25kIGNvbm5lY3QuCiAgClZlcnNpb24gNy4zcHJlMQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgImh0dHBwcm94eXR1bm5lbCIgdG8gYW4gYXJiaXRyYXJ5IGhvc3QgYW5kIHBvcnQgbmFtZS4gVGhlCiAgc2Vjb25kIGNvbm5lY3Rpb24gb24gZnRwIG5lZWRlZCB0aGF0LgoKLSBUaGVBcnRPZkhUVFBTY3JpcHRpbmcgd2FzIGNvcnJlY3RlZCBhbGwgb3Zlci4gSSBib3RoIHR5cGUgYW5kIHNwZWxsIHJlYWxseQogIGJhZCBhdCB0aW1lcyEKICAKRGFuaWVsICgxNCBTZXB0ZW1iZXIgMjAwMCkKLSAtcC8tLXByb3h5dHVubmVsIHdhcyBhZGRlZCB0byAnY3VybCcuIEl0IHVzZXMgdGhlIG5ldwogIENVUkxPUFRfSFRUUFBST1hZVFVOTkVMIGxpYmN1cmwgb3B0aW9uIHRoYXQgYWxsb3dzICJhbnkiIHByb3RvY29sIHRvIHR1bm5lbAogIHRocm91Z2ggdGhlIHNwZWNpZmllZCBodHRwIHByb3h5LiBBdCB0aGUgbW9tZW50LCB0aGlzIHNob3VsZCB3b3JrIHdpdGggZnRwLgoKRGFuaWVsICgxMyBTZXB0ZW1iZXIgMjAwMCkKLSBKb2NoZW4gU2NoYWV1YmxlIGZvdW5kIHRoYXQgZmlsZTovLyBkaWRuJ3Qgd29yayBhcyBleHBlY3RlZC4gQ29ycmVjdGVkIHRoaXMKICBhbmQgbWFpbGVkIHRoZSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0LgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDAwKQotIEkgY2hhbmdlZCB0aGUgI2RlZmluZSBUKCkgaW4gY3VybC5oIHNpbmNlIGl0IHR1cm5lZCBvdXQgaXQgd2Fzbid0IHJlYWxseQogIGEgZ29vZCBzeW1ib2wgdG8gdXNlICh3aGVuIHlvdSBjb21waWxlZCBQSFAgd2l0aCBjdXJsIGFzIGEgbW9kdWxlLCB0aGF0CiAgZGVmaW5lIGNvbGxpZGVkIHdpdGggc29tZSBJTUFQIGRlZmluZSBvciBzb21ldGhpbmcpLiBUaGlzIHdhcyBwb3N0ZWQgdG8gdGhlCiAgUEhQIGJ1ZyB0cmFja2VyLgoKLSBJIGFkZGVkIGV4dGVybiAiQyIgc3R1ZmYgaW4gdHdvIGhlYWRlciBmaWxlcyB0byBiZXR0ZXIgYWxsb3cgbGliY3VybCB1c2FnZQogIGluIEMrKyBzb3JjZXMuIERpc2N1c3Npb25zIG9uIHRoZSBsaWJjdXJsIGxpc3Qgd2l0aCBEYW5ueSBIb3Jzd2VsbCBsZWFkIHRvCiAgdGhpcy4KClZlcnNpb24gNy4yLjEKCkRhbmllbCAoMzEgQXVndXN0IDIwMDApCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCAqYWdhaW4qIGFuZCBub3cgaXQgc2VlbXMgdG8KICBkZXRlY3QgTGludXggbmFtZSByZXNvbHZpbmcgcHJvcGVybHkhIChoZWFyZCB0aGF0IGJlZm9yZT8pCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBwb2ludGVkIG91dCB0aGF0IGRvd25sb2FkaW5nIGEgZmlsZSBjb250YWluaW5nIHRoZQogIGxldHRlciAnKycgZnJvbSBhbiBmdHAgc2VydmVyIGRpZG4ndCB3b3JrLiBJdCBkaWQgd29yayBmcm9tIEhUVFAgdGhvdWdoIGFuZAogIHRoZSByZWFzb24gd2FzIG15IGxhbWUgVVJMIGRlY29kZXIuCgotIEkgaGFwcGVuZWQgdG8gbm90aWNlIHRoYXQgLUkgZGlkbid0IGF0IGFsbCB3b3JrIG9uIGZ0cCBhbnltb3JlLiBJIGNvcnJlY3RlZAogIHRoYXQuCgpWZXJzaW9uIDcuMgoKRGFuaWVsICgzMCBBdWd1c3QgMjAwMCkKLSBVbmRlcnN0YW5kaW5nIEFJWCBpcyBhIGhhcmQgdGFzay4gSSBiZWxpZXZlIEknbGwgbmV2ZXIgZmlndXJlIG91dCB3aHkgdGhleQogIHNvbHZlIHRoaW5ncyBzbyBkaWZmZXJlbnRseSBmcm9tIHRoZSBvdGhlciB1bml4ZXMuIE5vdywgSSdtIGxlZnQgd2l0aCB0aGUKICBBSVggNC4zIHJ1bi10aW1lIHdhcm5pbmdzIGFib3V0IGR1cGxpY2F0ZSBzeW1ib2xzIHRoYXQgYWNjb3JkaW5nIHRvIHRoaXMKICBhcnRpY2xlIChodHRwOi8vd3d3Lmdlb2NyYXdsZXIuY29tL2FyY2hpdmVzLzMvNDA1LzE5OTkvOS8wLzI1OTM0MjgvKSBpcyBhCiAgbGlidG9vbCBmbGF3LiBJIHRyaWVkIHRoZSBtZW50aW9uZWQgcGF0Y2gsIGFsdGhvdWdoIHRoYXQgc3RvcHMgdGhlIGxpbmtpbmcKICBjb21wbGV0ZWx5LgoKICBTbywgaWYgSSBzZWxlY3QgdG8gaWdub3JlIHRoZSBsZCB3YXJuaW5ncyB0aGVyZSBhcmUgY29tcGlsZXIgd2FybmluZ3MgdGhhdAogIGZpbGwgdGhlIHNjcmVlbiBwcmV0dHkgYmFkIHdoZW4gY3VybCBjb21waWxlcy4gSXQgdHVybnMgb3V0IHRoYXQgaWYgSSB3YW50CiAgdG8gJyNpbmNsdWRlIDxhcnBhL2luZXQuaD4nLCBJIGNhbiBnZXQgdGlkIG9mIHRoZSB3YXJuaW5ncyBieSBpbmNsdWRlIHRoZQogIGZvbGxvd2luZyB0aHJlZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSB0aGF0IG9uZToKCiAgICAgICAgI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgogICAgICAgICNpbmNsdWRlIDxzeXMvbWJ1Zi5oPgogICAgICAgICNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CgogIE5vdywgaXMgaXQgcmVhbGx5IHNhbmUgdG8gYWRkIHRob3NlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIGFycGEvaW5ldC5oIGluIGFsbAogIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCBpbmNsdWRlIGl0PwoKICBUaGFua3MgdG8gQWxiZXJ0IENoaW4tQS1Zb3VuZyBhdCB0aGV3cml0dGVud29yZC5jb20gd2hvIGdhdmUgbWUgdGhlIEFJWAogIGxvZ2luIHRvIHRyeSBldmVyeXRoaW5nIG9uLgoKRGFuaWVsICgyNCBBdWd1c3QgMjAwMCkKLSBKYW4gU2NobWlkdCBzdXBwbGllZCB1cyBhIG5ldyBWQzYgbWFrZWZpbGUgZm9yIFdpbmRvd3MgYXMgdGhlIHByZXZpb3VzIG9uZQogIHdhcyBub3QgdXAgdG8gZGF0ZSBidXQgbGFja2VkIHNldmVyYWwgb2JqZWN0IGZpbGVzLgoKLSBNb3JlIHdvcmsgb24gdGhlIG5hbWluZy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwcm92aWRlZCBhIGNvbmZpZ3VyZS1jaGVjayBmb3IgbGFyZ2UgZmlsZSBzdXBwb3J0LCBhcwogIHNvbWUgc3lzdGVtcyBzZWVtIHRvIG5lZWQgdGhhdCBmb3IgdGhlbSB0byB3b3JrLiBIYWQgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbgogIGZvciB0aGUgY29uZmlnLmggaW5jbHVkZSBmaWxlIGluIGV2ZXJ5IC5jIGZpbGUgaW4gdGhlIGxpYmN1cmwgZGlyLi4uCgotIEFzIHN1Z2dlc3RlZCBvbiB0aGUgbWFpbGluZyBsaXN0IChieSBUcm95IEVuZ2VsKSwgSSBkaWQgdXNlIGEgLS1kYXRhLWJpbmFyeQogIG9wdGlvbiBpbnN0ZWFkIG9mIHRoZSBtZXNzeSB3YXkgSSd2ZSBsZWZ0IGRlc2NyaWJlZCBiZWxvdy4gSXQgc2VlbXMgdG8KICB3b3JrLiBUaGUgbGliY3VybCBmaXggcmVtYWluZWQgdGhlIHNhbWUgYXMgeWVzdGVyZGF5LgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwMCkKLSBCYWNrIG9uIHRoZSAtZCBzdHJpcHBpbmcgbmV3bGluZXMgdGhpbmcuIFRoZSAncGxhaW4gcG9zdCcgdGhpbmcgd2FzIGFkZGVkCiAgd2hlbiBJIGhhZCBubyB0aG91Z2h0IG9mIHRoYXQgb25lIGNvdWxkIGFjdHVhbGx5IHBvc3QgYmluYXJ5IGRhdGEgd2l0aAogIGl0LiBOb3csIEkgaGF2ZSB0byBhZGQgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGEgZ3JhY2VmdWwgbWFubmVyIGFuZCBJIHRoaW5rCiAgSSd2ZSBtYW5hZ2VkIHRvIGNvbWUgdXAgd2l0aCBhIHdheTogJy1kIEBmaWxlO2JpbmFyeScgd2lsbCB0aHVzIHBvc3QgdGhlCiAgZmlsZSBiaW5hcnksIGV4YWN0bHkgYXMgaXRzIGNvbnRlbnRzIGFyZS4gSXQgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIG5ldwogICpzZXRvcHQoKSBvcHRpb24gKENVUkxPUFRfUE9TVEZJRUxEU0laRSkgdG8gc2V0IHRoZSBwb3N0ZmllbGQgc2l6ZSwgc2luY2UKICBsaWJjdXJsIGNhbid0IHN0cmxlbigpIHRoZSBkYXRhIGluIHRoZXNlIGNhc2VzLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1hZGUgc29tZSB2ZXJ5IHNlcmlvdXMgZWZmb3J0cyBhbmQgYWxsIHRoZSBuYW1lCiAgcmVzb2x2aW5nIHByb2JsZW1zIHNlZW0gdG8gaGF2ZSBiZWVuIHNvcnRlZCBvdXQgbm93IG9uIGFsbCB0aGUgcGxhdGZvcm1zCiAgdGhhdCBwcmV2aW91c2x5IHNob3dlZCB0aGVtLiBJJ2xsIG1ha2UgYW5vdGhlciByZWxlYXNlIG5vdyBhbnlkYXkgYmVjYXVzZSBvZgogIHRoaXMuCgotIFRoZSBGQVEgd2FzIG11Y2ggZW5oYW5jZWQgd2hlbiBpdCBjb21lcyB0byB0aGUgbGljZW5zaW5nIGlzc3VlcyB0aGFua3MgdG8KICBCam9ybiBSZWVzZS4KCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gUmljayBXZWx5a29jaHkgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdoZW4geW91IHVzZSAtZCB0byBwb3N0IGFuZCB5b3Ugd2FudCB0bwogIGtlZXAgdGhlIG5ld2xpbmVzLCBhcyBjdXJsIHN0cmlwcyB0aGVtIG9mZiBhcyBhIGJvbnVzIGJlZm9yZSBwb3N0aW5nLi4uCiAgVGhpcyBuZWVkcyB0byBiZSBhZGRyZXNzZWQuCgpWZXJzaW9uIDcuMS4xCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIEdvdCBtb3JlIHBlb3BsZSBpbnZvbHZlZCBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgbWVzcy4gQ2FvbGFuIE1jTmFtYXJhIHNlbnQKICBtZSBjb25maWd1cmUtY29kZSB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgdmVyeSBzaW1pbGFyIHRvIG15IGV4aXN0aW5nIHRlc3RzCiAgd2hpY2ggb25seSBtYWtlIG1lIG1vcmUgc3VyZSBJJ20gb24gdGhlIHJpZ2h0IHBhdGguIEkgY2hhbmdlZCB0aGUgb3JkZXIgb2YKICB0aGUgdGVzdHMgc2xpZ2h0bHksIGFzIGl0IHNlZW1zIHRoYXQgc29tZSBjb21waWxlcnMgZG9uJ3QgeWVsbCBlcnJvciBpZiBhCiAgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIHRvbyBtYW55IHBhcmFtZXRlcnMuIFRodXMsIHRoZSBmaXJzdCB0ZXN0ZWQgZnVuY3Rpb24KICB3aWxsIHNlZW0gb2suLi4gTGV0J3MgaG9wZSBtb3JlIGNvbXBpbGVycyB0aGluayBvZiB0b28tZmV3IHBhcmFtZXRlcnMgYXMgYmFkCiAgbWFubmVycywgYXMgd2UncmUgbm93IHRyeWluZyB0aGUgZnVuY3Rpb25zIGluIHRoYXQgb3JkZXI7IGZld2VyIGZpcnN0LiBJCiAgc2hvdWxkIGFsc28gYWRkIHRoYXQgTGFycyBIZWNraW5nIG1haWxlZCBtZSBhbmQgdm9sdW50ZWVyZWQgdG8gcnVuIHRlc3RzIG9uCiAgYSBmZXcgb2RkIHN5c3RlbXMuIENvYWxhbiBpcyBrZWVwaW5nIGhpcyB3b3JrIG92ZXIgYXQKICBodHRwOi8vd3d3LmNzbi51bC5pZS9+Y2FvbGFuL3B1YmxpbmsvZ2V0aG9zdGJ5bmFtZV9yLy4gTWlnaHQgYmUgaGFuZHkgaW4gdGhlCiAgZnV0dXJlIGFzIHdlbGwuCgpEYW5pZWwgKDE4IEF1Z3VzdCAyMDAwKQotIEkgbm90aWNlZCBJIGhhZG4ndCBpbmNyZWFzZWQgdGhlIG5hbWUgbG9va3VwIGJ1ZmZlciBpbiBsaWIvZnRwLmMuIEkgZG9uJ3QKICB0aGluayB0aGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSBjb250aW51ZWQgdHJvdWJsZSB0aG91Z2guCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDAwKQotIEZyZWQgTm96IGNvcnJlY3RlZCBteSBzdHVwaWQgbWlzdGFrZXMgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIGZsdWZmLiBJdAogIHNob3VsZCBhZmZlY3Qgc29tZSBBSVgsIERpZ2l0YWwgVW5peCBhbmQgSFBVWCAxMCBzeXN0ZW1zLgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMCkKLSBNYXRoaWV1IExlZ2FyZSBjb21waWxlZCBhbmQgYnVpbGQgNy4xIHdpdGhvdXQgZXJyb3JzIG9uIGJvdGggQUlYIDQuMiBhcyB3ZWxsCiAgYXMgQUlYIDQuMy4gTm93IHdoeSBkaWQgcHJvYmxlbXMgb2NjdXIgYmVmb3JlPwoKLSBGcmVkIE5veiByZXBvcnRlZCBhIC13Ly0td3JpdGUtb3V0IGJ1ZyB0aGF0IGNhdXNlZCBpdCB0byBtYWxmdW5jdGlvbiB3aGVuCiAgdXNlZCBjb21iaW5lZCB3aXRoIG11bHRpcGxlIFVSTCByZXRyaWV2YWxlcy4gQWxsIGJ1dCB0aGUgZmlyc3QgZGlzcGxheSBnb3QKICBzY3Jld2VkIHVwIQoKRGFuaWVsICgxMSBBdWd1c3QgMjAwMCkKLSBKYXNvbiBQcmllYmUgYW5kIGFuIGFub255bW91cyBmcmllbmQgZm91bmQgc29tZSBob3N0IG5hbWVzIHRoZSBMaW51eCB2ZXJzaW9uCiAgb2YgY3VybCBjb3VsZCBub3QgcmVzb2x2ZS4gSXQgdHVybmVkIG91dCB0aGUgYnVmZmVyIHVzZWQgdG8gcmV0cmlldmUgdGhhdAogIGluZm9ybWF0aW9uIHdhcyB0b28gc21hbGwuIEZpeGVkLiBPbmUgY291bGQgYXJndWUgYWJvdXQgdGhlIHVzZWZ1bG5lc3Mgb2YKICBub3QgaGF2aW5nIHRoZSBzbGlnaHRlc3QgdHJhY2Ugb2YgYSBtYW4gcGFnZSBmb3IgZ2V0aG9zdGJ5bmFtZV9yKCkgb24gbXkKICBMaW51eCBSZWRoYXQgaW5zdGFsbGF0aW9uLi4uCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDAwKQotIEJhbGFqaSBTIFJhbyB3YXMgZmlyc3QgaW4gbGluZSB0byBub3RlIHRoZSBtaXNzaW5nIHBvc3NpYmlsaXR5IHRvIHJlcGxhY2UKICB0aGUgQ29udGVudC1UeXBlOiBhbmQgQ29udGVudC1MZW5ndGg6IGhlYWRlcnMgd2hlbiBkb2luZyAtZCBwb3N0cy4gSSBhZGRlZAogIHRoZSBwb3NzaWJpbGl0eSBqdXN0IG5vdy4gSXQgc2VlbXMgc29tZSBwZW9wbGUgd2FudHMgdG8gZG8gc3RhbmRhcmQgcG9zdHMKICB1c2luZyBjdXN0b20gQ29udGVudC1UeXBlcy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwMCkKLSBNaWtlIERvd2VsbCBjb3JyZWN0bHkgZGlzY292ZXJlZCB0aGF0IGN1cmwgZGlkIG5vdCBhcHByb3ZlIG9mIFVSTHMgd2l0aCBubwogIHVzZXIgbmFtZSBidXQgcGFzc3dvcmQuIEFzIGluICdodHRwOi8vOmZvb0BoYXh4LnNlJy4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4xCgpEYW5pZWwgKDcgQXVndXN0IDIwMDApCi0gTXkgQUlYIDQgZml4IGRvZXMgbm90IHdvcmsuIEkgbmVlZCBoZWxwIGZyb20gYSBBSVggNCBoYWNrZXIuCgotIEkgYWRkZWQgbXkgbmV3IGRvY3VtZW50IGluIHRoZSBkb2NzIGRpcmVjdG9yeS4gSXQgaXMgYWltZWQgdG8gYmVjb21lIGEgc29ydAogIG9mIHR1dG9yaWFsIG9uIGhvdyB0byBkbyBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDQgQXVndXN0IDIwMDApCi0gV29ya2luZyB3aXRoIFJpY2ggR3JheSBvbiBjb21waWxpbmcgY3VybCBmb3IgbG90cyBvZiBkaWZmZXJlbnQgcGxhdGZvcm1zLgogIE15IGZpeCBmb3IgQUlYIDMuMiB3YXMgbm90IGdvb2QgZW5vdWdoIGFuZCB3YXMgc2xpZ2h0bHkgY2hhbmdlZCwgSSBoYWQgdG8KICBtb3ZlIGFuIGluY2x1ZGUgZmlsZSBiZWZvcmUgYW5vdGhlciwgYXMgaXMgbm93IGRlc2NyaWJlZCBpbiB0aGUgc291cmNlLgoKICBBSVggNC4yICg0Llg/KSBoYXMgZGlmZmVyZW50IGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKQogIGZ1bmN0aW9ucyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGRpZG4ndCBjaGVjayBmb3IgYW5kIHRodXMgdGhlIGNvbXBpbGUKICBicm9rZSB3aXRoIGFuIGVycm9yLiBJIGhhdmUgbm93IGNoYW5nZWQgdGhlIGdldGhvc3RieW5hbWVfcigpIGNoZWNrIGluIHRoZQogIGNvbmZpZ3VyZSBmaWxlIHRvIHN1cHBvcnQgYWxsIHRocmVlIHZlcnNpb25zIG9mIGJvdGggdGhlc2UgZnVuY3Rpb25zLiBNeQogIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGUgQUlYLXN0eWxlIGlzIHRob3VnaCBub3QgeWV0IHZlcmlmaWVkIGFuZCBJIG1heQogIGdldCBwcm9ibGVtcyB0byBmaXggaXQgaWYgaXQgdHVybnMgb3V0IHRvIGJ1ZyBzaW5jZSBJIGRvbid0IGhhdmUgYWNjZXNzIHRvCiAgYW55IHN5c3RlbSB1c2luZyB0aGF0LgoKICBGb3IgcHJvYmxlbXMgbGlrZSB0aGF0LCBJIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxsb3cgLS1kaXNhYmxlLXRocmVhZAogIHRvIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgY2hlY2sgZm9yIHRocmVhZHNhZmUgdmVyc2lvbnMgb2YgYSBmZXcKICBmdW5jdGlvbnMgYW5kIHRodXMgZ28gd2l0aCB0aGUgImdvb2Qgb2xkIHZlcnNpb25zIiB0aGF0IHRlbmQgdG8gd29yawogIGFsdGhvdWdoIHdpbGwgYnJlYWsgdGhyZWFkLXNhZmVuZXNzIGZvciBsaWJjdXJsLiBNb3N0IHBlb3BsZSB3b24ndCB1c2UKICBsaWJjdXJsIGZvciBvdGhlciB0aGluZ3MgdGhhbiBjdXJsIHRob3VnaCwgYW5kIGN1cmwgZG9lc24ndCBuZWVkIGEKICB0aHJlYWQtc2FmZSBsaWIuCgotIFdvcmtpbmcgb24gbXkgYmlnIHR1dG9yaWFsIGFib3V0IEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBSaWNoIEdyYXkgc3BvdHRlZCBhIHByb2JsZW0gaW4gc3JjL3NldHVwLmggY2F1c2VkIGJ5IGEgI2RlZmluZSBzdHJlcXVhbCgpCiAgdGhhdCB3YXMganVzdCBhIGxlZnQtb3ZlciBmcm9tIHBhc3NlZCB0aW1lcy4gVGhlIHN0cmVxdWFsKCkgaXMgbm93IGEgdHJ1ZQogIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IGxpYmN1cmwgZm9yIGEgcG9ydGFibGUgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJpc29uLiBJIGFkZGVkIHRoZSBwcm90b3R5cGVzIGluIGluY2x1ZGUvY3VybC5oIGFuZCByZW1vdmVkIHRoZQogIG5vdyBvYnNvbGV0ZSAjZGVmaW5lLgoKLSBJZ29yIEtocmlzdG9waG9yb3YgbWFkZSBhIGZpeCB0byBhbGxvdyByZXN1bWVkIGRvd25sb2FkIGZyb20gU3VuJ3MKICBKYXZhV2ViU2VydmVyLzEuMS4xLiBJdCBzZWVtcyB0aGF0IHRoZWlyIHNlcnZlciBzZW5kcyBiYWQgQ29udGVudC1SYW5nZQogIGhlYWRlcnMuCgotIFRoZSBtYWtlZmlsZXMgZm9yY2VkIGEgc3RhdGljIGxpYnJhcnkgYnVpbGQsIHdoaWNoIGlzIGJhZCBzaW5jZSB3ZSBub3cgdXNlCiAgbGlidG9vbCBhbmQgdGh1cyBoYXZlIGV4Y2VsbGVudCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0ISBBbGJlcnQgQ2hpbi1BLVlvdW5nCiAgZm91bmQgb3V0LgoKVmVyc2lvbiA3LjAuMTFiZXRhCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0ICdtYWtlIGluc3RhbGwnIGRpZCBub3QgcHJvcGVybHkgY3JlYXRlCiAgdGhlIGhlYWRlciBpbmNsdWRlIGRpcmVjdG9yeSwgd2h5IGl0IGZhaWxlZCB0byBpbnN0YWxsIHRoZSBoZWFkZXIgZmlsZXMgYXMKICBpdCBzaG91bGQuIEF1dG9tYWtlIGlzbid0IHJlYWxseSBlcXVpcHBlZCB0byBkZWFsIHdpdGggc3ViZGlyZWN0b3JpZXMKICB3aXRob3V0IE1ha2VmaWxlcyBpbiBhbnkgbmljZSB3YXkuIEkgaGFkIHRvIHJ1biBhaGVhZCBhbmQgYWRkIE1ha2VmaWxlcyBpbgogIGJvdGggaW5jbHVkZSBhbmQgaW5jbHVkZS9jdXJsIGJlZm9yZSBJIG1hbmFnZWQgdG8gY3JlYXRlIGEgdG9wLWxldmVsCiAgbWFrZWZpbGUgdGhhdCBzdWNjZWVkcyBpbiBpbnN0YWxsIGV2ZXJ5dGhpbmcgcHJvcGVybHkhCgotIE9rLCBubyBtb3JlICJmZWF0dXJlcyIgYWRkZWQgbm93LiBMZXQncyBqdXN0IHZlcmlmeSB0aGF0IHRoZXJlJ3Mgbm8gbWFqb3IKICBmbGF3cyBhZGRlZCBub3cuCgpEYW5pZWwgKDMxIEp1bHkgMjAwMCkKLSBCb3RoIEplZmYgU2NoYXNueSBhbmQgS2V0aWwgRnJveW4gYXNrZWQgbWUgaG93IHRvIHRlbGwgY3VybCBub3QgdG8gc2VuZCBvbmUKICBvZiB0aG9zZSBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLiBUaGV5IGRpZG4ndCBzZXR0bGUgd2l0aCB0aGUgYmxhbmsKICBvbmVzIHlvdSBjb3VsZCB0ZWxsIGN1cmwgdG8gdXNlLiBJIHJld3JvdGUgdGhlIGhlYWRlci1yZXBsYWNlIHN0dWZmIGEKICBsaXR0bGUuIE5vdywgaWYgeW91IHJlcGxhY2UgYW4gaW50ZXJuYWwgaGVhZGVyIHdpdGggeW91ciBvd24gYW5kIHRoYXQgbmV3CiAgb25lIGlzIGEgYmxhbmsgaGVhZGVyIHlvdSB3aWxsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcm5hbCBvbmUgYW5kIG5vdCBnZXQgYW55CiAgYmxhbmsuIEkgY291bGRuJ3QgZmlndXJlIG91dCBhbnkgY2FzZSB3aGVuIHlvdSB3YW50IHRoYXQgYmxhbmsgaGVhZGVyLgoKRGFuaWVsICgyOSBKdWx5IDIwMDApCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIGxpYiB1c2VkIGxvY2FsdGltZSgpIHdoaWNoIGlzIG5vdCB0aHJlYWQtc2FmZSwgc28gbm93CiAgSSB1c2UgbG9jYWx0aW1lX3IoKSBpbiB0aGUgc3lzdGVtcyB0aGF0IGhhcyBpdC4KCi0gSSB3ZW50IHRocm91Z2ggdGhpcyBlbnRpcmUgZG9jdW1lbnQgYW5kIHJlbW92ZWQgYWxsIGVtYWlsIGFkZHJlc3NlcyBhbmQgbGVmdAogIG5hbWVzIG9ubHkuIEkndmUgcmVhbGx5IG1hZGUgYW4gZWZmb3J0IHRvIGFsd2F5cyBub3RlIHdobyBicm91Z2h0IGJlIGJ1ZwogIHJlcG9ydHMgb3IgZml4ZXMsIGJ1dCBtb3JlIGFuZCBtb3JlIHBlb3BsZSBhc2sgbWUgdG8gcmVtb3ZlIHRoZSBlbWFpbAogIGFkZHJlc3NlcyBzaW5jZSB0aGV5IGJlY29tZSB2aWN0aW1zIGZvciBzcGFtcyB0aGlzIHdheS4gR29yZG9uIEJlYXRvbiBnb3QgbWUKICB3b3JraW5nIG9uIHRoaXMuCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZvdW5kIG91dCB0aGF0IHdoZW4geW91IHNwZWNpZmllZCBhIEhUVFAgcHJveHkgaW4gYW4KICBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdXNlZCAtTCwgY3VybCBmYWlsZWQgaW4gdGhlIHNlY29uZCBmZXRjaC4gSQogIGNvcnJlY3RlZCB0aGlzIHByb2JsZW0gYW5kIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBsaXN0LiBObyBuZWVkIGZvciBhbiBleHRyYQogIGJldGEgcmVsZWFzZSBqdXN0IGZvciB0aGlzLgoKVmVyc2lvbiA3LjAuMTBiZXRhCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBTbywgbGlidG9vbCByZXBsYWNlZCB0d28gb2YgbXkgZmlsZXMgd2l0aCBzeW1ib2xpYyBsaW5rcyBhbmQgSSBmb3Jnb3QgdG8gYWRkCiAgdGhlIHR3byBuZXcgbGlidG9vbCBmaWxlcyB0byB0aGUgcmVsZWFzZSBhcmNoaXZlIChhbmQgdGhleSB3ZXJlIGFkZGVkIGFzCiAgc3ltbGlua3MgYXMgd2VsbCEpIFRoaXMgb2YgY291cnNlIGxlYWQgdG8gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBmYWlsZWQKICBvbiA3LjAuOS4uLgoKVmVyc2lvbiA3LjAuOWJldGEKCkRhbmllbCAoMjUgSnVseSAyMDAwKQotIEtyaXN0aWFuIEv2aG50b3BwIDxrcmlzIGF0IGtvZWhudG9wcC5kZT4gYnJvdWdodCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwKICBsaWJ0b29saWZpZWQsIGp1c3QgYXMgd2UndmUgd2FudGVkIGZvciBhIHdoaWxlIG5vdy4gSGUgYWxzbyBtYWRlIHRoZQogIHJlY2VudGx5IGFkZGVkIG1hbiBwYWdlcyBnZXQgaW5zdGFsbGVkIHByb3Blcmx5IG9uICdtYWtlIGluc3RhbGwnIGFuZCBzb21lCiAgb3RoZXIgbmljZSBjbGVhbnVwcy4KCi0gSW4gYSBkaXNjdXNzaW9uIHdpdGggRWV0dSBPamFuZW4gaXQgc3RydWNrIG1lIHRoYXQgaWYgd2UgdXNlIGN1cmwgdG8gZ2V0IGEKICBwYWdlIHVzaW5nIGEgcGFzc3dvcmQsIGFuZCB0aGF0IHBhZ2UgdGhlbiBzZW5kcyBhIExvY2F0aW9uOiB0byBhbm90aGVyCiAgc2VydmVyIHRoYXQgY3VybCBmb2xsb3dzLCBjdXJsIHdpbGwgc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGF0CiAgc2VydmVyIGFzIHdlbGwuCgogIE5vdywgSSdsbCBuZXZlciBiZSBhYmxlIHRvIG1ha2UgY3VybCBkbyBMb2NhdGlvbjogZm9sbG93aW5nIGFsbCB0aGF0IHBlcmZlY3QKICBhbmQgeW91J3JlIGFsbCBzb29uZXIgb3IgbGF0ZXIgcmVxdWlyZWQgdG8gd3JpdGUgYSBzY3JpcHQgdG8gZG8gc2V2ZXJhbAogIGZldGNoZXMgd2hlbiB5b3UncmUgZG9pbmcgYWR2YW5jZWQgc3R1ZmYsIGJ1dCBub3cgSSd2ZSBtb2RpZmllZCBjdXJsIHRvIGF0CiAgbGVhc3QgKm9ubHkqIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIHNlcnZlci4gV2hpY2gKICBtZWFucyB0aGF0IGlmIGdldCBhIHBhZ2UgZnJvbSBzZXJ2ZXIgQSB3aXRoIGEgcGFzc3dvcmQsIHRoYXQgZm9yd2FyZHMgY3VybAogIHRvIHNlcnZlciBCLCBjdXJsIHdvbid0IHVzZSB0aGUgcGFzc3dvcmQgdGhlcmUuIElmIHNlcnZlciBCIHRoZW4gZm9yd2FyZHMKICBjdXJsIGJhY2sgdG8gc2VydmVyIEEgYWdhaW4sIHRoZSBwYXNzd29yZCB3aWxsIGJlIHVzZWQgYWdhaW4uCgogIFRoaXMgaXMgbm90IGEgcGVyZmVjdCBpbXBsZW1lbnRhdGlvbiwgYXMgaW4gYSBicm93c2VyIGNhc2UgaXQgd291bGQgb25seSB1c2UKICB0aGUgcGFzc3dvcmQgaWYgdGhlIGxlZnQtcHJlZml4IG9mIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBzYW1lLiBJIGp1c3QgdGhpbmsKICB0aGF0IHRoaXMgZml4IHByZXZlbnRzIGEgc29tZXdoYXQgbHVya3kgInNlY3VyaXR5IGhvbGUiLgoKICBBcyBhIHNpZGUtbm90ZSBpbiB0aGlzIHN1YmplY3Q6IEhUVFAgcGFzc3dvcmRzIGFyZSBzZW50IGluIGNsZWFydGV4dCBhbmQKICB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgdG8gYmUgc2FmZSBvciBzZWN1cmUuIFVzZSBIVFRQUyBmb3IgdGhhdC4KCi0gQXMgZGlzY3Vzc2VkIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgY29udmVydGVkIHRoZSBGVFAgcmVzcG9uc2UgcmVhZGluZwogIGZ1bmN0aW9uIGludG8gdXNpbmcgc2VsZWN0KCkgd2hpY2ggdGhlbiBhbGxvd3MgdGltZW91dHMgKGV2ZW4gdW5kZXIgd2luMzIhKQogIGlmIHRoZSBjb21tYW5kLXJlcGx5IHNlc3Npb24gZ2V0cyB0b28gc2xvdyBvciBkaWVzIGNvbXBsZXRlbHkuIEkgbWFkZSBhCiAgZGVmYXVsdCB0aW1lb3V0IG9uIDM2MDAgc2Vjb25kcyB1bmxlc3MgYW55dGhpbmcgZWxzZSBpcyBzcGVjaWZpZWQsIHNpbmNlIEkKICBkb24ndCB0aGluayBhbnlvbmUgd2FudHMgdG8gd2FpdCBtb3JlIHRoYW4gdGhhdCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIHRvCiAgZ2V0IHJlY2VpdmVkLi4uCgotIFRvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2ggYXQgZ214Lm5ldD4gYnJvdWdodCBhIHNldCBvZiBmaXhlcyBmb3IKICB0aGUgcmZjMTg2NyBmb3JtIHBvc3RzLiBIZSBpbnRyb2R1Y2VkICduYW1lPTxmaWxlJyB3aGljaCBicmluZ3MgYSBtZWFucyB0bwogIHN1dXBseSB2ZXJ5IGxhcmdlIHRleHQgY2h1bmtzIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiBJdCBkaWZmZXJzIGZyb20KICAnbmFtZT1AZmlsZScgaW4gdGhlIHdheSB0aGF0IHRoaXMgbGF0dGVyIHRoaW5nIGlzIG1hcmtlZCBpbiB0aGUgdXBsb2FkZWQKICBjb250ZW50cyBhcyBhIGZpbGUgdXBsb2FkLCB3aGlsZSB0aGUgZmlyc3QgaXMganVzdCB0ZXh0IChhcyBpbiBhIGlucHV0IG9yCiAgdGV4dGFyZWEgZmllbGQpLiBUb3JzdGVuIGFsc28gY29ycmVjdGVkIGEgYnVnIHRoYXQgd291bGQgaGFwcGVuIGlmIHlvdSB1c2VkCiAgJXMgb3Igc2ltaWxhciBpbiBhIC1GIGZpbGUgbmFtZS4KCi0gQXMgZGlzY292ZXJlZCBieSBOaWNvIEJhZ2d1cyA8Tmljby5CYWdndXMgYXQgbWFpbC5pbmcubmw+LCB3aGVuIHRyYW5zZmVycmluZwogIGZpbGVzIHRvL2Zyb20gRlRQIHVzaW5nIHR5cGUgQVNDSUkgY3VybCBzaG91bGQgbm90IGV4cGVjdCB0aGUgdHJhbnNmZXIgdG8gYmUKICB0aGUgZXhhY3Qgc2l6ZSByZXBvcnRlZCBieSB0aGUgc2VydmVyIGFzIHRoZSBmaWxlIHNpemUuIFNpbmNlIEFTQ0lJIG1heSB2ZXJ5CiAgd2VsbCBtZWFuIHRoYXQgdGhlIGNvbnRlbnQgaXMgdHJhbnNsYXRlZCB3aGlsZSB0cmFuc2ZlcmVkLCB0aGUgZmluYWwgc2l6ZQogIG1heSB2ZXJ5IHdlbGwgZGlmZmVyLiBUaGVyZWZvciwgY3VybCBub3cgaWdub3JlcyB0aGUgZmlsZSBzaXplIHdoZW4gZG9pbmcKICBBU0NJSSB0cmFuc2ZlcnMgaW4gRlRQLgoKRGFuaWVsICgyNCBKdWx5IDIwMDApCi0gQWRkZWQgQ1VSTE9QVF9QUk9YWVBPUlQgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBjYWxsIHRvIGFsbG93IHRoZSBwcm94eQogIHBvcnQgbnVtYmVyIHRvIGJlIHNldCBzZXBhcmF0ZWx5IGZyb20gdGhlIHByb3h5IGhvc3QgbmFtZS4KCi0gQW5kcmV3IDxhbmRyZXcgYXQgdWdoLm5ldC5hdT4gcG9pbnRlZCBvdXQgYSBuZXRyYyBtYW51YWwgYnVnLgoKLSBUaGUgRlRQIHRyYW5zZmVyIGNvZGUgbm93IGFjY2VwdHMgYSAyNTAtY29kZSBhcyB3ZWxsIGFzIHRoZSBwcmV2aW91c2x5CiAgYWNjZXB0ZWQgMjI2LCBhZnRlciBhIHN1Y2Nlc3NmdWwgZmlsZSB0cmFuc2Zlci4gTW9oYW4gPG1uYWlyIGF0CiAgZXZlcmdyZWVuLWZ1bmRzLmNvbT4gcG9pbnRlZCB0aGlzIG91dC4KCi0gVGhlIGNoZWNrIGZvciAqYm90aCogbnNsIGFuZCBzb2NrZXQgd2FzIG5ldmVyIGFkZGVkIGluIHRoZSB2NyBjb25maWd1cmUuaW4KICB3aGVuIEkgbW92ZWQgdGhlIG1haW4gYnJhbmNoLiBJIHJlLWFkZGVkIHRoYXQgY2hlY2sgdG8gY29uZmlndXJlLmluLiBUaGlzIHdhcwogIGRpc2NvdmVyZWQgYnkgUmljaCBHcmF5LgoKLSBIb3dhcmQsIEJsYWlzZSA8QmxhaXNlLkhvd2FyZCBhdCBmYWN0aXZhLmNvbT4gcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZyZWUoKSBpbgogIGN1cmxfZGlzY29ubmVjdCgpIHdoaWNoIG9mIGNvdXJzZSBtZWFudCBsaWJjdXJsIGF0ZSBtZW1vcnkuCgotIEJyaWFuIEUuIEdhbGxldyBub3RlZCB0aGF0IHRoZSBIVFRQICdIb3N0OicgaGVhZGVyIGN1cmwgc2VudCBkaWQgbm90CiAgcHJvcGVybHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgbm9uLWRlZmF1bHQgcG9ydHMgd2VyZSB1c2VkLiBUaGlzIHNob3VsZAogIG5vdyBoYXZlIGJlZW4gZml4ZWQuCgotIEhUVFAgY29ubmVjdCBlcnJvcnMgbm93IHJldHVybiBlcnJvcnMgZWFybGllci4gVGhpcyB3YXMgbW9zdCBub3RhYmx5IGNhdXNpbmcKICBwcm9ibGVtcyB3aGVuIHRoZSBIVFRQUyBjZXJ0aWZpY2F0ZSBoYWQgcHJvYmxlbXMgYW5kIGxhdGVyIGNhdXNlZCBhIGNyYXNoLgogIE1hbnkgdGhhbmtzIHRvIEdyZWdvcnkgTmljaG9sbHMgPGduaWNob2xscyBhdCBsZXZlbDguY29tPiBmb3IgZGlzY292ZXJpbmcKICBhbmQgc3VnZ2VzdGluZyBhIGZpeC4uLgoKRGFuaWVsICgyMSBKdW5lIDIwMDApCi0gQWZ0ZXIgYSAiYnVnIHJlcG9ydCIgSSByZWNlaXZlZCB3aGVyZSB0aGUgdXNlciB3YXMgdXNpbmcgYm90aCAtRiBhbmQgLUkgaW4gYQogIEhUVFAgcmVxdWVzdCAoaXQgc2V2ZXJseSBjb25mdXNlZCB0aGUgbGlicmFyeSBJIHNob3VsZCBhZGQpLCBJIGFkZGVkIHNvbWUKICBjaGVja3MgdG8gc3JjL21haW4uYyB0aGF0IHByZXZlbnRzIHNldHRpbmcgbW9yZSB0aGFuIG9uZSBIVFRQIHJlcXVlc3QKICBjb21tYW5kLCBubyBtYXR0ZXIgd2hhdCB0aGUgdXNlciB3YW50cyEgOy0pCgpWZXJzaW9uIDcuMC44YmV0YQoKRGFuaWVsICgyMCBKdW5lIDIwMDApCi0gSSBkaWQgYSBtYWpvciByZXBsYWNlIGluIG1hbnkgZmlsZXMgdG8gdXNlIHRoZSBuZXcgY3VybCBkb21haW4gaGF4eC5zZQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIG9uZS4KCi0gQXMgRWV0dSBPamFuZW4gc3VnZ2VzdGVkLCBJIGZpbmFsbHkgdG9vayB0aGUgc3RlcCBhbmQgbm93IGxpYmN1cmwgbm8gbG9uZ2VyCiAgbWFrZXMgYSBQT1NUIGFmdGVyIGl0IGhhcyBmb2xsb3dlZCBhIGxvY2F0aW9uLiBXaGVuIHRoZSBpbml0aWFsIFBPU1QgaGFzCiAgYmVlbiBkb25lLCBpdCdsbCB0dXJuZWQgaW50byBhIEdFVCBmb3IgdGhlIGZ1cnRoZXIgcmVxdWVzdHMuIFRoaXMgaXMgb25seQogIGludGVyZXN0aW5nIHdoZW4gdXNpbmcgLUwvLS1sb2NhdGlvbiAqYW5kKiBkb2luZyBhIFBPU1QgYXQgdGhlIHNhbWUgdGltZS4KCiAgV2hpbGUgbWVzc2luZyB3aXRoIHRoaXMsIEkgYWRkZWQgYW5vdGhlciB3ZWlyZCBmZWF0dXJlIEkgY2FsbCAnYXV0bwogIHJlZmVyZXInLiBJZiB5b3UgYXBwZW5kICc7YXV0bycgdG8gdGhlIHJpZ2h0IG9mIGEgZ2l2ZW4gcmVmZXJlciBzdHJpbmcgKG9yCiAgb25seSB1c2UgdGhhdCBzdHJpbmcgYXMgcmVmZXJlciksIGxpYmN1cmwgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUKICBwcmV2aW91ZCBVUkwgYXMgcmVmZXJlZCB3aGVuIGl0IGZvbGxvd3MgYSBMb2NhdGlvbjogYW5kIGdldHMgYSBzdWNjZWVkaW5nCiAgZG9jdW1lbnQuCgotIE15IGhlcm8gUmljaCBHcmF5IGZvdW5kIHRoZSB2ZXJ5IG9ic2N1cmUgRlRQIGJ1ZyB0aGF0IGhhcHBlbmVkIHRvIGhpbSBvbmx5CiAgd2hlbiBwYXNzaW5nIHRocm91Z2ggYSBwYXJ0aWN1bGFyIGZpcmV3YWxsIGFuZCB1c2luZyB0aGUgUE9SVCBjb21tYW5kLiBJdAogIHR1cm5lZCBvdXQgdGhhdCBQT1JUIHdhcyB0aGUgb25seSBjb21tYW5kIGluIHRoZSBsaWIvZnRwLmMgc291cmNlIHRoYXQKICBkaWRuJ3Qgc2VuZCBhIHByb3BlciBcclxuIHNlcXVlbmNlIGJ1dCBpbnN0ZWFkIHVzZWQgdGhlIGZhdWx0eSBcbiB3aGljaCBhcwogIGl0IHNlZW1lZCBpcyBzdXBwb3J0ZWQgYnkgbW9zdCBtYWpvciBmdHAgc2VydmVycy4uLiA6LU8KClZlcnNpb24gNy4wLjdiZXRhCgpEYW5pZWwgKDE2IEp1bmUgMjAwMCkKLSBJIGhhZCBhdm9pZGVkIHRoaXMgbG9uZyBlbm91Z2ggbm93LCBzbyBJIG1vdmVkIHRoZSBhbHRlcm5hdGl2ZSBwcm9ncmVzcyBiYXIKICBzdHVmZiBmcm9tIHRoZSBsaWIgYW5kIGFkZGVkIGl0IHRvIHRoZSBjbGllbnQgY29kZS4gVGhpcyBpcyBub3cgdXNpbmcgdGhlCiAgcmVjZW50bHkgYWRkZWQgcHJvZ3Jlc3MgY2FsbGJhY2sgYW5kIGl0IHNlZW1zIHRvIHdvcmsgcHJldHR5IG11Y2ggbGlrZQogIGJlZm9yZS4gU2luY2UgaXQgaXMgb25seSBvbmUgcHJvZ3Jlc3MgYmFyIGFuZCB5b3UgYW5kIGRvd25sb2FkIGFuZCB1cGxvYWQgYXQKICB0aGUgc2FtZSB0aW1lLCB0aGlzIGJhciBzaG93cyB0aGUgY29tYmluZWQgcHJvZ3Jlc3Mgb2YgYm90aCBkaXJlY3Rpb25zLiBUaGlzCiAgY29kZSB3YXMganVzdCBwb3J0ZWQgZnJvbSB0aGUgb2xkIHBsYWNlIHRvIHRoaXMsIExhcnMgaXMgc3RpbGwgb3VyIHNhdmlvdXIhCiAgOy0pIFRoaXMgYWxzbyBtYWRlIHRoZSBkb2N1bWVudGF0aW9uIG1vcmUgYWNjdXJhdGUgc2luY2UgSSBuZXZlciByZW1vdmVkCiAgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBkb2NzISBBbHRob3VnaCBJIG5vdyByZW1vdmVkIHRoZSBDVVJMT1BUX1BST0dSRVNTTU9ERQogIGZyb20gdGhlIGxpYnJhcnkgc2luY2UgdGhlIGxpYiBoYXMgb25seSBvbmUgaW50ZXJuYWwgcHJvZ3Jlc3MgbWV0ZXIgYW5kIGl0CiAgd2lsbCBuZXZlciBnZXQgYW5vdGhlci4gSXQgaXMgYWx0aG91Z2ggbGlrZWx5IHRoYXQgdGhlIGludGVybmFsIG9uZSBhbHNvCiAgd2lsbCBiZSBtb3ZlZCB0byB0aGUgY2xpZW50IGNvZGUgaW4gdGhlIGZ1dHVyZSAod2hlbiBJIGhhdmUgb3RoZXIgbWVhbnMgb2YKICBnZXR0aW5nIHRoZSB3cml0ZW91dCBkYXRhIGFuZCBtb3ZlIHRoYXQgdG9vIHRvIHRoZSBjbGllbnQpLgoKLSBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIHZlcmlmeSB0aGF0IHN0YW5kYXJkIHByb2dyZXNzIG1ldGVyIHdvcmtzIGFuZCBJCiAgZm91bmQgb3V0IGl0IGRpZG4ndCBnZXQgaW5pdGVkIHByb3Blcmx5LiBHcnJyLiBJIGNvcnJlY3RlZCB0aGF0IGFzIHdlbGwuCgpEYW5pZWwgKDE1IEp1bmUgMjAwMCkKLSBJIHRob3VnaHQgSSdkIGJldHRlciB2ZXJpZnkgdGhhdCB0aGUgLUYgb3B0aW9uIHN0aWxsIHdvcmtzIGluIHY3IGFuZCBvZgogIGNvdXJzZSBpdCBkaWRuJ3QuLi4gOi0vIEFueXdheSwgSSBoYWQgdGhlIHByb2JsZW1zIEkgY291bGQgZGlzY292ZXIKICBjb3JyZWN0ZWQuIEFib3V0IG9uZSBtb250aCBvZiBiZXRhIHRlc3RpbmcgYW5kIG5vdCBhIHNpbmdsZSBwZXJzb24gaGFzIHVzZWQKICB0aGlzIGZlYXR1cmUgd2l0aCB2Nz8KCi0gQmr2cm4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0tcHJvZ3Jlc3MtYmFyIHN0aWxsIGRvZXNuJ3Qgd29yayBpbgogIHY3LiBIbS4KCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIFRpbSBUYXNzb25pcyBkaXNjb3ZlcmVkIHRoYXQgY3VybCA3IGRpZG4ndCBoYW5kbGUgbm9ybWFsIGh0dHAgUE9TVCBhcyBpdAogIHNob3VsZC4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4wLjZiZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBwb2ludGVkIG91dCBzZXZlcmFsIHByb2JsZW1zIChyZWxhdGVkIHRvIHdpbjMyIGNvbXBpbGluZyk6CiAgbGliL3N0cmVxdWFsLmMgaGFkIGEgYmFkICNpZmRlZiBmb3Igb25lIG9mIHRoZSBzdHJpbmcgY29tcGFyaXNvbnMgKHdpbjMyKQogIHNyYy9tYWluLmMgaGFkIHNldmVyYWwgbWlub3IgcHJvYmxlbXMKICBsaWIvbWFrZWZpbGUubTMyIGhhZCBnZXRwYXNzLltjb10gdHdpY2UKICBzcmMvY29uZmlnLXdpbjMyLmggbGFja2VkIHRoZSBIQVZFX0ZDTlRMX0ggZGVmaW5lCiAgYm90aCBjb25maWctd2luMzIuaCBmaWxlcyBub3cgb25seSBzZXQgdGhlIEhBVkVfVU5JU1REX0ggZGVmaW5lIGlmIHRoZQogIGRlZmluZSBNSU5HVzMyIGlzIHNldCwgYW5kIEkgbW9kaWZpZWQgc3JjL21ha2VmaWxlLm0zMiBhbmQgbGliL21ha2VmaWxlLm0zMgogIHRvIHNldCBpdC4KClZlcnNpb24gNy4wLjViZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBBcHBsaWVkIEx1b25nIERpbmggRHVuZydzIGNvbW1lbnRzIGFib3V0IGEgZmV3IHdpbjMyIGNvbXBpbGUgcHJvYmxlbXMuCgotIEFwcGxpZWQgQmr2cm4gU3RlbmJlcmcncyBzdWdnZXN0ZWQgZml4IHRoYXQgdHVybnMgdGhlIHdpbjMyIHN0ZG91dCB0bwogIGJpbmFyeS4gSXQgd29uJ3QgZG8gaXQgaWYgdGhlIC1CIC8gLS11c2UtYXNjaWkgb3B0aW9uIGlzIHVzZWQuIFRoYXQgb3B0aW9uCiAgaXMgbm93IGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgdGhlIHByZXZpb3VzIC1CIC8tLWZ0cC0tYXNjaWkuIFRoZSBmbGFnIHdhcwogIGFscmVhZHkgaW4gdXNlIGJlIHRoZSBsZGFwIGFzIHdlbGwgc28gdGhlIG5ldyBuYW1lIGZpdHMgcHJldHR5IGdvb2QuIFRoZQogIGxpYmN5cmwgQ1VSTE9QVF9UUkFOU0ZFUlRFWFQgd2FzIGFsc28gaW50cm9kdWNlZCBhcyBhbiBhbGlhcyB0byB0aGUgbm93CiAgb2Jzb2xldGUgQ1VSTE9QVF9GVFBBU0NJSS4gQ2FuJ3QgdmVyaWZ5IHRoaXMgZml4IG15c2VsZiBhcyBJIGhhdmUgbm8gd2luMzIKICBjb21waWxlciBhcm91bmQuCgpEYW5pZWwgKDEzIEp1bmUgMjAwMCkKLSBMdW9uZyBEaW5oIER1bmcgPGR1bmcgYXQgc2NoLmJtZS5odT4gZm91bmQgYSBwcm9ibGVtIGluIGN1cmxfZWFzeV9jbGVhbnVwKCkKICBzaW5jZSBpdCBmcmVlKCllZCB0aGUgbWFpbiBjdXJsIHN0cnVjdCAqdHdpY2UqLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpEYW5pZWwgKDkgSnVuZSAyMDAwKQotIFVwZGF0ZWQgdGhlIFJFU09VUkNFUyBmaWxlLCBhZGRlZCBhIFJFQURNRS53aW4zMiBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwMCkKLSBTbyBJIGZpbmFsbHkgYWRkZWQgdGhlIHByb2dyZXNzIGNhbGxiYWNrIHRvIHRoZSAqc2V0b3B0KCkgb3B0aW9ucyBhbmQgaXQKICBzaG91bGQgd29yayBub3cuIEkgZG9uJ3QgaGF2ZSB0aGUgZW5lcmd5IHRvIHdyaXRlIGFueSB0ZXN0IHByb2dyYW0gZm9yIGl0CiAgcmlnaHQgbm93LgotIE1hZGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHR5cGVkZWZzIHB1YmxpYyBpbiBjdXJsL2N1cmwuaCBmb3IgY29tZm9ydC4gSnVzdAogIGluIGNhc2UgYW55b25lIHdhbm5hIGZpZGRsZSB3aXRoIHN1Y2ggcG9pbnRlcnMuCi0gVXBkYXRlZCB0aGUgY3VybF9lYXN5X3NldG9wdCgpIG1hbiBwYWdlIGFjY29yZGluZ2x5LgoKVmVyc2lvbiA3LjAuNGJldGEKCkRhbmllbCAoMiBKdW5lIDIwMDApCi0gSSBub3RpY2VkIHRoYXQgd2hlbiBkb2luZyBMb2NhdGlvbjogZm9sbG93aW5nLCB3ZSBsb3N0IGN1c3RvbSBoZWFkZXJzIGluIGFsbAogIGJ1dCB0aGUgZmlyc3QgcmVxdWVzdC4KLSBSZW1vdmVkIHRoZSAnSHR0cFBvc3QnIHN0cnVjdCBhbmQgbW92ZWQgdGhlIGhlYWRlciBzdHVmZiB0byB0aGUgbW9yZSBnZW5lcmljCiAgY3VybF9zbGlzdC4KLSBBZGRlZCBzb21lIGJldHRlciBzbGlzdC1jbGVhbnVwcyBpbiBzcmMvbWFpbi5jCgpWZXJzaW9uIDcuMC4zYmV0YQoKRGFuaWVsICgzMSBNYXkgMjAwMCkKLSBTbyBJIGRpc2NvdmVyZWQgdGhhdCBJIHJlbGVhc2VkIHRoZSA3LjAuMmJldGEgd2l0aG91dCBpdCBiZWluZyBhYmxlIHRvCiAgY29tcGlsZSB1bmRlciBMaW51eC4gZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpIHR1cm5lZCBvdXQgdG8KICBmZWF0dXJlIGEgZGlmZmVyZW50IGFtb3VudCBvZiBhcmd1bWVudHMgb24gZGlmZmVyZW50IHN5c3RlbXMgc28gSSBoYWQgdG8gYWRkCiAgYSBjb25maWd1cmUgY2hlY2sgZm9yIHRoaXMgYW5kIGFkanVzdCB0aGUgY29kZSBzbGlnaHRseS4KClZlcnNpb24gNy4wLjJiZXRhCgpEYW5pZWwgKDI5IE1heSAyMDAwKQotIENvcnJlY3RlZCB0aGUgYml0cy4qIGFzc2lnbm1lbnRzIHdoZW4gdXNpbmcgQ1VSTE9QVCBvcHRpb25zIHRoYXQgb25seQogIHRvZ2dsZXMgb25lIG9mIHRob3NlIGJpdHMuCgotIEFwcGxpZWQgdGhlIGh1Z2UgcGF0Y2hlcyBmcm9tIERhdmlkIExlQmxhbmMgPGRsZWJsYW5jIGF0IHFueC5jb20+IHRoYXQgYWRkCiAgdXNhZ2Ugb2YgdGhlIGdldGhvc3RieW5hbWVfcigpIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyBpbiBjYXNlIHRoZXkncmUgYXJvdW5kLAogIHNpbmNlIHRoYXQgbWFrZSBsaWJjdXJsIG11Y2ggYmV0dGVyIHRocmVhZHNhZmUgaW4gbWFueSBzeXN0ZW1zIChzdWNoIGFzCiAgc29sYXJpcykuIEkgYWRkZWQgdGhlIGNoZWNrcyBmb3IgdGhlc2UgZnVuY3Rpb25zIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKICBJIGNhbid0IGV4cGxhaW4gd2h5LCBidXQgdGhlIGluZXRfbnRvYV9yKCkgZnVuY3Rpb24gZGlkIG5vdCBhcHBlYXIgaW4gbXkKICBTb2xhcmlzIGluY2x1ZGUgZmlsZXMsIEkgaGFkIHRvIGFkZCBteSBvd24gaW5jbHVkZSBmaWxlIGZvciB0aGlzIGZvciBub3cuCgpEYW5pZWwgKDIyIE1heSAyMDAwKQotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBmaXhlcyB0byBtYWtlIHRoZSB3aW4zMiB2ZXJzaW9uIGNvbXBpbGUgcHJvcGVybHkgYXMKICB3ZWxsIGFzIGEgcmVuYW1lIG9mIHRoZSAnaW50ZXJmYWNlJyBmaWVsZCBpbiB0aGUgdXJsZGF0YSBzdHJ1Y3QsIGFzIGl0IHNlZW1zCiAgdG8gYmUgcmVzZXJ2ZWQgaW4gc29tZSBnY2MgdmVyc2lvbnMhCgotIFJpY2ggR3JheSBzdHJ1Y2sgYmFjayB3aXRoIHlldCBzb21lIHBvcnRhYmlsaXR5IHJlcG9ydHMuIERhdGEgR2VuZXJhbCBERy9VWAogIG5lZWRlZCBhIGxpdHRsZSBmaXggaW4gbGliL2xkYXAuYyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgUlRMRF9HTE9CQUwgZGVmaW5lZC4KICBNb3JlIGZpeGVzIGFyZSBleHBlY3RlZCBhcyBhIHJlc3VsdCBvZiBSaWNoaWVzIHZlcnkgaGVscGZ1bCB3b3JrLgoKVmVyc2lvbiA3LjAuMWJldGEKCkRhbmllbCAoMjEgTWF5IDIwMDApCi0gVXBkYXRlZCBsb3RzIG9mICNkZWZpbmVzLCBlbnVtcyBhbmQgdmFyaWFibGUgdHlwZSBuYW1lcyBpbiB0aGUgbGlicmFyeS4gTm8KICBtb3JlIHdlaXJkIFVSRyBvciBVUkxUQUcgcHJlZml4ZXMuIEFsbCB0eXBlcyBhbmQgbmFtZXMgc2hvdWxkIGJlIGN1cmwtCiAgcHJlZml4ZWQgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzLiBUaGUgRkxBR1MtcGFyYW1ldGVyIHRvIHRoZSBmb3JtZXIKICBjdXJsX3VybGdldCgpIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgYnVuY2ggb2YgZmxhZ3MgdG8gdXNlIGluIHNlcGFyYXRlCiAgc2V0b3B0IGNhbGxzLiBJJ20gc3RpbGwgZm9jdXNpbmcgb24gdGhlIGVhc3ktaW50ZXJmYWNlLCBhcyB0aGUgY3VybCB0b29sIGlzCiAgbm93IHVzaW5nIHRoYXQuCgotIEJqb3JuIFJlZXNlIGhhcyBwcm92aWRlZCBtZSB3aXRoIGFuIGFzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVyIHRoYXQgSSBwbGFuCiAgdG8gdXNlIGluIHVwY29taW5nIHZlcnNpb25zIG9mIGN1cmwgdG8gYmUgYWJsZSB0byBncmFjZWZ1bGx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMuCgpWZXJzaW9uIDcuMGJldGEKCkRhbmllbCAoMTggTWF5IDIwMDApCi0gSW50cm9kdWNlZCBMSUJDVVJMX1ZFUlNJT05fTlVNIHRvIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJldHRlciBhbGxvdwogIHNvdXJjZSBjb2RlcyB0byBiZSBkZXBlbmRlbnQgb24gdGhlIGxpYiB2ZXJzaW9uLiBUaGlzIGRlZmluZSBpcyBub3cgc2V0IHRvCiAgYSBkZXhhZGVjaW1hbCBudW1iZXIsIHdpdGggOCBiaXRzIGVhY2ggZm9yIG1ham9yIG51bWJlciwgbWlub3IgbnVtYmVyIGFuZAogIHBhdGNoIG51bWJlci4gSW4gb3RoZXIgd29yZHMsIHZlcnNpb24gMS4yLjMgd291bGQgbWFrZSBpdCAweDAxMDIwMy4gSXQgYWxzbwogIG1ha2VzIGEgbGFyZ2VyIG51bWJlciBhIG5ld2VyIHZlcnNpb24uCgpEYW5pZWwgKDE3IE1heSAyMDAwKQotIE1hcnRpbiBLYW1tZXJob2ZlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgc2V2ZXJhbCBmbGF3cyBpbiB0aGUgRlRQIHJhbmdlCiAgb3B0aW9uLiBJIGNvcnJlY3RlZCB0aGVtLgotIFJlbW92ZWQgdGhlIHdpbjMyIHdpbnNvY2sgaW5pdCBjcmFwIGZyb20gdGhlIGxpYiB0byB0aGUgc3JjL21haW4uYyBmaWxlCiAgaW4gdGhlIGFwcGxpY2F0aW9uIGluc3RlYWQuIFRoZXkgY2FuJ3QgYmUgaW4gdGhlIGxpYiwgZXNwZWNpYWxseSBub3QgZm9yCiAgbXVsdGl0aHJlYWRlZCBwdXJwb3Nlcy4KCkRhbmllbCAoMTYgTWF5IDIwMDApCi0gUmV3cm90ZSB0aGUgc3JjL21haW4uYyBzb3VyY2UgdG8gdXNlIHRoZSBuZXcgZWFzeS1pbnRlcmZhY2UgdG8gbGliY3VybCA3LgogIFRoZXJlIGlzIHN0aWxsIG1vcmUgd29yayB0byBkbywgYnV0IHRoZSBmaXJzdCBzdGVwIGlzIG5vdyB0YWtlbi4KICA8Y3VybC9lYXN5Lmg+IGlzIHRoZSBpbmNsdWRlIGZpbGUgdG8gdXNlLgoKRGFuaWVsICgxNCBNYXkgMjAwMCkKLSBGVFAgVVJMcyBhcmUgbm93IHRyZWF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50LCBtb3JlIGFjY29yZGluZyB0byBSRkMgMTczOC4KLSBGVFAgc2Vzc2lvbnMgYXJlIG5vdyBwZXJmb3JtZWQgZGlmZmVyZW50bHksIHdpdGggQ1dEIGNvbW1hbmRzIHRvIGNoYW5nZQogIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIFJFVFIvU1RPUi9MSVNUIHdpdGggdGhlIGZ1bGwgcGF0aC4gRGlzY3Vzc2lvbnMgd2l0aAogIFJpY2ggR3JheSBtYWRlIG1lIG5vdGljZSB0aGVzZSBwcm9ibGVtcy4KLSBKYW5uZSBKb2hhbnNzb24gZGlzY292ZXJlZCBhbmQgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93IGluIHRoZQogIHNyYy91c3JnbG9iLmMgZmlsZS4KLSBJIGhhZCB0byBhZGQgYSBsaWIvc3RyZXF1YWwuYyBmaWxlIGZvciBkb2luZyBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmVzIG9uIGFsbCBwbGF0Zm9ybXMuCgpEYW5pZWwgKDggTWF5IDIwMDApOgotIEJlZW4gd29ya2luZyBsb3RzIG9uIHRoZSBuZXcgbGliLgotIFRvZ2V0aGVyIHdpdGggUmljaCBHcmF5LCBJJ3ZlIHRyaWVkIHRvIGFkanVzdCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrCiAgYmV0dGVyIG9uIHRoZSBOQ1IgTVAtUkFTIFVuaXguCgpEYW5pZWwgKDIgTWF5IDIwMDApOgotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCBJIGhhZCBhIGZldyB0b28gbWFueSBpbnN0cnVjdGlvbnMgaW4KICBjb25maWd1cmUuaW4gdGhhdCBkaWRuJ3QgZG8gYW55IGdvb2QuCgpEYW5pZWwgKDI0IEFwcmlsIDIwMDApOgotIEFkZGVkIGEgbmV3IHBhcmFncmFwaCB0byB0aGUgRkFRIGFib3V0IHdoYXQgdG8gZG8gd2hlbiBjb25maWd1cmUgY2FuJ3QKICBmaW5kIE9wZW5TU0wgZXZlbiB0aG91Z2ggaXQgaXMgaW5zdGFsbGVkLiBTdXBwbGllZCBieSBCb2IgQWxsaXNvbgoKRGFuaWVsICgxMiBBcHJpbCAyMDAwKToKLSBTdGFydGVkIG1lc3NpbmcgYXJvdW5kIGJpZy10aW1lIHRvIGNvbnZlcnQgdGhlIG9sZCBsaWJyYXJ5IGludGVyZmFjZSB0byBhCiAgYmV0dGVyIG9uZS4uLgoKRGFuaWVsICg4IEFwcmlsIDIwMDApOgotIE1hZGUgdGhlIHByb2dyZXNzIGJhciBsb29rIGJldHRlciBmb3IgZmlsZSBzaXplcyBiZXR3ZWVuIDk5OTkga2lsb2J5dGVzCiAgYW5kIDEwMCBtZWdhYnl0ZXMuIFRoZXkncmUgbm93IGRpc3BsYXllZCBYWC5YTS4KLSBJIGFsc28gbm90aWNlZCB0aGF0IGZ0cCBmZXRjaGVzIHRocm91Z2ggSFRUUCBwcm94aWVzIGRpZG4ndCBhZGQgdGhlIHVzZXIKICBhZ2VudCBzdHJpbmcuIEl0IGRvZXMgbm93LgotIEhhYmliaWUgPGhhYmliaWUgYXQgTWFpbGFuZE5ld3MuY29tPiBzdXBwbGllZCBhIHByZXR0eSBnb29kIHdheSB0byBidWlsZCBSUE1zCiAgb24gYSBMaW51eCBtYWNoaW5lLiBJdCBzdGlsbCBhKSByZXF1aXJlcyBtZSB0byBiZSByb290IHRvIGRvIGl0LCBiKSBsZWF2ZXMKICB0aGUgcnBtIHBhY2thZ2VzIGxheWluZyBhdCBzb21lIG9kZCBwbGFjZSBvbiBteSBkaXNrIGMpIGRvZXNuJ3Qgd29yayB0bwogIGJ1aWxkIHRoZSBzc2wgdmVyc2lvbiBvZiBjdXJsIHNpbmNlIEkgZGlkbid0IGluc3RhbGwgb3BlbnNzbCBmcm9tIGFuIHJwbQogIHBhY2thZ2Ugc28gbm93IHRoZSBycG0gY3JhcCB0aGlua3MgSSBkb24ndCBoYXZlIG9wZW5zc2wgYW5kIHJlZnVzZXMgdG8gYnVpbGQKICBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIHNzbC4uLiBEaWQgSSBtZW50aW9uIEkgZG9uJ3QgZ2V0IGFsb25nIHdpdGggUlBNPwotIE9uY2UgYWdhaW4gSSByZWNlaXZlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgYXV0b2NvbmYgbm90IHNldHRpbmcgLUwgcHJpb3IgdG8gLWwKICBvbiB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY2hlY2tpbmcgZm9yIGxpYnMuIEluIHRoaXMgY2FzZSBpdCBtYWRlIHRoZSBuYXRpdmUKICBjYyBjb21waWxlciBvbiBTb2xhcmlzIDcgdG8gZmFpbCB0aGUgT3BlblNTTCBjaGVjay4gVGhpcyBoYXMgcHJldmlvdXNseSBiZWVuCiAgcmVwb3J0ZWQgdG8gY2F1c2UgcHJvYmxlbXMgb24gSFAtVVggYW5kIGlzIGEga25vd24gZmxhdyBpbiBhdXRvY29uZiAyLjEzLiBJdAogIGlzIGEgcGl0eSB0aGVyZSdzIG5vIG5ld2VyIHJlbGVhc2UgYXJvdW5kLi4uCgpEYW5pZWwgKDQgQXByaWwgMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCB0d28gZml4ZXMgdGhhdAogIGFwcGVhcmFudGx5IG1ha2VzIHRoZSBPUy8yIHBvcnQgd29yayBiZXR0ZXIgd2l0aCBtdWx0aXBsZSBVUkxzLgoKRGFuaWVsICgyIEFwcmlsIDIwMDApOgotIEFub3RoZXIgTG9jYXRpb246IGZpeC4gVGhpcyB0aW1lLCB3aGVuIGN1cmwgY29ubmVjdGVkIHRvIGEgcG9ydCBhbmQgdGhlbgogIGZvbGxvd2VkIGEgbG9jYXRpb24gd2l0aCBhbiBhYnNvbHV0ZSBVUkwgdG8gYW5vdGhlciBwb3J0LCBpdCBtaXNiZWhhdmVkLgoKRGFuaWVsICgyNyBNYXJjaCAyMDAwKToKLSBILiBEYXBobmUgTHVvbmcgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyB3cm9uZ2x5CiAgbWVzc2luZyB1cCB0aGUgcHJveHkgc3RyaW5nIHdoZW4gZmV0Y2hpbmcgYSBkb2N1bWVudCB0aHJvdWdoIGEgaHR0cCBwcm94eSwKICB3aGljaCBzY3Jld2VkIHVwIG11bHRpcGxlIGZldGNoZXMgc3VjaCBhcyBpbiBsb2NhdGlvbjogZm9sbG93aW5ncy4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gY29ycmVjdGVkIG15IGJhZGx5IGFwcGxpZWQgcGF0Y2ggaGUKICBhY3R1YWxseSBhbHJlYWR5IHRvbGQgbWUgYWJvdXQhCgotIEguIERhcGhuZSBMdW9uZyBicm91Z2h0IG1lIGEgZml4IHRoYXQgbm93IG1ha2VzIGN1cmwKICBpZ25vcmUgc2VsZWN0KCkgZXJyb3JzIGluIHRoZSBkb3dubG9hZCBpZiBlcnJubyBpcyBFSU5UUiwgd2hpY2ggdHVybnMgb3V0IHRvCiAgaGFwcGVuIGV2ZXJ5IG5vdyBhbmQgdGhlbiB3aGVuIHVzaW5nIGxpYmN1cmwgbXVsdGktdGhyZWFkZWQuLi4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgY291cGxlIG9mIHdpbjMyIGZpeGVzLiBIQVZFX1VOQU1FCiAgd2FzIGFjY2lkZW50YWxseSAjZGVmaW5lZCBpbiBjb25maWctd2luMzIuaCwgd2hpY2ggaXQgc2hvdWxkbid0IGhhdmUgYmVlbi4KICBUaGUgSEFWRV9VTklTVERfSCBpcyBub3QgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIHRoZSBNYWtlZmlsZS52YzYKICBtYWtlZmlsZSBmb3IgTVMgVkMrKy4KCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gSSByZW1vdmVkIHRoZSBBQ19QUk9HX0lOU1RBTEwgbWFjcm8gZnJvbSBjb25maWd1cmUuaW4sIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIG9uZSBvZiB0aGUgQU1fKiBtYWNyb3Mgc2VhcmNoZXMgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCBhbHJlYWR5LiBKYW5uZQogIEpvaGFuc3NvbiBtYWRlIG1lIGF3YXJlIG9mIHRoaXMuCgpWZXJzaW9uIDYuNS4yCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBxdWlja2x5IHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgNi41LjEKICBjcmFzaGVzIGhhcmQuIEkgdXBsb2FkIDYuNS4yIG5vdyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlISBUaGUgcHJvYmxlbSB3YXMKICB0aGUgLUQgYWRqdXN0bWVudHMgaW4gc3JjL21haW4uYy4KClZlcnNpb24gNi41LjEKCkRhbmllbCAoMjAgTWFyY2ggMjAwMCk6Ci0gQW4gYW5vbnltb3VzIHBvc3Qgb24gc291cmNlZm9yZ2UgY29ycmVjdGx5IHBvaW50ZWQgb3V0IGEgcG9zc2libGUgYnVmZmVyCiAgb3ZlcmZsb3cgaW4gdGhlIGN1cmxfdW5lc2NhcGUoKSBmdW5jdGlvbiBmb3IgVVJMIGNvbnZlcnNpb25zLiBUaGUgbWFpbgogIHByb2JsZW0gd2l0aCB0aGlzIGJ1ZyBpcyB0aGF0IHRoZSBmdHAgZG93bmxvYWQgdXNlcyB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzCiAgc2luZ2xlLSBieXRlIG92ZXJmbG93IGNvdWxkIGxlYWQgdG8gdmVyeSBvZGQgYnVncyAoYXMgb25lIHJlcG9ydGVkIGJ5IEphbm5lCiAgSm9oYW5zc29uKS4KCkRhbmllbCAoMTkgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCBhIHNlcmllcyBvZiBwYXRjaGVzCiAgdGhhdCBub3cgYWxsb3dzIGN1cmwgdG8gZ2V0IGNvbXBpbGVkIG9uIE9TLzIuIEl0IGV2ZW4gaW5jbHVkZXMgYSBzZWN0aW9uIGluCiAgdGhlIElOU1RBTEwgZmlsZS4gVmVyeSBuaWNlIGpvYiEKCkRhbmllbCAoMTcgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgcGF0Y2ggZm9yIHRoZSBsaWIvTWFrZWZpbGUudmM2CiAgZmlsZS4gV2Ugc3RpbGwgbmVlZCBzb21lIGZpeGVzIGZvciB0aGUgY29uZmlnLXdpbjMyLmggc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgVkMrKyBhbmQgbWluZ3czMiBoYXZlIGRpZmZlcmVudCBvcGluaW9ucyBhYm91dCAoYXQgbGVhc3QpIHVuaXN0ZC5oJ3MKICBleGlzdGVuY2UuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDApOgotIEkgbW9kaWZpZWQgdGhlIC1ELy0tZHVtcC1oZWFkZXIgd29ya2luZ3Mgc28gdGhhdCBpdCBkb2Vzbid0IHdyaXRlIGFueXRoaW5nCiAgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8uIFRoaXMgd2F5LCB5b3UgY2FuIGFjdHVhbGx5IHVzZSAtYiBhbmQgLUQKICBvbiB0aGUgc2FtZSBmaWxlIGlmIHlvdSB3YW50IHJlcGVhdGVkIGludm9rZXMgdG8gc3RvcmUgYW5kIHJlYWQgdGhlIGNvb2tpZXMKICBpbiB0aGF0IG9uZSBzaW5nbGUgZmlsZS4KCi0gUG9rZWQgYXJvdW5kIGluIGxvdHMgb2YgdGV4dHMuIEFkZGVkIHRoZSBCVUdTIGZpbGUgZm9yIGJ1ZyByZXBvcnRpbmcgc3R1ZmYuCiAgQWRkZWQgdGhlIGNsYXNzaWMgSFRUUCBQT1NUIHF1ZXN0aW9uIHRvIHRoZSBGQVEsIHJlbW92ZWQgc29tZSAjaWZkZWYgV0lOMzIKICBzdHVmZiBmcm9tIHRoZSBzb3VyY2VzICh0aGV5J3JlIGNvdmVyZWQgYnkgdGhlIGNvbmZpZy13aW4zMi5oIG5vdykuCgotIFBhc2NhbCBHYXVkZXR0ZSBmaXhlZCBhIG1pc3NpbmcgbGRhcC5jIHByb2JsZW0gaW4gdGhlCiAgTWFrZWZpbGUudmM2IGZpbGUuIEhlIGFsc28gYWRkcmVzc2VkIGEgcHJvYmxlbSBpbiBzcmMvY29uZmlnLXdpbjMyLmguCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAnaHR0cF9jb2RlJyB2YXJpYWJsZSBpbiB0aGUgLXcgb3V0cHV0CiAgd2FzIG5ldmVyIHdyaXR0ZW4uIEkgZml4ZWQgaXQgbm93LgoKLSBKYW5uZSBKb2hhbnNzb24gcmVwb3J0ZWQgdGhlIGNvbXBsYWludHMgdGhhdCBPcGVuQlNEIGRvZXMKICB3aGVuIGdldGRhdGUuYyAjaW5jbHVkZXMgbWFsbG9jLmguIEl0IGNsYWltcyBzdGRsaWIuaCBzaG91bGQgYmUgaW5jbHVkZWQKICBpbnN0ZWFkLiBJIGFkZGVkICNpZmRlZiBIQVZFX01BTExPQ19IIGNvZGUgaW4gZ2V0ZGF0ZS55IGFuZCB0d28gY2hlY2tzIGluCiAgdGhlIGNvbmZpZ3VyZS5pbiBmb3IgbWFsbG9jLmggYW5kIHN0ZGxpYi5oLgoKVmVyc2lvbiA2LjUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMCk6Ci0gPGN1cmwgYXQgc3BhbS53b2x2ZXNiYW5lLm5ldD4gcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2F5IGN1cmwgc2VudCBjb29raWVzIGluIGEKICBzaW5nbGUgbGluZSB3YXNuJ3QgZW5qb3llZCBieSBJSVM0LjAgc2VydmVycy4gSW4gbXkgdmlldywgdGhhdCBpcyBub3Qgd2hhdAogIHRoZSBzdGFuZGFyZHMgc2F5LCBidXQgSSBhZGRlZCBhIHdoaXRlIHNwYWNlIGJldHdlZW4gdGhlIG5hbWUvdmFsdWUgcGFpcnMgdG8KICBwZXJoYXBzIG1ha2UgdGhlbSB3b3JrIGJldHRlci4KCi0gQWRkZWQgdGhlIHBlcmwgY2hlY2sgYmFjayBpbiB0aGUgY29uZmlndXJlLmluIGFnYWluIHNpbmNlIHRoZSBta2hlbHAucGwKICBzY3JpcHQgbmVlZHMgaXQhCgotIE1hZGUgc29tZSBiZWF1dGlmaWNhdGlvbnMgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gSvZybiBoZWxwZWQgbWUgdXBkYXRlIHRoZSBjb25maWctd2luMzIuaCBmaWxlcyB3aXRoIEhBVkVfU0VUVkJVRiBhbmQKICBIQVZFX1NUUkRVUC4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBVcGxvYWRlZCB0aGUgNi41cHJlMiBwYWNrYWdlLgoKRGFuaWVsICgyIE1hcmNoIDIwMDApOgotIFJlbW92ZWQgdGhlIHBlcmwtcHJvZ3JhbXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLCB0aGV5IG5ldmVyIG1hZGUgbWFueSBwZW9wbGUKICBoYXBweSBhbmQgSSdsbCBzdGlsbCBrZWVwIHRoZW0gYXZhaWxhYmxlIG9uIHRoZSB3ZWIuCgotIEFkZGVkIHRoZSAtdyBhbmQgLU4gc3R1ZmYgdG8gdGhlIG1hbiBwYWdlLiBEb2N1bWVudGVkIHRoZSBuZXcgcHJvZ3Jlc3MgbWV0ZXIKICBkaXNwbGF5IGluIFJFQURNRS5jdXJsLgoKLSBK9nJuIEhhcnRyb3RoLCBDaHJpcyA8Y2JheWxpc3MgYXQgY3NjLmNvbWU+IGFuZCBVbGYKICBN9mxsZXIgZnJvbSB0aGUgb3BlbnNzbCBkZXZlbG9wbWVudCB0ZWFtIGhlbHBlZCBicmluZ2luZyBtZSB0aGUgZGV0YWlscyBmb3IKICBmaXhpbmcgYW4gT3BlblNTTCB1c2FnZSBmbGF3LiBJdCBiZWNhbWUgYXBwYXJlbnQgd2hlbiB0aGV5IHJlbGVhc2VkIG9wZW5zc2wKICAwLjkuNSBzaW5jZSB0aGF0IGJhcmZlZCBvbiBjdXJsJ3MgYmFkIGJlaGF2aW9yIChub3Qgc2VlZGluZyBhIHJhbmRvbSBudW1iZXIKICB0aGluZykuCgotIFlldCBhbm90aGVyIG9wdGlvbjogLU4vLS1uby1idWZmZXIgZGlzYWJsZXMgYnVmZmVyaW5nIGluIHRoZSBvdXRwdXQgc3RyZWFtLgogIFByb2JhYmx5IG1vc3QgdXNlZnVsIGZvciB2ZXJ5IHNsb3cgdHJhbnNmZXJzIHdoZW4geW91IHJlYWxseSB3YW50IHRvIGdldAogIGV2ZXJ5IGJ5dGUgY3VybCByZWNlaXZlcyB3aXRoaW4gc29tZSBwcmVmZXJyZWQgdGltZS4gQW5kcmV3IDx0bXIgYXQgZ2NpLm5ldD4KICBzdWdnZXN0ZWQgdGhpcy4KCi0gRGFtaWVuIEFkYW50IG1haWxlZCBtZSBoaXMgZml4ZXMgZm9yIG1ha2luZyBjdXJsIGNvbXBpbGUgb24gVWx0cml4LgoKRGFuaWVsICgyNCBGZWJydWFyeSAyMDAwKToKLSBBcHBsaWVkIEr2cm4gSGFydHJvdGgncyBmaXhlcyBmb3IgY29uZmlnLXdpbjMyLmggYW5kIGxpYi9NYWtlZmlsZS53MzIuCgogIEkgc2hvdWxkIGFsc28gbWFrZSBhIG5vdGUgaGVyZSwgaWYgbm90aGluZyBlbHNlIHRvIG15c2VsZiwgdGhhdCB3aGVuIHVzaW5nCiAgdGhlICUtc3ludGF4IGZvciB2YXJpYWJsZXMgaW4gRE9TIGNvbW1hbmQgcHJvbXB0cywgeW91IG11c3QgdXNlIHR3byAlLQogIGxldHRlcnMgZm9yIGVhY2ggb25lIHNpbmNlIHRoYXQgaXMgYW4gZXNjYXBlIGxldHRlciB0aGVyZSEgTWF5YmUgSSBzaG91bGQKICB1c2UgYW5vdGhlciBsZXR0ZXIgaW5zdGVhZCEKCi0gQWRkZWQgbW9yZSB2YXJpYWJsZXMgdG8gLXc6CgogICdodHRwX2NvZGUnCiAgJ3RpbWVfbmFtZWxvb2t1cCcKICAndGltZV9jb25uZWN0JwogICd0aW1lX3ByZXRyYW5zZmVyJwogICd1cmxfZWZmZWN0aXZlJwoKLSBNYWRlIC13QGZpbGVuYW1lIHJlYWQgdGhlIHN5bnRheCBmcm9tIGEgZmlsZSBhbmQgLXdALSByZWFkcyB0aGUgc3ludGF4IGZyb20KICBzdGRpbiBpbiB0aGUgZ29vZCBvbGQgInN0YW5kYXJkIiBjdXJsIHdheS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMCk6Ci0gUmVsZWFzZWQgYSA2LjVwcmUxIHZlcnNpb24gdG8gZ2V0IHNvbWUgdGVzdCBhbmQgdXNlciBmZWVkYmFjay4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwMCk6CgotIEkgYWRkZWQgdGhlIC13Ly0td3JpdGUtb3V0IGZsYWcgYW5kIHNvbWUgdmFyaWFibGVzIHRvIGdvIHdpdGggaXQuIC13IGlzIGEKICBzaW5nbGUgc3RyaW5nLCB3aGF0ZXZlciB5b3UgZW50ZXIgdGhlcmUgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIGN1cmwgaGFzCiAgY29tcGxldGVkIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0LiBUaGVyZSBhcmUgc29tZSB2YXJpYWJsZSBzdWJzdGl0dXRpb25zIGFuZAogIHRoZXkgYXJlIHNwZWNpZmllZCBhcyAnJXt2YXJpYWJsZX0nICh3aXRob3V0IHRoZSBxdW90ZXMpLiBWYXJpYWJsZXMgdGhhdAogIGV4aXN0IGFzIG9mIHRoaXMgbW9tZW50IGFyZToKCiAgICAgICAgdG90YWxfdGltZSAgICAgLSB0b3RhbCB0cmFuc2ZlciB0aW1lIGluIHNlY29uZHMgKHdpdGggMiBkZWNpbWFscykKICAgICAgICBzaXplX2Rvd25sb2FkICAtIHRvdGFsIGRvd25sb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc2l6ZV91cGxvYWQgICAgLSB0b3RhbCB1cGxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzcGVlZF9kb3dubG9hZCAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgZG93bmxvYWQKICAgICAgICBzcGVlZF91cGxvYWQgICAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgdXBsb2FkCgogIEkgd2lsbCBvZiBjb3Vyc2UgYWRkIG1vcmUgdmFyaWFibGVzLCBidXQgSSBuZWVkIGlucHV0IG9uIHRoZXNlIGFuZCBvdGhlcnMuCgotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2lsbCBiZSBoYXJkIHRvIGp1c3QgYXBwbHkgb24gdGhlIG5ldwogIHByb2dyZXNzIGJhciBjb25jZXB0LiBJIG5lZWQgc29tZSBmZWVkYmFjayBvbiB0aGlzIGJlZm9yZSB0aGF0J2xsIGdldCByZS0KICBpbnRyb2R1Y2VkISA6LS8KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwMCk6Ci0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHNvbWUgZml4ZXMgZm9yIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgSSBjb250aW51ZWQKICB3b3JraW5nIG9uIGl0LiBJdCBzZWVtcyB0byB3b3JrIGZvciBodHRwIGRvd25sb2FkLCBodHRwIHBvc3QsIGZ0cCBkb3dubG9hZAogIGFuZCBmdHAgdXBsb2FkLiBJdCBzaG91bGQgYmUgYSBwcmV0dHkgZ29vZCB0ZXN0IGl0IHdvcmtzIGdlbmVyYWxseSBnb29kLgoKLSBTdGlsbCBuZWVkIHRvIGFkZCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIGludG8gdGhlIG5ldyBzdHlsZSBwcm9ncmVzcyBpbnRlcmZhY2UuCgotIEdvbm5hIGhhdmUgYSBnbyBhdCBteSBuZXcgb3V0cHV0IG9wdGlvbiBwYXJhbWV0ZXIgbmV4dC4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMCk6Ci0gVGhlIHByb2dyZXNzIG1ldGVyIHN0dWZmIGlzIHNsb3dseSB0YWtpbmcgcGxhY2UuIFRoZXJlJ3MgbW9yZSBsZWZ0IGJlZm9yZSBpdAogIGlzIHdvcmtpbmcgb2sgYW5kIGV2ZXJ5dGhpbmcgaXMgdGVzdGVkLCBidXQgd2UncmUgcmVhY2hpbmcgdGhlcmUuIFNsb3dseSEKCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwMCk6Ci0gUGF1bCBNYXJxdWlzIGZpeGVkIHRoZSBjb25maWcgZmlsZSBwYXJzaW5nIG9mIGN1cmwgdG8KICBkZWFsIHdpdGggYW55LWxlbmd0aCBsaW5lcywgcmVtb3ZpbmcgdGhlIHByZXZpb3VzIGxpbWl0IG9mIDRLLgoKLSBFZXR1IE9qYW5lbidzIHN1Z2dlc3Rpb24gb2Ygc3VwcG9ydGluZyB0aGUgQC1zdHlsZSBmb3IgLWIKICBpcyBpbXBsZW1lbnRlZC4gTm93IC1iQDxmaWxlbmFtZT4gd29ya3MgYXMgd2VsbCBhcyB0aGUgb2xkIHN0eWxlLiAtYkAtIGFsc28KICBzaW1pbGFybHkgcmVhZHMgdGhlIGNvb2tpZXMgZnJvbSBzdGRpbi4KCi0gUmVtaW5kZXI6IC1EIHNob3VsZCBub3Qgd3JpdGUgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8sIGluIHRoZSBzYW1lIHdheQogIC1vIGRvZXMuIFRoYXQgd291bGQgZW5hYmxlIGN1cmwgdG8gdXNlIC1iIGFuZCAtRCBvbiB0aGUgc2FtZSBmaWxlLi4uCgotIEVsbGlzIFByaXRjaGFyZCBtYWRlIGdldGRhdGUueSB3b3JrIGZvciBNYWNPUyBYLgoKLSBQYXVsIEhhcnJpbmd0b24gaGVscGVkIG1lIG91dCBmaW5kaW5nIHRoZSBjcmFzaCBpbiB0aGUKICBjb29raWUgcGFyc2VyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGN1cmwncyBoYWJpdCBvZiBzZW5kaW5nIGVtcHR5IGNvb2tpZXMgdG8KICB0aGUgc2VydmVyLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDApOgogLSBSb24gWmFwcCBjb3JyZWN0ZWQgYSBwcm9ibGVtIGluIHNyYy91cmxnbG9iLmMgdGhhdAogICBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgY29tcGlsZWQgb24gc3Vub3MgNC4gVGhlIHByb2JsZW0gaGFkIHRvIGRvCiAgIHdpdGggdGhlIGRpZmZlcmVuY2UgaW4gc3ByaW50ZigpIHJldHVybiBjb2RlIHR5cGVzLgoKIC0gVHJhbnNmZXIoKSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG93bmxvYWQgYW5kIHVwbG9hZCBzaW11bHRhbmVvdXNseS4gTGV0J3MKICAgZG8gc29tZSBwcm9ncmVzcyBtZXRlciBmaXhlcyBsYXRlciB0aGlzIHdlZWsuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMCk6CiAtIFBhdWwgSGFycmluZ3RvbiBmb3VuZCBhbm90aGVyIGNvcmUgZHVtcCBpbiB0aGUgY29va2llCiAgIHBhcnNlci4gQ3VybCBkb2Vzbid0IHByb3Blcmx5IHJlY29nbml6ZSB0aGUgJ3ZlcnNpb24nIGtleXdvcmQgYW5kIEkgdGhpbmsKICAgdGhhdCBpcyB3aGF0IGNhdXNlZCB0aGlzLiBJIG5lZWQgdG8gcmVmcmVzaCBzb21lIHNwZWNzIG9uIGNvb2tpZXMgYW5kIHNlZQogICB3aGF0IGVsc2UgY3VybCBsYWNrcyB0byBpbXByb3ZlIHRoaXMgYSBiaXQgbW9yZSBvbmNlIGFuZCBmb3IgYWxsLgoKICAgUkZDIDIxMDkgY2xlYXJseSBzcGVjaWZpZXMgaG93IGNvb2tpZXMgc2hvdWxkIGJlIGRlYWx0IHdpdGggd2hlbiB0aGV5IGFyZQogICBjb21wbGlhbnQgd2l0aCB0aGF0IHNwZWMuIEkgZG9uJ3QgdGhpbmsgbWFueSBzZXJ2ZXJzIGFyZSB0aG91Z2guLi4KCiAtIE1hcmsgVy4gRWljaGluIGZvdW5kIHRoYXQgd2hpbGUgY3VybCBpcyB1cGxvYWRpbmcgYSBmb3JtCiAgIHRvIGEgd2ViIHNpdGUsIGl0IGRvZXNuJ3QgcmVhZCBpbmNvbWluZyBkYXRhIHdoeSBpdCdsbCBoYW5nIGFmdGVyIGEgd2hpbGUKICAgc2luY2UgdGhlIHNvY2tldCAicGlwZSIgYmVjb21lcyBmdWxsLgoKICAgSXQgdG9vayBtZSB0d28gaG91cnMgdG8gcmV3cml0ZSBEb3dubG9hZCgpIGFuZCBVcGxvYWQoKSBpbnRvIHRoZSBuZXcKICAgc2luZ2xlIGZ1bmN0aW9uIFRyYW5zZmVyKCkuIEl0IGV2ZW4gc2VlbXMgdG8gd29yayEgTW9yZSB0ZXN0aW5nIGlzIHJlcXVpcmVkCiAgIG9mIGNvdXJzZS4uLiBJIHNob3VsZCBnZXQgdGhlIGhlYWRlci1zZW5kaW5nIHRvZ2V0aGVyIGluIGEga2luZCBvZiBxdWV1ZQogICBhbmQgbGV0IHRoZW0gZ2V0ICJ1cGxvYWRlZCIgaW4gVHJhbnNmZXIoKSBhcyB3ZWxsLgoKIC0gWmhpYmlhbyBXdSBwb2ludGVkIG91dCBhIGN1cmwgYnVnIGluIHRoZSBsb2NhdGlvbjogYXJlYSwKICAgYWx0aG91Z2ggSSBkaWQgbm90IGdldCBhIHJlcHJvZHVjaWJsZSB3YXkgdG8gZG8gdGhpcyB3aHkgSSBoYXZlIHRvIHdhaXQKICAgd2l0aCBmaXhpbmcgYW55dGhpbmcuCgogLSBCb2IgU2NoYWRlciBzdWdnZXN0ZWQgSSBzaG91bGQgaW1wbGVtZW50IHJlc3VtZQogICBzdXBwb3J0IGZvciB0aGUgSFRUUCBQVVQgb3BlcmF0aW9uLCBhbmQgYXMgSSB0aGluayBpdCBpcyBhIHZhbGlkIHN1Z2dlc3Rpb24KICAgSSdsbCB3b3JrIG9uIGl0LgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDApOgogLSBNIFRyYXZpcyBPYmVuaGF1cyBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXh1cCB3aXRoIC15IGFuZCAtWSB0aGF0IHdhcwogICBjb3JyZWN0ZWQuCgogLSBKZW5zIFNjaGxldXNlbmVyIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB0byBjb21waWxlCiAgIGN1cmwgb24gQUlYIDQuMS40IGFuZCBnYXZlIG1lIGEgc29sdXRpb24uIFRoaXMgcHJvYmxlbSB3YXMgYWxyZWFkeSBmaXhlZAogICBieSBK9nJuJ3MgcmVjZW50ICNpbmNsdWRlIG1vZGlmaWNhdGlvbnMhCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMCk6CiAtIE9za2FyIExpbGplYmxhZCBwb2ludGVkIG91dCBhbmQgY29ycmVjdGVkIGEgcHJvYmxlbQogICBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBzeXN0ZW0gdGhhdCBtYWRlIGN1cmwgZm9sbG93aW5nIGEgbG9jYXRpb246IHRvIGEKICAgZGlmZmVyZW50IHByb3RvY29sIHRvIGZhaWwuCgogICBBdCBKYW51YXJ5IDMxc3QgSSByZS1jb25zaWRlcmVkIHRoaXMgZml4IGFuZCB0aGUgc3Vycm91bmRpbmcgc291cmNlIGNvZGUuIEkKICAgY291bGQgbm90IHJlYWxseSBzZWUgdGhhdCB0aGUgcGF0Y2ggZGlkIGFueSBkaWZmZXJlbmNlLCB3aHkgSSByZW1vdmVkIGl0CiAgIGFnYWluIGZvciBmdXJ0aGVyIHJlc2VhcmNoIGFuZCBkZWJ1Z2dpbmcuIChJdCBkaXNhYmxlZCBsb2NhdGlvbjogZm9sbG93aW5nCiAgIG9uIHNlcnZlciBub3QgcnVubmluZyBvbiBkZWZhdWx0IHBvcnRzLikKCiAtIEr2cm4gSGFydHJvdGggYnJvdWdodCBhIGZpeCB0aGF0IG9uY2UgYWdhaW4KICAgbWFkZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgcHJvZ3Jlc3MgYmFyLgoKIC0gSvZybiBhbHNvIGZpeGVkIGEgZmV3IGluY2x1ZGUgcHJvYmxlbXMuCgpWZXJzaW9uIDYuNAoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDApOgogLSBCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIEJq9nJuIFN0ZW5iZXJnLCBJIG1hZGUgdGhlCiAgIHByb2dyZXNzIGRlYWwgYmV0dGVyIHdpdGggbGFyZ2VyIGZpbGVzIGFuZCBhZGRlZCBhICJUaW1lIiBmaWVsZCB3aGljaCBzaG93cwogICB0aGUgdGltZSBzcGVudCBvbiB0aGUgZG93bmxvYWQgc28gZmFyLgogLSBJJ20gbm93IHVzaW5nIHRoZSBDVlMgcmVwb3NpdG9yeSBvbiBzb3VyY2Vmb3JnZS5uZXQsIHdoaWNoIGFsc28gYWxsb3dzIHdlYgogICBicm93c2luZy4gU2VlIGh0dHA6Ly9jdXJsLmhheHgubnUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwMCk6CiAtIFJlbnVtYmVyZWQgc29tZSBlbnVtcyBpbiBjdXJsL2N1cmwuaCBzaW5jZSB0YWcgbnVtYmVyIDM1IHdhcyB1c2VkIHR3aWNlIQogLSBBZGRlZCAicG9zdHF1b3RlIiBzdXBwb3J0IHRvIHRoZSBmdHAgc2VjdGlvbiB0aGF0IGVuYWJsZXMgcG9zdC1mdHAtdHJhbnNmZXIKICAgcXVvdGUgY29tbWFuZHMuCiAtIE5vdyBtYWRlIHRoZSAtUS8tLXF1b3RlIHBhcmFtZXRlciByZWNvZ25pemUgJy0nIGFzIGEgcHJlZml4LCB3aGljaCBtZWFucwogICB0aGF0IGNvbW1hbmQgd2lsbCBiZSBpc3N1ZWQgQUZURVIgYSBzdWNjZXNzZnVsIGZ0cCB0cmFuc2Zlci4gVGhpcyBjYW4gb2YKICAgY291cnNlIGJlIHVzZWQgdG8gZGVsZXRlIG9yIHJlbmFtZSBhIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gdXBsb2FkZWQgb3IKICAgZG93bmxvYWRlZC4gVXNlIHlvdXIgaW1hZ2luYXRpb24hIDstKQogLSBTaW5jZSBJIGRvIHRoZSBtYWluIGRldmVsb3BtZW50IG9uIHNvbGFyaXMgMi42IG5vdywgSSBoYWQgdG8gZG93bmxvYWQgYW5kCiAgIGluc3RhbGwgR05VIGdyb2ZmIHRvIGdlbmVyYXRlIHRoZSBodWdlaGVscC5jIGZpbGUuIFRoZSBzb2xhcmlzIG5yb2ZmIGNvcmVzCiAgIG9uIHRoZSBtYW4gcGFnZSEgU28sIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNvbGFyaXMgY29uZmlndXJlIHNjcmlwdCBmaW5kIGEKICAgYmV0dGVyIHJlc3VsdCBJIG1hZGUgZ25yb2ZmIGdldCBjaGVja2VkIHByaW9yIHRvIHRoZSByZWd1bGFyIG5yb2ZmLgogLSBBZGRlZCBhbGwgdGhlIGN1cmwgZXhpdCBjb2RlcyB0byB0aGUgbWFuIHBhZ2UuCiAtIEppbSBHYWxsYWdoZXIgcHJvcGVybHkgdHJhY2tlZCBkb3duIGEgYnVnIGluIGF1dG9jb25mCiAgIDIuMTMuIFRoZSBBQ19DSEVDS19MSUIoKSBtYWNybyB3cm9uZ2Z1bGx5IHVzZXMgdGhlIC1sIGZsYWcgYmVmb3JlIHRoZSAtTAogICBmbGFnIHRvICdsZCcgd2hpY2ggY2F1c2VzIHRoZSBIUC1VWCAxMC4yMCBmbGF2b3VyIHRvIGZhaWwgb24gYWxsIGxpYmNoZWNrcwogICBhbmQgdGhlcmVmb3JlIHlvdSBjYW4ndCBtYWtlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgbGlicyEKCg==