LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MgSW50ZXJuYXRpb25hbCBOLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMjAxMy0yMDE3IEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7IHlvdSBtYXkKICogbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIHd3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsIFdJVEhPVVQKICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBQcm9qZWN0OiAgICAgIENNU0lTLVJUT1MgQVBJCiAqIFRpdGxlOiAgICAgICAgY21zaXNfb3MuaCBoZWFkZXIgZmlsZQogKgogKiBWZXJzaW9uIDAuMDIKICogICAgSW5pdGlhbCBQcm9wb3NhbCBQaGFzZQogKiBWZXJzaW9uIDAuMDMKICogICAgb3NLZXJuZWxTdGFydCBhZGRlZCwgb3B0aW9uYWwgZmVhdHVyZTogbWFpbiBzdGFydGVkIGFzIHRocmVhZAogKiAgICBvc1NlbWFwaG9yZXMgaGF2ZSBzdGFuZGFyZCBiZWhhdmlvcgogKiAgICBvc1RpbWVyQ3JlYXRlIGRvZXMgbm90IHN0YXJ0IHRoZSB0aW1lciwgYWRkZWQgb3NUaW1lclN0YXJ0CiAqICAgIG9zVGhyZWFkUGFzcyBpcyByZW5hbWVkIHRvIG9zVGhyZWFkWWllbGQKICogVmVyc2lvbiAxLjAxCiAqICAgIFN1cHBvcnQgZm9yIEMrKyBpbnRlcmZhY2UKICogICAgIC0gY29uc3QgYXR0cmlidXRlIHJlbW92ZWQgZnJvbSB0aGUgb3NYeHh4RGVmX3QgdHlwZWRlZnMKICogICAgIC0gY29uc3QgYXR0cmlidXRlIGFkZGVkIHRvIHRoZSBvc1h4eHhEZWYgbWFjcm9zCiAqICAgIEFkZGVkOiBvc1RpbWVyRGVsZXRlLCBvc011dGV4RGVsZXRlLCBvc1NlbWFwaG9yZURlbGV0ZQogKiAgICBBZGRlZDogb3NLZXJuZWxJbml0aWFsaXplCiAqIFZlcnNpb24gMS4wMgogKiAgICBDb250cm9sIGZ1bmN0aW9ucyBmb3Igc2hvcnQgdGltZW91dHMgaW4gbWljcm9zZWNvbmQgcmVzb2x1dGlvbjoKICogICAgQWRkZWQ6IG9zS2VybmVsU3lzVGljaywgb3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5LCBvc0tlcm5lbFN5c1RpY2tNaWNyb1NlYwogKiAgICBSZW1vdmVkOiBvc1NpZ25hbEdldAogKiBWZXJzaW9uIDIuMC4wCiAqICAgIE9TIG9iamVjdHMgY3JlYXRpb24gd2l0aG91dCBtYWNyb3MgKGR5bmFtaWMgY3JlYXRpb24gYW5kIHJlc291cmNlIGFsbG9jYXRpb24pOgogKiAgICAgLSBhZGRlZDogb3NYeHh4TmV3IGZ1bmN0aW9ucyB3aGljaCByZXBsYWNlIG9zWHh4eENyZWF0ZQogKiAgICAgLSBhZGRlZDogb3NYeHh4QXR0cl90IHN0cnVjdHVyZXMKICogICAgIC0gZGVwcmVjYXRlZDogb3NYeHh4Q3JlYXRlIGZ1bmN0aW9ucywgb3NYeHh4RGVmX3Qgc3RydWN0dXJlcwogKiAgICAgLSBkZXByZWNhdGVkOiBvc1h4eHhEZWYgYW5kIG9zWHh4eCBtYWNyb3MKICogICAgb3NTdGF0dXMgY29kZXMgc2ltcGxpZmllZCBhbmQgcmVuYW1lZCB0byBvc1N0YXR1c190CiAqICAgIG9zRXZlbnQgcmV0dXJuIHN0cnVjdHVyZSBkZXByZWNhdGVkCiAqICAgIEtlcm5lbDoKICogICAgIC0gYWRkZWQ6IG9zS2VybmVsSW5mb190IGFuZCBvc0tlcm5lbEdldEluZm8KICogICAgIC0gYWRkZWQ6IG9zS2VybmVsU3RhdGVfdCBhbmQgb3NLZXJuZWxHZXRTdGF0ZSAocmVwbGFjZXMgb3NLZXJuZWxSdW5uaW5nKQogKiAgICAgLSBhZGRlZDogb3NLZXJuZWxMb2NrLCBvc0tlcm5lbFVubG9jawogKiAgICAgLSBhZGRlZDogb3NLZXJuZWxTdXNwZW5kLCBvc0tlcm5lbFJlc3VtZQogKiAgICAgLSBhZGRlZDogb3NLZXJuZWxHZXRUaWNrQ291bnQsIG9zS2VybmVsR2V0VGlja0ZyZXEKICogICAgIC0gcmVuYW1lZCBvc0tlcm5lbFN5c1RpY2sgdG8gb3NLZXJuZWxHZXRTeXNUaW1lckNvdW50CiAqICAgICAtIHJlcGxhY2VkIG9zS2VybmVsU3lzVGlja0ZyZXF1ZW5jeSB3aXRoIG9zS2VybmVsR2V0U3lzVGltZXJGcmVxCiAqICAgICAtIGRlcHJlY2F0ZWQgb3NLZXJuZWxTeXNUaWNrTWljcm9TZWMKICogICAgVGhyZWFkOgogKiAgICAgLSBleHRlbmRlZCBudW1iZXIgb2YgdGhyZWFkIHByaW9yaXRpZXMKICogICAgIC0gcmVuYW1lZCBvc1ByaW9yaXJ5IHRvIG9zUHJpb3JpcnlfdAogKiAgICAgLSByZXBsYWNlZCBvc1RocmVhZENyZWF0ZSB3aXRoIG9zVGhyZWFkTmV3CiAqICAgICAtIGFkZGVkOiBvc1RocmVhZEdldE5hbWUKICogICAgIC0gYWRkZWQ6IG9zVGhyZWFkU3RhdGVfdCBhbmQgb3NUaHJlYWRHZXRTdGF0ZQogKiAgICAgLSBhZGRlZDogb3NUaHJlYWRHZXRTdGFja1NpemUsIG9zVGhyZWFkR2V0U3RhY2tTcGFjZQogKiAgICAgLSBhZGRlZDogb3NUaHJlYWRTdXNwZW5kLCBvc1RocmVhZFJlc3VtZQogKiAgICAgLSBhZGRlZDogb3NUaHJlYWRKb2luLCBvc1RocmVhZERldGFjaCwgb3NUaHJlYWRFeGl0CiAqICAgICAtIGFkZGVkOiBvc1RocmVhZEdldENvdW50LCBvc1RocmVhZEVudW1lcmF0ZQogKiAgICAgLSBhZGRlZDogVGhyZWFkIEZsYWdzIChtb3ZlZCBmcm9tIFNpZ25hbHMpCiAqICAgIFNpZ25hbHM6CiAqICAgICAtIHJlbmFtZWQgb3NTaWduYWxzIHRvIG9zVGhyZWFkRmxhZ3MgKG1vdmVkIHRvIFRocmVhZCBGbGFncykKICogICAgIC0gY2hhbmdlZCByZXR1cm4gdmFsdWUgb2YgU2V0L0NsZWFyL1dhaXQgZnVuY3Rpb25zCiAqICAgICAtIENsZWFyIGZ1bmN0aW9uIGxpbWl0ZWQgdG8gY3VycmVudCBydW5uaW5nIHRocmVhZAogKiAgICAgLSBleHRlbmRlZCBXYWl0IGZ1bmN0aW9uIChvcHRpb25zKQogKiAgICAgLSBhZGRlZDogb3NUaHJlYWRGbGFnc0dldAogKiAgICBFdmVudCBGbGFnczoKICogICAgIC0gYWRkZWQgbmV3IGluZGVwZW5kZW50IG9iamVjdCBmb3IgaGFuZGxpbmcgRXZlbnQgRmxhZ3MKICogICAgRGVsYXkgYW5kIFdhaXQgZnVuY3Rpb25zOgogKiAgICAgLSBhZGRlZDogb3NEZWxheVVudGlsCiAqICAgICAtIGRlcHJlY2F0ZWQ6IG9zV2FpdAogKiAgICBUaW1lcjoKICogICAgIC0gcmVwbGFjZWQgb3NUaW1lckNyZWF0ZSB3aXRoIG9zVGltZXJOZXcKICogICAgIC0gYWRkZWQ6IG9zVGltZXJHZXROYW1lLCBvc1RpbWVySXNSdW5uaW5nCiAqICAgIE11dGV4OgogKiAgICAgLSBleHRlbmRlZDogYXR0cmlidXRlcyAoUmVjdXJzaXZlLCBQcmlvcml0eSBJbmhlcml0LCBSb2J1c3QpCiAqICAgICAtIHJlcGxhY2VkIG9zTXV0ZXhDcmVhdGUgd2l0aCBvc011dGV4TmV3CiAqICAgICAtIHJlbmFtZWQgb3NNdXRleFdhaXQgdG8gb3NNdXRleEFjcXVpcmUKICogICAgIC0gYWRkZWQ6IG9zTXV0ZXhHZXROYW1lLCBvc011dGV4R2V0T3duZXIKICogICAgU2VtYXBob3JlOgogKiAgICAgLSBleHRlbmRlZDogbWF4aW11bSBhbmQgaW5pdGlhbCB0b2tlbiBjb3VudAogKiAgICAgLSByZXBsYWNlZCBvc1NlbWFwaG9yZUNyZWF0ZSB3aXRoIG9zU2VtYXBob3JlTmV3CiAqICAgICAtIHJlbmFtZWQgb3NTZW1hcGhvcmVXYWl0IHRvIG9zU2VtYXBob3JlQWNxdWlyZSAoY2hhbmdlZCByZXR1cm4gdmFsdWUpCiAqICAgICAtIGFkZGVkOiBvc1NlbWFwaG9yZUdldE5hbWUsIG9zU2VtYXBob3JlR2V0Q291bnQKICogICAgTWVtb3J5IFBvb2w6CiAqICAgICAtIHVzaW5nIG9zTWVtb3J5UG9vbCBwcmVmaXggaW5zdGVhZCBvZiBvc1Bvb2wKICogICAgIC0gcmVwbGFjZWQgb3NQb29sQ3JlYXRlIHdpdGggb3NNZW1vcnlQb29sTmV3CiAqICAgICAtIGV4dGVuZGVkIG9zTWVtb3J5UG9vbEFsbG9jICh0aW1lb3V0KQogKiAgICAgLSBhZGRlZDogb3NNZW1vcnlQb29sR2V0TmFtZQogKiAgICAgLSBhZGRlZDogb3NNZW1vcnlQb29sR2V0Q2FwYWNpdHksIG9zTWVtb3J5UG9vbEdldEJsb2NrU2l6ZQogKiAgICAgLSBhZGRlZDogb3NNZW1vcnlQb29sR2V0Q291bnQsIG9zTWVtb3J5UG9vbEdldFNwYWNlCiAqICAgICAtIGFkZGVkOiBvc01lbW9yeVBvb2xEZWxldGUKICogICAgIC0gZGVwcmVjYXRlZDogb3NQb29sQ0FsbG9jCiAqICAgIE1lc3NhZ2UgUXVldWU6CiAqICAgICAtIGV4dGVuZGVkOiBmaXhlZCBzaXplIG1lc3NhZ2UgaW5zdGVhZCBvZiBhIHNpbmdsZSAzMi1iaXQgdmFsdWUKICogICAgIC0gdXNpbmcgb3NNZXNzYWdlUXVldWUgcHJlZml4IGluc3RlYWQgb2Ygb3NNZXNzYWdlCiAqICAgICAtIHJlcGxhY2VkIG9zTWVzc2FnZUNyZWF0ZSB3aXRoIG9zTWVzc2FnZVF1ZXVlTmV3CiAqICAgICAtIHVwZGF0ZWQ6IG9zTWVzc2FnZVF1ZXVlUHV0LCBvc01lc3NhZ2VRdWV1ZUdldAogKiAgICAgLSBhZGRlZDogb3NNZXNzYWdlUXVldWVHZXROYW1lCiAqICAgICAtIGFkZGVkOiBvc01lc3NhZ2VRdWV1ZUdldENhcGFjaXR5LCBvc01lc3NhZ2VRdWV1ZUdldE1zZ1NpemUKICogICAgIC0gYWRkZWQ6IG9zTWVzc2FnZVF1ZXVlR2V0Q291bnQsIG9zTWVzc2FnZVF1ZXVlR2V0U3BhY2UKICogICAgIC0gYWRkZWQ6IG9zTWVzc2FnZVF1ZXVlUmVzZXQsIG9zTWVzc2FnZVF1ZXVlRGVsZXRlCiAqICAgIE1haWwgUXVldWU6CiAqICAgICAtIGRlcHJlY2F0ZWQgKHN1cGVyc2VkZWQgYnkgZXh0ZW5kZWQgTWVzc2FnZSBRdWV1ZSBmdW5jdGlvbmFsaXR5KQogKiBWZXJzaW9uIDIuMS4wCiAqICAgIFN1cHBvcnQgZm9yIGNyaXRpY2FsIGFuZCB1bmNyaXRpY2FsIHNlY3Rpb25zIChuZXN0aW5nIHNhZmUpOgogKiAgICAtIHVwZGF0ZWQ6IG9zS2VybmVsTG9jaywgb3NLZXJuZWxVbmxvY2sKICogICAgLSBhZGRlZDogb3NLZXJuZWxSZXN0b3JlTG9jawogKiAgICBVcGRhdGVkIFRocmVhZCBhbmQgRXZlbnQgRmxhZ3M6CiAqICAgIC0gY2hhbmdlZCBmbGFncyBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlIGZyb20gaW50MzJfdCB0byB1aW50MzJfdAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojaWZuZGVmIENNU0lTX09TX0hfCiNkZWZpbmUgQ01TSVNfT1NfSF8KCiNkZWZpbmUgb3NDTVNJUyAgICAgICAgICAgICAweDIwMDAxVSAgICAvLy88IEFQSSB2ZXJzaW9uIChtYWluWzMxOjE2XS5zdWJbMTU6MF0pCgojZGVmaW5lIG9zQ01TSVNfRnJlZVJUT1MgICAgMHhBMDAwMVUgICAgLy8vPCBSVE9TIGlkZW50aWZpY2F0aW9uIGFuZCB2ZXJzaW9uIChtYWluWzMxOjE2XS5zdWJbMTU6MF0pCgojZGVmaW5lIG9zS2VybmVsU3lzdGVtSWQgICAgIkZyZWVSVE9TIFYxMC4wLjEiIC8vLzwgUlRPUyBpZGVudGlmaWNhdGlvbiBzdHJpbmcKCiNkZWZpbmUgb3NGZWF0dXJlX01haW5UaHJlYWQgIDAgICAgICAgICAvLy88IG1haW4gdGhyZWFkICAgICAgMT1tYWluIGNhbiBiZSB0aHJlYWQsIDA9bm90IGF2YWlsYWJsZQojZGVmaW5lIG9zRmVhdHVyZV9TaWduYWxzICAgICAyNFUgICAgICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBTaWduYWwgRmxhZ3MgYXZhaWxhYmxlIHBlciB0aHJlYWQKI2RlZmluZSBvc0ZlYXR1cmVfU2VtYXBob3JlICAgNjU1MzVVICAgIC8vLzwgbWF4aW11bSBjb3VudCBmb3IgXHJlZiBvc1NlbWFwaG9yZUNyZWF0ZSBmdW5jdGlvbgojZGVmaW5lIG9zRmVhdHVyZV9XYWl0ICAgICAgICAwICAgICAgICAgLy8vPCBvc1dhaXQgZnVuY3Rpb246IDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfU3lzVGljayAgICAgMSAgICAgICAgIC8vLzwgb3NLZXJuZWxTeXNUaWNrIGZ1bmN0aW9uczogMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQojZGVmaW5lIG9zRmVhdHVyZV9Qb29sICAgICAgICAwICAgICAgICAgLy8vPCBNZW1vcnkgUG9vbHM6ICAgIDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfTWVzc2FnZVEgICAgMSAgICAgICAgIC8vLzwgTWVzc2FnZSBRdWV1ZXM6ICAxPWF2YWlsYWJsZSwgMD1ub3QgYXZhaWxhYmxlCiNkZWZpbmUgb3NGZWF0dXJlX01haWxRICAgICAgIDAgICAgICAgICAvLy88IE1haWwgUXVldWVzOiAgICAgMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQoKI2lmICAgZGVmaW5lZChfX0NDX0FSTSkKI2RlZmluZSBvc19JblJlZ3MgX192YWx1ZV9pbl9yZWdzCiNlbGlmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApCiNkZWZpbmUgb3NfSW5SZWdzIF9fYXR0cmlidXRlX18oKHZhbHVlX2luX3JlZ3MpKQojZWxzZQojZGVmaW5lIG9zX0luUmVncwojZW5kaWYKCiNpbmNsdWRlICJjbXNpc19vczIuaCIKI2luY2x1ZGUgIkZyZWVSVE9TLmgiCgojaWZkZWYgIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKewojZW5kaWYKCgovLyA9PT09IEVudW1lcmF0aW9ucywgc3RydWN0dXJlcywgZGVmaW5lcyA9PT09CgovLy8gUHJpb3JpdHkgdmFsdWVzLgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKdHlwZWRlZiBlbnVtIHsKICBvc1ByaW9yaXR5SWRsZSAgICAgICAgICA9IC0zLCAgICAgICAgIC8vLzwgUHJpb3JpdHk6IGlkbGUgKGxvd2VzdCkKICBvc1ByaW9yaXR5TG93ICAgICAgICAgICA9IC0yLCAgICAgICAgIC8vLzwgUHJpb3JpdHk6IGxvdwogIG9zUHJpb3JpdHlCZWxvd05vcm1hbCAgID0gLTEsICAgICAgICAgLy8vPCBQcmlvcml0eTogYmVsb3cgbm9ybWFsCiAgb3NQcmlvcml0eU5vcm1hbCAgICAgICAgPSAgMCwgICAgICAgICAvLy88IFByaW9yaXR5OiBub3JtYWwgKGRlZmF1bHQpCiAgb3NQcmlvcml0eUFib3ZlTm9ybWFsICAgPSArMSwgICAgICAgICAvLy88IFByaW9yaXR5OiBhYm92ZSBub3JtYWwKICBvc1ByaW9yaXR5SGlnaCAgICAgICAgICA9ICsyLCAgICAgICAgIC8vLzwgUHJpb3JpdHk6IGhpZ2gKICBvc1ByaW9yaXR5UmVhbHRpbWUgICAgICA9ICszLCAgICAgICAgIC8vLzwgUHJpb3JpdHk6IHJlYWx0aW1lIChoaWdoZXN0KQogIG9zUHJpb3JpdHlFcnJvciAgICAgICAgID0gMHg4NCwgICAgICAgLy8vPCBTeXN0ZW0gY2Fubm90IGRldGVybWluZSBwcmlvcml0eSBvciBpbGxlZ2FsIHByaW9yaXR5LgogIG9zUHJpb3JpdHlSZXNlcnZlZCAgICAgID0gMHg3RkZGRkZGRiAgLy8vPCBQcmV2ZW50cyBlbnVtIGRvd24tc2l6ZSBjb21waWxlciBvcHRpbWl6YXRpb24uCn0gb3NQcmlvcml0eTsKI2Vsc2UKI2RlZmluZSBvc1ByaW9yaXR5IG9zUHJpb3JpdHlfdAojZW5kaWYKCi8vLyBFbnRyeSBwb2ludCBvZiBhIHRocmVhZC4KdHlwZWRlZiB2b2lkICgqb3NfcHRocmVhZCkgKHZvaWQgY29uc3QgKmFyZ3VtZW50KTsKCi8vLyBFbnRyeSBwb2ludCBvZiBhIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KdHlwZWRlZiB2b2lkICgqb3NfcHRpbWVyKSAodm9pZCBjb25zdCAqYXJndW1lbnQpOwoKLy8vIFRpbWVyIHR5cGUuCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQp0eXBlZGVmIGVudW0gewogIG9zVGltZXJPbmNlICAgICAgICAgICAgID0gMCwgICAgICAgICAgLy8vPCBPbmUtc2hvdCB0aW1lci4KICBvc1RpbWVyUGVyaW9kaWMgICAgICAgICA9IDEgICAgICAgICAgIC8vLzwgUmVwZWF0aW5nIHRpbWVyLgp9IG9zX3RpbWVyX3R5cGU7CiNlbHNlCiNkZWZpbmUgb3NfdGltZXJfdHlwZSBvc1RpbWVyVHlwZV90CiNlbmRpZgoKLy8vIFRpbWVvdXQgdmFsdWUuCiNkZWZpbmUgb3NXYWl0Rm9yZXZlciAgICAgICAweEZGRkZGRkZGVSAvLy88IFdhaXQgZm9yZXZlciB0aW1lb3V0IHZhbHVlLgoKLy8vIFN0YXR1cyBjb2RlIHZhbHVlcyByZXR1cm5lZCBieSBDTVNJUy1SVE9TIGZ1bmN0aW9ucy4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCnR5cGVkZWYgZW51bSB7CiAgb3NPSyAgICAgICAgICAgICAgICAgICAgPSAgICAwLCAgICAgICAvLy88IEZ1bmN0aW9uIGNvbXBsZXRlZDsgbm8gZXJyb3Igb3IgZXZlbnQgb2NjdXJyZWQuCiAgb3NFdmVudFNpZ25hbCAgICAgICAgICAgPSAweDA4LCAgICAgICAvLy88IEZ1bmN0aW9uIGNvbXBsZXRlZDsgc2lnbmFsIGV2ZW50IG9jY3VycmVkLgogIG9zRXZlbnRNZXNzYWdlICAgICAgICAgID0gMHgxMCwgICAgICAgLy8vPCBGdW5jdGlvbiBjb21wbGV0ZWQ7IG1lc3NhZ2UgZXZlbnQgb2NjdXJyZWQuCiAgb3NFdmVudE1haWwgICAgICAgICAgICAgPSAweDIwLCAgICAgICAvLy88IEZ1bmN0aW9uIGNvbXBsZXRlZDsgbWFpbCBldmVudCBvY2N1cnJlZC4KICBvc0V2ZW50VGltZW91dCAgICAgICAgICA9IDB4NDAsICAgICAgIC8vLzwgRnVuY3Rpb24gY29tcGxldGVkOyB0aW1lb3V0IG9jY3VycmVkLgogIG9zRXJyb3JQYXJhbWV0ZXIgICAgICAgID0gMHg4MCwgICAgICAgLy8vPCBQYXJhbWV0ZXIgZXJyb3I6IGEgbWFuZGF0b3J5IHBhcmFtZXRlciB3YXMgbWlzc2luZyBvciBzcGVjaWZpZWQgYW4gaW5jb3JyZWN0IG9iamVjdC4KICBvc0Vycm9yUmVzb3VyY2UgICAgICAgICA9IDB4ODEsICAgICAgIC8vLzwgUmVzb3VyY2Ugbm90IGF2YWlsYWJsZTogYSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2FzIG5vdCBhdmFpbGFibGUuCiAgb3NFcnJvclRpbWVvdXRSZXNvdXJjZSAgPSAweEMxLCAgICAgICAvLy88IFJlc291cmNlIG5vdCBhdmFpbGFibGUgd2l0aGluIGdpdmVuIHRpbWU6IGEgc3BlY2lmaWVkIHJlc291cmNlIHdhcyBub3QgYXZhaWxhYmxlIHdpdGhpbiB0aGUgdGltZW91dCBwZXJpb2QuCiAgb3NFcnJvcklTUiAgICAgICAgICAgICAgPSAweDgyLCAgICAgICAvLy88IE5vdCBhbGxvd2VkIGluIElTUiBjb250ZXh0OiB0aGUgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzLgogIG9zRXJyb3JJU1JSZWN1cnNpdmUgICAgID0gMHg4MywgICAgICAgLy8vPCBGdW5jdGlvbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZnJvbSBJU1Igd2l0aCBzYW1lIG9iamVjdC4KICBvc0Vycm9yUHJpb3JpdHkgICAgICAgICA9IDB4ODQsICAgICAgIC8vLzwgU3lzdGVtIGNhbm5vdCBkZXRlcm1pbmUgcHJpb3JpdHkgb3IgdGhyZWFkIGhhcyBpbGxlZ2FsIHByaW9yaXR5LgogIG9zRXJyb3JOb01lbW9yeSAgICAgICAgID0gMHg4NSwgICAgICAgLy8vPCBTeXN0ZW0gaXMgb3V0IG9mIG1lbW9yeTogaXQgd2FzIGltcG9zc2libGUgdG8gYWxsb2NhdGUgb3IgcmVzZXJ2ZSBtZW1vcnkgZm9yIHRoZSBvcGVyYXRpb24uCiAgb3NFcnJvclZhbHVlICAgICAgICAgICAgPSAweDg2LCAgICAgICAvLy88IFZhbHVlIG9mIGEgcGFyYW1ldGVyIGlzIG91dCBvZiByYW5nZS4KICBvc0Vycm9yT1MgICAgICAgICAgICAgICA9IDB4RkYsICAgICAgIC8vLzwgVW5zcGVjaWZpZWQgUlRPUyBlcnJvcjogcnVuLXRpbWUgZXJyb3IgYnV0IG5vIG90aGVyIGVycm9yIG1lc3NhZ2UgZml0cy4KICBvc1N0YXR1c1Jlc2VydmVkICAgICAgICA9IDB4N0ZGRkZGRkYgIC8vLzwgUHJldmVudHMgZW51bSBkb3duLXNpemUgY29tcGlsZXIgb3B0aW1pemF0aW9uLgp9IG9zU3RhdHVzOwojZWxzZQp0eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgICBvc1N0YXR1czsKI2RlZmluZSBvc0V2ZW50U2lnbmFsICAgICAgICAgICAoMHgwOCkKI2RlZmluZSBvc0V2ZW50TWVzc2FnZSAgICAgICAgICAoMHgxMCkKI2RlZmluZSBvc0V2ZW50TWFpbCAgICAgICAgICAgICAoMHgyMCkKI2RlZmluZSBvc0V2ZW50VGltZW91dCAgICAgICAgICAoMHg0MCkKI2RlZmluZSBvc0Vycm9yT1MgICAgICAgICAgICAgICBvc0Vycm9yCiNkZWZpbmUgb3NFcnJvclRpbWVvdXRSZXNvdXJjZSAgb3NFcnJvclRpbWVvdXQKI2RlZmluZSBvc0Vycm9ySVNSUmVjdXJzaXZlICAgICAoLTEyNikKI2RlZmluZSBvc0Vycm9yVmFsdWUgICAgICAgICAgICAoLTEyNykKI2RlZmluZSBvc0Vycm9yUHJpb3JpdHkgICAgICAgICAoLTEyOCkKI2VuZGlmCgoKLy8gPj4+IHRoZSBmb2xsb3dpbmcgZGF0YSB0eXBlIGRlZmluaXRpb25zIG1heSBiZSBhZGFwdGVkIHRvd2FyZHMgYSBzcGVjaWZpYyBSVE9TCgovLy8gVGhyZWFkIElEIGlkZW50aWZpZXMgdGhlIHRocmVhZC4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCnR5cGVkZWYgdm9pZCAqb3NUaHJlYWRJZDsKI2Vsc2UKI2RlZmluZSBvc1RocmVhZElkIG9zVGhyZWFkSWRfdAojZW5kaWYKCi8vLyBUaW1lciBJRCBpZGVudGlmaWVzIHRoZSB0aW1lci4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCnR5cGVkZWYgdm9pZCAqb3NUaW1lcklkOwojZWxzZQojZGVmaW5lIG9zVGltZXJJZCBvc1RpbWVySWRfdAojZW5kaWYKCi8vLyBNdXRleCBJRCBpZGVudGlmaWVzIHRoZSBtdXRleC4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCnR5cGVkZWYgdm9pZCAqb3NNdXRleElkOwojZWxzZQojZGVmaW5lIG9zTXV0ZXhJZCBvc011dGV4SWRfdAojZW5kaWYKCi8vLyBTZW1hcGhvcmUgSUQgaWRlbnRpZmllcyB0aGUgc2VtYXBob3JlLgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKdHlwZWRlZiB2b2lkICpvc1NlbWFwaG9yZUlkOwojZWxzZQojZGVmaW5lIG9zU2VtYXBob3JlSWQgb3NTZW1hcGhvcmVJZF90CiNlbmRpZgoKLy8vIFBvb2wgSUQgaWRlbnRpZmllcyB0aGUgbWVtb3J5IHBvb2wuCnR5cGVkZWYgdm9pZCAqb3NQb29sSWQ7CgovLy8gTWVzc2FnZSBJRCBpZGVudGlmaWVzIHRoZSBtZXNzYWdlIHF1ZXVlLgp0eXBlZGVmIHZvaWQgKm9zTWVzc2FnZVFJZDsKCi8vLyBNYWlsIElEIGlkZW50aWZpZXMgdGhlIG1haWwgcXVldWUuCnR5cGVkZWYgdm9pZCAqb3NNYWlsUUlkOwoKCi8vLyBUaHJlYWQgRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgY29udGFpbnMgc3RhcnR1cCBpbmZvcm1hdGlvbiBvZiBhIHRocmVhZC4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCnR5cGVkZWYgc3RydWN0IG9zX3RocmVhZF9kZWYgewogIG9zX3B0aHJlYWQgICAgICAgICAgICAgICAgIHB0aHJlYWQ7ICAgLy8vPCBzdGFydCBhZGRyZXNzIG9mIHRocmVhZCBmdW5jdGlvbgogIG9zUHJpb3JpdHkgICAgICAgICAgICAgICB0cHJpb3JpdHk7ICAgLy8vPCBpbml0aWFsIHRocmVhZCBwcmlvcml0eQogIHVpbnQzMl90ICAgICAgICAgICAgICAgICBpbnN0YW5jZXM7ICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgb2YgdGhhdCB0aHJlYWQgZnVuY3Rpb24KICB1aW50MzJfdCAgICAgICAgICAgICAgICAgc3RhY2tzaXplOyAgIC8vLzwgc3RhY2sgc2l6ZSByZXF1aXJlbWVudHMgaW4gYnl0ZXM7IDAgaXMgZGVmYXVsdCBzdGFjayBzaXplCn0gb3NUaHJlYWREZWZfdDsKI2Vsc2UKdHlwZWRlZiBzdHJ1Y3Qgb3NfdGhyZWFkX2RlZiB7CiAgb3NfcHRocmVhZCAgICAgICAgICAgICAgICAgcHRocmVhZDsgICAvLy88IHN0YXJ0IGFkZHJlc3Mgb2YgdGhyZWFkIGZ1bmN0aW9uCiAgb3NUaHJlYWRBdHRyX3QgICAgICAgICAgICAgICAgYXR0cjsgICAvLy88IHRocmVhZCBhdHRyaWJ1dGVzCn0gb3NUaHJlYWREZWZfdDsKI2VuZGlmCgovLy8gVGltZXIgRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgY29udGFpbnMgdGltZXIgcGFyYW1ldGVycy4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCnR5cGVkZWYgc3RydWN0IG9zX3RpbWVyX2RlZiB7CiAgb3NfcHRpbWVyICAgICAgICAgICAgICAgICAgIHB0aW1lcjsgICAvLy88IHN0YXJ0IGFkZHJlc3Mgb2YgYSB0aW1lciBmdW5jdGlvbgp9IG9zVGltZXJEZWZfdDsKI2Vsc2UKdHlwZWRlZiBzdHJ1Y3Qgb3NfdGltZXJfZGVmIHsKICBvc19wdGltZXIgICAgICAgICAgICAgICAgICAgcHRpbWVyOyAgIC8vLzwgc3RhcnQgYWRkcmVzcyBvZiBhIHRpbWVyIGZ1bmN0aW9uCiAgb3NUaW1lckF0dHJfdCAgICAgICAgICAgICAgICAgYXR0cjsgICAvLy88IHRpbWVyIGF0dHJpYnV0ZXMKfSBvc1RpbWVyRGVmX3Q7CiNlbmRpZgoKLy8vIE11dGV4IERlZmluaXRpb24gc3RydWN0dXJlIGNvbnRhaW5zIHNldHVwIGluZm9ybWF0aW9uIGZvciBhIG11dGV4LgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKdHlwZWRlZiBzdHJ1Y3Qgb3NfbXV0ZXhfZGVmIHsKICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGR1bW15OyAgIC8vLzwgZHVtbXkgdmFsdWUKfSBvc011dGV4RGVmX3Q7CiNlbHNlCiNkZWZpbmUgb3NNdXRleERlZl90IG9zTXV0ZXhBdHRyX3QKI2VuZGlmCgovLy8gU2VtYXBob3JlIERlZmluaXRpb24gc3RydWN0dXJlIGNvbnRhaW5zIHNldHVwIGluZm9ybWF0aW9uIGZvciBhIHNlbWFwaG9yZS4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCnR5cGVkZWYgc3RydWN0IG9zX3NlbWFwaG9yZV9kZWYgewogIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgZHVtbXk7ICAgLy8vPCBkdW1teSB2YWx1ZQp9IG9zU2VtYXBob3JlRGVmX3Q7CiNlbHNlCiNkZWZpbmUgb3NTZW1hcGhvcmVEZWZfdCBvc1NlbWFwaG9yZUF0dHJfdAojZW5kaWYKCi8vLyBEZWZpbml0aW9uIHN0cnVjdHVyZSBmb3IgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24uCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQp0eXBlZGVmIHN0cnVjdCBvc19wb29sX2RlZiB7CiAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgcG9vbF9zejsgICAvLy88IG51bWJlciBvZiBpdGVtcyAoZWxlbWVudHMpIGluIHRoZSBwb29sCiAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgaXRlbV9zejsgICAvLy88IHNpemUgb2YgYW4gaXRlbQogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKnBvb2w7ICAgLy8vPCBwb2ludGVyIHRvIG1lbW9yeSBmb3IgcG9vbAp9IG9zUG9vbERlZl90OwojZWxzZQp0eXBlZGVmIHN0cnVjdCBvc19wb29sX2RlZiB7CiAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgcG9vbF9zejsgICAvLy88IG51bWJlciBvZiBpdGVtcyAoZWxlbWVudHMpIGluIHRoZSBwb29sCiAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgaXRlbV9zejsgICAvLy88IHNpemUgb2YgYW4gaXRlbQogIG9zTWVtb3J5UG9vbEF0dHJfdCAgICAgICAgICAgIGF0dHI7ICAgLy8vPCBtZW1vcnkgcG9vbCBhdHRyaWJ1dGVzCn0gb3NQb29sRGVmX3Q7CiNlbmRpZgoKLy8vIERlZmluaXRpb24gc3RydWN0dXJlIGZvciBtZXNzYWdlIHF1ZXVlLgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKdHlwZWRlZiBzdHJ1Y3Qgb3NfbWVzc2FnZVFfZGVmIHsKICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIHF1ZXVlX3N6OyAgIC8vLzwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZQogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKnBvb2w7ICAgLy8vPCBtZW1vcnkgYXJyYXkgZm9yIG1lc3NhZ2VzCn0gb3NNZXNzYWdlUURlZl90OwojZWxzZQp0eXBlZGVmIHN0cnVjdCBvc19tZXNzYWdlUV9kZWYgewogIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgcXVldWVfc3o7ICAgLy8vPCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlCiAgb3NNZXNzYWdlUXVldWVBdHRyX3QgICAgICAgICAgYXR0cjsgICAvLy88IG1lc3NhZ2UgcXVldWUgYXR0cmlidXRlcwp9IG9zTWVzc2FnZVFEZWZfdDsKI2VuZGlmCgovLy8gRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgZm9yIG1haWwgcXVldWUuCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQp0eXBlZGVmIHN0cnVjdCBvc19tYWlsUV9kZWYgewogIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgcXVldWVfc3o7ICAgLy8vPCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlCiAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgaXRlbV9zejsgICAvLy88IHNpemUgb2YgYW4gaXRlbQogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKnBvb2w7ICAgLy8vPCBtZW1vcnkgYXJyYXkgZm9yIG1haWwKfSBvc01haWxRRGVmX3Q7CiNlbHNlCnR5cGVkZWYgc3RydWN0IG9zX21haWxRX2RlZiB7CiAgdWludDMyX3QgICAgICAgICAgICAgICAgICBxdWV1ZV9zejsgICAvLy88IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUKICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBpdGVtX3N6OyAgIC8vLzwgc2l6ZSBvZiBhbiBpdGVtCiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqbWFpbDsgICAvLy88IHBvaW50ZXIgdG8gbWFpbAogIG9zTWVtb3J5UG9vbEF0dHJfdCAgICAgICAgIG1wX2F0dHI7ICAgLy8vPCBtZW1vcnkgcG9vbCBhdHRyaWJ1dGVzCiAgb3NNZXNzYWdlUXVldWVBdHRyX3QgICAgICAgbXFfYXR0cjsgICAvLy88IG1lc3NhZ2UgcXVldWUgYXR0cmlidXRlcwp9IG9zTWFpbFFEZWZfdDsKI2VuZGlmCgoKLy8vIEV2ZW50IHN0cnVjdHVyZSBjb250YWlucyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBldmVudC4KdHlwZWRlZiBzdHJ1Y3QgewogIG9zU3RhdHVzICAgICAgICAgICAgICAgICAgICBzdGF0dXM7ICAgLy8vPCBzdGF0dXMgY29kZTogZXZlbnQgb3IgZXJyb3IgaW5mb3JtYXRpb24KICB1bmlvbiB7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgdjsgICAvLy88IG1lc3NhZ2UgYXMgMzItYml0IHZhbHVlCiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqcDsgICAvLy88IG1lc3NhZ2Ugb3IgbWFpbCBhcyB2b2lkIHBvaW50ZXIKICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBzaWduYWxzOyAgIC8vLzwgc2lnbmFsIGZsYWdzCiAgfSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGV2ZW50IHZhbHVlCiAgdW5pb24gewogICAgb3NNYWlsUUlkICAgICAgICAgICAgICAgIG1haWxfaWQ7ICAgLy8vPCBtYWlsIGlkIG9idGFpbmVkIGJ5IFxyZWYgb3NNYWlsQ3JlYXRlCiAgICBvc01lc3NhZ2VRSWQgICAgICAgICAgbWVzc2FnZV9pZDsgICAvLy88IG1lc3NhZ2UgaWQgb2J0YWluZWQgYnkgXHJlZiBvc01lc3NhZ2VDcmVhdGUKICB9IGRlZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZXZlbnQgZGVmaW5pdGlvbgp9IG9zRXZlbnQ7CgoKLy8gID09PT0gS2VybmVsIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KCi8vLyBJbml0aWFsaXplIHRoZSBSVE9TIEtlcm5lbCBmb3IgY3JlYXRpbmcgb2JqZWN0cy4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKb3NTdGF0dXMgb3NLZXJuZWxJbml0aWFsaXplICh2b2lkKTsKI2VuZGlmCgovLy8gU3RhcnQgdGhlIFJUT1MgS2VybmVsIHNjaGVkdWxlci4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKb3NTdGF0dXMgb3NLZXJuZWxTdGFydCAodm9pZCk7CiNlbmRpZgoKLy8vIENoZWNrIGlmIHRoZSBSVE9TIGtlcm5lbCBpcyBhbHJlYWR5IHN0YXJ0ZWQuCi8vLyBccmV0dXJuIDAgUlRPUyBpcyBub3Qgc3RhcnRlZCwgMSBSVE9TIGlzIHN0YXJ0ZWQuCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQppbnQzMl90IG9zS2VybmVsUnVubmluZyh2b2lkKTsKI2VuZGlmCgojaWYgKGRlZmluZWQob3NGZWF0dXJlX1N5c1RpY2spICYmIChvc0ZlYXR1cmVfU3lzVGljayAhPSAwKSkgIC8vIFN5c3RlbSBUaW1lciBhdmFpbGFibGUKCi8vLyBHZXQgdGhlIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciBjb3VudGVyLgovLy8gXHJldHVybiBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgYXMgMzItYml0IHZhbHVlCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQp1aW50MzJfdCBvc0tlcm5lbFN5c1RpY2sgKHZvaWQpOwojZWxzZQojZGVmaW5lICBvc0tlcm5lbFN5c1RpY2sgb3NLZXJuZWxHZXRTeXNUaW1lckNvdW50CiNlbmRpZgoKLy8vIFRoZSBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgZnJlcXVlbmN5IGluIEh6LgovLy8gXG5vdGUgUmVmbGVjdHMgdGhlIHN5c3RlbSB0aW1lciBzZXR0aW5nIGFuZCBpcyB0eXBpY2FsbHkgZGVmaW5lZCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiNkZWZpbmUgb3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5IDEwMDAwMDAwMAojZW5kaWYKCi8vLyBDb252ZXJ0IGEgbWljcm9zZWNvbmRzIHZhbHVlIHRvIGEgUlRPUyBrZXJuZWwgc3lzdGVtIHRpbWVyIHZhbHVlLgovLy8gXHBhcmFtICAgICAgICAgbWljcm9zZWMgICAgIHRpbWUgdmFsdWUgaW4gbWljcm9zZWNvbmRzLgovLy8gXHJldHVybiB0aW1lIHZhbHVlIG5vcm1hbGl6ZWQgdG8gdGhlIFxyZWYgb3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5CiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQojZGVmaW5lIG9zS2VybmVsU3lzVGlja01pY3JvU2VjKG1pY3Jvc2VjKSAoKCh1aW50NjRfdCltaWNyb3NlYyAqIChvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kpKSAvIDEwMDAwMDApCiNlbHNlCiNkZWZpbmUgb3NLZXJuZWxTeXNUaWNrTWljcm9TZWMobWljcm9zZWMpICgoKHVpbnQ2NF90KW1pY3Jvc2VjICogIG9zS2VybmVsR2V0U3lzVGltZXJGcmVxKCkpIC8gMTAwMDAwMCkKI2VuZGlmCgojZW5kaWYgIC8vIFN5c3RlbSBUaW1lciBhdmFpbGFibGUKCgovLyAgPT09PSBUaHJlYWQgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQoKLy8vIENyZWF0ZSBhIFRocmVhZCBEZWZpbml0aW9uIHdpdGggZnVuY3Rpb24sIHByaW9yaXR5LCBhbmQgc3RhY2sgcmVxdWlyZW1lbnRzLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCi8vLyBccGFyYW0gICAgICAgICBwcmlvcml0eSAgICAgIGluaXRpYWwgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIGluc3RhbmNlcyAgICAgbnVtYmVyIG9mIHBvc3NpYmxlIHRocmVhZCBpbnN0YW5jZXMgKHVzZWQgdG8gc3RhdGljYWxseSBhbGxvY2F0ZSBtZW1vcnkpLgovLy8gXHBhcmFtICAgICAgICAgc3RhY2tzeiAgICAgICBzdGFjayBzaXplIChpbiBieXRlcykgcmVxdWlyZW1lbnRzIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgojaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKI2RlZmluZSBvc1RocmVhZERlZihuYW1lLCBwcmlvcml0eSwgaW5zdGFuY2VzLCBzdGFja3N6KSBcCmV4dGVybiBjb25zdCBvc1RocmVhZERlZl90IG9zX3RocmVhZF9kZWZfIyNuYW1lCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CiNkZWZpbmUgb3NUaHJlYWREZWYobmFtZSwgcHJpb3JpdHksIGluc3RhbmNlcywgc3RhY2tzeikgXApzdGF0aWMgdWludDMyX3Qgb3NfdGhyZWFkX3N0YWNrIyNuYW1lWyhzdGFja3N6KT8oKChzdGFja3N6KzMpLzQpKToxXTsgXApzdGF0aWMgU3RhdGljVGFza190IG9zX3RocmVhZF9jYl8jI25hbWU7IFwKY29uc3Qgb3NUaHJlYWREZWZfdCBvc190aHJlYWRfZGVmXyMjbmFtZSA9IFwKeyAobmFtZSksIFwKICB7IE5VTEwsIG9zVGhyZWFkRGV0YWNoZWQsIFwKICAgIChpbnN0YW5jZXMgPT0gMSkgPyAoJm9zX3RocmVhZF9jYl8jI25hbWUpIDogTlVMTCxcCiAgICAoaW5zdGFuY2VzID09IDEpID8gc2l6ZW9mKFN0YXRpY1Rhc2tfdCkgOiAwVSwgXAogICAgKChzdGFja3N6KSAmJiAoaW5zdGFuY2VzID09IDEpKSA/ICgmb3NfdGhyZWFkX3N0YWNrIyNuYW1lKSA6IE5VTEwsIFwKICAgIDQqKChzdGFja3N6KzMpLzQpLCBcCiAgICAocHJpb3JpdHkpLCAwVSwgMFUgfSB9CiNlbmRpZgoKLy8vIEFjY2VzcyBhIFRocmVhZCBkZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSB0aHJlYWQgZGVmaW5pdGlvbiBvYmplY3QuCiNkZWZpbmUgb3NUaHJlYWQobmFtZSkgXAomb3NfdGhyZWFkX2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYSB0aHJlYWQgYW5kIGFkZCBpdCB0byBBY3RpdmUgVGhyZWFkcyBhbmQgc2V0IGl0IHRvIHN0YXRlIFJFQURZLgovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2RlZiAgICB0aHJlYWQgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1RocmVhZC4KLy8vIFxwYXJhbVtpbl0gICAgIGFyZ3VtZW50ICAgICAgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uIGFzIHN0YXJ0IGFyZ3VtZW50LgovLy8gXHJldHVybiB0aHJlYWQgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgpvc1RocmVhZElkIG9zVGhyZWFkQ3JlYXRlIChjb25zdCBvc1RocmVhZERlZl90ICp0aHJlYWRfZGVmLCB2b2lkICphcmd1bWVudCk7CgovLy8gUmV0dXJuIHRoZSB0aHJlYWQgSUQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0aHJlYWQuCi8vLyBccmV0dXJuIHRocmVhZCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQpvc1RocmVhZElkIG9zVGhyZWFkR2V0SWQgKHZvaWQpOwojZW5kaWYKCi8vLyBDaGFuZ2UgcHJpb3JpdHkgb2YgYSB0aHJlYWQuCi8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KLy8vIFxwYXJhbVtpbl0gICAgIHByaW9yaXR5ICAgICAgbmV3IHByaW9yaXR5IHZhbHVlIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQpvc1N0YXR1cyBvc1RocmVhZFNldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCwgb3NQcmlvcml0eSBwcmlvcml0eSk7CiNlbmRpZgoKLy8vIEdldCBjdXJyZW50IHByaW9yaXR5IG9mIGEgdGhyZWFkLgovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCi8vLyBccmV0dXJuIGN1cnJlbnQgcHJpb3JpdHkgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQuCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQpvc1ByaW9yaXR5IG9zVGhyZWFkR2V0UHJpb3JpdHkgKG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKI2VuZGlmCgovLy8gUGFzcyBjb250cm9sIHRvIG5leHQgdGhyZWFkIHRoYXQgaXMgaW4gc3RhdGUgXGIgUkVBRFkuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCm9zU3RhdHVzIG9zVGhyZWFkWWllbGQgKHZvaWQpOwojZW5kaWYKCi8vLyBUZXJtaW5hdGUgZXhlY3V0aW9uIG9mIGEgdGhyZWFkLgovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCm9zU3RhdHVzIG9zVGhyZWFkVGVybWluYXRlIChvc1RocmVhZElkIHRocmVhZF9pZCk7CiNlbmRpZgoKCi8vICA9PT09IFNpZ25hbCBNYW5hZ2VtZW50ID09PT0KCi8vLyBTZXQgdGhlIHNwZWNpZmllZCBTaWduYWwgRmxhZ3Mgb2YgYW4gYWN0aXZlIHRocmVhZC4KLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgovLy8gXHBhcmFtW2luXSAgICAgc2lnbmFscyAgICAgICBzcGVjaWZpZXMgdGhlIHNpZ25hbCBmbGFncyBvZiB0aGUgdGhyZWFkIHRoYXQgc2hvdWxkIGJlIHNldC4KLy8vIFxyZXR1cm4gcHJldmlvdXMgc2lnbmFsIGZsYWdzIG9mIHRoZSBzcGVjaWZpZWQgdGhyZWFkIG9yIDB4ODAwMDAwMDAgaW4gY2FzZSBvZiBpbmNvcnJlY3QgcGFyYW1ldGVycy4KaW50MzJfdCBvc1NpZ25hbFNldCAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIGludDMyX3Qgc2lnbmFscyk7CgovLy8gQ2xlYXIgdGhlIHNwZWNpZmllZCBTaWduYWwgRmxhZ3Mgb2YgYW4gYWN0aXZlIHRocmVhZC4KLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgovLy8gXHBhcmFtW2luXSAgICAgc2lnbmFscyAgICAgICBzcGVjaWZpZXMgdGhlIHNpZ25hbCBmbGFncyBvZiB0aGUgdGhyZWFkIHRoYXQgc2hhbGwgYmUgY2xlYXJlZC4KLy8vIFxyZXR1cm4gcHJldmlvdXMgc2lnbmFsIGZsYWdzIG9mIHRoZSBzcGVjaWZpZWQgdGhyZWFkIG9yIDB4ODAwMDAwMDAgaW4gY2FzZSBvZiBpbmNvcnJlY3QgcGFyYW1ldGVycyBvciBjYWxsIGZyb20gSVNSLgppbnQzMl90IG9zU2lnbmFsQ2xlYXIgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbHMpOwoKLy8vIFdhaXQgZm9yIG9uZSBvciBtb3JlIFNpZ25hbCBGbGFncyB0byBiZWNvbWUgc2lnbmFsZWQgZm9yIHRoZSBjdXJyZW50IFxiIFJVTk5JTkcgdGhyZWFkLgovLy8gXHBhcmFtW2luXSAgICAgc2lnbmFscyAgICAgICB3YWl0IHVudGlsIGFsbCBzcGVjaWZpZWQgc2lnbmFsIGZsYWdzIHNldCBvciAwIGZvciBhbnkgc2luZ2xlIHNpZ25hbCBmbGFnLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KLy8vIFxyZXR1cm4gZXZlbnQgZmxhZyBpbmZvcm1hdGlvbiBvciBlcnJvciBjb2RlLgpvc19JblJlZ3Mgb3NFdmVudCBvc1NpZ25hbFdhaXQgKGludDMyX3Qgc2lnbmFscywgdWludDMyX3QgbWlsbGlzZWMpOwoKCi8vICA9PT09IEdlbmVyaWMgV2FpdCBGdW5jdGlvbnMgPT09PQoKLy8vIFdhaXQgZm9yIFRpbWVvdXQgKFRpbWUgRGVsYXkpLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlICJ0aW1lIGRlbGF5IiB2YWx1ZQovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQpvc1N0YXR1cyBvc0RlbGF5ICh1aW50MzJfdCBtaWxsaXNlYyk7CiNlbmRpZgoKI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfV2FpdCkgJiYgKG9zRmVhdHVyZV9XYWl0ICE9IDApKSAgLy8gR2VuZXJpYyBXYWl0IGF2YWlsYWJsZQoKLy8vIFdhaXQgZm9yIFNpZ25hbCwgTWVzc2FnZSwgTWFpbCwgb3IgVGltZW91dC4KLy8vIFxwYXJhbVtpbl0gbWlsbGlzZWMgICAgICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKLy8vIFxyZXR1cm4gZXZlbnQgdGhhdCBjb250YWlucyBzaWduYWwsIG1lc3NhZ2UsIG9yIG1haWwgaW5mb3JtYXRpb24gb3IgZXJyb3IgY29kZS4Kb3NfSW5SZWdzIG9zRXZlbnQgb3NXYWl0ICh1aW50MzJfdCBtaWxsaXNlYyk7CgojZW5kaWYgIC8vIEdlbmVyaWMgV2FpdCBhdmFpbGFibGUKCgovLyAgPT09PSBUaW1lciBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CgovLy8gRGVmaW5lIGEgVGltZXIgb2JqZWN0LgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSB0aW1lciBvYmplY3QuCi8vLyBccGFyYW0gICAgICAgICBmdW5jdGlvbiAgICAgIG5hbWUgb2YgdGhlIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCiNkZWZpbmUgb3NUaW1lckRlZihuYW1lLCBmdW5jdGlvbikgXApleHRlcm4gY29uc3Qgb3NUaW1lckRlZl90IG9zX3RpbWVyX2RlZl8jI25hbWUKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKI2RlZmluZSBvc1RpbWVyRGVmKG5hbWUsIGZ1bmN0aW9uKSBcCnN0YXRpYyBTdGF0aWNUaW1lcl90IG9zX3RpbWVyX2NiXyMjbmFtZTsgXApjb25zdCBvc1RpbWVyRGVmX3Qgb3NfdGltZXJfZGVmXyMjbmFtZSA9IFwKeyAoZnVuY3Rpb24pLCB7IE5VTEwsIDBVLCAoJm9zX3RpbWVyX2NiXyMjbmFtZSksIHNpemVvZihTdGF0aWNUaW1lcl90KSB9IH0KI2VuZGlmCgovLy8gQWNjZXNzIGEgVGltZXIgZGVmaW5pdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgdGltZXIgb2JqZWN0LgojZGVmaW5lIG9zVGltZXIobmFtZSkgXAomb3NfdGltZXJfZGVmXyMjbmFtZQoKLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIHRpbWVyLgovLy8gXHBhcmFtW2luXSAgICAgdGltZXJfZGVmICAgICB0aW1lciBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NUaW1lci4KLy8vIFxwYXJhbVtpbl0gICAgIHR5cGUgICAgICAgICAgb3NUaW1lck9uY2UgZm9yIG9uZS1zaG90IG9yIG9zVGltZXJQZXJpb2RpYyBmb3IgcGVyaW9kaWMgYmVoYXZpb3IuCi8vLyBccGFyYW1baW5dICAgICBhcmd1bWVudCAgICAgIGFyZ3VtZW50IHRvIHRoZSB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCi8vLyBccmV0dXJuIHRpbWVyIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4Kb3NUaW1lcklkIG9zVGltZXJDcmVhdGUgKGNvbnN0IG9zVGltZXJEZWZfdCAqdGltZXJfZGVmLCBvc190aW1lcl90eXBlIHR5cGUsIHZvaWQgKmFyZ3VtZW50KTsKCi8vLyBTdGFydCBvciByZXN0YXJ0IGEgdGltZXIuCi8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSAidGltZSBkZWxheSIgdmFsdWUgb2YgdGhlIHRpbWVyLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQpvc1N0YXR1cyBvc1RpbWVyU3RhcnQgKG9zVGltZXJJZCB0aW1lcl9pZCwgdWludDMyX3QgbWlsbGlzZWMpOwojZW5kaWYKCi8vLyBTdG9wIGEgdGltZXIuCi8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKb3NTdGF0dXMgb3NUaW1lclN0b3AgKG9zVGltZXJJZCB0aW1lcl9pZCk7CiNlbmRpZgoKLy8vIERlbGV0ZSBhIHRpbWVyLgovLy8gXHBhcmFtW2luXSAgICAgdGltZXJfaWQgICAgICB0aW1lciBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGltZXJDcmVhdGUuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCm9zU3RhdHVzIG9zVGltZXJEZWxldGUgKG9zVGltZXJJZCB0aW1lcl9pZCk7CiNlbmRpZgoKCi8vICA9PT09IE11dGV4IE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KCi8vLyBEZWZpbmUgYSBNdXRleC4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgbXV0ZXggb2JqZWN0LgojaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKI2RlZmluZSBvc011dGV4RGVmKG5hbWUpIFwKZXh0ZXJuIGNvbnN0IG9zTXV0ZXhEZWZfdCBvc19tdXRleF9kZWZfIyNuYW1lCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CiNkZWZpbmUgb3NNdXRleERlZihuYW1lKSBcCnN0YXRpYyBTdGF0aWNTZW1hcGhvcmVfdCBvc19tdXRleF9jYl8jI25hbWU7IFwKY29uc3Qgb3NNdXRleERlZl90IG9zX211dGV4X2RlZl8jI25hbWUgPSBcCnsgTlVMTCwgb3NNdXRleFJlY3Vyc2l2ZSB8IG9zTXV0ZXhQcmlvSW5oZXJpdCwgKCZvc19tdXRleF9jYl8jI25hbWUpLCBzaXplb2YoU3RhdGljU2VtYXBob3JlX3QpIH0KI2VuZGlmCgovLy8gQWNjZXNzIGEgTXV0ZXggZGVmaW5pdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgbXV0ZXggb2JqZWN0LgojZGVmaW5lIG9zTXV0ZXgobmFtZSkgXAomb3NfbXV0ZXhfZGVmXyMjbmFtZQoKLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE11dGV4IG9iamVjdC4KLy8vIFxwYXJhbVtpbl0gICAgIG11dGV4X2RlZiAgICAgbXV0ZXggZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc011dGV4LgovLy8gXHJldHVybiBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCm9zTXV0ZXhJZCBvc011dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZik7CgovLy8gV2FpdCB1bnRpbCBhIE11dGV4IGJlY29tZXMgYXZhaWxhYmxlLgovLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCi8vLyBccGFyYW1baW5dICAgICBtaWxsaXNlYyAgICAgIFxyZWYgQ01TSVNfUlRPU19UaW1lT3V0VmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQpvc1N0YXR1cyBvc011dGV4V2FpdCAob3NNdXRleElkIG11dGV4X2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CiNlbHNlCiNkZWZpbmUgIG9zTXV0ZXhXYWl0IG9zTXV0ZXhBY3F1aXJlCiNlbmRpZgoKLy8vIFJlbGVhc2UgYSBNdXRleCB0aGF0IHdhcyBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhXYWl0LgovLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCm9zU3RhdHVzIG9zTXV0ZXhSZWxlYXNlIChvc011dGV4SWQgbXV0ZXhfaWQpOwojZW5kaWYKCi8vLyBEZWxldGUgYSBNdXRleCBvYmplY3QuCi8vLyBccGFyYW1baW5dICAgICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgojaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKb3NTdGF0dXMgb3NNdXRleERlbGV0ZSAob3NNdXRleElkIG11dGV4X2lkKTsKI2VuZGlmCgoKLy8gID09PT0gU2VtYXBob3JlIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KCiNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1NlbWFwaG9yZSkgJiYgKG9zRmVhdHVyZV9TZW1hcGhvcmUgIT0gMFUpKSAgLy8gU2VtYXBob3JlIGF2YWlsYWJsZQoKLy8vIERlZmluZSBhIFNlbWFwaG9yZSBvYmplY3QuCi8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHNlbWFwaG9yZSBvYmplY3QuCiNpZiBkZWZpbmVkIChvc09iamVjdHNFeHRlcm5hbCkgIC8vIG9iamVjdCBpcyBleHRlcm5hbAojZGVmaW5lIG9zU2VtYXBob3JlRGVmKG5hbWUpIFwKZXh0ZXJuIGNvbnN0IG9zU2VtYXBob3JlRGVmX3Qgb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKI2RlZmluZSBvc1NlbWFwaG9yZURlZihuYW1lKSBcCnN0YXRpYyBTdGF0aWNTZW1hcGhvcmVfdCBvc19zZW1hcGhvcmVfY2JfIyNuYW1lOyBcCmNvbnN0IG9zU2VtYXBob3JlRGVmX3Qgb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUgPSBcCnsgTlVMTCwgMFUsICgmb3Nfc2VtYXBob3JlX2NiXyMjbmFtZSksIHNpemVvZihTdGF0aWNTZW1hcGhvcmVfdCkgfQojZW5kaWYKCi8vLyBBY2Nlc3MgYSBTZW1hcGhvcmUgZGVmaW5pdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgc2VtYXBob3JlIG9iamVjdC4KI2RlZmluZSBvc1NlbWFwaG9yZShuYW1lKSBcCiZvc19zZW1hcGhvcmVfZGVmXyMjbmFtZQoKLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIFNlbWFwaG9yZSBvYmplY3QuCi8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfZGVmIHNlbWFwaG9yZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlLgovLy8gXHBhcmFtW2luXSAgICAgY291bnQgICAgICAgICBtYXhpbXVtIGFuZCBpbml0aWFsIG51bWJlciBvZiBhdmFpbGFibGUgdG9rZW5zLgovLy8gXHJldHVybiBzZW1hcGhvcmUgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgpvc1NlbWFwaG9yZUlkIG9zU2VtYXBob3JlQ3JlYXRlIChjb25zdCBvc1NlbWFwaG9yZURlZl90ICpzZW1hcGhvcmVfZGVmLCBpbnQzMl90IGNvdW50KTsKCi8vLyBXYWl0IHVudGlsIGEgU2VtYXBob3JlIHRva2VuIGJlY29tZXMgYXZhaWxhYmxlLgovLy8gXHBhcmFtW2luXSAgICAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KLy8vIFxyZXR1cm4gbnVtYmVyIG9mIGF2YWlsYWJsZSB0b2tlbnMsIG9yIC0xIGluIGNhc2Ugb2YgaW5jb3JyZWN0IHBhcmFtZXRlcnMuCmludDMyX3Qgb3NTZW1hcGhvcmVXYWl0IChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpOwoKLy8vIFJlbGVhc2UgYSBTZW1hcGhvcmUgdG9rZW4uCi8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCm9zU3RhdHVzIG9zU2VtYXBob3JlUmVsZWFzZSAob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQpOwojZW5kaWYKCi8vLyBEZWxldGUgYSBTZW1hcGhvcmUgb2JqZWN0LgovLy8gXHBhcmFtW2luXSAgICAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQpvc1N0YXR1cyBvc1NlbWFwaG9yZURlbGV0ZSAob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQpOwojZW5kaWYKCiNlbmRpZiAgLy8gU2VtYXBob3JlIGF2YWlsYWJsZQoKCi8vICA9PT09IE1lbW9yeSBQb29sIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KCiNpZiAoZGVmaW5lZChvc0ZlYXR1cmVfUG9vbCkgJiYgKG9zRmVhdHVyZV9Qb29sICE9IDApKSAgLy8gTWVtb3J5IFBvb2wgYXZhaWxhYmxlCgovLy8gXGJyaWVmIERlZmluZSBhIE1lbW9yeSBQb29sLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtZW1vcnkgcG9vbC4KLy8vIFxwYXJhbSAgICAgICAgIG5vICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIChvYmplY3RzKSBpbiB0aGUgbWVtb3J5IHBvb2wuCi8vLyBccGFyYW0gICAgICAgICB0eXBlICAgICAgICAgIGRhdGEgdHlwZSBvZiBhIHNpbmdsZSBibG9jayAob2JqZWN0KS4KI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCiNkZWZpbmUgb3NQb29sRGVmKG5hbWUsIG5vLCB0eXBlKSBcCmV4dGVybiBjb25zdCBvc1Bvb2xEZWZfdCBvc19wb29sX2RlZl8jI25hbWUKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKI2RlZmluZSBvc1Bvb2xEZWYobmFtZSwgbm8sIHR5cGUpIFwKY29uc3Qgb3NQb29sRGVmX3Qgb3NfcG9vbF9kZWZfIyNuYW1lID0gXAp7IChubyksIHNpemVvZih0eXBlKSwgTlVMTCB9CiNlbmRpZgoKLy8vIFxicmllZiBBY2Nlc3MgYSBNZW1vcnkgUG9vbCBkZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtZW1vcnkgcG9vbAojZGVmaW5lIG9zUG9vbChuYW1lKSBcCiZvc19wb29sX2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNZW1vcnkgUG9vbCBvYmplY3QuCi8vLyBccGFyYW1baW5dICAgICBwb29sX2RlZiAgICAgIG1lbW9yeSBwb29sIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NQb29sLgovLy8gXHJldHVybiBtZW1vcnkgcG9vbCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCm9zUG9vbElkIG9zUG9vbENyZWF0ZSAoY29uc3Qgb3NQb29sRGVmX3QgKnBvb2xfZGVmKTsKCi8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgTWVtb3J5IFBvb2wuCi8vLyBccGFyYW1baW5dICAgICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCi8vLyBccmV0dXJuIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIG5vIG1lbW9yeSBhdmFpbGFibGUuCnZvaWQgKm9zUG9vbEFsbG9jIChvc1Bvb2xJZCBwb29sX2lkKTsKCi8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgTWVtb3J5IFBvb2wgYW5kIHNldCBtZW1vcnkgYmxvY2sgdG8gemVyby4KLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfaWQgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbENyZWF0ZS4KLy8vIFxyZXR1cm4gYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvciBOVUxMIGluIGNhc2Ugb2Ygbm8gbWVtb3J5IGF2YWlsYWJsZS4Kdm9pZCAqb3NQb29sQ0FsbG9jIChvc1Bvb2xJZCBwb29sX2lkKTsKCi8vLyBSZXR1cm4gYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBiYWNrIHRvIGEgTWVtb3J5IFBvb2wuCi8vLyBccGFyYW1baW5dICAgICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCi8vLyBccGFyYW1baW5dICAgICBibG9jayAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIG1lbW9yeSBwb29sLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCm9zU3RhdHVzIG9zUG9vbEZyZWUgKG9zUG9vbElkIHBvb2xfaWQsIHZvaWQgKmJsb2NrKTsKCiNlbmRpZiAgLy8gTWVtb3J5IFBvb2wgYXZhaWxhYmxlCgoKLy8gID09PT0gTWVzc2FnZSBRdWV1ZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CgojaWYgKGRlZmluZWQob3NGZWF0dXJlX01lc3NhZ2VRKSAmJiAob3NGZWF0dXJlX01lc3NhZ2VRICE9IDApKSAgLy8gTWVzc2FnZSBRdWV1ZSBhdmFpbGFibGUKCi8vLyBcYnJpZWYgQ3JlYXRlIGEgTWVzc2FnZSBRdWV1ZSBEZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZS4KLy8vIFxwYXJhbSAgICAgICAgIHF1ZXVlX3N6ICAgICAgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gdGhlIHF1ZXVlLgovLy8gXHBhcmFtICAgICAgICAgdHlwZSAgICAgICAgICBkYXRhIHR5cGUgb2YgYSBzaW5nbGUgbWVzc2FnZSBlbGVtZW50IChmb3IgZGVidWdnZXIpLgojaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKI2RlZmluZSBvc01lc3NhZ2VRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSBcCmV4dGVybiBjb25zdCBvc01lc3NhZ2VRRGVmX3Qgb3NfbWVzc2FnZVFfZGVmXyMjbmFtZQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAojZGVmaW5lIG9zTWVzc2FnZVFEZWYobmFtZSwgcXVldWVfc3osIHR5cGUpIFwKc3RhdGljIFN0YXRpY1F1ZXVlX3Qgb3NfbXFfY2JfIyNuYW1lOyBcCnN0YXRpYyB1aW50MzJfdCBvc19tcV9kYXRhXyMjbmFtZVsocXVldWVfc3opICogc2l6ZW9mKHR5cGUpXTsgXApjb25zdCBvc01lc3NhZ2VRRGVmX3Qgb3NfbWVzc2FnZVFfZGVmXyMjbmFtZSA9IFwKeyAocXVldWVfc3opLCBcCiAgeyBOVUxMLCAwVSwgKCZvc19tcV9jYl8jI25hbWUpLCBzaXplb2YoU3RhdGljUXVldWVfdCksIFwKICAgICAgICAgICAgICAoJm9zX21xX2RhdGFfIyNuYW1lKSwgc2l6ZW9mKG9zX21xX2RhdGFfIyNuYW1lKSB9IH0KI2VuZGlmCgovLy8gXGJyaWVmIEFjY2VzcyBhIE1lc3NhZ2UgUXVldWUgRGVmaW5pdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgcXVldWUKI2RlZmluZSBvc01lc3NhZ2VRKG5hbWUpIFwKJm9zX21lc3NhZ2VRX2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNZXNzYWdlIFF1ZXVlIG9iamVjdC4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2RlZiAgICAgbWVzc2FnZSBxdWV1ZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTWVzc2FnZVEuCi8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCAob2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQpIG9yIE5VTEwuCi8vLyBccmV0dXJuIG1lc3NhZ2UgcXVldWUgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgpvc01lc3NhZ2VRSWQgb3NNZXNzYWdlQ3JlYXRlIChjb25zdCBvc01lc3NhZ2VRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpOwoKLy8vIFB1dCBhIE1lc3NhZ2UgdG8gYSBRdWV1ZS4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNZXNzYWdlQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgaW5mbyAgICAgICAgICBtZXNzYWdlIGluZm9ybWF0aW9uLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgpvc1N0YXR1cyBvc01lc3NhZ2VQdXQgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgaW5mbywgdWludDMyX3QgbWlsbGlzZWMpOwoKLy8vIEdldCBhIE1lc3NhZ2UgZnJvbSBhIFF1ZXVlIG9yIHRpbWVvdXQgaWYgUXVldWUgaXMgZW1wdHkuCi8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCi8vLyBccmV0dXJuIGV2ZW50IGluZm9ybWF0aW9uIHRoYXQgaW5jbHVkZXMgc3RhdHVzIGNvZGUuCm9zX0luUmVncyBvc0V2ZW50IG9zTWVzc2FnZUdldCAob3NNZXNzYWdlUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CgojZW5kaWYgIC8vIE1lc3NhZ2UgUXVldWUgYXZhaWxhYmxlCgoKLy8gID09PT0gTWFpbCBRdWV1ZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CgojaWYgKGRlZmluZWQob3NGZWF0dXJlX01haWxRKSAmJiAob3NGZWF0dXJlX01haWxRICE9IDApKSAgLy8gTWFpbCBRdWV1ZSBhdmFpbGFibGUKCi8vLyBcYnJpZWYgQ3JlYXRlIGEgTWFpbCBRdWV1ZSBEZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZS4KLy8vIFxwYXJhbSAgICAgICAgIHF1ZXVlX3N6ICAgICAgbWF4aW11bSBudW1iZXIgb2YgbWFpbHMgaW4gdGhlIHF1ZXVlLgovLy8gXHBhcmFtICAgICAgICAgdHlwZSAgICAgICAgICBkYXRhIHR5cGUgb2YgYSBzaW5nbGUgbWFpbCBlbGVtZW50LgojaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKI2RlZmluZSBvc01haWxRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSBcCmV4dGVybiBjb25zdCBvc01haWxRRGVmX3Qgb3NfbWFpbFFfZGVmXyMjbmFtZQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAojZGVmaW5lIG9zTWFpbFFEZWYobmFtZSwgcXVldWVfc3osIHR5cGUpIFwKY29uc3Qgb3NNYWlsUURlZl90IG9zX21haWxRX2RlZl8jI25hbWUgPSBcCnsgKHF1ZXVlX3N6KSwgc2l6ZW9mKHR5cGUpLCBOVUxMIH0KI2VuZGlmCgovLy8gXGJyaWVmIEFjY2VzcyBhIE1haWwgUXVldWUgRGVmaW5pdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgcXVldWUKI2RlZmluZSBvc01haWxRKG5hbWUpIFwKJm9zX21haWxRX2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNYWlsIFF1ZXVlIG9iamVjdC4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2RlZiAgICAgbWFpbCBxdWV1ZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTWFpbFEuCi8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCAob2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQpIG9yIE5VTEwuCi8vLyBccmV0dXJuIG1haWwgcXVldWUgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgpvc01haWxRSWQgb3NNYWlsQ3JlYXRlIChjb25zdCBvc01haWxRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpOwoKLy8vIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZvciBtYWlsIGZyb20gYSBtYWlsIG1lbW9yeSBwb29sLgovLy8gXHBhcmFtW2luXSAgICAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCi8vLyBccGFyYW1baW5dICAgICBtaWxsaXNlYyAgICAgIFxyZWYgQ01TSVNfUlRPU19UaW1lT3V0VmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0Ci8vLyBccmV0dXJuIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoIG1haWwgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgp2b2lkICpvc01haWxBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CgovLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZm9yIG1haWwgZnJvbSBhIG1haWwgbWVtb3J5IHBvb2wgYW5kIHNldCBtZW1vcnkgYmxvY2sgdG8gemVyby4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAovLy8gXHJldHVybiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayB0aGF0IGNhbiBiZSBmaWxsZWQgd2l0aCBtYWlsIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4Kdm9pZCAqb3NNYWlsQ0FsbG9jIChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKCi8vLyBQdXQgYSBNYWlsIGludG8gYSBRdWV1ZS4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgbWFpbCAgICAgICAgICBwb2ludGVyIHRvIG1lbW9yeSB3aXRoIG1haWwgdG8gcHV0IGludG8gYSBxdWV1ZS4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgpvc1N0YXR1cyBvc01haWxQdXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgY29uc3Qgdm9pZCAqbWFpbCk7CgovLy8gR2V0IGEgTWFpbCBmcm9tIGEgUXVldWUgb3IgdGltZW91dCBpZiBRdWV1ZSBpcyBlbXB0eS4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KLy8vIFxyZXR1cm4gZXZlbnQgaW5mb3JtYXRpb24gdGhhdCBpbmNsdWRlcyBzdGF0dXMgY29kZS4Kb3NfSW5SZWdzIG9zRXZlbnQgb3NNYWlsR2V0IChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKCi8vLyBGcmVlIGEgbWVtb3J5IGJsb2NrIGJ5IHJldHVybmluZyBpdCB0byBhIG1haWwgbWVtb3J5IHBvb2wuCi8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1haWwgICAgICAgICAgcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgdGhhdCB3YXMgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbEdldC4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgpvc1N0YXR1cyBvc01haWxGcmVlIChvc01haWxRSWQgcXVldWVfaWQsIHZvaWQgKm1haWwpOwoKI2VuZGlmICAvLyBNYWlsIFF1ZXVlIGF2YWlsYWJsZQoKI2lmZGVmICBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2VuZGlmICAvLyBDTVNJU19PU19IXwo=