CkB2ZXJiYXRpbQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBAZmlsZSAgICBzdF9yZWFkbWUudHh0CiogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKiBAYnJpZWYgICBUaGlzIGZpbGUgbGlzdHMgdGhlIG1haW4gbW9kaWZpY2F0aW9uIGRvbmUgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIG9uCiogICAgICAgICAgRnJlZVJUT1MgZm9yIGludGVncmF0aW9uIHdpdGggU1RNMzJDdWJlIHNvbHV0aW9uLgoqICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMgb24gRnJlZVJUT1MgaW1wbGVtZW50YXRpb24gb24gU1RNMzJDdWJlLCBwbGVhc2UgcmVmZQoqICAgICAgICAgIHRvIFVNMTcyMiAiRGV2ZWxvcGluZyBBcHBsaWNhdGlvbnMgb24gU1RNMzJDdWJlIHdpdGggRnJlZVJUT1MiCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQ29weXJpZ2h0IChjKSAyMDIyIFNUTWljcm9lbGVjdHJvbmljcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Ciogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwoqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAoqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgoqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKiBTT0ZUV0FSRS4KKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBAZW5kdmVyYmF0aW0KCj09PT09PT0KCiMjIyAwNS1BdWd1c3QtMjAyMiAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgRnJlZVJUT1M6IFVwZGF0ZSB0byBGcmVlUlRPUyB2MTAuNC42CgogICsgQWRkIEFSTV9DTTdfTVBVIHBvcnQgZmlsZXMgZm9yIGFsbCBjb21waWxlcnM6CiAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAKICArIENNU0lTX1JUT1NfVjI6IHVwZGF0ZSBhZ2FpbnN0IHRoZSBsYXRlc3QgQ01TSVMtRnJlZVJUT1MgdjEwLjQuNiByZWxlYXNlCiAgICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwogICAgICAtIENNU0lTX1JUT1NfVjIvZnJlZXJ0b3Nfb3MyLmgKCiAgKyBDTVNJU19SVE9TX1YyOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBmaWxlcyBhcyBjbXNpc19SVE9TMSBpcyBubyBtb3JlIHN1cHBvcnRlZCAKKGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIGNtc2lzX29zMi5oIGZpbGUgdW5kZXIgRHJpdmVycy9DTVNJUy9SVE9TMi9JbmNsdWRlKQogICAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MuaAogICAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmgKCiAgKyBDTVNJU19SVE9TIFYxIDogUmVtb3ZlZCBhcyBpdCdzIG5vIG1vcmUgc3VwcG9ydGVkOgogICAgICAtIENNU0lTX1JUT1MvY21zaXNfb3MuYwogICAgICAtIENNU0lTX1JUT1MvY21zaXNfb3MuaAoKIyMjIDMxLUF1Z3VzdC0yMDIwICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBCdWcgZml4IGZvciBHMCBjb21waWxhdGlvbiBlcnJvciBkdWUgdG8gSVJRbl9UeXBlIG1pc21hdGNoIGJldHdlZW4gRzAgYW5kIG90aGVyIGZhbWlsaWVzCiAgICAgIC0gU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMKICArIEJ1ZyBmaXggd2hlbiB1c2luZyBzeXN0aWNrIGFzIHRpbWViYXNzZSBmb3IgSEFMCiAgICAgIC0gU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMKCiMjIyAyMC1KdWx5LTIwMjAgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIEZyZWVSVE9TOiBVcGRhdGUgdG8gRnJlZVJUT1MgdjEwLjMuMQogIAogICsgQ01TSVNfUlRPU19WMjogdXBkYXRlIGFnYWluc3QgdGhlIGxhdGVzdCBDTVNJUy1GcmVlUlRPUyB2MTAuMy4wIHJlbGVhc2UKICAgICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5jCiAgICAgIC0gQ01TSVNfUlRPU19WMi9mcmVlcnRvc19tcG9vbC5oCiAgICAgIC0gQ01TSVNfUlRPU19WMi9mcmVlcnRvc19vczIuaAoKICArIEFkZCBUaWNrbGVzcyBJZGxlIHN1cHBvcnQgZm9yIENNMjMvQ00zMwogICAgICAtIEdDQy9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIEdDQy9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnQuYwogICAgICAtIElBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogIAogICsgIEZpeCBNUFUgaGFyZGZhdWx0IGJ1ZyBmb3IgQ29ydGV4LU00IE1QVQogICAgICAtIEdDQ1xBUk1fQ000X01QVVxwb3J0LmMKICAgICAgLSBJQVJcQVJNX0NNNF9NUFVccG9ydC5jCiAgICAgIC0gUlZEU1xBUk1fQ000X01QVVxwb3J0LmMKCiAgKyAgQWRkIHN1cHBvcnQgZm9yIDE2IE1QVSByZWdpb25zIHRvIENvcnRleC1NNCBNUFUgcG9ydHMKICAgICAgLSBHQ0MvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKICAgICAgLSBSVkRTL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCgogICsgVXBkYXRlIEFSTV9DTTdfTVBVIHNvdXJjZSBmaWxlcyBmb3IgYWxsIGNvbXBpbGVycwogICAgICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgICAgIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydGFzbS5zCiAgICAgIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAgICAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgICAgIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCgojIyMgMTctSmFudWFyeS0yMDIwICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBGaXggY29tcGlsZSBlcnJvciBpbiB0aGUgR0NDIENNN19NUFUgcG9ydCBjYXVzZWQgYnkgYSBkdXBsaWNhdGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uCiAgICAgIC0gU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwoKIyMjIDEzLURlY2VtYmVyLTIwMTkgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIFJlbW92ZSB3YXJuaW5ncyB0aHJvd24gYnkgRVdBUk0gZm9yIENNMzMvQ00yMyBwb3J0cwogICAgICAtIElBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKCiMjIyAxOS1KdWx5LTIwMTkgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIEZpeCBydW50aW1lIGVycm9yIGluIHRoZSAgSUFSL0NNNF9NUFUgcG9ydAogICAgICAgLSBJQVIvQVJNX0NNNF9NUFUvcG9ydC5jCgojIyMgMTItSnVseS0yMDE5ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBGcmVlUlRPUzogVXBkYXRlIGFnYWluc3QgdGhlIEZyZWVSVE9TIHYxMC4yLjEgcmVsZWFzZQogICAgLSBzdXBwb3J0IGZvciB0aGUgQ00zMyBhbmQgQ00yMyBjb3JlcwoKICArIENNU0lTX1JUT1NfVjI6IHVwZGF0ZSBhZ2FpbnN0IHRoZSBsYXRlc3QgQ01TSVMtRnJlZVJUT1MgdjEwLjIuMCByZWxlYXNlCgogICsgQWRkIE1QVSBzdXBwb3J0IGZvciB0aGUgQ003L3IwcDE6CiAgICAgICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydGFzbS5zCiAgICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgICAgICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCgogICsgY21zaXNfb3MuYzogRml4IGNvbXBpbGUgZXJyb3JzIGJ5IHVzaW5nIHRoZSBjb3JyZWN0IFRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90IHR5cGUgZm9yIHRpbWVyIGNyZWF0aW9uCgojIyMgMjktTWFycy0yMDE5ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBjbXNpc19vcy5jIDogRml4IGJ1ZyBpbiBvc1Bvb2xBbGxvYygpOiBtZW1vcnkgYmxvY2tzIGNhbid0IGJlIHJldXNlZCBhZnRlciBiZWluZyBmcmVlJ2QKICArIFNvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zLCBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczEuYywgU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMsIFNvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5oOiByZXN0b3JlIG9yaWdpbmFsIEFwYWNoZSBsaWNlbnNlIHRlcm1zCiAgKyBzdF9yZWFkbWUudHh0OiB1cGRhdGUgbGljZW5zZSB0ZXJtcyB0byBCU0QtMy1DbGF1c2UKCgojIyMgMTMtQXVndXN0LTIwMTggIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIEFkZCBlbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG1pc3NpbmcgZnVuY3Rpb24gb3NUaHJlYWRHZXRTdGFja1NpemUoKQogICAgdG8gYXZvaWQgbGluayBlcnJvcnMgd2hlbiB1c2luZyBDTVNJUy1SVE9TIFYyLgoKICArIFVwZGF0ZSB0aGUgRnJlZVJUT1NDb25maWdfdGVtcGxhdGUuaCB3aXRoIHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZQogICAgQ01TSVMtUlRPUyBWMi4KCiAgKyBSZW5hbWUgdGhlICJSVEVfUlRPU19GcmVlUlRPU19YWFhYIiBtYWNyb3MgdG8gIlVTRV9GcmVlUlRPU19YWFhYIiBpbgogICAgY21zaXNfb3MyLmMuCgojIyMgMzAtSnVseS0yMDE4ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiArIFVwZGF0ZSBMaWNlbnNlLnR4dCBmaWxlIHRvIE1JVCBsaWNlbnNlIGluc3RlYWQgb2YgR1BMdjIKCiMjIyAyMy1KdWx5LTIwMTggIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICsgRml4IGNvbXBpbGVyIHdhcm5pbmdzIHRocm93biBieSBJQVIgY29tcGlsZXIgOC4yMAoKICsgQWRkIE1QVSBzdXBwb3J0IGZvciB0aGUgQ003L3IwcDE6CiAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucwogIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAoKIyMjIDA5LUFwcmlsLTIwMTggIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICBVcGRhdGUgdGhlIEZyZWVSVE9TIGFnYWluc3QgdGhlIGxhdGVzdCByZWxlYXNlIDEwLjAuMQogIG1vcmUgZGV0YWlscyBhcmUgYXZhaWxhYmxlIGluOiBodHRwczovL3d3dy5mcmVlcnRvcy5vcmcvSGlzdG9yeS50eHQKCiAgKyBJbnRlZ3JhdGUgc3VwcG9ydCBmb3IgdGlja2xlc3MgbW9kZSBmb3IgQVJNX0NNMCBjb3JlOgogICAgLSBHQ0MvQVJNX0NNMC9wb3J0LmMKICAgIC0gR0NDL0FSTV9DTTAvcG9ydG1hY3JvLmgKICAgIC0gSUFSL0FSTV9DTTAvcG9ydC5jCiAgICAtIElBUi9BUk1fQ00wL3BvcnRtYWNyby5oCiAgICAtIFJWRFMvQVJNX0NNMC9wb3J0LmMKCiBJbnRlZ3JhdGUgQ01TSVMtUlRPU3YyIHdyYXBwZXIgYmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9BUk0tc29mdHdhcmUvQ01TSVMtRnJlZVJUT1MvcmVsZWFzZXMvdGFnLzEwLjAuMQogICsgQWRkIG5ldyBmaWxlczoKICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vcy5oCiAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MxLmMKICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwogICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5oCiAgICAgICJjbXNpc19vczEuYyIgYW5kICJjbXNpc19vczEuaCIgY29udGFpbnMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZgogICAgICAgQ01TSVMtUlRPU3YxLGkuZSBhcyByZWxlYXNlZCBieSBBUk0sIHVzaW5nIHRoZSBDTVNJUy1SVE9TVjIgQVBJLgoKICArIFRoZSBTVCBjdXN0b21pemVkIENNU0lTLVJUT1N2MSBpcyBtYWludGFpbmVkIHVuZGVyOgogICAgLSBDTVNJU19SVE9TL2Ntc2lzX29zLmMKICAgIC0gQ01TSVNfUlRPUy9jbXNpc19vcy5oCgogICsgV2hlbiB1c2luZyBDTVNJUy1SVE9TdjIgQVBJcywgdGhlIGZvbGxvd2luZyBGcmVlUlRPUyBkZWZpbmVzIGFyZSByZXF1aXJlZDoKICAgIC0gI2RlZmluZSBjb25maWdNQVhfUFJJT1JJVElFUyAgICAgICAgICAgICAgICAgICAgIDU2CiAgICAtICNkZWZpbmUgY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAgICAgICAgICAwCiAgICAtICNkZWZpbmUgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OICAwCgoKIyMjIDEwLUF1Z3VzdC0yMDE3ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgVXBkYXRlIEZyZWVSVE9TIHRvIHN1cHBvcnQgTVBVIGZlYXR1cmUgd2l0aCBJQVIgY29tcGlsZXIuCgogICsgQWRkIHRoZSBmb2xsb3dpbmcgcG9ydHM6CiAgICAtIElBUi9BUk1fQ000X01QVQogICAgLSBJQVIvQVJNX0NNN19NUFUKICAgIC0gUlZEUy9BUk1fQ003X01QVQoKCiMjIyAwMy1NYXJjaC0yMDE3ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgVXBkYXRlIENNU0lTLVJUT1MgZHJpdmVycyB0byBzdXBwb3J0IGJvdGggQ01TSVMgQ29yZSBWNC54IGFuZCBWNS54CgogIEJ1ZyBmaXhlczoKICArIENNU0lTLVJUT1M6IFdyb25nIHJldHVybiB2YWx1ZSBmb3Igb3NTaWduYWxXYWl0KCkKICArIENNU0lTLVJUT1M6IE5vdCBhbGwgcXVldWUgc2l6ZSBpcyAwIGluaXRpYWxpemVkIHdpdGggb3NNYWlsQ0FsbG9jKCkKCiAgTGltaXRhdGlvbjoKICArIENNU0lTLVJUT1M6IG9zU2lnbmFsV0FpdCgpIGZ1bmN0aW9uIGlzIG5vdCBmdWxseSBjb21wbGlhbnQgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbgoKCiMjIyAzMC1TZXB0ZW1iZXItMjAxNiAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogIFRoZSBwdXJwb3NlIG9mIHRoaXMgcmVsZWFzZSBpcyB0byBVcGdyYWRlIHRvIHVzZSBGcmVlUlRPUyBWOS4wLjAsIHRoaXMgdmVyc2lvbgogIGlzIGEgZHJvcC1pbiBjb21wYXRpYmxlIHJlcGxhY2VtZW50IGZvciBGcmVlUlRPUyBWOC4yLjMuCiAgRm9yIG1vcmUgZGV0YWlscyBwbGVhc2UgcmVmZXIgdG8gaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvSGlzdG9yeS50eHQKCiAgKyBBZGQgc3VwcG9ydCB0byB0aWNrbGVzcyBtb2RlIGZvciBNUFUgcG9ydHM6CiAgICAtIEdDQy9BUk1fQ00zX01QVS9wb3J0LmMKICAgIC0gR0NDL0FSTV9DTTRfTVBVL3BvcnQuYwogICAgLSBSVkRTL0FSTV9DTTRfTVBVL3BvcnQuYwoKICArIFVwZGF0ZSBDTTAgcG9ydHMsIGFkZCBwb3NzaWJpbGl0eSB0byB1c2UgYSB0aW1lYmFzZSBkaWZmZXJlbnQgdGhhbiBTeXN0aWNrOgogICAgLSBJQVIvQVJNX0NNMC9wb3J0LmMKICAgIC0gUlZEUy9BUk1fQ00wL3BvcnQuYwogICAgLSBHQ0MvQVJNX0NNMC9wb3J0LmMKCiAgKyBGaXggY29tcGlsYXRpb24gZXJyb3IgaW4gQ00zX01QVSBhbmQgQ000X01QVSBwb3J0czoKICAgIC0gR0NDL0FSTV9DTTNfTVBVL3BvcnRtYWNyby5oCiAgICAtIEdDQy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaAogICAgLSBSVkRTL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCiAgICAtIEFkZCAiU291cmNlXHBvcnRhYmxlXENvbW1vblwiIGRpcmVjdG9yeQoKICArIGNtc2lzX29zLmMKICAgIC0gQWRkIHN1cHBvcnQgb2YgU3RhdGljYWxseSBBbGxvY2F0ZWQgU3lzdGVtcyBpbnRyb2R1Y2VkIHdpdGggRnJlZVJUT1MgVjkuMC4wCiAgICAtIEFkZCBuZXcgd3JhcHBlcnMgQ01TSVMtUlRPUyBBUElzCgogICAgICAgICBGcmVlUlRPUyBBUElzICAgICAgIHwgICAgIENNU0lTLVJUT1MgQVBJcyAgICAgICAgfCAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZygpIHwgIG9zTWVzc2FnZVdhaXRpbmcoKSAgICAgICAgfCAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIGEgcXVldWUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB4VGFza0Fib3J0RGVsYXkoKSAgICAgICAgfCAgb3NBYm9ydERlbGF5KCkgICAgICAgICAgICB8ICBGb3JjZSBhIHRocmVhZCB0byBnZXQgb3V0IHRoZSBibG9ja2VkIHN0YXRlIGltbWVkaWF0ZWx5CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdXhTZW1hcGhvcmVHZXRDb3VudCgpICAgIHwgIG9zU2VtYXBob3JlR2V0Q291bnQoKSAgICAgfCAgUmV0dXJuIHRoZSBjdXJyZW50IGNvdW50IG9mIGEgc2VtYXBob3JlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdXhRdWV1ZVNwYWNlc0F2YWlsYWJsZSgpIHwgIG9zTWVzc2FnZUF2YWlsYWJsZVNwYWNlKCkgfCAgUmV0dXJuIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gYSBtZXNzYWdlIHF1ZXVlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdlF1ZXVlRGVsZXRlKCkgICAgICAgICAgIHwgIG9zTWVzc2FnZURlbGV0ZSgpICAgICAgICAgfCAgRGVsZXRlIGEgbWVzc2FnZSBRdWV1ZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojIyMgMjItSmFudWFyeS0yMDE2ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PQogIFRoZSBwdXJwb3NlIG9mIHRoaXMgcmVsZWFzZSBpcyB0byBVcGdyYWRlIHRvIHVzZSBGcmVlUlRPUyBWOC4yLjMuCiAgSXQgYWxzbyBwcm92aWRlcyBmaXhlcyBmb3IgbWlub3IgaXNzdWVzLgoKICArIGNtc2lzX29zLmMKICAgIC0gSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zICJvc1NpZ25hbFNldCIgYW5kICJvc1NpZ25hbFdhaXQiIGFyZSBub3cgZGVsaW1pdGVkIGJ5CiAgICAgICAgICNkZWZpbmUgY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUy4KICAgIC0gRnVuY3Rpb24gIm9zVGltZXJTdGFydCIgOiBmaXggZm9yIGFuIGFzc2VydCBpc3N1ZSB3aGVuIGNhbGxlZCBmcm9tIGFuIElTUi4KICAgIC0gRnVuY3Rpb24gIm9zTWFpbENyZWF0ZSIgIDogaW50ZXJuYWwgdmFyaWFibGVzIGluaXRpYWxpemF0aW9uLgogICAgLSBGdW5jdGlvbiAib3NTaWduYWxXYWl0IiA6IHNpZ25hbHMgdmFsdWUgaXMgbm93IGNvbXBhcmVkIHZlcnN1cyBpbnRlZ2VyIHplcm8gZm9yIGVycm9yIGNoZWNraW5nLgoKICArIGZyZWVSVE9TIHNvdXJjZXMKICAgIC0gRnJlZVJUT1MuaCBmaWxlIDogQWRkIGNvbmZpZ3VyYXRpb24gc2FuaXR5IGNoZWNrIGluIGNhc2Ugb2YgY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTICBzZXQKICAgICAgYW5kIGNvbmZpZ1VTRV9NVVRFWEVTICBub3Qgc2V0LgoKICArIFNUTWljcm9lbGVjdHJvbmljcyBsaWNlbnNlIHNpbXBsaWZpY2F0aW9ucywgc2VlIGxpY2Vuc2UgZGlzY2xhaW1lciB3aXRoaW4gdGhpcyBmaWxlJ3MgaGVhZGVyCgoKIyMjIDI3LU1hcmNoLTIwMTUgIyMjCj09PT09PT09PT09PT09PT09PT09PQogIFRoZSBwdXJwb3NlIG9mIHRoaXMgcmVsZWFzZSBpcyB0byBVcGdyYWRlIHRvIHVzZSBGcmVlUlRPUyBWOC4yLjEuCgogICsgTWFqb3IgY2hhbmdlIG9mIHRoZSB2ZXJzaW9uIDguMi4xIGlzIHRoZSBzdXBwb3J0IG9mIENNNyBjb3JlLgogIEZvciBTVE0zMkY3NDZ4eC9TVE0zMkY3NTZ4eCBkZXZpY2VzLCBuZWVkIHRvIHVzZSBwb3J0IGZpbGVzIHVuZGVyIFNvdXJjZS9Qb3J0YWJsZS9YWFgvQVJNX0NNNy9yMHAxLAogIHdoZXJlIFhYWCByZWZlcnMgdG8gdGhlIGNvbXBpbGVyIHVzZWQuCgogICsgSXQgYWxzbyBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBvc1NpZ25hbCBtYW5hZ2VtZW50IEFQSXMsIG9zU2lnbmFsU2V0KCkgYW5kIG9zU2lnbmFsV2FpdCgpLAogIGZpeGVzIG9zTWFzc2FnZSBxdWV1ZSBzaXplLCBvc01haWxRRGVmIG1hY3JvIGFuZCBvc0RlbGF5VW50aWwgcGFyYW1ldGVycy4KCiAgKyBJbiB0aGlzIHJlbGVhc2UgYW4gYWxpZ25tZW50IGhhcyBiZWVuIGRvbmUgaW4gQVJNX0NNNCBhbmQgQVJNX0NNMyBwb3J0LmMgdmVyc3VzIEFSTV9DTTAgcG9ydC5jCiAgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgbWFjcm9zIGNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HIGFuZCBjb25maWdQT1NUX1NMRUVQX1BST0NFU1NJTkcsIHRoZXNlIHRvdyBtYWNyb3MKICBhcmUgbm93IHRha2luZyBhcyBwYXJhbWV0ZXIgYXMgcG9pbnRlciB0byBUaWNrVHlwZV90LgoKICArIGNtc2lzX29zLmMKICAgIC0gQWRkIGltcGxlbWVudGF0aW9uIG9mIG9zU2lnbmFsU2V0KCkgYW5kIG9zU2lnbmFsV2FpdCgpIEFQSXMKICAgIC0gRml4IG1hc3NhZ2UgcXVldWUgc2l6ZSBpbiBvc01lc3NhZ2VDcmVhdGUgQVBJCiAgICAtIG9zRGVsYXlVbnRpbDogcGFyYW1ldGVyIFByZXZpb3VzV2FrZVRpbWUgaXMgbm93IHBhc3NlZCBhcyBhIHBvaW50ZXIuCiAgICAtIEVuYWJsaW5nIE1haWwgcXVldWUgbWFuYWdlbWVudCBBUElzICh0ZW1wb3JhcnkgcmVtb3ZlZCBpbiBwcmV2aW91cyB2ZXJzaW9uKS4KICAgIC0gRnVuY3Rpb24gIm9zVGhyZWFkR2V0UHJpb3JpdHkiIHVzZXMgbm93IHV4VGFza1ByaW9yaXR5R2V0RnJvbUlTUiBpZiBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgaWYgbm90IHVzZSB1eFRhc2tQcmlvcml0eUdldC4KCiAgKyBjbXNpc19vcy5oCiAgICAtIG9zRmVhdHVyZV9XYWl0IGlzIGRlZmluZWQgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IG9zV2FpdCBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIChhcyBzcGVjaWZpZWQgYnkgY21zaXNfb3MgdGVtcGxhdGUgYnkgQVJNKQogICAgLSBGaXggY29tcGlsYXRpb24gaXNzdWUgd2l0aCBvc01haWxRRGVmIG1hY3JvLgogICAgLSBFbmFibGluZyBNYWlsIHF1ZXVlIG1hbmFnZW1lbnQgQVBJcyAodGVtcG9yYXJ5IHJlbW92ZWQgaW4gcHJldmlvdXMgdmVyc2lvbikKCiAgKyBmcmVlUlRPUyBzb3VyY2VzCiAgICAtIEFSTV9DTTMgcG9ydC5jIGFuZCBBUk1fQ000IHBvcnQuYzoKICAgICAgZnVuY3Rpb24gdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAgOiBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyBhbmQgY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HIGFyZSBub3cgdGFraW5nCiAgICAgIGFzIHBhcmFtZXRlciBhcyBwb2ludGVyIHRvIFRpY2tUeXBlX3QuCiAgICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2hhbmdlIGlzIHRvIGFsaWduIHRoZSBDTTMgYW5kIENNNCBpbXBsZW1lbnRhdGlvbiB3aXRoIENNMCBvbmUuCgogICsgTm90ZQogICAgLSBvc1NpZ25hbFNldCByZXR1cm5zIGFuIGludDMyX3QgdmFsdWUgd2hpY2ggaXMgYSBhIHN0YXR1cyAob3NPSyBvciBvc0Vycm9yKQogICAgICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBzaWduYWwgdmFsdWUgYXMgc3BlY2lmaWVkIGluIGNtc2lzX29zIHRlbXBsYXRlIGJ5IEFSTS4KICAgICAgVGhpcyBpcyBtYWlubHkgZHVlIHRvIGZyZWVSVE9TIGltcGxlbWVudGF0aW9uLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYWxpZ25lZCAod2l0aCB0aGUgY21zaXMgb3MgdGVtcGxhdGUgYnkgQVJNKSBhcyBzb29uIGFzIHRoZSBmcmVlUlRPUyBuZXh0IHZlcnNpb24gd2lsbCBhbGxvdyBpdC4KCiAgICAtIG9zVGhyZWFkRGVmKCkgbWFjcm8gaXMgZGVmaW5lZCBpbiB0aGUgZnJlZVJUT1MgY21zaXNfb3MuaCB3cmFwcGVyIGFzIGZvbGxvdyA6CiAgICAgICAgb3NUaHJlYWREZWYobmFtZSwgdGhyZWFkLCBwcmlvcml0eSwgaW5zdGFuY2VzLCBzdGFja3N6KQogICAgICB0aGUgbWFjcm8gb3NUaHJlYWREZWYoKSBhcyBkZWZpbmVkIGluIEFSTSBjbXNpc19vcy5oIGlzIGRlZmluZWQgd2l0aCA0IHBhcmFtZXRlcnMgOgogICAgICBuYW1lIDogbmFtZSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgogICAgICBwcmlvcml0eSA6IGluaXRpYWwgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KICAgICAgaW5zdGFuY2VzIDogbnVtYmVyIG9mIHBvc3NpYmxlIHRocmVhZCBpbnN0YW5jZXMuCiAgICAgIHN0YWNrc3ogOiBzdGFjayBzaXplIChpbiBieXRlcykgcmVxdWlyZW1lbnRzIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgoKICAgIC0gb3NUaHJlYWREZWYgYXMgZGVmaW5lZCBpbiB0aGUgQVJNIHRlbXBsYXRlIGZpbGUgY21zaXNfb3MuaCBhc3N1bWVzIHRoYXQgdGhlIHRocmVhZCBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSB0aHJlYWQgZnVuY3Rpb24gbmFtZS4KICAgICAgd2hlcmUgdGhlIGZyZWVSVE9TIGltcGxlbWVudGF0aW9uIGdpdmVzIHNlcGFyYXRlIHBhcmFtZXRlcnMgZm9yIHRoZSB0aHJlYWQgbmFtZSBhbmQgdGhlIHRocmVhZCBmdW5jdGlvbiBuYW1lLgoKICAgICAgY2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gcG9ydGluZyBhbiBhcHBsaWNhdGlvbiBmcm9tL3RvIGFub3RoZXIgT1MgdG8vZnJvbSBmcmVlUlRPUyBjbXNpc19vcyByZWdhcmRpbmcgdGhpcyBtYWNyby4KCiAgICAgICAgdGhlIG1hY3JvIG9zVGhyZWFkRGVmKCkgYXMgZGVmaW5lZCBpbiBBUk0gY21zaXNfb3MuaCB0ZW1wbGF0ZSBpcyBkZWZpbmVkIHdpdGggNCBwYXJhbWV0ZXJzIDoKICAgICAgICAgICBuYW1lIDogbmFtZSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgogICAgICAgICAgIHByaW9yaXR5IDogaW5pdGlhbCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgogICAgICAgICAgIGluc3RhbmNlcyA6IG51bWJlciBvZiBwb3NzaWJsZSB0aHJlYWQgaW5zdGFuY2VzLgogICAgICAgICAgIHN0YWNrc3ogOiBzdGFjayBzaXplIChpbiBieXRlcykgcmVxdWlyZW1lbnRzIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgoKICAgICAgICB0aGUgbWFjcm8gb3NUaHJlYWREZWYoKSBhcyBkZWZpbmVkIGluIGZyZWVSVE9TIGNtc2lzX29zLmggaXMgZGVmaW5lZCB3aXRoIDUgcGFyYW1ldGVycyA6CiAgICAgICAgICAgbmFtZSA6IG5hbWUgb2YgdGhlIHRocmVhZCAodXNlZCBmb3IgZGVidWdnaW5nIGFuZCB0cmFjZSkuCiAgICAgICAgICAgdGhyZWFkIDogbmFtZSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uCiAgICAgICAgICAgcHJpb3JpdHkgOiBpbml0aWFsIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCiAgICAgICAgICAgaW5zdGFuY2VzIDogbnVtYmVyIG9mIHBvc3NpYmxlIHRocmVhZCBpbnN0YW5jZXMuCiAgICAgICAgICAgc3RhY2tzeiA6IHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCgoKIyMjIDI1LURlY2VtYmVyLTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PQogIFRoZSBwdXJwb3NlIG9mIHRoaXMgcmVsZWFzZSBpcyB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3JzIGFuZCB3YXJuaW5nLiBJdCBhbHNvIHJlaW50cm9kdWNlcwogIHRoZSBmdW5jdGlvbiBvc1RocmVhZElzU3VzcGVuZGVkKCkgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZCBpbiB0aGUgdmVyc2lvbiBWMS4yLjAuCgogICsgY21zaXNfb3MuYwogICAgICAtIG9zVGhyZWFkR2V0UHJpb3JpdHkoKSBhbmQgbWFrZUNtc2lzUHJpb3JpdHkoKTogcmVwbGFjZSBJTkNMVURFX3ZUYXNrUHJpb3JpdHlHZXQgYnkgdGhlIGNvcnJlY3QKICAgICAgICAgZnJlZVJUT1MgY29uc3RhbnQgdXhUYXNrUHJpb3JpdHlHZXQuCiAgICAgICAgIFRoZSB2ZXJzaW9uIDEuMi4yIGlzIHVzaW5nIGEgd3JvbmcgY29uc3RhbnQgSU5DTFVERV92VGFza1ByaW9yaXR5R2V0LCB3aGlsZSB0aGUgY29ycmVjdCBmcmVlUlRPUwogICAgICAgICBjb25zdGFudCBpcyB1eFRhc2tQcmlvcml0eUdldC4KICAgICAgICAgVGhpcyBmaXggZW5zdXJlIGEgc2FmZSB1c2Ugb2Ygb3NUaHJlYWRHZXRQcmlvcml0eSgpIGZ1bmN0aW9uLgoKICAgICAgLSBvc1RocmVhZElzU3VzcGVuZGVkKCk6IHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBpbiB2ZXJzaW9uIFYxLjIuMCwgaXQgaXMgbm93IGF2YWlsYWJsZSBnYWluLgogICAgICAgICBVc2VyIGNhbiBlaXRoZXIgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBUaHJlYWQgaXMgc3VzcGVuZGVkIGVpdGhlciB1c2UgZnVuY3Rpb24gb3NUaHJlYWRHZXRTdGF0ZSwKICAgICAgICAgd2hpY2ggaXMgbW9yZSBnZW5lcmljLCB0byBjaGVjayB0aGUgZXhhY3Qgc3RhdGUgb2YgYSB0aHJlYWQuCgogICAgICAtIG9zVGhyZWFkTGlzdCgpOiB0aGlzIGZ1bmN0aW9uIGlzIG5vdyB0YWtpbmcgYXMgYXJndW1lbnQgYSBwb2ludGVyIHRvIHVpbnQ4X3QgaW5zdGVhZCBvZiBhIHBvaW50ZXIgdG8gaW50OF90LgogICAgICAgICBUaGUgY2hhbmdlIGlzIG1hZGUgdG8gcmVtb3ZlIGEgY29tcGlsYXRpb24gd2FybmluZy4KCiAgICAgIC0gb3NSZWN1cnNpdmVNdXRleENyZWF0ZSgpOiB0aGUgcHJvdG90eXBlIGhhcyBiZWVuIGNoYW5nZWQgdG8gb3NNdXRleElkIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUgKGNvbnN0IG9zTXV0ZXhEZWZfdCAqbXV0ZXhfZGVmKQogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgbWFkZSB0byBtYWtlIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUoKSBjb21wYXRpYmxlIHdpdGggZnVuY3Rpb24gTXV0ZXhDcmVhdGUoKS4KICAgICAgICAgIEl0IGFsc28gYWxsb3cgdGhlIGJldHRlciB1c2Ugb2YgdGhlIGZ1bmN0aW9uIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1hY3JvIG9zTXV0ZXgsIG5vdGUgdGhhdCBvc011dGV4IHJldHVybiBhCiAgICAgICAgICAiY29uc3Qgb3NNdXRleERlZl90ICptdXRleF9kZWYiLgogICAgICAgICAgZXhhbXBsZSA6IG9zTXV0ZXgxSWQgPSBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlIChvc011dGV4KE11dGV4MSkpOwoKICAgICAgLSBGaXggaW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIG9zU2VtYXBob3JlV2FpdCgpLCBvc011dGV4UmVsZWFzZSgpIGFuZCBvc011dGV4V2FpdCgpIGJ5IHVzaW5nIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICBmcmVlUlRPUyCTRnJvbUlTUpQgQVBJcyB3aGVuIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdC4KCiAgICAgIC0gRml4IGNvbXBpbGF0aW9uIHdhcm5pbmcgd2hlbiB0aGUgY29uc3RhbnQgSU5DTFVERV9lVGFza0dldFN0YXRlIGlzIG5vdCBkZWZpbmVkCgogICsgY21zaXNfb3MuaAogICAgICAtIG9zVGhyZWFkSXNTdXNwZW5kZWQoKTogYWRkIGZ1bmN0aW9uIHByb3RvdHlwZS4KICAgICAgLSBvc1RocmVhZExpc3QoKTogZnVuY3Rpb24gcHJvdG90eXBlIG1vZGlmaWVkIGFzIGRlc2NyaWJlZCBpbiBjbXNpc19vcy5jIHNlY3Rpb24uCiAgICAgIC0gb3NSZWN1cnNpdmVNdXRleENyZWF0ZSgpOiBmdW5jdGlvbiBtb2RpZmllZCBhcyBkZXNjcmliZWQgaW4gY21zaXNfb3MuYyBzZWN0aW9uLgoKICArIEltcG9ydGFudCBub3RlOgogICAgTWFpbCBRdWV1ZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNtc2lzX29zIHZlcnNpb24sIHdpbGwgYmUgYWRkZWQgaW4gdGhlIG5leHQgcmVsZWFzZS4KCgojIyMgMDQtRGVjZW1iZXItMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBjbXNpc19vcy5jLCBvc1NlbWFwaG9yZUNyZWF0ZSgpOiB1c2UgdlNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIGluc3RlYWQgb2YgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpLAogICAgdG8ga2VlcCBjb21wYXRpYmlsaXR5IHdpdGggYXBwbGljYXRpb24gY29kZSBkZXZlbG9wZWQgb24gRnJlZVJUT1MgVjcuNi4wLgoKCiMjIyAwNy1Ob3ZlbWJlci0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT0KICArIGNtc2lzX29zLmg6IG1vZGlmeSB0aGUgb3NUaHJlYWRTdGF0ZSBlbnVtIHRvIGZpeCB3YXJuaW5nIGdlbmVyYXRlZCBieSBBUk1DQyBjb21waWxlcgogICsgdGFzay5jOiBhZGQgcHJlcHJvY2Vzc29yIGNvbXBpbGF0aW9uIGNvbmRpdGlvbiBmb3IgcHJ2VGFza0lzVGFza1N1c3BlbmRlZCgpIGZ1bmN0aW9uCiAgICAgICAgICAgIChpdCdzIGJ1aWxkIG9ubHkgd2hlbiBJTkNMVURFX3ZUYXNrU3VzcGVuZCBvcHRpb24gaXMgZW5hYmxlZCBpbiBGcmVlUlRPU0NvbmZpZy5oIGZpbGUpCgoKIyMjIDA0LU5vdmVtYmVyLTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PQogICsgVXBncmFkZSB0byB1c2UgRnJlZVJUT1MgVjguMS4yIGFuZCBDTVNJUy1SVE9TIFYxLjAyLgogICsgY21zaXNfb3MuYwogICAgICAtIEFsbW9zdCBvZiBDTVNJUy1SVE9TIEFQSXMgYXJlIGltcGxlbWVudGVkIGZvciBGcmVlUlRPUwogICAgICAtIEFkZGl0aW9uYWwgd3JhcHBlciBBUElzIGNyZWF0ZWQgZm9yIEZyZWVSVE9TCgogICsgSW1wb3J0YW50IG5vdGU6CiAgICBXaGVuIHVwZ3JhZGluZyBleGlzdGluZyBhcHBsaWNhdGlvbiBjb2RlIHRvIHVzZSB0aGlzIGxhc3QgdmVyc2lvbiwgdGhlIGZvbGxvd2luZwogICAgdXBkYXRlIHNob3VsZCBiZSBjb25zaWRlcmVkOgogICAgICAtIG9zVGhyZWFkSXNTdXNwZW5kZWQoKSBpcyBubyBsb25nZXIgcHVibGljIEFQSSBpbiBGcmVlUlRPUyBhbmQgaXQgc2hvdWxkCiAgICAgICAgYmUgcmVwbGFjZWQgYnkgdGhlIHdyYXBwaW5nIG9mIGVUYXNrR2V0U3RhdGUoKQogICAgICAtIG9zS2VybmVsU3RhcnQoKSBBUEkgY2hhbmdlZCwgbXVzdCBiZSB1cGRhdGVkCiAgICAgIC0gdXBkYXRlIEZyZWVSVE9TQ29uZmlnLmggZmlsZSwgdGFraW5nIEZyZWVSVE9TQ29uZmlnX3RlbXBsYXRlLmggZmlsZSBhcyByZWZlcmVuY2UKCgojIyMgMTMtSnVuZS0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PQogICsgRnJlZVJUT1NDb25maWdfdGVtcGxhdGUuaDogYWRkIHRoaXMgZGVmaW5pdGlvbiAjZGVmaW5lIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBlbmFibGUgdGhlIHVzZSBvZiB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgQVBJIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29kZS4KCgojIyMgMzAtQXByaWwtMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT09CiAgKyBjbXNpc19vcy5jOiBhZGQgcHJlcHJvY2Vzc29yIGNvbXBpbGF0aW9uIGNvbmRpdGlvbiB3aGVuIGNhbGxpbmcgc29tZSBGcmVlUlRPUyBBUElzLCB0byBhdm9pZCBsaW5rCiAgICAgICAgICAgICAgICBlcnJvcnMgd2l0aCBNREstQVJNIHdoZW4gc29tZSBGcmVlUlRPUyBmZWF0dXJlcyBhcmUgbm90IGVuYWJsZWQgaW4gRnJlZVJUT1NDb25maWcuaAoKCiMjIyAyMi1BcHJpbC0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PT0KICArIEFkZCBUaWNrbGVzIG1vZGUgZm9yIENNMCBwb3J0IChJQVIsIEdDQywgUlZEUykuCgoKIyMjIDE4LUZlYnJ1YXJ5LTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PQogICArIEZyZWVSVE9TIFY3LjYuMCBjdXN0b21pemVkIHZlcnNpb24gZm9yIFNUTTMyQ3ViZSBzb2x1dGlvbi4KCgogKiA8aDM+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDM+CiAqLwo=