ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpWZXJzaW9uIDcuNQoKRGFuaWVsICgxIERlY2VtYmVyIDIwMDApCi0gQ3JhaWcgRGF2aXNvbiBnYXZlIHVzIGhpcyB1cGRhdGVzIG9uIHRoZSBWQysrIG1ha2VmaWxlcywgc28gbm93IGN1cmwgc2hvdWxkCiAgYnVpbGQgZmluZSB3aXRoIHRoZSBNaWNyb3NvZnQgY29tcGlsZXIgb24gd2luZG93cyB0b28uCgotIEZpeGVkIHRoZSBsaWJjdXJsIHZlcnNpb25pbmcgc28gdGhhdCB3ZSBkb24ndCBydWluIG9sZCBwcm9ncmFtcyB3aGVuCiAgcmVsZWFzaW5nIG5ldyBzaGFyZWQgbGlicmFyeSBpbnRlcmZhY2VzLgoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDAwKQotIFJlbmFtZWQgZG9jcy9SRUFETUUuY3VybCB0byBkb2NzL01BTlVBTCB0byBiZXR0ZXIgcmVmbGVjdCB3aGF0IHRoZSBkb2N1bWVudAogIGFjdHVhbGx5IGNvbnRhaW5zLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDAwKQotIEkgcmVtb3ZlZCBhIGJ1bmNoIG9mICcjaWYgMCcgc2VjdGlvbnMgZnJvbSB0aGUgY29kZS4gVGhleSBvbmx5IG1ha2UgdGhpbmdzCiAgaGFyZGVyIHRvIGZvbGxvdy4gQWZ0ZXIgYWxsLCB3ZSBkbyBoYXZlIGFsbCBvbGRlciB2ZXJzaW9ucyBpbiB0aGUgQ1ZTLgoKVmVyc2lvbiA3LjUtcHJlNQoKRGFuaWVsICgyOCBOb3ZlbWJlciAyMDAwKQotIEkgZmlsbGVkIGluIG1vcmUgZXJyb3IgY29kZXMgaW4gdGhlIG1hbiBwYWdlIGVycm9yIGNvZGUgbGlzdCB0aGF0IGhhZCBiZWVuCiAgbGFnZ2luZy4KCi0gSmFtZXMgR3JpZmZpdGhzIG1haWxlZCBtZSBhIGZpbmUgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIHRoZSBDVVJMT1BUX01BWFJFRElSUwogIGxpYmN1cmwgb3B0aW9uLiBXaGVuIHVzZWQsIGl0J2xsIHByZXZlbnQgbG9jYXRpb24gZm9sbG93aW5nIG1vcmUgdGhhbiB0aGUKICBzZXQgbnVtYmVyIG9mIHRpbWVzLiBJdCBpcyB1c2VmdWwgdG8gYnJlYWsgb3V0IG9mIGVuZGxlc3MgcmVkaXJlY3QtbG9vcHMuCgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgdHdvIHRlc3QgY2FzZXMgZm9yIGZpbGU6Ly8uCgpEYW5pZWwgKDIyIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgdGhlIGxpYmN1cmwgQ1VSTE9QVF9GSUxFVElNRSBzZXRvcHQsIHdoZW4gc2V0IGl0IHRyaWVzIHRvIGdldCB0aGUKICBtb2RpZmllZCB0aW1lIG9mIHRoZSByZW1vdGUgZG9jdW1lbnQuIFRoaXMgaXMgYSBzcGVjaWFsIG9wdGlvbiBzaW5jZSBpdAogIGludm9sdmVzIGFuIGV4dHJhIHNldCBvZiBjb21tYW5kcyBvbiBGVFAgc2VydmVycy4gKFVzaW5nIHRoZSBNRFRNIGNvbW1hbmQKICB3aGljaCBpcyBub3QgaW4gdGhlIFJGQzk1OSkKCiAgY3VybF9lYXN5X2dldGluZm8oKSBnb3QgYSBjb3JyZXNwb25kaW5nIENVUkxJTkZPX0ZJTEVUSU1FIHRvIGdldCB0aGUgdGltZQogIGFmdGVyIGEgdHJhbnNmZXIuIEl0J2xsIHJldHVybiBhIHplcm8gaWYgQ1VSTE9QVF9GSUxFVElNRSB3YXNuJ3QgdXNlZCBvciBpZgogIHRoZSB0aW1lIHdhc24ndCBwb3NzaWJsZSB0byBnZXQuCgogIC0taGVhZC8tSSB1c2VkIG9uIGEgRlRQIHNlcnZlciB3aWxsIG5vdyBwcmVzZW50IGEgJ0xhc3QtTW9kaWZpZWQ6JyBoZWFkZXIKICBpZiBjdXJsIGNvdWxkIGdldCB0aGUgdGltZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuCgotIEFkZGVkIHRoZSBvcHRpb24gJy0tY2FjZXJ0IFtmaWxlXScgdG8gY3VybCwgd2hpY2ggYWxsb3dzIGEgc3BlY2lmaWVkIFBFTQogIGZpbGUgdG8gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZSB3aGVuIGRvaW5nIEhUVFBTCiAgY29ubmVjdGlvbnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLCByYXRoZXIgcmVjZW50bHkgYnkgSHVsa2EgQm9odXNsYXYgYnV0CiAgb3RoZXJzIGhhdmUgYXNrZWQgZm9yIGl0IGJlZm9yZSBhcyB3ZWxsLgoKRGFuaWVsICgyMSBOb3ZlbWJlciAyMDAwKQotIE51bWVyb3VzIGZpeGVzIHRoZSB0ZXN0IHN1aXRlIGhhcyBicm91Z2h0IGludG8gdGhlIGRheWxpZ2h0OgoKICAgKiBjdXJsX3VuZXNjYXBlKCkgY291bGQgcmV0dXJuIGEgdG9vIGxvbmcgc3RyaW5nCiAgICogb24gZnRwIHRyYW5zZmVyIGZhaWx1cmVzLCB0aGVyZSBjb3VsZCBiZSBtZW1vcnkgbGVha3MKICAgKiBmdHAgQ1dEIGNvdWxkIHVzZSBiYWQgZGlyZWN0b3J5IG5hbWVzCiAgICogbWVtZGVidWcgbm93IHVzZXMgdGhlIG1wcmludGYoKSByb3V0aW5lcyBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5CiAgICogZnJlZShOVUxMKSByZW1vdmVkIHdoZW4gZG9pbmcgcmVzdW1lZCB0cmFuc2ZlcnMKCi0gQWRkZWQgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIGZvciBGVFAuCgotIEdlbmVyYWwgY2xlYW51cHMgdG8gbWFrZSBsZXNzIHdhcm5pbmdzIHdpdGggZ2NjIC1XYWxsIC1wZWRhbnRpYy4KCi0gSSBtYWRlIHRoZSB0ZXN0cy9mdHBzZXJ2ZXIucGwgd29yayB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnRwCiAgb3BlcmF0aW9ucy4gUE9SVCwgUEFTViwgUkVUUiwgU1RPUiwgTElTVCwgU0laRSwgVVNFUiwgUEFTUyBhbGwgd29yayBub3cuIE5vdwogIGFsbCBJIGhhdmUgdG8gZG8gaXMgaW50ZWdyYXRlIHRoZSBmdHAgc2VydmVyIGRvaW5ncyBpbiB0aGUgcnVudGVzdHMucGwKICBzY3JpcHQgc28gdGhhdCBmdHAgdGVzdHMgY2FuIGJlIHJ1biB0aGUgc2FtZSB3YXkgaHR0cCB0ZXN0cyBhbHJlYWR5IHJ1bi4KCkRhbmllbCAoMjAgTm92ZW1iZXIgMjAwMCkKLSBNYWRlIGxpYmN1cmwgY2FwYWJsZSBvZiBkZWFsaW5nIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaGUgZm9ybWVyIGxpbWl0IG9mCiAgNDA5NiBieXRlcyB3YXMgYSBiaXQgYW5ub3lpbmcgd2hlbiBwZW9wbGUgd2FudGVkIHRvIHVzZSBjdXJsIHRvIHJlYWxseSBtYWtlCiAgbGlmZSB0b3VnaCBvbiBhIHdlYiBzZXJ2ZXIuIE5vdywgdGhlIGNvbW1hbmQgbGluZSBsaW1pdCBpcyB0aGUgbW9zdCBhbm5veWluZwogIGJ1dCB0aGF0IGNhbiBiZSBjaXJjdW12ZW50ZWQgYnkgdXNpbmcgYSBjb25maWcgZmlsZS4KCiAgTk9URTogdGhlcmUgaXMgc3RpbGwgYSA0MDk2LWJ5dGUgbGltaXQgb24gVVJMcyBleHRyYWN0ZWQgZnJvbSBMb2NhdGlvbjoKICBoZWFkZXJzLgoKLSBDb3JyZWN0ZWQgdGhlIHNwZWxsaW5nIG9mICdyZXNvbHZlJyBpbiB0d28gZXJyb3IgbWVzc2FnZXMuCgotIEFsZXhhbmRlciBLb3VyYWtvcyBwb3N0ZWQgYSBidWcgcmVwb3J0IGFuZCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0ISBJdAogIHR1cm5lZCBvdXQgdGhhdCBseW54IGFuZCB3Z2V0IHN1cHBvcnQgbG93ZXJjYXNlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzCiAgd2hlcmUgY3VybCBvbmx5IGxvb2tlZCBmb3IgdGhlIHVwcGVyY2FzZSB2ZXJzaW9ucy4gTm93IGN1cmwgd2lsbCB1c2UgdGhlCiAgbG93ZXJjYXNlIHZlcnNpb25zIGlmIHRoZXkgZXhpc3QsIGJ1dCBpZiB0aGV5IGRvbid0LCBpdCdsbCB1c2UgdGhlIHVwcGVyY2FzZQogIHZlcnNpb25zLgoKRGFuaWVsICgxNyBOb3ZlbWJlciAyMDAwKQotIGN1cmxfZm9ybWZyZWUoKSB3YXMgYWRkZWQuIEhvdyBjb21lIG5vIG9uZSBtaXNzZWQgdGhhdCBvbmUgYmVmb3JlPyBJIHJhbiB0aGUKICB0ZXN0IHN1aXRlIHdpdGggdGhlIG1hbGxvYyBkZWJ1ZyBlbmFibGVkIGFuZCBnb3QgbG90cyBvZiAibmljZSIgd2FybmluZ3Mgb24KICBtZW1vcnkgbGVha3MuIFRoZSBtb3N0IHNlcmlvdXMgb25lIHdhcyB0aGlzLiBUaGVyZSB3ZXJlIGFsc28gbGVha3MgaW4gdGhlCiAgY29va2llIGhhbmRsaW5nLCBhbmQgYSBmZXcgZXJyb3JzIHdoZW4gY3VybCBmYWlsZWQgdG8gY29ubmVjdCBhbmQgc2ltaWxhcgogIHRoaW5ncy4gTW9yZSB0ZXN0cyBjYXNlcyB3ZXJlIGFkZGVkIHRvIGNvdmVyIHVwIGFuZCB0byB2ZXJpZnkgdGhhdCB0aGVzZQogIHByb2JsZW1zIGhhdmUgYmVlbiByZW1vdmVkLgoKLSBNdWNobyB1cGRhdGVkIGNvbmZpZyBmaWxlIHBhcnNlciAoSSdtIGRlYWQgdGlyZWQgb2YgYWxsIHRoZSBidWcgcmVwb3J0cyBhbmQKICB3ZWlyZCBiZWhhdmlvdXIgSSBnZXQgb24gdGhlIGZvcm1lciBvbmUpLiBJdCB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseSBub3csCiAgYWx0aG91Z2ggSSBkb3VidCBtYW55IHBlb3BsZSB3aWxsIG5vdGljZSB0aGUgZGlmZmVyZW5jZXMuIFRoZSBtYWluCiAgZGlmZmVyZW5jZSBiZWluZyB0aGF0IGlmIHlvdSB1c2Ugb3B0aW9ucyB0aGF0IHJlcXVpcmUgcGFyYW1ldGVycywgdGhleSBtdXN0CiAgYm90aCBiZSBzcGVjaWZpZWQgb24gdGhlIHNhbWUgbGluZS4gV2l0aCB0aGlzIG5ldyBwYXJzZXIsIHlvdSBjYW4gYWxzbwogIHNwZWNpZnkgbG9uZyBvcHRpb25zIHdpdGhvdXQgJy0tJyBhbmQgeW91IG1heSBzZXBhcmF0ZSBvcHRpb25zIGFuZAogIHBhcmFtZXRlcnMgd2l0aCA6IG9yID0uIEl0IG1ha2VzIGEgY29uZmlnIGZpbGUgbGluZSBjb3VsZCBsb29rIGxpa2U6CgogICAgICAgIHVzZXItYWdlbnQgPSAiZm9vYmFyIGFuZCBzb21ldGhpbmciCgogIFBhcmFtZXRlcnMgd2l0aGluIHF1b3RlcyBtYXkgY29udGFpbiBzcGFjZXMuIFdpdGhvdXQgcXVvdGVzLCB0aGV5J3JlCiAgZXhwZWN0ZWQgdG8gYmUgYSBzaW5nbGUgbm9uLXNwYWNlIHdvcmQuCgogIEhhZCB0byBwYXRjaCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNlciBhIGxpdHRsZSB0byBtYWtlIHRoaXMgd29yay4KCi0gQWRkZWQgLS11cmwgYXMgYW4gb3B0aW9uIHRvIGFsbG93IHRoZSBVUkwgdG8gYmUgc3BlY2lmaWVkIHRoaXMgd2F5LiBJdCBtYWtlcwogIHdheSBuaWNlciBjb25maWcgZmlsZXMuIFRoZSBwcmV2aW91cyB3YXkgb2Ygc3BlY2lmeWluZyBVUkxzIGluIHRoZSBjb25maWcKICBmaWxlIGRvZXNuJ3Qgd29yayBhbnltb3JlLgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDAwKQotIFVzaW5nIGNlcnRhaW4gY2hhcmFjdGVycyBpbiB1c2VybmFtZXMgb3IgcGFzc3dvcmRzIGZvciBIVFRQIGF1dGhlbnRpY2F0aW9uCiAgZmFpbGVkLiBUaGlzIHdhcyBkdWUgdG8gdGhlIG1wcmludGYoKSB0aGF0IGhhZCBhIHNpbGx5IGNoZWNrIGZvciBsZXR0ZXJzLAogIGFuZCBpZiB0aGV5IHdlcmVuJ3QgaXNwcmludCgpIHRoZXkgd2VyZW4ndCBvdXRwdXRlZCAiYXMtaXMiLiBUaGlzIGNhdXNlZAogIHBhc3N3b3JkcyBhbmQgdXNlcm5hbWVzIHVzaW5nICenJyAoZm9yIGV4YW1wbGUpIHRvIGZhaWwuCgpWZXJzaW9uIDcuNC4yCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gJ3Rlc3RzL3J1bnRlc3RzLnBsJyBub3cgc29ydHMgdGhlIHRlc3QgY2FzZXMgcHJvcGVybHkgd2hlbiAnYWxsJyBpcyB1c2VkLgoKRGFuaWVsICgxNCBOb3ZlbWJlciAyMDAwKQotIEkgZmVsbCBvdmVyIHRoZSBkcmFmdC1pZXRmLWZ0cGV4dC1tbHN0LTEyLnR4dCBJbnRlcm5ldCBEcmFmdCB0aXRsZWQKICAiRXh0ZW5zaW9ucyB0byBGVFAiIHRoYXQgY29udGFpbnMgYSBkZWZpbmVkIHdheSBob3cgdGhlIGZ0cCBjb21tYW5kIFNJWkUKICBjb3VsZCBiZSBhc3N1bWVkIHRvIHdvcmsuCgotIExhdXJlbnQgUGFwaWVyIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgdXNpbmcgIi1DIC0iIGFuZCBGVFAgdXBsb2FkaW5nIGEKICBmaWxlIHRoYXQgaXNuJ3QgcHJzZW50IG9uIHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgbWlnaHQgdGhlbiByZXR1cm4gYSA1NTAgYW5kCiAgY3VybCB3aWxsIGZhaWwuIFNob3VsZCBpdCBpbnN0ZWFkIGFzIExhdXJlbnQgUGFwaWVyIHN1Z2dlc3RzLCBzdGFydAogIHVwbG9hZGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgYXMgYSBub3JtYWwgdXBsb2FkPwoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDAwKQotIEZpeGVkIGEgY3Jhc2ggd2l0aCB0aGUgZm9sbG93bG9jYXRpb24gY291bnRlci4KCi0gV2hpbGUgd3JpdGluZyB0ZXN0IGNhc2VzIGZvciB0aGUgdGVzdCBzdWl0ZSwgSSBkaXNjb3ZlcmVkIGFuIG9sZCBsaW1pdGF0aW9uCiAgdGhhdCBwcmV2ZW50ZWQgLW8gYW5kIC1UIHRvIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZS4gSSByZW1vdmVkIHRoaXMKICBpbW1lZGlhdGVseSBhcyB0aGlzIGhhcyBubyByZWxldmFuY2UgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KICAKLSBDaHJpcyBGYWhlcnR5IGZpeGVkIGEgZnJlZS10d2ljZSBwcm9ibGVtIGluIGxpYi9maWxlLmMKCi0gSSBmaXhlZCB0aGUgcGVybCBodHRwIHNlcnZlciBwcm9ibGVtIGluIHRoZSB0ZXN0IHN1aXRlLgoKVmVyc2lvbiA3LjQuMiBwcmU0CgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDApCi0gSSd2ZSAoZmluYWxseSkgc3RhcnRlZCB3b3JraW5nIG9uIHRoZSBjdXJsIHRlc3Qgc3VpdGUuIEl0IGlzIGluIHRoZSBuZXcKICB0ZXN0cy8gZGlyZWN0b3J5LiBJdCByZXF1aXJlcyBzaCBhbmQgcGVybC4gVGhlcmUncyBhIFRDUCBzZXJ2ZXIgaW4gcGVybCBhbmQKICBtb3N0IG9mIHRoZSBvdGhlciBzdHVmZiBydW5uaW5nIGEgcHJldHR5IHNpbXBsZSBzaGVsbCBzY3JpcHQuCgogIEkndmUgb25seSBtYWRlIGZvdXIgdGVzdCBjYXNlcyBzbyBmYXIsIGJ1dCBpdCBwcm92ZXMgdGhlIHN5c3RlbSBjYW4gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgbm90aWNlZCB0aGF0IGN1cmwgZGlkbid0IHNldCBUWVBFIHdoZW4gZG9pbmcgLS1oZWFkIGNoZWNrcwogIGZvciBzaXplcyBvbiBGVFAgc2VydmVycy4gU29tZSBzZXJ2ZXJzIHNlZW0gdG8gcmV0dXJuIGRpZmZlcmVudCBzaXplcwogIGRlcGVuZGluZyBvbiB3aGV0aGVyIEFTQ0lJIG9yIEJJTkFSWSBpcyB1c2VkIQoKLSBMYXVyZW50IFBhcGllciBkZXRlY3RlZCB0aGF0IGlmIHlvdSBhcHBlbmRlZCBhIEZUUCB1cGxvYWQgYW5kIGV2ZXJ5dGhpbmcgd2FzCiAgYWxyZWFkeSB1cGxvYWRlZCwgY3VybCB3b3VsZCBoYW5nLgoKLSBBbmd1cyBNYWNrYXkncyBnZXRwYXNzX3IoKSBpbiBsaWIvZ2V0cGFzcy5jIGlzIG5vdyBjb21wbGlhbnQgd2l0aCB0aGUKICBnZXRwYXNzX3IoKSBmdW5jdGlvbiBpdCBzZWVtcyBzb21lIHN5c3RlbXMgYWN0dWFsbHkgaGF2ZS4KICAKLSBWZW5rYXRhcmFtYW5hIE1va2thcGF0aSBkZXRlY3RlZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlciBhbmQgY29ycmVjdGVkCiAgaXQuICBJZiB0aGUgY29va2llIHdhcyBzZXQgZm9yIHRoZSBmdWxsIGhvc3QgbmFtZSAoZG9tYWluPWZ1bGwuaG9zdC5jb20pLAogIHRoZSBjb29raWUgd2FzIG5ldmVyIHNlbnQgYmFjayBiZWNhdXNlIG9mIGEgZmF1bHR5IGxlbmd0aCBjb21wYXJpc29uIGJldHdlZW4KICB0aGUgc2V0IGRvbWFpbiBsZW5ndGggYW5kIHRoZSBjdXJyZW50IGhvc3QgbmFtZS4KCkRhbmllbCAoOSBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IChPUy8yIHNlZW1zIHRvIG5lZWQKICBpdCkuIEFkZGVkIGEgY2hlY2sgZm9yIFJTQWdsdWUvcnNhcmVmIGZvciB0aGUgY2FzZXMgd2hlcmUgbGliY3J5cHRvIGlzIGZvdW5kCiAgYnV0IGxpYnNzbCBpc24ndC4gSSBoYXZlbid0IHZlcmlmaWVkIHRoaXMgZml4IHlldCB0aG91Z2gsIGFzIEkgaGF2ZSBubwogIHN5c3RlbSB0aGF0IHJlcXVpcmVzIHRob3NlIGxpYnMgdG8gYnVpbGQuCiAgClZlcnNpb24gNy40LjIgcHJlMwoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDApCi0gUmVtb3ZlZCBwZXJyb3IoKSBvdXRwdXRzIGZyb20gZ2V0cGFzcy5jLiBBbmd1cyBNYWNrYXkgYWxzbyBhZ3JlZWQgdG8gYQogIHNsaWdodGx5IG1vZGlmaWVkIGxpY2Vuc2Ugb2YgdGhlIGdldHBhc3MuYyBmaWxlIGFzIHRoZSBwcm90b3R5cGUgd2FzIGNoYW5nZWQuCgpEYW5pZWwgKDYgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBwb3NzaWJpbGl0eSB0byBzZXQgYSBwYXNzd29yZCBjYWxsYmFjayB0byB1c2UgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4uCiAgVGhleSdyZSBjb250cm9sZWQgd2l0aCBjdXJsX2Vhc3lfc2V0b3B0KCkgb2YgY291cnNlLCB0aGUgdGFncyBhcmUKICBDVVJMT1BUX1BBU1NXREZVTkNUSU9OIGFuZCBDVVJMT1BUX1BBU1NXRERBVEEuCgotIFVzZWQgVC4gQmhhcmF0aCdzIHRoaW5raW5nIGFuZCBmaXhlZCB0aGUgdGltZXJzIHRoYXQgc2hvd2VkIHRlcnJpYmx5IHdyb25nCiAgdGltZXMgd2hlbiBsb2NhdGlvbjogaGVhZGVycyB3ZXJlIGZvbGxvd2VkLgoKLSBFbW1hbnVlbCBUeWNob24gZGlzY292ZXJlZCB0aGF0IGN1cmwgZGlkbid0IHJlYWxseSBsaWtlIHVzZXIgbmFtZXMgb25seSBpbgogIHRoZSBVUkwuIEkgY29ycmVjdGVkIHRoaXMgYW5kIEkgYWxzbyBmaXhlZCB0aGUgc2luY2UgbG9uZyBsaXZpbmcgcHJvYmxlbQogIHdpdGggVVJMIGVuY29kZWQgdXNlciBuYW1lcyBhbmQgcGFzc3dvcmRzIGluIHRoZSBVUkxzLiBUaGV5IHNob3VsZCB3b3JrIG5vdy4KICAKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDApCi0gV2hlbiBJIGFkZGVkIC0taW50ZXJmYWNlLCB0aGUgbmV3IGVycm9yIGNvZGUgdGhhdCB3YXMgYWRkZWQgd2l0aCBpdCB3YXMKICBpbnNlcnRlZCBpbiB0aGUgd3JvbmcgcGxhY2UgYW5kIHRodXMgYWxsIGVycm9yIGNvZGVzIGZyb20gMzUgYW5kIHVwd2FyZHMgZ290CiAgaW5jcmVhc2VkIG9uZSBzdGVwLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQsIHdlJ3JlIGJhY2sgYXQgdGhlIHByZXZpb3VzCiAgbnVtYmVycy4gQWxsIG5ldyBleGl0IGNvZGVzIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgZW5kLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjaGVjayBmb3Igc2lnbmFsKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc28gdGhhdCBpZiBzaWdhY3Rpb24oKQogIGlzbid0IHByZXNlbnQsIHdlIGNhbiB1c2Ugc2lnbmFsKCkgaW5zdGVhZC4KCi0gSSdtIGhhdmluZyBhIGxpY2Vuc2UgZGlzY3Vzc2lvbiBnb2luZyBvbiBwcml2YXRlbHkuIFRoZSBpc3N1ZSBpcyB5ZXQgYWdhaW4KICBHUEwtbGljZW5zZWQgcHJvZ3JhbXMgdGhhdCBoYXZlIHByb2JsZW1zIHdpdGggTVBMLiBJIGFtIGxlYW5pbmcgdG93YXJkcwogIG1ha2luZyBhIGtpbmQgb2YgZHVhbC1saWNlbnNlIHRoYXQgd2lsbCBzb2x2ZSB0aGlzIG9uY2UgYW5kIGZvciBhbGwuLi4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDAwKQotIEFkZGVkIHRoZSBwYWNrYWdlcy8gZGlyZWN0b3J5LiBJIGludGVuZCB0byBsZXQgdGhpcyBjb250YWluIHNvbWUgZG9jcyBhbmQKICB0ZW1wbGF0ZXMgb24gaG93IHRvIGdlbmVyYXRlIGN1c3RvbS1mb3JtYXQgcGFja2FnZXMgZm9yIHZhcmlvdXMgcGxhdGZvcm1zLgogIEkndmUgbm93IHJlbW92ZWQgdGhlIFJQTSByZWxhdGVkIGN1cmwuc3BlYyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHJvb3QuCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMCkKLSBULiBCaGFyYXRoIGJyb3VnaHQgYSBzZXQgb2YgcGF0Y2hlcyB0aGF0IGJyaW5nIG5ldyBmdW5jdGlvbmFsaXR5IHRvCiAgY3VybF9lYXN5X2dldGluZm8oKSBhbmQgY3VybF9lYXN5X3NldG9wdCgpLiBOb3cgeW91IGNhbiByZXF1ZXN0IHBlZXIKICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2l0aCB0aGUgKnNldG9wdCgpIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIgb3B0aW9uCiAgYW5kIHRoZW4gdXNlIHRoZSBDVVJMT1BUX0NBSU5GTyB0byBzZXQgdGhlIGNlcnRpZmljYXRlIHRvIHZlcmlmeSB0aGUgcmVtb3RlCiAgcGVlciBhZ2FpbnN0LiBBZnRlciBhbiBzdWNoIGFuIG9wZXJhdGlvbiB3aXRoIGEgdmVyaWZpY2F0aW9uIHJlcXVlc3QsIHRoZQogICpfZ2V0aW5mbygpIG9wdGlvbiBDVVJMSU5GT19TU0xfVkVSSUZZUkVTVUxUIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CiAgd2hldGhlciB0aGUgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCBvciBub3QuICAKCkRhbmllbCAoMjcgT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gYnJvdWdodCB1cyBhIHNwbGVuZGlkIHBhdGNoIHRoYXQgc29sdmVzIHRoZSBsb25nLXN0YW5kaW5nCiAgYW5ub3lpbmcgcHJvYmxlbSB3aXRoIHRpbWVvdXRzIHRoYXQgbWFkZSBjdXJsIGV4aXQgd2l0aCBzaWxseSBleGl0IGNvZGVzCiAgKHdoaWNoIGFzIGJlZW4gY29tbWVudGVkIG91dCBsYXRlbHkpLiBUaGlzIHNvbHV0aW9uIGlzIHNpZ2FjdGlvbigpIGJhc2VkIGFuZAogIG9mIGNvdXJzZSB0aGVuIG9ubHkgd29ya3MgZm9yIHVuaXhlcyAoYW5kIG9ubHkgdGhvc2UgdW5peGVzIHRoYXQgYWN0dWFsbHkKICBoYXZlIHRoZSBzaWdhY3Rpb24oKSBmdW5jdGlvbikuCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIGZsYXcgbWVudGlvbmVkIGJ5IEtldmluIFJvdGgKICB0aGF0IG1hZGUgdGhlIHBhc3N3b3JkIGdldCBlY2hvZWQgd2hlbiBwcm9tcHRlZCBmb3IgaW50ZXJhY3RpdmVseS4gVGhlCiAgZ2V0cGFzcygpIGZ1bmN0aW9uIChub3cga25vd24gYXMgbXlfZ2V0cGFzcygpKSB3YXMgYWxzbyBmaXhlZCB0byBub3QgdXNlIGFueQogIHN0YXRpYyBidWZmZXJzLiBUaGlzIGFsc28gbWVhbnMgd2UgY2Fubm90IHVzZSB0aGUgInN0YW5kYXJkIiBnZXRwYXNzKCkKICBmdW5jdGlvbiBldmVuIGZvciB0aG9zZSBzeXN0ZW1zIHRoYXQgaGF2ZSBpdCwgc2luY2UgaXQgaXNuJ3QgdGhyZWFkLXNhZmUuCiAgCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhhdCBpZiB5b3UnZCB3cml0ZSBhIGNvbmZpZyBmaWxlIHdpdGggJy12IHVybCcsIHRoZQogIHVybCB3b3VsZCBub3QgYmUgdXNlZCBhcyAiZGVmYXVsdCBVUkwiIGFzIGRvY3VtZW50ZWQsIGFsdGhvdWdoIGlmIHlvdSB3cm90ZQogIGl0ICd1cmwgLXYnIGl0IHdvcmtlZCEgVGhpcyBoYXMgYmVlbiBjb3JyZWN0ZWQgbm93LgoKLSBLZXZpbiBSb3RoJ3MgaWRlYSBvZiB1c2luZyBtdWx0aXBsZSAtZCBvcHRpb25zIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZSB3YXMKICBqdXN0IGJyaWxsaWFudCwgYW5kIEkgY291bGRuJ3QgcmVhbGx5IHRoaW5rIG9mIGFueSByZWFzb24gd2h5IHdlIHNob3VsZG4ndAogIHN1cHBvcnQgaXQhIFRoZSBhcHBlbmQgZnVuY3Rpb24gYWx3YXlzIGFwcGVuZCAnJicgYW5kIHRoZW4gdGhlIG5ldyAtZAogIGNodW5rLiBUaGlzIGVuYWJsZXMgY29uc3RydWN0cyBsaWtlIHRoZSBmb2xsb3dpbmc6CgogICAgICAgIGN1cmwgLWQgbmFtZT1kYW5pZWwgLWQgYWdlPXVua25vd24gZm9vYmFyc2l0ZS5jb20KCkRhbmllbCAoMjQgT2N0b2JlciAyMDAwKQotIEkgZml4ZWQgdGhlIGxpYi9tZW1kZWJ1Zy5jIHNvdXJjZSBzbyB0aGF0IGl0IGNvbXBpbGVzIG9uIExpbnV4IGFuZCBvdGhlcgogIHN5c3RlbXMuIEl0IHdpbGwgYmUgdXNlZnVsIG9uZSBkYXkgd2hlbiBzb21lb25lIGVsc2UgYnV0IG1lIHdhbnRzIHRvIHJ1biB0aGUKICBtZW1vcnkgZGVidWdnaW5nIHN5c3RlbS4KCkRhbmllbCAoMjMgT2N0b2JlciAyMDAwKQotIEkgbW9kaWZpZWQgdGhlIG1ha2V0Z3ogYW5kIGNvbmZpZ3VyZSBzY3JpcHRzLCBzbyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0CiAgd2lsbCBmZXRjaCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSB0aGUgaW5jbHVkZS9jdXJsL2N1cmwuaCBoZWFkZXIgZmlsZXMsIGFuZAogIHRoZW4gdGhlIG1ha2V0Z3ogZG9lc24ndCBoYXZlIHRvIHJlYnVpbGQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBJIGJ1aWxkCiAgcmVsZWFzZS1hcmNoaXZlcy4KCi0gQmr2cm4gU3RlbmJlcmcgYW5kIExpbnVzIE5pZWxzZW4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgc2lsbHkKICBlbm91Z2ggdG8gbm90IGFsbG93IEAtbGV0dGVycyBpbiBwYXNzd29yZHMgd2hlbiB0aGV5IHdlcmUgc3BlY2lmaWVkIHdpdGggdGhlCiAgLXUgb3IgLVUgZmxhZ3MgKENVUkxPUFRfVVNFUlBXRCBhbmQgQ1VSTE9QVF9QUk9YWVVTRVJQV0QpLiBUaGlzIGFsc28KICBzdWdnZXN0cyB0aGF0IGN1cmwgcHJvYmFibHkgc2hvdWxkIHVybC1kZWNvZGUgdGhlIHBhc3N3b3JkIHBpZWNlIG9mIGFuIFVSTAogIHNvIHRoYXQgeW91IGNvdWxkIHBhc3MgYW4gZW5jb2RlZCBALWxldHRlciB0aGVyZS4uLgogIApEYW5pZWwgKDIwIE9jdG9iZXIgMjAwMCkKLSBZZXQgYW5vdGhlciBodHRwIHNlcnZlciBiYXJmZWQgb24gY3VybCdzIHJlcXVlc3QgdGhhdCBpbmNsdWRlIHRoZSBwb3J0CiAgbnVtYmVyIGluIHRoZSBIb3N0OiBoZWFkZXIgYWx3YXlzLiBJIG5vdyBvbmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIGl0CiAgaXNuJ3QgdGhlIGRlZmF1bHQgKDgwIGZvciBIVFRQLCA0NDMgZm9yIEhUVFBTKS4gd3d3LnBlcmwuY29tIHR1cm5lZCBvdXQgdG8KICBydW4gb25lIG9mIHRob3NlIG5hc3R5IHNlcnZlcnMuCgotIFRoZSBQSFA0IG1vZHVsZSBmb3IgY3VybCBoYWQgcHJvYmxlbXMgd2l0aCByZWZlcmVyIHRoYXQgc2VlbXMgdG8gaGF2ZSBiZWVuCiAgY29ycmVjdGVkIGp1c3QgeWVzdGVyZGF5LiAoU3RlcmxpbmcgSHVnaGVzIG9mIHRoZSBQSFAgdGVhbSBjb25maXJtZWQgdGhpcykKCkRhbmllbCAoMTcgT2N0b2JlciAyMDAwKQotIFZsYWRpbWlyIE9ibG9tb3YgcmVwb3J0ZWQgdGhhdCB0aGUgLVkgYW5kIC15IG9wdGlvbnMgZGlkbid0IHdvcmsuIFRoZXkKICBkaWRuJ3Qgd29yayBmb3IgbWUgZWl0aGVyLiBUaGlzIG9uY2UgYWdhaW4gcHJvdmVzIHdlIHNob3VsZCBoYXZlIHRoYXQgdGVzdAogIHN1aXRlLi4uCiAgCi0gSSBmaW5hbGx5IGNoYW5nZWQgdGhlIGVycm9yIG1lc3NhZ2UgbGliY3VybCByZXR1cm5zIGlmIHlvdSB0cnkgYSBodHRwczovLwogIFVSTCB3aGVuIHRoZSBsaWJyYXJ5IHdhc24ndCBidWlsZCB3aXRoIFNTTCBlbmFibGVkLiBJdCB3aWxsIG5vdyByZXR1cm4gdGhpcwogIGVycm9yOgogICAgICAgICJsaWJjdXJsIHdhcyBidWlsdCB3aXRoIFNTTCBkaXNhYmxlZCwgaHR0cHM6IG5vdCBzdXBwb3J0ZWQhIgoKICBJIHJlYWxseSBob3BlIGl0IHdpbGwgbWFrZSBpdCBhIGJpdCBjbGVhcmVyIHRvIHVzZXJzIHdoZXJlIHRoZSBhY3R1YWwKICBwcm9ibGVtIGxpZXMuCgpWZXJzaW9uIDcuNC4xCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBJIGZvcmdvdCB0byByZW1vdmUgc29tZSBvZiB0aGUgbWFsbG9jIGRlYnVnIGRlZmluZXMgZnJvbSB0aGUgbWFrZWZpbGVzIGluCiAgdGhlIHJlbGVhc2UgYXJjaGl2ZSAob2YgY291cnNlKS4KClZlcnNpb24gNy40CgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMCkKLSBUaGUgYnVmZmVyIG92ZXJmbG93IG1lbnRpb25lZCBiZWxvdyB3YXMgcG9zdGVkIHRvIGJ1Z3RyYXEgb24gRnJpZGF5IDEzdGguCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwMCkKLSBDb2xpbiBSb2JlcnQgUGhpcHBzIGVsZWdhbnRseSBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cuIEl0IGNvdWxkIGJlIHVzZWQKICBieSBhbiBldmlsIGZ0cCBzZXJ2ZXIgdG8gY3Jhc2ggY3VybC4gSSB0b29rIHRoZSBvcHBvcnR1bml0eSBvZiByZXBsYWNpbmcgYQogIGZldyBvdGhlciBzcHJpbnRmKClzIGludG8gc25wcmludGYoKXMgYXMgd2VsbC4KCkRhbmllbCAoMTEgT2N0b2JlciAyMDAwKQotIEZvdW5kIHNvbWUgbW9yZSBtZW1vcnkgbGVha3MuIFRoaXMgbmV3IHNpbXBsZSBtZW1vcnkgZGVidWdnZXIgaGFzIHR1cm5lZCBvdXQKICByZWFsbHkgdXNlZnVsIQoKVmVyc2lvbiA3LjQgcHJlNgoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBGbG9yaWFuIEtvZW5pZyBwb2ludGVkIG91dCB0aGF0IHRoZSBib29sIHR5cGVkZWYgaW4gdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUKICBmaWxlIHdhcyBicmVha2luZyBQSFAgNC4wLjMgY29tcGlsaW5nLiBUaGUgYm9vbCB0eXBlZGVmIGlzIG5vdCB1c2VkIGluIHRoZQogIHB1YmxpYyBpbnRlcmZhY2UgYW5kIHdhcyB3cm9uZ2x5IGluc2VydGVkIGluIHRoYXQgaGVhZGVyIGZpbGUuCgotIEr2cmcgSGFydHJvdGggY29ycmVjdGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgaW4gdGhlIHNyYy91cmxnbG9iLmMgc3R1ZmYuIEl0CiAgZGlkbid0IGhhcm0gYW55b25lIHNpbmNlIHRoZSBtZW1vcnkgaXMgZnJlZSgpZWQgb24gZXhpdCBhbnl3YXkuCgotIENvcnJlY3RlZCB0aGUgc3JjL21haW4uYy4gV2UgdXNlIHRoZSBfTVBSSU5URl9SRVBMQUNFICNkZWZpbmUgdG8gdXNlIG91cgogIGxpYmN1cmwtcHJpbnRmKCkgZnVuY3Rpb25zLiBUaGlzIGdpdmVzIHVzIHNucHJpbnRmKCkgZXQgYWwgb24gYWxsCiAgcGxhdGZvcm1zLiBJIGNvbnZlcnRlZCB0aGUgYWxsb2NhdGVkIHVzZXJhZ2VudCBzdHJpbmcgdG8gb25lIHRoYXQgdXNlcyBhCiAgbG9jYWwgYnVmZmVyLgoKLSBJJ3ZlIHNldCBhbiAjaWYgMCBzZWN0aW9uIGFyb3VuZCB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIKICBnZW5lcmF0ZWQgaW4gbGliL2Zvcm1kYXRhLmMuIFRoaXMgd2lsbCBob3BlZnVsbHkgbWFrZSBjdXJsIGRvIG1vcmUKICBQSFAtZnJpZW5kbHkgbXVsdGktcGFydCBwb3N0cy4KClZlcnNpb24gNy40IHByZTUKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gTmljbyBCYWdndXMgZm91bmQgb3V0IHRoYXQgY3VybCdzIGFiaWxpdHkgdG8gZm9yY2UgYSBBU0NJSSBkb3dubG9hZCB3aGVuCiAgdXNpbmcgRlRQIHdhcyBubyBsb25nZXIgd29ya2luZyEgSSBjb3JyZWN0ZWQgdGhpcy4gVGhpcyBwcm9ibGVtIHdhcyBwcm9iYWJseQogIGludHJvZHVjZWQgd2hlbiBJIHJlZGVzaWduZWQgbGliY3VybCBmb3IgdmVyc2lvbiA3LgoKLSBHZW9yZyBIb3JuIHByb3ZpZGVkIGEgc291cmNlIGV4YW1wbGUgdGhhdCBwcm92ZWQgYSBtZW1vcnkgbGVhayBpbiBsaWJjdXJsLgogIEkgYWRkZWQgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dpbmcgZmFjaWxpdGllcyBhbmQgbm93IHdlIGNhbiBtYWtlIGxpYmN1cmwgbG9nCiAgYWxsIG1lbW9yeSBmaWRkbGluZyBmdW5jdGlvbnMuIEFuIGFkZGl0aW9uYWwgcGVybCBzY3JpcHQgaXMgdXNlZCB0byBhbmFseXplCiAgdGhlIG91dHB1dCBsb2dmaWxlIGFuZCB0byBtYXRjaCBtYWxsb2MoKXMgd2l0aCBmcmVlKClzIGV0Yy4gVGhlIG1lbW9yeSBsZWFrCiAgR2VvcmcgZm91bmQgdHVybmVkIG91dCB0byBiZSB0aGUgbWFpbiBjb29raWUgc3RydWN0IHRoYXQgY29va2llX2NsZWFudXAoKQogIGRpZG4ndCBmcmVlISBUaGUgcGVybCBzY3JpcHQgaXMgbmFtZWQgbWVtYW5hbHl6ZS5wbCBhbmQgaXQgaXMgYXZhaWxhYmxlIGluCiAgdGhlIENWUyByZXNwb3NpdG9yeSwgbm90IGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAwKQotIEdlb3JnIEhvcm4gZm91bmQgYSBHZXRIb3N0KCkgcHJvYmxlbS4gSXQgdHVybmVkIG91dCBpdCBuZXZlciBhc3NpZ25lZCB0aGUKICBwb2ludGVyIGluIHRoZSB0aGlyZCBhcmd1bWVudCBwcm9wZXJseSEgVGhpcyBjb3VsZCBtYWtlIGEgY3Jhc2gsIG9yIGF0IGJlc3QKICBhIG1lbW9yeSBsZWFrIQoKVmVyc2lvbiA3LjQgcHJlNAoKRGFuaWVsICg2IE9jdG9iZXIgMjAwMCkKLSBJcyB0aGUgLUYgcG9zdCBmb2xsb3dpbmcgdGhlIFJGQyAxODY3IHNwZWM/IFdlIGhhZCB0aGlzIGRpY3Vzc2lvbiBvbiB0aGUKICBtYWlsaW5nIGxpc3Qgc2luY2UgaXQgYXBwZWFycyBjdXJsIGNhbid0IHBvc3QgLUYgZm9ybSBwb3N0cyB0byBhIFBIUAogIHJlY2VpdmVyLi4uIEkndmUgYmVlbiBpbiB0b3VjaCB3aXRoIHRoZSBQSFAgZGV2ZWxvcGVycyBhYm91dCB0aGlzLgoKLSBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgdGhhdCB0aGUgbG9uZyBvcHRpb24gJy0tcHJveHknIHdhc24ndCB3b3JraW5nCiAgYW55bW9yZSEgVGhlIG9wdGlvbiBwYXJzZXIgZ290IGNvbmZ1c2VkIHdoZW4gSSBhZGRlZCB0aGUgLS1wcm94eXR1bm5lbCBmb3IKICA3LjMuIFRoaXMgd2FzIGluZGVlZCBhIHZlcnkgb2xkIGZsYXcgdGhhdCBoYXNuJ3QgdHVybmVkIHVwIHVudGlsIG5vdy4uLgoKLSBK9nJuIEhhcnRyb3RoIHByb3ZpZGVkIHBhdGNoZXMsIHVwZGF0ZWQgbWFrZWZpbGVzIGFuZCB0d28gbmV3IGZpbGVzIGZvciBETEwKICBzdHVmZiBvbiB3aW4zMi4gSGUgYWxzbyBwb2ludGVkIG91dCB0aGF0IGxpYiBzb3VyY2UgZmlsZXMgd2VyZSBjb21waWxlZCB3aXRoCiAgLUkuLi9zcmMgd2hpY2ggaXNuJ3Qgb25seSB3cm9uZyBidXQgcGxhaW4gc3R1cGlkIQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgYSBwcm9ibGVtIHdpdGggSFRUUCByZXN1bWUuIEN1cmwgcHJldmlvdXNseSB1c2VkCiAgYSBsb2NhbCB2YXJpYWJsZSBiYWRseSwgdGhhdCBjb3VsZCBsZWFkIHRvIGNyYXNoZXMuCgpWZXJzaW9uIDcuNCBwcmUzCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAwKQotIE1vcmUgZG9jcyB3cml0dGVuLiBUaGUgY3VybF9lYXN5X2dldGluZm8uMyBtYW4gcGFnZSBpcyBub3cgcHJldHR5IGFjY3VyYXRlLAogIGFzIGlzIHRoZSAtdyBzZWN0aW9uIGluIGN1cmwuMS4gSSBhZGRlZCB0d28gb3B0aW9ucyB0byBlbmFibGUgdGhlIHVzZXIgdG8KICBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2VpdmVkIGhlYWRlcnMnIHNpemUgYW5kIHRoZSBzaXplIG9mIHRoZSBIVFRQCiAgcmVxdWVzdC4gVC4gQmhhcmF0aCByZXF1ZXN0ZWQgdGhlbS4KICAKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBDb3JyZWN0ZWQgYSBzZXZlciBmcmVlKCkgYmVmb3JlIHVzZSBpbiB0aGUgbmV3IGFkZF9idWZmZXJfc2VuZCgpISA7LSkKClZlcnNpb24gNy40IHByZTIKCkRhbmllbCAoMyBPY3RvYmVyIDIwMDApCi0gSmFzb24gUy4gUHJpZWJlIHNlbnQgbWUgcGF0Y2hlcyB0aGF0IGNoYW5nZWQgdGhlIHdheSBjdXJsIGlzc3VlcyBIVFRQCiAgcmVxdWVzdHMuIFRoZSBlbnRpcmUgcmVxdWVzdCBpcyBub3cgaXNzdWVkIGluIG9uZSBzaW5nbGUgc2hvdC4gSXQgZGlkbid0IGRvCiAgdGhpcyBwcmV2aW91c2x5LCBhbmQgaXQgaGFzIHR1cm5lZCBvdXQgdGhhdCBzaW5jZSB0aGUgY29tbW9uIGJyb3dzZXJzIGRvIGl0CiAgdGhpcyB3YXksIHNvbWUgc2l0ZXMgaGF2ZSB0dXJuZWQgb3V0IHRvIHdvcmsgd2l0aCBicm93c2VycyBidXQgbm90IHdpdGgKICBjdXJsISBBbHRob3VnaCB0aGlzIGlzIG5vdCBhIGNsaWVudC1zaWRlIHByb2JsZW0sIHdlIHdhbnQgdG8gYmUgYWJsZSB0bwogIGZ1bGx5IGVtdWxhdGUgYnJvd3NlcnMsIGFuZCB0aHVzIHdlIGhhdmUgbm93IGFkanVzdGVkIHRoZSBuZXR3b3JraW5nIGxheWVyCiAgdG8gc2xpZ2h0bHkgbW9yZSBhcHBlYXIgYXMgYSBicm93c2VyLiBJIGFkanVzdGVkIEphc29uJ3MgcGF0Y2gsIHRoZSBmYXVsdHMKICBhcmUgcHJvYmFibHkgbWluZS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDApCi0gQW55b25lIHdobyBldmVyIHVwbG9hZGVkIGRhdGEgd2l0aCBjdXJsIG9uIGEgc2xvdyBsaW5rIGhhcyBub3RpY2VkIHRoYXQgdGhlCiAgcHJvZ2VzcyBtZXRlciBpcyB1cGRhdGVkIHZlcnkgaW5mcmVxdWVudGx5LiBUaGF0IGlzIGR1ZSB0byB0aGUgbGFyZ2UgYnVmZmVyCiAgc2l6ZSBjdXJsIGlzIHVzaW5nLiBJdCByZWFkcyA1MEtiIGFuZCBzZW5kcyBpdCwgdXBkYXRlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICBhbmQgbG9vcHMuIDUwS2IgaXMgdmVyeSBtdWNoIG9uIGEgc2xvdyBsaW5rLCBhbHRob3VnaCBpdCBpcyBwcmV0dHkgbmVhdCB0bwogIHVzZSBvbiBhIGZhc3Qgb25lLgoKICBJJ3ZlIG5vdyBtYWRlIGFuIGFkanVzdG1lbnQgdGhhdCBtYWtlcyBjdXJsIHVzZSBhIDJLYiBidWZmZXIgZm9yIHVwbG9hZHMgdG8KICBzdGFydCB3aXRoLiBJZiBjdXJsJ3MgYXZlcmFnZSB1cGxvYWQgc3BlZWQgaXMgZmFzdGVyIHRoYW4gYnVmZmVyIHNpemUgYnl0ZXMKICBwZXIgc2Vjb25kLCBjdXJsIHdpbGwgaW5jcmVhc2UgdGhlIHVzZWQgYnVmZmVyIHNpemUgdXAgdG8gbWF4IDUwS2IuIEl0CiAgc2hvdWxkIG1ha2UgdGhlIHByb2dyZXNzIG1ldGVyIHdvcmsgYmV0dGVyLgogIApWZXJzaW9uIDcuNCBwcmUxCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDAwKQotIFJpcHBlZCBvdXQgdGhlIC13IHN0dWZmIGZyb20gdGhlIGxpYnJhcnkgYW5kIHB1dCBpbiB0aGUgY3VybCB0b29sLiBJdCBnZXRzCiAgYWxsIHRoZSByZWxldmFudCBpbmZvIGZyb20gdGhlIGxpYnJhcnkgdXNpbmcgdGhlIG5ldyBjdXJsX2Vhc3lfZ2V0aW5mbygpCiAgZnVuY3Rpb24uCgotIGJyYWQgYXQgb3BlbmJzZC5vcmcgbWFpbGVkIG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgbXkga2VyYmVyb3MgbWlzdGFrZSBhbmQKICByZW1vdmVkIGEgY29tcGlsZXIgd2FybmluZyBmcm9tIGhvc3RpcC5jIHRoYXQgT3BlbkJTRCBwZW9wbGUgZ2V0LgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBPZiBjb3Vyc2UgKEkgc2hvdWxkIHByb2JhYmx5IGdldCBwdW5pc2hlZCBzb21laG93KSBJIGRpZG4ndCBwcm9wZXJseSBjb3JyZWN0CiAgdGhlICNpbmNsdWRlIGxpbmVzIGZvciB0aGUgYmFzZTY0IHN0dWZmIGluIHRoZSBrZXJiZXJvcyBzb3VyY2VzIGluIHRoZSBqdXN0CiAgcmVsZWFzZWQgNy4zIHBhY2thZ2UuIFRoZXkgc3RpbGwgaW5jbHVkZSB0aGUgKl9rcmIuaCBmaWxlcyEgTm93LCB0aGUgZXJyb3IKICBpcyBzb29vIHZlcnkgZWFzeSB0byBzcG90IGFuZCBmaXggc28gSSB3b24ndCBib3RoZXIgd2l0aCBhIHF1aWNrIGJ1ZyBmaXgKICByZWxlYXNlLiBJJ2xsIHBvc3QgYSBwYXRjaCB3aGVuZXZlciBvbmUgaXMgbmVlZGVkIGluc3RlYWQuIEl0J2xsIGJlCiAgYXZhaWxhYmxlIGluIHRoZSBDVlMgaW4gYSBmZXcgbWludXRlcyBhbnl3YXkuCgpWZXJzaW9uIDcuMwoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHRoZSBiYXNlNjRfa3JiLltjaF0gZmlsZXMuIFRoZXkndmUgbm93IHJlcGxhY2VkIHRoZSBmb3JtZXIKICBiYXNlNjQuW2NoXSBmaWxlcy4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBzb21lIGRvY3MuCgotIEkgY2hhbmdlZCB0aGUgT3BlblNTTCBmaXggdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIGFzIHdlbGwuIFRoZSBwb3N0ZWQKICBwYXRjaCB3YXMgb25seSB3b3JraW5nIHdpdGggMC45LjYgYW5kIG5vIG9sZGVyIG9uZXMuCiAgClZlcnNpb24gNy4zLXByZTgKCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDApCi0gRXJkbXV0IFBmZWlmZXIgaW5mb3JtZWQgdXMgdGhhdCBjdXJsIGRpZG4ndCBidWlsZCB3aXRoIE9wZW5TU0wgMC45LjYgYW5kCiAgc2hvd2VkIHVzIHdoYXQgbmVlZGVkIHRvIGdldCBwYXRjaGVkIGluIG9yZGVyIHRvIG1ha2UgaXQgYnVpbGQgcHJvcGVybHkKICBhZ2Fpbi4KCi0gRGlyayBLcnVzY2hld3NraSBmb3VuZCBhIGJ1ZyBpbiB0aGUgY29va2llIHBhcnNlci4gSSBtYWRlIGFuIGFsdGVybmF0aXZlCiAgYXBwcm9hY2ggdG8gdGhlIHNvbHV0aW9uIERpcmsgaGltc2VsZiBzdWdnZXN0ZWQuIFRoZSBidWcgbWFkZSBhIGNvb2tpZQogIGhlYWRlciB0aGF0IGRpZG4ndCBlbmQgd2l0aCBhIHRyYWlsaW5nIHNlbWljb2xvbiB0byBub3QgZ2V0IHBhcnNlZC4KCi0gSSd2ZSBtYXJrZWQgLWMgYW5kIC10IGRlcHJlY2F0ZWQgbm93LiBJZiB5b3UgdXNlIGFueSBvZiB0aGVtLCBjdXJsIHdpbGwgdGVsbAogIHlvdSB0byB1c2UgIi1DIC0iIG9yICItVCAtIiBpbnN0ZWFkLiBJIGRvbid0IHRoaW5rIG9jY3VweWluZyB0d28gbGV0dGVycyBmb3IKICBuZWFybHkgaWRlbnRpY2FsIGZ1bmN0aW9ucyBpcyBnb29kIHVzZS4gQWxzbywgLVQgLSBraW5kIG9mIGZvbGxvd3MgdGhlIGN1cmwKICB0cmFkaXRpb24gb2YgdXNpbmcgLSBmb3Igc3RkaW4gd2hlcmUgYSBmaWxlIG5hbWUgaXMgZXhwZWN0ZWQuCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgcHJvdmlkZWQgdGhlIHBhdGNoIHRoYXQgZmluYWxseSBtYWRlIHRoZSBrcmI0IGZ0cCB1cGxvYWQKICB3b3JrIQoKRGFuaWVsICgyMSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3MgY29kZSBpcyBub3QgcXVpdGUgdGhyZWFkLXNhZmUgeWV0LiBUaGVyZSBhcmUgYSBmZXcgbW9yZSBnbG9iYWxzCiAgdGhhdCBuZWVkIHRvIGJlIHRha2UgY2FyZSBvZi4gTGV0J3MgZ2V0IHRoZSB1cGxvYWQgd29ya2luZyBmaXJzdCEKCkRhbmllbCAoMjAgU2VwdGVtYmVyIDIwMDApCi0gUmljaGFyZCBQcmVzY290dCBzb2x2ZWQgYW5vdGhlciBuYW1lIGxvb2t1cCBidWZmZXIgc2l6ZSBwcm9ibGVtLiBJIHRvb2sgdGhpcwogIG9wcG9ydHVuaXR5IHRvIHJld3JpdGUgdGhlIEdldEhvc3QoKSBmdW5jdGlvbi4gV2l0aCB0aGVzZSBsYXJnZSBidWZmZXIKICBzaXplcywgSSB0aGluayBrZWVwaW5nIHRoZW0gYXMgbG9jYWwgYXJyYXlzIHF1aWNrbHkgdHVybiB1Z2x5LiBJIG5vdyB1c2UKICBtYWxsb2MoKSB0byBnZXQgdGhlIGJ1ZmZlciBtZW1vcnkuIFRoYW5rcyB0byB0aGlzLCBJIG5vdyBjYW4gcmVhbGxvYygpIHRvIGEKICBsYXJnZSBidWZmZXIgaW4gY2FzZSBvZiBkZW1hbmQgKGVycm5vID09IEVSQU5HRSkgaW4gY2FzZSBhIHNvbHV0aW9uIGxpa2UKICB0aGF0IHdvdWxkIGJlY29tZSBuZWNlc3NhcnkuIEkgc3RpbGwgd2FudCB0byBhdm9pZCB0aGF0IGtpbmQgb2YgbmFzdGluZXNzLgoKLSBUcmllZCB0byBjb21waWxlIGFuZCBydW4gY3VybCBvbiBMaW51eCBmb3IgYWxwaGEgYW5kIEZyZWVCU0QgZm9yIGFscGhhLiBXZW50CiAgYXMgc21vb3RoIGFzIGl0IGNvdWxkLgoKLSBBZGRlZCBhIGRvY3MvZXhhbXBsZXMgZGlyZWN0b3J5IHdpdGggdHdvIHRpbnkgZXhhbXBsZSBzb3VyY2VzIHRoYXQgc2hvdyBob3cKICB0byB1c2UgbGliY3VybC4gSSBob3BlIHVzZXJzIHdpbGwgc3VwcGx5IG1lIHdpdGggbW9yZSB1c2VmdWwgZXhhbXBsZXMKICBmdXJ0aGVyIG9uLgoKLSBBcHBsaWVkIGEgcGF0Y2ggYnkgSvZybiBIYXJ0cm90aCB0byBubyBsb25nZXIgdXNlIHRoZSB3b3JkICdpbnRlZmFjZScgaW4gdGhlCiAgY29uZmlnIHN0cnVjdCBpbiB0aGUgc3JjL21haW4uYyBmaWxlIHNpbmNlIGNlcnRhaW4gY29tcGlsZXJzIGhhdmUgdGhhdCB3b3JkCiAgInJlc2VydmVyZWQiLiAgSSBmaWd1cmUgdGhhdCBpcyBzb21lIGtpbmQgb2YgQysrIGRlY2Vhc2UuCgotIFVwZGF0ZWQgdGhlIGN1cmwuMSBtYW4gcGFnZSB3aXRoIC0taW50ZXJmYWNlIGFuZCAtLWtyYjQuCgotIE1vZGlmaWVkIHRoZSBiYXNlNjRFbmNvZGUoKSBmdW5jdGlvbiB0byB3b3JrIGxpa2UgdGhlIGtlcmJlcm9zIG9uZSwgc28gdGhhdAogIEkgY291bGQgcmVtb3ZlIHRoZSB1c2Ugb2YgdGhhdC4gVGhlcmUgaXMgbm8gbmVlZCBmb3IgKnR3byogYmFzZTY0IGVuY29kaW5nCiAgZnVuY3Rpb25zISA7LSkKClZlcnNpb24gNy4zcHJlNQoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwMCkKLSBUaGUga2VyYmVyb3M0LWxheWVyIHNvdXJjZSBjb2RlIHRoYXQgaXMgbXVjaCAiaW5mbHVlbmNlZCIgYnkgdGhlIG9yaWdpbmFsCiAga3JiNCBzb3VyY2UgY29kZSwgdGhyb3VnaCB5YWZjIGludG8gY3VybCwgd2FzIHVzaW5nIHF1aXRlIGEgbG90IG9mIGdsb2JhbAogIHZhcmlhYmxlcy4gbGliY3VybCBjYW4ndCB3b3JrIHByb3Blcmx5IHdpdGggZ2xvYmFscyBsaWtlIHRoYXQgd2h5IEkgaGFkIHRvCiAgY2xlYW4gdXAgYWxtb3N0IGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBuZXcgc2VjdXJpdHkuYyB0byBtYWtlIHRoZW0gdXNlCiAgY29ubmVjdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgZ2xvYmFscy4gSSBqdXN0IGhvcGUgSSBkaWRuJ3QKICBkZXN0cm95IGFueXRoaW5nIG5vdy4uLiA6LSkgY29uZmlndXJlIHVwZGF0ZWQsIHZlcnNpb24gc3RyaW5nIG5vdyByZWZsZWN0cwogIGtyYjQgYnVpbHQtaW4uIEl0IGFsbW9zdCB3b3JrcyBub3cuIE9ubHkgdXBsb2FkcyBhcmUgc3RpbGwgYmVpbmcgbmF1Z2h0eS4KClZlcnNpb24gNy4zcHJlMwoKRGFuaWVsICgxOCBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHN1cHBsaWVkIGEgbWFqb3IgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGtyYjQtZnRwIHN1cHBvcnQgdG8KICBjdXJsLiBNYXJ0aW4gaXMgdGhlIHByaW1hcnkgYXV0aG9yIG9mIHRoZSBmdHAgY2xpZW50IG5hbWVkIHlhZmMgYW5kIGhlIGRpZAogIG5vdCBoZXNpdGF0ZSB0byBoZWxwIHVzIGltcGxlbWVudCB0aGlzIHdoZW4gSSBhc2tlZCBoaW0uIE1hbnkgYW5kIHNpbmNlcmUKICB0aGFua3MgdG8gYSBzcGxlbmRpZCBlZmZvcnQuIEl0IGRpZG4ndCBldmVuIHRha2UgbWFueSBob3VycyEKCi0gU3RlcGhlbiBLaWNrIHN1cHBsaWVkIGEgYmlnIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgLS1pbnRlcmZhY2UgZmxhZyB0bwogIHRoZSBjdXJsIHRvb2wgYW5kIENVUkxPUFRfSU5URVJGQUNFIGZvciBsaWJjdXJsLiBJdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4KICBvdXRnb2luZyBpbnRlcmZhY2UgdG8gdXNlIGZvciB5b3VyIHJlcXVlc3QuIFRoaXMgbWF5IG5vdCB3b3JrIG9uIGFsbAogIHBsYXRmb3Jtcy4gVGhpcyBuZWVkcyB0ZXN0aW5nLgoKLSBSaWNoYXJkIFByZXNjb3R0IG5vdGljZWQgdGhhdCBjdXJsIG9uIFRydTY0IHVuaXggY291bGQgY29yZSBkdW1wZWQgaWYgdGhlCiAgbmFtZSBkaWRuJ3QgcmVzb2x2ZSBwcm9wZXJseS4gVGhpcyB3YXMgZHVlIHRvIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24gbm90CiAgcmV0dXJuaW5nIGFuIGVycm9yIGV2ZW4gdGhvdWdoIGl0IGZhaWxlZCBvbiBzb21lIHBsYXRmb3JtcyEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gVXBkYXRlZCBhbGwgc29ydHMgb2YgZG9jdW1lbnRzIGluIHJlZ2FyZHMgdG8gdGhlIG5ldyBwcm94eXR1bm5lbCBzdXBwb3J0LgoKVmVyc2lvbiA3LjNwcmUyCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIEthaS1Vd2UgUm9tbWVsIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgaHR0cHByb3h5dHVubmVsIHN0dWZmIGZvciBmdHAuCiAgQWRqdXN0ZWQgaXQuIEFkZGVkIGJldHRlciBpbmZvIG1lc3NhZ2Ugd2hlbiBzZXR0aW5nIHVwIHRoZSB0dW5uZWwgYW5kIHRoZQogIHBhc3YgbWVzc2FnZSB3aGVuIGRvaW5nIHRoZSBzZWNvbmQgY29ubmVjdC4KICAKVmVyc2lvbiA3LjNwcmUxCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIGxpYmN1cmwgbm93IGFsbG93cyAiaHR0cHByb3h5dHVubmVsIiB0byBhbiBhcmJpdHJhcnkgaG9zdCBhbmQgcG9ydCBuYW1lLiBUaGUKICBzZWNvbmQgY29ubmVjdGlvbiBvbiBmdHAgbmVlZGVkIHRoYXQuCgotIFRoZUFydE9mSFRUUFNjcmlwdGluZyB3YXMgY29ycmVjdGVkIGFsbCBvdmVyLiBJIGJvdGggdHlwZSBhbmQgc3BlbGwgcmVhbGx5CiAgYmFkIGF0IHRpbWVzIQogIApEYW5pZWwgKDE0IFNlcHRlbWJlciAyMDAwKQotIC1wLy0tcHJveHl0dW5uZWwgd2FzIGFkZGVkIHRvICdjdXJsJy4gSXQgdXNlcyB0aGUgbmV3CiAgQ1VSTE9QVF9IVFRQUFJPWFlUVU5ORUwgbGliY3VybCBvcHRpb24gdGhhdCBhbGxvd3MgImFueSIgcHJvdG9jb2wgdG8gdHVubmVsCiAgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGh0dHAgcHJveHkuIEF0IHRoZSBtb21lbnQsIHRoaXMgc2hvdWxkIHdvcmsgd2l0aCBmdHAuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAwKQotIEpvY2hlbiBTY2hhZXVibGUgZm91bmQgdGhhdCBmaWxlOi8vIGRpZG4ndCB3b3JrIGFzIGV4cGVjdGVkLiBDb3JyZWN0ZWQgdGhpcwogIGFuZCBtYWlsZWQgdGhlIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDApCi0gSSBjaGFuZ2VkIHRoZSAjZGVmaW5lIFQoKSBpbiBjdXJsLmggc2luY2UgaXQgdHVybmVkIG91dCBpdCB3YXNuJ3QgcmVhbGx5CiAgYSBnb29kIHN5bWJvbCB0byB1c2UgKHdoZW4geW91IGNvbXBpbGVkIFBIUCB3aXRoIGN1cmwgYXMgYSBtb2R1bGUsIHRoYXQKICBkZWZpbmUgY29sbGlkZWQgd2l0aCBzb21lIElNQVAgZGVmaW5lIG9yIHNvbWV0aGluZykuIFRoaXMgd2FzIHBvc3RlZCB0byB0aGUKICBQSFAgYnVnIHRyYWNrZXIuCgotIEkgYWRkZWQgZXh0ZXJuICJDIiBzdHVmZiBpbiB0d28gaGVhZGVyIGZpbGVzIHRvIGJldHRlciBhbGxvdyBsaWJjdXJsIHVzYWdlCiAgaW4gQysrIHNvcmNlcy4gRGlzY3Vzc2lvbnMgb24gdGhlIGxpYmN1cmwgbGlzdCB3aXRoIERhbm55IEhvcnN3ZWxsIGxlYWQgdG8KICB0aGlzLgoKVmVyc2lvbiA3LjIuMQoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0ICphZ2FpbiogYW5kIG5vdyBpdCBzZWVtcyB0bwogIGRldGVjdCBMaW51eCBuYW1lIHJlc29sdmluZyBwcm9wZXJseSEgKGhlYXJkIHRoYXQgYmVmb3JlPykKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIHBvaW50ZWQgb3V0IHRoYXQgZG93bmxvYWRpbmcgYSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgbGV0dGVyICcrJyBmcm9tIGFuIGZ0cCBzZXJ2ZXIgZGlkbid0IHdvcmsuIEl0IGRpZCB3b3JrIGZyb20gSFRUUCB0aG91Z2ggYW5kCiAgdGhlIHJlYXNvbiB3YXMgbXkgbGFtZSBVUkwgZGVjb2Rlci4KCi0gSSBoYXBwZW5lZCB0byBub3RpY2UgdGhhdCAtSSBkaWRuJ3QgYXQgYWxsIHdvcmsgb24gZnRwIGFueW1vcmUuIEkgY29ycmVjdGVkCiAgdGhhdC4KClZlcnNpb24gNy4yCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDAwKQotIFVuZGVyc3RhbmRpbmcgQUlYIGlzIGEgaGFyZCB0YXNrLiBJIGJlbGlldmUgSSdsbCBuZXZlciBmaWd1cmUgb3V0IHdoeSB0aGV5CiAgc29sdmUgdGhpbmdzIHNvIGRpZmZlcmVudGx5IGZyb20gdGhlIG90aGVyIHVuaXhlcy4gTm93LCBJJ20gbGVmdCB3aXRoIHRoZQogIEFJWCA0LjMgcnVuLXRpbWUgd2FybmluZ3MgYWJvdXQgZHVwbGljYXRlIHN5bWJvbHMgdGhhdCBhY2NvcmRpbmcgdG8gdGhpcwogIGFydGljbGUgKGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vYXJjaGl2ZXMvMy80MDUvMTk5OS85LzAvMjU5MzQyOC8pIGlzIGEKICBsaWJ0b29sIGZsYXcuIEkgdHJpZWQgdGhlIG1lbnRpb25lZCBwYXRjaCwgYWx0aG91Z2ggdGhhdCBzdG9wcyB0aGUgbGlua2luZwogIGNvbXBsZXRlbHkuCgogIFNvLCBpZiBJIHNlbGVjdCB0byBpZ25vcmUgdGhlIGxkIHdhcm5pbmdzIHRoZXJlIGFyZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CiAgZmlsbCB0aGUgc2NyZWVuIHByZXR0eSBiYWQgd2hlbiBjdXJsIGNvbXBpbGVzLiBJdCB0dXJucyBvdXQgdGhhdCBpZiBJIHdhbnQKICB0byAnI2luY2x1ZGUgPGFycGEvaW5ldC5oPicsIEkgY2FuIGdldCB0aWQgb2YgdGhlIHdhcm5pbmdzIGJ5IGluY2x1ZGUgdGhlCiAgZm9sbG93aW5nIHRocmVlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIHRoYXQgb25lOgoKICAgICAgICAjaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiAgICAgICAgI2luY2x1ZGUgPHN5cy9tYnVmLmg+CiAgICAgICAgI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KCiAgTm93LCBpcyBpdCByZWFsbHkgc2FuZSB0byBhZGQgdGhvc2UgaW5jbHVkZSBmaWxlcyBiZWZvcmUgYXJwYS9pbmV0LmggaW4gYWxsCiAgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IGluY2x1ZGUgaXQ/CgogIFRoYW5rcyB0byBBbGJlcnQgQ2hpbi1BLVlvdW5nIGF0IHRoZXdyaXR0ZW53b3JkLmNvbSB3aG8gZ2F2ZSBtZSB0aGUgQUlYCiAgbG9naW4gdG8gdHJ5IGV2ZXJ5dGhpbmcgb24uCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAwKQotIEphbiBTY2htaWR0IHN1cHBsaWVkIHVzIGEgbmV3IFZDNiBtYWtlZmlsZSBmb3IgV2luZG93cyBhcyB0aGUgcHJldmlvdXMgb25lCiAgd2FzIG5vdCB1cCB0byBkYXRlIGJ1dCBsYWNrZWQgc2V2ZXJhbCBvYmplY3QgZmlsZXMuCgotIE1vcmUgd29yayBvbiB0aGUgbmFtaW5nLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHByb3ZpZGVkIGEgY29uZmlndXJlLWNoZWNrIGZvciBsYXJnZSBmaWxlIHN1cHBvcnQsIGFzCiAgc29tZSBzeXN0ZW1zIHNlZW0gdG8gbmVlZCB0aGF0IGZvciB0aGVtIHRvIHdvcmsuIEhhZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uCiAgZm9yIHRoZSBjb25maWcuaCBpbmNsdWRlIGZpbGUgaW4gZXZlcnkgLmMgZmlsZSBpbiB0aGUgbGliY3VybCBkaXIuLi4KCi0gQXMgc3VnZ2VzdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgKGJ5IFRyb3kgRW5nZWwpLCBJIGRpZCB1c2UgYSAtLWRhdGEtYmluYXJ5CiAgb3B0aW9uIGluc3RlYWQgb2YgdGhlIG1lc3N5IHdheSBJJ3ZlIGxlZnQgZGVzY3JpYmVkIGJlbG93LiBJdCBzZWVtcyB0bwogIHdvcmsuIFRoZSBsaWJjdXJsIGZpeCByZW1haW5lZCB0aGUgc2FtZSBhcyB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAwKQotIEJhY2sgb24gdGhlIC1kIHN0cmlwcGluZyBuZXdsaW5lcyB0aGluZy4gVGhlICdwbGFpbiBwb3N0JyB0aGluZyB3YXMgYWRkZWQKICB3aGVuIEkgaGFkIG5vIHRob3VnaHQgb2YgdGhhdCBvbmUgY291bGQgYWN0dWFsbHkgcG9zdCBiaW5hcnkgZGF0YSB3aXRoCiAgaXQuIE5vdywgSSBoYXZlIHRvIGFkZCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBncmFjZWZ1bCBtYW5uZXIgYW5kIEkgdGhpbmsKICBJJ3ZlIG1hbmFnZWQgdG8gY29tZSB1cCB3aXRoIGEgd2F5OiAnLWQgQGZpbGU7YmluYXJ5JyB3aWxsIHRodXMgcG9zdCB0aGUKICBmaWxlIGJpbmFyeSwgZXhhY3RseSBhcyBpdHMgY29udGVudHMgYXJlLiBJdCBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgbmV3CiAgKnNldG9wdCgpIG9wdGlvbiAoQ1VSTE9QVF9QT1NURklFTERTSVpFKSB0byBzZXQgdGhlIHBvc3RmaWVsZCBzaXplLCBzaW5jZQogIGxpYmN1cmwgY2FuJ3Qgc3RybGVuKCkgdGhlIGRhdGEgaW4gdGhlc2UgY2FzZXMuCgotIEFsYmVydCBDaGluLUEtWW91bmcgbWFkZSBzb21lIHZlcnkgc2VyaW91cyBlZmZvcnRzIGFuZCBhbGwgdGhlIG5hbWUKICByZXNvbHZpbmcgcHJvYmxlbXMgc2VlbSB0byBoYXZlIGJlZW4gc29ydGVkIG91dCBub3cgb24gYWxsIHRoZSBwbGF0Zm9ybXMKICB0aGF0IHByZXZpb3VzbHkgc2hvd2VkIHRoZW0uIEknbGwgbWFrZSBhbm90aGVyIHJlbGVhc2Ugbm93IGFueWRheSBiZWNhdXNlIG9mCiAgdGhpcy4KCi0gVGhlIEZBUSB3YXMgbXVjaCBlbmhhbmNlZCB3aGVuIGl0IGNvbWVzIHRvIHRoZSBsaWNlbnNpbmcgaXNzdWVzIHRoYW5rcyB0bwogIEJqb3JuIFJlZXNlLgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBSaWNrIFdlbHlrb2NoeSBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB5b3UgdXNlIC1kIHRvIHBvc3QgYW5kIHlvdSB3YW50IHRvCiAga2VlcCB0aGUgbmV3bGluZXMsIGFzIGN1cmwgc3RyaXBzIHRoZW0gb2ZmIGFzIGEgYm9udXMgYmVmb3JlIHBvc3RpbmcuLi4KICBUaGlzIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KClZlcnNpb24gNy4xLjEKCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gR290IG1vcmUgcGVvcGxlIGludm9sdmVkIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBtZXNzLiBDYW9sYW4gTWNOYW1hcmEgc2VudAogIG1lIGNvbmZpZ3VyZS1jb2RlIHRoYXQgdHVybmVkIG91dCB0byBiZSB2ZXJ5IHNpbWlsYXIgdG8gbXkgZXhpc3RpbmcgdGVzdHMKICB3aGljaCBvbmx5IG1ha2UgbWUgbW9yZSBzdXJlIEknbSBvbiB0aGUgcmlnaHQgcGF0aC4gSSBjaGFuZ2VkIHRoZSBvcmRlciBvZgogIHRoZSB0ZXN0cyBzbGlnaHRseSwgYXMgaXQgc2VlbXMgdGhhdCBzb21lIGNvbXBpbGVycyBkb24ndCB5ZWxsIGVycm9yIGlmIGEKICBmdW5jdGlvbiBpcyB1c2VkIHdpdGggdG9vIG1hbnkgcGFyYW1ldGVycy4gVGh1cywgdGhlIGZpcnN0IHRlc3RlZCBmdW5jdGlvbgogIHdpbGwgc2VlbSBvay4uLiBMZXQncyBob3BlIG1vcmUgY29tcGlsZXJzIHRoaW5rIG9mIHRvby1mZXcgcGFyYW1ldGVycyBhcyBiYWQKICBtYW5uZXJzLCBhcyB3ZSdyZSBub3cgdHJ5aW5nIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCBvcmRlcjsgZmV3ZXIgZmlyc3QuIEkKICBzaG91bGQgYWxzbyBhZGQgdGhhdCBMYXJzIEhlY2tpbmcgbWFpbGVkIG1lIGFuZCB2b2x1bnRlZXJlZCB0byBydW4gdGVzdHMgb24KICBhIGZldyBvZGQgc3lzdGVtcy4gQ29hbGFuIGlzIGtlZXBpbmcgaGlzIHdvcmsgb3ZlciBhdAogIGh0dHA6Ly93d3cuY3NuLnVsLmllL35jYW9sYW4vcHVibGluay9nZXRob3N0YnluYW1lX3IvLiBNaWdodCBiZSBoYW5keSBpbiB0aGUKICBmdXR1cmUgYXMgd2VsbC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDApCi0gSSBub3RpY2VkIEkgaGFkbid0IGluY3JlYXNlZCB0aGUgbmFtZSBsb29rdXAgYnVmZmVyIGluIGxpYi9mdHAuYy4gSSBkb24ndAogIHRoaW5rIHRoaXMgaXMgdGhlIHJlYXNvbiBmb3IgdGhlIGNvbnRpbnVlZCB0cm91YmxlIHRob3VnaC4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDApCi0gRnJlZCBOb3ogY29ycmVjdGVkIG15IHN0dXBpZCBtaXN0YWtlcyBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgZmx1ZmYuIEl0CiAgc2hvdWxkIGFmZmVjdCBzb21lIEFJWCwgRGlnaXRhbCBVbml4IGFuZCBIUFVYIDEwIHN5c3RlbXMuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAwKQotIE1hdGhpZXUgTGVnYXJlIGNvbXBpbGVkIGFuZCBidWlsZCA3LjEgd2l0aG91dCBlcnJvcnMgb24gYm90aCBBSVggNC4yIGFzIHdlbGwKICBhcyBBSVggNC4zLiBOb3cgd2h5IGRpZCBwcm9ibGVtcyBvY2N1ciBiZWZvcmU/CgotIEZyZWQgTm96IHJlcG9ydGVkIGEgLXcvLS13cml0ZS1vdXQgYnVnIHRoYXQgY2F1c2VkIGl0IHRvIG1hbGZ1bmN0aW9uIHdoZW4KICB1c2VkIGNvbWJpbmVkIHdpdGggbXVsdGlwbGUgVVJMIHJldHJpZXZhbGVzLiBBbGwgYnV0IHRoZSBmaXJzdCBkaXNwbGF5IGdvdAogIHNjcmV3ZWQgdXAhCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDAwKQotIEphc29uIFByaWViZSBhbmQgYW4gYW5vbnltb3VzIGZyaWVuZCBmb3VuZCBzb21lIGhvc3QgbmFtZXMgdGhlIExpbnV4IHZlcnNpb24KICBvZiBjdXJsIGNvdWxkIG5vdCByZXNvbHZlLiBJdCB0dXJuZWQgb3V0IHRoZSBidWZmZXIgdXNlZCB0byByZXRyaWV2ZSB0aGF0CiAgaW5mb3JtYXRpb24gd2FzIHRvbyBzbWFsbC4gRml4ZWQuIE9uZSBjb3VsZCBhcmd1ZSBhYm91dCB0aGUgdXNlZnVsbmVzcyBvZgogIG5vdCBoYXZpbmcgdGhlIHNsaWdodGVzdCB0cmFjZSBvZiBhIG1hbiBwYWdlIGZvciBnZXRob3N0YnluYW1lX3IoKSBvbiBteQogIExpbnV4IFJlZGhhdCBpbnN0YWxsYXRpb24uLi4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDApCi0gQmFsYWppIFMgUmFvIHdhcyBmaXJzdCBpbiBsaW5lIHRvIG5vdGUgdGhlIG1pc3NpbmcgcG9zc2liaWxpdHkgdG8gcmVwbGFjZQogIHRoZSBDb250ZW50LVR5cGU6IGFuZCBDb250ZW50LUxlbmd0aDogaGVhZGVycyB3aGVuIGRvaW5nIC1kIHBvc3RzLiBJIGFkZGVkCiAgdGhlIHBvc3NpYmlsaXR5IGp1c3Qgbm93LiBJdCBzZWVtcyBzb21lIHBlb3BsZSB3YW50cyB0byBkbyBzdGFuZGFyZCBwb3N0cwogIHVzaW5nIGN1c3RvbSBDb250ZW50LVR5cGVzLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDAwKQotIE1pa2UgRG93ZWxsIGNvcnJlY3RseSBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWQgbm90IGFwcHJvdmUgb2YgVVJMcyB3aXRoIG5vCiAgdXNlciBuYW1lIGJ1dCBwYXNzd29yZC4gQXMgaW4gJ2h0dHA6Ly86Zm9vQGhheHguc2UnLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjEKCkRhbmllbCAoNyBBdWd1c3QgMjAwMCkKLSBNeSBBSVggNCBmaXggZG9lcyBub3Qgd29yay4gSSBuZWVkIGhlbHAgZnJvbSBhIEFJWCA0IGhhY2tlci4KCi0gSSBhZGRlZCBteSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LiBJdCBpcyBhaW1lZCB0byBiZWNvbWUgYSBzb3J0CiAgb2YgdHV0b3JpYWwgb24gaG93IHRvIGRvIEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoNCBBdWd1c3QgMjAwMCkKLSBXb3JraW5nIHdpdGggUmljaCBHcmF5IG9uIGNvbXBpbGluZyBjdXJsIGZvciBsb3RzIG9mIGRpZmZlcmVudCBwbGF0Zm9ybXMuCiAgTXkgZml4IGZvciBBSVggMy4yIHdhcyBub3QgZ29vZCBlbm91Z2ggYW5kIHdhcyBzbGlnaHRseSBjaGFuZ2VkLCBJIGhhZCB0bwogIG1vdmUgYW4gaW5jbHVkZSBmaWxlIGJlZm9yZSBhbm90aGVyLCBhcyBpcyBub3cgZGVzY3JpYmVkIGluIHRoZSBzb3VyY2UuCgogIEFJWCA0LjIgKDQuWD8pIGhhcyBkaWZmZXJlbnQgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpCiAgZnVuY3Rpb25zIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhbmQgdGh1cyB0aGUgY29tcGlsZQogIGJyb2tlIHdpdGggYW4gZXJyb3IuIEkgaGF2ZSBub3cgY2hhbmdlZCB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgY2hlY2sgaW4gdGhlCiAgY29uZmlndXJlIGZpbGUgdG8gc3VwcG9ydCBhbGwgdGhyZWUgdmVyc2lvbnMgb2YgYm90aCB0aGVzZSBmdW5jdGlvbnMuIE15CiAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHRoZSBBSVgtc3R5bGUgaXMgdGhvdWdoIG5vdCB5ZXQgdmVyaWZpZWQgYW5kIEkgbWF5CiAgZ2V0IHByb2JsZW1zIHRvIGZpeCBpdCBpZiBpdCB0dXJucyBvdXQgdG8gYnVnIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KICBhbnkgc3lzdGVtIHVzaW5nIHRoYXQuCgogIEZvciBwcm9ibGVtcyBsaWtlIHRoYXQsIEkgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbGxvdyAtLWRpc2FibGUtdGhyZWFkCiAgdG8gY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBjaGVjayBmb3IgdGhyZWFkc2FmZSB2ZXJzaW9ucyBvZiBhIGZldwogIGZ1bmN0aW9ucyBhbmQgdGh1cyBnbyB3aXRoIHRoZSAiZ29vZCBvbGQgdmVyc2lvbnMiIHRoYXQgdGVuZCB0byB3b3JrCiAgYWx0aG91Z2ggd2lsbCBicmVhayB0aHJlYWQtc2FmZW5lc3MgZm9yIGxpYmN1cmwuIE1vc3QgcGVvcGxlIHdvbid0IHVzZQogIGxpYmN1cmwgZm9yIG90aGVyIHRoaW5ncyB0aGFuIGN1cmwgdGhvdWdoLCBhbmQgY3VybCBkb2Vzbid0IG5lZWQgYQogIHRocmVhZC1zYWZlIGxpYi4KCi0gV29ya2luZyBvbiBteSBiaWcgdHV0b3JpYWwgYWJvdXQgSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIFJpY2ggR3JheSBzcG90dGVkIGEgcHJvYmxlbSBpbiBzcmMvc2V0dXAuaCBjYXVzZWQgYnkgYSAjZGVmaW5lIHN0cmVxdWFsKCkKICB0aGF0IHdhcyBqdXN0IGEgbGVmdC1vdmVyIGZyb20gcGFzc2VkIHRpbWVzLiBUaGUgc3RyZXF1YWwoKSBpcyBub3cgYSB0cnVlCiAgZnVuY3Rpb24gc3VwcGxpZWQgYnkgbGliY3VybCBmb3IgYSBwb3J0YWJsZSBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmlzb24uIEkgYWRkZWQgdGhlIHByb3RvdHlwZXMgaW4gaW5jbHVkZS9jdXJsLmggYW5kIHJlbW92ZWQgdGhlCiAgbm93IG9ic29sZXRlICNkZWZpbmUuCgotIElnb3IgS2hyaXN0b3Bob3JvdiBtYWRlIGEgZml4IHRvIGFsbG93IHJlc3VtZWQgZG93bmxvYWQgZnJvbSBTdW4ncwogIEphdmFXZWJTZXJ2ZXIvMS4xLjEuIEl0IHNlZW1zIHRoYXQgdGhlaXIgc2VydmVyIHNlbmRzIGJhZCBDb250ZW50LVJhbmdlCiAgaGVhZGVycy4KCi0gVGhlIG1ha2VmaWxlcyBmb3JjZWQgYSBzdGF0aWMgbGlicmFyeSBidWlsZCwgd2hpY2ggaXMgYmFkIHNpbmNlIHdlIG5vdyB1c2UKICBsaWJ0b29sIGFuZCB0aHVzIGhhdmUgZXhjZWxsZW50IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQhIEFsYmVydCBDaGluLUEtWW91bmcKICBmb3VuZCBvdXQuCgpWZXJzaW9uIDcuMC4xMWJldGEKCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgaW5zdGFsbCcgZGlkIG5vdCBwcm9wZXJseSBjcmVhdGUKICB0aGUgaGVhZGVyIGluY2x1ZGUgZGlyZWN0b3J5LCB3aHkgaXQgZmFpbGVkIHRvIGluc3RhbGwgdGhlIGhlYWRlciBmaWxlcyBhcwogIGl0IHNob3VsZC4gQXV0b21ha2UgaXNuJ3QgcmVhbGx5IGVxdWlwcGVkIHRvIGRlYWwgd2l0aCBzdWJkaXJlY3RvcmllcwogIHdpdGhvdXQgTWFrZWZpbGVzIGluIGFueSBuaWNlIHdheS4gSSBoYWQgdG8gcnVuIGFoZWFkIGFuZCBhZGQgTWFrZWZpbGVzIGluCiAgYm90aCBpbmNsdWRlIGFuZCBpbmNsdWRlL2N1cmwgYmVmb3JlIEkgbWFuYWdlZCB0byBjcmVhdGUgYSB0b3AtbGV2ZWwKICBtYWtlZmlsZSB0aGF0IHN1Y2NlZWRzIGluIGluc3RhbGwgZXZlcnl0aGluZyBwcm9wZXJseSEKCi0gT2ssIG5vIG1vcmUgImZlYXR1cmVzIiBhZGRlZCBub3cuIExldCdzIGp1c3QgdmVyaWZ5IHRoYXQgdGhlcmUncyBubyBtYWpvcgogIGZsYXdzIGFkZGVkIG5vdy4KCkRhbmllbCAoMzEgSnVseSAyMDAwKQotIEJvdGggSmVmZiBTY2hhc255IGFuZCBLZXRpbCBGcm95biBhc2tlZCBtZSBob3cgdG8gdGVsbCBjdXJsIG5vdCB0byBzZW5kIG9uZQogIG9mIHRob3NlIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlcnMuIFRoZXkgZGlkbid0IHNldHRsZSB3aXRoIHRoZSBibGFuawogIG9uZXMgeW91IGNvdWxkIHRlbGwgY3VybCB0byB1c2UuIEkgcmV3cm90ZSB0aGUgaGVhZGVyLXJlcGxhY2Ugc3R1ZmYgYQogIGxpdHRsZS4gTm93LCBpZiB5b3UgcmVwbGFjZSBhbiBpbnRlcm5hbCBoZWFkZXIgd2l0aCB5b3VyIG93biBhbmQgdGhhdCBuZXcKICBvbmUgaXMgYSBibGFuayBoZWFkZXIgeW91IHdpbGwgb25seSByZW1vdmUgdGhlIGludGVybmFsIG9uZSBhbmQgbm90IGdldCBhbnkKICBibGFuay4gSSBjb3VsZG4ndCBmaWd1cmUgb3V0IGFueSBjYXNlIHdoZW4geW91IHdhbnQgdGhhdCBibGFuayBoZWFkZXIuCgpEYW5pZWwgKDI5IEp1bHkgMjAwMCkKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgbGliIHVzZWQgbG9jYWx0aW1lKCkgd2hpY2ggaXMgbm90IHRocmVhZC1zYWZlLCBzbyBub3cKICBJIHVzZSBsb2NhbHRpbWVfcigpIGluIHRoZSBzeXN0ZW1zIHRoYXQgaGFzIGl0LgoKLSBJIHdlbnQgdGhyb3VnaCB0aGlzIGVudGlyZSBkb2N1bWVudCBhbmQgcmVtb3ZlZCBhbGwgZW1haWwgYWRkcmVzc2VzIGFuZCBsZWZ0CiAgbmFtZXMgb25seS4gSSd2ZSByZWFsbHkgbWFkZSBhbiBlZmZvcnQgdG8gYWx3YXlzIG5vdGUgd2hvIGJyb3VnaHQgYmUgYnVnCiAgcmVwb3J0cyBvciBmaXhlcywgYnV0IG1vcmUgYW5kIG1vcmUgcGVvcGxlIGFzayBtZSB0byByZW1vdmUgdGhlIGVtYWlsCiAgYWRkcmVzc2VzIHNpbmNlIHRoZXkgYmVjb21lIHZpY3RpbXMgZm9yIHNwYW1zIHRoaXMgd2F5LiBHb3Jkb24gQmVhdG9uIGdvdCBtZQogIHdvcmtpbmcgb24gdGhpcy4KCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIEr2cm4gSGFydHJvdGggZm91bmQgb3V0IHRoYXQgd2hlbiB5b3Ugc3BlY2lmaWVkIGEgSFRUUCBwcm94eSBpbiBhbgogIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB1c2VkIC1MLCBjdXJsIGZhaWxlZCBpbiB0aGUgc2Vjb25kIGZldGNoLiBJCiAgY29ycmVjdGVkIHRoaXMgcHJvYmxlbSBhbmQgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIGxpc3QuIE5vIG5lZWQgZm9yIGFuIGV4dHJhCiAgYmV0YSByZWxlYXNlIGp1c3QgZm9yIHRoaXMuCgpWZXJzaW9uIDcuMC4xMGJldGEKCkRhbmllbCAoMjcgSnVseSAyMDAwKQotIFNvLCBsaWJ0b29sIHJlcGxhY2VkIHR3byBvZiBteSBmaWxlcyB3aXRoIHN5bWJvbGljIGxpbmtzIGFuZCBJIGZvcmdvdCB0byBhZGQKICB0aGUgdHdvIG5ldyBsaWJ0b29sIGZpbGVzIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUgKGFuZCB0aGV5IHdlcmUgYWRkZWQgYXMKICBzeW1saW5rcyBhcyB3ZWxsISkgVGhpcyBvZiBjb3Vyc2UgbGVhZCB0byB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZhaWxlZAogIG9uIDcuMC45Li4uCgpWZXJzaW9uIDcuMC45YmV0YQoKRGFuaWVsICgyNSBKdWx5IDIwMDApCi0gS3Jpc3RpYW4gS/ZobnRvcHAgPGtyaXMgYXQga29laG50b3BwLmRlPiBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybAogIGxpYnRvb2xpZmllZCwganVzdCBhcyB3ZSd2ZSB3YW50ZWQgZm9yIGEgd2hpbGUgbm93LiBIZSBhbHNvIG1hZGUgdGhlCiAgcmVjZW50bHkgYWRkZWQgbWFuIHBhZ2VzIGdldCBpbnN0YWxsZWQgcHJvcGVybHkgb24gJ21ha2UgaW5zdGFsbCcgYW5kIHNvbWUKICBvdGhlciBuaWNlIGNsZWFudXBzLgoKLSBJbiBhIGRpc2N1c3Npb24gd2l0aCBFZXR1IE9qYW5lbiBpdCBzdHJ1Y2sgbWUgdGhhdCBpZiB3ZSB1c2UgY3VybCB0byBnZXQgYQogIHBhZ2UgdXNpbmcgYSBwYXNzd29yZCwgYW5kIHRoYXQgcGFnZSB0aGVuIHNlbmRzIGEgTG9jYXRpb246IHRvIGFub3RoZXIKICBzZXJ2ZXIgdGhhdCBjdXJsIGZvbGxvd3MsIGN1cmwgd2lsbCBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoYXQKICBzZXJ2ZXIgYXMgd2VsbC4KCiAgTm93LCBJJ2xsIG5ldmVyIGJlIGFibGUgdG8gbWFrZSBjdXJsIGRvIExvY2F0aW9uOiBmb2xsb3dpbmcgYWxsIHRoYXQgcGVyZmVjdAogIGFuZCB5b3UncmUgYWxsIHNvb25lciBvciBsYXRlciByZXF1aXJlZCB0byB3cml0ZSBhIHNjcmlwdCB0byBkbyBzZXZlcmFsCiAgZmV0Y2hlcyB3aGVuIHlvdSdyZSBkb2luZyBhZHZhbmNlZCBzdHVmZiwgYnV0IG5vdyBJJ3ZlIG1vZGlmaWVkIGN1cmwgdG8gYXQKICBsZWFzdCAqb25seSogc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgc2VydmVyLiBXaGljaAogIG1lYW5zIHRoYXQgaWYgZ2V0IGEgcGFnZSBmcm9tIHNlcnZlciBBIHdpdGggYSBwYXNzd29yZCwgdGhhdCBmb3J3YXJkcyBjdXJsCiAgdG8gc2VydmVyIEIsIGN1cmwgd29uJ3QgdXNlIHRoZSBwYXNzd29yZCB0aGVyZS4gSWYgc2VydmVyIEIgdGhlbiBmb3J3YXJkcwogIGN1cmwgYmFjayB0byBzZXJ2ZXIgQSBhZ2FpbiwgdGhlIHBhc3N3b3JkIHdpbGwgYmUgdXNlZCBhZ2Fpbi4KCiAgVGhpcyBpcyBub3QgYSBwZXJmZWN0IGltcGxlbWVudGF0aW9uLCBhcyBpbiBhIGJyb3dzZXIgY2FzZSBpdCB3b3VsZCBvbmx5IHVzZQogIHRoZSBwYXNzd29yZCBpZiB0aGUgbGVmdC1wcmVmaXggb2YgdGhlIGZpcnN0IHBhdGggaXMgdGhlIHNhbWUuIEkganVzdCB0aGluawogIHRoYXQgdGhpcyBmaXggcHJldmVudHMgYSBzb21ld2hhdCBsdXJreSAic2VjdXJpdHkgaG9sZSIuCgogIEFzIGEgc2lkZS1ub3RlIGluIHRoaXMgc3ViamVjdDogSFRUUCBwYXNzd29yZHMgYXJlIHNlbnQgaW4gY2xlYXJ0ZXh0IGFuZAogIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCB0byBiZSBzYWZlIG9yIHNlY3VyZS4gVXNlIEhUVFBTIGZvciB0aGF0LgoKLSBBcyBkaXNjdXNzZWQgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBjb252ZXJ0ZWQgdGhlIEZUUCByZXNwb25zZSByZWFkaW5nCiAgZnVuY3Rpb24gaW50byB1c2luZyBzZWxlY3QoKSB3aGljaCB0aGVuIGFsbG93cyB0aW1lb3V0cyAoZXZlbiB1bmRlciB3aW4zMiEpCiAgaWYgdGhlIGNvbW1hbmQtcmVwbHkgc2Vzc2lvbiBnZXRzIHRvbyBzbG93IG9yIGRpZXMgY29tcGxldGVseS4gSSBtYWRlIGEKICBkZWZhdWx0IHRpbWVvdXQgb24gMzYwMCBzZWNvbmRzIHVubGVzcyBhbnl0aGluZyBlbHNlIGlzIHNwZWNpZmllZCwgc2luY2UgSQogIGRvbid0IHRoaW5rIGFueW9uZSB3YW50cyB0byB3YWl0IG1vcmUgdGhhbiB0aGF0IGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8KICBnZXQgcmVjZWl2ZWQuLi4KCi0gVG9yc3RlbiBGb2VydHNjaCA8dG9yc3Rlbi5mb2VydHNjaCBhdCBnbXgubmV0PiBicm91Z2h0IGEgc2V0IG9mIGZpeGVzIGZvcgogIHRoZSByZmMxODY3IGZvcm0gcG9zdHMuIEhlIGludHJvZHVjZWQgJ25hbWU9PGZpbGUnIHdoaWNoIGJyaW5ncyBhIG1lYW5zIHRvCiAgc3V1cGx5IHZlcnkgbGFyZ2UgdGV4dCBjaHVua3MgcmVhZCBmcm9tIHRoZSBnaXZlbiBmaWxlIG5hbWUuIEl0IGRpZmZlcnMgZnJvbQogICduYW1lPUBmaWxlJyBpbiB0aGUgd2F5IHRoYXQgdGhpcyBsYXR0ZXIgdGhpbmcgaXMgbWFya2VkIGluIHRoZSB1cGxvYWRlZAogIGNvbnRlbnRzIGFzIGEgZmlsZSB1cGxvYWQsIHdoaWxlIHRoZSBmaXJzdCBpcyBqdXN0IHRleHQgKGFzIGluIGEgaW5wdXQgb3IKICB0ZXh0YXJlYSBmaWVsZCkuIFRvcnN0ZW4gYWxzbyBjb3JyZWN0ZWQgYSBidWcgdGhhdCB3b3VsZCBoYXBwZW4gaWYgeW91IHVzZWQKICAlcyBvciBzaW1pbGFyIGluIGEgLUYgZmlsZSBuYW1lLgoKLSBBcyBkaXNjb3ZlcmVkIGJ5IE5pY28gQmFnZ3VzIDxOaWNvLkJhZ2d1cyBhdCBtYWlsLmluZy5ubD4sIHdoZW4gdHJhbnNmZXJyaW5nCiAgZmlsZXMgdG8vZnJvbSBGVFAgdXNpbmcgdHlwZSBBU0NJSSBjdXJsIHNob3VsZCBub3QgZXhwZWN0IHRoZSB0cmFuc2ZlciB0byBiZQogIHRoZSBleGFjdCBzaXplIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIgYXMgdGhlIGZpbGUgc2l6ZS4gU2luY2UgQVNDSUkgbWF5IHZlcnkKICB3ZWxsIG1lYW4gdGhhdCB0aGUgY29udGVudCBpcyB0cmFuc2xhdGVkIHdoaWxlIHRyYW5zZmVyZWQsIHRoZSBmaW5hbCBzaXplCiAgbWF5IHZlcnkgd2VsbCBkaWZmZXIuIFRoZXJlZm9yLCBjdXJsIG5vdyBpZ25vcmVzIHRoZSBmaWxlIHNpemUgd2hlbiBkb2luZwogIEFTQ0lJIHRyYW5zZmVycyBpbiBGVFAuCgpEYW5pZWwgKDI0IEp1bHkgMjAwMCkKLSBBZGRlZCBDVVJMT1BUX1BST1hZUE9SVCB0byB0aGUgY3VybF9lYXN5X3NldG9wdCgpIGNhbGwgdG8gYWxsb3cgdGhlIHByb3h5CiAgcG9ydCBudW1iZXIgdG8gYmUgc2V0IHNlcGFyYXRlbHkgZnJvbSB0aGUgcHJveHkgaG9zdCBuYW1lLgoKLSBBbmRyZXcgPGFuZHJldyBhdCB1Z2gubmV0LmF1PiBwb2ludGVkIG91dCBhIG5ldHJjIG1hbnVhbCBidWcuCgotIFRoZSBGVFAgdHJhbnNmZXIgY29kZSBub3cgYWNjZXB0cyBhIDI1MC1jb2RlIGFzIHdlbGwgYXMgdGhlIHByZXZpb3VzbHkKICBhY2NlcHRlZCAyMjYsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxlIHRyYW5zZmVyLiBNb2hhbiA8bW5haXIgYXQKICBldmVyZ3JlZW4tZnVuZHMuY29tPiBwb2ludGVkIHRoaXMgb3V0LgoKLSBUaGUgY2hlY2sgZm9yICpib3RoKiBuc2wgYW5kIHNvY2tldCB3YXMgbmV2ZXIgYWRkZWQgaW4gdGhlIHY3IGNvbmZpZ3VyZS5pbgogIHdoZW4gSSBtb3ZlZCB0aGUgbWFpbiBicmFuY2guIEkgcmUtYWRkZWQgdGhhdCBjaGVjayB0byBjb25maWd1cmUuaW4uIFRoaXMgd2FzCiAgZGlzY292ZXJlZCBieSBSaWNoIEdyYXkuCgotIEhvd2FyZCwgQmxhaXNlIDxCbGFpc2UuSG93YXJkIGF0IGZhY3RpdmEuY29tPiBwb2ludGVkIG91dCBhIG1pc3NpbmcgZnJlZSgpIGluCiAgY3VybF9kaXNjb25uZWN0KCkgd2hpY2ggb2YgY291cnNlIG1lYW50IGxpYmN1cmwgYXRlIG1lbW9yeS4KCi0gQnJpYW4gRS4gR2FsbGV3IG5vdGVkIHRoYXQgdGhlIEhUVFAgJ0hvc3Q6JyBoZWFkZXIgY3VybCBzZW50IGRpZCBub3QKICBwcm9wZXJseSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBub24tZGVmYXVsdCBwb3J0cyB3ZXJlIHVzZWQuIFRoaXMgc2hvdWxkCiAgbm93IGhhdmUgYmVlbiBmaXhlZC4KCi0gSFRUUCBjb25uZWN0IGVycm9ycyBub3cgcmV0dXJuIGVycm9ycyBlYXJsaWVyLiBUaGlzIHdhcyBtb3N0IG5vdGFibHkgY2F1c2luZwogIHByb2JsZW1zIHdoZW4gdGhlIEhUVFBTIGNlcnRpZmljYXRlIGhhZCBwcm9ibGVtcyBhbmQgbGF0ZXIgY2F1c2VkIGEgY3Jhc2guCiAgTWFueSB0aGFua3MgdG8gR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGF0IGxldmVsOC5jb20+IGZvciBkaXNjb3ZlcmluZwogIGFuZCBzdWdnZXN0aW5nIGEgZml4Li4uCgpEYW5pZWwgKDIxIEp1bmUgMjAwMCkKLSBBZnRlciBhICJidWcgcmVwb3J0IiBJIHJlY2VpdmVkIHdoZXJlIHRoZSB1c2VyIHdhcyB1c2luZyBib3RoIC1GIGFuZCAtSSBpbiBhCiAgSFRUUCByZXF1ZXN0IChpdCBzZXZlcmx5IGNvbmZ1c2VkIHRoZSBsaWJyYXJ5IEkgc2hvdWxkIGFkZCksIEkgYWRkZWQgc29tZQogIGNoZWNrcyB0byBzcmMvbWFpbi5jIHRoYXQgcHJldmVudHMgc2V0dGluZyBtb3JlIHRoYW4gb25lIEhUVFAgcmVxdWVzdAogIGNvbW1hbmQsIG5vIG1hdHRlciB3aGF0IHRoZSB1c2VyIHdhbnRzISA7LSkKClZlcnNpb24gNy4wLjhiZXRhCgpEYW5pZWwgKDIwIEp1bmUgMjAwMCkKLSBJIGRpZCBhIG1ham9yIHJlcGxhY2UgaW4gbWFueSBmaWxlcyB0byB1c2UgdGhlIG5ldyBjdXJsIGRvbWFpbiBoYXh4LnNlCiAgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb25lLgoKLSBBcyBFZXR1IE9qYW5lbiBzdWdnZXN0ZWQsIEkgZmluYWxseSB0b29rIHRoZSBzdGVwIGFuZCBub3cgbGliY3VybCBubyBsb25nZXIKICBtYWtlcyBhIFBPU1QgYWZ0ZXIgaXQgaGFzIGZvbGxvd2VkIGEgbG9jYXRpb24uIFdoZW4gdGhlIGluaXRpYWwgUE9TVCBoYXMKICBiZWVuIGRvbmUsIGl0J2xsIHR1cm5lZCBpbnRvIGEgR0VUIGZvciB0aGUgZnVydGhlciByZXF1ZXN0cy4gVGhpcyBpcyBvbmx5CiAgaW50ZXJlc3Rpbmcgd2hlbiB1c2luZyAtTC8tLWxvY2F0aW9uICphbmQqIGRvaW5nIGEgUE9TVCBhdCB0aGUgc2FtZSB0aW1lLgoKICBXaGlsZSBtZXNzaW5nIHdpdGggdGhpcywgSSBhZGRlZCBhbm90aGVyIHdlaXJkIGZlYXR1cmUgSSBjYWxsICdhdXRvCiAgcmVmZXJlcicuIElmIHlvdSBhcHBlbmQgJzthdXRvJyB0byB0aGUgcmlnaHQgb2YgYSBnaXZlbiByZWZlcmVyIHN0cmluZyAob3IKICBvbmx5IHVzZSB0aGF0IHN0cmluZyBhcyByZWZlcmVyKSwgbGliY3VybCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZQogIHByZXZpb3VkIFVSTCBhcyByZWZlcmVkIHdoZW4gaXQgZm9sbG93cyBhIExvY2F0aW9uOiBhbmQgZ2V0cyBhIHN1Y2NlZWRpbmcKICBkb2N1bWVudC4KCi0gTXkgaGVybyBSaWNoIEdyYXkgZm91bmQgdGhlIHZlcnkgb2JzY3VyZSBGVFAgYnVnIHRoYXQgaGFwcGVuZWQgdG8gaGltIG9ubHkKICB3aGVuIHBhc3NpbmcgdGhyb3VnaCBhIHBhcnRpY3VsYXIgZmlyZXdhbGwgYW5kIHVzaW5nIHRoZSBQT1JUIGNvbW1hbmQuIEl0CiAgdHVybmVkIG91dCB0aGF0IFBPUlQgd2FzIHRoZSBvbmx5IGNvbW1hbmQgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgdGhhdAogIGRpZG4ndCBzZW5kIGEgcHJvcGVyIFxyXG4gc2VxdWVuY2UgYnV0IGluc3RlYWQgdXNlZCB0aGUgZmF1bHR5IFxuIHdoaWNoIGFzCiAgaXQgc2VlbWVkIGlzIHN1cHBvcnRlZCBieSBtb3N0IG1ham9yIGZ0cCBzZXJ2ZXJzLi4uIDotTwoKVmVyc2lvbiA3LjAuN2JldGEKCkRhbmllbCAoMTYgSnVuZSAyMDAwKQotIEkgaGFkIGF2b2lkZWQgdGhpcyBsb25nIGVub3VnaCBub3csIHNvIEkgbW92ZWQgdGhlIGFsdGVybmF0aXZlIHByb2dyZXNzIGJhcgogIHN0dWZmIGZyb20gdGhlIGxpYiBhbmQgYWRkZWQgaXQgdG8gdGhlIGNsaWVudCBjb2RlLiBUaGlzIGlzIG5vdyB1c2luZyB0aGUKICByZWNlbnRseSBhZGRlZCBwcm9ncmVzcyBjYWxsYmFjayBhbmQgaXQgc2VlbXMgdG8gd29yayBwcmV0dHkgbXVjaCBsaWtlCiAgYmVmb3JlLiBTaW5jZSBpdCBpcyBvbmx5IG9uZSBwcm9ncmVzcyBiYXIgYW5kIHlvdSBhbmQgZG93bmxvYWQgYW5kIHVwbG9hZCBhdAogIHRoZSBzYW1lIHRpbWUsIHRoaXMgYmFyIHNob3dzIHRoZSBjb21iaW5lZCBwcm9ncmVzcyBvZiBib3RoIGRpcmVjdGlvbnMuIFRoaXMKICBjb2RlIHdhcyBqdXN0IHBvcnRlZCBmcm9tIHRoZSBvbGQgcGxhY2UgdG8gdGhpcywgTGFycyBpcyBzdGlsbCBvdXIgc2F2aW91ciEKICA7LSkgVGhpcyBhbHNvIG1hZGUgdGhlIGRvY3VtZW50YXRpb24gbW9yZSBhY2N1cmF0ZSBzaW5jZSBJIG5ldmVyIHJlbW92ZWQKICB0aGlzIGZ1bmN0aW9uIGZyb20gYW55IGRvY3MhIEFsdGhvdWdoIEkgbm93IHJlbW92ZWQgdGhlIENVUkxPUFRfUFJPR1JFU1NNT0RFCiAgZnJvbSB0aGUgbGlicmFyeSBzaW5jZSB0aGUgbGliIGhhcyBvbmx5IG9uZSBpbnRlcm5hbCBwcm9ncmVzcyBtZXRlciBhbmQgaXQKICB3aWxsIG5ldmVyIGdldCBhbm90aGVyLiBJdCBpcyBhbHRob3VnaCBsaWtlbHkgdGhhdCB0aGUgaW50ZXJuYWwgb25lIGFsc28KICB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjbGllbnQgY29kZSBpbiB0aGUgZnV0dXJlICh3aGVuIEkgaGF2ZSBvdGhlciBtZWFucyBvZgogIGdldHRpbmcgdGhlIHdyaXRlb3V0IGRhdGEgYW5kIG1vdmUgdGhhdCB0b28gdG8gdGhlIGNsaWVudCkuCgotIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8gdmVyaWZ5IHRoYXQgc3RhbmRhcmQgcHJvZ3Jlc3MgbWV0ZXIgd29ya3MgYW5kIEkKICBmb3VuZCBvdXQgaXQgZGlkbid0IGdldCBpbml0ZWQgcHJvcGVybHkuIEdycnIuIEkgY29ycmVjdGVkIHRoYXQgYXMgd2VsbC4KCkRhbmllbCAoMTUgSnVuZSAyMDAwKQotIEkgdGhvdWdodCBJJ2QgYmV0dGVyIHZlcmlmeSB0aGF0IHRoZSAtRiBvcHRpb24gc3RpbGwgd29ya3MgaW4gdjcgYW5kIG9mCiAgY291cnNlIGl0IGRpZG4ndC4uLiA6LS8gQW55d2F5LCBJIGhhZCB0aGUgcHJvYmxlbXMgSSBjb3VsZCBkaXNjb3ZlcgogIGNvcnJlY3RlZC4gQWJvdXQgb25lIG1vbnRoIG9mIGJldGEgdGVzdGluZyBhbmQgbm90IGEgc2luZ2xlIHBlcnNvbiBoYXMgdXNlZAogIHRoaXMgZmVhdHVyZSB3aXRoIHY3PwoKLSBCavZybiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLS1wcm9ncmVzcy1iYXIgc3RpbGwgZG9lc24ndCB3b3JrIGluCiAgdjcuIEhtLgoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gVGltIFRhc3NvbmlzIGRpc2NvdmVyZWQgdGhhdCBjdXJsIDcgZGlkbid0IGhhbmRsZSBub3JtYWwgaHR0cCBQT1NUIGFzIGl0CiAgc2hvdWxkLiBJIGNvcnJlY3RlZCB0aGlzLgoKVmVyc2lvbiA3LjAuNmJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHBvaW50ZWQgb3V0IHNldmVyYWwgcHJvYmxlbXMgKHJlbGF0ZWQgdG8gd2luMzIgY29tcGlsaW5nKToKICBsaWIvc3RyZXF1YWwuYyBoYWQgYSBiYWQgI2lmZGVmIGZvciBvbmUgb2YgdGhlIHN0cmluZyBjb21wYXJpc29ucyAod2luMzIpCiAgc3JjL21haW4uYyBoYWQgc2V2ZXJhbCBtaW5vciBwcm9ibGVtcwogIGxpYi9tYWtlZmlsZS5tMzIgaGFkIGdldHBhc3MuW2NvXSB0d2ljZQogIHNyYy9jb25maWctd2luMzIuaCBsYWNrZWQgdGhlIEhBVkVfRkNOVExfSCBkZWZpbmUKICBib3RoIGNvbmZpZy13aW4zMi5oIGZpbGVzIG5vdyBvbmx5IHNldCB0aGUgSEFWRV9VTklTVERfSCBkZWZpbmUgaWYgdGhlCiAgZGVmaW5lIE1JTkdXMzIgaXMgc2V0LCBhbmQgSSBtb2RpZmllZCBzcmMvbWFrZWZpbGUubTMyIGFuZCBsaWIvbWFrZWZpbGUubTMyCiAgdG8gc2V0IGl0LgoKVmVyc2lvbiA3LjAuNWJldGEKCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIEFwcGxpZWQgTHVvbmcgRGluaCBEdW5nJ3MgY29tbWVudHMgYWJvdXQgYSBmZXcgd2luMzIgY29tcGlsZSBwcm9ibGVtcy4KCi0gQXBwbGllZCBCavZybiBTdGVuYmVyZydzIHN1Z2dlc3RlZCBmaXggdGhhdCB0dXJucyB0aGUgd2luMzIgc3Rkb3V0IHRvCiAgYmluYXJ5LiBJdCB3b24ndCBkbyBpdCBpZiB0aGUgLUIgLyAtLXVzZS1hc2NpaSBvcHRpb24gaXMgdXNlZC4gVGhhdCBvcHRpb24KICBpcyBub3cgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgLUIgLy0tZnRwLS1hc2NpaS4gVGhlIGZsYWcgd2FzCiAgYWxyZWFkeSBpbiB1c2UgYmUgdGhlIGxkYXAgYXMgd2VsbCBzbyB0aGUgbmV3IG5hbWUgZml0cyBwcmV0dHkgZ29vZC4gVGhlCiAgbGliY3lybCBDVVJMT1BUX1RSQU5TRkVSVEVYVCB3YXMgYWxzbyBpbnRyb2R1Y2VkIGFzIGFuIGFsaWFzIHRvIHRoZSBub3cKICBvYnNvbGV0ZSBDVVJMT1BUX0ZUUEFTQ0lJLiBDYW4ndCB2ZXJpZnkgdGhpcyBmaXggbXlzZWxmIGFzIEkgaGF2ZSBubyB3aW4zMgogIGNvbXBpbGVyIGFyb3VuZC4KCkRhbmllbCAoMTMgSnVuZSAyMDAwKQotIEx1b25nIERpbmggRHVuZyA8ZHVuZyBhdCBzY2guYm1lLmh1PiBmb3VuZCBhIHByb2JsZW0gaW4gY3VybF9lYXN5X2NsZWFudXAoKQogIHNpbmNlIGl0IGZyZWUoKWVkIHRoZSBtYWluIGN1cmwgc3RydWN0ICp0d2ljZSouIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCkRhbmllbCAoOSBKdW5lIDIwMDApCi0gVXBkYXRlZCB0aGUgUkVTT1VSQ0VTIGZpbGUsIGFkZGVkIGEgUkVBRE1FLndpbjMyIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDAwKQotIFNvIEkgZmluYWxseSBhZGRlZCB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgdG8gdGhlICpzZXRvcHQoKSBvcHRpb25zIGFuZCBpdAogIHNob3VsZCB3b3JrIG5vdy4gSSBkb24ndCBoYXZlIHRoZSBlbmVyZ3kgdG8gd3JpdGUgYW55IHRlc3QgcHJvZ3JhbSBmb3IgaXQKICByaWdodCBub3cuCi0gTWFkZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdHlwZWRlZnMgcHVibGljIGluIGN1cmwvY3VybC5oIGZvciBjb21mb3J0LiBKdXN0CiAgaW4gY2FzZSBhbnlvbmUgd2FubmEgZmlkZGxlIHdpdGggc3VjaCBwb2ludGVycy4KLSBVcGRhdGVkIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgbWFuIHBhZ2UgYWNjb3JkaW5nbHkuCgpWZXJzaW9uIDcuMC40YmV0YQoKRGFuaWVsICgyIEp1bmUgMjAwMCkKLSBJIG5vdGljZWQgdGhhdCB3aGVuIGRvaW5nIExvY2F0aW9uOiBmb2xsb3dpbmcsIHdlIGxvc3QgY3VzdG9tIGhlYWRlcnMgaW4gYWxsCiAgYnV0IHRoZSBmaXJzdCByZXF1ZXN0LgotIFJlbW92ZWQgdGhlICdIdHRwUG9zdCcgc3RydWN0IGFuZCBtb3ZlZCB0aGUgaGVhZGVyIHN0dWZmIHRvIHRoZSBtb3JlIGdlbmVyaWMKICBjdXJsX3NsaXN0LgotIEFkZGVkIHNvbWUgYmV0dGVyIHNsaXN0LWNsZWFudXBzIGluIHNyYy9tYWluLmMKClZlcnNpb24gNy4wLjNiZXRhCgpEYW5pZWwgKDMxIE1heSAyMDAwKQotIFNvIEkgZGlzY292ZXJlZCB0aGF0IEkgcmVsZWFzZWQgdGhlIDcuMC4yYmV0YSB3aXRob3V0IGl0IGJlaW5nIGFibGUgdG8KICBjb21waWxlIHVuZGVyIExpbnV4LiBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkgdHVybmVkIG91dCB0bwogIGZlYXR1cmUgYSBkaWZmZXJlbnQgYW1vdW50IG9mIGFyZ3VtZW50cyBvbiBkaWZmZXJlbnQgc3lzdGVtcyBzbyBJIGhhZCB0byBhZGQKICBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhpcyBhbmQgYWRqdXN0IHRoZSBjb2RlIHNsaWdodGx5LgoKVmVyc2lvbiA3LjAuMmJldGEKCkRhbmllbCAoMjkgTWF5IDIwMDApCi0gQ29ycmVjdGVkIHRoZSBiaXRzLiogYXNzaWdubWVudHMgd2hlbiB1c2luZyBDVVJMT1BUIG9wdGlvbnMgdGhhdCBvbmx5CiAgdG9nZ2xlcyBvbmUgb2YgdGhvc2UgYml0cy4KCi0gQXBwbGllZCB0aGUgaHVnZSBwYXRjaGVzIGZyb20gRGF2aWQgTGVCbGFuYyA8ZGxlYmxhbmMgYXQgcW54LmNvbT4gdGhhdCBhZGQKICB1c2FnZSBvZiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGluIGNhc2UgdGhleSdyZSBhcm91bmQsCiAgc2luY2UgdGhhdCBtYWtlIGxpYmN1cmwgbXVjaCBiZXR0ZXIgdGhyZWFkc2FmZSBpbiBtYW55IHN5c3RlbXMgKHN1Y2ggYXMKICBzb2xhcmlzKS4gSSBhZGRlZCB0aGUgY2hlY2tzIGZvciB0aGVzZSBmdW5jdGlvbnMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgogIEkgY2FuJ3QgZXhwbGFpbiB3aHksIGJ1dCB0aGUgaW5ldF9udG9hX3IoKSBmdW5jdGlvbiBkaWQgbm90IGFwcGVhciBpbiBteQogIFNvbGFyaXMgaW5jbHVkZSBmaWxlcywgSSBoYWQgdG8gYWRkIG15IG93biBpbmNsdWRlIGZpbGUgZm9yIHRoaXMgZm9yIG5vdy4KCkRhbmllbCAoMjIgTWF5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIGZpeGVzIHRvIG1ha2UgdGhlIHdpbjMyIHZlcnNpb24gY29tcGlsZSBwcm9wZXJseSBhcwogIHdlbGwgYXMgYSByZW5hbWUgb2YgdGhlICdpbnRlcmZhY2UnIGZpZWxkIGluIHRoZSB1cmxkYXRhIHN0cnVjdCwgYXMgaXQgc2VlbXMKICB0byBiZSByZXNlcnZlZCBpbiBzb21lIGdjYyB2ZXJzaW9ucyEKCi0gUmljaCBHcmF5IHN0cnVjayBiYWNrIHdpdGggeWV0IHNvbWUgcG9ydGFiaWxpdHkgcmVwb3J0cy4gRGF0YSBHZW5lcmFsIERHL1VYCiAgbmVlZGVkIGEgbGl0dGxlIGZpeCBpbiBsaWIvbGRhcC5jIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBSVExEX0dMT0JBTCBkZWZpbmVkLgogIE1vcmUgZml4ZXMgYXJlIGV4cGVjdGVkIGFzIGEgcmVzdWx0IG9mIFJpY2hpZXMgdmVyeSBoZWxwZnVsIHdvcmsuCgpWZXJzaW9uIDcuMC4xYmV0YQoKRGFuaWVsICgyMSBNYXkgMjAwMCkKLSBVcGRhdGVkIGxvdHMgb2YgI2RlZmluZXMsIGVudW1zIGFuZCB2YXJpYWJsZSB0eXBlIG5hbWVzIGluIHRoZSBsaWJyYXJ5LiBObwogIG1vcmUgd2VpcmQgVVJHIG9yIFVSTFRBRyBwcmVmaXhlcy4gQWxsIHR5cGVzIGFuZCBuYW1lcyBzaG91bGQgYmUgY3VybC0KICBwcmVmaXhlZCB0byBhdm9pZCBuYW1lIHNwYWNlIGNsYXNoZXMuIFRoZSBGTEFHUy1wYXJhbWV0ZXIgdG8gdGhlIGZvcm1lcgogIGN1cmxfdXJsZ2V0KCkgaGFzIGJlZW4gY29udmVydGVkIGludG8gYSBidW5jaCBvZiBmbGFncyB0byB1c2UgaW4gc2VwYXJhdGUKICBzZXRvcHQgY2FsbHMuIEknbSBzdGlsbCBmb2N1c2luZyBvbiB0aGUgZWFzeS1pbnRlcmZhY2UsIGFzIHRoZSBjdXJsIHRvb2wgaXMKICBub3cgdXNpbmcgdGhhdC4KCi0gQmpvcm4gUmVlc2UgaGFzIHByb3ZpZGVkIG1lIHdpdGggYW4gYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXIgdGhhdCBJIHBsYW4KICB0byB1c2UgaW4gdXBjb21pbmcgdmVyc2lvbnMgb2YgY3VybCB0byBiZSBhYmxlIHRvIGdyYWNlZnVsbHkgdGltZW91dCBuYW1lCiAgbG9va3Vwcy4KClZlcnNpb24gNy4wYmV0YQoKRGFuaWVsICgxOCBNYXkgMjAwMCkKLSBJbnRyb2R1Y2VkIExJQkNVUkxfVkVSU0lPTl9OVU0gdG8gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgdG8gYmV0dGVyIGFsbG93CiAgc291cmNlIGNvZGVzIHRvIGJlIGRlcGVuZGVudCBvbiB0aGUgbGliIHZlcnNpb24uIFRoaXMgZGVmaW5lIGlzIG5vdyBzZXQgdG8KICBhIGRleGFkZWNpbWFsIG51bWJlciwgd2l0aCA4IGJpdHMgZWFjaCBmb3IgbWFqb3IgbnVtYmVyLCBtaW5vciBudW1iZXIgYW5kCiAgcGF0Y2ggbnVtYmVyLiBJbiBvdGhlciB3b3JkcywgdmVyc2lvbiAxLjIuMyB3b3VsZCBtYWtlIGl0IDB4MDEwMjAzLiBJdCBhbHNvCiAgbWFrZXMgYSBsYXJnZXIgbnVtYmVyIGEgbmV3ZXIgdmVyc2lvbi4KCkRhbmllbCAoMTcgTWF5IDIwMDApCi0gTWFydGluIEthbW1lcmhvZmVyIGNvcnJlY3RseSBwb2ludGVkIG91dCBzZXZlcmFsIGZsYXdzIGluIHRoZSBGVFAgcmFuZ2UKICBvcHRpb24uIEkgY29ycmVjdGVkIHRoZW0uCi0gUmVtb3ZlZCB0aGUgd2luMzIgd2luc29jayBpbml0IGNyYXAgZnJvbSB0aGUgbGliIHRvIHRoZSBzcmMvbWFpbi5jIGZpbGUKICBpbiB0aGUgYXBwbGljYXRpb24gaW5zdGVhZC4gVGhleSBjYW4ndCBiZSBpbiB0aGUgbGliLCBlc3BlY2lhbGx5IG5vdCBmb3IKICBtdWx0aXRocmVhZGVkIHB1cnBvc2VzLgoKRGFuaWVsICgxNiBNYXkgMjAwMCkKLSBSZXdyb3RlIHRoZSBzcmMvbWFpbi5jIHNvdXJjZSB0byB1c2UgdGhlIG5ldyBlYXN5LWludGVyZmFjZSB0byBsaWJjdXJsIDcuCiAgVGhlcmUgaXMgc3RpbGwgbW9yZSB3b3JrIHRvIGRvLCBidXQgdGhlIGZpcnN0IHN0ZXAgaXMgbm93IHRha2VuLgogIDxjdXJsL2Vhc3kuaD4gaXMgdGhlIGluY2x1ZGUgZmlsZSB0byB1c2UuCgpEYW5pZWwgKDE0IE1heSAyMDAwKQotIEZUUCBVUkxzIGFyZSBub3cgdHJlYXRlZCBzbGlnaHRseSBkaWZmZXJlbnQsIG1vcmUgYWNjb3JkaW5nIHRvIFJGQyAxNzM4LgotIEZUUCBzZXNzaW9ucyBhcmUgbm93IHBlcmZvcm1lZCBkaWZmZXJlbnRseSwgd2l0aCBDV0QgY29tbWFuZHMgdG8gY2hhbmdlCiAgZGlyZWN0b3J5IGluc3RlYWQgb2YgUkVUUi9TVE9SL0xJU1Qgd2l0aCB0aGUgZnVsbCBwYXRoLiBEaXNjdXNzaW9ucyB3aXRoCiAgUmljaCBHcmF5IG1hZGUgbWUgbm90aWNlIHRoZXNlIHByb2JsZW1zLgotIEphbm5lIEpvaGFuc3NvbiBkaXNjb3ZlcmVkIGFuZCBjb3JyZWN0ZWQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlCiAgc3JjL3Vzcmdsb2IuYyBmaWxlLgotIEkgaGFkIHRvIGFkZCBhIGxpYi9zdHJlcXVhbC5jIGZpbGUgZm9yIGRvaW5nIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyZXMgb24gYWxsIHBsYXRmb3Jtcy4KCkRhbmllbCAoOCBNYXkgMjAwMCk6Ci0gQmVlbiB3b3JraW5nIGxvdHMgb24gdGhlIG5ldyBsaWIuCi0gVG9nZXRoZXIgd2l0aCBSaWNoIEdyYXksIEkndmUgdHJpZWQgdG8gYWRqdXN0IHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsKICBiZXR0ZXIgb24gdGhlIE5DUiBNUC1SQVMgVW5peC4KCkRhbmllbCAoMiBNYXkgMjAwMCk6Ci0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0IEkgaGFkIGEgZmV3IHRvbyBtYW55IGluc3RydWN0aW9ucyBpbgogIGNvbmZpZ3VyZS5pbiB0aGF0IGRpZG4ndCBkbyBhbnkgZ29vZC4KCkRhbmllbCAoMjQgQXByaWwgMjAwMCk6Ci0gQWRkZWQgYSBuZXcgcGFyYWdyYXBoIHRvIHRoZSBGQVEgYWJvdXQgd2hhdCB0byBkbyB3aGVuIGNvbmZpZ3VyZSBjYW4ndAogIGZpbmQgT3BlblNTTCBldmVuIHRob3VnaCBpdCBpcyBpbnN0YWxsZWQuIFN1cHBsaWVkIGJ5IEJvYiBBbGxpc29uCgpEYW5pZWwgKDEyIEFwcmlsIDIwMDApOgotIFN0YXJ0ZWQgbWVzc2luZyBhcm91bmQgYmlnLXRpbWUgdG8gY29udmVydCB0aGUgb2xkIGxpYnJhcnkgaW50ZXJmYWNlIHRvIGEKICBiZXR0ZXIgb25lLi4uCgpEYW5pZWwgKDggQXByaWwgMjAwMCk6Ci0gTWFkZSB0aGUgcHJvZ3Jlc3MgYmFyIGxvb2sgYmV0dGVyIGZvciBmaWxlIHNpemVzIGJldHdlZW4gOTk5OSBraWxvYnl0ZXMKICBhbmQgMTAwIG1lZ2FieXRlcy4gVGhleSdyZSBub3cgZGlzcGxheWVkIFhYLlhNLgotIEkgYWxzbyBub3RpY2VkIHRoYXQgZnRwIGZldGNoZXMgdGhyb3VnaCBIVFRQIHByb3hpZXMgZGlkbid0IGFkZCB0aGUgdXNlcgogIGFnZW50IHN0cmluZy4gSXQgZG9lcyBub3cuCi0gSGFiaWJpZSA8aGFiaWJpZSBhdCBNYWlsYW5kTmV3cy5jb20+IHN1cHBsaWVkIGEgcHJldHR5IGdvb2Qgd2F5IHRvIGJ1aWxkIFJQTXMKICBvbiBhIExpbnV4IG1hY2hpbmUuIEl0IHN0aWxsIGEpIHJlcXVpcmVzIG1lIHRvIGJlIHJvb3QgdG8gZG8gaXQsIGIpIGxlYXZlcwogIHRoZSBycG0gcGFja2FnZXMgbGF5aW5nIGF0IHNvbWUgb2RkIHBsYWNlIG9uIG15IGRpc2sgYykgZG9lc24ndCB3b3JrIHRvCiAgYnVpbGQgdGhlIHNzbCB2ZXJzaW9uIG9mIGN1cmwgc2luY2UgSSBkaWRuJ3QgaW5zdGFsbCBvcGVuc3NsIGZyb20gYW4gcnBtCiAgcGFja2FnZSBzbyBub3cgdGhlIHJwbSBjcmFwIHRoaW5rcyBJIGRvbid0IGhhdmUgb3BlbnNzbCBhbmQgcmVmdXNlcyB0byBidWlsZAogIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gc3NsLi4uIERpZCBJIG1lbnRpb24gSSBkb24ndCBnZXQgYWxvbmcgd2l0aCBSUE0/Ci0gT25jZSBhZ2FpbiBJIHJlY2VpdmVkIGEgYnVnIHJlcG9ydCBhYm91dCBhdXRvY29uZiBub3Qgc2V0dGluZyAtTCBwcmlvciB0byAtbAogIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hlbiBjaGVja2luZyBmb3IgbGlicy4gSW4gdGhpcyBjYXNlIGl0IG1hZGUgdGhlIG5hdGl2ZQogIGNjIGNvbXBpbGVyIG9uIFNvbGFyaXMgNyB0byBmYWlsIHRoZSBPcGVuU1NMIGNoZWNrLiBUaGlzIGhhcyBwcmV2aW91c2x5IGJlZW4KICByZXBvcnRlZCB0byBjYXVzZSBwcm9ibGVtcyBvbiBIUC1VWCBhbmQgaXMgYSBrbm93biBmbGF3IGluIGF1dG9jb25mIDIuMTMuIEl0CiAgaXMgYSBwaXR5IHRoZXJlJ3Mgbm8gbmV3ZXIgcmVsZWFzZSBhcm91bmQuLi4KCkRhbmllbCAoNCBBcHJpbCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIHR3byBmaXhlcyB0aGF0CiAgYXBwZWFyYW50bHkgbWFrZXMgdGhlIE9TLzIgcG9ydCB3b3JrIGJldHRlciB3aXRoIG11bHRpcGxlIFVSTHMuCgpEYW5pZWwgKDIgQXByaWwgMjAwMCk6Ci0gQW5vdGhlciBMb2NhdGlvbjogZml4LiBUaGlzIHRpbWUsIHdoZW4gY3VybCBjb25uZWN0ZWQgdG8gYSBwb3J0IGFuZCB0aGVuCiAgZm9sbG93ZWQgYSBsb2NhdGlvbiB3aXRoIGFuIGFic29sdXRlIFVSTCB0byBhbm90aGVyIHBvcnQsIGl0IG1pc2JlaGF2ZWQuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDApOgotIEguIERhcGhuZSBMdW9uZyBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHdyb25nbHkKICBtZXNzaW5nIHVwIHRoZSBwcm94eSBzdHJpbmcgd2hlbiBmZXRjaGluZyBhIGRvY3VtZW50IHRocm91Z2ggYSBodHRwIHByb3h5LAogIHdoaWNoIHNjcmV3ZWQgdXAgbXVsdGlwbGUgZmV0Y2hlcyBzdWNoIGFzIGluIGxvY2F0aW9uOiBmb2xsb3dpbmdzLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBjb3JyZWN0ZWQgbXkgYmFkbHkgYXBwbGllZCBwYXRjaCBoZQogIGFjdHVhbGx5IGFscmVhZHkgdG9sZCBtZSBhYm91dCEKCi0gSC4gRGFwaG5lIEx1b25nIGJyb3VnaHQgbWUgYSBmaXggdGhhdCBub3cgbWFrZXMgY3VybAogIGlnbm9yZSBzZWxlY3QoKSBlcnJvcnMgaW4gdGhlIGRvd25sb2FkIGlmIGVycm5vIGlzIEVJTlRSLCB3aGljaCB0dXJucyBvdXQgdG8KICBoYXBwZW4gZXZlcnkgbm93IGFuZCB0aGVuIHdoZW4gdXNpbmcgbGliY3VybCBtdWx0aS10aHJlYWRlZC4uLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBjb3VwbGUgb2Ygd2luMzIgZml4ZXMuIEhBVkVfVU5BTUUKICB3YXMgYWNjaWRlbnRhbGx5ICNkZWZpbmVkIGluIGNvbmZpZy13aW4zMi5oLCB3aGljaCBpdCBzaG91bGRuJ3QgaGF2ZSBiZWVuLgogIFRoZSBIQVZFX1VOSVNURF9IIGlzIG5vdCBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGggdGhlIE1ha2VmaWxlLnZjNgogIG1ha2VmaWxlIGZvciBNUyBWQysrLgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBJIHJlbW92ZWQgdGhlIEFDX1BST0dfSU5TVEFMTCBtYWNybyBmcm9tIGNvbmZpZ3VyZS5pbiwgc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgb25lIG9mIHRoZSBBTV8qIG1hY3JvcyBzZWFyY2hlcyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIGFscmVhZHkuIEphbm5lCiAgSm9oYW5zc29uIG1hZGUgbWUgYXdhcmUgb2YgdGhpcy4KClZlcnNpb24gNi41LjIKCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHF1aWNrbHkgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCA2LjUuMQogIGNyYXNoZXMgaGFyZC4gSSB1cGxvYWQgNi41LjIgbm93IGFzIHF1aWNrbHkgYXMgcG9zc2libGUhIFRoZSBwcm9ibGVtIHdhcwogIHRoZSAtRCBhZGp1c3RtZW50cyBpbiBzcmMvbWFpbi5jLgoKVmVyc2lvbiA2LjUuMQoKRGFuaWVsICgyMCBNYXJjaCAyMDAwKToKLSBBbiBhbm9ueW1vdXMgcG9zdCBvbiBzb3VyY2Vmb3JnZSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgYSBwb3NzaWJsZSBidWZmZXIKICBvdmVyZmxvdyBpbiB0aGUgY3VybF91bmVzY2FwZSgpIGZ1bmN0aW9uIGZvciBVUkwgY29udmVyc2lvbnMuIFRoZSBtYWluCiAgcHJvYmxlbSB3aXRoIHRoaXMgYnVnIGlzIHRoYXQgdGhlIGZ0cCBkb3dubG9hZCB1c2VzIHRoYXQgZnVuY3Rpb24gYW5kIHRoaXMKICBzaW5nbGUtIGJ5dGUgb3ZlcmZsb3cgY291bGQgbGVhZCB0byB2ZXJ5IG9kZCBidWdzIChhcyBvbmUgcmVwb3J0ZWQgYnkgSmFubmUKICBKb2hhbnNzb24pLgoKRGFuaWVsICgxOSBNYXJjaCAyMDAwKToKLSBNYXJjbyBHLiBTYWx2YWdubyBzdXBwbGllZCBtZSB3aXRoIGEgc2VyaWVzIG9mIHBhdGNoZXMKICB0aGF0IG5vdyBhbGxvd3MgY3VybCB0byBnZXQgY29tcGlsZWQgb24gT1MvMi4gSXQgZXZlbiBpbmNsdWRlcyBhIHNlY3Rpb24gaW4KICB0aGUgSU5TVEFMTCBmaWxlLiBWZXJ5IG5pY2Ugam9iIQoKRGFuaWVsICgxNyBNYXJjaCAyMDAwKToKLSBXaGFtIEJhbmcgc3VwcGxpZWQgYSBwYXRjaCBmb3IgdGhlIGxpYi9NYWtlZmlsZS52YzYKICBmaWxlLiBXZSBzdGlsbCBuZWVkIHNvbWUgZml4ZXMgZm9yIHRoZSBjb25maWctd2luMzIuaCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBWQysrIGFuZCBtaW5ndzMyIGhhdmUgZGlmZmVyZW50IG9waW5pb25zIGFib3V0IChhdCBsZWFzdCkgdW5pc3RkLmgncwogIGV4aXN0ZW5jZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMCk6Ci0gSSBtb2RpZmllZCB0aGUgLUQvLS1kdW1wLWhlYWRlciB3b3JraW5ncyBzbyB0aGF0IGl0IGRvZXNuJ3Qgd3JpdGUgYW55dGhpbmcKICB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0by4gVGhpcyB3YXksIHlvdSBjYW4gYWN0dWFsbHkgdXNlIC1iIGFuZCAtRAogIG9uIHRoZSBzYW1lIGZpbGUgaWYgeW91IHdhbnQgcmVwZWF0ZWQgaW52b2tlcyB0byBzdG9yZSBhbmQgcmVhZCB0aGUgY29va2llcwogIGluIHRoYXQgb25lIHNpbmdsZSBmaWxlLgoKLSBQb2tlZCBhcm91bmQgaW4gbG90cyBvZiB0ZXh0cy4gQWRkZWQgdGhlIEJVR1MgZmlsZSBmb3IgYnVnIHJlcG9ydGluZyBzdHVmZi4KICBBZGRlZCB0aGUgY2xhc3NpYyBIVFRQIFBPU1QgcXVlc3Rpb24gdG8gdGhlIEZBUSwgcmVtb3ZlZCBzb21lICNpZmRlZiBXSU4zMgogIHN0dWZmIGZyb20gdGhlIHNvdXJjZXMgKHRoZXkncmUgY292ZXJlZCBieSB0aGUgY29uZmlnLXdpbjMyLmggbm93KS4KCi0gUGFzY2FsIEdhdWRldHRlIGZpeGVkIGEgbWlzc2luZyBsZGFwLmMgcHJvYmxlbSBpbiB0aGUKICBNYWtlZmlsZS52YzYgZmlsZS4gSGUgYWxzbyBhZGRyZXNzZWQgYSBwcm9ibGVtIGluIHNyYy9jb25maWctd2luMzIuaC4KCkRhbmllbCAoMTQgTWFyY2ggMjAwMCk6Ci0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlICdodHRwX2NvZGUnIHZhcmlhYmxlIGluIHRoZSAtdyBvdXRwdXQKICB3YXMgbmV2ZXIgd3JpdHRlbi4gSSBmaXhlZCBpdCBub3cuCgotIEphbm5lIEpvaGFuc3NvbiByZXBvcnRlZCB0aGUgY29tcGxhaW50cyB0aGF0IE9wZW5CU0QgZG9lcwogIHdoZW4gZ2V0ZGF0ZS5jICNpbmNsdWRlcyBtYWxsb2MuaC4gSXQgY2xhaW1zIHN0ZGxpYi5oIHNob3VsZCBiZSBpbmNsdWRlZAogIGluc3RlYWQuIEkgYWRkZWQgI2lmZGVmIEhBVkVfTUFMTE9DX0ggY29kZSBpbiBnZXRkYXRlLnkgYW5kIHR3byBjaGVja3MgaW4KICB0aGUgY29uZmlndXJlLmluIGZvciBtYWxsb2MuaCBhbmQgc3RkbGliLmguCgpWZXJzaW9uIDYuNQoKRGFuaWVsICgxMyBNYXJjaCAyMDAwKToKLSA8Y3VybCBhdCBzcGFtLndvbHZlc2JhbmUubmV0PiBwb2ludGVkIG91dCB0aGF0IHRoZSB3YXkgY3VybCBzZW50IGNvb2tpZXMgaW4gYQogIHNpbmdsZSBsaW5lIHdhc24ndCBlbmpveWVkIGJ5IElJUzQuMCBzZXJ2ZXJzLiBJbiBteSB2aWV3LCB0aGF0IGlzIG5vdCB3aGF0CiAgdGhlIHN0YW5kYXJkcyBzYXksIGJ1dCBJIGFkZGVkIGEgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZS92YWx1ZSBwYWlycyB0bwogIHBlcmhhcHMgbWFrZSB0aGVtIHdvcmsgYmV0dGVyLgoKLSBBZGRlZCB0aGUgcGVybCBjaGVjayBiYWNrIGluIHRoZSBjb25maWd1cmUuaW4gYWdhaW4gc2luY2UgdGhlIG1raGVscC5wbAogIHNjcmlwdCBuZWVkcyBpdCEKCi0gTWFkZSBzb21lIGJlYXV0aWZpY2F0aW9ucyBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBK9nJuIGhlbHBlZCBtZSB1cGRhdGUgdGhlIGNvbmZpZy13aW4zMi5oIGZpbGVzIHdpdGggSEFWRV9TRVRWQlVGIGFuZAogIEhBVkVfU1RSRFVQLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIFVwbG9hZGVkIHRoZSA2LjVwcmUyIHBhY2thZ2UuCgpEYW5pZWwgKDIgTWFyY2ggMjAwMCk6Ci0gUmVtb3ZlZCB0aGUgcGVybC1wcm9ncmFtcyBmcm9tIHRoZSBkaXN0cmlidXRpb24sIHRoZXkgbmV2ZXIgbWFkZSBtYW55IHBlb3BsZQogIGhhcHB5IGFuZCBJJ2xsIHN0aWxsIGtlZXAgdGhlbSBhdmFpbGFibGUgb24gdGhlIHdlYi4KCi0gQWRkZWQgdGhlIC13IGFuZCAtTiBzdHVmZiB0byB0aGUgbWFuIHBhZ2UuIERvY3VtZW50ZWQgdGhlIG5ldyBwcm9ncmVzcyBtZXRlcgogIGRpc3BsYXkgaW4gUkVBRE1FLmN1cmwuCgotIEr2cm4gSGFydHJvdGgsIENocmlzIDxjYmF5bGlzcyBhdCBjc2MuY29tZT4gYW5kIFVsZgogIE32bGxlciBmcm9tIHRoZSBvcGVuc3NsIGRldmVsb3BtZW50IHRlYW0gaGVscGVkIGJyaW5naW5nIG1lIHRoZSBkZXRhaWxzIGZvcgogIGZpeGluZyBhbiBPcGVuU1NMIHVzYWdlIGZsYXcuIEl0IGJlY2FtZSBhcHBhcmVudCB3aGVuIHRoZXkgcmVsZWFzZWQgb3BlbnNzbAogIDAuOS41IHNpbmNlIHRoYXQgYmFyZmVkIG9uIGN1cmwncyBiYWQgYmVoYXZpb3IgKG5vdCBzZWVkaW5nIGEgcmFuZG9tIG51bWJlcgogIHRoaW5nKS4KCi0gWWV0IGFub3RoZXIgb3B0aW9uOiAtTi8tLW5vLWJ1ZmZlciBkaXNhYmxlcyBidWZmZXJpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0uCiAgUHJvYmFibHkgbW9zdCB1c2VmdWwgZm9yIHZlcnkgc2xvdyB0cmFuc2ZlcnMgd2hlbiB5b3UgcmVhbGx5IHdhbnQgdG8gZ2V0CiAgZXZlcnkgYnl0ZSBjdXJsIHJlY2VpdmVzIHdpdGhpbiBzb21lIHByZWZlcnJlZCB0aW1lLiBBbmRyZXcgPHRtciBhdCBnY2kubmV0PgogIHN1Z2dlc3RlZCB0aGlzLgoKLSBEYW1pZW4gQWRhbnQgbWFpbGVkIG1lIGhpcyBmaXhlcyBmb3IgbWFraW5nIGN1cmwgY29tcGlsZSBvbiBVbHRyaXguCgpEYW5pZWwgKDI0IEZlYnJ1YXJ5IDIwMDApOgotIEFwcGxpZWQgSvZybiBIYXJ0cm90aCdzIGZpeGVzIGZvciBjb25maWctd2luMzIuaCBhbmQgbGliL01ha2VmaWxlLnczMi4KCiAgSSBzaG91bGQgYWxzbyBtYWtlIGEgbm90ZSBoZXJlLCBpZiBub3RoaW5nIGVsc2UgdG8gbXlzZWxmLCB0aGF0IHdoZW4gdXNpbmcKICB0aGUgJS1zeW50YXggZm9yIHZhcmlhYmxlcyBpbiBET1MgY29tbWFuZCBwcm9tcHRzLCB5b3UgbXVzdCB1c2UgdHdvICUtCiAgbGV0dGVycyBmb3IgZWFjaCBvbmUgc2luY2UgdGhhdCBpcyBhbiBlc2NhcGUgbGV0dGVyIHRoZXJlISBNYXliZSBJIHNob3VsZAogIHVzZSBhbm90aGVyIGxldHRlciBpbnN0ZWFkIQoKLSBBZGRlZCBtb3JlIHZhcmlhYmxlcyB0byAtdzoKCiAgJ2h0dHBfY29kZScKICAndGltZV9uYW1lbG9va3VwJwogICd0aW1lX2Nvbm5lY3QnCiAgJ3RpbWVfcHJldHJhbnNmZXInCiAgJ3VybF9lZmZlY3RpdmUnCgotIE1hZGUgLXdAZmlsZW5hbWUgcmVhZCB0aGUgc3ludGF4IGZyb20gYSBmaWxlIGFuZCAtd0AtIHJlYWRzIHRoZSBzeW50YXggZnJvbQogIHN0ZGluIGluIHRoZSBnb29kIG9sZCAic3RhbmRhcmQiIGN1cmwgd2F5LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAwKToKLSBSZWxlYXNlZCBhIDYuNXByZTEgdmVyc2lvbiB0byBnZXQgc29tZSB0ZXN0IGFuZCB1c2VyIGZlZWRiYWNrLgoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDAwKToKCi0gSSBhZGRlZCB0aGUgLXcvLS13cml0ZS1vdXQgZmxhZyBhbmQgc29tZSB2YXJpYWJsZXMgdG8gZ28gd2l0aCBpdC4gLXcgaXMgYQogIHNpbmdsZSBzdHJpbmcsIHdoYXRldmVyIHlvdSBlbnRlciB0aGVyZSB3aWxsIGJlIHdyaXR0ZW4gb3V0IHdoZW4gY3VybCBoYXMKICBjb21wbGV0ZWQgYSBzdWNjZXNzZnVsIHJlcXVlc3QuIFRoZXJlIGFyZSBzb21lIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMgYW5kCiAgdGhleSBhcmUgc3BlY2lmaWVkIGFzICcle3ZhcmlhYmxlfScgKHdpdGhvdXQgdGhlIHF1b3RlcykuIFZhcmlhYmxlcyB0aGF0CiAgZXhpc3QgYXMgb2YgdGhpcyBtb21lbnQgYXJlOgoKICAgICAgICB0b3RhbF90aW1lICAgICAtIHRvdGFsIHRyYW5zZmVyIHRpbWUgaW4gc2Vjb25kcyAod2l0aCAyIGRlY2ltYWxzKQogICAgICAgIHNpemVfZG93bmxvYWQgIC0gdG90YWwgZG93bmxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzaXplX3VwbG9hZCAgICAtIHRvdGFsIHVwbG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNwZWVkX2Rvd25sb2FkIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSBkb3dubG9hZAogICAgICAgIHNwZWVkX3VwbG9hZCAgIC0gdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGVudGlyZSB1cGxvYWQKCiAgSSB3aWxsIG9mIGNvdXJzZSBhZGQgbW9yZSB2YXJpYWJsZXMsIGJ1dCBJIG5lZWQgaW5wdXQgb24gdGhlc2UgYW5kIG90aGVycy4KCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3aWxsIGJlIGhhcmQgdG8ganVzdCBhcHBseSBvbiB0aGUgbmV3CiAgcHJvZ3Jlc3MgYmFyIGNvbmNlcHQuIEkgbmVlZCBzb21lIGZlZWRiYWNrIG9uIHRoaXMgYmVmb3JlIHRoYXQnbGwgZ2V0IHJlLQogIGludHJvZHVjZWQhIDotLwoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDAwKToKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgc29tZSBmaXhlcyBmb3IgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBJIGNvbnRpbnVlZAogIHdvcmtpbmcgb24gaXQuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIGh0dHAgZG93bmxvYWQsIGh0dHAgcG9zdCwgZnRwIGRvd25sb2FkCiAgYW5kIGZ0cCB1cGxvYWQuIEl0IHNob3VsZCBiZSBhIHByZXR0eSBnb29kIHRlc3QgaXQgd29ya3MgZ2VuZXJhbGx5IGdvb2QuCgotIFN0aWxsIG5lZWQgdG8gYWRkIHRoZSAtIyBwcm9ncmVzcyBiYXIgaW50byB0aGUgbmV3IHN0eWxlIHByb2dyZXNzIGludGVyZmFjZS4KCi0gR29ubmEgaGF2ZSBhIGdvIGF0IG15IG5ldyBvdXRwdXQgb3B0aW9uIHBhcmFtZXRlciBuZXh0LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAwKToKLSBUaGUgcHJvZ3Jlc3MgbWV0ZXIgc3R1ZmYgaXMgc2xvd2x5IHRha2luZyBwbGFjZS4gVGhlcmUncyBtb3JlIGxlZnQgYmVmb3JlIGl0CiAgaXMgd29ya2luZyBvayBhbmQgZXZlcnl0aGluZyBpcyB0ZXN0ZWQsIGJ1dCB3ZSdyZSByZWFjaGluZyB0aGVyZS4gU2xvd2x5IQoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDAwKToKLSBQYXVsIE1hcnF1aXMgZml4ZWQgdGhlIGNvbmZpZyBmaWxlIHBhcnNpbmcgb2YgY3VybCB0bwogIGRlYWwgd2l0aCBhbnktbGVuZ3RoIGxpbmVzLCByZW1vdmluZyB0aGUgcHJldmlvdXMgbGltaXQgb2YgNEsuCgotIEVldHUgT2phbmVuJ3Mgc3VnZ2VzdGlvbiBvZiBzdXBwb3J0aW5nIHRoZSBALXN0eWxlIGZvciAtYgogIGlzIGltcGxlbWVudGVkLiBOb3cgLWJAPGZpbGVuYW1lPiB3b3JrcyBhcyB3ZWxsIGFzIHRoZSBvbGQgc3R5bGUuIC1iQC0gYWxzbwogIHNpbWlsYXJseSByZWFkcyB0aGUgY29va2llcyBmcm9tIHN0ZGluLgoKLSBSZW1pbmRlcjogLUQgc2hvdWxkIG5vdCB3cml0ZSB0byB0aGUgZmlsZSB1bnRpbCBpdCBuZWVkcyB0bywgaW4gdGhlIHNhbWUgd2F5CiAgLW8gZG9lcy4gVGhhdCB3b3VsZCBlbmFibGUgY3VybCB0byB1c2UgLWIgYW5kIC1EIG9uIHRoZSBzYW1lIGZpbGUuLi4KCi0gRWxsaXMgUHJpdGNoYXJkIG1hZGUgZ2V0ZGF0ZS55IHdvcmsgZm9yIE1hY09TIFguCgotIFBhdWwgSGFycmluZ3RvbiBoZWxwZWQgbWUgb3V0IGZpbmRpbmcgdGhlIGNyYXNoIGluIHRoZQogIGNvb2tpZSBwYXJzZXIuIEhlIGFsc28gcG9pbnRlZCBvdXQgY3VybCdzIGhhYml0IG9mIHNlbmRpbmcgZW1wdHkgY29va2llcyB0bwogIHRoZSBzZXJ2ZXIuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMCk6CiAtIFJvbiBaYXBwIGNvcnJlY3RlZCBhIHByb2JsZW0gaW4gc3JjL3VybGdsb2IuYyB0aGF0CiAgIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBjb21waWxlZCBvbiBzdW5vcyA0LiBUaGUgcHJvYmxlbSBoYWQgdG8gZG8KICAgd2l0aCB0aGUgZGlmZmVyZW5jZSBpbiBzcHJpbnRmKCkgcmV0dXJuIGNvZGUgdHlwZXMuCgogLSBUcmFuc2ZlcigpIHNob3VsZCBub3cgYmUgYWJsZSB0byBkb3dubG9hZCBhbmQgdXBsb2FkIHNpbXVsdGFuZW91c2x5LiBMZXQncwogICBkbyBzb21lIHByb2dyZXNzIG1ldGVyIGZpeGVzIGxhdGVyIHRoaXMgd2Vlay4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAwKToKIC0gUGF1bCBIYXJyaW5ndG9uIGZvdW5kIGFub3RoZXIgY29yZSBkdW1wIGluIHRoZSBjb29raWUKICAgcGFyc2VyLiBDdXJsIGRvZXNuJ3QgcHJvcGVybHkgcmVjb2duaXplIHRoZSAndmVyc2lvbicga2V5d29yZCBhbmQgSSB0aGluawogICB0aGF0IGlzIHdoYXQgY2F1c2VkIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIHNvbWUgc3BlY3Mgb24gY29va2llcyBhbmQgc2VlCiAgIHdoYXQgZWxzZSBjdXJsIGxhY2tzIHRvIGltcHJvdmUgdGhpcyBhIGJpdCBtb3JlIG9uY2UgYW5kIGZvciBhbGwuCgogICBSRkMgMjEwOSBjbGVhcmx5IHNwZWNpZmllcyBob3cgY29va2llcyBzaG91bGQgYmUgZGVhbHQgd2l0aCB3aGVuIHRoZXkgYXJlCiAgIGNvbXBsaWFudCB3aXRoIHRoYXQgc3BlYy4gSSBkb24ndCB0aGluayBtYW55IHNlcnZlcnMgYXJlIHRob3VnaC4uLgoKIC0gTWFyayBXLiBFaWNoaW4gZm91bmQgdGhhdCB3aGlsZSBjdXJsIGlzIHVwbG9hZGluZyBhIGZvcm0KICAgdG8gYSB3ZWIgc2l0ZSwgaXQgZG9lc24ndCByZWFkIGluY29taW5nIGRhdGEgd2h5IGl0J2xsIGhhbmcgYWZ0ZXIgYSB3aGlsZQogICBzaW5jZSB0aGUgc29ja2V0ICJwaXBlIiBiZWNvbWVzIGZ1bGwuCgogICBJdCB0b29rIG1lIHR3byBob3VycyB0byByZXdyaXRlIERvd25sb2FkKCkgYW5kIFVwbG9hZCgpIGludG8gdGhlIG5ldwogICBzaW5nbGUgZnVuY3Rpb24gVHJhbnNmZXIoKS4gSXQgZXZlbiBzZWVtcyB0byB3b3JrISBNb3JlIHRlc3RpbmcgaXMgcmVxdWlyZWQKICAgb2YgY291cnNlLi4uIEkgc2hvdWxkIGdldCB0aGUgaGVhZGVyLXNlbmRpbmcgdG9nZXRoZXIgaW4gYSBraW5kIG9mIHF1ZXVlCiAgIGFuZCBsZXQgdGhlbSBnZXQgInVwbG9hZGVkIiBpbiBUcmFuc2ZlcigpIGFzIHdlbGwuCgogLSBaaGliaWFvIFd1IHBvaW50ZWQgb3V0IGEgY3VybCBidWcgaW4gdGhlIGxvY2F0aW9uOiBhcmVhLAogICBhbHRob3VnaCBJIGRpZCBub3QgZ2V0IGEgcmVwcm9kdWNpYmxlIHdheSB0byBkbyB0aGlzIHdoeSBJIGhhdmUgdG8gd2FpdAogICB3aXRoIGZpeGluZyBhbnl0aGluZy4KCiAtIEJvYiBTY2hhZGVyIHN1Z2dlc3RlZCBJIHNob3VsZCBpbXBsZW1lbnQgcmVzdW1lCiAgIHN1cHBvcnQgZm9yIHRoZSBIVFRQIFBVVCBvcGVyYXRpb24sIGFuZCBhcyBJIHRoaW5rIGl0IGlzIGEgdmFsaWQgc3VnZ2VzdGlvbgogICBJJ2xsIHdvcmsgb24gaXQuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMCk6CiAtIE0gVHJhdmlzIE9iZW5oYXVzIHBvaW50ZWQgb3V0IGEgbWFudWFsIG1peHVwIHdpdGggLXkgYW5kIC1ZIHRoYXQgd2FzCiAgIGNvcnJlY3RlZC4KCiAtIEplbnMgU2NobGV1c2VuZXIgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHRvIGNvbXBpbGUKICAgY3VybCBvbiBBSVggNC4xLjQgYW5kIGdhdmUgbWUgYSBzb2x1dGlvbi4gVGhpcyBwcm9ibGVtIHdhcyBhbHJlYWR5IGZpeGVkCiAgIGJ5IEr2cm4ncyByZWNlbnQgI2luY2x1ZGUgbW9kaWZpY2F0aW9ucyEKCkRhbmllbCAoMTkgSmFudWFyeSAyMDAwKToKIC0gT3NrYXIgTGlsamVibGFkIHBvaW50ZWQgb3V0IGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtCiAgIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIHN5c3RlbSB0aGF0IG1hZGUgY3VybCBmb2xsb3dpbmcgYSBsb2NhdGlvbjogdG8gYQogICBkaWZmZXJlbnQgcHJvdG9jb2wgdG8gZmFpbC4KCiAgIEF0IEphbnVhcnkgMzFzdCBJIHJlLWNvbnNpZGVyZWQgdGhpcyBmaXggYW5kIHRoZSBzdXJyb3VuZGluZyBzb3VyY2UgY29kZS4gSQogICBjb3VsZCBub3QgcmVhbGx5IHNlZSB0aGF0IHRoZSBwYXRjaCBkaWQgYW55IGRpZmZlcmVuY2UsIHdoeSBJIHJlbW92ZWQgaXQKICAgYWdhaW4gZm9yIGZ1cnRoZXIgcmVzZWFyY2ggYW5kIGRlYnVnZ2luZy4gKEl0IGRpc2FibGVkIGxvY2F0aW9uOiBmb2xsb3dpbmcKICAgb24gc2VydmVyIG5vdCBydW5uaW5nIG9uIGRlZmF1bHQgcG9ydHMuKQoKIC0gSvZybiBIYXJ0cm90aCBicm91Z2h0IGEgZml4IHRoYXQgb25jZSBhZ2FpbgogICBtYWRlIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBwcm9ncmVzcyBiYXIuCgogLSBK9nJuIGFsc28gZml4ZWQgYSBmZXcgaW5jbHVkZSBwcm9ibGVtcy4KClZlcnNpb24gNi40CgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMCk6CiAtIEJhc2VkIG9uIHN1Z2dlc3Rpb25zIGZyb20gQmr2cm4gU3RlbmJlcmcsIEkgbWFkZSB0aGUKICAgcHJvZ3Jlc3MgZGVhbCBiZXR0ZXIgd2l0aCBsYXJnZXIgZmlsZXMgYW5kIGFkZGVkIGEgIlRpbWUiIGZpZWxkIHdoaWNoIHNob3dzCiAgIHRoZSB0aW1lIHNwZW50IG9uIHRoZSBkb3dubG9hZCBzbyBmYXIuCiAtIEknbSBub3cgdXNpbmcgdGhlIENWUyByZXBvc2l0b3J5IG9uIHNvdXJjZWZvcmdlLm5ldCwgd2hpY2ggYWxzbyBhbGxvd3Mgd2ViCiAgIGJyb3dzaW5nLiBTZWUgaHR0cDovL2N1cmwuaGF4eC5udS4KCkRhbmllbCAoMTAgSmFudWFyeSAyMDAwKToKIC0gUmVudW1iZXJlZCBzb21lIGVudW1zIGluIGN1cmwvY3VybC5oIHNpbmNlIHRhZyBudW1iZXIgMzUgd2FzIHVzZWQgdHdpY2UhCiAtIEFkZGVkICJwb3N0cXVvdGUiIHN1cHBvcnQgdG8gdGhlIGZ0cCBzZWN0aW9uIHRoYXQgZW5hYmxlcyBwb3N0LWZ0cC10cmFuc2ZlcgogICBxdW90ZSBjb21tYW5kcy4KIC0gTm93IG1hZGUgdGhlIC1RLy0tcXVvdGUgcGFyYW1ldGVyIHJlY29nbml6ZSAnLScgYXMgYSBwcmVmaXgsIHdoaWNoIG1lYW5zCiAgIHRoYXQgY29tbWFuZCB3aWxsIGJlIGlzc3VlZCBBRlRFUiBhIHN1Y2Nlc3NmdWwgZnRwIHRyYW5zZmVyLiBUaGlzIGNhbiBvZgogICBjb3Vyc2UgYmUgdXNlZCB0byBkZWxldGUgb3IgcmVuYW1lIGEgZmlsZSBhZnRlciBpdCBoYXMgYmVlbiB1cGxvYWRlZCBvcgogICBkb3dubG9hZGVkLiBVc2UgeW91ciBpbWFnaW5hdGlvbiEgOy0pCiAtIFNpbmNlIEkgZG8gdGhlIG1haW4gZGV2ZWxvcG1lbnQgb24gc29sYXJpcyAyLjYgbm93LCBJIGhhZCB0byBkb3dubG9hZCBhbmQKICAgaW5zdGFsbCBHTlUgZ3JvZmYgdG8gZ2VuZXJhdGUgdGhlIGh1Z2VoZWxwLmMgZmlsZS4gVGhlIHNvbGFyaXMgbnJvZmYgY29yZXMKICAgb24gdGhlIG1hbiBwYWdlISBTbywgaW4gb3JkZXIgdG8gbWFrZSB0aGUgc29sYXJpcyBjb25maWd1cmUgc2NyaXB0IGZpbmQgYQogICBiZXR0ZXIgcmVzdWx0IEkgbWFkZSBnbnJvZmYgZ2V0IGNoZWNrZWQgcHJpb3IgdG8gdGhlIHJlZ3VsYXIgbnJvZmYuCiAtIEFkZGVkIGFsbCB0aGUgY3VybCBleGl0IGNvZGVzIHRvIHRoZSBtYW4gcGFnZS4KIC0gSmltIEdhbGxhZ2hlciBwcm9wZXJseSB0cmFja2VkIGRvd24gYSBidWcgaW4gYXV0b2NvbmYKICAgMi4xMy4gVGhlIEFDX0NIRUNLX0xJQigpIG1hY3JvIHdyb25nZnVsbHkgdXNlcyB0aGUgLWwgZmxhZyBiZWZvcmUgdGhlIC1MCiAgIGZsYWcgdG8gJ2xkJyB3aGljaCBjYXVzZXMgdGhlIEhQLVVYIDEwLjIwIGZsYXZvdXIgdG8gZmFpbCBvbiBhbGwgbGliY2hlY2tzCiAgIGFuZCB0aGVyZWZvcmUgeW91IGNhbid0IG1ha2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBsaWJzIQoKRGFuaWVsICgyOCBEZWNlbWJlciAxOTk5KToKIC0gVGltIFZlcmhvZXZlbiBjb3JyZWN0bHkgaWRlbnRpZmllZCB0aGF0IGN1cmwKICAgZG9lc24ndCBzdXBwb3J0IFVSTCBmb3JtYXR0ZWQgZmlsZSBuYW1lcyB3aGVuIGdldHRpbmcgZnRwLiBOb3csIHRoZXJlJ3MgYQogICBwcm9ibGVtIHdpdGggZ2V0dGluZyB2ZXJ5IHdlaXJkIGZpbGUgbmFtZXMgb2ZmIEZUUCBzZXJ2ZXJzLiBSRkMgOTU5IGRlZmluZXMKICAgdGhhdCB0aGUgZmlsZSBuYW1lIHN5bnRheCB0byB1c2Ugc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluIHRoZSBuYXRpdmUgT1Mgb2YKICAgdGhlIHNlcnZlci4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgcGVlciBzZXJ2ZXIgc3lzdGVtIHdlIGN1cnJlbnRseSBqdXN0CiAgIHRyYW5zbGF0ZSB0aGUgVVJMIHN5bnRheCBpbnRvIHBsYWluIGxldHRlcnMuIEl0IGlzIHN0aWxsIGJldHRlciBhbmQgd2l0aAogICB0aGUgc29sYXJpcyAyLjYtc3VwcGxpZWQgZnRwIHNlcnZlciBpdCB3b3JrcyB3aXRoIHNwYWNlcyBpbiB0aGUgZmlsZSBuYW1lcy4KCkRhbmllbCAoMjcgRGVjZW1iZXIgMTk5OSk6CiAtIFdoZW4gY3VybCBwYXJzZWQgY29va2llcyBzdHJhaWdodCBvZmYgYSByZW1vdGUgc2l0ZSwgaXQgY29ycnVwdGVkIHRoZSBpbnB1dAogICBkYXRhLCB3aGljaCwgaWYgdGhlIGRvd25sb2FkZWQgaGVhZGVycyB3ZXJlIHN0b3JlZCBtYWRlIHZlcnkgb2RkIGNoYXJhY3RlcnMKICAgaW4gdGhlIHNhdmVkIGRhdGEuIENvcnJlY3RseSBpZGVudGlmaWVkIGFuZCByZXBvcnRlZCBieSBQYXVsIEhhcnJpbmd0b24uCgpEYW5pZWwgKDEzIERlY2VtYmVyIDE5OTkpOgogLSBHZW5lcmFsIGNsZWFudXBzIGluIHRoZSBsaWJyYXJ5IGludGVyZmFjZS4gVGhlcmUgaGFkIGJlZW4gc29tZSBiYWQga2x1ZGdlcwogICBhZGRlZCBkdXJpbmcgdGltZXMgb2Ygc3RyZXNzIGFuZCBJIGRpZCBteSBiZXN0IHRvIGNsZWFuIHRoZW0gb2ZmLiBJdCB3YXMKICAgYm90aCByZWdhcmRpbmcgdGhlIGxpYiBBUEkgYXMgd2VsbCBhcyBpbmNsdWRlIGZpbGUgY29uZnVzaW9ucy4KCkRhbmllbCAoMyBEZWNlbWJlciAxOTk5KToKIC0gQSBzbWFsbCAtLXN0ZGVyciBidWcgd2FzIHJlcG9ydGVkIGJ5IEVldHUgT2phbmVuLi4uCgogLSB3aG8gYWxzbyBicm91Z2h0IHRoZSBzdWdnZXN0aW9uIG9mIGV4dGVuZGluZyB0aGUgLVggZmxhZyB0byBmdHAgbGlzdCBhcwogICB3ZWxsLiBTbywgbm93IGl0IGlzIGFuZCB0aGUgbG9uZyBvcHRpb24gaXMgbm93IC0tcmVxdWVzdCBpbnN0ZWFkLiBJdCBpcwogICBvbmx5IGZvciBmdHAgbGlzdCBmb3Igbm93IChhbmQgdGhlIGZvcm1lciBodHRwIHN0dWZmIHRvbyBvZiBjb3Vyc2UpLgoKTGFycyBKLiBBYXMgKDI0IE5vdmVtYmVyIDE5OTkpOgogLSBQYXRjaGVkIGN1cmwgdG8gY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIgQmVPUy4gRG9lc24ndCB3b3JrIHlldCB0aG91Z2ghCgogLSBDb3JyZWN0ZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzIHRvIGFsbG93IHB1dHRpbmcgb2JqZWN0IGZpbGVzIGluCiAgIGRpZmZlcmVudCBkaXJlY3RvcmllcyB0aGFuIHRoZSBzb3VyY2VzLgoKVmVyc2lvbiA2LjMuMQoKRGFuaWVsICgyMyBOb3ZlbWJlciAxOTk5KToKIC0gSSd2ZSBoYWQgdGhpcyBtYWpvciBkaXNrIGNyYXNoLiBNeSBnb29kIG9sZCB0cnVzdC13b3J0aHkgc291cmNlIGRpc2sgZGllZAogICBhbG9uZyB3aXRoIHRoZSBtYWNoaW5lIHRoYXQgaG9zdGVkIGl0LiBUaGFuayBnb29kbmVzcyBtb3N0IG9mIGFsbCB0aGUKICAgdGhpbmdzIEkndmUgZG9uZSBhcmUgZWl0aGVyIGJhY2tlZCB1cCBlbHNld2hlcmUgb3Igc3RvcmVkIGluIHRoaXMgQ1ZTCiAgIHNlcnZlciEKCiAtIE1pY2hhZWwgUy4gU3RldWVyIHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSAtRiBoYW5kbGluZwogICB0aGF0IG1hZGUgY3VybCBoYW5nIGlmIHlvdSBwb3N0ZWQgYW4gZW1wdHkgdmFyaWFibGUgc3VjaCBhcyAnLUYgbmFtZT0nLiBJdAogICB3YXMgb25lIG9mIHRob3NlIG9sZCBidWdzIHRoYXQgbmV2ZXIgaGF2ZSB3b3JrZWQgcHJvcGVybHkuLi4KCiAtIEphc29uIEJhaWV0dG8gcG9pbnRlZCBvdXQgYSBnZW5lcmFsIGZsYXcgaW4gdGhlIEhUVFAKICAgZG93bmxvYWQuIEN1cmwgZGlkbid0IGNvbXBsYWluIGlmIGl0IHdhcyBwcmVtYXR1cmVseSBhYm9ydGVkIGJlZm9yZSB0aGUKICAgZW50aXJlIGRvd25sb2FkIHdhcyBjb21wbGV0ZWQuIEl0IGRvZXMgbm93LgoKRGFuaWVsICgxOSBOb3ZlbWJlciAxOTk5KToKIC0gQ2hyaXMgTWFsdGJ5IHZlcnkgYWNjdXJhdGVseSBjcml0aWNpemVkIHRoZSBsYWNrIG9mCiAgIHJldHVybiBjb2RlIGNoZWNrcyBvbiB0aGUgZndyaXRlKCkgY2FsbHMuIEkgZGlkIGEgdGhvcm91Z2ggY2hlY2sgZm9yIGFsbAogICBvY2N1cnJlbmNlcyBhbmQgY29ycmVjdGVkIHRoaXMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDE5OTkpOgogLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgLW0vLS1tYXgtdGltZSBvcHRpb24KICAgZG9lc24ndCB3b3JrIGZvciB0aGUgc2xvdyBzeXN0ZW0gY2FsbHMgbGlrZSBnZXRob3N0YnluYW1lKCkuLi4gSSBkb24ndCBoYXZlCiAgIGFueSBnb29kIGZpeCB5ZXQsIGp1c3QgYSBzbGlnaHRseSBsZXNzIGJhZCBvbmUgdGhhdCBtYWtlcyBjdXJsIGV4aXQgaGFyZAogICB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuCgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgcG9pbnQgb3V0IGEgcG9zc2libGUgcHJvYmxlbSB0aGF0IG1pZ2h0IGJlIHRoZSByZWFzb24KICAgd2h5IFRob21hcyBIdXJzdCBleHBlcmllbmNlIHByb2JsZW1zIGluIGhpcyBBbWlnYSB2ZXJzaW9uLgoKIERhbmllbCAoMTIgTm92ZW1iZXIgMTk5OSk6CiAtIEkgZm91bmQgYSBjcmFzaCBpbiB0aGUgbmV3IGNvb2tpZSBmaWxlIHBhcnNlci4gSXQgY3Jhc2hlZCB3aGVuIHlvdSBnYXZlCiAgIGEgcGxhaW4gaHR0cCBoZWFkZXIgZmlsZSBhcyBpbnB1dC4uLgoKVmVyc2lvbiA2LjMKCiBEYW5pZWwgKDEwIE5vdmVtYmVyIDE5OTkpOgogLSBJIGtpbmQgb2YgZm91bmQgb3V0IHRoYXQgdGhlIEhUVFAgdGltZS1jb25kaXRpb25hbCBHRVRzICgteikgYXJlbid0IGFsd2F5cwogICByZXNwZWN0ZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgYW5kIHRoZSBkb2N1bWVudCBpcyB0aGVyZWZvcmUgc2VudCBpbiB3aG9sZQogICBhZ2FpbiwgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGNvbmRpdGlvbi4gQWZ0ZXIgcmVhZGluZwogICBzZWN0aW9uIDEzLjMuNCBvZiBSRkMgMjYxNiwgSSB0aGluayBJJ20gZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIG5vdyB3aGVuIEkgZG8KICAgbXkgb3duIGNoZWNrIGFzIHdlbGwuIElmIGN1cmwgdGhpbmtzIHRoZSBjb25kaXRpb24gaXNuJ3QgbWV0LCB0aGUgdHJhbnNmZXIKICAgaXMgYWJvcnRlZCBwcmVtYXR1cmVseSAoYWZ0ZXIgYWxsIHRoZSBoZWFkZXJzIGhhdmUgYmVlbiByZWNlaXZlZCkuCgogLSBBZnRlciBjb21tZW50cyBmcm9tIFJvYmVydCBMaW5kZW4gSSBhbHNvIHJld3JvdGUgc29tZSBwYXJ0cyBvZiB0aGUgbWFuIHBhZ2UKICAgdG8gYmV0dGVyIGRlc2NyaWJlIGhvdyB0aGUgLUYgd29ya3MuCgogLSBNaWNoYWVsIEFudGkgcHV0IHVwIGEgbmV3IGN1cmwgZG93bmxvYWQgbWlycm9yIGluCiAgIENoaW5hOiAgaHR0cDovL3d3dy5wc2hvd2luZy5jb20vY3VybC8KCiAtIEkgYWRkZWQgdGhlIGxpc3Qgb2YgZG93bmxvYWQgbWlycm9ycyB0byB0aGUgUkVBRE1FIGZpbGUKCiAtIEkgZGlkIGFkZCBtb3JlIGV4cGxhbmF0aW9ucyB0byB0aGUgbWFuIHBhZ2UKCiBEYW5pZWwgKDggTm92ZW1iZXIgMTk5OSk6CiAtIEkgbWFkZSB0aGUgLWIvLS1jb29raWUgb3B0aW9uIGNhcGFibGUgb2YgcmVhZGluZyBuZXRzY2FwZSBmb3JtYXR0ZWQgY29va2llCiAgIGZpbGVzIGFzIHdlbGwgYXMgbm9ybWFsIGh0dHAtaGVhZGVyIGZpbGVzLiBJdCBzaG91bGQgYmUgYWJsZSB0bwogICB0cmFuc3BhcmVudGx5IGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGZpbGUgaXQgZ290IGFzIGlucHV0LgoKIERhbmllbCAoMjkgT2N0b2JlciAxOTk5KToKIC0gQW5vdGhlciBvbmUgb2YgU2ViYXN0aWFhbiB2YW4gRXJrJ3MgaWRlYXMgKHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkIGJlZm9yZQogICBidXQgSSBzZWVtIHRvIGhhdmUgZm9yZ290dGVuIHdobyBpdCB3YXMpLCBpcyB0byBhZGQgc3VwcG9ydCBmb3IgcmFuZ2VzIGluCiAgIEZUUCBkb3dubG9hZHMuIEFzIHVzdWFsLCBvbmUgcmVxdWVzdCBpcyBqdXN0IGEgcmVxdWVzdCwgd2hlbiB0aGV5J3JlIHR3bwogICBpdCBpcyBhIGRlbWFuZC4gSSd2ZSBhZGRlZCBzaW1wbGUgc3VwcG9ydCBmb3IgWC1ZIHN0eWxlIGZldGNoZXMuIFggaGFzIHRvCiAgIGJlIHRoZSBsb3dlciBudW1iZXIsIHRob3VnaCB5b3UgbWF5IG9taXQgb25lIG9mIHRoZSBudW1iZXJzLiBVc2UgdGhlIC1yLwogICAtLXJhbmdlIHN3aXRjaCAocHJldmlvdXNseSBIVFRQLW9ubHkpLgoKIC0gU2ViYXN0aWFhbiB2YW4gRXJrIHN1Z2dlc3RlZCB0aGF0IGN1cmwgc2hvdWxkIGJlCiAgIGFibGUgdG8gc2hvdyB0aGUgZmlsZSBzaXplIG9mIGEgc3BlY2lmaWVkIGZpbGUuIEkgdGhpbmsgdGhpcyBpcyBhIHNwbGVuZGlkCiAgIGlkZWEgYW5kIHRoZSAtSSBmbGFnIGlzIG5vdyB3b3JraW5nIGZvciBGVFAuIEl0IGRpc3BsYXlzIHRoZSBmaWxlIHNpemUgaW4KICAgdGhpcyBtYW5uZXI6CiAgICAgICAgQ29udGVudC1MZW5ndGg6IFhYWFgKICAgQXMgaXQgcmVzZW1ibGVzIG5vcm1hbCBoZWFkZXJzLCBhbmQgbGVhdmVzIHVzIHRoZSBvcHBvcnR1bml0eSB0byBhZGQgbW9yZQogICBpbmZvIGluIHRoYXQgZGlzcGxheSBpZiB3ZSBjYW4gY29tZSB1cCB3aXRoIG1vcmUgaW4gdGhlIGZ1dHVyZSEgSXQgYWxzbwogICBtYWtlcyBzZW5zZSBzaW5jZSBpZiB5b3UgYWNjZXNzIGZ0cCB0aHJvdWdoIGEgSFRUUCBwcm94eSwgeW91J2QgZ2V0IHRoZQogICBmaWxlIHNpemUgdGhlIHNhbWUgd2F5LgoKICAgSSBjaGFuZ2VkIHRoZSBvcmRlciBvZiB0aGUgUVVPVEUgY29tbWFuZCBleGVjdXRpb25zLiBUaGV5J3JlIG5vdyBleGVjdXRlZAogICBqdXN0IGFmdGVyIHRoZSBsb2dpbiBhbmQgYmVmb3JlIGFueSBvdGhlciBjb21tYW5kLiBJIG1hZGUgdGhpcyB0byBlbmFibGUKICAgcXVvdGUgY29tbWFuZHMgdG8gcnVuIGJlZm9yZSB0aGUgLUkgc3R1ZmYgaXMgZG9uZSB0b28uCgogLSBJIGZvdW5kIG91dCB0aGF0IC1ELy0tZHVtcC1oZWFkZXIgYW5kIC1WLy0tdmVyc2lvbiB3ZXJlbid0IGRvY3VtZW50ZWQgaW4KICAgdGhlIG1hbiBwYWdlLgoKIC0gTWFueSBIVFRQLzEuMSBzZXJ2ZXJzIGRvIG5vdCBzdXBwb3J0IHJhbmdlcy4gRG9uJ3QgYXNrIG1lIHdoeS4gSSBkaWQgYWRkCiAgIHNvbWUgdGV4dCBhYm91dCB0aGlzIGluIHRoZSBtYW4gcGFnZSBmb3IgdGhlIHJhbmdlIG9wdGlvbi4gVGhlIHRocmVhZCBpbgogICB0aGUgbWFpbGluZyBsaXN0IHRoYXQgc3RhcnRlZCB0aGlzIHdhcyBpbml0aWF0ZWQgYnkgTWljaGFlbCBBbnRpLgoKIC0gSSBnZXQgcmVwb3J0cyBhYm91dCBucm9mZiBjcmFzaGVzIG9uIHNvbGFyaXMgMi42KyB3aGVuIGRpc3BsYXlpbmcgdGhlIGN1cmwKICAgbWFuIHBhZ2UuIFN3aXRjaCB0byBnbnJvZmYgaW5zdGVhZCwgaXQgaXMgcmVwb3J0ZWQgdG8gd29yayghKS4gQWRhbSBCYXJjbGF5CiAgIHJlcG9ydGVkIGFuZCBicm91Z2h0IHRoZSBzdWdnZXN0aW9uLgoKIC0gSW4gYSBkaWFsb2d1ZSB3aXRoIEpvaGFubmVzIEcuIEtyaXN0aW5zc29uIHdlIGNhbWUKICAgdXAgd2l0aCB0aGUgaWRlYSB0byBsZXQgLUgvLS1oZWFkZXIgc3BlY2lmaWVkIGhlYWRlcnMgcmVwbGFjZSB0aGUKICAgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycywgaWYgeW91IGhhcHBlbmVkIHRvIHNlbGVjdCB0byBhZGQgYSBoZWFkZXIKICAgdGhhdCBjdXJsIG5vcm1hbGx5IHVzZXMgYnkgaXRzZWxmLiBUaGUgYWR2YW50YWdlIHdpdGggdGhpcyBpcyBub3QgZW50aXJlbHkKICAgb2J2aW91cywgYnV0IGluIEpvaGFubmVzJyBjYXNlIGl0IG1lYW5zIHRoYXQgaGUgY2FuIHVzZSBhbm90aGVyIEhvc3Q6IHRoYW4KICAgdGhlIG9uZSBjdXJsIHdvdWxkIHNldC4KCiBEYW5pZWwgKDI3IE9jdG9iZXIgMTk5OSk6CiAtIEpvbmdraSBTdXdhbmRpIGJyb3VnaHQgYSBuaWNlIHBhdGNoIGZvciAoeWV0IGFub3RoZXIpIGNyYXNoIHdoZW4gZm9sbG93aW5nCiAgIGEgbG9jYXRpb246LiBUaGlzIHRpbWUgeW91IGhhZCB0byBmb2xsb3cgYSBodHRwczovLyBzZXJ2ZXIncyByZWRpcmVjdCB0bwogICBnZXQgdGhlIGNvcmUuCgpWZXJzaW9uIDYuMgoKIERhbmllbCAoMjEgT2N0b2JlciAxOTk5KToKIC0gSSB0aGluayBJIG1hbmFnZWQgdG8gcmVtb3ZlIHRoZSBzdXNwaWNpb3VzIChuaWwpIHRoYXQgaGFzIGJlZW4gc2VlbiBqdXN0CiAgIGJlZm9yZSB0aGUgIkhvc3Q6IiBpbiBIVFRQIHJlcXVlc3RzIHdoZW4gLXYgd2FzIHVzZWQuCiAtIEkgZm91bmQgb3V0IHRoYXQgaWYgeW91IGZvbGxvd2VkIGEgbG9jYXRpb246IHdoZW4gdXNpbmcgYSBwcm94eSwgd2l0aG91dAogICBoYXZpbmcgc3BlY2lmaWVkIGh0dHA6Ly8gaW4gdGhlIFVSTCwgdGhlIHByb3RvY29sIHBhcnQgd2FzIGFkZGVkIG9uY2UgYWdhaW4KICAgd2hlbiBtb3ZpbmcgdG8gdGhlIG5leHQgVVJMISAoVGhlIHByb3RvY29sIHBhcnQgaGFzIHRvIGJlIGFkZGVkIHRvIHRoZQogICBVUkwgd2hlbiBnb2luZyB0aHJvdWdoIGEgcHJveHkgc2luY2UgaXQgaGFzIG5vIHByb3RvY29sLWd1ZXNzaW5nIHN5c3RlbQogICBzdWNoIGFzIGN1cmwgaGFzLikKIC0gQmVuamFtaW4gUml0Y2V5IHJlcG9ydGVkIGEgY29yZSBkdW1wIHVuZGVyIHNvbGFyaXMgMi42CiAgIHdpdGggT3BlblNTTCAwLjkuNC4gSXQgdHVybmVkIG91dCB0aGlzIHdhcyBkdWUgdG8gYSBiYWQgZnJlZSgpIGluIG1haW4uYwogICB0aGF0IG9jY3VycmVkIGFmdGVyIHRoZSBkb3dubG9hZCB3YXMgZG9uZSBhbmQgY29tcGxldGVkLgogLSBCZW5qYW1pbiBmb3VuZCBmdHAgZG93bmxvYWRzIHRvIHNob3cgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGRvd25sb2FkIG1ldGVyCiAgIHRvIGdldCB3cml0dGVuIHR3aWNlLCBhbmQgSSByZW1vdmVkIHRoYXQgcHJvYmxlbS4gSXQgd2FzIGludHJvZHVjZWQgd2l0aAogICB0aGUgbXVsdGlwbGUgVVJMIHN1cHBvcnQuCiAtIERhbiBaaXR0ZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCA2LjEgYW5kIGVhcmxpZXIgdmVyc2lvbnMgZGlkbid0CiAgIGhvbm9yIFJGQyAyNjE2IGNoYXB0ZXIgNCBzZWN0aW9uIDIsICJNZXNzYWdlIEhlYWRlcnMiOiAiLi4uRmllbGQgbmFtZXMgYXJlCiAgIGNhc2UtaW5zZW5zaXRpdmUuLi4iICBIVFRQIGhlYWRlciBwYXJzaW5nIGFzc3VtZWQgYSBjZXJ0YWluIGNhc2luZy4gRGFuCiAgIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIHRoaXMsIHdoaWNoIEkgdG9vayB0aGUgbGliZXJ0eQogICBvZiBlZGl0aW5nIHNsaWdodGx5LgogLSBEYW4gWml0dGVyIGFsc28gcHJvdmlkZWQgYSBuaWNlIHBhdGNoIGZvciBjb25maWcuZ3Vlc3MgdG8gYmV0dGVyIHJlY29nbml6ZQogICB0aGUgTWFjIE9TIFgKIC0gRGFuIGFsc28gY29ycmVjdGVkIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgbGliL01ha2VmaWxlIHRoYXQgY2F1c2VkIGxpbmtpbmcKICAgdG8gZmFpbCBvbiBPUyBYLgoKIERhbmllbCAoMTkgT2N0b2JlciAxOTk5KToKIC0gTGVuIE1hcmluYWNjaW8gY2FtZSB1cCB3aXRoIHNvbWUgcHJvYmxlbXMgd2l0aCBjdXJsLiAgU2luY2UgV2luZG93cyBoYXMgYQogICBjcmlwcGxlZCBzaGVsbCwgaXQgY2FuJ3QgcmVkaXJlY3Qgc3RkZXJyIGFuZCB0aGF0IGNhdXNlcyB0cm91YmxlLiBJIGFkZGVkCiAgIC0tc3RkZXJyIHRvZGF5IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byByZWRpcmVjdCB0aGUgc3RkZXJyIHN0cmVhbSB0byBhCiAgIGZpbGUgb3Igc3Rkb3V0LgoKIERhbmllbCAoMTggT2N0b2JlciAxOTk5KToKIC0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHVuZGVyc3RhbmRzIHRoZSAnLS13aXRob3V0LXNzbCcgZmxhZywgd2hpY2ggbm93CiAgIHRvdGFsbHkgZGlzYWJsZSBTU0wvaHR0cHMgc3VwcG9ydC4gUHJldmlvdXNseSBpdCB3YXNuJ3QgcG9zc2libGUgdG8gZm9yY2UKICAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gbGVhdmUgU1NMIGFsb25lLiBUaGUgcHJldmlvdXMgZnVuY3Rpb25hbGl0eSBoYXMKICAgYmVlbiByZXRhaW5lZC4gVHJveSBFbmdlbCBoZWxwZWQgdGVzdCB0aGlzIG5ldyBvbmUuCgpWZXJzaW9uIDYuMQoKIERhbmllbCAoMTcgT2N0b2JlciAxOTk5KToKIC0gSSBpZmRlZidlZCBvciBjb21tZW50ZWQgYWxsIHRoZSB6bGliIHN0dWZmIGluIHRoZSBzb3VyY2VzIGFuZCBjb25maWd1cmUKICAgc2NyaXB0LiBJdCB0dXJuZWQgb3V0IHdlIG5lZWRlZCB0byBtb2NrIG1vcmUgd2l0aCB6bGliIHRoYW4gSSBpbml0aWFsbHkKICAgdGhvdWdodCwgdG8gbWFrZSBpdCBjYXBhYmxlIG9mIGRvd25sb2FkaW5nIGNvbXByZXNzZWQgSFRUUCBkb2N1bWVudHMgYW5kCiAgIHVuY29tcHJlc3MgdGhlbSBvbiB0aGUgZmx5LiBJIGRpZG4ndCBtZWFuIHRoZSB6bGliIHBhcnRzIG9mIGN1cmwgdG8gYmVjb21lCiAgIG1vcmUgdGhhbiBtaW5vciBzbyB0aGlzIG1lYW5zIEkgaGFsdCB0aGUgemxpYiBleHBlZGl0aW9uIGZvciBub3cgYW5kIHdhaXQKICAgdW50aWwgc29tZW9uZSBlaXRoZXIgd3JpdGVzIHRoZSBjb2RlIG9yIHpsaWIgZ2V0cyB1cGRhdGVkIGFuZCBiZXR0ZXIKICAgYWRqdXN0ZWQgZm9yIHRoaXMga2luZCBvZiB1c2FnZS4gIEkgd29uJ3QgZ2V0IGludG8gZGV0YWlscyBoZXJlLCBidXQgYQogICBzaG9ydCBhIHN1bW1hcnkgaXMgc3VpdGFibGU6CiAgIC0gemxpYiBjYW4ndCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRvIHVzZSB6bGliIG9yIGd6aXAKICAgICBkZWNvbXByZXNzaW9uIG1ldGhvZHMuCiAgIC0gemxpYiBpcyB2ZXJ5IG5lYXQgZm9yIHJlYWRpbmcgZ3ppcHBlZCBmaWxlcyBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLAogICAgIGFsdGhvdWdoIG5vdCBhcyBuaWNlIGZvciByZWFkaW5nIGJ1ZmZlci1iYXNlZCBkYXRhIHN1Y2ggYXMgd2Ugd291bGQKICAgICB3YW50IGl0LgogICAtIHRoZXJlIGFyZSBzdGlsbCBzb21lIHByb2JsZW1zIHdpdGggdGhlIHdpbjMyIHZlcnNpb24gd2hlbiByZWFkaW5nIGZyb20KICAgICBhIGZpbGUgZGVzY3JpcHRvciBpZiB0aGF0IGlzIGEgc29ja2V0CgogRGFuaWVsICgxNCBPY3RvYmVyIDE5OTkpOgogLSBNb3ZlZCB0aGUgKGV4dGVybmFsKSBpbmNsdWRlIGZpbGVzIGZvciBsaWJjdXJsIGludG8gYSBzdWJkaXJlY3RvcnkgbmFtZWQKICAgY3VybCBhbmQgYWRqdXN0ZWQgYWxsICNpbmNsdWRlIGxpbmVzIHRvIHVzZSA8Y3VybC9YWFhYPiB0byBtYWludGFpbiBhCiAgIGJldHRlciBuYW1lIHNwYWNlIGFuZCBjb250cm9sIG9mIHRoZSBoZWFkZXJzLiBUaGlzIGhhcyBiZWVuIHJlcXVlc3RlZC4KCiBEYW5pZWwgKDEyIE9jdG9iZXIgMTk5OSk6CiAtIEkgbW9kaWZpZWQgdGhlICdtYWtldGd6JyBzY3JpcHQgdG8gcGVyZm9ybSBhICdtYWtlJyB0b28gYmVmb3JlIGEgcmVsZWFzZQogICBhcmNoaXZlIGlzIHB1dCB0b2dldGhlciBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIHRpbWUgc3RhbXBzIGJldHRlciBhbmQKICAgaG9wZWZ1bGx5IGF2b2lkIHRoZSBkb3VibGUgY29uZmlndXJlLXJ1bm5pbmcgdGhhdCB1c2UgdG8gb2NjdXIuCgogRGFuaWVsICgxMSBPY3RvYmVyIDE5OTkpOgogLSBBcHBsaWVkIEr2cm4ncyBwYXRjaGVzIHRoYXQgZml4ZXMgemxpYiBmb3IgbWluZ3czMiBjb21waWxlcyBhcyB3ZWxsIGFzCiAgIHNvbWUgb3RoZXIgbWlzc2luZyB6bGliICNpZmRlZiBhbmQgbW9yZSB0ZXh0IG9uIHRoZSBtdWx0aXBsZSBVUkwgZG9jcyBpbgogICB0aGUgbWFuIHBhZ2UuCgpWZXJzaW9uIDYuMWJldGEKCiBEYW5pZWwgKDYgT2N0b2JlciAxOTk5KToKIC0gRG91Z2xhcyBFLiBXZWdzY2hlaWQgc2VudCBtZSBhIHBhdGNoIHRoYXQgbWFkZSB0aGUgZXhhY3Qgc2FtZSB0aGluZyBhcyBJCiAgIGp1c3QgbWFkZTogdGhlIC1kIHN3aXRjaCBpcyBub3cgY2FwYWJsZSBvZiByZWFkaW5nIHBvc3QgZGF0YSBmcm9tIGEgbmFtZWQKICAgZmlsZSBvciBzdGRpbi4gIFVzZSBpdCBzaW1pbGFybHkgdG8gdGhlIC1GLiBUbyByZWFkIHRoZSBwb3N0IGRhdGEgZnJvbSBhCiAgIGdpdmVuIGZpbGU6CgogICAgICAgIGN1cmwgLWQgQHBhdGgvdG8vZmlsZW5hbWUgd3d3LnBvc3RzaXRlLmNvbQoKICAgb3IgbGV0IGN1cmwgcmVhZCBpdCBvdXQgZnJvbSBzdGRpbjoKCiAgICAgICAgY3VybCAtZCBALSB3d3cucG9zdGl0LmNvbQoKIEr2cm4gSGFydHJvdGggKDMgT2N0b2JlciAxOTk5KToKIC0gQnJvdWdodCBzb21lIG1vcmUgcGF0Y2hlcyBmb3IgbXVsdGlwbGUgVVJMIGZ1bmN0aW9uYWxpdHkuIFRoZSBNSU1FCiAgIHNlcGFyYXRpb24gaWRlYXMgYXJlIGFsbW9zdCBzY3JhcHBlZCBub3csIGFuZCBhIGN1c3RvbSBzZXBhcmF0b3IgaXMgYmVpbmcKICAgdXNlZCBpbnN0ZWFkLiBUaGlzIGlzIHN0aWxsIGNvbXBpbGUtdGltZSAiZmxhZ2dlZCIuCgogRGFuaWVsCiAtIFVwZGF0ZWQgY3VybC4xIHdpdGggbXVsdGlwbGUgVVJMIGluZm8uCgogRGFuaWVsICgzMCBTZXB0ZW1iZXIgMTk5OSk6CiAtIEZlbGl4IHZvbiBMZWl0bmVyIGJyb3VnaHQgb3BlbnNzbC1jaGVjayBmaXhlcyBmb3IgY29uZmlndXJlLmluIHRvIHdvcmsKICAgb3V0LW9mLXRoZS1ib3ggd2hlbiB0aGUgb3BlbnNzbCBmaWxlcyBhcmUgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0gZGVmYXVsdAogICBkaXJzLgoKIERhbmllbCAoMjggU2VwdGVtYmVyIDE5OTkpCiAtIEFkZGVkIGxpYnogZnVuY3Rpb25hbGl0eS4gVGhpcyBzaG91bGQgZW5hYmxlIGRlY29tcHJlc3NpbmcgZ3ppcCwgY29tcHJlc3MKICAgb3IgZGVmbGF0ZSBlbmNvZGluZyBIVFRQIGRvY3VtZW50cy4gSXQgYWxzbyBtYWtlcyBjdXJsIHNlbmQgYW4gYWNjZXB0IHRoYXQKICAgaXQgYWNjZXB0cyB0aGF0IGtpbmQgb2YgZW5jb2RpbmcuIENvbXByZXNzZWQgY29udGVudHMgdXN1YWxseSBzaG9ydGVucwogICBkb3dubG9hZCB0aW1lLiBJICpuZWVkKiBzb21lb25lIHRvIHRlbGwgbWUgYSBzaXRlIHRoYXQgdXNlcyBjb21wcmVzc2VkIEhUVFAKICAgZG9jdW1lbnRzIHNvIHRoYXQgSSBjYW4gdGVzdCB0aGlzIG91dCBwcm9wZXJseS4KCiAtIEFzIGEgcmVzdWx0IG9mIHRoZSBhZGRpbmcgb2YgemxpYiBhd2FyZW5lc3MsIEkgY2hhbmdlZCB0aGUgdmVyc2lvbiBzdHJpbmcKICAgYSBsaXR0bGUuIEkgcGxhbiB0byBhZGQgb3BlbmxkYXAgdmVyc2lvbiByZXBvcnRpbmcgaW4gdGhlcmUgdG9vLgoKIERhbmllbCAoMTcgU2VwdGVtYmVyIDE5OTkpCiAtIE1hZGUgdGhlIC1GIG9wdGlvbiBhbGxvdyBzdGRpbiB3aGVuIHNwZWNpZnlpbmcgZmlsZXMuIEJ5IHVzaW5nICctJyBpbnN0ZWFkCiAgIG9mIGZpbGUgbmFtZSwgdGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gc3RkaW4uCgpWZXJzaW9uIDYuMAoKIERhbmllbCAoMTMgU2VwdGVtYmVyIDE5OTkpCiAtIEFkZGVkIC1YLy0taHR0cC1yZXF1ZXN0IDxyZXF1ZXN0PiB0byBlbmFibGUgYW55IEhUVFAgY29tbWFuZCB0byBiZSBzZW50LgogICBEbyBub3QgdGhhdCB5b3VyIHNlcnZlciBoYXMgdG8gc3VwcG9ydCB0aGUgZXhhY3Qgc3RyaW5nIHlvdSBlbnRlci4gVGhpcwogICBzaG91bGQgcG9zc2libHkgYSBzdHJpbmcgbGlrZSBERUxFVEUgb3IgVFJBQ0UuCgogLSBBcHBsaWVkIERvdWdsYXMnIG1pbmd3MzItZml4ZXMgZm9yIHRoZSBtYWtlZmlsZXMuCgogRGFuaWVsICgxMCBTZXB0ZW1iZXIgMTk5OSkKIC0gRG91Z2xhcyBFLiBXZWdzY2hlaWQgcG9pbnRlZCBvdXQgYSBwcm9ibGVtLiBDdXJsIGRpZG4ndCBjaGVjayB0aGUgRlRQCiAgIHNlcnZlcnMgcmV0dXJuIGNvZGUgcHJvcGVybHkgYWZ0ZXIgdGhlIC0tcXVvdGUgY29tbWFuZHMgd2VyZSBpc3N1ZWQuIEl0CiAgIHRvb2sgYW55dGhpbmcgbm9uIDIwMCBhcyBhbiBlcnJvciwgd2hlbiBhbGwgMlhYIGNvZGVzIHNob3VsZCBiZSBhY2NlcHRlZCBhcwogICBPSy4KCiAtIFNlbmRpbmcgY29va2llcyB0byB0aGUgc2FtZSBzaXRlIGluIG11bHRpcGxlIGxpbmVzIGxpa2UgY3VybCB1c2VkIHRvIGRvCiAgIHR1cm5lZCBvdXQgdG8gYmUgYmFkIGFuZCBicmVha2luZyB0aGUgY29va2llIHNwZWNzLiBDdXJsIG5vdyBzZW5kcyBhbGwKICAgY29va2llcyBvbiBhIHNpbmdsZSBDb29raWU6IGxpbmUuIEN1cmwgaXMgbm90IHlldCBSRkMgMjEwOSBjb21wbGlhbnQsIGJ1dCBJCiAgIGRvdWJ0IHRoYXQgbWFueSBzZXJ2ZXJzIGRvIHVzZSB0aGF0IHN5bnRheCAoeWV0KS4KCiBEYW5pZWwgKDggU2VwdGVtYmVyIDE5OTkpCiAtIEr2cm4gaGVscGVkIG1lIG1ha2Ugc3VyZSBpdCBzdGlsbCBjb21waWxlcyBuaWNlbHkgd2l0aCBtaW5ndzMyIHVuZGVyIHdpbjMyLgoKIERhbmllbCAoNyBTZXB0ZW1iZXIgMTk5OSkKIC0gRlRQIHVwbG9hZCB0aHJvdWdoIHByb3h5IGlzIG5vdyB0dXJuZWQgaW50byBhIEhUVFAgUFVULiBSZXF1ZXN0ZWQgYnkKICAgU3RlZmFuIEthbnRoYWsuCgogLSBBZGRlZCB0aGUgbGRhcCBmaWxlcyB0byB0aGUgLm0zMiBtYWtlZmlsZS4KCiBEYW5pZWwgKDMgU2VwdGVtYmVyIDE5OTkpCiAtIE1hZGUgY29va2llIG1hdGNoaW5nIHdvcmsgd2hpbGUgdXNpbmcgSFRUUCBwcm94eS4KCiBCam9ybiBSZWVzZSAoMzEgQXVndXN0IDE5OTkpCiAtIFBhc3NlZCBoaXMgbGRhcDovLyBwYXRjaC4gTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgdGhlIG9wZW5sZGFwIHNoYXJlZAogICBsaWJyYXJ5IHRvIGJlIGluc3RhbGxlZCBhbmQgdGhhdCBMRF9MSUJSQVJZX1BBVEggcG9pbnRzIHRvIHRoZQogICBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYiB3aWxsIGJlIGZvdW5kIHdoZW4gY3VybCBpcyBydW4gd2l0aCBhCiAgIGxkYXA6Ly8gVVJMLgoKIEr2cm4gSGFydHJvdGggKDMxIEF1Z3VzdCAxOTk5KQogLSBNYWRlIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBpbnRvIHNpbmdsZSBmaWxlcy4KIC0gTWFkZSBmaWxlOi8vIHdvcmsgZm9yIFdpbjMyLiBUaGUgc2FtZSBjb2RlIGlzIG5vdyB1c2VkIGZvciB1bml4IGFzIHdlbGwgZm9yCiAgIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgogRG91Z2xhcyBFLiBXZWdzY2hlaWQgKDMwIEF1Z3VzdCAxOTk5KQogLSBQYXRjaGVkIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBmb3IgU1NMIGJ1aWxkcy4KCiBNYXR0aGV3IENsYXJrZSAoMzAgQXVndXN0IDE5OTkpCiAtIE1hZGUgYSBjb29sIHBhdGNoIGZvciBjb25maWd1cmUuaW4gdG8gYWxsb3cgLS13aXRoLXNzbCB0byBzcGVjaWZ5IHRoZQogICByb290IGRpciBvZiB0aGUgb3BlbnNzbCBpbnN0YWxsYXRpb24sIGFzIGluCgogICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1zc2w9L3Vzci9zc2xfaGVyZQoKIC0gQ29ycmVjdGVkIHRoZSAncmVjb25mJyBzY3JpcHQgdG8gd29yayBiZXR0ZXIgd2l0aCBzb21lIHNoZWxscy4KCiBK9nJuIEhhcnRyb3RoICgyNiBBdWd1c3QgMTk5OSkKIC0gRml4ZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGluIGxpYi8gYW5kIGNvcnJlY3RlZCB0aGUgZmlsZS5jIGZvciB3aW4zMgogICBjb21waWxlcy4KClZlcnNpb24gNS4xMQoKIERhbmllbCAoMjUgQXVndXN0IDE5OTkpCiAtIEpvaG4gV2Vpc21pbGxlciBwb2ludGVkIG91dCBhIGJ1ZyBpbiB0aGUgaGVhZGVyLWxpbmUKICAgcmVhbGxvYygpIHN5c3RlbSBpbiBkb3dubG9hZC5jLgoKIC0gSSBhZGRlZCBsaWIvZmlsZS5bY2hdIHRvIG9mZmVyIGEgZmlyc3QsIHNpbXBsZSwgZmlsZTovLyBzdXBwb3J0LiBJdAogICBwcm9iYWJseSB3b24ndCBkbyBtdWNoIGdvb2Qgb24gd2luMzIgc3lzdGVtIGF0IHRoaXMgcG9pbnQsIGJ1dCBJIHNlZSBpdAogICBhcyBhIHN0YXJ0LgoKIC0gTWFkZSB0aGUgcmVsZWFzZSBhcmNoaXZlcyBnZXQgYSBNYWtlZmlsZSBpbiB0aGUgcm9vdCBkaXIsIHdoaWNoIGNhbiBiZQogICB1c2VkIHRvIHN0YXJ0IHRoZSBjb21waWxpbmcvYnVpbGRpbmcgcHJvY2VzcyBlYXNpZXIuIEkgaGF2ZW4ndCByZWFsbHkKICAgY2hhbmdlZCBhbnkgSU5TVEFMTCB0ZXh0IHlldCwgSSB3YW50ZWQgdG8gZ2V0IHNvbWUgZmVlZC1iYWNrIG9uIHRoaXMKICAgZmlyc3QuCgogRGFuaWVsICgxNyBBdWd1c3QgMTk5OSkKIC0gQW5vdGhlciBMb2NhdGlvbjogYnVnLiBDdXJsIGRpZG4ndCBkbyBwcm9wZXIgcmVsYXRpdmUgbG9jYXRpb25zIGlmIHRoZQogICBvcmlnaW5hbCBVUkwgaGFkIGNnaS1wYXJhbWV0ZXJzIHRoYXQgY29udGFpbmVkIGEgc2xhc2guIE51c3UncyBwYWdlCiAgIGFnYWluLgoKIC0gQ29ycmVjdGVkIHRoZSBOT19QUk9YWSB1c2FnZS4gSXQgaXMgYSBsaXN0IG9mIHN1YnN0cmluZ3MgdGhhdCBpZiBvbmUgb2YKICAgdGhlbSBtYXRjaGVzIHRoZSB0YWlsIG9mIHRoZSBob3N0IG5hbWUgaXQgc2hvdWxkIGNvbm5lY3QgdG8sIGN1cmwgc2hvdWxkCiAgIG5vdCB1c2UgYSBwcm94eSB0byBjb25uZWN0IHRoZXJlLiBQb2ludGVkIG91dCB0byBtZSBieSBEb3VnbGFzCiAgIEUuIFdlZ3NjaGVpZC4gIEkgYWxzbyBjaGFuZ2VkIHRoZSBSRUFETUUgdGV4dCBhIGxpdHRsZSByZWdhcmRpbmcgdGhpcy4KCiBEYW5pZWwgKDE2IEF1Z3VzdCAxOTk5KQogLSBGaXhlZCBhIG1lbW9yeSBidWcgd2l0aCBodHRwLXNlcnZlcnMgdGhhdCBzZW50IExvY2F0aW9uOiB0byBhIExvY2F0aW9uOgogICBwYWdlLiBOdXN1J3MgcGFnZSBzaG93ZWQgdGhpcyB0b28uCgogLSBNYWRlIGNvb2tpZXMgd29yayBhIGxvdCBiZXR0ZXIuIFNldHRpbmcgdGhlIHNhbWUgY29va2llIG5hbWUgc2V2ZXJhbCB0aW1lcwogICB1c2VkIHRvIGFkZCBtb3JlIGNvb2tpZXMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlIGZvcm1lciBvbmUgd2hpY2ggaXQKICAgc2hvdWxkJ3ZlLiBOdXN1IDxudXMgYXQgaW50ZXJnb3JqLnJvPiBicm91Z2h0IG1lIGFuIFVSTCB0aGF0IG1hZGUgdGhpcwogICBwYWluZnVsbHkgdmlzaWJsZS4uLgoKIFRyb3kgKDE1IEF1Z3VzdCAxOTk5KQogLSBCcm91Z2h0IG5ldyAuc3BlYyBmaWxlcyBhcyB3ZWxsIGFzIGEgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0aGF0IGxldHMgdGhlCiAgIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCB0aGUgb3BlbnNzbCBmaWxlcyBiZXR0ZXIsIGV2ZW4gd2hlbiB0aGUgaW5jbHVkZQogICBmaWxlcyBhcmUgaW4gL3Vzci9pbmNsdWRlL29wZW5zc2wKClZlcnNpb24gNS4xMAoKIERhbmllbCAoMTMgQXVndXN0IDE5OTkpCiAtIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKCkgaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIDAuOS40IHZlcnNpb24gb2YKICAgT3BlblNTTC4gTm93IHdoeSBjb3VsZG4ndCB0aGV5IHNpbXBseSBhZGQgYSAqbmV3KiBmdW5jdGlvbiBpbnN0ZWFkIG9mCiAgIG1vZGlmeWluZyB0aGUgcGFyYW1ldGVycyBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIGZ1bmN0aW9uPyBUaGlzIHdheSwgd2UgZ2V0CiAgIGEgY29tcGlsZXIgd2FybmluZyBpZiBjb21waWxpbmcgd2l0aCAwLjkuNCBidXQgbm90IHdpdGggZWFybGllci4gU28sIEkgaGFkCiAgIHRvIGNvbWUgdXAgd2l0aCBhICNpZiBjb25zdHJ1Y3Rpb24gdGhhdCBkZWFscyB3aXRoIHRoaXMuLi4KCiAtIE1hZGUgY3VybCBvdXRwdXQgdGhlIFNTTCB2ZXJzaW9uIG51bWJlciBnZXQgZGlzcGxheWVkIHByb3Blcmx5IHdpdGggMC45LjQuCgogVHJveSAoMTIgQXVndXN0IDE5OTkpCiAtIEFkZGVkIE1pbmdXMzIgKEdDQy0yLjk1KSBzdXBwb3J0IHVuZGVyIFdpbjMyLiBUaGUgSU5TVEFMTCBmaWxlIHdhcyBhbHNvCiAgIGEgYml0IHJlYXJyYW5nZWQuCiAKIERhbmllbCAoMTIgQXVndXN0IDE5OTkpCiAtIEkgaGFkIHRvIGNvcHkgYSBnb29kIDxhcnBhL3RlbG5ldC5oPiBpbmNsdWRlIGZpbGUgaW50byB0aGUgY3VybCBzb3VyY2UKICAgdHJlZSB0byBlbmFibGUgdGhlIHNpbGx5IHdpbjMyIHN5c3RlbXMgdG8gY29tcGlsZS4gVGhlIGRpc3RyaWJ1dGlvbiByaWdodHMKICAgYWxsb3dzIHVzIHRvIGRvIHRoYXQgYXMgbG9uZyBhcyB0aGUgZmlsZSByZW1haW5zIHVubW9kaWZpZWQuCgogLSBJIGNvcnJlY3RlZCBhIGZldyBtaW5vciB0aGluZ3MgdGhhdCBtYWRlIHRoZSBjb21waWxlciBjb21wbGFpbiB3aGVuCiAgIC1XYWxsIC1wZWRhbnRpYyB3YXMgdXNlZC4KCiAtIEknbSBtb3ZpbmcgdGhlIG9mZmljaWFsIGN1cmwgd2ViIHBhZ2UgdG8gaHR0cDovL2N1cmwuaGF4eC5udS4gSSB0aGluayBpdAogICB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHJlbWVtYmVyIGFzIGl0IGlzIGEgbG90IHNob3J0ZXIgYW5kIGxlc3MgY3J5cHRpYy4KICAgVGhlIG9sZCBvbmUgc3RpbGwgd29ya3MgYW5kIHNob3dzIHRoZSBzYW1lIGluZm8uCgogRGFuaWVsICgxMSBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWlsZWQgbWUgYW5vdGhlciBjb3JyZWN0aW9uIGZvciBOUk9GRiBpbiB0aGUKICAgY29uZmlndXJlLmluIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgYmV0dGVyIGZvciBJUklYIHVzZXJzLgoKIERhbmllbCAoMTAgQXVndXN0IDE5OTkpCiAtIEFsYmVydCBDaGluLUEtWW91bmcgaGVscGVkIG1lIHdpdGggc29tZSBzdHVwaWQgTWFrZWZpbGUgdGhpbmdzLCBhcyB3ZWxsIGFzCiAgIHNvbWUgZmlkZGxpbmcgd2l0aCB0aGUgZ2V0ZGF0ZS5jIHN0dWZmIHRoYXQgaGUgaGFkIHByb2JsZW1zIHdpdGggdW5kZXIKICAgSFAtVVggdjEwLiBnZXRkYXRlLnkgd2lsbCBub3cgYmUgY29tcGlsZWQgaW50byBnZXRkYXRlLmMgaWYgdGhlIGFwcHJvcHJpYXRlCiAgIHlhY2Mgb3IgYmlzb24gaXMgZm91bmQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIFNpbmNlIHRoaXMgaXMgc2xpZ2h0bHkgbmV3LAogICB3ZSBuZWVkIHRvIHRlc3QgdGhlIG91dHB1dCBnZXRkYXRlLmMgd2l0aCB3aW4zMiBzeXN0ZW1zIHRvIG1ha2Ugc3VyZSBpdAogICBzdGlsbCBjb21waWxlcyB0aGVyZS4KCiBEYW5pZWwgKDUgQXVndXN0IDE5OTkpCiAtIEkndmUganVzdCBzZXR1cCBhIG5ldyBtYWlsaW5nIGxpc3Qgd2l0aCB0aGUgaW50ZW50aW9uIHRvIGtlZXAgZGlzY3Vzc2lvbnMKICAgYXJvdW5kIGxpYmN1cmwgZGV2ZWxvcG1lbnQgaW4gaXQuIEkgbWFpbmx5IGV4cGVjdCBpdCB0byBiZSBmb3IgdGhvdWdodHMgYW5kCiAgIGJyYWluc3Rvcm1pbmcgYXJvdW5kIGEgIm5leHQgZ2VuZXJhdGlvbiIgbGlicmFyeSwgcmF0aGVyIHRoYW4gbml0cGlja2luZwogICBhYm91dCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvciBkZXRhaWxzIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCgogICBUbyBqb2luIG91ciBoYXBweSBidW5jaCBvZiBmdXR1cmUtbG9va2luZyBnZWVrcywgZW50ZXIgJ3N1YnNjcmliZQogICA8YWRkcmVzcz4nIGluIHRoZSBib2R5IG9mIGEgbWFpbCBhbmQgc2VuZCBpdCB0bwogICBsaWJjdXJsLXJlcXVlc3RAbGlzdHNlcnYuZnRzLmZyb250ZWMuc2UuICBDdXJsIGJ1ZyByZXBvcnRzLCB0aGUgdXN1YWwgY3VybAogICB0YWxrIGFuZCBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIHN0aWxsIGJlIGtlcHQgaW4gdGhpcyBtYWlsaW5nIGxpc3QuIEkndmUKICAgc3RhcnRlZCB0byBhcmNoaXZlIHRoaXMgbWFpbGluZyBsaXN0IGFuZCBoYXZlIHB1dCB0aGUgbGliY3VybCB3ZWIgcGFnZSBhdAogICB3d3cuZnRzLmZyb250ZWMuc2UvfmRhc3QvbGliY3VybC8uCgogLSBTdGVmYW4gS2FudGhhayBjb250YWN0ZWQgbWUgcmVnYXJkaW5nIGEgZmV3IHByb2JsZW1zIGluIHRoZSBjb25maWd1cmUKICAgc2NyaXB0IHdoaWNoIGhlIGRpc2NvdmVyZWQgd2hlbiB0cnlpbmcgdG8gbWFrZSBjdXJsIGNvbXBpbGUgYW5kIGJ1aWxkIHVuZGVyCiAgIFNpZW1lbnMgU0lOSVgtWiBWNS40MkIyMDA0IQoKIC0gTWFyY3VzIEtsZWluIHZlcnkgYWNjdXJhdGVseSBpbmZvcm1lZCBtZSB0aGF0IHNyYy92ZXJzaW9uLmggd2FzIG5vdCBwcmVzZW50CiAgIGluIHRoZSBDVlMgcmVwb3NpdG9yeS4gT2gsIGhvdyBzaWxseS4uLgoKIC0gTGludXMgTmllbHNlbiByZXdyb3RlIHRoZSB0ZWxuZXQ6Ly8gcGFydCBhbmQgbm93IGN1cmwgb2ZmZXJzIGxpbWl0ZWQgdGVsbmV0CiAgIHN1cHBvcnQuIElmIHlvdSBydW4gY3VybCBsaWtlICdjdXJsIHRlbG5ldDovL2hvc3QnIHlvdSdsbCBnZXQgYWxsIG91dHB1dCBvbgogICB0aGUgc2NyZWVuIGFuZCBjdXJsIHdpbGwgcmVhZCBpbnB1dCBmcm9tIHN0ZGluLiBZb3UnbGwgYmUgYWJsZSB0byBsb2dpbiBhbmQKICAgcnVuIGNvbW1hbmRzIGV0YywgYnV0IHNpbmNlIHRoZSBvdXRwdXQgaXMgYnVmZmVyZWQsIGV4cGVjdCB0byBnZXQgYSBsaXR0bGUKICAgd2VpcmQgb3V0cHV0LgoKICAgVGhpcyBpcyBzdGlsbCBpbiBpdHMgaW5mYW5jeSBhbmQgaXQgbWlnaHQgZ2V0IGNoYW5nZWQuIFdlIG5lZWQgeW91cgogICBmZWVkLWJhY2sgYW5kIGlucHV0IGluIGhvdyB0aGlzIGlzIGJlc3QgZG9uZS4KCiAgIFdJTjMyIE5PVEU6IEkgYmV0IHdlJ2xsIGdldCBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSBjdXJyZW50CiAgIGxpYi90ZWxuZXQuYyBvbiB3aW4zMiwgYnV0IEkgdGhpbmsgd2UgY2FuIHNvcnQgdGhlbSBvdXQgaW4gdGltZS4KCiAtIERhdmlkIFNhbmRlcnNvbiByZXBvcnRlZCB0aGF0IEZPUkNFX0FMTE9DQV9IIG9yIEhBVkVfQUxMT0NBX0ggbXVzdCBiZQogICBkZWZpbmVkIGZvciBnZXRkYXRlLmMgdG8gY29tcGlsZSBwcm9wZXJseSBvbiBIUC1VWCAxMS4wLiBJIHVwZGF0ZWQgdGhlCiAgIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIGFsbG9jYS5oIHdoaWNoIHNob3VsZCBtYWtlIGl0LgoKIERhbmllbCAoNCBBdWd1c3QgMTk5OSkKIC0gSSBmaW5hbGx5IGdvdCB0byB1bmRlcnN0YW5kIE1hcmN1cyBLbGVpbidzIGZ0cCBkb3dubG9hZCByZXN1bWUgcHJvYmxlbSwKICAgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGR1ZSB0byBkaWZmZXJlbnQgb3V0cHV0cyBmcm9tIGRpZmZlcmVudCBmdHAKICAgc2VydmVycy4gSXQgbWFrZXMgZnRwIGRvd25sb2FkIHJlc3VtaW5nIGEgbGl0dGxlIHRyaWNraWVyLCBidXQgSSd2ZSBtYWRlCiAgIHNvbWUgbW9kaWZpY2F0aW9ucyBJIHJlYWxseSBiZWxpZXZlIHdpbGwgd29yayBmb3IgbW9zdCBmdHAgc2VydmVycyBhbmQgSSBkbwogICBob3BlIHlvdSByZXBvcnQgaWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGlzIQoKIC0gQWRkZWQgdGV4dCBhYm91dCBmaWxlIHRyYW5zZmVyIHJlc3VtaW5nIHRvIFJFQURNRS5jdXJsLgoKIERhbmllbCAoMiBBdWd1c3QgMTk5OSkKIC0gQXBwbGllZCBhIHByb2dyZXNzLWJhciBwYXRjaCBmcm9tIExhcnMgSi4gQWFzLiBJdCBvZmZlcnMKICAgYSBuZXcgc3R5bGVkIHByb2dyZXNzIGJhciBlbmFibGVkIHdpdGggLSMvLS1wcm9ncmVzcy1iYXIuIAoKIFQuIFlhbWFkYSA8dGFpIGF0IGltYXN5Lm9yLmpwPiAoMzAgSnVseSAxOTk5KQogLSBJdCBicmVha3Mgd2l0aCBzZWdmYXVsdCB3aGVuIDEpIGN1cmwgaXMgdXNpbmcgLm5ldHJjIHRvIG9idGFpbgogICB1c2VybmFtZS9wYXNzd29yZCAob3B0aW9uICctbicpLCBhbmQgMikgaXMgYXV0b21hdGljYWxseSByZWRpcmVjdGVkIHRvCiAgIGFub3RoZXIgbG9jYXRpb24gKG9wdGlvbiAnLUwnKS4KCiAgIFRoZXJlIGlzIGEgc21hbGwgYnVnIGluIGxpYi91cmwuYyAoYmxvY2sgc3RhcnRpbmcgZnJvbSBsaW5lIDY0MSksIHdoaWNoCiAgIHRyaWVzIHRvIHRha2Ugb3V0IHVzZXJuYW1lL3Bhc3N3b3JkIGZyb20gdXNlci0gc3VwcGxpZWQgY29tbWFuZC1saW5lCiAgIGFyZ3VtZW50ICgnLXUnIG9wdGlvbikuIFRoaXMgYmxvY2sgaXMgbmV2ZXIgZXhlY3V0ZWQgb24gZmlyc3QgYXR0ZW1wdCBzaW5jZQogICBDT05GX1VTRVJQV0QgYml0IGlzbid0IHNldCBhdCBmaXJzdCwgYnV0IGN1cmwgbGF0ZXIgdHVybnMgaXQgb24gd2hlbiBpdAogICBjaGVja3MgZm9yIENPTkZfTkVUUkMgYml0LiBTbyB3aGVuIGN1cmwgdHJpZXMgdG8gcmVkbyBldmVyeXRoaW5nIGR1ZSB0bwogICByZWRpcmVjdGlvbiwgaXQgc2VnZmF1bHRzIHRyeWluZyB0byBhY2Nlc3MgKmRhdGEtPnVzZXJwd2QuCgpWZXJzaW9uIDUuOS4xCgogRGFuaWVsICgzMCBKdWx5IDE5OTkpCiAtIFN0ZXZlIFdhbGNoIHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhayBpbiB0aGUgZm9ybWRhdGEKICAgZnVuY3Rpb25zLiBJIGFkZGVkIGEgRm9ybUZyZWUoKSBmdW5jdGlvbiB0aGF0IGlzIG5vdyB1c2VkIGFuZCBzdXBwb3NlZCB0bwogICBjb3JyZWN0IHRoaXMgZmxhdy4KCiAtIE1hcmsgV290dG9uIHJlcG9ydGVkOgogICAnY3VybCAtTCBodHRwczovL3d3dy5jd2EuY29tLmF1LycgY29yZSBkdW1wcy4gIEkgbWFuYWdlZCB0byBjdXJlIHRoaXMgYnkKICAgY29ycmVjdGluZyB0aGUgY2xlYW51cCBwcm9jZWR1cmUuIFRoZSBidWcgc2VlbXMgdG8gYmUgZ29uZSB3aXRoIG15IE9wZW5TU0wKICAgMC45LjJiLCBhbHRob3VnaCBzdGlsbCBvY2N1cnMgd2hlbiBJIHJ1biB0aGUgfjEwMCB5ZWFycyBvbGQgU1NMZWF5IDAuOC4wLiBJCiAgIGRvbid0IGtub3cgd2hldGhlciBpdCBpcyBjdXJsIG9yIFNTTGVheSB0aGF0IGlzIHRvIGJsYW1lIGZvciB0aGF0LgoKIC0gTWFyY3VzIEtsZWluOgogICBSZXBvcnRlZCBhbiBGVFAgdXBsb2FkIHJlc3VtZSBidWcgdGhhdCBJIHJlYWxseSBjYW4ndCByZXBlYXQgbm9yIHVuZGVyc3RhbmQuCiAgIEkgbGVhdmUgaXQgaGVyZSBzbyB0aGF0IGl0IHdvbid0IGJlIGZvcmdvdHRlbi4KCiBEYW5pZWwgKDI5IEp1bHkgMTk5OSkKIC0gQ29zdHlhIFNodWx5dXBpbiBzdWdnZXN0ZWQgc3VwcG9ydCBmb3IgbG9uZ2VyIFVSTHMgd2hlbiBmb2xsb3dpbmcgTG9jYXRpb246CiAgIGFuZCBJIGNvdWxkIG9ubHkgYWdyZWUgYW5kIGZpeCBpdCEKCiAtIExlaWdoIFB1cmRpZSBmb3VuZCBhIHByb2JsZW0gaW4gdGhlIHVwbG9hZC9QT1NUIGRlcGFydG1lbnQuIEl0IHR1cm5lZCBvdXQKICAgdGhhdCBodHRwLmMgYWNjaWRlbnRhbHkgY2xlYXJlZCB0aGUgcG9pbnRlciBpbnN0ZWFkIG9mIHRoZSBieXRlIGNvdW50ZXIKICAgd2hlbiBzdXBwb3NlZCB0by4KCiAtIENvc3R5YSBTaHVseXVwaW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcG9ydCBudW1iZXJzIGFuZCBMb2NhdGlvbjouIElmCiAgIHlvdSBoYWQgYSBzZXJ2ZXIgYXQgYSBub24tc3RhbmRhcmQgcG9ydCB0aGF0IHJlZGlyZWN0ZWQgdG8gYW4gVVJMIHVzaW5nIGEKICAgc3RhbmRhcmQgcG9ydCBudW1iZXIsIGN1cmwgc3RpbGwgdXNlZCB0aGF0IGZpcnN0IHBvcnQgbnVtYmVyLgoKIC0gUmFscGggQmVja21hbm4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdoZW4gdXNpbmcgYm90aCBDT05GX0ZPTExPV0xPQ0FUSU9OCiAgIGFuZCBDT05GX0ZBSUxPTkVSUk9SIHNpbXVsdGFuZW91c2x5LiBTaW5jZSB0aGUgQ09ORl9GQUlMT05FUlJPUiBleGl0cyBvbgogICB0aGUgMzAyLWNvZGUgdGhhdCB0aGUgZm9sbG93IGxvY2F0aW9uIGhlYWRlciBvdXRwdXRzIGl0IHdpbGwgbmV2ZXIgc2hvdyBhbnkKICAgaHRtbCBvbiBsb2NhdGlvbjogcGFnZXMuIEkgaGF2ZSBub3cgbWFkZSBpdCBsb29rIGZvciA+PTQwMCBjb2RlcyBpZgogICBDT05GX0ZPTExPV0xPQ0FUSU9OIGlzIHNldC4KCiAtICdzdHJ1Y3Qgc2xpc3QnIGlzIG5vdyByZW5hbWVkIHRvICdzdHJ1Y3QgY3VybF9zbGlzdCcgKGFzIHN1Z2dlc3RlZCBieSBSYWxwaAogICBCZWNrbWFubikuCgogLSBKb3NodWEgU3dpbmsgYW5kIFJpY2sgV2VseWtvY2h5IHdlcmUgdGhlIGZpcnN0IHRvIHBvaW50IG91dCB0byBtZSB0aGF0IHRoZQogICBsYXRlc3QgT3BlblNTTCBwYWNrYWdlIG5vdyBoYXZlIG1vdmVkIHRoZSBzdGFuZGFyZCBpbmNsdWRlIHBhdGguIEl0IGlzIG5vdwogICBpbiAvdXNyL2xvY2FsL3NzbC9pbmNsdWRlL29wZW5zc2wgYW5kIEkgaGF2ZSBub3cgbW9kaWZpZWQgdGhlIC0tZW5hYmxlLXNzbAogICBvcHRpb24gZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIHVzZSB0aGF0IGFzIHRoZSBwcmltYXJ5IHBhdGgsIGFuZCBJCiAgIGxlYXZlIHRoZSBmb3JtZXIgcGF0aCB0b28gdG8gd29yayB3aXRoIG9sZGVyIHBhY2thZ2VzIG9mIE9wZW5TU0wgdG9vLgoKIERhbmllbCAoOSBKdW5lIDE5OTkpCiAtIEkgZmluYWxseSB1bmRlcnN0b29kIHRoZSBJUklYIHByb2JsZW0gYW5kIG5vdyBpdCBzZWVtIHRvIGNvbXBpbGUgb24gaXQhCiAgIEkgYW0gZ29ubmEgcmVtb3ZlIHRob3NlICNkZWZpbmUgc3RyY2FzZWNtcCgpIHRoaW5ncyBvbmNlIGFuZCBmb3IgYWxsIG5vdy4KCiBEYW5pZWwgKDQgSnVuZSAxOTk5KQogLSBJIGFkanVzdGVkIHRoZSBGVFAgcmVwbHkgMjI3IHBhcnNlciB0byBtYWtlIHRoZSBQQVNWIGNvbW1hbmQgd29yayBiZXR0ZXIKICAgd2l0aCBtb3JlIGZ0cCBzZXJ2ZXJzLiBBcHBlYXJhbnRseSB0aGUgUm94ZW4gQ2hhbGxhbmdlciBzZXJ2ZXIgcmVwbGllZAogICBzb21ldGhpbmcgY3VybCA1LjkgY291bGQgZGVhbCB3aXRoISA6LSggUmVwb3J0ZWQgYnkgQXNobGV5IFJlaWQtTW9udGFuYXJvCiAgIGFuZCBNYXJrIEJ1dGxlciBicm91Z2h0IGEgc29sdXRpb24gZm9yIGl0LgoKIERhbmllbCAoMjYgTWF5IDE5OTkpCiAtIFJlYXJyYW5nZWQuIFJFQURNRSBpcyBuZXcsIHRoZSBvbGQgb25lIGlzIG5vdyBSRUFETUUuY3VybCBhbmQgSSBhZGRlZCBhCiAgIFJFQURNRS5saWJjdXJsIHdpdGggdGV4dCBJIGdvdCBmcm9tIFJhbHBoIEJlY2ttYW5uLgoKIC0gSSBhbHNvIHVwZGF0ZWQgdGhlIElOU1RBTEwgdGV4dC4KCiBEYW5pZWwgKDI1IE1heSAxOTk5KQogLSBEYXZpZCBKb25hdGhhbiBMb3dza3kgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgY3VybCBkaWRuJ3QgcHJvcGVybHkgZGVhbAogICB3aXRoIGZvcm0gcG9zdGluZyB3aGVyZSB0aGUgdmFyaWFibGUgc2hvdWxkbid0IGhhdmUgYW55IGNvbnRlbnQsIGFzIGluIGN1cmwKICAgLUYgImZvcm09IiB3d3cuc2l0ZS5jb20uIEl0IHdhcyBub3cgZml4ZWQuCgpWZXJzaW9uIDUuOQoKIERhbmllbCAoMjIgTWF5IDE5OTkpCiAtIEkndmUgZ290IGEgYnVnIHJlcG9ydCBmcm9tIEFhcm9uIFNjYXJpc2JyaWNrIGluIHdoaWNoIGhlIHN0YXRlcyBoZSBoYXMgc29tZQogICBwcm9ibGVtcyB3aXRoIC1MIHVuZGVyIEZyZWVCU0QgMy4wLiBJIGhhdmUgcHJldmlvdXNseSBnb3QgYW5vdGhlciBidWcKICAgcmVwb3J0IGZyb20gU3RlZmFuIEdyZXRoZXIgd2hpY2ggcG9pbnRzIGF0IGFuIGVycm9yIHdpdGggc2ltaWxhciBzeW1wdGhvbXMKICAgd2hlbiB1c2luZyB3aW4zMi4gSSBtYWRlIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcgdXJsIHN0cmluZyBhIGJpdCBmYXN0ZXIKICAgYW5kIGRpZmZlcmVudCwgZG9uJ3Qga25vdyBpZiBpdCBhY3R1YWxseSBpbXByb3ZlcyBhbnl0aGluZyB0aG91Z2guLi4KCiBEYW5pZWwgKDIwIE1heSAxOTk5KQogLSBNYWRlIHRoZSBjb29raWUgcGFyc2VyIGRlYWwgd2l0aCBDUkxGIG5ld2xpbmVzIHRvby4KCiBEYW5pZWwgKDE5IE1heSAxOTk5KQogLSBEb3dubG9hZCgpIGRpZG4ndCBwcm9wZXJseSBkZWFsIHdpdGggZmFpbGluZyByZXR1cm4gY29kZXMgZnJvbSB0aGUgc3JlYWQoKQogICBmdW5jdGlvbi4gQWRhbSBDb3luZSBmb3VuZCB0aGUgcHJvYmxlbSBpbiB0aGUgd2luMzIgdmVyc2lvbiwgYW5kIFRyb3kgRW5nZWwKICAgaGVscGVkIG1lIG91dCBpc29sYXRpbmcgaXQuCgogRGFuaWVsICgxNiBNYXkgMTk5OSkKIC0gUmljaGFyZCBBZGFtcyBwb2ludGVkIG91dCBhIGJ1ZyBJIGludHJvZHVjZWQgaW4gNS44LiAtLWR1bXAtaGVhZGVyIGRvZXNuJ3QKICAgd29yayBhbnltb3JlISA6LS8gSSBmaXhlZCBpdCBub3cuCgogLSBBZnRlciBhIHN1Z2dlc3Rpb24gYnkgSm9zaHVhIFN3aW5rIEkgYWRkZWQgLVMgLyAtLXNob3ctZXJyb3IgdG8gZm9yY2UgY3VybAogICB0byBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgYW4gZXJyb3IsIGV2ZW4gaWYgLXMvLS1zaWxlbnQgd2FzCiAgIHVzZWQuCgogRGFuaWVsICgxMCBNYXkgMTk5OSkKIC0gSSBtb3ZlZCB0aGUgc3R1ZmYgY29uY2VybmluZyBIVFRQLCBESUNUIGFuZCBURUxORVQgaXQgdGhlaXIgb3duIHNvdXJjZQogICBmaWxlcyBub3cuIEl0IGlzIGEgYmVnaW5uaW5nIG9uIG15IGNsZWFuLXVwIG9mIHRoZSBzb3VyY2VzIHRvIG1ha2UgdGhlbQogICBsYXllciBhbGwgdGhvc2UgcHJvdG9jb2xzIGJldHRlciB0byBlbmFibGUgbW9yZSB0byBiZSBhZGRlZCBlYXNpZXIgaW4gdGhlCiAgIGZ1dHVyZSEKCiAtIExlb24gQnJlZWR0IHNlbnQgbWUgc29tZSBmaWxlcyBJJ3ZlIG5vdCBwdXQgaW50byB0aGUgbWFpbiBjdXJsCiAgIGFyY2hpdmUuIFRoZXkncmUgZm9yIGNyZWF0aW5nIHRoZSBEZWJpYW4gcGFja2FnZSB0aGluZ2llLiBIZSBhbHNvIHNlbnQgbWUgYQogICBkZWJpYW4gcGFja2FnZSB0aGF0IEkndmUgbWFkZSBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGF0IHRoZSB3ZWIgcGFnZQoKIERhbmllbCAoOSBNYXkgMTk5OSkKIC0gTWFkZSBpdCBjb21waWxlIG9uIGN5Z3dpbiB0b28uCgogVHJveSBFbmdlbCAoNyBNYXkgMTk5OSkKIC0gQnJvdWdodCBhIHNlcmllcyBvZiBwYXRjaGVzIHRvIGFsbG93IGN1cmwgdG8gY29tcGlsZSBzbW9vdGhseSBvbiBNU1ZDKysgNgogICBhZ2FpbiEKCiBEYW5pZWwgKDYgTWF5IDE5OTkpCiAtIEkgY2hhbmdlZCB0aGUgI2lmZGVmIEhBVkVfU1RSRlRJTUUgcGxhY2VtZW50IGZvciB0aGUgLXogY29kZSBzbyB0aGF0IGl0CiAgIHdpbGwgYmUgZWFzaWVyIHRvIGRpc2NvdmVyIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoYXQgZnVuY3Rpb24gYW5kIHRodXMKICAgY2FuJ3QgdXNlIC16IHN1Y2Nlc3NmdWxseS4gTWFkZSB0aGUgc3RyZnRpbWUoKSBnZXQgdXNlZCBpZiBXSU4zMiBpcyBkZWZpbmVkCiAgIHRvby4KClZlcnNpb24gNS44CgogRGFuaWVsICg1IE1heSAxOTk5KQogLSBJJ3ZlIGhhZCBpdCB3aXRoIHRoaXMgYXV0b2NvbmYvYXV0b21ha2UgbWVzcy4gSXQgc2VlbXMgdG8gd29yayBhbGxyaWdodAogICBmb3IgbW9zdCBwZW9wbGUgd2hvIGRvbid0IGhhdmUgYXV0b21ha2UgaW5zdGFsbGVkLCBidXQgZm9yIHRob3NlIHdobyBoYXZlCiAgIHRoZXJlIGFyZSBwcm9ibGVtcyBhbGwgb3Zlci4KCiAgIEkndmUgZ290IGxpa2UgZml2ZSBkaWZmZXJlbnQgYnVnIHJlcG9ydHMgb24gdGhpcyBvbmx5IHRoZSBsYXN0CiAgIHdlZWsuLi4gQ2xhdWRpbyBOZXZlcyBhbmQgRmVkZXJpY28gQmlhbmNoaSBhbmQgcm9vdCA8ZHVnZ2VyajAwMSBhdAogICBoYXdhaWkucnIuY29tPiBhcmUgc29tZSBvZiB0aGVtIHJlcG9ydGluZyB0aGlzLgoKICAgQ3VycmVudGx5LCBJIGhhdmUgbm8gcmVhbGx5IGdvb2QgZml4IHNpbmNlIEkgd2FudCB0byB1c2UgYXV0b21ha2UgbXlzZWxmIHRvCiAgIGdlbmVyYXRlIHRoZSBNYWtlZmlsZS5pbiBmaWxlcy4gSSd2ZSBmb3VuZCBvdXQgdGhhdCB0aGUgQFNIRUxMQC1wcm9ibGVtcwogICBjYW4gb2Z0ZW4gYmUgZml4ZWQgYnkgbWFudWFsbHkgaW52b2tpbmcgJ2F1dG9tYWtlJyBpbiB0aGUgYXJjaGl2ZSByb290CiAgIGJlZm9yZSB5b3UgcnVuIC4vY29uZmlndXJlLi4uIEkndmUgaGFja2VkIG15IG1ha2V0Z3ogc2NyaXB0IG5vdyB0byBmaWRkbGUKICAgYSBiaXQgd2l0aCB0aGlzIGFuZCBteSB0ZXN0cyBzZWVtIHRvIHdvcmsgYmV0dGVyIHRoYW4gYmVmb3JlIGF0IGxlYXN0IQoKIERhbmllbCAoNCBNYXkgMTk5OSkKIC0gbWtoZWxwLnBsIGhhcyBiZWVuIGRvaW5nIGJhZGx5IGxhdGVseS4gSSBjb3JyZWN0ZWQgYSBjYXNlIHByb2JsZW0gaW4KICAgdGhlIHJlZ2V4ZXMuCgogLSBJJ3ZlIG5vdyByZW1hZGUgdGhlIC1vIG9wdGlvbiB0byBub3QgdG91Y2ggdGhlIGZpbGUgdW5sZXNzIGl0IG5lZWRzIHRvLgogICBJIGhhZCB0byBkbyB0aGlzIHRvIG1ha2UgLXogb3B0aW9uIHJlYWxseSBmaW5lLCBzaW5jZSBub3cgeW91IGNhbiBtYWtlIGEKICAgY3VybCBmZXRjaCBhbmQgdXNlIGEgbG9jYWwgY29weSdzIHRpbWUgd2hlbiBkb3dubG9hZGluZyB0byB0aGF0IGZpbGUsIGFzCiAgIGluOgoKICAgICAgICBjdXJsIC16IGR1bXAgLW8gZHVtcCByZW1vdGUuc2l0ZS5jb20vZmlsZS5odG1sCgogICBUaGlzIHdpbGwgb25seSBnZXQgdGhlIGZpbGUgaWYgdGhlIHJlbW90ZSBvbmUgaXMgbmV3ZXIgdGhhbiB0aGUgbG9jYWwuCiAgIEknbSBhd2FyZSB0aGF0IHRoaXMgYWx0ZXJzIHByZXZpb3VzIGJlaGF2aW91ciBhIGxpdHRsZS4gU29tZSBzY3JpcHRzIG91dAogICB0aGVyZSBtYXkgZGVwZW5kIG9uIHRoYXQgdGhlIGZpbGUgaXMgYWx3YXlzIHRvdWNoZWQuLi4KCiAtIENvcnJlY3RlZCBhIGJ1ZyBpbiB0aGUgU1NMdjIvdjMgc2VsZWN0aW9uLgoKIC0gRmVsaXggdm9uIExlaXRuZXIgcmVxdWVzdGVkIHRoYXQgY3VybCBzaG91bGQgYmUgYWJsZSB0byBzZW5kCiAgICJJZi1Nb2RpZmllZC1TaW5jZSIgaGVhZGVycywgd2hpY2ggaW5kZWVkIGlzIGEgZmFpciBpZGVhLiAgSSBpbXBsZW1lbnRlZCBpdAogICByaWdodCBhd2F5ISBUcnkgLXogPGV4cHJlc3Npb24+IHdoZXJlIGV4cHJlc3Npb24gaXMgYSBmdWxsIEdOVSBkYXRlCiAgIGV4cHJlc3Npb24gb3IgYSBmaWxlIG5hbWUgdG8gZ2V0IHRoZSBkYXRlIGZyb20hCgogU3RlcGhhbiBMYWdlcmhvbG0gKDMwIEFwciAxOTk5KQogLSBQb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCB0aGUgc3JjL01ha2VmaWxlIGZvciBGcmVlQlNELiBUaGUgUk0gdmFyaWFibGUKICAgaXNuJ3Qgc2V0IGFuZCBjYXVzZXMgdGhlIG1ha2UgdG8gZmFpbC4KCiBEYW5pZWwgKDI2IEFwcmlsIDE5OTkpCiAtIEFtIEkgc2lsbHkgb3Igd2hhdD8gSXJ2aW5nIFdvbGZlIHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgdGhlIGN1cmwgdmVyc2lvbgogICBudW1iZXIgd2FzIG5vdCBzZXQgcHJvcGVybHkuIEhhc24ndCBiZWVuIHNpbmNlIDUuNi4gVGhpcyB3YXMgZHVlIHRvIGEgYnVnCiAgIGluIG15IG1ha2V0Z3ogc2NyaXB0IQoKIERhdmlkIEVyaWtzc29uICgyNSBBcHIgMTk5OSkKIC0gRm91bmQgYSBidWcgaW4gY29va2llcy5jIHRoYXQgbWFkZSBpdCBjcmFzaCBhdCB0aW1lcy4KClZlcnNpb24gNS43LjEKCiBEb3VnIEthdWZtYW4gKDIzIEFwciAxOTk5KQogLSBCcm91Z2h0IHR3byBzdW5vcyA0IGZpeGVzLiBPbmUgb2YgdGhlbSBiZWluZyB0aGUgaG9zdGlwLmMgZml4IG1lbnRpb25lZAogICBiZWxvdyBhbmQgdGhlIG90aGVyIG9uZSBhIGNvcnJlY3Rpb24gaW4gaW5jbHVkZS9zdGRjaGVhZGVycy5oCgogLSBBZGRlZCBhIHBhcmFncmFwaCBhYm91dCBjb21waWxpbmcgd2l0aCB0aGUgVVMtdmVyc2lvbiBvZiBvcGVuc3NsIHRvIHRoZQogICBJTlNUQUxMIGZpbGUuCgogRGFuaWVsCiAtIE5ldyBtYWlsaW5nIGxpc3QgYWRkcmVzcy4gSW5mbyB1cGRhdGVkIG9uIHRoZSB3ZWIgcGFnZSBhcyB3ZWxsIGFzIGluIHRoZQogICBSRUFETUUgZmlsZQoKIEdyZWcgT251ZmVyICgyMCBBcHIgMTk5OSkKIC0gaG9zdGlwLmMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgb24gU3VuT1MgNS41LjEuCiAgIEl0IG5lZWRzIGFuICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KClZlcnNpb24gNS43CgogRGFuaWVsIChBcHIgMjAgMTk5OSkKIC0gRGVjaWRlZCB0byB1cGxvYWQgYSBub24tYmV0YSB2ZXJzaW9uIHJpZ2h0IG5vdyEKCiAtIE1hZGUgY3VybCBzdXBwb3J0IGFueS1sZW5ndGggSFRUUCBoZWFkZXJzLiBUaGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIG5vdwogICBzaW1wbHkgZW5sYXJnZWQgZXZlcnkgdGltZSBpdCB0dXJucyBvdXQgdG8gYmUgdG9vIHNtYWxsIQoKIC0gQWRkZWQgdGhlIEZBUSBmaWxlIHRvIHRoZSBhcmNoaXZlLiBTdGlsbCBhIGJpdCBzbWFsbGlzaCwgYnV0IGl0IGlzIGEKICAgc3RhcnQuCgogRXJpYyBUaGVsaW4gKDE1IEFwciAxOTk5KQogLSBNYWRlIC1EIGFjY2VwdCAnLScgaW5zdGVhZCBvZiBmaWxlbmFtZSB0byB3cml0ZSB0byBzdGRvdXQuCgpWZXJzaW9uIDUuNi4zYmV0YQoKIERhbmllbCAoQXByIDEyIDE5OTkpCgogLSBDaGFuZ2VkIHR3byAjaWZkZWYgV0lOMzIgdG8gYmV0dGVyICNpZmRlZiA8ZXJyb3Jjb2RlPiB3aGVuIGNvbm5lY3QoKWluZwogICBpbiB1cmwuYyBhbmQgZnRwLmMuIE1ha2VzIGN5Z3dpbjMyIGRlYWwgd2l0aCB0aGVtIGJldHRlciB0b28uIFdlIHNob3VsZAogICB0cnkgdG8gZ2V0IHNvbWUgZGVjZW50IHdpbjMyLXJlcGxhY2VtZW50IHRoZXJlLiBBbnlvbmU/CgogLSBUaGUgb2xkIC0zLy0tY3JsZiBvcHRpb24gaXMgbm93IE9OTFkgLS1jcmxmIQoKIC0gSSBjaGFuZ2VkIHRoZSAiU1NMIGZpeCIgdG8gYSBtb3JlIGxhbWUgb25lLCBidXQgdGhhdCBkb2Vzbid0IHJlbW92ZSBhcwogICBtdWNoIGZ1bmN0aW9uYWxpdHkuIE5vdyBJJ3ZlIGVuYWJsZWQgdGhlIGxpYiB0byBzZWxlY3Qgd2hhdCBTU0wgdmVyc2lvbiBpdAogICBzaG91bGQgdHJ5IGZpcnN0LiBBcHBlYXJhbnRseSBzb21lIG9sZGVyIFNTTC1zZXJ2ZXJzIGRvbid0IGxpa2Ugd2hlbiB5b3UKICAgdGFsayB2MyB3aXRoIHRoZW0gc28geW91IG5lZWQgdG8gYmUgYWJsZSB0byBmb3JjZSBjdXJsIHRvIHRhbGsgdjIgZnJvbSB0aGUKICAgc3RhcnQuIFRoZSBmaXggZGF0ZWQgQXByaWwgNiBhbmQgcG9zdGVkIG9uIHRoZSBtYWlsaW5nIGxpc3QgZm9yY2VkIGN1cmwgdG8KICAgdXNlIHYyIGF0IGFsbCB0aW1lcyB1c2luZyBhIG1vZGVybiBPcGVuU1NMIHZlcnNpb24sIGJ1dCB3ZSBkb24ndCByZWFsbHkKICAgd2FudCBzdWNoIGEgY3JpcHBsZWQgc29sdXRpb24uCiAKIC0gTWFyYyBCb3VjaGVyIHNlbnQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBhIG1hdGggZXJyb3IgZm9yIHRoZQogICAiQ3Vyci5TcGVlZCIgcHJvZ3Jlc3MgbWV0ZXIuCgogLSBFcmljIFRoZWxpbiBzZW50IG1lIGEgcGF0Y2ggdGhhdCBlbmFibGVzICctSyAtJyB0byByZWFkIGEgY29uZmlnIGZpbGUgZnJvbQogICBzdGRpbi4KCiAtIEkgZm91bmQgb3V0IHdlIGRpZG4ndCBjbG9zZSB0aGUgZmlsZSBwcm9wZXJseSBiZWZvcmUgc28gSSBhZGRlZCBpdCEKCiBEYW5pZWwgKEFwciA5IDE5OTkpCiAtIFl1IFhpbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBmdHAgZG93bmxvYWQgcmVzdW1lLiAgSXQgZGlkbid0IHdvcmsgYXQKICAgYWxsISA7LU8KCiBEYW5pZWwgKEFwciA2IDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgdmVyc2lvbiBzdHJpbmcgcGFydCBnZW5lcmF0ZWQgZm9yIHRoZSBTU0wgdmVyc2lvbi4KCiAtIEkgZm91bmQgYSB3YXkgdG8gbWFrZSBzb21lIG90aGVyIFNTTCBwYWdlIHdvcmsgd2l0aCBvcGVuc3NsIDAuOS4xKyB0aGF0CiAgIHByZXZpb3VzbHkgZGlkbid0IChzc2xlYXkgMC44LjAgd29ya3Mgd2l0aCBpdCB0aG91Z2ghKS4gVHJ5aW5nIHRvIGdldAogICBzb21lIHJlYWwgaW5mbyBmcm9tIHRoZSBPcGVuU1NMIGd1eXMgdG8gc2VlIGhvdyBJIHNob3VsZCBkbyB0byBiZWhhdmUgdGhlCiAgIGJlc3Qgd2F5LiBTU0xlYXkgMC44LjAgc2hvdWxkbid0IGJlIHRoYXQgbXVjaCBpbiB1c2UgYW55d2F5IHRoZXNlIGRheXMhCgpWZXJzaW9uIDUuNi4yYmV0YQoKIERhbmllbCAoQXByIDQgMTk5OSkKIC0gRmluYWxseSBoYXZlIGN1cmwgbW9yZSBjb29raWUgImF3YXJlIi4gTm93IHJlYWQgY2FyZWZ1bGx5LiBUaGlzIGlzIGhvdwogICBpdCB3b3Jrcy4KICAgVG8gbWFrZSBjdXJsIHJlYWQgY29va2llcyBmcm9tIGFuIGFscmVhZHkgZXhpc3RpbmcgZmlsZSwgaW4gcGxhaW4gaGVhZGVyLQogICBmb3JtYXQgKGxpa2UgZnJvbSB0aGUgaGVhZGVycyBvZiBhIHByZXZpb3VzIGZldGNoKSBpbnZva2UgY3VybCB3aXRoIHRoZQogICAtYiBmbGFnIGxpa2U6CgogICAgICAgIGN1cmwgLWIgZmlsZSBodHRwOi8vc2l0ZS9mb28uaHRtbAoKICAgQ3VybCB3aWxsIHRoZW4gdXNlIGFsbCBjb29raWVzIGl0IGZpbmRzIG1hdGNoaW5nLiBUaGUgb2xkIHN0eWxlIHRoYXQgc2V0cwogICBhIHNpbmdsZSBjb29raWUgd2l0aCAtYiBpcyBzdGlsbCBzdXBwb3J0ZWQgYW5kIGlzIHVzZWQgaWYgdGhlIHN0cmluZwogICBmb2xsb3dpbmcgLWIgaW5jbHVkZXMgYSAnPScgbGV0dGVyLCBhcyBpbiAiLWIgbmFtZT1kYW5pZWwiLgoKICAgVG8gbWFrZSBjdXJsIHJlYWQgdGhlIGNvb2tpZXMgc2VudCBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbG9jYXRpb246ICh3aGljaAogICBzaXRlcyBvZnRlbiBkbykgcG9pbnQgY3VybCB0byByZWFkIGEgbm9uLWV4aXN0aW5nIGZpbGUgYXQgZmlyc3QgKGkuZQogICB0byBzdGFydCB3aXRoIG5vIGV4aXN0aW5nIGNvb2tpZXMpLCBsaWtlOgoKICAgICAgICBjdXJsIC1iIG5vd2hlcmUgaHR0cDovL3NpdGUvc2V0Y29va2llYW5kcmVsb2NhdGUuaHRtbAoKIC0gQWRkZWQgYSBwYXJhZ3JhcGggaW4gdGhlIFRPRE8gZmlsZSBhYm91dCB0aGUgU1NMIHByb2JsZW1zIHJlY2VudGx5CiAgIHJlcG9ydGVkLiBFdmlkZW50bHksIHNvbWUga2luZCBvZiBTU0wtcHJvYmxlbSBjdXJsIG1heSBuZWVkIHRvIGFkZHJlc3MuCgogLSBCZXR0ZXIgIkxvY2F0aW9uOiIgZm9sbG93aW5nLgoKIERvdWdsYXMgRS4gV2Vnc2NoZWlkIChUdWUsIDMwIE1hciAxOTk5KQogLSBBIHN1YnNlY29uZCBkaXNwbGF5IHBhdGNoLgoKIERhbmllbCAoTWFyIDE0IDE5OTkpCiAtIEkndmUgc2VwYXJhdGVkIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsaWJjdXJsIGFuZCBjdXJsIG5vdy4gVG8gbWFrZQogICB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyLCBJIGRlY2lkZWQgdG8gc3RhcnQgdGhlIGN1cmwgbnVtYmVyaW5nIGZyb20KICAgNS42IGFuZCB0aGUgZm9ybWVyIHZlcnNpb24gbnVtYmVyIGtub3duIGFzICJjdXJsIiBpcyBub3cgdGhlIG9uZQogICBzZXQgZm9yIGxpYmN1cmwuCgogLSBSZW1vdmVkIHRoZSAnZW5hYmxlLW5vLXBhc3MnIGZyb20gY29uZmlndXJlLCBJIGRvdWJ0IGFueW9uZSB3YW50ZWQKICAgdGhhdC4KCiAtIE1hZGUgbG90cyBvZiB0aW55IGFkanVzdG1lbnRzIHRvIGNvbXBpbGUgc21vb3RobHkgd2l0aCBjeWd3aW4gdW5kZXIKICAgd2luMzIuIEl0J3MgYSBraWxsZXIgZm9yIHBvcnRpbmcgdGhpcyB0byB3aW4zMiwgYnllIGJ5ZSBWQysrISA7LSkKICAgQ29tcGlsZXMgYW5kIGJ1aWxkcyBvdXQtb2YtdGhlLWJveCBub3cuIFNlZSB0aGUgbmV3IHdvcmRpbmdzIGluCiAgIElOU1RBTEwgZm9yIGRldGFpbHMuCgogLSBCZWdpbm5pbmcgZXhwZXJpbWVudHMgd2l0aCBkb3dubG9hZGluZyBtdWx0aXBsZSBkb2N1bWVudCBmcm9tIGEgaHR0cAogICBzZXJ2ZXIgd2hpbGUgcmVtYWluaW5nIGNvbm5lY3RlZC4KClZlcnNpb24gNS42YmV0YQoKIERhbmllbCAoTWFyIDEzIDE5OTkpCiAtIFNpbmNlIEkndmUgY2hhbmdlZCBzbyBtdWNoLCBJIHRob3VnaHQgSSdkIGp1c3QgZ28gYWhlYWQgYW5kIGltcGxlbWVudCB0aGUKICAgc3VnZ2VzdGlvbiBmcm9tIERvdWdsYXMgRS4gV2Vnc2NoZWlkLiAtRCBvciAtLWR1bXAtaGVhZGVyIGlzIG5vdyBzdG9yaW5nCiAgIEhUVFAgaGVhZGVycyBzZXBhcmF0ZWx5IGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAtIEFkZGVkIG5ldyB0ZXh0IHRvIElOU1RBTEwgb24gd2hhdCB0byBkbyB0byBidWlsZCB0aGlzIG9uIHdpbjMyIG5vdy4KCiAtIEFhYXJnaC4gSSBoYWQgdG8gdGFrZSBhIHN0ZXAgYmFjayBhbmQgcHJlZml4IHRoZSBzaGFyZWQgI2luY2x1ZGUgZmlsZXMKICAgaW4gdGhlIHNvdXJjZXMgd2l0aCAiLi4vaW5jbHVkZS8iIHRvIHBsZWFzZSBWQysrLi4uCgogRGFuaWVsIChNYXIgMTIgMTk5OSkKIC0gU3BsaXQgdGhlIHVybC5jIHNvdXJjZSBpbnRvIG1hbnkgdGlueSBzb3VyY2VzIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkKICAgYW5kIHNtYWxsZXIgc2l6ZS4KCiBEYW5pZWwgKE1hciAxMSAxOTk5KQogLSBTdGFydGVkIHRvIGNoYW5nZSBzdHVmZiBmb3IgYSBtb3ZlIHRvIG1ha2UgbGliY3VybCBhbmQgYSBtb3JlIHNlcGFyYXRlCiAgIGN1cmwgYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoZSBsaWJjdXJsLiBNYWRlIHRoZSBsaWJjdXJsIHNvdXJjZXMgaW50bwogICB0aGUgbmV3IGxpYiBkaXJlY3Rvcnkgd2hpbGUgdGhlIGN1cmwgYXBwbGljYXRpb24gd2lsbCByZW1haW4gaW4gc3JjIGFzCiAgIGJlZm9yZS4gTmV3IG1ha2VmaWxlcywgYWRqdXN0ZWQgY29uZmlndXJlIHNjcmlwdCBhbmQgc28uCgogICBsaWJjdXJsLmEgYnVpbHQgcXVpY2tseSBhbmQgZWFzaWx5LiBJIGJldHRlciBtYWtlIGEgYmV0dGVyIGludGVyZmFjZSB0bwogICB0aGUgbGliIGZ1bmN0aW9ucyB0aG91Z2guCgogICBUaGUgbmV3IHJvb3QgZGlyIGluY2x1ZGUvIGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdGhlIHB1YmxpYyBpbmZvcm1hdGlvbgogICBhYm91dCB0aGUgbmV3IGxpYmN1cmwuIEl0IGlzIGEgbGl0dGxlIHVnbHkgc28gZmFyIDotKQoKCiBEYW5pZWwgKE1hciAxIDE5OTkpCiAtIFRvZGQgS2F1Zm1hbm4gc2VudCBtZSBhIGdvb2QgbGluayB0byBOZXRzY2FwZSdzIGNvb2tpZSBzcGVjIGFzIHdlbGwgYXMgdGhlCiAgIGluZm8gdGhhdCBSRkMgMjEwOSBzcGVjaWZpZXMgaG93IHRvIHVzZSB0aGVtLiAgVGhlIGxpbmsgaXMgbm93IGluIHRoZQogICBSRUFETUUgYW5kIHRoZSBSRkMgaW4gdGhlIFJFU09VUkNFUy4KCiBEYW5pZWwgKEZlYiAyMyAxOTk5KQogLSBGaW5hbGx5IG1hZGUgY29uZmlndXJlIGFjY2VwdCAtLXdpdGgtc3NsIHRvIGxvb2sgZm9yIFNTTCBsaWJzIGFuZCBpbmNsdWRlcwogICBpbiB0aGUgInN0YW5kYXJkIiBwbGFjZSAvdXNyL2xvY2FsL3NzbC4uLgoKIERhbmllbCAoRmViIDIyIDE5OTkpCiAtIFZlcmlmaWVkIHRoYXQgY3VybCBsaW5rZWQgZmluZSB3aXRoIE9wZW5TU0wgMC45LjFjIHdoaWNoIHNlZW1zIHRvIGJlCiAgIHRoZSBtb3N0IHJlY2VudC4KCiBIZW5yaSBHb21leiAoRnJpIEZlYiAgNSAxOTk5KQogLSBTZW50IGluIGFuIHVwZGF0ZWQgY3VybC1zc2wuc3BlYy4gSSBzdGlsbCBtaXNzIHRoZSBzY3JpcHQgdGhhdCBidWlsZHMgYW4KICAgUlBNIGF1dG9tYXRpY2FsbHkuLi4KClZlcnNpb24gNS41LjEKCiBNYXJrIEJ1dGxlciAoMjcgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCBwcm9ibGVtcyBpbiBEb3dubG9hZCgpLgoKIERhbml0ZWwgU3RlbmJlcmcgKDI1IEphbiAxOTk5KQogLSBKZXJlbWllIFBldGl0IHBvaW50ZWQgb3V0IGEgZmV3IGZsYXdzIGluIHRoZSBzb3VyY2UgdGhhdCBwcmV2ZW50ZWQgaXQgZnJvbQogICBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoZSBuYXRpdmUgY29tcGlsZXIgdW5kZXIgRGlnaXRhbCBVbml4IHY0LjBkLgoKVmVyc2lvbiA1LjUKCiBEYW5pZWwgU3RlbmJlcmcgKDE1IEphbiAxOTk5KQogLSBBZGRlZCBCam9ybnMgc21hbGwgdGV4dCB0byB0aGUgUkVBRE1FIGFib3V0IHRoZSBESUNUIHByb3RvY29sLgoKIERhbmllbCBTdGVuYmVyZyAoMTEgSmFuIDE5OTkpCiAtIDxqc3dpbmsgYXQgc29mdGNvbS5uZXQ+IHJlcG9ydGVkIGFib3V0IHRoZSB3aW4zMi12ZXJzaW9pbjogIkRvZXNuJ3QgdXNlCiAgIEFMTF9QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZSIuIFR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSBvZiB0aGUgc3RhdGljLQogICBidWZmZXIgbmF0dXJlIG9mIHRoZSB3aW4zMiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYWxscyEKCiBCam9ybiBSZWVzZSAoMTAgSmFuIDE5OTkpCiAtIEkgaGF2ZSBhdHRhY2hlZCBhIHNpbXBsZSBhZGRpdGlvbiBmb3IgdGhlIERJQ1QgcHJvdG9jb2wgKFJGQyAyMjI5KS4KICAgSXQgcGVyZm9ybXMgZGljdGlvbmFyeSBsb29rdXBzLiBUaGUgb3V0cHV0IHN0aWxsIG5lZWRzIHRvIGJlIGJldHRlcgogICBmb3JtYXR0ZWQuCgogICBUbyB0ZXN0IGl0IHRyeSAodGhlIGV4YWN0IGZvcm1hdCwgYW5kIG1vcmUgZXhhbXBsZXMgYXJlIGRlc2NyaWJlZCBpbgogICB0aGUgUkZDKQoKICAgICAgICBkaWN0Oi8vZGljdC5vcmcvbTpoZWxsbwogICAgICAgIGRpY3Q6Ly9kaWN0Lm9yZy9tOmhlbGxvOjpzb3VuZGV4CgoKIFZpY2VudGUgR2FyY2lhICgxMCBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSBwcm9ncmVzcyBtZXRlciBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMjBNQi4KCiBEYW5pZWwgU3RlbmJlcmcgKDcgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgLXQgYW5kIC1UIGhlbHAgdGV4dHMuIFRoZXkgY2xhaW1lZCB0byBiZSBGVFAgb25seS4KClZlcnNpb24gNS40CgogRGFuaWVsIFN0ZW5iZXJnCiAoNyBKYW4gMTk5OSkKIC0gSXJ2aW5nIFdvbGZlIHJlcG9ydGVkIHRoYXQgY3VybCAtcyBkaWRuJ3QgYWx3YXlzIHN1cHJlc3MgdGhlIHByb2dyZXNzCiAgIHJlcG9ydGluZy4gSXQgd2FzIHRoZSBmb3JtIHBvc3QgdGhhdCBhdXRvYW10aWNhbGx5IGFsd2F5cyBzd2l0Y2hlZCBpdCBvbgogICBhZ2Fpbi4gVGhpcyBpcyBub3cgY29ycmVjdGVkIQoKICg0IEphbiAxOTk5KQogLSBBbmRyZWFzIEtvc3R5cmthIHN1Z2dlc3RlZCBJJ2QgYWRkIFBVVCBhbmQgaGUgaGVscGVkIG1lIG91dCB0byB0ZXN0IGl0LiBJZgogICB5b3UgdXNlIC10IG9yIC1UIG5vdyBvbiBhIGh0dHAgb3IgaHR0cHMgc2VydmVyLCBQVVQgd2lsbCBiZSB1c2VkIGZvciBmaWxlCiAgIHVwbG9hZC4KCiAgIEkgcmVtb3ZlZCB0aGUgZm9ybWVyIHVzZSBvZiAtVCB3aXRoIEhUVFAuIEkgZG91YnQgYW55b25lIGV2ZXIgcmVhbGx5IHVzZWQKICAgdGhhdC4KCiAoNCBKYW4gMTk5OSkKIC0gRXJpayBKYWNvYnNlbiBmb3VuZCBhIHdpZHRoIGJ1ZyBpbiB0aGUgbXByaW50ZigpIGZ1bmN0aW9uLiAgSSBjb3JyZWN0ZWQgaXQKICAgbm93LgoKICg0IEphbiAxOTk5KQogLSBBcyBKb2huIFYuIENob3cgcG9pbnRlZCBvdXQgdG8gbWUsIGN1cmwgYWNjZXB0ZWQgdmVyeSBsaW1pdGVkIFVSTCBzaXplcy4gSXQKICAgc2hvdWxkIG5vdyBhY2NlcHQgcGF0aCBwYXJ0cyB0aGF0IGFyZSB1cCB0byBhdCBsZWFzdCA0MDk2IGJ5dGVzLgoKIC0gU29tZWhvdyBJIHNjcmV3ZWQgdXAgd2hlbiBhcHBseWluZyB0aGUgQUlYIGZpeCBmcm9tIEdpbGJlcnQgUmFtaXJleiwgc28KICAgSSByZWRpZCB0aGF0IG5vdy4KClZlcnNpb24gNS4zYSAod2luMzIgb25seSkKCiBUcm95IEVuZ2VsCiAtIENvcnJlY3RlZCBhIHdpbjMyIGJ1ZyBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgcGFydC4KClZlcnNpb24gNS4zCgogR2lsYmVydCBSYW1pcmV6IEpyLiAoMjEgRGVjIDE5OTgpCiAtIEkgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgInF1b3RlIiBmdW5jdGlvbiBvZiBGVFAgY2xpZW50cy4gSXQgYWxsb3dzIHlvdSB0bwogICBzZW5kIGFyYml0cmFyeSBjb21tYW5kcyB0byB0aGUgcmVtb3RlIEZUUCBzZXJ2ZXIuIEkgY2hvc2UgdGhlIC1RLy0tcXVvdGUKICAgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KCiAgIFlvdSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHF1b3RlZCBzdHJpbmcsIGFuZCBjdXJsIHdpbGwgYXBwbHkgdGhlbSBpbgogICBvcmRlci4gIFRoaXMgaXMgd2hhdCBJIHVzZSBmb3IgbXkgTVZTIHVwbG9hZDoKCiAgY3VybCAtQiAtLWNybGYgLVEgInNpdGUgbHJlY2w9ODAiIC1RICJzaXRlIGJsaz04MDAwIiAtVCBmaWxlIGZ0cDovL29zMzkwL3Rlc3QKCiAgIEN1cmwgd2lsbCBzZW5kIHRoZSB0d28gcXVvdGVkICJzaXRlIiBjb21tYW5kcyBpbiB0aGUgcHJvcGVyIG9yZGVyLgoKIC0gTWFkZSBpdCBjb21waWxlIHNtb290aGx5IG9uIEFJWC4KCiBHaWxiZXJ0IFJhbWlyZXogSnIuICgxOCBEZWMgMTk5OCkKIC0gQnJvdWdodCBhbiBNVlMgcGF0Y2g6IC0zLy0tbXZzLCBmb3IgZnRwIHVwbG9hZCB0byB0aGUgTVZTIGZ0cCBzZXJ2ZXIuCgogVHJveSBFbmdlbCAoMTcgRGVjIDE5OTgpCiAtIEJyb3VnaHQgYSBjb3JyZWN0aW9uIHRoYXQgZml4ZXMgdGhlIHdpbjMyIGN1cmwgYnVnLgoKIERhbmllbCBTdGVuYmVyZwogLSBBIGJ1ZywgcG9pbnRlZCBvdXQgdG8gbWUgYnkgRHIgSC4gVC4gTGV1bmcsIGNhdXNlZCBjdXJsIHRvIGNyYXNoIG9uIHRoZSAtQQogICBmbGFnIG9uIGNlcnRhaW4gc3lzdGVtcy4gQWN0dWFsbHksIGFsbCBzeXN0ZW1zIHNob3VsZCd2ZSEKCiAtIEFkZGVkIGEgZmV3IGRlZmluZXMgdG8gbWFrZSBkaXJlY3Rvcmllcy9maWxlIG5hbWVzIGdldCBidWlsZCBuaWNlciAod2l0aCBfCiAgIGluc3RlYWQgb2YgLiBhbmQgXCBpbnN0ZWFkIG9mIC8gaW4gd2luMzIpLgoKIC0gc3RldmUgPGZpc2sgYXQgcG9sYXIuYm93ZG9pbi5lZHU+IHJlcG9ydGVkIGEgd2VpcmQgYnVnIHRoYXQgb2NjdXJlZCBpZiB0aGUKICAgZnRwIHNlcnZlciByZXNwb25zZSBsaW5lIGhhZCBhIHBhcmVudGhlc2lzIG9uIHRoZSBsaW5lIGJlZm9yZSB0aGUgKHNpemUpCiAgIGluZm8uIEkgaG9wZSBpdCB3b3JrcyBiZXR0ZXIgbm93IQoKVmVyc2lvbiA1LjIuMQoKIFN0ZXZlbiBHLiBKb2huc29uIChEZWMgMTQsIDE5OTgpCiAtIEJyb3VnaHQgYSBmaXggdGhhdCBjb3JyZWN0ZWQgYSBjcmFzaCBpbiA1LjIgZHVlIHRvIGJhZCB0cmVhdG1lbnQgb2YgdGhlCiAgIGVudmlyb25tZW50IHZhcmlhYmxlcy4KClZlcnNpb24gNS4yCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMTQsIDE5OTgpCiAtIFJld3JvdGUgdGhlIG1raGVscCBzY3JpcHQgYW5kIG5vdywgdGhlIG1raGVscC5wbCBzY3JpcHQgZ2VuZXJhdGVzIHRoZQogICBodWdlaGVscC5jIGZpbGUgZnJvbSB0aGUgUkVBRE1FICphbmQqIHRoZSBtYW4gcGFnZSBmaWxlIGN1cmwuMS4gQnkgdXNpbmcKICAgYm90aCBmaWxlcywgSSBubyBsb25nZXIgbmVlZCB0byBoYXZlIGRvdWJsZSBpbmZvcm1hdGlvbiBpbiBib3RoIHRoZSBtYW4KICAgcGFnZSBhbmQgdGhlIFJFQURNRSBhcyB3ZWxsLiBTbywgd2luMzItdXNlcnMgd2lsbCBvbmx5IGhhdmUgdGhlIGh1Z2VoZWxwLmMKICAgZmlsZSBmb3IgYWxsIGluZm8sIGJ1dCB0aGVuLCB0aGV5IGRvd25sb2FkIHRoZSBwbGFpbiBiaW5hcnkgbW9zdCB0aW1lcwogICBhbnl3YXkuCgogLSBnY2MyLjguMSB3aXRoIHRoZSAtV2FsbCBmbGFnIGNvbXBsYWludHMgYSBsb3Qgb24gc3Vic2NyaXB0IGhhcyB0eXBlIGBjaGFyJwogICBpZiBJIGRvbid0IGV4cGxpY2l0bHkgdHlwZWNhc3QgdGhlIGFyZ3VtZW50IHRvIGlzZGlnaXQoKSBvciBpc3NwYWNlKCkgdG8KICAgaW50LiBTbyBJIGRpZCB0byBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoYXQgdG9vLgoKIC0gQWRkZWQgY2hlY2tzIGZvciAnbG9uZyBkb3VibGUnIGFuZCAnbG9uZyBsb25nJyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4gSQogICBuZWVkIHRob3NlIGZvciB0aGUgbXByaW50Zi5jIHNvdXJjZSB0byBjb21waWxlIHdlbGwgb24gbm9uIGxvbmcgbG9uZwogICBjb21mb3JtaW5nIHN5c3RlbXMhCgpWZXJzaW9uIDUuMSAobm90IHB1YmxpY2x5IHJlbGVhc2VkKQoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDEwLCAxOTk4KQogLSBJIGdvdCBhIHJlcXVlc3QgZm9yIGEgcHJlLWNvbXBpbGVkIE5UIEFscGhhIHZlcnNpb24uIEFueW9uZT8KCiAtIEFkZGVkIEx5bngvQ0VSTiB3d3cgbGliIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlIHN1cHBvcnQuIFRoYXQgbWVhbnMgY3VybAogICBub3cgcmVhZHMgYW5kIHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgoKCUhUVFBfUFJPWFksIEhUVFBTX1BST1hZLCBGVFBfUFJPWFksIEdPUEhFUl9QUk9YWQoKICAgVGhleSBzaG91bGQgYmUgc2V0IGZvciBwcm90b2NvbC1zcGVjaWZpYyBwcm94aWVzLiBHZW5lcmFsIHByb3h5IHNob3VsZCBiZQogICBzZXQgd2l0aAoJCglBTExfUFJPWFkKCiAgIEFuZCBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGhvc3QgbmFtZXMgdGhhdCBzaG91bGRuJ3QgZ28gdGhyb3VnaCBhbnkKICAgcHJveHkgaXMgc2V0IGluIChvbmx5IGFuIGFzdGVyaXNrLCAnKicgbWF0Y2hlcyBhbGwgaG9zdHMpLgoKCU5PX1BST1hZCgogICBUaGUgdXNhZ2Ugb2YgdGhlIC14Ly0tcHJveHkgZmxhZyBvdmVycmlkZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KCiAtIFByb3h5IGNhbiBub3cgYmUgc3BlY2lmaWVkIHdpdGggYSBwcm9jb3RvbDovLyBwcmVmaXguCgogLSBXcm90ZSB0aGUgY3VybC4xIG1hbiBwYWdlLgoKIC0gSW50cm9kdWNlZCBhIHdob2xlIG5ldyBkeW5hbWljIGJ1ZmZlciBzeXN0ZW0gZm9yIGFsbCBzcHJpbnRmKClzLiBJdCBpcwogICBiYXNlZCBvbiB0aGUgKnByaW50ZigpIHBhY2thZ2UgYnkgeW91cnMgdHJ1bHkgYW5kIEJqb3JuIFJlZXNlLiBIb3BlZnVsbHksCiAgIHRoZXJlIGFyZW4ndCB0aGF0IG1hbnkgYnVmZmVyIG92ZXJmbG93IHJpc2tzIGxlZnQgbm93LgoKIC0gQWgsIEkgc2hvdWxkIG1lbnRpb24gSSd2ZSBjb21waWxlZCBhbmQgYnVpbHQgY3VybCBzdWNjZXNzZnVsbHkgdW5kZXIKICAgc29sYXJpcyAyLjYgd2l0aCBnY2Mgbm93LCBnY2MgMi43LjIgd29uJ3Qgd29yayBidXQgMi44LjEgZGlkIG9rLgoKIE9yZW4gVGlyb3NoIChEZWMgMywgMTk5OCkKIC0gQnJvdWdodCB0d28gLnNwZWMgZmlsZXMsIHRvIHVzZSB3aGVuIGNyZWF0aW5nIChMaW51eCkgUmVkaGF0IHN0eWxlIFJQTQogICBwYWNrYWdlcy4gVGhleSdyZSBuYW1lZCBjdXJsLnNwZWMgYW5kIGN1cmwtc3NsLnNwZWMuCgogVHJveSBFbmdlbAogLSBTdXBwbGllZCB0aGUgc3JjL01ha2VmaWxlLnZjNiBmb3IgZWFzeSBjb21waWxpbmcgd2l0aCBWQysrIHVuZGVyIFdpbjMyLgoKVmVyc2lvbiA1LjAKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxLCAxOTk4KQogLSBOb3QgYSBzaW5nbGUgYnVnIHJlcG9ydCBpbiBhZ2VzLgogLSBDb3JyZWN0ZWQgZ2V0cGFzcy5jIGFuZCBtYWluLmMgdG8gY29tcGlsZSB3YXJuaW5nIGFuZCBlcnJvciBmcmVlIHdpdGggdGhlCiAgIFdpbjMyIFZDKysgY3JhcC4KClZlcnNpb24gNS4wIGJldGEgMjQKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAyMCwgMTk5OCkKCiBIT1cgVE8gQlVJTEQgQSBSRUxFQVNFIEFSQ0hJVkU6CgogKiBQcmUtcmVxdWlzaXRlIHNvZnR3YXJlOgogICBXaGF0CQkgICAgIFRvIGJ1aWxkIHdoYXQgICAgICAgICAgICAgUmVhZHMgZGF0YSBmcm9tCiAgID09PT0gICAgICAgICAgICAgID09PT09PT09PT09PT0gICAgICAgICAgICAgPT09PT09PT09PT09PT09CiAgIEdOVSBhdXRvbWFrZSAgICAgIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00ICAgY29uZmlndXJlLmluCiAgICAgR05VIG1ha2UoMSkgICAgICAtICIgLQogICAgIEdOVSBnY2MoMSkgICAgICAgLSAiIC0KICAgR05VIGF1dG9jb25mICAgICAgY29uZmlndXJlICAgICAgICAgICAgICAgICBjb25maWd1cmUuaW4KICAgR05VIGF1dG9oZWFkZXIoMikgY29uZmlnLmguaW4JICAgICAgIGNvbmZpZ3VyZS5pbiwgYWNjb25maWcuaAoKICogTWFrZSBzdXJlIGFsbCBmaWxlcyB0aGF0IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBhcmNoaXZlIGFyZSBwdXQgaW4gRklMRVMuCgogKiBSdW4gJy4vbWFrZXRneicgYW5kIGVudGVyIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBuZXcgdG8gYmVjb21lIGFyY2hpdmUuCgogICBtYWtldGd6IGRvZXM6CgogICAtIEVudGVycyB0aGUgbmV3bHkgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBpbiB1cmwuaC4KICAgLSAoSWYgeW91IGRvbid0IGhhdmUgYXV0b21ha2UsIHRoaXMgc2NyaXB0IHdpbGwgd2FybiBhYm91dCB0aGF0LCBidXQgdW5sZXNzCiAgICAgeW91IGhhdmUgY2hhbmdlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMsIHRoYXQgaXMgbm90aGluZyB0byBjYXJlIGFib3V0LikKICAgICBJZiB5b3UgaGF2ZSBpdCwgaXQnbGwgcnVuIGl0LgogICAtIElmIHlvdSBoYXZlIGF1dG9jb25mLCB0aGUgY29uZmlndXJlLmluIHdpbGwgYmUgZWRpdGVkIHRvIGdldCB0aGUgbmV3bHkKICAgICBjcmVhdGVkIHZlcnNpb24gbnVtYmVyIGFuZCBhdXRvY29uZiB3aWxsIGJlIHJ1bi4KICAgLSBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBjdXJsLTx2ZXJzaW9uPi4gKEFjdHVhbGx5LCBpdCB1c2VzIHRoZSBiYXNlCiAgICAgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdXAgdG8gdGhlIGZpcnN0ICctJy4pCiAgIC0gQ29waWVzIGFsbCBmaWxlcyBtZW50aW9uZWQgaW4gRklMRVMgdG8gdGhlIG5ldyBkaXJlY3RvcnkuIFNhdmluZwogICAgIHBlcm1pc3Npb25zIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlLgogICAtIFVzZXMgdGFyIHRvIGNyZWF0ZSBhbiBhcmNoaXZlIG9mIGl0IGFsbCwgbmFtZWQgY3VybC08dmVyc2lvbj4udGFyLmd6CiAgIC0gZ3ppcHMgdGhlIGFyY2hpdmUKICAgLSBSZW1vdmVzIHRoZSBuZXcgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnRzLgoKICogV2hlbiBkb25lLCB5b3UgaGF2ZSBhbiBhcmNoaXZlIHN0b3JlZCBpbiB5b3VyIGRpcmVjdG9yeSBuYW1lZAogICBjdXJsLTx2ZXJzaW9uPi50YXIuZ3ouCgogICBEb25lIQoKICAgKDEpIFRoZXkncmUgcmVxdWlyZWQgdG8gbWFrZSBhdXRvbWFrZSBydW4gcHJvcGVybHkuCiAgICgyKSBJdCBpcyBkaXN0cmlidXRlZCBhcyBhIHBhcnQgb2YgdGhlIEdOVSBhdXRvY29uZiBhcmNoaXZlLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDE4LCAxOTk4KQogLSBJIGNoYW5nZWQgdGhlIFRBRy1zeXN0ZW0uIElmIHlvdSBldmVyIHVzZWQgdXJsZ2V0KCkgZnJvbSB0aGlzIHBhY2thZ2UgaW4KICAgYW5vdGhlciBwcm9kdWN0LCB5b3UgbmVlZCB0byByZWNvbXBpbGUgd2l0aCB0aGUgbmV3IGhlYWRlcnMuIEkgZGlkIHRoaXMKICAgbmV3IHN0dWZmIHRvIGJldHRlciBkZWFsIHdpdGggZGlmZmVyZW50IGNvbXBpbGVycyBhbmQgc3lzdGVtIHdpdGggZGlmZmVyZW50CiAgIHZhcmlhYmxlIHNpemVzLiBJIHRoaW5rIGl0IG1ha2VzIGl0IGEgbGl0dGxlIG1vcmUgcG9ydGFibGUuIFRoaXMgcHJvdmVzCiAgIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIHByb2JsZW1hdGljIElSSVggY29tcGlsZXIhCiAtIFdpbjMyIGNvbXBpbGVkIHdpdGggYSBzaWxseSBlcnJvci4gQ29ycmVjdGVkIG5vdy4KIC0gQnJpYW4gQ2hhcGxpbiByZXBvcnRlZCB5ZXQgYW5vdGhlciBwcm9ibGVtIGluCiAgIG11bHRpbGluZSBGVFAgcmVzcG9uc2VzLiBJJ3ZlIHRyaWVkIHRvIGNvcnJlY3QgaXQuIEkgbWFpbGVkIGhpbSBhIG5ldwogICB2ZXJzaW9uIGFuZCBJIGhvcGUgaGUgZ2V0cyBiYWNrIHNvb24gd2l0aCBwb3NpdGl2ZSBmZWVkYmFjayEKIC0gSW1wcm92ZWQgdGhlICdtYWtldGd6JyB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRyZWUgd2hpY2ggaXQgbWFrZXMKICAgYW4gYXJjaGl2ZSBmcm9tIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIHJlbmFtaW5nIG9mIHRoZSBjdXJyZW50IG9uZS4KIC0gTWFpbGluZyBsaXN0IG9wZW5lZCAoc2VlIFJFQURNRSkuCiAtIE1hZGUgLXYgbW9yZSB2ZXJib3NlIG9uIHRoZSBQQVNWIHNlY3Rpb24gb2YgZnRwIHRyYW5zZmVycy4gTm93IGl0IHRlbGxzCiAgIGhvc3QgbmFtZSBhbmQgSVAgb2YgdGhlIG5ldyBob3N0IChhbmQgcG9ydCBudW1iZXIpLiBJIGFsc28gYWRkZWQgYSBzZWN0aW9uCiAgIGFib3V0IFBPUlQgdnMgUEFTViBpbiB0aGUgUkVBRE1FLgoKVmVyc2lvbiA1LjAgYmV0YSAyMQoKIEFuZ3VzIE1hY2theSAoTm92IDE1LCAxOTk4KQogLSBJbnRyb2R1Y2VkIGF1dG9tYWtlIHN0dWZmLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEzLCAxOTk4KQogLSBKdXN0IG1hZGUgYSBzdWNjZXNzZnVsIEdFVCBvZiBhIGRvY3VtZW50IGZyb20gYW4gU1NMLXNlcnZlciB1c2luZyBteSBvd24KICAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZSBmb3IgYXV0aGVudGljYXRpb24hIFRoZSBjZXJ0aWZpY2F0ZSBoYXMgdG8gYmUgaW4gUEVNCiAgIGZvcm1hdC4gWW91IGRvIHRoYXQgdGhlIGVhc2llc3Qgd2F5IChhbHRob3VnaCBub3QgKnRoYXQqIGVhc3kpIGJ5CiAgIGRvd25sb2FkaW5nIHRoZSBTU0x5ZWF5IFBLQ1MjMTItcGF0Y2ggYnkgRHIgU3RlcGhlbiBOLiBIZW5zb24gZnJvbSBoaXMgc2l0ZQogICBhdDogaHR0cDovL3d3dy5kcmgtY29uc3VsdGFuY3kuZGVtb24uY28udWsvLiBVc2luZyBoaXMgdG9vbCwgeW91IGNhbgogICBjb252ZXJ0IGFueSBtb2Rlcm4gTmV0c2NhcGUgb3IgKGV2ZW4pIE1TSUUgY2VydGlmaWNhdGUgdG8gUEVNLWZvcm1hdC4gIFVzZQogICBpdCB3aXRoICdjdXJsIC1FIDxjZXJ0aWZpY2F0ZTpwYXNzd29yZD4gaHR0cHM6Ly9zaXRlLmNvbScuICBJZiB0aGlzIGlzbid0IGEKICAgY29vbCBmZWF0dXJlLCB0aGVuIEkgZG9uJ3Qga25vdyB3aGF0IGNvb2wgZmVhdHVyZXMgbG9vayBsaWtlISA7LSkKIC0gV29ya2luZyBzbG93bHkgb24gdGVsbmV0IGNvbm5lY3Rpb25zLiAjZGVmaW5lIFRSWV9URUxORVQgdG8gdHJ5IGl0IG91dC4KICAgKGN1cmwgLXUgdXNlcjpwYXNzd2QgInRlbG5ldDovL2hvc3QuY29tL2NhdCAubG9naW4iIGlzIG9uZSBleGFtcGxlKSBJIGRvCiAgIGhhdmUgcHJvYmxlbSB0byBkZWZpbmUgaG93IGl0IHNob3VsZCB3b3JrLiBUaGUgcHJpbWUgcHVycG9zZSBmb3IgdGhpcyBtdXN0CiAgIGJlIHRvIGdldCAoOGJpdCBjbGVhbikgZmlsZXMgdmlhIHRlbG5ldCwgYW5kIGl0IHJlYWxseSBpc24ndCB0aGF0IGVhc3kgdG8KICAgZ2V0IGZpbGVzIHRoaXMgd2F5LiBTdGlsbCBoYXZpbmcgcHJvYmxlbXMgd2l0aCBcbiBiZWluZyBjb252ZXJ0ZWQgdG8gXHJcbi4KCiBBbmd1cyBNYWNrYXkgKE5vdiAxMiwgMTk5OCkKIC0gQ29ycmVjdGVkIGFub3RoZXIgYnVnIGluIHRoZSBsb25nIHBhcmFtZXRlciBuYW1lIHBhcnNlci4KIC0gTW9kaWZpZWQgZ2V0cGFzcy5jIChOT1RFOiBzZWUgdGhlIHNwZWNpYWwgbGljZW5zaW5nIGluIHRoZSB0b3Agb2YgdGhhdAogICBzb3VyY2UgZmlsZSkuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTIsIDE5OTgpCiAtIFdlIG1heSBoYXZlIHJlbW92ZWQgdGhlIHNpbGx5IHdhcm5pbmdzIGZyb20gdXJsLmMgd2hlbiBjb21waWxlZCB1bmRlciBJUklYLgogICBUaGFua3MgYWdhaW4gdG8gQmpvcm4gUmVlc2UgYW5kIE1hcnRpbiBTdGFhZWwuCiAtIFdyb3RlIGZvcm1maW5kLnBsIHdoaWNoIGlzIGEgbmV3IHBlcmwgc2NyaXB0IGludGVuZGVkIHRvIGhlbHAgeW91IGZpbmQgb3V0CiAgIGhvdyBhIEZPUk0gc3VibWlzc2lvbiBzaG91bGQgYmUgZG9uZS4gVGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsgdG8gZ2V0CiAgIHJlYWxseSBnb29kLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDExLCAxOTk4KQogLSBNYWRlIHRoZSBIVFRQIGhlYWRlci1jaGVja2VyIGFjY2VwdCB3aGl0ZSBzcGFjZXMgYmVmb3JlIHRoZSBIVFRQLzEuPyBsaW5lLgogICBBcHBlYXJhbnRseSBzb21lIHByb3hpZXMvc2l0ZXMgYWRkIHN1Y2ggYXQgdGltZXMgKG15IHRlc3QgcHJveHkgZGlkIHdoZW4gSQogICBkb3dubG9hZGVkIGEgZ29waGVyIHBhZ2Ugd2l0aCBpdCkhCiAtIE1vdmVkIHRoZSBmb3JtZXIgLWggdG8gLU0gYW5kIG1hZGUgLWggc2hvdyB0aGUgc2hvcnQgaGVscCB0ZXh0IGluc3RlYWQuIEkKICAgaGFkIHRvIGVuYWJsZSBhIGZvcmNlZCBoZWxwIHRleHQgb3B0aW9uLiBOb3cgYW4gZXZlbiBzaG9ydGVyIGhlbHAgdGV4dCB3aWxsCiAgIGJlIHByZXNlbnRlZCB3aGVuIGFuIHVua25vd24gb3B0aW9uIGFuZCBzaW1pbGFyLCBpcyB1c2VkLgogLSBzdGRjaGVhZGVycy5oIGRpZG4ndCB3b3JrIHdpdGggSVJJWCA2LjQgbmF0aXZlIGNjIGNvbXBpbGVyLiBJIGhvcGUgbXkKICAgY2hhbmdlcyBkb24ndCBtYWtlIG90aGVyIHZlcnNpb25zIGdvIG51dHMgaW5zdGVhZC4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMCwgMTk5OCkKIC0gQWRkZWQgYSB3ZWlyZCBjaGVjayBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgdGhlIHNpbGx5IEFJWAogICB3YXJuaW5ncyBhYm91dCBteSAjZGVmaW5lIHN0cmNhc2VjbXAoKSBzdHVmZi4gSSBkbyB0aGF0IGRlZmluZSB0byBwcmV2ZW50CiAgIG1lIGFuZCBvdGhlciBjb250cmlidXRvcnMgdG8gYWNjaWRlbnRhbHkgdXNlIHRoYXQgZnVuY3Rpb24gbmFtZSBpbnN0ZWFkCiAgIG9mIHN0cmVxdWFsKCkuLi4KIC0gSSBidWdmaXhlZCBBbmd1cydzIGdldHBhc3MuYyB2ZXJ5IGxpdHRsZS4KIC0gRml4ZWQgdGhlIHZlcmJvc2UgZmxhZyBuYW1lcyB0byBnZXRvcHQtc3R5bGUsIGkuZSAnY3VybCAtLWxvYycgd2lsbCBiZQogICBzdWZmaWNpZW50IGluc3RlYWQgb2YgLS1sb2NhdGlvbiBhcyAibG9jIiBpcyBhIHVuaXF1ZSBwcmVmaXguIEFsc28sIGFueXRoaW5nCiAgIGFmdGVyIGEgJy0tJyBpcyB0cmVhdGVkIGFzIGFuIFVSTC4gU28gaWYgeW91IGRvIGhhdmUgYSBob3N0IHdpdGggYSB3ZWVlaXJkCiAgIG5hbWUgeW91IGNhbiBkbyAnY3VybCAtLSAtaG9zdC5jb20nLgogLSBBbm90aGVyIGdldG9wdC1hZGp1c3Q7IGN1cmwgbm93IGFjY2VwdHMgZmxhZ3MgYWZ0ZXIgdGhlIFVSTCBvbiB0aGUgY29tbWFuZAogICBsaW5lLiAnY3VybCB3d3cuZm9vLmNvbSAtTycgaXMgcGVyZmVjdGx5IHZhbGlkLgogLSBDb3JyZWN0ZWQgdGhlIC5jdXJscmMgcGFyc2VyIHNvIHRoYXQgc3RydG9rKCkgaXMgbm8gbG9uZ2VyIHVzZWQgYW5kIEkKICAgYmVsaWV2ZSBpdCB3b3JrcyBiZXR0ZXIuIEV2ZW4gVVJMcyBjYW4gYmUgc3BlY2lmaWVkIGluIGl0IG5vdy4KCiBBbmd1cyBNYWNrYXkgKE5vdiA5LCAxOTk4KQogLSBSZXBsYWNlZCBnZXRwYXNzLmMgd2l0aCBhIG5ld2x5IHdyaXR0ZW4gb25lLCBub3QgdW5kZXIgR1BMIGxpY2Vuc2UKIC0gQ2hhbmdlZCBPUyB0byBhICNkZWZpbmUgaW4gY29uZmlnLmggaW5zdGVhZCBvZiBjb21waWxlciBmbGFnCiAtIE1ha2VmaWxlIG5vdyB1c2VzIC1ESEFWRV9DT05GSUdfSAoKIERhbmllbCBTdGVuYmVyZyAoTm92IDksIDE5OTgpCiAtIE9rLCBJIGV4cGFuZGVkIHRoZSB0Z3otdGFyZ2V0IHRvIHVwZGF0ZSB0aGUgdmVyc2lvbiBzdHJpbmcgb24gZWFjaCBvY2NhdGlvbgogICBJIGJ1aWxkIGEgcmVsZWFzZSBhcmNoaXZlIQogLSBJIHJlYWN0ZWQgb24gQW5ndXMgTWFja2F5J3MgaW5pdGlhdGl2ZSBhbmQgcmVtYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2VyIHRvCiAgIGJlIG1vcmUgZ2V0b3B0IGNvbXBsaWFudC4gQ3VybCBub3cgc3VwcG9ydHMgIm1lcmdlZCIgZmxhZ3MgYXMgaW4gCgljdXJsIC1sc3YgZnRwLnNpdGUuY29tCiAgIERvIG5vdGUgdGhhdCBJIGhhZCB0byBtb3ZlIHRocmVlIHNob3J0LW5hbWVzIG9mIHRoZSBvcHRpb25zLiBQYXJhbWV0ZXJzCiAgIHRoYXQgbmVlZHMgYW4gYWRkaXRpb25hbCBzdHJpbmcgc3VjaCBhcyAteCBtdXN0IGJlIHN0YW5kLWFsb25lIG9yIHRoZQogICBsYXN0IGluIGEgbWVyZ2VkIHNlcXVlbmNlOgoJY3VybCAtbHN4IG15LXByb3h5IGZ0cC5zaXRlLmNvbQogICBpcyBvaywgYnV0IHVzaW5nIHRoZSBmbGFncyBpbiBhIGRpZmZlcmVudCBvcmRlciBsaWtlICctbHhzJyB3b3VsZCBjYXVzZQogICB1bmV4cGVjdGVkIHJlc3VsdHMgKGFzIHRoZSAncycgb3B0aW9uIHdvdWxkIGJlIHNraXBwZWQpLgogLSBJJ3ZlIGNoYW5nZWQgdGhlIGhlYWRlcnMgaW4gYWxsIGZpbGVzIHRoYXQgYXJlIHN1YmplY3QgdG8gdGhlIE1velBMCiAgIGxpY2Vuc2UsIGFzIHRoZXkgYXJlIHN1cHBvc2VkIHRvIGxvb2sgbGlrZSB3aGVuIGNvbmZvcm1pbmcuCiAtIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbWFrZSB0aGUgY29uZmlnLmguIFRoZSBmb3JtZXIgY29uZmlnLmggaXMgbm93CiAgIHNldHVwLmguCiAtIFRoZSBSRVNPVVJDRVMgYW5kIFRPRE8gZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgoKIEFuZ3VzIE1hY2theSAoTm92IDUsIDE5OTgpCiAtIEZpeGVkIGdldHBhc3MuYyBhbmQgdmFyaW91cyBjb25maWd1cmUgc3R1ZmYKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAzLCAxOTk4KQogLSBVc2UgLUgvLS1oZWFkZXIgZm9yIGN1c3RvbSBIVFRQLWhlYWRlcnMuIExldHMgeW91IHBhc3Mgb24geW91ciBvd24KICAgc3BlY2lmaWVkIGhlYWRlcnMgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuIEkgd291bGRuJ3QgcmVjb21tZW5kIHRyeWluZyB0byB1c2UKICAgYSBoZWFkZXIgd2l0aCBhIGRlZmluZWQgdXNhZ2UgYWNjb3JkaW5nIHRvIHN0YW5kYXJkcy4gVXNlIHRoaXMgZmxhZyBvbmNlCiAgIGZvciBldmVyeSBjdXN0b20gaGVhZGVyIHlvdSB3YW50IHRvIGFkZC4KIC0gVXNlIC1CLy0tZnRwLWFzY2lpIHRvIGZvcmNlIGZ0cCB0byB1c2UgQVNDSUkgbW9kZSB3aGVuIHRyYW5zZmVyaW5nIGZpbGVzLgogLSBDb3JyZWN0ZWQgdGhlICdnZXRsaW5rcy5wbCcgc2NyaXB0LCBJIGFjY2lkZW50YWxseSBsZWZ0IG15IHNpbGx5IHByb3h5CiAgIHVzYWdlIGluIHRoZXJlISBTaW5jZSB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSAuY3VybHJjIGZpbGUsIGl0IGlzIGVhc2llciB0bwogICB3cml0ZSBzY3JpcHRzIHRoYXQgdXNlIGN1cmwgc2luY2UgcHJveGllcyBhbmQgc3R1ZmYgc2hvdWxkIGJlIGluIHRoZQogICAuY3VybHJjIGZpbGUgYW55d2F5LgogLSBJbnRyb2R1Y2luZyB0aGUgbmV3IC1GIGZsYWcgZm9yIEhUVFAgUE9TVC4gSXQgc3VwcG9ydHMgbXVsdGlwYXJ0L2Zvcm0tZGF0YQogICB3aGljaCBtZWFucyBpdCBpcyBnb25uYSBiZSBwb3NzaWJsZSB0byB1cGxvYWQgZmlsZXMgZXRjIHRocm91Z2ggSFRUUCBQT1NULgogICBTaGlyYXogS2FuZ2EgYXNrZWQgZm9yIHRoZSBmZWF0dXJlIGFuZCBteSBicm90aGVyLAogICBCavZybiBTdGVuYmVyZyBoZWxwZWQgbWUgZGVzaWduIHRoZSB1c2VyCiAgIGludGVyZmFjZSBmb3IgdGhpcyBiZWFzdC4gIFRoaXMgZmVhdHVyZSByZXF1aXJlcyBxdWl0ZSBzb21lIGRvY3MsCiAgIHNpbmNlIGl0IGhhcyB0dXJuZWQgb3V0IG5vdCBvbmx5IHF1aXRlIGNhcGFibGUsIGJ1dCBhbHNvIGNvbXBsaWNhdGVkISA6LSkKIC0gQSBub3RlIGhlcmUsIHNpbmNlIEkndmUgcmVjZWl2ZWQgbWFpbCBhYm91dCBpdC4gU1NMZWF5IHZlcnNpb25zIHByaW9yIHRvCiAgIDAuOCB3aWxsICpub3QqIHdvcmsgd2l0aCBjdXJsIQogLSBXaWwgTGFuZ2ZvcmQgcmVwb3J0ZWQgYSBidWcgdGhhdCBvY2N1cnJlZCBzaW5jZSBjdXJsCiAgIGRpZCBub3QgcHJvcGVybHkgdXNlIENSTEYgd2hlbiBpc3N1aW5nIGZ0cCBjb21tYW5kcy4gSSBmaXhlZCBpdC4KIC0gUmVhcnJhbmdlZCB0aGUgb3JkZXIgY29uZmlnIGZpbGVzIGFyZSByZWFkLiAuY3VybHJjIGlzIG5vdyAqYWx3YXlzKiByZWFkCiAgIGZpcnN0IGFuZCBiZWZvcmUgdGhlIGNvbW1hbmQgbGluZSBmbGFncy4gLUsgY29uZmlnIGZpbGVzIHRoZW4gYWN0IGFzCiAgIGFkZGl0aW9uYWwgY29uZmlnIGl0ZW1zLgogLSBVc2UgLXEgQVMgVEhFIEZJUlNUIE9QVElPTiBzcGVjaWZpZWQgdG8gcHJldmVudCAuY3VybHJjIGZyb20gYmVpbmcgcmVhZC4KIC0gWW91IGNhbiBub3cgZGlzYWJsZSBhIHByb3h5IGJ5IHVzaW5nIC14ICIiLiBVc2VmdWwgaWYgdGhlIC5jdXJscmMgZmlsZQogICBzcGVjaWZpZXMgYSBwcm94eSBhbmQgeW91IHdhbm5hIGZldGNoIHNvbWV0aGluZyB3aXRob3V0IGdvaW5nIHRocm91Z2gKICAgdGhhdC4KIC0gSSdtIHRoaW5raW5nIG9mIGRyb3BwaW5nIHRoZSAtcCBzdXBwb3J0LiBJdHMgcmVhbGx5IG5vdCB1c2VmdWwgc2luY2UgcG9ydHMKICAgY291bGQgKGFuZCBzaG91bGQ/KSBiZSBzcGVjaWZpZWQgYXMgOjxwb3J0PiBhcHBlbmRlZCBvbiB0aGUgaG9zdCBuYW1lCiAgIGluc3RlYWQsIGJvdGggaW4gVVJMcyBhbmQgdG8gcHJveHkgaG9zdCBuYW1lcy4KIC0gTWFydGluIFN0YWFlbCByZXBvcnRzIGN1cmwgLUwgYnVncyB1bmRlciBXaW5kb3dzIE5UCiAgICh0ZXN0IHdpdGggVVJMIGh0dHA6Ly9jb21lLnRvL3Njc2RlKS4gVGhpcyBidWcgaXMgbm90IHByZXNlbnQgaW4gdGhpcwogICB2ZXJzaW9uIGFueW1vcmUuCiAtIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSB3ZWlyZCBGVFAgVVJMIHR5cGU9IHRoaW5nLiBZb3UgY2FuIGRvd25sb2FkIGEgZmlsZQogICB1c2luZyBBU0NJSSB0cmFuc2ZlciBieSBhcHBlbmRpbmcgIjt0eXBlPUEiIHRvIHRoZSByaWdodCBvZiBpdC4gT3RoZXIKICAgYXZhaWxhYmxlIHR5cGVzIGFyZSB0eXBlPUQgZm9yIGRpci1saXN0IChOTFNUKSBhbmQgdHlwZT1JIGZvciBiaW5hcnkKICAgdHJhbnNmZXIuIEkgY2FuJ3Qgc2F5IEkndmUgZXZlciBzZWVuIGFueW9uZSB1c2UgdGhpcyBraW5kIG9mIFVSTCB0aG91Z2ghCiAgIDotKQogLSBUcm95IEVuZ2VsIHBvaW50ZWQgb3V0IGEgYnVnIGluIG15IGdldGVudigiSE9NRSIpCiAgIHVzYWdlIGZvciB3aW4zMiBzeXN0ZW1zLiBJIGludHJvZHVjZSBnZXRlbnYuYyB0byBiZXR0ZXIgY29wZSB3aXRoCiAgIHRoaXMuIE1yIEVuZ2VsIGhlbHBzIG1lIHdpdGggdGhlIGRldGFpbHMgYXJvdW5kIHRoYXQuLi4KIC0gQSBsaXR0bGUgbm90ZSB0byBteXNlbGYgYW5kIG90aGVycywgSSBzaG91bGQgbWFrZSB0aGUgd2luMzItYmluYXJ5IGJ1aWx0CiAgIHdpdGggU1NMIHN1cHBvcnQuLi4KIC0gUnlhbiBOZWxzb24gc2VudCBtZSBjb21tZW50cyBhYm91dCBidWlsZGluZyBjdXJsCiAgIHdpdGggU1NMIHVuZGVyIEZyZWVCU0QuIFNlZSB0aGUgTWFrZWZpbGUgZm9yIGRldGFpbHMuIFVzaW5nIHRoZSBjb25maWd1cmUKICAgc2NyaXB0LCBpdCBzaG91bGQgd29yayBiZXR0ZXIgYW5kIGF1dG9tYXRpY2FsbHkgbm93Li4uCiAtIENsZWFuZWQgdXAgaW4gdGhlIHBvcnQgbnVtYmVyIG1lc3MgaW4gdGhlIHNvdXJjZS4gTm8gbG9uZ2VyIHN0b3JlcyBhbmQgdXNlcwogICBwcm94eSBwb3J0IG51bWJlciBzZXBhcmF0ZSBmcm9tIG5vcm1hbCBwb3J0IG51bWJlci4KIC0gJ2NvbmZpZ3VyZScgc2NyaXB0IHdvcmtpbmcuIENvbmZpcm1lZCBjb21waWxlcyBvbjoKICAgIEhvc3QgICAgICAgICBTU0wgIENvbXBpbGVyCiAgICBTdW5PUyA1LjUgICAgbm8gICBnY2MKICAgIFN1bk9TIDUuNS4xICB5ZXMgIGdjYwogICAgU3VuT1MgNS42ICAgIG5vICAgY2MgICh3aXRoIGdjYywgaXQgaGFzIHRoZSAiZ2NjIGluY2x1ZGUgZmlsZXMiIHByb2JsZW0pCiAgICBTdW5PUyA0LjEuMyAgbm8gICBnY2MgKHdpdGhvdXQgQU5TSSBDIGhlYWRlcnMpCiAgICBTdW5PUyA0LjEuMiAgbm8gICBnY2MgKG5hdGl2ZSBjb21waWxlciBmYWlsZWQpCiAgICBMaW51eCAyLjAuMTggbm8gICBnY2MKICAgIExpbnV4IDIuMC4zMiB5ZXMgIGdjYwogICAgTGludXggMi4wLjM1IG5vICAgZ2NjICh3aXRoIGdsaWJjKQogICAgSVJJWCA2LjIgICAgIG5vICAgZ2NjIChjYyBjb21waWxlcyBnZW5lcmF0ZSBhIGZldyB3YXJuaW5ncykKICAgIElSSVggNi40ICAgICBubyAgIGNjICAoZ2VuZXJhdGVkIHdhcm5pbmdzIHRob3VnaCkKICAgIFdpbjMyICAgICAgICBubyAgIEJvcmxhbmQKICAgIE9TRjQuMAkgbm8gICA/CgogLSBPb29wcy4gVGhlIDViZXRhIChhbmQgNC4xMCkgdW5kZXIgd2luMzIgZmFpbGVkIGlmIHRoZSBIT01FIHZhcmlhYmxlIHdhc24ndAogICBzZXQuCiAtIFdoZW4gdXNpbmcgYSBwcm94eSwgY3VybCBub3cgZ3Vlc3NlcyBhbmQgdXNlcyB0aGUgcHJvdG9jb2wgcGFydCBpbiBjYXNlcwogICBsaWtlOgoJY3VybCAteCBwcm94eTo4MCB3d3cuc2l0ZS5jb20KICAgUHJveGllcyBub3JtYWxseSBnbyBudXRzIHVubGVzcyBodHRwOi8vIGlzIHByZXBlbmRlZCB0byB0aGUgaG9zdCBuYW1lLCBzbwogICBpZiBjdXJsIGlzIHVzZWQgbGlrZSB0aGlzLCBpdCBndWVzc2VzIHByb3RvY29sIGFuZCBhcHBlbmRzIHRoZSBwcm90b2NvbAogICBzdHJpbmcgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHByb3h5LiBJdCBhbHJlYWR5IGRpZCB0aGlzIHdoZW4gdXNlZAogICB3aXRob3V0IHByb3h5LgogLSBCZXR0ZXIgcG9ydCB1c2FnZSB3aXRoIFNTTCB0aHJvdWdoIHByb3h5IG5vdy4gSWYgeW91IHNwZWNpZmllZCBhIGRpZmZlcmVudAogICBodHRwcy1wb3J0IHdoZW4gYWNjZXNzaW5nIHRocm91Z2ggYSBwcm94eSwgaXQgZGlkbid0IHVzZSB0aGF0IG51bWJlcgogICBjb3JyZWN0bHkuIEkgYWxzbyByZXdyb3RlIHRoZSBjb2RlIHRoYXQgcGFyc2VzIHRoZSBzdHVmZiByZWFkIGZyb20gdGhlCiAgIHByb3h5IHdoZW4geW91IHdhbm5hIGNvbm5lY3QgdGhyb3VnaCBpdCB3aXRoIFNTTC4KIC0gQmpvcm4gUmVlc2UgaGVscGVkIG1lIHdvcmsgYXJvdW5kIG9uZSBvZiB0aGUgY29tcGlsZXIKICAgd2FybmluZ3Mgb24gSVJJWCBuYXRpdmUgY2MgY29tcGlsZXMuCgpWZXJzaW9uIDQuMTAgKE9jdCAyNiwgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBKb2huIEEuIEJyaXN0b3Igc3VnZ2VzdGVkIGEgY29uZmlnIGZpbGUgc3dpdGNoLAogICBhbmQgc2luY2UgSSd2ZSBiZWVuIGhhdmluZyB0aGF0IGlkZWEga2luZCBvZiBpbiB0aGUgYmFja2dyb3VuZCBmb3IgYSBsb25nCiAgIHRpbWUgSSByZXdyb3RlIHRoZSBwYXJhbWV0ZXIgcGFyc2luZyBmdW5jdGlvbiBhIGxpdHRsZSBhbmQgbm93IEkgaW50cm9kdWNlCiAgIHRoZSAtSy8tLWNvbmZpZyBmbGFnLiBJIGFsc28gbWFkZSBjdXJsICphbHdheXMqICh1bmxlc3MgLUsgaXMgdXNlZCkgdHJ5IHRvCiAgIGxvYWQgdGhlIC5jdXJscmMgZmlsZSBmb3IgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuIFRoZSBzeW50YXggZm9yIHRoZQogICBjb25maWcgZmlsZSBpcyB0aGUgc3RhbmRhcmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHN0eWxlLiBEZXRhaWxzIGluICdjdXJsCiAgIC1oJyBvciB0aGUgUkVBRE1FLgogLSBJIHJlbW92ZWQgdGhlIC1rIG9wdGlvbi4gS2VlcC1hbGl2ZSBpc24ndCByZWFsbHkgYW55dGhpbmcgYW55b25lIHdvdWxkCiAgIHdhbnQgdG8gZW5hYmxlIHdpdGggY3VybCBhbnl3YXkuCiAtIE1hcnRpbiBTdGFhZWwgaGVscGVkIG1lIGFkZCB0aGUgJ2lyaXgnIHRhcmdldC4gTm93CiAgICJtYWtlIGlyaXgiIHNob3VsZCBidWlsZCBjdXJsIHN1Y2Nlc3NmdWxseSBvbiBub24tZ2NjIFNHSSBtYWNoaW5lcy4KIC0gU2luZ2xlIHN3aXRjaGVzIG5vdyB0b2dnbGUgYmVoYXZpb3Vycy4gSS5lIGlmIHlvdSB1c2UgLXYgLXYgdGhlIHNlY29uZAogICB3aWxsIHN3aXRjaCBvZmYgdGhlIHZlcmJvc2UgbW9kZSB0aGUgZmlyc3Qgb25lIGVuYWJsZWQuIFRoaXMgaXMgc28gdGhhdAogICB5b3UgY2FuIGRpc2FibGUgYSBkZWZhdWx0IHNldHRpbmcgYSAuY3VybHJjIGZpbGUgZW5hYmxlcyBldGMuCgpWZXJzaW9uIDQuOSAoT2N0IDcsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFydGluIFN0YWFlbCBzdWdnZXN0ZWQgY3VybCB3b3VsZCBzdXBwb3J0IGNvb2tpZXMuCiAgIEkgYWRkZWQgLWIvLS1jb29raWUgdG8gZW5hYmxlIGZyZWUtdGV4dCBjb29raWUgZGF0YSB0byBiZSBwYXNzZWQuIFRoZXJlJ3MKICAgYWxzbyBhIGxpdHRsZSBibHVyYiBhYm91dCBnZW5lcmFsIGNvb2tpZSBzdHVmZiBpbiB0aGUgUkVBRE1FL2hlbHAgdGV4dC4KIC0gZG1oIDxkbWggYXQgamV0LmVzPiBzdWdnZXN0ZWQgSFRUUCByZXN1bWUgY2FwYWJpbGl0aWVzLiBBbHRob3VnaCB5b3UgY291bGQKICAgbWFudWFsbHkgZ2V0IGN1cmwgdG8gcmVzdW1lIEhUVFAgZG9jdW1lbnRzLCBJIG1hZGUgdGhlIC1jIHJlc3VtZSBmbGFnIHdvcmsKICAgZm9yIEhUVFAgdG9vICh1bmxlc3MgLXIgaXMgdXNlZCB0b28sIHdoaWNoIHdvdWxkIGJlIHZlcnkgb2RkIGFueXdheSkuCiAtIEFkZGVkIGNoZWNrbGlua3MucGwgdG8gdGhlIGFyY2hpdmUuIEl0IGlzIGEgc3RpbGwgZXhwZXJpbWVudGFsIHBlcmwgc2NyaXB0CiAgIHRoYXQgY2hlY2tzIGFsbCBsaW5rcyBvZiBhIHdlYiBwYWdlIGJ5IHVzaW5nIGN1cmwuCiAtIFJlYXJyYW5nZWQgdGhlIGFyY2hpdmUgaGllcmFyY2h5IGEgbGl0dGxlLiBCdWlsZCB0aGUgZXhlY3V0YWJsZSBpbiB0aGUKICAgc3JjLyBkaXIgZnJvbSBub3cgb24hCiAtIFZlcnNpb24gNC45IGFuZCBoZXJlYWZ0ZXIsIGlzIG5vIGxvbmdlciByZWxlYXNlZCB1bmRlciB0aGUgR1BMIGxpY2Vuc2UuCiAgIEkgaGF2ZSBub3cgdXBkYXRlZCB0aGUgTEVHQUwgZmlsZSBldGMgYW5kIG5vdyB0aGlzIGlzIHJlbGVhc2VkIHVzaW5nIHRoZQogICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIHRvIGF2b2lkIHRoZSBwbGFndWUga25vd24gYXMgInRoZSBHUEwgdmlydXMiLiBZb3UKICAgbXVzdCBtYWtlIHRoZSBzb3VyY2UgYXZhaWxhYmxlIGlmIHlvdSBkZWNpZGUgdG8gY2hhbmdlIGFuZC9vciByZWRpc3RyaWJ1dGUKICAgY3VybCwgYnV0IGlmIHlvdSBkZWNpZGUgdG8gdXNlIGN1cmwgd2l0aGluIHNvbWV0aGluZyBlbHNlIHlvdSBkbyBub3QgbmVlZAogICB0byBvZmZlciB0aGUgd29ybGQgdGhlIHNvdXJjZSB0byB0aGF0IHRvby4KIC0gQ3VybCBkaWQgbm90IGxpa2UgSFRUUCBzZXJ2ZXJzIHRoYXQgc2VudCBubyBoZWFkZXJzIGF0IGFsbCBvbiBhIEdFVAogICByZXF1ZXN0LiAgSXQgaXMgYSB2aW9sYXRpb24gb2YgUkZDMjA2OCBidXQgYXBwZWFyYW50bHkgc29tZSBzZXJ2ZXJzIGRvCiAgIHRoYXQgYW55d2F5LiAgVGhhbmtzIHRvIEdvcmRvbiBCZWF0b24gZm9yIHRoZSByZXBvcnQhCiAtIC1MLy0tbG9jYXRpb24gd2FzIGFkZGVkIGFmdGVyIGEgc3VnZ2VzdGlvbiBmcm9tIE1hcnRpbiBTdGFhZWwuIFRoaXMgbWFrZXMKICAgY3VybCBBVFRFTVBUIHRvIGZvbGxvdyB0aGUgTG9jYXRpb246IHJlZGlyZWN0IGlmIG9uZSBpcyBwcmVzZW50IGluIHRoZSBIVFRQCiAgIGhlYWRlcnMuIElmIC1pIG9yIC1JIGlzIHVzZWQgd2l0aCB0aGlzIGZsYWcsIHlvdSB3aWxsIHNlZSBoZWFkZXJzIGZyb20gYWxsCiAgIHNpdGVzIHRoZSBMb2NhdGlvbjogcG9pbnRzIHRvLiBEbyBub3RlIHRoYXQgdGhlIGZpcnN0IHNlcnZlciBjYW4gcG9pbnQgdG8gYQogICBzZWNvbmQgdGhhdCBwb2ludHMgdG8gYSB0aGlyZCBldGMuIEl0IHNlZW1zIHRoZSBMb2NhdGlvbjogcGFyYW1ldGVyIChzYWlkCiAgIHRvIGJlIGFuIEFic29sdXRlVVJJIGluIFJGQzIwNjgpIGlzbid0IGFsd2F5cyBhYnNvbHV0ZS4uIDotLyBBbnl3YXksIEkndmUKICAgbWFkZSBjdXJsIEFUVEVNUFQgdG8gZG8gdGhlIGJlc3QgaXQgY2FuIHRvIGRlYWwgd2l0aCB0aGUgcmVhbGl0eS4KIC0gQWRkZWQgZ2V0bGlua3MucGwgdG8gdGhlIGFyY2hpdmUuIGdldGxpbmtzLnBsIHNlbGVjdGl2ZWx5IGRvd25sb2FkcwogICBmaWxlcyB0aGF0IGEgd2ViIHBhZ2UgbGlua3MgdG8uCgpWZXJzaW9uIDQuOC40CiBEYW5pZWwgU3RlbmJlcmcKIC0gQXMgSnVsaWFuIFJvbWVybyBOaWV0byByZXBvcnRlZCwgY3VybCByZXBvcnRlZCB3cm9uZyB2ZXJzaW9uIG51bWJlci4KIC0gQXMgVGVlbXUgWWxpLUVsc2lsYSBwb2ludGVkIG91dCwgdGhlIHdpbjMyIHZlcnNpb24gb2YgNC44IChhbmQgcHJvYmFibHkgYWxsCiAgIG90aGVyIHZlcnNpb25zIGZvciB3aW4zMikgZGlkbid0IHdvcmsgd2l0aCBiaW5hcnkgZmlsZXMgc2luY2UgSSdtIHRvbyB1c2VkCiAgIHRvIHRoZSBVTklYIHN0eWxlIGZvcGVuKCkgd2hlcmUgYmluYXJ5IGFuZCB0ZXh0IGRvbid0IGRpZmZlci4uLgogLSBSYWxwaCBCZWNrbWFubiBicm91Z2h0IG1lIHNvbWUgY2hhbmdlcyB0aGF0IGxldHMgY3VybCBjb21waWxlIGVycm9yIGFuZAogICB3YXJuaW5nIGZyZWUgd2l0aCAtV2FsbCAtcGVkYW50aWMgd2l0aCBnKysuIEkgYWxzbyB0b29rIHRoZSBvcHBvcnR1bml0eSB0bwogICBjbGVhbiBvZmYgc29tZSB1bnVzZWQgdmFyaWFibGVzIGFuZCBzaW1pbGFyLgogLSBSYWxwaCBCZWNrbWFubiBtYWRlIG1lIGF3YXJlIG9mIGEgcmVhbGx5IG9kZCBidWcgbm93IGNvcnJlY3RlZC4gV2hlbiBjdXJsCiAgIHJlYWQgYSBzZXQgb2YgaGVhZGVycyBmcm9tIGEgSFRUUCBzZXJ2ZXIsIGRpdmlkZWQgaW50byBtb3JlIHRoYW4gb25lIHJlYWQKICAgYW5kIHRoZSBmaXJzdCByZWFkIHNob3dlZCBhIGZ1bGwgbGluZSAqZXhhY3RseSogKGkuZSBlbmRpbmcgd2l0aCBhCiAgIG5ld2xpbmUpLCBjdXJsIGRpZCBub3QgYmVoYXZlIHdlbGwuCgpWZXJzaW9uIDQuOC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB3YXMgdG9vIHF1aWNrIHRvIHJlbGVhc2UgNC44LjIgd2l0aCB0b28gbGl0dGxlIHRlc3RpbmcuIE9uZSBvZiB0aGUKICAgY2hhbmdlcyBpcyBub3cgcmV2ZXJ0ZWQgc2xpZ2h0bHkgdG8gdGhlIDQuOC4xIHdheSBzaW5jZSA0LjguMiBjb3VsZG4ndAogICB1cGxvYWQgZmlsZXMuIEkgc3RpbGwgdGhpbmsgYm90aCBwcm9ibGVtcyBjb3JyZWN0ZWQgaW4gNC44LjIgcmVtYWluCiAgIGNvcnJlY3RlZC4gIFJlcG9ydGVkIGJ5IEp1bGlhbiBSb21lcm8gTmlldG8uCgpWZXJzaW9uIDQuOC4yCiBEYW5pZWwgU3RlbmJlcmcKIC0gQmVybmhhcmQgSXNlbGJvcm4gcmVwb3J0ZWQgdHdvIEZUUCBwcm90b2NvbCBlcnJvcnMgY3VybCBkaWQuIFRoZXkncmUgbm93CiAgIGNvcnJlY3RlZC4gQm90aCBhcHBlYXJlZCB3aGVuIGdldHRpbmcgZmlsZXMgZnJvbSBhIE1TIEZUUCBzZXJ2ZXIhIDotKQoKVmVyc2lvbiA0LjguMQogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIGEgbGFzdCB1cGRhdGUgb2YgdGhlIHByb2dyZXNzIG1ldGVyIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGRvbmUuIFRoZQogICBmaW5hbCBvdXRwdXQgb24gdGhlIHNjcmVlbiBkaWRuJ3QgaGF2ZSB0byBiZSB0aGUgZmluYWwgc2l6ZSB0cmFuc2ZlcmVkCiAgIHdoaWNoIG1hZGUgaXQgc29tZXRpbWVzIGxvb2sgb2RkLgogLSBUaGFua3MgdG8gRGF2aWQgTG9uZyBJIGdvdCByaWQgb2YgYSBzaWxseSBidWcgdGhhdCBoYXBwZW5lZCBpZiBhIEhUVFAtcGFnZQogICBoYWQgbm90aGluZyBidXQgaGVhZGVyLiBBcHBlYXJhbnRseSBTb2xhcmlzIGRlYWxzIHdpdGggbmVnYXRpdmUgc2l6ZXMgaW4KICAgZndyaXRlKCkgY2FsbHMgYSBsb3QgYmV0dGVyIHRoYW4gTGludXggZG9lcy4uLiA9Qi1dCgpWZXJzaW9uIDQuOAogRGFuaWVsIFN0ZW5iZXJnCiAtIENvbnRpbnVlIEZUUCBmaWxlIHRyYW5zZmVyLiAtYyBpcyB0aGUgc3dpdGNoLiBOb3RlIHRoYXQgeW91IG5lZWQgdG8KICAgc3BlY2lmeSBhIGZpbGUgbmFtZSBpZiB5b3Ugd2FubmEgcmVzdW1lIGEgZG93bmxvYWQgKHlvdSBjYW4ndCByZXN1bWUgYQogICBkb3dubG9hZCBzZW50IHRvIHN0ZG91dCkuIFJlc3VtaW5nIHVwbG9hZCBtYXkgYmUgbGltaXRlZCBieSB0aGUgc2VydmVyCiAgIHNpbmNlIGN1cmwgaXMgdGhlbiB1c2luZyB0aGUgbm9uLVJGQzk1OSBjb21tYW5kIFNJWkUgdG8gZ2V0IHRoZSBzaXplIG9mCiAgIHRoZSB0YXJnZXQgZmlsZSBiZWZvcmUgdXBsb2FkIGJlZ2lucyAodG8gZmlndXJlIG91dCB3aGljaCBvZmZzZXQgdG8KICAgdXNlKS4gVXNlIC1DIHRvIHNwZWNpZnkgdGhlIG9mZnNldCB5b3Vyc2VsZiEgLUMgaXMgaGFuZHkgaWYgeW91J3JlIGRvaW5nCiAgIHRoZSBvdXRwdXQgdG8gc29tZXRoaW5nIGVsc2UgYnV0IGEgcGxhaW4gZmlsZSBvciB3aGVuIHlvdSBqdXN0IHdhbnQgdG8gZ2V0CiAgIHRoZSBlbmQgb2YgYSBmaWxlLgogLSByZWN1cnNpdmVmdHBnZXQucGwgbm93IGZlYXR1cmVzIGEgbWF4aW11bSByZWN1cnNpdmUgbGV2ZWwgYXJndW1lbnQuCgpWZXJzaW9uIDQuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHN1cHBvcnQgdG8gYWJvcnQgYSBkb3dubG9hZCBpZiB0aGUgc3BlZWQgaXMgYmVsb3cgYSBjZXJ0YWluIGFtb3VudAogICAoc3BlZWQtbGltaXQpIGJ5dGVzIHBlciBzZWNvbmQgZm9yIGEgY2VydGFpbiAoc3BlZWQtdGltZSkgdGltZS4KIC0gV3JvdGUgYSBwZXJsIHNjcmlwdCAncmVjdXJzaXZlZnRwZ2V0LnBsJyB0byByZWN1cnNpdmVseSB1c2UgY3VybCB0byBnZXQgYQogICB3aG9sZSBmdHAgZGlyZWN0b3J5IHRyZWUuIEl0IGlzIG1lYW50IGFzIGFuIGV4YW1wbGUgb2YgaG93IGN1cmwgY2FuIGJlCiAgIHVzZWQuICBJIGFncmVlIGl0IGlzbid0IHRoZSB3aXNlc3QgdGhpbmcgdG8gZG8gdG8gbWFrZSBhIHNlcGFyYXRlIG5ldwogICBjb25uZWN0aW9uIGZvciBlYWNoIGZpbGUgYW5kIGRpcmVjdG9yeSBmb3IgdGhpcy4KClZlcnNpb24gNC42CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBmaXJzdCBhdHRlbXB0IHRvIG9wdGlvbmFsbHkgcGFyc2UgdGhlIC5uZXRyYyBmaWxlIGZvciBsb2dpbiB1c2VyCiAgIGFuZCBwYXNzd29yZC4gSWYgdXNlZCB3aXRoIGh0dHAsIGl0IGVuYWJsZXMgdXNlciBhdXRoZW50aWNhdGlvbi4gLW4gaXMKICAgdGhlIG5ldyBzd2l0Y2guCiAtIFJlbW92ZWQgdGhlIGV4dHJhIG5ld2xpbmVzIG9uIHRoZSBkZWZhdWx0IHVzZXItYWdlbnQgc3RyaW5nLgogLSBDb3JyZWN0ZWQgdGhlIG1pc3NpbmcgZnRwIHVwbG9hZCBlcnJvciBtZXNzYWdlcyB3aGVuIGl0IGZhaWxlZCB3aXRob3V0IHRoZQogICB2ZXJib3NlIGZsYWcgc2V0LiBHYXJ5IFcuIFN3ZWFyaW5nZW4gZm91bmQgaXQuCiAtIE5vdyB1c2luZyBhbGFybSgpIHRvIGVuYWJsZSBzZWNvbmQtcHJlY2lzaW9uIHRpbWVvdXQgZXZlbiBvbiB0aGUgbmFtZQogICByZXNvbHZpbmcvY29ubmVjdGluZyBwaGFzZS4gVGhlIHRpbWVvdXQgaXMgYWx0aG91Z2ggcmVzZXQgYWZ0ZXIgdGhhdCBmaXJzdAogICBzZXF1ZW5jZS4gKFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZC4pIEdhcnkgVy4gU3dlYXJpbmdlbiByZXBvcnRlZC4KIC0gTm93IHNwZWxscyAiVW5rbm93biIgcHJvcGVybHksIGFzIGluICJVbmtub3duIG9wdGlvbiAneiciLi4uIDotKQogLSBBZGRlZCBidWcgcmVwb3J0IGVtYWlsIGFkZHJlc3MgaW4gdGhlIFJFQURNRS4KIC0gQWRkZWQgYSAiY3VycmVudCBzcGVlZCIgZmllbGQgdG8gdGhlIHByb2dyZXNzIG1ldGVyLiBJdCBzaG93cyB0aGUgYXZlcmFnZQogICBzcGVlZCB0aGUgbGFzdCA1IHNlY29uZHMuIFRoZSBvdGhlciBzcGVlZCBmaWVsZCBzaG93cyB0aGUgYXZlcmFnZSBzcGVlZCBvZgogICB0aGUgZW50aXJlIHRyYW5zZmVyIHNvIGZhci4KClZlcnNpb24gNC41LjEKIExpbmFzIFZlcHN0YXMKIC0gU1NMIHRocm91Z2ggcHJveHkgZml4CiAtIEFkZGVkIC1BIHRvIGFsbG93IFVzZXItQWdlbnQ6IGNoYW5nZXMKCiBEYW5pZWwgU3RlbmJlcmcgCiAtIE1hZGUgdGhlIC1BIHdvcmsgd2hlbiBTU0wtdGhyb3VnaC1wcm94eS4KClZlcnNpb24gNC41CiBMaW5hcyBWZXBzdGFzCiAtIE1vcmUgU1NMIGNvcnJlY3Rpb25zCiAtIEkndmUgYWRkZWQgYSBwb3J0IHRvIEFJWC4KIC0gcnVubmluZyBTU0wgdGhyb3VnaCBhIHByb3h5IGNhdXNlcyBhIGNodW5rIG9mIGNvZGUgdG8gYmUgZXhlY3V0cmVkIHR3aWNlLgogICBvbmUgb2YgdGhvc2UgYmxvY2tzIG5lZWRzIHRvIGJlIGRlbGV0ZWQuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgLWkgYW5kIC1JIHdvcmsgYWdhaW4KClZlcnNpb24gNC40CiBMaW5hcyBWZXBzdGFzCiAtIC14IGNhbiBub3cgYWxzbyBzcGVjaWZ5IHByb3h5cG9ydCB3aGVuIHVzZWQgYXMgaW4gJ3Byb3h5aG9zdDpwcm94eXBvcnQnCiAtIFNTTCBmaXhlcwoKVmVyc2lvbiA0LjMKIERhbmllbCBTdGVuYmVyZwogLSBBZGp1c3RlZCB0byBjb21waWxlIHVuZGVyIHdpbjMyIChWaXN1YWxDKysgNSkuIFRoZSAtUCBzd2l0Y2ggZG9lcyBub3QKICAgc3VwcG9ydCBuZXR3b3JrIGludGVyZmFjZSBuYW1lcyBpbiB3aW4zMi4gSSBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyEKClZlcnNpb24gNC4yCiBMaW5hcyBWZXBzdGFzIC8gU2FtcG8gS2VsbG9tYWtpCiAtIEFkZGVkIFNTTCAvIFNTTGVheSBzdXBwb3J0IChodHRwczovLykKIC0gQWRkZWQgdGhlIC1UIHVzYWdlIGZvciBIVFRQIFBPU1QuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEJ1Z2ZpeGVkIHRoZSBTU0wgaW1wbGVtZW50YXRpb24uCiAtIE1hZGUgLVAgYSBsb3QgYmV0dGVyIHRvIHVzZSBvdGhlciBJUCBhZGRyZXNzZXMuIEl0IG5vdyBhY2NlcHRzIGEgZm9sbG93aW5nCiAgIHBhcmFtZXRlciB0aGF0IGNhbiBiZSBlaXRoZXIKICAgICAgICBpbnRlcmZhY2UgLSBpLmUgImV0aDAiIHRvIHNwZWNpZnkgd2hpY2ggaW50ZXJmYWNlJ3MgSVAgYWRkcmVzcyB5b3UKICAgICAgICAgICAgICAgICAgICB3YW50IHRvIHVzZQogICAgICAgIElQIGFkZHJlc3MgLSBpLmUgIjE5Mi4xNjguMTAuMSIgdG8gc3BlY2lmeSBleGFjdCBJUCBudW1iZXIKICAgICAgICBob3N0IG5hbWUgLSBpLmUgIm15Lmhvc3QuZG9tYWluIiB0byBzcGVjaWZ5IG1hY2hpbmUKICAgICAgICAiLSIgICAgICAgLSAoYW55IHNpbmdsZS1sZXR0ZXIgc3RyaW5nKSB0byBtYWtlIGl0IHBpY2sgdGhlIG1hY2hpbmUncwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQKIC0gVGhlIE1ha2VmaWxlIGlzIG5vdyByZWFkeSB0byBjb21waWxlIGZvciBzb2xhcmlzLCBzdW5vczQgYW5kIGxpbnV4IHJpZ2h0CiAgIG91dCBvZiB0aGUgYm94LgogLSBCZXR0ZXIgZ2VuZXJhdGVkIHZlcnNpb24gc3RyaW5nIHNlZW4gd2l0aCAnY3VybCAtVicKClZlcnNpb24gNC4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIElQIG51bWJlciByZXR1cm5lZCBieSB0aGUgZnRwIHNlcnZlciBhcyBhIHJlcGx5IHRvIFBBU1YgZG9lcyBubyBsb25nZXIKICAgaGF2ZSB0byBETlMgcmVzb2x2ZS4gSW4gZmFjdCwgbm8gSVAtbnVtYmVyLW9ubHkgYWRkcmVzc2VzIGhhdmUgdG8gYW55bW9yZS4KIC0gQmluZHMgYmV0dGVyIHRvIGF2YWlsYWJsZSBwb3J0IHdoZW4gLVAgaXMgdXNlZC4KIC0gTm93IExJU1RzIC4vIGluc3RlYWQgb2YgLyB3aGVuIHVzZWQgYXMgaW4gZnRwOi8vZnRwLmZ1bmV0LmZpLy4gVGhlIHJlYXNvbgogICBmb3IgdGhpcyBpcyB0aGF0IGV4YWN0bHkgdGhhdCBzaXRlLCBmdHAuZnVuZXQuZmksIGRvZXMgbm90IGFsbG93IExJU1QgLwogICB3aGlsZSBMSVNUIC4vIGlzIGZpbmUuIEFueSBvYmplY3Rpb25zPwoKVmVyc2lvbiA0ICgxOTk4LTAzLTIwKQogRGFuaWVsIFN0ZW5iZXJnCiAtIEkgdG9vayBhbm90aGVyIGh1Z2Ugc3RlcCBhbmQgY2hhbmdlZCBib3RoIHZlcnNpb24gbnVtYmVyIGFuZCBwcm9qZWN0IG5hbWUhCiAgIFRoZSByZWFzb24gZm9yIHRoZSBuZXcgbmFtZSBpcyB0aGF0IHRoZXJlIGFyZSBqdXN0IG9uZSB0b28gbWFueSBwcm9ncmFtcwogICBuYW1lZCB1cmxnZXQgYWxyZWFkeSBhbmQgdGhpcyBwcm9ncmFtIGFscmVhZHkgY2FuIGEgbG90IG1vcmUgdGhhbiBtZXJlbHkKICAgZ2V0dGluZyBVUkxzLCBhbmQgdGhlIHJlYXNvbiBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHRoYXQgSSBkaWQgYWRkIHRoZQogICBwcmV0dHkgYmlnIGNoYW5nZSBpbiAtUCBhbmQgc2luY2UgSSBjaGFuZ2VkIG5hbWUgSSB3YW50ZWQgdG8gc3RhcnQgd2l0aAogICBzb21ldGhpbmcgZnJlc2ghCiAtIFRoZSAtLXN0eWxlIGZsYWdzIGFyZSB3b3JraW5nIGJldHRlciBub3cuCiAtIExpc3RpbmcgZGlyZWN0b3JpZXMgd2l0aCBGVFAgb2Z0ZW4gcmVwb3J0ZWQgdGhhdCB0aGUgZmlsZSB0cmFuc2ZlciB3YXMKICAgaW5jb21wbGV0ZS4gV3JvbmcgYXNzdW1wdGlvbnMgd2VyZSB0b28gY29tbW9uIGZvciBkaXJlY3Rvcmllcywgd2h5IG5vCiAgIHNpemUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gZ2V0IGNvbXBhcmVkIG9uIHRoZW0gZnJvbSBub3cgb24uCiAtIEltcGxlbWVudGVkIHRoZSAtUCBmbGFnIHRoYXQgbGV0J3MgdGhlIGZ0cCBjb250cm9sIGlzc3VlIGEgUE9SVCBjb21tYW5kCiAgIGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIFBBU1YuCiAtIC1hIGZvciBhcHBlbmRpbmcgRlRQIHVwbG9hZHMgd29ya3MuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKClZlcnNpb24gMy4xMiAoMTQgTWFyY2ggMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBFbmQtb2YtaGVhZGVyIHRyYWNraW5nIHN0aWxsIGxhY2tlZCBzdXBwb3J0IGZvciBcclxuIG9yIGp1c3QgXG4gYXQgdGhlCiAgIGVuZCBvZiB0aGUgbGFzdCBoZWFkZXIgbGluZS4KIFNlcmdpbyBCYXJyZXNpCiAtIEFkZGVkIFBST1hZIGF1dGhlbnRpY2F0aW9uLgogUmFmYWVsIFNhZ3VsYQogLSBGaXhlZCBzb21lIGxpdHRsZSBidWdzLgoKVmVyc2lvbiAzLjExCiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIGhlYWRlciBwYXJzaW5nIHdhcyBzdGlsbCBub3QgY29ycmVjdCBzaW5jZSB0aGUgMy4yIG1vZGlmaWNhdGlvbi4uLgoKVmVyc2lvbiAzLjEwCiBEYW5pZWwgU3RlbmJlcmcKIC0gMy43IGFuZCAzLjkgd2VyZSBzaW11bHRhbmVvdXNseSBkZXZlbG9wZWQgYW5kIG1lcmdlZCBpbnRvIHRoaXMgdmVyc2lvbi4KIC0gRlRQIHVwbG9hZCBkaWQgbm90IHdvcmsgY29ycmVjdGx5IHNpbmNlIDMuMi4KClZlcnNpb24gMy45CiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkIHRoZSAiLWUgPHVybD4gLyAtLXJlZmVyZXIgPHVybD4iIG9wdGlvbiB3aGVyZSB3ZSBjYW4gc3BlY2lmeQogICB0aGUgcmVmZXJlciBwYWdlLiBPYnZpb3VzbHksIHRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgdG8gZm9vbCB0aGUKICAgc2VydmVyLCBidXQuLi4KClZlcnNpb24gMy43CiBEYW5pZWwgU3RlbmJlcmcKIC0gTm93IGNoZWNrcyB0aGUgbGFzdCBlcnJvciBjb2RlIHNlbnQgZnJvbSB0aGUgZnRwIHNlcnZlciBhZnRlciBhIGZpbGUgaGFzCiAgIGJlZW4gcmVjZWl2ZWQgb3IgdXBsb2FkZWQuIFdhc24ndCBkb25lIHByZXZpb3VzbHkuCiAtIFdoZW4gJ3VybGdldCA8aG9zdD4nIGlzIHVzZWQgd2l0aG91dCBhICdwcm90b2NvbDovLycgZmlyc3QgaW4gdGhlIGhvc3QgcGFydCwKICAgaXQgbm93IGNoZWNrcyBmb3IgaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoIGZ0cCBvciBnb3BoZXIgYW5kIGlmIGl0IGRvZXMsCiAgIGl0IHVzZXMgdGhhdCBwcm90b2NvbCBieSBkZWZhdWx0IGluc3RlYWQgb2YgaHR0cC4KClZlcnNpb24gMy42CiBEYW5pZWwgU3RlbmJlcmcKIC0gU2lsbHkgbWlzdGFrZSBtYWRlIHRoZSBQT1NUIGJ1Zy4gVGhpcyBoYXMgbm93IGFsc28gYmVlbiB0ZXN0ZWQgdG8gd29yayB3aXRoCiAgIHByb3h5LgoKVmVyc2lvbiAzLjUKIERhbmllbCBTdGVuYmVyZwogLSBIaWdobHkgaW5zcGlyZWQgYnkgUmFmYWVsIFNhZ3VsYSdzIGNoYW5nZXMgdG8gdGhlIDMuMSB0aGF0IGFkZGVkIGFuIGFsbW9zdAogICBmdW5jdGlvbmFsIFBPU1QsIEkgYXBwbGllZCBoaXMgY2hhbmdlcyBpbnRvIHRoaXMgdmVyc2lvbiBhbmQgbWFkZSB0aGVtIHdvcmsuCiAgIChJdCBzZWVtcyBQT1NUIHJlcXVpcmVzIHRoZSBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnMuKSBJdCBpcwogICBub3cgdXNhYmxlIHdpdGggdGhlIC1kIHN3aXRjaC4KClZlcnNpb24gMy4zIC0gMy40CiBQYXNzZWQgdG8gYXZvaWQgY29uZnVzaW9ucwoKVmVyc2lvbiAzLjIKIERhbmllbCBTdGVuYmVyZwogLSBNYWpvciByZXdyaXRlIG9mIHR3byBjcnVjaWFsIHBhcnRzIG9mIHRoaXMgY29kZTogdXBsb2FkIGFuZCBkb3dubG9hZC4KICAgVGhleSBhcmUgYm90aCBub3cgdXNpbmcgYSBzZWxlY3QoKSBzd2l0Y2gsIHRoYXQgYWxsb3dzIG11Y2ggYmV0dGVyCiAgIHByb2dyZXNzIG1ldGVyIGFuZCB0aW1lIGNvbnRyb2wuIAogLSBhbGFybSgpIHVzYWdlIHJlbW92ZWQgY29tcGxldGVseQogLSBGVFAgZ2V0IGNhbiBub3cgbGlzdCBkaXJlY3RvcnkgY29udGVudHMgaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgc2xhc2ggJy8nLgogICBVcmxnZXQgb24gYSBmdHAtcGF0aCB0aGF0IGRvZXNuJ3QgZW5kIHdpdGggYSBzbGFzaCBtZWFucyB1cmxnZXQgd2lsbAogICBhdHRlbXB0IGdldHRpbmcgaXQgYXMgYSBmaWxlIG5hbWUuCiAtIEZUUCBkaXJlY3RvcnkgdmlldyBzdXBwb3J0cyAtbCBmb3IgImxpc3Qtb25seSIgd2hpY2ggbGlzdHMgdGhlIGZpbGUgbmFtZXMKICAgb25seS4KIC0gQWxsIG9wZXJhdGlvbnMgc3VwcG9ydCAtbSBmb3IgbWF4IHRpbWUgdXNhZ2UgaW4gc2Vjb25kcyBhbGxvd2VkLgogLSBGVFAgdXBsb2FkIG5vdyBhbGxvd3MgdGhlIHNpemUgb2YgdGhlIHVwbG9hZGVkIGZpbGUgdG8gYmUgcHJvdmlkZWQsIGFuZAogICB0aHVzIGl0IGNhbiBiZXR0ZXIgY2hlY2sgaXQgYWN0dWFsbHkgdXBsb2FkZWQgdGhlIHdob2xlIGZpbGUuIEl0IGFsc28KICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGZvciB1cGxvYWRzIG11Y2ggYmV0dGVyIQogLSBNYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2luZyBmYWlsIGluIGNhc2VzIGxpa2UgJ3VybGdldCAtciA5MDAnIHdoaWNoCiAgIHByZXZpb3VzbHkgdHJpZWQgdG8gY29ubmVjdCB0byB0aGUgaG9zdCBuYW1lZCAnOTAwJy4KClZlcnNpb24gMy4xCiBLamVsbCBFcmljc29uCiAtIFBvaW50ZWQgb3V0IGhvdyB0byBjb3JyZWN0IHRoZSAzIHdhcm5pbmdzIGluIHdpbjMyLWNvbXBpbGVzLgoKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIGFsbCBjYWxscyB0byBleGl0KCkuCiAtIE1hZGUgdGhlIHNob3J0IGhlbHAgdGV4dCBnZXQgd3JpdHRlbiB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuCiAtIE1hZGUgdGhpcyBmaWxlIGluc3RlYWQgb2Yga2VlcGluZyB0aGVzZSBjb21tZW50cyBpbiB0aGUgc291cmNlLgogLSBNYWRlIHR3byBjYWxsYmFjayBob29rcywgdGhhdCBlbmFibGUgZXh0ZXJuYWwgcHJvZ3JhbXMgdG8gdXNlIHVybGdldCgpCiAgIGVhc2llciBhbmQgdG8gZ3JhYiB0aGUgb3V0cHV0L29mZmVyIHRoZSBpbnB1dCBlYXNpZXIuCiAtIEl0IGlzIGV2aWRlbnQgdGhhdCBXaW4zMi1jb21waWxlcyBhcmUgcGFpbmZ1bC4gSSB3YXRjaGVkIHRoZSBvdXRwdXQgZnJvbQogICB0aGUgQm9ybGFuZCBDKysgdjUgYW5kIGl0IHdhcyBhd2Z1bC4gSnVzdCBpZ25vcmUgYWxsIHRob3NlIHdhcm5pbmdzLgoKVmVyc2lvbiAzLjAKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBGVFAgdXBsb2FkIGNhcGFiaWxpdGllcy4gVGhlIG5hbWUgdXJsZ2V0IGdldHMgYSBiaXQgc2lsbHkgbm93CiAgIHdoZW4gd2UgY2FuIHB1dCB0b28uLi4gPSkKIC0gUmVzdHJ1Y3R1cmVkIHRoZSBzb3VyY2UgcXVpdGUgYSBsb3QuCiAgIENoYW5nZWQgdGhlIHVybGdldCgpIGludGVyZmFjZS4gVGhpcyB3YXksIHdlIHdpbGwgc3Vydml2ZSBjaGFuZ2VzIG11Y2gKICAgYmV0dGVyLiBOZXcgZmVhdHVyZXMgY2FuIGNvbWUgYW5kIG9sZCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IHVzIG5lZWRpbmcKICAgdG8gY2hhbmdlIHRoZSBpbnRlcmZhY2UuIEkndmUgd3JpdHRlbiBhIHNtYWxsIGV4cGxhbmF0aW9uIGluIHVybGdldC5oCiAgIHRoYXQgZXhwbGFpbnMgaXQuCiAtIE5ldyBmbGFncyBpbmNsdWRlIC10LCAtVCwgLU8gYW5kIC1oLiBUaGUgLWggdGV4dCBpcyBnZW5lcmF0ZWQgYnkgdGhlIG5ldwogICBta2hlbHAgc2NyaXB0LgoKVmVyc2lvbiAyLjkKIFJlbWNvIHZhbiBIb29mZgogLSBBZGRlZCBhIGZpeCB0byBtYWtlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQW1pZ2EgdXNpbmcgdGhlIFNBUy9DCiAgIGNvbXBpbGVyLgogIAogRGFuaWVsIFN0ZW5iZXJnCiAtIEJlbGlldmUgaXQgb3Igbm90LCBidXQgdGhlIFNUVVBJRCBOb3ZlbGwgd2ViIHNlcnZlciBzZWVtcyB0byByZXF1aXJlCiAgIHRoYXQgdGhlIEhvc3Q6IGtleXdvcmQgaXMgdXNlZCwgc28gd2VsbCBJIHVzZSBpdCBhbmQgSSAocmUtaW50cm9kdWNlKSB0aGUKICAgdXJsZ2V0IFVzZXItQWdlbnQ6LiBJIHN0aWxsIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGlzIEhvc3Q6IHVzYWdlIHdvcmtzIHdpdGgKICAgcHJveGllcy4uLiAnSG9zdDonIGlzIHJlcXVpcmVkIGZvciBIVFRQLzEuMSBHRVQgYWNjb3JkaW5nIHRvIFJGQzIwNjguCgpWZXJzaW9uIDIuOAogUmFmYWVsIFNhZ3VsYQogLSBzb21lIGxpdHRsZSBtb2RpZmljYXRpb25zCgpWZXJzaW9uIDIuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIFJlbW92ZWQgdGhlIC1sIG9wdGlvbiBhbmQgaW50cm9kdWNlZCB0aGUgLWYgb3B0aW9uIGluc3RlYWQuIE5vdyBJJ2xsCiAgIHJld3JpdGUgdGhlIGZvcm1lciAtbCBrbHVkZ2UgaW4gYW4gZXh0ZXJuYWwgc2NyaXB0IHRoYXQnbGwgdXNlIHVybGdldCB0bwogICBmZXRjaCBtdWx0aXBhcnQgZmlsZXMgbGlrZSB0aGF0LgogLSAnLWYnIGlzIGludHJvZHVjZWQsIGl0IG1lYW5zIEZhaWwgd2l0aG91dCBvdXRwdXQgaW4gY2FzZSBvZiBIVFRQIHNlcnZlcgogICBlcnJvcnMgKHJldHVybiBjb2RlID49MzAwKS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgLXIsIHJhbmdlcy4gU3BlY2lmeSB3aGljaCBwYXJ0IG9mIGEgZG9jdW1lbnQgeW91IAogICB3YW50LCBhbmQgb25seSB0aGF0IHBhcnQgaXMgcmV0dXJuZWQuIE9ubHkgd2l0aCBIVFRQLzEuMS1zZXJ2ZXJzLgogLSBTcGxpdCB1cCB0aGUgc291cmNlIGluIDMgcGFydHMuIE5vdyBhbGwgcHVyZSBVUkwgZnVuY3Rpb25zIGFyZSBpbgogICB1cmxnZXQuYyBhbmQgc3R1ZmYgdGhhdCBkZWFscyB3aXRoIHRoZSBzdGFuZC1hbG9uZSBwcm9ncmFtIGlzIGluIG1haW4uYy4KIC0gSSB0b29rIGEgZmV3IG1pbnV0ZXMgYW5kIHdyb3RlIGFuIGVtYnJ5byBvZiBhIFJFQURNRSBmaWxlIHRvIGV4cGxhaW4KICAgYSBmZXcgdGhpbmdzLgoKVmVyc2lvbiAyLjYKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIHRoZSAtbCAobG9vcCkgdGhpbmcgdXNlIHRoZSBuZXcgQ09ORl9GQUlMT05FUlJPUiB3aGljaCBtYWtlcwogICB1cmxnZXQoKSByZXR1cm4gZXJyb3IgY29kZSBpZiBub24tc3VjY2Vzc2Z1bC4gSXQgYWxzbyB3b24ndCBvdXRwdXQgYW55dGhpbmcKICAgdGhlbi4gTm93IGZpbmFsbHkgcmVtb3ZlZCB0aGUgSFRUUCAxLjAgYW5kIGVycm9yIDQwNCBkZXBlbmRlbmNpZXMuCiAtIEFkZGVkIC1JIHdoaWNoIHVzZXMgdGhlIEhFQUQgcmVxdWVzdCB0byBnZXQgdGhlIGhlYWRlciBvbmx5IGZyb20gYQogICBodHRwLXNlcnZlci4KClZlcnNpb24gMi41CiBSYWZhZWwgU2FndWxhCiAtIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHVzZSBISEg6TU06U1MgaW5zdGVhZCBvZiBvbmx5IHNlY29uZHMuCgpWZXJzaW9uIDIuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHByb2dyZXNzIG1ldGVyLiBJdCBhcHBlYXJzIHdoZW4gZG93bmxvYWRpbmcgPiBCVUZGRVIgU0laRSBhbmQKICAgbXV0ZSBpcyBub3Qgc2VsZWN0ZWQuIEkgZm91bmQgb3V0IHRoYXQgd2hlbiBkb3dubG9hZGluZyBsYXJnZSBmaWxlcyBmcm9tCiAgIHJlYWxseSByZWFsbHkgc2xvdyBzaXRlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGtub3cgdGhlIHN0YXR1cyBvZiB0aGUKICAgZG93bmxvYWQuIERvIG5vdGUgdGhhdCBzb21lIGRvd25sb2FkcyBhcmUgZG9uZSB1bmF3YXJpbmcgb2YgdGhlIHNpemUsIHdoaWNoCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBsZXNzIHRocmlsbGluZyA7KSBJZiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gYSB0dHksCiAgIHRoZSBwcm9ncmVzcyBtZXRlciBpcyBzaHV0IG9mZi4KIC0gSW5jcmVhc2VkIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHJlYWRpbmcuCiAtIEFkZGVkIGxlbmd0aCBjaGVja3MgaW4gdGhlIHVzZXIrcGFzc3dkIHBhcnNpbmcuCiAtIE1hZGUgaXQgZ3JvayB1c2VyK3Bhc3N3ZCBmb3IgSFRUUCBmZXRjaGVzLiBUaGUgdHJpY2sgaXMgdG8gYmFzZTY0CiAgIGVuY29kZSB0aGUgdXNlcitwYXNzd2QgYW5kIHNlbmQgYW4gZXh0cmEgaGVhZGVyIGxpbmUuIFJlYWQgY2hhcHRlciAxMS4xIGluCiAgIFJGQzIwNjggZm9yIGRldGFpbHMuIEkgYWRkZWQgaXQgdG8gYmUgdXNlZCBqdXN0IGxpa2UgdGhlIGZ0cCBvbmUuICBUbyBnZXQgYQogICBodHRwIGRvY3VtZW50IGZyb20gYSBwbGFjZSB0aGF0IHJlcXVpcmVzIHVzZXIgYW5kIHBhc3N3b3JkLCB1c2UgYW4gVVJMCiAgIGxpa2U6CgogICAgICAgIGh0dHA6Ly91c2VyOnBhc3N3ZEB3d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKICAgSSBhbHNvIGFkZGVkIHRoZSAtdSBmbGFnLCBzaW5jZSBXSEVOIFVTSU5HIEEgUFJPWFkgWU9VIENBTidUIFNQRUNJRlkgVEhFCiAgIFVTRVIgQU5EIFBBU1NXT1JEIFdJVEggSFRUUCBMSUtFIFRIQVQuIFRoZSAtdSBmbGFnIHdvcmtzIGZvciBmdHAgdG9vLCBidXQKICAgbm90IGlmIHVzZWQgd2l0aCBwcm94eS4gVG8gZG8gdGhlIHNhbWUgYXMgdGhlIGFib3ZlIG9uZSwgeW91IGNhbiBpbnZva2U6CgogICAgICAgIHVybGdldCAtdSB1c2VyOnBhc3N3ZCBodHRwOi8vd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKClZlcnNpb24gMi4zCiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkICItbyIgb3B0aW9uIChvdXRwdXQgZmlsZSkKIC0gQWRkZWQgVVJHX0hUVFBfTk9UX0ZPVU5EIHJldHVybiBjb2RlLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFBlcmhhcHMgd2Ugc2hvdWxkIGRldGVjdCBhbGwga2luZHMgb2YgZXJyb3JzIGFuZCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhhdAogICBjdXN0b20gc3RyaW5nIGZvciB0aGUgcGFydGljdWxhciA0MDQtZXJyb3IsIHVzZSB0aGUgZXJyb3IgdGV4dCB3ZSBhY3R1YWxseQogICBnZXQgZnJvbSB0aGUgc2VydmVyLiBTZWUgZnVydGhlciBkZXRhaWxzIGluIFJGQzIwNjggKEhUVFAgMS4xCiAgIGRlZmluaXRpb24pLiBUaGUgY3VycmVudCB3YXkgYWxzbyByZWxpZXMgb24gYSBIVFRQLzEuMCByZXBseSwgd2hpY2ggbmV3ZXIKICAgc2VydmVycyBtaWdodCBub3QgZG8uCiAtIExvb3BpbmcgbW9kZSAoIi1sIiBvcHRpb24pLiBJdCdzIGVhc2llciB0byBnZXQgdmFyaW91cyBzcGxpdCBmaWxlcy4KICAgKERhbmllbCdzIG5vdGU6KQogICBVc2UgaXQgbGlrZSAndXJsZ2V0IC1sIDEgaHR0cDovL2Zyb20udGhpcy5zaXRlL2ZpbGUlZC5odG1sJywgd2hpY2ggd2lsbAogICBtYWtlIHVybGdldCB0byBhdHRlbXB0IHRvIGZldGNoIGFsbCBmaWxlcyBuYW1lZCBmaWxlMS5odG1sLCBmaWxlMi5odG1sIGV0YwogICB1bnRpbCBubyBtb3JlIGZpbGVzIGFyZSBmb3VuZC4gVGhpcyBpcyBvbmx5IGEgbW9kaWZpY2F0aW9uIG9mIHRoZQogICBTVEFORF9BTE9ORSBwYXJ0LCBub3RoaW5nIGluIHRoZSB1cmxnZXQoKSBmdW5jdGlvbiB3YXMgbW9kZmlmaWVkIGZvciB0aGlzLgogRGFuaWVsIFN0ZW5iZXJnCiAtIENoYW5nZWQgdGhlIC1oIHRvIGJlIC1pIGluc3RlYWQuIC1oIHNob3VsZCBiZSBwcmVzZXJ2ZWQgdG8gaGVscCB1c2UuCiAtIEJqb3JuIFJlZXNlIGluZGljYXRlZCB0aGF0IEJvcmxhbmQgX21pZ2h0XyB1c2UgJ19XSU4zMicgaW5zdGVhZCBvZiB0aGUKICAgVkMrKyBXSU4zMiBkZWZpbmUgYW5kIHRoZXJlZm9yZSBJIGFkZGVkIGEgbGl0dGxlIGZpeCBmb3IgdGhhdC4KClZlcnNpb24gMi4yCiBKb2hhbiBBbmRlcnNzb24KIC0gVGhlIHVybGdldCBmdW5jdGlvbiBkaWRuJ3Qgc2V0IHRoZSBwYXRoIHRvIHVybCB3aGVuIHVzaW5nIHByb3h5LgogLSBGaXhlZCBidWcgd2l0aCBJTUMgcHJveHkuIE5vdyB1c2luZyAoYWxtb3N0KSBjb21wbGV0ZSBHRVQgY29tbWFuZC4KICAKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIGl0IGNvbXBpbGUgb24gU29sYXJpcy4gSGFkIHRvIHJlb3JnYW5pemUgdGhlIGluY2x1ZGVzIGEgYml0LgogICAoc28gV2luMzIsIExpbnV4LCBTdW5PUyA0IGFuZCBTb2xhcmlzIDIgY29tcGlsZSBmaW5lLikKIC0gTWFkZSBKb2hhbidzIGtlZXBhbGl2ZSBrZXl3b3JkIG9wdGlvbmFsIHdpdGggdGhlIC1rIGZsYWcgKHNpbmNlIGl0CiAgIG1ha2VzIGEgbG90IG9mIHVybGdldHMgdGFrZSBhIGxvdCBsb25nZXIgdGltZSkuCiAtIE1hZGUgYSAnLWgnIHN3aXRjaCBpbiBjYXNlIHlvdSB3YW50IHRoZSBIVFRQLWhlYWRlciBpbiB0aGUgb3V0cHV0LgoKVmVyc2lvbiAyLjEKIERhbmllbCBTdGVuYmVyZyBhbmQgS2plbGwgRXJpY3NvbgogLSBXaW4zMi1jb21waWxhYmxlCiAtIE5vIG1vcmUgZ2xvYmFsIHZhcmlhYmxlcwogLSBNdXRlIG9wdGlvbiAobm8gb3V0cHV0IGF0IGFsbCB0byBzdGRlcnIpCiAtIEZ1bGwgcmFuZ2Ugb2YgcmV0dXJuIGNvZGVzIGZyb20gdXJsZ2V0KCksIHdoaWNoIGlzIG5vdyB3cml0dGVuIHRvIGJlIGEKICAgZnVuY3Rpb24gZm9yIGVhc3ktdG8tdXNlIGluIFtvdGhlcl0gcHJvZ3JhbXMuCiAtIERlZmluZSBTVEFORF9BTE9ORSB0byBjb21waWxlIHRoZSBzdGFuZCBhbG9uZSB1cmxnZXQgcHJvZ3JhbQogLSBOb3cgY29tcGlsZXMgd2l0aCBnY2Mgb3B0aW9ucyAtYW5zaSAtV2FsbCAtcGVkYW50aWMgOykKClZlcnNpb24gMi4wCiAtIEludHJvZHVjaW5nIGZ0cCBHRVQgc3VwcG9ydC4gVGhlIEZUUCBVUkwgdHlwZSBpcyByZWNvZ25pemVkIGFuZCB1c2VkLgogLSBSZW5hbWVkIHRoZSBwcm9qZWN0IHRvICd1cmxnZXQnLgogLSBTdXBwb3J0cyB0aGUgdXNlcitwYXNzd2QgaW4gdGhlIEZUUCBVUkwgKG90aGVyd2lzZSBpdCB0cmllcyBhbm9ueW1vdXMKICAgbG9naW4gd2l0aCBhIHdlaXJkIGVtYWlsIGFkZHJlc3MgYXMgcGFzc3dvcmQpLgoKVmVyc2lvbiAxLjUKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgc2tpcF9oZWFkZXIoKSBjcmFwIG1lc3NlZCBpdCB1cCBiaWctdGltZS4gQnkgc2ltcGx5IHJlbW92aW5nIHRoYXQKICAgb25lIHdlIGNhbiBhbGwgb2YgYSBzdWRkZW4gZG93bmxvYWQgYW55dGhpbmcgOykKIC0gTm8gbG9uZ2VyIHJlcXVpcmVzIGEgdHJhaWxpbmcgc2xhc2ggb24gdGhlIFVSTHMuCiAtIElmIHRoZSBnaXZlbiBVUkwgaXNuJ3QgcHJlZml4ZWQgd2l0aCAnaHR0cDovLycsIEhUVFAgaXMgYXNzdW1lZCBhbmQKICAgZ2l2ZW4gYSB0cnkhCiAtICd2b2lkIG1haW4oKScgaXMgaGlzdG9yeS4KClZlcnNpb24gMS40CiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIGdvcGhlciBzb3VyY2UgdXNlZCB0aGUgcHBhdGggdmFyaWFibGUgaW5zdGVhZCBvZiBwYXRoIHdoaWNoIGNvdWxkCiAgIGxlYWQgdG8gZGlzYXN0ZXIuCgpWZXJzaW9uIDEuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIFdlbGwsIEkgYWRkZWQgYSBsYW1lIHRleHQgYWJvdXQgdGhlIHRpbWUgaXQgdG9vayB0byBnZXQgdGhlIGRhdGEuIEkgYWxzbwogICBmb3VnaHQgYWdhaW5zdCBKb2hhbiB0byBwcmV2ZW50IGhpcyAtZiBvcHRpb24gKHRvIHNwZWNpZnkgYSBmaWxlIG5hbWUKICAgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiBpbnN0ZWFkIG9mIHN0ZG91dCkhID0pCiAtIE1hZGUgaXQgd3JpdGUgJ2Nvbm5lY3Rpb24gcmVmdXNlZCcgZm9yIHRoYXQgcGFydGljdWxhciBjb25uZWN0KCkKICAgcHJvYmxlbS4KIC0gUmVudW1iZXJlZCB0aGUgdmVyc2lvbi4gTGV0J3Mgbm90IG1ha2Ugc2lsbHkgMS4wLlggdmVyc2lvbnMsIHRoaXMgaXMKICAgYSBwbGFpbiAxLjMgaW5zdGVhZC4KClZlcnNpb24gMS4yCiBKb2hhbiBBbmRlcnNzb24KIC0gRGlzY292ZXJlZCBhbmQgZml4ZWQgdGhlIHByb2JsZW0gd2l0aCBnZXR0aW5nIGJpbmFyeSBmaWxlcy4gcHV0cygpIGlzCiAgIG5vdyByZXBsYWNlZCB3aXRoIGZ3cml0ZSgpLiAoRGFuaWVsJ3Mgbm90ZTogdGhpcyBhbHNvIGZpeGVkIHRoZSBidWZmZXIKICAgb3ZlcndyaXRlIHByb2JsZW0gSSBmb3VuZCBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbi4pCgogUmFmYWVsIFNhZ3VsYQogLSBMZXQgIi1wIiBiZWZvcmUgIi14Ii4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQnVnZml4ZWQgdGhlIHByb3h5IHVzYWdlLiBJdCBzaG91bGQgKk5PVCogdXNlIG5vciBzdHJpcCB0aGUgcG9ydCBudW1iZXIKICAgZnJvbSB0aGUgVVJMIGJ1dCBzaW1wbHkgcGFzcyB0aGF0IGluZm9ybWF0aW9uIHRvIHRoZSBwcm94eS4gVGhpcyBhbHNvCiAgIG1hZGUgdGhlIHVzZXIvcGFzc3dvcmQgZmllbGRzIHBvc3NpYmxlIHRvIHVzZSBpbiBwcm94eSBbZnRwLV0gVVJMcy4KICAgKGxpa2UgaW4gZnRwOi8vdXNlcjpwYXNzd29yZEBmdHAubXkuc2l0ZTo4MDIxL1JFQURNRSkKCiBKb2hhbiBBbmRlcnNzb24KIC0gSW1wbGVtZW50ZWQgSFRUUCBwcm94eSBzdXBwb3J0LgogLSBSZWNlaXZlIGJ5dGUgY291bnRlciBhZGRlZC4KCiBCam9ybiBSZWVzZQogLSBJbXBsZW1lbnRlZCBVUkxzIChhbmQgc2tpcHBlZCB0aGUgb2xkIHN5bnRheCkuCiAtIE91dHB1dCBpcyB3cml0dGVuIHRvIHN0ZG91dCwgc28gdG8gYWNoaWV2ZSB0aGUgYWJvdmUgZXhhbXBsZSwgZG86CiAgIGh0dHBnZXQgaHR0cDovLzE0My41NC4xMC42L2luZm9fbG9nby5naWYgPiB0ZXN0LmdpZgoKVmVyc2lvbiAxLjEKIERhbmllbCBTdGVuYmVyZwogLSBBZGp1c3RlZCBpdCBzbGlnaHRseSB0byBhY2NlcHQgbmFtZWQgaG9zdHMgb24gdGhlIGNvbW1hbmQgbGluZS4gV2UKICAgd291bGRuJ3Qgd2FubmEgdXNlIElQIG51bWJlcnMgZm9yIHRoZSByZXN0IG9mIG91ciBsaWZlcywgd291bGQgd2U/CgpWZXJzaW9uIDEuMAogIFJhZmFlbCBTYWd1bGEKICAtIFdyb3RlIHRoZSBpbml0aWFsIGh0dHBnZXQsIHdoaWNoIHN0YXJ0ZWQgYWxsIHRoaXMhCg==