Lyogc3RhdGVtZW50LmMgLSB0aGUgc3RhdGVtZW50IHR5cGUKICoKICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiCiNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgojaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIgojaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCgovKiBwcm90b3R5cGVzICovCnN0YXRpYyBpbnQgcHlzcWxpdGVfY2hlY2tfcmVtYWluaW5nX3NxbChjb25zdCBjaGFyKiB0YWlsKTsKCnR5cGVkZWYgZW51bSB7CiAgICBMSU5FQ09NTUVOVF8xLAogICAgSU5fTElORUNPTU1FTlQsCiAgICBDT01NRU5UU1RBUlRfMSwKICAgIElOX0NPTU1FTlQsCiAgICBDT01NRU5URU5EXzEsCiAgICBOT1JNQUwKfSBwYXJzZV9yZW1haW5pbmdfc3FsX3N0YXRlOwoKdHlwZWRlZiBlbnVtIHsKICAgIFRZUEVfTE9ORywKICAgIFRZUEVfRkxPQVQsCiAgICBUWVBFX1NUUklORywKICAgIFRZUEVfVU5JQ09ERSwKICAgIFRZUEVfQlVGRkVSLAogICAgVFlQRV9VTktOT1dOCn0gcGFyYW1ldGVyX3R5cGU7CgppbnQgcHlzcWxpdGVfc3RhdGVtZW50X2NyZWF0ZShweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIFB5T2JqZWN0KiBzcWwpCnsKICAgIGNvbnN0IGNoYXIqIHRhaWw7CiAgICBpbnQgcmM7CiAgICBjb25zdCBjaGFyKiBzcWxfY3N0cjsKICAgIFB5X3NzaXplX3Qgc3FsX2NzdHJfbGVuOwoKICAgIHNlbGYtPnN0ID0gTlVMTDsKICAgIHNlbGYtPmluX3VzZSA9IDA7CgogICAgc3FsX2NzdHIgPSBQeVVuaWNvZGVfQXNTdHJpbmdBbmRTaXplKHNxbCwgJnNxbF9jc3RyX2xlbik7CiAgICBpZiAoc3FsX2NzdHIgPT0gTlVMTCkgewogICAgICAgIHJjID0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7CiAgICAgICAgcmV0dXJuIHJjOwogICAgfQoKICAgIHNlbGYtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKICAgIFB5X0lOQ1JFRihzcWwpOwogICAgc2VsZi0+c3FsID0gc3FsOwoKICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKGNvbm5lY3Rpb24tPmRiLAogICAgICAgICAgICAgICAgICAgICAgICAgc3FsX2NzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsKTsKCiAgICBzZWxmLT5kYiA9IGNvbm5lY3Rpb24tPmRiOwoKICAgIGlmIChyYyA9PSBTUUxJVEVfT0sgJiYgcHlzcWxpdGVfY2hlY2tfcmVtYWluaW5nX3NxbCh0YWlsKSkgewogICAgICAgICh2b2lkKXNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOwogICAgICAgIHNlbGYtPnN0ID0gTlVMTDsKICAgICAgICByYyA9IFBZU1FMSVRFX1RPT19NVUNIX1NRTDsKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmLCBpbnQgcG9zLCBQeU9iamVjdCogcGFyYW1ldGVyLCBpbnQgYWxsb3dfOGJpdF9jaGFycykKewogICAgaW50IHJjID0gU1FMSVRFX09LOwogICAgUFlfTE9OR19MT05HIGxvbmdsb25ndmFsOwogICAgY29uc3QgY2hhciogYnVmZmVyOwogICAgY2hhciogc3RyaW5nOwogICAgUHlfc3NpemVfdCBidWZsZW47CiAgICBwYXJhbWV0ZXJfdHlwZSBwYXJhbXR5cGU7CiAgICBjaGFyKiBjOwoKICAgIGlmIChwYXJhbWV0ZXIgPT0gUHlfTm9uZSkgewogICAgICAgIHJjID0gc3FsaXRlM19iaW5kX251bGwoc2VsZi0+c3QsIHBvcyk7CiAgICAgICAgZ290byBmaW5hbDsKICAgIH0KCiAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QocGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfTE9ORzsKICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0ZMT0FUOwogICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9VTklDT0RFOwogICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfTE9ORzsKICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9GTE9BVDsKICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1NUUklORzsKICAgIH0gZWxzZSBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIocGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfQlVGRkVSOwogICAgfSBlbHNlIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOS05PV047CiAgICB9CgogICAgaWYgKHBhcmFtdHlwZSA9PSBUWVBFX1NUUklORyAmJiAhYWxsb3dfOGJpdF9jaGFycykgewogICAgICAgIHN0cmluZyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHBhcmFtZXRlcik7CiAgICAgICAgZm9yIChjID0gc3RyaW5nOyAqYyAhPSAwOyBjKyspIHsKICAgICAgICAgICAgaWYgKCpjICYgMHg4MCkgewogICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJZb3UgbXVzdCBub3QgdXNlIDgtYml0IGJ5dGVzdHJpbmdzIHVubGVzcyB5b3UgdXNlIGEgdGV4dF9mYWN0b3J5IHRoYXQgY2FuIGludGVycHJldCA4LWJpdCBieXRlc3RyaW5ncyAobGlrZSB0ZXh0X2ZhY3RvcnkgPSBzdHIpLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgaW5zdGVhZCBqdXN0IHN3aXRjaCB5b3VyIGFwcGxpY2F0aW9uIHRvIFVuaWNvZGUgc3RyaW5ncy4iKTsKICAgICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgICAgICAgICBnb3RvIGZpbmFsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN3aXRjaCAocGFyYW10eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX0xPTkc6CiAgICAgICAgICAgIC8qIGluIHRoZSBvdmVyZmxvdyBlcnJvciBjYXNlLCBsb25ndmFsL2xvbmdsb25ndmFsIGlzIC0xLCBhbmQgYW4gZXhjZXB0aW9uIGlzIHNldCAqLwogICAgICAgICAgICBsb25nbG9uZ3ZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHBhcmFtZXRlcik7CiAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIChzcWxpdGVfaW50NjQpbG9uZ2xvbmd2YWwpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CiAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2RvdWJsZShzZWxmLT5zdCwgcG9zLCBQeUZsb2F0X0FzRG91YmxlKHBhcmFtZXRlcikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVU5JQ09ERToKICAgICAgICAgICAgc3RyaW5nID0gUHlVbmljb2RlX0FzU3RyaW5nKHBhcmFtZXRlcik7CiAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX3RleHQoc2VsZi0+c3QsIHBvcywgc3RyaW5nLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CVUZGRVI6CiAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocGFyYW1ldGVyLCAmYnVmZmVyLCAmYnVmbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9ibG9iKHNlbGYtPnN0LCBwb3MsIGJ1ZmZlciwgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKICAgICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VOS05PV046CiAgICAgICAgICAgIHJjID0gLTE7CiAgICB9CgpmaW5hbDoKICAgIHJldHVybiByYzsKfQoKLyogcmV0dXJucyAwIGlmIHRoZSBvYmplY3QgaXMgb25lIG9mIFB5dGhvbidzIGludGVybmFsIG9uZXMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIGFkYXB0ZWQgKi8Kc3RhdGljIGludCBfbmVlZF9hZGFwdChQeU9iamVjdCogb2JqKQp7CiAgICBpZiAocHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KG9iaikgfHwgUHlGbG9hdF9DaGVja0V4YWN0KG9iaikKICAgICAgICAgIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KG9iaikgfHwgUHlCeXRlQXJyYXlfQ2hlY2tFeGFjdChvYmopKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAxOwogICAgfQp9Cgp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcnMocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1ldGVycywgaW50IGFsbG93XzhiaXRfY2hhcnMpCnsKICAgIFB5T2JqZWN0KiBjdXJyZW50X3BhcmFtOwogICAgUHlPYmplY3QqIGFkYXB0ZWQ7CiAgICBjb25zdCBjaGFyKiBiaW5kaW5nX25hbWU7CiAgICBpbnQgaTsKICAgIGludCByYzsKICAgIGludCBudW1fcGFyYW1zX25lZWRlZDsKICAgIGludCBudW1fcGFyYW1zOwoKICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgIG51bV9wYXJhbXNfbmVlZGVkID0gc3FsaXRlM19iaW5kX3BhcmFtZXRlcl9jb3VudChzZWxmLT5zdCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykgfHwgUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykgfHwgKCFQeURpY3RfQ2hlY2socGFyYW1ldGVycykgJiYgUHlTZXF1ZW5jZV9DaGVjayhwYXJhbWV0ZXJzKSkpIHsKICAgICAgICAvKiBwYXJhbWV0ZXJzIHBhc3NlZCBhcyBzZXF1ZW5jZSAqLwogICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKICAgICAgICAgICAgbnVtX3BhcmFtcyA9IFB5VHVwbGVfR0VUX1NJWkUocGFyYW1ldGVycyk7CiAgICAgICAgfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgewogICAgICAgICAgICBudW1fcGFyYW1zID0gUHlMaXN0X0dFVF9TSVpFKHBhcmFtZXRlcnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG51bV9wYXJhbXMgPSBQeVNlcXVlbmNlX1NpemUocGFyYW1ldGVycyk7CiAgICAgICAgfQogICAgICAgIGlmIChudW1fcGFyYW1zICE9IG51bV9wYXJhbXNfbmVlZGVkKSB7CiAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiSW5jb3JyZWN0IG51bWJlciBvZiBiaW5kaW5ncyBzdXBwbGllZC4gVGhlIGN1cnJlbnQgc3RhdGVtZW50IHVzZXMgJWQsIGFuZCB0aGVyZSBhcmUgJWQgc3VwcGxpZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXNfbmVlZGVkLCBudW1fcGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmFtczsgaSsrKSB7CiAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBhcmFtZXRlcnMsIGkpOwogICAgICAgICAgICAgICAgUHlfWElOQ1JFRihjdXJyZW50X3BhcmFtKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgewogICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5TGlzdF9HRVRfSVRFTShwYXJhbWV0ZXJzLCBpKTsKICAgICAgICAgICAgICAgIFB5X1hJTkNSRUYoY3VycmVudF9wYXJhbSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHBhcmFtZXRlcnMsIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY3VycmVudF9wYXJhbSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIV9uZWVkX2FkYXB0KGN1cnJlbnRfcGFyYW0pKSB7CiAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBtaWNyb3Byb3RvY29sc19hZGFwdChjdXJyZW50X3BhcmFtLCAoUHlPYmplY3QqKSZweXNxbGl0ZV9QcmVwYXJlUHJvdG9jb2xUeXBlLCBOVUxMKTsKICAgICAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByYyA9IHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihzZWxmLCBpICsgMSwgYWRhcHRlZCwgYWxsb3dfOGJpdF9jaGFycyk7CiAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKCiAgICAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9JbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyICVkIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoUHlEaWN0X0NoZWNrKHBhcmFtZXRlcnMpKSB7CiAgICAgICAgLyogcGFyYW1ldGVycyBwYXNzZWQgYXMgZGljdGlvbmFyeSAqLwogICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX3BhcmFtc19uZWVkZWQ7IGkrKykgewogICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgICAgIGJpbmRpbmdfbmFtZSA9IHNxbGl0ZTNfYmluZF9wYXJhbWV0ZXJfbmFtZShzZWxmLT5zdCwgaSk7CiAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgICAgIGlmICghYmluZGluZ19uYW1lKSB7CiAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkJpbmRpbmcgJWQgaGFzIG5vIG5hbWUsIGJ1dCB5b3Ugc3VwcGxpZWQgYSBkaWN0aW9uYXJ5ICh3aGljaCBoYXMgb25seSBuYW1lcykuIiwgaSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJpbmRpbmdfbmFtZSsrOyAvKiBza2lwIGZpcnN0IGNoYXIgKHRoZSBjb2xvbikgKi8KICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KHBhcmFtZXRlcnMpKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcocGFyYW1ldGVycywgYmluZGluZ19uYW1lKTsKICAgICAgICAgICAgICAgIFB5X1hJTkNSRUYoY3VycmVudF9wYXJhbSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcocGFyYW1ldGVycywgKGNoYXIqKWJpbmRpbmdfbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFjdXJyZW50X3BhcmFtKSB7CiAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIllvdSBkaWQgbm90IHN1cHBseSBhIHZhbHVlIGZvciBiaW5kaW5nICVkLiIsIGkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIV9uZWVkX2FkYXB0KGN1cnJlbnRfcGFyYW0pKSB7CiAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBtaWNyb3Byb3RvY29sc19hZGFwdChjdXJyZW50X3BhcmFtLCAoUHlPYmplY3QqKSZweXNxbGl0ZV9QcmVwYXJlUHJvdG9jb2xUeXBlLCBOVUxMKTsKICAgICAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByYyA9IHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihzZWxmLCBpLCBhZGFwdGVkLCBhbGxvd184Yml0X2NoYXJzKTsKICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOwoKICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAiRXJyb3IgYmluZGluZyBwYXJhbWV0ZXIgOiVzIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBiaW5kaW5nX25hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicGFyYW1ldGVycyBhcmUgb2YgdW5zdXBwb3J0ZWQgdHlwZSIpOwogICAgfQp9CgppbnQgcHlzcWxpdGVfc3RhdGVtZW50X3JlY29tcGlsZShweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIFB5T2JqZWN0KiBwYXJhbXMpCnsKICAgIGNvbnN0IGNoYXIqIHRhaWw7CiAgICBpbnQgcmM7CiAgICBjb25zdCBjaGFyKiBzcWxfY3N0cjsKICAgIFB5X3NzaXplX3Qgc3FsX2xlbjsKICAgIHNxbGl0ZTNfc3RtdCogbmV3X3N0OwoKICAgIHNxbF9jc3RyID0gUHlVbmljb2RlX0FzU3RyaW5nQW5kU2l6ZShzZWxmLT5zcWwsICZzcWxfbGVuKTsKICAgIGlmIChzcWxfY3N0ciA9PSBOVUxMKSB7CiAgICAgICAgcmMgPSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRTsKICAgICAgICByZXR1cm4gcmM7CiAgICB9CgogICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzcWxfY3N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsKTsKCiAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7CiAgICAgICAgLyogVGhlIGVmZmljaWVudCBzcWxpdGUzX3RyYW5zZmVyX2JpbmRpbmdzIGlzIG9ubHkgYXZhaWxhYmxlIGluIFNRTGl0ZQogICAgICAgICAqIHZlcnNpb24gMy4yLjIgb3IgbGF0ZXIuIEZvciBvbGRlciBTUUxpdGUgcmVsZWFzZXMsIHRoYXQgbWlnaHQgbm90CiAgICAgICAgICogZXZlbiBkZWZpbmUgU1FMSVRFX1ZFUlNJT05fTlVNQkVSLCB3ZSBkbyBpdCB0aGUgbWFudWFsIHdheS4KICAgICAgICAgKi8KICAgICAgICAjaWZkZWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSCiAgICAgICAgI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAyMDAyCiAgICAgICAgLyogVGhlIGNoZWNrIGZvciB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgbmVjZXNzYXJ5IHRvIG5vdCB0cmlnZ2VyIGEKICAgICAgICAgKiBidWcgaW4gY2VydGFpbiBTUUxpdGUgdmVyc2lvbnMgKGV4cGVyaWVuY2VkIGluIDMuMi44IGFuZCAzLjMuNCkuICovCiAgICAgICAgaWYgKHNxbGl0ZTNfYmluZF9wYXJhbWV0ZXJfY291bnQoc2VsZi0+c3QpID4gMCkgewogICAgICAgICAgICAodm9pZClzcWxpdGUzX3RyYW5zZmVyX2JpbmRpbmdzKHNlbGYtPnN0LCBuZXdfc3QpOwogICAgICAgIH0KICAgICAgICAjZW5kaWYKICAgICAgICAjZWxzZQogICAgICAgIHN0YXRlbWVudF9iaW5kX3BhcmFtZXRlcnMoc2VsZiwgcGFyYW1zKTsKICAgICAgICAjZW5kaWYKCiAgICAgICAgKHZvaWQpc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CiAgICAgICAgc2VsZi0+c3QgPSBuZXdfc3Q7CiAgICB9CgogICAgcmV0dXJuIHJjOwp9CgppbnQgcHlzcWxpdGVfc3RhdGVtZW50X2ZpbmFsaXplKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZikKewogICAgaW50IHJjOwoKICAgIHJjID0gU1FMSVRFX09LOwogICAgaWYgKHNlbGYtPnN0KSB7CiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICBzZWxmLT5zdCA9IE5VTEw7CiAgICB9CgogICAgc2VsZi0+aW5fdXNlID0gMDsKCiAgICByZXR1cm4gcmM7Cn0KCmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfcmVzZXQocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmKQp7CiAgICBpbnQgcmM7CgogICAgcmMgPSBTUUxJVEVfT0s7CgogICAgaWYgKHNlbGYtPmluX3VzZSAmJiBzZWxmLT5zdCkgewogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfcmVzZXQoc2VsZi0+c3QpOwogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCgogICAgICAgIGlmIChyYyA9PSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgc2VsZi0+aW5fdXNlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJjOwp9Cgp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9tYXJrX2RpcnR5KHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZikKewogICAgc2VsZi0+aW5fdXNlID0gMTsKfQoKdm9pZCBweXNxbGl0ZV9zdGF0ZW1lbnRfZGVhbGxvYyhweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYpCnsKICAgIGludCByYzsKCiAgICBpZiAoc2VsZi0+c3QpIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgfQoKICAgIHNlbGYtPnN0ID0gTlVMTDsKCiAgICBQeV9YREVDUkVGKHNlbGYtPnNxbCk7CgogICAgaWYgKHNlbGYtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpIHsKICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCopc2VsZik7CiAgICB9CgogICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwp9CgovKgogKiBDaGVja3MgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCBpbiBhbiBTUUwgc3RyaW5nIGFmdGVyIFNRTGl0ZSBjb21waWxlZCBpdC4KICogVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGlmIHNvbWVib2R5IHRyaWVkIHRvIGV4ZWN1dGUgbW9yZSB0aGFuIG9uZSBTUUwgY29tbWFuZAogKiB3aXRoIG9uZSBleGVjdXRlKCkvZXhlY3V0ZW1hbnkoKSBjb21tYW5kLCB3aGljaCB0aGUgREItQVBJIGFuZCB3ZSBkb24ndAogKiBhbGxvdy4KICoKICogUmV0dXJucyAxIGlmIHRoZXJlIGlzIG1vcmUgbGVmdCB0aGFuIHNob3VsZCBiZS4gMCBpZiBvay4KICovCnN0YXRpYyBpbnQgcHlzcWxpdGVfY2hlY2tfcmVtYWluaW5nX3NxbChjb25zdCBjaGFyKiB0YWlsKQp7CiAgICBjb25zdCBjaGFyKiBwb3MgPSB0YWlsOwoKICAgIHBhcnNlX3JlbWFpbmluZ19zcWxfc3RhdGUgc3RhdGUgPSBOT1JNQUw7CgogICAgZm9yICg7OykgewogICAgICAgIHN3aXRjaCAoKnBvcykgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgID0gTElORUNPTU1FTlRfMTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTElORUNPTU1FTlRfMSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fTElORUNPTU1FTlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnICc6CiAgICAgICAgICAgIGNhc2UgJ1x0JzoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdcbic6CiAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gSU5fTElORUNPTU1FTlQpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IE5PUk1BTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBOT1JNQUwpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENPTU1FTlRTVEFSVF8xOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5URU5EXzEpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IE5PUk1BTDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ09NTUVOVFNUQVJUXzEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBOT1JNQUwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTElORUNPTU1FTlRfMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5UU1RBUlRfMSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fQ09NTUVOVDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5fQ09NTUVOVCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQ09NTUVOVEVORF8xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQ09NTUVOVEVORF8xKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTl9DT01NRU5UOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9MSU5FQ09NTUVOVCkgewogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9DT01NRU5UKSB7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcG9zKys7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KClB5VHlwZU9iamVjdCBweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgIE1PRFVMRV9OQU1FICIuU3RhdGVtZW50IiwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICAgICBzaXplb2YocHlzcWxpdGVfU3RhdGVtZW50KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgICAgIChkZXN0cnVjdG9yKXB5c3FsaXRlX3N0YXRlbWVudF9kZWFsbG9jLCAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgICAgIG9mZnNldG9mKHB5c3FsaXRlX1N0YXRlbWVudCwgaW5fd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCn07CgpleHRlcm4gaW50IHB5c3FsaXRlX3N0YXRlbWVudF9zZXR1cF90eXBlcyh2b2lkKQp7CiAgICBweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwogICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfU3RhdGVtZW50VHlwZSk7Cn0K