Ly8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0ICAtICBST1VTU0VUICAtDQovLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIERJU0NMQUlNRVI6ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQovLyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KLy8qIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQovLyogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCi8vKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQovLyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQovLyogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KLy8qIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQovLyogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KLy8qIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQovLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIEZpbGUgTmFtZSAgICAgICAgICAgOiBsaWJfQVQ5MVNBTTdYMjU2LmgNCi8vKiBPYmplY3QgICAgICAgICAgICAgIDogQVQ5MVNBTTdYMjU2IGlubGluZWQgZnVuY3Rpb25zDQovLyogR2VuZXJhdGVkICAgICAgICAgICA6IEFUOTEgU1cgQXBwbGljYXRpb24gR3JvdXAgIDA1LzIwLzIwMDUgKDE2OjIyOjI5KQ0KLy8qDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGJndS5oLzEuMS9GcmkgSmFuIDMxIDEyOjE4OjQwIDIwMDMvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BtY19TQU03WC5oLzEuMS9UdWUgRmViICAxIDA4OjMyOjEwIDIwMDUvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1ZSRUdfNjA4NUIuaC8xLjEvVHVlIEZlYiAgMSAxNjoyMDo0NyAyMDA1Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9yc3RjXzYwOThBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MjAgMjAwNC8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3NjLmgvMS40L0ZyaSBKYW4gMzEgMTI6MTk6MjAgMjAwMy8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfd2R0Y182MDgwQS5oLzEuMS9XZWQgT2N0ICA2IDEwOjM4OjMwIDIwMDQvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VzYXJ0LmgvMS41L1RodSBOb3YgMjEgMTY6MDE6NTQgMjAwMi8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3BpMi5oLzEuMS9Nb24gQXVnIDI1IDE0OjIzOjUyIDIwMDMvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BpdGNfNjA3OUEuaC8xLjIvVHVlIE5vdiAgOSAxNDo0Mzo1NiAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9haWNfNjA3NWIuaC8xLjEvRnJpIE1heSAyMCAxNDowMToxOSAyMDA1Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZXNfNjE0OWEuaC8xLjEvTW9uIEphbiAxNyAwNzo0MzowOSAyMDA1Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl90d2kuaC8xLjMvTW9uIEp1bCAxOSAxNDoyNzo1OCAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZGMuaC8xLjYvRnJpIE9jdCAxNyAwOToxMjozOCAyMDAzLy8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9ydHRjXzYwODFBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MzggMjAwNC8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdWRwLmgvMS40L1dlZCBGZWIgMTYgMDg6Mzk6MzQgMjAwNS8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGVzM182MTUwYS5oLzEuMS9Nb24gSmFuIDE3IDA5OjE5OjE5IDIwMDUvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3RjXzE3NTNiLmgvMS4xL0ZyaSBKYW4gMzEgMTI6MjA6MDIgMjAwMy8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfTUNfU0FNN1guaC8xLjEvVGh1IE1hciAyNSAxNToxOToxNCAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waW8uaC8xLjMvRnJpIEphbiAzMSAxMjoxODo1NiAyMDAzLy8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9jYW5fQVQ5MS5oLzEuNC9GcmkgT2N0IDE3IDA5OjEyOjUwIDIwMDMvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1BXTV9TQU0uaC8xLjMvVGh1IEphbiAyMiAxMDoxMDo1MCAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9wZGMuaC8xLjIvVHVlIEp1bCAgMiAxMzoyOTo0MCAyMDAyLy8NCi8vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiNpZm5kZWYgbGliX0FUOTFTQU03WDI1Nl9IDQojZGVmaW5lIGxpYl9BVDkxU0FNN1gyNTZfSA0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQUlDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KI2RlZmluZSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERSAoKHZvaWQgKCopICgpKSAweEU1MUZGRjIwKSAvLyBsZHIsIHBjLCBbcGMsICMtJkYyMF0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ29uZmlndXJlSXQNCi8vKiBcYnJpZWYgSW50ZXJydXB0IEhhbmRsZXIgSW5pdGlhbGl6YXRpb24NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BSUNfQ29uZmlndXJlSXQgKA0KCUFUOTFQU19BSUMgcEFpYywgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXVuc2lnbmVkIGludCBpcnFfaWQsICAgICAvLyBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZQ0KCXVuc2lnbmVkIGludCBwcmlvcml0eSwgICAvLyBcYXJnIHByaW9yaXR5IHRvIGdpdmUgdG8gdGhlIGludGVycnVwdA0KCXVuc2lnbmVkIGludCBzcmNfdHlwZSwgICAvLyBcYXJnIGFjdGl2YXRpb24gYW5kIHNlbnNlIG9mIGFjdGl2YXRpb24NCgl2b2lkICgqbmV3SGFuZGxlcikgKHZvaWQpICkgLy8gXGFyZyBhZGRyZXNzIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcg0Kew0KCXVuc2lnbmVkIGludCBvbGRIYW5kbGVyOw0KICAgIHVuc2lnbmVkIGludCBtYXNrIDsNCg0KICAgIG9sZEhhbmRsZXIgPSBwQWljLT5BSUNfU1ZSW2lycV9pZF07DQoNCiAgICBtYXNrID0gMHgxIDw8IGlycV9pZCA7DQogICAgLy8qIERpc2FibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXINCiAgICBwQWljLT5BSUNfSURDUiA9IG1hc2sgOw0KICAgIC8vKiBTYXZlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lIHBvaW50ZXIgYW5kIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkNCiAgICBwQWljLT5BSUNfU1ZSW2lycV9pZF0gPSAodW5zaWduZWQgaW50KSBuZXdIYW5kbGVyIDsNCiAgICAvLyogU3RvcmUgdGhlIFNvdXJjZSBNb2RlIFJlZ2lzdGVyDQogICAgcEFpYy0+QUlDX1NNUltpcnFfaWRdID0gc3JjX3R5cGUgfCBwcmlvcml0eSAgOw0KICAgIC8vKiBDbGVhciB0aGUgaW50ZXJydXB0IG9uIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcg0KICAgIHBBaWMtPkFJQ19JQ0NSID0gbWFzayA7DQoNCglyZXR1cm4gb2xkSGFuZGxlcjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIGNvcnJlc3BvbmRpbmcgSVQgbnVtYmVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19FbmFibGVJdCAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXVuc2lnbmVkIGludCBpcnFfaWQgKSAvLyBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZQ0Kew0KICAgIC8vKiBFbmFibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXINCiAgICBwQWljLT5BSUNfSUVDUiA9IDB4MSA8PCBpcnFfaWQgOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FJQ19EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBjb3JyZXNwb25kaW5nIElUIG51bWJlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfRGlzYWJsZUl0ICgNCglBVDkxUFNfQUlDIHBBaWMsICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCApIC8vIFxhcmcgaW50ZXJydXB0IG51bWJlciB0byBpbml0aWFsaXplDQp7DQogICAgdW5zaWduZWQgaW50IG1hc2sgPSAweDEgPDwgaXJxX2lkOw0KICAgIC8vKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyDQogICAgcEFpYy0+QUlDX0lEQ1IgPSBtYXNrIDsNCiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApDQogICAgcEFpYy0+QUlDX0lDQ1IgPSBtYXNrIDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ2xlYXJJdA0KLy8qIFxicmllZiBDbGVhciBjb3JyZXNwb25kaW5nIElUIG51bWJlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfQ2xlYXJJdCAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUNCnsNCiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApDQogICAgcEFpYy0+QUlDX0lDQ1IgPSAoMHgxIDw8IGlycV9pZCk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0Fja25vd2xlZGdlSXQNCi8vKiBcYnJpZWYgQWNrbm93bGVkZ2UgY29ycmVzcG9uZGluZyBJVCBudW1iZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0Fja25vd2xlZGdlSXQgKA0KCUFUOTFQU19BSUMgcEFpYykgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0Kew0KICAgIHBBaWMtPkFJQ19FT0lDUiA9IHBBaWMtPkFJQ19FT0lDUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yDQovLyogXGJyaWVmIENvbmZpZ3VyZSB2ZWN0b3IgaGFuZGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yICgNCgl1bnNpZ25lZCBpbnQgKnBWZWN0b3IsIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXZvaWQgKCpIYW5kbGVyKSAoKSApICAgLy8gXGFyZyBJbnRlcnJ1cHQgSGFuZGxlcg0Kew0KCXVuc2lnbmVkIGludCBvbGRWZWN0b3IgPSAqcFZlY3RvcjsNCg0KCWlmICgodW5zaWduZWQgaW50KSBIYW5kbGVyID09ICh1bnNpZ25lZCBpbnQpIEFUOTFDX0FJQ19CUkFOQ0hfT1BDT0RFKQ0KCQkqcFZlY3RvciA9ICh1bnNpZ25lZCBpbnQpIEFUOTFDX0FJQ19CUkFOQ0hfT1BDT0RFOw0KCWVsc2UNCgkJKnBWZWN0b3IgPSAoKCgoKHVuc2lnbmVkIGludCkgSGFuZGxlcikgLSAoKHVuc2lnbmVkIGludCkgcFZlY3RvcikgLSAweDgpID4+IDIpICYgMHgwMEZGRkZGRikgfCAweEVBMDAwMDAwOw0KDQoJcmV0dXJuIG9sZFZlY3RvcjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfVHJpZw0KLy8qIFxicmllZiBUcmlnIGFuIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkICBBVDkxRl9BSUNfVHJpZyAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyDQp7DQoJcEFpYy0+QUlDX0lTQ1IgPSAoMHgxIDw8IGlycV9pZCkgOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FJQ19Jc0FjdGl2ZQ0KLy8qIFxicmllZiBUZXN0IGlmIGFuIElUIGlzIGFjdGl2ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfSXNBY3RpdmUgKA0KCUFUOTFQU19BSUMgcEFpYywgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXVuc2lnbmVkIGludCBpcnFfaWQpIC8vIFxhcmcgSW50ZXJydXB0IE51bWJlcg0Kew0KCXJldHVybiAocEFpYy0+QUlDX0lTUiAmICgweDEgPDwgaXJxX2lkKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0lzUGVuZGluZw0KLy8qIFxicmllZiBUZXN0IGlmIGFuIElUIGlzIHBlbmRpbmcNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCAgQVQ5MUZfQUlDX0lzUGVuZGluZyAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBJbnRlcnJ1cHQgTnVtYmVyDQp7DQoJcmV0dXJuIChwQWljLT5BSUNfSVBSICYgKDB4MSA8PCBpcnFfaWQpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfT3Blbg0KLy8qIFxicmllZiBTZXQgZXhjZXB0aW9uIHZlY3RvcnMgYW5kIEFJQyByZWdpc3RlcnMgdG8gZGVmYXVsdCB2YWx1ZXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX09wZW4oDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdm9pZCAoKklycUhhbmRsZXIpICgpLCAgLy8gXGFyZyBEZWZhdWx0IElSUSB2ZWN0b3IgZXhjZXB0aW9uDQoJdm9pZCAoKkZpcUhhbmRsZXIpICgpLCAgLy8gXGFyZyBEZWZhdWx0IEZJUSB2ZWN0b3IgZXhjZXB0aW9uDQoJdm9pZCAoKkRlZmF1bHRIYW5kbGVyKSAgKCksIC8vIFxhcmcgRGVmYXVsdCBIYW5kbGVyIHNldCBpbiBJU1INCgl2b2lkICgqU3B1cmlvdXNIYW5kbGVyKSAoKSwgLy8gXGFyZyBEZWZhdWx0IFNwdXJpb3VzIEhhbmRsZXINCgl1bnNpZ25lZCBpbnQgcHJvdGVjdE1vZGUpICAgLy8gXGFyZyBEZWJ1ZyBDb250cm9sIFJlZ2lzdGVyDQp7DQoJaW50IGk7DQoNCgkvLyBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBzZXQgSVZSIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXINCglmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgew0KCQlBVDkxRl9BSUNfRGlzYWJsZUl0KHBBaWMsIGkpOw0KCQlBVDkxRl9BSUNfQ29uZmlndXJlSXQocEFpYywgaSwgQVQ5MUNfQUlDX1BSSU9SX0xPV0VTVCwgQVQ5MUNfQUlDX1NSQ1RZUEVfSElHSF9MRVZFTCwgRGVmYXVsdEhhbmRsZXIpOw0KCX0NCg0KCS8vIFNldCB0aGUgSVJRIGV4Y2VwdGlvbiB2ZWN0b3INCglBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yKCh1bnNpZ25lZCBpbnQgKikgMHgxOCwgSXJxSGFuZGxlcik7DQoJLy8gU2V0IHRoZSBGYXN0IEludGVycnVwdCBleGNlcHRpb24gdmVjdG9yDQoJQVQ5MUZfQUlDX1NldEV4Y2VwdGlvblZlY3RvcigodW5zaWduZWQgaW50ICopIDB4MUMsIEZpcUhhbmRsZXIpOw0KDQoJcEFpYy0+QUlDX1NQVSA9ICh1bnNpZ25lZCBpbnQpIFNwdXJpb3VzSGFuZGxlcjsNCglwQWljLT5BSUNfRENSID0gcHJvdGVjdE1vZGU7DQp9DQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUERDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0TmV4dFJ4DQovLyogXGJyaWVmIFNldCB0aGUgbmV4dCByZWNlaXZlIHRyYW5zZmVyIGRlc2NyaXB0b3INCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldE5leHRSeCAoDQoJQVQ5MVBTX1BEQyBwUERDLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCgljaGFyICphZGRyZXNzLCAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZA0KCXVuc2lnbmVkIGludCBieXRlcykgIC8vIFxhcmcgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlY2VpdmVkDQp7DQoJcFBEQy0+UERDX1JOUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOw0KCXBQREMtPlBEQ19STkNSID0gYnl0ZXM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX1NldE5leHRUeA0KLy8qIFxicmllZiBTZXQgdGhlIG5leHQgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0TmV4dFR4ICgNCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQoJY2hhciAqYWRkcmVzcywgICAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSB0cmFuc21pdHRlZA0KCXVuc2lnbmVkIGludCBieXRlcykgICAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQNCnsNCglwUERDLT5QRENfVE5QUiA9ICh1bnNpZ25lZCBpbnQpIGFkZHJlc3M7DQoJcFBEQy0+UERDX1ROQ1IgPSBieXRlczsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0UngNCi8vKiBcYnJpZWYgU2V0IHRoZSByZWNlaXZlIHRyYW5zZmVyIGRlc2NyaXB0b3INCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldFJ4ICgNCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQoJY2hhciAqYWRkcmVzcywgICAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZA0KCXVuc2lnbmVkIGludCBieXRlcykgICAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQNCnsNCglwUERDLT5QRENfUlBSID0gKHVuc2lnbmVkIGludCkgYWRkcmVzczsNCglwUERDLT5QRENfUkNSID0gYnl0ZXM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX1NldFR4DQovLyogXGJyaWVmIFNldCB0aGUgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0VHggKA0KCUFUOTFQU19QREMgcFBEQywgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCgljaGFyICphZGRyZXNzLCAgICAgICAgIC8vIFxhcmcgYWRkcmVzcyB0byB0aGUgbmV4dCBibG9jIHRvIGJlIHRyYW5zbWl0dGVkDQoJdW5zaWduZWQgaW50IGJ5dGVzKSAgICAvLyBcYXJnIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc21pdHRlZA0Kew0KCXBQREMtPlBEQ19UUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOw0KCXBQREMtPlBEQ19UQ1IgPSBieXRlczsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlVHgNCi8vKiBcYnJpZWYgRW5hYmxlIHRyYW5zbWl0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19FbmFibGVUeCAoDQoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCnsNCglwUERDLT5QRENfUFRDUiA9IEFUOTFDX1BEQ19UWFRFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlUngNCi8vKiBcYnJpZWYgRW5hYmxlIHJlY2VpdmUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0VuYWJsZVJ4ICgNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVEVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19EaXNhYmxlVHgNCi8vKiBcYnJpZWYgRGlzYWJsZSB0cmFuc21pdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRGlzYWJsZVR4ICgNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1RYVERJUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfRGlzYWJsZVJ4DQovLyogXGJyaWVmIERpc2FibGUgcmVjZWl2ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRGlzYWJsZVJ4ICgNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVERJUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNUeEVtcHR5DQovLyogXGJyaWVmIFRlc3QgaWYgdGhlIGN1cnJlbnQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBzZW50DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzVHhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXJldHVybiAhKHBQREMtPlBEQ19UQ1IpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19Jc05leHRUeEVtcHR5DQovLyogXGJyaWVmIFRlc3QgaWYgdGhlIG5leHQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgY3VycmVudCB0ZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BEQ19Jc05leHRUeEVtcHR5ICggLy8gXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZQ0KCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQp7DQoJcmV0dXJuICEocFBEQy0+UERDX1ROQ1IpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19Jc1J4RW1wdHkNCi8vKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIGZpbGxlZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BEQ19Jc1J4RW1wdHkgKCAvLyBccmV0dXJuIHJldHVybiAxIGlmIHRyYW5zZmVyIGlzIGNvbXBsZXRlDQoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gIShwUERDLT5QRENfUkNSKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eQ0KLy8qIFxicmllZiBUZXN0IGlmIHRoZSBuZXh0IHRyYW5zZmVyIGRlc2NyaXB0b3IgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGN1cnJlbnQgdGQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXJldHVybiAhKHBQREMtPlBEQ19STkNSKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfT3Blbg0KLy8qIFxicmllZiBPcGVuIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMsIHJlLWVuYWJsZSBSWCBhbmQgVFgNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX09wZW4gKA0KCUFUOTFQU19QREMgcFBEQykgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCnsNCiAgICAvLyogRGlzYWJsZSB0aGUgUlggYW5kIFRYIFBEQyB0cmFuc2ZlciByZXF1ZXN0cw0KCUFUOTFGX1BEQ19EaXNhYmxlUngocFBEQyk7DQoJQVQ5MUZfUERDX0Rpc2FibGVUeChwUERDKTsNCg0KCS8vKiBSZXNldCBhbGwgQ291bnRlciByZWdpc3RlciBOZXh0IGJ1ZmZlciBmaXJzdA0KCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7DQoJQVQ5MUZfUERDX1NldE5leHRSeChwUERDLCAoY2hhciAqKSAwLCAwKTsNCglBVDkxRl9QRENfU2V0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7DQoJQVQ5MUZfUERDX1NldFJ4KHBQREMsIChjaGFyICopIDAsIDApOw0KDQogICAgLy8qIEVuYWJsZSB0aGUgUlggYW5kIFRYIFBEQyB0cmFuc2ZlciByZXF1ZXN0cw0KCUFUOTFGX1BEQ19FbmFibGVSeChwUERDKTsNCglBVDkxRl9QRENfRW5hYmxlVHgocFBEQyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX0Nsb3NlDQovLyogXGJyaWVmIENsb3NlIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0Nsb3NlICgNCglBVDkxUFNfUERDIHBQREMpICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQp7DQogICAgLy8qIERpc2FibGUgdGhlIFJYIGFuZCBUWCBQREMgdHJhbnNmZXIgcmVxdWVzdHMNCglBVDkxRl9QRENfRGlzYWJsZVJ4KHBQREMpOw0KCUFUOTFGX1BEQ19EaXNhYmxlVHgocFBEQyk7DQoNCgkvLyogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QNCglBVDkxRl9QRENfU2V0TmV4dFR4KHBQREMsIChjaGFyICopIDAsIDApOw0KCUFUOTFGX1BEQ19TZXROZXh0UngocFBEQywgKGNoYXIgKikgMCwgMCk7DQoJQVQ5MUZfUERDX1NldFR4KHBQREMsIChjaGFyICopIDAsIDApOw0KCUFUOTFGX1BEQ19TZXRSeChwUERDLCAoY2hhciAqKSAwLCAwKTsNCg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19TZW5kRnJhbWUNCi8vKiBcYnJpZWYgQ2xvc2UgUERDOiBkaXNhYmxlIFRYIGFuZCBSWCByZXNldCB0cmFuc2ZlciBkZXNjcmlwdG9ycw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BEQ19TZW5kRnJhbWUoDQoJQVQ5MVBTX1BEQyBwUERDLA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCWlmIChBVDkxRl9QRENfSXNUeEVtcHR5KHBQREMpKSB7DQoJCS8vKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZA0KCQlBVDkxRl9QRENfU2V0VHgocFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIpOw0KCQlBVDkxRl9QRENfU2V0TmV4dFR4KHBQREMsIHBOZXh0QnVmZmVyLCBzek5leHRCdWZmZXIpOw0KCQlyZXR1cm4gMjsNCgl9DQoJZWxzZSBpZiAoQVQ5MUZfUERDX0lzTmV4dFR4RW1wdHkocFBEQykpIHsNCgkJLy8qIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQNCgkJQVQ5MUZfUERDX1NldE5leHRUeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7DQoJCXJldHVybiAxOw0KCX0NCgllbHNlIHsNCgkJLy8qIEFsbCBidWZmZXIgYXJlIGluIHVzZS4uLg0KCQlyZXR1cm4gMDsNCgl9DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX1JlY2VpdmVGcmFtZQ0KLy8qIFxicmllZiBDbG9zZSBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSAoDQoJQVQ5MVBTX1BEQyBwUERDLA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCWlmIChBVDkxRl9QRENfSXNSeEVtcHR5KHBQREMpKSB7DQoJCS8vKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZA0KCQlBVDkxRl9QRENfU2V0UngocFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIpOw0KCQlBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIHBOZXh0QnVmZmVyLCBzek5leHRCdWZmZXIpOw0KCQlyZXR1cm4gMjsNCgl9DQoJZWxzZSBpZiAoQVQ5MUZfUERDX0lzTmV4dFJ4RW1wdHkocFBEQykpIHsNCgkJLy8qIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQNCgkJQVQ5MUZfUERDX1NldE5leHRSeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7DQoJCXJldHVybiAxOw0KCX0NCgllbHNlIHsNCgkJLy8qIEFsbCBidWZmZXIgYXJlIGluIHVzZS4uLg0KCQlyZXR1cm4gMDsNCgl9DQp9DQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgREJHVQ0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHRFbmFibGUNCi8vKiBcYnJpZWYgRW5hYmxlIERCR1UgSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0RCR1VfSW50ZXJydXB0RW5hYmxlKA0KICAgICAgICBBVDkxUFNfREJHVSBwRGJndSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgREJHVSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBkYmd1IGludGVycnVwdCB0byBiZSBlbmFibGVkDQp7DQogICAgICAgIHBEYmd1LT5EQkdVX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlDQovLyogXGJyaWVmIERpc2FibGUgREJHVSBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlKA0KICAgICAgICBBVDkxUFNfREJHVSBwRGJndSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgREJHVSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBkYmd1IGludGVycnVwdCB0byBiZSBkaXNhYmxlZA0Kew0KICAgICAgICBwRGJndS0+REJHVV9JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0RCR1VfR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBEYmd1LT5EQkdVX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgREJHVSBJbnRlcnJ1cHQgaXMgTWFza2VkIA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX0RCR1VfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19EQkdVIHBEYmd1LCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfREJHVV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBEYmd1KSAmIGZsYWcpOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUElPDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoDQovLyogXGJyaWVmIEVuYWJsZSBwaW5zIHRvIGJlIGRyaXZlZCBieSBwZXJpcGhlcmFsDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdQZXJpcGgoDQoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBwZXJpcGhBRW5hYmxlLCAgLy8gXGFyZyBQRVJJUEggQSB0byBlbmFibGUNCgl1bnNpZ25lZCBpbnQgcGVyaXBoQkVuYWJsZSkgIC8vIFxhcmcgUEVSSVBIIEIgdG8gZW5hYmxlDQoNCnsNCglwUGlvLT5QSU9fQVNSID0gcGVyaXBoQUVuYWJsZTsNCglwUGlvLT5QSU9fQlNSID0gcGVyaXBoQkVuYWJsZTsNCglwUGlvLT5QSU9fUERSID0gKHBlcmlwaEFFbmFibGUgfCBwZXJpcGhCRW5hYmxlKTsgLy8gU2V0IGluIFBlcmlwaCBtb2RlDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ091dHB1dA0KLy8qIFxicmllZiBFbmFibGUgUElPIGluIG91dHB1dCBtb2RlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdPdXRwdXQoDQoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBwaW9FbmFibGUpICAgICAgLy8gXGFyZyBQSU8gdG8gYmUgZW5hYmxlZA0Kew0KCXBQaW8tPlBJT19QRVIgPSBwaW9FbmFibGU7IC8vIFNldCBpbiBQSU8gbW9kZQ0KCXBQaW8tPlBJT19PRVIgPSBwaW9FbmFibGU7IC8vIENvbmZpZ3VyZSBpbiBPdXRwdXQNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnSW5wdXQNCi8vKiBcYnJpZWYgRW5hYmxlIFBJTyBpbiBpbnB1dCBtb2RlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdJbnB1dCgNCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGlucHV0RW5hYmxlKSAgICAgIC8vIFxhcmcgUElPIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyBEaXNhYmxlIG91dHB1dA0KCXBQaW8tPlBJT19PRFIgID0gaW5wdXRFbmFibGU7DQoJcFBpby0+UElPX1BFUiAgPSBpbnB1dEVuYWJsZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnT3BlbmRyYWluDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gaW4gb3BlbiBkcmFpbg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnT3BlbmRyYWluKA0KCUFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgbXVsdGlEcnZFbmFibGUpIC8vIFxhcmcgcGlvIHRvIGJlIGNvbmZpZ3VyZWQgaW4gb3BlbiBkcmFpbg0Kew0KCS8vIENvbmZpZ3VyZSB0aGUgbXVsdGktZHJpdmUgb3B0aW9uDQoJcFBpby0+UElPX01ERFIgPSB+bXVsdGlEcnZFbmFibGU7DQoJcFBpby0+UElPX01ERVIgPSBtdWx0aURydkVuYWJsZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnUHVsbHVwDQovLyogXGJyaWVmIEVuYWJsZSBwdWxsdXAgb24gUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdQdWxsdXAoDQoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBwdWxsdXBFbmFibGUpICAgLy8gXGFyZyBlbmFibGUgcHVsbHVwIG9uIFBJTw0Kew0KCQkvLyBDb25uZWN0IG9yIG5vdCBQdWxsdXANCglwUGlvLT5QSU9fUFBVRFIgPSB+cHVsbHVwRW5hYmxlOw0KCXBQaW8tPlBJT19QUFVFUiA9IHB1bGx1cEVuYWJsZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnRGlyZWN0RHJpdmUNCi8vKiBcYnJpZWYgRW5hYmxlIGRpcmVjdCBkcml2ZSBvbiBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ0RpcmVjdERyaXZlKA0KCUFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZGlyZWN0RHJpdmUpICAgIC8vIFxhcmcgUElPIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBkaXJlY3QgZHJpdmUNCg0Kew0KCS8vIENvbmZpZ3VyZSB0aGUgRGlyZWN0IERyaXZlDQoJcFBpby0+UElPX09XRFIgID0gfmRpcmVjdERyaXZlOw0KCXBQaW8tPlBJT19PV0VSICA9IGRpcmVjdERyaXZlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdJbnB1dEZpbHRlcg0KLy8qIFxicmllZiBFbmFibGUgaW5wdXQgZmlsdGVyIG9uIGlucHV0IFBJTw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnSW5wdXRGaWx0ZXIoDQoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBpbnB1dEZpbHRlcikgICAgLy8gXGFyZyBQSU8gdG8gYmUgY29uZmlndXJlZCB3aXRoIGlucHV0IGZpbHRlcg0KDQp7DQoJLy8gQ29uZmlndXJlIHRoZSBEaXJlY3QgRHJpdmUNCglwUGlvLT5QSU9fSUZEUiAgPSB+aW5wdXRGaWx0ZXI7DQoJcFBpby0+UElPX0lGRVIgID0gaW5wdXRGaWx0ZXI7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldElucHV0DQovLyogXGJyaWVmIFJldHVybiBQSU8gaW5wdXQgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW5wdXQoIC8vIFxyZXR1cm4gUElPIGlucHV0DQoJQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcFBpby0+UElPX1BEU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzSW5wdXRTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gaXMgaW5wdXQgZmxhZyBpcyBhY3RpdmUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnB1dFNldCgNCglBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9QSU9fR2V0SW5wdXQocFBpbykgJiBmbGFnKTsNCn0NCg0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19TZXRPdXRwdXQNCi8vKiBcYnJpZWYgU2V0IHRvIDEgb3V0cHV0IFBJTw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fU2V0T3V0cHV0KA0KCUFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgb3V0cHV0IHRvIGJlIHNldA0Kew0KCXBQaW8tPlBJT19TT0RSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2xlYXJPdXRwdXQNCi8vKiBcYnJpZWYgU2V0IHRvIDAgb3V0cHV0IFBJTw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2xlYXJPdXRwdXQoDQoJQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBvdXRwdXQgdG8gYmUgY2xlYXJlZA0Kew0KCXBQaW8tPlBJT19DT0RSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fRm9yY2VPdXRwdXQNCi8vKiBcYnJpZWYgRm9yY2Ugb3V0cHV0IHdoZW4gRGlyZWN0IGRyaXZlIG9wdGlvbiBpcyBlbmFibGVkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19Gb3JjZU91dHB1dCgNCglBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIG91dHB1dCB0byBiZSBmb3JjZWQNCnsNCglwUGlvLT5QSU9fT0RTUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0VuYWJsZQ0KLy8qIFxicmllZiBFbmFibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19FbmFibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBlbmFibGVkIA0Kew0KICAgICAgICBwUGlvLT5QSU9fUEVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fRGlzYWJsZQ0KLy8qIFxicmllZiBEaXNhYmxlIFBJTw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fRGlzYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIHRvIGJlIGRpc2FibGVkIA0Kew0KICAgICAgICBwUGlvLT5QSU9fUERSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0U3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQSU8gU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldFN0YXR1cyggLy8gXHJldHVybiBQSU8gU3RhdHVzDQogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwUGlvLT5QSU9fUFNSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc1NldA0KLy8qIFxicmllZiBUZXN0IGlmIFBJTyBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNTZXQoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldFN0YXR1cyhwUGlvKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19PdXRwdXRFbmFibGUNCi8vKiBcYnJpZWYgT3V0cHV0IEVuYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dEVuYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIG91dHB1dCB0byBiZSBlbmFibGVkDQp7DQogICAgICAgIHBQaW8tPlBJT19PRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19PdXRwdXREaXNhYmxlDQovLyogXGJyaWVmIE91dHB1dCBFbmFibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXREaXNhYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHRvIGJlIGRpc2FibGVkDQp7DQogICAgICAgIHBQaW8tPlBJT19PRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBPdXRwdXQgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE91dHB1dFN0YXR1cyggLy8gXHJldHVybiBQSU8gT3V0cHV0IFN0YXR1cw0KICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX09TUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNPdXB1dFNldA0KLy8qIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXQgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzT3V0cHV0U2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJFbmFibGUNCi8vKiBcYnJpZWYgSW5wdXQgRmlsdGVyIEVuYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0lucHV0RmlsdGVyRW5hYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gaW5wdXQgZmlsdGVyIHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX0lGRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19JbnB1dEZpbHRlckRpc2FibGUNCi8vKiBcYnJpZWYgSW5wdXQgRmlsdGVyIERpc2FibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19JbnB1dEZpbHRlckRpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBpbnB1dCBmaWx0ZXIgdG8gYmUgZGlzYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX0lGRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRJbnB1dEZpbHRlclN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIElucHV0IEZpbHRlciBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMoIC8vIFxyZXR1cm4gUElPIElucHV0IEZpbHRlciBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19JRlNSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0lucHV0RmlsdGVyU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUElPIElucHV0IGZpbHRlciBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnB1dEZpbHRlclNldCgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0T3V0cHV0RGF0YVN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBEYXRhIFN0YXR1cyANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0T3V0cHV0RGF0YVN0YXR1cyggLy8gXHJldHVybiBQSU8gT3V0cHV0IERhdGEgU3RhdHVzIA0KCUFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwUGlvLT5QSU9fT0RTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW50ZXJydXB0RW5hYmxlDQovLyogXGJyaWVmIEVuYWJsZSBQSU8gSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19JbnRlcnJ1cHRFbmFibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZA0Kew0KICAgICAgICBwUGlvLT5QSU9fSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW50ZXJydXB0RGlzYWJsZQ0KLy8qIFxicmllZiBEaXNhYmxlIFBJTyBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0ludGVycnVwdERpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBQSU8gSW50ZXJydXB0IE1hc2sgU3RhdHVzDQogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwUGlvLT5QSU9fSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBJbnRlcnJ1cHQgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldEludGVycnVwdFN0YXR1cyggLy8gXHJldHVybiBQSU8gSW50ZXJydXB0IFN0YXR1cw0KICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX0lTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gSW50ZXJydXB0IGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0ludGVycnVwdFNldCgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0SW50ZXJydXB0U3RhdHVzKHBQaW8pICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX011bHRpRHJpdmVyRW5hYmxlDQovLyogXGJyaWVmIE11bHRpIERyaXZlciBFbmFibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckVuYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX01ERVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19NdWx0aURyaXZlckRpc2FibGUNCi8vKiBcYnJpZWYgTXVsdGkgRHJpdmVyIERpc2FibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckRpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBkaXNhYmxlZA0Kew0KICAgICAgICBwUGlvLT5QSU9fTUREUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQSU8gTXVsdGkgRHJpdmVyIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRNdWx0aURyaXZlclN0YXR1cyggLy8gXHJldHVybiBQSU8gTXVsdGkgRHJpdmVyIFN0YXR1cw0KICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX01EU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzTXVsdGlEcml2ZXJTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gTXVsdGlEcml2ZXIgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzTXVsdGlEcml2ZXJTZXQoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKHBQaW8pICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0FfUmVnaXN0ZXJTZWxlY3Rpb24NCi8vKiBcYnJpZWYgUElPIEEgUmVnaXN0ZXIgU2VsZWN0aW9uIA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQV9SZWdpc3RlclNlbGVjdGlvbigNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIEEgcmVnaXN0ZXIgc2VsZWN0aW9uDQp7DQogICAgICAgIHBQaW8tPlBJT19BU1IgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19CX1JlZ2lzdGVyU2VsZWN0aW9uDQovLyogXGJyaWVmIFBJTyBCIFJlZ2lzdGVyIFNlbGVjdGlvbiANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0JfUmVnaXN0ZXJTZWxlY3Rpb24oDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBCIHJlZ2lzdGVyIHNlbGVjdGlvbiANCnsNCiAgICAgICAgcFBpby0+UElPX0JTUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0X0FCX1JlZ2lzdGVyU3RhdHVzKCAvLyBccmV0dXJuIFBJTyBBQiBSZWdpc3RlciBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19BQlNSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUElPIEFCIFJlZ2lzdGVyIGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1BJT19HZXRfQUJfUmVnaXN0ZXJTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fT3V0cHV0V3JpdGVFbmFibGUNCi8vKiBcYnJpZWYgT3V0cHV0IFdyaXRlIEVuYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dFdyaXRlRW5hYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHdyaXRlIHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX09XRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19PdXRwdXRXcml0ZURpc2FibGUNCi8vKiBcYnJpZWYgT3V0cHV0IFdyaXRlIERpc2FibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRXcml0ZURpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZGlzYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX09XRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMoIC8vIFxyZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19PV1NSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc091dHB1dFdyaXRlU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUElPIE91dHB1dFdyaXRlIGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc091dHB1dFdyaXRlU2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cyhwUGlvKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRDZmdQdWxsdXANCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBDb25maWd1cmF0aW9uIFB1bGx1cA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRDZmdQdWxsdXAoIC8vIFxyZXR1cm4gUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwIA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX1BQVVNSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc091dHB1dERhdGFTdGF0dXNTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gT3V0cHV0IERhdGEgU3RhdHVzIGlzIFNldCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNPdXRwdXREYXRhU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1BJT19HZXRPdXRwdXREYXRhU3RhdHVzKHBQaW8pICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzQ2ZnUHVsbHVwU3RhdHVzU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwIFN0YXR1cyBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNDZmdQdWxsdXBTdGF0dXNTZXQoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAofkFUOTFGX1BJT19HZXRDZmdQdWxsdXAocFBpbykgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBNQw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0NmZ1N5c0Nsa0VuYWJsZVJlZw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIFN5c3RlbSBDbG9jayBFbmFibGUgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdTeXNDbGtFbmFibGVSZWcgKA0KCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1vZGUpDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBTQ0VSIHJlZ2lzdGVyDQoJcFBNQy0+UE1DX1NDRVIgPSBtb2RlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdTeXNDbGtEaXNhYmxlUmVnDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgU3lzdGVtIENsb2NrIERpc2FibGUgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdTeXNDbGtEaXNhYmxlUmVnICgNCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtb2RlKQ0Kew0KCS8vKiBXcml0ZSB0byB0aGUgU0NEUiByZWdpc3Rlcg0KCXBQTUMtPlBNQ19TQ0RSID0gbW9kZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfR2V0U3lzQ2xrU3RhdHVzUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgU3lzdGVtIENsb2NrIFN0YXR1cyBSZWdpc3RlciBvZiB0aGUgUE1DIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0U3lzQ2xrU3RhdHVzUmVnICgNCglBVDkxUFNfUE1DIHBQTUMgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwUE1DLT5QTUNfU0NTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2sNCi8vKiBcYnJpZWYgRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrICgNCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBwZXJpcGhJZHMpICAvLyBcYXJnIElEcyBvZiBwZXJpcGhlcmFscyB0byBlbmFibGUNCnsNCglwUE1DLT5QTUNfUENFUiA9IHBlcmlwaElkczsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRGlzYWJsZVBlcmlwaENsb2NrDQovLyogXGJyaWVmIERpc2FibGUgcGVyaXBoZXJhbCBjbG9jaw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRGlzYWJsZVBlcmlwaENsb2NrICgNCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBwZXJpcGhJZHMpICAvLyBcYXJnIElEcyBvZiBwZXJpcGhlcmFscyB0byBlbmFibGUNCnsNCglwUE1DLT5QTUNfUENEUiA9IHBlcmlwaElkczsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfR2V0UGVyaXBoQ2xvY2sNCi8vKiBcYnJpZWYgR2V0IHBlcmlwaGVyYWwgY2xvY2sgc3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldFBlcmlwaENsb2NrICgNCglBVDkxUFNfUE1DIHBQTUMpIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwUE1DLT5QTUNfUENTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0NmZ01haW5Pc2NpbGxhdG9yUmVnDQovLyogXGJyaWVmIENmZyB0aGUgbWFpbiBvc2NpbGxhdG9yDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY2lsbGF0b3JSZWcgKA0KCUFUOTFQU19DS0dSIHBDS0dSLCAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1vZGUpDQp7DQoJcENLR1ItPkNLR1JfTU9SID0gbW9kZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0dldE1haW5Pc2NpbGxhdG9yUmVnDQovLyogXGJyaWVmIENmZyB0aGUgbWFpbiBvc2NpbGxhdG9yDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0tHUl9HZXRNYWluT3NjaWxsYXRvclJlZyAoDQoJQVQ5MVBTX0NLR1IgcENLR1IpIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcENLR1ItPkNLR1JfTU9SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NLR1JfRW5hYmxlTWFpbk9zY2lsbGF0b3INCi8vKiBcYnJpZWYgRW5hYmxlIHRoZSBtYWluIG9zY2lsbGF0b3INCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9FbmFibGVNYWluT3NjaWxsYXRvcigNCglBVDkxUFNfQ0tHUiBwQ0tHUikgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcg0Kew0KCXBDS0dSLT5DS0dSX01PUiB8PSBBVDkxQ19DS0dSX01PU0NFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0Rpc2FibGVNYWluT3NjaWxsYXRvcg0KLy8qIFxicmllZiBEaXNhYmxlIHRoZSBtYWluIG9zY2lsbGF0b3INCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9EaXNhYmxlTWFpbk9zY2lsbGF0b3IgKA0KCUFUOTFQU19DS0dSIHBDS0dSKSAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyDQp7DQoJcENLR1ItPkNLR1JfTU9SICY9IH5BVDkxQ19DS0dSX01PU0NFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0NmZ01haW5Pc2NTdGFydFVwVGltZQ0KLy8qIFxicmllZiBDZmcgTU9SIFJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgbWFpbiBvc2Mgc3RhcnR1cCB0aW1lDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY1N0YXJ0VXBUaW1lICgNCglBVDkxUFNfQ0tHUiBwQ0tHUiwgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBzdGFydHVwX3RpbWUsICAvLyBcYXJnIG1haW4gb3NjIHN0YXJ0dXAgdGltZSBpbiBtaWNyb3NlY29uZCAodXMpDQoJdW5zaWduZWQgaW50IHNsb3dDbG9jaykgIC8vIFxhcmcgc2xvd0Nsb2NrIGluIEh6DQp7DQoJcENLR1ItPkNLR1JfTU9SICY9IH5BVDkxQ19DS0dSX09TQ09VTlQ7DQoJcENLR1ItPkNLR1JfTU9SIHw9ICgoc2xvd0Nsb2NrICogc3RhcnR1cF90aW1lKS8oOCoxMDAwMDAwKSkgPDwgODsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0dldE1haW5DbG9ja0ZyZXFSZWcNCi8vKiBcYnJpZWYgQ2ZnIHRoZSBtYWluIG9zY2lsbGF0b3INCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DS0dSX0dldE1haW5DbG9ja0ZyZXFSZWcgKA0KCUFUOTFQU19DS0dSIHBDS0dSKSAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBDS0dSLT5DS0dSX01DRlI7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2sNCi8vKiBcYnJpZWYgUmV0dXJuIE1haW4gY2xvY2sgaW4gSHoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DS0dSX0dldE1haW5DbG9jayAoDQoJQVQ5MVBTX0NLR1IgcENLR1IsIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrKSAgLy8gXGFyZyBzbG93Q2xvY2sgaW4gSHoNCnsNCglyZXR1cm4gKChwQ0tHUi0+Q0tHUl9NQ0ZSICAmIEFUOTFDX0NLR1JfTUFJTkYpICogc2xvd0Nsb2NrKSA+PiA0Ow0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdNQ0tSZWcNCi8vKiBcYnJpZWYgQ2ZnIE1hc3RlciBDbG9jayBSZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnTUNLUmVnICgNCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtb2RlKQ0Kew0KCXBQTUMtPlBNQ19NQ0tSID0gbW9kZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfR2V0TUNLUmVnDQovLyogXGJyaWVmIFJldHVybiBNYXN0ZXIgQ2xvY2sgUmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0TUNLUmVnKA0KCUFUOTFQU19QTUMgcFBNQykgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBQTUMtPlBNQ19NQ0tSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldE1hc3RlckNsb2NrDQovLyogXGJyaWVmIFJldHVybiBtYXN0ZXIgY2xvY2sgaW4gSHogd2hpY2ggY29ycmVwb25kcyB0byBwcm9jZXNzb3IgY2xvY2sgZm9yIEFSTTcNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRNYXN0ZXJDbG9jayAoDQoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXINCglBVDkxUFNfQ0tHUiBwQ0tHUiwgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBzbG93Q2xvY2spICAvLyBcYXJnIHNsb3dDbG9jayBpbiBIeg0Kew0KCXVuc2lnbmVkIGludCByZWcgPSBwUE1DLT5QTUNfTUNLUjsNCgl1bnNpZ25lZCBpbnQgcHJlc2NhbGVyID0gKDEgPDwgKChyZWcgJiBBVDkxQ19QTUNfUFJFUykgPj4gMikpOw0KCXVuc2lnbmVkIGludCBwbGxEaXZpZGVyLCBwbGxNdWx0aXBsaWVyOw0KDQoJc3dpdGNoIChyZWcgJiBBVDkxQ19QTUNfQ1NTKSB7DQoJCWNhc2UgQVQ5MUNfUE1DX0NTU19TTE9XX0NMSzogLy8gU2xvdyBjbG9jayBzZWxlY3RlZA0KCQkJcmV0dXJuIHNsb3dDbG9jayAvIHByZXNjYWxlcjsNCgkJY2FzZSBBVDkxQ19QTUNfQ1NTX01BSU5fQ0xLOiAvLyBNYWluIGNsb2NrIGlzIHNlbGVjdGVkDQoJCQlyZXR1cm4gQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2socENLR1IsIHNsb3dDbG9jaykgLyBwcmVzY2FsZXI7DQoJCWNhc2UgQVQ5MUNfUE1DX0NTU19QTExfQ0xLOiAvLyBQTExCIGNsb2NrIGlzIHNlbGVjdGVkDQoJCQlyZWcgPSBwQ0tHUi0+Q0tHUl9QTExSOw0KCQkJcGxsRGl2aWRlciAgICA9IChyZWcgICYgQVQ5MUNfQ0tHUl9ESVYpOw0KCQkJcGxsTXVsdGlwbGllciA9ICgocmVnICAmIEFUOTFDX0NLR1JfTVVMKSA+PiAxNikgKyAxOw0KCQkJcmV0dXJuIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrKHBDS0dSLCBzbG93Q2xvY2spIC8gcGxsRGl2aWRlciAqIHBsbE11bHRpcGxpZXIgLyBwcmVzY2FsZXI7DQoJfQ0KCXJldHVybiAwOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19FbmFibGVQQ0sNCi8vKiBcYnJpZWYgRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0VuYWJsZVBDSyAoDQoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgcGNrLCAgLy8gXGFyZyBQZXJpcGhlcmFsIGNsb2NrIGlkZW50aWZpZXIgMCAuLiA3DQoJdW5zaWduZWQgaW50IG1vZGUpDQp7DQoJcFBNQy0+UE1DX1BDS1JbcGNrXSA9IG1vZGU7DQoJcFBNQy0+UE1DX1NDRVIgPSAoMSA8PCBwY2spIDw8IDg7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0Rpc2FibGVQQ0sNCi8vKiBcYnJpZWYgRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0Rpc2FibGVQQ0sgKA0KCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IHBjaykgIC8vIFxhcmcgUGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyIDAgLi4gNw0Kew0KCXBQTUMtPlBNQ19TQ0RSID0gKDEgPDwgcGNrKSA8PCA4Ow0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19FbmFibGVJdA0KLy8qIFxicmllZiBFbmFibGUgUE1DIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRW5hYmxlSXQgKA0KCUFUOTFQU19QTUMgcFBNQywgICAgIC8vIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBQTUMtPlBNQ19JRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBQTUMgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19EaXNhYmxlSXQgKA0KCUFUOTFQU19QTUMgcFBNQywgLy8gcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpIC8vIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXINCglwUE1DLT5QTUNfSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfR2V0U3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQTUMgSW50ZXJydXB0IFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRTdGF0dXMoIC8vIFxyZXR1cm4gUE1DIEludGVycnVwdCBTdGF0dXMNCglBVDkxUFNfUE1DIHBQTUMpIC8vIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwUE1DLT5QTUNfU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFBNQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBQTUMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQoJQVQ5MVBTX1BNQyBwUE1DKSAvLyBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcFBNQy0+UE1DX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQTUMgSW50ZXJydXB0IGlzIE1hc2tlZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19Jc0ludGVycnVwdE1hc2tlZCgNCiAgICAgICAgQVQ5MVBTX1BNQyBwUE1DLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX1BNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBQTUMpICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0lzU3RhdHVzU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUE1DIFN0YXR1cyBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfSXNTdGF0dXNTZXQoDQogICAgICAgIEFUOTFQU19QTUMgcFBNQywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9QTUNfR2V0U3RhdHVzKHBQTUMpICYgZmxhZyk7DQp9LyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFJTVEMNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1JTVFNvZnRSZXNldA0KLy8qIFxicmllZiBTdGFydCBTb2Z0d2FyZSBSZXNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RTb2Z0UmVzZXQoDQogICAgICAgIEFUOTFQU19SU1RDIHBSU1RDLA0KICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXQpDQp7DQoJcFJTVEMtPlJTVENfUkNSID0gKDB4QTUwMDAwMDAgfCByZXNldCk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUlNUU2V0TW9kZQ0KLy8qIFxicmllZiBTZXQgUmVzZXQgTW9kZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RTZXRNb2RlKA0KICAgICAgICBBVDkxUFNfUlNUQyBwUlNUQywNCiAgICAgICAgdW5zaWduZWQgaW50IG1vZGUpDQp7DQoJcFJTVEMtPlJTVENfUk1SID0gKDB4QTUwMDAwMDAgfCBtb2RlKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9SU1RHZXRNb2RlDQovLyogXGJyaWVmIEdldCBSZXNldCBNb2RlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlNUR2V0TW9kZSgNCiAgICAgICAgQVQ5MVBTX1JTVEMgcFJTVEMpDQp7DQoJcmV0dXJuIChwUlNUQy0+UlNUQ19STVIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1JTVEdldFN0YXR1cw0KLy8qIFxicmllZiBHZXQgUmVzZXQgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlNUR2V0U3RhdHVzKA0KICAgICAgICBBVDkxUFNfUlNUQyBwUlNUQykNCnsNCglyZXR1cm4gKHBSU1RDLT5SU1RDX1JTUik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUlNUSXNTb2Z0UnN0QWN0aXZlDQovLyogXGJyaWVmIFJldHVybiAhPTAgaWYgc29mdHdhcmUgcmVzZXQgaXMgc3RpbGwgbm90IGNvbXBsZXRlZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVElzU29mdFJzdEFjdGl2ZSgNCiAgICAgICAgQVQ5MVBTX1JTVEMgcFJTVEMpDQp7DQoJcmV0dXJuICgocFJTVEMtPlJTVENfUlNSKSAmIEFUOTFDX1JTVENfU1JDTVApOw0KfQ0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFJUVEMNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICAgQVQ5MUZfU2V0UlRUX1RpbWVCYXNlKCkNCi8vKiBcYnJpZWYgIFNldCB0aGUgUlRUIHByZXNjYWxlciBhY2NvcmRpbmcgdG8gdGhlIFRpbWVCYXNlIGluIG1zDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVFNldFRpbWVCYXNlKA0KICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQywgDQogICAgICAgIHVuc2lnbmVkIGludCBtcykNCnsNCglpZiAobXMgPiAyMDAwKQ0KCQlyZXR1cm4gMTsgICAvLyBBVDkxQ19USU1FX09VVF9PRl9SQU5HRQ0KCXBSVFRDLT5SVFRDX1JUTVIgJj0gfjB4RkZGRjsJDQoJcFJUVEMtPlJUVENfUlRNUiB8PSAoKChtcyA8PCAxNSkgLzEwMDApICYgMHhGRkZGKTsJDQoJcmV0dXJuIDA7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgICBBVDkxRl9SVFRTZXRQcmVzY2FsZXIoKQ0KLy8qIFxicmllZiAgU2V0IHRoZSBuZXcgcHJlc2NhbGVyIHZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVFNldFByZXNjYWxlcigNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMsIA0KICAgICAgICB1bnNpZ25lZCBpbnQgcnRwcmVzKQ0Kew0KCXBSVFRDLT5SVFRDX1JUTVIgJj0gfjB4RkZGRjsJDQoJcFJUVEMtPlJUVENfUlRNUiB8PSAocnRwcmVzICYgMHhGRkZGKTsJDQoJcmV0dXJuIChwUlRUQy0+UlRUQ19SVE1SKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1JUVFJlc3RhcnQoKQ0KLy8qIFxicmllZiAgUmVzdGFydCB0aGUgUlRUIHByZXNjYWxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUUmVzdGFydCgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpDQp7DQoJcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX1JUVFJTVDsJDQp9DQoNCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1JUVF9TZXRBbGFybUlOVCgpDQovLyogXGJyaWVmICBFbmFibGUgUlRUIEFsYXJtIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUU2V0QWxhcm1JTlQoDQogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQ0Kew0KCXBSVFRDLT5SVFRDX1JUTVIgfD0gQVQ5MUNfUlRUQ19BTE1JRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgICBBVDkxRl9SVFRfQ2xlYXJBbGFybUlOVCgpDQovLyogXGJyaWVmICBEaXNhYmxlIFJUVCBBbGFybSBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENsZWFyQWxhcm1JTlQoDQogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQ0Kew0KCXBSVFRDLT5SVFRDX1JUTVIgJj0gfkFUOTFDX1JUVENfQUxNSUVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX1NldFJ0dEluY0lOVCgpDQovLyogXGJyaWVmICBFbmFibGUgUlRUIElOQyBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFNldFJ0dEluY0lOVCgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpDQp7DQoJcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX1JUVElOQ0lFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1JUVF9DbGVhclJ0dEluY0lOVCgpDQovLyogXGJyaWVmICBEaXNhYmxlIFJUVCBJTkMgSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRDbGVhclJ0dEluY0lOVCgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpDQp7DQoJcFJUVEMtPlJUVENfUlRNUiAmPSB+QVQ5MUNfUlRUQ19SVFRJTkNJRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgICBBVDkxRl9SVFRfU2V0QWxhcm1WYWx1ZSgpDQovLyogXGJyaWVmICBTZXQgUlRUIEFsYXJtIFZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRTZXRBbGFybVZhbHVlKA0KICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQywgdW5zaWduZWQgaW50IGFsYXJtKQ0Kew0KCXBSVFRDLT5SVFRDX1JUQVIgPSBhbGFybTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1JUVF9HZXRBbGFybVZhbHVlKCkNCi8vKiBcYnJpZWYgIEdldCBSVFQgQWxhcm0gVmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUR2V0QWxhcm1WYWx1ZSgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpDQp7DQoJcmV0dXJuKHBSVFRDLT5SVFRDX1JUQVIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUR2V0U3RhdHVzKCkNCi8vKiBcYnJpZWYgIFJlYWQgdGhlIFJUVCBzdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUR2V0U3RhdHVzKA0KICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykNCnsNCglyZXR1cm4ocFJUVEMtPlJUVENfUlRTUik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgICBBVDkxRl9SVFRfUmVhZFZhbHVlKCkNCi8vKiBcYnJpZWYgIFJlYWQgdGhlIFJUVCB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRSZWFkVmFsdWUoDQogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQ0Kew0KICAgICAgICByZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdmFsMSx2YWwyOw0KCWRvDQoJew0KCQl2YWwxID0gcFJUVEMtPlJUVENfUlRWUjsNCgkJdmFsMiA9IHBSVFRDLT5SVFRDX1JUVlI7DQoJfQkNCgl3aGlsZSh2YWwxICE9IHZhbDIpOw0KCXJldHVybih2YWwxKTsNCn0NCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQSVRDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSVRJbml0DQovLyogXGJyaWVmIFN5c3RlbSB0aW1lciBpbml0IDogcGVyaW9kIGluILVzZWNvbmQsIHN5c3RlbSBjbG9jayBmcmVxIGluIE1Ieg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRJbml0KA0KICAgICAgICBBVDkxUFNfUElUQyBwUElUQywNCiAgICAgICAgdW5zaWduZWQgaW50IHBlcmlvZCwNCiAgICAgICAgdW5zaWduZWQgaW50IHBpdF9mcmVxdWVuY3kpDQp7DQoJcFBJVEMtPlBJVENfUElNUiA9IHBlcmlvZD8gKHBlcmlvZCAqIHBpdF9mcmVxdWVuY3kgKyA4KSA+PiA0IDogMDsgLy8gKzggdG8gYXZvaWQgJTEwIGFuZCAvMTANCglwUElUQy0+UElUQ19QSU1SIHw9IEFUOTFDX1BJVENfUElURU47CSANCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSVRTZXRQSVYNCi8vKiBcYnJpZWYgU2V0IHRoZSBQSVQgUGVyaW9kaWMgSW50ZXJ2YWwgVmFsdWUgDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVFNldFBJVigNCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMsDQogICAgICAgIHVuc2lnbmVkIGludCBwaXYpDQp7DQoJcFBJVEMtPlBJVENfUElNUiA9IHBpdiB8IChwUElUQy0+UElUQ19QSU1SICYgKEFUOTFDX1BJVENfUElURU4gfCBBVDkxQ19QSVRDX1BJVElFTikpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVEVuYWJsZUludA0KLy8qIFxicmllZiBFbmFibGUgUElUIHBlcmlvZGljIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRFbmFibGVJbnQoDQogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQ0Kew0KCXBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRJRU47CSANCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSVREaXNhYmxlSW50DQovLyogXGJyaWVmIERpc2FibGUgUElUIHBlcmlvZGljIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVREaXNhYmxlSW50KA0KICAgICAgICBBVDkxUFNfUElUQyBwUElUQykNCnsNCglwUElUQy0+UElUQ19QSU1SICY9IH5BVDkxQ19QSVRDX1BJVElFTjsJIA0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVEdldE1vZGUNCi8vKiBcYnJpZWYgUmVhZCBQSVQgbW9kZSByZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldE1vZGUoDQogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQ0Kew0KCXJldHVybihwUElUQy0+UElUQ19QSU1SKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSVRHZXRTdGF0dXMNCi8vKiBcYnJpZWYgUmVhZCBQSVQgc3RhdHVzIHJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0U3RhdHVzKA0KICAgICAgICBBVDkxUFNfUElUQyBwUElUQykNCnsNCglyZXR1cm4ocFBJVEMtPlBJVENfUElTUik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElUR2V0UElJUg0KLy8qIFxicmllZiBSZWFkIFBJVCBDUElWIGFuZCBQSUNOVCB3aXRob3V0IHJlc3NldHRpbmcgdGhlIGNvdW50ZXJzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0UElJUigNCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMpDQp7DQoJcmV0dXJuKHBQSVRDLT5QSVRDX1BJSVIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVEdldFBJVlINCi8vKiBcYnJpZWYgUmVhZCBTeXN0ZW0gdGltZXIgQ1BJViBhbmQgUElDTlQgd2l0aG91dCByZXNzZXR0aW5nIHRoZSBjb3VudGVycw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldFBJVlIoDQogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQ0Kew0KCXJldHVybihwUElUQy0+UElUQ19QSVZSKTsNCn0NCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBXRFRDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9XRFRTZXRNb2RlDQovLyogXGJyaWVmIFNldCBXYXRjaGRvZyBNb2RlIFJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1dEVFNldE1vZGUoDQogICAgICAgIEFUOTFQU19XRFRDIHBXRFRDLA0KICAgICAgICB1bnNpZ25lZCBpbnQgTW9kZSkNCnsNCglwV0RUQy0+V0RUQ19XRE1SID0gTW9kZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9XRFRSZXN0YXJ0DQovLyogXGJyaWVmIFJlc3RhcnQgV2F0Y2hkb2cNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUUmVzdGFydCgNCiAgICAgICAgQVQ5MVBTX1dEVEMgcFdEVEMpDQp7DQoJcFdEVEMtPldEVENfV0RDUiA9IDB4QTUwMDAwMDE7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfV0RUU0dldHRhdHVzDQovLyogXGJyaWVmIEdldCBXYXRjaGRvZyBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9XRFRTR2V0dGF0dXMoDQogICAgICAgIEFUOTFQU19XRFRDIHBXRFRDKQ0Kew0KCXJldHVybihwV0RUQy0+V0RUQ19XRFNSICYgMHgzKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9XRFRHZXRQZXJpb2QNCi8vKiBcYnJpZWYgVHJhbnNsYXRlIG1zIGludG8gV2F0Y2hkb2cgQ29tcGF0aWJsZSB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1dEVEdldFBlcmlvZCh1bnNpZ25lZCBpbnQgbXMpDQp7DQoJaWYgKChtcyA8IDQpIHx8IChtcyA+IDE2MDAwKSkNCgkJcmV0dXJuIDA7DQoJcmV0dXJuKChtcyA8PCA4KSAvIDEwMDApOw0KfQ0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFZSRUcNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1ZSRUdfRW5hYmxlX0xvd1Bvd2VyTW9kZQ0KLy8qIFxicmllZiBFbmFibGUgVlJFRyBMb3cgUG93ZXIgTW9kZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9WUkVHX0VuYWJsZV9Mb3dQb3dlck1vZGUoDQogICAgICAgIEFUOTFQU19WUkVHIHBWUkVHKQ0Kew0KCXBWUkVHLT5WUkVHX01SIHw9IEFUOTFDX1ZSRUdfUFNUREJZOwkgDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVlJFR19EaXNhYmxlX0xvd1Bvd2VyTW9kZQ0KLy8qIFxicmllZiBEaXNhYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVlJFR19EaXNhYmxlX0xvd1Bvd2VyTW9kZSgNCiAgICAgICAgQVQ5MVBTX1ZSRUcgcFZSRUcpDQp7DQoJcFZSRUctPlZSRUdfTVIgJj0gfkFUOTFDX1ZSRUdfUFNUREJZOwkgDQp9LyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIE1DDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQojZGVmaW5lIEFUOTFDX01DX0NPUlJFQ1RfS0VZICAoKHVuc2lnbmVkIGludCkgMHg1QSA8PCAyNCkgLy8gKE1DKSBDb3JyZWN0IFByb3RlY3QgS2V5DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfTUNfUmVtYXANCi8vKiBcYnJpZWYgTWFrZSBSZW1hcA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9NQ19SZW1hcCAodm9pZCkgICAgIC8vICANCnsNCiAgICBBVDkxUFNfTUMgcE1DID0gKEFUOTFQU19NQykgQVQ5MUNfQkFTRV9NQzsNCiAgICANCiAgICBwTUMtPk1DX1JDUiA9IEFUOTFDX01DX1JDQjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfQ2ZnTW9kZVJlZw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIEVGQyBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBNQyBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX01DX0VGQ19DZmdNb2RlUmVnICgNCglBVDkxUFNfTUMgcE1DLCAvLyBwb2ludGVyIHRvIGEgTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtb2RlKSAgICAgICAgLy8gbW9kZSByZWdpc3RlciANCnsNCgkvLyBXcml0ZSB0byB0aGUgRk1SIHJlZ2lzdGVyDQoJcE1DLT5NQ19GTVIgPSBtb2RlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19HZXRNb2RlUmVnDQovLyogXGJyaWVmIFJldHVybiBNQyBFRkMgTW9kZSBSZWdzaXRlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX01DX0VGQ19HZXRNb2RlUmVnKA0KCUFUOTFQU19NQyBwTUMpIC8vIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBNQy0+TUNfRk1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19Db21wdXRlRk1DTg0KLy8qIFxicmllZiBSZXR1cm4gTUMgRUZDIE1vZGUgUmVnc2l0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfQ29tcHV0ZUZNQ04oDQoJaW50IG1hc3Rlcl9jbG9jaykgLy8gbWFzdGVyIGNsb2NrIGluIEh6DQp7DQoJcmV0dXJuIChtYXN0ZXJfY2xvY2svMTAwMDAwMCArMik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfTUNfRUZDX1BlcmZvcm1DbWQNCi8vKiBcYnJpZWYgUGVyZm9ybSBFRkMgQ29tbWFuZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9NQ19FRkNfUGVyZm9ybUNtZCAoDQoJQVQ5MVBTX01DIHBNQywgLy8gcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXINCiAgICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfY21kKQ0Kew0KCXBNQy0+TUNfRkNSID0gdHJhbnNmZXJfY21kOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfR2V0U3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBNQyBFRkMgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0dldFN0YXR1cygNCglBVDkxUFNfTUMgcE1DKSAvLyBwb2ludGVyIHRvIGEgTUMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwTUMtPk1DX0ZTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBFRkMgTUMgSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19NQyBwTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZyhwTUMpICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0U2V0DQovLyogXGJyaWVmIFRlc3QgaWYgRUZDIE1DIEludGVycnVwdCBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRTZXQoDQogICAgICAgIEFUOTFQU19NQyBwTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9NQ19FRkNfR2V0U3RhdHVzKHBNQykgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNQSQ0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX09wZW4NCi8vKiBcYnJpZWYgT3BlbiBhIFNQSSBQb3J0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX09wZW4gKA0KICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVsbCkgIC8vIFxhcmcNCnsNCiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8NCiAgICAgICAgcmV0dXJuICggMCApOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9DZmdDcw0KLy8qIFxicmllZiBDb25maWd1cmUgU1BJIGNoaXAgc2VsZWN0IHJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9DZmdDcyAoDQoJQVQ5MVBTX1NQSSBwU1BJLCAgICAgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQoJaW50IGNzLCAgICAgLy8gU1BJIGNzIG51bWJlciAoMCB0byAzKQ0KIAlpbnQgdmFsKSAgIC8vICBjaGlwIHNlbGVjdCByZWdpc3Rlcg0Kew0KCS8vKiBXcml0ZSB0byB0aGUgQ1NSIHJlZ2lzdGVyDQoJKihwU1BJLT5TUElfQ1NSICsgY3MpID0gdmFsOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGVJdA0KLy8qIFxicmllZiBFbmFibGUgU1BJIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlSXQgKA0KCUFUOTFQU19TUEkgcFNQSSwgICAgIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBTUEktPlNQSV9JRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBTUEkgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9EaXNhYmxlSXQgKA0KCUFUOTFQU19TUEkgcFNQSSwgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpIC8vIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXINCglwU1BJLT5TUElfSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUElfUmVzZXQNCi8vKiBcYnJpZWYgUmVzZXQgdGhlIFNQSSBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9SZXNldCAoDQoJQVQ5MVBTX1NQSSBwU1BJIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcg0KCSkNCnsNCgkvLyogV3JpdGUgdG8gdGhlIENSIHJlZ2lzdGVyDQoJcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NXUlNUOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGUNCi8vKiBcYnJpZWYgRW5hYmxlIHRoZSBTUEkgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlICgNCglBVDkxUFNfU1BJIHBTUEkgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQoJKQ0Kew0KCS8vKiBXcml0ZSB0byB0aGUgQ1IgcmVnaXN0ZXINCglwU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1BJRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0Rpc2FibGUNCi8vKiBcYnJpZWYgRGlzYWJsZSB0aGUgU1BJIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Rpc2FibGUgKA0KCUFUOTFQU19TUEkgcFNQSSAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXINCgkpDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBDUiByZWdpc3Rlcg0KCXBTUEktPlNQSV9DUiA9IEFUOTFDX1NQSV9TUElESVM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ01vZGUNCi8vKiBcYnJpZWYgRW5hYmxlIHRoZSBTUEkgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnTW9kZSAoDQoJQVQ5MVBTX1NQSSBwU1BJLCAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXINCglpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIgDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3Rlcg0KCXBTUEktPlNQSV9NUiA9IG1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ1BDUw0KLy8qIFxicmllZiBTd2l0Y2ggdG8gdGhlIGNvcnJlY3QgUENTIG9mIFNQSSBNb2RlIFJlZ2lzdGVyIDogRml4ZWQgUGVyaXBoZXJhbCBTZWxlY3RlZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnUENTICgNCglBVDkxUFNfU1BJIHBTUEksIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcg0KCWNoYXIgUENTX0RldmljZSkgLy8gUENTIG9mIHRoZSBEZXZpY2UNCnsJDQogCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXINCglwU1BJLT5TUElfTVIgJj0gMHhGRkYwRkZGRjsNCglwU1BJLT5TUElfTVIgfD0gKCAoUENTX0RldmljZTw8MTYpICYgQVQ5MUNfU1BJX1BDUyApOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9SZWNlaXZlRnJhbWUNCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TUElfUmVjZWl2ZUZyYW1lICgNCglBVDkxUFNfU1BJIHBTUEksDQoJY2hhciAqcEJ1ZmZlciwNCgl1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQoJY2hhciAqcE5leHRCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApDQp7DQoJcmV0dXJuIEFUOTFGX1BEQ19SZWNlaXZlRnJhbWUoDQoJCShBVDkxUFNfUERDKSAmKHBTUEktPlNQSV9SUFIpLA0KCQlwQnVmZmVyLA0KCQlzekJ1ZmZlciwNCgkJcE5leHRCdWZmZXIsDQoJCXN6TmV4dEJ1ZmZlcik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX1NlbmRGcmFtZQ0KLy8qIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYlNQSXkNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TUElfU2VuZEZyYW1lKA0KCUFUOTFQU19TUEkgcFNQSSwNCgljaGFyICpwQnVmZmVyLA0KCXVuc2lnbmVkIGludCBzekJ1ZmZlciwNCgljaGFyICpwTmV4dEJ1ZmZlciwNCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCglyZXR1cm4gQVQ5MUZfUERDX1NlbmRGcmFtZSgNCgkJKEFUOTFQU19QREMpICYocFNQSS0+U1BJX1JQUiksDQoJCXBCdWZmZXIsDQoJCXN6QnVmZmVyLA0KCQlwTmV4dEJ1ZmZlciwNCgkJc3pOZXh0QnVmZmVyKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUElfQ2xvc2UNCi8vKiBcYnJpZWYgQ2xvc2UgU1BJOiBkaXNhYmxlIElUIGRpc2FibGUgdHJhbnNmZXJ0LCBjbG9zZSBQREMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Nsb3NlICgNCglBVDkxUFNfU1BJIHBTUEkpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcg0Kew0KICAgIC8vKiBSZXNldCBhbGwgdGhlIENoaXAgU2VsZWN0IHJlZ2lzdGVyDQogICAgcFNQSS0+U1BJX0NTUlswXSA9IDAgOw0KICAgIHBTUEktPlNQSV9DU1JbMV0gPSAwIDsNCiAgICBwU1BJLT5TUElfQ1NSWzJdID0gMCA7DQogICAgcFNQSS0+U1BJX0NTUlszXSA9IDAgOw0KDQogICAgLy8qIFJlc2V0IHRoZSBTUEkgbW9kZQ0KICAgIHBTUEktPlNQSV9NUiA9IDAgIDsNCg0KICAgIC8vKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzDQogICAgcFNQSS0+U1BJX0lEUiA9IDB4RkZGRkZGRkYgOw0KDQogICAgLy8qIEFib3J0IHRoZSBQZXJpcGhlcmFsIERhdGEgVHJhbnNmZXJzDQogICAgQVQ5MUZfUERDX0Nsb3NlKChBVDkxUFNfUERDKSAmKHBTUEktPlNQSV9SUFIpKTsNCg0KICAgIC8vKiBEaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciBhbmQgc3RvcCBhbnkgYWN0aXZpdHkgaW1tZWRpYXRlbHkNCiAgICBwU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1BJRElTOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9QdXRDaGFyDQovLyogXGJyaWVmIFNlbmQgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgcmVhZHkgdG8gc2VuZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfUHV0Q2hhciAoDQoJQVQ5MVBTX1NQSSBwU1BJLA0KCXVuc2lnbmVkIGludCBjaGFyYWN0ZXIsDQogICAgICAgICAgICAgdW5zaWduZWQgaW50IGNzX251bWJlciApDQp7DQogICAgdW5zaWduZWQgaW50IHZhbHVlX2Zvcl9jczsNCiAgICB2YWx1ZV9mb3JfY3MgPSAofigxIDw8IGNzX251bWJlcikpICYgMHhGOyAgLy9QbGFjZSBhIHplcm8gYW1vbmcgYSA0IE9ORXMgbnVtYmVyDQogICAgcFNQSS0+U1BJX1REUiA9IChjaGFyYWN0ZXIgJiAweEZGRkYpIHwgKHZhbHVlX2Zvcl9jcyA8PCAxNik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0dldENoYXINCi8vKiBcYnJpZWYgUmVjZWl2ZSBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9TUElfR2V0Q2hhciAoDQoJY29uc3QgQVQ5MVBTX1NQSSBwU1BJKQ0Kew0KICAgIHJldHVybigocFNQSS0+U1BJX1JEUikgJiAweEZGRkYpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBTUEkgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gU1BJIEludGVycnVwdCBNYXNrIFN0YXR1cw0KICAgICAgICBBVDkxUFNfU1BJIHBTcGkpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFNwaS0+U1BJX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUElfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBTUEkgSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9TUElfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19TUEkgcFNwaSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfU1BJX0dldEludGVycnVwdE1hc2tTdGF0dXMocFNwaSkgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFVTQVJUDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19CYXVkcmF0ZQ0KLy8qIFxicmllZiBDYWxjdWxhdGUgdGhlIGJhdWRyYXRlDQovLyogU3RhbmRhcmQgQXN5bmNocm9ub3VzIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBubyBwYXJpdHkNCiNkZWZpbmUgQVQ5MUNfVVNfQVNZTkNfTU9ERSAoIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19QQVJfTk9ORSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0xLU19DTE9DSyApDQoNCi8vKiBTdGFuZGFyZCBFeHRlcm5hbCBBc3luY2hyb25vdXMgTW9kZSA6IDggYml0cyAsIDEgc3RvcCAsIG5vIHBhcml0eQ0KI2RlZmluZSBBVDkxQ19VU19BU1lOQ19TQ0tfTU9ERSAoIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX1BBUl9OT05FICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NMS1NfRVhUICkNCg0KLy8qIFN0YW5kYXJkIFN5bmNocm9ub3VzIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBubyBwYXJpdHkNCiNkZWZpbmUgQVQ5MUNfVVNfU1lOQ19NT0RFICggQVQ5MUNfVVNfU1lOQyArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfVVNNT0RFX05PUk1BTCArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXA0KICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19QQVJfTk9ORSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyBcDQogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NMS1NfQ0xPQ0sgKQ0KDQovLyogU0NLIHVzZWQgTGFiZWwNCiNkZWZpbmUgQVQ5MUNfVVNfU0NLX1VTRUQgKEFUOTFDX1VTX0NLTE8gfCBBVDkxQ19VU19DTEtTX0VYVCkNCg0KLy8qIFN0YW5kYXJkIElTTyBUPTAgTW9kZSA6IDggYml0cyAsIDEgc3RvcCAsIHBhcml0eQ0KI2RlZmluZSBBVDkxQ19VU19JU09fUkVBREVSX01PREUgKCBBVDkxQ19VU19VU01PREVfSVNPNzgxNl8wICsgXA0KCQkJCQkgICAJCSBBVDkxQ19VU19DTEtTX0NMT0NLICtcDQogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgCQkgQVQ5MUNfVVNfUEFSX0VWRU4gKyBcDQogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAJCSBBVDkxQ19VU19DS0xPICtcDQogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX09WRVIpDQoNCi8vKiBTdGFuZGFyZCBJUkRBIG1vZGUNCiNkZWZpbmUgQVQ5MUNfVVNfQVNZTkNfSVJEQV9NT0RFICggIEFUOTFDX1VTX1VTTU9ERV9JUkRBICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19QQVJfTk9ORSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICkNCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19CYXVkcmF0ZQ0KLy8qIFxicmllZiBDYWx1Y3VsYXRlIGJhdWRfdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBtYWluIGNsb2NrIGFuZCB0aGUgYmF1ZCByYXRlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfQmF1ZHJhdGUgKA0KCWNvbnN0IHVuc2lnbmVkIGludCBtYWluX2Nsb2NrLCAvLyBcYXJnIHBlcmlwaGVyYWwgY2xvY2sNCgljb25zdCB1bnNpZ25lZCBpbnQgYmF1ZF9yYXRlKSAgLy8gXGFyZyBVQVJUIGJhdWRyYXRlDQp7DQoJdW5zaWduZWQgaW50IGJhdWRfdmFsdWUgPSAoKG1haW5fY2xvY2sqMTApLyhiYXVkX3JhdGUgKiAxNikpOw0KCWlmICgoYmF1ZF92YWx1ZSAlIDEwKSA+PSA1KQ0KCQliYXVkX3ZhbHVlID0gKGJhdWRfdmFsdWUgLyAxMCkgKyAxOw0KCWVsc2UNCgkJYmF1ZF92YWx1ZSAvPSAxMDsNCglyZXR1cm4gYmF1ZF92YWx1ZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19TZXRCYXVkcmF0ZQ0KLy8qIFxicmllZiBTZXQgdGhlIGJhdWRyYXRlIGFjY29yZGluZyB0byB0aGUgQ1BVIGNsb2NrDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1NldEJhdWRyYXRlICgNCglBVDkxUFNfVVNBUlQgcFVTQVJULCAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1haW5DbG9jaywgLy8gXGFyZyBwZXJpcGhlcmFsIGNsb2NrDQoJdW5zaWduZWQgaW50IHNwZWVkKSAgICAgLy8gXGFyZyBVQVJUIGJhdWRyYXRlDQp7DQoJLy8qIERlZmluZSB0aGUgYmF1ZCByYXRlIGRpdmlzb3IgcmVnaXN0ZXINCglwVVNBUlQtPlVTX0JSR1IgPSBBVDkxRl9VU19CYXVkcmF0ZShtYWluQ2xvY2ssIHNwZWVkKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19TZXRUaW1lZ3VhcmQNCi8vKiBcYnJpZWYgU2V0IFVTQVJUIHRpbWVndWFyZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19TZXRUaW1lZ3VhcmQgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQsICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgdGltZWd1YXJkKSAvLyBcYXJnIHRpbWVndWFyZCB2YWx1ZQ0Kew0KCS8vKiBXcml0ZSB0aGUgVGltZWd1YXJkIFJlZ2lzdGVyDQoJcFVTQVJULT5VU19UVEdSID0gdGltZWd1YXJkIDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19FbmFibGVJdA0KLy8qIFxicmllZiBFbmFibGUgVVNBUlQgSVQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlSXQgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQsIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBVU0FSVC0+VVNfSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBVU0FSVCBJVA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19EaXNhYmxlSXQgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQsIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwVVNBUlQtPlVTX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfQ29uZmlndXJlDQovLyogXGJyaWVmIENvbmZpZ3VyZSBVU0FSVA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19Db25maWd1cmUgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1haW5DbG9jaywgIC8vIFxhcmcgcGVyaXBoZXJhbCBjbG9jaw0KCXVuc2lnbmVkIGludCBtb2RlICwgICAgICAvLyBcYXJnIG1vZGUgUmVnaXN0ZXIgdG8gYmUgcHJvZ3JhbW1lZA0KCXVuc2lnbmVkIGludCBiYXVkUmF0ZSAsICAvLyBcYXJnIGJhdWRyYXRlIHRvIGJlIHByb2dyYW1tZWQNCgl1bnNpZ25lZCBpbnQgdGltZWd1YXJkICkgLy8gXGFyZyB0aW1lZ3VhcmQgdG8gYmUgcHJvZ3JhbW1lZA0Kew0KICAgIC8vKiBEaXNhYmxlIGludGVycnVwdHMNCiAgICBwVVNBUlQtPlVTX0lEUiA9ICh1bnNpZ25lZCBpbnQpIC0xOw0KDQogICAgLy8qIFJlc2V0IHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlcg0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SU1RSWCB8IEFUOTFDX1VTX1JTVFRYIHwgQVQ5MUNfVVNfUlhESVMgfCBBVDkxQ19VU19UWERJUyA7DQoNCgkvLyogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3Rlcg0KCUFUOTFGX1VTX1NldEJhdWRyYXRlKHBVU0FSVCwgbWFpbkNsb2NrLCBiYXVkUmF0ZSk7DQoNCgkvLyogV3JpdGUgdGhlIFRpbWVndWFyZCBSZWdpc3Rlcg0KCUFUOTFGX1VTX1NldFRpbWVndWFyZChwVVNBUlQsIHRpbWVndWFyZCk7DQoNCiAgICAvLyogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMNCiAgICBBVDkxRl9QRENfT3BlbigoQVQ5MVBTX1BEQykgJihwVVNBUlQtPlVTX1JQUikpOw0KDQogICAgLy8qIERlZmluZSB0aGUgVVNBUlQgbW9kZQ0KICAgIHBVU0FSVC0+VVNfTVIgPSBtb2RlICA7DQoNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19FbmFibGVSeA0KLy8qIFxicmllZiBFbmFibGUgcmVjZWl2aW5nIGNoYXJhY3RlcnMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlUnggKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQp7DQogICAgLy8qIEVuYWJsZSByZWNlaXZlcg0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SWEVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX0VuYWJsZVR4DQovLyogXGJyaWVmIEVuYWJsZSBzZW5kaW5nIGNoYXJhY3RlcnMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlVHggKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQp7DQogICAgLy8qIEVuYWJsZSAgdHJhbnNtaXR0ZXINCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfVFhFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19SZXNldFJ4DQovLyogXGJyaWVmIFJlc2V0IFJlY2VpdmVyIGFuZCByZS1lbmFibGUgaXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfUmVzZXRSeCAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCnsNCgkvLyogUmVzZXQgcmVjZWl2ZXINCglwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlNUUlg7DQogICAgLy8qIFJlLUVuYWJsZSByZWNlaXZlcg0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SWEVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX1Jlc2V0VHgNCi8vKiBcYnJpZWYgUmVzZXQgVHJhbnNtaXR0ZXIgYW5kIHJlLWVuYWJsZSBpdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19SZXNldFR4ICgNCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KCS8vKiBSZXNldCB0cmFuc21pdHRlcg0KCXBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SU1RUWDsNCiAgICAvLyogRW5hYmxlIHRyYW5zbWl0dGVyDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfRGlzYWJsZVJ4DQovLyogXGJyaWVmIERpc2FibGUgUmVjZWl2ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRGlzYWJsZVJ4ICgNCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KICAgIC8vKiBEaXNhYmxlIHJlY2VpdmVyDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JYRElTOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX0Rpc2FibGVUeA0KLy8qIFxicmllZiBEaXNhYmxlIFRyYW5zbWl0dGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0Rpc2FibGVUeCAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCnsNCiAgICAvLyogRGlzYWJsZSB0cmFuc21pdHRlcg0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19UWERJUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19DbG9zZQ0KLy8qIFxicmllZiBDbG9zZSBVU0FSVDogZGlzYWJsZSBJVCBkaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciwgY2xvc2UgUERDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0Nsb3NlICgNCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KICAgIC8vKiBSZXNldCB0aGUgYmF1ZCByYXRlIGRpdmlzb3IgcmVnaXN0ZXINCiAgICBwVVNBUlQtPlVTX0JSR1IgPSAwIDsNCg0KICAgIC8vKiBSZXNldCB0aGUgVVNBUlQgbW9kZQ0KICAgIHBVU0FSVC0+VVNfTVIgPSAwICA7DQoNCiAgICAvLyogUmVzZXQgdGhlIFRpbWVndWFyZCBSZWdpc3Rlcg0KICAgIHBVU0FSVC0+VVNfVFRHUiA9IDA7DQoNCiAgICAvLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cw0KICAgIHBVU0FSVC0+VVNfSURSID0gMHhGRkZGRkZGRiA7DQoNCiAgICAvLyogQWJvcnQgdGhlIFBlcmlwaGVyYWwgRGF0YSBUcmFuc2ZlcnMNCiAgICBBVDkxRl9QRENfQ2xvc2UoKEFUOTFQU19QREMpICYocFVTQVJULT5VU19SUFIpKTsNCg0KICAgIC8vKiBEaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciBhbmQgc3RvcCBhbnkgYWN0aXZpdHkgaW1tZWRpYXRlbHkNCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfVFhESVMgfCBBVDkxQ19VU19SWERJUyB8IEFUOTFDX1VTX1JTVFRYIHwgQVQ5MUNfVVNfUlNUUlggOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX1R4UmVhZHkNCi8vKiBcYnJpZWYgUmV0dXJuIDEgaWYgYSBjaGFyYWN0ZXIgY2FuIGJlIHdyaXR0ZW4gaW4gVVNfVEhSDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfVHhSZWFkeSAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCApICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQp7DQogICAgcmV0dXJuIChwVVNBUlQtPlVTX0NTUiAmIEFUOTFDX1VTX1RYUkRZKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19SeFJlYWR5DQovLyogXGJyaWVmIFJldHVybiAxIGlmIGEgY2hhcmFjdGVyIGNhbiBiZSByZWFkIGluIFVTX1JIUg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1J4UmVhZHkgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQgKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KICAgIHJldHVybiAocFVTQVJULT5VU19DU1IgJiBBVDkxQ19VU19SWFJEWSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfRXJyb3INCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBlcnJvciBmbGFnDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfRXJyb3IgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQgKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KICAgIHJldHVybiAocFVTQVJULT5VU19DU1IgJg0KICAgIAkoQVQ5MUNfVVNfT1ZSRSB8ICAvLyBPdmVycnVuIGVycm9yDQogICAgCSBBVDkxQ19VU19GUkFNRSB8IC8vIEZyYW1pbmcgZXJyb3INCiAgICAJIEFUOTFDX1VTX1BBUkUpKTsgIC8vIFBhcml0eSBlcnJvcg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX1B1dENoYXINCi8vKiBcYnJpZWYgU2VuZCBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiByZWFkeSB0byBzZW5kDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1B1dENoYXIgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQsDQoJaW50IGNoYXJhY3RlciApDQp7DQogICAgcFVTQVJULT5VU19USFIgPSAoY2hhcmFjdGVyICYgMHgxRkYpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX0dldENoYXINCi8vKiBcYnJpZWYgUmVjZWl2ZSBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9VU19HZXRDaGFyICgNCgljb25zdCBBVDkxUFNfVVNBUlQgcFVTQVJUKQ0Kew0KICAgIHJldHVybigocFVTQVJULT5VU19SSFIpICYgMHgxRkYpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX1NlbmRGcmFtZQ0KLy8qIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1NlbmRGcmFtZSgNCglBVDkxUFNfVVNBUlQgcFVTQVJULA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCXJldHVybiBBVDkxRl9QRENfU2VuZEZyYW1lKA0KCQkoQVQ5MVBTX1BEQykgJihwVVNBUlQtPlVTX1JQUiksDQoJCXBCdWZmZXIsDQoJCXN6QnVmZmVyLA0KCQlwTmV4dEJ1ZmZlciwNCgkJc3pOZXh0QnVmZmVyKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19SZWNlaXZlRnJhbWUNCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VU19SZWNlaXZlRnJhbWUgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQsDQoJY2hhciAqcEJ1ZmZlciwNCgl1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQoJY2hhciAqcE5leHRCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApDQp7DQoJcmV0dXJuIEFUOTFGX1BEQ19SZWNlaXZlRnJhbWUoDQoJCShBVDkxUFNfUERDKSAmKHBVU0FSVC0+VVNfUlBSKSwNCgkJcEJ1ZmZlciwNCgkJc3pCdWZmZXIsDQoJCXBOZXh0QnVmZmVyLA0KCQlzek5leHRCdWZmZXIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX1NldElyZGFGaWx0ZXINCi8vKiBcYnJpZWYgU2V0IHRoZSB2YWx1ZSBvZiBJckRhIGZpbHRlciB0cmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfU2V0SXJkYUZpbHRlciAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwNCgl1bnNpZ25lZCBjaGFyIHZhbHVlDQopDQp7DQoJcFVTQVJULT5VU19JRiA9IHZhbHVlOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgU1NDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qIERlZmluZSB0aGUgc3RhbmRhcmQgSTJTIG1vZGUgY29uZmlndXJhdGlvbg0KDQovLyogQ29uZmlndXJhdGlvbiB0byBzZXQgaW4gdGhlIFNTQyBUcmFuc21pdCBDbG9jayBNb2RlIFJlZ2lzdGVyDQovLyogUGFyYW1ldGVycyA6ICBuYl9iaXRfYnlfc2xvdCA6IDgsIDE2IG9yIDMyIGJpdHMNCi8vKiAJCQkgIG5iX3Nsb3RfYnlfZnJhbWUgOiBudW1iZXIgb2YgY2hhbm5lbHMNCiNkZWZpbmUgQVQ5MUNfSTJTX0FTWV9NQVNURVJfVFhfU0VUVElORyhuYl9iaXRfYnlfc2xvdCwgbmJfc2xvdF9ieV9mcmFtZSkoICtcDQoJCQkJCQkJCQkgICBBVDkxQ19TU0NfQ0tTX0RJViAgICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICBBVDkxQ19TU0NfQ0tPX0NPTlRJTk9VUyAgICAgICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICBBVDkxQ19TU0NfQ0tHX05PTkUgICAgK1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1NTQ19TVEFSVF9GQUxMX1JGICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkgICBBVDkxQ19TU0NfU1RUT1VUICArXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgKCgxPDwxNikgJiBBVDkxQ19TU0NfU1RURExZKSArXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgKCgoKG5iX2JpdF9ieV9zbG90Km5iX3Nsb3RfYnlfZnJhbWUpLzIpLTEpIDw8MjQpKQ0KDQoNCi8vKiBDb25maWd1cmF0aW9uIHRvIHNldCBpbiB0aGUgU1NDIFRyYW5zbWl0IEZyYW1lIE1vZGUgUmVnaXN0ZXINCi8vKiBQYXJhbWV0ZXJzIDogbmJfYml0X2J5X3Nsb3QgOiA4LCAxNiBvciAzMiBiaXRzDQovLyogCQkJIG5iX3Nsb3RfYnlfZnJhbWUgOiBudW1iZXIgb2YgY2hhbm5lbHMNCiNkZWZpbmUgQVQ5MUNfSTJTX0FTWV9UWF9GUkFNRV9TRVRUSU5HKG5iX2JpdF9ieV9zbG90LCBuYl9zbG90X2J5X2ZyYW1lKSggK1wNCgkJCQkJCQkJCShuYl9iaXRfYnlfc2xvdC0xKSAgK1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUFUOTFDX1NTQ19NU0JGICAgK1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSgoKG5iX3Nsb3RfYnlfZnJhbWUtMSk8PDgpICYgQVQ5MUNfU1NDX0RBVE5CKSAgK1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSgoKG5iX2JpdF9ieV9zbG90LTEpPDwxNikgJiBBVDkxQ19TU0NfRlNMRU4pICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlBVDkxQ19TU0NfRlNPU19ORUdBVElWRSkNCg0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19TZXRCYXVkcmF0ZQ0KLy8qIFxicmllZiBTZXQgdGhlIGJhdWRyYXRlIGFjY29yZGluZyB0byB0aGUgQ1BVIGNsb2NrDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19TZXRCYXVkcmF0ZSAoDQogICAgICAgIEFUOTFQU19TU0MgcFNTQywgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBtYWluQ2xvY2ssIC8vIFxhcmcgcGVyaXBoZXJhbCBjbG9jaw0KICAgICAgICB1bnNpZ25lZCBpbnQgc3BlZWQpICAgICAvLyBcYXJnIFNTQyBiYXVkcmF0ZQ0Kew0KICAgICAgICB1bnNpZ25lZCBpbnQgYmF1ZF92YWx1ZTsNCiAgICAgICAgLy8qIERlZmluZSB0aGUgYmF1ZCByYXRlIGRpdmlzb3IgcmVnaXN0ZXINCiAgICAgICAgaWYgKHNwZWVkID09IDApDQogICAgICAgICAgIGJhdWRfdmFsdWUgPSAwOw0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgYmF1ZF92YWx1ZSA9ICh1bnNpZ25lZCBpbnQpIChtYWluQ2xvY2sgKiAxMCkvKDIqc3BlZWQpOw0KICAgICAgICAgICBpZiAoKGJhdWRfdmFsdWUgJSAxMCkgPj0gNSkNCiAgICAgICAgICAgICAgICAgIGJhdWRfdmFsdWUgPSAoYmF1ZF92YWx1ZSAvIDEwKSArIDE7DQogICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgIGJhdWRfdmFsdWUgLz0gMTA7DQogICAgICAgIH0NCg0KICAgICAgICBwU1NDLT5TU0NfQ01SID0gYmF1ZF92YWx1ZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfQ29uZmlndXJlDQovLyogXGJyaWVmIENvbmZpZ3VyZSBTU0MNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NvbmZpZ3VyZSAoDQogICAgICAgICAgICAgQVQ5MVBTX1NTQyBwU1NDLCAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0KICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzeXN0X2Nsb2NrLCAgLy8gXGFyZyBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5DQogICAgICAgICAgICAgdW5zaWduZWQgaW50IGJhdWRfcmF0ZSwgICAvLyBcYXJnIEV4cGVjdGVkIEJhdWQgUmF0ZSBGcmVxdWVuY3kNCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2xvY2tfcngsICAgIC8vIFxhcmcgUmVjZWl2ZXIgQ2xvY2sgUGFyYW1ldGVycw0KICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlX3J4LCAgICAgLy8gXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQNCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2xvY2tfdHgsICAgIC8vIFxhcmcgVHJhbnNtaXR0ZXIgQ2xvY2sgUGFyYW1ldGVycw0KICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlX3R4KSAgICAgLy8gXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQNCnsNCiAgICAvLyogRGlzYWJsZSBpbnRlcnJ1cHRzDQoJcFNTQy0+U1NDX0lEUiA9ICh1bnNpZ25lZCBpbnQpIC0xOw0KDQogICAgLy8qIFJlc2V0IHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlcg0KCXBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19TV1JTVCB8IEFUOTFDX1NTQ19SWERJUyB8IEFUOTFDX1NTQ19UWERJUyA7DQoNCiAgICAvLyogRGVmaW5lIHRoZSBDbG9jayBNb2RlIFJlZ2lzdGVyDQoJQVQ5MUZfU1NDX1NldEJhdWRyYXRlKHBTU0MsIHN5c3RfY2xvY2ssIGJhdWRfcmF0ZSk7DQoNCiAgICAgLy8qIFdyaXRlIHRoZSBSZWNlaXZlIENsb2NrIE1vZGUgUmVnaXN0ZXINCglwU1NDLT5TU0NfUkNNUiA9ICBjbG9ja19yeDsNCg0KICAgICAvLyogV3JpdGUgdGhlIFRyYW5zbWl0IENsb2NrIE1vZGUgUmVnaXN0ZXINCglwU1NDLT5TU0NfVENNUiA9ICBjbG9ja190eDsNCg0KICAgICAvLyogV3JpdGUgdGhlIFJlY2VpdmUgRnJhbWUgTW9kZSBSZWdpc3Rlcg0KCXBTU0MtPlNTQ19SRk1SID0gIG1vZGVfcng7DQoNCiAgICAgLy8qIFdyaXRlIHRoZSBUcmFuc21pdCBGcmFtZSBNb2RlIFJlZ2lzdGVyDQoJcFNTQy0+U1NDX1RGTVIgPSAgbW9kZV90eDsNCg0KICAgIC8vKiBDbGVhciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBDb3VudGVycw0KCUFUOTFGX1BEQ19PcGVuKChBVDkxUFNfUERDKSAmKHBTU0MtPlNTQ19SUFIpKTsNCg0KDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0VuYWJsZVJ4DQovLyogXGJyaWVmIEVuYWJsZSByZWNlaXZpbmcgZGF0YXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0VuYWJsZVJ4ICgNCglBVDkxUFNfU1NDIHBTU0MpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0Kew0KICAgIC8vKiBFbmFibGUgcmVjZWl2ZXINCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfUlhFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfRGlzYWJsZVJ4DQovLyogXGJyaWVmIERpc2FibGUgcmVjZWl2aW5nIGRhdGFzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlUnggKA0KCUFUOTFQU19TU0MgcFNTQykgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyDQp7DQogICAgLy8qIERpc2FibGUgcmVjZWl2ZXINCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfUlhESVM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0VuYWJsZVR4DQovLyogXGJyaWVmIEVuYWJsZSBzZW5kaW5nIGRhdGFzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVUeCAoDQoJQVQ5MVBTX1NTQyBwU1NDKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXINCnsNCiAgICAvLyogRW5hYmxlICB0cmFuc21pdHRlcg0KICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19UWEVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19EaXNhYmxlVHgNCi8vKiBcYnJpZWYgRGlzYWJsZSBzZW5kaW5nIGRhdGFzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlVHggKA0KCUFUOTFQU19TU0MgcFNTQykgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyDQp7DQogICAgLy8qIERpc2FibGUgIHRyYW5zbWl0dGVyDQogICAgcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1RYRElTOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19FbmFibGVJdA0KLy8qIFxicmllZiBFbmFibGUgU1NDIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVJdCAoDQoJQVQ5MVBTX1NTQyBwU1NDLCAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgSVQgdG8gYmUgZW5hYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyDQoJcFNTQy0+U1NDX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0Rpc2FibGVJdA0KLy8qIFxicmllZiBEaXNhYmxlIFNTQyBJVA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRGlzYWJsZUl0ICgNCglBVDkxUFNfU1NDIHBTU0MsIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBkaXNhYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyDQoJcFNTQy0+U1NDX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX1JlY2VpdmVGcmFtZQ0KLy8qIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1NDX1JlY2VpdmVGcmFtZSAoDQoJQVQ5MVBTX1NTQyBwU1NDLA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCXJldHVybiBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lKA0KCQkoQVQ5MVBTX1BEQykgJihwU1NDLT5TU0NfUlBSKSwNCgkJcEJ1ZmZlciwNCgkJc3pCdWZmZXIsDQoJCXBOZXh0QnVmZmVyLA0KCQlzek5leHRCdWZmZXIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19TZW5kRnJhbWUNCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19TZW5kRnJhbWUoDQoJQVQ5MVBTX1NTQyBwU1NDLA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCXJldHVybiBBVDkxRl9QRENfU2VuZEZyYW1lKA0KCQkoQVQ5MVBTX1BEQykgJihwU1NDLT5TU0NfUlBSKSwNCgkJcEJ1ZmZlciwNCgkJc3pCdWZmZXIsDQoJCXBOZXh0QnVmZmVyLA0KCQlzek5leHRCdWZmZXIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBTU0MgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gU1NDIEludGVycnVwdCBNYXNrIFN0YXR1cw0KICAgICAgICBBVDkxUFNfU1NDIHBTc2MpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFNzYy0+U1NDX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBTU0MgSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9TU0NfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19TU0MgcFNzYywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMocFNzYykgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRXSQ0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0VuYWJsZUl0DQovLyogXGJyaWVmIEVuYWJsZSBUV0kgSVQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0VuYWJsZUl0ICgNCglBVDkxUFNfVFdJIHBUV0ksIC8vIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBlbmFibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwVFdJLT5UV0lfSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UV0lfRGlzYWJsZUl0DQovLyogXGJyaWVmIERpc2FibGUgVFdJIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9EaXNhYmxlSXQgKA0KCUFUOTFQU19UV0kgcFRXSSwgLy8gXGFyZyBwb2ludGVyIHRvIGEgVFdJIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXINCglwVFdJLT5UV0lfSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UV0lfQ29uZmlndXJlDQovLyogXGJyaWVmIENvbmZpZ3VyZSBUV0kgaW4gbWFzdGVyIG1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0NvbmZpZ3VyZSAoIEFUOTFQU19UV0kgcFRXSSApICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyDQp7DQogICAgLy8qIERpc2FibGUgaW50ZXJydXB0cw0KCXBUV0ktPlRXSV9JRFIgPSAodW5zaWduZWQgaW50KSAtMTsNCg0KICAgIC8vKiBSZXNldCBwZXJpcGhlcmFsDQoJcFRXSS0+VFdJX0NSID0gQVQ5MUNfVFdJX1NXUlNUOw0KDQoJLy8qIFNldCBNYXN0ZXIgbW9kZQ0KCXBUV0ktPlRXSV9DUiA9IEFUOTFDX1RXSV9NU0VOOw0KDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFRXSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UV0lfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBUV0kgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQogICAgICAgIEFUOTFQU19UV0kgcFR3aSkgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwVHdpLT5UV0lfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RXSV9Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIFRXSSBJbnRlcnJ1cHQgaXMgTWFza2VkIA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1RXSV9Jc0ludGVycnVwdE1hc2tlZCgNCiAgICAgICAgQVQ5MVBTX1RXSSBwVHdpLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9UV0lfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwVHdpKSAmIGZsYWcpOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUFdNQw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0dldFN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUFdNIEludGVycnVwdCBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QV01DX0dldFN0YXR1cyggLy8gXHJldHVybiBQV00gSW50ZXJydXB0IFN0YXR1cw0KCUFUOTFQU19QV01DIHBQV00pIC8vIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0Kew0KCXJldHVybiBwUFdNLT5QV01DX1NSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTV9JbnRlcnJ1cHRFbmFibGUNCi8vKiBcYnJpZWYgRW5hYmxlIFBXTSBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19JbnRlcnJ1cHRFbmFibGUoDQogICAgICAgIEFUOTFQU19QV01DIHBQd20sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBQV00gaW50ZXJydXB0IHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFB3bS0+UFdNQ19JRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTV9JbnRlcnJ1cHREaXNhYmxlDQovLyogXGJyaWVmIERpc2FibGUgUFdNIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0ludGVycnVwdERpc2FibGUoDQogICAgICAgIEFUOTFQU19QV01DIHBQd20sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBQV00gaW50ZXJydXB0IHRvIGJlIGRpc2FibGVkDQp7DQogICAgICAgIHBQd20tPlBXTUNfSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01fR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUFdNIEludGVycnVwdCBNYXNrIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBQV00gSW50ZXJydXB0IE1hc2sgU3RhdHVzDQogICAgICAgIEFUOTFQU19QV01DIHBQd20pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFB3bS0+UFdNQ19JTVI7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QV01DX0lzSW50ZXJydXB0TWFza2VkKA0KICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX1BXTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwUFdNKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTV9Jc1N0YXR1c1NldA0KLy8qIFxicmllZiBUZXN0IGlmIFBXTSBJbnRlcnJ1cHQgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19Jc1N0YXR1c1NldCgNCiAgICAgICAgQVQ5MVBTX1BXTUMgcFBXTSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9QV01DX0dldFN0YXR1cyhwUFdNKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTV9DZmdDaGFubmVsDQovLyogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DZmdDaGFubmVsKA0KICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbElkLCAvLyBcYXJnIFBXTSBjaGFubmVsIElEDQogICAgICAgIHVuc2lnbmVkIGludCBtb2RlLCAvLyBcYXJnICBQV00gbW9kZQ0KICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaW9kLCAvLyBcYXJnIFBXTSBwZXJpb2QNCiAgICAgICAgdW5zaWduZWQgaW50IGR1dHkpIC8vIFxhcmcgUFdNIGR1dHkgY3ljbGUNCnsNCglwUFdNLT5QV01DX0NIW2NoYW5uZWxJZF0uUFdNQ19DTVIgPSBtb2RlOw0KCXBQV00tPlBXTUNfQ0hbY2hhbm5lbElkXS5QV01DX0NEVFlSID0gZHV0eTsNCglwUFdNLT5QV01DX0NIW2NoYW5uZWxJZF0uUFdNQ19DUFJEUiA9IHBlcmlvZDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01fU3RhcnRDaGFubmVsDQovLyogXGJyaWVmIEVuYWJsZSBjaGFubmVsDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfU3RhcnRDaGFubmVsKA0KICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgQ2hhbm5lbHMgSURzIHRvIGJlIGVuYWJsZWQNCnsNCglwUFdNLT5QV01DX0VOQSA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX1N0b3BDaGFubmVsDQovLyogXGJyaWVmIERpc2FibGUgY2hhbm5lbA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX1N0b3BDaGFubmVsKA0KICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgQ2hhbm5lbHMgSURzIHRvIGJlIGVuYWJsZWQNCnsNCglwUFdNLT5QV01DX0RJUyA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX1VwZGF0ZUNoYW5uZWwNCi8vKiBcYnJpZWYgVXBkYXRlIFBlcmlvZCBvciBEdXR5IEN5Y2xlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfVXBkYXRlQ2hhbm5lbCgNCiAgICAgICAgQVQ5MVBTX1BXTUMgcFBXTSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxJZCwgLy8gXGFyZyBQV00gY2hhbm5lbCBJRA0KICAgICAgICB1bnNpZ25lZCBpbnQgdXBkYXRlKSAvLyBcYXJnICBDaGFubmVscyBJRHMgdG8gYmUgZW5hYmxlZA0Kew0KCXBQV00tPlBXTUNfQ0hbY2hhbm5lbElkXS5QV01DX0NVUERSID0gdXBkYXRlOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgVURQDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIFVEUCBJVA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRW5hYmxlSXQgKA0KCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBlbmFibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwVURQLT5VRFBfSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRGlzYWJsZUl0DQovLyogXGJyaWVmIERpc2FibGUgVURQIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9EaXNhYmxlSXQgKA0KCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBkaXNhYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyDQoJcFVEUC0+VURQX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVURQX1NldEFkZHJlc3MNCi8vKiBcYnJpZWYgU2V0IFVEUCBmdW5jdGlvbmFsIGFkZHJlc3MNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1NldEFkZHJlc3MgKA0KCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBhZGRyZXNzKSAgIC8vIFxhcmcgbmV3IFVEUCBhZGRyZXNzDQp7DQoJcFVEUC0+VURQX0ZBRERSID0gKEFUOTFDX1VEUF9GRU4gfCBhZGRyZXNzKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRW5hYmxlRXANCi8vKiBcYnJpZWYgRW5hYmxlIEVuZHBvaW50DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FbmFibGVFcCAoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQp7DQoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gfD0gQVQ5MUNfVURQX0VQRURTOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9EaXNhYmxlRXANCi8vKiBcYnJpZWYgRW5hYmxlIEVuZHBvaW50DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9EaXNhYmxlRXAgKA0KCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCkgICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcg0Kew0KCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdICY9IH5BVDkxQ19VRFBfRVBFRFM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVURQX1NldFN0YXRlDQovLyogXGJyaWVmIFNldCBVRFAgRGV2aWNlIHN0YXRlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9TZXRTdGF0ZSAoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIG5ldyBVRFAgYWRkcmVzcw0Kew0KCXBVRFAtPlVEUF9HTEJTVEFURSAgJj0gfihBVDkxQ19VRFBfRkFEREVOIHwgQVQ5MUNfVURQX0NPTkZHKTsNCglwVURQLT5VRFBfR0xCU1RBVEUgIHw9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVURQX0dldFN0YXRlDQovLyogXGJyaWVmIHJldHVybiBVRFAgRGV2aWNlIHN0YXRlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVURQX0dldFN0YXRlICggLy8gXHJldHVybiB0aGUgVURQIGRldmljZSBzdGF0ZQ0KCUFUOTFQU19VRFAgcFVEUCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQp7DQoJcmV0dXJuIChwVURQLT5VRFBfR0xCU1RBVEUgICYgKEFUOTFDX1VEUF9GQURERU4gfCBBVDkxQ19VRFBfQ09ORkcpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfUmVzZXRFcA0KLy8qIFxicmllZiBSZXNldCBVRFAgZW5kcG9pbnQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1Jlc2V0RXAgKCAvLyBccmV0dXJuIHRoZSBVRFAgZGV2aWNlIHN0YXRlDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIEVuZHBvaW50cyB0byBiZSByZXNldA0Kew0KCXBVRFAtPlVEUF9SU1RFUCA9IGZsYWc7DQoJcFVEUC0+VURQX1JTVEVQID0gMDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBTdGFsbA0KLy8qIFxicmllZiBFbmRwb2ludCB3aWxsIFNUQUxMIHJlcXVlc3RzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcFN0YWxsKA0KCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCkgICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcg0Kew0KCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdIHw9IEFUOTFDX1VEUF9GT1JDRVNUQUxMOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FcFdyaXRlDQovLyogXGJyaWVmIFdyaXRlIHZhbHVlIGluIHRoZSBEUFINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwV3JpdGUoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCwgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQoJdW5zaWduZWQgY2hhciB2YWx1ZSkgICAgIC8vIFxhcmcgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgRFBSDQp7DQoJcFVEUC0+VURQX0ZEUltlbmRwb2ludF0gPSB2YWx1ZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBSZWFkDQovLyogXGJyaWVmIFJldHVybiB2YWx1ZSBmcm9tIHRoZSBEUFINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfRXBSZWFkKA0KCUFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcg0Kew0KCXJldHVybiBwVURQLT5VRFBfRkRSW2VuZHBvaW50XTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBFbmRPZldyDQovLyogXGJyaWVmIE5vdGlmeSB0aGUgVURQIHRoYXQgdmFsdWVzIGluIERQUiBhcmUgcmVhZHkgdG8gYmUgc2VudA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBFbmRPZldyKA0KCUFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcg0Kew0KCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdIHw9IEFUOTFDX1VEUF9UWFBLVFJEWTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBDbGVhcg0KLy8qIFxicmllZiBDbGVhciBmbGFnIGluIHRoZSBlbmRwb2ludCBDU1IgcmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwQ2xlYXIoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCwgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgICAgIC8vIFxhcmcgZmxhZyB0byBiZSBjbGVhcmVkDQp7DQoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gJj0gfihmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBTZXQNCi8vKiBcYnJpZWYgU2V0IGZsYWcgaW4gdGhlIGVuZHBvaW50IENTUiByZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBTZXQoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCwgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgICAgIC8vIFxhcmcgZmxhZyB0byBiZSBjbGVhcmVkDQp7DQoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gfD0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBlbmRwb2ludCBDU1IgcmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfRXBTdGF0dXMoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCkgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQp7DQoJcmV0dXJuIHBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBVRFAgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gVURQIEludGVycnVwdCBNYXNrIFN0YXR1cw0KICAgICAgICBBVDkxUFNfVURQIHBVZHApIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFVkcC0+VURQX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBVRFAgSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9VRFBfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19VRFAgcFVkcCwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMocFVkcCkgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UQ19JbnRlcnJ1cHRFbmFibGUNCi8vKiBcYnJpZWYgRW5hYmxlIFRDIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQ19JbnRlcnJ1cHRFbmFibGUoDQogICAgICAgIEFUOTFQU19UQyBwVGMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRDIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIFRDIGludGVycnVwdCB0byBiZSBlbmFibGVkDQp7DQogICAgICAgIHBUYy0+VENfSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UQ19JbnRlcnJ1cHREaXNhYmxlDQovLyogXGJyaWVmIERpc2FibGUgVEMgSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDX0ludGVycnVwdERpc2FibGUoDQogICAgICAgIEFUOTFQU19UQyBwVGMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRDIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIFRDIGludGVycnVwdCB0byBiZSBkaXNhYmxlZA0Kew0KICAgICAgICBwVGMtPlRDX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVENfR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gVEMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVENfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBUQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1RDIHBUYykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRDIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBUYy0+VENfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RDX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgVEMgSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZCgNCiAgICAgICAgQVQ5MVBTX1RDIHBUYywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVEMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9UQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBUYykgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIENBTg0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCiNkZWZpbmUJU1RBTkRBUkRfRk9STUFUIDANCiNkZWZpbmUJRVhURU5ERURfRk9STUFUIDENCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9Jbml0TWFpbGJveFJlZ2lzdGVycygpDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0luaXRNYWlsYm94UmVnaXN0ZXJzKEFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsDQoJCQkJCQkJCWludCAgCQkJbW9kZV9yZWcsDQoJCQkJCQkJCWludCAJCQlhY2NlcHRhbmNlX21hc2tfcmVnLA0KCQkJCQkJCQlpbnQgIAkJCWlkX3JlZywNCgkJCQkJCQkJaW50ICAJCQlkYXRhX2xvd19yZWcsDQoJCQkJCQkJCWludCAgCQkJZGF0YV9oaWdoX3JlZywNCgkJCQkJCQkJaW50ICAJCQljb250cm9sX3JlZykNCnsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01DUiAJPSAweDA7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NTVIgCT0gbW9kZV9yZWc7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NQU0gCT0gYWNjZXB0YW5jZV9tYXNrX3JlZzsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01JRCAJPSBpZF9yZWc7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NREwgCT0gZGF0YV9sb3dfcmVnOyAJCQ0KCUNBTl9NYWlsYm94LT5DQU5fTUJfTURIIAk9IGRhdGFfaGlnaF9yZWc7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NQ1IgCT0gY29udHJvbF9yZWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfRW5hYmxlQ0FOKCkNCi8vKiBcYnJpZWYgDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0VuYWJsZUNBTigNCglBVDkxUFNfQ0FOIHBDQU4pICAgICAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCnsNCglwQ0FOLT5DQU5fTVIgfD0gQVQ5MUNfQ0FOX0NBTkVOOw0KDQoJLy8gV2FpdCBmb3IgV0FLRVVQIGZsYWcgcmFpc2luZyA8PT4gMTEtcmVjZXNzaXZlLWJpdCB3ZXJlIHNjYW5uZWQgYnkgdGhlIHRyYW5zY2VpdmVyDQoJd2hpbGUoIChwQ0FOLT5DQU5fU1IgJiBBVDkxQ19DQU5fV0FLRVVQKSAhPSBBVDkxQ19DQU5fV0FLRVVQICk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfRGlzYWJsZUNBTigpDQovLyogXGJyaWVmIA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9EaXNhYmxlQ0FOKA0KCUFUOTFQU19DQU4gcENBTikgICAgIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0Kew0KCXBDQU4tPkNBTl9NUiAmPSB+QVQ5MUNfQ0FOX0NBTkVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9FbmFibGVJdA0KLy8qIFxicmllZiBFbmFibGUgQ0FOIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fRW5hYmxlSXQgKA0KCUFUOTFQU19DQU4gcENBTiwgICAgIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBDQU4tPkNBTl9JRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBDQU4gaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9EaXNhYmxlSXQgKA0KCUFUOTFQU19DQU4gcENBTiwgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpIC8vIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXINCglwQ0FOLT5DQU5fSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0U3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBDQU4gSW50ZXJydXB0IFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRTdGF0dXMoIC8vIFxyZXR1cm4gQ0FOIEludGVycnVwdCBTdGF0dXMNCglBVDkxUFNfQ0FOIHBDQU4pIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0Kew0KCXJldHVybiBwQ0FOLT5DQU5fU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIENBTiBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBDQU4gSW50ZXJydXB0IE1hc2sgU3RhdHVzDQoJQVQ5MVBTX0NBTiBwQ0FOKSAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcENBTi0+Q0FOX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBDQU4gSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19DQU4gcENBTiwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9DQU5fR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwQ0FOKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9Jc1N0YXR1c1NldA0KLy8qIFxicmllZiBUZXN0IGlmIENBTiBJbnRlcnJ1cHQgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0lzU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfQ0FOIHBDQU4sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfQ0FOX0dldFN0YXR1cyhwQ0FOKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdNb2RlUmVnDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQ0FOIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01vZGVSZWcgKA0KCUFUOTFQU19DQU4gcENBTiwgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyIA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXINCglwQ0FOLT5DQU5fTVIgPSBtb2RlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNb2RlUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQ0FOIGNvbnRyb2xsZXIgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TW9kZVJlZyAoDQoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcENBTi0+Q0FOX01SOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fQ2ZnQmF1ZHJhdGVSZWcNCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBCYXVkcmF0ZSBvZiB0aGUgQ0FOIGNvbnRyb2xsZXIgZm9yIHRoZSBuZXR3b3JrDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdCYXVkcmF0ZVJlZyAoDQoJQVQ5MVBTX0NBTiBwQ0FOLCAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgYmF1ZHJhdGVfY2ZnKQ0Kew0KCS8vKiBXcml0ZSB0byB0aGUgQlIgcmVnaXN0ZXINCglwQ0FOLT5DQU5fQlIgPSBiYXVkcmF0ZV9jZmc7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRCYXVkcmF0ZQ0KLy8qIFxicmllZiBSZXR1cm4gdGhlIEJhdWRyYXRlIG9mIHRoZSBDQU4gY29udHJvbGxlciBmb3IgdGhlIG5ldHdvcmsgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0QmF1ZHJhdGUgKA0KCUFUOTFQU19DQU4gcENBTiAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBDQU4tPkNBTl9CUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEludGVybmFsQ291bnRlcg0KLy8qIFxicmllZiBSZXR1cm4gQ0FOIFRpbWVyIFJlZ3NpdGVyIFZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEludGVybmFsQ291bnRlciAoDQoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcENBTi0+Q0FOX1RJTTsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldFRpbWVzdGFtcA0KLy8qIFxicmllZiBSZXR1cm4gQ0FOIFRpbWVzdGFtcCBSZWdpc3RlciBWYWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRUaW1lc3RhbXAgKA0KCUFUOTFQU19DQU4gcENBTiAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBDQU4tPkNBTl9USU1FU1RQOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0RXJyb3JDb3VudGVyDQovLyogXGJyaWVmIFJldHVybiBDQU4gRXJyb3IgQ291bnRlciBSZWdpc3RlciBWYWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRFcnJvckNvdW50ZXIgKA0KCUFUOTFQU19DQU4gcENBTiAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBDQU4tPkNBTl9FQ1I7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9Jbml0VHJhbnNmZXJSZXF1ZXN0DQovLyogXGJyaWVmIFJlcXVlc3QgZm9yIGEgdHJhbnNmZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgbWFpbGJveGVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9Jbml0VHJhbnNmZXJSZXF1ZXN0ICgNCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KICAgIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9jbWQpDQp7DQoJcENBTi0+Q0FOX1RDUiA9IHRyYW5zZmVyX2NtZDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0luaXRBYm9ydFJlcXVlc3QNCi8vKiBcYnJpZWYgQWJvcnQgdGhlIGNvcnJlc3BvbmRpbmcgbWFpbGJveGVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9Jbml0QWJvcnRSZXF1ZXN0ICgNCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KICAgIHVuc2lnbmVkIGludCBhYm9ydF9jbWQpDQp7DQoJcENBTi0+Q0FOX0FDUiA9IGFib3J0X2NtZDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VNb2RlUmVnDQovLyogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgTW9kZSBSZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZU1vZGVSZWcgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0KICAgIHVuc2lnbmVkIGludCBtb2RlKQ0Kew0KCUNBTl9NYWlsYm94LT5DQU5fTUJfTU1SID0gbW9kZTsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VNb2RlUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBNb2RlIFJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VNb2RlUmVnICgNCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94KSAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gNCnsNCglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NTVI7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlSURSZWcNCi8vKiBcYnJpZWYgUHJvZ3JhbSB0aGUgTWVzc2FnZSBJRCBSZWdpc3Rlcg0KLy8qIFxicmllZiBWZXJzaW9uID09IDAgZm9yIFN0YW5kYXJkIG1lc3NzYWdlLCBWZXJzaW9uID09IDEgZm9yIEV4dGVuZGVkICANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VJRFJlZyAoDQoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCwgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94DQogICAgdW5zaWduZWQgaW50IGlkLA0KICAgIHVuc2lnbmVkIGNoYXIgdmVyc2lvbikNCnsNCglpZih2ZXJzaW9uPT0wKQkvLyBJRHZBIFN0YW5kYXJkIEZvcm1hdA0KCQlDQU5fTWFpbGJveC0+Q0FOX01CX01JRCA9IGlkPDwxODsNCgllbHNlCS8vIElEdkIgRXh0ZW5kZWQgRm9ybWF0DQoJCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEID0gaWQgfCAoMTw8MjkpOwkvLyBzZXQgTUlERSBiaXQNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZUlEUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBJRCBSZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlSURSZWcgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01JRDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnDQovLyogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgQWNjZXB0YW5jZSBNYXNrIFJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlQWNjZXB0YW5jZU1hc2tSZWcgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0KICAgIHVuc2lnbmVkIGludCBtYXNrKQ0Kew0KCUNBTl9NYWlsYm94LT5DQU5fTUJfTUFNID0gbWFzazsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBBY2NlcHRhbmNlIE1hc2sgUmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnICgNCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94KSAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gNCnsNCglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NQU07DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEZhbWlseUlEDQovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBJRCBSZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRGYW1pbHlJRCAoDQoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCkgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94DQp7DQoJcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTUZJRDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VDdHJsDQovLyogXGJyaWVmIFJlcXVlc3QgYW5kIGNvbmZpZyBmb3IgYSB0cmFuc2ZlciBvbiB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlQ3RybFJlZyAoDQoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCwgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94DQogICAgdW5zaWduZWQgaW50IG1lc3NhZ2VfY3RybF9jbWQpDQp7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NQ1IgPSBtZXNzYWdlX2N0cmxfY21kOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZVN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gQ0FOIE1haWxib3ggU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VTdGF0dXMgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01TUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93DQovLyogXGJyaWVmIFByb2dyYW0gZGF0YSBsb3cgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93ICgNCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LCAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gNCiAgICB1bnNpZ25lZCBpbnQgZGF0YSkNCnsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01ETCA9IGRhdGE7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUxvdw0KLy8qIFxicmllZiBSZXR1cm4gZGF0YSBsb3cgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFMb3cgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01ETDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhSGlnaA0KLy8qIFxicmllZiBQcm9ncmFtIGRhdGEgaGlnaCB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZURhdGFIaWdoICgNCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LCAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gNCiAgICB1bnNpZ25lZCBpbnQgZGF0YSkNCnsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01ESCA9IGRhdGE7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUhpZ2gNCi8vKiBcYnJpZWYgUmV0dXJuIGRhdGEgaGlnaCB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUhpZ2ggKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01ESDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX09wZW4NCi8vKiBcYnJpZWYgT3BlbiBhIENBTiBQb3J0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX09wZW4gKA0KICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVsbCkgIC8vIFxhcmcNCnsNCiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8NCiAgICAgICAgcmV0dXJuICggMCApOw0KfQ0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIEFEQw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0VuYWJsZUl0DQovLyogXGJyaWVmIEVuYWJsZSBBREMgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19FbmFibGVJdCAoDQoJQVQ5MVBTX0FEQyBwQURDLCAgICAgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyDQoJcEFEQy0+QURDX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0Rpc2FibGVJdA0KLy8qIFxicmllZiBEaXNhYmxlIEFEQyBpbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0Rpc2FibGVJdCAoDQoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3Rlcg0KCXBBREMtPkFEQ19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIEFEQyBJbnRlcnJ1cHQgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldFN0YXR1cyggLy8gXHJldHVybiBBREMgSW50ZXJydXB0IFN0YXR1cw0KCUFUOTFQU19BREMgcEFEQykgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19TUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gQURDIEludGVycnVwdCBNYXNrIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIEFEQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCglBVDkxUFNfQURDIHBBREMpIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwQURDLT5BRENfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIEFEQyBJbnRlcnJ1cHQgaXMgTWFza2VkIA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZCgNCiAgICAgICAgQVQ5MVBTX0FEQyBwQURDLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX0FEQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBBREMpICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0lzU3RhdHVzU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgQURDIFN0YXR1cyBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfSXNTdGF0dXNTZXQoDQogICAgICAgIEFUOTFQU19BREMgcEFEQywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9BRENfR2V0U3RhdHVzKHBBREMpICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0NmZ01vZGVSZWcNCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBREMgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnTW9kZVJlZyAoDQoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIgDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3Rlcg0KCXBBREMtPkFEQ19NUiA9IG1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldE1vZGVSZWcNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBREMgY29udHJvbGxlciB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRNb2RlUmVnICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfTVI7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19DZmdUaW1pbmdzDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgZGlmZmVyZW50IG5lY2Vzc2FyeSB0aW1pbmdzIG9mIHRoZSBBREMgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnVGltaW5ncyAoDQoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgbWNrX2Nsb2NrLCAvLyBpbiBNSHogDQoJdW5zaWduZWQgaW50IGFkY19jbG9jaywgLy8gaW4gTUh6IA0KCXVuc2lnbmVkIGludCBzdGFydHVwX3RpbWUsIC8vIGluIHVzIA0KCXVuc2lnbmVkIGludCBzYW1wbGVfYW5kX2hvbGRfdGltZSkJLy8gaW4gbnMgIA0Kew0KCXVuc2lnbmVkIGludCBwcmVzY2FsLHN0YXJ0dXAsc2h0aW07DQoJDQoJcHJlc2NhbCA9IG1ja19jbG9jay8oMiphZGNfY2xvY2spIC0gMTsNCglzdGFydHVwID0gYWRjX2Nsb2NrKnN0YXJ0dXBfdGltZS84IC0gMTsNCglzaHRpbSA9IGFkY19jbG9jaypzYW1wbGVfYW5kX2hvbGRfdGltZS8xMDAwIC0gMTsNCgkNCgkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyDQoJcEFEQy0+QURDX01SID0gKCAocHJlc2NhbDw8OCkgJiBBVDkxQ19BRENfUFJFU0NBTCkgfCAoIChzdGFydHVwPDwxNikgJiBBVDkxQ19BRENfU1RBUlRVUCkgfCAoIChzaHRpbTw8MjQpICYgQVQ5MUNfQURDX1NIVElNKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfRW5hYmxlQ2hhbm5lbA0KLy8qIFxicmllZiBSZXR1cm4gQURDIFRpbWVyIFJlZ2lzdGVyIFZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19FbmFibGVDaGFubmVsICgNCglBVDkxUFNfQURDIHBBREMsIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBjaGFubmVsKSAgICAgICAgLy8gbW9kZSByZWdpc3RlciANCnsNCgkvLyogV3JpdGUgdG8gdGhlIENIRVIgcmVnaXN0ZXINCglwQURDLT5BRENfQ0hFUiA9IGNoYW5uZWw7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0Rpc2FibGVDaGFubmVsDQovLyogXGJyaWVmIFJldHVybiBBREMgVGltZXIgUmVnaXN0ZXIgVmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0Rpc2FibGVDaGFubmVsICgNCglBVDkxUFNfQURDIHBBREMsIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBjaGFubmVsKSAgICAgICAgLy8gbW9kZSByZWdpc3RlciANCnsNCgkvLyogV3JpdGUgdG8gdGhlIENIRFIgcmVnaXN0ZXINCglwQURDLT5BRENfQ0hEUiA9IGNoYW5uZWw7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENoYW5uZWxTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDaGFubmVsU3RhdHVzICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfQ0hTUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX1N0YXJ0Q29udmVyc2lvbg0KLy8qIFxicmllZiBTb2Z0d2FyZSByZXF1ZXN0IGZvciBhIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24gDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24gKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcEFEQy0+QURDX0NSID0gQVQ5MUNfQURDX1NUQVJUOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfU29mdFJlc2V0DQovLyogXGJyaWVmIFNvZnR3YXJlIHJlc2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19Tb2Z0UmVzZXQgKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcEFEQy0+QURDX0NSID0gQVQ5MUNfQURDX1NXUlNUOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0TGFzdENvbnZlcnRlZERhdGENCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBMYXN0IENvbnZlcnRlZCBEYXRhDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldExhc3RDb252ZXJ0ZWREYXRhICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfTENEUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDANCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDAgQ29udmVydGVkIERhdGENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMCAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFEQy0+QURDX0NEUjA7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gxDQovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAxIENvbnZlcnRlZCBEYXRhDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDEgKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19DRFIxOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMg0KLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMiBDb252ZXJ0ZWQgRGF0YQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gyICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfQ0RSMjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDMNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDMgQ29udmVydGVkIERhdGENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMyAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFEQy0+QURDX0NEUjM7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g0DQovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA0IENvbnZlcnRlZCBEYXRhDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDQgKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19DRFI0OwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINQ0KLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNSBDb252ZXJ0ZWQgRGF0YQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g1ICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfQ0RSNTsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDYNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDYgQ29udmVydGVkIERhdGENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINiAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFEQy0+QURDX0NEUjY7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g3DQovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA3IENvbnZlcnRlZCBEYXRhDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDcgKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19DRFI3OwkNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIEFFUw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0VuYWJsZUl0DQovLyogXGJyaWVmIEVuYWJsZSBBRVMgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19FbmFibGVJdCAoDQoJQVQ5MVBTX0FFUyBwQUVTLCAgICAgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyDQoJcEFFUy0+QUVTX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0Rpc2FibGVJdA0KLy8qIFxicmllZiBEaXNhYmxlIEFFUyBpbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0Rpc2FibGVJdCAoDQoJQVQ5MVBTX0FFUyBwQUVTLCAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3Rlcg0KCXBBRVMtPkFFU19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIEFFUyBJbnRlcnJ1cHQgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0dldFN0YXR1cyggLy8gXHJldHVybiBBRVMgSW50ZXJydXB0IFN0YXR1cw0KCUFUOTFQU19BRVMgcEFFUykgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBBRVMtPkFFU19JU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIEFFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBBRVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQoJQVQ5MVBTX0FFUyBwQUVTKSAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcEFFUy0+QUVTX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBBRVMgSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19BRVMgcEFFUywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwQUVTKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19Jc1N0YXR1c1NldA0KLy8qIFxicmllZiBUZXN0IGlmIEFFUyBTdGF0dXMgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0lzU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfQUVTIHBBRVMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfQUVTX0dldFN0YXR1cyhwQUVTKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19DZmdNb2RlUmVnDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQUVTIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0NmZ01vZGVSZWcgKA0KCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyIA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXINCglwQUVTLT5BRVNfTVIgPSBtb2RlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRNb2RlUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQUVTIGNvbnRyb2xsZXIgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0TW9kZVJlZyAoDQoJQVQ5MVBTX0FFUyBwQUVTIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFFUy0+QUVTX01SOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU3RhcnRQcm9jZXNzaW5nDQovLyogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU3RhcnRQcm9jZXNzaW5nICgNCglBVDkxUFNfQUVTIHBBRVMgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJKQ0Kew0KCXBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19TVEFSVDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUVTX1NvZnRSZXNldA0KLy8qIFxicmllZiBSZXNldCBBRVMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX1NvZnRSZXNldCAoDQoJQVQ5MVBTX0FFUyBwQUVTIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCSkNCnsNCglwQUVTLT5BRVNfQ1IgPSBBVDkxQ19BRVNfU1dSU1Q7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19Mb2FkTmV3U2VlZA0KLy8qIFxicmllZiBMb2FkIE5ldyBTZWVkIGluIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfTG9hZE5ld1NlZWQgKA0KCUFUOTFQU19BRVMgcEFFUyAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXINCgkpDQp7DQoJcEFFUy0+QUVTX0NSID0gQVQ5MUNfQUVTX0xPQURTRUVEOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU2V0Q3J5cHRvS2V5DQovLyogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRDcnlwdG9LZXkgKA0KCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQga2V5d29yZA0KCSkNCnsNCglwQUVTLT5BRVNfS0VZV3hSW2luZGV4XSA9IGtleXdvcmQ7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19JbnB1dERhdGENCi8vKiBcYnJpZWYgU2V0IElucHV0IERhdGEgeA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfSW5wdXREYXRhICgNCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgaW5kZXgsDQoJdW5zaWduZWQgaW50IGluZGF0YQ0KCSkNCnsNCglwQUVTLT5BRVNfSURBVEF4UltpbmRleF0gPSBpbmRhdGE7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRPdXRwdXREYXRhDQovLyogXGJyaWVmIEdldCBPdXRwdXQgRGF0YSB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0dldE91dHB1dERhdGEgKA0KCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleA0KCSkNCnsNCglyZXR1cm4gcEFFUy0+QUVTX09EQVRBeFJbaW5kZXhdOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3INCi8vKiBcYnJpZWYgU2V0IEluaXRpYWxpemF0aW9uIFZlY3RvciAob3IgQ291bnRlcikgeA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3IgKA0KCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQgaW5pdHZlY3Rvcg0KCSkNCnsNCglwQUVTLT5BRVNfSVZ4UltpbmRleF0gPSBpbml0dmVjdG9yOwkNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRERVMNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIFRERVMgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfRW5hYmxlSXQgKA0KCUFUOTFQU19UREVTIHBUREVTLCAgICAgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBUREVTLT5UREVTX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBUREVTIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0Rpc2FibGVJdCAoDQoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3Rlcg0KCXBUREVTLT5UREVTX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19HZXRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFRERVMgSW50ZXJydXB0IFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RERVNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIFRERVMgSW50ZXJydXB0IFN0YXR1cw0KCUFUOTFQU19UREVTIHBUREVTKSAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBUREVTLT5UREVTX0lTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFRERVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFRERVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQoJQVQ5MVBTX1RERVMgcFRERVMpIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcFRERVMtPlRERVNfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBUREVTIEludGVycnVwdCBpcyBNYXNrZWQgDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19Jc0ludGVycnVwdE1hc2tlZCgNCiAgICAgICAgQVQ5MVBTX1RERVMgcFRERVMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX1RERVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwVERFUykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0lzU3RhdHVzU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgVERFUyBTdGF0dXMgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19Jc1N0YXR1c1NldCgNCiAgICAgICAgQVQ5MVBTX1RERVMgcFRERVMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX1RERVNfR2V0U3RhdHVzKHBUREVTKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfQ2ZnTW9kZVJlZw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIFRERVMgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0NmZ01vZGVSZWcgKA0KCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyIA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXINCglwVERFUy0+VERFU19NUiA9IG1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19HZXRNb2RlUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgVERFUyBjb250cm9sbGVyIHZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRNb2RlUmVnICgNCglBVDkxUFNfVERFUyBwVERFUyAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwVERFUy0+VERFU19NUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19TdGFydFByb2Nlc3NpbmcNCi8vKiBcYnJpZWYgU3RhcnQgRW5jcnlwdGlvbiBvciBEZWNyeXB0aW9uDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU3RhcnRQcm9jZXNzaW5nICgNCglBVDkxUFNfVERFUyBwVERFUyAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJKQ0Kew0KCXBUREVTLT5UREVTX0NSID0gQVQ5MUNfVERFU19TVEFSVDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19Tb2Z0UmVzZXQNCi8vKiBcYnJpZWYgUmVzZXQgVERFUw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NvZnRSZXNldCAoDQoJQVQ5MVBTX1RERVMgcFRERVMgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCSkNCnsNCglwVERFUy0+VERFU19DUiA9IEFUOTFDX1RERVNfU1dSU1Q7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MQ0KLy8qIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMSBXb3JkIHgNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkxICgNCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgaW5kZXgsDQoJdW5zaWduZWQgaW50IGtleXdvcmQNCgkpDQp7DQoJcFRERVMtPlRERVNfS0VZMVd4UltpbmRleF0gPSBrZXl3b3JkOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1NldENyeXB0b0tleTINCi8vKiBcYnJpZWYgU2V0IENyeXB0b2dyYXBoaWMgS2V5IDIgV29yZCB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MiAoDQoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGluZGV4LA0KCXVuc2lnbmVkIGludCBrZXl3b3JkDQoJKQ0Kew0KCXBUREVTLT5UREVTX0tFWTJXeFJbaW5kZXhdID0ga2V5d29yZDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkzDQovLyogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSAzIFdvcmQgeA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldENyeXB0b0tleTMgKA0KCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQga2V5d29yZA0KCSkNCnsNCglwVERFUy0+VERFU19LRVkzV3hSW2luZGV4XSA9IGtleXdvcmQ7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfSW5wdXREYXRhDQovLyogXGJyaWVmIFNldCBJbnB1dCBEYXRhIHgNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19JbnB1dERhdGEgKA0KCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQgaW5kYXRhDQoJKQ0Kew0KCXBUREVTLT5UREVTX0lEQVRBeFJbaW5kZXhdID0gaW5kYXRhOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0dldE91dHB1dERhdGENCi8vKiBcYnJpZWYgR2V0IE91dHB1dCBEYXRhIHgNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldE91dHB1dERhdGEgKA0KCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleA0KCSkNCnsNCglyZXR1cm4gcFRERVMtPlRERVNfT0RBVEF4UltpbmRleF07CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3INCi8vKiBcYnJpZWYgU2V0IEluaXRpYWxpemF0aW9uIFZlY3RvciB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3IgKA0KCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQgaW5pdHZlY3Rvcg0KCSkNCnsNCglwVERFUy0+VERFU19JVnhSW2luZGV4XSA9IGluaXR2ZWN0b3I7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0RCR1VfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIERCR1UNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0RCR1VfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgREJHVSBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0RCR1VfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyN19EUlhEICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyOF9EVFhEICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkwKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQTUMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBNQyBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjMwX1BDSzIgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI5X1BDSzEgICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIwX1BDSzAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjBfUENLMCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjJfUENLMiAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjFfUENLMSAgICApKTsgLy8gUGVyaXBoZXJhbCBCDQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCTAsIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEzMF9QQ0syICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExM19QQ0sxICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyN19QQ0szICAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9WUkVHX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBWUkVHDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1ZSRUdfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9SU1RDX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBSU1RDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1JTVENfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNTQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TU0MpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1NDIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjVfUksgICAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjJfVEsgICAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjFfVEYgICAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjRfUkQgICAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjZfUkYgICAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjNfVEQgICAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJMCk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1dEVENfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFdEVEMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUQ19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTMV9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVVMxDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMV9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1VTMSkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTMV9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBVUzEgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VUzFfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkwLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjZfUkkxICAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjRfRFNSMSAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjNfRENEMSAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjVfRFRSMSAgICApKTsgLy8gUGVyaXBoZXJhbCBCDQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTdfU0NLMSAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBOF9SVFMxICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE2X1RYRDEgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTVfUlhEMSAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBOV9DVFMxICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkwKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVMwX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVUzANCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVMwX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVVMwKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVMwX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFVTMCBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMF9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTBfUlhEMCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBNF9DVFMwICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEzX1JUUzAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTJfU0NLMCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMV9UWEQwICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkwKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJMV9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgU1BJMQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkxX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1BJMSkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSTFfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1BJMSBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSTFfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkwLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTZfTlBDUzEzICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTBfTlBDUzExICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTFfTlBDUzEyICApKTsgLy8gUGVyaXBoZXJhbCBCDQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCTAsIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE0X05QQ1MxMyAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI5X05QQ1MxMyAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIxX05QQ1MxMCAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIyX1NQQ0sxICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI1X05QQ1MxMSAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTJfTlBDUzExICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjRfTUlTTzEgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBM19OUENTMTIgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyNl9OUENTMTIgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyM19NT1NJMSAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUEkwX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBTUEkwDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSTBfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TUEkwKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJMF9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBTUEkwIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJMF9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCTAsIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxM19OUENTMDEgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxN19OUENTMDMgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxNF9OUENTMDIgICkpOyAvLyBQZXJpcGhlcmFsIEINCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTZfTUlTTzAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTNfTlBDUzAxICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTVfTlBDUzAzICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTdfTU9TSTAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMThfU1BDSzAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTRfTlBDUzAyICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTJfTlBDUzAwICApLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBN19OUENTMDEgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE5X05QQ1MwMyAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQThfTlBDUzAyICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElUQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUElUQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRDX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBBSUMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfRklRKSB8DQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0lSUTApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfSVJRMSkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FJQ19DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBBSUMgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEzMF9JUlEwICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyOV9GSVEgICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExNF9JUlExICAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEFFUw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9BRVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UV0lfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRXSQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UV0lfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UV0kpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UV0lfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVFdJIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTFfVFdDSyAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTBfVFdEICAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJMCk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQURDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0FEQykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBBREMgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkwLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMThfQURUUkcgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDNfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgUFdNQ19DSDMgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIM19DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIyX1BXTTMgICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjMwX1BXTTMgICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTUNfQ0gyX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gyIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DSDJfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMV9QV00yICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyOV9QV00yICAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01DX0NIMV9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMSBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gxX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjBfUFdNMSAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjhfUFdNMSAgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDBfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgUFdNQ19DSDAgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIMF9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE5X1BXTTAgICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI3X1BXTTAgICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1JUVENfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFJUVEMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUQ19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVURQDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1VEUCkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRERVMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RERVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9FTUFDX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBFTUFDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0VNQUNfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9FTUFDKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfRU1BQ19DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBFTUFDIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfRU1BQ19DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjJfRVRYMCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTJfRVRYRVIgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTZfRUNPTCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTFfRVRYMyAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCNl9FUlgxICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxNV9FUlhEViAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxM19FUlgyICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIzX0VUWDEgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjhfRU1EQyAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCNV9FUlgwICAgICkgfA0KCQkvLygodW5zaWduZWQgaW50KSBBVDkxQ19QQjE4X0VGMTAwICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE0X0VSWDMgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjRfRUNSU19FQ1JTRFYpIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMV9FVFhFTiAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxMF9FVFgyICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIwX0VUWENLX0VSRUZDSykgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI5X0VNRElPICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjdfRVJYRVIgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTdfRVJYQ0sgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJMCk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RDMF9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVEMwDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMF9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RDMCkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RDMF9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBUQzAgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzBfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyM19USU9BMCAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyNF9USU9CMCAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxMl9UQ0xLMCAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UQzFfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRDMQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzFfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UQzEpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UQzFfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVEMxIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMxX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjVfVElPQTEgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjZfVElPQjEgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTlfVENMSzEgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUQzINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMyX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVEMyKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRDMiBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMl9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI4X1RJT0IyICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI3X1RJT0EyICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCTApOyAvLyBQZXJpcGhlcmFsIEINCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJMCwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE1X1RDTEsyICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX01DX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBNQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9NQ19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT0FfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFBJT0ENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPQV9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1BJT0EpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9CX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQSU9CDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT0JfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9QSU9CKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBDQU4NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfQ0FOKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIENBTiBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIwX0NBTlRYICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE5X0NBTlJYICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCTApOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01DX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQV01DDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9QV01DKSk7DQp9DQoNCiNlbmRpZiAvLyBsaWJfQVQ5MVNBTTdYMjU2X0gNCg==