Lyogcm93LmMgLSBhbiBlbmhhbmNlZCB0dXBsZSBmb3IgZGF0YWJhc2Ugcm93cw0KICoNCiAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4NCiAqDQogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4NCiAqDQogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZA0KICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcw0KICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCiAqDQogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCiAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQNCiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCiAqDQogKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQogKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KICovDQoNCiNpbmNsdWRlICJyb3cuaCINCiNpbmNsdWRlICJjdXJzb3IuaCINCiNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCINCg0Kdm9pZCBweXNxbGl0ZV9yb3dfZGVhbGxvYyhweXNxbGl0ZV9Sb3cqIHNlbGYpDQp7DQogICAgUHlfWERFQ1JFRihzZWxmLT5kYXRhKTsNCiAgICBQeV9YREVDUkVGKHNlbGYtPmRlc2NyaXB0aW9uKTsNCg0KICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsNCn0NCg0KaW50IHB5c3FsaXRlX3Jvd19pbml0KHB5c3FsaXRlX1Jvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpDQp7DQogICAgUHlPYmplY3QqIGRhdGE7DQogICAgcHlzcWxpdGVfQ3Vyc29yKiBjdXJzb3I7DQoNCiAgICBzZWxmLT5kYXRhID0gMDsNCiAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IDA7DQoNCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJmN1cnNvciwgJmRhdGEpKSB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBpZiAoIVB5T2JqZWN0X0lzSW5zdGFuY2UoKFB5T2JqZWN0KiljdXJzb3IsIChQeU9iamVjdCopJnB5c3FsaXRlX0N1cnNvclR5cGUpKSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBvZiBjdXJzb3IgcmVxdWlyZWQgZm9yIGZpcnN0IGFyZ3VtZW50Iik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBpZiAoIVB5VHVwbGVfQ2hlY2soZGF0YSkpIHsNCiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInR1cGxlIHJlcXVpcmVkIGZvciBzZWNvbmQgYXJndW1lbnQiKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIFB5X0lOQ1JFRihkYXRhKTsNCiAgICBzZWxmLT5kYXRhID0gZGF0YTsNCg0KICAgIFB5X0lOQ1JFRihjdXJzb3ItPmRlc2NyaXB0aW9uKTsNCiAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IGN1cnNvci0+ZGVzY3JpcHRpb247DQoNCiAgICByZXR1cm4gMDsNCn0NCg0KUHlPYmplY3QqIHB5c3FsaXRlX3Jvd19zdWJzY3JpcHQocHlzcWxpdGVfUm93KiBzZWxmLCBQeU9iamVjdCogaWR4KQ0Kew0KICAgIGxvbmcgX2lkeDsNCiAgICBjaGFyKiBrZXk7DQogICAgaW50IG5pdGVtcywgaTsNCiAgICBjaGFyKiBjb21wYXJlX2tleTsNCg0KICAgIGNoYXIqIHAxOw0KICAgIGNoYXIqIHAyOw0KDQogICAgUHlPYmplY3QqIGl0ZW07DQoNCiAgICBpZiAoUHlJbnRfQ2hlY2soaWR4KSkgew0KICAgICAgICBfaWR4ID0gUHlJbnRfQXNMb25nKGlkeCk7DQogICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgX2lkeCk7DQogICAgICAgIFB5X1hJTkNSRUYoaXRlbSk7DQogICAgICAgIHJldHVybiBpdGVtOw0KICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKGlkeCkpIHsNCiAgICAgICAgX2lkeCA9IFB5TG9uZ19Bc0xvbmcoaWR4KTsNCiAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBfaWR4KTsNCiAgICAgICAgUHlfWElOQ1JFRihpdGVtKTsNCiAgICAgICAgcmV0dXJuIGl0ZW07DQogICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhpZHgpKSB7DQogICAgICAgIGtleSA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkeCk7DQoNCiAgICAgICAgbml0ZW1zID0gUHlUdXBsZV9TaXplKHNlbGYtPmRlc2NyaXB0aW9uKTsNCg0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbml0ZW1zOyBpKyspIHsNCiAgICAgICAgICAgIGNvbXBhcmVfa2V5ID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlUdXBsZV9HRVRfSVRFTShQeVR1cGxlX0dFVF9JVEVNKHNlbGYtPmRlc2NyaXB0aW9uLCBpKSwgMCkpOw0KICAgICAgICAgICAgaWYgKCFjb21wYXJlX2tleSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBwMSA9IGtleTsNCiAgICAgICAgICAgIHAyID0gY29tcGFyZV9rZXk7DQoNCiAgICAgICAgICAgIHdoaWxlICgxKSB7DQogICAgICAgICAgICAgICAgaWYgKCgqcDEgPT0gKGNoYXIpMCkgfHwgKCpwMiA9PSAoY2hhcikwKSkgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoKCpwMSB8IDB4MjApICE9ICgqcDIgfCAweDIwKSkgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBwMSsrOw0KICAgICAgICAgICAgICAgIHAyKys7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICgoKnAxID09IChjaGFyKTApICYmICgqcDIgPT0gKGNoYXIpMCkpIHsNCiAgICAgICAgICAgICAgICAvKiBmb3VuZCBpdGVtICovDQogICAgICAgICAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBpKTsNCiAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KDQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiTm8gaXRlbSB3aXRoIHRoYXQga2V5Iik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpZHgpKSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2xpY2VzIG5vdCBpbXBsZW1lbnRlZCwgeWV0Iik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0gZWxzZSB7DQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiSW5kZXggbXVzdCBiZSBpbnQgb3Igc3RyaW5nIik7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCn0NCg0KUHlfc3NpemVfdCBweXNxbGl0ZV9yb3dfbGVuZ3RoKHB5c3FsaXRlX1Jvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpDQp7DQogICAgcmV0dXJuIFB5VHVwbGVfR0VUX1NJWkUoc2VsZi0+ZGF0YSk7DQp9DQoNClB5T2JqZWN0KiBweXNxbGl0ZV9yb3dfa2V5cyhweXNxbGl0ZV9Sb3cqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQ0Kew0KICAgIFB5T2JqZWN0KiBsaXN0Ow0KICAgIGludCBuaXRlbXMsIGk7DQoNCiAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsNCiAgICBpZiAoIWxpc3QpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KICAgIG5pdGVtcyA9IFB5VHVwbGVfU2l6ZShzZWxmLT5kZXNjcmlwdGlvbik7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgbml0ZW1zOyBpKyspIHsNCiAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgUHlUdXBsZV9HRVRfSVRFTShQeVR1cGxlX0dFVF9JVEVNKHNlbGYtPmRlc2NyaXB0aW9uLCBpKSwgMCkpICE9IDApIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsNCiAgICAgICAgICAgIHJldHVybiBOVUxMOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIGxpc3Q7DQp9DQoNCnN0YXRpYyBpbnQgcHlzcWxpdGVfcm93X3ByaW50KHB5c3FsaXRlX1Jvdyogc2VsZiwgRklMRSAqZnAsIGludCBmbGFncykNCnsNCiAgICByZXR1cm4gKCZQeVR1cGxlX1R5cGUpLT50cF9wcmludChzZWxmLT5kYXRhLCBmcCwgZmxhZ3MpOw0KfQ0KDQpzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2l0ZXIocHlzcWxpdGVfUm93KiBzZWxmKQ0Kew0KICAgIHJldHVybiBQeU9iamVjdF9HZXRJdGVyKHNlbGYtPmRhdGEpOw0KfQ0KDQpzdGF0aWMgbG9uZyBweXNxbGl0ZV9yb3dfaGFzaChweXNxbGl0ZV9Sb3cgKnNlbGYpDQp7DQogICAgcmV0dXJuIFB5T2JqZWN0X0hhc2goc2VsZi0+ZGVzY3JpcHRpb24pIF4gUHlPYmplY3RfSGFzaChzZWxmLT5kYXRhKTsNCn0NCg0Kc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9yb3dfcmljaGNvbXBhcmUocHlzcWxpdGVfUm93ICpzZWxmLCBQeU9iamVjdCAqX290aGVyLCBpbnQgb3BpZCkNCnsNCiAgICBpZiAob3BpZCAhPSBQeV9FUSAmJiBvcGlkICE9IFB5X05FKSB7DQogICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7DQogICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsNCiAgICB9DQogICAgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShfb3RoZXIpLCAmcHlzcWxpdGVfUm93VHlwZSkpIHsNCiAgICAgICAgcHlzcWxpdGVfUm93ICpvdGhlciA9IChweXNxbGl0ZV9Sb3cgKilfb3RoZXI7DQogICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZShzZWxmLT5kZXNjcmlwdGlvbiwgb3RoZXItPmRlc2NyaXB0aW9uLCBvcGlkKTsNCiAgICAgICAgaWYgKChvcGlkID09IFB5X0VRICYmIHJlcyA9PSBQeV9UcnVlKQ0KICAgICAgICAgICAgfHwgKG9waWQgPT0gUHlfTkUgJiYgcmVzID09IFB5X0ZhbHNlKSkgew0KICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7DQogICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUoc2VsZi0+ZGF0YSwgb3RoZXItPmRhdGEsIG9waWQpOw0KICAgICAgICB9DQogICAgfQ0KICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7DQogICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOw0KfQ0KDQpQeU1hcHBpbmdNZXRob2RzIHB5c3FsaXRlX3Jvd19hc19tYXBwaW5nID0gew0KICAgIC8qIG1wX2xlbmd0aCAgICAgICAgKi8gKGxlbmZ1bmMpcHlzcWxpdGVfcm93X2xlbmd0aCwNCiAgICAvKiBtcF9zdWJzY3JpcHQgICAgICovIChiaW5hcnlmdW5jKXB5c3FsaXRlX3Jvd19zdWJzY3JpcHQsDQogICAgLyogbXBfYXNzX3N1YnNjcmlwdCAqLyAob2Jqb2JqYXJncHJvYykwLA0KfTsNCg0Kc3RhdGljIFB5TWV0aG9kRGVmIHB5c3FsaXRlX3Jvd19tZXRob2RzW10gPSB7DQogICAgeyJrZXlzIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX3Jvd19rZXlzLCBNRVRIX05PQVJHUywNCiAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm5zIHRoZSBrZXlzIG9mIHRoZSByb3cuIil9LA0KICAgIHtOVUxMLCBOVUxMfQ0KfTsNCg0KDQpQeVR5cGVPYmplY3QgcHlzcWxpdGVfUm93VHlwZSA9IHsNCiAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApDQogICAgICAgIE1PRFVMRV9OQU1FICIuUm93IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8NCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX1JvdyksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovDQogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX3Jvd19kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8NCiAgICAgICAgKHByaW50ZnVuYylweXNxbGl0ZV9yb3dfcHJpbnQsICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLw0KICAgICAgICAoaGFzaGZ1bmMpcHlzcWxpdGVfcm93X2hhc2gsICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLw0KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8NCiAgICAgICAgKHRyYXZlcnNlcHJvYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8NCiAgICAgICAgKHJpY2hjbXBmdW5jKXB5c3FsaXRlX3Jvd19yaWNoY29tcGFyZSwgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8NCiAgICAgICAgKGdldGl0ZXJmdW5jKXB5c3FsaXRlX2l0ZXIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLw0KICAgICAgICBweXNxbGl0ZV9yb3dfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8NCiAgICAgICAgKGluaXRwcm9jKXB5c3FsaXRlX3Jvd19pbml0LCAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8NCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLw0KfTsNCg0KZXh0ZXJuIGludCBweXNxbGl0ZV9yb3dfc2V0dXBfdHlwZXModm9pZCkNCnsNCiAgICBweXNxbGl0ZV9Sb3dUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3Ow0KICAgIHB5c3FsaXRlX1Jvd1R5cGUudHBfYXNfbWFwcGluZyA9ICZweXNxbGl0ZV9yb3dfYXNfbWFwcGluZzsNCiAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZweXNxbGl0ZV9Sb3dUeXBlKTsNCn0NCg==